J'ai un composant dB que DataLink.updaterecord est appelé lorsqu'il reçoit un message CM_EXIT. Ce message est envoyé lorsqu'il perd la mise au point. Lorsque je clique sur le bouton POST, il ne perd pas la concentration et la valeur n'est pas écrite sur DataSource. Comment puis-je atteindre un effet de la composante perdant la concentration sans le changer d'autre? P>
4 Réponses :
Regardez sur tcustomform.focuscontrol code>. Vous ne pouvez pas faire perdre la concentration sans changer de mise au point sur autre chose, mais vous pouvez basculer puis revenir immédiatement, ce qui fonctionnerait probablement. P>
Et comment puis-je le faire avec FocaControl? L'appeler sur le contrôle actif ne déclenche pas les événements.
Vous pouvez utiliser:
procedure TCustomForm.DefocusControl(Control: TWinControl; Removing: Boolean);
J'ai examiné cette procédure, essayé de l'utiliser et ça n'a pas fonctionné. Maintenant je l'ai fait de nouveau et ça marche. Il est temps d'aller dormir :)
Comme cela se produit, régler Self.Activecontrol: = nil le travail aussi et est plus intuitif. Évidemment pas pour moi ....
@Lukled merci, c'est génial!
Nous y accomplissons en réglant le Self.Activecontrol: = nil. Cela provoque l'incendie de tous les événements de sortie. Dans notre cas, nous voulions également revenir sur le contrôle après la fin de la sauvegarde. Cela nécessitait quelques contrôles supplémentaires pour nous assurer que nous avons eu un bon contrôle qui pourrait accepter la mise au point.
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: p>
windows.setfocus (0); code> p>
Serait génial, comme je cherche un niveau mondial pour accomplir cela. Malheureusement, je viens d'essayer dans le formulaire Oncreate CODE> et
ONSHOW CODE> Mais l'accent est toujours allé quand même.
Sur une note latérale, aucune des solutions ci-dessous ne semble fonctionner dans le formulaire
Oncreate CODE> ou
ONSHOW CODE> Événements.
Onactive code> fonctionne, mais quelque chose finit Se concentrer de toute façon après avoir cliqué sur le formulaire.