Работа с буфером обмена через свой формат
Автор: Xavier Pacheco
{ Copyright © 1999 by Delphi 5 Developer's Guide - Xavier Pacheco and Steve Teixeira } unit cbdata; interface uses SysUtils, Windows, clipbrd; const DDGData = 'CF_DDG'; // constant for registering the clipboard format. type // Record data to be stored to the clipboard TDataRec = packed record LName: string[10]; FName: string[10]; MI: string[2]; Age: Integer; BirthDate: TDateTime; end; { Define an object around the TDataRec that contains the methods for copying and pasting the data to and from the clipboard } TData = class public Rec: TDataRec; procedure CopyToClipBoard; procedure GetFromClipBoard; end; var CF_DDGDATA: word; // Receives the return value of RegisterClipboardFormat(). implementation procedure TData.CopyToClipBoard; { This function copies the contents of the TDataRec field, Rec, to the clipboard as both binary data, as text. Both formats will be available from the clipboard } const CRLF = #13#10; var Data: THandle; DataPtr: Pointer; TempStr: string[50]; begin // Allocate SizeOf(TDataRec) bytes from the heap Data := GlobalAlloc(GMEM_MOVEABLE, SizeOf(TDataRec)); try // Obtain a pointer to the first byte of the allocated memory DataPtr := GlobalLock(Data); try // Move the data in Rec to the memory block Move(Rec, DataPtr^, SizeOf(TDataRec)); { Clipboard.Open must be called if multiple clipboard formats are being copied to the clipboard at once. Otherwise, if only one format is being copied the call isn't necessary } ClipBoard.Open; try // First copy the data as its custom format ClipBoard.SetAsHandle(CF_DDGDATA, Data); // Now copy the data as text format with Rec do TempStr := FName + CRLF + LName + CRLF + MI + CRLF + IntToStr(Age) + CRLF + DateTimeToStr(BirthDate); ClipBoard.AsText := TempStr; { If a call to Clipboard.Open is made you must match it with a call to Clipboard.Close } finally Clipboard.Close end; finally // Unlock the globally allocated memory GlobalUnlock(Data); end; except { A call to GlobalFree is required only if an exception occurs. Otherwise, the clipboard takes over managing any allocated memory to it.} GlobalFree(Data); raise; end; end; procedure TData.GetFromClipBoard; { This method pastes memory saved in the clipboard if it is of the format CF_DDGDATA. This data is stored in the TDataRec field of this object. } var Data: THandle; DataPtr: Pointer; Size: Integer; begin // Obtain a handle to the clipboard Data := ClipBoard.GetAsHandle(CF_DDGDATA); if Data = 0 then Exit; // Obtain a pointer to the memory block referred to by Data DataPtr := GlobalLock(Data); try // Obtain the size of the data to retrieve if SizeOf(TDataRec) > GlobalSize(Data) then Size := GlobalSize(Data) else Size := SizeOf(TDataRec); // Copy the data to the TDataRec field Move(DataPtr^, Rec, Size) finally // Free the pointer to the memory block. GlobalUnlock(Data); end; end; initialization // Register the custom clipboard format CF_DDGDATA := RegisterClipBoardFormat(DDGData); end.
{ Copyright © 1999 by Delphi 5 Developer's Guide - Xavier Pacheco and Steve Teixeira } unit MainFrm; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, clipbrd, Mask, ComCtrls; type TMainForm = class(TForm) edtFirstName: TEdit; edtLastName: TEdit; edtMI: TEdit; btnCopy: TButton; btnPaste: TButton; meAge: TMaskEdit; btnClear: TButton; lblFirstName: TLabel; lblLastName: TLabel; lblMI: TLabel; lblAge: TLabel; lblBirthDate: TLabel; memAsText: TMemo; lblCustom: TLabel; lblText: TLabel; dtpBirthDate: TDateTimePicker; procedure btnCopyClick(Sender: TObject); procedure btnPasteClick(Sender: TObject); procedure btnClearClick(Sender: TObject); end; var MainForm: TMainForm; implementation uses cbdata; {$R *.DFM} procedure TMainForm.btnCopyClick(Sender: TObject); // This method copies the data in the form's controls onto the clipboard var DataObj: TData; begin DataObj := TData.Create; try with DataObj.Rec do begin FName := edtFirstName.Text; LName := edtLastName.Text; MI := edtMI.Text; Age := StrToInt(meAge.Text); BirthDate := dtpBirthDate.Date; DataObj.CopyToClipBoard; end; finally DataObj.Free; end; end; procedure TMainForm.btnPasteClick(Sender: TObject); { This method pastes CF_DDGDATA formatted data from the clipboard to the form's controls. The text version of this data is copied to the form's TMemo component. } var DataObj: TData; begin btnClearClick(nil); DataObj := TData.Create; try // Check if the CF_DDGDATA format is available if ClipBoard.HasFormat(CF_DDGDATA) then // Copy the CF_DDGDATA formatted data to the form's controls with DataObj.Rec do begin DataObj.GetFromClipBoard; edtFirstName.Text := FName; edtLastName.Text := LName; edtMI.Text := MI; meAge.Text := IntToStr(Age); dtpBirthDate.Date := BirthDate; end; finally DataObj.Free; end; // Now copy the text version of the data to form's TMemo component. if ClipBoard.HasFormat(CF_TEXT) then memAsText.PasteFromClipBoard; end; procedure TMainForm.btnClearClick(Sender: TObject); var i: integer; begin // Clear the contents of all controls on the form for i := 0 to ComponentCount - 1 do if Components[i] is TCustomEdit then TCustomEdit(Components[i]).Text := ''; end; end.Скачать весь проект
Далее: Симулировать нажатие клавиш для копии и вставки из буфера »»