Странное поведение wm_keydown с помощью THtmlEdit

Это странно: это ситуация

Приложение создает форму редактирования во время выполнения из документа XML. Дизайн UI / UX таков, что существует три уровня вложенных TTabControls, а для окончательного (самого низкого) уровня TTabItem создается во время выполнения. У этого есть TVerScrollBox, который сам содержит элемент управления сеткой столбца и что (наконец!) Содержит THtmlEditor.

Проблема в том, что когда элементы управления построены и загружается контент, THtmlEdit изначально игнорирует keydown. Он будет реагировать на события мыши, каретку можно позиционировать. Переключаясь на другую вкладку верхнего уровня или удаляясь от всего приложения и обратно, вылечитесь от проблемы, и редактор отвечает на сообщения с клавиатуры.

Я попытался поставить точку останова в procedure THtmlEditor.KeyDown()... и затем отслеживать резервную цепочку вызовов. Кажется, что ничего не происходит по-другому. Я уделил особое внимание фокусу ввода, явно назвав Editor.function TPlatformWin.HandleMessage: Boolean; хотя это, по-видимому, уже называется ...

Я попытался поставить условную точку останова в DispatchMessage(Msg)... и мое единственное наблюдение заключается в том, что в нерабочем режиме вызов OnFocusChangedне поступает в редактор или его родительскую форму.

Я уже пытался построить MDC для этого, тиражирования структуры , описанную выше , но ... это всегда работает!

Что я могу попробовать дальше? Кто-нибудь видел это поведение (и исправил его)?

РЕДАКТИРОВАТЬ:

Деталь, о которой я не упоминал, - не думал об этом - это то, что для условия ошибки показать, управление сосредоточено до того, как THmtlEditor является TWebBrowser. Если я установлю фокус на TEdit после TWebBrowser, а затем на THtmlEditor, это сработает.

Хмм!

delphi,firemonkey,

1

Ответов: 1


0

Это всего лишь половина ответа, но для справок в будущем это то, что я сделал:

Это бокс :-(

Я поместил TEdit в основную форму и установил ее невидимым. Затем я добавил обработчик MainForm, OnClickкоторый устанавливает логический флаг ловушки, чтобы отслеживать, было ли ранее настроено TWebBrowser.

Для экземпляров THtmlEditor я добавил SetFocusобработчик, который проверяет флаг trap и делает TEdit видимым, вызывает SetFocusего, снова скрывает TEdit и возвращает True, чтобы THtmlEditor мог повторно установить фокус на себя. Флаг ловушки должен избегать излишней потери фокуса, если пользователь просто щелкает в THtmlEditor.

Следующим шагом, на который я, возможно, никогда не доберусь, будет отслеживание кода фокуса для TEdit. Мое подозрение в том, что все это связано с тем, ITextInputчто поддерживает TEdit, а THtmlEditor этого не делает.

Дельфы, FireMonkey,
Похожие вопросы