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()は必要なのですか?また、必要なら、どのタイミングでどの様に使えばいいのでしょうか?
あまりポインタとかを分かってないので、なるべく易しくお教え頂けると嬉しいです。
AddObjectで渡したPointerをDisposeしてしまったら
Click2でそのPointerにあるはずのメモリも居なくなってしまいます。
当然この場合Disposeするタイミングは
Itemが必要なくなる時やItemからDeleteするタイミングになるのでは?
Dispose するタイミングは OnDeletion イベントハンドラが最適です。
アプリ終了時にも TreeView.Free でちゃんとノードごとに呼ばれます。
さわさん、りおりおさん、どうもありがとうございます。
やっぱりDisposeするんですね。
OnDeletionイベントなんていうのは気付きませんでした(汗)。もうちょっと注意を払うよう心がけます。
ツイート | ![]() |