请问:我的程序是通过TreeView组件不同节点动态创建Frame  ....在创建Frame时需要用到很多初始化处理,想问一下Frame有没有像Create类似的事件可以在创建后处理一些事情。别的办法的也行!

解决方案 »

  1.   

    MainForm主程序里有这样的一个过程装载Frame
    //装载Frame
    procedure TMainForm.LoadFrame(str: string);
    begin
    if FFrame<>nil then//创建前先行释放Frame; FFrame是一个全局变量
      begin
        FFrame.Free;
        FFrame := nil;
      end;  if GetClass(str)<>nil then
      begin
        FFrame:=TFrameClass(Findclass(str)).Create(self);//用创建的Frame重写FFrame变量;
        FFrame.Parent:=GroupFrame;
        FFrame.Align :=alClient;
        FFrame.Show;
      end;
    end;//TreeView组件在不同的节点选择Frame
    procedure TMainForm.trvManageChange(Sender: TObject; Node: TTreeNode);
    begin
       //加载TMyFrame
      if 满足一些条件 then
       loadFrame('TMyFrame');
    end;initialization//注册Frame;
      RegisterClass(TMyFrame);//End MainForm .比如说我想让TMyFrame在创建时将其中包括的ListBox1的Item填充.
    //TMyFrame ListBox组件
    for i := 0 to 10 do 
      ListBox1.items.add(IntToStr(i));
    当加载这个Frame时怎么让这条语句执行呢?
      

  2.   

    既然TMyFrame是你自己写的,那么你就可以在TMyFrame中重定义Create方法啊
    TMyFrame = class(TFrame)
    public
      construtcor Create(AOwner: TComponent); override;
    end;constructor TMyFrame.Create(AOwner: TComponent);
    begin
      //do anything you want!
    end;
      

  3.   

    不过在Create方法中对控件操作好像会有问题,因为这个时候这些控件还没有被实例化
    最好是重定义DoCreate方法protected
      procedure DoCreate; override;
      

  4.   

    楼上说的没错,frame是没有create事件的。我添加一行 inherited,免的你再有麻烦。
    constructor TMyFrame.Create(AOwner: TComponent);
    begin
      inherited;  //do anything you want!
    end;
      

  5.   

    我是这样做的。在Frame的单元里,加一个Public的方法。

    public
       procedure MyCreate();在调用Frame.Show之前,先调用Frame.MyCreate完成初始化。