Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.13;
Скачать: CL | DM;

Вниз

К вопросу о визуальном представлении древовидной структуры данных   Найти похожие ветки 

 
KIR ©   (2003-01-28 20:39) [0]

Народ, как хранить ссабж ворде ясно:
поля
ID,
ParentID,
MyData

У первого уровня ParentID = null.

Но вот беда: в свое время ятак и не успел нормально освоить рекурсию, а вот теперь столкнулся с тем, что древовидную структуру данных надо отобразить с помощью TreeView. Ясно, что необходима рекурсия, а вот как сделать не соображу, хэлпп плз...


 
jack128 ©   (2003-01-28 21:06) [1]

Не обязательно рекурсией
можно заполнять дерево динамически
на ibase.ru есть статья на эту тему
если хочешь могу выслать

а на счет рекурсии примерно так если разберешся ;)
(id=primary key; name = название улицы, области;
parentid = ссылка на родителя; id хранится в TTreeNode.Data)

procedure TdmMain.LoadAddressToTreeView(TreeView : TTreeView);
var Transaction : TIBTransaction;
ParentId : integer;
procedure LoadChildrenToAddressNode(ParentNode : TTreeNode);
var t : TIBTransaction;
ParentId : string;
q : TIBQuery;
Node : TTreeNode;
begin
if ParentNode = nil then
ParentId := "is null"
else
ParentId := "= " + IntToStr(Integer(ParentNode.Data));
q := TIBQuery.Create(nil);
q.SQL.Text := "select id, name from addresses where parentid "+ParentID;
q.Transaction := Transaction;
try
if not Transaction.InTransaction then Transaction.StartTransaction;
q.Open;
q.First;
while not q.Eof do begin
Node := TreeView.Items.AddChildObject(ParentNode,
q.FieldByName("name").AsString,
Pointer(q.FieldByName("id").AsInteger));
LoadChildrenToAddressNode(Node);
q.Next;
end;
q.Close;
finally
Q.Free;
end;
end; // LoadChildrenToAddressNode
begin
TreeView.Items.Clear;
Transaction := TIBTransaction.Create(nil);
try
Transaction.DefaultDatabase := dbBase;
Transaction.Params.Text := SReadTransactionParams;
Transaction.StartTransaction;
try
LoadChildrenToAddressNode(nil);
Transaction.Commit;
except
Transaction.Rollback;
end;
finally
Transaction.Free;
end;
end; // LoadAddressToTreeView


 
KIR ©   (2003-01-29 00:54) [2]

Вроде разобрался с рекурсией. Все работает.
Если я правильно понял, то вся "фишка" рекурсии в данном случае заключается в том, что каждый раз создается новый Query
(
q := TIBQuery.Create(nil);
q.SQL.Text := "select id, name from addresses where parentid "+ParentID;
q.Transaction := Transaction;

)
Верно?


 
Александр Спелицин ©   (2003-01-29 11:39) [3]

Если нужно просто отобразить древовидную стуктуру в виде обычного дерева, то никакой рекурсии не надо.
На "Королевстве Delphi" в разделе "Hello, World" есть статья DBTreeView своими руками.



Страницы: 1 вся ветка

Текущий архив: 2003.02.13;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.013 c
1-38275
First_May
2003-02-05 10:17
2003.02.13
ICQ...


1-38298
Сергей
2003-02-05 22:18
2003.02.13
Перерисовка формы


1-38382
Vitus
2003-02-03 18:46
2003.02.13
Как программно сделать элемент в TreeView выбранным?


1-38219
Zirus
2003-02-05 09:04
2003.02.13
imagelist


1-38329
de
2003-02-03 17:02
2003.02.13
Почему появляется Warning?