插入包含来自 TreeView 和 Memo 的相应值的新 DBGrid 行

Insert new DBGrid rows containing corresponding values from a TreeView as well as a Memo

我有一个 TreeView 显示 文件位置 和随后的 文件夹 里面:

然后我有一个 Memo 显示一些 驱动器号 :

然后我有一个 DBGrid,其中有两个字段名为:locationusb

我想做什么:

对于上面的示例,网格中行的最终结果为:

location                usb
---------------------------
New Folder              G
New Folder - Copy       H
New Folder - Copy (10)  I
New Folder - Copy (11)  J
New Folder - Copy (12)  G
New Folder - Copy (13)  H
New Folder - Copy (14)  I
New Folder - Copy (15)  J
New Folder - Copy (2)   G
New Folder - Copy (3)   H
New Folder - Copy (4)   I
New Folder - Copy (5)   J
New Folder - Copy (6)   G
New Folder - Copy (7)   H
New Folder - Copy (8)   I
New Folder - Copy (9)   J

到目前为止的代码:

with ClientDataSet1 do
begin
for i := 0 to Memo2.Lines.Count -1 do
 begin
 Append;
 FieldByName('usb').AsString := Memo2.Lines[i];
 Post;
 end;
end;

with ClientDataSet1 do
begin
for i := 1 to TreeView1.Items.Count -1 do
 begin
 Append;
 FieldByName('location').AsString := TreeView1.Items.Item[i].Text;
 Post;
 end;
end;

这显然不是我们想要的,因为它引入了单独的行——这不是我上面描述的。

然后尝试了这样的事情:

with ClientDataSet1 do
 begin
 for i := 1 to TreeView1.Items.Count -1 do 
 for i2 := 0 to Memo2.Lines.Count -1 do
  begin
  Append;
  FieldByName('location').AsString := TreeView1.Items.Item[i].Text;
  FieldByName('usb').AsString := Memo2.Lines[i2];
  Post;
 end;
end;

但这显然只是为每个节点添加了 4 行,其中包含按顺序但具有相同节点名称的驱动器号。可能也是一种愚蠢的处理方式,我从来没有完全理解循环,它们通常让我很困惑。

怎样才能得到想要的结果?

如果我没有理解错的话,我认为这应该可以满足您的要求:

procedure TForm1.FormCreate(Sender: TObject);
var
  i : Integer;
  Line : Integer;

  function NextLine(Line : Integer) : Integer;
  begin
    Result := Line;
    inc(Result);
    if Result = Memo2.Lines.Count then
      Result := 0;
  end;
begin
  ClientDataSet1.CreateDataSet;

  Line := 0;
  for i := 0 to TreeView1.Items.Count - 1 do begin
    ClientDataSet1.InsertRecord([Memo2.Lines[Line], TreeView1.Items[i].Text]);
    Line := NextLine(Line);
  end;
end;

如您所见,它使用 for 循环来迭代 TreeView.Items,就像您的代码所做的那样,同时循环遍历 Memo2 的行。

可以想象,你可能想要做

ClientDataSet1.IndexFieldNames := 'USB;Location';

确保行的顺序正确。

顺便说一句,imo InsertRecord 比 Append、FieldByName x2 更整洁、更简洁,Post。