3

複数のポインターがあり、それぞれの名前はこのように構築されてい'str'+'name'ます。strpointer1したがって、ポインター 1 の名前は、ポインター 2 の名前などとしましょうstrpointer2

これらの名前はすべてどこかに保存されており、特定の瞬間に文字列変数にポインター 1 の名前があり、その時点でそのポインターを使用して何かを行う必要があります。

文字列に彼の名前しかない場合、そのポインターをどのように使用すればよいですか?

より良い説明(願っています):

SQLテーブルから動的に生成されたメニューを翻訳するために、devexpressスイートのローカライザーコンポーネントを使用しようとしています。

例: メニューの「ファイル」コンポーネントのキャプションの場合、ローカライザーで他の言語の翻訳を宣言すると、それらの翻訳へのポインター (私が「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);

もちろんエラーを返します。そのポインタの型と文字列が一致しません。

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 に答える