3

我有多个指针,它们的每个名称都是这样构建的'str'+'name'。因此,假设指针 1 的名称为strpointer1,指针 2 的名称strpointer2以此类推;

我将所有这些名称存储在某个地方,并且在某个时刻,我会将指针 1 的名称保存在一个字符串变量中,此时我需要对该指针执行一些操作。

当我只有一个字符串中的他的名字时,如何使用该指针?

更好的解释(我希望):

我试图使用 devexpress 套件的本地化组件来翻译从 sql 表中生成的菜单;

例如:对于菜单的“文件”组件的标题,您在本地化程序中声明其他语言的翻译,您将获得指向这些翻译的指针(由我命名为“filecap”)。

当我在设计时绘制菜单时,我会像这样分配 File.caption:

File.caption := cxgetresourcestring(@filecap);

函数 cxgetresourcestring(apointer):string;

但我正在动态地绘制菜单:我正在从 TTable 中读取我的菜单项,然后我将它们存储在一个动态数组中。所以这就是我所说的那一刻,通常我会这样做:

MenuItems_Array[i].caption := tbl_menu.fieldbyname('MenuItemName').asstring;

但现在我想使用定位器我试过这个:

MenuItems_Array[i].caption := cxgetresourcestring(tbl_menu.fieldbyname('MenuItemName').asstring);

这当然会返回一个错误:指针类型和字符串不匹配;

4

2 回答 2

1

( cxGetResourceStringand cxSetResourceString) 函数旨在获取(和设置)现成的 DevExpress 组件的翻译。

我不是 100% 确定,但我认为它只设计用于对资源字符串变量进行操作:http: //docwiki.embarcadero.com/RADStudio/en/Resource_Strings

我认为这根本不是你想要的。你想要gettext()DevExpress 不提供的 C 语言。

一些解决方案的列表:

http://delphi.about.com/od/toppicks/tp/aatplocalize.htm

Delphi IDE 还内置了对翻译的支持:

http://docwiki.embarcadero.com/RADStudio/en/Localizing_Applications_by_Using_Translation_Manager_Index

于 2012-08-29T14:54:34.730 回答
0

据我所知,没有办法枚举一个单元的资源字符串。如果可以,解决方案会容易得多。

如果您愿意维护所有字符串资源的寄存器,您仍然可以完成您想做的事情。但这需要手动完成。

我希望以下方法可行

var
  slResources : TStringList;
procedure RegisterResString(ResId : String; Address : Pointer);
begin
  slResources.AddObject(ResId, TObject(Address));
end;

function GetResourceAddress(ResId : string) : Pointer;
var idx : Integer;
begin
  if slREsources.Find(ResId, idx) then 
    Result := slResources.Objects[idx]
  else
    Result := nil;
end;

然后你需要注册你的字符串资源。

resourcestring
  Filecap = 'File';

procedure RegisterUnitRes;
begin
  RegisterResString('Filecap', @Filecap);
end;

然后你可以打电话:

MenuItems_Array[i].caption := cxgetresourcestring(GetResourceAddress(tbl_menu.fieldbyname('MenuItemName').asstring));

不过,可能有更简单的方法来实现这一点。

于 2012-08-30T17:10:14.877 回答