You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:06:00