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

DragOver в Treeview   Найти похожие ветки 

← →
Miralex ©   (2003-08-18 13:59) [0]

У меня есть Treeview где отображаються папки и файлы
(различаються они по Node.Data если 1 то папка если 2 то файл)

Хочу сделать чтоб в дереве можно было перемещать только файлы
(запретить перемещение папок)

Пишу:
procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
if integer((Sender as TtreeNode).Data)=2 then Accept:=true else Accept:=false;
end;

И при попытке перетащить чтото угодно вылетаю с ошибкой:
"Project project2.exe raised exception class EInvalidCast with message Invalid Class typecast"

Обьясните мне пожалуйста что я сделал не так?


← →
Семен Сорокин ©   (2003-08-18 14:07) [1]

в твоем случае Sender - TreeView, тебе в TreeView по X и Y надо вытаскивать TtreeNode, а в нем уже смотреть Data


← →
Miralex ©   (2003-08-18 14:11) [2]

а можно поподробнее как ето сделать?
(Желательно с примерчиком)


← →
Семен Сорокин ©   (2003-08-18 14:13) [3]

procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
var
_node: TTreeNode;
begin
_node := TTreeView(Sender).GetNodeAt(X, Y);
if Assigned(_node) then
Accept := integer(_node.Data) = 2
end;


← →
Miralex ©   (2003-08-18 14:33) [4]

Спасибо заработало!
тока чтото я не вкурил что такое Assigned(_node)
и что такое Accept := integer(_node.Data) = 2
Accept ето булевая операция а там integer


← →
Семен Сорокин ©   (2003-08-18 14:37) [5]

Assigned(_node) тоже самое что и _node <> nil, тока крутые дядьки используют :)))
Accept := integer(_node.Data) = 2 аналогично твоему
if integer(_node.Data)=2 then Accept:=true else Accept:=false;


← →
Miralex ©   (2003-08-18 14:42) [6]

оки
спасибо за разьяснения!
тока тут чучуть не то:
По твоему способу получилось что можно перетаскивать все, но кидать на папку нельзя!
а мне надо чтоб можно было перетаскивать тока файлы а кидать можно было б на все!
(менял Sender на Source - не помогает)


← →
Семен Сорокин ©   (2003-08-18 15:08) [7]

Miralex © (18.08.03 14:42) [6]
тогда ставь обработку на onMouseDown:
procedure TMainForm.TreeView1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if (Button = mbLeft) and (Shift = [ssLeft]) and Assigned(TreeView1.Selected) and
(integer(TreeView1.Selected.Data) = 2) then
TreeView1.BeginDrag(false)
end;

а в OnDragOver Access тогда всегда true


← →
Miralex ©   (2003-08-18 15:17) [8]

я сделал чуток подругому и хотел бы узнать у мастеров правильно ли на 100% ???

В StartDrag я вписал:
procedure TForm1.TreeView1StartDrag(Sender: TObject;
var DragObject: TDragObject);
begin
if integer(Treeview1.Selected.Data) = 2 then AcceptDrag:= true else AcceptDrag:=false;
end;

В DragOver вписал:
procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
if AcceptDrag then Accept:=true else Accept:=false;
end;

Ведь по сути дела самым первым появляеться событие OnStartDrag



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

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



Память: 0.47 MB
Время: 0.013 c
14-1656
Васька
2003-08-12 17:04
2003.09.01
Изображения


8-1516
Bill
2003-04-10 14:56
2003.09.01
Потеря Canvas


14-1635
ZeroDivide
2003-08-13 08:03
2003.09.01
Что с форумом?


1-1371
Alex-21
2003-08-12 19:48
2003.09.01
TRxRichEdit


7-1692
Grinya
2003-06-14 13:49
2003.09.01
Как изьят иконку диска???




   Наверх