2016-02-08 1 views
1

J'ai un programme écrit en Delphi 4 et essaye de le convertir en delphi xe10. Une partie que je ne comprends pas est-ce.Les résultats du codage ne fonctionnent pas

Cmd[0] := 2;     // Number of equipment to talk to 
    Cmd[1] := 22;     // My device address 
    Cmd[2] := 0; 
    MResults.Lines.Add('Reciving...'); 
    Refresh(); 

    Srlen := High(RecBuff);        

    Ret := GpListen(@Cmd, @Srlen, @RecBuff);    // gets returned value 
    if CheckRet('GpListen', (Ret and $FF), csBuf) = 0 then 
    begin 
     RecBuff[Srlen] := Chr(0);       // ?? 
     MResults.Lines.Add(RecBuff);    // returned 
     //csBuf := Format('????', [Srlen]); ////?some error?? 
    end; 

La question est RecBuff (RecBuff: array [0..9999] de Char;) Il commence plein de # 0 comme ceci:

enter image description here

mais dès

Ret := gpListen(@cmd, @srlen, @recbuff); 

est couru recbuff ressemble maintenant à ceci:

enter image description here beaucoup de char japon. comment puis-je obtenir ce pour encoder correctement sur le memopad.

+0

J'ai inséré les images pour vous. Deux conseils pour la prochaine fois: 1) Nous n'avons pas besoin de ces grandes captures d'écran, seulement la section des variables locales pertinentes fera 2) Ne jamais mettre du code dans vos questions sans spécifier les types de variables (nous devons maintenant supposer quel animal * cmd * est). –

Répondre

3

Essayez de changer

RecBuff:array[0..9999] of Char; 

à

RecBuff:array[0..9999] of AnsiChar; 

et voir si cela fonctionne. Cela peut provoquer des changements d'autres endroits dans le code. En Delphi 10, un "Char" est une entité de 2 octets (caractère 16 bits, UniCode) par opposition à Delphi 4, où il s'agit d'une entité de 1 octet (caractère 8 bits, ANSI). Le format commun pour les deux compilateurs est "AnsiChar", qui est un caractère de 8 bits.

Vous aurez probablement aussi des problèmes avec les variables STRING qui sont maintenant remplies de caractères 16 bits et non de caractères 8 bits.

Aussi - lisez The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) avant d'aller plus loin dans votre conversion.

+0

Parfait. et merci pour le lien cette conversion unicode/ansi me tue. – user41758

+0

Voir également la documentation de migration d'Embarcadero: [Unicode dans RAD Studio] (http://docwiki.embarcadero.com/RADStudio/fr/Unicode_in_RAD_Studio) –

1

Dans Seattle les chaînes et les caractères sont Unicode par défaut.

L'échange avec le périphérique est généralement effectué via des tampons Ansi (un octet).

Il faut donc utiliser AnsiString, AnsiChar, PAnsiChar etc

RecBuff: Array [0..9999] de Ansi Char;

Nous avons déjà discuté de ce problème here