Hallo,
mit der Abfrage
if Assigned(obj) then
// Object existiert noch
das stimmt so nicht.
assigned prüft nicht, ob das Objekt noch existiert, sondern ob die Objektvariable nil ist. Führ einmal folgenden Code aus:
var
B: TButton;
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(nil);
B := TButton.Create(Form2);
B.Parent := Form2;
B.Top := 10;
B.Left := 10;
Form2.ShowModal;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Form2.Free;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if Assigned(B)then ShowMessage('ist assigned')
else ShowMessage('ist not assigned');
end;
Nun klicke der Reihe nach
- Button1 (Form erzeugen, ButtonVariable zuweisen und Form 1mal zeigen)
- Button2 (Form zerstören)
- Button3 (Zuweisung prüfen)
hier bleibt B immer noch „assigned“.
Aus diesem Grund ist es auch gute Praxis, nach dem Zerstören eines Objekts die Objektvariable auf nil zu setzen.
Ich würde im vorliegenden Fall ganz normal in einem try-except-Block über die Variable auf das Objekt zugreifen und bei Auslösen der Exception vom Typ EAccessViolation die Variable auf nil setzen.
procedure TForm1.Button3Click(Sender: TObject);
begin
if Assigned(B)then ShowMessage('ist assigned') else ShowMessage('ist not assigned');
try
B.Top := 20;
except
on e: EAccessViolation do B := nil;
end;
end;
wird jetzt der Button3 gedrückt (nach Button1 und 2), so erscheint zunächst „is assigned“. Dann wird die Exception ausgelöst und bei einem weiteren Druck auf Button3 ist es dann „is not assigned“. Dafür sind Exception-Schutzblöcke da.
Gruss, Niels