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.
türetilmiş formlarda thread kullanımı
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- 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...
- 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...
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.
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;
@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
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:)
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 }

Bilmemek ayıp değil öğrenmek isteyene öğretmemek ayıp:)