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

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
Nomal作成した白黒画像をWordに貼り付けてから「図として保存」(8) | NomalVB.NetでVB6.0と同じFontを指定しても同様に印刷されない(9) | NomalDataGridViewの複数行選択で歯抜け選択を無効にしたい(2) | Nomal証券会社へのログイン(1) | Nomalユーザーフォームに埋め込んだAutoCADの変化を捉える(0) | Nomalシステムドライブ以外へのページング設定が反映されない(5) | Nomalブラウザでコピーした透過PNGを貼り付けたい(4) | Nomalforeachでループ回数を取得(2) | Nomalbitmapが保存できない(2) | Nomal特定ピクセルで画像を読み込みたい(2) | NomalDataGridViewでAlt+Enterで改行したい(2) | Nomal全角シフト中にアクセスキーが効かない(5) | NomalDataAdapter.Updateで構文エラー(6) | Nomal抽象クラスで実装したクラスの情報を知る(3) | Nomal画面遷移(モーダルとモードレス)(2) | NomalProcessクラスからbatファイル実行後、KILLできない(2) | NomalGetDirectoriesでルートを指定するとエラーになる(3) | Nomal兆億万表記の文字列を数値に変換できる?(3) | NomalLinqにおける明示的型指定の方法(3) | Nomal2つのradの数値から1つの角度を求めるコードを改善できますか?(C++)(2) | Nomalコンソールアプリで、WebView2の利用(2) | NomalEntity Frameworkは、使えるか?(2) | Nomalデータベースからのテーブル名一覧の効率的な取得方法(3) | NomalC#のlong型でオーバーフローになる(2) | Nomal正規表現のパターン表記方法(2) | NomalWebView2によるスクレ―ピング(4) | Nomalこういた物を作れますか?(2) | Nomalツールボックスにtableadapterが表示されない(1) | NomalC# Chart X軸上のグラフ表示(3) | NomalVB.NETでBluetoothデバイスの電池残量を取得する方法(3) | Nomalクリスタルレポート 明細部のサブレポート(0) | Nomal重なったPictureBox同士を透過する方法(7) | NomalWindowsフォームデザイナについて(3) | Nomalvb.netでExcelファイル操作(7) | NomalVB.NETからcmdでpingを実行した時の結果(5) | Nomalvb.netでのExcelファイルそうさ(2) | Nomalキーボード+バーコードでキーボード入力を無効にしたい(6) | NomalVB2022でクリスタルレポートが開けない(2) | Nomalファイルとして配置したマニフェストを優先したい(2) | NomalTabPageの背景色(5) | NomalC#でJpeg圧縮のTiffファイルを作成したい(4) | Nomalエクセルのみ監視ができない(2) | NomalDataGridViewのVirtualModeを有効した場合の実装方法(4) | NomalExcelの数値 -> 日付みたいな関数?(2) | Nomaljumbo icon(256x256)が存在するか知る方法(6) | NomalDrawstringでの透過文字作成(3) | NomalSpinWait()を使う理由(2) | Nomalantecedentってなんですか?(2) | Nomalワンタイムパスワードのサイトに自動ログインしてアクセストークンを得る(3) | Nomalstyle.displayだと効率悪いから違うやり方をしたいです。(5) | Nomalテーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。(4) | NomalJSONの複雑な入れ子内部の値を取りたい。(3) | Nomalグリッド表示レコードをJSONに変換(5) | Nomalシステム時計の設定(3) | NomalSeleniumで開いているページのTableを編集したい(5) | Nomalソケット通信入門 ひらがな(4) | NomalVisual Basicでエラーが出る(3) | Nomalインストーラにて、ローミングフォルダにファイルを配置したい(0) | NomalRGB値の所得(2) | Nomal時間変数(文字列)の扱い(4) | NomalVB.net からAccessDBへの接続(2) | Nomal画像のスクロール(6) | Nomalタイマーの一括処理(6) | NomalTreeViewとDataGridViewのスクロールを同期(シンクロ)させたい(4) | NomalTreeViewの現在位置とDataGridViewの現在位置を合わせたい(7) | NomalPictureBoxの画像を連続保存(11) | NomalDataGridViewの特定セルにボタンを配置する方法(5) | Nomalフォームのリサイズ時にDataGridViewが再描画されない(4) | NomalテキストボックスのValidatingイベントよりも先に発生するボタン発生イベントは何でしょう?(2) | NomalPDFをフォーム上で表示させる方法につきまして(4) | NomalDataGridViewの行ヘッダーに行番号を表示した時のエラー(4) | Nomal継承元フォームで各フォームのボタン動作を検知したい(3) | Nomalラジオボタンの一括設定(7) | NomalWindowsエクスプローラからのドラッグ&ドロップ(2) | NomalRichTextBoxのテキストをpictureBOXへ(12) | Nomalクリックイベントでexeを作成できるか(2) | Nomalアセンブリ情報が載らない(1) | Nomal先頭に空白(スペース)があるファイルを読み込んでRichTextBoxへ書き出すとスペースが削除える(6) | Nomalc#で日付型の定義の仕方で質問があります。(2) | NomalExcel Com オブジェクトの増殖(13) | Nomal二次元マップから値の取得(1) | NomalアプリでHDMIへ出す解像度を変えたい(4) | Nomal列車の時間ごとの位置情報を表示したいです。(2) | Nomal画像の中心を基点に回転(4) | NomalDataGridViewのドロップダウンリストの表示と選択後の値を分けたい(1) | NomalタッチキーボードでIMEを自動で切替えたい(6) | NomalVSTOによるエクセルアドインのインストーラーでのアップデート(1) | NomalMP4動画を再生する方法について(5) | NomalUrlにアクセスするとダウンロードされるファイルを捕まえる(2) | NomalLableのカラー色を文字変数から変更したい(5) | NomalLabelで文字単位の背景色(7) | NomalTEXTBOXのプロパティを文字列に(7) | Nomalタブレット等でスワイプによるスクロールを実装(2) | NomalPDFをフォーム上で表示させる方法につきまして(6) | NomalChart X軸上の描画を切り替えたい(0) | NomalRichTextBoxへのドラッグ&ドロップしたExcelファイルの扱い(3) | Nomal特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因(6) | NomalASP.NET WebApi内でXmlReader.Create(url)がタイムアウトする(4) | NomalDatagridViewでファンクションキーを止めたい(5) | Nomal表示動作が重くなる(3) |



■記事リスト / ▼下のスレッド
■35216 / 親記事)  DataGridViewの行ヘッダーに行番号を表示した時のエラー
□投稿者/ たこ 一般人(12回)-(2022/11/04(Fri) 02:12:28)
  • アイコン環境/言語:[Windows10 VB.NET .NET Framework 4.7.2 VS2019] 
    分類:[.NET] 

    いつもお世話になります。

    DataGridViewの行ヘッダーに行番号を表示する
    https://dobon.net/vb/dotnet/datagridview/drawrownumber.html

    を使わせて頂いておりますが、1つ目のデータを挿入した際に「System.Configuration.ConfigurationErrorsException: '構成システムを初期化できませんでした。'」と出て停止してしまいます。
    (2つ目のデータ以降はエラーが出ない)
    「例外設定」の「次からスローされた場合を除く」の項目に「Log.dll」とあるので、ログクラスが何かしらいたずらしているとは思うのです。

    何か解決の糸口は無いかと書込みさせて頂きます。


    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Private Sub DataGridView1_CellPainting(ByVal sender As Object, ByVal e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
      '列ヘッダーかどうか調べる
        If e.ColumnIndex < 0 And e.RowIndex >= 0 Then
          'セルを描画する
          e.Paint(e.ClipBounds, DataGridViewPaintParts.All)       '←ここで発生 コメントアウトするとフォーム拡大縮小時にゴミが残る…

          '行番号を描画する範囲を決定する
          'e.AdvancedBorderStyleやe.CellStyle.Paddingは無視しています
          Dim indexRect As Rectangle = e.CellBounds
          indexRect.Inflate(-2, -2)
          '行番号を描画する
          TextRenderer.DrawText(e.Graphics,
                    (e.RowIndex + 1).ToString(),
                    e.CellStyle.Font,
                    indexRect,
                    e.CellStyle.ForeColor,
                    TextFormatFlags.Right Or TextFormatFlags.VerticalCenter)
          '描画が完了したことを知らせる
          e.Handled = True
        End If

        DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray
      End Sub
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------



    呼出し元
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
      Private Sub DGVDataAdd(workStr As List(Of String()))
        DataGridView1.Rows.Clear()
        On Error GoTo ErrorNext
        System.Threading.Monitor.Enter(workStr)
        Dim ws As List(Of String()) = workStr
        System.Threading.Monitor.Exit(workStr)
        System.Threading.Monitor.Enter(ws)
        Dim x As Integer = 0
        For Each work In ws
          System.Threading.Monitor.Enter(work)
          DataGridView1.Rows.Add(work)
          DataGridView1(LogData.LogKinds, x).Style.BackColor = LogKind_ColorChange(work)
          DataGridView1(LogData.Operation, x).Style.ForeColor = Operation_ColorChange(work)
          x += 1
          System.Threading.Monitor.Exit(work)
        Next
        System.Threading.Monitor.Exit(ws)
    ErrorNext:
        DataGridView1.Refresh()
      End Sub
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
    いろんなスレッドに呼ばれるので、エラーが出て最終的に「On Error Resume Next」を付けました^^;



    呼出し元の呼出し元
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
      Private Delegate Sub DGVAddInvoke(DataStr As List(Of String()))

      ''' <summary>
      ''' AlertLog変更イベント
      ''' </summary>
      Private Sub _LogStock__AlartLogEvent(sender As Object, e As EventArgs) Handles _LogStock._AlertLogEvent
        If DispLevel = LogEventArgs.Kinds.Alart Then
          Invoke(New DGVAddInvoke(AddressOf DGVDataAdd), _LogStock.AlertLog)
        End If
      End Sub

      ''' <summary>
      ''' OperateLog変更イベント
      ''' </summary>
      Private Sub _LogStock__OperateLogEvent(sender As Object, e As EventArgs) Handles _LogStock._OperateLogEvent
        If DispLevel = LogEventArgs.Kinds.Operate Then
          Invoke(New DGVAddInvoke(AddressOf DGVDataAdd), _LogStock.OperateLog)
        End If
      End Sub

      ''' <summary>
      ''' SystemLog変更イベント
      ''' </summary>
      Private Sub _LogStock__SystemLogEvent(sender As Object, e As EventArgs) Handles _LogStock._SystemLogEvent
        If DispLevel = LogEventArgs.Kinds.System Then
          Invoke(New DGVAddInvoke(AddressOf DGVDataAdd), _LogStock.SystemLog)
        End If
      End Sub

      ''' <summary>
      ''' DebugLog変更イベント
      ''' </summary>
      Private Sub _LogStock__DebugLogEvent(sender As Object, e As EventArgs) Handles _LogStock._DebugLogEvent
        If DispLevel = LogEventArgs.Kinds.Debug Then
          Invoke(New DGVAddInvoke(AddressOf DGVDataAdd), _LogStock.DebugLog)
        End If
      End Sub
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
    以上3つのメソッドはLogDispクラスで、イベントはLogクラスから飛んできます。



    Logクラス
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
      Public Delegate Sub LogEventHandler(sender As Object, e As EventArgs)
      Public Event _AlertLogEvent As LogEventHandler
      Public Event _OperateLogEvent As LogEventHandler
      Public Event _SystemLogEvent As LogEventHandler
      Public Event _DebugLogEvent As LogEventHandler

      Private _AlertLog As New List(Of String())
      Private _OperateLog As New List(Of String())
      Private _SystemLog As New List(Of String())
      Private _DebugLog As New List(Of String())


      Public Sub Write(sender As Object, e As LogEventArgs)

        〜〜〜 (中略) 〜〜〜

        If e.LogKinds = LogEventArgs.Kinds.System Then
          _DebugLog.Insert(0, WriteData.Split(","))
          _SystemLog.Insert(0, WriteData.Split(","))
          If _SystemLog.Count > _MaxDispLog Then _SystemLog.RemoveAt(_MaxDispLog)
          RaiseEvent _SystemLogEvent(Me, New EventArgs())
          RaiseEvent _DebugLogEvent(Me, New EventArgs())
          Exit Sub
        End If
      End Sub
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------

    LogクラスもDispLogも同じLogプロジェクト内で、クラスライブラリ
    DispLogはユーザーコントロールです。

    よろしくお願いします。
違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■35218 / ResNo.1)  Re[1]: DataGridViewの行ヘッダーに行番号を表示した時のエラー
□投稿者/ 魔界の仮面弁士 大御所(1475回)-(2022/11/04(Fri) 10:44:35)
  • アイコンNo35216に返信(たこさんの記事)
    >「System.Configuration.ConfigurationErrorsException: '構成システムを初期化できませんでした。'」
    プログラムそのものでは無く、アプリケーション構成ファイルである
    exe名.config (開発時は app.config) ファイル、あるいは user.config の
    内容に不整合や破損があると、その例外が発生します。
    user.config の場所についてはこちら。
    https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/558appsettings/appsettings.html


    ということで、ログ関連の設定情報に問題があるのでは無いでしょうか。

    プロジェクトの構成が分からないので具体的なアドバイスはできませんが、
    Log.dll のプロジェクトがあるのなら、確認すべき app.config は Log プロジェクトの app.config ではなく、
    exe 側のプロジェクト側の app.cofing のはずです。exe 側の .config に対して、Log プロジェクト用の
    エントリーが正しく記録されているかどうかを確認してみてください。


    > LogクラスもDispLogも同じLogプロジェクト内で、クラスライブラリ
    > DispLogはユーザーコントロールです。
    NLog や log4net の類では無く、自作のロギングクラスということだとすると、
    第三者には、具体的なアドバイスが難しいかもしれません。


    > 呼出し元
    > Private Sub DGVDataAdd(workStr As List(Of String()))
    >   DataGridView1.Rows.Clear()
    >   On Error GoTo ErrorNext
    DataGridView1.Rows.Clear() が呼ばれているという事は、DGVDataAdd メソッドの呼び出し元が
    UI スレッド上からの呼び出しであることは保証されているのですよね?

    で、引数の List(Of ) は、「別スレッドでも同時に読み書きされる可能性がある」という事でしょうか。


    > いろんなスレッドに呼ばれるので、エラーが出て最終的に「On Error Resume Next」を付けました^^;
    え?「いろんなスレッドに呼ばれる」のですか?
    この実装だと、UI スレッド以外からの呼び出しは NG に見えますが…。

    ワーカースレッドから呼ばれることを前提としているのであれば、
    DataGridView に対する読み書き部分を取り除く必要があるでしょう。


    >   System.Threading.Monitor.Enter(workStr)
    >   Dim ws As List(Of String()) = workStr
    >   System.Threading.Monitor.Exit(workStr)
    >   System.Threading.Monitor.Enter(ws)
    ・ws は、workStr のコピーでは無く、同一インスタンスへの参照ですよね。
     Exit 直後に再 Enterをする実装になっているのは何故ですか?
     ループ全体を ws で囲って、ループ内では workStr で囲っている理由が分からないです。
     (ReaderWriterLock クラスのような事がしたいわけでも無さそうですし…)

    ・もしも処理によって粒度の異なるロックを用意したいという意図であれば、
     ロック範囲のレベルごとに、別々の「Object インスタンス」を設けた方が良いかもしれません。
      Private ReadOnly lockObject As New Object()

    ・UI スレッドで Monitor を扱う場合は、無制限待機になってしまうことを避けるため、
     .Enter ではなく、待機上限時間を指定可能な .TryEnter の方が安全かと思います。
     (ロック失敗時にアプリケーション例外とするのか、処理を無視するのか、リトライ判定させるかは要件次第…)
違反を報告
引用返信
■35219 / ResNo.2)  Re[2]: DataGridViewの行ヘッダーに行番号を表示した時のエラー
□投稿者/ たこ 一般人(14回)-(2022/11/04(Fri) 22:14:40)
  • アイコンNo35218に返信(魔界の仮面弁士さんの記事)
    > ■No35216に返信(たこさんの記事)

    いつもお世話になります。
    魔界の仮面弁士様、早速のご回答ありがとうございます。



    > ということで、ログ関連の設定情報に問題があるのでは無いでしょうか。
    >
    > プロジェクトの構成が分からないので具体的なアドバイスはできませんが、
    > Log.dll のプロジェクトがあるのなら、確認すべき app.config は Log プロジェクトの app.config ではなく、
    > exe 側のプロジェクト側の app.cofing のはずです。exe 側の .config に対して、Log プロジェクト用の
    > エントリーが正しく記録されているかどうかを確認してみてください。


    exe側のApp.config
    ----------------------------------------------------------------------------------------------------
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
      </configSections>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
      </startup>
    </configuration>
    ----------------------------------------------------------------------------------------------------
    別におかしいところは見当たらず…orz




    > DataGridView1.Rows.Clear() が呼ばれているという事は、DGVDataAdd メソッドの呼び出し元が
    > UI スレッド上からの呼び出しであることは保証されているのですよね?


    InvokeでUIスレッド上からの呼び出しであることは保証されている…と思っています。。。



    > で、引数の List(Of ) は、「別スレッドでも同時に読み書きされる可能性がある」という事でしょうか。


    はい。値渡ししています。


    >>いろんなスレッドに呼ばれるので、エラーが出て最終的に「On Error Resume Next」を付けました^^;
    > え?「いろんなスレッドに呼ばれる」のですか?
    > この実装だと、UI スレッド以外からの呼び出しは NG に見えますが…。


    正確にはいろいろなクラスのメソッドからイベントで呼ばれる…でした^^;



    > ワーカースレッドから呼ばれることを前提としているのであれば、
    > DataGridView に対する読み書き部分を取り除く必要があるでしょう。
    >
    >
    >>  System.Threading.Monitor.Enter(workStr)
    >>  Dim ws As List(Of String()) = workStr
    >>  System.Threading.Monitor.Exit(workStr)
    >>  System.Threading.Monitor.Enter(ws)
    > ・ws は、workStr のコピーでは無く、同一インスタンスへの参照ですよね。
    >  Exit 直後に再 Enterをする実装になっているのは何故ですか?
    >  ループ全体を ws で囲って、ループ内では workStr で囲っている理由が分からないです。
    >  (ReaderWriterLock クラスのような事がしたいわけでも無さそうですし…)
    >
    > ・もしも処理によって粒度の異なるロックを用意したいという意図であれば、
    >  ロック範囲のレベルごとに、別々の「Object インスタンス」を設けた方が良いかもしれません。
    >   Private ReadOnly lockObject As New Object()
    >
    > ・UI スレッドで Monitor を扱う場合は、無制限待機になってしまうことを避けるため、
    >  .Enter ではなく、待機上限時間を指定可能な .TryEnter の方が安全かと思います。
    >  (ロック失敗時にアプリケーション例外とするのか、処理を無視するのか、リトライ判定させるかは要件次第…)


    TryEnterと言うメソッドもあるのですね…
    まだまだスレッドとエラー処理については勉強が必要そうです……


    で、本題の「DataGridViewの行ヘッダーに行番号を表示した時のエラー」について、今回はそこまで厳密にリアルタイムに表示されなくても良い為、
    魔法の言葉「On Error Resume Next」で逃げる事にしました^^;

    最終形
    -----------------------------------------------------------------------------------------------------------------------------------------------------
      Private Sub DataGridView1_CellPainting(ByVal sender As Object, ByVal e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
        On Error Resume Next
        '列ヘッダーかどうか調べる
        If e.ColumnIndex < 0 And e.RowIndex >= 0 Then
          'セルを描画する
          e.Paint(e.ClipBounds, DataGridViewPaintParts.All)

          '行番号を描画する範囲を決定する
          'e.AdvancedBorderStyleやe.CellStyle.Paddingは無視しています
          Dim indexRect As Rectangle = e.CellBounds
          indexRect.Inflate(-2, -2)
          '行番号を描画する
          TextRenderer.DrawText(e.Graphics,
                     (e.RowIndex + 1).ToString(),
                     e.CellStyle.Font,
                     indexRect,
     e.CellStyle.ForeColor,
                     TextFormatFlags.Right Or TextFormatFlags.VerticalCenter)
          '描画が完了したことを知らせる
          e.Handled = True
        End If

        DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray
      End Sub


      Private Sub DGVDataAdd(workStr As List(Of String()))
        DataGridView1.Rows.Clear()
        On Error GoTo ErrorNext
        Dim ws As List(Of String()) = workStr
        Dim x As Integer = 0
        For Each work In ws
          DataGridView1.Rows.Add(work)
          DataGridView1(LogData.LogKinds, x).Style.BackColor = LogKind_ColorChange(work)
          DataGridView1(LogData.Operation, x).Style.ForeColor = Operation_ColorChange(work)
          x += 1
        Next
    ErrorNext:
        DataGridView1.Refresh()
      End Sub

    -----------------------------------------------------------------------------------------------------------------------------------------------------


    板汚し失礼致しました。
    またよろしくお願い致します。
    ありがとうございました。
解決み!
違反を報告
引用返信
■35220 / ResNo.3)  Re[3]: DataGridViewの行ヘッダーに行番号を表示した時のエラー
□投稿者/ 魔界の仮面弁士 大御所(1476回)-(2022/11/07(Mon) 17:05:33)
  • アイコンNo35219に返信(たこさんの記事)
    >> あるいは user.config の内容に不整合や破損があると、
    > exe側のApp.config
    > 別におかしいところは見当たらず…orz
    user.config や machine.config は大丈夫なのですね?
    https://ja.stackoverflow.com/questions/65632/%E6%A7%8B%E6%88%90%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F-%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6


    また、exe 側は .config 設定が特に無いものの、
    dll 側では connectionStrings や applicationSettings を
    登録してある…という事も無いのですよね。

    とすると、Invoke のタイミングの問題?


    > 正確にはいろいろなクラスのメソッドからイベントで呼ばれる…でした^^;
    常に Invoke であれば「いろんなスレッドに呼ばれる」ことはなく、
    UI スレッドからの呼び出しであると言えそうですが、Invoke し忘れが怖い所。

    呼び出し元の使い方を保証できない場合は、InvokeRequired を使って
    「別スレッドから呼び出された場合は、自身を Invoke しなおす」という
    実装にする手法があります。
    https://atmarkit.itmedia.co.jp/ait/articles/0506/17/news111.html#:~:text=invokeメソット&#12441;か&#12441;必要かと&#12441;うか

    いずれにせよ、イベント再入などが起こらないように注意が必要です。
    フォームを閉じている最中や起動途中に、割り込まれて Invoke されるような
    ケースがありえる場合は、追加の保護機構が必要になるかもしれません。


    >>で、引数の List(Of ) は、「別スレッドでも同時に読み書きされる可能性がある」という事でしょうか。
    > はい。値渡ししています。
    ロギングのため、追記される差分情報のみを同期的に渡すのであれば、
    同一インスタンスでは無く、値のコピーを渡す方が簡単だったりします。
    同一インスタンスへの同時書き込みが発生しなくなるので、
    Monitor や SyncLock などによる同期制御が不要で、Invoke だけで済むかと。
解決み!
違反を報告
引用返信
■35313 / ResNo.4)  Re[4]: DataGridViewの行ヘッダーに行番号を表示した時のエラー
□投稿者/ Aurea 一般人(1回)-(2023/01/04(Wed) 10:41:25)
  • アイコンコメントにあるものはもう試しましたか?最初のコメントは、実際に試してみればうまくいく可能性が高いと思います。私は自分でそれを実行しましたが、これまでのところ良い結果が得られました。これが、コードについて検討できるさまざまな状況が実際にたくさんあると言える理由です。それが私が最初に言えることであり、あなたと私は両方とも、現時点で私たち全員が検討できる選択肢がほとんどないことを知っています.今あなたがしなければならないことは、今のところ私たち全員が得ることができる最善の回答を考え出すことです.
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-4]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35308 / 親記事)  継承元フォームで各フォームのボタン動作を検知したい
□投稿者/ saku 一般人(1回)-(2022/12/30(Fri) 08:33:39)
  • アイコン環境/言語:[C#] 
    分類:[.NET] 

    おはようございます。
    皆さまのお知恵を拝借できないでしょうか。

    基本となるフォーム(ファンクション、デザインの統一など)を作成して
    そのフォームを継承して各機能画面を作成しているのですが、

    継承元フォームの方で、キーボード入力を検知できるように(KeyPreview=True,KeyDownイベントなど)、
    マウスでボタンにフォーカスがあたる(またはクリック)した事を検知できるような方法って何か考えられないでしょうか?

    継承元フォームの方で処理を共通化することになり、各機能画面のボタンの検知が必要になったためです。

    何かしらヒントだけでも頂けると有難いです。

    よろしくお願いいたします。

違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■35309 / ResNo.1)  Re[1]: 継承元フォームで各フォームのボタン動作を検知したい
□投稿者/ 魔界の仮面弁士 大御所(1509回)-(2022/12/30(Fri) 10:19:06)
  • アイコンNo35308に返信(sakuさんの記事)
    > マウスでボタンにフォーカスがあたる(またはクリック)した事を検知
    マウス操作に限定した検知ということでしょうか。
    それともマウス以外の操作によるものも検出したいのでしょうか?

    たとえば Windows Touch 操作や、スタイラスによるタップも
    マウス操作によるクリックと同種に扱うという事で良いでしょうか。

    フォーカス移動にはマウス操作だけでなく、Tab / Shift+Tab 移動もあります。
    プログラムから Focus メソッドや SelectNextControl メソッド等によって
    フォーカスが移り変わることもあります。
    https://dobon.net/vb/dotnet/control/selectnextcontrol.html

    Click イベントの発火には、Alt + ニーモニックキー によるショートカット、
    フォーカス取得時の Space キーでの操作もあります。Form の
    AcceptButton / CancelButton によるショートカット操作もありますし、
    プログラムから PerformClick メソッドで呼ばれることもありますね。


    別にマウス操作に限る必要は無いのなら、継承フォーム側で OnControlAdded を
    オーバーライドして Button の追加を追跡しておき、そのボタンに対して
    GotFocus/Enter/MouseDown/Click イベントを追跡するのが良いと思います。

    その場合 Panel などの入れ子構造も再帰的にとらえる必要があるでしょう。
    状況によっては、ControlRemoved イベント/ OnControlRemoved メソッドでの
    解除処理も加えた方が良いかも知れません。


    ボタン操作と言えば、非アクティブなフォームのボタンがクリックされた場合
     ・フォームおよびそのボタンがアクティブになるだけ
     ・フォームとボタンがアクティブになり、Click イベントまで発動
    のどちらが好ましいか(Click Through の有無)という話があり、その切替を
    WndProc をオーバーライドすることで制御することがあります。
    https://learn.microsoft.com/en-us/archive/blogs/rickbrew/how-to-enable-click-through-for-net-2-0-toolstrip-and-menustrip

    「イベント」を処理する代わりに、こうした「Windows Message」を処理することで
    検出できるケースもあります。
違反を報告
引用返信
■35310 / ResNo.2)  Re[2]: 継承元フォームで各フォームのボタン動作を検知したい
□投稿者/ saku 一般人(2回)-(2022/12/30(Fri) 12:13:32)
  • アイコン詳しい説明、考慮すべき点に参考すべき情報、
    大変勉強になりました。
    今回はキー入力まわりの対応は完了しているので、マウスでのクリックに対する継承フォーム側での OnControlAdded、Windows Messageを念頭に調べてみます。

    もう感謝しかありません。
    ありがとうございました。
解決み!
違反を報告
引用返信
■35312 / ResNo.3)  Re[2]: 継承元フォームで各フォームのボタン動作を検知したい
□投稿者/ 魔界の仮面弁士 大御所(1511回)-(2022/12/30(Fri) 15:10:57)
  • アイコン
    解決済みチェックはそのままにしておきます。
    
    
    ■No35309に追記(魔界の仮面弁士の記事)
    > 別にマウス操作に限る必要は無いのなら、継承フォーム側で OnControlAdded を
    > オーバーライドして Button の追加を追跡しておき、そのボタンに対して
    > GotFocus/Enter/MouseDown/Click イベントを追跡するのが良いと思います。
    
    Button の Click イベントと Enter イベントを継承元フォームで捉えて
    独自の ControlClick / ControlEnter イベントとして発生させてみました。
    
    イベント引数 e.Control から、対象の Button オブジェクトを得られます。
    
    private void Form1_ControlClick(object sender, ControlEventArgs e)
    {
        listBox1.Items.Insert(0, $"{DateTime.Now:HH:mm:ss.ffff}/Click: {e.Control.Text}");
    }
    private void Form1_ControlEnter(object sender, ControlEventArgs e)
    {
        listBox1.Items.Insert(0, $"{DateTime.Now:HH:mm:ss.ffff}/Enter: {e.Control.Text}");
    }
    
    
    ベースクラスの実装はこんな感じ。
    
    
    // ---> SakuFormBase.cs --->
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Windows.Forms;
    using System.Collections;
    
    [DefaultEvent(nameof(SakuFormBase.ControlClick))]
    public class SakuFormBase : Form
    {
        // 実際には InitializeComponent(); の呼び出し等も記述
        public SakuFormBase() { }
    
        #region 公開イベント
        // ControlClick イベントという名に反して、Button にしか反応させていなかったりする
        [Category("Action"), Description("フォーム上の Button がクリックされた時に発生します。")]
        public event ControlEventHandler ControlClick;
        [Category("Focus"), Description("フォーム上の Button がアクティブになった時に発生します。")]
        public event ControlEventHandler ControlEnter;
        /// <summary><see cref="ControlClick"/> イベントを発生させます。</summary>
        protected virtual void OnControlClick(ControlEventArgs e) => ControlClick?.Invoke(this, e);
        /// <summary><see cref="ControlEnter"/> イベントを発生させます。</summary>
        protected virtual void OnControlEnter(ControlEventArgs e) => ControlEnter?.Invoke(this, e);
        #endregion
    
        #region 内部処理
        protected override void OnControlAdded(ControlEventArgs e)
        {
            base.OnControlAdded(e);
            // 子コントロールが追加されたら、Click/Enter イベントを捉える
            AttachEvents(e.Control);
        }
        private void AttachEvents(Control control)
        {
            if (control is Button button)
            {
                // Button が追加された時はイベントを追跡
                if (subscribes.Add(control))
                {
                    var a = new ControlEventArgs(control);
                    button.Click += (sender, e) => OnControlClick(a);
                    button.Enter += (sender, e) => OnControlEnter(a);
                }
            }
            else
            {
                // Button で無ければ、さらにその配下のコントロールに対して再帰的に追跡
                if (subscribes.Add(control))
                {
                    control.ControlAdded += (sender, e) => AttachEvents(control);
                }
                foreach (var c in control.GetControls<Control>())
                {
                    AttachEvents(c);
                }
            }
        }
        // イベントを追跡済みかどうかを管理
        private HashSet<Control> subscribes = new HashSet<Control>();
        #endregion
    }
    internal static class ControlExtensions
    {
        /// <summary>
        /// 指定した型の子孫コントロールを列挙する
        /// </summary>
        public static IEnumerable<T> GetControls<T>(this Control control) where T : Control
        {
            var controls = control.Controls.OfType<Control>();
            return controls.OfType<T>().Concat(controls.SelectMany(c => GetControls<T>(c)));
        }
    }
    // <--- SakuFormBase.cs ---
    
    
    ControlAdded イベント(OnControlAdded メソッド)を用いているのは、
    Button の追加が実行時に動的に行われた場合に備えるためのものです。
    (今回、ControlRemoved イベントの追跡は省略しています)
    
    デザイン時の画面構成のままで、ボタン数の増減が無いような場合は、
    Load 完了後に全 Button を列挙して捉えるだけでも十分かと思います。

解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-3]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35297 / 親記事)  ラジオボタンの一括設定
□投稿者/ ま〜 一般人(34回)-(2022/12/23(Fri) 18:39:54)
  • アイコン環境/言語:[windows10 VS2022] 
    分類:[.NET] 

    こんにちわ、テキストファイルにラジオボタンの内容を保存して復元しようとしています

    Dim text0() As TextBox = {TextBox1, TextBox2, TextBox3}
    と同じ様に

    Dim Radio0() As RadioButton = {RadioButton1, RadioButton2, RadioButton3}
    で考えたのですが構文エラーで赤い波線が入ってます。

    何か良い方法はないでしょうか?

違反を報告
引用返信

▽[全レス7件(ResNo.3-7 表示)]
■35300 / ResNo.3)  Re[3]: ラジオボタンの一括設定
□投稿者/ 魔界の仮面弁士 大御所(1506回)-(2022/12/23(Fri) 22:45:15)
  • アイコンNo35299に返信(ま〜さんの記事)
    > エラーの内容は
    > https://learn.microsoft.com/en-us/dotnet/visual-basic/misc/bc30311?f1url=%3FappId%3Droslyn%26k%3Dk(BC30311)
    > です。

    いや、その <Type1> と <Type2> が何であったのかが重要なのですけれど?
違反を報告
引用返信
■35303 / ResNo.4)  Re[4]: ラジオボタンの一括設定
□投稿者/ ま〜 一般人(36回)-(2022/12/26(Mon) 01:23:24)
  • アイコンお世話になります。

    > いや、その <Type1> と <Type2> が何であったのかが重要なのですけれど?

    貼り付けました。

    宜しくお願いします
619×28 => 250×11
イメージ
1671985404.jpg
/13KB
違反を報告
引用返信
■35305 / ResNo.5)  Re[5]: ラジオボタンの一括設定
□投稿者/ KOZ 一般人(16回)-(2022/12/26(Mon) 09:51:46)
  • アイコン
    No35303に返信(ま〜さんの記事)
    > 貼り付けました。
    
    エラーを選択して右クリックすると内容をコピーできます。
    
    重大度レベル	コード	説明	プロジェクト	ファイル	行	抑制状態
    エラー	BC30311	型 'RadioButton' の値を 'VisualStyleElement.Button.RadioButton' に変換できません。	WindowsApp1	D:\TEST\WindowsApp1\WindowsApp1\Form1.vb	5	アクティブ
    
    こんな感じ。
    
    Imports System.Windows.Forms.VisualStyles.VisualStyleElement.Button
    
    が書いてあるとこのエラーになりますが、使っているんでしょうか?

違反を報告
引用返信
■35306 / ResNo.6)  Re[5]: ラジオボタンの一括設定
□投稿者/ 魔界の仮面弁士 大御所(1508回)-(2022/12/26(Mon) 09:53:31)
  • アイコンNo35303に返信(ま〜さんの記事)
    >>いや、その <Type1> と <Type2> が何であったのかが重要なのですけれど?
    > 貼り付けました。

    画像でも良いですが、エラー一覧の内容は
    右クリック操作もしくは Ctrl+C を使って
    テキストとしてコピーできますよ。


    エラー BC30311 型 'RadioButton' の値を 'VisualStyleElement.Button.RadioButton' に変換できません。

    …というエラーメッセージは、代入式の右辺が `RadioButton` 型であるの対して、
    代入先の左辺の RadioButton 型が `VisualStyleElement.Button.RadioButton` 型という、
    「型名はどちらも RadioButton 型だが、所属する名前空間の異なる別物」への操作だと思われています。



    今回の場合、プロジェクト作成時のテンプレートとして、おそらく
     ★Windows フォーム アプリケーション (.NET Framework)
     ★Windows フォーム アプリ
    のいずれかを選択されている状況なのでしょう。

    そして現在は、Form1.vb ファイルの冒頭に、普段は記述されていないはずの
     Imports System.Windows.Forms.VisualStyles.VisualStyleElement.Button
    というコードが追加されている状況であると想像できます。もしそうなら、
     Dim Radio0() As RadioButton = {RadioButton1, RadioButton2, RadioButton3}
    という代入式左辺の As RadioButton とは
     As System.Windows.Forms.VisualStyles.VisualStyleElement.Button.RadioButton
    の意味になっています。一方、代入式右辺にある RadioButotn1〜3 は
     As System.Windows.Forms.RadioButton
    に相当するデータ型を意味するため、型の不一致でコンパイルエラーとなります。


    解決策としては、こんな感じ。

    (案1) 冒頭の「Imports System.Windows.Forms.VisualStyles.VisualStyleElement.Button」宣言を取り除く
    (案2) 変数宣言時に、クラス名だけでなく名前空間も明示するようにする
     Dim Radio1() As RadioButton = {…}
    →Dim Radio1() As Global.System.Windows.Forms.RadioButton = {…}


    > TEXTの方は問題ないです
    もしも「Imports System.Windows.Forms.VisualStyles.VisualStyleElement」という宣言が
    追加されていたら、As TextBox も同様の競合問題が発生していたことでしょう。


    なお、今回は状況的に Windows Forms での事象だったのでしょうけれども
    その他プロジェクトでも同種の問題は起こりえます。

    "RadioButton" ひとつとっても、これだけの種類があるので…。

    ・System.Windows.Forms.RadioButton クラス (System.Windows.Forms.dll)
    ・System.Windows.Forms.VisualStyles.VisualStyleElement.Button.RadioButton クラス (System.Windows.Forms.dll)
    ・System.Windows.Controls.RadioButton クラス (PresentationFramework.dll)
    ・System.Web.UI.WebControls.RadioButton クラス (System.Web.dll)
    ・System.Windows.Automation.ControlType.RadioButton フィールド (UIAutomationTypes.dll)
    ・System.Windows.Automation.Peers.AutomationControlType.RadioButton 列挙値 (PresentationFramework.dll)
    ・Microsoft.Windows.Themes.ClassicBorderStyle.RadioButton 列挙値 (PresentationFramework.Classic.dll)
違反を報告
引用返信
■35307 / ResNo.7)  Re[6]: ラジオボタンの一括設定
□投稿者/ ま〜 一般人(37回)-(2022/12/26(Mon) 16:11:48)
  • アイコンいつも適切なアドバイスお二人に感謝です
    ありがとうございます

    まさにこれでした。

    今までネット上のサンプルをコピペで試してる時、ソースが大きくなるだけだと思って深く考えずにインポートしたままにしてましたが今回の件で勉強になりました。

    再度ありがとうございます

    クローズしておきます


解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-7]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35301 / 親記事)  Windowsエクスプローラからのドラッグ&ドロップ
□投稿者/ よっし〜 一般人(15回)-(2022/12/24(Sat) 08:53:12)
  • アイコン環境/言語:[VB.NET] 
    分類:[.NET] 

    現在Windowsエクスプローラからファイルをドラッグ&ドロップして、ドロップされたファイルを処理するプログラムを作成しております。

    http://dobon.net/vb/dotnet/control/droppedfile.htmlを参考にさせて頂き、あくまでも例ですが

    Private Sub ListBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox1.DragDrop
    Dim fileName As String() = CType(e.Data.GetData(DataFormats.FileDrop, False), String())
    For Each FL As String In fileName
    <FLファイルに対しての重い処理>
    Next
    End Sub
    としております。
    もちろん作成しているアプリは重い処理なので、応答無し的な状態にはなりますが、Windowsエクスプローラの方もドラッグ中(カーソルに+が付いた)のままとなってしまい、操作できません。
    アプリはともかく、Windowsエクスプローラを処理から開放する方法はありますでしょうか??

    以上、宜しくお教えくださいませ。

違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35302 / ResNo.1)  Re[1]: Windowsエクスプローラからのドラッグ&ドロップ
□投稿者/ 魔界の仮面弁士 大御所(1507回)-(2022/12/24(Sat) 11:05:56)
  • アイコンNo35301に返信(よっし〜さんの記事)
    > アプリはともかく、Windowsエクスプローラを処理から開放する方法はありますでしょうか??

    Dim fileName As String() に受け取るだけならば、
    そんなに時間はかからないですよね?

    であれば、UI スレッドはファイルの一覧を受け取るだけにして、
    その後の処理はワーカースレッドに任せてしまえば良さそうです。
    .NET バージョンによって選択肢が変わってきますが、
    たとえば Task とか BackgroundWorker とか Thread とか…。

    ただしその場合、別スレッド操作になるので
    > <FLファイルに対しての重い処理>
    の部分では、UI 部品(TextBox とか ListBox とか Label とか)の
    読み書きは行えなくなります。
違反を報告
引用返信
■35304 / ResNo.2)  Re[2]: Windowsエクスプローラからのドラッグ&ドロップ
□投稿者/ よっし〜 一般人(16回)-(2022/12/26(Mon) 08:58:55)
  • アイコン魔界の仮面弁士さん、早速のご教示、有り難うございます。

    > であれば、UI スレッドはファイルの一覧を受け取るだけにして、
    > その後の処理はワーカースレッドに任せてしまえば良さそうです。
    > .NET バージョンによって選択肢が変わってきますが、
    > たとえば Task とか BackgroundWorker とか Thread とか…。

    BackgroundWorker使用し、フォーム等を処理から開放するのは知っておりましたが、
    Windows別アプリ(別スレッド)も開放出来るのですね。
    一度重い処理部分をBackgroundWorkerで処理する様に改造してみます。

    どうも、有り難うございました。


解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]



■記事リスト / ▲上のスレッド
■35270 / 親記事)  RichTextBoxのテキストをpictureBOXへ
□投稿者/ ま〜 一般人(28回)-(2022/12/05(Mon) 15:45:30)
  • アイコン環境/言語:[Windows10 VS2022 Basic] 
    分類:[.NET] 

    こんにちは
    以前、
    https://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=35233&rev=&no=0
    でLEDモニタの件で画像にすればと提案頂いて格闘していましたが玉砕気味です。
    現状は
    Dim img As Bitmap
    img = New Bitmap(Me.RichTextBox1.Width, Me.RichTextBox1.Height)
    Using g As Graphics = Graphics.FromImage(img)
    g.CopyFromScreen(Me.PointToScreen(Me.RichTextBox1.Location), New Point(0, 0), Me.RichTextBox1.Size)
    End Using
    Me.PictureBox1.Image = img

    です。転送はて来たのですがRichTextBoxの位置情報が上手く取れずに少しずれてしまいます。
    Me.RichTextBox1.Locationの値が連想出来ない数値になってます。
    色々やってみましたが私のコピペ専門の理解度では難しく教えて下さい
    初歩的な質問で申し訳ないですが宜しくお願いします






違反を報告
引用返信

▽[全レス12件(ResNo.8-12 表示)]
■35279 / ResNo.8)  Re[6]: RichTextBoxのテキストをpictureBOXへ
□投稿者/ KOZ 一般人(11回)-(2022/12/08(Thu) 18:38:13)
  • アイコン
    2022/12/09(Fri) 04:27:45 編集(投稿者)
    
    ■No35275に返信(ま〜さんの記事)
    >>高 DPI 環境で実行している場合は、ズレる可能性がありますね。
    > まさにこれが原因でした。凄いです感激です。
    
    これ動きますか?
    ちょっと問題があって、画像を縮小するせいか、少しぼやけた感じになります。
    ,NET Framework 4.7 以上なら RichTextBox の DrawToBitmap を使ったほうがいいかもしれません。
    
    Imports System.Runtime.InteropServices
    
    Public Class Form1
    
        <DllImport("User32.dll")>
        Public Shared Function LogicalToPhysicalPointForPerMonitorDPI(ByVal hwnd As IntPtr, ByRef point As Point) As Boolean
        End Function
    
        Private Shared Function LogicalToPhysicalRectangleForPerMonitorDPI(ByVal hwnd As IntPtr, ByVal r As Rectangle) As Rectangle
            Dim p1 As Point = r.Location
            Dim p2 As Point = New Point(r.Right, r.Bottom)
            LogicalToPhysicalPointForPerMonitorDPI(hwnd, p1)
            LogicalToPhysicalPointForPerMonitorDPI(hwnd, p2)
            Return Rectangle.FromLTRB(p1.X, p1.Y, p2.X, p2.Y)
        End Function
    
        Private Function LogicalToPhysicalRectangleForPerMonitorDPI(ByVal r As Rectangle) As Rectangle
            Return LogicalToPhysicalRectangleForPerMonitorDPI(Handle, r)
        End Function
    
        Public Sub New()
            InitializeComponent()
            PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
            PictureBox1.Size = RichTextBox1.Size
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim rectangle1 = RectangleToScreen(RichTextBox1.Bounds)
            Dim rectangle2 = LogicalToPhysicalRectangleForPerMonitorDPI(rectangle1)
            Dim bmp = New Bitmap(rectangle2.Width, rectangle2.Height)
            Using g = Graphics.FromImage(bmp)
                g.CopyFromScreen(rectangle2.Location, Point.Empty, rectangle2.Size)
            End Using
            If PictureBox1.Image IsNot Nothing Then
                PictureBox1.Image.Dispose()
            End If
            PictureBox1.Image = bmp
        End Sub
    
    End Class
    

違反を報告
引用返信
■35280 / ResNo.9)  Re[7]: RichTextBoxのテキストをpictureBOXへ
□投稿者/ ま〜 一般人(31回)-(2022/12/15(Thu) 13:11:41)
  • アイコンこんにちは、体調を崩して回答が遅れました。すみません。
    ご指導の様にやってみました。DPI環境でもバッチリでした。
    ありがとうございます

    ですがTabPage環境化ではズレました。
    Parentをと思って色々やってみましたが中々上手くいかずTabPage下の座標知る方法はないのでしょうか?
    以上、宜しくお願いします

違反を報告
引用返信
■35282 / ResNo.10)  Re[8]: RichTextBoxのテキストをpictureBOXへ
□投稿者/ KOZ 一般人(12回)-(2022/12/15(Thu) 18:00:28)
  • アイコン
    No35280に返信(ま〜さんの記事)
    > こんにちは、体調を崩して回答が遅れました。すみません。
    
    お大事に。
    
    > ですがTabPage環境化ではズレました。
    > Parentをと思って色々やってみましたが中々上手くいかずTabPage下の座標知る方法はないのでしょうか?
    
    むむむ、やっかいですね高DPI。
    スクリーン座標を取るのが目的でないなら、以下のコードでキャプチャはできると思います。
    
    Imports System.Runtime.InteropServices
    
    Public Class Form1
    
        Public Sub New()
            InitializeComponent()
            PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
            PictureBox1.Size = RichTextBox1.Size
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim bmp = CreateBitmapFromControl(RichTextBox1)
            If PictureBox1.Image IsNot Nothing Then
                PictureBox1.Image.Dispose()
            End If
            PictureBox1.Image = bmp
        End Sub
    
        Private Const SRCCOPY As Integer = &HCC0020
    
        <DllImport("User32.dll")>
        Private Shared Function GetWindowDC(hWnd As IntPtr) As IntPtr
        End Function
    
        <DllImport("user32.dll")>
        Private Shared Function ReleaseDC(hWnd As IntPtr, hDC As IntPtr) As Boolean
        End Function
    
        <DllImport("gdi32.dll")>
        Private Shared Function BitBlt(hdcDest As IntPtr,
                                       nXDest As Integer, nYDest As Integer,
                                       nWidth As Integer, nHeight As Integer,
                                       hdcSrc As IntPtr,
                                       nXSrc As Integer, nYSrc As Integer,
                                       dwRop As Integer) As Boolean
        End Function
    
        Private Shared Function CreateBitmapFromControl(con As Control) As Bitmap
            Dim cs = con.Size
            Dim bmp As New Bitmap(cs.Width, cs.Height)
            Using g = Graphics.FromImage(bmp)
                Dim hdcDest = g.GetHdc()
                Dim hdcSrc = GetWindowDC(con.Handle)
                BitBlt(hdcDest, 0, 0, cs.Width, cs.Height, hdcSrc, 0, 0, SRCCOPY)
                ReleaseDC(con.Handle, hdcSrc)
                g.ReleaseHdc()
            End Using
            Return bmp
        End Function
    
    End Class
    

違反を報告
引用返信
■35295 / ResNo.11)  Re[9]: RichTextBoxのテキストをpictureBOXへ
□投稿者/ ま〜 一般人(32回)-(2022/12/19(Mon) 13:37:36)
  • アイコンPCを変えたりし確認しました。
    バッチリです。
    沢山勉強になりました。
    ありがとうございます。
違反を報告
引用返信
■35296 / ResNo.12)  Re[10]: RichTextBoxのテキストをpictureBOXへ
□投稿者/ ま〜 一般人(33回)-(2022/12/19(Mon) 13:45:34)
  • アイコンクローズ忘れてました。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-9] [10-12]






Mode/  Pass/


- Child Tree -

2024/11/03(Sun) 10:02:20 に作成されたキャッシュを表示しています。
生のデータを表示する | キャッシュを最新にする