我想从文本文件中获取数据到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个成员数据.
在表单上删除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流入的点,这就是触发bug的原因.
编辑:在阅读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;