Главная страница
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.023 c
4-1076514190
Timego
2004-02-11 18:43
2004.04.18
CLSID COM-объекта по полному пути к его dll-файлу


14-1080058309
Nous Mellon
2004-03-23 19:11
2004.04.18
Ценовые корреляции :)


8-1072869755
Linuxoid
2003-12-31 14:22
2004.04.18
Светомузыка


8-1066990862
TRyaSS
2003-10-24 14:21
2004.04.18
3-d в Delphi(OpenGL , Direct X)


4-1076152694
Talla2k
2004-02-07 14:18
2004.04.18
не убиваемый процесс