2011-07-04 11 views

答えて

2

ノードのDataがフレームまたは他の種類のオブジェクトへのポインタを保持している場合、それが保持するオブジェクトの型へのポインタを型キャストすると、実際には何の違いもありません。

以下のコードでは、TreeViewのノードとして2つのフレーム(IDEによって作成されたFrame2とFrame3)を追加し、 1つは偽です。

type 
    TForm1 = class(TForm) 
    TreeView1: TTreeView; 
    procedure FormCreate(Sender: TObject); 
    procedure TreeView1Change(Sender: TObject; Node: TTreeNode); 
    procedure TreeView1Changing(Sender: TObject; Node: TTreeNode; 
     var AllowChange: Boolean); 
    procedure FormDestroy(Sender: TObject); 
    end; 

var 
    Form1: TForm1; 

implementation 

uses Unit2, Unit3; 

{$R *.dfm} 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    TreeView1.Align := alLeft; 

    with TFrame(TreeView1.Items.AddObject(nil, 'Frame2', TFrame2.Create(nil)).Data) do begin 
    Visible := False; 
    Parent := Self; 
    Align := alClient; 
    end; 

    with TFrame(TreeView1.Items.AddObject(nil, 'Frame3', TFrame3.Create(nil)).Data) do begin 
    Visible := False; 
    Parent := Self; 
    Align := alClient; 
    end; 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
var 
    i: Integer; 
begin 
    for i := 0 to TreeView1.Items.Count - 1 do 
    TFrame(TreeView1.Items[i].Data).Free; 
end; 


procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode); 
begin 
    TFrame(Node.Data).Visible := True; 
end; 

procedure TForm1.TreeView1Changing(Sender: TObject; Node: TTreeNode; 
    var AllowChange: Boolean); 
begin 
    if Assigned((Sender as TTreeView).Selected) then 
    TFrame(TTreeView(Sender).Selected.Data).Visible := False; 
end; 
+0

良い。なぜNods:First chance例外で$ 766EB727のようなエラーが発生するのでしょうか?モジュール 'Project1.exe'のアドレス0049515Bでのアクセス違反という例外クラスEAccessViolation。アドレス00000059 'の読み出し。プロセスProject1.exe(3636)??? – maxfax

+0

いいえ:) – maxfax

+0

+1、コードは完璧に動作します。 @maxfax、あなたのために動作しない場合、より具体的に失敗してください。コードをコピーして貼り付けましたか、それともあなたの状況に適応させましたか?アクセス違反はどこで手に入りますか? –

関連する問題