2013-07-16 15 views
6

In Delphi è possibile dichiarare le stringhe da memorizzare nella tabella delle stringhe della sezione delle risorse del modulo.Come ottenere l'ID risorsa tabella stringhe di una risorsa Delphi?

resourcestring 
    rsExample = 'Example'; 

In fase di compilazione, Delphi assegna un ID per esso e lo memorizza nella tabella di stringhe.

C'è un modo per recuperare l'ID di una stringa dichiarata come risorsa?

Il motivo è che utilizzo un pacchetto che funziona proprio come gnugettext. Alcune funzioni in System.pas (come LoadResString) sono agganciate, quindi quando uso una risorsa in un'espressione, verrà sostituita da una stringa diversa (la traduzione). Certo, questo è molto utile, ma a volte ho bisogno del testo originale (non tradotto) del resourcestring.

Quando riesco a recuperare l'ID risorsa della stringa, posso chiamare l'API LoadString per ottenere il testo originale, anziché il testo tradotto.

risposta

10

Per ottenere l'ID risorsa di una risorsa, è possibile eseguire il cast dell'indirizzo della stringa sul tipo PResStringRec quindi accedere al valore Identifier.

Prova questa campione

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

Ah grazie! Non sapevo che la risorsa fosse in realtà un puntatore a un record TResStringRec. Non sono riuscito a trovarlo da nessuna parte nella documentazione. Certo, potrebbe essere colpa mia, ma pensi che questo sia documentato da qualche parte? –

+0

La documentazione ['TResStringRec'] (http://docwiki.embarcadero.com/Libraries/XE4/en/System.TResStringRec) dice' ... TResStringRec rappresenta una risorsa stringa. TResStringRec è una struttura che contiene il modulo e l'identificatore di una risorsa stringa. ' – RRUZ

+0

Non vedo il collegamento alle stringhe dichiarato come' resourcestring' nella documentazione [TResStringRec] (http://docwiki.embarcadero.com/Libraries/XE4/en/System.TResStringRec). Dice che le variabili di tipo TResStringRec vengono utilizzate dalle routine di sistema per individuare e caricare le risorse di stringa in fase di esecuzione. Forse in questa frase si parla di resourcester, ma non era chiaro per me. Ad ogni modo, mi hai mandato nella giusta direzione! –

Problemi correlati