使用指针和资源字符串

Sil*_*ver 1 delphi freepascal lazarus

我试图显示附加到Resourcestring的常量数组的内容; 但它无法正常工作(Showmessage应显示'Primavera'),但是当您完成应用程序时,您会收到一条空白消息和异常.例如,示例代码在Lazurus中运行良好.我错过了什么....

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
 CEstacion: Array [1..4] of ^String = (@RS1,@RS2,@RS3,@RS4);

var Form1: TForm1;

implementation
$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 ShowMessage (CEstacion[1]^);
end;

end.
Run Code Online (Sandbox Code Playgroud)

Ste*_*nke 5

如果在const数组中使用resourcestrings,则在单元初始化期间初始化数组的值.此时,它们正从二进制文件的资源加载.它们为空的原因只能意味着您有一些翻译资源,而您尚未翻译这些资源字符串.

以这种方式使用资源字符串也意味着您不仅可以在运行时更改语言并更改值(除非您明确重新初始化数组,但这需要一些明确的低级代码 - 请参阅System._InitResStrings)

另一种方法是使用PResStringRec数组,如下所示:

const
  CEstacion: array [1..4] of PResStringRec = (@RS1,@RS2,@RS3,@RS4);
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它(当使用资源字符串时,编译器通常会为您调用LoadResString)

ShowMessage(LoadResString(CEstacion[1]));
Run Code Online (Sandbox Code Playgroud)

我们作为语言扩展所需要的是能够声明array of resourcestring编译器将转换为哪个数组PResStringRec并插入LoadResString调用,就像正常的资源字符串一样.