StringGridのObjectsの破棄について

解決


suzuo  2011-02-20 03:07:37  No: 40044

d2007のstringgridのヘルプに

Objects 配列に追加されたオブジェクトは,文字列グリッドが破棄されても存在します。アプリケーションで明示的に破棄することが必要です。 

とありますが、これはフォームが破棄されても  やはり残るのでしょうか?
Objects  便利だと思ったんですが、Rowを色々可変操作するような使い方をすると
破棄のタイミングが、煩雑になって面倒な気もします。


HOta  2011-02-20 03:45:34  No: 40045

TStringsですから、同様です。残ります。


suzuo  2011-02-20 04:23:58  No: 40046

HOtaさん  ありがとうございます。
そうですよね・・
Rowが決まる場合は  いいですが
使いようによっては  面倒ですね


KHE00221  2011-02-20 11:20:39  No: 40047

>使いようによっては  面倒ですね

そんなことはない

 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 を操作


suzuo  2011-02-22 03:28:06  No: 40048

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の代わりに使うのは  邪道でしょうか?


破棄無用  2011-02-22 05:54:32  No: 40049

Objectsに保存したいデータが Integerなど4バイトだけであるならば、
データ格納用のメモリを新たに確保する必要がないから破棄の必要もないよ。


KHE00221  2011-02-22 10:25:44  No: 40050

StringGird のセルの範囲と Cells、Objects の範囲は別物だから
  StringGrid1.RowCount  := 5;
  StringGrid1.ColCount  := 5;

  StringGrid1.Objects[10,10] := Tobject(3);
とかもできる


suzuo  2011-02-22 18:18:01  No: 40051

破棄無用さん
すっきりです、確保してないのにHELPからは破棄する必要があると取れたので?でした。
4バイトならOKなのですか

KHE00221さん
>StringGird のセルの範囲と Cells、Objects の範囲は別物だから
Cellの場合は、ColCount、RowCountで範囲を設定できますが
別物となるとObjectsの範囲の設定はどうするのでしょうか?


KHE00221  2011-02-23 05:51:43  No: 40052

Cells も別物

ColCountとRowCountはあくまで表示領域の指定


suzuo  2011-02-23 07:58:45  No: 40053

KHE00221さん、試してみました。
面白いです。

>ColCountとRowCountはあくまで表示領域の指定

ColCountとRowCountで  ごちゃごちゃ考えていましたが
目から鱗です

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


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

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






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