AGB  ·  Datenschutz  ·  Impressum  







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

Mainform mehrfach initialisieren

Ein Thema von sakura · begonnen am 18. Okt 2002 · letzter Beitrag vom 18. Okt 2002
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#1

Mainform mehrfach initialisieren

  Alt 18. Okt 2002, 14:39
DAS IST EIN SPLIT VON http://www.delphipraxis.net/viewtopic.php?t=1276

TForm wurde jetzt aber 2x geladen und erstellt -> Speicherleak
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
chsgmbh

Registriert seit: 16. Sep 2002
Ort: Straelen
56 Beiträge
 
Delphi 5 Enterprise
 
#2
  Alt 18. Okt 2002, 14:42
Wie TForm wurde 2 x geladen ?

TForm ist ein Typ, wo wird er geladen ?
Sei zufrieden, es könnte schlimmer kommen.

Ich war zufrieden - und es kam schlimmer.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#3
  Alt 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
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
chsgmbh

Registriert seit: 16. Sep 2002
Ort: Straelen
56 Beiträge
 
Delphi 5 Enterprise
 
#4
  Alt 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
Sei zufrieden, es könnte schlimmer kommen.

Ich war zufrieden - und es kam schlimmer.
  Mit Zitat antworten Zitat
chsgmbh

Registriert seit: 16. Sep 2002
Ort: Straelen
56 Beiträge
 
Delphi 5 Enterprise
 
#5
  Alt 18. Okt 2002, 15:15
Aber ich denke, wir sind wieder "out of topic".

-> Neuen Beitrag erstellen, oh Du mein Moderator ?
Sei zufrieden, es könnte schlimmer kommen.

Ich war zufrieden - und es kam schlimmer.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 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.
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.106 Beiträge
 
Delphi 11 Alexandria
 
#7
  Alt 18. Okt 2002, 16:13
Moin sakura,

geht trotzdem
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].
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#8
  Alt 18. Okt 2002, 16:33
Schmutzig ist ja schon kein Ausdruck mehr. Hast aber recht, sag niemals nie
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
chsgmbh

Registriert seit: 16. Sep 2002
Ort: Straelen
56 Beiträge
 
Delphi 5 Enterprise
 
#9
  Alt 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
Sei zufrieden, es könnte schlimmer kommen.

Ich war zufrieden - und es kam schlimmer.
  Mit Zitat antworten Zitat
chsgmbh

Registriert seit: 16. Sep 2002
Ort: Straelen
56 Beiträge
 
Delphi 5 Enterprise
 
#10
  Alt 18. Okt 2002, 16:43
Hast recht Sakura - monsterschmutzig
Sei zufrieden, es könnte schlimmer kommen.

Ich war zufrieden - und es kam schlimmer.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 07:36 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