Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.041 c
14-1106811957
GRAND25
2005-01-27 10:45
2005.02.20
Цель в жизни...


4-1105357078
Norny
2005-01-10 14:37
2005.02.20
Изменение обоев Рабочего стола


1-1107506780
Zilog
2005-02-04 11:46
2005.02.20
LoadFromResourceName


4-1104108081
XProger
2004-12-27 03:41
2005.02.20
Две мышки


14-1106553402
Kerk
2005-01-24 10:56
2005.02.20
Я на грани самоубийства!!!