- PR -

[VB.NET]MDI形式でDLLを呼び出すには

投稿者投稿内容
おすぎ
会議室デビュー日: 2005/02/22
投稿数: 5
投稿日時: 2006-04-04 23:50
MDI形式で子フォームがDLLのWindowsアプリについての質問です。

MDIの親フォームと、DLLで作成した子フォームでデータの受け渡しを行いたいのですがうまくいかず困っています。
同会議室の「C#: MDI子フォームから親フォームへのアクセス方法」を参考に
親フォームでインターフェースをインプリメントして、
子フォームで親インスタンスを型変換するところでエラーが発生します。
開発言語はVB.NETです。
よろしくお願いします。

[親フォーム]
Public Class MainWindow
Inherits System.Windows.Forms.Form
Implements ITest.IFormParent

Private Sub Main()
Dim b As New ChildForm.Form1
b.MdiParent = Me
b.Show()
End Sub
End Class

[子フォーム]
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim a As IFormParent

a = CType(Me.ParentForm, IFormParent) ←ここでエラー

End Sub
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-04-05 00:25
コード:
a = CType(Me.MdiParent, IFormParent)


設定してるものと同じものを使ってください。
_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-05 07:14
引用:

おすぎさんの書き込み (2006-04-04 23:50) より:

MDIの親フォームと、DLLで作成した子フォームでデータの受け渡しを行いたいのですがうまくいかず困っています。


だったら、子から親をどうこうするのは止めたほうが良いですね。
親から自発的に回収させるべきです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
おすぎ
会議室デビュー日: 2005/02/22
投稿数: 5
投稿日時: 2006-04-05 09:39
お返事ありがとうございます。

>>囚人様
>>a = CType(Me.MdiParent, IFormParent)

試してみましたが同じエラーが出ました。

>>設定してるものと同じものを使ってください。

設定しているものとはどこの設定でしょうか?
ここでは親がインプリメントしているインタフェースを
子で取り出して型変換すれば、親からデータを自由にやり取りできると思ったのですが。

>>だったら、子から親をどうこうするのは止めたほうが良いですね。
>>親から自発的に回収させるべきです。

親から回収、とは親に実装しているインタフェースに子から値を保存して、
親からその保存した値を利用するってことですよね?
>>a = CType(Me.ParentForm, IFormParent)
このようにして、親のインスタンスを型変換すれば
インターフェースが利用できると思ったのですが、
考え方が間違ってますでしょうか?

前スレの渋木様が示されてます、「親フォームへのアクセスを確保」の箇所
>>IFormParent parent = (IFormParent) this.Parent;
これをVB.NETで置き換えるのにCTypeで型変換しました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-05 10:40
引用:

おすぎさんの書き込み (2006-04-05 09:39) より:

子フォームで親インスタンスを型変換するところでエラーが発生します。


おそらく、キャストミス系の例外だと思いますが、
キャストミスの場合は、とりあえず GetType メソッドで実際の型を調べるのが基本です。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-04-05 11:02
失敬。

コード:
[子フォーム]
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) 


と書かれていますが、実際は「子フォーム」に書いているイベントハンドラではないのではないですか?
「Me」が一体誰なのか、よく調べてみてください。
_________________
囚人のジレンマな日々
おすぎ
会議室デビュー日: 2005/02/22
投稿数: 5
投稿日時: 2006-04-05 18:41
回答ありがとうございます。

>>a = CType(Me.MdiParent, IFormParent)

Me.MdiParentはGetTypeでみると、BaseTypeは親クラスのフォームでした。
Meは子クラスのフォームでした。
親クラスでインターフェースをインプリメントしているから、
CTypeで変換できると思ったのですが、
もしかしてインターフェースへの型変換はできないのでしょうか?
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-04-05 18:53
いえ、いけます。
ところで、親フォームは子フォームの DLL を参照しているわけですが、IFormParent はどこのアセンブリに定義しているのでしょうか。
親フォームも子フォームも IFormParent を参照していますね。

_________________
囚人のジレンマな日々

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