ChangeLog 最新ページ

カテゴリ[.NET] - てくめも@coop

2007-04-10 Tue

* 別オブジェクトからフォームインスタンスの参照を得るには?[.NET][C#]


.NET Framework 2.0 以降のみですが、System.Windows.Forms.Application クラスの静的プロパティ、 OpenForms により、開いているフォームインスタンスを参照することができます。
 

Form form = Application.OpenForms[0]; // 開いているフォームのうち一番古いものを得る

 

Form form = Application.OpenForms["form1"]; // form1 という名前のフォームインスタンスを得る

 
参考:
- Windowsフォームでフォームのコレクションを使用するには?
- Application.OpenForms プロパティ(MSDN)
- FormCollection クラス



2007-04-10 Tue

* 別スレッドからフォームコントロールを操作するには?[.NET][C#]
VB.NET にも該当することですが、C#.NET では、

using System;
using System.Windows.Forms;
using System.Threading;
 
namespace Foo{
public class Form1 : Form{
    public Form1(){
        InitializeComponent();
    }
 
    private void button1_Click(object sender, EventArgs e){
        new Thread(new ThreadStart(delegate{
textBox1.Text = "Hello, world";
})).Start();
    }

    // その他については略
}
}

としても InvalidOperationException が発生し、

有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'textBox1' がアクセスされました。

のように表示されてしまい、クロススレッドなフォームコントロールの操作ができません。
 
これを回避するには、System.Windows.Forms.Control の Invoke() メソッドを使い、コントロールの操作時のみ、そのコントロールが属するウィンドウハンドルを持つスレッドで実行するようにします。

            // Invoke() 用デリゲート
            private delegate Del();
 
            private void button1_Click(object sender, EventArgs e){
 
                new Thread(new ThreadStart( delegate {
Invoke( (Del) delegate { // 匿名メソッドを Del 型にキャストし, それを呼び出す。
textBox1.Text = "Hello, world"; // コントロールの操作
});
                    })).Start();
            }

あるいは、MSDN の「Windows フォーム コントロールのスレッド セーフな呼び出しを行う」にあるように、

            private void button1_Click(object sender, EventArgs e){

new Thread(new ThreadStart( delegate {
SetText("Hello, world");
})).Start();
}

private delegate void SetTextCallback(string msg);

private void SetText(string msg){
if(textBox1.InvokeRequired){ // 指定したコントロールの操作に Invoke()が必要かどうか(この場合、this.InvokeRequired としてもよい)。

Invoke(new SetTextCallback(SetText), new object[] {msg}); // 必要であれば自身を Invoke する。
return;

}

// 以下本来の処理

textBox1.Text = msg;
}

のように、Control クラスの InvokeRequred プロパティで Invoke が必要かどうかを判別し、必要なら Invoke によりメソッドを呼び直すという方法もあります。
 
どちらを利用する場合も、Invoke() 中はメインスレッドでの実行になるため、マルチスレッド処理の恩恵を受けられません。このため、Invoke() 中のコードでは、コントロールの操作をするために最低限の実装であることが望ましいでしょう。
 
なお、本記事のコードで使用している匿名メソッド( delegate (){ /* */ } というコード)は、.NET Framework 2.0 以降でしか利用できないため、2.0 未満で利用する場合は該当箇所をメソッド定義に置き換えてください。
 
参考:
- System.Windows.Forms.Control.Invoke()
- Windows フォーム コントロールのスレッド セーフな呼び出しを行う(MSDN)
  MSDN ライブラリ -> 開発ツールと言語 -> Visual Studio ドキュメント -> Windows ベースのアプリケーション、コンポーネント、サービス -> Windows ベースのアプリケーションの作成 -> Windows フォーム -> Windows フォームについて -> Windows フォームコントロール -> .NET Framework を使用したカスタム Windows フォームコントロールの開発 -> Windows フォームコントロールのマルチスレッド処理

2007-04-10 Tue

* ComboBox を編集不可能(ReadOnly)にする[C#][.NET]

comboBox1.DropDownStyle = DropDownStyle.DropDownList;
comboBox1.SelectionLength = 0;

のようにすればよい。
参考:
- ComboBoxの文字列が選択状態に(@IT 会議室)
- C# VB ComboBox を読み取り専用(ReadOnly)にする(C#, VB.NET 入門)

2006-12-01 Fri

* C#,VB.NET で使える RSS パーサ[C#][.NET]
- RSS.NET
情報元:
http://blog.windy.ac/2005/07/rssnet_netrss.html

2006-10-15 Sun

* 例外の階層構造[.NET]
- 例外階層(MSDN)
http://msdn2.microsoft.com/ja-jp/library/z4c5tckx.aspx

2006-10-14 Sat

* ウィンドウが非アクティブの時にタスクバーで点滅させる[.NET]
.NET Framework のクラスライブラリではタスクバーでの明滅が提供されていない(Form.Activate() は非アクティブの時呼ぶとウィンドウが再前面になる)ため、Win32API の FlashWindow() を利用します。

using System.Windows.Forms;
using System.Runtime.InteropServices;
 
public class Form1 : Form {
    // 点滅用 Win32API のインポート
    [DllImport("user32.dll")]
    private static extern bool FlashWindow(IntPtr hwnd, bool bInvert);
    public static void FlashWindow(System.Windows.Forms.Form window) {
        FlashWindow(window.Handle, false);
    }
     
    // ウィンドウを点滅させる
    // (ウィンドウがアクティブな時は何もおこらない)
    private void ExecExample(){
        FlashWindow(this);
    }
}

 
参考:
- FlashWindow(user32)(pinvoke.net)
- Win32 APIやDLL関数を呼び出すには?(@IT)

2006-09-12 Tue

2006-01-30 Mon

* VisualStudio.NET でマクロを使ってプラグイン開発をする[.NET]
http://www.microsoft.com/japan/msdn/academic/Articles/fun/06/

2006-01-30 Mon

* VS.NET でソースコードを自動フォーマットする[.NET]
ソースコードの自動フォーマット(Eclipse では Alt-Shift-F )を VisualStudio.NET で行うには次のようにします。

Ctrl-A, Ctrl-X, Ctrl-V

全て選択してカット&ペーストしてるだけだったりします。
ソースコードの一部分だけフォーマットしたい場合は、同様に該当箇所をカット&ペーストで可能です。
 
参考:
- .NET TIPS ソース・コードのインデントを手軽に整えるには?

2006-01-27 Fri

* デバッグ出力用クラス[.NET]

import System.Diagnostics;
// ...
Debug.WriteLine("開始:");
Debug.indent();
Debug.WriteLine("foo");
Debug.WriteLine("boo");
Debug.unindent();
Debug.WriteLine("終了");
// (結果)
// 開始:
// foo
// boo
// 終了

2006-01-14 Sat

* .NET Tips[.NET]
DOBON.NET

2006-01-11 Wed

* .NET Framework クラスライブラリ[.NET]
MSDN の .NET Framework クラスライブラリ
現在は MSDN Japan Home > MSDN Library Japan > .NET Framework > リファレンスとたどると見付けられる。

2005-03-21 Mon

* 逆コンパイル[.NET]
.Net 用の逆アセンブルツールとして Reflector for .NET というフリーソフトがある。C#.NET から VB.NET など言語変換をするのにも役立つ(ただし性質上コメントは失われる)。
 
- Lutz Roeder's Programming.NET
逆コンパイラ以外にも .NET 系のソフトが各種ある。
-@IT: .NET 逆コンパイラとコードを難読化する Dotfuscator
コンパイル済のバイナリを対象に識別子を意味のない文字に置き換えるツールが VS.NET 2003 に標準でついている(Dotfuscator Community Edition).
Dotfuscator Professional ではメソッド単位でコードを暗号化でき, これをつかうと逆コンパイル時に(記事の時点では)例外が起きて解析できなくなるらしい.

ChangeLog 最新ページ

最終更新時間: 2010-07-30 06:15