【发布时间】: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 不提供这些,所以这个问题的重点是找到另一种方法来避免这种连接。
-
资源是一种非常合理的方式来做到这一点。是什么阻止了你?
-
大卫,在问题正文中添加了一个编辑,其中包含我尝试使用资源的更多详细信息以及遇到的困难