我在设计时动态创建的控件,那个控件是由一个控件生成的,被生成的代码放在当前的Form中。我怎样才能在控件中为那个被生成的控件指定事件?
                                      ^^^^^^^^^^这件控件是由我的程序生成的。  
                        ^^^^^^---------这个控件是要我开发的。
相关贴子:
http://expert.csdn.net/Expert/topic/2179/2179819.xml?temp=.6342737先出50分。(我的分散尽了)如果真正的能解决这个问题。我可以再给你200分。(我有另外一个帐号一直没有用,里面有4000多分,为了这个问题,该是那个帐号出师的时候了。:)

解决方案 »

  1.   

    晕,忘记csdn的输入框不是WYSWYG我在设计时动态创建的控件,那个控件是由一个控件生成的,被生成的代码放在当前的Form
    中。我怎样才能在控件中为那个被生成的控件指定事件?
                                          ^^^^^^^^^^这件控件是由我的程序生成的。  
                            ^^^^^^---------这个控件是要我开发的。
      

  2.   

    {定义按钮信息}
    type
      TBtnInfo = Record
        BtnName:TOutlookButton;
        BtnCaption:String;
        ImageIndex:Integer;
    end;
    procedure TMainForm.AddButton(var BtnInfo :TBtnInfo);
    begin
      btnInfo.BtnName:= MainBar.ActiveHeader.CreateButton(btnInfo.BtnCaption);
      btnInfo.BtnName.OnClick:= SysBtnClick; //这就是按钮的onclick事件
      btnInfo.BtnName.LargeImages:=  DataModule1.LargeImage;
      btnInfo.BtnName.SmallImages:=  DataModule1.SmallImage;
      btnInfo.BtnName.ImageIndex:=  btnInfo.ImageIndex;
    end;
      

  3.   

    现在找到一种方法可以往.pas文件中加代码:
    uses:
    DesignIntf, ToolsAPIvar
      Module: IOTAModule;
      Editor:IOTASourceEditor;
      Writer: IOTAEditWriter;
    begin
      Module := (BorlandIDEServices as IOTAModuleServices).Modules[0];
      Editor:=Module.CurrentEditor as IOTASourceEditor;
      Writer:=Editor.CreateWriter();
      Writer.Insert('11')
      Writer:=nil;
    end;你可以试试这段代码,可是比较讨厌的是:加代码前还要计算所加的位置,用reader得到form类的起始位置,然后再类定义中加入Button1Click()的声明,然后找到implementation部分,再加入Button1Click()的实现,这个定位就相当于语法分析,我觉得太复杂,而且不安全,我再找找其它方法.
      

  4.   

    另:to Iamfish (呆鱼) 你之前说可以在设计时动态加入控件了,我也试了一下,如果使用:
    constructor TMyComponent.Create(AOwner: TComponent);
    var
      Btn:TButton;
    begin
      inherited;
      if (csDesigning in ComponentState) then begin
        btn:=TButton.Create(AOwner);
        btn.Parent:=TWinControl(AOwner);
        btn.Left:=100;
        btn.Top:=100;
        btn.OnClick:=OnButtonClick;
        btn.Show;
      end;
    end;
    的方法来加的话,只有dfm文件中加入了button,而pas文件中没有该控件的声明,所以程序运行时会有控件无法找到的异常,不知这个你是怎么实现的。
      

  5.   

    TO: tonylk(tony),我用的是Delphi6.0,不知道你用的是哪个版本。
    我在这里测试很正常。另外,不知是不是你代码的原因,你没有为那个新建的btn做个名字:btn.name:='Btn1';你加上上面那个试试。你所说的ToolsAPI我在这里试试。
    TO:ImFool(搞技术的都是傻瓜)
    如果真的那么容易,你自己试一下吧。注意,要:
    在控件中为[设计时 动态 创建 的 控件] 指定事件.
      

  6.   

    to Iamfish(呆鱼) :确实如你所得,该控件定义了名称后就出现在pas文件中了,既然这样的话,如果你的控件在运行时也是放在窗体上的,那么能不能将该控件的事件映射到你的控件上,你的控件再提供publish的事件接口,让用户选择是否要响应该事件。
      

  7.   

    照这样可以:
    在设计时至负责创建控件,在运行时,则寻找这个创建出来的控件,并重定向它的OnClick事件。constructor TMyComponent.Create(AOwner: TComponent);
    var
      Btn:TButton;
    begin
      inherited;
      if (csDesigning in ComponentState) then begin
        if not Assigned(AOwner.FindComponent('hellobtn')) then begin
          btn:=TButton.Create(AOwner);
          btn.Name:='hellobtn';
          btn.Parent:=TWinControl(AOwner);
          btn.Left:=100;
          btn.Top:=100;
          btn.Show;
        end;
      end
      else begin
        btn:=TButton(AOwner.FindComponent('hellobtn'));
        if Assigned(btn) then begin
          btn.OnClick:=OnButtonClick;
        end;
      end;
    end;
      

  8.   

    又改进了一下,贴个完整的吧:unit MyComponent;interfaceuses
      SysUtils, Classes, Windows, Forms, Controls, StdCtrls, DesignIntf, ToolsAPI;type
      TMyComponent = class(TComponent)
      private
        { Private declarations }
        FOldButtonClick:TNotifyEvent;
        procedure OnButtonClick(Sender:TObject);
      protected
        { Protected declarations }
      public
        { Public declarations }
        constructor Create(AOwner:TComponent);override;
      published
        { Published declarations }
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Samples', [TMyComponent]);
    end;{ TMyComponent }procedure TMyComponent.OnButtonClick(Sender:TObject);
    begin
      MessageBox(0,pchar((Sender as TButton).Name),'',0);
      if Assigned(FOldButtonClick) then begin
        FOldButtonClick(Sender);
      end;
    end;constructor TMyComponent.Create(AOwner: TComponent);
    var
      Btn:TButton;
    begin
      inherited;
      if (csDesigning in ComponentState) then begin
        if not Assigned(AOwner.FindComponent('hellobtn')) then begin
          btn:=TButton.Create(AOwner);
          btn.Name:='hellobtn';
          btn.Parent:=TWinControl(AOwner);
          btn.Left:=100;
          btn.Top:=100;
          btn.Show;
        end;
      end
      else begin
        btn:=TButton(AOwner.FindComponent('hellobtn'));
        if Assigned(btn) then begin
          FOldButtonClick:=btn.OnClick;
          btn.OnClick:=OnButtonClick;
        end;
      end;
    end;end.
      

  9.   

    TO tonylk(tony) 谢谢。我现在要做的是为当前的窗口添加代码的。其实,我写的那个控件一旦把那些要生成的控件创建完毕,它就“自杀”了。:)
      

  10.   

    那就照我前面说得,用ToolsAPI中的那堆类,可惜我们有找到什么方法可以直接添加事件,好像只有手工往代码里加了。。你再找找有没有类似功能的软件吧
      

  11.   

    那就照我前面说得,用ToolsAPI中的那堆类,可惜我没有找到什么方法可以直接添加事件,好像只有手工往代码里加了。。你再找找有没有类似功能的代码吧
      

  12.   

    谢谢。我这两天有点忙,我这两天过后,就去查找关于ToolsAPI的资料,其实,ToolsAPI应该可以满足我的要求。:)
      

  13.   

    确实,用这个来开发控件是没有什么必要,但是借此机会学习学习vcl的内部实现还是挺有趣的。
      

  14.   

    http://ww.sjrj.com/yzt/yDBFormWizardDEMO.rar名称 :数据窗口向导DEOM
    作者 :LazyBoy
    日期 :2003-9-4
    Email:[email protected]
    MSN  :[email protected]
    QQ   :59219588
    说明:先安装yDBFormWizard.dcu,安装后面板上多了一个yzt面板。然后打开DEMO/Project1.dpr。在控件yDBFormWizard的属性编辑器上把Active属性设为True。你看到了什么?
    注意:1.yDBFormWizard激活后,他要做的事做完后就"自杀"了!
          2.数据库的字段不能用中文字段名。
          3.使用yDBFormWizard时,当前的Form最好是空的。
          4.如果在同一个窗口中多次使用yDBFormWizard,应把yDBFormWizard生成的所有控件删除掉。否则因为控件同名而无法继续。
          ____________________________________________________________
    yDBFormWizard属性:Active           :开始创建数据窗口
    DataSource       :不用说你也知道吧?
    Fields           :还没有完成:(
    Name             :这个不用解释吧?
    Tag              :鬼才知道这个能干什么事件:
    无方法:

     ____________________________________________________________最后,别忘记到CSDN帮我回答这个问题:http://expert.csdn.net/Expert/topic/2216/2216893.xml?temp=.3833734
      

  15.   

    http://ww.sjrj.com/yzt/yDBFormWizardDEMO.rar应该为:
    http://www.sjrj.com/yzt/yDBFormWizardDEMO.rar