如何从Firemonkey中的文件加载自定义光标以在Mac应用程序上使用?

时间:2018-12-10 15:31:16

标签: delphi firemonkey

我想从文件(或任何其他方式)中加载自定义光标,以在FireMonkey应用程序上使用。我知道我想按照here的说明使用IFMXCursorService并编写自己的实现IFMXCursorService接口的类:SetCursor / GetCursor。问题是我想为Mac构建该应用程序,因此无法像我发现的所有示例(LoadCursorFromFile等)一样使用对Windows API的任何调用。因此:

1)有没有一种方法可以在不使用Windows API的情况下从文件中加载光标?

2)如果可以:可以使用编译器指令“调整”实施,以使Windows和Mac实施在同一单元上,以便我可以分别为Windows和Mac构建该应用

PS:我正在使用Delphi 10.2.3(东京)

1 个答案:

答案 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)进行更详细的介绍;在进行了一些研究并首先自己尝试之后,您应该为遇到的每个问题分别写一个单独的问题。

相关问题