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
Vous pouvez utiliser:
procedure TCustomForm.DefocusControl(Control: TWinControl; Removing: Boolean);
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.
Et comment puis-je faire avec FocusControl? L'appeler sur le contrôle actif ne déclenche pas d'événements. – LukLed
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;
Il existe une fonction SetFocus dans l'unité Windows. Essayez ceci:
Windows.SetFocus(0);
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
Comme il se produit, la définition de Self.ActiveControl: = nil fait le travail aussi et est plus intuitive. Évidemment pas pour moi .... – LukLed
@LukLed: Bon conseil, merci! – Sharken