Я знаю, что, используя свойство столбца только для чтения, я могу избежать редактирования значения его поля. Но это не мешает встроенному редактору показать себя. Мне нужен способ сделать столбец не только защищенным, но и «неприкасаемым». Есть ли способ, пожалуйста?
Delphi: избегайте редактирования столбца в TDBgrid
Ответы (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
.
function TMyDBGrid.CanEditShow: Boolean; begin Result := Inherited CanEditShow; Result := not Columns[col].ReadOnly; end;
Мне интересно, почему Embarcadero не
- person JimPapas; 23.06.2016