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

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

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

Re[8]: AddHandler先からのコントロール操作


(過去ログ 26 を表示中)

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

■12217 / inTopicNo.1)  AddHandler先からのコントロール操作
  
□投稿者/ ゆすけ (1回)-(2008/01/05(Sat) 10:29:32)

分類:[VB.NET/VB2005] 

これは三日前に別のところで投稿したんですが恐らく放置です・・・

外部スレッドからの操作というジャンルだと思うのですがサンプルを見ても良くわかりませんでした
下のソースでコントロール操作をするにはどのようにすればいいのでしょうか?
よろしくお願いしますm(_ _)m

標準モジュールで表示中のForm1.Lavelを操作しようとしています

Public Sub コマンド実行の確認()
DOS_KILL = 0
  Form3.GroupBox3.Visible = True
  hProcess = System.Diagnostics.Process.Start((System.AppDomain.CurrentDomain.BaseDirectory) & "\CPU monitor\Batch folder\000.bat")
  hProcess.EnableRaisingEvents = True
  AddHandler hProcess.Exited, AddressOf DOS_Exited
End Sub

Private Sub DOS_Exited(ByVal sender As Object, ByVal e As System.EventArgs)
  Form1.Label1.Visible = False ←これがうまくいきません
End Sub

環境
VB.NET 2008 EE
Windows XP HOME

引用返信 編集キー/
■12218 / inTopicNo.2)  Re[1]: AddHandler先からのコントロール操作
□投稿者/ επιστημη (763回)-(2008/01/05(Sat) 11:00:50)
επιστημη さんの Web サイト
> Form1.Label1.Visible = False ←これがうまくいきません

なにが/どのように"うまくいきません"なのですか?
状況説明を端折ったら答えに窮するでしょうが。

引用返信 編集キー/
■12221 / inTopicNo.3)  Re[2]: AddHandler先からのコントロール操作
□投稿者/ ゆすけ (2回)-(2008/01/05(Sat) 12:20:18)
No12218 (επιστημη さん) に返信
>> Form1.Label1.Visible = False ←これがうまくいきません
>
> なにが/どのように"うまくいきません"なのですか?
> 状況説明を端折ったら答えに窮するでしょうが。
>

すいません、説明したつもりで居ました、説明しなおします

なにが:フォーム1ラベルが
どのようにうまくいきません:非表示になりません

フォーム1のラベルを非表示にさせたいので

Private Sub DOS_Exited(ByVal sender As Object, ByVal e As System.EventArgs)
Form1.Label1.Visible = False ←これがうまくいきません
End Sub

このように書いたんですが、コードが通ってるにも関わらず非表示にされません
非表示にさせるにはどのように書き直したらいいのでしょうか?

このコードは標準モジュールで書かれていて
((System.AppDomain.CurrentDomain.BaseDirectory) & "\CPU monitor\Batch folder\000.bat")
が終了したことを感知すると「DOS_Exited」へ飛んでラベルを非表示にさせるようにしたいのです
実際実行したところ「DOS_Exited」の「Form1.Label1.Visible = False」を通るのですが
非表示にできていません
エラーも発生はしません
引用返信 編集キー/
■12223 / inTopicNo.4)  Re[3]: AddHandler先からのコントロール操作
□投稿者/ ダッチ (176回)-(2008/01/05(Sat) 12:41:14)
> Private Sub DOS_Exited(ByVal sender As Object, ByVal e As System.EventArgs)
>     Form1.Label1.Visible = False ←これがうまくいきません
> End Sub
ここの Form1 は表示している Form1 と別インスタンスの Form1 かもしれません。
VB2005 から既定のインスタンスという機能が備わっています。
このせいでフォームのクラス名を直接書いた場合に、勝手にインスタンス化されてしまいます。

どのようにして Form1 のインスタンスを生成して、表示したかが記載されていませんのでわかりませんが、
My.Forms.Form1 の Label1 に対して非表示にすればうまくいくのではないでしょうか。

うまくいかない可能性が高いので、(たぶんダメ)
その場合は表示している Form1 のインスタンスに対して Label1 を非表示にしていください。

My.Forms についてはこちらを参照してください。
    My.Forms オブジェクト
    http://msdn2.microsoft.com/ja-jp/library/87y2hdsf.aspx

引用返信 編集キー/
■12225 / inTopicNo.5)  Re[4]: AddHandler先からのコントロール操作
□投稿者/ ゆすけ (3回)-(2008/01/05(Sat) 14:15:29)
No12223 (ダッチ さん) に返信
> > Private Sub DOS_Exited(ByVal sender As Object, ByVal e As System.EventArgs)
>> Form1.Label1.Visible = False ←これがうまくいきません
>>End Sub
> ここの Form1 は表示している Form1 と別インスタンスの Form1 かもしれません。
> VB2005 から既定のインスタンスという機能が備わっています。
> このせいでフォームのクラス名を直接書いた場合に、勝手にインスタンス化されてしまいます。
>
> どのようにして Form1 のインスタンスを生成して、表示したかが記載されていませんのでわかりませんが、
> My.Forms.Form1 の Label1 に対して非表示にすればうまくいくのではないでしょうか。
>
> うまくいかない可能性が高いので、(たぶんダメ)
> その場合は表示している Form1 のインスタンスに対して Label1 を非表示にしていください。
>
> My.Forms についてはこちらを参照してください。
> My.Forms オブジェクト
> http://msdn2.microsoft.com/ja-jp/library/87y2hdsf.aspx
>
返信ありがとうございました!
フォームの追加方法なんですが「新しいプロジェクト」で最初に作成されるフォームを利用しています
上の通りに「My.Forms.Form1.Label1.Visible=False」ではうまくいきませんでした
今「インスタンス」について勉強しています、少し時間がかかりますがよろしくお願いします
引用返信 編集キー/
■12226 / inTopicNo.6)  Re[5]: AddHandler先からのコントロール操作
□投稿者/ ダッチ (177回)-(2008/01/05(Sat) 15:03:47)
> AddHandler hProcess.Exited, AddressOf DOS_Exited
この部分を完全に無視していました。(すみません)

Exited イベントは非同期(別スレッド)で通知されるため、
My.Forms.Form1 の Label1 に対して非表示にしても、
意図した動きになりません。

コントロールにアクセスするためには、
そのコントロールを作成したスレッドからアクセスしなければいけない、という決まりがあります。
今回の場合は Form1 を作成したスレッドと DOS_Exited メソッドが動作しているスレッドが別なため、
表示されている Form1 の Label1 にアクセスできていません。

コントロールを作成したスレッドからコントロールにアクセスするためには
Control.Invoke メソッドを使用します。

    Control.Invoke メソッド (Delegate)
    http://msdn2.microsoft.com/ja-jp/library/zyzhdc6b.aspx

次のようにすれば Label1 は非表示になると思います。

モジュールのコード-------

	Private uiControl  As Control
	
	Public Sub コマンド実行の確認(c As Control)
	    uiControl = c
	    DOS_KILL = 0
        Form3.GroupBox3.Visible = True
        hProcess = System.Diagnostics.Process.Start((System.AppDomain.CurrentDomain.BaseDirectory) & "\CPU monitor\Batch folder\000.bat")
        hProcess.EnableRaisingEvents = True
	    AddHandler hProcess.Exited, AddressOf DOS_Exited
	End Sub

    Private Sub DOS_Exited(ByVal sender As Object, ByVal e As System.EventArgs)
        uiControl.Invoke(New MethodInvoker(AddressOf Invokeから呼ばれるメソッド))
    End Sub

    Private Sub Invokeから呼ばれるメソッド()
        Form1.Label1.Visible = False
    End Sub

-------

Invoke メソッドを使用するためのコントロールを
「コマンド実行の確認」関数の引数で受け取っています。
そのコントロールの Invoke メソッドから「Invokeから呼ばれるメソッド」関数を呼んでいます。
こうすることで「Invokeから呼ばれるメソッド」関数は
uiControl が作成されたコントロールのスレッドから呼び出すことができます。

もし、別スレッドでなければ My.Forms.Form1 で最初に表示されているフォームにアクセス可能です。
My.Forms を付けるか付けないかは関係ありません。

引用返信 編集キー/
■12227 / inTopicNo.7)  Re[6]: AddHandler先からのコントロール操作
□投稿者/ ゆすけ (4回)-(2008/01/05(Sat) 15:43:41)
>
> Exited イベントは非同期(別スレッド)で通知されるため、
> My.Forms.Form1 の Label1 に対して非表示にしても、
> 意図した動きになりません。
>
> コントロールにアクセスするためには、
> そのコントロールを作成したスレッドからアクセスしなければいけない、という決まりがあります。
> 今回の場合は Form1 を作成したスレッドと DOS_Exited メソッドが動作しているスレッドが別なため、
> 表示されている Form1 の Label1 にアクセスできていません。
>
> コントロールを作成したスレッドからコントロールにアクセスするためには
> Control.Invoke メソッドを使用します。
>
> Control.Invoke メソッド (Delegate)
> http://msdn2.microsoft.com/ja-jp/library/zyzhdc6b.aspx
>
> 次のようにすれば Label1 は非表示になると思います。
>
> モジュールのコード-------
>
> Private uiControl As Control
>
> Public Sub コマンド実行の確認(c As Control)
> uiControl = c
> DOS_KILL = 0
> Form3.GroupBox3.Visible = True
> hProcess = System.Diagnostics.Process.Start((System.AppDomain.CurrentDomain.BaseDirectory) & "\CPU monitor\Batch folder\000.bat")
> hProcess.EnableRaisingEvents = True
> AddHandler hProcess.Exited, AddressOf DOS_Exited
> End Sub
>
> Private Sub DOS_Exited(ByVal sender As Object, ByVal e As System.EventArgs)
> uiControl.Invoke(New MethodInvoker(AddressOf Invokeから呼ばれるメソッド))
> End Sub
>
> Private Sub Invokeから呼ばれるメソッド()
> Form1.Label1.Visible = False
> End Sub
>
> -------
>
> Invoke メソッドを使用するためのコントロールを
> 「コマンド実行の確認」関数の引数で受け取っています。
> そのコントロールの Invoke メソッドから「Invokeから呼ばれるメソッド」関数を呼んでいます。
> こうすることで「Invokeから呼ばれるメソッド」関数は
> uiControl が作成されたコントロールのスレッドから呼び出すことができます。
>
> もし、別スレッドでなければ My.Forms.Form1 で最初に表示されているフォームにアクセス可能です。
> My.Forms を付けるか付けないかは関係ありません。

すいません、いままでCall~~で呼ぶことしかしなかったので「Public Sub コマンド実行の確認(c As Control)
」の呼び方がわかりません、
色々試しましたがダメでした、どのように呼び出すのでしょうか?
引用返信 編集キー/
■12229 / inTopicNo.8)  Re[7]: AddHandler先からのコントロール操作
□投稿者/ ダッチ (178回)-(2008/01/05(Sat) 16:16:17)
> すいません、いままでCall~~で呼ぶことしかしなかったので「Public Sub コマンド実行の確認(c As Control)
> 」の呼び方がわかりません、
> 色々試しましたがダメでした、どのように呼び出すのでしょうか?

引数という言葉は聞いたことはありますか。
Process.Start メソッドに渡しているファイルパスも引数です。
ここら辺は入門書などで勉強された方がいいと思います。
お勧めの本などはわかりません。

引数を指定した呼び方ですが () の中に引数を指定します。
お好きな呼び出し方で呼んでください。お勧めは一番目です。

    Module1.コマンド実行の確認(My.Forms.Form1.Label1)
    Call コマンド実行の確認(My.Forms.Form1.Label1)
    コマンド実行の確認(My.Forms.Form1.Label1)

本当に入門書などを読んで学ぶことをお勧めします。
その方が早く確実に身に付けることが出来ると思います。
そしてその中でわからないことがあれば、
Web 検索するなり、質問するなりすればいいと思います。

引用返信 編集キー/
■12230 / inTopicNo.9)  Re[8]: AddHandler先からのコントロール操作
□投稿者/ ゆすけ (5回)-(2008/01/05(Sat) 16:19:03)
> 引数という言葉は聞いたことはありますか。
> Process.Start メソッドに渡しているファイルパスも引数です。
> ここら辺は入門書などで勉強された方がいいと思います。
> お勧めの本などはわかりません。
>
> 引数を指定した呼び方ですが () の中に引数を指定します。
> お好きな呼び出し方で呼んでください。お勧めは一番目です。
>
> Module1.コマンド実行の確認(My.Forms.Form1.Label1)
> Call コマンド実行の確認(My.Forms.Form1.Label1)
> コマンド実行の確認(My.Forms.Form1.Label1)
>
> 本当に入門書などを読んで学ぶことをお勧めします。
> その方が早く確実に身に付けることが出来ると思います。
> そしてその中でわからないことがあれば、
> Web 検索するなり、質問するなりすればいいと思います。

いつも丁寧にありがとうございます
これから大学でその進路に向かうのでそろそろ本を読むべきだと思っています
またお世話になるかもしれませんがそのときもよろしくお願いしますm(_ _)m
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -