C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: CE MessageWindowを実装したFormの継承


(過去ログ 82 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■48249 / inTopicNo.1)  CE MessageWindowを実装したFormの継承
  
□投稿者/ うげん (1回)-(2010/03/30(Tue) 18:33:14)

分類:[.NET 全般] 

はじめまして。

以下環境で開発しています。
VB.NET 2008 + .NET Compact Framework 3.5 + WindowsCE 6.0

MessageWindowクラスを使用するフォームを基底フォームとして
継承したフォームを作る事が出来ずに困っています。
ネット上を検索してもなかなか有用な情報にたどり着けず質問させて頂きました。

以下、テスト用のサンプルソースになります。
------------------------------------------
Imports Microsoft.WindowsCE.Forms

Public Class Form1
    Private msgWin As MsgWindow = Nothing

    Public Sub New()
        ' この呼び出しは、Windows フォーム デザイナで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        Me.msgWin = New MsgWindow(Me)
    End Sub

End Class

Public Class MsgWindow
    Inherits MessageWindow

    Private msgform As Form

    Public Sub New(ByVal msgform As Form)
        Me.msgform = msgform
    End Sub

    Protected Overrides Sub WndProc(ByRef msg As Microsoft.WindowsCE.Forms.Message)

        MyBase.WndProc(msg)
    End Sub
End Class
------------------------------------------

上記ソースをコンパイルし、Form1を親にして継承されたフォームを追加しようとしても
以下メッセージがVS2008で表示されForm1が表示されません。
---------------------------
アセンブリの読み込みエラー
---------------------------
アセンブリ 'C:\PDATest\SmartDeviceProject1\SmartDeviceProject1\obj\Debug\SmartDeviceProject1.exe' を読み込めません。ファイルが有効な .Net Framework アセンブリであることを確認してください。
---------------------------
OK   
---------------------------

MsgWindowクラスをなくすと継承が出来ます。
継承出来る場合のソース(Imports以外は何もないだけです)
------------------------------------------
Imports Microsoft.WindowsCE.Forms

Public Class Form1

    Public Sub New()
        ' この呼び出しは、Windows フォーム デザイナで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
    End Sub

End Class
------------------------------------------

上記で作成されたフォームをForm2とします。
Form1のソースを元に戻してコンパイル。Form2をVS2008上でデザイン表示すると
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」と
いったエラーが表示されます。(Null参照?)

その後、クラスダイアグラムのフォームに属性:DesktopCompatible(true)を
追加してみたりしましたが結果は変わりませんでした。

何か対策があれば教えて下さい。

引用返信 編集キー/
■48253 / inTopicNo.2)  Re[1]: CE MessageWindowを実装したFormの継承
□投稿者/ 魔界の仮面弁士 (1585回)-(2010/03/30(Tue) 22:23:09)
No48249 (うげん さん) に返信
> 何か対策があれば教えて下さい。

解決策は分かりませんが、開発環境の制限なのでは無いでしょうか。

http://msdn.microsoft.com/ja-jp/library/ms228851%28VS.80%29.aspx
上記を見ると、ベースクラスに Microsoft.WindowsCE.Forms.dll が
利用されていると、Visual Studio のフォームデザイナのサポートが
受けられなくなるように読み取れます。


試しに、.NET Compact Framework 3.5.7283 環境で以下のコードを試してみました。

'Form1.vb
Partial Public Class Form1
 Private Sub Button1_Click() Handles Button1.Click
  Dim test As Object = Nothing
  MessageBox.Show(CStr(test Is Nothing))
End Sub
Private Sub Button2_Click() Handles Button2.Click
 Dim test As Microsoft.WindowsCE.Forms.MessageWindow = Nothing
 MessageBox.Show(CStr(test Is Nothing))
End Sub

'Class1.vb
Partial Public Class Class1
 Inherits Form1
End Class


上記のプロジェクトを作成し、一度ビルドしてから、Class1 を
フォームデザイナで開いてみると、デザイナ上に以下のテキストが表示されました。

『基本クラスがデバイス特定コンポーネントを参照しているか、または P/Invoke を含んでいるため、ビジュアル継承は現在無効になっています。』



なお、生成された exe を実行してみると、以下のように動作しました。


"JPN Windows Mobile 5.0 Pocket PC Device R2 Emulator" 上で実行した場合
 → 正常に動作 (各ボタン押下で "True" と表示される)

Microsoft.Windowsce.Forms.dll を配置した Windows XP SP3 で実行した場合
 → 正常に動作 (各ボタン押下で "True" と表示される)

Microsoft.Windowsce.Forms.dll 未配置の Windows XP SP3 で実行した場合 ()
 → Button1 は正常、Button2 押下で System.IO.FileNotFoundException 発生
ファイルまたはアセンブリ 'Microsoft.WindowsCE.Forms, Version=3.5.0.0, Culture=neutral, PublicKeyToken=969db8053d3322ac'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。
引用返信 編集キー/
■48347 / inTopicNo.3)  Re[2]: CE MessageWindowを実装したFormの継承
□投稿者/ うげん (2回)-(2010/04/03(Sat) 10:58:50)
魔界の仮面弁士さん、回答有難うございます。
その後、別作業に入っていたため返信が遅くなってしまいました。

> 『基本クラスがデバイス特定コンポーネントを参照しているか、または P/Invoke を含んでいるため、ビジュアル継承は現在無効になっています。』

上記についてはクラスダイアグラムをプロジェクトに追加し、関連するフォームに属性:DesktopCompatible(true)
を追加することで解消出来る事をこちらで確認しました。

また、ご指摘のようにコンパイルや実行時にはエラーは出ません。
ただ、画面のデザインが出来なくなるのです。

Compact Frameworkでは「Platform/Invoke」でプラットフォーム間の違いを吸収しているのですが
プラットフォーム依存のメソッドを用いる際に警告が出されてしまいます。
(今回は「Microsoft.WindowsCE.Forms」がプラットフォーム依存と言われています。多分・・・)

その後調べていてまだ解決には達していないのですが
「MessageWindow」を継承したクラスが存在することがどうも駄目なようです。
継承先フォームのデザイン時に「MessageWindow」を継承したクラスのインスタンスを生成しようとしているのでしょうか?
魔界の仮面弁士さんのサンプルではボタンイベントの中にあるためフォーム属性:DesktopCompatible(true)
を追加する事で回避出来たと考えています。

現在考えている方法は以下2点です。
・MsgWindowクラスにデザイン時には無視されるような属性を追加して回避出来ないか?
・条件付きコンパイルなどの方法でデザイン時にMsgWindowクラスが無視されるように出来ないか?

他にも何か有用な情報があればどうか宜しくお願い致します。
引用返信 編集キー/
■48971 / inTopicNo.4)  Re[3]: CE MessageWindowを実装したFormの継承
□投稿者/ うげん (3回)-(2010/04/19(Mon) 13:14:16)
当初投稿からだいぶ日が経ってしまいました。
自己レスです。

条件付きコンパイルでリリースビルドの場合のみMessageWindowクラスを利用するようにする事で
とりあえずの解決とします。
(画面デザインする場合は一旦デバッグでビルドしなおす必要があり面倒ですが
 他に回避方法が見当たりませんでした)

以下、対応後のサンプルソースになります。
------------------------------------------
Imports Microsoft.WindowsCE.Forms

Public Class Form1
#If Not Debug Then
    Private msgWin As MsgWindow = Nothing
#End If

    Public Sub New()
        ' この呼び出しは、Windows フォーム デザイナで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
#If Not Debug Then
        Me.msgWin = New MsgWindow(Me)
#End If
    End Sub

End Class

#If Not Debug Then
Public Class MsgWindow
    Inherits MessageWindow

    Private msgform As Form

    Public Sub New(ByVal msgform As Form)
        Me.msgform = msgform
    End Sub

    Protected Overrides Sub WndProc(ByRef msg As Microsoft.WindowsCE.Forms.Message)

        MyBase.WndProc(msg)
    End Sub
End Class
#End If
------------------------------------------

デバッグでビルド後、Form1を継承出来る事を確認しました。

本件、解決済みとさせて頂きます。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -