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を元にしている事もあり懐かしくも思います。

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

スプリッタコントロール

今月はC#のSplitterコントロールとSplitContainerコントロールの2つのスプリッタコントロールに機能追加を行いました。

スプリッタコントロールは以下の画面のように、2つの領域をマウス操作で可変にするコントロールです。
なお、この画面は弊社で作成している社内用の画像処理ソフトです。

追加したのは以下の機能
1.マウスオーバー時に色を変更する処理
2.ダブルクリックで一方の領域を最小化したり元のサイズに戻したりする処理

この機能追加を社内ライブラリにおこないましたので、今後のアプリではこの機能が簡単に使用できるようになります。

今回対応したのはWindowsFormsだけなので、いずれWPF用にも対応を行う予定です。

アキュムレータ

KV-STUDIOではアキュムレータを多用します。
アキュムレータを使うと演算命令を連続的に書けるので見やすいです。
また、一時退避的なDMも不要です。
私はマイコン(Z80)出身なので違和感なく使いますがPLCから始めた人は使いにくいようです。
※アキュムレータは実デバイスではないので・・・。
PCの関係者であればKV-STUDIOのスクリプトを使うと良いのではないでしょうか。
(お客様の許可が出れば、の話ですが)

便利?

mgcです。

今年も無事に花粉症を発症しまして
大変な時期を過ごしておりますが皆さまいかがお過ごしでしょうか。

次回からのメルセデスのSクラスに
また特殊技術が採用されるというニュースを見ました。

その特殊技術というものが斬新で
雨が降ってきた場合や、雪が降ってきた場合、前方を照らしているヘッドライトの形を
雨のマークや雪の結晶のマークに一定時間変化させるというものです。

確かに素晴らしい技術だと思うのですが
本当に必要なのでしょうか?

現代に溢れるもののうち必要なものを通り越していろいろな機能を付加し
その分値段が上がっているというものをよく目の当たりにします。
便利とはなんなのでしょうか。
便利というのは難しいなとこのニュースを見て感じました。

無線技術

こんにちはmtjです。

最近無線の進化はすごいと感じています。

それも家でヘッドセットを使用しているのですが断線で以前の有線ヘッドセットがダメになり今回無線にしてみようと考えたためです。

あまり遅延があっても音は問題がないので無線にしました、steelseriesの無線ヘッドセットです。
送受信機とヘッドセットという構成で送受信機は独自規格ですが音ゲーをしていても遅延を感じないくらい高速通信をしています。
今までと比べて充電をしないといけない欠点はありますがケーブルの取り回し等を考えるとかなり楽になり遅延も少ないのでかなり良い買い物をしたなと感じています。

無線のイメージといえば遅延が大きくそういった速度が要求されているものでは使えないと思っておりましたが考えを改めました。

今使っているマウス、キーボード等も余裕があれば無線にしてすっきりさせたいですね。
よく考えないと結局充電ケーブルでごちゃごちゃしそうですが。

Xamarin.Formsを使用してWindowsデスクトップアプリ開発

モバイル用のクロスプラットフォームUIツールキットのXamarin.Formsですが、Windowsデスクトップアプリにも使えるようになるそうです。今後使うかも知れないのでとりあえずメモ。

https://qiita.com/tan-y/items/cf5088c6853ebb1b6c64
https://qiita.com/tan-y/items/e08d297c2d013214eb83

冬の電気自動車

福井県の国道8号線で大雪による3日間の立ち往生が発生しました。
こんな時に電気自動車はどうなるでしょうか?
急速充電さえ可能ならば一酸化炭素中毒の危険性が減って安全なのですが。
ドイツは2040年までに内燃機関のクルマを無くす計画です。
あと22年の間に夢のような電池が開発されることを期待します。