使用指针和资源字符串
Using pointers and resourcestring
我正在尝试显示附加到 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.
如果您在 const 数组中使用资源字符串,则数组的值将在单元初始化期间被初始化。那时他们正在从二进制文件的资源中加载。它们为空的原因只能表示您有一些翻译资源,但您尚未翻译这些资源字符串。
以这种方式使用资源字符串还意味着您不能仅在运行时更改语言并更改值(除非您显式重新初始化数组,但这需要相当多的显式低级代码 - 请参阅 System._InitResStrings
)
另一种方法是像这样使用 PResStringRec 数组:
const
CEstacion: array [1..4] of PResStringRec = (@RS1,@RS2,@RS3,@RS4);
然后像这样调用它(当使用资源字符串时,编译器通常会为您插入对 LoadResString 的调用)
ShowMessage(LoadResString(CEstacion[1]));
作为语言扩展,我们需要的是能够声明 array of resourcestring
,编译器会将其转换为 PResStringRec
的数组并插入 LoadResString
调用,就像 for正常资源字符串。
也许在FreePascal/Lazarus中需要使用指针,但在Delphi中没有必要:
resourcestring
RS1 = 'Primavera';
RS2 = 'Verano';
RS3 = 'Otoño';
RS4 = 'Invierno';
const
CEstacion: array[1..4] of string = (RS1, RS2, RS3, RS4);
...
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage(CEstacion[1]);
end;
效果很好。现在,一旦应用程序为 运行,数组将不会被修改,但当应用程序不是 运行 时,它可以本地化为其他语言,并且将使用不同的名称。使用常用工具。
我正在尝试显示附加到 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.
如果您在 const 数组中使用资源字符串,则数组的值将在单元初始化期间被初始化。那时他们正在从二进制文件的资源中加载。它们为空的原因只能表示您有一些翻译资源,但您尚未翻译这些资源字符串。
以这种方式使用资源字符串还意味着您不能仅在运行时更改语言并更改值(除非您显式重新初始化数组,但这需要相当多的显式低级代码 - 请参阅 System._InitResStrings
)
另一种方法是像这样使用 PResStringRec 数组:
const
CEstacion: array [1..4] of PResStringRec = (@RS1,@RS2,@RS3,@RS4);
然后像这样调用它(当使用资源字符串时,编译器通常会为您插入对 LoadResString 的调用)
ShowMessage(LoadResString(CEstacion[1]));
作为语言扩展,我们需要的是能够声明 array of resourcestring
,编译器会将其转换为 PResStringRec
的数组并插入 LoadResString
调用,就像 for正常资源字符串。
也许在FreePascal/Lazarus中需要使用指针,但在Delphi中没有必要:
resourcestring
RS1 = 'Primavera';
RS2 = 'Verano';
RS3 = 'Otoño';
RS4 = 'Invierno';
const
CEstacion: array[1..4] of string = (RS1, RS2, RS3, RS4);
...
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage(CEstacion[1]);
end;
效果很好。现在,一旦应用程序为 运行,数组将不会被修改,但当应用程序不是 运行 时,它可以本地化为其他语言,并且将使用不同的名称。使用常用工具。