Come passare al controllo successivo all'interno di un frame?
-
08-07-2019 - |
Domanda
In una forma della mia applicazione, aggiungiamo set di dati aggiungendo frame al modulo. Per ogni frame, vogliamo essere in grado di passare da un controllo di modifica (Dev Express Editor) a quello successivo premendo il tasto Invio. Finora ho provato quattro metodi diversi negli eventi KeyPress e KeyUp del mio controllo.
-
SelectNext (TcxCurrencyEdit (Sender), True, True); // anche tentativi di base
-
SelectNext (Mittente come TWinControl, True, True);
-
Esegui (WM_NEXTDLGCTL, 0, 0);
-
f: = TForm (self.Parent); // f è TForm o la mia forma c: = f.FindNextControl (f.ActiveControl, true, true, false); // c è TWinControl o TcxCurrencyEdit se assegnato (c) quindi c.SetFocus;
Nessuno di questi metodi funziona in Delphi 5. Qualcuno può guidarmi per farlo funzionare? Grazie.
Soluzione
Funziona in Delphi 3, 5 e 6:
Imposta la proprietà KeyPreview del form su True.
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
If (Key = #13) then
Begin
SelectNext(ActiveControl as TWinControl, True, True);
Key := #0;
End;
end;
Altri suggerimenti
Ho trovato un vecchio progetto che cattura il messaggio CM_DIALOGKEY
quando l'utente preme il tasto Invio e quindi attiva il tasto VK_TAB
. Funziona con un numero di controlli diversi.
interface
...
procedure CMDialogKey(var Message: TCMDialogKey);message CM_DIALOGKEY;
implementation
...
procedure TSomeForm.CMDialogKey(var Message : TCMDialogKey);
begin
case Message.CharCode of
VK_RETURN : Perform(CM_DialogKey, VK_TAB, 0);
...
else
inherited;
end;
end;
L'evento onKeyPress è trigerato come qualsiasi altra forma.
Il problema è che la procedura perform (wm_nextdlgctl, 0,0) non funziona all'interno del frame.
Devi conoscere il controllo attivo per attivare l'evento corretto.
procedure TFrmDadosCliente.EditKeyPress(Sender: TObject; var Key: Char);
var
AParent:TComponent;
begin
if key = #13 then
begin
key := #0;
AParent:= TComponent(Sender).GetParentComponent;
while not (AParent is TCustomForm) do
AParent:= AParent.GetParentComponent;
SelectNext(TCustomForm(AParent).ActiveControl, true, true);
end;
end;
È possibile posizionare un TButton sul modulo, renderlo piccolo e nasconderlo sotto qualche altro controllo. Impostare la proprietà Predefinita su true (che consente di ottenere il tasto Invio) e inserire quanto segue nell'evento OnClick:
SelectNext(ActiveControl, true, true);