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

Delphi中指针访问Resourcestring数组异常问题求助

问题分析与解决方案

你的问题核心在于Delphi和Lazarus对resourcestring的底层实现机制完全不同,导致你用^String指针指向资源字符串的写法在Delphi里失效,还触发内存访问异常。

为什么在Lazarus里正常,Delphi里不行?

在Lazarus/FPC中,resourcestring本质上就是普通的string变量,所以你用@RS1取的是字符串变量的内存地址,用^String去访问是有效的。但在Delphi里,resourcestring并不是直接的字符串对象:

  • Delphi编译时会把resourcestring编译成资源字符串记录(PResStringRec),而不是string类型的变量。
  • 你用@RS1拿到的其实是PResStringRec类型的指针,不是^String指针,强行用^String去解引用,自然会读取到错误的内存数据(所以ShowMessage显示空白),程序退出时还会因为内存访问越界触发异常。

正确的实现方式(Delphi兼容)

下面给你两种可行的方案,既能保留resourcestring的本地化能力,又能正常访问:

方案1:使用PResStringRec指针数组 + LoadResString

直接用正确的指针类型指向资源字符串记录,然后通过Delphi提供的LoadResString函数加载实际字符串:

unit U_Translate;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;

Resourcestring
RS1 = 'Primavera';
RS2 = 'Verano';
RS3 = 'Otoño';
RS4 = 'Invierno';

Const
// 用PResStringRec代替^String,这是Delphi中resourcestring的正确指针类型
CEstacion: Array [1..4] of PResStringRec = (@RS1,@RS2,@RS3,@RS4);

var
Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
// 通过LoadResString加载资源字符串
ShowMessage(LoadResString(CEstacion[1]));
end;
end.

方案2:直接使用字符串常量数组(如果不需要本地化)

如果你不需要利用resourcestring的多语言资源切换能力,也可以直接定义字符串数组:

Const
CEstacion: Array [1..4] of string = (RS1, RS2, RS3, RS4);

这种写法在Delphi和Lazarus里都能正常工作,直接用CEstacion[1]就能获取字符串,不需要解引用。

额外说明

resourcestring的优势在于可以通过资源文件替换实现多语言切换,如果你需要这个功能,优先选择方案1;如果只是固定字符串,方案2更简洁。

内容的提问来源于stack exchange,提问作者Silver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:17:52