Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.18;
Скачать: CL | DM;

Вниз

DragAndDrop в TTreeView   Найти похожие ветки 

 
Gero ©   (2004-03-29 23:00) [0]

Возникла проблема с перетаскиванием узлов в TTreeView.
При перетаскивании вызывается OnClick, а это нежелательно.
Сморел код процедуры BeginDrag и увидел следующую строчку:
Perform(WM_LBUTTONUP, 0, Longint(PointToSmallPoint(P)));

Казалось бы, логично перед BeginDrag делать OnClick := nil, а потом восстанавливать, но проблемы в том, где это делать:
OnStartDrag вызывается уже после.
Делал это в OnMouseMove:

if ssLeft in Shift then
 begin
   TreeView.OnClick := nil;
   TreeView.BeginDrag(Mouse.DragImmediate, Mouse.DragThreshold);
   TreeView.OnClick := TreeViewClick;
 end;

Но это очень коряво выглядит, да и потом другие проблемы из-за этого возникают.

Как же добиться, чтобы при DragAndDrop все проходило без клика?


 
nikkie ©   (2004-03-29 23:23) [1]

;)


 
Gero ©   (2004-03-29 23:53) [2]

> nikkie ©   (29.03.04 23:23)

Ага ;)


 
Gero ©   (2004-03-30 08:25) [3]

Пробовал писать наследника со своей реализацией BeginDrag, не получилось,
в Controls.pas много очень нужных процедур и переменных скрыты в разделе implementation.

Ну так что посоветуете, мастера?


 
Gero ©   (2004-03-30 17:43) [4]

Неужели никто не сталкивался, и даже мастера не знают, как это обойти?
Что-то не верится.
Или, может я чем-то не угодил...


 
VLAD-MAL   (2004-03-30 18:11) [5]

Попробуй вместо OnClick, использовать, к примеру, OnChange/OnChanging, к тому же - на мышку завязки не будет...

PS Я как-то мучался с похожими проблемами TTreeView, и  в конце концов перешел на TVirtuakTreeView...


 
nikkie ©   (2004-03-30 18:33) [6]

имхо, проблема в VCL реализации BeginDrag, которая посылает WM_LBUTTONUP. причем, метод BeginDrag не виртуальный и переопределить его не получится.

если писать наследника, то можно попробовать перехватить TVN_BEGINDRAG в CNNotify. или даже лучше не наследоваться, а просто перехватить WM_NOTIFY у формы.


 
nikkie ©   (2004-03-30 18:35) [7]

>к тому же - на мышку завязки не будет...
сие не есть плюс, это как раз минус.

в гугле я нашел несколько вопросов на эту тему, но решения не видно. один человек пишет:
I solved it setting a flag in OnStartDrag, and then I used the OnChange to starte the update procedure instead of OnClick. I Found that the events fired like this: OnMouseDown, OnClick, OnMouseUp, OnStartDrag, OnChange.

решение не фонтан - чтобы отработать клавиатуру отдельно от мышки, придется еще костыли расставлять.



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

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

Наверх




Память: 0.48 MB
Время: 0.035 c
6-1076399932
Роман
2004-02-10 10:58
2004.04.18
Прикреплённые файлы к письму


1-1080906432
Chahpa
2004-04-02 15:47
2004.04.18
MainMenu


7-1077017287
Kremen
2004-02-17 14:28
2004.04.18
МАС-адрес


4-1074765750
Vova_2004
2004-01-22 13:02
2004.04.18
прозрачный Static


1-1080739600
Ш-К
2004-03-31 17:26
2004.04.18
Указатели на события