![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как в МСК/КОЛ узнать, что нажата нужная клавиша и отреагировать? [Delphi]
M5 © (2004-07-28 12:20:00)Нужно, чтобы при нажатии клавиши, н-р ESC, на главной форме программа завершалась.
На объекте Tlister (TLister = class(TForm)) установил KeyPreview=true и создал процедуру обработки OnKeyDown в объекте KOLForm1. Однако, ничего не работает:
procedure TLister.KOLForm1KeyDown(Sender: PControl; var Key: Integer;
Shift: Cardinal);
begin
IF GetKeyState(VK_ESCAPE) = 1 then begin
ShowMessage('Esc pressed');
halt;
end;
end;
M5 (2004-08-02 18:11:00) [1]И ликбез бы не помешал, доходчивость всегда высоко ценится. Теперь хоть более-менее понятно, спасибо. А другие посоветовали следующее:
- Нужно добавить функцию KOLForm1Message в основной модуль программы (двойной щелчок на методе OnMessage объекта TKOLForm):
function TMyUnit.KOLForm1Message(var Msg: tagMSG; var Rslt: Integer): Boolean;
var C : Char;
begin
Result:=False;
case Msg.message of
WM_KEYDOWN, WM_SYSKEYDOWN:
if assigned(Form.OnKeyDown) then Form.OnKeyDown(Form, Msg.wParam, GetShiftState);
WM_KEYUP, WM_SYSKEYUP:
if assigned(Form.OnKeyUp) then Form.OnKeyUp(Form, Msg.wParam, GetShiftState);
WM_CHAR, WM_SYSCHAR:
if assigned(Form.OnChar) then begin
C := Char( Msg.wParam );
Form.OnChar(Form, C, GetShiftState);
Msg.wParam := Integer(C);
end;
end;
end;
- Добавить функцию GetShiftState в раздел implementation
основного модуля или в саму функцию KOLForm1Message:
function GetShiftState: DWORD;
begin
Result:= 0;
if GetKeyState(VK_SHIFT) < 0 then Result:=Result or MK_SHIFT;
if GetKeyState(VK_CONTROL) < 0 then Result:=Result or MK_CONTROL;
if GetKeyState(VK_MENU) < 0 then Result:=Result or MK_ALT;
end;
- Наконец добавить процедуру анализа нажатых клавиш KOLForm1Char
(двойной щелчок на методе OnChar объекта TKOLForm), что-то типа:
procedure TMyUnit.KOLForm1Char(Sender: PControl; var Key: Char; Shift: Cardinal);
begin
if Key=#27 then ShowMessage('Нажата клавиша ESCAPE');
end;
fellix (2004-07-30 11:34:00) [2]Что подробнее? Примера недостаточно? Ликбез по программированию устраивать?
Приклеить апплету OnMessage и вставить единственную строку:
if (Msg.message = WM_KEYDOWN) and (Msg.wParam = VK_ESCAPE) then ...
M5 (2004-07-29 17:52:00) [3]Куда вставлять код функции - в обработку метода OnKeyDown объекта KOLForm1 или еще куда? Объясните же немного подробнее что и как должно работать.
fellix (2004-07-28 21:22:00) [4]код GetShiftState внутри Kol.pas
просто взять и скопировать
M5 (2004-07-28 18:11:00) [5]Я прочел указанную ссылку, но к сожалению не смог разобраться как это работает. Можно подробнее? Так, даже при простом копировании указанной функции в мою прогу Д5 выдает ошибку "Необъявленный идентификатор GetShiftState" и на саму функцию "Function needs result type". Подскажите в каком месте программы определять эту функцию и как ею воспользоваться.
fellix (2004-07-28 13:53:00) [6]В KOL нет KeyPreview
см.:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1089378422&n=10