2016-06-23 14 views
2

私は、列のreadonlyプロパティを使用するとフィールド値を編集できないことを知っています。しかし、これはインプレースエディタが自分自身を示すのを止めるわけではありません。 私はカラムを保護するだけでなく "触ることができない"ようにする方法が必要です。 方法はありますか?Delphi:TDBgridの列を編集しないでください

+0

[this](http://stackoverflow.com/a/16043353/512728)は細胞のためのものですが、始めるのに役立つかもしれません –

答えて

2

私はあなたが正しく何をしたい理解していれば、これはグリッドのInplaceEditorを作成することができるかどうかを決定するとして、あなたは、カスタムのTDBGridの子孫を作成し、 そのCanEditShowメソッドをオーバーライドすることで、非常に単純にこれを行うことができます。

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; 
[...] 

をこの最小限の例では、数字で1つのグリッド列を1つだけ と定義しています(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; 
    [...] 

のように割り当て可能なイベントを使用してInplaceEditorを許可されているカスタマイズのためのより多くの柔軟性を得ますカスタムパッケージをインストールして をIDE またはにインストールする場合、Delphiのバージョンが最新の場合は CanEditShowclass helperに実装してください。

+0

多くの感謝!それはまさに私が望んでいたものです! – JimPapas

+0

私はこのようにしたい柔軟性を追加します: 'function TMyDBGrid.CanEditShow:Boolean; begin 結果:=継承されたCanEditShow; 結果:= notカラム[col] .ReadOnly; end; ' なぜ私はエンバカデロが – JimPapas

関連する問題