tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルForm1から起動すると動作しなくなる
記事No11318
投稿日: 2014/09/18(Thu) 11:10
投稿者aMa
-------------------------------------------------------
以下、Form1.vb
Public Class Form1
・・・
End Class
-------------------------------------------------------
以下、Form2.vb*
Public Class Form2
・・・
End Class
<PermissionSet(SecurityAction.Demand, Name:="FullTrust")> _
<System.Runtime.InteropServices.ComVisibleAttribute(True)> _
Public Class ExternalGMapObj
    Public Sub MouseClick(ByVal lat As Double, ByVal lng As Double)
        MsgBox("Googlemap" & vbCrLf & _
        "緯度:" & Format(lat, "###.######").ToString & vbCrLf & _
        "経度:" & Format(lng, "###.######").ToString, MsgBoxStyle.OkOnly, _
        "取得先GoogleMap")
    End Sub
    Public Sub MouseMove(ByVal lat As Double, ByVal lng As Double)
        Form2.ToolStripStatusLabel2.Text = Format(lat, "###.######").ToString
        Form2.ToolStripStatusLabel4.Text = Format(lng, "###.######").ToString
    End Sub
End Class
--------------------------------------------------------

Form2単独では動作する
Form2をForm1から起動する様にした場合、MouseMove内の2行の**.Textで次のエラーとなる
      「非共有メンバーを参照するには、オブジェクト参照が必要です。」
Form2をForm1から起動する様にした場合でも、MouseClickは動作する
Form2をForm1から起動する様にした場合でも、MouseMoveにMsgBoxを配置でMsgBoxは動作する
非共有/参照エラーではなく、Delegate/Invokeが必要なのではないかと思う

VB経験3ヶ月です。Windows8.1、MicrosoftVisualBasic2010Expressを使用しています。
動作しなくなる原因、その解決策を教えて頂きたく、よろしくお願い致します。

[ツリー表示へ]
タイトルRe: Form1から起動すると動作しなくなる
記事No11319
投稿日: 2014/09/18(Thu) 19:16
投稿者魔界の仮面弁士
「Form2.ToolStripStatusLabel4.Text」などの書き方は避けましょう。

フォームというのは、
 Dim a As New Form2()
 Dim b As New Form2()
 a.Show()
 b.Show()
などと書けば、Form2 を 2つ起動できたりしますので、
インスタンスを意識してコーディングすべきです。


たとえば ExternalGMapObj クラスを
 Private _fm As Form2
 Public Sub New(fm As Form2)
  _fm = fm
 End Sub
 Public Sub MouseMove(ByVal lat As Double, ByVal lng As Double)
  _fm.ToolStripStatusLabel2.Text = Format(lat, "###.######").ToString()
  _fm.ToolStripStatusLabel4.Text = Format(lng, "###.######").ToString()
 End Sub
のような表現にしておけば、Form インスタンスの取り違いを防げます。

[ツリー表示へ]
タイトルRe^2: Form1から起動すると動作しなくなる
記事No11320
投稿日: 2014/09/19(Fri) 11:08
投稿者aMa
ありがとうございます。
アドバイスして頂いた様に記述してみました。結果、
Public Class Form2中の
Private Sub ToolStripButton1_Click(ByVal・・・中の
WebBrowser1.ObjectForScripting = New ExternalGMapObj中の
New ExternalGMapObjが波線になり、引数エラーになってしまいました。
ごまかして動作させるとスクリプトエラーになってしまいます。
そもそも、Form2単体では動作OKなのにForm1からForm2を起動する様にすると、
エラーではなくForm2のMouseMoveが動作しなくなる原因、メカニズムが理解できません。
よろしくお願いいたします。

[ツリー表示へ]
タイトルRe^3: Form1から起動すると動作しなくなる
記事No11321
投稿日: 2014/09/19(Fri) 11:21
投稿者魔界の仮面弁士
> WebBrowser1.ObjectForScripting =
これも同様に、「どのフォーム上に貼った WebBrowser1 なのか」を明示するため、
何某.WebBrowser1.ObjectForScripting とする必要があります。


Form2 が、Form2 自身の上に配置された WebBrowser1 を操作するなら、
Me.WebBrowser1.ObjectForScripting = もしくは
WebBrowser1.ObjectForScripting = で良いのですが、
それ以外のフォーム上の WebBrowser なのだとしたら、
どのフォームなのかを明示しなければならないということです。


ただし通常は、他のフォーム上のコントロールを直接操作するべきではありません。
自フォーム上のコントロールのみを操作する形となるよう、コードを見直していきましょう。

[ツリー表示へ]
タイトルRe^4: Form1から起動すると動作しなくなる
記事No11322
投稿日: 2014/09/19(Fri) 14:24
投稿者aMa
ToolStripStatusLabelおよびWebBrowserはForm2に配置しています。
クラスが2個の時は迷わずに相手だとできたのが、クラスが3個になって迷ってしまうと言う感じですか。。
構成を考え直して見たいと思います。

[ツリー表示へ]