2

日付 (日/月/時) を表す 3 つの TEdit で構成されるカスタム Styledcontrol の子孫を作成しました。編集は .style ファイルの一部です。

コントロールがフォーカスを取得すると、最初の Edit がフォーカスを取得する必要があります。他の編集は、タブ移動によってフォーカスされるべきではありません。スタイル ファイルに tabstop = false があります。

constructor TPWCalendar.Create(AOwner: TComponent);
Oncanfocus:=FocusEdit;

procedure TPWCalendar.FocusEdit(Sender: TObject; var ACanFocus: Boolean);
begin
  ACanFocus:=false;
  if Findedits then
    if not FDayEdit.isfocused then
      FDayEdit.SetFocus;
end;

これは機能しますが、子の編集の 1 つがフォーカスされ、タブを押すと、最初に作成されたカスタム コントロールの最初の編集が選択されます。デフォルトの動作を持たせ、次のコントロールを 1 つのコントロールのように選択するにはどうすればよいですか? (したがって、フォーカスがコントロールのどこにあっても (edit1、edit2、または edit3)、タブを押すと次のコントロールが選択されます)。

PS: 適切な firemonkey コンポーネントのチュートリアルはありますか? スタイリングなどを検討中。

質問を更新しました

4

1 に答える 1

0

私は主な問題を解決しました。

プライベート oncanfocusEvent を設定することにより、最初の子 (FDayEdit) が選択されます。次に、DialogKey を上書きします。子の 1 つがフォーカスされると、メイン コンポーネントがフォーカスされます (これにより oncanfocusevent がトリガーされることに注意してください)。次に、デフォルトの動作が継承されて呼び出されます。

正しい方向に私を見せてくれたthnx slomoto。

PS: FindEdits は styleresource から編集を割り当て、失敗した場合は false を返します。

これは oncanfocusEvent です:

procedure TPWCalendar.FocusEdit(Sender: TObject; var ACanFocus: Boolean);
begin
  if findedits and ( fDayEdit.IsFocused or FMonthEdit.IsFocused or FYearEdit.IsFocused)
    then aCanFocus:=true
    else begin
      ACanFocus:=false;
      if Findedits then
        FDayEdit.SetFocus;
    end;
end;

次に、これはDialogKeyイベントです

procedure TPWCalendar.DialogKey(var Key: Word; Shift: TShiftState);
begin
  if key=vktab then
    if ischildfocused then begin
      self.SetFocus;
      inherited;
    end;
end;
于 2013-06-26T09:29:16.367 に答える