お世話になっております。
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クリックぐらいでできる方法があれば、教えてください。
よろしくお願いします。
プロパティなどの設定で簡単にやる方法は無いようです。
ソースを見ると、Cellsプロパティに範囲外のRow,Colを与えると
強制的に拡張されるようになっています。
コード書いてガリガリやるしかなさそうです。
ありがとうございます。
「Access Violationが出ている場所の特定」という記事を見て、自分もたまに原因不明のAccess Violationが出るので困っていたんですが、
Cellsプロパティに範囲外のRow,Colを与えるとまずいことが起こるんじゃないかな?と考えて、試してみようかなと思いました。
でも、強制的に拡張されるようになっているんだったら、それがAccess Violationの原因になることは考えにくいですね。
ありがとうございました。
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.
ありがとうございます。
私も、範囲外のグリッドは初期化されると思っていたために、知らずに範囲外のグリッドに書き込んでしまって、おかしくなったことがあります。
はっきりエラーが発生してくれたら、ここがおかしいと気づいたと思うんですが、エラーが発生しないので、この不具合になかなか気づきませんでした。
自分が決めた範囲の外のグリッドには、読み書きしないように気をつけるようにします。
ありがとうございました。
ツイート | ![]() |