2010-02-15 23 views
5

CM_EXIT iletisi aldığında DataLink.UpdateRecord çağrılan bir DB bileşenim var. Bu mesaj odağı kaybettiğinde gönderilir. İleti düğmesini tıkladığımda, odağı kaybetmez ve veri kaynağı için değer yazılmaz. Bir diğerine geçmeden odak kaybetme bileşeninin etkisine nasıl ulaşabilirim?Odaklanmış bileşenlerden odaklanma nasıl kaldırılır?

cevap

7

Sen kullanabilirsiniz:

procedure TCustomForm.DefocusControl(Control: TWinControl; Removing: Boolean); 
+2

Bu işleme baktım, kullanmayı denedim ve işe yaramadı. Şimdi tekrar yaptım ve işe yarıyor. Uykuya gitme zamanı :) – LukLed

+9

Oluştukça, Self.ActiveControl: = nil işini yapar ve daha sezgiseldir. Açıkçası benim için değil .... – LukLed

+0

@LukLed: Harika bahşiş, teşekkürler! – Sharken

3

TCustomForm.FocusControl'a bakın. Odağı başka bir şeye dönüştürmeden odağı kaybettiremezsiniz, ancak geçiş yapabilir ve hemen sonra tekrar çalışmaya başlayabilirsiniz.

+0

Ve bunun FocusControl ile nasıl yapabilirim: Bu deneyin? Aktif kontrolde çağırmak olayları tetiklemez. – LukLed

7

Biz bunu gerçekleştirmek Self.ActiveControl ayarlayarak: = nil. Bu, tüm çıkış olaylarının ateşlenmesine neden olur. Bizim durumumuzda, kaydettikten sonra tekrar kontrol odağına tekrar odaklanmak istedik. Bu, odağı kabul edebilecek iyi bir kontrole sahip olduğumuzdan emin olmak için birkaç ekstra kontrol gerektirdi.

procedure TSaleEditor.SaveCurrentState(); 
var 
    SavedActiveControl: TWinControl; 
    AlternateSavedControl: TWinControl; 
begin 

    // Force the current control to exit and save any state. 
    if Self.ActiveControl <> nil then 
    begin 
    SavedActiveControl := Self.ActiveControl; 

    // We may have an inplace grid editor as the current control. In that case we 
    // will not be able to reset it as the active control. This will cause the 
    // Scroll box to scroll to the active control, which will be the lowest tab order 
    // control. Our "real" controls have names, where the dynamic inplace editor do not 
    // find an Alternate control to set the focus by walking up the parent list until we 
    // find a named control. 
    AlternateSavedControl := SavedActiveControl; 
    while (AlternateSavedControl.Name = '') and (AlternateSavedControl.Parent <> nil) do 
    begin 
     AlternateSavedControl := AlternateSavedControl.Parent; 
    end; 

    Self.ActiveControl := nil; 

    // If the control is a radio button then do not re-set focus 
    // because if you are un-selecting the radio button this will automatically 
    // re-select it again 
    if (SavedActiveControl.CanFocus = true) and 
     ((SavedActiveControl is TcxRadioButton) = false) then 
    begin 
     Self.ActiveControl := SavedActiveControl; 
    end 
    else if (AlternateSavedControl.CanFocus = true) and 
     ((AlternateSavedControl is TcxRadioButton) = false) then 
    begin 
     Self.ActiveControl := AlternateSavedControl; 
    end; 

    end; 

end; 
2

Windows biriminde bir SetFocus işlevi var.

Windows.SetFocus(0);

İlgili konular