我想将数据从文本文件获取到列表视图。

一个示例文本文件包含:

第0名成员
首先= XXXXXXXX
秒= YYYYY000
1个
第一= XXXXXXX1
秒= YYY1111
2
首先= XXXXXX22
秒= YYYY2222
3
首先= XXXXXX33
秒= YYYY333
4
首先= XXXXX4444
秒= YYY4444


像那样,我想首先获取listview.items.caption的值,然后获取sunitems [0]的值。
我想在列表视图行中获取所有类似信息。

我怎样才能做到这一点?我使用stringlist.values进行游戏,但是在所有行中都获得了第0个成员数据。

最佳答案

在窗体上放置一个TListView,并将其样式设置为vsList。创建要显示的三列(右键单击ListView,然后从弹出菜单中选择“列编辑器”)。

将以下内容添加到FormShow()事件中(或您想要的任何地方):

procedure TForm1.FormShow(Sender: TObject);
var
  SL: TStringList;
  i: Integer;
begin
  SL := TStringList.Create;
  try
    SL.LoadFromFile(YourFileNameHere);
    i := 0;
    while i < SL.Count do
    begin
      with ListView1.Items.Add do
      begin
        Caption := SL[i];
        SubItems.Add(SL[i + 1]);
        SubItems.Add(SL[i + 2]);
      end;
      Inc(i, 3);
    end;
  finally
    SL.Free;
  end;
end;


请注意,这假设您要寻找的是这样的东西:

    0th member          first=XXXXX          second=YYYYY
    1                   first=ZZZZZ          second=ZZZZZ

If what you're looking for is more like:

    0th member          XXXXX                YYYYY
    1                   ZZZZZ                ZZZZZ

Then change the SubItems() calls to something like this:

  SubItems.Add(Copy(SL[i + 1], Pos('=', SL[i + 1]) + 1, MaxInt);
  SubItems.Add(Copy(SL[i + 2], Pos('=', SL[i + 2]) + 1, MaxInt);

This extracts just the part after the equals (=) sign from the two subcolumn's text values.

That should be enough to get you started, I think.

Note that Delphi 2010 has a bug with the TListView when the ViewStyle is set to vsReport and you have defined no items in the IDE. You get a stream read error when you try and run your app because of the undefined items. You can work around this by creating a dummy item with a nonsense value at design time, and in your FormShow() event add the following as the first executable line:

    ListView1.Items.Clear;

This gets past the point that the DFM is streamed in, which is what triggers the bug.

EDIT: After reading comments by OP. To skip blank lines:

  // To skip entire group if starting line is blank
  while i < SL.Count - 1 do
  begin
    if SL[i] <> '' then
    begin
      with ListView1.Items.Add do
        // just like before
    end
    Inc(i, 3);
  end;


要仅跳过子项目中的空白行:

  while i < SL.Count - 1 do
  begin
    with ListView1.Items.Add do
    begin
      Caption := SL[i];
      if SL[i + 1] <> '' then
        SubItems.Add(SL[i + 1]);
      if SL[i + 2] <> '' then
        SubItems.Add(SL[i + 2];
    end;
    Inc(i, 3);
  end;

10-06 12:43
查看更多