TTreeNodes のように
ツリー形式でデータを管理したいのですが
どうすればよいのでしょうか。
フォームがないので TreeView は使用しないで TreeNodes だけ
使って、下記のプログラムのように Create 下のですが、
Crate はできたのですが、Clear がエラーになってしまいます。
var
TreeNodes: TTreeNodes;
begin
TreeNodes := TTreeNodes.Create(Nil);
TreeNodes.Clear;
end;
TTreeNodes は、オーナーであるTTreeViewなしでは生きていけないからです。
オーナーのTTreeViewなしは、<<想定外>>です(笑)
ツリー構造化するなら、それなりのクラスを作るべきとは思いますが、
こちらは、Delphi5までしか知りません。
Delphi6以降であれば、なにかそういったクラスがあるのかもしれませんな。
自分なら、こんな感じでごまかして作ります。
THogeTreeList=class;
THogeItem=class(TCollectionItem)
protected
FChild:THogeTreeList;
FHoge1: Integer;
FHoge2: String;
public
constructor Create(aCollection: TCollection); override;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
end;
THogeTreeList=class(TCollection)
protected
function GetNode(Index: Integer): THogeItem;
procedure SetNode(Index: Integer; Value: THogeItem);
public
property Node[Index: Integer]:THogeItem read GetNode write SetNode;
end;
constructor THogeItem.Create(aCollection: TCollection);
begin
inherited Create(aCollection);
FChild:=THogeTreeList.Create(THogeItem);
end;
destructor THogeItem.Destroy;
begin
FChild.Free;
inherited Destroy;
end;
procedure THogeItem.Assign(Source: TPersistent);
begin
inherited Assign(Source);
if Source is THogeItem then begin
Hoge1:= THogeItem(Source).Hoge1;
Hoge2:= THogeItem(Source).Hoge2;
end;
end;
function THogeTreeList.GetNode(Index: Integer): THogeItem;
begin
Result := THogeItem(Items[Index]);
end;
procedure THogeTreeList.SetNode(Index: Integer; Value: THogeItem);
begin
Items[Index].Assign(Value);
end;
「ん?」さんどうもありがとうございます。
新しくクラスを作っていくといいのはわかりました。
でも、機能的にいっぱい追加が必要そうなので、だましだまし使うどころか
だまされだまされこき使われて失敗しそうです。
と、言うことで安直な方法なのですが、
プライベートに追加して
private
TreeView: TTreeView;
親無しでクリエイトして
TreeView := TTreeView.Create(Nil);
TreeView := Nil;
そのまま、TreeView を意識しない(無視して)
TreeView.Items として使えば
問題ないのでしょうか?
念のため
TreeView.Visible := False;
TreeView.Enabled := False;
に設定しておいて
ちょっとだけ応用して
private
TreeNodes: TTreeNodes;
で宣言しておいて
TreeView := TTreeView.Create(Nil);
TreeView := Nil;
TreeNodes := TreeView.Items;
とすれば、以降は
TreeNodes を使えばいいんですよね。
フォームのOnCreateで使うなら
var
treeview :TTreeView;
begin
treeview := TTreeView.Create(Self);
TreeNodes := treeview.Items;
にしましょう。
そうしないと、TTreeViewとしてクリエイトしたインスタンスは、
メモリーリークします。
treeview.Parent := ***
というように、Parentを指定することで、表示されるようになります。
Createだけでは、表示されません。
また、TreeNodesインスタンスは、TreeViewのインスタンスなので、明示的にFreeしないようにしましょう
ツイート | ![]() |