1. 程式人生 > 其它 >Delphi Clipboard[5] SetComponent、GetComponent -元件在剪貼簿中的操作

Delphi Clipboard[5] SetComponent、GetComponent -元件在剪貼簿中的操作

{該文首發於部落格園 滔Roy,無須授權即可轉發,請自覺保留頭部申明}

Delphi Clipboard[5] SetComponent、GetComponent -元件在剪貼簿中的操作

1、SetComponent  //將元件複製到剪貼簿

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 //從剪貼簿中檢索元件

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、示例  

//複製Edit
var 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  更新時間: