Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Objekte verschwinden bzw. werden überschrieben ?? (https://www.delphipraxis.net/45323-objekte-verschwinden-bzw-werden-ueberschrieben.html)

delphino 4. Mai 2005 09:28


Objekte verschwinden bzw. werden überschrieben ??
 
Hallo !!

Bin neu in Delphi, aber bin mit OOP aus PHP/Java und diversen anderen Script-Sprachen vertraut. Habe schon einige Hilfreiche Threads gelesen hier, aber habe ein Problem bei dem ich noch nicht mal weiß wonach ich suchen soll. Also falls es zu meiner Frage schon einen Thread gibt, dann bitte bescheid sagen. =)

Habe eine TForm, die im Constructor mehrere Frames dynamisch erzeugt. Sprich habe ein Array, für jedes Element im Array wird ein Frame erzeugt. Diese Frames werden dann in einem Array abgelegt, dass diese Frames als Typ hat. Nach den instanziieren verschwinden die zuerst instanziierten Objekte irgendwo im Nirvana und das Array hat nur noch das zuletzt instanziierte Objekt in jedem Index. Nein, ich habe nichts beim Befüllen der Schleife falsch gemacht, denn das ganze passiert auch dann, wenn ich folgendes tue:

Delphi-Quellcode:
O1 := TTabFrame1.Create(nil,DBConnect1,1); //TTabFrame1 ist von TFrame abgeleitet. *
ShowMessage(O1.GetFTabRandom);             // << gibt 1 aus
O2 := TTabFrame1.Create(nil,DBConnect1,2); //
ShowMessage(O2.GetFTabRandom);             // << gibt 2 aus
ShowMessage(O1.GetFTabRandom);             // << gibt 2 aus !!!!
ShowMessage(O2.GetFTabRandom);             // << gibt 2 aus

//* Der 3. Parameter wird im Contructor in ner Var gespeichert und kann über GetFTabRandom ausgelesen werden.
Hat Delphi vllt so eine Eigenart, dass man Frames oder Units whatever nur einmal instanziieren kann ?? Finde darüber aber nichts in Bücher o.ä.
Das gleiche mit einer selbstdefinierten Klasse funktioniert wunderbar. Nur bei diesen Frames nicht.... o.O

Für Eure Hilfe im Voraus vielen dank...

delphino

alcaeus 4. Mai 2005 09:31

Re: Objekte verschwinden bzw. werden überschrieben ??
 
Hallo delphino,

erstmal Herzlich Willkommen.

Ich habe Frames normalerweise in eine TObjectList reingeschrieben und mich dann zu Tode gecastet, aber folgendes Beispiel funktioniert bei mir auch:

Delphi-Quellcode:
var MyFrames: array of TSomeFrame;
//..
SetLength(MyFrames, 5);
for i := 0 to 4 do
  MyFrames[i] := TSomeFrame.Create(Self);
Anschliessend habe ich 5 Frames im Array. Mit einer ObjectList siehts aehnlich aus:

Delphi-Quellcode:
var MyFrames: TObjectList;
//..
for i := 0 to 4 do
  MyFrames.Add(TSomeFrame.Create(Self));
Zeig bitte mal den Code, bei dem du die Frames ins array schreibst.

Greetz
alcaeus

delphino 4. Mai 2005 13:34

Re: Objekte verschwinden bzw. werden überschrieben ??
 
Hi alcaeus,
danke für die schnelle Antwort. Nun, also der Fehler mit dem Überschreiben der Objekte scheint am Übergebenen Owner also dem TComponent zu liegen. Du hattest in Deinen Code-Beispielen immer "Self" dafür verwendet. Ich habe "nil" benutzt. Nun ergibt sich ein Folgefehler, denn nun meckert der Compiler beim befüllen des Arrays, dass eine Komponente mit dem Namen TabFrame1 schon existieren würde. Muss ich nun jedem neuen TabFrame, dass ich instantiiere einen unique Namen zuweisen ?

Gruß

delphino

delphino 4. Mai 2005 14:03

Re: Objekte verschwinden bzw. werden überschrieben ??
 
OMG, okay, brutaler Anfängerfehler. :lol:

Und zwar hatte ich FTabRandom und den DatenbankHandle etc. unter "var" nach der type deklaration deklariert. Scheinbar sind das bei Delphi dann so ne Art Klassenvariable. Also sowas, was ich in PHP z.b. mit "::" machen würde. Nun bringt er beim Auslesen des Arrays die richtigen Angaben.

Aber der Tip mit "Self" war aber glaube ich trotzdem ganz heiß. Muss mal nachlesen was der Owner überhaupt bringt.

Thx a lot !!!

delphino

jfheins 4. Mai 2005 14:09

Re: Objekte verschwinden bzw. werden überschrieben ??
 
Zitat:

Zitat von delphino
OMG, okay, brutaler Anfängerfehler. :lol:

Und zwar hatte ich FTabRandom und den DatenbankHandle etc. unter "var" nach der type deklaration deklariert. Scheinbar sind das bei Delphi dann so ne Art Klassenvariable.

Das müsste eine Globale Variable sein.

Soweit ich weis, gibt es 3 Geltungsbereiche:
:arrow: Global (Im gloibalen var Abschnitt)
:arrow: Klassenvar. (im private (oder anderem) Teil deklariert)
:arrow: "Prozedurvariablen" zwischen Prozedurkopf und begin.


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