Autor Beitrag
mexx
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: Mi 15.03.06 12:41 
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.

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:
//Speichern von Benutzereinstellungen
procedure TZeitForm.RegisterProperties(ASaveMode: Boolean);
var
  List, i, v: Integer;
  Data, Bezeichnung: String;
  wasActive: Boolean;
begin
  with UIOptions do
    if ASaveMode then begin

     //Sichtbarkeit und Index der Tabelle speichern
     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

     //Sichtbarkeit und Index der Tabelle lesen
     for i:=0 to CheckList.Count - 1 do
      begin
       Bezeichnung := CheckList.Items.Strings[i];

       //Position im Grid
       QueryGrid.FieldByName(CheckList.Items.Strings[i]).Index   := GetAsInteger(Bezeichnung + 'Index');

       //Position im CheckList
       CheckList.items.Move(i,GetAsInteger(Bezeichnung + 'Index')); //Problem

       //Sichtbarkeit im Grid
       QueryGrid.FieldByName(CheckList.Items.Strings[i]).Visible := GetAsBoolean(Bezeichnung);

       //Häckchen in CheckList
       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?
mexx Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1183



BeitragVerfasst: Mi 15.03.06 16:20 
Ich habe die Lösung gefunden. Hier der Quelltext, vielleicht können andere davon etwas gewinnen. Ich habe nun zwei For-Schleifen. Die erste hat die Aufgabe das Grid entsprechend zu ändern und die zweite liest die veränderten Eigenschaften in die Checklist, welches ja das Stuerungsteil für die Veränderungen darstellt.

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:
procedure TZeitForm.RegisterProperties(ASaveMode: Boolean);
var
  List, i, v: Integer;
  Data, Bezeichnung: String;
  wasActive: Boolean;
begin
  with UIOptions do
    if ASaveMode then begin

     //Sichtbarkeit und Index der Tabelle speichern
     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);


//     SetAsString('belUserText3', FUserText3, otUsrOption);


      end;
    end else try

     //Sichtbarkeit und Index der Tabelle lesen
     for i:=0 to CheckList.Count - 1 do
      begin
       Bezeichnung := CheckList.Items.Strings[i];

       //Position im Grid
       QueryGrid.FieldByName(CheckList.Items.Strings[i]).Index   := GetAsInteger(Bezeichnung + 'Index');

       //Sichtbarkeit im Grid
       QueryGrid.FieldByName(CheckList.Items.Strings[i]).Visible := GetAsBoolean(Bezeichnung);

//     FUserText3 := GetAsString('belUserText3');
      end;

     CheckList.Clear;
     for i:=0 to QueryGrid.Fields.Count - 1 do
      begin
       //Position im CheckList
       CheckList.Items.Append(QueryGrid.Fields.Fields[i].FullName);

       Bezeichnung := CheckList.Items.Strings[i];

       //Häckchen in CheckList
       CheckList.Checked[i] := GetAsBoolean(Bezeichnung);
      end;


    except
    end;
end;