Как выделить данные в выбранной ячейке в DBgrid (SMDBGrid)?

Я использую SMDBGrid в приложении Delphi для отображения и редактирования данных в результате запроса из MySQL.

Мне нужна помощь в понимании того, как заставить сетку вести себя так, как я хочу, при редактировании данных.

Данные в ячейках изначально отображаются черным шрифтом на белом фоне.

  1. Если я щелкнул ЛЕВОЙ кнопкой мыши один раз в ячейке, содержащей данные, ячейка изменится на белый шрифт на белом фоне (или, может быть, данные просто исчезнут), и я не смогу увидеть данные для их редактирования.

  2. Если я снова щелкну левой кнопкой мыши в той же ячейке, я получу белый шрифт на синем фоне. Я вижу данные и могу их редактировать.

  3. Если я щелкну левой кнопкой мыши в третий раз в той же ячейке, я получу черный шрифт на белом фоне (как и в других ячейках). Я вижу данные и могу их редактировать.

  4. ДВОЙНОЙ щелчок по ячейке один раз ведет себя как (1), двойной щелчок после этого всегда ведет себя как (2)

Вопрос

Как мне настроить его так, чтобы щелчок левой кнопкой мыши один раз в ячейке просто позволял мне редактировать эту ячейку, не меняя цвета? т.е. вести себя как в (3) выше, продолжать показывать черный шрифт на любом цвете фона, который ячейка имела изначально.

Другая информация, которая может иметь значение

После выполнения запроса для заполнения сетки я перевел его в режим редактирования с помощью

  • Query1.edit

У меня есть событие OnMouseDown в сетке, которое обнаруживает ПРАВЫЙ щелчок и показывает PopUpMenu, который предлагает варианты и устанавливает значения в других полях записи. Существует также событие OnGetCellParams, которое устанавливает цвет фона ячеек в зависимости от значения в этих других полях. Чтобы всплывающее меню работало правильно и не отображало (встроенное?) меню редактирования при щелчке правой кнопкой мыши, методом проб и ошибок я установил

  • ПопАпМеню = MyPopUpMenu
  • дгредактирование = истина
  • dgAlwaysShowEditor = истина
  • dgAlwaysShowSelection = ложь

но я не совсем уверен, что я там делаю.

Во всяком случае, удаление всего этого путем удаления событий OnMouseDown и OnGetCellParams и установки для PopUpMenu значения '', казалось, не имело никакого значения для того, что произошло, когда ячейка была нажата ЛЕВОЙ кнопкой мыши. Данные по-прежнему стали белыми.


person user3209752    schedule 07.02.2014    source источник


Ответы (1)


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

procedure TFrmDataEntry.SMDBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
//when they click in a cell, temporarily set the background to white and the font to bold black
if (gdSelected in State) then
    begin
    TDBGrid(Sender).Canvas.Brush.Color := clwhite;
    TDBGrid(Sender).Canvas.Font.Style := Font.Style + [fsBold];
    TDBGrid(Sender).Canvas.Font.Color := clblack;
    end;
 TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State); //Update the grid so it takes effect
 end; 
person user3209752    schedule 07.02.2014