Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Optionsmenü - Änderungen beim Schließen zurücksetzen
rushifell - Mi 29.01.14 20:28
Titel: Optionsmenü - Änderungen beim Schließen zurücksetzen
Hallo,
Ich nutze ein Formular, das über ShowModal geöffnet wird, als Optionsmenü und möchte nun, dass beim Click auf den Close-Button die geänderten Einstellungen der einzelnen Komponenten wieder "zurückgesetzt" werden. Nur beim Click auf einen Button sollen die Änderungen übernommen werden. Bisher habe ich die Einstellungen jeder Komponente beim Anzeigen des Formulars in Variabeln gespeichert und beim Schließen des Formulars über den Close-Button die gespeicherten Einstellungen geladen. Gibt es dafür auch eine einfachere Möglichkeit? Ich nutze Delphi 2005.
Viele Grüße
WasWeißDennIch - Mi 29.01.14 20:39
Wessen Einstellungen? Die Standardwerte der Komponenten auf dem modalen Formular? Ich steig da nicht ganz durch.
rushifell - Mi 29.01.14 20:50
Auf dem Formular (Optionsmenü) gibt es verschiedene Komponenten (v.a. CheckBoxes und ComboBoxes). Beim Öffnen des Optionsmenüs (Form.OnShow) sollen die aktuellen Eigenschaften (z.B. Checked:=True oder Checked:=False) gespeichert werden. Wenn ich nun die Eigenschaften der Komponenten ändere und das Optionesmenü über einen Ok-Button schließe, sollen die neuen Eigenschaften bestehen bleiben, beim Schließen über den Close-Button sollen die Eigenschaften wieder zurückgesetzt werden (auf den beim Öffen des Optionsmenüs bestehenden Status). Ich hoffe, dass war verständlicher. Vielen Dank.
WasWeißDennIch - Mi 29.01.14 20:55
Ehrlich gesagt erscheint mir das etwas merkwürdig. Wenn es sich um einen Optionsdialog handelt, bietet es sich doch an, z.B. im OnShow die entsprechenden Eigenschaften anhand der aktuellen Optionen zu setzen, oder? Bei der Bestätigung geht es dann andersherum: die Optionen werden gemäß der Dialogeinstellungen geändert. So sollte das immer schön synchron laufen.
rushifell - Mi 29.01.14 22:04
Es handelt sich um einen Leveleditor, und die aktuellen Optionen werden erst beim Speichern des Levels gespeichert, nicht beim Schließen des Optionsdialogs, das ist das Problem. Und ich möchte nicht jedesmal beim Öffnen des Optionsdialog die Standardwerte wieder Laden.
Hier mal ein Beispiel: Ich lade ein Level, ändere die Einstellungen im Optionsdialog und klicke auf den Ok-Button. Die Einstellungen sind nun in den Komponenten des Optionsdialog gespeichert, noch nicht im Level. Nun öffne ich wieder den Optionsdialog, ändere die Eigenschaften der Checkboxes und ComboBoxes, merke aber aufeinmal, dass ich damit nicht zufrieden bin und die Werte wieder haben möchte, die vor dem Öffnen gesetzt waren. Ich klicke auf den Close-Button und die vorherigen Werte werden wiederhergestellt, hat aber nichts mit den Daten zu tun, die im Levelset gespeichert sind.
Generell ist es ja auch egal. Im Grunde komme ich um ein zusätzliches Speichern wohl nicht herum. Wäre z.B. folgender Ansatz möglich? Eine Bereichsprüfung brauche ich ja eigentlich nicht, da sich die Anzahl der Checkboxes und ComboBoxes nicht ändert.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56:
| var Form2: TForm2; CheckBox_Backup:Array[0..2] of Boolean; ComboBox_Backup:Array[0..2] of Integer;
implementation {$R *.dfm}
procedure TForm2.FormShow(Sender: TObject); Var i:Integer; CheckBox_Counter, ComboBox_Counter :Integer; begin CheckBox_Counter:=0; ComboBox_Counter:=0; For i:=0 to Form2.ComponentCount-1 do BEGIN IF (Components[i] is TCheckBox) then BEGIN IF CheckBox_Counter<=High(CheckBox_Backup) then CheckBox_Backup[CheckBox_Counter]:= (Components[i] As TCheckBox).Checked; Inc(CheckBox_Counter); END ELSE IF (Components[i] is TComboBox) then BEGIN IF ComboBox_Counter<=High(ComboBox_Backup) then ComboBox_Backup[ComboBox_Counter]:= (Components[i] As TComboBox).ItemIndex; Inc(ComboBox_Counter); END; END; end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); Var i:Integer; CheckBox_Counter, ComboBox_Counter :Integer; begin CheckBox_Counter:=0; ComboBox_Counter:=0; For i:=0 to Form2.ComponentCount-1 do BEGIN IF (Components[i] is TCheckBox) then BEGIN IF CheckBox_Counter<=High(CheckBox_Backup) then (Components[i] As TCheckBox).Checked:= CheckBox_Backup[CheckBox_Counter]; Inc(CheckBox_Counter); END ELSE IF (Components[i] is TComboBox) then BEGIN IF ComboBox_Counter<=High(ComboBox_Backup) then (Components[i] As TComboBox).ItemIndex:=ComboBox_Backup[ComboBox_Counter]; Inc(ComboBox_Counter); END; END; end; |
Das Problem ist, dass der Optionsdialog sehr viele CheckBoxes, ComboBoxes und SpinEdits enthält, und so wäre es wesentlich einfacherer. Bin mir nur nicht sicher, ob dabei Probleme auftreten können. Natürlich muss ich noch prüfen, ob beim Schließen des Otionsdialogs auf den Ok-Button oder den Close-Button geklickt wurde.
EDIT: Habs nun einfach so implementiert. Scheint so gut zu funktionieren, und der Aufwand war nicht groß.
WasWeißDennIch - Do 30.01.14 09:07
rushifell hat folgendes geschrieben : |
Die Einstellungen sind nun in den Komponenten des Optionsdialog gespeichert, noch nicht im Level. |
Und genau das ist zumindest unschön. Komponenten als Datenspeicher zu missbrauchen führt oft zu Problemen bei Änderungen und/oder undurchsichtigem Code. Eigentlich interessiert Dich doch nicht, ob im EditLevel eine 42 drinsteht, sondern doch eher, dass das aktuelle Level 42 ist, oder nicht? Was machst Du denn, wenn Du etwas änderst und dann kein Edit mehr brauchst, sondern ein Label oder eine Superduperkomponente aus einer speziellen Komponentensammlung? Dann musst Du nicht nur die Darstellung ändern, sondern auch die Logik. Und das sollte man nach Möglichkeit vermeiden.
rushifell - Do 30.01.14 14:17
Irgendwo muss ich die Werte der Komponenten auslesen. Von daher gesehen muss ich beim Austausch oder Entfernen von Komponenten den Quelltext so oder so ändern. Was wäre für Dich die optimale Lösung?
Wenn ich ständig beim Öffnen des Optionsdialog die Werte der Komponenten aus den Levelsetdaten auslesen muss, ist das für mich auch keine schöne Lösung.
WasWeißDennIch - Do 30.01.14 19:09
Im Anhang ein Minimalbeispiel, wie so etwas aussehen könnte (bewusst simpel gehalten).
rushifell - Do 30.01.14 21:33
Vielen Dank, vor allem auch für Deine Geduld :D
Du hast ja vollkommen recht. So ist es wesentlich einfacherer. Das Schöne daran ist, dass ich in meinem Programm keine einzige Zeile Quelltext neu schreiben, sondern nur die Proceduren zum Lesen und Schreiben der Werte aus den Komponenten des Optionsdialogs umstellen musste. Und das von mir oben implementierte Zwischenspeichern ist natürlich völlig überflüssig. Manchmal denkt man "einfach" zu "kompliziert" ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!