Einzelnen Beitrag anzeigen

Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#1

Prüfen ob ein Objekt freigegeben wurde (Assigned geht nicht)

  Alt 27. Jun 2017, 14:18
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?
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?
  Mit Zitat antworten Zitat