简单的TListView保存和加载文件(仅保存列字符串值)

时间:2013-02-25 18:07:41

标签: delphi delphi-2010

我正在使用Delphi 2010,我搜索了互联网并找到了一些例子,但它们都没有用。我使用它可能是因为2010年和unicode?无论如何......

我正在寻找两个例程来对TListView进行简单的保存和加载。 我只对保存每列中的字符串值感兴趣。即标题和子项目。我对保存布局或任何对象不感兴趣。

procedure SaveToFile(const FileName: string);
procedure LoadFromFile(const FileName: string);

2 个答案:

答案 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;