В Virtual Treeview Майка Лишке был добавлен обходной код для исправления ошибки при использовании < strong>TVWebBrowser в той же форме.
Проблема заключалась в том, что если пользователь пытается взаимодействовать с TOleControl (от которого происходит TWebBrowser), первый щелчок мыши съедается. Затем они должны щелкнуть еще раз, чтобы передать фокус управления. Затем они могут взаимодействовать с элементом управления.
У него есть комментарии, чтобы объяснить:
Каждый элемент управления, производный от
TOleControl
, потенциально имеет проблему с фокусом.Во избежание включения модуля OleCtrls (в который, среди прочего, будут включены Варианты), который позволил бы протестировать класс
TOleControl
, для классаTOleControl
используется интерфейсIOleClientSite
. test, который поддерживаетсяTOleControl
и хорошим индикатором.
Из полного фрагмента:
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;
Проблема в том, что обходной путь больше не работает для меня. И, честно говоря, я понятия не имею, в чем на самом деле была проблема, и как его решение ее устранило.
Есть ли кто-нибудь, кто знает, что его комментарии понимают, о чем он говорит, может объяснить, в чем проблема, и как то, что он делает, должно было ее исправить?
Обходной путь для обернутых элементов управления, отличных от VCL (например, TWebBrowser), которые не используют механизмы VCL и оставляют свойство ActiveControl в неправильном состоянии, что вызывает проблемы при перефокусировке элемента управления. Каждый элемент управления, производный от TOleControl, потенциально имеет проблему с фокусом.
Код достигает намеченного
Form.ActiveControl := nil;
заявление, но это просто не делает трюк.
я бы это исправил, но понятия не имею, как он это обнаружил или как могло случиться, что TOleControl не использует механизмы VCL и оставляет свойство ActiveControl в неправильном состоянии< /эм>.
Бонусное чтение
Первоначально я задал этот вопрос в borland.public.delphi.nativeapi.win32
группе новостей в 2008 г.
Поднять 20110515 (12 месяцев спустя)
Bump 20150401 (7 лет спустя): по-прежнему не работает в XE6.
Bump 20210309 (11 лет спустя)