"Optionen" für gesamtes Programm ändern
-
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