"Optionen" für gesamtes Programm ändern
-
Ich kann es ja auch so machen, ich ändere die Optionen für alle Forms:
void __fastcall TForm2::Button1Click(TObject *Sender) { for (int i=0;i<Application->ComponentCount;i++) { if (Application->Components[i]->ClassNameIs("TForm")) { dynamic_cast<TForm*> (Application->Components[i])->Top=100; } } }speichere dann eine Ini mit den Optionen nur einer Form (da ja eh alle die selben Settings haben sollen)
TIniFile *ini; ini = new TIniFile (ChangeFileExt(Application->ExeName, ".ini"); ini->WriteInteger ("Form","Top",Form1->Top); .... ini->UpdateFile(); delete ini;und lese beim Programmstart für alle Forms die Ini aus:
for (int i=0;i<Application->ComponentCount,i++) { if (Application->Components[i]->ClassNameIs("TForm")) { //so nun weiß ich nich weiter // Bitte um hilfe } }Ist das bis jetzt geschriebene so richtig? Würde es funktionieren, zB dasOptionensetzten für alle Forms?
Und wie geht es beim auslesen weiter?
Bin grad nicht daheim, kann somit code nicht testen, hab das grad mal so geschrieben!
-
Zunächst mal würde ich Dir vorschlagen anstatt die Forms auf diese Weise zu durchwandern
for (int i=0;i<Application->ComponentCount;i++) { if (Application->Components[i]->ClassNameIs("TForm")) { dynamic_cast<TForm*> (Application->Components[i])->Top=100; } }etwas in der Form zu verwenden
for (int i=0; i<Screen->FormCount; ++i) Screen->Forms[i]->Top = 100;Das finde ich verständlicher und einfacher.
Du könntest aber auch in jedem Formular beim Öffnen und Schließen die Daten aus der bzw. in die Ini-Datei lesen/schreiben.
Vielleicht erstellst Du Dir ein leeres Formular, in das Du den Code reinschreibst, und lässt alle Formulare davon erben.
Wenn Du für jedes Formular die Position und Größe separat speichern willst, könntest Du natürlich in der Ini-Datei den Eintrag
einfach von "Form" auf den Formularnamen (z.B. "TForm1") umbenennen.
Wenn die Formulare alle gleich groß sein sollen und in der Größe unveränderlich sind, könntest Du auch beim Anzeigen des Formulars
die Größe des neuen Formulars vom aufrufenden übernehmen.
Oder Du machst Dir eine DLL, in der Du Dir einen entsprechenden Windows-Hook bastelst, der immer beim Laden eines Formulars die Größe
entsprechend anpasst.
Wahrscheinlich gibt es auch irgendwo im Netz schon vorgefertigte Komponenten, die genau das können, was Du willst.Gruß,
Alexander
-
Ja ich würde das aber gern selbst hinbekommen!
Mit jeder Form einzeln finde ich nciht so gut...und mit DLLs habe ich noch nie gearbeitet!
Geht es denn nicht ähnlich wie so:
for (int i=0;i<Application->ComponentCount;i++) { if (Application->Components[i]->ClassNameIs("TForm")) { dynamic_cast<TForm*> (Application->Components[i])->Top=100; } }oder so:
for (int i=0; i<Screen->FormCount; ++i) Screen->Forms[i]->Top = 100;
-
5er1al schrieb:
Geht es denn nicht ähnlich wie so:(...)
Schon. Allerdings erwischst Du damit nur die Formulare, die im Moment auch geladen sind. Wenn alle Formulare automatisch erstellt werden,
ist das noch relativ unproblematisch. Erstellst Du Formulare auch dynamisch mit new, dann musst Du nach jedem Instanzieren Deine Funktion
aufrufen, damit auch das gerade erstellte Formular in der Größe angepasst wird. Da wäre es doch wohl einfach einfach die Werte direkt zu
setzen, oder?
Warum sollen eigentlich alle Formulare gleich groß sein? Ich finde das bei Programmen immer extrem nervig.Gruß,
Alexander
-
naja, es soll nicht unbedingt die größe sein, sondern die farbe...wobei das prinzip entscheidend ist!
Ich wäre froh wenn du mir es auf meine Weiße mal erklären könntest (meinen Code vervollständigst) und mir deine idee auch etwas näher bringst!
Vielleicht mit Beispielen etc!
Danke

PS: in diesem programm gibt es keine dynamisch erzeugten Forms..
-
Dann pack das halt in Dein OnShow-Ereignis des Hauptformulars:
for (int i=0; i<Screen->FormCount; ++i) Screen->Forms[i]->Color = clWhite;Oder fehlt da jetzt noch was?
Gruß,
Alexander
-
Ja...
und zwar habe ich ja ein Optionsmenü, wo der benutzer eben die einstellungen ändern kann!
Daher kann ich es nicht fest schreiben, sondern eben in INI!
-
Dann pack die for-Schleife in eine Methode, die Du beim Programmstart und nach Änderungen der Optionen aufrufst.
Dann sollte aber das IniFile-Objekt zum Programmstart erstellt werden (Konstruktor) und erst beim Beenden wieder freigegeben werden.
Den Color-Wert kannst Du ja genauso in die Ini-Datei speichern wie die Position oder Größe.Gruß,
Alexander
-
ja genau das wollt ich machen, hab aber irgendwie keinen richtigen ansatz!
Kann es jetzt auch nicht probieren, vielleicht kannst mal ein Beispiel geben?Wobei das auslesen für alle Forms aus der INI dürfte doch auch möglich sein...

-
5er1al schrieb:
Kann es jetzt auch nicht probieren, vielleicht kannst mal ein Beispiel geben?
Ich fand das eigentlich schon ziemlich konkret. Überleg Dir doch mal was und probier's aus. Wenn Du überhaupt nicht drauf kommst, kannst
Du ja nochmal nachfragen.5er1al schrieb:
Wobei das auslesen für alle Forms aus der INI dürfte doch auch möglich sein...
Was meinst Du damit? Für jedes Formular einzeln auslesen? Oder wenn jedes Formular die Daten aus der Ini-Datei selbst ausliest?
Gruß,
Alexander
-
Ja ich probier mal bissl!
Und zu dem 2ten Punkt!
Ich meine, das die INI so ausgelesen wird, das alle Forms die Einstellungen übernehmen! Geht das nicht?
-
5er1al schrieb:
Ich meine, das die INI so ausgelesen wird, das alle Forms die Einstellungen übernehmen! Geht das nicht?
Hab ich doch oben geschrieben!?

Gruß,
Alexander
-
Ich glaub ich habs, wenn du es dir anders vorstellst bitte sagen:
Also optionen ändern und speichern:
void __fastcall TForm2::Button4Click(TObject *Sender) { for (int i=0; i<Screen->FormCount; ++i) { Screen->Forms[i]->Top = StrToInt(Edit1->Text); Screen->Forms[i]->Left = StrToInt(Edit2->Text); Screen->Forms[i]->Caption = Edit3->Text; } TIniFile *ini; ini = new TIniFile (ChangeFileExt(Application->ExeName,".ini")); ini->WriteInteger("Visual","Top",StrToInt(Edit1->Text)); ini->WriteInteger("Visual","Left",StrToInt(Edit2->Text)); ini->WriteString("Programm","Name",Edit3->Text); ini->UpdateFile(); delete ini; }und einlesen bei Hauptform:
void __fastcall TForm1::FormCreate(TObject *Sender) { TIniFile *ini; ini = new TIniFile (ChangeFileExt(Application->ExeName,".ini")); for (int i=0; i<Screen->FormCount; ++i) { Screen->Forms[i]->Top = ini->ReadInteger("Visual","Top",100); Screen->Forms[i]->Left = ini->ReadInteger("Visual","Left",100); Screen->Forms[i]->Caption = ini->ReadString("Programm","Name","Default Caption"); } }also= :p
-
Ein Problem hab ich noch!Wie kann ich eine Form bei der veränderung der Werte auslassen?
Denn die Optionform will ich nicht gleich ändern..sie soll erst beimn nächsten Programmstart geändert werden!
Also muss das hier irgendwo sein:
for (int i=0; i<Screen->FormCount; ++i) { Screen->Forms[i]->Top = StrToInt(Edit1->Text); Screen->Forms[i]->Left = StrToInt(Edit2->Text); Screen->Forms[i]->Caption = Edit3->Text; Screen->Forms[i]->Height = StrToInt(Edit4->Text); Screen->Forms[i]->Width = StrToInt(Edit5->Text); //Screen->Forms[i]->BorderStyle = StrToEdit6->Text; }wie kann ich hier eine Form ausgrenzen, in meinem Falle wäre es Form2
@Alexander: was denkst aber von meiner Lösung mit einlesen der Ini und so?
-
5er1al schrieb:
Denn die Optionform will ich nicht gleich ändern..sie soll erst beimn nächsten Programmstart geändert werden!
Warum?
Falls Form2 Dein Options-Dialog ist und Du die for-Schleife in einem anderen Formular hast (z.B. Form1), dann könntest Du etwas in dieser
Art machen:for (int i=0; i<Screen->FormCount; ++i) { if (Screen->Forms[i] == Screen->ActiveForm && Screen->ActiveForm != Form2) { //... } }5er1al schrieb:
@Alexander: was denkst aber von meiner Lösung mit einlesen der Ini und so?
Also ohne jetzt in der Tiefe darüber nachgedacht zu haben, würde ich das Problem ungefähr so lösen:
1. Erstellen einer Klasse, die alle Optionen jeweils als Eigenschaft enthält
2. TIniFile als Membervariable der Optionen-Klasse, um ständiges new/delete zu vermeiden. Sonst kann man gleich getPrivateProfileString() etc.
verwenden.
3. Eine Methode assignFormOptions() o.ä. erstellen, das die for-Schleife enthält. Diese Methode würde ich auch in die Optionenklasse stecken.
4. Im OnShow-Ereignis des Hauptformulars (nicht OnCreate!) die Methode assignFormOptions() aufrufen
5. Da Optionen-Dialoge meist modal angezeigt werden, würde ich bei Änderungen der Optionen die assignFormOptions()-Methode aufrufenUnd noch vieles andere mehr, wenn ich länger drüber nachgedacht hätte.
Gruß,
Alexander