【问题标题】:Loading resources at design time?在设计时加载资源?
【发布时间】:2022-01-12 16:44:51
【问题描述】:

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

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;

【问题讨论】:

  • 有趣的部分是处理按钮大小调整的代码。
  • 哦,资源是否包含在包含该组件的包中?
  • LoadIconWithScaleDown 这是一个标准的 windows api。该资源不能包含在包中,因为我在表单上放置的每个按钮的图标都会不同...
  • 那么,如果图像在设计期间甚至不可用,您希望如何显示?
  • 您的应用程序在设计时不存在,因此无法从该不存在的应用程序访问资源。

标签: resources vcl delphi-10.3-rio


【解决方案1】:

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

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

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

【讨论】:

  • 更好的方法是使用图像列表作为图标。这些可以在运行时和设计时使用。多年来,这种方法已被证明运行良好。
  • @UweRaabe 我同意你的观点,但不知何故,我相信图标并不是 OP 试图从资源中加载的唯一东西
猜你喜欢
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多