procedure TfrmCatalogMain.ExpandLevel( Node : TTreeNode);
var i, id : Integer;
TreeNode : TTreeNode;
begin
if Node = nil then id:=0
else id := Integer(Node.Data);
DM.CDS1.Close;
DM.CDS1.Params.ParamByName('idroot').AsInteger := id;
DM.CDS1.Open;
for i:=1 to DM.CDS1.RecordCount do
begin
TreeNode := TreeView.Items.AddChildObject( Node,
DM.CDS1.FieldByName('name').AsString ,
Pointer(DM.CDS1.FieldByName('id').AsInteger) );
TreeView.Items.AddChildObject( TreeNode , '' , nil );
DM.CDS1.Next;
end;
end;
Работа с TreeView
Просто добавление проблем не вызывает, проблема как раз с добавлением в нужном месте :)
Научись пользоваться поиском и глазами ))))
я нашел эту тему. затруднения в том, что наименование добавляемой ветви вводится в новой форме. постоянно вылезает ошибка 'Access violation at adress ....'.
Ну ты хоть код напиши и укажи место, в котором Access violation вываливается.
есть таблица БД, в которой хранится дерево. Ее поля:
id - ключ
idroot - ид родительского элемента
name - наименование
если idroot=0, то элемент находится в корне дерева. надо реализовать вывод этого дерева в TreeView с возможностью добавления, редактирования и удаления элементов.
Есть процедура Expandlevel, которая прорисовывает ветку, когда ее открываешь:
Код:
здесь CDS1 - ClientDataSet.
на событие onCreate формы frmCatalogMain, где расположен TreeView:
Код:
TreeView.Items.Clear;
ExpandLevel(nil);
TreeView.Selected := TreeView.Items[0];
ExpandLevel(nil);
TreeView.Selected := TreeView.Items[0];
на событие onExpanding этого TreeView-а:
Код:
if Node = nil then exit;
if Node.getFirstChild.Data = nil then
begin
Node.DeleteChildren;
ExpandLevel(Node);
end;
if Node.getFirstChild.Data = nil then
begin
Node.DeleteChildren;
ExpandLevel(Node);
end;
Далее, есть форма frmCatalogEdit, которая используется для добавления новых элементов. на ней размещены элементы Edit, checkbox и кнопка 'сохранить'.
По нажатию кнопки:
Код:
if frmCatalogEdit.CheckBox.Checked = true then
begin
DM.CDS1.FieldByName('idroot').AsInteger := 0;
end
else
begin
frmCatalogMain.TreeView.Items.AddChild(frmCatalogMain.TreeView.Selected, frmCatalogEdit.eName.Text);
frmCatalogMain.TreeView.Selected.Expanded := True;
end;
DM.CDS1.FieldByName('name').AsString := frmCatalogEdit.eName.Text;
DM.CDS1.Post;
DM.CDS1.ApplyUpdates(-1);
begin
DM.CDS1.FieldByName('idroot').AsInteger := 0;
end
else
begin
frmCatalogMain.TreeView.Items.AddChild(frmCatalogMain.TreeView.Selected, frmCatalogEdit.eName.Text);
frmCatalogMain.TreeView.Selected.Expanded := True;
end;
DM.CDS1.FieldByName('name').AsString := frmCatalogEdit.eName.Text;
DM.CDS1.Post;
DM.CDS1.ApplyUpdates(-1);
Checkbox - для добавления элементов в корень дерева, в противном случае - в отмеченный элемент.
Проблема:
в добавлении, редактировании и удалении элементов дерева через TreeView. Добавляет элементы только в корень дерева.
Ошибка вылазит на строке
Код:
frmCatalogMain.TreeView.Items.AddChild(frmCatalogMain.TreeView.Selected, frmCatalogEdit.eName.Text);
Если добавляю в else проверку:
Код:
if frmCatalogMain.TreeView.Selected <> nil then
есть у кого какие-нибудь конструктивные предложения?
Цитата: АКМ
есть у кого какие-нибудь конструктивные предложения?
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin[CODE][CODE]
begin[CODE][CODE]
MyNode:=nil;
end;
procedure TForm1.TreeView1GetSelectedIndex(Sender: TObject;
Node: TTreeNode);
begin
MyNode:=Node;
end; //отслеживает в программе перемещение пользователем фокуса по дереву
procedure TForm1.Button1Click(Sender: TObject);
begin
if TreeView1.Items.Count=0 then
TreeView1.Items.Add(nil,Edit1.Text)
else
TreeView1.Items.Add(MyNode,Edit1.Text);
end; // добавляет узел
procedure TForm1.Button2Click(Sender: TObject);
begin
if TreeView1.Items.Count<>0 then
TreeView1.Items.AddChild(MyNode,Edit1.Text);
end; //добавляет потомка[/CODE]