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:
Beispielaufruf:
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;
Delphi-Quellcode:
Die Anzahl der Spalten ist nicht relevant,
procedure TForm1.Button1Click(Sender: TObject);
Var s : String; begin s := ListView1.AsString; ListView1.AsString := s; end; Es werden alle Zeilen (ohne Überschriften) gespeichert und geladen. mfg smallsmoker p.s.: Danke an alzaimar für den Code. |
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. |
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.
|
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. |
Re: Tlistview als String speichern/laden
Hallo Nick, warum nicht via Stream?
|
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" |
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 :) |
Re: Tlistview als String speichern/laden
Zitat:
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; |
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 |
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. |
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