WindowsFormsのコントロールの背景色やフォントが設定されているかを取得

最近、WindowsFormsのコントロールの背景色やフォントが設定されているかを取得する必要があったので、Controlについて調べてみました。
なお、背景色やフォントは親コントロールから継承されるので、普通にBackColorプロパティやFontプロパティでは設定されているかを調べられません。

以下のサイトでControlのソースコードを調べました。
Reference Source

結果、internalなRawBackColorプロパティとIsFontSetメソッドをリフレクションで実行すれば取得できそうです。

実装は以下のようになります。


public static class ControlExtension {
    private static Func RawBackColorDelegate { get; }
    private static Func IsFontSetDelegate { get; }

    static ControlExtension() {
        RawBackColorDelegate = typeof(Control).CreateGetPropertyDelegate<Func>("RawBackColor", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod);
        IsFontSetDelegate = typeof(Control).CreateMethodDelegate<Func>("IsFontSet", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod);
    }

    public static Color RawBackColor(this Control ctl) {
        return RawBackColorDelegate(ctl);
    }

    public static bool IsFontSet(this Control ctl) {
        return IsFontSetDelegate(ctl);
    }
}

public static class TypeExtension {
    public static TDelegate CreateGetPropertyDelegate<TDelegate>(this Type type, string name, BindingFlags flags) {
        var property = type.GetProperty(name, flags);
        var info = property.GetGetMethod(flags.HasFlag(BindingFlags.NonPublic));
        return (TDelegate)(object)Delegate.CreateDelegate(typeof(TDelegate), info);
    }

    public static TDelegate CreateMethodDelegate<TDelegate>(this Type type, string name, BindingFlags flags) {
        var info = type.GetMethod(name, flags);
        return (TDelegate)(object)Delegate.CreateDelegate(typeof(TDelegate), info);
    }
}

Controlの拡張メソッドにしましたので、全てのコントロールで使用可能です。
毎回リフレクションは遅いので、staticコンストラクタであらかじめデリゲートを作成しています。
ついでに、Delegate.CreateDelegateメソッドをラップする拡張メソッドも作成しました。

PLCの文字列制御

そもそもシーケンサで文字列を扱う事自体に無理があります。
シーケンサのワードデバイスは2バイトなので便利な命令がないメーカーのPLCの場合は苦労します。※文字数が偶数のときは文字列の最後が1/2ワードになります。

スクリプト

mgcです。

ある案件でスクリプトをよく使用しています。

レーザーマーカーやアライメント等PLCから特定の機器へのコマンドの送受信
又は、内部での複雑な演算などにとても便利な機能です。

キーエンスのスクリプトはラダー内に直接記述できるので
ラダーの流れに沿ってスクリプトを使用することが可能です。

モニタするとスクリプトが今どこまで走っているのかが
明確に見えないところが少し不便かなと思います。

技術とは

こんにちはmtjです

最近アンドロイドアプリの勉強しようと思いkotlinをしております。
開発環境が日本語でないので既に敷居は高いのですがなかなか新鮮であり、JAVAを元にしている事もあり懐かしくも思います。

こういった新しい言語の考え方、作り方を覚えるのも良い技術のトレーニングになると思いました。
自分たちの業界には大切なことと思います。