如何复制一个控件,让新的和老的属性一样,并得到新的句柄。

解决方案 »

  1.   

    复制控件?你是说在一个窗体设计器中复制一个控件是吗。
    如果是的话很简单:
    首先拉一个控件在窗体上,设好所有的属性,然后右击它,弹出菜单中有一个EdiT项,项中有子菜单,选中COPY,然后右击窗体没有控件的地方,先Edit-》Paste。
    就完成复制了,此时只有Name属性不同,其他就属性就相同了,
      

  2.   

    Voidest(白乌鸦) 能否具体一点,比如给出代码。谢谢linzhengqun(山之峰) 当然不是了,运行时动态复制啊。看来也有朋友想知道,那就帮忙top一下吧。谢谢
      

  3.   

    这个倒是没有遇到过,而Voidest(白乌鸦)的:
    用继承,这样可以继承所有非私有的属性。是不可能行的,继承是对于类而言,而不是对于对象而言,用继承的方式,只是继承了父类的属性,而不是继承属性的具体内容。即你继承之后,父类有什么属性,子类就有什么属性,当然除了你类的私有属性外。你实现这样我想可以作一个函数吧,但也不是很一般性,只能复制一般比较常用的属性了
    比如这样的函数
    procedure CopyControl(var C1,C2:WinControl);
    begin
      这里把C1的属性赋给C2;,
    end;
    当然控件还是要自己动态生成的,不过我想这样也比较方便了吧。
      

  4.   

    (*//
    标题:复制元件
    说明:支持复制子元件和事件;此函数难度比较大;强烈推荐
    设计: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;
      

  5.   

    zswangII(伴水清清)(一贴不灌,何以灌天下?)
    函数可以用,但关闭程序出现runtime error请指教。
      

  6.   

    非可视控件可以使用Assign方法来复制属性,必须是TPersistent的子类,这个看一下帮助就可以了。
    对于类是可以通过继承来实现的,例如窗口继承,可以在定位类时在class后面加上父类名称达到继承的目的。
    如果以上两种方法都不能满足你的需求,你可以将此控件继承增加一个复制的方法,在该方法中实现将两个对象的属性复制的过程,这样也可以达到你的目的了。