Глава 12. РАЗРАБОТКА ОКОННОГО ИНТЕРФЕЙСА 
Дерево рубрик TRubricTreeGrid 
Этот компонент рекомендуется использовать в тех случаях, когда необходимо 
в процессе работы программы  отображать в окне дерево рубрик и 
осуществлять навигацию по рубрикам. Кроме навигации компонент позволяет создавать 
новые рубрики, удалять рубрики или изменять их свойства. 
Компонент является потомком класса деревьев TDCCustomTreeGrid и наследует большинство его 
свойств, о которых мы говорить здесь не будем. 
Ниже перечислены дополнительные свойства и методы, превращающие это дерево 
в дерево рубрик. 
 
  
    | Свойства Published | 
      | 
   
  
    | Transaction | 
    Транзакция. Можно использовать ReadOnly транзакцию | 
   
 
 
  
    | Свойства Public | 
    тип | 
    readonly | 
      | 
   
  
    | Root_Id | 
    integer | 
    readonly | 
    Идентификатор корневой рубрики | 
   
  
    | ExpandedRubrics | 
    string | 
     | 
    Строка идентификаторов всех распахнутых рубрик, перечисленных через точку с 
запятой. Используется для запоминания степени распахнутости рубрик. | 
   
  
    | SelectedRubric_id | 
    integer | 
     | 
    Идентификатор текущей рубрики. Присвоение этому свойству значения раскрывает нужную 
ветвь, отображает соответствующую рубрику и делает ее текущей. | 
   
 
 
  
    | Методы | 
      | 
   
  
    | procedure Open(Root_ID: integer) | 
    Загружает корневую рубрику. Этот метод всегда следует вызывать при 
использовании этого компонента первым.
Если в качестве параметра 
передать 0, то будут загружены все корневые рубрики. | 
   
  
    | procedure AddRubric | 
    Вызывает стандартный диалог добавления рубрики | 
   
  
    | procedure AddChildRubric | 
    Вызывает стандартный диалог добавления подрубрики | 
   
  
    | procedure AddFilterGroup | 
    Вызывает стандартный диалог добавления подгруппы фильтров. | 
   
  
    | procedure EditRubric | 
    Вызывает стандартный диалог редактирования свойств рубрики | 
   
  
    | procedure DeleteSelectedRubrics | 
    Вызывает удаление выбранных рубрик | 
   
  
    | procedure RefreshNode(Node: TRubricNode) | 
    Освежает указанный пункт дерева | 
   
  
    | function FindInTreeById(Rubric_Id: integer): TRubricNode | 
    Ищет пункт дерева по идентификатору рубрики | 
   
  
    | function FindNodeById(ParentNode: TDCTreeNode; id: integer
): TRubricNode | 
    Ищет пункт дерева по идентификатору рубрики внутри определенного родителя | 
   
  
    | function GetRubric_ID(Node: TDCTreeNode): integer | 
    возвращает идентификатор рубрики указанного пункта дерева. | 
   
  
    | function GetClass_ID(Node: TDCTreeNode): integer | 
    возвращает идентификатор класса справочника указанного пункта дерева. | 
   
 
 
Использовать компонент TRubricTreeGrid несложно. Достаточно в Инспекторе объектов указать 
транзакцию. Затем в программе следует вызвать метод Open(), 
передав в него ID корневой рубрики. Проще всего это 
сделать в событии OnCreate формы: 
procedure TForm1.FormCreate(Sender: TObject);
begin
  RubricTreeGrid1.Open(0); // 0 - загружаем все дерево рубрикаторов.
end;
 
Если в дереве выбирается какой-то пункт, узнать 
идентификаторы класса и рубрики выбранного пункта можно в событии OnChange 
дерева: 
procedure TForm1.RubricTreeGrid1Change(Sender: TObject; Node: TDCTreeNode);
begin
  Label1.Caption := IntToStr(RubricTreeGrid1.GetRubric_ID(Node)); //отображаем ID рубрики
  Label2.Caption := IntToStr(RubricTreeGrid1.GetClass_ID(Node)); //отображаем ID класса
end;
 
Как работает этот пример, показано на рисунках: 
 
 
 
 
 
Функция GetFilterExpression позволяет получить условие фильтрации в виде куска SQL
-кода, которое затем используется для управления справочниками в 
самой системе Allegro. Так что для эксперимента можно добавить 
к форме компонент TRefQuery, установить его свойство Transaction, 
добавить на форму TDataSource и TDBGrid, соединить это все
, а в обработчик OnChange компонента дерева вписать такой код
: 
procedure TForm1.RubricTreeGrid1Change(Sender: TObject; Node: TDCTreeNode);
var
  rubric_class_id: integer;
begin
  RefQuery1.Close;
  RefQuery1.FilterExpression := GetFilterExpression(RubricTreeGrid1.GetRubric_ID(Node),
    MainConnection.MainTransaction, nil, rubric_class_id);
  RefQuery1.Class_Id := rubric_class_id;
  RefQuery1.Open;
end;
 
 
               |