Текущий архив: 2005.02.20;
Скачать: CL | DM;
ВнизКак в МСК/КОЛ узнать, что нажата нужная клавиша и отреагировать? Найти похожие ветки
← →
M5 (2004-07-28 12:20) [0]Нужно, чтобы при нажатии клавиши, н-р 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;
← →
fellix (2004-07-28 13:53) [1]В KOL нет KeyPreview
см.:
http://delphimaster.net/view/11-1089378422/
← →
M5 (2004-07-28 18:11) [2]Я прочел указанную ссылку, но к сожалению не смог разобраться как это работает. Можно подробнее? Так, даже при простом копировании указанной функции в мою прогу Д5 выдает ошибку "Необъявленный идентификатор GetShiftState" и на саму функцию "Function needs result type". Подскажите в каком месте программы определять эту функцию и как ею воспользоваться.
← →
fellix (2004-07-28 21:22) [3]код GetShiftState внутри Kol.pas
просто взять и скопировать
← →
M5 (2004-07-29 17:52) [4]Куда вставлять код функции - в обработку метода OnKeyDown объекта KOLForm1 или еще куда? Объясните же немного подробнее что и как должно работать.
← →
fellix (2004-07-30 11:34) [5]Что подробнее? Примера недостаточно? Ликбез по программированию устраивать?
Приклеить апплету OnMessage и вставить единственную строку:
if (Msg.message = WM_KEYDOWN) and (Msg.wParam = VK_ESCAPE) then ...
← →
M5 (2004-08-02 18:11) [6]И ликбез бы не помешал, доходчивость всегда высоко ценится. Теперь хоть более-менее понятно, спасибо. А другие посоветовали следующее:
- Нужно добавить функцию 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;
Страницы: 1 вся ветка
Текущий архив: 2005.02.20;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.039 c