AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Instanz eines Objektes auf existenz Prüfen
Thema durchsuchen
Ansicht
Themen-Optionen

Instanz eines Objektes auf existenz Prüfen

Ein Thema von Skript · begonnen am 11. Jan 2004 · letzter Beitrag vom 12. Jan 2004
Antwort Antwort
Seite 1 von 2  1 2      
Skript

Registriert seit: 11. Jan 2004
20 Beiträge
 
#1

Instanz eines Objektes auf existenz Prüfen

  Alt 11. Jan 2004, 12:19
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:
MeinObjekt := TEgal.Create; Jetzt mache ich eine Instanz des Objektes mit einem untypisierten Pointer:
Delphi-Quellcode:
MeineInstanz: Pointer;
MeineInstanz := MeinObjekt;
Jetzt vernichte ich das Ursprungsobjekt:
FreeAndNil(MeinObjekt); Die .Free Methode sollte ja den Speicher freigeben
Und jetzt möchte ich gerne ohne Exeption-Handling anhand der Instanz überprüfen ob das Ursprungsobjekt noch vorhanden ist, so im Sinne von:
if not Assigned(TEgal(MeineInstanz)) then Exit Aber irgendwie klappt das nicht , 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:
Delphi-Quellcode:
MeineInstanz: ^TEgal;
MeineInstanz := @MeinObjekt;
FreeAndNil(MeinObjekt);
if not Assignet(MeineInstanz^) then Exit;
So, ich hoffe ich habe das jetzt so unverständlich wie möglich geschrieben

Wie macht ihr Objektinstanzen und Prüft auf derer Existenz?

Gruss & vielen Dank
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Instanz eines Objektes auf existenz Prüfen

  Alt 11. Jan 2004, 12:28
Hallo,

schon mal
Code:
if not (MeinObjekt=Nil) then ...
probiert?

Gruß,
Tom
  Mit Zitat antworten Zitat
Skript

Registriert seit: 11. Jan 2004
20 Beiträge
 
#3

Re: Instanz eines Objektes auf existenz Prüfen

  Alt 11. Jan 2004, 13:00
Hallo,

hmm, das ist mir eigentlich klar, dass wenn ich:
FreeAndNil(MeinObjekt); mache, MeinObjekt = nil, True ist, aber danke Assigned(...) überprüft ja das selbe.

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:
MeinFormular = class(TMeinFormular)
  MeineInstanz: TEgal; // Instanz des Objektes welchen Daten angezeigt werden sollen

  procedure Anzeigen;
end;
Also erstelle ich mein Objekt und übergebe es dem Formular:
Delphi-Quellcode:
MeinObjekt := TEgal.Create;

MeinFormular.MeineInstanz := MeinObjekt;
Dann möchte ich in der Anzeigen Prozedur die Daten des Instanzobjektes anzeigen:
Delphi-Quellcode:
procedure MeinFormular.Anzeigen
begin
  Panel.Caption := MeinObjekt.Name;
end;
So, und wenn ich jetzt irgendwo in meinem Code mein Ursprungsobjekt vernichte:
FreeAndNil(MeinObjekt); Besitzt das Formular immer noch die Instanz. Wie kann ich jetzt in der Anzeigen-Prozedur überprüfen ob die Instanz noch gültig ist?
Delphi-Quellcode:
procedure MeinFormular.Anzeigen
begin
  if Assigned(MeineInstanz) then Exit;
  // oder:
  if Assigned(TEgal(MeineInstanz)) then Exit;

  Panel.Caption := MeinObjekt.Name;
end;
Funktionieren nämlich nicht, bzw. die Instanz zeigt ja immernoch auf was...
und wie zum Herrgottdonnerunddoria mach ich jetzt das?
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Instanz eines Objektes auf existenz Prüfen

  Alt 11. Jan 2004, 13:26
Zitat von Skript:
Einerseits schreibst duMeinFormular = class(TMeinFormular) AndererseitsMeinObjekt := TEgal.Create;
Also da blick ich nicht wirklich durch. Ist MeinFormular nun eine Klassendefinition oder die Variable über die du deine Klasse ansprichst.

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
Gruss,
Tom
  Mit Zitat antworten Zitat
Skript

Registriert seit: 11. Jan 2004
20 Beiträge
 
#5

Re: Instanz eines Objektes auf existenz Prüfen

  Alt 11. Jan 2004, 13:39
Hiho,

uh, da hab ich was falsch geschrieben und anders gemeint, sorry Tom
Delphi-Quellcode:
TMeinFormular = class(TForm)
  MeineInstanz: TEgal; // Instanz des Objektes welchen Daten angezeigt werden sollen

  procedure Anzeigen;
end;

// und dann die Variable dazu
MeinFormular: TMeinFormular;
Wie Gesagt erstelle ich dann das Formular, übergebe ihm das MeinObjekt:
MeinFormular.MeineInstanz := MeinObjekt; Dann vernichte ich irgendwann im Code das MeinObjekt (nicht das MeinFormular!), mit
FreeAndNil(MeinObjekt); 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).
*fussvomschlauchnehm*, jetzt besser?
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Instanz eines Objektes auf existenz Prüfen

  Alt 11. Jan 2004, 16:08
Nachdem ich jetzt1 1 1/2 Stunden laufen war kann ich auch wieder klar denken und hab jetzt dein Problem erkannt

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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Instanz eines Objektes auf existenz Prüfen

  Alt 11. Jan 2004, 16:15
Moin Skript,

if not Assigned(TEgal(MeineInstanz)) then Exit muss ja fehlschlagen, da Du ja nur den Pointer MeinObjekt mit FreeAndNil auf nil setzt.

Warum machst Du nicht einfach

if Assigned(MeinObjekt) then ... und lässt die ganze Aktion mit dem untypisierten Pointer weg?
Wozu soll der überhaupt gut sein?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Skript

Registriert seit: 11. Jan 2004
20 Beiträge
 
#8

Re: Instanz eines Objektes auf existenz Prüfen

  Alt 11. Jan 2004, 17:11
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:
var
  MeinObjekt: TEgal;
  MeineInstanz: TEgal;

...

MeinObjekt := TEgal.Create;
MeinObjekt.Wert := 10;

MeineInstanz := MeinObjekt;

FreeAndNil(MeinObjekt);
so und wenn ich jetzt folgendes mache:
WriteLn(IntToStr(MeineInstanz.Wert)); 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:
Form.UebergabeDesObjektes(MeinObjekt); Danke, oder besser:

  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#9

Re: Instanz eines Objektes auf existenz Prüfen

  Alt 11. Jan 2004, 17:29
Hallo
Zitat von Skript:
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.
Solange der Speicher nicht über schrieben wird steht da auch die 10. Nur weil ein Objekt freigegeben wird wird doch nicht der Arbeitsspeicher an der Stelle gelöscht.
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.
  Mit Zitat antworten Zitat
Skript

Registriert seit: 11. Jan 2004
20 Beiträge
 
#10

Re: Instanz eines Objektes auf existenz Prüfen

  Alt 11. Jan 2004, 18:20
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?
  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 02:40 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