2011-09-05 1 views
5

私は2つのTEditコントロールを持っています。 edit1からタブアウトすると、 edit2がフォーカスを受け取ります。TEditフォーカスとキャレット

procedure TForm1.Edit1Exit(Sender: TObject); 
begin 
    edit2.Enabled := false; 
    edit2.Enabled := true; 
    edit2.setfocus; 
end; 

EDIT2にフォーカスがある:EDIT1 の私のフォーカス喪失時のイベントで、私は次のコードを持っています。しかし、そこにはキャレットはありません。 入力を開始することはできますが、わかりにくいので、コントロールにフォーカスがある が混乱しています。

いくつかのメッセージの原因となっている有効なプロパティ が正しく発射されていませんか?たとえば、edit2のOnEnterイベント がトリガーされていません。

これはまったく問題がなければ、D2006にあります。

返信いただきありがとうございます。私はあなたが無効理由を理解してedit2を有効にしていますが、これを行わない

+1

なぜこれをやりたいですか? –

+0

編集2を無効にして有効にすることの間には、一連のコードがあります。それは必ずしもedit2ではありませんが、activecontrolが何であれです。アクティブコントロールを再度有効にした後、フォーカスをリセットしたいと思います。まあ、それは確かにアクティブなコントロールですが、キャレットはありません。 – Rick

答えて

8

procedure TForm1.Edit1Exit(Sender: TObject); 
begin 
    edit2.Enabled := false; 
    edit2.Enabled := true; 
    edit2.setfocus; 
    PostMessage(edit2.Handle, WM_SETFOCUS, 0, 0); 
end; 

ところで、私はアンドレアスRejbrandに同意します。

+1

私は個人的にこの方法を好む 割り当てられている場合(ActiveControl) PostMessage(ActiveControl.Handle、WM_SETFOCUS、0,0); フォーカスを別のコントロールに設定した後。特定の操作の後、Windows APIはアクティブなコントロールを認識しないように見えるため、OnExit/OnEnterイベントは適切にトリガーされません。この行はそれを修正します。 – ertx

+0

私は同意しますが、彼が別のコンポーネントに焦点を当てることができるかどうかわかりません... – Whiler

+0

これは、ありがとう!私は、フォーカスとキャレットを再描画しない理由を調べるイベントの連鎖をトレースしようとしました。 WndProcの壁に突き当たり、そこにループするだけで、どのようなメッセージが処理されたのか分かりません。 – Rick

8

私は真剣にあなたが何か悪い方法でやっていると思っています。最良の解決策は、ほとんどの場合再設計です。フォーカスを受けている間は、コントロールを無効にしてから有効にする必要はありません。

+0

私は同意する、それは理想的ではない。回避策があることを確認してください。しかし、私はキャレットとフォーカスのために何が必要なのか不思議です。 Windowsのメッセージのチェーンを壊すOnExitイベントで、アクティブコントロールを無効にする方法。 – Rick

0

edit2を無効にしてから有効にするまでのコードはたくさんあります。前のアクティブコントロールのフォーカス喪失時のイベントハンドラのコードの多くを持つ

ないは、次のアクティブコントロールを無効にする必要がありません。そのコードが実行され、次のアクティブなコントロールがキャレットを表示し、ユーザー入力を受け取ることができます。新しいスレッドを開始するか、Application.ProcessMessagesを使用するなどの方法で実行を渡すことはしないでください。

Screen.CursorcrHourGlassに設定すると、次のアクティブコントロールがまだ準備されていないことがユーザーにわかります。

0

OnActive for MainFormが別のフォームをアクティブにするときに問題が見つかりました。

TMainForm.OnActivate; 
begin 
ChildForm.ShowModal; 
end; 

コントロールフォーカスは設定されていますが機能しません。私の周りの仕事はPostMessage(ハンドル、WM_SETFOCUS、0、0)を送信していた。フォームハンドルに移動します。

procedure TChildForm.FocusControl(AWinControl: TWinControl); 
begin 
    try 
    // http://stackoverflow.com/questions/7305296/tedit-focus-caret 
    PostMessage(Handle, WM_SETFOCUS, 0, 0); 
    PostMessage(AWinControl.Handle, WM_SETFOCUS, 0, 0); 
    if AWinControl.CanFocus then 
     AWinControl.SetFocus; 
    except 
    on E: Exception do 
    begin 
     Error(Self, E); 
    end; 
    end; 
end; 
関連する問題