Delphi:避免在TDBGrid中编辑一列



我知道,使用列的可读属性,我可以避免编辑其字段值。但这并不能阻止内置编辑器展示自己。我需要一种方法来使列不仅受到保护,而且可以"不可触及"。有办法吗?

如果我理解您想要的正确,可以通过创建自定义的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),网格的列编号会更改。

显然,您可以使用

中的可分配事件来自定义哪些列进行自定义的灵活性
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

相关内容

  • 没有找到相关文章

最新更新