2010-07-17 1 views
1

У меня есть сильно модифицированное управление на основе TStringGrid. Я хочу разрешить пользователю делать выбор в этой сетке, но ограничивать выбор одной единственной строкой (текущей строкой).TStringGrid грязный взломать - ограничение выбора на одну строку

Реализация: Когда пользователь нажимает левую кнопку мыши, я использую грязный взломать: В режиме OnMouseDown я захватываю курсор мыши и держу его в текущей строке. Пользователь может перемещать мышь вверх и вниз на своем пэде, но курсор не будет двигаться вверх или вниз. Он останется в текущем ряду. Когда пользователь отпускает кнопку (событие OnMouseUp), я освобождаю захват.

Однако этот хак, как я уже сказал, очень грязный. Есть несколько проблем. Например, если пользователь нажимает левую кнопку мыши (LMB), а затем не отпускает эту кнопку, он нажимает правую кнопку, появляется всплывающее меню, но захват мыши никогда не будет отпущен. Таким образом, мышь будет заблокирована в области экрана, пока у пользователя не будет блестящей идеи щелкнуть LMB еще раз, чтобы разблокировать мышь. Это может быть ошибка в D7. Существует отдельная статья об этом здесь: TStringGrid - OnMouseUp is not called!

Существует элегантный способ сделать это?


Edit: OnSelectCell не работает. Событие OnSelectCell вызывается только один раз, когда вы нажимаете на ячейку. Если вы удерживаете кнопку нажатой и перемещаете мышь, чтобы развернуть выделение, OnSelectCell больше не будет вызываться. Действительно MoveCurrent отображается только в TCustomGrid.MouseDown.

+1

Не ограничивайте движение мыши! Пользователи ненавидят вас за это и перестанут использовать ваше программное обеспечение. –

ответ

0

Этот ответ не является элегантным вообще, но он работает.

Мое решение НЕ использовать свойство PopupMenu для StringGrid. Вместо этого я реализовал свое собственное свойство PopUpMenu. Работа почти идеальна. Существует небольшая проблема, внизу всплывающего меню появляется рядом с курсором, а не сверху.

1

Используйте событие OnSelectCell и установите параметр CanSelect var в зависимости от того, является ли параметр ARow тем, что вы хотите.

+0

Не работает. OnSelectCell вызывается только один раз, когда вы нажимаете на ячейку. Если вы удерживаете кнопку нажатой и перемещаете мышь, чтобы развернуть выделение, OnSelectCell больше не будет вызываться. – Ampere

+0

@Altar, я считаю, что это странное поведение вызвано 'goRangeSelect' в« Параметры »сетки. Так как вы разрешаете выбирать только одну строку, выбор диапазона не имеет большого смысла. Попробуйте с выключенной опцией ... –

0

Хороший раствор

Проверить свойство вариантов на TStringGrid Существует вариант под названием «goRangeSelect» Установите ложь с помощью инспектора объектов

Или программно это может быть сделано

StringGrid1.Options - [goRangeSelect]; 
Смежные вопросы