Tecsitel_FactuGES2/Source/Base/Utiles/uSaveClipboard.pas

271 lines
6.5 KiB
ObjectPascal

unit uSaveClipboard;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, RichEdit, Clipbrd,
registry, ActiveX, ShellAPI, ShlObj;
type
TSaveClipboard = class(TObject)
private
FTxt, FRTF, FHTML, FOEMText, FCSV : string;
FUnicodeText : WideString;
FBitmap : TBitmap;
FMetafile : TMetafile;
CF_RTF, CF_HTML, CF_CSV : UINT;
FFiles : TStringList;
procedure ClearBuffer;
public
constructor Create;reintroduce;
destructor Destroy;override;
procedure Save;
procedure Restore;
property PlainText : String read FTxt write FTxt;
property RTFText : String read FRTF write FRTF;
property CSVText : String read FCSV write FCSV;
property HTMLText : String read FHTML write FHTML;
property OEMText : String read FOEMText write FOEMText;
property UnicodeText : WideString read FUnicodeText write FUnicodeText;
property Bitmap : TBitmap read FBitmap write FBitmap;
property Metafile : TMetafile read FMetafile write FMetafile;
end;
implementation
uses
Dialogs;
{ TSaveClipboard }
procedure TSaveClipboard.ClearBuffer;
begin
FTxt:='';
FRTF:='';
FHTML:='';
FCSV := '';
FOEMText:='';
FUnicodeText:='';
FBitmap.Free;
FBitmap:=nil;
FMetafile.Free;
FMetafile:=nil;
FFiles.Clear;
end;
constructor TSaveClipboard.Create;
begin
inherited Create;
FFiles := TStringList.Create;
ClearBuffer;
CF_RTF := RegisterClipboardFormat(RichEdit.CF_RTF);
CF_HTML := {16;//}RegisterClipboardFormat('HTML Format');
CF_CSV := RegisterClipboardFormat('CSV');
end;
destructor TSaveClipboard.Destroy;
begin
ClearBuffer;
FFiles.Free;
inherited;
end;
procedure CopyClipboardData(Format : UINT; Buffer : pointer; Length :
integer);
var Data:THandle;
DataPtr: Pointer;
begin
Data := GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE, Length);
try
DataPtr := GlobalLock(Data);
try
CopyMemory(DataPtr, Buffer, Length);
SetClipboardData(Format, Data);
finally
GlobalUnlock(Data);
end;
except
GlobalFree(Data);
raise;
end;
end;
procedure TSaveClipboard.Restore;
const NULL : Char = #0;
var //Data:THandle;
//DataPtr: Pointer;
DF : TDropFiles;
i : integer;
begin
try
Clipboard.Clear;
Clipboard.Open;
//text
if Length(FTxt) > 0 then Clipboard.AsText:=FTxt;
//OEM text
if Length(FOEMText) > 0 then CopyClipboardData(CF_OEMTEXT,
PChar(FOEMText), Length(FOEMText)+1);
//HTML text
if Length(FHTML) > 0 then CopyClipboardData(CF_HTML, PChar(FHTML),
Length(FHTML)+1);
//CSV text
if Length(FCSV) > 0 then
CopyClipboardData(CF_CSV, PChar(FCSV), Length(FCSV)+1);
//Unicode text
if Length(FUnicodeText) > 0 then CopyClipboardData(CF_UNICODETEXT,
PWideChar(FUnicodeText), 2*Length(FUnicodeText)+2);
//RTF
if Length(FRTF) > 0 then CopyClipboardData(CF_RTF, PChar(FRTF),
Length(FRTF)+1);
//BMP
if FBitmap <> nil then Clipboard.Assign(FBitmap);
//Metafile
if FMetafile <> nil then Clipboard.Assign(FMetafile);
//files
if FFiles.Count > 0 then begin
DF.pFiles:=SizeOf(DF);
DF.pt.x:=0;
DF.pt.y:=0;
DF.fNC:=false;
DF.fWide:=false;
with TMemoryStream.Create do
try
Write(DF, SizeOf(DF));
for i:=0 to FFiles.Count-1 do begin
Write(FFiles[i][1], Length(FFiles[i]));
Write(NULL, SizeOf(NULL));
end;
Write(NULL, SizeOf(NULL));
CopyClipboardData(CF_HDROP, Memory, Size);
finally
Free;
end;
end;
finally
Clipboard.Close;
end;
end;
procedure TSaveClipboard.Save;
var Data:THandle;
p : pointer;
Count, i : integer;
Buffer : array[0..MAX_PATH] of Char;
AList : TStringLIst;
begin
{ AList := TStringList.Create;
try
AList.Add('Lista ----------');
//GetClipboardFormatName(CF_HTML, @Buffer, SizeOf(Buffer));
for i:=0 to Clipboard.FormatCount-1 do begin
if Clipboard.Formats[i] = 0 then beep;
GetClipboardFormatName(Clipboard.Formats[i], @Buffer, SizeOf(Buffer));
AList.Add(Buffer);
end;
ShowMessage(AList.Text);
finally
FreeANDNIL(AList);
end;}
ClearBuffer;
//text
if Clipboard.HasFormat(CF_TEXT) then FTxt:=Clipboard.AsText;
//RTF
if Clipboard.HasFormat(CF_RTF) then
begin
Clipboard.Open;
Data := GetClipboardData(CF_RTF);
if Data <> 0 then begin
FRTF := PChar(GlobalLock(Data));
GlobalUnlock(Data);
end;
Clipboard.Close;
end;
//CSV
if Clipboard.HasFormat(CF_CSV) then
begin
Clipboard.Open;
Data := GetClipboardData(CF_CSV);
if Data <> 0 then begin
FCSV := PChar(GlobalLock(Data));
GlobalUnlock(Data);
end;
Clipboard.Close;
end;
//HTML
if Clipboard.HasFormat(CF_HTML) then begin
Clipboard.Open;
Data := GetClipboardData(CF_HTML);
if Data <> 0 then begin
FHTML := PChar(GlobalLock(Data));
GlobalUnlock(Data);
end;
Clipboard.Close;
end;
//OEM Text
if Clipboard.HasFormat(CF_OEMTEXT) then begin
Clipboard.Open;
Data := GetClipboardData(CF_OEMTEXT);
if Data <> 0 then begin
FOEMText := PChar(GlobalLock(Data));
GlobalUnlock(Data);
end;
Clipboard.Close;
end;
//Unicode
if Clipboard.HasFormat(CF_UNICODETEXT) then begin
Clipboard.Open;
Data := GetClipboardData(CF_UNICODETEXT);
if Data <> 0 then begin
FUnicodeText := PWideChar(GlobalLock(Data));
GlobalUnlock(Data);
end;
Clipboard.Close;
end;
//Bitmap
if Clipboard.HasFormat(CF_BITMAP) then
try
FBitmap:=TBitmap.Create;
FBitmap.Assign(Clipboard);
except
FBitmap.Free;
end;
//metafile
if Clipboard.HasFormat(CF_METAFILEPICT) then
try
FMetafile:=TMetafile.Create;
FMetafile.Assign(Clipboard);
except
FMetafile.Free;
end;
//files
if Clipboard.HasFormat(CF_HDROP) then begin
Clipboard.Open;
Data := GetClipboardData(CF_HDROP);
if Data <> 0 then begin
p := PChar(GlobalLock(Data));
Count:=DragQueryFile(HDROP(p), $FFFFFFFF, nil, 0);
for i:=0 to Count-1 do begin
DragQueryFile(HDROP(p), i, @Buffer, SizeOf(Buffer));
if strlen(PChar(@Buffer)) > 0 then FFiles.Add(PChar(@Buffer));
end;
GlobalUnlock(Data);
end;
Clipboard.Close;
end;
end;
end.