Dans Virtual Treeview de Mike Lischke, il y avait le code de contournement ajouté pour corriger un bogue lors de l'utilisation d'un contrôle TWebBrowser sur le même formulaire.Delphi: TOleControl met ActiveControl dans un mauvais état?
Le problème est que si l'utilisateur tente d'interagir avec un TOleControl (dont TWebBrowser descend), le premier clic de la souris est mangé. Ils doivent ensuite cliquer à nouveau pour donner le focus de contrôle. Puis ils peuvent interagir avec le contrôle.
Il a des commentaires à expliquer:
Chaque contrôle dérivé de
TOleControl
a potentiellement le problème de mise au point.Afin d'éviter d'inclure le OleCtrls unité (qui, entre autres, inclure variantes), qui permettrait de tester la classe
TOleControl
, l'interfaceIOleClientSite
est utilisée pour le test, qui est soutenu parTOleControl
et un bon indicateur.
De la pleine snippit:
procedure TBaseVirtualTree.WMKillFocus(var Msg: TWMKillFocus);
var
Form: TCustomForm;
Control: TWinControl;
Pos: TSmallPoint;
Unknown: IUnknown;
begin
inherited;
[snip]
{
Workaround for wrapped non-VCL controls (like TWebBrowser),
which do not use VCL mechanisms and
leave the ActiveControl property in the wrong state,
which causes trouble when the control is refocused.
}
Form := GetParentForm(Self);
if Assigned(Form) and (Form.ActiveControl = Self) then
begin
Cardinal(Pos) := GetMessagePos;
Control := FindVCLWindow(SmallPointToPoint(Pos));
{
Every control derived from TOleControl has potentially
the focus problem. In order to avoid including
the OleCtrls unit (which will, among others, include Variants),
which would allow to test for the TOleControl
class, the IOleClientSite interface is used for the test,
which is supported by TOleControl and a good indicator.
}
if Assigned(Control) and Control.GetInterface(IOleClientSite, Unknown) then
Form.ActiveControl := nil;
// For other classes the active control should not be modified. Otherwise you need two clicks to select it.
end;
end;
problème est que la solution de contournement ne fonctionne plus pour moi. Et pour être honnête, je n'ai aucune idée du problème et de la façon dont sa solution l'a résolu. Y a-t-il quelqu'un qui sait ce que ses commentaires comprennent de ce dont il parle, qui pourrait expliquer quel est le problème et comment ce qu'il fait était censé le réparer?
Solution pour enveloppées contrôles non-VCL (comme TWebBrowser), qui ne utilisent pas des mécanismes VCL et laissent la propriété ActiveControl dans le mauvais état , ce qui provoque des problèmes lorsque le contrôle est recentré. Chaque contrôle dérivé de TOleControl a potentiellement le problème de mise au point.
Le code atteint l'intention
Form.ActiveControl := nil;
déclaration
, mais il fait est tout simplement pas l'affaire.
je voudrais corriger, mais je ne sais pas comment il l'a trouvé, ou comment il peut venir à ce sujet TOleControl ne «l'utilisation des mécanismes de VCL et laisse la propriété ActiveControl dans le mauvais état."
Bonus lecture
J'ai demandé à l'origine cette question on borland.public.delphi.nativeapi.win32
newsgroup in 2008
Bump 20110515 (12 mois plus tard)
Bump 20150401 (7 ans plus tard): Encore biche travail sn't dans XE6
Virtual TreeView est désactivé. Dernière version du 14. mars 09? Probablement le plus grand composant Delphi à mon humble avis. – Tom
Il était défunt quand j'ai d'abord posé la question. Quand Mike est passé au développement Mac et MySQL, ça ne semblait pas bien pour VT. Il y a un soutien sporadique, mais rien d'officiel. –
Lors de la relocalisation de cette question pour utiliser des balises existantes, j'ai trouvé que la balise tvirtualtreeview existait déjà dans cette question: http://stackoverflow.com/questions/687438/. Vous sauriez mieux ce qui est correct, alors cela vous dérangerait-il de changer l'un d'entre eux? Merci. –