Главная страница
    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.018 c
1-65097
mihrutka
2002-06-06 13:44
2002.06.20
сохранить файл из word с параметрами...


1-65143
Валет
2002-06-07 14:12
2002.06.20
Получение длинного имя файла по короткому.


3-64984
vasilly
2002-05-28 10:10
2002.06.20
проблема с BLOB через БДЕ только для MS SQL, для других баз нет


7-65254
Laraa
2002-03-20 09:05
2002.06.20
Использование функции WaitCommEvent


1-65152
hooky-mars
2002-06-06 15:25
2002.06.20
Глюк RichEdit1 в D6





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