Вниз
Скачать: 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 вся ветка

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



Память: 0.46 MB
Время: 0.021 c
1-1080715307
nine_inch_nails
2004-03-31 10:41
2004.04.18
Копирование в clipboard


1-1080732046
TATIANA
2004-03-31 15:20
2004.04.18
Модальная форма - кнопка "ОК" - Edit


6-1074576336
2ac
2004-01-20 08:25
2004.04.18
Как узнать свой текущий IP?


1-1080473406
Step[B.M.]
2004-03-28 15:30
2004.04.18
Не получается сграбить в Bitmap визуальный компонент - усложняем


1-1080564878
TGrey
2004-03-29 16:54
2004.04.18
Как показать что в данный момент программа производит вычисления




   Наверх