一个有难度的问题:如何为 [设计时 动态 创建 的 控件] 指定事件?
我在设计时动态创建的控件,那个控件是由一个控件生成的,被生成的代码放在当前的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




