2016-03-22 19 views
0

Bir ürün veya müşteri aramama yardımcı olan bazı formlarım var. Bu formları açtığımda, arama yapmak için yazdığım TEdit denetiminin odaklanmasını istiyorum. Bunun için bir Zamanlayıcı kullanıyorum, ancak kontrolün formun henüz görünmediği zaman odaklanılması gerektiği söylenirse, bazen hatalara neden olduğu için bunu yapmak için daha yasal bir yol arıyordum.Formdan sonra odak denetimi gösteriliyor

Formumun OnShow olayının sonundaki bir AfterShow adlı Windows iletisini kullanmayı denedim. ActiveControl veya SetFocus'un diğer basit çözümleri olarak çalışmaz. Pencere mesaj kodu budur.

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; 

Garip şey, yorumsuz ShowMessage ve PostMessage hem TTimer odağı alırsa doğru olduğunu. Eğer yapmazsam, form açılır ancak Screen.ActiveControl.Name istediğim kontrole odaklanmamı söylese bile TEdit odaklanmaz.

Herhangi bir fikrin var mı?

+2

Düzenleme denetimini 'TabOrder '' '' 'yapın ve yapmanız gereken tek şey budur. –

+0

Çalışmayı başaramıyorum ... TEdit'in TabOrder özelliğinin ve tüm üst kapsayıcılarının TabOrder olduğundan emin olun: = 0 – Mitsoloth

+0

Bu yorumu anlayamıyorum. Kendinle konuşuyor gibisin. –

cevap

-1

WindowsMessage tekniği çalışıyor ve gerçekten kontrol edilecek denetimin TabOrder'i sıfır olmalıdır.

Sahip olduğum problem, kontrolümün sabitlendiği DevExpress Bar'da yatıyordu. Bu çubukların çalışma şekli, bir DevExpress Çubuğuna yerleştirilmiş bir DevExpress kontrolüne odaklanmayı imkansız kılar.

+0

Soruda bundan bahsedilmiyor. Bu yüzden bir repro yapmalıydık. –

+0

Bunun böyle bir soruna neden olabileceğini hiç düşünmemiştim ... sınırlı deneyimimin işareti. Zamanınız için teşekkür ederiz. – Mitsoloth

+0

Her zaman bir problemi izole ederken, onu tamamen anlamanız için değer. Aksi takdirde, genellikle daha kötü olan yanlış problemi çözersiniz. Basitleştirmeyi basitleştirin! –

1

O .. denetimde odak ayarlamak için Form.ActiveControl (değil Screen.ActiveControl) özelliği kullanmak değil, OnCreate vb, OnShow kullanmak için doğrudur:

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

Böyle olmazsa iş, belki pencere mesaj işleyici ile manuel müdahale, mesaj kuyruğu nedeniyle.

İlgili konular