Autor Beitrag
LordGinn
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Sa 25.10.14 23:20 
Hallo.

Ich möchte 12 Listviewen speichern und laden.
Wie kann ich das schaffen?
Die einfache Variante mit Savedialoge.execute funktioniert nicht und PosEx kennt mein Lazarus v.1.2.4 nicht.
Ich habe auch versucht aus anderen Forenbeiträgen schlau zu werden, aber leider erfolglos.

Crosspost www.delphipraxis.net...den.html#post1277405
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: So 26.10.14 11:50 
Wie in der DP schon angedeutet willst Du doch gar keine Listview speichern, sondern die Daten, die von ihr dargestellt werden. Dafür solltest Du Dir ein paar Gedanken über das Format machen, IMO sollte CSV hierfür eigentlich schon ausreichen. Solltest Du später dann eine andere Anzeigekomponente bevorzugen, ändert sich an den Daten bzw. ihrem Format gar nichts, sondern nur an ihrer Darstellung.
LordGinn Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: So 02.11.14 12:36 
Hier der Zwischenstand.


Das Speichern funktioniert.
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 TForm1.Button13Click(Sender: TObject);
Var
  SaveList: TStrings;
  i, j: Integer;
  TempStr: String;
Const
  ItemTrenner = #134;
  ListTrenner1 = #179;
  ListTrenner2 = #178;

Begin
  If Not SaveDialog1.Execute Then Exit;
  SaveList := TStringList.create;
  Try
    With ListView1 Do
    Begin
      For i := 0 To pred(Items.Count) Do
      Begin
        TempStr := '';
        With Items[i] Do
          For j := 0 To pred(SubItems.Count) Do
            TempStr := TempStr + ItemTrenner + SubItems[j];

        SaveList.Add(Items[i].Caption + TempStr);


      End;

end;
    SaveList.add(Listtrenner1);

    With ListView2 Do
      For i := 0 To pred(Items.Count) Do
      Begin
        TempStr := '';
        With Items[i] Do
          For j := 0 To pred(SubItems.Count) Do
            TempStr := TempStr + ItemTrenner + SubItems[j];

        SaveList.Add(Items[i].Caption + TempStr);


      End;

end;

    SaveList.add(Listtrenner2);

    SaveList.SaveToFile(SaveDialog1.FileName+'.txt');

  Finally
    FreeAndNil(SaveList);
  End;
End;


Das Laden funktioniert nicht. Es kommt keine Fehlermeldung. Die Listviewen bleiben leer. Wird bestimmt ein Fehler beim Copy sein.
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:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
procedure TForm1.Button12Click(Sender: TObject);
Var
  LoadList, ErsteLW, ZweiteLW: TStrings;
  i, ActPos, PrevPos: Integer;
Const
  ItemTrenner = #134;
  ListTrenner1 = #179;
  ListTrenner2 = #178;

Begin
  If Not OpenDialog1.Execute Then Exit;
  LoadList := TStringList.create;
  ErsteLW:=TStringList.create;
  ZweiteLW:=TStringList.create;

  Try
    LoadList.LoadFromFile(OpenDialog1.FileName);
    ListView1.Items.Clear;
    Listview2.items.clear;



    For i := 0 To pred(LoadList.Count) Do
    Begin
    ErsteLW.add(Copy(LoadList[i], 1, Pos (ListTrenner1, Loadlist[i]) - 1));
    ZweiteLW.add(Copy(LoadList[i], Pos (ListTrenner1, Loadlist[i]) + 1, Pos (ListTrenner2, Loadlist[i]) -1));
    end;

    For i := 0 To pred(ErsteLW.Count) Do
    Begin
      PrevPos := 1;
      ActPos := 1;
      ActPos := PosEx(ItemTrenner, ErsteLW[i], succ(ActPos));
      With ListView1.Items.Add Do
      Begin
        Caption := Copy(ErsteLW[i], PrevPos, (ActPos - PrevPos));
        PrevPos := succ(ActPos);
        Repeat
          ActPos := PosEx(ItemTrenner, ErsteLW[i], succ(ActPos));
          If ActPos <> 0 Then
            SubItems.Add(Copy(ErsteLW[i], PrevPos, (ActPos - PrevPos)))
          Else
            SubItems.Add(Copy(ErsteLW[i], PrevPos, Length(ErsteLW[i])));
          PrevPos := succ(ActPos);
        Until ActPos = 0;
      End;
    End;

    For i := 0 To pred(ZweiteLW.Count) Do
    Begin
      PrevPos := 1;
      ActPos := 1;
      ActPos := PosEx(ItemTrenner, ZweiteLW[i], succ(ActPos));
      With ListView2.Items.Add Do
      Begin
        Caption := Copy(ZweiteLW[i], PrevPos, (ActPos - PrevPos));
        PrevPos := succ(ActPos);
        Repeat
          ActPos := PosEx(ItemTrenner, ZweiteLW[i], succ(ActPos));
          If ActPos <> 0 Then
            SubItems.Add(Copy(ZweiteLW[i], PrevPos, (ActPos - PrevPos)))
          Else
            SubItems.Add(Copy(ZweiteLW[i], PrevPos, Length(ZweiteLW[i])));
          PrevPos := succ(ActPos);
        Until ActPos = 0;
      End;
    End;

  Finally
    FreeAndNil(LoadList);
    FreeAndNil(ErsteLW);
    FreeAndNil(ZweiteLW);
  End;
End;