Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Mainform mehrfach initialisieren (https://www.delphipraxis.net/1106-mainform-mehrfach-initialisieren.html)

sakura 18. Okt 2002 14:39


Mainform mehrfach initialisieren
 
DAS IST EIN SPLIT VON http://www.delphipraxis.net/viewtopic.php?t=1276

TForm wurde jetzt aber 2x geladen :!: und erstellt -> Speicherleak

chsgmbh 18. Okt 2002 14:42

Wie TForm wurde 2 x geladen ?

TForm ist ein Typ, wo wird er geladen ?

sakura 18. Okt 2002 14:50

Einmal wird die Klasse TForm initialisiert und das erstellte Objekt in Form1 gespeichert

Das zweite Mal wird die Klasse TForm initialisiert und das erstellte Objekt in MainForm gespeichert

chsgmbh 18. Okt 2002 15:13

Sorry Sakura,

bin ich zu blöd.

Warum und wo ( Speicher ) wird ein Typ, bzw. Klassendefinition initialisiert ?

Ablauf Create:

Du belegst Speicher im Heap in der Größe des Typs und weißt Deinem Pointer die Anfangsadresse zu, mal ganz ganz grob gesagt.

Initialisierungen innerhalb dieses Heap-Bereichs.

Ansonsten würde

var
dInteger : Integer;

oder

type
TEgal = record
...
end;

var
dEgal : TEgal;

ja immer 2 x Speicher verbraten.

Wofür, eine Typdefinition ist doch hart-codiert, also steht im Compilat
fest.

Evtl. raffe ich auch nicht, was Du mit "Klasse wird initialisiert" meinst.

Wenn sie "initialisiert" wird, stände der Typ TForm nach dem ersten Create zur Verfügung, könnte also auch in CreateForm benutzt werden.

Ich denke mein Mißverständnis liegt beim "Initialisieren einer Klassendefinition"

Gruß

Sven

chsgmbh 18. Okt 2002 15:15

Aber ich denke, wir sind wieder "out of topic".

-> Neuen Beitrag erstellen, oh Du mein Moderator ? :)

sakura 18. Okt 2002 15:38

okay - gesplittet - boah, einen Beitrag habe ich leider verloren - mein Fehler!

Sowohl der Aufruf

Application.CreateForm(TForm, Form1);

als auch der Aufruf

Application.CreateForm(TForm, Application.MainForm);

erzeugen je eine Instanz von TForm. Die erste wird explizit in Form1 gespeichert, die zweite explizit in MainForm.

Problem wäre jedoch weiterhin (zurückdenken an das Originalthema :!:) das TForm durch den ersten Aufruf vor den anderen Forms erstellt werden würde.

Ausserdem wird durch den ersten Aufruf von Application.CreateForm(...) in einer App der Wert zusätzlich zu Application.MainForm zugewiesen. Jetzt aber noch der Hammer, der die ganze Diskussion eigentlich überflüssig macht
Application.MainForm ist read-only. :lol:

Christian Seehase 18. Okt 2002 16:13

Moin sakura,

geht trotzdem :mrgreen:
Wenn auch nur mit einem "schmutzigen" Trick:

Code:
[b]var[/b]
  p : ^Pointer;

[b]begin[/b]
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm3, Form3);
  Form3.HandleNeeded;
  p := @Application.MainForm;
  p^ := Form3;
  Application.Run;
[b]end[/b].

sakura 18. Okt 2002 16:33

Schmutzig ist ja schon kein Ausdruck mehr. Hast aber recht, sag niemals nie :D

chsgmbh 18. Okt 2002 16:42

Kerl, veröffentliche bitte mal Deinen IQ - ich fasse es nicht -
ich kapiere jetzt überhaupt nichts mehr.

Logisch wird je Create oder CreateForm eine Instanz erzeugt.

Aber das wollen wir doch ?

Du erzeugt Dir z.B.: drei Formulare ( Instanzen ), auf die vom Hauptformular zugegriffen werden soll. Also muß dass HF als letztes
erzeugt werden. Da spielt uns Delphi den Streich - erstes CreateForm => Hauptformular, also wird als erstes angezeigt, der Pointer MainForm gesetzt, Anwendung beim Schließen des Formulars beendet etc.

Wir schreiben irgendwie aneinander vorbei.

Ich habe genau das gleiche Problem wie das Ursprungsthema. Ich muß vom Hauptformular aus schon auf etliche Datenmodule und Einstellungsformulare zugreifen und mache es genau so, wie ich Anfangs schrieb. Nach Deinem Beitrag bekam ich den Schock: Irgendwelchen nicht aufgeräumten Speicher zu hinterlassen, aber welchen Speicher Du genau meinst, habe ich noch nicht verstanden.

Ich erzeuge mir mit

Form1 := TForm.Create ( Application )

eine Instanz der Größe TForm im Heap. Danach erzeuge ich mir eine weitere Instanz der Größe TForm durch

Application.CreateForm ( TForm, MainForm );

Nur mal als Beispiel, angenommen TForm hätte 1000 Byte ( Quatsch, ich weiß ) also einen Pointer Namens Form1, Größe 4 Byte, der auf einen Heapbereich 1000 Byte zugreift. Das Gleiche mit dem Pointer MainForm. Der Pointer Application.MainForm ist eh definiert, 4 Byte. Ich habe in meinem Verständnis nun 3 x 4 Byte für die Pointer und 2 x 1000 Byte für die Instanzen verbraten.

Evtl. ist hier das Mißverständnis:

Ich habe gerade noch einmal den ersten Beitrag gelesen. Wenn Form1 nicht gezeigt werden soll, willst Du auch den Speicher der Instanz sparen ? - Richtig ? Das würde Deine Lösung mit InitData aber auch nicht tun.

Wenn Du Dir die OH ansiehst, ist der einzige Unterschied zwischen CreateForm und "normalem" Create:

1. der Aufruf -> Du nutzt eine Methode von TApplication, die sonst nicht existiert ( außer Applet und Web... )

und

2. zusätzlich wird die Eigenschaft Application.MainForm gesetzt.

Da sie read only ist, kann Delphi erkennen, welches der erste Aufruf ist und daher wird der erste Aufruf das Hauptformular.

Ansonsten kenne ich keinen Unterschied zwischen beiden Methoden ?

Mir geht es aber jetzt auch nicht darum, "eine Diskussion zu gewinnen", ich habe echt Panik mit meiner Verfahrensweise unsauber zu programmieren.

Gruß

Sven

chsgmbh 18. Okt 2002 16:43

Hast recht Sakura - monsterschmutzig :twisted:


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:09 Uhr.
Seite 1 von 2  1 2      

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