RF-ID Kart Okuyucu & OnKeyPress

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
chnyildirim
Üye
Mesajlar: 39
Kayıt: 25 Haz 2003 01:51
İletişim:

RF-ID Kart Okuyucu & OnKeyPress

Mesaj gönderen chnyildirim »

Merhaba,

Barkod okuma cihazları barkodu okuduktan sonra enter a basıyordu.
Bana verilen RF-ID okuyucu kartı okuduktan sonra Enter tuşuna basmıyor. Sadece okuma işlemi yapıyor.

KartId 8 karakter. (8428A283)
Edit1.Text > OnKeyPress de 8 defa tuşa basıldığı bilgisine ulaşıyorum.
Ulaştıktan sonra Key := #13; diyorum.
Sorun burada başlıyor.
Örnek: KartID: 8428A283
En sonda ki 3 'ü almadan Enter a basıyor.

Örnek Kodum:

Kod: Tümünü seç

procedure TKartForm.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
    if length(Edit1.Text)=7 then
    begin
       ShowMessage(Edit1.Text);
    end;
end;
Kartı okuttuktan sonra ki görüntü;
Resim
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: RF-ID Kart Okuyucu & OnKeyPress

Mesaj gönderen SimaWB »

KartID 8 karakterse

Kod: Tümünü seç

if length(Edit1.Text)=8 then
olması gerekmiyor mu?
There's no place like 127.0.0.1
Kullanıcı avatarı
chnyildirim
Üye
Mesajlar: 39
Kayıt: 25 Haz 2003 01:51
İletişim:

Re: RF-ID Kart Okuyucu & OnKeyPress

Mesaj gönderen chnyildirim »

length komutu 0 dan başlıyor.
Yani ilk karakter 0
İkinci karakter 1
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: RF-ID Kart Okuyucu & OnKeyPress

Mesaj gönderen SimaWB »

Kod: Tümünü seç

var
  s: string;
begin
  s := '1';
  ShowMessage(IntToStr(Length(s)));

  s := '12';
  ShowMessage(IntToStr(Length(s)));
end;
There's no place like 127.0.0.1
Kullanıcı avatarı
chnyildirim
Üye
Mesajlar: 39
Kayıt: 25 Haz 2003 01:51
İletişim:

Re: RF-ID Kart Okuyucu & OnKeyPress

Mesaj gönderen chnyildirim »

Evet, 1 den başlıyormuş.

Tam anlatamamışım sanırım.

ShowMessage da 1 rakamına ulaşıyoruz.
Ama yazdığımız karakter. Mesajdan sonra Edit box da görünüyor.

Örnek:
- A harfine bastık.
- ShowMessage : 1
- Edit1.Text: A

- B harfine bastık.
- ShowMessage : 2
- Edit1.Text: AB

- C harfine bastık.
- ShowMessage : 3
- Edit1.Text: ABC

C harfine bastıktan sonrası benim için önemli.

ABC yi nasıl alabilirim.

Bana da lazım olan 8 karakter tamamlandıktan sonra Edit box ın içinde ki bilgi.
Kullanıcı avatarı
chnyildirim
Üye
Mesajlar: 39
Kayıt: 25 Haz 2003 01:51
İletişim:

Re: RF-ID Kart Okuyucu & OnKeyPress

Mesaj gönderen chnyildirim »

Edit1.Text e karakter girdiğiniz zaman OnKeyPress de Length(Edit1.Text) : 0 dan başlıyor.

Olay sizin kodunuz da ki gibi gerçekleşmiyor.

Bundan dolayı 7 karakter yapmışım.
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: RF-ID Kart Okuyucu & OnKeyPress

Mesaj gönderen xxxjedixxx »

Merhaba,

Onkeypress event'i çalıştığında Edit1'in texti değişmez. Çünkü gelen key parametresini değiştirebileceği için event procedure'ünden çıktıktan sonra text değişir.
Senin örneğinde; Karakter sayısı 7'ye ulaştığında gelen Key parametresini #13 ile değiştirdiğin için son basılan karakteri yok etmiş oluyorsun.
Bu yüzden;

Kod: Tümünü seç

procedure TKartForm.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
    if length(TEdit(Sender).Text)=7 then
    begin
       TEdit(Sender).Text := TEdit(Sender).Text + Key;
       Key := #13;
    //   ShowMessage(TEdit(Sender).Text);
    end;
end;
şeklinde yazmalısın.
Kullanıcı avatarı
chnyildirim
Üye
Mesajlar: 39
Kayıt: 25 Haz 2003 01:51
İletişim:

Re: RF-ID Kart Okuyucu & OnKeyPress

Mesaj gönderen chnyildirim »

Teşekkür ediyorum.
Çalıştı!
Allah razı olsun. :)
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: RF-ID Kart Okuyucu & OnKeyPress

Mesaj gönderen SimaWB »

Bence bu şekilde bir kontrol yapacaksanız OnChange olayını kullanmalısınız.

Kod: Tümünü seç

procedure TForm3.Edit1Change(Sender: TObject);
begin
  if length(TEdit(Sender).Text) = 8 then
    ShowMessage(TEdit(Sender).Text);
end;
There's no place like 127.0.0.1
Kullanıcı avatarı
chnyildirim
Üye
Mesajlar: 39
Kayıt: 25 Haz 2003 01:51
İletişim:

Re: RF-ID Kart Okuyucu & OnKeyPress

Mesaj gönderen chnyildirim »

OnChange de çalıştı.

Teşekkür ediyorum.

Sizce hangisi daha hızlı olur?

OnChange / OnKeyPress

Not: Bu uygulama da öğrenciler bir seminere girerken hem giriş esnasında hem de çıkış yaparken kartlarını okutacaklar.
Aradaki süre örnek 30 dk. yı geçmiş ise o seminere katılmış sayılacaklar.

Giriş ve çıkışlar da belli bir yoğunluk olacaktır.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: RF-ID Kart Okuyucu & OnKeyPress

Mesaj gönderen SimaWB »

chnyildirim yazdı:Sizce hangisi daha hızlı olur?

OnChange / OnKeyPress
İkisini hız olarak kıyaslamak mantıklı değil. Bir tuşa basıldığında önce OnKeyPress tetiklenir, sonra Edit'in içeriği değişir, ardından OnChange tetiklenir. Ama asıl dikkat edilmesi gereken; örneğin Enter tuşuna basıldığını yakalamak isterseniz Enter'a basıldığında Edit'in içeriği değişmediği için OnChange tetiklenmez. Delete'e bastığınızda da bu sefer OnKeyPress tetiklenmez.
There's no place like 127.0.0.1
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: RF-ID Kart Okuyucu & OnKeyPress

Mesaj gönderen xxxjedixxx »

Anladığım kadarıyla muhtemelen aşağıdaki kodun devamı olmak zorunda, yani enter'a basıldığında kayıt işlerini yapıyor.

Kod: Tümünü seç

procedure TKartForm.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
    if length(TEdit(Sender).Text)=7 then
    begin
       TEdit(Sender).Text := TEdit(Sender).Text + Key;
       Key := #13;
    //   ShowMessage(TEdit(Sender).Text);
    end;
    ...
  if Key = #13 then // anladığım, enter'a basıldığında kayıt oluşturulması vs. gibi bir kodun burada olması lazım
  begin
     ...
  end;
end;
Böyle yapmak yerine, kayıt oluşturma kodunu Edit1'in OnChange eventine yazsan veya bir procedure içine alsan daha iyi olur.

Kod: Tümünü seç

procedure TKartForm.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #13 then // Entera basılırsa da kaydetmesi için
    Edit1Change(Edit1);
end;

procedure TKartForm.Edit1Change(Sender: TObject);
begin
  if Length(TEdit(Sender).Text) = 8 then
  begin
    // kaydetme kodları
     ShowMessage(TEdit(Sender).Text);
  end;
end;
Gibi.
Cevapla