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
相关产品推荐
相关产品推荐

