好友
阅读权限10
听众
最后登录1970-1-1
|
1. 在保存到文件的过程中,Clipboard.GetFormat没有被正确调用,ClipboardFormat变量未初始化,导致无法获取数据。
2. SetClipboardData的参数顺序错误,应该是格式在前,数据句柄在后,而当前代码中可能将Data作为格式,Handle作为数据句柄,这显然不正确。
3. 在从文件读取到剪贴板的过程中,没有指定正确的剪贴板格式,导致剪贴板无法识别数据。
4. 保存剪贴板数据时,未正确遍历或选择剪贴板格式,导致无法正确保存所需数据。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Clipbrd;
type
TForm1 = class(TForm)
保存到文件: TButton;
从文件读取到剪贴板: TButton;
procedure 保存到文件Click(Sender: TObject);
procedure 从文件读取到剪贴板Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// 从文件读取数据到剪贴板
procedure TForm1.从文件读取到剪贴板Click(Sender: TObject);
var
MemoryStream: TMemoryStream;
Data: HGLOBAL;
DataPtr: Pointer;
begin
if FileExists('clipboard_data.bin') then
begin
MemoryStream := TMemoryStream.Create;
try
MemoryStream.LoadFromFile('clipboard_data.bin');
// 分配全局内存
Data := GlobalAlloc(GMEM_MOVEABLE, MemoryStream.Size);
try
DataPtr := GlobalLock(Data);
try
Move(MemoryStream.Memory^, DataPtr^, MemoryStream.Size);
finally
GlobalUnlock(Data);
end;
// 设置剪贴板数据
Clipboard.Open;
try
Clipboard.Clear;
SetClipboardData(CF_TEXT, Data); // 修复参数顺序和格式
finally
Clipboard.Close;
end;
except
GlobalFree(Data);
raise;
end;
ShowMessage('文件内容已加载到剪贴板!');
finally
MemoryStream.Free;
end;
end
else
ShowMessage('文件不存在,请先保存剪贴板内容!');
end;
// 保存剪贴板内容到文件
procedure TForm1.保存到文件Click(Sender: TObject);
var
MemoryStream: TMemoryStream;
begin
if Clipboard.HasFormat(CF_TEXT) then // 明确检查文本格式
begin
MemoryStream := TMemoryStream.Create;
try
Clipboard.GetFormat(CF_TEXT, MemoryStream); // 正确获取文本数据
MemoryStream.SaveToFile('clipboard_data.bin');
ShowMessage('剪贴板内容已保存到文件!');
finally
MemoryStream.Free;
end;
end
else
ShowMessage('剪贴板中没有文本数据!');
end;
end.
保存剪贴板数据 (保存到文件Click):
使用 HasFormat(CF_TEXT) 明确检查文本格式
通过 GetFormat(CF_TEXT, MemoryStream) 正确获取剪贴板文本数据
恢复剪贴板数据 (从文件读取到剪贴板Click):
修正 SetClipboardData 参数顺序为 (CF_TEXT, Data)
优化全局内存分配和异常处理逻辑
|
|