Delphi - OnKeyPress происходит до того, как TStringGrid обновляет ячейку новым персонажем - PullRequest
1 голос
/ 07 апреля 2010

Кодирование в Delphi, присоединение обработчика события OnKeyPress к TStringGrid:

Событие OnKeyPress срабатывает до того, как ячейка сетки, в которую вводит пользователь, фактически обновит свое значение с нажатой клавишей.Это, очевидно, проблема, когда я хочу узнать, что содержимое этой ячейки в данный момент , как, например, пользователь изменяет его.

"Взломанное" решение простое, если вы не рассматриваете каждую деталь: просто возьмите значение из ячейки и, поскольку событие OnKeyPress приходит вместе с параметром Key , добавьте это значение в конец - теперь у вас есть текущее значениеклетка!

Ложь.Что делать, если пользователь выделил весь текст в ячейке (например, «foo») и теперь он печатает «b».Поскольку они выбрали текст, он будет удален и заменен буквой «b».Однако значение ячейки все равно будет отображаться как «foo» в OnKeyPress, а значение Key будет равно «b», поэтому приведенная выше логика заставит приложение сделать вывод, что ячейка теперь содержит »foob ​​", что, как мы знаем, не соответствует действительности.

Итак. Кто-нибудь знает, как обойти эту проблему?Есть ли способ заставить OnKeyPress реагировать после содержимого сетки, было обновлено, или, возможно, способ принудительного обновления в начале обработчика?Я отчаянно избегаю использования события OnKeyUp здесь, поэтому любые предложения, кроме этого, будут с благодарностью.

1 Ответ

5 голосов
/ 07 апреля 2010

Если вы хотите отреагировать на изменение в ячейке значение почему вы не используете событие OnSetEditText ?

События клавиатуры предназначены для ответа на клавиатурный ввод , а не управляющий ответ на этот ввод.Элемент управления обычно предоставляет одно или несколько дополнительных событий, чтобы приложение могло реагировать на ответ элементов управления на некоторый ввод - в этом случае, когда ввод с клавиатуры приводит к изменению значения ячейки, а не к изменению выбора ячейки, например.

Кроме того, вполне естественно, что эти события должны происходить до , чтобы сетка контролировала реакцию на эти события, чтобы вы могли эффективно "фильтровать" такие события до они достигают элемента управления, например, до не позволяют конкретному вводу с клавиатуры воздействовать на значение ячейки.

...