Autor Beitrag
rushifell
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: Mi 29.01.14 20:28 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Mi 29.01.14 20:39 
Wessen Einstellungen? Die Standardwerte der Komponenten auf dem modalen Formular? Ich steig da nicht ganz durch.
rushifell Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: 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.

ausblenden volle Höhe 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..2of Boolean;
  ComboBox_Backup:Array[0..2of 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Do 30.01.14 09:07 
user profile iconrushifell hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Do 30.01.14 19:09 
Im Anhang ein Minimalbeispiel, wie so etwas aussehen könnte (bewusst simpel gehalten).
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: rushifell
rushifell Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: 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" ;-)