在panel上有个button1,如何实现对这个按钮的剪切、复制、粘贴功能??  
即实现
1、单击“剪切”按钮,将panel1上的button1剪切到剪贴板
2、单击“复制”按钮,将panel1上的button1复制到剪贴板
3、单击“粘贴”按钮,将刚剪切或复制的button1粘贴到panel1上答对分数可以再加!!!!最好有代码,谢谢!

解决方案 »

  1.   

    你要 剪切 button?不会,关注,帮你定~
      

  2.   

    所谓的“复制”,并不是复制按钮本身这个“图片”,而是复制它的一些属性,如:Name, Caption, Width, Height等。“粘贴”就是利用这些属性在某一个位置创建一个新的组件。“剪切”就是原来的复制以后再Free掉。
      

  3.   

    Windows使用剪贴板观察器和观察链。剪贴板观察器是一个显示剪贴板当前内容的窗口。通常它应该至少能显示三种普通格式的内容:文字CF_TEXT、位图CF_BITMAP、元文件CF_METAFILEPICT。剪贴板观察链是一系列相互独立的剪贴板观察窗口,它们都能够接受当前发送到剪贴板的内容。我们大致按照以下步骤在窗口中处理有关剪贴板的内容。 ---- 首先,使用SetClipboardViewer(HWND)函数向剪贴板观察链中加入一个观察窗口。当剪贴板的内容发生变化时,该窗口会接收到一个WM_DRAWCLIPBOARD消息。该函数需要传递的参数是观察窗口的句柄。返回值也是一个窗口句柄类型,标识了将要加入的下一个窗口。 ---- 然后,响应WM_DRAWCLIPBOARD消息处理剪贴板内容的变化。 ---- 最后,在程序退出或关闭时需要调用ChangeClipboardChain函数来将自己从观察链中删除。然后调用SendMessage函数把这些消息传递到观察链中的下一个观察窗口。函数ChangeClipboardChain原型如下: BOOL ChangeClipboardChain(
    HWND hWndRemove, //将要删除的窗口的句柄
    HWND hWndNewNext  //观察链中下一个窗口的句柄
       ); 
    ---- Delphi的clipbrd.pas单元中定义了一个类TClipboard,它封装了Windows剪贴板,简化了大量复杂的处理过程。我们在程序中可以直接调用全局函数Clipboard,该函数用于返回TClipboard对象实例,使用这个实例对剪贴板进行剪切、复制和粘贴等操作。下面是TClipboard对象的几个常用的方法和属性的简单介绍。 ---- 方法: ---- Assign:将指定的对象放入剪贴板中。 ---- Open:打开剪贴板,防止其他程序改写剪贴板。在向剪贴板加入多项数据时尤其有用。 ---- Close:关闭剪贴板。应该与打开剪贴板成对使用。 ---- Clear:清空剪贴板。 ---- GetAsHandle:返回剪贴板中指定格式数据的句柄。使用前必须打开剪贴板。 ---- GetComponent:返回剪贴板中的一个控件。Delphi自己使用得多。 ---- HasFormat:查询剪贴板中是否有指定格式的内容。 ---- 属性: ---- AsText:用于读写剪贴板文字内容。 ---- FormatCount:读剪贴板中数据格式的种数。 ---- Formats:返回剪贴板中各种格式的列表。
      

  4.   

    剪贴板的编程
    公告:闪亮网络学院新站开通,本栏停止更新 
    日期:2003年6月27日 作者:佚名 人气: 查看:[大字体 中字体 小字体]  
    在Delphi中有一些全局对象,永远不要去构造它们的实例。其中有两个对象是以全局
    变量的方式提供的,这两个变量一个是Application(TApplication类型,包含Forms单元即
    可调用),另一个是Screen(TScreen类型,包含Forms单元即可调用)。而另外两个对象是以
    函数方式提供的,这两个对象一个是Printer(TPrinter类型,包含Printers单元就可调),
    另一个就是Clipboard(TClipboard类型,包含Clipbrd单元就可调用)。用函数而不是全局变
    量会令实际的变量存贮在单元的实现部分而不是接口部分,这样就永远不能对它赋值。
        现在介绍Clipboard的编程。
        Clipboard是由系统自动实例化的一个对象,通过该对象可以操作剪贴板,可以存取和
    清除剪贴板的内容。不过一般不显式地操作剪贴板,而是通过操作其它的控件或由系统自动
    更新剪贴板内容。如基于TCustomEdit的控件(如TEdit, TMemo,TRichEdit等)就有直接操作
    剪贴板的方法:CopyToClipboard,CutToClipboard和PasterFromClipboard。事实上在
    TCustomEdit运行时,Ctrl+C, Ctrl+X, Ctrl+V自动定义成了操作剪贴板的热键,不用
    编写任何代码。剪贴板的内容可以通过查询HasFormat获得其格式。Windows系统支持三
    种基本格式:CF_TEXT, CF_BITMAP和CF_METAFILEPICT,分别表示文本、位图和元文件图
    象,其它的格式难以预知,因为任何新的格式都需要向Windows注册新类型。Delphi就注
    册了两种类型:CF_PICTURE(TPicture类型,包括TIcon, TBitmap和TMetafile)和
    CF_COMPONENT(TComponent类型)。全部的格式可以通过Windows API的枚举函数
    CountClipboardFormats和EnumClipboardFormats测知,甚至还可以用GetClipboardFormatName
    查出每种格式的名称。
        Clipboard的基类是TPersistent,说明Clipboard不能处理任何Windows消息。剪贴板
    是由Windows运行中的所有任务共同操作的,当有任何一个任务修改剪贴板内容时,不能
    自动通知需要监测剪贴板状态的窗口。如果工具栏中有一个粘贴的按钮,不能动态地修改
    这个按钮的活动状态。有两种方法可以解决这个问题:一个是重载主窗体的Windows消息过
    程,并在OnCreate和OnDestroy添加和注销剪贴板观察窗体链。另一个是设计一个剪贴板监
    控器部件,需要时添加到主窗体中即可。显然第二种方法较好。unit ClipMonitor;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, clipbrd;type
      TClipFormat = (cfNone, cfText, cfBitmap, cfMetaFilePict,
        cfPicture, cfComponent, cfOther);  TClipMonitor = class(TComponent)
      private
        FHandle, FNextViewerHandle: THandle;
        FActive: Boolean;
        FOnChange:TNotifyEvent;
        OldWndProc, NewWndProc: Pointer;
        procedure SetActive(Value: Boolean);
        function GetFormat: TClipFormat;
        procedure SetFormat(Value: TClipFormat);
      protected
        procedure NewWndMethod(var msg: TMessage);
        procedure Loaded; override;
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
        property Active: Boolean read FActive write SetActive default False;
        property Format: TClipFormat read GetFormat write SetFormat stored False;
        property OnChange: TNotifyEvent read FOnChange write FOnChange;
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('System', [TClipMon]);
    end;constructor TClipMon.Create(AOwner: TComponent);
    begin
      if not (AOwner is TForm) then
        raise Exception.CreateFmt('''%s'' is not a Form', [AOwner.Name])
      else if AOwner = nil then
        raise Exception.Create('No Windowized Owner');
      inherited Create(AOwner);
      FHandle := (Owner as TForm).Handle;
      FNextViewerHandle := 0;
      FActive := False;
      FNextViewerHandle := SetClipboardViewer(FHandle);
      if not (csDesigning in ComponentState) then begin
        NewWndProc := MakeObjectInstance(NewWndMethod);
        OldWndProc := Pointer(SetWindowLong(FHandle, GWL_WNDPROC,
          LongInt(NewWndProc)));
      end else begin
        NewWndProc := nil;
        OldWndProc := nil;
      end;
    end;destructor TClipMon.Destroy;
    begin
      ChangeClipboardChain(FHandle, FNextViewerHandle);
      if Assigned(NewWndProc) then begin
        SetWindowLong(FHandle, GWL_WNDPROC, Longint(OldWndProc));
        FreeObjectInstance(NewWndProc);
      end;
      inherited Destroy;
    end;{设置是否允许自动剪贴板监控}
    procedure TClipMon.SetActive(Value: Boolean);
    begin
      if FActive <> Value then FActive := Value;
    end;{取剪贴板格式}
    function TClipMon.GetFormat: TClipFormat;
    var
      I: Integer;
    begin
      Result := cfNone;
      if Clipboard.HasFormat(CF_TEXT) then Result := cfText
      else if Clipboard.HasFormat(CF_BITMAP) then Result := cfBitmap
      else if Clipboard.HasFormat(CF_METAFILEPICT) then Result := cfMetaFilePict
      else if Clipboard.HasFormat(CF_PICTURE) then Result := cfPicture
      else if Clipboard.HasFormat(CF_COMPONENT) then Result := cfComponent
      else for I := 0 to Clipboard.FormatCount - 1 do
        if Clipboard.HasFormat(Clipboard.Formats[I]) then begin
          Result := cfOther;
          Break;
        end;
    end;{伪过程,事实是剪贴板格式是只读的}
    procedure TClipMon.SetFormat(Value: TClipFormat);
    begin
    end;{处理来自剪贴板观察器链的消息}
    procedure TClipMon.NewWndMethod (var msg: TMessage);
    begin
      case msg.msg of
        WM_DRAWCLIPBOARD:
          begin
            Loaded;
            msg.Result := SendMessage(WM_DRAWCLIPBOARD,
              FNextViewerHandle, 0, 0);
          end;
        WM_CHANGECBCHAIN:
          if THandle(msg.wParam) = FNextViewerHandle then begin
            FNextViewerHandle := msg.lParam;
            msg.Result := 0;
          end else
            msg.Result := SendMessage(FNextViewerHandle, WM_CHANGECBCHAIN,
              msg.wParam, msg.lParam);
        else
          msg.result := CallWindowProc(OldWndProc, FHandle, msg.msg,
            msg.WParam, msg.LParam);
      end;
    end;{部件装载完毕}
    procedure TClipMon.Loaded;
    begin
      if FActive and Assigned(FOnChange) then FOnChange(Self);
    end;end. 
     
      

  5.   

    各位大侠,我有一点弄不明白,如果只是为了实现下面功能,我想Delphi有自带的复制、剪切和粘贴功能,就能实现从一个panel上把button拷贝或剪切到另一个panel或form上,为什么要写什么代码呢?
    在panel上有个button1,如何实现对这个按钮的剪切、复制、粘贴功能??  
    即实现
    1、单击“剪切”按钮,将panel1上的button1剪切到剪贴板
    2、单击“复制”按钮,将panel1上的button1复制到剪贴板
    3、单击“粘贴”按钮,将刚剪切或复制的button1粘贴到panel2上
      

  6.   

    Delphi 没有自带的这些功能!
      

  7.   

    To cleanself(尼可) :“我想Delphi有自带的复制、剪切和粘贴功能,就能实现从一个panel上把button拷贝或剪切到另一个panel或form上” ------您能否进行详细的说明呢??
      

  8.   

    你的想法是象delphi编辑器里那样copy和paste一个按钮吧?但当你的程序运行起来之后怎么可能只copy程序中的一个按钮呢?其实编辑器里copy的也只不过是按钮控件的一些属性而已,不信你在delphi窗口放一个button,然后copy它,再从文本里paste一下就知道了,实际上你copy的是:object Button1: TButton
      Left = 248
      Top = 168
      Width = 75
      Height = 25
      Caption = 'Button1'
      TabOrder = 0
    end