【问题标题】:Loading long strings at runtime and design-time在运行时和设计时加载长字符串
【发布时间】:2021-11-24 01:22:35
【问题描述】:

我想为我经常使用的 SVG 形状定义 TPath 类的后代,以便在调色板上注册它们,而不必在对象检查器中粘贴长 SVG 路径字符串。

这还有一个好处,就是能够通过在某处更改单个字符串来影响我所有 TSVGxxx 类型的对象,而无需逐个运行并编辑它们。

第一步已经完成:

TSVGsomeshape = class (TPath)

在加载中:

Data.Data := 'an SVG path';

问题: 当这条路径变得太长时,Delphi 的字符串文字限制迫使我将其分解并连接它的位。我想避免。

想到资源。想法:将所有 SVG 路径放入某个 RC 文件(按原样简单粘贴路径,没有连接麻烦),然后编译并生成一个 RES 文件。

但是,当路径作为资源加载时,在设计时删除 TSVGxxx 时,我无法查看这些路径,这有点违背了目的。

我是不是把事情复杂化了,有没有更简单的方法来解决所有这些问题?

编辑 1:

在 VCL 中,使用资源的主要方式是添加 {$R} rc 或 res 文件(我还是更喜欢使用 RC 并且每次都编译它,并忽略版本控制生成的 res)。

我会为此考虑一个单一的资源文件“svg.rc / res”,其中包含多个纯文本条目,仅描述每个 SVG 的路径部分。

LoadFromStream 将资源放入一个字符串列表,并将其提供给“Data”属性,非常简单。

诚然,我不记得在设计时曾在控件中这样做过。这是使用资源方法遇到的第一个困难:获取“资源未找到”。

在设计时这样做通常可行吗?

我认为第二个困难与 FMX 更相关,因为添加资源的方法很多(部署菜单、资源和图像菜单、标准 {$R} 方法)。所有这些也产生了在运行时找不到的资源。

我使用部署菜单来加载自定义字体,而不是多键 rc 文件。 这怎么可能?

谢谢

PS:我还查看了 SKIA4Delphi,虽然很棒,但对于我感兴趣的简单 SVG 路径(以及 Google 依赖项)来说可能有点矫枉过正

标签注意事项:虽然问题确实提到了 SVG 和 TPath,但问题的核心与它们都不相关,因此省略了 SVG 和 FMX 标签。

【问题讨论】:

  • 这不是String 的限制,而是limitation of literals - 这是两件事,一旦你能把它们区分开来,你就会明白为什么限制(2 GiB 与 255)差别如此之大。只需重新考虑您的个人品味(“我想避免”)是否具有适当的优先级。
  • 编辑了答案以澄清“文字”。
  • 您可以称其为“个人品味”,但连接 10-15 行字符串很麻烦,而且到目前为止还不是一个优雅的解决方案。因此为什么有些语言支持多行字符串。由于 Delphi 不提供这些,所以这个问题的重点是找到另一种方法来避免这种连接。
  • 资源是一种非常合理的方式来做到这一点。是什么阻止了你?
  • 大卫,在问题正文中添加了一个编辑,其中包含我尝试使用资源的更多详细信息以及遇到的困难

标签: delphi embedded-resource


【解决方案1】:

它最终按照上面的 cmets 解决了。

  • 将 res 文件放在包的目录中(以前在搜索路径中)。
  • 使用{$R myres.res}指向res文件
  • 将资源字符串加载为 RC_DATA,不确定我是否应该改用纯文本(资源编辑器在使用字符串表时将命名限制为数字)
function TSVGPlus.LoadSVGpath: string;
var RS: TResourceStream;
    SL: TSTringList;
begin
  RS := TResourceStream.Create(FindClassHInstance(Self.ClassType), 'PLUS', RT_RCDATA);
  SL := TStringList.Create;
  try
    SL.LoadFromStream(RS);
    Result := SL.Text;
  finally
    SL.Free;
    RS.Free;
  end;
end;
  • 重建包,加号显示在设计时
  • 无需额外部署即可在运行时显示加号,无论是在 Windows 上还是在 Android 上

【讨论】:

  • 在组件内部,您不应该使用全局HInstance。请改用FindClassHInstance(Self.ClassType)
  • 感谢一直有帮助的 cmets。已编辑答案以反映您的更正。
猜你喜欢
  • 1970-01-01
  • 2015-03-13
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 2010-10-04
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多