我想从文本文件中获取数据到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个成员数据。
答案 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;