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

Delphi 12.2中RequestPermissions调用的类型匹配问题求助

Delphi 12.2 RequestPermissions 类型匹配问题解决方案

针对你遇到的编译器类型不兼容问题,这里提供几种可行的解决方法:

方法1:显式类型转换

利用TClassicPermissionStatusDynArray本质是TArray<string>别名的特性,在调用IsEveryPermissionGranted时显式转换类型,就能绕过编译器的识别问题:

{RequestPermission}
procedure (const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray)
begin
  if PermissionsService.IsEveryPermissionGranted(TArray<string>(AGrantResults)) then
    ThenDo;
end,

方法2:手动实现权限检查逻辑

直接遍历权限结果数组,逐个判断是否为授权状态,无需依赖系统方法:

{RequestPermission}
procedure (const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray)
var
  Status: string;
begin
  for Status in AGrantResults do
  begin
    if Status <> PermissionsService.Granted then
      Exit;
  end;
  ThenDo;
end,

方法3:自定义兼容型检查方法

自己封装一个支持TClassicPermissionStatusDynArray的权限检查方法,后续可以直接复用:

// 先在合适的位置定义辅助方法
function IsAllPermissionsGranted(const AGrantResults: TClassicPermissionStatusDynArray): Boolean;
var
  Status: string;
begin
  Result := True;
  for Status in AGrantResults do
  begin
    if Status <> PermissionsService.Granted then
    begin
      Result := False;
      Break;
    end;
  end;
end;

// 回调中调用自定义方法
{RequestPermission}
procedure (const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray)
begin
  if IsAllPermissionsGranted(AGrantResults) then
    ThenDo;
end,

问题根源说明

Delphi 12.2的RTL中,TClassicPermissionStatusDynArray确实是TArray<string>的类型别名,但编译器在处理匿名方法的参数匹配时,没有正确识别二者的等价关系,导致出现类型不兼容的编译错误。上述方法都能有效绕过这个版本兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:01:12