DOBON.NETプログラミング道掲示板

[ 最新記事及び返信フォームをトピックトップへ ]

■34768 / inTopicNo.1)  コンソールではなくテキストボックスに文字列を出力したい
  
□投稿者/ スイカ 一般人(1回)-(2021/06/09(Wed) 13:29:44)
  • アイコン環境/言語:[Windows 10 Pro 64bit/Visual Studio 2019/VB.NET/.NET Framework 4.7.2] 
    分類:[.NET] 

    下記のサンプルで文字列の出力をコンソールではなくて、
    テキストボックスにしたいと思い変更してみましたが、
    テキストボックスには何も表示されずにフォームも移動すらできなくなります。

    免罪符で恐縮ですが、プログラミングを始めてまもなくGoogle検索して調べているのですが、
    お手上げ状態になってしまい質問させていただきました。

    どうかよろしくお願いします。

    【■変更前】
    > Private Shared Sub p_OutputDataReceived(sender As Object, _
    > e As System.Diagnostics.DataReceivedEventArgs)
    > '出力された文字列を表示する
    > Console.WriteLine(e.Data)
    > End Sub

    【■変更後】
    > Private Shared Sub p_OutputDataReceived(sender As Object, _
    > e As System.Diagnostics.DataReceivedEventArgs)
    > '出力された文字列を表示する
    > 'Console.WriteLine(e.Data)
    > '下だとエラー
    > 'TextBox1.Text = e.Data
    > '検索して下記のようにするといいと見つけましたがフォームの移動すらできなくなる
    > Me.Invoke(Sub() Me.TextBox1.Text = e.Data)
    > End Sub

    【■サンプル】
    -DOSコマンドを実行し出力データを取得する
    --出力とエラーの両方を読み取る
    https://dobon.net/vb/dotnet/process/standardoutput.html

    【■サンプル内で実行しているコマンド】
    PINGコマンドのため、結果は1行ずつわずかに時間をおいて返ってきます。
    訂正前:p.StartInfo.Arguments = "/c dir c:\ /w"
     ↓
    訂正後:p.StartInfo.Arguments = "/c ping 192.168.0.1"

    【■環境】
    ・Windows 10 Pro 64bit
    ・Visual Studio 2019
    ・VB.NET
    ・Windows フォーム アプリケーション(.NET Framework)
    ・.NET Framework 4.7.2
マルチポストを報告
違反を報告
引用返信 削除キー/
■34771 / inTopicNo.2)  Re[1]: コンソールではなくテキストボックスに文字列を出力したい
□投稿者/ 魔界の仮面弁士 大御所(1350回)-(2021/06/09(Wed) 14:00:09)
  • アイコンNo34768に返信(スイカさんの記事)
    > 下記のサンプルで文字列の出力をコンソールではなくて、
    > テキストボックスにしたいと思い変更してみましたが、

    No34644 - No34645 あたりでどうでしょう。
    https://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=all&namber=34642

違反を報告
引用返信 削除キー/
■34772 / inTopicNo.3)  Re[2]: コンソールではなくテキストボックスに文字列を出力したい
□投稿者/ スイカ 一般人(2回)-(2021/06/09(Wed) 14:04:42)
  • アイコンNo34771に返信(魔界の仮面弁士さんの記事)
    > ■No34768に返信(スイカさんの記事)
    >>下記のサンプルで文字列の出力をコンソールではなくて、
    >>テキストボックスにしたいと思い変更してみましたが、
    >
    > No34644 - No34645 あたりでどうでしょう。
    > https://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=all&namber=34642
    >
    早速のご返答ありがとうございます。
    何やらすごい難しそうな処理を追加しないといけないんですね。
    よく読んで試してみます。
    結果報告も後ほどします。

違反を報告
引用返信 削除キー/
■34773 / inTopicNo.4)  Re[3]: コンソールではなくテキストボックスに文字列を出力したい
□投稿者/ 魔界の仮面弁士 大御所(1351回)-(2021/06/09(Wed) 14:17:04)
  • アイコンNo34772に返信(スイカさんの記事)
    > 何やらすごい難しそうな処理を追加しないといけないんですね。
    多少煩雑なのは、エラー出力と標準出力を分けて表現しているのが一因。

    No34645 のサンプルで言えば、
     TextBox1.Text = Environment.GetEnvironmentVariable("ComSpec")
     TextBox2.Text = "/c ping 192.168.0.1"
    にした状態で Button1 を押せば、
    結果が黒背景の RichTextBox1 に表示されます。

    通常応答は白文字、エラー応答は赤背景に黄色文字。


    しかし、目的が PING だけなのであれば、
    Ping クラスを使った方が手っ取り早いですよ。

    Using P As New System.Net.NetworkInformation.Ping()
     Dim r = P.Send("www.yahoo.co.jp")
     If r.Status = System.Net.NetworkInformation.IPStatus.Success Then
      TextBox1.Text = $"Reply from {r.Address}:bytes={r.Buffer.Length} time={r.RoundtripTime}ms TTL={r.Options.Ttl}"
     Else
      TextBox1.Text = "失敗: " & r.Status
     End If
    End Using
    https://dobon.net/vb/dotnet/internet/ping.html
違反を報告
引用返信 削除キー/
■34774 / inTopicNo.5)  Re[4]: コンソールではなくテキストボックスに文字列を出力したい
□投稿者/ スイカ 一般人(3回)-(2021/06/09(Wed) 14:40:24)
  • アイコンNo34773に返信(魔界の仮面弁士さんの記事)
    > ■No34772に返信(スイカさんの記事)
    >>何やらすごい難しそうな処理を追加しないといけないんですね。
    > 多少煩雑なのは、エラー出力と標準出力を分けて表現しているのが一因。
    >
    > No34645 のサンプルで言えば、
    >  TextBox1.Text = Environment.GetEnvironmentVariable("ComSpec")
    >  TextBox2.Text = "/c ping 192.168.0.1"
    > にした状態で Button1 を押せば、
    > 結果が黒背景の RichTextBox1 に表示されます。
    >
    > 通常応答は白文字、エラー応答は赤背景に黄色文字。
    >
    >
    > しかし、目的が PING だけなのであれば、
    > Ping クラスを使った方が手っ取り早いですよ。
    >
    > Using P As New System.Net.NetworkInformation.Ping()
    >  Dim r = P.Send("www.yahoo.co.jp")
    >  If r.Status = System.Net.NetworkInformation.IPStatus.Success Then
    >   TextBox1.Text = $"Reply from {r.Address}:bytes={r.Buffer.Length} time={r.RoundtripTime}ms TTL={r.Options.Ttl}"
    >  Else
    >   TextBox1.Text = "失敗: " & r.Status
    >  End If
    > End Using
    > https://dobon.net/vb/dotnet/internet/ping.html
    度々ありがとうございます。
    Pingクラスというのもあるんですね。勉強になります。
    よく読んでみます。

    あとPING以外にもテキストボックスに入力したコマンドを実行できるようにしたいなと思っていて、
    最初はDIRコマンドのように1度に結果が返ってくるもので試したのでよかったのですが、
    次にPINGコマンドで試してみたところ随時結果が表示されるものだったので、
    それをテキストボックスに表示させる方法が分かりませんでした。
違反を報告
引用返信 削除キー/
■34777 / inTopicNo.6)  Re[4]: コンソールではなくテキストボックスに文字列を出力したい
□投稿者/ スイカ 一般人(4回)-(2021/06/20(Sun) 15:49:08)
  • アイコンNo34773に返信(魔界の仮面弁士さんの記事)
    あれから色々調べて見たのですが、どうしても理解できずに解決できませんでしたので、
    再度質問させていただきました。
    よろしくお願いします。


    【質問】
     下記のコードでエラーが出ないようにするには、実際にどういうコードを追加すればいいのでしょうか?


    【状況】
     ・VisualStudioから「開始」を押して実行して下記のコードで「Button1」をクリックした時に、
      「Private Sub P_OutputDataReceived(」内で添付写真のエラーが出ます。
     ・ビルドして出来たexeを実行して「Button1」をクリックした時はエラーは出ず正常に完了します。


    【コード】
    '■1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Call Main(TxtCommand.Text) 'TxtCommand.Textは「ping 192.168.1.1」が入力されています
    End Sub

    '■2
    Private Sub Main(strcmd As String)
    Dim p As New System.Diagnostics.Process()

    p.StartInfo.UseShellExecute = False
    p.StartInfo.RedirectStandardOutput = True
    p.StartInfo.RedirectStandardError = True

    AddHandler p.OutputDataReceived, AddressOf P_OutputDataReceived
    AddHandler p.ErrorDataReceived, AddressOf P_ErrorDataReceived

    p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
    p.StartInfo.RedirectStandardInput = False
    p.StartInfo.CreateNoWindow = True
    p.StartInfo.Arguments = "/c " & strcmd

    p.Start()

    p.BeginOutputReadLine()
    p.BeginErrorReadLine()

    p.WaitForExit()
    p.Close()
    End Sub

    '■3
    Private Sub P_OutputDataReceived(sender As Object, e As System.Diagnostics.DataReceivedEventArgs)
    If e.Data <> "" Then
    Me.TxtResult.AppendText(e.Data) '◆ここが赤いバツになって添付写真のエラーが出ます
    Me.TxtResult.AppendText(vbCrLf)
    End If
    End Sub

    '■4
    Private Sub P_ErrorDataReceived(sender As Object, e As System.Diagnostics.DataReceivedEventArgs)
    If e.Data <> "" Then
    Me.TxtResult.AppendText(e.Data)
    Me.TxtResult.AppendText(vbCrLf)
    End If
    End Sub


    【コード補足】
     TxtCommand.Textは実行するコマンド(例えばping 192.168.1.1など)が入力されています。
     TxtResult.Textは実行したコマンドの結果を表示するテキストボックスです。

違反を報告
引用返信 削除キー/
■34778 / inTopicNo.7)  Re[5]: コンソールではなくテキストボックスに文字列を出力したい
□投稿者/ スイカ 一般人(5回)-(2021/06/20(Sun) 15:51:46)
  • アイコン添付写真です。
824×236 => 250×71
イメージ
Error.jpg
/17KB
違反を報告
引用返信 削除キー/
■34779 / inTopicNo.8)  Re[2]: コンソールではなくテキストボックスに文字列を出力したい
□投稿者/ スイカ 一般人(6回)-(2021/06/20(Sun) 16:21:29)
  • アイコンNo34771に返信(魔界の仮面弁士さんの記事)
    > ■No34768に返信(スイカさんの記事)
    >>下記のサンプルで文字列の出力をコンソールではなくて、
    >>テキストボックスにしたいと思い変更してみましたが、
    >
    > No34644 - No34645 あたりでどうでしょう。
    > https://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=all&namber=34642
    >

    https://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=red&namber=34645&no=0
    こちらのサンプルは無事に動かせました。
    どうもありがとうございます。

    度々質問ですみません。
    このサンプルで「PING 192.168.1.1 -t」とした場合に、
    ボタンで強制的に止めるにはどういったコードが必要になりますでしょうか?
違反を報告
引用返信 削除キー/



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

このトピックに書きこむ

Mode/  Pass/


- Child Tree -