türetilmiş formlarda thread kullanımı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
BAHADIR
Üye
Mesajlar: 22
Kayıt: 15 Oca 2004 02:23

türetilmiş formlarda thread kullanımı

Mesaj gönderen BAHADIR »

Arkadaşlar Merhaba

Kendisinden bir çok form türettiğim bir ata formum var. Bu ata form üzerinde thread kullanarak bir döngü yaptım çalışıyor fakat türetilmiş formlarda bu prosedür çağrılınca acces violation adress hatası veriyor. Ben türetilmiş olan formda bir label a döngü değerini yazdırmak istiyorum ama bu satıra gelince hata veriyor.
türetilmiş formlarda thread kullanılmaz mı?
Yada ben nerede yanlış yapıyorum.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Thread içerisinde geçen kontrollerin bir türetilmiş bir forma göre düzenlenmiş olması lazım. Yani Label'a veri yazdırmak isterken olmayan bir formdaki olmayan bir Label'a atıfta bulunuyorsunuz sanıyorum...

- Açık formları Component döngüsü içerisinde (if Components[sayac] is TForm) şeklinde bir sorguyla başlayacağınız kontroller silsilesinde hedef formunuzu tespit edip, TForm(Components[sayac]).Label6 değil yine bir adım ileri giderek TLabel(TForm(Components[sayac]).FindComponent('Label6')).Caption -kodlama parantez hatası vs. olabilir- şeklinde erişmeyi deneyin...

- Daha kısa yolu mutlaka vardır ama spontan aklıma bu geldi. Sorunun kaynağı açısından bilgi vermek amaçlı örneklemek için yani...
Resim
Resim ....Resim
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Form içindeki bileşenlere thread'den erişiyorsunuz.

Eğer thread içinde Form1.Label1.Caption:= 'Bilmemne'; yapıyorsanız bunu yapmayın. Bunun yerine Thread objenize Form'un Self parametresini gönderin. Thread içinde de bu Self parametresi ile Form bileşenlerine erişin.

Kod: Tümünü seç

TBenimThread = class(....
private
  FForm: TForm;
  procedure UpdateLabel;
...
...
..
public
  property Form: TForm read FForm write FForm;
end;

TFormBirsey = class(TForm)

..
..
end;

procedure TBenimThread.UpdateLabel;
begin
   FForm.Label1.Caption:= 'test';
end;

procedure TBenimThread.Execute;
begin
   Synchronize(UpdateLabel);
end;

procedure TFormBirsey.ThreadAc;
begin
   Thread:= TBenimThread.Create;
  Thread.Form:= Self;
end;
Kullanıcı avatarı
Nick_
Üye
Mesajlar: 122
Kayıt: 01 Eki 2007 09:28
Konum: Konya

Mesaj gönderen Nick_ »

@fduman hocam dırek Form1.Label1.Caption:= 'Bilmemne'; dıye erıssek ne gıbı bı sıkıntı olabılır?

ben daha once yaptıgım bı proje de

detaybas:= FastPos(TRichEdit(findcomponent('YeniDetay'
+inttostr(DonguDegeri))).Text,'class="sUcHaberDevam1devam">',
length(TRichEdit(findcomponent('YeniDetay'+inttostr(DonguDegeri))).Text),28,1);

su sekılde bı kodlama kullandım bunu suan thread ıle yapmaya calısıyorum nasıl ulasabılırım..


bır dıger sorum thread ıcerısınde Findcomponent fonksıyonunu neden kullanamıyorum? bılgılendırırsenız sevınırım.Kolay gelsin
Bilmemek ayıp değil öğrenmek isteyene öğretmemek ayıp:)
Kullanıcı avatarı
Nick_
Üye
Mesajlar: 122
Kayıt: 01 Eki 2007 09:28
Konum: Konya

Mesaj gönderen Nick_ »

Kod: Tümünü seç

{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure deneme.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ deneme }
bunu bıraz anladım gıbı ama Findcomponent i hala cözemedim.. :oops:
Bilmemek ayıp değil öğrenmek isteyene öğretmemek ayıp:)
Kullanıcı avatarı
Nick_
Üye
Mesajlar: 122
Kayıt: 01 Eki 2007 09:28
Konum: Konya

Mesaj gönderen Nick_ »

Arkadas sorunumu hallettım kucuk bı hata yuzunden kullanamıyormusum..
Kusura bakmayın sızlerıde yorduk :)
Bilmemek ayıp değil öğrenmek isteyene öğretmemek ayıp:)
Cevapla