![]() |
Objekt prüfen, ob es noch existiert oder zerstört ist.
Hi Schlaumis,
habe das Problem, eine Form nach einem Release zu prüfen, ob sie noch existiert oder nicht. Das gleiche gilt auch für ein Free. Wer kann mir ein Tip geben, wie ich ein beliebiges Objekt prüfen kann, ob es noch wirklich existiert, wenn die Referenzvariable nicht explizit auf NIL gesetzt worden ist.
Delphi-Quellcode:
kay
Var
form1: TFrom; begin form1 := TForm.Create(Application); .... form1.Release; end; procedure CreateLostForm; begin if form1 = nil then //[b]das funktioniert nicht!!!!![/b] form1 := TForm.Create(Application); end; |
Re: Objekt prüfen, ob es noch existiert oder zerstört ist.
Delphi-Quellcode:
Gruss HW764
if button1.exists then
showmessage ('Es gibt ihn!!!'); |
Re: Objekt prüfen, ob es noch existiert oder zerstört ist.
... Danke für den Hinweis. Aber das Property ist nicht bei allen Objekten vorhanden. Ebenfalls kann es funktionieren, obwohl das Objekt bereits freigegeben worden ist.
|
Re: Objekt prüfen, ob es noch existiert oder zerstört ist.
Zitat:
@Topic Das Problem lässt sich IMHO nur lösen wenn der Zeiger beim zerstören auf nil wandert. Ein simples FreeAndNil sollte genau das erreichen.
Delphi-Quellcode:
Var
form1: TFrom; procedure DoSomething(); begin form1 := TForm.Create(Application); .... FreeAndNil(form1); end; ... procedure CreateLostForm(); begin if not Assigned(form1) then //entspricht einem Vergleich gegen nil, ist aber lesbarer ;) form1 := TForm.Create(Application); end; |
Re: Objekt prüfen, ob es noch existiert oder zerstört ist.
Wie Robert_G schon schrieb, FreeAndNil, bzw. die expliziete Zuweisung von nil ist die Lösung. Alles andere ist nicht sicher bzw. geht nicht ;)
...:cat:... |
Re: Objekt prüfen, ob es noch existiert oder zerstört ist.
Hi Robert_G,
habe gerade mal deinen Hinweis mit Button1.Exists in Delphi5 probiert. Das Property ist in dieser Version nicht vorhanden. Gibts also hier noch nicht. Trotzdem dank für den Hinweis. Kay |
Re: Objekt prüfen, ob es noch existiert oder zerstört ist.
Der "Hinweis" war nicht von mir. ;)
|
Re: Objekt prüfen, ob es noch existiert oder zerstört ist.
Hallo Daniel,
habe gerade deine Antwort gelesen. Das Problem ist, wenn ein Release benutzt wird, kann anschließend kein NIL zugewiesen werden. Ich habe mir auch mal die FreeAndNIL - Methode angesehen. Das wird die übergebene Referenz auf eine lokale Variable gesetzt. Die übergebene Variable wird einfach auf NIL gesetzt. Das bringt vor allem Probleme in DLL's. Deshalb geht das so nicht. Im prinzip muß ein Release vollständig bearbeitet worden sein, damit das Objekt auch wirklich gelöscht werden kann. Das macht aber Windows. Kann man nicht über ein Handle abfragen? Aber was macht man bei Objekte (TFont) wo man kein Handle hat? Das Ding (Problem) ist echt grausig. Grüße kay |
Re: Objekt prüfen, ob es noch existiert oder zerstört ist.
Zitat:
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
... ob's das Objekt noch gibt.
if Assigned(MyObject) then
ShowMessage('Oh, Objekt existiert noch'); Eine Form, die mit Application.Create erstellt worden ist, würde ich auch nie mit Release oder Free freigeben. Warum auch. Mit Application.Create entschließe ich mich ja dazu, das das Objekt Application die Speicherverwaltung übernehmen soll. Wenn's anders laufen soll, dann erstelle ich die Form per Hand. |
Re: Objekt prüfen, ob es noch existiert oder zerstört ist.
Hallo Sprint,
vielen Dank für deine guten Hinweise. Mein Problem kommt daher, daß ich hauptsächlich mit Threads und DLL's Form in unterschiedlichen Zuständen verwalten muß. Deshalb kann über Application.CreeateForm das nicht funktionieren. Ich habe aber mir in den letzten Stunden eine Lösung zurechtgebastelt. Mußte mal meinen Debugger im Hirn einschalten. Hat auch funktioniert. Lösungsansatz. Wenn ein Objekt instanziiert wird, erhält die "Erinnerungsverwaltung" (Memory Management) den Auftrag dafür Speicher zur Verfügung zu stellen. Also kann auch nur das Memory Management letztendlich darüber entscheiden, ob ein Objekt noch grundsätzlich gültig ist oder nicht. Ergo muß ich also das Memory Management von Windows fragen, ob der Zurgriff darauf noch möglich ist oder nicht. Das geht dann wie folgt:
Delphi-Quellcode:
Ich habe es mal unter verschiedenen Zuständen getestet. Funktioniert gut. Siehst du noch Fehler?
function AssignedObject(var aObject): Boolean;
begin Result := False; try if Assigned(TObject(aObject)) then Result := not IsBadHugeReadPtr(TObject(aObject), TObject(aObject).InstanceSize); except Result := False; end; end; Wie kann ich nur diese verdammten Smilies in den Text einbinden.... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz