TreeNode を使用するには?


マイホーム  2005-12-28 19:00:30  No: 19422

TTreeNodes のように
ツリー形式でデータを管理したいのですが
どうすればよいのでしょうか。
フォームがないので TreeView は使用しないで TreeNodes だけ
使って、下記のプログラムのように Create 下のですが、
Crate はできたのですが、Clear がエラーになってしまいます。

var
 TreeNodes: TTreeNodes;
begin
 TreeNodes := TTreeNodes.Create(Nil);
 TreeNodes.Clear;
end;


ん?  2005-12-28 20:44:49  No: 19423

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;


マイホーム  2005-12-28 23:14:01  No: 19424

「ん?」さんどうもありがとうございます。
新しくクラスを作っていくといいのはわかりました。
でも、機能的にいっぱい追加が必要そうなので、だましだまし使うどころか
だまされだまされこき使われて失敗しそうです。
と、言うことで安直な方法なのですが、

プライベートに追加して
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 を使えばいいんですよね。


ん?  2005-12-29 00:53:04  No: 19425

フォームのOnCreateで使うなら
var
  treeview :TTreeView;
begin
  treeview := TTreeView.Create(Self);
  TreeNodes := treeview.Items;

にしましょう。
そうしないと、TTreeViewとしてクリエイトしたインスタンスは、
メモリーリークします。

treeview.Parent := ***
というように、Parentを指定することで、表示されるようになります。
Createだけでは、表示されません。

また、TreeNodesインスタンスは、TreeViewのインスタンスなので、明示的にFreeしないようにしましょう


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

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






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