7
votes

Existe-t-il un moyen de convertir programmatiquement des chaînes de formatage VB6 vers des chaînes de formatage .NET?

  1. Est-ce que quelqu'un connaît une bonne référence pour les chaînes de format VB6?
  2. Est-ce que quelqu'un connaît-il d'un convertisseur des chaînes de formatage VB6 aux chaînes .NET?

    Je travaille sur le portage d'une grande base de code VB6 à .NET. Il s'agit d'une pièce de logiciels centrée sur la base de données et la base de données elle-même contient des chaînes de format VB6 qui sont ensuite chargées et utilisées pour afficher d'autres données dans la base de données.

    Ma question, comme Cet article , est de savoir comment le porter. Cependant, la réponse choisie pour cette question n'est pas suffisante pour mes besoins. Je suis mal à l'aise de compter sur les bibliothèques spécialement conçues pour la compatibilité à l'envers avec une langue que j'ai été spécifiquement embauchée au port.


2 commentaires

Les formats sont-ils détenus dans la base de données un ensemble connu? Si tel est le cas, vous serez peut-être mieux à écrire des scripts pour effectuer de simples mises à jour de base de données sur ce sous-ensemble que de trouver un outil. Vous aurez besoin de vérifier les résultats de toute façon.


:- Je souhaite. Totalement pensé à cela déjà - mais ce n'est pas un ensemble connu (même si la plupart d'entre eux sont null). Malheureusement, il a également l'inconvénient du sens que nos milliers d'utilisateurs pouvaient être bloqués dans des limbes ... Il y a des moyens de trouver - mais une trouvaille et remplacer ne fonctionnerait pas vraiment, non.


3 Réponses :


0
votes

Votre meilleur pari pourrait être d'écrire vous-même la bibliothèque de conversion, mais ce n'était probablement pas la réponse que vous aviez espérée pour obtenir.


1 commentaires

Je n'avais pas mes espoirs tenus très élevés ... C'est pourquoi j'ai également demandé une ressource à chaînes de format VB6, car j'ai pensé que je devrais devoir le réécrire.



16
votes

La routine de formatage que VB6 utilise est réellement intégrée au système d'exploitation. Oleeaut32.dll, la fonction Varformat (). Cela fait depuis 15 ans et sera autour de toujours, compte tenu de la façon dont le code repose dessus. En essayant de traduire les chaînes de formatage en une chaîne de formatage composite .NET est une tâche sans espoir. Il suffit d'utiliser la fonction OS.

Voici un exemple de programme qui le fait, à l'aide des exemples à partir du fil lié: xxx


2 commentaires

Hans, tu es un sauveur. Merci pour le fond. Je n'ai pas réalisé l'histoire; était sous l'impression qu'il s'agissait d'un agrafe VB6.


Simple et sournois, j'aime ça, +1



0
votes

Voici un code F # qui traduit la majorité des chaînes de format numérique et de la date de style VB6 prédéfinies et personnalisées à quelque chose approprié pour string.format code>. Il est facilement appelé de C # ou VB bien sûr.

open System

module VB6Format =

    /// Converts a VB6-style format string to something suitable for String.Format()
    let Convert(vb6Format) =
        if String.IsNullOrWhiteSpace(vb6Format) then "{0}" else
        match if vb6Format.Length > 1 then vb6Format.ToUpperInvariant() else vb6Format with
        // PREDEFINED NUMERIC: http://msdn.microsoft.com/en-us/library/y006s0cz(v=vs.71).aspx
        | "GENERAL NUMBER" | "G"       -> "{0:G}"
        | "g"                          -> "{0:g}"
        | "CURRENCY" | "C" | "c"       -> "{0:C}"
        | "FIXED" | "F"                -> "{0:F}"
        | "f"                          -> "{0:f}"
        | "STANDARD" | "N" | "n"       -> "{0:N}"
        | "PERCENT" | "P" | "p"        -> "{0:P}"
        | "SCIENTIFIC"                 -> "{0:E2}"
        | "E" | "e"                    -> "{0:E6}"
        | "D" | "d"                    -> "{0:D}"
        | "X" | "x"                    -> "{0:X}"
        | "YES/NO" | "ON/OFF"          // we can't support these
        | "TRUE/FALSE"                 -> "{0}"
        // PREDEFINED DATE/TIME: http://msdn.microsoft.com/en-us/library/362btx8f(v=VS.71).aspx
        | "GENERAL DATE" | "G"         -> "{0:G}"
        | "LONG DATE" | "D"            -> "{0:D}"
        | "MEDIUM DATE"
        | "SHORT DATE" | "d"           -> "{0:d}"
        | "LONG TIME" | "T"            -> "{0:T}"
        | "MEDIUM TIME"
        | "SHORT TIME" | "t"           -> "{0:t}"
        | "M" | "m"                    -> "{0:M}"
        | "R" | "r"                    -> "{0:R}"
        | "s"                          -> "{0:s}"
        | "u"                          -> "{0:u}"
        | "U"                          -> "{0:U}"
        | "Y" | "y"                    -> "{0:Y}"
        // USER-DEFINED: http://msdn.microsoft.com/en-us/library/4fb56f4y(v=vs.71).aspx
        //               http://msdn.microsoft.com/en-us/library/73ctwf33(v=VS.71).aspx
        // The user-defined format strings translate more-or-less exactly, so we're just going to use them.
        | _                            -> sprintf "{0:%s}" vb6Format


1 commentaires

Je ne vois pas comment ce code fonctionnerait. Dans la chaîne de format VB6 DD-MM-YY HH: mm: ss , le premier mm est mois et le second mm est minutes. Pour .net, ils sont tous les deux minutes. Il ne tient pas compte des littéraux échappés et des littéraux cités non plus.