2016-10-12 4 views
1

Это странно: Это ситуацияСтранно WM_KEYDOWN поведение с THtmlEdit

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

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

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

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

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

EDIT:

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

Grrr!

+0

Возможно, у вас есть свойство KeyPreview', равное 'true' в вашей форме.? Это может привести к тому, что сообщение 'wm_keydown 'уже обрабатывается вашей формой до того, как оно достигнет вашего HTML-редактора.Также есть ли у вас какой-то другой элемент управления, который может принимать входной сигнал клавиатуры, например, в поле «Редактировать»? Если у вас есть чек, чтобы проверить, не может ли ваше нажатие клавиши не обрабатываться этим элементом управления. – SilverWarior

+0

@SilverWarrior Это приложение Firemonkey, и я не думаю, что есть свойство KeyPreview. –

ответ

0

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

Это латать :-(

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

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

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