2

カスタム TTreeNode クラスを作成しようとしています

例えば

TCustomTreeNode = class(TTreeNode)
  private
  public
    Comment:string;
  end;

そして、次のようにツリー ビューにノードを作成して追加します。

var
  NewCustomTreeNode:TCustomTreeNode;
begin
  NewCustomTreeNode:= TCustomTreeNode.Create(TreeView.Items);
  NewCustomTreeNode.Comment:='blqblq';
  TreeView.Items.AddChild(NewCustomTreeNode,'NodeText');

カスタム作成されたツリーノードにアクセスしようとすると、エラーがポップアップ表示されます。たとえば、私はこれが好きです:

TCustomTreeNode(TreeNode).Comment:='asdadssadas';

助けてください

4

1 に答える 1

9

コードの問題は、を呼び出すとAddChildツリービューが新しいノードを作成することです。また、サブクラスのノードを作成するようにツリービューに指示しなかったため、プレーンが作成されますTTreeNode。そして、それをにキャストしようとするとTCustomTreeNode、世界は終わります。

このメソッドを使用OnCreateNodeClassして、ツリービューが新しいノードを作成できることを確認する必要があります。このような:

type
  TCustomTreeNode = class(TTreeNode)
  protected
    procedure Assign(Source: TPersistent); override;
  public
    Comment: string;
  end;

procedure TCustomTreeNode.Assign(Source: TPersistent);
begin
  if Source is TCustomTreeNode then
    Comment := TCustomTreeNode(Source).Comment;
  inherited;
end;


procedure TForm1.FormCreate(Sender: TObject);
var
  NewNode: TCustomTreeNode;
begin
  NewNode := TreeView1.Items.Add(nil, 'Node1') as TCustomTreeNode;
  NewNode.Comment := 'A comment';
  NewNode := TreeView1.Items.Add(nil, 'Node2') as TCustomTreeNode;
  NewNode.Comment := 'Another comment';
end;

procedure TForm1.TreeView1Click(Sender: TObject);
var
  Node: TCustomTreeNode;
begin
  Node := TreeView1.Selected as TCustomTreeNode;
  if Assigned(Node) then
    ShowMessage(Node.Comment);
end;

procedure TForm1.TreeView1CreateNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass);
begin
  NodeClass := TCustomTreeNode;
end;

Delphiツリービューの世界最高のエキスパートであるとは言えませんが、私の経験では、ツリーノードを自分で作成することはありません。新しいノードを作成するには、常にいずれかのAddXXXメソッドを呼び出す必要があります。TTreeView.Items

于 2012-04-04T16:00:08.197 に答える