Assertion Failed! -11ページ目

[C#]モーダルダイアログとモードレスダイアログ

モーダルダイアログとモードレスダイアログ



Assertion Failed!-ダイアログ


[環境]

VisualStudio2008

C# Windowsフォームアプリケーション


マイクロアドBTパートナーはブログやサイトに貼るだけ。お小遣いをゲットしよう!


2つのフォーム(Form1、Form2)を用意し、一方(今回はForm2)をモーダルまたは

モードレスダイアログとして表示する。


[Form1側]

public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
  }


  /// <summary>
  /// モーダルダイアログ
  /// </summary>
  private void button1_Click(object sender, EventArgs e)
  {
    using (Form2 dlg = new Form2("モーダル"))
    {
      dlg.ShowDialog(this);
    }
  }


  /// <summary>
  /// モードレスダイアログ
  /// </summary>
  private void button2_Click(object sender, EventArgs e)
  {
    Form2 dlg = new Form2("モードレス");

    dlg.Show(this);
  }
}


[Form2側]

public partial class Form2 : Form
{
  public Form2(string str)
  {
    InitializeComponent();
    label1.Text = str;
  }
}


モーダルとして表示するときは「ShowDialog()」、モードレスとして表示するときは

「Show()」メソッドを使用する。


各々のメソッドに「this」を渡しているのは、Form1がForm2のオーナーである

ことを意味するため。

これにより、Form2がForm1より下に表示されることがなくなる。

(特にモードレスの際)


注意すべき点は、FormクラスがIDisposableを実装しているということ。

モードレスダイアログを何回も起動してDisposeを行わないと、そのうちメモリがなくなる。

[C#]多重起動の抑止

多重起動を抑止する


[環境]

VisualStudio2008

C# Windowsフォームアプリケーション


マイクロアドBTパートナーはブログやサイトに貼るだけ。お小遣いをゲットしよう!

Program.cs の最初に以下のようなコードを書く。


static class Program
{
  /// <summary>
  /// アプリケーションのメイン エントリ ポイントです。
  /// </summary>
  [STAThread]
  static void Main()
  {
    if (IsAlreadyStarted()) return;


    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
  }


  /// <summary>
  /// 多重起動制御
  /// </summary>
  /// <returns>true:起動中/false:起動していない</returns>

  static private bool IsAlreadyStarted()
  {
    string thisProcess = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
    if (System.Diagnostics.Process.GetProcessesByName(thisProcess).Length > 1)
    {
      return true;
    }
    return false;
  }
}


[C#]ファイルドロップ起動

アプリケーションのアイコンにファイルをドラッグして起動する



Assertion Failed!-ファイルドロップ起動

[環境]

VisualStudio2008

C# Windowsフォームアプリケーション



マイクロアドBTパートナーはブログやサイトに貼るだけ。お小遣いをゲットしよう!


ファイルをドロップすることで、ドロップしたファイルをアプリへの引数として

渡すことができる。


上記イメージは、test.exeに対してtest.pdbをドロップさせ、起動したもの。


起動したフォームにはコマンド引数を表示させている。



public partial class Form1 : Form
{
  private string[] _cmd = System.Environment.GetCommandLineArgs();


  public Form1()
  {
    InitializeComponent();
  }


  private void Form1_Paint(object sender, PaintEventArgs e)
  {
    using (Brush br = new SolidBrush(Color.Black))
    {
      e.Graphics.DrawString(_cmd[0], Font, br, 0, 0);

      try
      {
        e.Graphics.DrawString(_cmd[1], Font, br, 0, 10);
      }
      catch (IndexOutOfRangeException)
      {
      }
    }
  }
}



[C#]スクリーンサイズの取得

スクリーンサイズを取得する


Assertion Failed!-スクリーンサイズ


[環境]

VisualStudio2008

C# Windowsフォームアプリケーション



マイクロアドBTパートナーはブログやサイトに貼るだけ。お小遣いをゲットしよう!


スクリーンサイズを取得し、フォームに表示してみた。


private void Form1_Paint(object sender, PaintEventArgs e)
{
  Rectangle screen = Screen.PrimaryScreen.Bounds;

  using (Brush br = new SolidBrush(Color.Black))
  {
    e.Graphics.DrawString(screen.Width.ToString(), Font, br, 0, 0);
    e.Graphics.DrawString(screen.Height.ToString(), Font, br, 0, 10);
  }
}


[C#]MenuStripドロップダウンアイテムのチェック切り替え

MenuStrip内のリストのチェック状態を切り替える


[環境]

VisualStudio2008

C# Windowsフォームアプリケーション


Assertion Failed!-menuStrip


上記のように、「テスト」メニューが「テスト1」をもち、その「テスト1」がさらに

「サブアイテムX」の3つのアイテムをもっているとき、チェック状態を排他的に

切り替える(ラジオボタンのように扱う)方法。


各アイテムがクリックされたときに、全てのサブアイテムにたいして

Checkedプロパティをtrue/falseで切り替えるのは美しくないので

メソッドにまとめる。


そんなことするヤツいねーよと言われるかも知れないが、コレを調べだすまでは

上記の方法でやっていた。

実現したときはちょっとした感動。つか、Frameworkで対応しろよ。


マイクロアドBTパートナーはブログやサイトに貼るだけ。お小遣いをゲットしよう!


[デザイナ]

テスト1

 Name:_menuTest1


サブアイテム1

 Name:_menuSub1


サブアイテム2

 Name:_menuSub2

 CheckOnClick:true


サブアイテム3

 Name:_menuSub3


[コード]

_menuSub1/2/3 の 「Click」クリックイベントハンドラと、それらを排他的に切り替える

メソッド、「SelectCheckedItem(適当な名前)」を用意する。



/// サブアイテム1Clickイベントハンドラ

private void _menuSub1_Click(object sender, EventArgs e)
{

  SelectCheckedItem(sender);

}


/// サブアイテム2Clickイベントハンドラ

private void _menuSub2_Click(object sender, EventArgs e)
{

  SelectCheckedItem(sender);

}


/// サブアイテム3Clickイベントハンドラ

private void _menuSub3_Click(object sender, EventArgs e)
{

  SelectCheckedItem(sender);

}


/// チェック状態切り替え

private void SelectCheckedItem(object sender)

{

  foreach (ToolStripMenuItem item in _menuTest1.DropDownItems)
  {
    if (item.Equals(sender))
    {
      item.Checked = true;
    }
    else
    {
      item.Checked = false;
    }
  }

}


サブアイテムを3つもつ、親のToolStripMenuItemである_menuTest1がもつ

プロパティ、DropDownItemsforeachでまわして、チェックされたオブジェクトと

等しかったらチェックを有効にしている。