1. Pascal / Говнокод #5846

    +98

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 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 Марта 2011

    Комментарии (5) RSS

    • Изначально код был ещё говнокодистей. Вместо New(MyNodeParamPtr) использовался динамический массив, задолбался глюки отлавливать. В настоящее время всё работает, хоть и на костылях )
      Ответить
    • 1. пробегание по квере (строки 40-47):
      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 юзать - нагляднее.
      Ответить
    • еще не понятно зачем нужен MyNodeParamPtr?
      там используется только ид, который можно хранить в Data
      Ну впрочем, оно может использоваться где-то еще.
      Ответить
      • Используется для хранения типа ветки (здание, этаж, комната, ...) и идентификатора объекта. Впоследствие они будут использованы для фильтрации результатов.
        Главное что диплом сдан, как говориться: "Бой закончен — война выиграна!"
        Ответить

    Добавить комментарий