Вниз
Скачать: 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.022 c
1-1080802405
Draught
2004-04-01 10:53
2004.04.18
TreeView


8-1064834658
Crypter
2003-09-29 15:24
2004.04.18
Стеганография и JPEG.


1-1080718810
neodiX
2004-03-31 11:40
2004.04.18
Delphi7, XPManifest, TGroupBox - отображение кириллицы. Решение!


7-1076352679
SAmoilov
2004-02-09 21:51
2004.04.18
Обращение к дисководу и CD-ROM


1-1080642232
Timego
2004-03-30 14:23
2004.04.18
Подскажите, пожалуйста, хорошую книгу по Delphi для начинающих




   Наверх