Delphi运行及设计时加载长字符串 自定义TPath控件规避字符串字面量限制
最简实现方案
优先推荐用独立常量单元+多行字符串的方案,完全规避字符串拼接问题,也没有资源方案的设计时兼容问题:
- Delphi 10.3及以上版本支持三单引号包裹的多行字符串字面量,无长度限制,可直接粘贴原始SVG路径,无需任何拼接处理:
// 单独的SVG路径常量单元,全局修改仅需改此处 unit SVGShapeConsts; interface const SVG_SOME_SHAPE = '''
M150 0 L75 200 L225 200 Z
// 你可以直接粘贴任意长度的原始SVG路径,支持换行,无需拆分
''';
// 其余SVG路径常量依次定义
implementation
end.
- 在你的自定义路径控件的`Loaded`方法中直接引用常量赋值即可: ```delphi uses SVGShapeConsts; procedure TSVGSomeShape.Loaded; begin inherited; Data.Data := SVG_SOME_SHAPE; end;
- 该方案同时兼容VCL/FMX、设计时/运行时,无需处理资源加载逻辑,也不需要额外的编译配置。
- 若使用低于10.3的Delphi版本,可写一个简单的本地脚本,批量读取所有原始SVG路径文件,自动生成包含拼接后字符串常量的Delphi单元,无需手动拆分字符串。
资源方案问题修复
如果你坚持使用资源方案,两个问题的解决方法如下:
1. VCL设计时资源找不到的问题
设计时资源加载完全可行,报错的原因是资源加载时的实例句柄错误:
- 你自定义的控件编译在BPL包中,SVG资源也绑定在这个BPL文件里,而设计时的宿主进程是Delphi IDE本身,直接使用默认的
HInstance或0作为加载句柄时,会在IDE的EXE文件中找资源,自然找不到。 - 正确写法是使用控件所在包的模块句柄加载资源:
function GetResourceStream(const ResName: string): TStream; var ResHandle: HRSRC; GlobalHandle: HGLOBAL; begin // 第一个参数传入控件单元所属BPL的HInstance,直接用当前单元的HInstance变量即可 ResHandle := FindResource(HInstance, PChar(ResName), RT_RCDATA); if ResHandle = 0 then RaiseLastOSError; GlobalHandle := LoadResource(HInstance, ResHandle); if GlobalHandle = 0 then RaiseLastOSError; Result := TMemoryStream.Create; Result.WriteBuffer(Pointer(LockResource(GlobalHandle))^, SizeofResource(HInstance, ResHandle)); Result.Position := 0; end;
2. FMX资源找不到的问题
- 如果你仅开发Windows平台的FMX程序,用法和上述VCL方案完全一致,使用Win32 API加载资源即可,不要用FMX封装的资源加载接口,避免路径解析错误。
- 如果你需要跨平台开发,RC格式资源是Windows专属,无法在非Windows平台使用,建议放弃资源方案,改用前述的常量单元方案,或者将每个SVG路径存为单独的文本文件,在部署菜单中将文件添加到应用的资源目录,运行时通过
TFile.ReadAllText读取内容。
内容的提问来源于stack exchange,提问作者Khorkhe
相关产品推荐
相关产品推荐

