(FireMonkey)StringGridのあるセルを入力不可にするには?

解決


ない  2012-10-02 20:15:14  No: 43088

あるカラムを入力不可にしようと思ったのですが・・・。
マウスで対象のところに移動した場合は、入力不可となりますが、
キーボードで移動した場合は、なぜか入力可能となります。
どうすれば、良いのでしょうか?
下記、現時点のソースです。

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
  J: Integer;
begin
  StringGrid1.AddObject(TStringColumn.Create(StringGrid1));
  StringGrid1.AddObject(TStringColumn.Create(StringGrid1));
  StringGrid1.AddObject(TStringColumn.Create(StringGrid1));

  StringGrid1.Columns[0].Header := 'H1';
  StringGrid1.Columns[1].Header := 'H2';
  StringGrid1.Columns[2].Header := 'H3';

  for I:=1 to StringGrid1.ColumnCount do begin
    for J:=1 to StringGrid1.RowCount do begin
      StringGrid1.Cells[I - 1, J -  1] := 'データ' + IntToStr(I * J);
    end;
  end;
end;

procedure TForm1.StringGrid1SelChanged(Sender: TObject);
begin
  if (StringGrid1.ColumnIndex = 1) then begin
    StringGrid1.ReadOnly := True;
  end else begin
    StringGrid1.ReadOnly := False;
  end;
end;


初心者  2012-10-02 22:38:10  No: 43089

ReadOnlyで制御できませんか?


DEKO  2012-10-03 01:42:34  No: 43090

こんにちは。
セルコントロールを独自に定義して、それをカラムに割り当ててやればいいです。

uses
  ..., FMX.Edit;

  { TStringColumn_ReadOnly }
  TStringColumn_ReadOnly = class(FMX.Grid.TStringColumn)
  protected
    function CreateCellControl: TStyledControl; override;
  end;

  ...

function TStringColumn_ReadOnly.CreateCellControl: TStyledControl;
begin
  result := inherited;
  TEdit(result).ReadOnly := True;
end;

としておいて、

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
  J: Integer;
begin
  StringGrid1.AddObject(TStringColumn.Create(StringGrid1)); 
  StringGrid1.AddObject(TStringColumn_ReadOnly.Create(StringGrid1)); // <- ReadOnly セルコントロールを割り当て
  StringGrid1.AddObject(TStringColumn.Create(StringGrid1));
  ...

こんな感じで使います。

[TStringGrid の使い方 (Delphi FireMonkey Tips)]
http://ht-deko.minim.ne.jp/techf011.html


DEKO  2012-10-03 01:50:11  No: 43091

おっと。この用途であれば、

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
  J: Integer;
begin
  StringGrid1.AddObject(TStringColumn.Create(StringGrid1));
  StringGrid1.AddObject(TStringColumn.Create(StringGrid1));
  StringGrid1.AddObject(TStringColumn.Create(StringGrid1));

  StringGrid1.Columns[0].Header := 'H1';
  StringGrid1.Columns[1].Header := 'H2';
  StringGrid1.Columns[1].ReadOnly := True;  // <- カラムコントロールを ReadOnly に
  StringGrid1.Columns[2].Header := 'H3';
  ...

これだけでよさそうです。


ない  2012-10-04 20:17:57  No: 43092

ありがとうございました。
たしかに、"ReadOnly := True"で
OKでした。

当初、ある行のあるセルの値により、
同行のあるセルを入力可・不可にと
考えていました。
しかし、その必要がなくなっため、
シンプルな入力可・不可にと、
ソースを削除していったところ
上記のコーディングとなり、ハマっておりました。

ある値により入力可・不可になる件は
自分で確認してみようと思います。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加