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.
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ß.