git-svn-id: https://192.168.0.254/svn/Proyectos.Tecsitel_FactuGES2/trunk@648 0c75b7a4-871f-7646-8a2f-f78d34cc349f
271 lines
6.5 KiB
ObjectPascal
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.
|
|
|