dışardan close

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
true_false
Üye
Mesajlar: 401
Kayıt: 22 Tem 2004 02:03
Konum: sıkıntı çekmişlere yakın bi yerden

dışardan close

Mesaj gönderen true_false »

merhabalar;
comportton bilgi alan bir uygulamam var. comporttan gelen özel karakterleri işliyorum burda bir problem yok. mesela comporrttan bana XXXX gibi bir text geldi, yaptığım uygulamada.

Kod: Tümünü seç

alinan :=   Comport.ReadBuffer;
if alinan = 'XXXX' then
self.close;////yapmak istediğim
gibi bir kod geçiyorum ama program kapanmıyor debug ediyorum o kod satırına giriyor geçiyor ama close olmuyor self.close; yerine örneğin edit1.text:=alinan; dediğimde editte alinan stringini görebiliyorum ama form close olmuyor.(application.terminate 'de denedim olmadı)

muhtemel şüphem bu kodlar çalıştığında mevcut formum aktif değil acaba close gibi işlemlerin tetiklenmesi için uygulamanın aktifmi olması gerekir. yardımlarınızı bekliyorum..
En son true_false tarafından 04 Eyl 2007 02:47 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
type
Tform1 = class(Tform)
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Kod: Tümünü seç

If UpperCase(Trim(Alinan)) = 'XXXX'
şeklinde dene. Gelen değer içerisinde gerçekten net olarak bunun geldiğinden emin olmalısın.

- İşin içinde Com Port varsa sonunda #10#13 gibi karakterler de bulunuyor olmalı. TEdit'de bunları göremezsin. Gelen değerleri net bir şekilde görmek istiyorsan HEX olarak yansıt.
Resim
Resim ....Resim
true_false
Üye
Mesajlar: 401
Kayıt: 22 Tem 2004 02:03
Konum: sıkıntı çekmişlere yakın bi yerden

Mesaj gönderen true_false »

yok hocam comporttan bilgi gönderende alanda benim text bilgi gönderiyorum(ufakbir simule programım var) zaten yanlış bilgiyi sorgulasam

Kod: Tümünü seç

if alinan = 'XXXX' then
showmessage('gelen veri doğru'); 
showmessage'ım da çalışmaz atlar. ama atlamıyor yani gelen verim doğru.
ilk mesajı yazdıktan sonra close ettiğim yere

Kod: Tümünü seç

if alinan = 'XXXX' then
self.close; 

şu değişikliği yaptım

Kod: Tümünü seç

if alinan = 'XXXX' then
showwindow(self.handle,SC_CLOSE); 

yazıp formun onclosequery' sine

Kod: Tümünü seç

canclose:=true;

yaptım ama olmadı.
@mrmarman ilgilendiğiniz için teşekkür ederim bir şey daha denemek istiyorum.

Kod: Tümünü seç

if alinan = 'XXXX' then
showmessage('gelen veri doğru'); 
showmessage kodunun olduğu satıra formu aktif yapan bir kod lazım yani o kod çalıştıktan sonra masaüstümde benim programım aktif olacak abiyane tarifle mouse ile seçili, bana bu konuda yardımcı olabilirmisiniz. şüphelendiğim konu o simule programımla bu programım aynı mkinada çalışıyor ve simule ile veri gönderdiğim için diğer program pasif oluyor.


dipnot: sizin mesajınızdan sonra gerekli ascii kontrolleri yaptım emindim ama belki gözden kaçmıştır diye bir daha kontrol ettim ve herhangi bir kontrol karakteri gelmiyor debug anında değişkenimim içinde #5..vs gibi bir karakter yok buffer'a düşen veri ascii karaktersiz sade string. (zaten stringi gönderende benim) içinde kontrol karakterleri yok
type
Tform1 = class(Tform)
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Proje aktifken yani focus programında iken işlem yapıyor ancak arka fonda iken işlem yapmıyor mu ? Sorunu bu şekilde mi tespit etmiştin ?

- Test edebilmek için simüle eden programına bir timer koy ve örneğin 5 saniye sonra bilgi göndersin. Bu sanin için kontrol projene dönmek ve bekleyip sonucu görmek için zaman tanıyacaktır.
Resim
Resim ....Resim
true_false
Üye
Mesajlar: 401
Kayıt: 22 Tem 2004 02:03
Konum: sıkıntı çekmişlere yakın bi yerden

Mesaj gönderen true_false »

@mrmarman dediğini şu şekilde yaptım

Kod: Tümünü seç

sleep(5000);
close;
dedim ve programın kapanması için gerekli özel kodu gönderdikten sonra main programda bekledim fakat gene close satrının üstünden geçti ama close yapmadı acaba formun close olayında başka bir kodlarmı çalışıyor diye emin olabilmek için bir buton koyup içine close; kodunu yazdım çalıştrıdım ve main programım kapandı. close'da bir problem yok.
an itibarı ile messagedlg fonksiyonuyla kontrol yaparım nasılsa bu mesaja yanıt verirsem main programım aktif olur ve kapanır diye bir mantık yürüttüm gönderdim mesajı aldım fakat yes dediğimde form close olmadı acaba yanlışmı yazdım işte kod;

Kod: Tümünü seç

      case MessageDlg('kapatmak',mtWarning,mbOKCancel,0) of
            mrOk: close;
            mrCancel:exit;
            end;        
bu arada messagedlg ile deneme yaparken şu hatayı aldım BELKİ alakası vardır diye yazıyorum (bu arada bu hatayı bir kaç kere aldım oda debug anında galiba comport time out'a uğradığı için veriyordur diye tahmin ediyorum.)

HATA: canvas does not allow drawing
type
Tform1 = class(Tform)
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Beni yanlış anlamışsın... :oops:

- Simülasyon programın seni, işlem yapmayan projene geçebilmen için 5 saniye bekleyip sonra komutu göndermesi gerekiyordu.

- A Programı : Komut gönderen simülasyon programı
- B Programı : 'XXXX' mesajını alıp da kapanmayan program diyelim.

- A Programı
ButtonClick olayında
Sleep(5000);
KomutGonder('XXXX');

- Sen bu 5 saniye bekleme esnasında B programına geçecek ve aktif olarak bekleyeceksin. İzleyeceksin ki bu 5 saniye sonucunda program aktifken gelen mesaj alınabiliyor mu ?

Anlatabildim mi ?
Resim
Resim ....Resim
true_false
Üye
Mesajlar: 401
Kayıt: 22 Tem 2004 02:03
Konum: sıkıntı çekmişlere yakın bi yerden

Mesaj gönderen true_false »

malesef sonuç yine değişmedi.. ilgi ve alakanız için tekrar teşekkürler.
type
Tform1 = class(Tform)
true_false
Üye
Mesajlar: 401
Kayıt: 22 Tem 2004 02:03
Konum: sıkıntı çekmişlere yakın bi yerden

Mesaj gönderen true_false »

@mrmarman bu arada sizinle yaşadığım bir tecrübeyi paylşamak istiyorum bir dll bir unit ve bir proje bazlı üç aşamalı bir programım vardı.
unitimde record type'lar tanımlamıştım programda çok fazla değişken kullandığım i için bu uniti oluşturmuştum ve dll'in unitine eklemiştim dll'de gerekli atamları yaptıktan sonra projemde (dll'i ve uniti kullandığım exede) dll'den record typleri tanımladığım uniti çağırarak gerekli değişkenleri export etmeye çalıştığımda değişkenler hep boş geliyordu. bunun sebebini malesef anlamamıştım. galiba buna benzer bir sorunla karşı karşıyayım. sadece bilgi maksatlı yazıyorum tekrar teşekkürler.
type
Tform1 = class(Tform)
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Hocam kurgunu nasıl ? Bizimle paylaşırsan yardımcı olmaya çalışalım. Ben şimdi aşağıdaki şekilde notebook ve desktop olmak üzere iki bilgisayarımı birbirine bağladım ve haberleştirdim. (elimde her zaman Null Modem kablom vardır. :wink: ) Sorun olmadan (pasif bile olsa) işlem yapıyor...

Formuna birer tane şunlardan koy..

TApdComPort ( Comm Port bağlantısı için ApdComPort1 )
TSpinEdit ( giriş/çıkış yapacağın Comm Port numarasını yazmak için SpinEdit1 )
TEdit ( Göndereceğin mesajı yazmak için Edit1 )
TMemo ( Gelen mesajları görüntülemek için Memo1 )
TButton ( iki adet. birisi bağlantı için hazırlık diğer mesaj göndermek için Button1 ve Button2)

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
  // --  Port Hazırlığı -- //
  With ApdComPort1 do begin
    ComNumber    := SpinEdit1.Value;
    Baud         := 9600;
    DataBits     := 8;
    Parity       := pNone;
    StopBits     := 1;
    BufferFull   := 0;
    BufferResume := 0;
    DeviceLayer  := dlWin32;
    DTR          := true;
    AutoOpen     := true;
    Open         := true;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  // --  Mesaj Gönder -- //
  if ApdComPort1.Open
    then begin
      ApdComPort1.PutString( Edit1.Text );
      Caption := 'Mesaj Gönderildi...';
    end else Caption := 'Bağlantı Kurulamadı...';
end;

procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
Var
  i    : Integer;
  Veri : String;
begin
  // --  Gelen mesajı Memo'da göster -- //
  Veri := '';
  for i := 1 to Count do Veri := Veri + ApdComPort1.GetChar;
  Memo1.Lines.Add ( Veri );
  // Burada senin olayı koyduk...
  If Veri = 'XXXX' then Close; 
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ApdComPort1.Open := False;
end;
Resim
Resim ....Resim
true_false
Üye
Mesajlar: 401
Kayıt: 22 Tem 2004 02:03
Konum: sıkıntı çekmişlere yakın bi yerden

Mesaj gönderen true_false »

kodlar işte sabah ilk işim kodları göndermek olacak zahmete girmişsiniz özür dilerim.
type
Tform1 = class(Tform)
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Mesaj gönderen Lost Soul »

bazı 3. parti bileşenler bazen close olayını biraz karmaşıklaştırıyor. özellikle skin görevi gören bileşenler.Bende de bir kaç kez close metodunu devre dışı bırakan bileşenler olmuştu. bu tip bir 3. parti bileşen kullaıyor musunuz.?
true_false
Üye
Mesajlar: 401
Kayıt: 22 Tem 2004 02:03
Konum: sıkıntı çekmişlere yakın bi yerden

Mesaj gönderen true_false »

@mrmarman sorundur bilinmez ama tamamen benim projelerim için yazdığım companentle alakalı şimdi apronun comportu ile denedim close işlemini yaptı ama bnim companentim ile yapmıyor. neden yapmıyor anlayabilmiş değilim teşekkür ederim iyi çalışmalar (herzamanki gibi nokta atışı yapmışsınız vesselam.)
@Lost Soul ip ucun için teşekkürler.
type
Tform1 = class(Tform)
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

Re: dışardan close

Mesaj gönderen akdatilla »

true_false yazdı:merhabalar;
comportton bilgi alan bir uygulamam var. comporttan gelen özel karakterleri işliyorum burda bir problem yok. mesela comporrttan bana XXXX gibi bir text geldi, yaptığım uygulamada.

Kod: Tümünü seç

alinan :=   Comport.ReadString(Comport.ReadBufSize);
if alinan = 'XXXX' then
self.close;////yapmak istediğim
gibi bir kod geçiyorum ama program kapanmıyor debug ediyorum o kod satırına giriyor geçiyor ama close olmuyor self.close; yerine örneğin edit1.text:=alinan; dediğimde editte alinan stringini görebiliyorum ama form close olmuyor.(application.terminate 'de denedim olmadı)

muhtemel şüphem bu kodlar çalıştığında mevcut formum aktif değil acaba close gibi işlemlerin tetiklenmesi için uygulamanın aktifmi olması gerekir. yardımlarınızı bekliyorum..

Merhaba,
Kullandığın comport bileşeni nedir bilemiyorum ancak ben de bu tur uygulamalar geliştirdim. Ben comport bileşenini programın çalışma esnasında (runtime) yüklüyorum. Programın anaformunun Close eventinde bu bileşeni hafızadan atıyorum.
Sana tavsiyem programda başka bir değişiklik yapmadan ana formunun onclose procedure bloğuna şu kodları girmen:
procedure TMainF.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Comport.DisConnect;{bu kod senin bileşeninde farklı olabilir, com portu kapatman gerekli}
Comport.free;
Comport:=nil;
end;

Yukarıdaki kodları mutlaka uygula. Eğer bu kodlar yeterli olmazsa bir başka ihtimal daha var. Eğer programında timer, thread kullanıyorsan bunları onclose bloğunda durdurman gerekir.
Örnek:
Timer1.Enabled:=false;

kolay gelsin.
Cevapla