我有多个指针,他们的每个名字都是这样构建的'str'+'name'
。因此,假设指针1的名称为strpointer1
,指针2的名称为strpointer2
,依此类推;
我将所有这些名称存储在某个地方,并且在某个时刻,我将在字符串变量中使用指针1的名称,我将需要在该点处对该指针执行某些操作。
如果我拥有的只是一个字符串中的名字,我该如何使用该指针?
更好的解释(我希望):
我试图使用devexpress套件的本地化程序组件来翻译sql表中的dinamically生成的菜单;
例如:对于菜单的“文件”组件的标题,您在本地化程序中声明了其他语言的翻译,您将获得指向这些翻译的指针(由我'filecap'命名)。
当我在设计时绘制菜单时,我会像这样分配File.caption:
File.caption := cxgetresourcestring(@filecap);
function cxgetresourcestring(apointer):string;
但是我正在绘制菜单:我正在从TTable中读取菜单项,之后我将它们存储在动态数组中。所以这就是我谈论的那一刻,通常我会这样做:
MenuItems_Array[i].caption := tbl_menu.fieldbyname('MenuItemName').asstring;
但现在我想使用本地化程序我试过这个:
MenuItems_Array[i].caption := cxgetresourcestring(tbl_menu.fieldbyname('MenuItemName').asstring);
当然会返回错误:指针类型和字符串不匹配;
答案 0 :(得分:1)
cxGetResourceString
(和cxSetResourceString
)函数旨在获取(并设置)现成的DevExpress组件的转换。
我不是百分百肯定,但我认为它只是针对resourcestring变量进行操作: http://docwiki.embarcadero.com/RADStudio/en/Resource_Strings
我认为这根本不是你想要的。你需要像C中的gettext()
这样的东西,DevExpress不提供。
一些解决方案的清单:
http://delphi.about.com/od/toppicks/tp/aatplocalize.htm
Delphi IDE还内置了对翻译的支持:
答案 1 :(得分: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));
虽然可能有更简单的方法来实现这一点。