[Delphi] resourcestring laden

Pagina: 1
Acties:

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 07:34

Tomatoman

Fulltime prutser

Topicstarter
Delphi maakt heel handig gebruik van resourcestrings, maar nu loop ik toch echt tegen een probleem aan. Een resourcestring is niets ander dan een string opgeslagen in een resource, dus die moet je kunnen verkrijgen met de standaard Windows functie LoadString. Helaas, het lukt me niet.
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
resourcestring
  SNativeLanguageName = English';
var
  LanguageName: array[0..1023] of Char;
  Ident: Cardinal;
begin
  Ident := Cardinal(SNativeLanguageName);
  if LoadString(0, Ident, LanguageName, SizeOf(LanguageName) <> 0 then
    ShowMessage('De taal is: ' + LanguageName')
  else
    ShowMessage('Tijd om af te knappen');
end;
Je begrijpt het al: tijd om af te knappen. Als ik een resource editor gebruik, kan ik heel eenvoudig opzoeken wat de ident van de resource is, in mijn geval 65203. Als ik op regel 7 de waarde van Ident instel op 65203, laadt hij netjes de string resource. Maar hoe bepaal ik de waarde van de ident?

Reden dat ik niet gewoon ShowMessage(SNativeLanguageName) gebruik, is dat ik straks uit allerlei resource modules de bewuste string wil laden. Dan werkt het gebruik van SNativeLanguageName niet meer

[ Voor 4% gewijzigd door Tomatoman op 01-02-2004 08:19 ]

Een goede grap mag vrienden kosten.


  • klinz
  • Registratie: Maart 2002
  • Laatst online: 21-05 09:01

klinz

weet van NIETS

In Visual Studio lossen ze dit op door een include file (.h) te maken die door het resource script geincluded wordt. Vanuit de C(++) code wordt dezelfde include file geincluded. Voor Delphi heb ik er nooit echt een oplossing voor gezien.

Ik snap nog niet helemaal waarom het gebruik van SNativeLanguageName niet zou werken? Vanwege dubbele resource-id's?

Verwijderd

klinz schreef op 01 februari 2004 @ 13:23:
In Visual Studio lossen ze dit op door een include file (.h) te maken die door het resource script geincluded wordt. Vanuit de C(++) code wordt dezelfde include file geincluded. Voor Delphi heb ik er nooit echt een oplossing voor gezien.
Dat kan in Delphi ook. Wat hier aangehaalt wordt is de ingebouwde functionaliteit van Delphi om met resourcestrings om te gaan. Om zo dus alle rompslomp te minimaliseren.

De vraag is wat Tomatoman wil bereiken...
De applicatie geschikt maken voor internationaal gebruik? Dus meerdere talen ondersteunen. Zo ja, dan zou ik ff in de help duiken. Zo nee, ....

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 07:34

Tomatoman

Fulltime prutser

Topicstarter
Hij moet inderdaad geschikt worden voor meerdere talen. Helaas is de Help op dit punt bijzonder brak. Een voorbeeldje:
To switch languages, you should call LoadResourceModule, passing the LCID for the new language, and then call ReinitializeForms. For example, the following code switches the interface language to French:

Delphi:
1
2
3
4
const
  FRENCH = (SUBLANG_FRENCH shl 10) or LANG_FRENCH;
if LoadNewResourceModule(FRENCH) <> 0 then
  ReinitializeForms;
Er staat dus vlak achter elkaar LoadResourceModule en LoadNewResourceModule. LoadNewResourceModule en ReinitializeForms bestaan niet en aan LoadResourceModule worden de verkeerde functieargumenten meegegeven 8)7

Wat ik heb zijn mijn .exe en een paar resource modules met andere talen: .NLD en .ENU. Nu wil ik in alledrie modules een string opslaan die de taalnaam in de originele taal bevat. In een Deense module zou dus een resourcestring SNativeLanguage zitten met de waarde 'Dansk'. Voor de .exe kun je die string resource uitlezen met
Delphi:
1
LoadString(0, Ident, LanguageName, SizeOf(LanguageName));

en voor de resource modules met
Delphi:
1
2
LoadString(InstanceHandleVanResourceModule, Ident, LanguageName,
  SizeOf(LanguageName));
In beide gevallen moet ik de waarde van Ident weten. Ik heb al verteld dat alles perfect werkt als ik Ident ken, maar die ken ik dus niet.

Een goede grap mag vrienden kosten.


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Delphi:
1
PResStringRec(@LanguageName).Identifier
Ik weet niet of dit de juiste ID teruggeeft, maar vgs mij is dit wel "de" manier...

LordLarry, naäper! :+

[ Voor 20% gewijzigd door _Thanatos_ op 01-02-2004 20:42 ]

日本!🎌


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ja, beetje vaag, maar de functies die je gevonden hebt in de help staan hier: C:\Program Files\Borland\Delphi\Demos\RichEdit\reinit.pas

Als je alsnog de Identifier van de resourcestring wilt weten kan je het zo doen:
Delphi:
1
pResStringRec(@SSomeResourceString)^.Identifier

We adore chaos because we like to restore order - M.C. Escher


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 07:34

Tomatoman

Fulltime prutser

Topicstarter
_Thanatos_ en LordLarry bedankt! Die PResStringRec kende ik niet en het is inderdaad "de" manier.

Een goede grap mag vrienden kosten.

Pagina: 1