在设计时加载资源?

Loading resources at design time?

是否可以在设计时加载资源? 我正在制作一个速度按钮组件,我想在按钮大小发生变化时自动从资源中加载新图像。它在 运行 时已经正常工作,但在设计时,在我设置资源名称 属性 后,它没有显示任何图标。 如果不可能的话,我可以绘制一个默认的矩形来代替图标,但在设计时也能显示我的图标会很好。

function TPngSpeedButton.LoadIcon(ResName: String): Boolean;
var hI: HICON;
    Ico: TIcon;
    ISize: Integer;
    Png: TPngImage;
begin
 Result:= False;
 if ResName = '' then Exit;
 ISize:= Height - 7 - Round(Height * 0.15);
 Png:= TPngImage.Create; Ico:= TIcon.Create;
 try
  if LoadIconWithScaleDown(HInstance, PChar(ResName), ISize, ISize, hI) = S_OK then begin
   Ico.Handle:= hI;
   ConvertToPng(Ico, Png);
   SetPngImage(Png);
   Result:= True;
  end;
 finally
  Png.Free; Ico.Free;
 end;
end;

您无法在设计时从您的应用程序资源加载图标,因为那时应用程序可执行文件甚至不存在,因为您还没有编译它。

现在,您可以做的是创建一个基于资源的动态 link 库(资源 DLL),您可以单独编译它。这样,您甚至可以在设计时访问 DLL 资源,类似于 Delphi IDE 已经访问某些系统资源的方式。

如果您不想处理额外的 DLL,请将您的图标放入一个或多个 ImageList,因为来自 ImageList 的图像在 运行 时和设计时都可用。