KeyDown

13 отговора 301 прегледа
#1

KeyDown

Здравейте имам fsMDIForm и както разбрах в последствие не може да се прихване директно KeyDown събитието когато FormStyle = fsMDIForm и трябва да има поне една дъщерна форма

За целта направих следното :

procedure TfrmBank.MessageHandler(var Msg: TMsg; var Handled: Boolean);
var Bit: Boolean;
begin
Bit := False;
if ( Msg.Message = WM_KEYDOWN ) and ( MDICHILDCOUNT = 0 ) then
begin
if ( Msg.wParam = VK_MENU{ or VK_CTRL} ) ) and ( Msg.wParam = ORD( 'N' ) ) then
{ Клавишната копбинация ALT+N както в стандартното KeyDown }
begin
ShowMessage( 'Ihhhaa' );
Handled := true;
end;

end;
end;

procedure TfrmBank.FormCreate(Sender: TObject);
begin
Application.OnMessage := MessageHandler;
end;

Всичко работи перфектно само с един натиснат клавиш само, че когато се опитвам да направя клавишна комбинация нищо не става !! Защо ??

Благодаря предварително

Отговор
в отговор на Adnan #2

Re: KeyDown

Ми пич виж си условието на if-а


( Msg.wParam = VK_MENU{ or VK_CTRL} ) ) and ( Msg.wParam = ORD( 'N' ) )


как може wParam да е равно на "ORD( 'N' )" и на "VK_MENU" едновременно

Отговор
в отговор на Пaпaraлa Йoprи #3

Re: KeyDown

То в KeyDown има TShiftState ама тука като няма
Иначе какъв е проблема
if ( ssAlt in Shift ) and ( Key = Ord( 'N' ) ) then

ама тука като няма TShiftState как да стане работата ???

Отговор
в отговор на Пaпaraлa Йoprи #4

Re: KeyDown

И ми е много ястно че така няма да стане ... за показвам какво искам да направя ....
:) определеня няма да мине така !!!

Отговор
в отговор на Adnan #5

Re: KeyDown

Четете хелповете бре хора

В lParam-а на месиджа има нещо наречено KeyData. А във юнита Forms има една функцийка KeyDataToShiftState на която подаваш KeyData-та и тя ти връща TShiftState.

PS: Не съм сигурен че ще стане с Alt-а защото се прихваща май по-рано за да се фокусира менюто ако има такова. Ако държиш на Alt-а ще трябва да се потрудиш малко

Отговор
в отговор на Adnan #6

Re: KeyDown

Ще получиш 2 съобщения последователно за Ctrl и за N, т.е. трябва да установяваш някакъв флаг при keydown и keyup на Ctrl и при keydown на N да проверяваш флага (дали е натиснат Ctrl или не). Между другото, ако кажеш крайната цел, може да се окаже, че има и по-интелигентен начин.
Освен това за Alt или за Ctrl става дума - че и двете ги пише в кода ти?

Отговор
в отговор на Formal #7

Re: KeyDown

Крайната цел на занятието е следното има един панел на който имам наредени TLabel'и които искам с клавишна комбинация да им извикам събитието OnClick ... те това е ...
За алта пробвах наистина се прихваща по рано отколкото очаквах ще се откажа от него Ctrl+N и + ... ще свърши съшо работа ...

Отговор
в отговор на Пaпaraлa Йoprи #8

Re: KeyDown

( ssCtrl in KeyDataToShiftState( Msg.wParam ) )
Сработи супер много мерси .....

Иска ми се наистина да сработи и с Alta ... ще се порастърся малко ... да видя какво ще намерия !!!!

Отговор
в отговор на Adnan #9

Re: KeyDown

( ssCtrl in KeyDataToShiftState( Msg.wParam ) )
Сработи много благодаря

Искам ми се да е с ALT наистина ... ще се разтърся да видия какво ще намерия ...

Отговор
в отговор на Adnan #10

Re: KeyDown

Ако толкова държиш на Alt-а се вържи на главната форма на OnShortCut. Там ти трябва месиджа CN_SYSKEYDOWN а останалата част вече я знаеш

Отговор
в отговор на Adnan #11

Re: KeyDown

Ако KeyPreview на формата е true,
то OnKeyDown си работи както си му е реда...
(и така и трябва да бъде)

Отговор
в отговор на Пaпaraлa Йoprи #12

Re: KeyDown

Евала брато работи и с Alt'a на OnShortCut'а супер идея ....
Благодаря много !!!

Отговор
в отговор на Adnan #13

Re: KeyDown

Една идея: слагаш един ActionList, на който му добавяш Actions за каквито действия ти трябват (т.е. каквито там етикети имаш за click-ане). На събитието OnExecute на всеки Action слагаш метода OnClick от съответния му Label. На свойството ShortCut на всеки Action пишеш желаната клавишна комбинация (напр. 'Alt+N', нищо, че го няма в списъка). Така при натискане на Alt+N ще се активира Action-а и ще се изпълни метода, който те интересува. При това без да пишеш и един ред код. (работи и когато формата е fsMDIForm, проверих).

Отговор
в отговор на Formal #14

Re: KeyDown

Мерси това е супер идея също !!!

Отговор