如何在列表视图中显示文本文件中的数据?

时间:2009-11-03 17:10:09

标签: delphi listview

我想从文本文件中获取数据到listview。

示例文本文件包含:

0th member
first=XXXXXXXX
second=YYYYY000
1
first=XXXXXXX1
second=YYY1111
2
first=XXXXXX22
second=YYYY2222
3
first=XXXXXX33
second=YYYY333
4
first=XXXXX4444
second=YYY4444

就像我希望首先获得listview.items.caption的值,然后获得sunitems [0]的第二个值。 我想在listview行中获得类似的所有信息。

我该怎么做?我玩了stringlist.values,但我在所有行中都获得了第0个成员数据。

1 个答案:

答案 0 :(得分:5)

在表单上删除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

如果您正在寻找的更像是:

    0th member          XXXXX                YYYYY
    1                   ZZZZZ                ZZZZZ

然后将SubItems()调用更改为:

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

这只从两个子列的文本值中提取等于(=)符号后的部分。

这应该足以让你开始,我想。

请注意,当ViewStyle设置为vsReport并且您在IDE中未定义任何项目时,Delphi 2010存在TListView的错误。当您尝试运行应用程序时,由于未定义的项目,您会收到流读取错误。您可以通过在设计时创建具有无意义值的虚拟项来解决此问题,并在FormShow()事件中添加以下作为第一个可执行行:

    ListView1.Items.Clear;

这超出了DFM流入的点,这就是触发错误的原因。

编辑:在阅读OP的评论后。要跳过空白行:

  // 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;