AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi FormCreate für alle Forms beim Start aufrufen
Thema durchsuchen
Ansicht
Themen-Optionen

FormCreate für alle Forms beim Start aufrufen

Ein Thema von mumu · begonnen am 10. Mai 2005 · letzter Beitrag vom 11. Mai 2005
Antwort Antwort
Seite 2 von 2     12   
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#11

Re: FormCreate für alle Forms beim Start aufrufen

  Alt 10. Mai 2005, 21:02
Zitat:
Der Unterschied ist, daß Application eben unnötig ist. Mr. Green Ich benutze das nur, um z.B. etwas in der Taskleiste anzeigen zu lassen, ein Icon zu setzen usw.
Das ist so falsch: Wenn ich über Application.CreateForm gehe, dann sorgt eben die Application dafür, das beim Programmende die Forms ordendlich und sauber abgebaut werden: Also erst alle Messages zu Ende abarbeiten, dann dichtmachen, dann Speicher freigeben etc. Wenn ich die Forms einfach so kreiere und dann wieder wegschmeisse, dann kann es sein, das irgendwo was nicht ganz sauber abgebaut wird.

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:
If Not Assigned (fForm) Then
  Application.CreateForm (TfForm, fForm);
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!
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#12

Re: FormCreate für alle Forms beim Start aufrufen

  Alt 10. Mai 2005, 21:26
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 ?
Gruß
Hansa
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#13

Re: FormCreate für alle Forms beim Start aufrufen

  Alt 11. Mai 2005, 09:25
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:
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;
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.

Meine Edits sehen so aus:
Delphi-Quellcode:
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;
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):
Zitat:
Nach dem Aufruf ist vor dem Aufruf
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#14

Re: FormCreate für alle Forms beim Start aufrufen

  Alt 11. Mai 2005, 10:40
Das ist alles schon sehr seltsam, was Du da machst. Inwiefern beeinträchtigen DBEdits die performance ? Und das bei der Erstellung eines Formulars ? 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.

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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#15

Re: FormCreate für alle Forms beim Start aufrufen

  Alt 11. Mai 2005, 10:48
Zitat von Hansa:
... Deine EXE wird mit Sicherheit größer sein, als meine.....
Zitat von Hansa:
... Im Zeitalter von 1 GB RAM sehe ich darin aber keine wichtige Begründung, ....
Hmmm... die Echse soll so klein wie möglich sein aber der RAM Verbrauch ist nicht so wichtig? Das ist für mich eine sehr seltsame Philosophi.

Ich finde das Konzept von alzaimar durch vernünftig. Es gibt einen Aufruf für das Fenster. Der rest wird intern geregelt.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#16

Re: FormCreate für alle Forms beim Start aufrufen

  Alt 11. Mai 2005, 11:00
Hai Sharky,

Zitat von Hansa:
Delphi-Quellcode:

frm := TFrm.Create(self);

procedure Tfrm.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  Action := caFree;
end;
Wohl übersehen ? Wenn es noch kürzer/kompakter gehen sollte, dann sage wie. Da ist kein if und wenn und aber. 8) Alles wird im OnCreate geregelt. Die Freigabe übernimmt komplett Delphi.
Gruß
Hansa
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#17

Re: FormCreate für alle Forms beim Start aufrufen

  Alt 11. Mai 2005, 11:03
Warum TDBEdits die Performance runterziehen?
Zitat:
Jetzt zum Thema: Wenn ich Forms mit datensensitiven Steuerelementen bei Programmstart erzeuge, dann klinken 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.
Stand in meinem vorherigen Posting.

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:
Deine EXE wird mit Sicherheit größer sein, als meine.....
Das erinnert mich an das vergleichen der Größe der primären Geschlechtsmerkmale bei Pubertierenden. Da lassen wir uns aber nicht drauf ein und sagen: JA! Meine Echse ist größer! Ätsch!

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?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 23:32 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