В Virtual Treeview Майка Лишке был обходной код
добавлено для исправления ошибки при использовании элемента управления TWebBrowser в той же форме.
Проблема заключалась в том, что если пользователь пытается взаимодействовать с TOleControl (с которого TWebBrowser спускается), первый клик мыши съедается. Затем они должны нажать еще раз, чтобы дать фокус управления. Тогда они могут взаимодействовать с управлением.
У него есть комментарии, чтобы объяснить:
Каждый элемент управления, полученный из TOleControl
, потенциально имеет проблему с фокусом.
Во избежание включения модуля OleCtrls (который, помимо прочего, будет включать Варианты ), который позволил бы тестировать класс TOleControl
, IOleClientSite
Для теста используется интерфейс, который поддерживается 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 году
Вопрос на форуме Soft-Gems
Bump 20110515 (12 месяцев спустя)
Bump 20150401 (7 лет спустя): все еще не работает в XE6