2010-02-15 4 views
5

J'ai un composant DB auquel DataLink.UpdateRecord est appelé lorsqu'il reçoit le message CM_EXIT. Ce message est envoyé lorsqu'il perd le focus. Lorsque je clique sur le bouton post, il ne perd pas le focus et la valeur n'est pas écrite dans la source de données. Comment puis-je atteindre un effet de perte de focus du composant sans passer à un autre?Comment supprimer la mise au point d'un composant actuellement ciblé?

Répondre

7

Vous pouvez utiliser:

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

J'ai regardé cette procédure, essayé de l'utiliser, et cela n'a pas fonctionné. Maintenant, je l'ai fait à nouveau et ça fonctionne. Il est temps d'aller dormir :) – LukLed

+9

Comme il se produit, la définition de Self.ActiveControl: = nil fait le travail aussi et est plus intuitive. Évidemment pas pour moi .... – LukLed

+0

@LukLed: Bon conseil, merci! – Sharken

3

Jetez un oeil à TCustomForm.FocusControl. Vous ne pouvez pas le faire perdre la mise au point sans passer au focus sur autre chose, mais vous pouvez basculer et ensuite revenir immédiatement, ce qui fonctionnerait probablement.

+0

Et comment puis-je faire avec FocusControl? L'appeler sur le contrôle actif ne déclenche pas d'événements. – LukLed

7

Nous accomplissons ceci en réglant le Self.ActiveControl: = nul. Cela provoque tous les événements de sortie à tirer. Dans notre cas, nous voulions également nous recentrer sur le contrôle après la sauvegarde. Cela a exigé quelques vérifications supplémentaires pour s'assurer que nous avions un bon contrôle qui pourrait accepter la concentration.

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

Il existe une fonction SetFocus dans l'unité Windows. Essayez ceci:

Windows.SetFocus(0);

Questions connexes