2010-11-01 26 views
7
  1. VB6 biçim dizeleri için iyi bir başvuru bilen var mı?
  2. VB6 biçimlendirme dizelerinden .NET dizelerine dönüştürücü bilen var mı?

.NET için büyük bir VB6 kod tabanı üzerinde çalışıyorum. Veritabanı merkezli bir yazılım parçasıdır ve veritabanının kendisi daha sonra yüklenen ve veritabanındaki diğer verileri görüntülemek için kullanılan VB6 biçim-dizeleri tutar.VB6 Biçimlendirme dizelerini .NET Biçimlendirme dizelerine program aracılığıyla dönüştürmenin bir yolu var mı?

this article gibi sorum, bunun nasıl yapılacağıdır. Ancak bu soru için seçilen cevap, ihtiyaçlar için yeterli değil. Özel olarak limandan kiraladığım bir dille geriye dönük uyumluluk için özel olarak tasarlanmış kütüphanelere güvenmekten rahatsız oluyorum.

+0

Veritabanında tutulan biçimler bilinen bir takım mı? Öyleyse, bu alt kümede basit bir veritabanı güncellemesi yapmak için komut dosyaları yazmaktan daha iyi olabilirsiniz. Yine de sonuçları iki kez kontrol etmelisin. –

+0

: Keşke. Tamamen bunu zaten düşünmüştüm - ama bilinen bir set değil (çoğu, * boş bile olsa). Ne yazık ki, aynı zamanda binlerce kullanıcımızın sınırsız bir şekilde sıkışıp kalabileceği anlamına da geliyor. Etrafında bir yol var - ama bir bulma ve değiştirme gerçekten işe yaramaz, hayır. – Crisfole

cevap

14

VB6'nın kullandığı biçimlendirme yordamı, aslında işletim sisteminde yerleşik olarak bulunur. Oleaut32.dll, VarFormat() işlevi. 15 yıl civarındaydı ve ne kadar kodun buna bağlı olduğu göz önünde bulundurularak etrafta olacak. Biçimlendirme dizelerini bir .NET kompozit biçimlendirme dizesine çevirmeye çalışmak umutsuz bir görevdir. Sadece işletim sistemi işlevini kullanın. İşte

bağlantılı iplik örnekler göstererek, bunu yapan bir örnek program:

İşte
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, sen bir kurtarıcısın. Arka plan için teşekkürler. Tarihi anlamadım; Bir VB6 zımba olduğu izlenimi altındaydı. – Crisfole

+0

Simple and Sly, bunu sevdim, +1 – smirkingman

0

En iyi seçeneğiniz dönüştürme kitaplığını kendiniz yazmak olabilir, ancak bu muhtemelen almayı umduğunuz cevap değildi.

+0

Umutlarımı gerçekten yüksek tuttum. Bu yüzden bir VB6 format-string kaynağı da istedim, çünkü tekrar yazmam gerektiğini düşündüm. – Crisfole

0

çoğunluğunu çevirir birkaç F # kodu önceden tanımlanmış ve özel VB6 tarzı sayısal ve tarih biçimini dizeleri için String.Format için uygun bir şey. Tabii ki C# veya VB'den kolayca çağrılabilir.

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