CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

一个有难度的问题:如何为 [设计时 动态 创建 的 控件] 指定事件?

楼主Iamfish(呆鱼)2003-09-03 00:02:55 在 Delphi / VCL组件开发及应用 提问

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

1 楼Iamfish(呆鱼)回复于 2003-09-03 00:04:12 得分 0

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

2 楼Drate(小虫(好好学习,天天向上))回复于 2003-09-03 00:14:17 得分 10

{定义按钮信息}  
  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;Top

3 楼ImFool(搞技术的都是傻瓜)回复于 2003-09-03 12:00:54 得分 2

切,有什么难度呀,直接赋值不就得了。Top

4 楼tonylk(=www.tonixsoft.com=)回复于 2003-09-03 12:11:56 得分 5

好像还是牵涉到程序文件的修改,我不太清楚,确实有难度。。。下午试验一下。。。Top

5 楼tonylk(=www.tonixsoft.com=)回复于 2003-09-03 13:23:58 得分 0

现在找到一种方法可以往.pas文件中加代码:  
  uses:  
  DesignIntf,   ToolsAPI  
   
  var  
      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()的实现,这个定位就相当于语法分析,我觉得太复杂,而且不安全,我再找找其它方法.Top

6 楼tonylk(=www.tonixsoft.com=)回复于 2003-09-03 13:48:13 得分 5

另: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文件中没有该控件的声明,所以程序运行时会有控件无法找到的异常,不知这个你是怎么实现的。  
  Top

7 楼Iamfish(呆鱼)回复于 2003-09-03 14:22:36 得分 0

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

8 楼tonylk(=www.tonixsoft.com=)回复于 2003-09-03 15:42:19 得分 0

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

9 楼tonylk(=www.tonixsoft.com=)回复于 2003-09-03 15:47:34 得分 5

照这样可以:  
   
   
  在设计时至负责创建控件,在运行时,则寻找这个创建出来的控件,并重定向它的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;  
  Top

10 楼tonylk(=www.tonixsoft.com=)回复于 2003-09-03 15:49:37 得分 0

又改进了一下,贴个完整的吧:  
   
  unit   MyComponent;  
   
  interface  
   
  uses  
      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;  
   
  implementation  
   
  procedure   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.  
  Top

11 楼Iamfish(呆鱼)回复于 2003-09-03 17:42:20 得分 0

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

12 楼tonylk(=www.tonixsoft.com=)回复于 2003-09-03 20:54:28 得分 0

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

13 楼tonylk(=www.tonixsoft.com=)回复于 2003-09-03 20:55:17 得分 5

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

14 楼Iamfish(呆鱼)回复于 2003-09-03 21:23:05 得分 0

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

15 楼Iamfish(呆鱼)回复于 2003-09-03 21:24:22 得分 0

好像有加你的MSN了吧?  
   
  yztink@msn.com  
  QQ:59219588       最近上QQ比较多,因为一上MSN公司的网就断了:(Top

16 楼ImFool(搞技术的都是傻瓜)回复于 2003-09-04 01:48:03 得分 10

楼主:不好意思,是“设计时”哦,没细看。  
   
  个人觉得好像没必要研究这个,你做的控件很复杂吗,用得着为人家自动填入那么多东西么?  
  如果真有很多常用代码,不如封装到控件内部再设置一个属性选用了。  
   
  控件的事件本来就是给控件的使用者,而不是作者自己用的。你的意思应该是向导形式的东西了,还真没听说过谁对这个感兴趣。Top

17 楼tonylk(=www.tonixsoft.com=)回复于 2003-09-04 08:43:46 得分 6

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

18 楼Iamfish(呆鱼)回复于 2003-09-04 09:37:59 得分 0

哈哈。我还是把我这个半成品公开出来吧。Top

19 楼Iamfish(呆鱼)回复于 2003-09-04 10:12:17 得分 0

http://ww.sjrj.com/yzt/yDBFormWizardDEMO.rar  
   
  名称   :数据窗口向导DEOM  
  作者   :LazyBoy  
  日期   :2003-9-4  
  Email:yztink@163.com  
  MSN     :yztink@msn.com  
  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  
   
   
  Top

20 楼Iamfish(呆鱼)回复于 2003-09-04 10:18:52 得分 0

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

21 楼zjy6631(刘阿木)回复于 2003-09-09 13:15:41 得分 2

同意   tonylk(tony)Top

22 楼Iamfish(呆鱼)回复于 2003-09-09 18:05:45 得分 0

upTop

相关问题

  • 怎样创建一个控件到指定的容器中?
  • 急救:如何动态创建控件在Notebook指定的页上???
  • SSTAB控件的指定页
  • 如何将所有控件(包括动态创建的控件)各项属性存入指定文件,并从该文件中读取
  • Rich Edit 控件的创建
  • 动态创建控件
  • evb中创建控件
  • 关于创建控件……
  • 动态创建控件?
  • 创建新的控件类

关键词

  • .net
  • 控件
  • 代码
  • 属性
  • 文件
  • btninfo
  • btn
  • ydbformwizard
  • aowner
  • btnname

得分解答快速导航

  • 帖主:Iamfish
  • Drate
  • ImFool
  • tonylk
  • tonylk
  • tonylk
  • tonylk
  • ImFool
  • tonylk
  • zjy6631

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo