如何复制一个控件,让新的和老的属性一样,并得到新的句柄。 如何复制一个控件,让新的和老的属性一样,并得到新的句柄。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 复制控件?你是说在一个窗体设计器中复制一个控件是吗。如果是的话很简单:首先拉一个控件在窗体上,设好所有的属性,然后右击它,弹出菜单中有一个EdiT项,项中有子菜单,选中COPY,然后右击窗体没有控件的地方,先Edit-》Paste。就完成复制了,此时只有Name属性不同,其他就属性就相同了, Voidest(白乌鸦) 能否具体一点,比如给出代码。谢谢linzhengqun(山之峰) 当然不是了,运行时动态复制啊。看来也有朋友想知道,那就帮忙top一下吧。谢谢 这个倒是没有遇到过,而Voidest(白乌鸦)的:用继承,这样可以继承所有非私有的属性。是不可能行的,继承是对于类而言,而不是对于对象而言,用继承的方式,只是继承了父类的属性,而不是继承属性的具体内容。即你继承之后,父类有什么属性,子类就有什么属性,当然除了你类的私有属性外。你实现这样我想可以作一个函数吧,但也不是很一般性,只能复制一般比较常用的属性了比如这样的函数procedure CopyControl(var C1,C2:WinControl);begin 这里把C1的属性赋给C2;,end;当然控件还是要自己动态生成的,不过我想这样也比较方便了吧。 (*//标题:复制元件说明:支持复制子元件和事件;此函数难度比较大;强烈推荐设计:Zswang日期:2002-01-25支持:[email protected]//*)//*******Begin 修改日志*******////2004-07-01 Zswang No.1 完善 返回实例指针以便控制//*******End 修改日志*******//////////Begin Sourceuses TypInfo;function CopyComponent(mSource: TComponent; mParent: TComponent; mOwner: TComponent): TObject; { 返回复制元件是否成功 }var vComponent: TComponent; I: Integer; vMemoryStream: TMemoryStream; vReader: TReader; vPropList: PPropList; vPropInfo: PPropInfo;begin vMemoryStream := TMemoryStream.Create; vReader := TReader.Create(vMemoryStream, 256); try try vMemoryStream.WriteComponent(mSource); vMemoryStream.Position := 0; vReader.Parent := mParent; vComponent := vReader.ReadRootComponent(nil); Result := vComponent; for I := 0 to GetPropList(mSource, vPropList) - 1 do begin vPropInfo := vPropList^[I]; if vPropInfo^.PropType^.Kind = tkMethod then SetMethodProp(vComponent, vPropInfo^.Name, GetMethodProp(mSource, vPropInfo^.Name)); end; except Result := nil; Exit; end; finally vReader.Free; vMemoryStream.Free; end; if mSource is TWinControl then for I := 0 to TWinControl(mSource).ControlCount - 1 do if CopyComponent(TWinControl(mSource).Controls[I], vComponent, mOwner) = nil then Exit;end; { CopyComponent }////////End Sourceprocedure TForm1.Button1Click(Sender: TObject);var vTreeView: TTreeView;begin RegisterClasses([TTreeView]); //调用的时候需要注册相关的类 TObject(vTreeView) := CopyComponent(TreeView1, Self, Self); vTreeView.Left := 100; vTreeView.Top := 20; UnRegisterClasses([TTreeView]);end; zswangII(伴水清清)(一贴不灌,何以灌天下?)函数可以用,但关闭程序出现runtime error请指教。 非可视控件可以使用Assign方法来复制属性,必须是TPersistent的子类,这个看一下帮助就可以了。对于类是可以通过继承来实现的,例如窗口继承,可以在定位类时在class后面加上父类名称达到继承的目的。如果以上两种方法都不能满足你的需求,你可以将此控件继承增加一个复制的方法,在该方法中实现将两个对象的属性复制的过程,这样也可以达到你的目的了。 fastreport组打印脚本 图表控件问题。那里有这样的控件呢。急50分给定了 gifimage控件的安装问题 恳求大家帮忙!!!! 有做过通过串口控制Modem卡的高手么?帮忙吧 个人闹钟 PPClock 7.1 正式发布,欢迎大家下载使用 关于打开窗体的简单问题?急!!!!!!! 求同时访问2个表的方法 关于QReport下的Quickrep的不能使用问题。 大家请帮我看看........... 如何提速画图效率? 哪位高手知道如何设置打印机的进纸,以及纸张大小 如何发布COM+ 的服务器端 和 客户端
如果是的话很简单:
首先拉一个控件在窗体上,设好所有的属性,然后右击它,弹出菜单中有一个EdiT项,项中有子菜单,选中COPY,然后右击窗体没有控件的地方,先Edit-》Paste。
就完成复制了,此时只有Name属性不同,其他就属性就相同了,
用继承,这样可以继承所有非私有的属性。是不可能行的,继承是对于类而言,而不是对于对象而言,用继承的方式,只是继承了父类的属性,而不是继承属性的具体内容。即你继承之后,父类有什么属性,子类就有什么属性,当然除了你类的私有属性外。你实现这样我想可以作一个函数吧,但也不是很一般性,只能复制一般比较常用的属性了
比如这样的函数
procedure CopyControl(var C1,C2:WinControl);
begin
这里把C1的属性赋给C2;,
end;
当然控件还是要自己动态生成的,不过我想这样也比较方便了吧。
标题:复制元件
说明:支持复制子元件和事件;此函数难度比较大;强烈推荐
设计:Zswang
日期:2002-01-25
支持:[email protected]
//*)//*******Begin 修改日志*******//
//2004-07-01 Zswang No.1 完善 返回实例指针以便控制
//*******End 修改日志*******//////////Begin Source
uses TypInfo;function CopyComponent(mSource: TComponent; mParent: TComponent;
mOwner: TComponent): TObject; { 返回复制元件是否成功 }
var
vComponent: TComponent;
I: Integer;
vMemoryStream: TMemoryStream;
vReader: TReader;
vPropList: PPropList;
vPropInfo: PPropInfo;
begin
vMemoryStream := TMemoryStream.Create;
vReader := TReader.Create(vMemoryStream, 256);
try
try
vMemoryStream.WriteComponent(mSource);
vMemoryStream.Position := 0;
vReader.Parent := mParent;
vComponent := vReader.ReadRootComponent(nil);
Result := vComponent;
for I := 0 to GetPropList(mSource, vPropList) - 1 do begin
vPropInfo := vPropList^[I];
if vPropInfo^.PropType^.Kind = tkMethod then
SetMethodProp(vComponent, vPropInfo^.Name,
GetMethodProp(mSource, vPropInfo^.Name));
end;
except
Result := nil;
Exit;
end;
finally
vReader.Free;
vMemoryStream.Free;
end;
if mSource is TWinControl then
for I := 0 to TWinControl(mSource).ControlCount - 1 do
if CopyComponent(TWinControl(mSource).Controls[I],
vComponent, mOwner) = nil then Exit;
end; { CopyComponent }
////////End Sourceprocedure TForm1.Button1Click(Sender: TObject);
var
vTreeView: TTreeView;
begin
RegisterClasses([TTreeView]); //调用的时候需要注册相关的类
TObject(vTreeView) := CopyComponent(TreeView1, Self, Self);
vTreeView.Left := 100;
vTreeView.Top := 20;
UnRegisterClasses([TTreeView]);
end;
函数可以用,但关闭程序出现runtime error请指教。
对于类是可以通过继承来实现的,例如窗口继承,可以在定位类时在class后面加上父类名称达到继承的目的。
如果以上两种方法都不能满足你的需求,你可以将此控件继承增加一个复制的方法,在该方法中实现将两个对象的属性复制的过程,这样也可以达到你的目的了。