DBGrid — OnCellClick и OnDblClick, возвращают форму/TBMemo, содержащую значения/ячейки/столбца

Я использую следующий код, добавленный к моему событию DBGrid — OnCellClick

procedure TForm2.DBGrid1CellClick(Column: TColumn);
begin
if dbmodule.comenziDataSet.Active then
  begin
    if not Assigned(dbgridCelulaForm) then
    begin
      dbgridCelulaForm := TdbgridCelulaForm.Create(Self);
      dbgridCelulaForm.DBMemoCelula.DataSource := dbmodule.comenziSource; 
    end;

    dbgridCelulaForm.Visible := False;
    dbgridCelulaForm.Visible := True;
    dbgridCelulaForm.DBMemoCelula.DataField := Column.FieldName;
    dbgridCelulaForm.Caption := Format('%s / randul: %d',[Column.FieldName, DBGrid1.DataSource.DataSet.RecNo]);
  end;
end;

dbgridCelulaForm = имя формы, содержащей TDBMemo DBMemoCelula = имя TDBMemo dbmodule.comenziDataSet = comenziDataSet — это имя DataSet, а dbmodule — это имя data module (юнит, подобный формам) — DataSet находится на data module, поэтому, dbmodule.comenziDataSet dbmodule.comenziSource = то же, что и набор данных, DataSource в модуле данных, источник называется comenziSource

Итак, что делает этот код:

Как только я нажимаю ячейку на моем DBGrid, появляется form (с именем dbgridCelulaForm), который содержит TBMemo (с именем DBMemoCelula), и показывает мне информацию, содержащуюся в этой ячейке (например, имя клиента или что-то еще, что содержит ячейка). , в моей БД)

Это нормально, моя проблема в том, что я не могу сейчас выбирать строки в DBGrid, ну, я могу, но как только я делаю 1-е место, я нажимаю (ячейка, любая) на конкретную строку, которую я хочу выбрать, с помощью мыши, затем ячейка активируется, и появляется form.

Можно ли использовать этот код в событии DBGrid - OnDblClick вместо OnCellClick ? Это означает, что как только я дважды щелкну строку / ячейку, form должно появиться и показать мне информацию, но двойной щелчок - не одиночный щелчок.

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

Или любым другим способом/местом для использования/получения этой функциональности. Есть предположения?

Я могу опубликовать быстрое видео обо всем, если мое объяснение неоднозначно, и вы думаете, что это поможет, просто скажите мне в комментарии / ответе.

Кроме того, я использую компоненты RAD Studio 10 Seattle и dbexpress для базы данных — если это поможет.

Спасибо!


person t1f    schedule 05.10.2016    source источник
comment
Никакой двусмысленности... Я реализовал аналогичную функциональность с помощью кнопки редактирования столбцов сетки - запускает событие OnEditButtonClick в сетке. Установите стиль кнопки на cbsEllipsis, чтобы было очевидно, что диалоговое окно всплывает при нажатии. Также может быть запущен с помощью Alt+Down.   -  person Sertac Akyuz    schedule 06.10.2016
comment
Здравствуйте, спасибо за ваш ответ. Я уже использую OnEditButtonClick для чего-то другого, поэтому не могу использовать это. Ответ Мартина помогает, как и ваш комментарий SelectedField, спасибо!   -  person t1f    schedule 06.10.2016


Ответы (1)


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

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

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

type
 TMyDBGrid = class(TDBGrid);

procedure TForm1.DBGrid1DblClick(Sender: TObject);
var
  ARow,
  ACol : Integer;
  Pt : TPoint;
  CellValue : String;
begin
  //  First, get the mouse pointer coordinates
  Pt.X := Mouse.CursorPos.X;
  Pt.Y := Mouse.CursorPos.Y;
  //  Translate them into the coordinate system of the DBGrid
  Pt := DBGrid1.ScreenToClient(Pt);

  //  Use TDBGrids inbuilt functionality to identify the Column and
  //  row number. 
  ACol := DBGrid1.MouseCoord(Pt.X, Pt.Y).X -1;
  ARow := DBGrid1.MouseCoord(Pt.X, Pt.Y).Y;
  CellValue := DBGrid1.Columns[ACol].Field.AsString;

  Caption := Format('Col:%d Row:%d Cell Value:%s', [ACol, ARow, CellValue]);
end;

Обратите внимание, что я использовал свойство Caption формы для отображения информации о ячейке сетки просто как быстрый и грязный способ показать информацию где-нибудь. Конечно, вы могли бы с таким же успехом отобразить его в другой области формы или где-то совсем в другой форме. Приведенный выше код будет одинаково хорошо работать в событии сетки OnCellClick, кстати.

Как отмечено в комментарии, вы можете использовать свойство сетки SelectedField вместо приведенного выше, но лично я думаю, что приведенное выше более информативно о том, как работать с DBGrid, потому что оно показывает, как получить координаты столбца и строки ячейки. См. свойства SelectedField, SelectedIndex и SelectedRows DBGrid в интерактивной справке для получения дополнительной информации о полезных свойствах TDBGrid.

Обновление В комментарии вы попросили пример отображения информации в другой форме. Предположим, что эта форма называется OtherForm, находится в блоке OtherFormu.Pas и создана до вызова события DBGrid1DblClick. Вам нужно использовать этот модуль в Useslist модуля, который содержит DBGrid. Предположим, что эта другая форма содержит элемент управления TMemo с именем Memo1. Затем вы можете написать свой обработчик DBGrid1DblClick следующим образом:

procedure TForm1.DBGrid1DblClick(Sender: TObject);
[as above]
begin
  [ as above ]
  CellValue := DBGrid1.Columns[ACol].Field.AsString;

  OtherForm.Memo1.Lines.Add(Format('Col:%d Row:%d Cell Value:%s', [ACol, ARow, CellValue]));
end;
person MartynA    schedule 05.10.2016
comment
Вам не нужен весь этот код поиска ячеек, вы можете использовать SelectedField сетки. - person Sertac Akyuz; 06.10.2016
comment
@SertacAkyuz: Итак? Он иллюстрирует, как сделать это с нуля, что полезно знать, imo, и подсказывает, как это сделать, когда интересующая ячейка в данный момент не выбрана. - person MartynA; 06.10.2016
comment
Итак? - Потому что код не совсем необходим. Кажется, это веская причина, чтобы прокомментировать меня. - person Sertac Akyuz; 06.10.2016
comment
@SertacAkyuz: Достаточно честно. - person MartynA; 06.10.2016
comment
@MartynA - ты потрясающий. Вы продолжаете отвечать на мои вопросы, и пока ваши ответы просто звездные. Действительно спасибо. Это работает отлично. 2 проблемы: вы упомянули, что это меняет заголовок, но я бы хотел, чтобы вместо заголовка была новая TForm, отображающая соответствующие данные, которую я могу закрыть. Вторая проблема: если я выберу другую строку после (одиночного щелчка, а не двойного), заголовок не вернется в предыдущее состояние. Вторая проблема не была бы проблемой, если бы я мог показать это в TForm, но я просто упоминаю об этом, чтобы другие могли знать, если они придут сюда и используют код в качестве подписи. - person t1f; 06.10.2016
comment
@SertacAkyuz - спасибо за альтернативу, я тоже посмотрю на это, по крайней мере, чтобы узнать еще одну новую вещь, я новичок в delphi, спасибо. - person t1f; 06.10.2016
comment
@MartynA - можете ли вы привести пример кода, как добавить новую форму с TDBMemo, чтобы отображать там информацию вместо подписи? У меня возникли трудности с изменением вашего примера, поэтому я могу это сделать, я новичок в Delphi, поэтому извините, если это выглядит так, будто я просто ищу бесплатный код без работы, это не так. Я надеюсь, что научусь лучше с конкретными готовыми примерами. Надеюсь, все в порядке! - dbgridCelulaForm — имя новой формы, содержащей TDBMemo, имя мемо — DBMemoCelula - person t1f; 06.10.2016
comment
Я добавил пример того, как добавить информацию из события dbl-click в заметку в другой форме. Я избегал использования вашего dbgridCelulaForm, потому что мне совершенно неясно, доступно ли для записи содержимое TDBMemo на нем, подключено ли оно к тому же набору данных, что и ваш DBGrid, и т. д. Но вы должны быть в состоянии достаточно легко понять эту идею. . - person MartynA; 06.10.2016
comment
@MartynA - Работает без нареканий, еще раз спасибо! Хорошего дня :) - person t1f; 06.10.2016