2013-07-16 21 views
6

W Delphi możesz zadeklarować łańcuchy, które mają być przechowywane w tabeli String w sekcji zasobów modułu.Jak uzyskać identyfikator zasobu tabeli łańcuchów dla łańcucha zasobów Delphi?

resourcestring 
    rsExample = 'Example'; 

Podczas kompilacji Delphi przydzieli dla niego identyfikator i zapisze go w tabeli ciągów.

Czy istnieje sposób na odzyskanie identyfikatora łańcucha, który jest zadeklarowany jako łańcuch zasobów?

Powodem jest to, że używam pakietu, który działa tak jak gnugettext. Niektóre funkcje w System.pas (jak LoadResString) są zawieszone, więc kiedy używam łańcucha zasobów w wyrażeniu, zostanie on zastąpiony innym ciągiem (tłumaczenie). Oczywiście jest to bardzo przydatne, ale czasami potrzebuję oryginalnego (nieprzetłumaczonego) tekstu łańcucha zasobów.

Kiedy mogę odzyskać identyfikator zasobu łańcucha, mogę wywołać funkcję LoadString API, aby uzyskać oryginalny tekst zamiast przetłumaczonego tekstu.

Odpowiedz

10

Aby uzyskać identyfikator zasobu łańcucha zasobów, można rzucić adres łańcucha znaków na typ PResStringRec, a następnie uzyskać dostęp do wartości Identifier.

Spróbuj tej próbki

{$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

Ach dziękuję! Nie wiedziałem, że resourcestring był właściwie wskaźnikiem do rekordu TResStringRec. Nigdzie nie mogłem tego znaleźć w dokumentacji. Oczywiście, to może być moja wina, ale czy sądzisz, że jest to gdzieś udokumentowane? –

+0

Dokumentacja ['TResStringRec'] (http://docwiki.embarcadero.com/Libraries/XE4/en/System.TResStringRec) mówi:" ... TResStringRec reprezentuje zasób łańcuchowy. TResStringRec to struktura zawierająca moduł i identyfikator zasobu ciągów. ' – RRUZ

+0

Nie widzę łącza do ciągów zadeklarowanych jako' resourcestring' w dokumentacji [TResStringRec] (http://docwiki.embarcadero.com/Libraries/XE4/en/System.TResStringRec). Mówi on, że zmienne typu TResStringRec są używane przez procedury systemowe do lokalizowania i ładowania zasobów ciągów w czasie wykonywania. Może w tym zdaniu mówi się o łańcuchach zasobów, ale nie było to dla mnie jasne. W każdym razie wysłałeś mnie we właściwym kierunku! –