Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Überprüfen ob Klasse instanziert ist (https://www.delphipraxis.net/80127-ueberpruefen-ob-klasse-instanziert-ist.html)

Koolance 3. Nov 2006 10:14


Überprüfen ob Klasse instanziert ist
 
Ich suche einen Befehl zum überprüfen ob ein Klasse bereits instanziert wurde.

Genauere Erklärung:

Schreibe gerade eine Middleware. Alle Datenzugriffe gehen über Objekte.
Beispiel Klasse Adress verwendet Klasse Titel. Klasse anrede soll aber erst instanziert werden wenn auf sie zugegriffen wird.
Das ganze liegt hinter einer Property.

Mein Gedanke war die klasse eine exception schmeißen zu lassen wenn sie noch nicht instanziert ist und sie dann bei bedarf zu erzeugen. Das ganze ist natürlich von Gedanken her unschön, aber was noch schlimmer ist es funktioniert nicht und führt zu eine Stack-üblerlauf.

Code:
function TAddress.Gettitel: Ttitel;
begin
  try
    self.ftitel.InstanceSize; //wenn ich nicht existiere schmeiße ich eine exception
    self.ftitel.id:=self.ftitel.id; //auch eine exception
  except
    self.ftitel:=ttitel.Create(nil,MyConnection);
    self.titel.OnAfterSelectByID:=self.titelIdChange;
  end;
  if self.ID_TITEL <> 0 then
    titel.SelectByID(self.ID_TITEL);
  result:=self.titel;
end;

mkinzler 3. Nov 2006 10:16

Re: Überprüfen ob Klasse instanziert ist
 
Wenn du die Instanzvariable mehrfach benutzt würde ich sie anschließend auf Nil setzen ( z.B. durch
Delphi-Quellcode:
FreeAndNil(...);
)Dann kannst du mit Assigned() prüfen.

Koolance 3. Nov 2006 10:55

Re: Überprüfen ob Klasse instanziert ist
 
Dank dir, Assigned() war was ich gesucht hatte, hatte irgendwie ein Brett vom Kopf.

Nur leider war das nicht die Lösung für mein Problem.

Ich möchte folgenden Aufruf ermöglichen:
Code:
  address:=Taddress.Create(self,dbx_ME4);
  address.NAME1:='Gustav';
  address.NAME2:='Ganz';
  address.titel.NAME:='Herr';
  address.titel.insert;
  address.insert;
Er funktioniert mit folgender Propery:
Code:
    property titel:Ttitel read ftitel write ftitel;
Aber ich möchte noch einen Gtter dazwischen schieben

Code:
     property titel:Ttitel read getitel write ftitel;

function TAddress.Gettitel: Ttitel;
begin
  if not assigned(self.ftitel) then
  begin
    self.ftitel:=ttitel.Create(nil,MyConnection);
//    self.titel.OnAfterSelectByID:=self.titelIdChange;
  end;
  if self.ID_TITEL <> 0 then
    titel.SelectByID(self.ID_TITEL);
  result:=self.titel;
end;
Das heißt die Übergabe muss wahrscheinlich per Reference gemacht werden, habe aber keine Ahnung wie das geht.
Noch einen Tip?

xaromz 3. Nov 2006 11:06

Re: Überprüfen ob Klasse instanziert ist
 
Hallo,
Zitat:

Zitat von Koolance
Das heißt die Übergabe muss wahrscheinlich per Reference gemacht werden, habe aber keine Ahnung wie das geht.
Noch einen Tip?

Automatisch. Du übergibst ja eine Klasseninstanz. Eigentlich arbeitest Du aber mit einem Pointer auf die Instanz. Folglich übergibst Du schon die Referenz.

Gruß
xaromz

Koolance 3. Nov 2006 11:51

Re: Überprüfen ob Klasse instanziert ist
 
Aber warum kriege ich dann immer einen Stack-überlauf?

Edit Fehler gefunden:


Code:
function TAddress.Gettitel: Ttitel;
begin
  if not assigned(self.ftitel) then
  begin
    self.ftitel:=ttitel.Create(nil,MyConnection);
//    self.titel.OnAfterSelectByID:=self.titelIdChange;
  end;
  if self.ID_TITEL <> 0 then
    titel.SelectByID(self.ID_TITEL);
  result:=self.titel; //ruft sich selber auf, richtig ist result:=self.Ftitel
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:41 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