Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Objekt prüfen, ob es noch existiert oder zerstört ist. (https://www.delphipraxis.net/28880-objekt-pruefen-ob-es-noch-existiert-oder-zerstoert-ist.html)

Golze 31. Aug 2004 19:39


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:
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;
kay

HW764 31. Aug 2004 19:41

Re: Objekt prüfen, ob es noch existiert oder zerstört ist.
 
Delphi-Quellcode:
if button1.exists then
showmessage ('Es gibt ihn!!!');
Gruss HW764

Golze 31. Aug 2004 19:45

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.

Robert_G 31. Aug 2004 19:46

Re: Objekt prüfen, ob es noch existiert oder zerstört ist.
 
Zitat:

Zitat von HW764
Delphi-Quellcode:
if button1.exists then
showmessage ('Es gibt ihn!!!');

:gruebel: Was soll das denn bringen?

@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;

sakura 31. Aug 2004 19:48

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:...

Golze 31. Aug 2004 19:49

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

Robert_G 31. Aug 2004 19:50

Re: Objekt prüfen, ob es noch existiert oder zerstört ist.
 
Der "Hinweis" war nicht von mir. ;)

Golze 31. Aug 2004 19:57

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

Sprint 31. Aug 2004 20:47

Re: Objekt prüfen, ob es noch existiert oder zerstört ist.
 
Zitat:

Zitat von Golze
Das Problem ist, wenn ein Release benutzt wird, kann anschließend kein NIL zugewiesen werden.

Aus der OH:
Zitat:

Jede Ereignisbehandlungsroutine für das Formular oder für dessen untergeordnete Objekte sollte Release anstelle von Free (Delphi) oder Delete (C++) benutzen. Ansonsten kann ein Speicherzugriffsfehler auftreten.
mmh, das wußte ich auch noch nicht. Komisch. hab das auch noch nie gesehen.
Zitat:

Hinweis:Release gibt die Steuerung sofort an die aufrufende Routine zurück und wartet nicht, bis das Formular freigegeben wird.
Aha, jetzt weiß ich auch, warum das keiner benutzt. :)

Zitat:

Ich habe mir auch mal die FreeAndNIL - Methode angesehen.
Nehmen wir mal an, du benutzt ein Objekt das außerhalb der Prozeduren und Funktionen liegt. Da macht es sehr viel Sinn, wenn du FreeAndNil benutzt. Dann kannst du mit...
Delphi-Quellcode:
  if Assigned(MyObject) then
    ShowMessage('Oh, Objekt existiert noch');
... ob's das Objekt noch gibt.

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.

Golze 1. Sep 2004 07:43

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:
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;
Ich habe es mal unter verschiedenen Zuständen getestet. Funktioniert gut. Siehst du noch Fehler?
Wie kann ich nur diese verdammten Smilies in den Text einbinden....


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:30 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz