![]() |
Instanz eines Objektes auf existenz Prüfen
Hallooohoo,
Ich habe das Problem, dass ich die Instanz eines Objektes überprüfen möchte ob das Ursprungsobjekt noch existiert, bzw. den Inhalt der Pointer Adresse überprüfen ob überhaupt noch Inhalt vorhanden ist. Aaaalso ich habe ein Objekt der Klasse TEgal:
Delphi-Quellcode:
Jetzt mache ich eine Instanz des Objektes mit einem untypisierten Pointer:
MeinObjekt := TEgal.Create;
Delphi-Quellcode:
Jetzt vernichte ich das Ursprungsobjekt:
MeineInstanz: Pointer;
MeineInstanz := MeinObjekt;
Delphi-Quellcode:
Die .Free Methode sollte ja den Speicher freigeben
FreeAndNil(MeinObjekt);
Und jetzt möchte ich gerne ohne Exeption-Handling anhand der Instanz überprüfen ob das Ursprungsobjekt noch vorhanden ist, so im Sinne von:
Delphi-Quellcode:
Aber irgendwie klappt das nicht :roteyes: , gibt es denn eine Möglichkeit, zu überprüfen ob die Adresse der Instanz noch gültig ist, bzw. inhalt hat? Oder muss ich hier mit Typisiereten Pointern arbeiten wie:
if not Assigned(TEgal(MeineInstanz)) then Exit
Delphi-Quellcode:
So, ich hoffe ich habe das jetzt so unverständlich wie möglich geschrieben :stupid:
MeineInstanz: ^TEgal;
MeineInstanz := @MeinObjekt; FreeAndNil(MeinObjekt); if not Assignet(MeineInstanz^) then Exit; Wie macht ihr Objektinstanzen und Prüft auf derer Existenz? Gruss & vielen Dank |
Re: Instanz eines Objektes auf existenz Prüfen
Hallo,
schon mal
Code:
probiert?
if not (MeinObjekt=Nil) then ...
Gruß, Tom |
Re: Instanz eines Objektes auf existenz Prüfen
Hallo,
hmm, das ist mir eigentlich klar, dass wenn ich:
Delphi-Quellcode:
mache, MeinObjekt = nil, True ist, aber danke :) Assigned(...) überprüft ja das selbe.
FreeAndNil(MeinObjekt);
Mein Problem ist wirklich dann, wenn ich eine Instanz will, also zum Beispiel habe ich mein MeinObjekt erstellt und will das jetzt einem Formular übergeben, welches mir die Daten dieses Objektes ausgibt:
Delphi-Quellcode:
Also erstelle ich mein Objekt und übergebe es dem Formular:
MeinFormular = class(TMeinFormular)
MeineInstanz: TEgal; // Instanz des Objektes welchen Daten angezeigt werden sollen procedure Anzeigen; end;
Delphi-Quellcode:
Dann möchte ich in der Anzeigen Prozedur die Daten des Instanzobjektes anzeigen:
MeinObjekt := TEgal.Create;
MeinFormular.MeineInstanz := MeinObjekt;
Delphi-Quellcode:
So, und wenn ich jetzt irgendwo in meinem Code mein Ursprungsobjekt vernichte:
procedure MeinFormular.Anzeigen
begin Panel.Caption := MeinObjekt.Name; end;
Delphi-Quellcode:
Besitzt das Formular immer noch die Instanz. Wie kann ich jetzt in der Anzeigen-Prozedur überprüfen ob die Instanz noch gültig ist?
FreeAndNil(MeinObjekt);
Delphi-Quellcode:
Funktionieren nämlich nicht, bzw. die Instanz zeigt ja immernoch auf was...
procedure MeinFormular.Anzeigen
begin if Assigned(MeineInstanz) then Exit; // oder: if Assigned(TEgal(MeineInstanz)) then Exit; Panel.Caption := MeinObjekt.Name; end; und wie zum Herrgottdonnerunddoria mach ich jetzt das? :roteyes: :-D |
Re: Instanz eines Objektes auf existenz Prüfen
Zitat:
Aber wenn du mit FreeAndNil (MeinFormular) dein Forumular im Speicher wieder freigibst, wie willst du dann überhaupt noch auf die Instanz MeinFormular.MeineInstanz zugreifen :?: Ich glaub ich hab dein Problem immer noch nicht ganz verstanden. Steh wohl irgenwie auf dem berühmten Schlauch :roll: Gruss, Tom |
Re: Instanz eines Objektes auf existenz Prüfen
Hiho,
uh, da hab ich was falsch geschrieben und anders gemeint, sorry Tom :roll:
Delphi-Quellcode:
Wie Gesagt erstelle ich dann das Formular, übergebe ihm das MeinObjekt:
TMeinFormular = class(TForm)
MeineInstanz: TEgal; // Instanz des Objektes welchen Daten angezeigt werden sollen procedure Anzeigen; end; // und dann die Variable dazu MeinFormular: TMeinFormular;
Delphi-Quellcode:
Dann vernichte ich irgendwann im Code das MeinObjekt (nicht das MeinFormular!), mit
MeinFormular.MeineInstanz := MeinObjekt;
Delphi-Quellcode:
Das Formular besitzt jedoch immer noch eine Instanz (MeineInstanz) auf das Objekt (MeinObjekt), welches aber auf einen Speicherbereich zeigt welcher ja durch FreeAndNil von MeinObjekt gelöscht wurde. Und jetz mein Problem: Wie konstrolliere ich in der Anzeigen Methode von MeinFormular, ob die Instanz noch gültig ist (Also ob Meinobjekt noch nicht vernichted wurde).
FreeAndNil(MeinObjekt);
*fussvomschlauchnehm*, jetzt besser? :drunken: |
Re: Instanz eines Objektes auf existenz Prüfen
Nachdem ich jetzt1 1 1/2 Stunden laufen war kann ich auch wieder klar denken und hab jetzt dein Problem erkannt :lol:
Was spricht denn dagegen, in der Routine wo du dein Objekt freigibts, auch gleich MeinFormular.MeineInstanz auf nil zu setzen. Oder gibts mehrere Formulare die auf TEgal einen Pointer setzen. Ausserdem, wo ist denn das Problem, alles in einen Try...except Block zu knallen. Alternativ könntest du in deinem Constructor von TEgal einen Owner definieren, den du dann bei Create übergibts. Somit weiss deine TEgal Objekt von wem es erzeugt wurde. Gruss, Tom |
Re: Instanz eines Objektes auf existenz Prüfen
Moin Skript,
Delphi-Quellcode:
muss ja fehlschlagen, da Du ja nur den Pointer MeinObjekt mit FreeAndNil auf nil setzt.
if not Assigned(TEgal(MeineInstanz)) then Exit
Warum machst Du nicht einfach
Delphi-Quellcode:
und lässt die ganze Aktion mit dem untypisierten Pointer weg?
if Assigned(MeinObjekt) then ...
Wozu soll der überhaupt gut sein? :gruebel: |
Re: Instanz eines Objektes auf existenz Prüfen
Ich weiss nicht mehr wie ich mich noch ausdrücken soll :(
Versuch 1546 :) Alles was ich will ist eine Instanz auf ein Objekt, über welche ich prüfen kann, ob das Ursprungsobjekt noch existiert. Ich kann da nicht ein Instanzobjekt von der gleichen Klasse wie das Ursprungsobjekt machen, weil folgendes:
Delphi-Quellcode:
so und wenn ich jetzt folgendes mache:
var
MeinObjekt: TEgal; MeineInstanz: TEgal; ... MeinObjekt := TEgal.Create; MeinObjekt.Wert := 10; MeineInstanz := MeinObjekt; FreeAndNil(MeinObjekt);
Delphi-Quellcode:
gibt es mir trotz, dass ich das Ursprungsobjekt mit FreeAndNil vernichtet habe immer noch den Wert 10 aus, wieso? An der Speicherstelle dürften doch keine Daten mehr sein. Und das ist meine Frage: wie mache ich eine eindeutige Instanz eines Objektes, mit welcher ich Prüfen kann ob das Ursprungsobjekt noch vorhanden ist? Ich weiss auch, dass ich testen kann ob MeinObjekt = nil ist, aber ich will das Objekt ja z.B einem Formular etc. übergeben welches nach der Übergabe die Variable MeinObjekt nicht mehr bekannt ist, sondern nur noch die Instanz, welche als Objektvariable des Formulars gespeichert ist, im Sinne von:
WriteLn(IntToStr(MeineInstanz.Wert));
Delphi-Quellcode:
Danke, oder besser: :wiejetzt:
Form.UebergabeDesObjektes(MeinObjekt);
:) |
Re: Instanz eines Objektes auf existenz Prüfen
Hallo
Zitat:
Dein Problem ist, das Du ein Object erzeugst und in einer Variablen eine Referenz darauf speicherst. Jetzt gibst Du mit FreeAndNil das Object frei. Die ObjektInstanz zeigt jetzt auf Nil. Aber was ist mit der Variablen. Die zeigt immer noch auf den Speicherbereich. Wenn Du unbedingt die Objektreferenz in einer extra Variablen speichern möchtest/musst, dann musst Du die Variable explizit auf Nil setzen, wenn Du das Objekt freigibst. Ich halte Dein Vorgehen für einen groben Designfehler. Überlege nochmal ob das wirklich nötig ist. Siehe auch den Beitrag von Christian Seehase. |
Re: Instanz eines Objektes auf existenz Prüfen
Oh okay, das macht natürlich dann Sinn. Hmm, aber wenn du folgendes Scenario hast: Ich habe ein globales Objekt welches Daten enthält. Auf dieses Objekt greifen verschiedene Formulare zu, die einen lesen etwas daraus, die anderen schreiben etwas rein etc. Jetzt muss ich doch den Formularen sagen auf welches Objekt sie zugreifen müssen, also muss ich ihnen eine Instanz auf dieses Objekt übergeben. Wenn jetzt das Ursprungsobjekt gelöscht wird, muss das Formular, welches noch eine Instanz/Adresse enthält das merken? Es gibt natürlich da die Möglichkeit das Objekt als globale Variable zu definieren und alle greifen auf das selbige zu, nur wird bei mir das/die Objekt(e) dynamisch, also zur Laufzeit erstellt. Oder wie soll ich das machen? :wall:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:52 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