我想从文件(或任何其他方式)中加载自定义光标,以在FireMonkey应用程序上使用。我知道我想按照here的说明使用IFMXCursorService并编写自己的实现IFMXCursorService接口的类:SetCursor / GetCursor。问题是我想为Mac构建该应用程序,因此无法像我发现的所有示例(LoadCursorFromFile等)一样使用对Windows API的任何调用。因此:
1)有没有一种方法可以在不使用Windows API的情况下从文件中加载光标?
2)如果可以:可以使用编译器指令“调整”实施,以使Windows和Mac实施在同一单元上,以便我可以分别为Windows和Mac构建该应用?
PS:我正在使用Delphi 10.2.3(东京)
答案 0 :(得分:1)
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的平台都有一个类,并且需要“覆盖” Delphi的默认实现,以用于需要调用TPlatformServices.Current.RemovePlatformService来删除自己的平台的平台。现有实现以及相应的AddPlatformService方法来添加您自己的实现。
这里不打算对1)或2)进行更详细的介绍;在进行了一些研究并首先自己尝试之后,您应该为遇到的每个问题分别写一个单独的问题。