2016-04-19 16 views
2

テスト用の新しいFMXプロジェクトを作成しました。 TabControlを追加しました。コンテキストメニューを使用して3つのタブシートを追加しました。 3番目のタブシートに、TEditを追加しました。 OnChangeEventハンドラをtabcontrolに追加しました。Delphi FMXがフォーカスを特定のコントロールに設定してカーソルが表示されるようにしました。

procedure TForm1.TabControl1Change(Sender: TObject); 
begin 
    if TabControl1.ActiveTab = TabItem3 then 
    begin 
    self.ActiveControl := Edit1; 
    self.Focused := Edit1; 
    Edit1.SetFocus; 
    end; 
end; 

これまでのVCLの経験から、さまざまな組み合わせを試しました。入力/カーソルのフォーカスはEdit1のコードに変更されません。もちろん、Win32で実行時にedit1をクリックすると、フォーカス矩形(スタイルを使用しています)にカーソルが表示されるようになりました。 (期待通り)Androidで。 VKは私が焦点を自分自身に移すときにのみ出現する。

これをプログラムで実行する方法はありますか?ユーザーは入力を開始できるだけですか? (フォーカスをTEdit自身にシフトさせる必要はありません)。

+0

この「OnTabControl1Change」イベントでは、おそらくフォーカスを変更できません。フラグを設定し、このフラグをタイマーでチェックするか、フォームに遅延メッセージを送信します。 –

+0

興味深い答え! OnCanFocusイベントハンドラをTEditに置き、呼び出されました。カーソル(とVK)が表示されないことだけです。私がタイマーを使うつもりなら、私は匿名のスレッドを使うかもしれません... – nolaspeaker

+0

はい、私はちょうどあなたのために匿名のスレッドを書いていました!さて、あなたはそれを得て以来、将来の読者が見るためにあなたの質問に答えてください。 –

答えて

5

firemonkeyフレームワークは、一部のイベントでフォーカスの変更を禁止します。

フォーカスを変更するには、遅延メッセージをフォームに送信します。専用の手順を使用し、それがより一般的にするために

procedure TForm1.TabControl1Change(Sender: TObject); 
begin 
    if TabControl1.ActiveTab = TabItem3 then 
    begin 
    TThread.CreateAnonymousThread(
     procedure 
     begin 
     TThread.Synchronize(nil, 
      procedure 
      begin 
      Edit1.SetFocus; 
      end 
     ); 
     end 
    ).Start; 
    end; 
end; 

これは匿名のスレッドで行うことができるXE6で

procedure DelayedSetFocus(control : TControl); 
begin 
    TThread.CreateAnonymousThread(
    procedure 
    begin 
     TThread.Synchronize(nil, 
     procedure 
     begin 
      control.SetFocus; 
     end 
    ); 
    end 
).Start; 
end; 
+0

スレッドの実行部分にわずかな遅延を含めるのではないですか?睡眠(100)のような何か? – nolaspeaker

+0

同期がとれているので、遅延が必要なのかどうかわかりません。私はあなたがそれを試すことをお勧めします –

0

ときに私を示唆したコードだけで働いていました2行目の手続きの後にbeginを追加しました:

procedure DelayedSetFocus(control : TControl); 
begin 
    TThread.CreateAnonymousThread(
    procedure 
    begin 
     TThread.Synchronize(nil, 
     procedure 
     begin 
      control.SetFocus; 
     end 
    ); 
    end 
).Start; 
end; 
+0

コードをフォーマットしてください – RBA

関連する問題