You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Delphi FireMonkey中调用MacOS PMGetPageFormatPaper遇访问错误求助

在MacOS下用Delphi FireMonkey获取纸张选择时的访问错误问题

我想在MacOS平台下,使用Delphi FireMonkey在运行时获取(最终实现设置)纸张选择。我把自认为正确的变量和函数替换到之前成功获取纸张矩形、页面矩形及方向的例程中,但这段代码在释放FPrintInfo时出现访问错误。

代码如下:

function getPaperName: string;
var
  FPrintInfo: NSPrintInfo;
  paper: integer;
begin
  result:='';
  FPrintInfo := TNSPrintInfo.Wrap(TNSPrintInfo.OCClass.sharedPrintInfo);
  FPrintInfo.retain;
  PMGetPageFormatPaper(FPrintInfo.PMPageFormat, @paper);
  FPrintInfo.release;
  result:=IntToStr(paper);
end;

苹果文档中PMGetPageFormatPaper函数定义如下:

func PMGetPageFormatPaper(
    _ format: PMPageFormat,
    _ paper: UnsafeMutablePointer<PMPaper?>
) -> OSStatus

我注意到指针变量PMPaper?带有问号,而我之前成功使用的函数对应的变量没有问号,这应该很重要,但不清楚具体含义。


问题解决方法

  1. 移除不必要的retain/release调用
    TNSPrintInfo.OCClass.sharedPrintInfo返回的是系统维护的单例对象,由系统负责内存管理,手动调用retain和release会破坏内存管理规则,直接导致访问错误,这是核心问题。

  2. 修正参数类型匹配问题
    苹果文档里的UnsafeMutablePointer<PMPaper?>表示该指针指向的是可选PMPaper类型(Swift中的?代表变量可能为nil),你用integer作为接收变量类型完全不匹配,应该使用PMPaper类型,并初始化为nil。

  3. 添加调用状态检查
    调用PMGetPageFormatPaper后需要检查返回的OSStatus,确认是否调用成功。

修正后的代码:

function GetPaperIdentifier: string;
var
  FPrintInfo: NSPrintInfo;
  Paper: PMPaper;
  Status: OSStatus;
begin
  Result := '';
  FPrintInfo := TNSPrintInfo.Wrap(TNSPrintInfo.OCClass.sharedPrintInfo);
  Paper := nil;
  Status := PMGetPageFormatPaper(FPrintInfo.PMPageFormat, @Paper);
  
  if Status = noErr then
  begin
    // 若需要获取纸张名称,可调用PMGetPaperName函数
    // 示例返回Paper的指针地址,实际按需处理
    Result := IntToStr(Integer(Paper));
  end;
end;
  1. 关于PMPaper?的说明
    Swift中的?是可选类型标记,说明该参数对应的变量可能没有有效值(即nil)。在Delphi中只需将PMPaper变量初始化为nil,调用函数后通过返回状态判断是否获取到有效对象即可。

内容的提问来源于stack exchange,提问作者user2580203

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 05:18:18