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