iPad専用アクションゲーム「スライムは投げる」

最近のエントリー

耳コピドリル本が出ました!
シーケンサとしてDominoが使われています。
耳コピがよくわからないという方は手に取ってみてください。

パソコンで学ぶ かんたん耳コピドリル(CD-ROMつき)
http://www.ymm.co.jp/p/detail.php?code=GTB01086758

Activityを切り替えずに、動的にListViewを作ったり消したりしていると、ガベージコレクションを何度実行しても回収されず、何故かメモリリークっぽい事になります。

以下再現ソースです。
続きを読む…

知り合いがお花教室の手伝いをやっていまして、一般向けに体験教室をやるそうです。
受講者募集中とのことで、浜松近辺で興味のある方は是非ご参加ください。

お問い合わせ方法ですが、お手数ですが私に一度メールを送って下さい。
(折り返し担当からご連絡させていただきます。)
メールはこのサイトの一番下の「お問い合わせ」をクリックすると送ることができます。

(クリックで拡大)

(クリックで拡大)

なんて書いたは良いですが、うちのサイト見ている人で浜松周辺かつお花に興味が有る方っていらっしゃるかなあ(^^;

カスタムコントロールを作ってデザイナへ貼り付けても、InitializeComponent()内でnewされず、実行するとエラーになるケースが頻発しました。

これどうやら、カスタムコントロールのコンストラクタがpublicでないと起こるみたいです。
http://stackoverflow.com/questions/5684784/custom-user-control-not-initialized-in-auto-generated-code

interfaceの実装もpublic固定ですし、デザイナで表示させるプロパティもpublicである必要がありますし(うろ覚え)、データバインディングを行わせるためのプロパティもpublicでないといけません。

外部に公開する気は無いのでinternalをよく使っているのですが、結構こういう制限があって統一しきれないのが残念です。

MFCどっぷり時代からC#のWinFormsをいじりだして半年ぐらい経った気がしますが、ラジオボタンの上手な使い方がどこを調べてもいまいち解りませんでした。

MFCならラジオボタンのどこにチェックが入っているかインデックス値を取得・設定出来るのですが、WinFormsはその辺のサポート機能が一切無いんですよね。
コンボボックスならデータバインディング等も使えていろんなサイトでも紹介されているのですが、ラジオボタンの記事はほとんど見かけた事がありません。

いろいろ試した結果、なんとか着地できたようなので、晒してみたいと思います。

まず、MFCと違い、WinFomrsでは「ラジオボタンのグループ化=どっかのコンテナにまとめて乗せる」というのが大前提です。
(これ最初は違和感有ったのですが。)

逆に言えば、コンテナに対してラジオボタンの便利関数を実装出来れば良さそうです。
C#は拡張メソッドが使えますから、以下のような関数を実装してみました。

/// <summary>
/// ラジオボタンを抽出
/// </summary>
/// <param name="parent"></param>
/// <returns></returns>
internal static IEnumerable<RadioButton> GetRadioButtons(this Control parent)
{
    return parent.Controls.Cast<Control>().Select(x => x as RadioButton).Where(x => x != null);
}

/// <summary>
/// Tagを元にラジオボタンにチェックを入れる
/// </summary>
/// <param name="parent"></param>
/// <param name="tag"></param>
internal static void CheckRadioButtonByTag(this Control parent, object tag)
{
    foreach (var radio in parent.GetRadioButtons())
    {
        if (radio.Tag.Equals(tag))
        {
            radio.Checked = true;
            break;
        }
    }
}

/// <summary>
/// チェックが入ったラジオボタンのタグを取得する
/// </summary>
/// <param name="parent"></param>
/// <returns></returns>
internal static object GetCheckedRadioButtonTag(this Control parent)
{
    foreach (var radio in parent.GetRadioButtons())
    {
        if (radio.Checked)
        {
            return radio.Tag;
        }
    }
    return null;
}

/// <summary>
/// ラジオボタンのチェックイベントを設定
/// </summary>
/// <param name="parent"></param>
/// <param name="action"></param>
internal static void SetRadioButtonCheckedEvent(this Control parent, Action<RadioButton> action)
{
    foreach (var radio in parent.GetRadioButtons())
    {
        radio.CheckedChanged += (sender, _) =>
        {
            RadioButton r = (RadioButton)sender;
            if (r.Checked)
            {
                action(r);
            }
        };
    }
}

あとはFormのLoadイベント辺りで

sizeB5RadioButton.Tag = PaperKind.B5;
sizeA4RadioButton.Tag = PaperKind.A4;
sizeB4RadioButton.Tag = PaperKind.B4;
sizeA3RadioButton.Tag = PaperKind.A3;
sizeGroupBox.CheckRadioButtonByTag([デフォルトの用紙サイズ]);
sizeGroupBox.SetRadioButtonCheckedEvent(radio => [ラジオボタンにチェックが入った時の処理]);

などと呼べば、良いかと思います。
この例は、フォーム上のグループボックスに用紙サイズのラジオボタンがいくつか並んでいるものです。

ラジオボタンのTagにコードであらかじめEnum値などを入れておき、それをやりくりするのがミソです(Enumで無くとも数値でも文字列でも何でも良いのですが)。
イベントに関してもデザイナで一つ一つに割り当てるのは面倒くさいので、コードで一気にやってしまいます。

後からチェックの入った情報を取り出したい時は

(PaperKind)sizeGroupBox.GetCheckedRadioButtonTag()

などとすれば良いです。

タイプセーフ的にあんまりなコードですが、いちいちフォームでラジオボタンのチェックプロパティを見に行ってチェックされていたら云々、と書くよりは良いと思うのですがどうでしょうかね。

ラジオボタンの定石をご存知の片がいらっしゃいましたら、こっそり教えてもらえると助かりますm(_ _)m

記事検索

コミュニティ

Banner designed by gebo様
ドット絵掲示板
ドット絵掲示板
自作の「ドット絵」を投稿することができます。ドッターさん同士の交流の場としてご利用ください。
TakaboSoft Wiki
TakaboSoft Wiki
ソフトウェアに関する質問・不具合報告・要望などを書き込むことができます。