Вниз
Скачать: CL | DM;

Как в TreeView при DragDrop узнать что узел может принять ветку?   Найти похожие ветки 

 
Roki   (2003-04-04 09:45) [0]

Мастера, делаю DragDrop веток. Как мне сделать так чтобы не было зацыкливания : ветку вставляю в подветку этой же ветки?


 
MBo ©   (2003-04-04 09:49) [1]

В Статьи загляни


 
Polevi ©   (2003-04-04 10:53) [2]

TTreeNode.HasAsParent


 
Polevi ©   (2003-04-04 10:56) [3]

procedure TsetsFrm.TreeDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept:=not TTreeView(Source).DropTarget.HasAsParent(TTreeNode(Source).Selected);
end;


 
Roki   (2003-04-04 14:16) [4]

Из статьи.
Код OnDragDrop выглядит так:

var
Node, SelNode: TTreeNode;
begin
Node := TreeView1.GetNodeAt(X, Y);
if Node = nil then
Exit;
SelNode := TreeView1.Selected;
SelNode.MoveTo(Node, naAddChild);//тут ошибка иногда
// все уже встроено в TreeView
end;

Иногда почему-то выскаивает Access Violation при переносе узла. Что может быть за трабл?


 
MBo ©   (2003-04-04 14:37) [5]

У меня не выскакивало. Selected всегда не nil - это перетаскиваемый узел, а других причин для AV я вроде не вижу.


 
Roki   (2003-04-04 14:44) [6]

смотрю CPU:
TTreeNode.GetTreeView:
по адресу
0046f087 mov eax,[eax+$04]
Я переписал как сделал один програмер(FIBDBtreeView):

procedure DoChangeParent(vTreeView : TTreeView; Dest, Source: TTreeNode; AutoCommit: Boolean = False);
var NewParentId, ID: Integer;
NewNode:TTreeNode;
begin
with vTreeView do
begin
Items.BeginUpdate;

// DoDBChangeParent(NewParentID, Id);

NewNode:=Items.AddChildObject(Dest, Source.Text, Source.Data);
NewNode.HasChildren := true;

with NewNode do
begin
ImageIndex := Dest.ImageIndex;
SelectedIndex:= Dest.StateIndex;
end;

Source.Data:=nil;

Items.Delete(Source);

AlphaSort;
NewNode.Selected:=True;
Items.EndUpdate;
end;
end;

так не выскакивает, но работает глюкаво. И еще, я строю дерево из БД.


 
Roki   (2003-04-04 15:24) [7]

Мастера, помогите...


 
Roki   (2003-04-04 15:54) [8]

Ау, кто-то может помочь?


 
Polevi ©   (2003-04-04 16:30) [9]

DragOver надо использовать, он для этого предназначен, см.
>Polevi © (04.04.03 10:56)



 
Roki   (2003-04-07 11:03) [10]

несовметимые типы boolean и Treeview ...


 
Roki   (2003-04-07 11:19) [11]

нужно ли в каждом обработчике писать
в DragOver
inherited DragOver(Source, X, Y, State, Accept);
а в DragDrop
inherited DragDrop(Source, X, Y);


 
Roki   (2003-04-07 11:37) [12]

Мастера помогите...


 
Smok_er   (2003-04-07 12:04) [13]

Честно говоря, я не совсем понял вопрос...
если речь идет о том, что тривью "позволяет" перенести родительскую в дочернюю, и глупый юзер может случайно перенести ноду "не туда", что вызовет зацикливание, то я сделал так:


Node := TargetNode;
while Node <> nil do
begin
if Node.Parent = DragNode then
begin
MessageBox(Handle, "Can""t move parent node to his child node", "Error", MB_OK);
Exit;
end;
Node := Node.Parent;
end;


Сейчас пояснять все не хочется, но если возникнут вопросы - готов разъяснить


 
Roki   (2003-04-07 12:08) [14]

У меня дерево строится из БД, если использовать как советует Борис Новгородов(статьи), то такое рабтает когда обычное дерево. А вот в моем случае иногда выскакивает Access violation. Где-то я напортачил...


 
Roki   (2003-04-07 13:35) [15]

Мастера помогите...
Можете написать в какой последовательности происходят события при перетаскивании. Я так понял AV происходит если перетаскиваемый узел nil. Т.е. его не существеут, а так как у меня дерево строится динамически, то все может быть. Плиз, разясните где искать ошибку...



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.012 c
9-54386
drhdh
2002-11-15 18:09
2003.04.17
Учебник


1-54654
big_bugzy
2003-04-08 13:07
2003.04.17
Что вперед создается при использовании объектов автоматизации?


1-54584
Beglec
2003-04-07 08:54
2003.04.17
Народ объясните пожалуйста, Что есть такое


1-54728
AlexMax
2003-04-05 17:20
2003.04.17
Всё тот же Hint


4-54939
alexrush
2003-02-15 12:00
2003.04.17
Desktops & WindowStations




   Наверх