Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.01;
Скачать: 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 вся ветка

Текущий архив: 2003.09.01;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.026 c
4-1706
bkv
2003-06-27 11:33
2003.09.01
CreateProcessAsUser() - получить hToken текущего пользователя?


1-1415
Zilog
2003-08-15 15:32
2003.09.01
как подлинковать сишную библиотек??


1-1373
Question
2003-08-16 18:03
2003.09.01
Указателю на динамический массив значения после GetMem


1-1399
ASt
2003-08-16 01:38
2003.09.01
Много однотипных компонентов


1-1444
Borealis
2003-08-18 18:10
2003.09.01
Позиция курсора в TEdit