ситуация такая, нужно создать TreeView в виде бинарного дерева, извесно количество листьев и количество узлов, проблема в том, что при создании новой ветки индексы смещаются, тока вот как хз, и соответственно вылетает ошибка. прога на билдере 6. вобщем i need help.
а поподробнее?? у вас вопрос типа "у меня тут вот это ну короче оно вот тут так кааааааааак, нужна помощь, ага" вы бы сформулировали постановку, привели код, привели ошибку хотябы что бы понять что у вас там творица и как вам можно помочь. или вам просто нужно решение этой задачи? дык сформулируйте её хотябы, задачу эту. или просто вам нужен код построения дерева в TreeView с неограниченноой вложенностью?
это надо добавлено через 22 минуты точнее даже так: построение бинарного дерева в TreeView с заданной вложенностью.
запоздало но все же =) основные процедуры и функции для построения дерево содержится в таблице типа: 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.