Delphi Clipboard[5] SetComponent、GetComponent -组件在剪贴板中的操作

{该文首发于博客园 滔Roy,无须授权即可转发,请自觉保留头部申明}

Delphi Clipboard[5] SetComponent、GetComponent -组件在剪贴板中的操作

1、SetComponent  //将组件复制到剪贴板

1
2
3
4
5
6
7
8
9
10
11
12
procedure TClipboard.SetComponent(Component: TComponent);
var
  MemStream: TMemoryStream;
begin
  MemStream := TMemoryStream.Create;
  try
    MemStream.WriteComponent(Component);
    SetBuffer(CF_COMPONENT, MemStream.Memory^, MemStream.Size);
  finally
    MemStream.Free;
  end;
end;

2、GetComponent //从剪贴板中检索组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
function TClipboard.GetComponent(Owner, Parent: TComponent): TComponent;
var
  Data: THandle;
  DataPtr: Pointer;
  MemStream: TMemoryStream;
  Reader: TReader;
begin
  Result := nil;
  Open;
  try
    Data := GetClipboardData(CF_COMPONENT);
    if Data = 0 then Exit;
    DataPtr := GlobalLock(Data);
    if DataPtr = nil then Exit;
    try
      MemStream := TMemoryStream.Create;
      try
        MemStream.WriteBuffer(DataPtr^, GlobalSize(Data));
        MemStream.Position := 0;
        Reader := TReader.Create(MemStream, 256);
        try
          Reader.Parent := Parent;
          Result := Reader.ReadRootComponent(nil);
          try
            if Owner <> nil then
              Owner.InsertComponent(Result);
          except
            Result.Free;
            raise;
          end;
        finally
          Reader.Free;
        end;
      finally
        MemStream.Free;
      end;
    finally
      GlobalUnlock(Data);
    end;
  finally
    Close;
  end;
end; 
  • 使用GetComponent检索存储在剪贴板上的组件。
  • 所有者成为检索组件的所有者,父级成为其父级。Owner通常是一个表单,但两个参数都可以是nil(Delphi)或NULL(C++)。
  • 在从剪贴板读取类之前,必须通过调用RegisterClass来注册它。如果试图读取未注册的类,则会出现EClassNotFound异常。

3、示例  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//复制Editvar
  Cpt:TComponent;
begin
  Clipboard.SetComponent(Edit1);   { 将按钮复制到剪贴板 }
  if Clipboard.HasFormat(CF_COMPONENT) then begin
    Cpt:=Clipboard.GetComponent(Self, GroupBox1);
    TEdit(Cpt).Text:='这是滔Roy复制的Edit1';
    TEdit(Cpt).Left:=20;
    TEdit(Cpt).Top:=20;
  end;
end;
 
//复制按钮
var
  Cpt:TComponent;
begin
  Clipboard.SetComponent(BitBtnTest);   { 将按钮复制到剪贴板 }
  BitBtnTest.Caption := 'TaoRoyButton1'{ 重命名仍在表单上的按钮 }
  //现在从剪贴板中检索按钮并将其添加到GroupBox1
  //请注意,剪贴板按钮名为BitBtnTest,而源按钮已重命名为"TaoRoyButton1"
  if Clipboard.HasFormat(CF_COMPONENT) then begin
    Cpt:=Clipboard.GetComponent(Self, GroupBox1);
    TBitBtn(Cpt).Left:=20;
    TBitBtn(Cpt).Top:=50;
  end
end;

   

 注意:这里用到了 HasFormat(CF_COMPONENT)  ,而CF_COMPONENT是Delphi内置的组件剪贴板格式

 

  

 

 

创建时间:2022.04.14  更新时间:

posted on   滔Roy  阅读(299)  评论(2编辑  收藏  举报

相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2021-04-14 Delphi 自定义组件/控件图标
2021-04-14 Delphi Classes.TComponentState - 组件当前状态

导航

点击右上角即可分享
微信分享提示