- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
Procedure TreeNodeBuilding(Tree: TTreeView; Query: TZQuery; DestinationNode: TTreeNode;
IdColumn, NameColumn, FilterColumn, TableType: String; Filtering:Boolean; ImageIndex:Integer);
//-------------------------------------------------//
Function AddOrNot:Boolean; //Фильтрация по ИД
var
Add: Boolean;
begin
Add:=False;
If Filtering=False then Add:=True else
begin
if DestinationNode=nil then Add:=True else
begin
MyNodeParamPtr:=DestinationNode.Data;
if MyNodeParamPtr^.id=Query.FieldValues[FilterColumn] then Add:=True;
end;
end;
Result:=Add;
end;
//-------------------------------------------------//
Procedure AddTreeNodeToViewer; //Добавление ветки
var
MyNode: TTreeNode;
begin
//Добавляем новую запись в массив и заполняем её
// Inc(ArrMyNodeParamLength);
// SetLength(ArrMyNodeParam, ArrMyNodeParamLength);
New(MyNodeParamPtr);
MyNodeParamPtr^.id:=Query.FieldValues[IdColumn];
MyNodeParamPtr^.table:=TableType;
//Добавляем новый узел дерева и указатель на соотв запись
if DestinationNode=nil then
MyNode:=Tree.Items.AddObject(DestinationNode, VarToStr(Query.FieldValues[NameColumn]), MyNodeParamPtr)
else MyNode:=Tree.Items.AddChildObject(DestinationNode, VarToStr(Query.FieldValues[NameColumn]), MyNodeParamPtr);
MyNode.ImageIndex:=ImageIndex;
MyNode.SelectedIndex:=ImageIndex;
end;
//-------------------------------------------------//
begin
//
Query.First;
if AddOrNot=True then AddTreeNodeToViewer;
Query.Next;
while not Query.Eof do
begin
if AddOrNot=True then AddTreeNodeToViewer;
Query.Next;
end;
end;
Добавление ветки в TreeView. Я тут явно перемудрил
nikitasnv 02.03.2011 13:14 # 0
ctm 02.03.2011 16:41 # 0
Query.First;
while not Query.Eof do begin
if AddOrNot then AddTreeNodeToViewer;
Query.Next;
end;
2. формирование дерева в 1 проход из реляционной таблицы - не есть гуд.
может отказаться так, что родительская запись будет прочтена позже дочерней. Расставить order by позволяют это обойти не во всех случаях.
Если в данном коде DestinationNode - просто родительская нода для добавления линейного списка, вопрос отпадает.
3. строки 31-33: if не нужен - достаточно ветки else
4. AddOrNot - локальная переменная не нужна, можно сразу Result юзать - нагляднее.
bugmenot 02.03.2011 16:46 # 0
ctm 02.03.2011 16:47 # 0
там используется только ид, который можно хранить в Data
Ну впрочем, оно может использоваться где-то еще.
nikitasnv 02.03.2011 18:43 # 0
Главное что диплом сдан, как говориться: "Бой закончен — война выиграна!"