Autor |
Beitrag |
Geri
      
Beiträge: 78
XP
RAD Studio XE pro
|
Verfasst: Do 08.01.09 18:16
Hallo zusammen
Kann mir bitte einer sagen, wie ich eine Variable in einer Formualaranwendug mit mehreren Formularen einmal initialisieren kann, nachdem alle Forms erzeug sind und bevor Application.run aufgerufen wird.
Ich lese Parameter aus einer Ini-Datei und möchte eine Variable in einem Formular, welches später erstellt wir initialisieren.
Oder habe ich hier vielleicht einen konzeptuellen Fehler?
Beste Grüsse
Geri
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 08.01.09 18:28
Du kannst dies doch in dem OnCreate des entsprechenden Formulars machen. Wenn du das nicht möchtest, dann kannst du OnShow des ersten Formulars benutzen. Das wird erst aufgerufen nachdem die im Projektquelltext aufgeführten Formulare erzeugt wurden.
Ich selbst erzeuge die Formulare meistens allerdings erst bei der ersten Verwendung oder im Hintergrund, zumindest, wenn es sich um ein größeres Projekt handelt (um die Startzeit zu reduzieren).
|
|
Geri 
      
Beiträge: 78
XP
RAD Studio XE pro
|
Verfasst: Do 08.01.09 18:37
Hallo Sebastian
Vielen Dank für Deine Hinweise.
Die Sache ist etwas diffizil:)
Im einen Formular rufe ich in OnCreate eine Methode ReadIniFile auf. Dabei wird auch ein Parameter für das zweite Formular ausgelesen.
Wenn ich nun aber das Show-Ereignis des zweiten Formulares abfange, dann wird diese Initialisierung ja jedes mal ausgeführt und das möchte ich nicht - oder habe ich die etwa falsch verstanden?
Der Ansatz, ein Formular erst dann zu erzeugen, wenn es notwendig ist, dünkt mich allgemein auch der viele bessere Weg.
Beste Grüsse
Geri
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 08.01.09 18:50
OnShow wird jedesmal aufgerufen, wenn das Formular mit Show oder ShowModal angezeigt wird, ja.
Der beste Weg wäre eigentlich eine Klasse, die die Einstellungen verwaltet. So mache ich das immer. Diese lädt die Einstellungen, kümmert sich auch ggf. darum, wenn keine da sind, etc.
Die anderen Formulare können dann darauf zugreifen, wenn sie angezeigt werden oder (wenn sie nicht beim Start automatisch erzeugt werden) erzeugt werden.
Alternativ kannst du die Einstellungen natürlich auch einfach im Projektquelltext nach dem Erzeugen der Formulare laden.
|
|
Geri 
      
Beiträge: 78
XP
RAD Studio XE pro
|
Verfasst: Fr 09.01.09 18:12
Hallo Sebastian
Vielen Dank für Deine Hilfe.
Ich möchte die Formulare eher schlank halten und Informationen zentral in einer Klasse speichern. Ich lege in den Formularen eine Eigenschaft an, die eine Referez auf diese Klasse hat.
Aus meiner Sicht entsteht sonst die Gefahr, dass man in irgendwelchen Formularen Daten definiert, schnell mal die Übersicht verliert und mich der Datenzugriff teiles etwas umständlich dünkt. Ausserdem ist man von den Formularen entkoppelt.
S.w. aber auch eine Philosphiefrage
Beste Grüsse
Geri
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 09.01.09 18:41
Genau eine solche Klasse halte ich ja, wie gesagt, auch für den besten Weg.
Wenn ich deine Vorstellung so lese, dann fällt mir dazu das Singleton-Pattern ein. Das wäre eine elegante Lösung, die deine Anforderungen erfüllt.
de.wikipedia.org/wik...ton_(Entwurfsmuster)
Die Initialisierung kann dann beim ersten Abruf des Objektes erfolgen. Dann ist es auch egal wo das Objekt das erste Mal benötigt wird. In OnCreate der einzelnen Formulare hast du dann auf jeden Fall bereits Zugriff auf das Objekt mit den Einstellungen.
Wenn du die Initialisierung von außen in die anderen Formulare bringen willst, dann kannst du im Projektquelltext nach dem Erzeugen der Formulare einen entsprechenden Aufruf machen.
(Also unter Projekt --> Quelltext anzeigen, dort nach den Aufrufen von Application.FormCreate, die die Formulare, die in den Optionen zur automatischen Erzeugung vorgesehen sind, erzeugen.)
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Fr 09.01.09 19:39
Geri hat folgendes geschrieben : | Hallo zusammen
Ich lese Parameter aus einer Ini-Datei und möchte eine Variable in einem Formular, welches später erstellt wir initialisieren.
Oder habe ich hier vielleicht einen konzeptuellen Fehler?
Beste Grüsse
Geri |
Grübel.
Wie willst du Variablen von Formularen initalisieren, die erst später erzeugt werden? Das gibt böse Speicher-Runtime-Errors, da - wenn das Formular nicht existiert, auch die Variable nicht existent ist.
Es sei denn, du verwendest globale Variablen und das wäre schlechter Stil.
:-8 Msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
Geri 
      
Beiträge: 78
XP
RAD Studio XE pro
|
Verfasst: Sa 10.01.09 16:17
Hallo
@Sebastian: Besten Dank, werde mir dieses Muster mal anschauen
@:-8 Msch: Ja eben, genau deshalb, weil genau das Problem mit den nicht erzeuten Formulare aufgetaucht ist entstand meine Frage..
Schönes Wochenende zusammne
Geri
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Sa 10.01.09 16:22
hmmm,
klassisch wird ich empfehlen, setze Variablen für die Klasse, wo sie verwendet werden.
Es zeugt von keinem guten Stil, klassenübergreifend Daten zu setzen.
Verwende dann auch nicht die onCreate() Methode, sondern überschreibe den Konstructor
Create().
Noch besser wäre es, du erzeugst eine Basisklasse die alle Variablen setzt und leitest deine
Formulare davon ab. So musst du nur in einer (!) Klasse Variablen initialisieren.
:-)msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
Geri 
      
Beiträge: 78
XP
RAD Studio XE pro
|
Verfasst: Mo 12.01.09 23:54
Hallo Msch
Die Idee eine Basisklasse zu definieren und weitere Formulare dann davon abzuleiten finde ich sehr gut! Habe das Ganze bislang noch nicht so gemacht weil ich immer die IDE genutzt habe um Formulare zu erzeuen und diese generiert ja weleche vom Typ TForm.
Werde mir das Ganze mal durchspielen und mich dann nochmals melden. Ein paar gute Regeln wären hierzu recht praktisch weil das Problem ja immer wieder auftritt.
Beste Grüsse und nochmals vielen Dank für den Input
Geri
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 13.01.09 13:41
Geri hat folgendes geschrieben : | Die Idee eine Basisklasse zu definieren und weitere Formulare dann davon abzuleiten finde ich sehr gut! |
Ich brauchte das nie, weil ich ja einfach jederzeit auf das zentrale Einstellungsobjekt zugreifen kann, dafür muss die Referenz dazu ja nicht in dem entsprechenden Formular liegen.
Geri hat folgendes geschrieben : | Habe das Ganze bislang noch nicht so gemacht weil ich immer die IDE genutzt habe um Formulare zu erzeuen und diese generiert ja weleche vom Typ TForm. |
Das schon, aber wenn du einfach dies in der Formulardeklaration ( TForm1 = class(TMyForm)) änderst, dann kannst du trotzdem weiter das Formular in der IDE visuell verwenden.
Speichere einfach diese Änderung und schließe und öffne die Datei erneut, das hat bisher immer funktioniert bei mir. (Verwendet habe ich das bei einem MDI-Programm, wo jedes der unterschiedlichen MDI-Childs von dem selben Formular abgeleitet war.)
|
|
Geri 
      
Beiträge: 78
XP
RAD Studio XE pro
|
Verfasst: Do 15.01.09 01:13
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 15.01.09 02:16
Geri hat folgendes geschrieben : | Ahh, interessant. Bisher habe ich mich immer etwas zurückgehalten den Code, welchen die IDE erzeugt anzugreifen. Mit einzelnen Komponenten habe ich da schon allerlei erlebt. Vielleicht liegt es aber auch an meiner Delphiversion oder an mir selbst:) |
Delphi 2005 Personal finde ich zwar schrecklich (weil es ewig lahm im Vergleich zum ja auch kostenlosen Turbo Delphi ist und zudem der Arbeitsspeicherverbrauch manchmal heftig wird), aber funktioniert hat es eigentlich schon meistens.
Solange man weiß was man ändert sollte es da keine Probleme geben. (Und wenn man es weiß, kann man es ja auch jederzeit rückgängig machen. 
|
|
|