2010-11-01 22 views
7
  1. ¿Alguien sabe de una buena referencia para las cadenas de formato VB6?
  2. ¿Alguien sabe de un convertidor de cadenas de formato VB6 a cadenas .NET?

Estoy trabajando en portar un gran código base VB6 a .NET. Es una pieza de software centrada en la base de datos, y la base de datos en sí misma contiene cadenas de formato VB6 que luego se cargan y se usan para mostrar otros datos en la base de datos.¿Hay alguna forma de convertir mediante programación cadenas de formato VB6 a cadenas de formato .NET?

Mi pregunta, como this article, es cómo portar esto. Sin embargo, la respuesta elegida para esa pregunta no es adecuada para mis necesidades. Me incomoda confiar en las bibliotecas diseñadas específicamente para compatibilidad con versiones anteriores con un idioma que he sido contratado específicamente para exportar.

+0

¿Los formatos guardados en la base de datos son un conjunto conocido? Si es así, es mejor que simplemente escriba scripts para hacer actualizaciones simples de bases de datos en ese subconjunto que encontrar una herramienta. Deberás verificar los resultados de todos modos. –

+0

:-D Deseo. Totalmente pensado en eso, pero no es un conjunto conocido (incluso si la mayoría de ellos * son * nulos). Desafortunadamente, también tiene la desventaja de que nuestros miles de usuarios podrían quedar atrapados en el limbo ... hay formas de evitarlo, pero un hallazgo y reemplazo no funcionaría realmente, no. – Crisfole

Respuesta

14

La rutina de formateo que utiliza VB6 está realmente integrada en el sistema operativo. Oleaut32.dll, la función VarFormat(). Ha existido durante 15 años y seguirá existiendo, teniendo en cuenta la cantidad de código que se basa en él. Intentar traducir las cadenas de formato a una cadena de formato compuesta .NET es una tarea desesperada. Solo usa la función del sistema operativo.

Aquí hay un ejemplo de programa que hace esto, el uso de los ejemplos de la rosca vinculado:

using System; 
using System.Runtime.InteropServices; 

class Program { 
    static void Main(string[] args) { 
     Console.WriteLine(Vb6Format("hi there", ">")); 
     Console.WriteLine(Vb6Format("hI tHeRe", "<")); 
     Console.WriteLine(Vb6Format("hi there", ">[email protected]@@... not @@@@@")); 
     Console.ReadLine(); 
    } 

    public static string Vb6Format(object expr, string format) { 
     string result; 
     int hr = VarFormat(ref expr, format, 0, 0, 0, out result); 
     if (hr != 0) throw new COMException("Format error", hr); 
     return result; 
    } 
    [DllImport("oleaut32.dll", CharSet = CharSet.Unicode)] 
    private static extern int VarFormat(ref object expr, string format, int firstDay, int firstWeek, int flags, 
     [MarshalAs(UnmanagedType.BStr)] out string result); 
} 
+0

Hans, eres un salvador. Gracias por el fondo. No me di cuenta de la historia; tenía la impresión de que era un elemento básico de VB6. – Crisfole

+0

Simple y astuto, me gusta, +1 – smirkingman

0

La mejor opción es escribir usted mismo la biblioteca de conversiones, pero probablemente esa no fue la respuesta que esperaba obtener.

+0

No tenía mis esperanzas en alto realmente ... es por eso que también pedí un recurso de cadena de formato VB6, porque pensé que podría tener que volver a escribirlo. – Crisfole

0

He aquí algunos F # código que traduce la mayoría de los pre-definida y personalizada VB6 estilo numérico y cadenas de formato de fecha a algo adecuado para String.Format. Se llama fácilmente desde C# o VB, por supuesto.

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 
Cuestiones relacionadas