Delphi: избегайте редактирования столбца в TDBgrid

Я знаю, что, используя свойство столбца только для чтения, я могу избежать редактирования значения его поля. Но это не мешает встроенному редактору показать себя. Мне нужен способ сделать столбец не только защищенным, но и «неприкасаемым». Есть ли способ, пожалуйста?


person JimPapas    schedule 23.06.2016    source источник
comment
Хотя это для ячеек, это может помочь вам начать работу.   -  person Jan Doggen    schedule 23.06.2016


Ответы (1)


Если я правильно понимаю, что вы хотите, вы можете сделать это довольно просто, создав собственного потомка TDBGrid и переопределив его метод CanEditShow, так как это определяет, может ли быть создан InplaceEditor сетки:

type
  TMyDBGrid = class(TDBGrid)
  private
    FROColumn: Integer;
  protected
    function CanEditShow : Boolean; override;
  public
    property ROColumn : Integer read FROColumn write FROColumn;
  end;

function TMyDBGrid.CanEditShow: Boolean;
begin
  Result := Inherited CanEditShow;
  Result := Result and (Col <> ROColumn);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyDBGrid := TMyDBGrid.Create(Self);
  MyDBGrid.ROColumn := 1;
  MyDBGrid.DataSource := DataSource1;
  MyDBGrid.Parent := Self;
[...]

Этот минималистский пример просто определяет один столбец сетки по номеру как тот, где InplaceEditor не разрешено; очевидно, вы можете использовать любой механизм, который вам нравится, для идентификации столбцов, для которых CanEditShow возвращает False.

Обратите внимание, что приведенный выше код не учитывает тот факт, что нумерация столбцов сетки изменяется, если вы отключите столбец Indicator (т. е. установите для Options.dgIndicator значение False);

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

type

  TAllowGridEditEvent = procedure(Sender : TObject; var AllowEdit : Boolean) of object;

  TMyDBGrid = class(TDBGrid)
  private
    FOnAllowEdit: TAllowGridEditEvent;
  protected
    function CanEditShow : Boolean; override;
    procedure DoAllowEdit(var AllowEdit : Boolean);
  public
    property OnAllowEdit : TAllowGridEditEvent read FOnAllowEdit write FOnAllowEdit;
  end;

function TMyDBGrid.CanEditShow: Boolean;
begin
  Result := Inherited CanEditShow;
  if Result then
    DoAllowEdit(Result);
end;

procedure TMyDBGrid.DoAllowEdit(var AllowEdit: Boolean);
begin
  if Assigned(FOnAllowEdit) then
    FOnAllowEdit(Self, AllowEdit);
end;

procedure TForm1.AllowEdit(Sender: TObject; var AllowEdit: Boolean);
var
  Grid : TMyDBGrid;
begin
  Grid := Sender as TMyDBGrid;
  AllowEdit := Grid.Col <> 1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyDBGrid := TMyDBGrid.Create(Self);
  MyDBGrid.ROColumn := 1;
  MyDBGrid.DataSource := DataSource1;
  MyDBGrid.Parent := Self;
  MyDBGrid.OnAllowEdit := AllowEdit;
  [...]

Если вам не нравится создавать сетку в коде, вы можете поместить ее в пользовательский пакет и установить в IDE или, если ваша версия Delphi достаточно свежа, реализовать CanEditShow в class helper.

person MartynA    schedule 23.06.2016
comment
Я добавляю гибкость, которую хочу, таким образом: function TMyDBGrid.CanEditShow: Boolean; begin Result := Inherited CanEditShow; Result := not Columns[col].ReadOnly; end; Мне интересно, почему Embarcadero не - person JimPapas; 23.06.2016