AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein FreePascal Listview speichern und laden

Listview speichern und laden

Offene Frage von "smmahaup"
Ein Thema von LordGinn · begonnen am 25. Okt 2014 · letzter Beitrag vom 19. Okt 2016
Antwort Antwort
LordGinn

Registriert seit: 13. Okt 2014
16 Beiträge
 
FreePascal / Lazarus
 
#1

AW: Listview speichern und laden

  Alt 2. Nov 2014, 10:38
Hier der Zwischenstand.


Das Speichern funktioniert.
Delphi-Quellcode:
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.
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;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Listview speichern und laden

  Alt 2. Nov 2014, 11:22
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:
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.
Alles nur kleine Methoden ... hübsch, gell?

UPDATE Kleine Verbesserung für zuküntige Erweiterung
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 2. Nov 2014 um 11:37 Uhr)
  Mit Zitat antworten Zitat
smmahaup

Registriert seit: 15. Apr 2016
Ort: Kaufbeuren
6 Beiträge
 
#3

AW: Listview speichern und laden

  Alt 19. Okt 2016, 09:52
@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
Markus
  Mit Zitat antworten Zitat
Antwort Antwort

 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:06 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