Hallo,
jetzt wird es etwas kniffelig. Also gut:
Ich habe ein DBGrid dessen Spalten in ein Checklist stehen. Die Checklist dient dazu, dass der Benutzer auswählen kann, welche Spalten er sehen möchte und welche nicht. Dazu kann er auswählen welche Spalten er an welcher Stelle(index) haben will. Damit die Einstellungen auch beim nächsten Programmstart wieder geltend werden, werden sie in eine DB gespeichert. Sie werden wie bei einer INI-Datei gespeichert.
Beim Auslesen gibt es jedoch Schwierigkeiten. Besser gesagt, beim optischen Darstellen der Checkliste. Die Einstellungen, welche Spalte sichtbar ist und an welcher Postition werden korrekt durchgeführt. Aber damit das CheckList auch die veränderte Postition der Spalte anzeigt, mache ich ein Move. Das ist aber ein großer Fehler, weil das ganze in einer for-schleife passiert, die den Index braucht. Ich ändere jedoch mit dem Move den Index und habe somit verfälschte ergebnisse in dem Checklist.
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:
| procedure TZeitForm.RegisterProperties(ASaveMode: Boolean); var List, i, v: Integer; Data, Bezeichnung: String; wasActive: Boolean; begin with UIOptions do if ASaveMode then begin
for i:=0 to CheckList.Count - 1 do begin Bezeichnung := CheckList.Items.Strings[i]; SetAsBoolean(Bezeichnung, CheckList.checked[i], otUsrOption);
SetAsInteger(Bezeichnung + 'Index', QueryGrid.FieldByName(CheckList.Items.Strings[i]).Index, otUsrOption); end; end else try
for i:=0 to CheckList.Count - 1 do begin Bezeichnung := CheckList.Items.Strings[i];
QueryGrid.FieldByName(CheckList.Items.Strings[i]).Index := GetAsInteger(Bezeichnung + 'Index');
CheckList.items.Move(i,GetAsInteger(Bezeichnung + 'Index')); QueryGrid.FieldByName(CheckList.Items.Strings[i]).Visible := GetAsBoolean(Bezeichnung);
CheckList.Checked[i] := GetAsBoolean(Bezeichnung);
end; except end; end; |
Problem:
CheckList.items.Move(i,GetAsInteger(Bezeichnung + 'Index'));
Lösungsidee:
CheckList.Items.Index := DBGrid.fields.index
Meine Lösungsidee ist, ausserhalb der For-Schleife die Einträge im Checklist, deren Index auf den selben zu setzten, die in den Fields definiert sind. Wie gesagt, das Darstellen der Sichtbarkeit und Position im DBGrid ist völlig korrekt, auch Häckchen rein oder raus, wenn es sichtbar ist, oder nicht. Aber die Position des Checklisten-Eintrages darf nicht auf meine Weise in der For-Schleife gesetzt werden, weil ich, wenn man es so nennen darf, den Primärschlüssel dabei ändere.
Wie kann man meine Lösungsidee wirklich umsetzten?