AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Überprüfen ob Klasse instanziert ist

Ein Thema von Koolance · begonnen am 3. Nov 2006 · letzter Beitrag vom 3. Nov 2006
Antwort Antwort
Koolance

Registriert seit: 28. Feb 2006
Ort: Kerpen
74 Beiträge
 
Delphi 6 Enterprise
 
#1

Überprüfen ob Klasse instanziert ist

  Alt 3. Nov 2006, 11:14
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;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Überprüfen ob Klasse instanziert ist

  Alt 3. Nov 2006, 11:16
Wenn du die Instanzvariable mehrfach benutzt würde ich sie anschließend auf Nil setzen ( z.B. durch FreeAndNil(...); )Dann kannst du mit Assigned() prüfen.
Markus Kinzler
  Mit Zitat antworten Zitat
Koolance

Registriert seit: 28. Feb 2006
Ort: Kerpen
74 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: Überprüfen ob Klasse instanziert ist

  Alt 3. Nov 2006, 11:55
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?
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#4

Re: Überprüfen ob Klasse instanziert ist

  Alt 3. Nov 2006, 12:06
Hallo,
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
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Koolance

Registriert seit: 28. Feb 2006
Ort: Kerpen
74 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: Überprüfen ob Klasse instanziert ist

  Alt 3. Nov 2006, 12:51
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;
  Mit Zitat antworten Zitat
Antwort Antwort


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