2

列の読み取り専用プロパティを使用すると、フィールド値の編集を回避できることがわかっています。しかし、これはインプレース エディターの表示を止めるものではありません。列を保護するだけでなく、「触れられないようにする」方法が必要です。方法はありますか?

4

1 に答える 1

2

あなたが何を望んでいるかを正しく理解していれば、カスタム 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;
[...]

この最小限の例では、1 つのグリッド列を番号で定義しているだけで、許可されて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.

于 2016-06-23T13:55:47.420 に答える