• 使用剪切板[5]: SetAsHandle、GetAsHandle 自定义格式


    如果要在剪切板中存放自己的格式, 需要用到 SetAsHandle、GetAsHandle 两个方法.

    SetAsHandle(用于剪切板的格式ID, 数据的内存句柄); 看这个方法的两个参数都有点麻烦.
    自定义剪切板格式要用 RegisterClipboardFormat 函数; 第二个参数是内存句柄而不是内存地址, 能分配内存并返回句柄的函数暂时我只知道 GlobalAlloc、GlobalReAlloc 两个函数, 使用它们分配用于剪切板的内存时还须使用 GMEM_DDESHARE 标志.

    GetAsHandle(用于剪切板的格式ID) 方法返回的是数据所在内存的句柄.

    通过内存句柄获取获取内存地址, 还要用到 GlobalLock 函数.

    本例自定义了结构 TMyRec, 并指定了对应的剪切板格式 CF_MY.
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    uses Clipbrd;
    
    Type
      TMyRec = record
        name: string[8];
        age : Byte;
      end;
    
    var
      CF_MY: Word;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      CF_MY := RegisterClipboardFormat('My Format');
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      PRec: ^TMyRec;
      Data: THandle;
    begin
      Data := GlobalAlloc(GMEM_DDESHARE, SizeOf(TMyRec));
      PRec := GlobalLock(Data);
    
      PRec.name := '张三';
      PRec.age  := 99;
    
      GlobalUnlock(Data);
      Clipboard.SetAsHandle(CF_MY, Data);
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    var
      PRec: ^TMyRec;
      Data: THandle;
    begin
      if not Clipboard.HasFormat(CF_MY) then Exit;
      Data := Clipboard.GetAsHandle(CF_MY);
      PRec := GlobalLock(Data);
    
      ShowMessageFmt('%s %d 岁', [PRec.name, PRec.age]); {张三 99 岁}
      GlobalUnlock(Data);
    end;
    
    end.
    
    //这个例子忘了 GlobalFree 了.
  • 相关阅读:
    数据结构之二叉树解析
    并发出体验 -- 解决小规模并发下单的问题
    JDBC事务控制
    数据库中悲观锁与乐观锁的总结实践
    浅析实际项目中对数据库设计的一些思考
    Java中实现多线程的四种方式
    将本地文件上传至github
    git/github 生成密钥
    git常用命令
    解决git每次提交推送都要输入密码
  • 原文地址:https://www.cnblogs.com/del/p/1137835.html
Copyright © 2020-2023  润新知