Главная страница
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.061 c
3-1106419687
stud1
2005-01-22 21:48
2005.02.20
Компоненты ввода даты в базу данных


4-1105169458
Unknown
2005-01-08 10:30
2005.02.20
WM_Paste не отслеживается


8-1099906198
Konan
2004-11-08 12:29
2005.02.20
Создание программы для редактирования иконок


14-1107190910
Piter
2005-01-31 20:01
2005.02.20
Проблемы с Half-Life 2


14-1107255816
ocean
2005-02-01 14:03
2005.02.20
Рецепт всенародного счастья для России