Delphi dbGrid — имена столбцов

Я часто ссылаюсь на значения в поле в dbgrid с номером индекса, например:

dbgrid1.Fields[8].AsString:= 'SomeValue'; //индекс 8, относящийся к полю с именем «Платеж»

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

Было бы намного проще и меньше возможностей для проблем, если бы я мог сослаться на поле примерно так:

dbgrid1.Field('Платеж').AsString:= 'SomeValue';

Есть ли способ сделать это?


person Bazzer    schedule 21.01.2021    source источник
comment
Почему вы используете значения из столбца DBGrid вместо базовой таблицы? Это правильный способ сделать это, и вы можете получить доступ к полю напрямую по имени. DBGrid — это просто представление данных из набора данных, к которому он подключен, и отображение этих данных — его единственная цель.   -  person Ken White    schedule 22.01.2021
comment
Хорошая точка зрения! Думаю, я был убаюкан, думая, что это способ доступа к столбцам, но вы правы, я могу использовать базовое поле FieldByName('Payment') для доступа к полю. Спасибо за это.   -  person Bazzer    schedule 23.01.2021


Ответы (1)


Вы можете использовать простую функцию, подобную этой, для доступа к столбцу TDBGrid по имени поля:

function ColumnByName(Grid : TDBGrid; const AName: String): TColumn;
var
  i : Integer;
begin
  Result := Nil;
  for i := 0 to Grid.Columns.Count - 1 do begin
     if (Grid.Columns[i].Field <> Nil) and (CompareText(Grid.Columns[i].FieldName, AName) = 0) then begin
       Result := Grid.Columns[i];
       exit;
     end;
  end;
end;

Затем вы можете сделать это:

ColumnByName(dbgrid1, 'Payment').AsString:= 'SomeValue';

Если вы используете FireDAC, ваша версия Delphi достаточно свежа для поддержки помощников классов, поэтому вместо этого вы можете использовать помощник класса:

type
  TGridHelper = class helper for TDBGrid
    function ColumnByName(const AName : String) : TColumn;
  end;

[...]

{ TGridHelper }

function TGridHelper.ColumnByName(const AName: String): TColumn;
var
  i : Integer;
begin
  Result := Nil;
  for i := 0 to Columns.Count - 1 do begin
     if (Columns[i].Field <> Nil) and (CompareText(Columns[i].FieldName, AName) = 0) then begin
       Result := Columns[i];
       exit;
     end;
  end;
end;

а потом

dbgrid1.ColumnByName('Payment').AsString := 'SomeValue';
person MartynA    schedule 21.01.2021
comment
Спасибо за этот совет. Предыдущий комментарий заставил меня задуматься, почему я сделал бы это именно так, и, если подумать, я думаю, что использование способа FieldByName('Payment').AsString делает ту же работу и позволяет избежать возможных ошибок. Имейте в виду, ваш способ получить имена столбцов выглядит хорошо, поэтому я могу попробовать это. - person Bazzer; 23.01.2021