Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:13 Uhr.
Seite 1 von 2  1 2      

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