插入包含来自 TreeView 和 Memo 的相应值的新 DBGrid 行
Insert new DBGrid rows containing corresponding values from a TreeView as well as a Memo
我有一个 TreeView
显示 文件位置 和随后的 文件夹 里面:
然后我有一个 Memo
显示一些 驱动器号 :
然后我有一个 DBGrid
,其中有两个字段名为:location
和 usb
我想做什么:
获取RootNode
下的第一个Node
和Memo
中的第一个line
,并将它们添加到第一个[= Grid
中的 22=] - field location
下的 Node
名称和 field usb
下的 Memo line
。
继续对其余部分执行相同操作(Node
#2 name under RootNode
and Memo line
#2 goes under DBGrid row
#2 location和 row
#2 usb 等等..)直到它到达 Memo
.
的最后一行
然后继续向下 TreeView Node
添加 Node
名称到 field
named location
但从 [=14= 的第一行开始] 对应的 field
命名为 usb
.
对于上面的示例,网格中行的最终结果为:
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。
我有一个 TreeView
显示 文件位置 和随后的 文件夹 里面:
然后我有一个 Memo
显示一些 驱动器号 :
然后我有一个 DBGrid
,其中有两个字段名为:location
和 usb
我想做什么:
获取
RootNode
下的第一个Node
和Memo
中的第一个line
,并将它们添加到第一个[=Grid
中的 22=] -field location
下的Node
名称和field usb
下的Memo line
。继续对其余部分执行相同操作(
的最后一行Node
#2 name underRootNode
andMemo line
#2 goes underDBGrid row
#2 location和row
#2 usb 等等..)直到它到达Memo
.然后继续向下
TreeView Node
添加Node
名称到field
namedlocation
但从 [=14= 的第一行开始] 对应的field
命名为usb
.
对于上面的示例,网格中行的最终结果为:
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。