Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何在listview中显示文本文件中的数据?_Delphi_Listview - Fatal编程技术网

Delphi 如何在listview中显示文本文件中的数据?

Delphi 如何在listview中显示文本文件中的数据?,delphi,listview,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 第0名成员 第一个=XXXXXXXX 秒=YYYY 000 1. 第一个=XXXXXXX 1

我想将数据从文本文件获取到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 第0名成员 第一个=XXXXXXXX 秒=YYYY 000 1. 第一个=XXXXXXX 1 秒=YYY1111 2. 第一个=XXXXXX 22 秒=yyy2222 3. 第一个=XXXXXX 33 秒=yyy333 4. 第一个=XXXXX 4444 秒=yyyy4444 像这样,我希望获得listview.items.caption的第一个值,以及sunitems[0]的第二个值。 我想在listview行中获得所有类似的信息


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

在表单上放置一个TListView,并将其样式设置为vsList。创建要显示的三列(右键单击ListView并从弹出菜单中选择columns Editor)

将以下内容添加到FormShow()事件中(或您希望添加到的任何位置):

程序TForm1.FormShow(发送方:TObject);
变量
SL:TStringList;
i:整数;
开始
SL:=TStringList.Create;
尝试
SL.LoadFromFile(此处为您的文件名);
i:=0;
当我数的时候
开始
使用ListView1.Items.Add do
开始
标题:=SL[i];
增加(SL[i+1]);
增加(SL[i+2]);
结束;
公司(i,3),;
结束;
最后
SL.免费;
结束;
结束;
请注意,这假设您要查找的内容如下:

0th member first=XXXXX second=YYYYY 1 first=ZZZZZ second=ZZZZZ SubItems.Add(Copy(SL[i + 1], Pos('=', SL[i + 1]) + 1, MaxInt); SubItems.Add(Copy(SL[i + 2], Pos('=', SL[i + 2]) + 1, MaxInt); 第0个成员第一个=XXXXX第二个=YYYY 1第一个=ZZZZZ第二个=ZZZZZ 如果您正在寻找的更像:

0th member XXXXX YYYYY 1 ZZZZZ ZZZZZ 第0个成员XXXXX YYYY 1 ZZZZZ ZZZZZ 然后将SubItems()调用更改为如下内容:

0th member first=XXXXX second=YYYYY 1 first=ZZZZZ second=ZZZZZ SubItems.Add(Copy(SL[i + 1], Pos('=', SL[i + 1]) + 1, MaxInt); SubItems.Add(Copy(SL[i + 2], Pos('=', SL[i + 2]) + 1, MaxInt); 添加(复制(SL[i+1],位置('=',SL[i+1])+1,MaxInt); 添加(复制(SL[i+2],位置('=',SL[i+2])+1,最大值); 这将从两个子列的文本值中仅提取等号(=)后面的部分

我想这足够让你开始了

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

ListView1.Items.Clear; 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;
而我
在表单上放置一个TListView,并将其样式设置为vsList。创建要显示的三列(右键单击ListView并从弹出菜单中选择columns Editor)

将以下内容添加到FormShow()事件中(或您希望添加到的任何位置):

程序TForm1.FormShow(发送方:TObject);
变量
SL:TStringList;
i:整数;
开始
SL:=TStringList.Create;
尝试
SL.LoadFromFile(此处为您的文件名);
i:=0;
当我数的时候
开始
使用ListView1.Items.Add do
开始
标题:=SL[i];
增加(SL[i+1]);
增加(SL[i+2]);
结束;
公司(i,3),;
结束;
最后
SL.免费;
结束;
结束;
请注意,这假设您要查找的内容如下:

0th member first=XXXXX second=YYYYY 1 first=ZZZZZ second=ZZZZZ SubItems.Add(Copy(SL[i + 1], Pos('=', SL[i + 1]) + 1, MaxInt); SubItems.Add(Copy(SL[i + 2], Pos('=', SL[i + 2]) + 1, MaxInt); 第0个成员第一个=XXXXX第二个=YYYY 1第一个=ZZZZZ第二个=ZZZZZ 如果您正在寻找的更像:

0th member XXXXX YYYYY 1 ZZZZZ ZZZZZ 第0个成员XXXXX YYYY 1 ZZZZZ ZZZZZ 然后将SubItems()调用更改为如下内容:

0th member first=XXXXX second=YYYYY 1 first=ZZZZZ second=ZZZZZ SubItems.Add(Copy(SL[i + 1], Pos('=', SL[i + 1]) + 1, MaxInt); SubItems.Add(Copy(SL[i + 2], Pos('=', SL[i + 2]) + 1, MaxInt); 添加(复制(SL[i+1],位置('=',SL[i+1])+1,MaxInt); 添加(复制(SL[i+2],位置('=',SL[i+2])+1,最大值); 这将从两个子列的文本值中仅提取等号(=)后面的部分

我想这足够让你开始了

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

ListView1.Items.Clear; 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;
而我
谢谢您的回复,先生,我需要与第一行完全相同的标题:XXXXXXXX子项YYYY 000第二行标题:XXXXXX 11子项:YYYY11111;第三行------(等),我试过使用u r方法,先生,如果所有数据逐行显示,效果很好。在我的文本文件中,所有数据不是逐行显示的。有时我使用enter,那么我在listview中会得到空字段。我有可能得到数据吗