2016-03-22 4 views
0

商品や顧客を検索するのに役立ついくつかのフォームがあります。私がこれらのフォームを開くとき、私は集中する検索のために入力するTEditコントロールが欲しいです。私はそれのためにタイマーを使用してきましたが、私はこれがフォームの表示されていないときに制御が集中するように指示されている場合にエラーを引き起こすので、これを行うより合法的な方法を探してきました。フォームの後にフォーカスコントロールが表示されます

フォームのOnShowイベントの最後に呼び出されるWindowsメッセージAfterShowを使用しようとしました。これは、ActiveControlまたはSetFocusの他のより簡単なソリューションとしては機能しません。ウィンドウのメッセージコードはこれです。

const WM_AFTER_SHOW = WM_USER + 444; 
    private 
    procedure WmAfterShow(var Msg: TMessage); message WM_AFTER_SHOW; 

procedure Tproducts_edit_form.WmAfterShow(var Msg: TMessage); 
begin 
self.ActiveControl:= search_txt; 
//showmessage(Screen.ActiveControl.Name); 
//PostMessage(search_txt.Handle, WM_SETFOCUS, 0, 0); 
end; 

奇妙なことがshowmessageとのpostMessage両方のコメントを外した場合、TEDITが正しくフォーカスを取得することです。私がしない場合は、フォームが開きますが、Screen.ActiveControl.Nameがフォーカスを持っているコントロールが必要だと言っても、TEditはフォーカスされません。

アイデア?

+2

編集コントロールに 'TabOrder'が' 0'であるようにしてください。 –

+0

私はそれを動作させることはできません... TEditのTabOrderプロパティとそのすべての親コンテナがTabOrder:= 0を持っていることを確認しました。 – Mitsoloth

+0

そのコメントを理解できません。あなたは自分と話しているようです。 –

答えて

-1

windowsmessage技術が動作しており、実際にフォーカスを合わせるコントロールのTabOrderがゼロでなければなりません。

私が抱えていた問題は、コントロールがドッキングされているDevExpressバーに横たわっていました。これらのバーが動作する方法は、DevExpressバーにドッキングされているDevExpress以外のコントロールにフォーカスすることを不可能にします。

+0

質問にその言及はありません。だからこそ、私たちはレプロを持っていたはずです。 –

+0

これは、このような問題を引き起こす可能性があるとは思わなかった...私の限られた経験のサイン。時間をいただきありがとうございます。 – Mitsoloth

+0

完全に理解できるように問題を切り分けながら、常に価値があります。そうしないと、よくない悪い問題が解決されます。シンプル化シンプル化シンプル化! –

1

...コントロールにフォーカスを設定するForm.ActiveControl(ないScreen.ActiveControl)プロパティを使用しますが、ないOnCreateイベントなどで、OnShowにそれを使用する正しい:

//--------------------------------------------------------------------------- 
void __fastcall TForm1::FormShow(TObject *Sender) 
{ 
    ActiveControl = Edit1; 
} 

れていない場合はおそらく手動のウィンドウメッセージハンドラ、メッセージキューを妨害するためです。