Вікна, віконні повідомлення | Створення власних компонент | Реакція на клавіатуру, миша | миша |
Доброго вам дня
Пишу компонент, спадкоємець від TWinControl
проблема з MouseUp, передбачається відстежувати натиснення і відпуск миші
при виході мишки за межі компонента і відпуску MouseUp не викликається
Схожу річ я помітив і в TreeView, підкажіть, будь ласка, як це можна побороти, бажано в межах сомого компонента
тобто
MouseDown - якщо ліва кнопка змушуємо відстежувати MouseUp
P.S. - на королівстві були схожі питання, але пов'язані вони були більше з перетягуванням компонентів, тут потрібно тільки відстеження подій
Відстежувати відповіді на це питання по RSS
хм.
Дійсно, якщо віджимання мишки відбувається над вікном іншої програми (якщо воно активно Alt + Tab), то WM_LBUTTONUP вже не приходить
додав у перевірку на спробу перенесення в основному додатку, що якщо ми в модальному стані, значить треба виходити з нього і завершувати минулої спробу перенесення
Так, напевно, буде простіше ніж реалізовувати його на рівні компонента.
та ще обробляй повідомлення
WM_CAPTURECHANGED наприклад якщо ви опустили мишку а потім натиснули alt + tab або вікно з іншої причини втратило фокус, WM_LBUTTONUP ви вже не отримаєте, але зате отримаєте WM_CAPTURECHANGED.
Лякає і мене.
а куди діватися, рішення в пряму призводить до створення купи коду, а так здавалося начебто все просто і прозоро
1.MouseDown
перевіряємо чи будемо тягти частина схеми, інакше виходимо
установка подій на віджимання
перехід в модальність, якщо натиснули Esc, то отеняем зміщення
повернення старих обробників
ось і спрацювало в незрозумілому місці, коли користувачі додумалися тягнути за межі компонента
зате тепер чітко уявляю що таке Capture і з чим його їсти
>>> Питання закрито, всем большое спасибо :-).
Вам, звичайно, видніше. Але в тому самому питанні, посилання на який Ви привели, є коротеньке повідомлення Сергія Перовського
Найстрашніший варіант: "програма майже працює" :)
Відповідно, ось ця Ваша рядок "в конструкторі MouseCapture: = true; повністю вирішує питання" у мене викликає легке здивування. Я б, напевно, все ж спочатку розібрався що й до чого, а тільки потім порахував питання закритим.
Спасибі всім за відповіді, знайшлося шаманство :-)
в конструкторі MouseCapture: = true; повністю вирішує питання
я для полегшення роботи викликав перехід вікна в модальное стан, де власне і збивався CapturedWin
Питання закрито, всем большое спасибо :-).
Я поклав на форму панель і написав
procedure TForm1.Panel1MouseDown (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Caption: = 'down';
end;
procedure TForm1.Panel1MouseUp (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Caption: = 'up';
end;
І все чудово спрацювало. Тобто необхідна Вам функціональність є за замовчуванням.
Перевірте чи не переопределили Ви метод
procedure TControl.WMLButtonDown (var Message. TWMLButtonDown);
begin
SendCancelMode (Self);
inherited;
if csCaptureMouse in ControlStyle then MouseCapture: = True;
if csClickEvents in ControlStyle then Include (FControlState, csClicked);
DoMouseDown (Message. MbLeft, []);
end;
в якому власне і задається MouseCapture, і якщо все-таки переопределили, перевірте викликаєте Ви inherited WMLButtonDown