- PR -

インスタンスの上書き

投稿者投稿内容
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-04-21 18:31
諸農です。

引用:

1.BのOKボタンを押すと、BのNULLチェックが走ります。
  AのOKボタンを押したのと、同じ動きです。

2.フォームを何個作っても、最後に呼び出したフォームのNULLチェックが走ります。
  同じくどのフォームのOKボタンを押しても、最後に呼び出したフォームの
  NULLチェックが走ります。



良く似た意味のコードで試してみましたが、
そのような現象は発生しませんでした。

ただどうしても次のコードが解せないんですよね。。。
なぜメソッドの解決が出来るのだろう。。

引用:

clsStart = clsAssembly.CreateInstance("AAA.clsStart")
Call clsStart.Open(Me)



こちらで試したコードです。
呼び出し側プロジェクトの参照に呼び出されるアセンブリの追加はしていません。

呼び出し側(MDI親)
コード:
    if (openFileDialog1.ShowDialog() == DialogResult.OK){
    Assembly asb = Assembly.LoadFile(openFileDialog1.FileName);
    object obj = asb.CreateInstance("ClassChild.MyClass");
    MethodInfo mi = obj.GetType().GetMethod("Open");
    object[] p = {this};
    mi.Invoke(obj,p);



呼ばれる側(クラスライブラリ)
コード:
using System;
using System.Windows.Forms;

namespace ClassChild
{
    public class MyClass
    {
        public MyClass(){}
        public void Open(Form AForm)
        {
           Form fm = new WinForm();
           fm.MdiParent = AForm;
           fm.Text = DateTime.Now.ToString();
           fm.Show();
        }

    }
}



呼ばれるフォーム(MDI子フォーム)の
ボタンクリックイベントハンドラ
コード:
private void button1_Click(object sender, System.EventArgs e)
{
    MessageBox.Show(textBox1.Text);
}




_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-04-21 19:05
引用:

Jubeiさんの書き込み (2004-04-21 18:31) より:
ただどうしても次のコードが解せないんですよね。。。
なぜメソッドの解決が出来るのだろう。。

引用:

clsStart = clsAssembly.CreateInstance("AAA.clsStart")
Call clsStart.Open(Me)




これは、VB.NETの機能ですね。C#ではできません。

VB.NETでコンパイルする際に
Option Strict Off
という設定になっていると、厳密な型チェックが行われなくなります。
そのため、型を明示的に指定しなくてもメンバを呼び出す機能が必要なんですね。

で、この場合完全な動的バインディングが行われ、実行時にメンバが解決されます。
内部ではリフレクション経由ということになるでしょう。

この機能、タイプライブラリを参照せずに動的バインディングを行いたい場合などには非常に便利(C#だとリフレクションの嵐)なのですが、静的な型チェックができないのは弊害が多すぎます。そのため、私は特殊なとき(まあ、つまりは上記のような場合)にしか使いません。
※幸いファイル単位で設定できるので

通常、自分で作成したライブラリを使用するときなどは、Option Strint On でコーディングすることをお奨めします→元質問者の方。
でないと、原因不明のバグに悩まされる可能性が高まります。
※今回の問題とは特に関係はないと思いますが。

--引用ミスを修正

[ メッセージ編集済み 編集者: なちゃ 編集日時 2004-04-21 19:06 ]
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-04-21 22:45
諸農です。

引用:

なちゃさんの書き込み (2004-04-21 19:05) より:
これは、VB.NETの機能ですね。C#ではできません。



そ、そうなんですか。。
あの手この手で同じようなコーディングが出来ないかと
C#で試しに試しまくったんですが、無理だったんですね。。

私はVB.NET(VBも含めて)のことを全然知らないですし、
コーディングのスタイルもよくわからないので、
(メソッドの引数を指定するのに括弧を使わないとか。。)
自ら進んで触れようとはしていないんです。。
VB派の方、ごめんなさいm(__)m

---編集追加---
なちゃさん、詳しい説明ありがとうございました。
あまりの衝撃に、お礼を書くのを忘れていました(^^;

_________________
諸農和岳
Powered by Borland Delphi/C++Builder & Microsoft VS.NET

[ メッセージ編集済み 編集者: Jubei 編集日時 2004-04-21 22:47 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-04-22 08:52
引用:

KKKさんの書き込み (2004-04-21 14:50) より:



 チェックして色を変える、ところはどうなってます?
KKK
大ベテラン
会議室デビュー日: 2003/10/10
投稿数: 119
投稿日時: 2004-04-22 09:23
引用:

なちゃさんの書き込み (2004-04-21 19:05) より:
引用:

通常、自分で作成したライブラリを使用するときなどは、Option Strint On でコーディングすることをお奨めします→元質問者の方。
でないと、原因不明のバグに悩まされる可能性が高まります。





そうですね。。
本来ならそうするのが筋ですが、今回はメニューを動的に変えたいために
このようなコーディングになっています。
しかも、同じ画面が立ち上がってもよいという仕様なので。

引用:

Jittaさんの書き込み (2004-04-22 08:52) より:
引用:

チェックして色を変える、ところはどうなってます?





普通のチェックしか行っていないですが、簡略化したものを載せておきます。

btnOK_Click イベント

If Me.TextBox1.Text = Nothing Then
Me.TextBox1.BackColor=Color.Red
Else
Me.TextBox1.BackColor=Color.White
End If
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-04-22 09:41
諸農です。

以下は興味本位の疑問ですので、その気になったときにでも試してください。

リフレクションなどを使わずに、該当のDLLアセンブリを参照設定して
フォームの動的生成を行っても同じ現象になりますか?

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-04-22 10:16
ふつうに考えると、イベントハンドラの結びつきがおかしくなっている?と感じられるんですが、普通に作っているとそんなことって起きないですよね…

質問ですが、チェック等のイベントハンドラは、通常のVBのように、ハンドラのメソッドにHandles句で書かれていますか?特に、ハンドラの結び付けをコードで動的にやったりとかはしてないですか?

もう一つ、イベントハンドラが呼ばれた際に、ハンドラのsender引数に入っているコントロールへの参照と、Me.TextBox1(だっけか?要はイベントを発生させているコントロール)に入っている参照が同じか異なるかを確認してみてください。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-04-22 12:07
引用:

KKKさんの書き込み (2004-04-22 09:23) より:

普通のチェックしか行っていないですが、簡略化したものを載せておきます。


 あ、いや、宣言部分が知りたかったのだが・・・Handlesか、AddHandlerか、そこらあたりと。

スキルアップ/キャリアアップ(JOB@IT)