我正在使用Delphi 2010,我搜索了互联网并找到了一些例子,但它们都没有用。我使用它可能是因为2010年和unicode?无论如何......
我正在寻找两个例程来对TListView进行简单的保存和加载。 我只对保存每列中的字符串值感兴趣。即标题和子项目。我对保存布局或任何对象不感兴趣。
procedure SaveToFile(const FileName: string);
procedure LoadFromFile(const FileName: string);
答案 0 :(得分:5)
这是非常粗糙的东西。它使用相当有限的制表符分隔文本格式。不允许内容包含内联选项卡字符。我还没有对加载功能进行任何错误检查。我相信你可以加上它。
uses
ComCtrls, Types, 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;
答案 1 :(得分:0)
我提出了自己的解决方案,使用TStringList和Name / Value对,这似乎工作得很好。我将Item标题存储在名称中,并将值存储在所有子列中,然后我只解析各个子项的值
procedure LoadFromFile(AListView: TListView; AFileName: string);
var
I : Integer;
SL: TStringList;
Item: TListItem;
Col0, Col1, Col2, Col3, Col4, Col5: String;
begin
SL:= TStringList.Create;
try
SL.LoadFromFile(AFileName);
AListView.Items.BeginUpdate;
AListView.Items.Clear;
for I:= 0 to SL.Count - 1 do
begin
Item:= AlistView.Items.Add;
Item.Caption:= SL.Names[I];
parseValue(SL.ValueFromIndex[I], Col0, Col1, Col2, Col3, Col4, Col5);
Item.SubItems.Add(Col0);
Item.SubItems.Add(Col1);
Item.SubItems.Add(Col2);
Item.SubItems.Add(Col3);
Item.SubItems.Add(Col4);
Item.SubItems.Add(Col5);
end;
AListView.Items.EndUpdate;
finally
SL.Free;
end;
end;
procedure SaveToFile(AListView: TListView; AFileName: string);
var
I: Integer;
SL: TStringList;
begin
SL:= TStringList.Create;
for I := 0 to AListView.Items.Count - 1 do
begin
SL.Add(AlistView.Items[I].Caption + '=' +
AlistView.Items[I].SubItems[0] + ',' +
AlistView.Items[I].SubItems[1] + ',' +
AlistView.Items[I].SubItems[2] + ',' +
AlistView.Items[I].SubItems[3] + ',' +
AlistView.Items[I].SubItems[4] + ',' +
AlistView.Items[I].SubItems[5])
end;
try
SL.SaveToFile(AFileName);
finally
SL.Free;
end;
end;
procedure parseValue(AValue: String; var Col0, Col1, Col2, Col3, Col4, Col5: String);
var
I: Integer;
S: String;
L: TStringList;
begin
//create a temporary list to store the data parts in
L:= TStringList.Create;
try
//iterate through the length of the string
for I:= 1 to length(AValue) do
begin
//if the char is not a comma, append it to S
if AValue[I] <> ',' then
S:= S + AValue[I]
else
// if char is a comma, add S to temporary list and reset S
begin
L.Add(S);
S:= '';
end;
end;
//add the last string to temporary list
L.Add(S);
//assign the items in temporary list to variables to be passed back
Col0:= L[0];
Col1:= L[1];
Col2:= L[2];
Col3:= L[3];
Col4:= L[4];
Col5:= L[5];
finally
L.Free;
end;
end;