Delphi İle Caller Id kilitlenme sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
enesharun
Üye
Mesajlar: 28
Kayıt: 17 Eki 2014 11:46

Delphi İle Caller Id kilitlenme sorunu

Mesaj gönderen enesharun »

Merhaba arkadaşlar,

Yazdığımız programda CallerId (2 hatlı ve 4 hatlı ) sürekli olmasa da arada bir programda kilitlenme yaşıyorum. Caller id kullanılmadığı zamanlarda herhangi bir kilitlenme olmuyor. Bu konuda yardımcı olabilir misiniz?

Program şu şekilde çalışıyor: caller id dinleme olayı bir timera bağlı ve her saniye sorguluyor. telefon çaldığında arayan numaranın görüntülendiği minik bir pencere programın sağ altında çıkıyor ve oradaki butona tıklandığında bu ekran kapanıp başka ekran açılıyor ve bilgiler oraya aktarılıyor.
Her türlü fikire açığım arkadaşlar bu sorunu acilen çözmem gerekiyor yardımlarınızı bekliyorum.

Caller id ile ilgili kullandığım kodlar şu şekildedir:

Kod: Tümünü seç

var
 CIDnesne: TCIDv5;
 
 
procedure TGirisEkran.CallerIdKontroluTimer(Sender: TObject); // Timer kodları
var
  model, serialnum: string;
begin
  if not assigned(CIDnesne) then
    exit;
end;

//arama geldiğinde aşağıdaki procedure tetkikleniyor ve ilgili kaydı calleridEkran formuna yazıp gösteriyor. 

procedure TGirisEkran.CID_olay(ASender: TObject;
  const DeviceID, Line, PhoneNumber, DateTime, OtherText: WideString);
var
  QMusteriKontrol, QSonArayanlar, QSonArayanSil: TMyQuery;
  numara: string;
begin
  // memo1.Lines.Add(timetostr(now) + ' : ' + ' Hat' + Line + ' Arayan: ' +   PhoneNumber);
  if GirisEkran.calleridcalissin = 1 then
  begin
    numara := PhoneNumber; // #9 + PhoneNumber;

    QMusteriKontrol := TMyQuery.Create(Nil);
    QMusteriKontrol.Connection := Dm.MyCon;
    QMusteriKontrol.SQL.Clear;
    QMusteriKontrol.SQL.Add
      ('select * from musteriler where tel1 = :tel or tel2=:tel or gsm=:tel and aktif=1');
    QMusteriKontrol.Params.ParamByName('tel').Value := trim(numara);
    QMusteriKontrol.Open;
    QMusteriKontrol.First;
    // Form1.memo1.Lines.Add('Device: ' + DeviceSerial + #9 + 'Line: ' + Line + #9 + 'Caller ID: ' + PhoneNumber + #9 + 'Date - Time: ' + DateTime);

    if QMusteriKontrol.RecordCount > 0 then
    begin
      if assigned(calleridEkran) = true then // form açık mı
      begin
        calleridEkran.Close;
      end;
      Application.CreateForm(TcalleridEkran, calleridEkran);
      calleridEkran.lblisim.Caption := QMusteriKontrol.FieldByName
        ('isim').AsString;
      calleridEkran.lbltelefon.Caption := trim(numara);
      calleridEkran.lbladres.Caption := QMusteriKontrol.FieldByName
        ('adres').AsString;
      calleridEkran.musterinosu := QMusteriKontrol.FieldByName('id').AsInteger;
      calleridEkran.yenimusteri := 0;
      calleridEkran.il := QMusteriKontrol.FieldByName('il').AsString;
      calleridEkran.ilce := QMusteriKontrol.FieldByName('ilce').AsString;

      QSonArayanlar := TMyQuery.Create(Nil);
      QSonArayanlar.Connection := Dm.MyCon;
      QSonArayanlar.SQL.Clear;
      QSonArayanlar.SQL.Add
        ('select * from calleridson order by id desc LIMIT 10');
      QSonArayanlar.Open;
      QSonArayanlar.First;

      if QSonArayanlar.RecordCount = 10 then
      begin
        QSonArayanSil := TMyQuery.Create(Nil);
        QSonArayanSil.Connection := Dm.MyCon;
        QSonArayanSil.SQL.Clear;
        QSonArayanSil.SQL.Add
          ('delete from calleridson order by id asc LIMIT 1');
        QSonArayanSil.ExecSQL;
        QSonArayanSil.Close;
        FreeAndNil(QSonArayanSil);
      end
      else
      begin
        QSonArayanlar.Append;
        QSonArayanlar.FieldByName('musteriadi').AsString :=
          QMusteriKontrol.FieldByName('isim').AsString;
        QSonArayanlar.FieldByName('telefon').AsString := trim(numara);
        QSonArayanlar.FieldByName('tarih').AsDateTime := Now();
        QSonArayanlar.Post;
      end;
      QSonArayanlar.Close;
      FreeAndNil(QSonArayanlar);

      calleridEkran.Show;
    end
    else
    begin
      if assigned(calleridEkran) = true then // form açık mı
      begin
        calleridEkran.Close;
      end;
      Application.CreateForm(TcalleridEkran, calleridEkran);
      calleridEkran.lblisim.Caption := 'Kayıtsız Müşteri';
      calleridEkran.lbltelefon.Caption := trim(numara);
      calleridEkran.lbladres.Caption := '';
      calleridEkran.musterinosu := 0;
      calleridEkran.yenimusteri := 1;

      QSonArayanlar := TMyQuery.Create(Nil);
      QSonArayanlar.Connection := Dm.MyCon;
      QSonArayanlar.SQL.Clear;
      QSonArayanlar.SQL.Add
        ('select * from calleridson order by id desc LIMIT 10');
      QSonArayanlar.Open;
      QSonArayanlar.First;

      if QSonArayanlar.RecordCount = 10 then
      begin
        QSonArayanSil := TMyQuery.Create(Nil);
        QSonArayanSil.Connection := Dm.MyCon;
        QSonArayanSil.SQL.Clear;
        QSonArayanSil.SQL.Add
          ('delete from calleridson order by id asc LIMIT 1');
        QSonArayanSil.ExecSQL;
        QSonArayanSil.Close;
        FreeAndNil(QSonArayanSil);
      end
      else
      begin
        QSonArayanlar.Append;
        QSonArayanlar.FieldByName('musteriadi').AsString :=
          QMusteriKontrol.FieldByName('isim').AsString;
        QSonArayanlar.FieldByName('telefon').AsString := trim(numara);
        QSonArayanlar.FieldByName('tarih').AsDateTime := Now();
        QSonArayanlar.Post;
      end;
      QSonArayanlar.Close;
      FreeAndNil(QSonArayanlar);

      calleridEkran.Show;
    end;
    QMusteriKontrol.Close;
    FreeAndNil(QMusteriKontrol);
  end;

end;
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Delphi İle Caller Id kilitlenme sorunu

Mesaj gönderen ertank »

Merhaba,

Kod: Tümünü seç

Application.CreateForm(TcalleridEkran, calleridEkran);
Bu şekilde kod kullanmak yerine ilgili formu ilk çalışma anında Delphi'inin otomatik oluşturmasına izin verin. Hafıza açısından çok ciddi bir kayıp olmayacaktır.

Kod: Tümünü seç

QMusteriKontrol := TMyQuery.Create(Nil);
QSonArayanlar := TMyQuery.Create(Nil);
QSonArayanSil := TMyQuery.Create(Nil);
Yukarıdaki kodlar yerine DataModule içinde ilgili nesneleri yerleştirip Connection bağlantılarını yapabilir. Sorgu cümlesini içine yazabilirsiniz. Böylece çalışma zamanında her telefon geldikçe bu nesnelerin hafızada oluşturulmasına gerek kalmayacaktır.

Kod: Tümünü seç

FreeAndNil(QSonArayanSil);
Yukarıdaki tavsiyeleri uyguladıktan sonra bu koda gerek kalmayacak ancak kullanım yerinin uygun olmaması adına açıklamak istedim. FreeAndNil() eğer bir nesneyi daha sonra tekrar kullanacak iseniz tercih edilecek bir fonksiyondur. Tekrar kullanımı olmayacak nesneler için basitçe

Kod: Tümünü seç

QSonArayanSil.Free();
kullanmalısınız. Performansa ufakta olsa katkısı olacaktır.

Benzer şekilde

Kod: Tümünü seç

if assigned(calleridEkran) = true then
Bu şekilde bir kontrol de performans açısından göreceli bir yavaşlamaya sebep olur. Çünkü Assigned() fonksiyonu zaten bir True/False değeri çevirir. Yukarıdaki kod fonksiyondan dönen değeri tekrar True ile kontrol ettiği için ikili kontrol yapmış oluyor. Basitçe;

Kod: Tümünü seç

if Assigned(calleridEkran) then
yeterli olacaktır.

Yukarıdaki tavsiyelere uyup calleridEkran formunu uygulamanın otomatik oluşturulan formları listesine alır iseniz bu durumda zaten yukarıdaki gibi bir kontrol yapamayacaksınız. Zaten yapmanıza gerek yok. Aşağıdaki satırları komple silebilirsiniz

Kod: Tümünü seç

      if assigned(calleridEkran) = true then // form açık mı
      begin
        calleridEkran.Close;
      end;
      Application.CreateForm(TcalleridEkran, calleridEkran);
Bunun dışında uygulamanıza "log" özelliği eklemenizde büyük faydalar var. Siz sorunun paylaştığınız kod ile ilgili olduğunu düşünüyorsunuz ancak gerçekte çok farklı bir yerde olabilir. Bunu anlamanın tek yolu mümkün olduğunca detaylı loglama yapmanızdan geçer. Log kayıtları parametrik olarak açılır/kapanır olduğu zaman uygulamanızın çalışma hızına etkisi mininun seviyede olacaktır.

Log kaydı tutar iken her ana fonksiyon/prosedür için başlatı/bitti şeklinde kayıt tutmakta ve önemli noktalarda değişken bilgileri veya işlemlerin başarılı olup olmadığı ile iligli ek bilgiler kayıt etmekte fayda vardır.

Log kayıtları ayrıca doğru bilgi vermeyen müşterilerin tespitine ve dikkatsiz müşterilerin sizi yanlış yönlendirmesine de engel olacaktır.
enesharun
Üye
Mesajlar: 28
Kayıt: 17 Eki 2014 11:46

Re: Delphi İle Caller Id kilitlenme sorunu

Mesaj gönderen enesharun »

ertank yazdı: 05 Ara 2019 03:22 Merhaba,

Kod: Tümünü seç

Application.CreateForm(TcalleridEkran, calleridEkran);
Bu şekilde kod kullanmak yerine ilgili formu ilk çalışma anında Delphi'inin otomatik oluşturmasına izin verin. Hafıza açısından çok ciddi bir kayıp olmayacaktır.

Kod: Tümünü seç

QMusteriKontrol := TMyQuery.Create(Nil);
QSonArayanlar := TMyQuery.Create(Nil);
QSonArayanSil := TMyQuery.Create(Nil);
Yukarıdaki kodlar yerine DataModule içinde ilgili nesneleri yerleştirip Connection bağlantılarını yapabilir. Sorgu cümlesini içine yazabilirsiniz. Böylece çalışma zamanında her telefon geldikçe bu nesnelerin hafızada oluşturulmasına gerek kalmayacaktır.

Kod: Tümünü seç

FreeAndNil(QSonArayanSil);
Yukarıdaki tavsiyeleri uyguladıktan sonra bu koda gerek kalmayacak ancak kullanım yerinin uygun olmaması adına açıklamak istedim. FreeAndNil() eğer bir nesneyi daha sonra tekrar kullanacak iseniz tercih edilecek bir fonksiyondur. Tekrar kullanımı olmayacak nesneler için basitçe

Kod: Tümünü seç

QSonArayanSil.Free();
kullanmalısınız. Performansa ufakta olsa katkısı olacaktır.

Benzer şekilde

Kod: Tümünü seç

if assigned(calleridEkran) = true then
Bu şekilde bir kontrol de performans açısından göreceli bir yavaşlamaya sebep olur. Çünkü Assigned() fonksiyonu zaten bir True/False değeri çevirir. Yukarıdaki kod fonksiyondan dönen değeri tekrar True ile kontrol ettiği için ikili kontrol yapmış oluyor. Basitçe;

Kod: Tümünü seç

if Assigned(calleridEkran) then
yeterli olacaktır.

Yukarıdaki tavsiyelere uyup calleridEkran formunu uygulamanın otomatik oluşturulan formları listesine alır iseniz bu durumda zaten yukarıdaki gibi bir kontrol yapamayacaksınız. Zaten yapmanıza gerek yok. Aşağıdaki satırları komple silebilirsiniz

Kod: Tümünü seç

      if assigned(calleridEkran) = true then // form açık mı
      begin
        calleridEkran.Close;
      end;
      Application.CreateForm(TcalleridEkran, calleridEkran);
Bunun dışında uygulamanıza "log" özelliği eklemenizde büyük faydalar var. Siz sorunun paylaştığınız kod ile ilgili olduğunu düşünüyorsunuz ancak gerçekte çok farklı bir yerde olabilir. Bunu anlamanın tek yolu mümkün olduğunca detaylı loglama yapmanızdan geçer. Log kayıtları parametrik olarak açılır/kapanır olduğu zaman uygulamanızın çalışma hızına etkisi mininun seviyede olacaktır.

Log kaydı tutar iken her ana fonksiyon/prosedür için başlatı/bitti şeklinde kayıt tutmakta ve önemli noktalarda değişken bilgileri veya işlemlerin başarılı olup olmadığı ile iligli ek bilgiler kayıt etmekte fayda vardır.

Log kayıtları ayrıca doğru bilgi vermeyen müşterilerin tespitine ve dikkatsiz müşterilerin sizi yanlış yönlendirmesine de engel olacaktır.
İlginize çok teşekkür ederim. Söylediklerinizi deneyeceğim. Loglamaları mümkün olduğunca yapıyorum ama programın kilitlendiği anı yakalama şansım bir türlü olmuyor. Program kilitlendiğinde bir kayıt atma şansım nedir? Ya da bunun için bir komponent var mı?
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Delphi İle Caller Id kilitlenme sorunu

Mesaj gönderen ertank »

Loglama yapıyorum sözünüze istinaden gönderdiğiniz kodlar içinde loglama ile iligli hiç satır göremedim.

Kilitlenmeler ile ilgili kontroller ne derece sağlıklı bilemiyorum. Ancak uygulama çökmesi ile ilgili en çok tercih edilen sanırım Eurokalog
https://www.eurekalog.com

Ayrıca MadExcept'i de inceleyebilirsiniz. Bu ikisi en çok bilinenler arasındadır.
http://madshi.net

Bu tür uygulamalar log kaydı almaz. Uygulama çöktüğü andaki call stak vb. erişilebilen bilgileri mümkün olduğunca kolay şekilde size geri bildirilmesini sağlarlar.
enesharun
Üye
Mesajlar: 28
Kayıt: 17 Eki 2014 11:46

Re: Delphi İle Caller Id kilitlenme sorunu

Mesaj gönderen enesharun »

ertank yazdı: 05 Ara 2019 04:43 Loglama yapıyorum sözünüze istinaden gönderdiğiniz kodlar içinde loglama ile iligli hiç satır göremedim.

Kilitlenmeler ile ilgili kontroller ne derece sağlıklı bilemiyorum. Ancak uygulama çökmesi ile ilgili en çok tercih edilen sanırım Eurokalog
https://www.eurekalog.com

Ayrıca MadExcept'i de inceleyebilirsiniz. Bu ikisi en çok bilinenler arasındadır.
http://madshi.net

Bu tür uygulamalar log kaydı almaz. Uygulama çöktüğü andaki call stak vb. erişilebilen bilgileri mümkün olduğunca kolay şekilde size geri bildirilmesini sağlarlar.
Bu gönderdiğim kod parçasında ihtiyaç duymamıştım loglamaya. :( eurekalog programının demosunu kullanmıştım gayet başarılı programdı. Lisansını araştırmakta da fayda var aslında. Çok teşekkür ederim ilginize. çözüme kavuşturabilirsem yanıt olarak yazacağım.
enesharun
Üye
Mesajlar: 28
Kayıt: 17 Eki 2014 11:46

Re: Delphi İle Caller Id kilitlenme sorunu

Mesaj gönderen enesharun »

Net bir çözüm bulamadım. Fakat bir ekranın caller id mesajını gösterdiğimde arkaplanda kaldığını fark ettim ve hiç bir şeye tıklayamadığımı gördüm. Mesaj çıktığı anda o ekranın da kapanmasını sağladım ve tablolardaki indexleri yeniden düzenledim. Şuan için müşterimden herhangi bir dönüş de olmadı olumsuz olarak.
Hepinize teşekkür ederim.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Delphi İle Caller Id kilitlenme sorunu

Mesaj gönderen freeman35 »

o formu brinttofront ile öne çıkartabilirsin, showmodal yerinede normal açıp, stayontop ile önde durmasını sağlayabilirsin. Sendeki hata gibi arkaya düşse bile programın kilitliymiş gibi davranmaz.
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Cevapla