- 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. Я тут явно перемудрил
        
        
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 юзать - нагляднее.
там используется только ид, который можно хранить в Data
Ну впрочем, оно может использоваться где-то еще.
Главное что диплом сдан, как говориться: "Бой закончен — война выиграна!"