Как получить содержимое ячейки в DBGrid в Delphi с помощью события OnCellClick

Как я могу, щелкнув ячейку в dbgrid в форме, получить содержимое выбранной ячейки?

Обратите внимание, что DBGrid в Delphi представляет собой сетку с поддержкой данных и несколько необычен по сравнению с другими сетками (например, TStringGrid в Delphi) тем, что к ячейкам сетки нельзя получить доступ с помощью значений Row и Column.


person TryCode_ItsCool    schedule 29.06.2019    source источник
comment
Очевидно, что любой, кто мог бы ответить на этот вопрос, уже знал бы, что такое TDBGrid и как он работает. Вы потратили больше времени на ненужную заметку, чем на написание вопроса.   -  person Ken White    schedule 30.06.2019
comment
@KenWhite: На самом деле это я добавил второй абзац по просьбе модератора, который, очевидно, не был знаком с TDBGrid и, по-видимому, не знал о конкретной проблеме, о которой спрашивает OP.   -  person MartynA    schedule 30.06.2019


Ответы (1)


Самый простой способ сделать это просто

procedure TForm1.DBGrid1CellClick(Column: TColumn);
var
  S : String;
begin
  S := DBGrid1.SelectedField.AsString;
  Caption := S;
end;

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

Fwiw, я видел больше способов получения текста ячейки "вокруг домов", но я предпочитаю это по принципу KISS.

Обратите внимание, что более надежный способ получения текста ячейки, который включает предложение Реми Лебо использовать Column.Field вместо SelectedField, выглядит следующим образом:

procedure TForm1.DBGrid1CellClick(Column: TColumn);
var
  S : String;
  AField : TField;
begin
  AField := DBGrid1.SelectedField;
  //  OR AField := Column.Field;


  //  Note:  If the DBGrid happens to have an unbound column (one with
  //         no TField assigned to it) the AField obtained mat be Nil if
  //         it is the unbound column which is clicked.  So we should check for
  //         AField being Nil

  if AField <> Nil then begin
    S := AField.AsString;
    Caption := S;
  end;
end;
person MartynA    schedule 29.06.2019
comment
Вместо этого вы можете и должны использовать свойство Column.Field, которое представляет поле БД, на которое фактически нажали. - person Remy Lebeau; 29.06.2019
comment
@RemyLebeau: Спасибо. Почему ты это сказал? - person MartynA; 29.06.2019
comment
Гм, потому что именно это событие дает вам, вместо того, чтобы искать его в другом месте. - person Remy Lebeau; 29.06.2019