如果在字符串中有名称,请使用指针

时间:2012-08-29 07:30:00

标签: delphi pointers devexpress delphi-xe2

我有多个指针,他们的每个名字都是这样构建的'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);

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

2 个答案:

答案 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还内置了对翻译的支持:

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

答案 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));

虽然可能有更简单的方法来实现这一点。