StringGridで、範囲を超えたらエラーを出すには?

解決


かんとく  2010-06-29 00:57:06  No: 38720

お世話になっております。

Delphi2007,XPです。

StringGrid1を置き、Rowcount=5,Colcount=5の場合、
StringGrid1.Cells[10,10]:='10';
として、
memo1.text:=StringGrid1.Cells[10,10];
とすると、Memo1.Textは、'10'になります。

このとき(Rowcount=5,Colcount=5の範囲を超えたCellsを読み書きしようとした場合)、エラーにする方法はありますか?

プロシージャやファンクションを作るのではなく、どこかのチェックボタンかなにかを、1クリックか2クリックぐらいでできる方法があれば、教えてください。

よろしくお願いします。


Quest  2010-06-29 01:54:19  No: 38721

プロパティなどの設定で簡単にやる方法は無いようです。
ソースを見ると、Cellsプロパティに範囲外のRow,Colを与えると
強制的に拡張されるようになっています。
コード書いてガリガリやるしかなさそうです。


かんとく  2010-06-29 03:41:00  No: 38722

ありがとうございます。

「Access Violationが出ている場所の特定」という記事を見て、自分もたまに原因不明のAccess Violationが出るので困っていたんですが、
Cellsプロパティに範囲外のRow,Colを与えるとまずいことが起こるんじゃないかな?と考えて、試してみようかなと思いました。

でも、強制的に拡張されるようになっているんだったら、それがAccess Violationの原因になることは考えにくいですね。

ありがとうございました。


Delphi大好き  2010-06-29 16:04:21  No: 38723

StringGridは以前苦しめられた経験あります。
表示されてないグリッドもしっかりデータを保持しています。
なので、表示されている範囲外でも、それ以前にデータを記入していたならば、
参照して値を取り出せてしまいます。

範囲外のグリッドは初期化されるものとばかり思い込んでいて、
最近そのまま保持されていることを知りましたw。

単純なものですが、以下は自分なりの回避策を書いてみました。
的外れだったらゴメンです。

var
  Form1: TForm1;
  i1,i2:integer;
  sw1:boolean;
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  StringGrid1.Cells[10,10]:='10';

  if StringGrid1.RowCount < i1 then
    if StringGrid1.ColCount < i2 then begin
      memo1.Text := '';
      sw1 := True;
    end else  begin
      memo1.Text := StringGrid1.Cells[i1,i2];
      sw1 := false;
    end;
end;

procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
  i1 := SpinEdit1.Value;
end;

procedure TForm1.SpinEdit2Change(Sender: TObject);
begin
  i2 := SpinEdit1.Value;
end;

end.


かんとく  2010-06-29 18:54:36  No: 38724

ありがとうございます。

私も、範囲外のグリッドは初期化されると思っていたために、知らずに範囲外のグリッドに書き込んでしまって、おかしくなったことがあります。
はっきりエラーが発生してくれたら、ここがおかしいと気づいたと思うんですが、エラーが発生しないので、この不具合になかなか気づきませんでした。

自分が決めた範囲の外のグリッドには、読み書きしないように気をつけるようにします。

ありがとうございました。


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

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






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