Відповідь на питання № 66940

Вікна, віконні повідомлення | Створення власних компонент | Реакція на клавіатуру, миша | миша |

Доброго вам дня
Пишу компонент, спадкоємець від 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

Схожі статті