如何从 Firemonkey 中的文件加载自定义光标以用于 Mac 应用程序?
How to load a custom cursor from file in Firemonkey to be used on a Mac app?
我想从文件(或任何其他方式)加载自定义光标以用于我的 FireMonkey 应用程序。我知道我想按照 here 所述使用 IFMXCursorService 并编写我自己的 class 来实现 IFMXCursorService 接口:SetCursor/GetCursor。问题是我想为 Mac 构建应用程序,所以我不能像我发现的所有示例(LoadCursorFromFile 等)那样使用对 Windows API 的任何调用。所以:
1) 有没有办法不使用 Windows API 从文件加载游标?
2) 如果有办法:实现可以 "adjusted" 使用编译器指令在同一个单元上实现 Windows 和 Mac 所以我可以分别为 Windows 和 Mac 构建应用程序 ?
PS:我正在使用 Delphi 10.2.3(东京)
1) 在 macOS 上?绝对:
function LoadNSImage(const AFileName: string): NSImage;
var
LStream: TMemoryStream;
LData: NSData;
begin
LStream := TMemoryStream.Create;
try
LStream.LoadFromFile(AFileName);
LData := TNSData.Wrap(TNSData.OCClass.dataWithBytes(LStream.Memory, LStream.size));
Result := TNSImage.Wrap(TNSImage.Create.initWithData(Data));
finally
LStream.Free;
end;
end;
在调用 initWithImage 的 NSCursor 中使用生成的 NSImage:
https://developer.apple.com/documentation/appkit/nscursor/1524612-initwithimage?language=objc
2) 除了使用确定编译哪些代码的指令之外,没有其他方法可以支持多个平台。在这种情况下,您需要为每个实现 IFMXCursorService 的平台提供 class,并且您需要为需要使用的平台提供 "override" Delphi 的默认实现通过调用 TPlatformServices.Current.RemovePlatformService 删除现有实现和相应的 AddPlatformService 方法来添加您自己的实现。
这里不打算详细介绍 1) 或 2);在做一些研究并先自己尝试之后,你真的应该为你遇到的每个问题写单独的问题。
我想从文件(或任何其他方式)加载自定义光标以用于我的 FireMonkey 应用程序。我知道我想按照 here 所述使用 IFMXCursorService 并编写我自己的 class 来实现 IFMXCursorService 接口:SetCursor/GetCursor。问题是我想为 Mac 构建应用程序,所以我不能像我发现的所有示例(LoadCursorFromFile 等)那样使用对 Windows API 的任何调用。所以:
1) 有没有办法不使用 Windows API 从文件加载游标?
2) 如果有办法:实现可以 "adjusted" 使用编译器指令在同一个单元上实现 Windows 和 Mac 所以我可以分别为 Windows 和 Mac 构建应用程序 ?
PS:我正在使用 Delphi 10.2.3(东京)
1) 在 macOS 上?绝对:
function LoadNSImage(const AFileName: string): NSImage;
var
LStream: TMemoryStream;
LData: NSData;
begin
LStream := TMemoryStream.Create;
try
LStream.LoadFromFile(AFileName);
LData := TNSData.Wrap(TNSData.OCClass.dataWithBytes(LStream.Memory, LStream.size));
Result := TNSImage.Wrap(TNSImage.Create.initWithData(Data));
finally
LStream.Free;
end;
end;
在调用 initWithImage 的 NSCursor 中使用生成的 NSImage:
https://developer.apple.com/documentation/appkit/nscursor/1524612-initwithimage?language=objc
2) 除了使用确定编译哪些代码的指令之外,没有其他方法可以支持多个平台。在这种情况下,您需要为每个实现 IFMXCursorService 的平台提供 class,并且您需要为需要使用的平台提供 "override" Delphi 的默认实现通过调用 TPlatformServices.Current.RemovePlatformService 删除现有实现和相应的 AddPlatformService 方法来添加您自己的实现。
这里不打算详细介绍 1) 或 2);在做一些研究并先自己尝试之后,你真的应该为你遇到的每个问题写单独的问题。