2016-04-08 21 views
0

Uygulamamın formunu kapattığımda EAccessViolation yaşıyorum ve bununla nasıl baş edeceğimi bilmiyorum, iki birimim var, burada ana birim ilgili kod:Form 1 kapatırken EAccessViolation nasıl işlenir

Ben kapatmak

unit myComponent; 
type 
TMyComponentEvent = procedure(sender: TObject; p: integer) of object; 
type 
TMyComponent = class(TComponent) 
// Properties and events declaration 
procedure TPThread.Execute; 
begin 
    try 
    // Create and run some worker threads 
    // Wait for them to finish the job 
    // This is the last thing to do: 
    if Assigned(FOnMyComponentEvent) then 
    begin 
     FOnMyComponentEvent(Self, p); 
    end; 
finally 
    //free ressources 
end; 
end; 

procedure TMyComponent.DoSomeWork; 
begin 
    TPThread.Create(p1, p2 ...); 
end; 
end. 

:

unit MainUnit; 
uses 
    .., myComponent1; 

implementation 
{$R *.dfm} 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
    MyComponent1.doSomeWork(p1, p2, ..., pn); 
end; 
procedure TForm1.OnMyComponen1tEvent(sender: TObject; p: Integer); 
begin 
    memo1.Lines.Add(message); 
end; 
end. 

Bu birim bunun gibi bir şey var, başka ünite i bileşeninin olayı kullanarak elbette mesajı göstermesine Memo1 için bir sinyal göndermek olduğu bir bileşen sınıfı, bir kullanır Programın işini bitirmeden önce formu (Konular hala çalışıyor), bu excep'i alıyorum Bazen, bazen istisna yoktur. İstisna yükseltildiğinde, satırı belirtir: memo1.Lines.Add(message);. Bunu nasıl çözeceğimi bilmiyorum, bu yüzden istisnanın gerçekleşmesini nasıl engelleyebilirim?

+0

onlar yok edildikten sonra nesnelere erişim yapmayın. Bunu nasıl elde edeceğiniz konusunda yardım istiyorsanız, bazı kodları görmek isteriz. –

cevap

1

Form yok ederken nil MyEvent olayı ayarlamıyorsanız gibi geliyor mesela

procedure TForm1.FormCreate(sender: TObject); 
begin 
    OtherUnit.MyEvent := MyEvent; 
end; 

procedure TForm1.FormDestroy(sender: TObject); 
begin 
    OtherUnit.MyEvent := nil; 
end; 
+0

Önemli bir şeyden bahsetmedim sanırım: diğer birim bir bileşen ve MyEvent bileşen olayı ve parametreleri var, sorumu karmaşıklaştırmaya çalıştım, aksi takdirde sorumu düzenler ve ilgili kod. – Safa

+0

@Safa: Ardından, sorunuzu düzenleyin ve bir cevaba yapılan bir yoruma gömmek yerine, söz konusu son derece alakalı bilgileri sorunuza ekleyin. Tamamen bağlam olmadan gönderilen küçük snippet'i değil, sorunu gösteren tam bir [mcve] göndermeniz gerekir. –

+0

@Safa: Bileşen Form üzerindeyse, Form serbest bırakıldığında bileşen serbest bırakılacağından olayı sıfırlamaya gerek yoktur. Bileşen başka bir yerde oluşturulduysa ve Form olaya dinamik olarak atanırsa, yukarıdaki yanıtım hala geçerli olur, bunun yerine 'OtherUnit 'yerine bunun yerine bileşen işaretçisiyle değiştirin. –