Top / .NET備忘録 / 05.UserControl / 07.コンバータ作成のポイント

コンバータ作成のポイントをあげていきます。

アセンブリをロードする

アセンブリをロードするには、System.Reflection.Assembly.LoadFrom メソッドを使います。

アップグレードウィザード(Visual Studio 2005 の場合)は、obj\debug の下に dll を配置するので、System.IO.Directory.GetFiles メソッドで取得すればよいです。

すべて取り込んで、GetTypes() でクラスを取得し、BaseType が typeof(AxHost) のものを Dictionary に格納しておきます。

さらに、各クラスの PropertyInfo 配列をディクショナリにキャッシュしておきます。

デフォルト値でないもののみ取得

プロパティ値をすべてセットしてもいいですが、できるならデフォルト値と比較して違うもののみソースに反映しておいたほうが良いかと思います。

まぁ、新しいコントロールを貼り付けた状態でデザイナを開けば、デフォルト値のプロパティは生成されなくなるのですけども。

デフォルトのプロパティ値

デフォルトのプロパティ値を取得するには、コントロールの OcxState に null を代入します。

null を代入すると、AxHost は、空の AxHost.State オブジェクトを作成してくれますので、取り出したプロパティの値がデフォルト値になります。

プロパティ値を変換

プロパティの値は、.NET で認識できる値で取得されます。
これを VB.NET のソースコードに変換します。

Font クラスなら

    public static string ToPropertyString(Font fon)
    {
        StringBuilder builder = new StringBuilder();
        builder.Append("New System.Drawing.Font(");
        builder.Append("\"" + fon.FontFamily.Name + "\"");
        builder.Append(", " + fon.Size.ToString() + "!");
        builder.Append(", System.Drawing.FontStyle." + fon.Style.ToString());
        builder.Append(", System.Drawing.GraphicsUnit." + fon.Unit.ToString());
        builder.Append(",CType(" + fon.GdiCharSet + ", Byte)");
        builder.Append(")");
        return builder.ToString();
    }

Color クラスなら

    public static string ToPropertyString(Color c)
    {
        StringBuilder builder = new StringBuilder();
        if (c.IsEmpty)
        {
            builder.Append("System.Drawing.Color.Empty");
        }
        else if (c.IsSystemColor)
        {
            builder.Append("System.Drawing.SystemColors.");
            builder.Append(c.Name);
        }
        else if (c.IsNamedColor)
        {
            builder.Append("System.Drawing.Color.");
            builder.Append(c.Name);
        }
        else
        {
            builder.Append("System.Drawing.Color.FromArgb(");
            builder.Append(c.A.ToString());
            builder.Append("," + c.R.ToString());
            builder.Append("," + c.G.ToString());
            builder.Append("," + c.B.ToString());
            builder.Append(")");
        }
        return builder.ToString();
    }

こんな具合です。

フォント

VB6.0 では、フォント情報を持たないコントロールは、フォームのフォント情報を使っていましたが、.NET では、親コントロールのフォントを使うようになっていますので、注意が必要です。

TabStop

OCX の場合、TabStop = False のものがあると、設定が引き継がれないようです。
OcxState の中にも無いようなので、これは VB6.0 のソースから持ってくるしかないかもしれません。

ToolBar の MixedState のように、他にもコンバートされないものがいろいろあるようで、その場合は、元のソースからもってくるしかありません。




トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2013-11-25 (月) 21:36:29 (1360d)