Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   tecla común a una aplicación (https://www.clubdelphi.com/foros/showthread.php?t=97476)

pantomima1975 23-05-2025 14:15:37

tecla común a una aplicación
 
Buenas a todos:


Es mi primer mensaje con lo que si no lo hago bien, perdón por adelantado.
He buscado en los foros y no he encontrado lo que quiero preguntar.


En Delphi X3, ¿existe alguna manera de hacer que pulsando una tecla (o una combinación, como un Ctrl + A, por ejemplo) en cualquier formulario de la aplicación se abra otro formulario sin tener que hacerlo en todos y cada uno de los formularios de la aplicación?


Sé que puedo abrir un formulario pulsando una tecla, con el KeyDown, pero lo que necesito es mostrar un formulario en cualquier momento, sin tener que escribir el mismo código del KeyDown en cada formulario.


Espero haberme explicado.


Gracias!

duilioisola 23-05-2025 14:27:53

Podrías escribir el código en un formulario base y que luego el resto de formularios hereden de este.

Código Delphi [-]
type
  TFMBase = class(TForm)
  [..]
  procedure OnKeydown(...);
  [..]
end;

Código Delphi [-]
type
  TFMOtroFormulario = class(TFMBase)
  [..]
end;

duilioisola 23-05-2025 14:31:17

Otra opción es crear una función en un formulario principal y desde el resto solo llamarla dentro el OnkeyDown

Código Delphi [-]
type
  TFMBase = class(TForm)
  [..]
  public
  procedure KeyDownGenerico(Sender: TObject; var Key: Word; Shift: TShiftState);;
  [..]
end;

procedure TFMBase.KeyDownGenerico(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  inherited;
  if (CTRL + A) then
     ...
end;

Código Delphi [-]
uses UFMBase;

type
  TFMOtroFormulario = class(TForm)
  [..]
  public
  procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  [..]
end;

procedure TFMOtroFormulario.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
   TFMBase.KeyDownGenerico(Sender, Key, Shift);
end;

Garada 23-05-2025 20:21:06

Puedes usar un componente TApplicationEvents en el formulario principal de la aplicación.
Este componente informa de cambios a nivel de aplicación y entre ellos los mensajes que recibe.

Usa el evento OnMessage y capturas el evento WM_KEYUP

ejempo:

Código Delphi [-]
procedure TForm1.appevnt1Message(var Msg: TMsg; var Handled: Boolean);
begin
  Handled := False;

  if (Msg.Message >= WM_KEYFIRST) and (Msg.Message <= WM_KEYLAST) then // capturamos todos los eventos de teclado para desactivar otros usos
  if (GetKeyState(VK_CONTROL) < 0) and (Msg.wParam = Ord('A')) then
  begin
    Handled := True; // el mensaje ya está gestionado

    if (Msg.message = WM_KEYUP) or (Msg.message = WM_SYSKEYUP) then // sólo hacemos caso cuando levante la tecla, a gusto
      ShowMessage('Hola mundo');
  end;
end;

pantomima1975 26-05-2025 08:32:01

Muchas gracias por las respuestas!


La franja horaria es GMT +2. Ahora son las 12:07:00.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi