2013-07-16 4 views
6

Delphi에서 모듈의 리소스 섹션의 문자열 테이블에 저장할 문자열을 선언 할 수 있습니다.델파이 resourcestring의 문자열 테이블 리소스 ID를 얻는 방법은 무엇입니까?

resourcestring 
    rsExample = 'Example'; 

컴파일 타임에 Delphi는 ID를 할당하고이를 String Table에 저장합니다.

resourcestring으로 선언 된 문자열의 ID를 검색하는 방법이 있습니까?

그 이유는 gnugettext처럼 작동하는 패키지를 사용하기 때문입니다. System.pas (LoadResString과 같은)의 일부 함수는 후크되어 있으므로 표현식에서 resourcestring을 사용하면 다른 문자열 (번역본)으로 바뀝니다. 물론, 이것은 매우 편리하지만 가끔 resourcestring의 원본 ​​(번역되지 않은) 텍스트가 필요합니다.

문자열의 리소스 ID를 가져올 수있을 때 LoadString API를 호출하여 번역 된 텍스트 대신 원본 텍스트를 가져올 수 있습니다.

답변

10

resourcestring의 리소스 ID를 얻으려면 문자열의 주소를 PResStringRec 유형으로 캐스팅 한 다음 Identifier 값에 액세스 할 수 있습니다.

이 샘플을 시도

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    System.SysUtils; 

resourcestring 
    rsExample = 'Example'; 
begin 
    try 
    Writeln(rsExample); 
    Writeln(PResStringRec(@rsExample)^.Identifier); 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
    readln; 
end. 
+0

아 감사합니다! resourcestring이 실제로 TResStringRec 레코드에 대한 포인터인지는 몰랐습니다. 문서 어디서나 찾을 수 없었습니다. 물론, 그건 내 잘못 일 수 있지만, 이것이 어딘가에 기록되어 있다고 생각합니까? –

+0

['TResStringRec'] (http://docwiki.embarcadero.com/Libraries/XE4/en/System.TResStringRec) 문서에는 '... TResStringRec은 문자열 리소스를 나타냅니다. TResStringRec은 모듈과 문자열 리소스의 식별자를 포함하는 구조체입니다. ' – RRUZ

+0

[TResStringRec] (http://docwiki.embarcadero.com/Libraries/XE4/en/System.TResStringRec) 문서에'resourcestring'으로 선언 된 문자열에 대한 링크가 보이지 않습니다. 'TResStringRec 유형의 변수는 런타임시 문자열 자원을 찾고로드하기 위해 시스템 루틴에 의해 사용됩니다. '아마도이 문장에서 자원 확보에 대해 말하고 있을지 모르겠지만 그건 분명하지 않습니다. 어쨌든, 당신은 나를 올바른 방향으로 보내 왔습니다! –