Chamar evento do componente de cada form

Delphi

17/08/2009

Olá,

Fiz um componente que de acordo com uma tecla de atalho, definida na propriedade do componente, chama uma procedure.
Estou usando o Application.OnMessage p/ fazer isso. Mas dessa forma ele chama o evento em todos os forms, mas gostaria que chamasse o evento [b:e72cf27789]apenas nos forms que coloco o componente desenvolvido[/b:e72cf27789] em vez de chamar o evento em todos os forms do projeto.
Código :

[i:e72cf27789][color=green:e72cf27789]constructor TComp.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Application.OnMessage := ProcessaMsg;
end;

procedure TComp.ProcessaMsg(var Msg: TMsg; var handled: Boolean);
begin
if (Msg.message=WM_KEYDOWN) then
begin
if msg.wParam = [b:e72cf27789]´tecla de atalho definida na propriedade do componente´[/b:e72cf27789] then
Execute;
end;
end;[/color:e72cf27789][/i:e72cf27789]

obrigado.


Andreyrf

Andreyrf

Curtidas 0

Respostas

Osocram

Osocram

17/08/2009

Se vc criou o componente o mais certo seria vc cria uma Prop. OnKeyDown nele.

dependendo de quem vc herdou o componente pode ser que ja tenha algo parecido.


GOSTEI 0
Andreyrf

Andreyrf

17/08/2009

Entendi seu comentário osocram.

Qdo o usuário clica na tecla de atalho que é a mesma q está definida na propriedade do componente, abre uma tela.

Mas anterirmente havia feito através do evento onkeydown, mas não é um evento que fica disponível no object inspector.
Na verdade, utilizo o onkeydow do form onde está o componente, só que dessa forma ele suprime o código que já existe anteriomente no onkeydow do form.
Faço assim :

[color=green:cdd7ccf298]
Private FOriginalOnKeyPress: TKeyEvent;

constructor TComp.Create(AOwner: TComponent);
//var Form: TForm;
begin
Form := TForm(AOwner);
Form.KeyPreview := True;
if Assigned(Form.OnKeyDown) then
FOriginalOnKeyPress := Form.OnKeyDown;
Form.OnKeyDown := LocalOnKeyPress;
end;

procedure TComp.LocalOnKeyPress(Sender: TObject; var Key: Word; Shift: TShiftState);
if Active then
begin
if ShortCut(Key,Shift) = ´tecla de atalho definida na propriedade do componente´ then
Execute;
end;
end;

OBS: NO ´EXECUTE´ abro um form;;;

[/color:cdd7ccf298]


GOSTEI 0
Andreyrf

Andreyrf

17/08/2009

Solucionei o problema utilizando as mensagens do windows:

No create do componente : Application.OnMessage := ProcessaMsg;

E nessa procedure :

procedure ProcessaMsg(var Msg: TMsg; var handled: Boolean);
begin
if (Msg.message=WM_KEYDOWN) and (Active) then
begin
if msg.wParam = ´tecla digitada´ then
Execute;
end;
end;


GOSTEI 0
Andreyrf

Andreyrf

17/08/2009

Solucionei o problema utilizando as mensagens do windows:

No create do componente : Application.OnMessage := ProcessaMsg;

E nessa procedure :

procedure ProcessaMsg(var Msg: TMsg; var handled: Boolean);
begin
if (Msg.message=WM_KEYDOWN) and (Active) then
begin
if msg.wParam = ´tecla digitada´ then
Execute;
end;
end;


GOSTEI 0
POSTAR