7
votes

Comment supprimer la mise au point du composant actuellement ciblé?

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?


1 commentaires

Sur une note latérale, aucune des solutions ci-dessous ne semble fonctionner dans le formulaire Oncreate ou ONSHOW Événements. Onactive fonctionne, mais quelque chose finit Se concentrer de toute façon après avoir cliqué sur le formulaire.


4 Réponses :


3
votes

Regardez sur tcustomform.focuscontrol . 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.


1 commentaires

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



14
votes

Vous pouvez utiliser:

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


3 commentaires

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!



10
votes

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;


0 commentaires

2
votes

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

windows.setfocus (0);


1 commentaires

Serait génial, comme je cherche un niveau mondial pour accomplir cela. Malheureusement, je viens d'essayer dans le formulaire Oncreate et ONSHOW Mais l'accent est toujours allé quand même.