TStringGrid с ОБА редактированием И выбором диапазона? - PullRequest
4 голосов
/ 19 мая 2010

Вопрос:

Может ли кто-нибудь указать на статью или примеры кода в любом месте о том, как обеспечить ОБА редактирования и выбора диапазона в TStringGrid?

Да, я ЗНАЮ, что существуют сторонние сетки, которые делают это, но это расстраивает, что во встроенной сетке отсутствует эта базовая возможность.

Справка:

Вполне нормально ожидать, что можно будет одновременно редактировать ячейку в сетке, а также для выбора диапазона ячеек, например, для операции копирования.

При поставке TStringGrid этого не делает. Это или / или. На самом деле, Документы расскажут нам о параметрах сетки: «Когда goEditing включен в Опции, goRangeSelect не действует ".

Однако, похоже, что возможно редактирование и выбор диапазона. в TStringGrid все равно !!! Благодаря осторожному использованию муссона, события mouseup, selectcell и exit, вы можете закрыть их, переключившись редактирование элементов в нужное время и выключение. Но у меня все еще нет это идеально, и это касается только использования мыши, а не замены клавиатуры.

Ответы [ 2 ]

3 голосов
/ 19 мая 2010

Я не использовал TStringGrid для этого, поэтому не могу дать конкретный ответ. Но прав ли я, предполагая, что вы можете вручную (в коде) запустить редактируемую ячейку ? Эта ссылка подразумевает, что это возможно, даже если сетка не включает goEditing в свои Options. (См. Ниже, чтобы обойти это, если это не так.)

Если это так, я бы предложил следующий подход:

Комбинированное поведение выбора и редактирования

Я считаю, что это хороший подход со стандартным поведением Windows:

  • Оставить сетку в режиме выделения, чтобы взаимодействие мыши и клавиатуры выделяло ячейки

  • Запускать редактируемую ячейку самостоятельно, основываясь на определенных критериях (я думаю, вы на пути к тому, чтобы сделать это из того, что вы сказали в своем последнем абзаце.) Существуют распространенные способы запуска редактирования и следующие критерии то, что мои программы следуют, когда они делают что-то подобное с другими элементами управления:

    • Выбор нормальный. То есть, нажмите, чтобы выбрать, нажмите и перетащите для мульти-выбора, используйте стрелки клавиатуры и Shift или Control, чтобы выбрать, и т. Д.

    • Ячейка входит в режим редактирования , если либо:

      1. Ячейка выбирается, и пользователь нажимает Enter или F2 (F2 - это стандартное сочетание клавиш «Переименовать» или «Редактировать», которое работает в ряде программ)

      2. Пользователь «медленно-дважды щелкает» по ячейке, т. Е. Медленно-дважды щелкает, чтобы выбрать и редактировать, или снова щелкает после паузы в уже выбранной ячейке. Это имитирует поведение Проводника, когда файл, выбранный, а затем вы щелкаете по нему, переходит во встроенный режим редактирования / переименования. Чтобы реализовать это, запишите, когда ячейка была нажата в последний раз (и выбрана). Если щелкнуть по ней еще раз, а если время больше GetDoubleClickTime, то они щелкнули дважды, медленно, и войти в режим редактирования , Это позволяет различать первый щелчок для выбора, двойной щелчок (для выполнения какого-либо действия) и медленный второй щелчок для входа в режим редактирования.

        Я также склонен проверять положение мыши, чтобы при медленном двойном щелчке по объекту, когда он не был выбран первым (т. Е. Оба выбирают объект и затем переходят в режим редактирования), я проверяю, что мышь уже Я очень много двигался. Я использую GetSystemMetrics, чтобы найти расстояние двойного щелчка, и проверяю, чтобы медленный двойной щелчок был внутри этого поля. (Поскольку это не настоящий двойной клик, я на самом деле проверяю расстояние 2 раза. Мой код действия:

        const int iMAX_MOVE_AMOUNT = ::GetSystemMetrics(SM_CYDOUBLECLK) * 2; (извините, C ++ не Delphi, но должен быть достаточно легко конвертируемым!)

        но на самом деле я не уверен, что это полностью и полностью соответствует рекомендациям Windows. На практике пользователи считают, что все работает так, как они ожидают.)

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

Разные мысли

Вы можете обнаружить, что некоторые из них проще и проще реализовать, если создать подкласс TStringGrid и создать новый компонент. Это позволит вам реализовать это в обычном коде и переопределить встроенное поведение (а не обработчики событий), сохраняя его невидимым для кода формы. Это также даст вам более низкий уровень доступа к событиям мыши или сообщениям Windows, чем просто через такие события, как OnMouseDown. Наконец, если возникают проблемы с отображением редактора, когда goEditing включен в Options, это позволит вам изменить это поведение. Вы также можете добавить свои собственные события, если хотите, чтобы ваш код реагировал на определенные события, такие как, например, создание события OnBeginEdit.

Создание собственных компонентов обычно рассматривается как продвинутая тема Delphi, но на самом деле замечательно легко, когда вы знаете, как! На этом сайте есть несколько хороших тем, которые познакомят вас св целом, и если вы идете по этому пути и сталкиваетесь с проблемами, Stack Overflow, конечно, является хорошим местом для того, чтобы задавать вопросы :) Embarcadero Delphi »VCL» Написание компонентов Группа новостей / форум также является отличным ресурсомна самом деле, возможно, даже лучше, чем SO для этой конкретной темы.

Надеюсь, это поможет!

1 голос
/ 24 ноября 2015

Да, это старый пост, но проблема все еще существует в Delphi XE3. Для управления этой функцией я использовал следующий «трюк» в процедуре SelectCell: if (ARow = StringGridParam.Row) then begin StringGridParam.Options:= StringGridParam.Options + [goEditing] - [goRowSelect]; end else begin StringGridParam.Options:= StringGridParam.Options + [goRowSelect] - [goEditing]; end;

...