Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.06.20;
Скачать: [xml.tar.bz2];

Вниз

Не работает метод EndDrag   Найти похожие ветки 

 
pusrg   (2002-06-06 22:56) [0]

Уважаемые мастера! Не откажите в помощи.

Проблема в следующем:
Для динамически создаваемого TListView обрабатываю следующие события: OnMouseDown и OnDblClick.
OnMouseDown мне нужен для запуска перетаскивания пункта списка. Но когда выполняется двойной щелчок, происходит вызов модального окна, при этом естественно нужно процесс перетаскивания отменить.
Что я и пытаюсь сделать вызовом метода EndDrag. Но по закрытию модального окна, процесс перетаскивания не прекращается - пункт списка отрисовывается в состоянии Drag, хотя клавиша мыши уже давно отпущена.

Привожу исходный код:

procedure TFormTimetable.LvOrderMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
(Sender as TListView).BeginDrag(false);
...
end;

procedure TFormTimetable.LvOrderDblClick(Sender: TObject);
var CurClick, CurClickControl:TPoint;
CurItem:TListItem;
begin
(Sender as TListView).EndDrag(false);//Пробовал указывать параметр true - бестолку.
...
Form.ShowModal;//По закрытию этой формы перетаскивание остается.
end;


Заранее спасибо за помощь.


 
Игорь Шевченко   (2002-06-07 11:29) [1]

При щелчке мышью на ListView ВСЕГДА возникает событие OnClick, даже если это двойной щелчок. Я бы советовал изменить интерфейс, чем мучиться с различением Click и DblClick. Если очень хочется помучиться, то у Пачеко "D5 руководство разработчика" есть пример определения истинных Click и DblClick. Или самому таймер поставить на время GetDoubleClickTime()


 
pusrg   (2002-06-07 14:52) [2]

To Игорь Шевченко
Спасибо за Ваш ответ.

Как показало изучение стека вызовов процедур, проблема в следующем. Для класса TControl метод WMLButtonDblClk определен следующим образом:


procedure TControl.WMLButtonDblClk(var Message: TWMLButtonDblClk);
begin
SendCancelMode(Self);
inherited;
if csCaptureMouse in ControlStyle then MouseCapture := True;
if csClickEvents in ControlStyle then DblClick;
DoMouseDown(Message, mbLeft, [ssDouble]);//В этой строке после вызова метода DblClick, вызывается MouseDown еще раз и перетаскивание просто запускается по новой.
end;

Пришлось поставить ограничивающий флаг, следующим образом:


var SanctionDragging:boolean;
...

procedure TFormTimetable.LvOrderMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
if SanctionDragging then (Sender as TListView).BeginDrag(false)
else SanctionDragging:=true;
...
end;

procedure TFormTimetable.LvOrderDblClick(Sender: TObject);
var CurClick, CurClickControl:TPoint;
CurItem:TListItem;
begin
SanctionDragging:=false;
(Sender as TListView).EndDrag(false...
Form.ShowModal;
end;


Вроде все нормально. Кому известны другие решения этой проблемы, с удовольствием их выслушаю.

P.S.
//Я бы советовал изменить интерфейс, чем мучиться с различением Click и DblClick.

Я бы сам с удовольствием использовал другой интерфейс, не привык с такими извратами программировать. Но к сожалению от меня в данном проекте это не зависит. Получаю указания сверху :)


 
Игорь Шевченко   (2002-06-07 15:01) [3]

Есть решение несколько более сложное, через Timer, но если вас устраивает ваше, то наверное, можно оставить, как есть ?


 
pusrg   (2002-06-07 15:21) [4]

Пожалуй да.



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

Форум: "Основная";
Текущий архив: 2002.06.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.005 c
3-64907
Garry
2002-05-25 15:28
2002.06.20
Как узнать количество строк в наборе данных?


1-65010
Qpwoe
2002-06-08 15:13
2002.06.20
Люди, подскажите как запускать файл из проги?


1-65084
MSergey
2002-06-06 15:23
2002.06.20
Пиво.


14-65208
Miwa
2002-04-19 15:55
2002.06.20
Глюк в Delphi.MAstak.ru Forum Client?


1-65041
Great DAN
2002-06-10 07:19
2002.06.20
TComboBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский