吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 678|回复: 4
收起左侧

[讨论] 这里不对,该如何修改?

  [复制链接]
冥界3大法王 发表于 2025-2-17 00:01
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(Data,Handle); // 使用 Windows API 设置二进制数据
        finally
          Clipboard.Close;
        end;
      except
        GlobalFree(Data);
        raise;
      end;

      ShowMessage('文件内容已加载到剪贴板!');
    finally
      MemoryStream.Free;
    end;
  end
  else
  begin
    ShowMessage('文件不存在,请先保存剪贴板内容!');
  end;
end;


// 保存剪贴板内容到文件
procedure TForm1.保存到文件Click(Sender: TObject);
var
  ClipboardFormat: Word;
  MemoryStream: TMemoryStream;
begin
  // 检查剪贴板中是否有数据
  if Clipboard.FormatCount > 0 then
  begin
    // 获取剪贴板中的二进制数据
    MemoryStream := TMemoryStream.Create;
    try
      // 遍历剪贴板中的所有格式
      begin
        // 获取指定格式的数据
        MemoryStream.Clear;
//        Clipboard.GetFormat(ClipboardFormat, MemoryStream);  =====>这里不对

        // 将数据保存到文件
        MemoryStream.SaveToFile('clipboard_data.bin');
        ShowMessage('剪贴板内容已保存到文件!');
      end;
    finally
      MemoryStream.Free;
    end;
  end
  else
  begin
    ShowMessage('剪贴板中没有数据!');
  end;
end;

end.

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

qq499414099 发表于 2025-2-17 00:45
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)

优化全局内存分配和异常处理逻辑

 楼主| 冥界3大法王 发表于 2025-2-17 08:30
qq499414099 发表于 2025-2-17 00:45
1. 在保存到文件的过程中,Clipboard.GetFormat没有被正确调用,ClipboardFormat变量未初始化,导致无法获 ...

Clipboard.GetFormat(CF_TEXT, MemoryStream);
// 正确获取文本数据

一点也不正确!
今生今世 发表于 2025-2-17 13:06
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  MyInt: Integer;
  MyStr: string;
begin
  MyInt := 123;
  // 使用SysUtils单元的IntToStr函数
  MyStr := IntToStr(MyInt);
  ShowMessage(MyStr);
end;

end.

免费评分

参与人数 1吾爱币 -3 收起 理由
苏紫方璇 -3 答非所问

查看全部评分

 楼主| 冥界3大法王 发表于 2025-2-17 15:53

这都什么垃圾,与剪贴板有关系吗?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-5-26 00:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表