![]() |
Mainform mehrfach initialisieren
DAS IST EIN SPLIT VON
![]() TForm wurde jetzt aber 2x geladen :!: und erstellt -> Speicherleak |
Wie TForm wurde 2 x geladen ?
TForm ist ein Typ, wo wird er geladen ? |
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 |
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 |
Aber ich denke, wir sind wieder "out of topic".
-> Neuen Beitrag erstellen, oh Du mein Moderator ? :) |
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: |
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]. |
Schmutzig ist ja schon kein Ausdruck mehr. Hast aber recht, sag niemals nie :D
|
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 |
Hast recht Sakura - monsterschmutzig :twisted:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz