1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

Создать TreeView в виде бинарного дерева

Тема в разделе "Программирование", создана пользователем Kot.85, 23.05.08.

  1. Kot.85

    Kot.85 Активный участник

    4.761
    8
    ситуация такая, нужно создать TreeView в виде бинарного дерева, извесно количество листьев и количество узлов, проблема в том, что при создании новой ветки индексы смещаются, тока вот как хз, и соответственно вылетает ошибка. прога на билдере 6. вобщем i need help.
     
  2. A380

    A380 Активный участник

    851
    0
    а поподробнее?? у вас вопрос типа "у меня тут вот это ну короче оно вот тут так кааааааааак, нужна помощь, ага"
    вы бы сформулировали постановку, привели код, привели ошибку хотябы что бы понять что у вас там творица и как вам можно помочь.
    или вам просто нужно решение этой задачи? дык сформулируйте её хотябы, задачу эту.

    или просто вам нужен код построения дерева в TreeView с неограниченноой вложенностью?
     
    Последнее редактирование: 23.05.08
  3. Kot.85

    Kot.85 Активный участник

    4.761
    8
    это надо

    добавлено через 22 минуты
    точнее даже так: построение бинарного дерева в TreeView с заданной вложенностью.
     
  4. A380

    A380 Активный участник

    851
    0
    запоздало но все же =)
    основные процедуры и функции для построения
    дерево содержится в таблице типа:
    id идентификатор узда
    id_parent идентификатор узла родителя
    name прочие свойства узла


    ...
    cut
    ...
    type
    P_Description = ^TDescriptionTree;
    TDescriptionTree=record //Описание узла дерева свойств и их значений
    id_property : integer; // номер узла
    id_prop_parent : integer; // номер родителя
    id_type_obj : integer; // номер типа объекта
    prop_name : string; //имя свойства
    id_type_prop : integer; // номер типа свойства
    id_value : integer; // номер значения свойства
    field_name : string; //наименование поля
    table_name : string; //наименование таблицы значений
    value : variant; //значение свойства
    Q_Temp : TADOQuery; //для справочника
    DS_Temp : TDataSource; //источник для выборки
    end;

    ...
    cut
    ...

    procedure LoadTV1;
    procedure Buld_for_node(id_parent:integer;ParentNode:TTreeNode);
    procedure TVExpanded(Sender: TObject; Node: TTreeNode);
    private
    { Private declarations }
    public
    NowNode,NewNode:TTreeNode;
    NowPtr:P_Description;
    end;

    ...
    cut
    ...
    procedure TF_DETAIL_OBJECTS.LoadTV1;
    begin
    TV.Items.BeginUpdate;
    TV.Items.Clear;
    NowNode:=nil;
    with TempTVQuery,SQL do
    begin
    Close;
    Open;
    end;

    while not TempTVQuery.Eof do
    begin
    New(NowPtr);
    NowPtr^.id_property := TempTVQuery.FieldByName('id_property').AsInteger;
    NowPtr^.id_prop_parent := TempTVQuery.FieldByName('id_prop_parent').AsInteger;
    NowPtr^.id_type_obj := TempTVQuery.FieldByName('id_type_obj').AsInteger;
    NowPtr^.prop_name := TempTVQuery.FieldByName('prop_name').AsString;
    NowPtr^.id_type_prop := TempTVQuery.FieldByName('id_type_prop').AsInteger;
    NowPtr^.id_value := TempTVQuery.FieldByName('id_value').AsInteger;


    NowNode:=TV.Items.Add(nil,trim(TempTVQuery.FieldByName('prop_name').AsString));
    TV.Selected:=NowNode;
    NowNode.Data:=NowPtr;
    Buld_for_node(TempTVQuery.FieldByName('id_property').AsInteger,NowNode);
    TempTVQuery.Next;
    end;
    TempTVQuery.close;
    TV.FullExpand;
    TV.Selected:=TV.Items.GetFirstNode;
    TV.Items.EndUpdate;
    end;

    procedure TF_DETAIL_OBJECTS.Buld_for_node(id_parent:integer;ParentNode:TTreeNode);
    var
    table_name:string;
    begin
    with TempTVChildQuery,SQL do
    begin
    Close;
    Clear;
    Add('select lp.id as id_property, lp.id_parent as id_prop_parent, lt.id as id_type_obj,'+
    ' lp.name as prop_name,lp.id_type_value_property as id_type_prop,'+
    ' lidv.id_value from'+
    ' ((list_property_type_objects lp join sp_type_gas_network_objects lt on'+
    ' lp.id_type_gaz_network_objects=lt.id) join gaz_network_objects as obj on'+
    ' lt.id=obj.type_obj)left join list_id_property_value as lidv on'+
    ' obj.id=lidv.id_gaz_network_objects and lt.id=lidv.id_type_objects and'+
    ' lp.id=lidv.id_property where obj.id=:var1 and lp.id_parent=:var2');
    Parameters[0].Value := F_LIST_GAZNETWORK_OBJECTS.T_LIST_GAZNETWORK_OBJECTS.fieldbyname('id').AsInteger;
    Parameters[1].Value := id_parent;
    Open;
    end;
    TempTVChildQuery.First;
    while not TempTVChildQuery.Eof do
    begin
    New(NowPtr);
    NowPtr^.id_property := TempTVChildQuery.FieldByName('id_property').AsInteger;
    NowPtr^.id_prop_parent := TempTVChildQuery.FieldByName('id_prop_parent').AsInteger;
    NowPtr^.id_type_obj := TempTVChildQuery.FieldByName('id_type_obj').AsInteger;
    NowPtr^.prop_name := TempTVChildQuery.FieldByName('prop_name').AsString;
    NowPtr^.id_type_prop := TempTVChildQuery.FieldByName('id_type_prop').AsInteger;
    NowPtr^.id_value := TempTVChildQuery.FieldByName('id_value').AsInteger;
    try
    Q_GetValue.Close;
    Q_GetValue.SQL.Clear;
    Q_GetValue.SQL.Text:='select * from sp_type_value where id=:var';
    Q_GetValue.Parameters[0].Value:=TempTVChildQuery.FieldByName('id_type_prop').AsInteger;
    Q_GetValue.Open;
    table_name:=Q_GetValue.fieldbyname('name_table').AsString;
    NowPtr^.table_name :=table_name;
    Q_GetValue.Close;
    Q_GetValue.SQL.Clear;
    Q_GetValue.SQL.Text:='select value from '+table_name+' where id='+
    inttostr(TempTVChildQuery.FieldByName('id_value').AsInteger);
    Q_GetValue.Open;
    NowPtr^.value := Q_GetValue.fieldbyname('value').AsVariant;

    // NowPtr^.Q_Temp:=TADOQuery.Create(self);

    except
    end;

    NewNode:=TV.Items.AddChild(ParentNode,trim(TempTVChildQuery.FieldByName('prop_name').AsString));
    NewNode.Data:=NowPtr;
    TempTVChildQuery.Next;
    end;
    TempTVChildQuery.close;
    end;


    procedure TF_DETAIL_OBJECTS.TVExpanded(Sender: TObject; Node: TTreeNode);
    var i:integer;
    SaveNode:TTreeNode;
    begin
    TV.Items.BeginUpdate;
    SaveNode:=NowNode;
    for i:=0 to Node.Count-1 do
    begin
    TV.Selected:=node.Item;
    NowNode:=TV.Selected;
    if not Node.Item.HasChildren then
    Buld_for_node(P_Description(Node.Item.Data)^.id_property,Node.Item);
    end;
    TV.Selected:=SaveNode;
    TV.Items.EndUpdate;
    end;

    end.