Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Tlistview als String speichern/laden (https://www.delphipraxis.net/121194-tlistview-als-string-speichern-laden.html)

smallsmoker 23. Sep 2008 22:46


Tlistview als String speichern/laden
 
Hi,
wollte gerade die daten aus einer Tlistview übers internet verschicken und wollte einen möglichst eleganten weg gehen, dazu wollte ich meine listview in einen string umwandeln verschicken und dann wieder einlesen hier ist das ergebnis:

Delphi-Quellcode:
Type
  TListViewStringConverter = Class Helper For TListView
  private
    function GetAsString: String;
    procedure SetAsString(const Value: String);
  Public
    Property AsString : String Read GetAsString Write SetAsString;
  End;

{ TListViewStringReader }

function TListViewStringConverter.GetAsString: String;
Var
  sList,sRow : TStringList;
  i : Integer;

Begin
  sList := TStringList.Create;
  sRow := TStringList.Create;
  Try
  sList.Delimiter := '\';
  sRow.Delimiter := '#';
  For i := 0 To Items.Count-1 do Begin
    sRow.Clear;
    sRow.Add(Items[i].Caption);
    sRow.AddStrings(Items[i].SubItems);
    sList.Add(AnsiQuotedStr(sRow.DelimitedText,'"'));
  End;
  Finally
    sRow.Free;
    Result := SList.DelimitedText;
    sList.Free;
  End;
End;


procedure TListViewStringConverter.SetAsString(const Value: String);
Var
  sList,sRow : TStringList;
  i : Integer;
  item : TListItem;

Begin
  sList := TStringList.Create;
  sRow := TStringList.Create;
  Items.Clear;
  Try
  sList.Delimiter := '\';
  sList.DelimitedText := Value;
  sRow.Delimiter := '#';
  For i := 0 To sList.Count-1 do Begin
    sRow.DelimitedText := AnsiDequotedStr (sList[i],'"');
    Item := Items.Add;
    Item.Caption := sRow[0];
    sRow.Delete(0);
    Item.SubItems.Assign(sRow);
  End;
  Finally
    sRow.Free;
    sList.Free;
  End;
End;
Beispielaufruf:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
Var
  s : String;
begin
  s := ListView1.AsString;
  ListView1.AsString := s;
end;
Die Anzahl der Spalten ist nicht relevant,
Es werden alle Zeilen (ohne Überschriften) gespeichert und geladen.

mfg smallsmoker

p.s.: Danke an alzaimar für den Code.

smallsmoker 23. Sep 2008 23:03

Re: Tlistview als String speichern/laden
 
leider gibt es probleme wenn leerzeichen vorkommen :/ mit "" klappt es nicht ...

edit: problem mit den leerzeichen durch StringReplace gelöst.

edit2: noch einen fehler entdeckt jetzt sollte alles klappen :)
wäre ganz froh über feedback.

alzaimar 24. Sep 2008 06:03

Re: Tlistview als String speichern/laden
 
Verwende 'AnsiQuotedStr', um einen String mit Gänsefüßen zu versehen und 'AnsiDequotedStr', um diese zu wieder zu entfernen. Dabei werden die Gänsefüßchen innerhalb des Textes berücksichtigt.

smallsmoker 27. Sep 2008 12:48

Re: Tlistview als String speichern/laden
 
AnsiQuotedStr würde nicht helfen, ich habe ja geschrieben das es nicht hilft den string in "" zu setzen.
mann muss auch die leerzeichen im string ersetzen da sie beim parsen falsch erkannt werden.

toms 27. Sep 2008 12:49

Re: Tlistview als String speichern/laden
 
Hallo Nick, warum nicht via Stream?

Bernhard Geyer 27. Sep 2008 12:51

Re: Tlistview als String speichern/laden
 
Wenn du bestimmte Zeichen als Trennzeichen ansieht mußt du auch diese Trennzeichen im eigentlichen text escapen (oft wird dies durch verdopplung des Trennzeichens gemacht).

Aber wie wäre es mit XML als Format. Damit könnte du auch später diverse ander Eigentschaften deines TreeViews streamen. Alternativ wäre auch zu versuchen die Persistenz (Streaming in DFM) zu "mißbrauchen"

smallsmoker 27. Sep 2008 12:58

Re: Tlistview als String speichern/laden
 
gute idee mit den doppelten trennzeichen damit diese auch im text enthalten sein können.
für mich ist diese lösung schon ideal da die listview auf der einen seite noch nicht existiert, heißt ich erzeuge einen string der gesendet wird und dann durchgeparst wird :)

alzaimar 27. Sep 2008 13:11

Re: Tlistview als String speichern/laden
 
Zitat:

Zitat von smallsmoker
AnsiQuotedStr würde nicht helfen, ich habe ja geschrieben das es nicht hilft den string in "" zu setzen.
mann muss auch die leerzeichen im string ersetzen da sie beim parsen falsch erkannt werden.

Nö.
Delphi-Quellcode:
Type
  TListViewStringConverter = Class Helper For TListView
  private
    function GetAsString: String;
    procedure SetAsString(const Value: String);
  Public
    Property AsString : String Read GetAsString Write SetAsString;
  End;

{ TListViewStringReader }

function TListViewStringConverter.GetAsString: String;
Var
  sList,sRow : TStringList;
  i : Integer;

Begin
  sList := TStringList.Create;
  sRow := TStringList.Create;
  Try
  sList.Delimiter := '\';
  sRow.Delimiter := '#';
  For i := 0 To Items.Count-1 do Begin
    sRow.Clear;
    sRow.Add(Items[i].Caption);
    sRow.AddStrings(Items[i].SubItems);
    sList.Add(AnsiQuotedStr(sRow.DelimitedText,'"'));
  End;
  Finally
    sRow.Free;
    Result := SList.DelimitedText;
    sList.Free;
  End;
End;


procedure TListViewStringConverter.SetAsString(const Value: String);
Var
  sList,sRow : TStringList;
  i : Integer;
  item : TListItem;

Begin
  sList := TStringList.Create;
  sRow := TStringList.Create;
  Items.Clear;
  Try
  sList.Delimiter := '\';
  sList.DelimitedText := Value;
  sRow.Delimiter := '#';
  For i := 0 To sList.Count-1 do Begin
    sRow.DelimitedText := AnsiDequotedStr (sList[i],'"');
    Item := Items.Add;
    Item.Caption := sRow[0];
    sRow.Delete(0);
    Item.SubItems.Assign(sRow);
  End;
  Finally
    sRow.Free;
    sList.Free;
  End;
End;

procedure TForm1.Button1Click(Sender: TObject);
Var
  s : String;

begin
  s := ListView1.AsString;
  ListView1.AsString := s;
end;

smallsmoker 27. Sep 2008 13:21

Re: Tlistview als String speichern/laden
 
da hab ich mich wohl geirrt :oops:
ihc editiere mal deinen code in den ersten post rein.
mfg smallsmoker

SirThornberry 27. Sep 2008 13:32

Re: Tlistview als String speichern/laden
 
Wenn es darum geht Daten über das Internet zu verschicken würde ich auf XML verzichten da es Bandbreite kostet. Auf QuotedString würde ich verzichten weil es Rechenzeit kostet. Ich würde die Daten einfach Binär verschicken. Also erst länge des nächsten Datensegments danach die Daten.

Bernhard Geyer 27. Sep 2008 14:38

Re: Tlistview als String speichern/laden
 
Zitat:

Zitat von SirThornberry
Wenn es darum geht Daten über das Internet zu verschicken würde ich auf XML verzichten da es Bandbreite kostet.

Einfach XML Zippen und schon ist dieses Argument entkräftet.

Zitat:

Zitat von SirThornberry
...weil es Rechenzeit kostet.

Wenn man bedenkt das ein normaler PC sich zur normalen Zeiten zu 99% Langweilt ...

SirThornberry 28. Sep 2008 12:08

Re: Tlistview als String speichern/laden
 
naja, xml zippen ist kein Argument. schließlich kann auch auch Binärdateien zippen und binn dann auch wieder mit noch weniger Bandbreite dabei.

Codewalker 1. Okt 2008 09:54

Re: Tlistview als String speichern/laden
 
Ab welcher Delphi-Version gibt es diese Class-Helper?

DeddyH 1. Okt 2008 10:07

Re: Tlistview als String speichern/laden
 
2005? Bei 2006 auf jeden Fall.

Bernhard Geyer 1. Okt 2008 10:20

Re: Tlistview als String speichern/laden
 
Zitat:

Zitat von SirThornberry
naja, xml zippen ist kein Argument. schließlich kann auch auch Binärdateien zippen und binn dann auch wieder mit noch weniger Bandbreite dabei.

Der Unterschied zwischen gezippten XML und gezippten Binärdaten ist bei weiten geringer als zwischen ungezippten Versionen.

Zitat:

Zitat von Codewalker
Ab welcher Delphi-Version gibt es diese Class-Helper?

Müsste es nicht D8 sein da sonst VCL.NET nicht funktionieren würde :gruebel:

Codewalker 1. Okt 2008 10:21

Re: Tlistview als String speichern/laden
 
Warum .NET? Gibt es die Class-Helper nur unter Delphi.NET? In Delphi Win32 wäre es echt sinnvoll...

alzaimar 1. Okt 2008 18:52

Re: Tlistview als String speichern/laden
 
Zitat:

Zitat von Codewalker
Warum .NET? Gibt es die Class-Helper nur unter Delphi.NET? In Delphi Win32 wäre es echt sinnvoll...

Die Class Helper gibt es mindestens seit D2006.

Bernhard Geyer 1. Okt 2008 20:12

Re: Tlistview als String speichern/laden
 
Zitat:

Zitat von Codewalker
Warum .NET? Gibt es die Class-Helper nur unter Delphi.NET? In Delphi Win32 wäre es echt sinnvoll...

Sie gibt es wegen .NET aber sie sind auch AFAIK unter Win32 verfügbar.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz