У меня уже едет крыша. Сделал драгидроп внутри тривью + драгидроп из ЛистБокс на тривью. И все бы ничего... Да только работать драгидроп из ListBox-a в TreeView начинает только после того, как в самом TreeView хотя бы раз делался драгидроп или если два раза кликнуть на одном из нодов. Причем работает до первого сворачивания TreeView. Далее, чтобы включить драг из Листбокса, нужно опять либо перетащить нод из одного места в другое, либо кликнуть на ноде два раза. Перепробовал кучу вариантов - ничего не помогает. Нутром чую, что что-то не так в переменной accept, а что конкрентно... Вот код:
| Код | procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); var VarNode, SelNode: TTreeNode; begin TreeView1.FullExpand; TreeView1.Update; VarNode := TreeView1.GetNodeAt(x, y); Accept := ((Source = ListBox1) and (VarNode <> nil) and (VarNode.Level=1)and(VarNode.IsFirstNode=false) and (ListBox1.ItemIndex >= 0))or((Sender=Source) and (VarNode <> nil) and (VarNode.Level=1)and(VarNode.IsFirstNode=false)); if not Accept then Exit;
SelNode := Treeview1.Selected; while (VarNode.Parent <> nil) and (VarNode <> SelNode) do begin VarNode := VarNode.Parent; if (VarNode = SelNode) and (VarNode.Level<>1) then begin Accept := False; end else Accept:=True; end;
end;
procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer); var VarNode, SelNode: TTreeNode; i: integer; begin VarNode := TreeView1.GetNodeAt(X, Y); if Source = Sender then begin if VarNode = nil then Exit; SelNode := TreeView1.Selected; TreeView1.Items.BeginUpdate; SelNode.MoveTo(VarNode, naAddChild); TreeView1.Items.EndUpdate; end else if Source = ListBox1 then begin if (VarNode = nil) and (Varnode.Level<>1) then Exit; for i:= 0 to Treeview1.Items.Count -1 do begin if Treeview1.Items[i].Text=ListBox1.Items[ListBox1.ItemIndex] then begin Showmessage('Òàêîé ñ÷åò óæå ñóùåñòâóåò!'); exit; end; end; TreeView1.Items.BeginUpdate; Treeview1.Items.AddChild(VarNode, ListBox1.Items[ListBox1.ItemIndex]); TreeView1.Items.EndUpdate; end; end;
|
|