Autor Beitrag
Geri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

XP
RAD Studio XE pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

XP
RAD Studio XE pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

XP
RAD Studio XE pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Fr 09.01.09 19:39 
user profile iconGeri hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

XP
RAD Studio XE pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

XP
RAD Studio XE pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 13.01.09 13:41 
user profile iconGeri hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconGeri hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

XP
RAD Studio XE pro
BeitragVerfasst: Do 15.01.09 01:13 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconGeri hat folgendes geschrieben Zum zitierten Posting springen:
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.

So habe ich es bisher gemacht, die Daten von der Visualisierung entkoppelt.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconGeri hat folgendes geschrieben Zum zitierten Posting springen:
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.)


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:)

Beste Grüsse und nochmals vielen Dank für Deine Tipps
Geri
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 15.01.09 02:16 
user profile iconGeri hat folgendes geschrieben Zum zitierten Posting springen:
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. ;-)