Форум: "Основная";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
ВнизКак в 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 вся ветка
Форум: "Основная";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c