2

mon application delphi 2009 a un système de traduction de base qui utilise GNUGetText. J'avais utilisé quelques appels d'API pour préparer les polices. Je pensais que cela fonctionnait correctement jusqu'à récemment quand quelqu'un de Malte avait un problème avec mon application échouant précisément dans ce domaine. mon application est utilisée globalement. certains de ces codes peuvent être devenus obsolètes puisque d2009 utilise unicode.déterminer le jeu de caractères à utiliser

est-ce vraiment nécessaire pour que mon application fonctionne dans tous les environnements locaux?

TForm.Font.Charset

il y a eu ma compréhension, je dois mettre Font.Charset de l'instance TForm selon les paramètres régionaux de l'utilisateur. est-ce correct?

TranslateCharsetInfo() gagner de fonction API

delphi 2009 dit de la Windows.pas:

function TranslateCharsetInfo(var lpSrc: DWORD; var lpCs: TCharsetInfo; 
dwFlags: DWORD): BOOL; 

delphi Windows.pas de 5 dit:

function TranslateCharsetInfo(var lpSrc: DWORD; var lpCs: TCharsetInfo; 
dwFlags: DWORD): BOOL; stdcall; 

de MSDN de Microsoft:

BOOL TranslateCharsetInfo(
    __inout DWORD FAR *lpSrc, 
    __out LPCHARSETINFO lpCs, 
    __in  DWORD dwFlags 
); 

retour lorsque ce code a été écrit (retour dans delphi 5 jours), le mot a été le InPort de la fonction était incorrecte et la manière correcte était:

function TranslateCharsetInfo(lpSrc: Pointer; var lpCs: TCharsetInfo; 
dwFlags: DWORD): BOOL; stdcall; external gdi32; 

avis que la copie de fichier Windows.pas de D2009 est pas stdcall. quelle déclaration de TranslateCharsetInfo dois-je utiliser?

Le code

que de côté, pour l'essentiel, je l'ai fait ce qui suit:

var 
    Buffer : PChar; 
    iSize, iCodePage : integer; 
    rCharsetInfo: TCharsetInfo; 
begin 
    // SysLocale.DefaultLCID = 1802 
    iSize := GetLocaleInfo(SysLocale.DefaultLCID, LOCALE_IDefaultAnsiCodePage, 
       nil, 0); 
    // size=14 
    GetMem(Buffer, iSize); 
    try 
    if GetLocaleInfo(SysLocale.DefaultLCID, LOCALE_IDefaultAnsiCodePage, Buffer, 
     iSize)=0 then 
     RaiseLastOSError; 

    // Buffer contains 0 so codepage = 0 
    iCodePage:=Result := StrToInt(string(Buffer)); 
    finally 
    FreeMem(Buffer); 
    end; 

    // this function is not called according to MSDN's directions for 
    // TCI_SRCCODEPAGE and the call fails. 
    if not TranslateCharsetInfo(Pointer(iCodePage), rCharsetInfo, 
    TCI_SRCCODEPAGE) then 
     RaiseLastOSError; 

    // acts upon the form 
    Font.Charset:= rCharsetInfo.ciCharset; 
end; 

Je ne sais pas assez sur ce ... il y a assez étrangement, des années quand je écrit ceci, j'étais persuadé que cela fonctionnait correctement. les résultats de ... ne pas vérifier le code de retour d'appel de l'API ...

n'y a-t-il pas une façon plus intelligente de faire tout cela? le RTL/VCL ne fait-il pas la plupart/tout cela automatiquement? mon instinct me dit que je travaille trop dur sur ce ...

je vous remercie pour votre aide!

Répondre

1

En fait, je ne suis pas sûr de Delphi 2009, mais MSDN dit:

Notez que DEFAULT_CHARSET est pas un vrai jeu de caractères; il s'agit plutôt d'une constante qui s'apparente à NULL et qui signifie «Afficher les caractères dans les jeux de caractères disponibles».

Donc, je suppose que vous avez juste besoin de supprimer tout le code que vous avez mentionné, et cela devrait fonctionner.

+0

merci pour votre commentaire Lars D! Je vais demander à quelqu'un d'essayer mon application dans un tel environnement. –

0

Pas vraiment une réponse à cette question, mais une petite note sur la corruption possible de la mémoire avec ce code sous D2009 +.Fonction GetLocaleInfo "MSDN: renvoie le nombre de caractères récupérés dans le tampon de données de paramètres régionaux ..." et non BYTES, donc sous D2009 + vous DEVEZ allouer 2 octets pour chaque caractère. La meilleure façon de le faire est d'écrire:

GetMem(Buffer, iSize * SizeOf(Char)); //This will be safe for all delphi versions 

Sans cela, vous pouvez conduire à (D2009 AVs imprévus +), la fonction GetLocaleInfo peut remplacer votre mémoire, parce que vous avez alloué trop petit tampon. En outre, je ne comprends pas pourquoi vous essayez de changer le jeu de caractères en paramètres régionaux utilisateur, je pense que vous devriez changer le jeu de caractères pour votre traduction de destination (comme, votre programme est configuré pour être traduit en russe, mais en cours d'exécution OS anglais, vous devez changer le jeu de caractères pour RUSSIAN_CHARSET, pas ANSI_CHARSET). Et sous D2009 + je ne sais pas si c'est nécessaire, mais j'ai peut-être tort.

+0

bon point. Je vous remercie. –

Questions connexes