Я использую некоторый пользовательский элемент управления со списком, полученный из TCustomControl, и я обрабатываю события мыши. Назовем его TMyComboBox.
Я обрабатываю TMyComboBox.OnChange и выполняю некоторые операции, для завершения которых требуется некоторое время (около 200 мс) (выполнение некоторых внешних аппаратных изменений).
Поскольку я также внедрил колесико мыши, я могу изменять элементы в своем пользовательском поле со списком с помощью колесика мыши.
Вот в чем проблема. Событие колеса мыши происходит очень быстро (при прокрутке), и это вызывает событие OnChange моего TMyComboBox.
Поскольку OnChange занимает так много времени, я не могу обработать все эти сообщения, поэтому мое поле со списком все еще меняется, даже после того, как я уже не меняю колесо мыши. Я предполагаю, что очередь сообщений пустеет и отправляет все события колесика мыши....
Итак, как я могу предотвратить получение сообщения о колесе мыши в очереди сообщений, если мой OnChange все еще выполняет какую-то работу?
Псевдокод
function TMyComboBox.DoMouseWheelDown(Shift: TShiftState;
MousePos: TPoint): Boolean;
begin
Self.Cursor := crHourGlass;
if (Self.Focused and (Self.IndexSelectData + 1 < FScaleCode.Count ) ) then Self.IndexSelectData := Self.IndexSelectData + 1;
Self.Cursor := crArrow;
end;
function TMyComboBox.DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean;
begin
Self.Cursor := crHourGlass;
if (Self.Focused and (Self.IndexSelectData - 1 > -1 ) ) then Self.IndexSelectData := Self.IndexSelectData - 1;
Self.Cursor := crArrow;
end;
procedure TMyComboBox.OnChange(Sender: TNotifyEvent);
begin
-> MessageQueue.Lock; // stop receiving message into queue
ProcessHardware; // long procedure (approx. 200ms)
-> MessageQueue.Unlock; // continue recieving message into queue
end;
Примечание. При установке IndexSelectData будет поднят OnChange.
Я кое-что читал о PeekMessages, но не знаю, как его использовать... (если вообще можно использовать)
Спасибо за помощь.