Hallo mal wieder.
Ich habe ein Problem mit einem Objekt, dass freigegeben wurde, wo aber die variable nicht auf nil gesetzt wurde.
Code:
procedure TFormToast.showMessage(sMitteilung: String; aForm: TForm);
begin
if Assigned(messageBoxToast) and (aCenterForm <> aForm) then
begin
messageBoxToast.HideAll;
FreeAndNil(messageBoxToast);
end;
if not Assigned(messageBoxToast) then
begin
messageBoxToast := TAdvSmartMessageBox.Create(aForm);
aCenterForm := aForm; //aCenterForm ist Klassenvariable
messageBoxToast.DisplayLocation := dlbottomCenter;
messageBoxToast.DisplayRelative := drForm;
end;
with MessageBoxToast.Messages.Add do
begin
Text := sMitteilung;
Show;
end;
end;
Der Sinn dahinter:
Es sollen an verschiedenen Stellen im Programm so Infoboxen erscheinen, die ich ganz im Android-Style einfach Toast nenne. Diese Nachrichten werden am Owner ausgerichtet, welcher immer ein anderes Form sein kann - aber nicht muss. Deshalb merke ich mir in einer Klassenvariable das übergebene Form und wenn ein anderes rein kommt, wird die TAdvSmartMessageBox freigegeben und mit dem neuen Form als Owner wieder erzeugt - an dem dann wieder die Nachrichten ausgerichtet werden.
jetzt habe ich das Problem, dass die übergebenen Forms oft (nicht immer) außerhalb wieder freigegeben werden und somit dürfte auch das Objekt hinter der Variable MessageBoxToast automatisch vom Owner freigegeben werden, ohne dass die Variable selber auf nil gesetzt wird.
Wenn ich jetzt eine neue Instanz des vorherigen Forms übergebe, sagt die Abfrage "(aCenterForm <> aForm)" false weil es angeblich das gleiche Form ist (trotz neuer Instanz) und die Variable von MessageBoxToast ist auch noch irgendwie assigned, weil sie ja noch nicht auf nil gesetzt wurde.
Dann scheint irgendwie im Speicher auf den MessageBoxToast zeigt nur blödsinn zu stehen, auf den ich zugreifen will und dann knallt es.
Wie kann ich also überprüfen, ob hinter der (nicht auf nil gestetzten) Variable noch ein intaktes Objekt hängt?