Главная страница
    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.007 c
3-64989
kserg@ukr.net
2002-05-28 10:26
2002.06.20
MSSQL: как изнать где


4-65272
Story_
2002-04-18 00:37
2002.06.20
посылка сообщения


1-65017
maxim2
2002-06-07 12:09
2002.06.20
Можно ли убрать TitleBar у формы


8-65185
ed4
2002-02-05 09:40
2002.06.20
Как изменить уровень звука для TMediaPlayer


7-65269
TOLTEC
2002-03-22 02:25
2002.06.20
Сервис и Tray





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский