dakikada girilen kelime sayısını nasıl bulabilirim?timer mı kullanacağım? nasıl?
dakikada girilen kelime sayısı
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
dakikada girilen kelime sayısı
selam arkadaşlar,
dakikada girilen kelime sayısını nasıl bulabilirim?timer mı kullanacağım? nasıl?
dakikada girilen kelime sayısını nasıl bulabilirim?timer mı kullanacağım? nasıl?
sga
Her boşluk tuşu, enter veya noktalama imi girişi bir kelime ederden yola çıkarsak Timer'a gerek kalmaksızın bunu yapma imkanın var.
Şöyle ki,
- Bir buttona basılır, o anki system saati bir edit'e alınır.
- giriş yapılır..
- ya başka bir butonla ya da yazının sonunda basılacak ENTER tuşu ile yeni saat başka bir edit'e alınır.
- girilen kelimele sayılır ve saat farkına bölünür. Elde ettiğiniz sayısal değer kelime/zaman diliminden sonuçtur..

Şöyle ki,
- Bir buttona basılır, o anki system saati bir edit'e alınır.
- giriş yapılır..
- ya başka bir butonla ya da yazının sonunda basılacak ENTER tuşu ile yeni saat başka bir edit'e alınır.
- girilen kelimele sayılır ve saat farkına bölünür. Elde ettiğiniz sayısal değer kelime/zaman diliminden sonuçtur..
- O zaman şu "ama" larınızı bir söyleyin ki mesaj zinciri uzamasın... 
- Daha önce belirttiğim başlangıç zamanı aynı...
- Bu sefer Timer olacak ama dakikalık interval ile kelime sayacak...Kelime sayarken kriter sizin tarafınızdan belirlenecek. Her hatalı kelime düzeltmesi OnKeyPress veya OnKeyUp olayında tespit edilebilir. (Backspace veya Delete tuşları ile yön tuşlarını algılamak şeklinde)
- Daha önce belirttiğim başlangıç zamanı aynı...
- Bu sefer Timer olacak ama dakikalık interval ile kelime sayacak...Kelime sayarken kriter sizin tarafınızdan belirlenecek. Her hatalı kelime düzeltmesi OnKeyPress veya OnKeyUp olayında tespit edilebilir. (Backspace veya Delete tuşları ile yön tuşlarını algılamak şeklinde)
Onparmak yapmaya çalışıyor iseniz o zaman süre içerisinde kelime kontrolu yapmanıza gerek yok.
Olayı şu şekilde açıklamak istiyorum
Edite kelime girilmeye başladığı anda yani onchange olayında timeri çalıştıracak kodu yazarız.
Sonrasında timer 1 dk doldurduğunda edit'i readonly->true moduna alırız ve ardından edit içindeki kelimeleri boşlukları baz alarak hesaplarsın.
Olayı şu şekilde açıklamak istiyorum
Edite kelime girilmeye başladığı anda yani onchange olayında timeri çalıştıracak kodu yazarız.
Sonrasında timer 1 dk doldurduğunda edit'i readonly->true moduna alırız ve ardından edit içindeki kelimeleri boşlukları baz alarak hesaplarsın.
-
aLonE CoDeR
- Kıdemli Üye
- Mesajlar: 1223
- Kayıt: 26 Nis 2005 04:08
@heskin35;
Edit bileşenin OnChange eventi kelime/bilgi/veri girme söz konusu olduğu sürece tetikleneceğinden timer nesnesinin kontrolünü orada yapmak yanlış olacaktır.
Soru üzerindeki değerlendirmeye gelince;
Eğer siz süre dolduğunda işlemi durdurmayı düşünüyorsanız yapmanız gereken süre bitiminde edite veri girişini herhangi bir yolla engellemek (ReadOnly yapmak gibi..).Bunun akabinde girilen bilgiyi bir stringe aldıktan sonra, döngü kurmak suretiyle boşluk karakterini saptamak, bulunan boşluk karakteri sayısını ikinci bir değişkene eklemek(bir artırmak..), ve bulunan boşluğun pozisyonu dahil olmak üzere baştan itibaren silmek..Örneklemek gerekirse;
"Ne mutlu Türküm diyene!" cümlesini değerlendirmek istersek;
"Ne " boşluğu burada tespit edip buraya kadar olan kısmı sildiğimizde elimizde kalan veri tahmininiz üzre,
"mutlu Türküm diyene!" şeklinde olacak ve siz boşluk sayısını tutan değişken değerini bir artıracaksınız.Genel mantık bu şekilde olabilir diye düşünüyorum.Elbette ki bazı kontroller konulması gerekecektir.
Kolay gele..
Edit bileşenin OnChange eventi kelime/bilgi/veri girme söz konusu olduğu sürece tetikleneceğinden timer nesnesinin kontrolünü orada yapmak yanlış olacaktır.
Soru üzerindeki değerlendirmeye gelince;
Eğer siz süre dolduğunda işlemi durdurmayı düşünüyorsanız yapmanız gereken süre bitiminde edite veri girişini herhangi bir yolla engellemek (ReadOnly yapmak gibi..).Bunun akabinde girilen bilgiyi bir stringe aldıktan sonra, döngü kurmak suretiyle boşluk karakterini saptamak, bulunan boşluk karakteri sayısını ikinci bir değişkene eklemek(bir artırmak..), ve bulunan boşluğun pozisyonu dahil olmak üzere baştan itibaren silmek..Örneklemek gerekirse;
"Ne mutlu Türküm diyene!" cümlesini değerlendirmek istersek;
"Ne " boşluğu burada tespit edip buraya kadar olan kısmı sildiğimizde elimizde kalan veri tahmininiz üzre,
"mutlu Türküm diyene!" şeklinde olacak ve siz boşluk sayısını tutan değişken değerini bir artıracaksınız.Genel mantık bu şekilde olabilir diye düşünüyorum.Elbette ki bazı kontroller konulması gerekecektir.
Kolay gele..
@bLue aLonE
- If Timer1.Enabled then Timer1.Enabled := True; gibi bir kontrol mükerrer tetiklemeyi engeller. Sorun olmaz.
- Durulacak yer ise ENTER tuşunun basıldığı an olabilir. Burada Timer'in oynayacağı rol kelime saymaktan ziyade anlık durumu monitör etmek olmalıdır. Sonuçta Time'in Enable edildiği saat ve Disable edildiği saat elde edilmiş olmalıdır.
- Bunlar göz önüne alındığında, asıl sonucu bu iki zaman arasındaki fark belirleyecek ve saniye'nin 1/1000 mertebesinde yüksek kalitede bir sonuç elde edilecektir.
- If Timer1.Enabled then Timer1.Enabled := True; gibi bir kontrol mükerrer tetiklemeyi engeller. Sorun olmaz.
- Durulacak yer ise ENTER tuşunun basıldığı an olabilir. Burada Timer'in oynayacağı rol kelime saymaktan ziyade anlık durumu monitör etmek olmalıdır. Sonuçta Time'in Enable edildiği saat ve Disable edildiği saat elde edilmiş olmalıdır.
- Bunlar göz önüne alındığında, asıl sonucu bu iki zaman arasındaki fark belirleyecek ve saniye'nin 1/1000 mertebesinde yüksek kalitede bir sonuç elde edilecektir.
-
aLonE CoDeR
- Kıdemli Üye
- Mesajlar: 1223
- Kayıt: 26 Nis 2005 04:08
@mrmcop;
Elbette ki birçok kontrol yazılabilir bahsi geçen durum için.Benim değinmek istediğim nokta bunun sağlıklı bir yöntem olmayacağı konusudur.Soruyu değerlendirmek adına elimizde yeteri kadar done olmaması, bizi varsayımlarla ve doğaçlama mantıklar üretmeye itiyor görüldüğü üzre.Soru stabil çözümü üretmek için yeterli açıklamayı barındırdığı an, deklare edilecek çözüm önerileri de daha somut olacaktır.
Kolay gele.
Elbette ki birçok kontrol yazılabilir bahsi geçen durum için.Benim değinmek istediğim nokta bunun sağlıklı bir yöntem olmayacağı konusudur.Soruyu değerlendirmek adına elimizde yeteri kadar done olmaması, bizi varsayımlarla ve doğaçlama mantıklar üretmeye itiyor görüldüğü üzre.Soru stabil çözümü üretmek için yeterli açıklamayı barındırdığı an, deklare edilecek çözüm önerileri de daha somut olacaktır.
Kolay gele.
arkadaşlar söylediklerinizden yola çıkarak şu şekilde yaptım.
var
kelime:integer=0; a:integer=1; key:char;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
a:=a+1;
end;
procedure TForm1.Edit2Change(Sender: TObject);
begin
key:=edit2.text[length(edit2.Text)];
if key=#32 then kelime:=kelime+1;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if kelime=0 then edit1.Text:='20' else
edit1.text:=floattostr(kelime/a);
end;
var
kelime:integer=0; a:integer=1; key:char;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
a:=a+1;
end;
procedure TForm1.Edit2Change(Sender: TObject);
begin
key:=edit2.text[length(edit2.Text)];
if key=#32 then kelime:=kelime+1;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if kelime=0 then edit1.Text:='20' else
edit1.text:=floattostr(kelime/a);
end;
sga
Oldukça farklı olmuş. Benim söylemek istediğim ise şunun gibi bir şeydi...
- Gördüğün gibi Timer kullanmadık...
- Cümle bitiminde Enter basınca hesap yapılıyor. Ayrıca hesap yapılınca Edit1'in tamamı seçiliyor ki, sıradaki ilk tuşa basımı tüm yazılanı temizlensin ve oyun tekrar başlasın.
- Böylece hiç bir tuş veya kontrole gerek kalmadan yaz enter, yaz enter defalarca kendini test edebilirsin...
Kod: Tümünü seç
var
xBasla, xBitir : TDateTime;Kod: Tümünü seç
Function KelimeSay(Cumle:String):Integer;
begin
Result := 0;
Cumle := Trim(Cumle); // Sağdan soldan boşlukları aldık...
While Pos(' ', Cumle) > 0 do
begin
Delete(Cumle, 1, Pos(' ', Cumle));
Inc(Result);
end;
If Cumle <> '' then Inc(Result);
end;Kod: Tümünü seç
procedure TForm1.Edit1Change(Sender: TObject);
begin
Caption := Format('Kelime Sayısı : %d', [KelimeSay(Edit1.Text)]);
end;Kod: Tümünü seç
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
If xBasla = xBitir then xBasla := Time;
If Key = #13 then
begin
xBitir := Time;
// MilliSecondsBetween için Uses'a DateUtils eklenecek
Caption := Format('%s-%s : Süre : %d mSn. (%.3f sn.) - Kelime sayısı : %d', [TimeToStr(xBasla), TimeToStr(xBitir), MilliSecondsBetween(xBitir, xBasla), MilliSecondsBetween(xBitir, xBasla) / 1000, KelimeSay(Edit1.Text)]);
xBasla := xBitir;
Edit1.SelectAll;
end;
end;
- Cümle bitiminde Enter basınca hesap yapılıyor. Ayrıca hesap yapılınca Edit1'in tamamı seçiliyor ki, sıradaki ilk tuşa basımı tüm yazılanı temizlensin ve oyun tekrar başlasın.
- Böylece hiç bir tuş veya kontrole gerek kalmadan yaz enter, yaz enter defalarca kendini test edebilirsin...


