Chamar evento do componente de cada form
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.
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
Curtidas 0
Respostas
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.
dependendo de quem vc herdou o componente pode ser que ja tenha algo parecido.
GOSTEI 0
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]
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
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;
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
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;
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