AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Objekt prüfen, ob es noch existiert oder zerstört ist.
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Golze · begonnen am 31. Aug 2004 · letzter Beitrag vom 4. Sep 2004
Antwort Antwort
Seite 1 von 2  1 2      
Golze

Registriert seit: 26. Aug 2004
Ort: Berlin
32 Beiträge
 
Delphi 5 Enterprise
 
#1

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

  Alt 31. Aug 2004, 18:39
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
Kay Golze
  Mit Zitat antworten Zitat
HW764
(Gast)

n/a Beiträge
 
#2

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

  Alt 31. Aug 2004, 18:41
Delphi-Quellcode:
if button1.exists then
showmessage ('Es gibt ihn!!!');
Gruss HW764
  Mit Zitat antworten Zitat
Golze

Registriert seit: 26. Aug 2004
Ort: Berlin
32 Beiträge
 
Delphi 5 Enterprise
 
#3

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

  Alt 31. Aug 2004, 18:45
... 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.
Kay Golze
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#4

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

  Alt 31. Aug 2004, 18:46
Zitat von HW764:
Delphi-Quellcode:
if button1.exists then
showmessage ('Es gibt ihn!!!');
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;
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 31. Aug 2004, 18:48
Wie Robert_G schon schrieb, FreeAndNil, bzw. die expliziete Zuweisung von nil ist die Lösung. Alles andere ist nicht sicher bzw. geht nicht

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Golze

Registriert seit: 26. Aug 2004
Ort: Berlin
32 Beiträge
 
Delphi 5 Enterprise
 
#6

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

  Alt 31. Aug 2004, 18:49
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
Kay Golze
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#7

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

  Alt 31. Aug 2004, 18:50
Der "Hinweis" war nicht von mir.
  Mit Zitat antworten Zitat
Golze

Registriert seit: 26. Aug 2004
Ort: Berlin
32 Beiträge
 
Delphi 5 Enterprise
 
#8

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

  Alt 31. Aug 2004, 18:57
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
Kay Golze
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#9

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

  Alt 31. Aug 2004, 19:47
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.
  Mit Zitat antworten Zitat
Golze

Registriert seit: 26. Aug 2004
Ort: Berlin
32 Beiträge
 
Delphi 5 Enterprise
 
#10

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

  Alt 1. Sep 2004, 06:43
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....
Kay Golze
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:23 Uhr.
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