Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Maverich - Ottobre 26, 2014, 08:50:14 pm

Titolo: intercettare OnKeyDown
Inserito da: Maverich - Ottobre 26, 2014, 08:50:14 pm
windows
in un TForm vuoto setto KeyPreview := true
l'evento OnKeyDown funziona, se pero' aggiungo un TPanel l'evento non viene piu' intercettato.

TPanel non risponde agli eventi, si riesce ad aggirare il problema ?

provando a fare l'override di FormkeyDown, mi segnala che la dichiarazione "differisce" dal quella della classe padre.
procedure Tfrm_FormBase.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); override;

procedure Tfrm_FormBase.FormCreate(Sender: TObject);
begin
 KeyPreview := True;
end;

procedure Tfrm_FormBase.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if ((ssAlt in Shift) and (Key = VK_F4)) then  Key := 0;  //ALT + F4
end;
Titolo: Re:intercettare OnKeyDown
Inserito da: El Salvador - Ottobre 27, 2014, 05:28:23 pm
A me funziona tutto perfettamente. Ma cosa vorresti fare precisamente?
Titolo: Re:intercettare OnKeyDown
Inserito da: Maverich - Ottobre 27, 2014, 09:54:53 pm
hai ragione funziona su un Form nuovo, il problema lo ho su un form ereditato.
devo verificare quel problema.
uso lazrus 1.2.2 - Fpc 2.6.4
Titolo: Re:intercettare OnKeyDown
Inserito da: Stilgar - Ottobre 28, 2014, 10:41:24 am
Nel form ereditato...
Hai Provato ad usare Inherited sull'handler del figlio?

Se non ne esci puoi sempre operare un hack sulla form "padre" in modo che i figli possano godere delle modifiche.
Per l'hack devi "sovrascrivere" il metodo che gestisce la gestione del messaggio nella coda. In questo modo puoi fare quello che vuoi.
Codice: [Seleziona]
    procedure KeyDown(var Key: Word; Shift: TShiftState); virtual;

Codice: [Seleziona]
procedure TWinControl.KeyDown(var Key: Word; shift : TShiftState);
begin
  if Assigned(FOnKeyDown) then FOnKeyDown(Self, Key, Shift);
end;
Codice: [Seleziona]
procedure TFORMPadre.KeyDown(var Key: Word; shift : TShiftState);
begin
  if ((ssAlt in Shift) and (Key = VK_F4)) then
begin
  Key := 0;  //ALT + F4 Impedisco la chiusura?
end
else
begin
  if Assigned(FOnKeyDown) then FOnKeyDown(Self, Key, Shift);
end;
end;