![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() |
-=CHE@TER=- |
![]()
Сообщение
#1
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,371 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 318 раз(а) ![]() |
Delphi programs in API.
На английском. Очень подробно всё описано, плюс есть исходные коды готовых юнитов. Например SmallUtil, в котором есть все частоиспользуемые подпрограммы, и который в размере меньше, чем SysUtils (автор так утверждает - я не проверял). |
![]() ![]() |
-=CHE@TER=- |
![]()
Сообщение
#2
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,371 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 318 раз(а) ![]() |
Делал тут как-то плеер. И решил сделать для него возможности:
а) Таскать щёлкнув на любом месте окна формы. б) Переходить в полноэкранный режим и обратно двойным щелчком на форме. Всё сделал и тут выяснилась дикая вещь: при возврате из полноэкранного режима форма "прилипала" к курсору мышки, как будто я нажал и держу левую клавишу - т.е. активировался алгоритм перетаскивания окна. Бился с этим багом целый день. Выяснил интересные вещи: Если поставить на форме обработку событий: CODE OnDblClick OnMouseDown OnMouseUp И писать при их возникновении в Memo соответствующие текст, то получим такую последовательность при двойном щелчке на форме: CODE MouseDown MouseUp DoubleClick MouseDown MouseUp А теперь, внимание! Если в обработчике события OnDblClick делается что-то тяжёлое (какие-нибудь вычисления, работа с COM и т.д.) - то события приходят уже в таком порядке: CODE MouseDown MouseUp MouseUp DoubleClick MouseDown Т.е. MouseUp приходит раньше MouseDown! Абзац!!! Причём это не глюк Delphi - потому что если вручную перехватывать соответствующие WM_ сообщения - всё будет точно также! Однако, немного покурив доки по сообщениям решение нашлось: CODE type TForm1 = class(TForm) ... private procedure WMLButtonDblClk(var Msg: TMessage); message WM_LBUTTONDBLCLK; { Private declarations } public { Public declarations } end; ... Procedure TForm1.WMLButtonDblClk(var Msg: TMessage); Begin // тут делаем что-нибудь Msg.Result:=-1; // <-- не пускаем это сообщение дальше!!! End; В результате при Msg.Result:=-1 вторую пару сообщений MouseDown и MouseUp система уже не шлёт: CODE MouseDown MouseUp DoubleClick Спасибо сказали:
|
![]() ![]() |
Упрощённая версия | Сейчас: 30th April 2025 - 21:57 |