KeyDown
13 отговора
301 прегледа
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;
Всичко работи перфектно само с един натиснат клавиш само, че когато се опитвам да направя клавишна комбинация нищо не става !! Защо ??
Благодаря предварително
За целта направих следното :
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;
Всичко работи перфектно само с един натиснат клавиш само, че когато се опитвам да направя клавишна комбинация нищо не става !! Защо ??
Благодаря предварително
Re: KeyDown
Ми пич виж си условието на if-а
как може wParam да е равно на "ORD( 'N' )" и на "VK_MENU" едновременно
( Msg.wParam = VK_MENU{ or VK_CTRL} ) ) and ( Msg.wParam = ORD( 'N' ) )
как може wParam да е равно на "ORD( 'N' )" и на "VK_MENU" едновременно
Re: KeyDown
То в KeyDown има TShiftState ама тука като няма
Иначе какъв е проблема
if ( ssAlt in Shift ) and ( Key = Ord( 'N' ) ) then
ама тука като няма TShiftState как да стане работата ???
Иначе какъв е проблема
if ( ssAlt in Shift ) and ( Key = Ord( 'N' ) ) then
ама тука като няма TShiftState как да стане работата ???
Re: KeyDown
И ми е много ястно че така няма да стане ... за показвам какво искам да направя ....
:) определеня няма да мине така !!!
:) определеня няма да мине така !!!
Re: KeyDown
Четете хелповете бре хора
В lParam-а на месиджа има нещо наречено KeyData. А във юнита Forms има една функцийка KeyDataToShiftState на която подаваш KeyData-та и тя ти връща TShiftState.
PS: Не съм сигурен че ще стане с Alt-а защото се прихваща май по-рано за да се фокусира менюто ако има такова. Ако държиш на Alt-а ще трябва да се потрудиш малко
В lParam-а на месиджа има нещо наречено KeyData. А във юнита Forms има една функцийка KeyDataToShiftState на която подаваш KeyData-та и тя ти връща TShiftState.
PS: Не съм сигурен че ще стане с Alt-а защото се прихваща май по-рано за да се фокусира менюто ако има такова. Ако държиш на Alt-а ще трябва да се потрудиш малко
Re: KeyDown
Ще получиш 2 съобщения последователно за Ctrl и за N, т.е. трябва да установяваш някакъв флаг при keydown и keyup на Ctrl и при keydown на N да проверяваш флага (дали е натиснат Ctrl или не). Между другото, ако кажеш крайната цел, може да се окаже, че има и по-интелигентен начин.
Освен това за Alt или за Ctrl става дума - че и двете ги пише в кода ти?
Освен това за Alt или за Ctrl става дума - че и двете ги пише в кода ти?
Re: KeyDown
Крайната цел на занятието е следното има един панел на който имам наредени TLabel'и които искам с клавишна комбинация да им извикам събитието OnClick ... те това е ...
За алта пробвах наистина се прихваща по рано отколкото очаквах ще се откажа от него Ctrl+N и + ... ще свърши съшо работа ...
За алта пробвах наистина се прихваща по рано отколкото очаквах ще се откажа от него Ctrl+N и + ... ще свърши съшо работа ...
Re: KeyDown
( ssCtrl in KeyDataToShiftState( Msg.wParam ) )
Сработи супер много мерси .....
Иска ми се наистина да сработи и с Alta ... ще се порастърся малко ... да видя какво ще намерия !!!!
Сработи супер много мерси .....
Иска ми се наистина да сработи и с Alta ... ще се порастърся малко ... да видя какво ще намерия !!!!
Re: KeyDown
( ssCtrl in KeyDataToShiftState( Msg.wParam ) )
Сработи много благодаря
Искам ми се да е с ALT наистина ... ще се разтърся да видия какво ще намерия ...
Сработи много благодаря
Искам ми се да е с ALT наистина ... ще се разтърся да видия какво ще намерия ...
Re: KeyDown
Ако толкова държиш на Alt-а се вържи на главната форма на OnShortCut. Там ти трябва месиджа CN_SYSKEYDOWN а останалата част вече я знаеш 
Re: KeyDown
Ако KeyPreview на формата е true,
то OnKeyDown си работи както си му е реда...
(и така и трябва да бъде)
то OnKeyDown си работи както си му е реда...
(и така и трябва да бъде)
Re: KeyDown
Евала брато работи и с Alt'a на OnShortCut'а супер идея ....
Благодаря много !!!
Благодаря много !!!
Re: KeyDown
Една идея: слагаш един ActionList, на който му добавяш Actions за каквито действия ти трябват (т.е. каквито там етикети имаш за click-ане). На събитието OnExecute на всеки Action слагаш метода OnClick от съответния му Label. На свойството ShortCut на всеки Action пишеш желаната клавишна комбинация (напр. 'Alt+N', нищо, че го няма в списъка). Така при натискане на Alt+N ще се активира Action-а и ще се изпълни метода, който те интересува. При това без да пишеш и един ред код. (работи и когато формата е fsMDIForm, проверих).