Выделение текста в ячейке TStringGrid - PullRequest
0 голосов
/ 22 февраля 2020

Используемый мной компонент является потомком TStringGrid , который называется TDataGrid (который можно найти на Torry ). К сожалению, в нем есть небольшая ошибка, которой нет в исходном компоненте TStringGrid . У меня есть опции goEditing и goAlwaysShowEditor обе включены, поэтому я ожидаю, что текст ячейки будет выбран, когда элемент управления получит фокус ввода. Но в случае TDataGrid этого не произойдет, если я нажму клавишу TAB, чтобы перейти от одного элемента управления к элементу управления сеткой. Он получает фокус ввода, но ничего не выбрано, и каретка даже не видна. Очевидно, это очень вводит в заблуждение пользователя.

Исходный компонент TStringGrid имеет аналогичные несоответствия, где, если у вас включен goAlwaysShowEditor , всегда есть одна ячейка с ее текст «выставлен» (сфокусирован, даже если сам элемент управления сеткой не имеет фокуса), поэтому, если вы щелкнете левой кнопкой мыши в этой ячейке, текст также не будет выделен, просто включите курсор. Однако я смог обойти это, просто отключив goAlwaysShowEditor , когда элемент управления сетки не имеет фокуса, и впоследствии включив его, когда сетка получает фокус.

Так же, как и TStringGrid есть какой-нибудь способ выделения текста ячейки? Я знаю, как установить фокус на ячейку, но я не нашел способа на самом деле выделить текст. На самом деле был бы признателен за любые идеи, чтобы обойти это!

FWIW, я использую Delphi 10.3

1 Ответ

0 голосов
/ 23 февраля 2020

Я нашел одно решение, которое на самом деле кажется работающим, но оно обрабатывает очень конкретный c сценарий, когда вы вкладываете в элемент управления сеткой, и могут быть другие случаи, которые нужно обработать ..

Таким образом, управление выделением текста внутри ячейки IS возможно, но оно не будет работать, если вы попытаетесь управлять им во время события OnEnter. Поэтому вместо этого мне пришлось прибегнуть к проверке TAB в событии OnKeyUp, где оно будет работать.

Вам необходимо предоставить защищенные члены TStringGrid для доступа к соответствующим методам. Это не самое красивое решение, но оно работает по крайней мере ...

type TStringGridHelper = class helper for TStringGrid
  procedure HHideEditor;
  procedure HShowEditor;
end;

procedure TDataGridHelper.HHideEditor;
begin
  HideEditor;
end;

procedure TDataGridHelper.HShowEditor;
begin
  ShowEditor;
end;

И в обработчике событий OnKeyUp ...

if Key = VK_TAB then begin
  StringGrid.HHideEditor;
  StringGrid.HShowEditor;
end;
...