![]() |
FormCreate für alle Forms beim Start aufrufen
Ich habe ein ziemlich großes Projekt, bei dem beim Start alle Formulare erstellt werden. Welche Vorteile/Nachteile hat es, nur die MainForm beim Start zu erzeugen und die ganzen anderen Formulare erst beim aufruf und beim beenden wieder freizugeben.
gruß |
Re: FormCreate für alle Forms beim Start aufrufen
Zitat:
wenn ich ein programm schreibe,dann mache ich das auch immer so. Also ich führe die anderen forms immer erst dann aus, wenn ich sie wirklich auch brauche. Ich finde, dass meine programm dadurch schnelle laufen. MFG Christian18 |
Re: FormCreate für alle Forms beim Start aufrufen
Zitat:
- Schnellerer Start - Geringerer Resourcenverbrauch (auch unter XP/2003 noch sinnvoll) |
Re: FormCreate für alle Forms beim Start aufrufen
Viele machen das um angeblich Hauptspeicher zu sparen. Im Zeitalter von 1 GB RAM sehe ich darin aber keine wichtige Begründung, sich das Leben unnötig schwerer zu machen als nötig. Da aber auch ich die Forms erst zur Laufzeit erzeuge : Variable u.a. müssen initialisiert werden. Dies sollte dann geschehen, wenn die Foms erzeugt werden, also im OnCreate der Forms und somit auch beim Programmstart. Benutze ich nun die Forms und somit auch die Variablen, dann haben die einen Wert. Daran ändert auch ein Show/Hide nichts. An dieser Stelle müßte man dann die Variablen wieder neu initialisieren. Ergo : zwei Stellen mit fast demselben Code, also auch zwei Fehlerquellen, statt einer. Zusätzlich wird die EXE dadurch größer als sie sein müßte. Es gilt schließlich auch, Redundanzen zu vermeiden.
|
Re: FormCreate für alle Forms beim Start aufrufen
oki, ich werd das denk ich mal umstellen. hab ich mir schon lang mal überlegt.
noch was dazu: würdet ihr dann gleich auch die global deklarierten form variablen rausnehmen? und ggfs. bei zugriff übergeben?! |
Re: FormCreate für alle Forms beim Start aufrufen
Wie rausnehmen ? :shock: Es geht doch mit darum diese direkt beim Erzeugen zu initialisieren.
|
Re: FormCreate für alle Forms beim Start aufrufen
naja egal.
noch was anderes dazu: wann soll ich denn dann das formular wieder freigeben? oder wird das automatisch beim schließen gemacht. so erstelle ich das formular:
Delphi-Quellcode:
ist das in ordnung?
procedure TMainForm.Button1Click(Sender: TObject);
begin Application.CreateForm(TForm, Form1); Form1.Show; end; |
Re: FormCreate für alle Forms beim Start aufrufen
Nene, lasse Application mal schön weg.
Delphi-Quellcode:
frm := TFrm.Create(self); procedure Tfrm.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; end; |
Re: FormCreate für alle Forms beim Start aufrufen
okay!
aber was ist da der unterschied zwischen frm := TFrm.Create(self); und Application.CreateForm(TForm, Form1); |
Re: FormCreate für alle Forms beim Start aufrufen
Der Unterschied ist, daß Application eben unnötig ist. :mrgreen: Ich benutze das nur, um z.B. etwas in der Taskleiste anzeigen zu lassen, ein Icon zu setzen usw.
|
Re: FormCreate für alle Forms beim Start aufrufen
Zitat:
Jetzt zum Thema: Wenn ich Forms mit Datensensitiven Steuerelementen bei Programmstart erzeuge, dann klingen sich alle TDBEdits und TDBGrids etc. in eine Notifier-Liste ein, die vom Dataset immer reium benachrichtigt wird, wenn sich was in der DB ändert: Deshalb heissen sie ja auch so : datensensitive Steuerelemente. Mein Tipp: Wie auch die der Vorredner: Erzeuge jeweils nur die unbedingt notwendigen Forms. Weil Forms manchmal etwas Zeit zum kreieren benötigen, ist as manchmal doch angebracht, sie vorher zu erzeugen. Sonst wartet der Benutzer unnötigerweise. Ich mach es so:
Delphi-Quellcode:
Wobei ich schön drauf achte, das alle Form-Variablen beim Programmanfang mit nil initialisiert werden. Das ist bei W2K zwar egal, aber bei dem W95/ME Schrott kann/konnte man sich da nicht sicher sein. Aber gute Programme initialisieren sowieso Alles und Jeden!
If Not Assigned (fForm) Then
Application.CreateForm (TfForm, fForm); |
Re: FormCreate für alle Forms beim Start aufrufen
Das ist ja schön und gut, aber erzähle auch noch, wie man das Ganze selber wieder freigeben kann, bzw. wie die Forms wieder dazu gezwungen werden, ihre Variablen etc. neu zu initialisieren. Ich bin z.B. jamand, der alle Forms mindestens einmal aufmacht. Was dann ?
|
Re: FormCreate für alle Forms beim Start aufrufen
Ich implementiere immer eine Methode TForm.Setup, die das Formular initialisiert, die edits leert, Variablen zurücksetzt und das Formular in einen definierten Anfangszustand versetzt (ActiveControl etc.). Dann rufe ich das Formular nicht einfach über ShowModal auf, sondern schreibe mir eine kleine Routine, die das macht. Das ist auf den ersten Blick etwas umständlich, aber ich finde, Anweisungen sollten da stehen, wo sie hingehören.
Delphi-Quellcode:
Wieso muss der Aufrufer wissen, das man das Formular mit Setup initialisieren muss? Eben deshalb schreibe ich diese 'EditXXXX' Funktionen. Allerdings mache ich es i.A. nicht über Application.CreateForm. Ich hatte neulich mal eine Ausnahme: Das Formular zum Bearbeiten eines Auftrags enthielt ettliche Grids, Edits, Lookuplisten etc. Das Erzeugen (mit Create) und das Initialisieren dauert 500-900ms: zu lang für ein Callcenter. Also wurde dieses eine Formular wie oben beschrieben, erzeugt.
Function EditKunden (aKunde : TKunde) : TModalResult;
... Implementation ... Function EditKunden (aKunde : TKunde) : TModalResult; Begin If Not Assigned (fmEditKunde) Then Application.CreateForm (TfmKunde, fmKunde); With fmKunde Do Begin Setup (aKunde); // hier passiert vielleicht noch mehr... Result := ShowModal; End; End; Meine Edits sehen so aus:
Delphi-Quellcode:
Damit ist das Formular immer in einem wohldefinierten Zustand, ich verbrate keine Resourcen, falls auf dem Formular TDBEdits sind, geht meine Performance nicht in die Knie, usw. Das Wichtigste ist aber (frei nach Sepp Herberger):
Function EditKunden (aKunde : TKunde) : TModalResult;
... Implementation ... Function EditKunden (aKunde : TKunde) : TModalResult; Begin With TfmEditKunde.Create (Nil) Do Begin Setup (aKunde); // hier passiert vielleicht noch mehr... Result := ShowModal; Release; // Kein Free, weil nur Release garantiert, das vorher die message queue geleert wird. End; End; Zitat:
|
Re: FormCreate für alle Forms beim Start aufrufen
Das ist alles schon sehr seltsam, was Du da machst. Inwiefern beeinträchtigen DBEdits die performance ? Und das bei der Erstellung eines Formulars ? :shock: Ist mir echt zu hoch. Vermutlich liegt ein prinzipieller Fehler im Design vor, z.B. Datenabankabfragen in der Setup-Prozedur. Jedenfalls kann ich das Verhalten nicht bestätigen. Form mit 4-seitigem PageControl, ca. 100 DBEdits, etliche Listboxen usw. Von Ladezeiten ist da weit und breit nichts zu bemerken.
Ansonsten hast Du lediglich die Initialisierungsgeschichten in extra Prozedur verlagert, machst vieles von Hand und kannst somit aber auch mal was vergessen. Deine EXE wird mit Sicherheit größer sein, als meine. :mrgreen: Anweisungen sollten natürlich da stehen, wo sie hingehören. Und das heißt eben : Initialisierungen direkt beim Erzeugen, also in OnCreate und Freigabe in OnClose und ohne extra Aufruf von irgendwas. Ein CloseAction := caFree; reicht völlig aus. |
Re: FormCreate für alle Forms beim Start aufrufen
Zitat:
Zitat:
Ich finde das Konzept von alzaimar durch vernünftig. Es gibt einen Aufruf für das Fenster. Der rest wird intern geregelt. |
Re: FormCreate für alle Forms beim Start aufrufen
Hai Sharky,
Zitat:
|
Re: FormCreate für alle Forms beim Start aufrufen
Warum TDBEdits die Performance runterziehen?
Zitat:
Mit anderen Worten: Wenn Du in deiner Anwendung den Inhalt eines TDatasets änderst, werden ALLE TDBEdits benachrichtigt, egal ob sie sichtbar sind oder nicht. Deine beim Programmstart erzeugten Formulare habe alle eine Messagequeue, müssen alle mit Nachrichten versorgt werden und reagieren auch alle auf Nachrichten. Also wenn das keine Performancebremse ist... Zitat:
Die Größe von EXEn ist mir Schnurz. Wichtig ist, das ich in 10 Jahren das Zeugs noch kapiere, es anständig und stabil läuft und wartbar ist. Dann kommt die Performance. Und, erst wenn alles hübsch sauber ist, feile ich noch an der EXE-Größe, abern nur aus kosmetischen Gründen. Nebenbei arbeite ich mit DevEx-Componenten, da sind die Exen von Hause aus bei 4-8 MB angesiedelt. Ich kann in meinem Create keine Initialisierungen reinmachen, die abhängig von dem sind, *WAS* ich gerade editieren will. Wenn ich also ein Formular für die Bearbeitung eines TKunden habe, wie und wo soll ich denn die Edits mit dem TKunden initialisieren? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:52 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