d2007のstringgridのヘルプに
Objects 配列に追加されたオブジェクトは,文字列グリッドが破棄されても存在します。アプリケーションで明示的に破棄することが必要です。
とありますが、これはフォームが破棄されても やはり残るのでしょうか?
Objects 便利だと思ったんですが、Rowを色々可変操作するような使い方をすると
破棄のタイミングが、煩雑になって面倒な気もします。
TStringsですから、同様です。残ります。
HOtaさん ありがとうございます。
そうですよね・・
Rowが決まる場合は いいですが
使いようによっては 面倒ですね
>使いようによっては 面倒ですね
そんなことはない
TObject に保存するレコードを
TStringGridRecord = record
end;
として StringGrid.RowCount を直接操作しないで
procedure ChangeRow(StringGrid: TStringGrid; ARowCount: Integer);
var
R,C: Integer;
P: ^TStringGridRecord;
begin
if StringGrid.RowCount = ARowCount then
begin
//変化が無い
end
else
if StringGrid.RowCount > ARowCount then
begin
//減る
for R := ARowCount to StringGrid.RowCount -1 do
begin
for C := 0 to StringGrid.ColCount -1 do
begin
FreeMem(Pointer(StringGrid.Objects[C,R]));
StringGrid.Objects[C,R] := TObject(0);
end;
end;
end
else
begin
//増える
for R := StringGrid.RowCount to ARowCount -1 do
begin
for C :=0 to StringGrid.ColCount -1 do
begin
GetMem (P,SizeOf(TStringGridRecord));
StringGrid.Objects[C,R] := TObject(P);
end;
end;
end;
StringGrid.RowCount := ARowCount;
end;
で StringGrid.RowCount を操作
KHE00221さん、具体的なコードありがとうございます。
色々やってみます。
質問のきっかけは、
プロジェクトに、
ReportMemoryLeaksOnShutdown := True;
を追加した場合、破棄してないものは拾えるのではと思ったのですが
次の様に、オブジェクトを使ったまま終了しても何も 吐かなかったので
破棄はいらないの?と思った次第です。
procedure TForm1.Button1Click(Sender: TObject);
begin
StringGrid1.Objects[3,3] := Tobject(3);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.RowCount := 5;
StringGrid1.ColCount := 5;
end;
全く同期して使うとして、非表示のStringGridを用意して
OBjecctsの代わりに使うのは 邪道でしょうか?
Objectsに保存したいデータが Integerなど4バイトだけであるならば、
データ格納用のメモリを新たに確保する必要がないから破棄の必要もないよ。
StringGird のセルの範囲と Cells、Objects の範囲は別物だから
StringGrid1.RowCount := 5;
StringGrid1.ColCount := 5;
で
StringGrid1.Objects[10,10] := Tobject(3);
とかもできる
破棄無用さん
すっきりです、確保してないのにHELPからは破棄する必要があると取れたので?でした。
4バイトならOKなのですか
KHE00221さん
>StringGird のセルの範囲と Cells、Objects の範囲は別物だから
Cellの場合は、ColCount、RowCountで範囲を設定できますが
別物となるとObjectsの範囲の設定はどうするのでしょうか?
Cells も別物
ColCountとRowCountはあくまで表示領域の指定
KHE00221さん、試してみました。
面白いです。
>ColCountとRowCountはあくまで表示領域の指定
ColCountとRowCountで ごちゃごちゃ考えていましたが
目から鱗です
ありがとうございました。
ツイート | ![]() |