Вставьте новые строки DBGrid, содержащие соответствующие значения из TreeView, а также Memo - PullRequest
0 голосов
/ 09 июля 2020

У меня есть TreeView, показывающий расположение файла и последующие папки внутри него:

enter image description here

I then have a Memo showing some drive letters:

введите описание изображения здесь

Затем у меня есть DBGrid с двумя полями с именами: location и usb

То, что я пытаюсь сделать:

  • Получите первое имя Node под RootNode, а также первое line в Memo и добавьте их к первому row в Grid - Node имя под field location и Memo line под field usb.

  • Продолжайте делать то же самое с остальными (Node # 2 имя под RootNode и Memo line # 2 находится под DBGrid row # 2 местоположением и row # 2 usb и так далее ..), пока он не достигнет последней строки на Memo.

  • Затем продолжите вниз по TreeView Node, добавляя Node имя к field с именем location, но начиная с первой строки в Memo для соответствующего 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;

Это явно нежелательно, поскольку он вводит отдельные строки - не то, что я описываю выше.

Потом попробовал что-то вроде e это:

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 строки, содержащие буквы дисков по порядку, но с тем же именем узла, для каждого узла. Наверное, это тоже глупый подход, я никогда полностью не понимал циклы, они обычно меня сбивают с толку.

Как я могу получить желаемый результат?

1 Ответ

2 голосов
/ 09 июля 2020

Если я вас правильно понял, я думаю, что это должно делать то, что вы хотите:

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 l oop для итерации TreeView.Items как и ваш код, и одновременно циклически перебирает строки Memo2.

Возможно, вы захотите сделать

ClientDataSet1.IndexFieldNames := 'USB;Location';

, чтобы убедиться, что строки находятся в правильном порядке.

Кстати, imo InsertRecord намного аккуратнее и лаконичнее, чем Append, FieldByName x2, Post.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...