1

私はDelphi2010を使用していて、インターネットを検索していくつかの例を見つけましたが、どちらも機能しませんでした。2010とユニコードのために使用している可能性がありますか?ともかく......

TListViewのファイルとの間で単純な保存とロードを行うための2つのルーチンを探しています。各列の文字列値を保存することにのみ関心があります。つまり、キャプションとサブアイテムです。レイアウトやオブジェクトを保存することに興味はありません。

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

2 に答える 2

6

これは非常に粗雑なものです。かなり制限されたタブ区切りのテキスト形式を使用します。コンテンツにインライン タブ文字を含めることはできません。また、ロード機能にはエラー チェックを一切実装していません。私はあなたがそれを追加できると確信しています。

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;
于 2013-02-25T18:23:55.047 に答える
0

TStringList と名前/値のペアを使用して、独自のソリューションを思いつきました。これは問題なく動作するようです。アイテムのキャプションを名前に保存し、すべてのサブ列を値に保存してから、個々のサブアイテムの値を解析するだけです

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;
于 2013-02-25T21:11:11.210 に答える