AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein FreePascal Listview speichern und laden
Thema durchsuchen
Ansicht
Themen-Optionen

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
Seite 1 von 2  1 2      
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#1

AW: Listview speichern und laden

  Alt 26. Okt 2014, 10:50
, schön ausgedrückt.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#2

AW: Listview speichern und laden

  Alt 26. Okt 2014, 12:04
Ich weiss nicht, was in FREEPASCAL vorhanden ist (ComCtrls, Types, StrUtils) -
in DELPHI XE2 funktioniert es so:

Delphi-Quellcode:
uses ..., Vcl.ComCtrls, System.Types, System.StrUtils;

procedure ListViewSaveToFile(ListView: TListView; const FileName: string);

  procedure AddTextToLine(var Line: string; const Text: string);
  begin
    Line := Line + Text + #9;
  end;

  procedure MoveCompletedLineToList(const Strings: TStringList; var Line: string);
  begin
    Strings.Add(System.Copy(Line, 1, Length(Line)-1)); //remove trailing tab
    Line := '';
  end;

var
  Strings: TStringList;
  LatestLine: string;
  i, j: Integer;

begin
  LatestLine := '';

  Strings := TStringList.Create;
  try
    for i := 0 to ListView.Items.Count-1 do begin
      AddTextToLine(LatestLine, ListView.Items[i].Caption);
      for j := 0 to ListView.Items[i].SubItems.Count-1 do begin
        AddTextToLine(LatestLine, ListView.Items[i].SubItems[j]);
      end;
      MoveCompletedLineToList(Strings, LatestLine);
    end;
    Strings.SaveToFile(FileName, TEncoding.UTF8);
  finally
    Strings.Free;
  end;
end;

procedure ListViewLoadFromFile(ListView: TListView; const FileName: string);
var
  Strings: TStringList;
  i, j: Integer;
  Fields: TStringDynArray;
  Item: TListItem;
begin
  Strings := TStringList.Create;
  try
    Strings.LoadFromFile(FileName);
    ListView.Clear;
    for i := 0 to Strings.Count-1 do begin
      Fields := SplitString(Strings[i], #9);
      Item := ListView.Items.Add;
      Item.Caption := Fields[0];
      for j := 1 to high(Fields) do begin
        Item.SubItems.Add(Fields[j]);
      end;
    end;
  finally
    Strings.Free;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ListViewSaveToFile(ListView1,'D:\LV1.txt');
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
ListViewLoadFromFile(ListView1,'D:\LV1.txt');
end;

Geändert von hathor (26. Okt 2014 um 12:09 Uhr)
  Mit Zitat antworten Zitat
LordGinn

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

AW: Listview speichern und laden

  Alt 26. Okt 2014, 14:25
@Sir Rufo

Screenshot bringt mir nichts, da ich die Listviewen mit der gespeicherten Datei wieder füllen möchte.
Danke für das Beispiel. Interpretierte Daten gibt es bei mir nicht.
Listviewen sehen zb so aus:
Filme // verliehen an // für diesen Zeitraum
Ich habe mir Gedanken gemacht. Ich muss nur lernen, die richtigen Worte zu wählen und mich exakt auszudrücken damit Programmierer mich verstehen.
In der gespeicherten Datei muss der Kontext nicht berücksichtigt werden, wer dahinter steigt kann sich freuen und eventuell in der gespeicherten Datei etwas verändern und die anderen laden die Datei durch das Programm und sehen wieder alles in den Listviewen.

@hathor

Danke für den Code. Ich werde ihn bei Gelegenheit testen.

@Sir Rufo

Wie bei hathor am Ende nur mit savedialog.execute hatte ich im Internet gefunden, aber ohne das ganze vorangestellte und da dachte ich, das wäre dann integriert.
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
begin
ListViewSaveToFile(ListView1,'D:\LV1.txt');
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
ListViewLoadFromFile(ListView1,'D:\LV1.txt');
end;
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#4

AW: Listview speichern und laden

  Alt 27. Okt 2014, 07:56
Ich muss nur lernen, die richtigen Worte zu wählen und mich exakt auszudrücken damit Programmierer mich verstehen.
Programmierer lieben es, Dinge wörtlich zu nehmen, denn dann können Sie mal wieder zeigen, wie überlogisch sie denken.
  Mit Zitat antworten Zitat
LordGinn

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

AW: Listview speichern und laden

  Alt 27. Okt 2014, 10:03
@ hathor
Zitat:
uses ..., Vcl.ComCtrls, System.Types, System.StrUtils;
Zitat:
Strings.SaveToFile(FileName, TEncoding.UTF8);
Das nimmt er bei mir nur ohne Vcl. bzw. System. und dann kann er mit TEncoding.UTF8 nichts anfangen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.372 Beiträge
 
Delphi 12 Athens
 
#6

AW: Listview speichern und laden

  Alt 27. Okt 2014, 10:08
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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Listview speichern und laden

  Alt 27. Okt 2014, 11:46
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.
LordGinn verwendet wahrscheinlich ein Lazarus mit FPC 2.6.4, welcher im Gegensatz zur aktuellen Entwicklungsversion 2.7.1 weder Namespaces noch TEncoding unterstützt (wobei erstere sich in FPC auch noch nicht angefangen haben durchzusetzen, da eben das aktuelle Release sie noch nicht unterstützt).

@LordGinn: das Weglassen von Vcl. bzw. System. ist in diesem Fall also richtig.

Gruß,
Sven
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
LordGinn

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

AW: Listview speichern und laden

  Alt 27. Okt 2014, 21:41
Ich benutze jetzt diesen Code.
http://www.delphipraxis.net/128391-post11.html

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.

Geändert von LordGinn (27. Okt 2014 um 22:10 Uhr)
  Mit Zitat antworten Zitat
LordGinn

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

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
LordGinn

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

AW: Listview speichern und laden

  Alt 27. Okt 2014, 11:07
Ich hatte anscheinend nur vergessen etwas bei uses zu ergänzen.
http://www.delphipraxis.net/17863-li...eichern-2.html

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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 22:38 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