![]() |
AW: Listview speichern und laden
In "Delphi" haben inzwischen viele Units einen Namespace. (das z.B. das "Vcl." für Units der VCL)
Und das mit dem Encoding ist ebenfalls eine Delphi-Sache (seit Delphi 2009) ... da kann es sein, daß es im Lazarus/FreePascal anders gelöst ist, bzw. etwas anders heißt oder sich in anderen Units befindet. |
AW: Listview speichern und laden
Ich hatte anscheinend nur vergessen etwas bei uses zu ergänzen.
![]() Jetzt funktioniert es mit den Daten aus einer Listview. Ich versuche erst mal selbst herauszufinden wie man alle Daten aus den 12 Listviewen in einer Datei speichern kann und würde mich dann bei (nicht) Erfolg melden. |
AW: Listview speichern und laden
Zitat:
@LordGinn: das Weglassen von
Delphi-Quellcode:
bzw.
Vcl.
Delphi-Quellcode:
ist in diesem Fall also richtig.
System.
Gruß, Sven |
AW: Listview speichern und laden
Zitat:
|
AW: Listview speichern und laden
Ich benutze jetzt diesen Code.
![]() Ich habe ein bisschen probiert und versucht Listview2 mit einzubeziehen, mittels einem weiteren Delimitter und dann noch einem Trenner zwischen Listview1 und Listview2. Bis jetzt ist es nur raten, da mir viele Begriffe in dem Code nicht bekannt sind. Weiß jemand, wie man das jetzt angehen kann? Meine Logik wäre folgende: Wie in dem verlinkten Code, nur dass er aufhört Listview1 zu füllen wenn er das besondere Trennzeichen findet. Dann würde ich denselben Code auch für Listview2 nehmen mit demselben Delimiter, nur dass er erst nach dem besonderen Trennzeichen anfängt. Jedes Trennzeichen zwischen den Listviewen ist ein unikat. |
AW: Listview speichern und laden
Hier der Zwischenstand.
Das Speichern funktioniert.
Delphi-Quellcode:
Das Laden funktioniert nicht. Es kommt keine Fehlermeldung. Die Listviewen bleiben leer. Wird bestimmt ein Fehler beim Copy sein.
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;
Delphi-Quellcode:
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; |
AW: Listview speichern und laden
Du solltest dir das Leben erheblich vereinfachen indem du alles in kleine Teile aufteilst.
Hier mal ein Beispiel für deine ListView-Speicher-Problematik (in Delphi könnte in FPC etwas anders sein, das Prinzip ist aber gleich):
Delphi-Quellcode:
Alles nur kleine Methoden ... hübsch, gell?
unit Form.Main;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls; type TForm1 = class( TForm ) ListView1: TListView; ListView2: TListView; SaveDialog1: TSaveDialog; OpenDialog1: TOpenDialog; Button1: TButton; Button2: TButton; procedure Button1Click( Sender: TObject ); procedure Button2Click( Sender: TObject ); private function Serialize( ListView: TListView ): string; overload; function Serialize( ListItems: TListItems ): string; overload; function Serialize( ListItem: TListItem ): string; overload; procedure Deserialize( const Data: string; ListView: TListView ); overload; procedure Deserialize( const Data: string; ListItems: TListItems ); overload; procedure Deserialize( const Data: string; ListItem: TListItem ); overload; procedure SaveToFile( const AFileName: string ); procedure LoadFromFile( const AFileName: string ); public end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } procedure TForm1.Button2Click( Sender: TObject ); begin if SaveDialog1.Execute then SaveToFile( SaveDialog1.FileName ); end; procedure TForm1.SaveToFile( const AFileName: string ); var LStrings: TStrings; begin LStrings := TStringList.Create; try LStrings.Values['ListView1'] := Serialize( ListView1 ); LStrings.Values['ListView2'] := Serialize( ListView2 ); LStrings.SaveToFile( AFileName ); finally LStrings.Free; end; end; function TForm1.Serialize( ListView: TListView ): string; var LStrings: TStrings; begin LStrings := TStringList.Create; try LStrings.Values['Items'] := Serialize( ListView.Items ); Result := LStrings.DelimitedText; finally LStrings.Free; end; end; function TForm1.Serialize( ListItems: TListItems ): string; var LIdx: Integer; LStrings: TStrings; begin LStrings := TStringList.Create; try for LIdx := 0 to ListItems.Count - 1 do LStrings.Add( Serialize( ListItems[LIdx] ) ); Result := LStrings.DelimitedText; finally LStrings.Free; end; end; function TForm1.Serialize( ListItem: TListItem ): string; var LStrings: TStrings; begin LStrings := TStringList.Create; try LStrings.Values['Caption'] := ListItem.Caption; LStrings.Values['SubItems'] := ListItem.SubItems.DelimitedText; Result := LStrings.DelimitedText; finally LStrings.Free; end; end; procedure TForm1.Button1Click( Sender: TObject ); begin if OpenDialog1.Execute then LoadFromFile( OpenDialog1.FileName ); end; procedure TForm1.LoadFromFile( const AFileName: string ); var LStrings: TStrings; begin LStrings := TStringList.Create; try LStrings.LoadFromFile( AFileName ); Deserialize( LStrings.Values['ListView1'], ListView1 ); Deserialize( LStrings.Values['ListView2'], ListView2 ); finally LStrings.Free; end; end; procedure TForm1.Deserialize( const Data: string; ListView: TListView ); var LStrings: TStrings; begin LStrings := TStringList.Create; try LStrings.DelimitedText := Data; Deserialize( LStrings.Values['Items'], ListView.Items ); finally LStrings.Free; end; end; procedure TForm1.Deserialize( const Data: string; ListItems: TListItems ); var LIdx: Integer; LStrings: TStrings; begin LStrings := TStringList.Create; try LStrings.DelimitedText := Data; ListItems.Clear; for LIdx := 0 to LStrings.Count - 1 do Deserialize( LStrings[LIdx], ListItems.Add ); finally LStrings.Free; end; end; procedure TForm1.Deserialize( const Data: string; ListItem: TListItem ); var LStrings: TStrings; begin LStrings := TStringList.Create; try LStrings.DelimitedText := Data; ListItem.Caption := LStrings.Values['Caption']; ListItem.SubItems.DelimitedText := LStrings.Values['SubItems']; finally LStrings.Free; end; end; end. UPDATE Kleine Verbesserung für zuküntige Erweiterung |
AW: Listview speichern und laden
@Sir Rufo
Hallo Rufo, Schöner Code! Funktioniert bestens! wäre es ok wenn ich deinen Code für meine Bachelorarbeit in etwas überarbeiteten Form verwenden dürfte? Natürlich wirst du als Urheber des Codes angegeben. PS: Ich frage nur hier, da ich dir leider keine PN schreiben kann! mfg Markus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz