Disposeは必要ないんですか?

解決


ペェージ  2004-12-29 02:46:49  No: 12506

TTreeNode.Dataの使い方がよく分からず、Helpを引いてみたら、以下の様な例が載っていました
-----------------------------------------------------
type
  PMyRec = ^TMyRec;
  TMyRec = record
    FName: string;
    LName: string;
  end;

以下のコードは,TreeView1 の最後にノードを追加します。TMyRec レコードは追加された項目に結び付いています。Fname および Lname フィールドは,編集ボックス Edit1 および Edit2 から取得されます。インデックスパラメータは,編集ボックス Edit3 から取得されます。項目が追加されるのは,インデックスが有効な場合に限られます。

procedure TForm1.Button1Click(Sender: TObject);
 var
  MyRecPtr: PMyRec;
  TreeViewIndex: LongInt;
begin
  New(MyRecPtr);
  MyRecPtr^.FName := Edit1.Text;
  MyRecPtr^.LName := Edit2.Text;
  TreeViewIndex := StrToInt(Edit3.Text);
  with TreeView1 do
  begin
    if Items.Count = 0 then
      Items.AddObject(nil, 'Item' + IntToStr(TreeViewIndex), MyRecPtr)
    else if (TreeViewIndex < Items.Count) and (TreeViewIndex >= 0) then

      Items.AddObject(Items[TreeViewIndex], 'Item' + IntToStr(TreeViewIndex), MyRecPtr);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Label1.Caption := PMyRec(TreeView1.Selected.Data)^.FName + ' ' +
                  PMyRec(TreeView1.Selected.Data)^.LName;
end;
-----------------------------------------------------
この例でよく分からないのですが、Button1Click()で、New(MyRecPtr)でポインタを設定していますが、Newを用いる際は、Dispose()で割当てていたメモリを解放しなければなりませんとNew()には書いてありました。けど、例にはこれしかのっていないのでDisposeが発行されているのかよく分かりません。
Dispose()は必要なのですか?また、必要なら、どのタイミングでどの様に使えばいいのでしょうか?
あまりポインタとかを分かってないので、なるべく易しくお教え頂けると嬉しいです。


さわ  2004-12-29 03:48:37  No: 12507

AddObjectで渡したPointerをDisposeしてしまったら
Click2でそのPointerにあるはずのメモリも居なくなってしまいます。
当然この場合Disposeするタイミングは
Itemが必要なくなる時やItemからDeleteするタイミングになるのでは?


りおりお  2004-12-29 04:09:28  No: 12508

Dispose するタイミングは OnDeletion イベントハンドラが最適です。
アプリ終了時にも TreeView.Free でちゃんとノードごとに呼ばれます。


ペェージ  2004-12-29 04:59:06  No: 12509

さわさん、りおりおさん、どうもありがとうございます。
やっぱりDisposeするんですね。
OnDeletionイベントなんていうのは気付きませんでした(汗)。もうちょっと注意を払うよう心がけます。


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

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






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