Affiché correctement de l'UTF-8 (VB6)

Résolu
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 9 avril 2008 à 17:31
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 24 avril 2008 à 17:16
Bonjour
Alors voila j'ai beau cherché un peut partout je n'arrive pas à trouvé quelque chose qui me conviens (en même temps c'est vrais que je suis un peut chiant parfois).

Je modifie actuellement une application à fin de internationalisée.
    Pour cela :
        Je stock l'ensemble des chaine de caractères affichable de mon appli (en utilisant une classe faite maison) dans une table d'une base de données (base utilisé pour le moment : PostgreSQL ; forcément en UTF-8, les fonctions appelant des API que j'utilise pour convertir l'Ascii en UTF-8 sont en fin de post, je les est trouvées quelque part sur VB-France,  je crois).
        Dans une autre table je stock les traductions de ces chaines de caractères.       A fin de traduire je fait le lient (grâce à une simple requête de la forme "SELECT langue_toto.Phrase FROM langue_reference,langue_toto WHERE langue_reference.Reference langue_toto.Reference AND langue_reference.Phrase 'La phrase à traduire'". Et paf j'ai la traduction (en faite je fessais comme sa il n'y à pas longtemps, mais je n'étais pas contant de la vitesse d'exécution, vue la quantité de requête que cette méthode utilise ce n'est pas étonnant, donc je fait tout en mémoire, par contre sa serais un peut long à expliqué et sans intérêt pour mon problème actuel
)

    Je voudrais maintenant affiché l'ensemble de ces données dans un objet (ressemblant à un datagridview), et que tout les carac soit visible (aussi bien que les caractères cyrillique caractères chinois).
Je ne sait vraiment pas comment faire. Existe t'il des objets affichant directement de l'UTF-8 (sa serais l'idéale en faite) ou quelqu'un aurais une autre méthode pour faire sa ?
    Si je ne peut affiché que le jeux de caractére configuré dans les paramètres régionaux de Windows se serais moins bien mais suffisant

PS : J'ai re-configuré mes paramètres régionaux en Russe à fin de voir si les caractères cyrilliques s'afficherais, depuis j'ai une erreur sur une requête (erreur que je n'avais pas avant ce changement de paramètre) ????
La requête qui pante : "INSERT INTO langue_reference(phrase,reference) VALUES ('% de la s?©lection...',566017);" qui me retourne l'erreur "ERROR: invalid byte sequence for encoding "UTF8": 0xa9;Error while executing the query". Si quelqu'un sait pourquoi, et surtout si cette erreur arriveras sur toute machine configuré en Russe .

Les fonction de conversion Ascii -> UTF-8 et UTF-8 -> Ascii que j'utilise :
8<--------------------------------------------------------------------
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long

Private Const CP_ACP = 0
Private Const CP_UTF8 = 65001

Private Function UTF8_Decode(ByVal Text As String) As String

Dim lLength As Long
Dim sBuffer As String

Text = StrConv(Text, vbFromUnicode)
lLength = MultiByteToWideChar(CP_UTF8, 0, StrPtr(Text), -1, 0, 0)
sBuffer = Space$(lLength)
lLength = MultiByteToWideChar(CP_UTF8, 0, StrPtr(Text), -1, StrPtr(sBuffer), Len(sBuffer))
UTF8_Decode = left$(sBuffer, lLength - 1)

End Function

Private Function UTF8_Encode(ByVal Text As String) As String

Dim sBuffer As String
Dim lLength As Long

lLength = WideCharToMultiByte(CP_UTF8, 0, StrPtr(Text), -1, 0, 0, 0, 0)
sBuffer = Space$(lLength)
lLength = WideCharToMultiByte(CP_UTF8, 0, StrPtr(Text), -1, StrPtr(sBuffer), Len(sBuffer), 0, 0)
sBuffer = StrConv(sBuffer, vbUnicode)
UTF8_Encode = left$(sBuffer, lLength - 1)

End Function

-------------------------------------------------------------------->8
Amicalement
Pensez "Réponse acceptée"

8 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
10 avril 2008 à 09:44
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
15 avril 2008 à 16:54
regarde les composants de violent_ken, ils font pas mal de choses, et entre autres, Unicode
3
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
11 avril 2008 à 09:53
Merci pour ce lient. ( désol de ne passé que maintenant j'étais TRÈS occupé hier )

    Je regarde ce tuto tout de suite (par contre hélasse je n'aurais pas énormément de temps à accordé à ce sujet aujourd'hui mais dé le début de semaine prochaine je posterais ma solution détaillé , si jamais j'oubliais n'hésitez pas à posté ici pour me le rappelé )
Merci encore Renfield (j'ai le sentiment que c'est souvent toi qui apporte des solutions à mes problèmes, MERCI)
Amicalement
Pensez "Réponse acceptée"
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
11 avril 2008 à 09:58
pas de soucis, vas a ton rythme ^^ c'est toi qui es bloqué...

bon courage
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
15 avril 2008 à 16:43
Bonjour (enfin un peut de temps libre pour répondre)

    Je n'es pas terminer de tester l'ensemble des objets disponible sur le lien que tu m'a transit Renfield mais j'ai déjà une idée plus ou moins précise de ce que je vais faire.
    -> Les textbox et label vont être remplacé par les textbox et label disponible dans le composant "Microsoft Forms 2.0 Object Library" qui affiche correctement des caractère unicode (donc utf-8)
    -> Les toolstiptext de mes objets vont être remplacé par des objets "clsToolTip" (dans le projet "UniTooltip" disponible sur le lient que Renfield à posté, GÉNIAL comme truc beau en plus)
    -> Il n'y à que les TabScript que je ne sait pas encore par quoi remplacé mais j'ai bonne espoir de trouvé rapidement

MERCI Renfield pour ce lien qui m'a permit de trouvé un point de départ solide pour résoudre mon problème.

Amicalement
Pensez "Réponse acceptée"
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
15 avril 2008 à 17:25
Hooooooooooooo
    Mais que c'est TRÈS jolie tout sa
MERCI de m'avoir aiguillées jusqu'à ces sources

Amicalement
Pensez "Réponse acceptée"
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
22 avril 2008 à 17:59
Ma sution n'est pas encore terminer mais en bonne voie.
Alors en final j'applique une solution par problèmes (logique, en même temps mais j'aurais préférer tout faire d'un seul coup)
Je posterais au fur et à mesure des solutions trouvées

Unicode/UTF-8 dans le titre d'une form :
    Attention la plus complexe je pense :
        -> Dans le disigne mettre la propriété BorderStyle à 0 (n'a pas effet si fait dans le code cher moi ????)

       Dans un module aillant une collection en private je crée une procédure qui :
          -> Crée un nouvelle objet basé sur une form un peut particulière (voir "La form conteneur")
          -> Crée un objet basé sur une classe perso (voir "La classe") recevant une référence à la form (surtout utilisé pour les resize, fait grace à l'API "SetWindowPos")
          -> Sauvegarde du derniers objet dans une collection (problème de durée de vie de variable dans le cas contraire, enfin je crois )
          -> Utilisation d'un SetParent pour mettre la form à modifier dans le nouveau cadre (dans le piturebox voir "La form conteneur")

       La form conteneur :
          Contiens un frame trouvé ici (utilisé pour dessiné le contour et affiché le titre de la form)
          Ce frame contiens une picture box classique
          Sur resize du form faire le resize de la frame et du picture box

       La classe :
          Garde dans une variable withevents le form conteneur et dans une varable classique le form contenu (ou juste son handle sa peut être suffisant)
          Sur l'évènement resize du form conteneur resize de la form contenu en utilisant l'API "SetWindowPos" (pas d'obligation à ce niveau je pense)
          Sur l'évènement queryunload de la form conteneur fermer le form contenu, supprimer la référence à l'objet dans la collection du module (grâce à une procédure crée au niveau du module pour sa)

Voila la méthode que j'emploie pour les form (je ne sait pas si je suis claire par contre)
Si non pour ce qui concerne les textbox, listbox, label, chekbox, optionbox, combobox, commandbuttom, frame, je remplace les anciens objet par les objets d'MsForm2 (j'essaie de faire un code qui modifi directement ces objets dans le code des forms mais c'est pas si simple en final )

Par contre je n'es pas encore trouvé de substitue au objet MsChart, TabPage, ToolBar, et TreeView, si quelqu'un sait sa m'arrangerais.
Si je trouve je posterais

Je posterais le code de tout sa une fois terminer et tester (peut être même dans les codes, dans ce cas je mettrais un lient  )

Amicalement
Pensez "Réponse acceptée"
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
24 avril 2008 à 17:16
Juste pour me défoulé (dzl mais j'en es vraiment besoin là) :

LES OBJETS MS.FORMS2 C'EST VRAIMENT DE LA MER__ !!!

Alors que les objets (textbox par exemple) VB "classique" sont relativement bien construit et claire (au niveau du code programme générer) les objet Forms2 sont totalement ILLISIBLE.

Je m'explique avec un exemple simple :
un textbox classique est codé comme sa :
8<---------------
   Begin VB.TextBox Text1
      Enabled         =   0   'False
      Height          =   855
      Left            =   960
      Locked          =   -1  'True
      TabIndex        =   4
      Text            =   "Text1"
      Top             =   1800
      Width           =   2535
   End

--------------->8
Si une propriété n'apparais pas c'est que la valeur par défaut est défini.
Un textbox Forms2 est (avec les même propriété) :
8<---------------
   Begin MSForms.TextBox TextBox2
      Height          =   615
      Left            =   4440
      TabIndex        =   5
      Top             =   4080
      Width           =   2295
      VariousPropertyBits=   746604573
      Size            =   "4048;1085"
      Value           =   "Text1"
      FontEffects     =   1073750016
      FontHeight      =   165
      FontCharSet     =   0
      FontPitchAndFamily=   2
   End

--------------->8
Et non vous ne rêvez pas les propriété Enable et Locked (pour ne citer que celle si) n'apparaisse plus au niveau des objets Forms2... En faite ils sont codé dans la valeur du "VariousPropertBits"... Une nouvelle propriété : "Size" (pour ne citer que celle si), est apparut  Son utilité m'es encore inconnu (sachant que si je passe la valeur à "0;0" un plantage survient à l'ouverture du form, mais si cette même valeur est mise à "1;1" aucun changement dans la form n'est visible... Pas plus de commentaire je serais injurieux)...
Microbof à encore fait sont boulot complètement, proprement, et cherche comme toujours, à arrangé aussi bien les développeurs que les utilisateurs...

P.S. (affolant) :
    Microbof à reconnu (par l'intermédiaire de M.David Cross chef de projet de l'UAC (User Account Control)) que l'UAC (justement) à été fait pour... faire chier son monde !!!!
Je cite :
M.David Cross : «  La raison pour laquelle nous avons intégré l’UAC
au sein de la plateforme était pour énerver les utilisateurs. Je suis sérieux !
».
M. Cross explique que le but était de décourager les utilisateurs de creuser
trop profondément dans le système d’exploitation en modifiant des paramètres
importants, incitant aussi les développeurs à concevoir des programmes qui
n’aillent pas trop loin dans les sous-systèmes... Pourquoi ne pas verrouiller toutes les API temps qu'il s'y sont cette bande de ..... Houla je vais trop loin là.
Encore une fois merci Microbof

Amicalement
Pensez "Réponse acceptée"
0
Rejoignez-nous