![]() |
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:53 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