Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как в МСК/КОЛ узнать, что нажата нужная клавиша и отреагировать? [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо