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.

  1.  SelectNext (TcxCurrencyEdit (Sender), True, True); // anche tentativi di base

  2.  SelectNext (Mittente come TWinControl, True, True);

  3.  Esegui (WM_NEXTDLGCTL, 0, 0);

  4. 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.

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top