dakikada girilen kelime sayısı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
sga
Üye
Mesajlar: 60
Kayıt: 08 Tem 2005 12:49

dakikada girilen kelime sayısı

Mesaj gönderen sga »

selam arkadaşlar,
dakikada girilen kelime sayısını nasıl bulabilirim?timer mı kullanacağım? nasıl? :?:
sga
Kullanıcı avatarı
sga
Üye
Mesajlar: 60
Kayıt: 08 Tem 2005 12:49

Mesaj gönderen sga »

bu arada yazmayı unutmuşum kelimeleri edite giriyorum
sga
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

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..
:idea:
Resim
Resim ....Resim
Kullanıcı avatarı
sga
Üye
Mesajlar: 60
Kayıt: 08 Tem 2005 12:49

Mesaj gönderen sga »

ama butonla kontrol ettiremem kullanıcının buna karışmaması lazım o yazdıkça değişecek bu
sga
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- O zaman şu "ama" larınızı bir söyleyin ki mesaj zinciri uzamasın... Resim

- 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)
Resim
Resim ....Resim
Kullanıcı avatarı
sga
Üye
Mesajlar: 60
Kayıt: 08 Tem 2005 12:49

Mesaj gönderen sga »

:oops: anlayamadım.ben aslında on parmak klavye yapmaya çalışıyorum. bu nedenlede kullanıcının performansını göstemem gerekiyor.parça parça sorduğum için özür dilerim
sga
heskin35
Üye
Mesajlar: 132
Kayıt: 30 Haz 2004 09:48

Mesaj gönderen heskin35 »

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.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

@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..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@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.
Resim
Resim ....Resim
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

@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.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Zaten burada yapılan da beyin fırtınası.. Amacını son mesajında @sga netleştirildi... Geriye çözüm adına yaptığı çalışma hakkında bilgi vermesi kaldı....
Resim
Resim ....Resim
Kullanıcı avatarı
sga
Üye
Mesajlar: 60
Kayıt: 08 Tem 2005 12:49

Mesaj gönderen sga »

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;
sga
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Oldukça farklı olmuş. Benim söylemek istediğim ise şunun gibi bir şeydi...

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;
- 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...
Resim
Resim ....Resim
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1527
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

bi tanede benden :lol:
OnChange de sadece kelimeleri say ve adet i Global bir değikende tut.
timer da her dakika da sadece global değişkendeki sayıyı al ve işle..
DeveloperToolKit

..::|YeşilMavi|::..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@lazio

- @heskin35'e katılıyorum desen 2 satır daha az yazmış olurun.. Resim
Resim
Resim ....Resim
Cevapla