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

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

記事リスト ( )内の数字はレス数
Nomal表示動作が重くなる(3) | Nomalbitmapを複数スレッドで処理したい(2) | Nomalフォーム背景のみを半透明にしたい(5) | Nomal読み出し元フォームの位置取得方法(2) | NomalLoadOptionのパラメータの意味(3) | Nomalコンストラクターに続く{}の意味(2) | Nomal1行で書くことできますか?(3) | Nomalvb.netで7zの圧縮・解凍をしたい。(2) | NomalCommandBuilderによって作られるCommandTextの内容(5) | NomalC# NASでのプログレスバー有りのコピー(0) | NomalDataViewのFindRowsde(7) | Nomal正規表現で文字の繰り返しパターン(4) | NomalNPOIでのエクセル編集で期待通りに書き込めません(2) | NomalFormのサイズ変更で掴める辺を制限したい(2) | NomalDataGridのSetDataBindingに代わるもの?(3) | Nomalビデオ圧縮のコーデック(2) | NomalWindowsMediaPlayerで次のURLを指定しても反映されない。(3) | Nomal"−"を縦書きにしたい(9) | Nomal.NET6.0 のWinFormにWPFのユーザーコントロールを配置したい(4) | NomalDataGridViewの列にコンボボックスを表示する(2) | Nomalデータグリッドビューの特定の列ヘッダの色(2) | NomalVB-Report10→11への移行(4) | Nomalデフォルトプリンタの用紙向き変更(0) | NomalASP.net デバッグ時の .js ファイルの変更が反映されない(1) | NomalpictureBoxとlabelの重ね合わせ(2) | NomalWindowsエクスプローラへのドロップ先フォルダの取得(4) | Nomal入力値を元に描画させたい(2) | NomalVBで開いたExcelでのイベントを取得するには(4) | NomalデザイナでSystemColorsのような色一覧から選択できるようにしたい(0) | NomalTaskの入れ子の待ち方2(4) | NomalTaskの入れ子の待ち方(5) | NomalVisualStudio2019 以降の検索ダイアログが正常に動作しない(2) | NomalUsingの使い方が間違っている?(4) | Nomal//./の意味は?(2) | Nomalバイナリーファイルの結合と分解(2) | NomalVSTOとWebView2の共存って可能?(3) | Nomal表の最後の行の下にDropできない(1) | NomalCookieの勉強を始めました。(2) | NomalDataGridViewの特定セルにボタンを配置する方法(3) | NomalDataGridViewのセル結合部分にボタンを表示する方法(3) | Nomal複数のPageに分かれる場合のスクレ―ピング(6) | NomalTask.Runの使い方(4) | NomalPictureBox のサイズを設定する(2) | NomalProcessクラスMainModuleプロパティでアクセス拒否(3) | NomalLINQでControlsをEnable=Falseに設定(3) | Nomalランダムファイルを高速化させたい(5) | Nomalプロセス間の通信(相互)(2) | NomalC#をVBに変換する方法が分かりません(1) | NomalPictureBoxに動的に画像を表示する(1) | NomalYahooのHPで、検索文字の入力ができない(3) | NomalWebView2のEncodeの問題?(5) | NomalWinFormでChromeをSeleriumで操作しているが、Closeの仕方(2) | Nomal印刷部数の固定(1) | NomalWinformでのDataGridView Comboboxのデータ追加削除が出来ない(3) | Nomalプログラムについて。(2) | Nomal拡張子関連付けのサンプルで削除時 例外発生(1) | Nomalユーザーコントロールをフォームで使用した時のエラー(6) | NomalマルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する(12) | Nomal画像の大きさを取得するには(4) | Nomalファイルがドライブ内で占有する容量(3) | NomalC#FormのXボタンイベントで、e.Cancel が使えない(2) | NomalAxWindowsMediaPlayerでプレイリストの途中から再生するには(2) | NomalWebView2でJavaScriptの実行の終了イベント(4) | NomalDataTableのDataRowVersion毎のInt型値の比較がうまくいかない(5) | NomalGPTかMBRを判断したい(2) | Nomalアセンブリ言語について。(1) | Nomalマクロについて。(3) | NomalDLL内のスレッドからイベントを発行すると、受信したフォームでラベルが更新できない(3) | Nomalアセンブリ言語について。(20) | Nomalシステムコールについて。(2) | Nomal Parallel.Forで思ったより早くならない(5) | NomalAngleSharp.Scripting.JavaScriptの使い方(2) | NomalDataAdapterで2回目のUpDateが出来ない(6) | NomalForm1イベントの選択が出来なくなりました。(9) | Nomalデザーナー時の継承先formのサイズ(0) | Nomalコンソールではなくテキストボックスに文字列を出力したい(7) | NomalAngleSharpのクエリー文2(4) | Nomalコーディングについて。(3) | Nomaldll修正時、それを参照しているexeのリビルド要否(2) | NomalAngleSharpのクエリー文(2) | Nomalデフォルトプロパティを使いたい(6) | Nomalテキストボックスでの制御(7) | NomalUSBカメラをピクチャボックスに表示(3) | Nomal二次元配列内の文字の置き換え(3) | Nomalcolor型を引数にする方法(2) | NomalVSプロジェクト作成方法の違いによる、プラグイン機能を持つアプリケーションへの影響について(6) | NomalInputボタンが押せない(4) | NomalWebBrowserのDocumentCompletedイベントの切り替え(3) | NomalEndConnectでのエラー(2) | Nomalボタンクリック時のLeaveイベントについて(1) | Nomalエクセルのデータを配列に読込んだ時の配列要素番号について(2) | Nomalorder by で抽出したデータをDataTableに入れてForEachでDataRow取得した際の順番(2) | Nomal非同期プログラミング時のConsole.WriteLineの動作(4) | NomalC#からストアドにDecimalを渡すと値が丸められる(4) | Nomalインスタンスの型を文字列で指定したい(2) | NomalSendKeys.Sendが効いていない(2) | Nomal他のプロジェクトのコントロールがツールボックスに表示されない(3) | Nomal複数のテキストボックス間のTextChangedイベントが相互干渉しないようにしたい(9) | Nomal呼び出し元によってWebApi側の処理速度に差が出る(1) | NomalPanelのDock=Topだとうまくいかない。代替案。(2) |



■記事リスト / ▼下のスレッド
■35121 / 親記事)  表示動作が重くなる
□投稿者/ たこ 一般人(7回)-(2022/08/01(Mon) 01:48:55)
  • アイコン環境/言語:[VB.NET、.NET Framework 4.7.2、VS2019] 
    分類:[.NET] 

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

    ネットの通信状態を表示するフォームを作って表示させていますが、
    フォームの表示/非表示を繰り返すと動作が遅くなってしまいます。

    何が原因で問題が起こっているか解らず、お知恵をお貸しください。

    表示/非表示の部分
    -----------------------------------------------------------
      ''' <summary>
      ''' モニターForm
      ''' </summary>
      Private IOM As IOMonitor

      Private _IOMonitor = False

      ''' <summary>
      ''' IOモニター表示設定
      ''' </summary>
      ''' <returns>True:表示、False:非表示</returns>
      Public Overridable Property IOMonitor As Boolean
        Set(value As Boolean)
          _IOMonitor = value
          If _IOMonitor Then
            IOM = New IOMonitor(Me)
            IOM.Show()
          Else
            IOM.Close()
            IOM = Nothing
          End If
        End Set
        Get
          Return _IOMonitor
        End Get
      End Property
    -------------------------------------------

    メインクラスからモニターFormへはイベントで情報を渡しています。
    -------------------------------------------
    #Region "イベント定義"
      Public Delegate Sub DIODataEventHandler(ByVal sender As Object, ByVal e As NetDataEventArgs)
      ''' <summary>
      ''' ネット接続時のイベント
      ''' </summary>
      Public Event NetOpen As DIODataEventHandler
      ''' <summary>
      ''' ネット切断時のイベント
      ''' </summary>
      Public Event NetClose As DIODataEventHandler
      ''' <summary>
      ''' ネットエラー時のイベント
      ''' </summary>
      Public Event NetError As DIODataEventHandler
      ''' <summary>
      ''' データ送信時のイベント
      ''' </summary>
      Public Event SendData As DIODataEventHandler
    #End Region
    -------------------------------------------


    表示/非表示を繰り返す度に少しずつではありますが、メモリの使用容量が増ますので、
    ガーベージコレクションの問題かなと思い、
    GC.Collectとか入れてみましたが、上手く行きませんでした…

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

▽[全レス3件(ResNo.1-3 表示)]
■35122 / ResNo.1)  Re[1]: 表示動作が重くなる
□投稿者/ Azulean 大御所(532回)-(2022/08/01(Mon) 07:27:41)
  • アイコンNo35121に返信(たこさんの記事)
    > 何が原因で問題が起こっているか解らず、お知恵をお貸しください。
    現時点の情報ではわからないと思います。

    > メインクラスからモニターFormへはイベントで情報を渡しています。
    怪しむとしたらこのあたりでしょうか。

    たとえば、「メインクラスが公開するイベントに、モニターFormのイベントハンドラをAddHandlerしている」状態で、「RemoveHandlerを書いていない」、または「RemoveHandlerが実行されていない」なら、それが原因です。

    当てずっぽうで書くならこのくらいにとどまります。
    これではない場合は、フォームのコードやモニタクラスのコードなどの周辺コードも示しつつ、リークの量の数量イメージがわかる情報を共有してください。(〇〇KB など)
違反を報告
引用返信
■35123 / ResNo.2)  Re[2]: 表示動作が重くなる
□投稿者/ たこ 一般人(8回)-(2022/08/01(Mon) 12:21:35)
  • アイコンNo35122に返信(Azuleanさんの記事)
    > ■No35121に返信(たこさんの記事)

    >>メインクラスからモニターFormへはイベントで情報を渡しています。
    > 怪しむとしたらこのあたりでしょうか。
    >
    > たとえば、「メインクラスが公開するイベントに、モニターFormのイベントハンドラをAddHandlerしている」状態で、「RemoveHandlerを書いていない」、または「RemoveHandlerが実行されていない」なら、それが原因です。

    IOMonitorの初期化処理は次の様になっており、WithEventsでイベントを取得していますが、Addhandler/RemoveHandlerで書いた方が上手く行くのでしょうか?
    ちなみに今はこの様な形になっています。


    IOMonitor(Form)初期化処理
    -------------------------------------------
      Private WithEvents dc As DIO_LC
      Private Delegate Sub MonitorInvoke(sender As Object, e As NetDataEventArgs)


      Friend Sub New(dc As DIO_LC)

        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        Me.dc = dc
        DIOName.Text = Strings.Right("000" & Me.dc.Index, 3) & ":" & Me.dc.DIOName & vbCrLf & Me.dc.Place
        Me.Text = Me.dc.Index & ":" & Me.dc.DIOName
      End Sub
    -------------------------------------------

    イベント部処理  複数のスレッドから呼び出される為、Invokeしています。。。
    -------------------------------------------
      Private Sub dc_RecievedData(sender As Object, e As NetDataEventArgs) Handles dc.RecievedData
        If System.Text.Encoding.GetEncoding("SHIFT-JIS").GetString(e.Data).Substring(0, 1) = "R" Then
          If Me.InvokeRequired Then
            Me.Invoke(New MonitorInvoke(AddressOf DIO_Disp), sender, e)
            Return
          End If
          DIO_Disp(sender, e)
        End If
      End Sub
    -------------------------------------------

    ちょっと気づきました…

    Private Delegate Sub MonitorInvoke(sender As Object, e As NetDataEventArgs)

    この部分って表示/非表示される度に増えて行く気がします。

    検索したらDelegate.Removeと言うメソッドは見つけました…
    https://docs.microsoft.com/ja-jp/dotnet/api/system.delegate.remove?view=netframework-4.7.2

    …使用例が無く、使い方が全くわかりません^^;
    他にもRemoveAll、RemoveImplなどある様ですが、定義を読んでも解らず…


    どこか良い例が載っているサイトとかあれば教えてください。
違反を報告
引用返信
■35124 / ResNo.3)  Re[3]: 表示動作が重くなる
□投稿者/ たこ 一般人(10回)-(2022/08/01(Mon) 18:46:21)
  • アイコンNo35123に返信(たこさんの記事)
    > ■No35122に返信(Azuleanさんの記事)
    >>■No35121に返信(たこさんの記事)
    >

    > この部分って表示/非表示される度に増えて行く気がします。
    >
    > 検索したらDelegate.Removeと言うメソッドは見つけました…
    > https://docs.microsoft.com/ja-jp/dotnet/api/system.delegate.remove?view=netframework-4.7.2
    >
    > …使用例が無く、使い方が全くわかりません^^;
    > 他にもRemoveAll、RemoveImplなどある様ですが、定義を読んでも解らず…


    解決しました!
    Azulean様のヒントを元にいろいろ試行錯誤し、次の様にしました。
    どうやらdcが邪魔をして遅くなっていた様です。
    念のため、MonitorInvoke.Remove(Nothing, Nothing)も入れました。(使い方合ってるかどうかは自信が無いですが…^^;

    -------------------------------------------
      Private Sub IOMonitor_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
        dc.IOMonitorClose()  '表示/非表示のプロパティがdc側にある為、強制的にFalseにしている
        dc = Nothing
        MonitorInvoke.Remove(Nothing, Nothing)
      End Sub
    -------------------------------------------

    ありがとうございました。
解決み!
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35118 / 親記事)  bitmapを複数スレッドで処理したい
□投稿者/ Trans 一般人(1回)-(2022/07/31(Sun) 11:43:32)
  • アイコン環境/言語:[Windows10、C#] 
    分類:[.NET] 

    並列処理に挑戦したく思い、1枚の画像を複数スレッドで加工するテストコードを書きました。
    {
        // 画像をメモリに読み込む
        FileStream fs = File.OpenRead(filename);
        Image img = Image.FromStream(fs, false, false);
        Bitmap bitmap = new Bitmap(img);
    
        //読み込んだ画像を表示する
        PictureBox.Image = bitmap;
        PictureBox.Refresh();
    
        // 縦横サイズを取得
        int w = img.Width;
        int h = img.Height;
    
        Parallel.Invoke(
            () => TransformPixel(bitmap, 0, 1000, w),
            () => TransformPixel(bitmap, 1000, h, w)
        );
    
        //作成した画像を表示する
        PictureBox.Image = bitmap;
    }
    private void TransformPixel(Bitmap bitmap, int start, int end, int w)
    {
        Color pixel;
        for (int y = start; y < end; y++)
        {
            for (int x = 0; x < w; x++)
            {
                // ピクセル加工
                pixel = PixelTrans(bitmap.GetPixel(x, y));
    
                bitmap.SetPixel(x, y, pixel);
            }
        }
    
    }
    
    ファイルから読み込んだ画像の頭1000ラインまでをスレッド1、残りをスレッド2で加工するような感じです。
    実行してみたところ、
    Parallel.Invoke(の行で、
    
    System.InvalidOperationException
      HResult=0x80131509
      Message=Object is currently in use elsewhere.
      Source=System.Drawing.Common
      スタック トレース:
       at System.Drawing.Bitmap.GetPixel(Int32 x, Int32 y)
    
    のようなエラーとなってしまいます。
    同じbitmapに複数スレッドからの操作は出来ないんじゃないか?という気はするのですが、何をどうすればいいのかがわかりません。
    ご教授をお願いいたします。
    

違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35119 / ResNo.1)  Re[1]: bitmapを複数スレッドで処理したい
□投稿者/ Azulean 大御所(531回)-(2022/07/31(Sun) 17:46:52)
  • アイコンNo35118に返信(Transさんの記事)
    > 同じbitmapに複数スレッドからの操作は出来ないんじゃないか?という気はするのですが、何をどうすればいいのかがわかりません。

    そうですね、1 つの Bitmap を複数のスレッドから触ることはできません。

    LockBits を使ってメモリに展開したものを複数のスレッドで同時に加工することはできるかもしれません。
    https://dobon.net/vb/dotnet/graphics/drawnegativeimage.html#lockbits
違反を報告
引用返信
■35120 / ResNo.2)  Re[2]: bitmapを複数スレッドで処理したい
□投稿者/ Trans 一般人(2回)-(2022/07/31(Sun) 20:55:29)
  • アイコン
    2022/07/31(Sun) 20:55:54 編集(投稿者)
    
    ■No35119に返信(Azuleanさんの記事)
    > ■No35118に返信(Transさんの記事)
    >>同じbitmapに複数スレッドからの操作は出来ないんじゃないか?という気はするのですが、何をどうすればいいのかがわかりません。
    > 
    > そうですね、1 つの Bitmap を複数のスレッドから触ることはできません。
    > 
    > LockBits を使ってメモリに展開したものを複数のスレッドで同時に加工することはできるかもしれません。
    > https://dobon.net/vb/dotnet/graphics/drawnegativeimage.html#lockbits
    
    なるほど。一旦メモリ展開ですか。
    案内の内容を参考に以下のように直してみたら動いたようです。
    ありがとうございました。
    {
        // 画像をメモリに読み込む
        FileStream fs = File.OpenRead(filename);
        Image img = Image.FromStream(fs, false, false);
        Bitmap bitmap = new Bitmap(img);
    
        //読み込んだ画像を表示する
        PictureBox.Image = bitmap;
        PictureBox.Refresh();
    
        // 縦横サイズを取得
        int w = img.Width;
        int h = img.Height;
    
        // Bitmapをロックする
        Rectangle rect = new Rectangle(0, 0, w, h);
        BitmapData bmpData = bitmap.LockBits(rect, ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
    
        // ピクセルデータをバイト型配列で取得する
        IntPtr ptr = bmpData.Scan0;
        string[] array = new string[3];
        byte[] pixels = new byte[bmpData.Stride * img.Height - 1];
        System.Runtime.InteropServices.Marshal.Copy(ptr, pixels, 0, pixels.Length);
    
        Parallel.Invoke(
            () => TransformPixel(pixels, 0, 99999),
            () => TransformPixel(pixels, 100000, pixels.Length)
        );
    
        // ピクセルデータを元に戻す
        System.Runtime.InteropServices.Marshal.Copy(pixels, 0, ptr, pixels.Length);
    
        // ロックを解除する
        bitmap.UnlockBits(bmpData);
    
        //作成した画像を表示する
        PictureBox.Image = bitmap;
    
    }
    
    private void TransformPixel(byte[] pixels, int start, int end)
    {
        for (int i = start; i < end; i++)
        {
            pixels[i] = (byte)~pixels[i];
        }
    
    }
    

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

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35111 / 親記事)  フォーム背景のみを半透明にしたい
□投稿者/ よっし〜 一般人(11回)-(2022/07/26(Tue) 13:31:15)
  • アイコン環境/言語:[VS2013] 
    分類:[.NET] 

    お疲れ様です。度々の投稿で申し訳ございませんが、おおしえくださいませ。

    先の投稿(読み出し元フォームの位置取得方法)でご教示頂き、「出来る!」と思って進めてたのですが・・・
    半透明のフォームを親フォームに重ねて表示したいのですが、半透明(Opacity)を設定すると、フォームに載せたコントロールごと半透明となってしまいます。
    添付の画像の様に「フォームだけを半透明」する方法はありませんでしょうか??
    ちなみに添付画像は半透明のフォームだけを重ねて表示し、別のOpacity=100%のフォームをさらに重ねております。
    (親フォームを合わせて3フォームを重ねています)
    出来るには出来るのですが、コードが煩雑になりますので、何か良い方法は無いかと模索しております。

    お忙しいとは思いますが、宜しくご教示のほどお願いいたします。
804×601 => 250×186
イメージ
1658809874.png
/18KB
違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■35112 / ResNo.1)  Re[1]: フォーム背景のみを半透明にしたい
□投稿者/ 魔界の仮面弁士 大御所(1438回)-(2022/07/26(Tue) 14:50:11)
  • アイコンNo35111に返信(よっし〜さんの記事)
    > 添付の画像の様に「フォームだけを半透明」する方法はありませんでしょうか??

    タイトルなし枠無しの Form の背景色を、普段使わない色にしておき、
    その色を TransparencyKey に指定すれば、フォーム部が全透過状態の
    「コントロール部だけのフォーム」ができあがります。
    https://dobon.net/vb/dotnet/form/transparencykey.html

    そのフォームを、Opacity プロパティを設定した別フォームの手前に配置すれば
    フォームの数を 3 つから 2 つに減らせると思います。
    https://dobon.net/vb/dotnet/form/opacity.html


    > フォームに載せたコントロールごと半透明となってしまいます。
    TransparencyKey や Opacity は、フォーム全体に対して一括適用されるため
    コントロール部のみを除外するといったことはできません。

    フォーム 1 つのまま、部分的な半透明化を実現するためには、
    UpdateLayeredWindow API を直接呼び出す必要があります。

    フォームサイズが固定なのであれば、フォームサイズの PNG ファイルを用意し、
    あらかじめその画像内の透明度情報で、不透明箇所と半透明箇所を塗り分けます。
    それを UpdateLayeredWindow API に渡して適用すればできます。

    https://wiki.onakasuita.org/pukiwiki/?UpdateLayeredWindow
    https://dobon.net/vb/bbs/log3-44/26446.html


違反を報告
引用返信
■35113 / ResNo.2)  Re[2]: フォーム背景のみを半透明にしたい
□投稿者/ よっし〜 一般人(12回)-(2022/07/26(Tue) 15:50:12)
  • アイコンNo35112に返信(魔界の仮面弁士さんの記事)

    魔界の仮面弁士様、毎度お世話になり、申し訳ございません。

    > タイトルなし枠無しの Form の背景色を、普段使わない色にしておき・・・
    > フォームの数を 3 つから 2 つに減らせると思います。
    現在も親の上に半透明シート(?)を表示させ、その上にLabelを配置したフォームを表示させております。

    > フォーム 1 つのまま、部分的な半透明化を実現するためには、UpdateLayeredWindow API を直接呼び出す必要があります。
    > フォームサイズが固定なのであれば、フォームサイズの PNG ファイルを用意し、
    > あらかじめその画像内の透明度情報で、不透明箇所と半透明箇所を塗り分けます。
    > それを UpdateLayeredWindow API に渡して適用すればできます。
    記載先をお教え頂きましたが、なかなかのボリュームですね。
    まぁ簡単にできない事は分かっておりますので、ちょっとゴリゴリと試してみたいと思います。

    まずは御礼まで・・どうも有り難うございました。


1044×727 => 250×174
イメージ
20220726153947-min.png
/14KB
違反を報告
引用返信
■35114 / ResNo.3)  Re[3]: フォーム背景のみを半透明にしたい
□投稿者/ 魔界の仮面弁士 大御所(1439回)-(2022/07/26(Tue) 16:42:28)
  • アイコン
    No35113に返信(よっし〜さんの記事)
    > 現在も親の上に半透明シート(?)を表示させ、その上にLabelを配置したフォームを表示させております。
    
    半透明シートを被せて、下の親フォームを操作不能にしたいという意図でしょうか。
    
    であれば、親フォームにフォームサイズの Panel を全体表示しておき、
    その Panel の背景に、親フォームの内容を描画してはどうでしょう。
    
    
    (1) 親フォームに Panel1 を配置。これが半透明モドキになる。
     Panel1 は普段、Visible = False にしておく。
    
    (2) その Panel1 内に、子コントロールとして黄色の Panel2 を置き、
     Panel2 内に Label1 や Button1 を置く。
     Button1_Click のイベントにて「Panel1.Hide()」を記述。
    
    (3) 半透明表示のために、以下を実行。
    
    'Panel1 は Visible = False な状態で開始する事
    Panel1.Visible = False
    
    Dim cr = Me.ClientRectangle
    Dim r = Me.RectangleToScreen(cr)
    Dim bmp As New Bitmap(cr.Width, cr.Height)
    Using g = Graphics.FromImage(bmp)
        '画面キャプチャ
        g.CopyFromScreen(r.Location, New Point(0, 0), r.Size)
        '半透明のスモークをかける
        Using b As New SolidBrush(Color.FromArgb(180, Color.DarkSlateGray))
            g.FillRectangle(b, cr)
        End Using
    End Using
    
    'Panel1を重ねて表示
    Dim oldBmp = Panel1.BackgroundImage
    Panel1.BackgroundImage = bmp
    If oldBmp IsNot Nothing Then
        oldBmp.Dispose()
    End If
    Panel1.BringToFront()
    Panel1.SetBounds(cr.X, cr.Y, cr.Width, cr.Height)
    Panel1.Visible = True

違反を報告
引用返信
■35115 / ResNo.4)  Re[4]: フォーム背景のみを半透明にしたい
□投稿者/ よっし〜 一般人(13回)-(2022/07/27(Wed) 12:14:45)
  • アイコンNo35114に返信(魔界の仮面弁士さんの記事)

    魔界の仮面弁士様、早速のご教示、有り難うございます。
    > 半透明シートを被せて、下の親フォームを操作不能にしたいという意図でしょうか。
    > であれば、親フォームにフォームサイズの Panel を全体表示しておき、
    > その Panel の背景に、親フォームの内容を描画してはどうでしょう。
    そうです。まさにそうです。
    先の投稿の画面はサンプルで親フォームはスッキリしておりますが、実際の親フォームはゴチャゴチャしておりますので、
    予めパネルを貼らずに、動的に貼る様にしたいと思います。
    今後の為に、サンプルだけ貼らして頂きます。
    どうも、有り難うございました。

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    Dim cr = Me.ClientRectangle
    Dim r = Me.RectangleToScreen(cr)
    Dim bmp As New Bitmap(cr.Width, cr.Height)
    Using g = Graphics.FromImage(bmp)
    '画面キャプチャ
    g.CopyFromScreen(r.Location, New Point(0, 0), r.Size)
    '半透明のスモークをかける
    Using b As New SolidBrush(Color.FromArgb(180, Color.DarkGray))
    g.FillRectangle(b, cr)
    End Using
    End Using

    Dim Pnl As New Panel
    Pnl.Parent = Me

    'Panel1を重ねて表示
    Dim oldBmp = Pnl.BackgroundImage
    Pnl.BackgroundImage = bmp
    If oldBmp IsNot Nothing Then oldBmp.Dispose()
    Pnl.BringToFront()
    Pnl.SetBounds(cr.X, cr.Y, cr.Width, cr.Height)
    Pnl.Visible = True
    Form4.ShowDialog(Me)
    Pnl.Visible = False
    Pnl.Dispose()
    End Sub


解決み!
違反を報告
引用返信
■35116 / ResNo.5)  Re[5]: フォーム背景のみを半透明にしたい
□投稿者/ 魔界の仮面弁士 大御所(1440回)-(2022/07/27(Wed) 13:50:17)
  • アイコンNo35115に返信(よっし〜さんの記事)
    > Form4.ShowDialog(Me)
    ShowDialog 後の Dispose の呼び出しが漏れているように見えました。
    https://dobon.net/vb/dotnet/form/showform.html

    Show の場合は、フォームが閉じられた時に自動的に Dispose され、メモリ上からアンロードされますが、
    ShowDialog の場合は、使用後に Dispose しないと、閉じられた後もメモリ上に残り続けます。


    それともあえてこの時点では Dispose しないようにしてあるだけで、
    別の場所で Dispose する仕様にしてあるのでしょうか。


    > Dim Pnl As New Panel
    > Pnl.Parent = Me
    > Dim oldBmp = Pnl.BackgroundImage

    これは冗長でしょう。

    新規パネルを、その都度生成するのであれば、
    上記の oldBmp は、常に Nothing ですよね。


    Dim cr = Me.ClientRectangle
    Dim r = Me.RectangleToScreen(cr)
    Using bmp As New Bitmap(cr.Width, cr.Height)
      Using g = Graphics.FromImage(bmp)
        g.CopyFromScreen(r.Location, New Point(0, 0), r.Size)
        Dim alpha As Integer = 255 * 80 \ 100 '不透明度 80%
        Using b As New SolidBrush(Color.FromArgb(alpha, SystemColors.AppWorkspace))
          g.FillRectangle(b, cr)
        End Using
      End Using
      Using pnl As New Panel()
        pnl.Parent = Me
        pnl.BackgroundImage = bmp
        pnl.BringToFront()
        pnl.SetBounds(cr.X, cr.Y, cr.Width, cr.Height)
        pnl.Visible = True

        'Using child As New Form4() With {.StartPosition = FormStartPosition.CenterParent}
        '  child.ShowDialog(Me)
        'End Using
        Form4.ShowDialog(Me)

        Me.Controls.Remove(pnl)
      End Using
    End Using
解決み!
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35108 / 親記事)  読み出し元フォームの位置取得方法
□投稿者/ よっし〜 一般人(9回)-(2022/07/22(Fri) 14:38:19)
  • アイコン環境/言語:[VS2013] 
    分類:[.NET] 

    お疲れ様です。また簡単な事かもしれませんが、おおしえくださいませ。

    現在Aフォームから別のBフォームをShowDialogで表示し、BフォームのOpacityを50%に設定して重ねて表示したいと考えております。
    その際、Aフォームのタイトルバーの下に表示したいので、大きさはAフォームのClientSizeで取得出来ますが左上の位置の取得する方法が分かりません。
    ここで言うBホームの左上とは「AフォームのClientSizeの0,0の位置」です。

      (_OYForm=親フォーム)
    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles Me.Load
    Me.Location = ??
    Me.Size = _OYForm.ClientSize
    End Sub

    ClientRectangleのLeftとTopかと思いましたが、常に0でした(当たり前でしょうが・・)

    以上、宜しくご教示のほどお願いいたします。



違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35109 / ResNo.1)  Re[1]: 読み出し元フォームの位置取得方法
□投稿者/ 魔界の仮面弁士 大御所(1437回)-(2022/07/22(Fri) 17:49:46)
  • アイコンNo35108に返信(よっし〜さんの記事)
    > ここで言うBホームの左上とは「AフォームのClientSizeの0,0の位置」です。

    rect = targetForm.RectangleToScreen(targetForm.ClientRectangle)

    でスクリーン座標が得られそうですが、これでは駄目でしょうか。
    ※未検証です
違反を報告
引用返信
■35110 / ResNo.2)  Re[2]: 読み出し元フォームの位置取得方法
□投稿者/ よっし〜 一般人(10回)-(2022/07/25(Mon) 09:54:45)
  • アイコン
    No35109に返信(魔界の仮面弁士さんの記事)
    > ■No35108に返信(よっし〜さんの記事)
    >>ここで言うBホームの左上とは「AフォームのClientSizeの0,0の位置」です。
    > rect = targetForm.RectangleToScreen(targetForm.ClientRectangle)
    > でスクリーン座標が得られそうですが、これでは駄目でしょうか。
    
    魔界の仮面弁士様、早速のご教示頂きまして有り難うございます。
    
    お教え頂いた内容ですが・・・完璧でございます。
    
            Dim A As Rectangle = Oya.RectangleToScreen(Oya.ClientRectangle)
            Me.Location = New Point(A.Left, A.Top)
            Me.Size = New Size(A.Width, A.Height)
    
    どうも有り難うございました。

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

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



■記事リスト / ▲上のスレッド
■35105 / 親記事)  LoadOptionのパラメータの意味
□投稿者/ Wan 付き人(73回)-(2022/07/20(Wed) 08:21:43)
  • アイコン環境/言語:[VisualBasic2019 Windows10 Basic Framework4.7.2] 
    分類:[.NET] 

    マイクロソフトのDocsのDataTable.Load メソッドのLoadOptionところに下記のような記述があります。
    https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datatable.load?view=net-6.0#system-data-datatable-load(system-data-idatareader-system-data-loadoption)
    「メソッドの呼び出し Load 時に OverwriteChanges または PreserveChanges オプションを指定すると、受信データが 'プライマリ データ ソースから送信され、DataTable が変更を DataTable追跡し、変更をデータ ソースに反映できることを前提とします。 Upsert オプションを選択した場合、データは、中間層コンポーネントによって提供されるデータなど、セカンダリ データ ソースのいずれかから取得されたものと見なされ、ユーザーによって変更される可能性があります。 この場合、意図は、1 つ以上のデータ ソースからデータを集計し、データをプライマリ データ ソース DataTableに反映することを前提とします。 この LoadOption パラメーターは、主キー比較に使用する行の特定のバージョンを決定するために使用されます。」

    この内容が全く理解できません。
    @ プライマリーデータソース、セカンダリーデータソースって何ですか?Load()の結果Setが複数あり、一つ目をプライマリー、二つ目以後を纏めてセカンダリーと呼んでるのでしょうか?
    A 「プライマリ データ ソースから送信され」とは、Dt.Load()とした場合のDtにスキーマ情報が無い場合は、プライマリーデータからスキーマ情報をすべて取得することを前提としているという解釈でしょうか?
    B 「データをプライマリ データ ソース DataTableに反映することを前提」とは、Dt.Load() のDtにスキーマ情報が存在する場合は、必要に応じて列の追加処理を行うという意味でしょうか?
    C 「主キー比較に使用する行の特定のバージョン」とは、OverwriteChangesは、Originalの主キーデータを、PreserveChangesは、Currentの、Upsertは、Originalが存在すればOriginalを存在しなければCurrentの値を比較するという意味であってますか?

    詳しい方宜しくお願い致します。

違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■35106 / ResNo.1)  Re[1]: LoadOptionのパラメータの意味
□投稿者/ Hongliang 大御所(631回)-(2022/07/20(Wed) 10:19:27)
  • アイコンまずそもそも、DataTable.Load(IDataReader, LoadOption)は、
    > Fills a DataTable with values from a data source using the supplied IDataReader. If the DataTable already contains rows, the incoming data from the data source is merged with the existing rows according to the value of the loadOption parameter.
    > IDataReaderによって提供されるデータソースの値でDataTableを満たします。データテーブルがすでに行を含んでいる場合、データソースからのデータはloadOptionパラメータの値に従って既存の行とマージされます。
    というメソッドであり、loadOptionパラメータは「データソースからのデータ」と「DataTableに既に存在しているデータ」のマージの方法を指定するものです。
    例えばDataTableが空であれば特に意味を持ちません。

    > @ プライマリーデータソース、セカンダリーデータソースって何ですか?Load()の結果Setが複数あり、一つ目をプライマリー、二つ目以後を纏めてセカンダリーと呼んでるのでしょうか?

    複数のデータソースを扱う場合の話ですね。
    大本のデータソースとなるDBからいったんFillして、追加分をまとめたXMLをセカンダリデータソースとしてLoadでマージするとか。

    > A 「プライマリ データ ソースから送信され」とは、Dt.Load()とした場合のDtにスキーマ情報が無い場合は、プライマリーデータからスキーマ情報をすべて取得することを前提としているという解釈でしょうか?

    この記述はスキーマ情報とは関係ないです。
    DataTableがスキーマを持っていない場合の挙動は別の段落に記載があります。
    (そしてDataTableがスキーマを持っていないならそのDataTableは空ということですから、loadOptionは意味を持ちません)

    > B 「データをプライマリ データ ソース DataTableに反映することを前提」とは、Dt.Load() のDtにスキーマ情報が存在する場合は、必要に応じて列の追加処理を行うという意味でしょうか?

    ここもスキーマとは関係ないです。
    スキーマに関することは別段落に記載があり、その際の挙動は表にまとめられています。
    OverwriteChanges/PreserveChangesでLoadしたデータはプライマリデータソースからのデータとみなし、あとあとデータソースに反映させることができるようにDataTableの変更を追跡する、ということです。
    一方Upsertは、Loadするデータがセカンダリデータソースからのデータであるとみなされます。

    > C 「主キー比較に使用する行の特定のバージョン」とは、OverwriteChangesは、Originalの主キーデータを、PreserveChangesは、Currentの、Upsertは、Originalが存在すればOriginalを存在しなければCurrentの値を比較するという意味であってますか?

    表を見る限り、OverwriteChangesとPreserveChangesは同じになっていますが?
違反を報告
引用返信
■35107 / ResNo.2)  Re[1]: LoadOptionのパラメータの意味
□投稿者/ 魔界の仮面弁士 大御所(1436回)-(2022/07/20(Wed) 16:38:40)
  • アイコン2022/07/20(Wed) 16:46:02 編集(投稿者)

    No35105に返信(Wanさんの記事)
    > マイクロソフトのDocsのDataTable.Load メソッドのLoadOptionところに下記のような記述があります。
    > https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datatable.load?view=net-6.0#system-data-datatable-load(system-data-idatareader-system-data-loadoption)

    機械翻訳で文章が崩れているので、人力翻訳されていた頃(VS2008 まで)の
    ドキュメントの方が読み解きやすいかも知れません。下記から入手できます。
    https://www.microsoft.com/ja-jp/download/details.aspx?id=20955

    上記をインストール後、該当ページはこのあたり。
    ms-help://MS.MSDNQTR.v90.ja/fxref_system.data/html/37e7d8d2-8981-efdd-e808-c319ccb71685.htm
    ms-help://MS.MSDNQTR.v90.ja/fxref_system.data/html/16edeab2-613e-c1f8-a1bf-f39d9a655ad0.htm

    上記から引用:
    |
    | Load メソッドを呼び出すときに OverwriteChanges オプションまたは PreserveChanges オプションを
    | 指定した場合、受信データは DataTable の主データ ソースから受信されており、DataTable によって
    | 変更が追跡され、変更をデータ ソースに反映できることが想定されます。Upsert オプションを
    | 選択した場合、データは中間層コンポーネントから得られるデータなどの 2 次データ ソースの
    | 1 つから受信されていることが想定されます。これはユーザーにより変更されている可能性があります。
    | その場合、DataTable 内の 1 つ以上のデータ ソースのデータを集約した後、そのデータを
    | 主データ ソースに反映する意図があることが想定されます。主キーの比較に使用する
    | 行のバージョンを特定するために、LoadOption パラメータが使用されます。
    |
    ----
    |
    | 一般的に PreserveChanges オプションと OverwriteChanges オプションでは、ユーザーが
    | DataSet およびその変更を主データ ソースと同期する必要がある場合を想定しています。
    | Upsert オプションは、1 つ以上の 2 次データ ソースの変更を集約するときに役立ちます。
    |


    > @ プライマリーデータソース、セカンダリーデータソースって何ですか?
    > Load()の結果Setが複数あり、一つ目をプライマリー、二つ目以後を纏めてセカンダリーと呼んでるのでしょうか?

    DataTable は、単一の主データソース(a single primary data source)により同期・更新されます。
    さらに DataTable には、1 つ以上の 2 次データソース(one or more secondary data sources)の
    増分データ(incremental data)を加えることもできます。


    > C 「主キー比較に使用する行の特定のバージョン」とは、
    > OverwriteChangesは、Originalの主キーデータを、
    > PreserveChangesは、Currentの、
    > Upsertは、Originalが存在すればOriginalを存在しなければCurrentの値を比較するという意味であってますか?

    既存行に対する DataRow の特定は PrimaryKey 制約によって行われるわけですが、マッチングされた既存行の
    RowState As DataRowState プロパティに対して、LoadOption がどのように作用するのかを示したものですね。


    Load 時に OverwriteChanges が指定された場合、Original と Current の両方に書き込まれます。
    そして新データにマッチした既存行は、全て Unchanged 状態に上書きされます。
    Deleted 状態だった既存行も、削除が元に戻されて Unchanged 状態に復帰します。
    既存行とマッチしない新規行も、 Unchanged 状態で取り込まれます。

    Load 時に PreserveChanges が指定された場合、Original に書き込まれます。
    Added / Modifed な既存行は、いずれも Modifed 状態になります。
    Unchanged/Deleted な既存行の RowState はそのまま維持されます。
    既存行とマッチしない新規行も、 Unchanged 状態で取り込まれます。

    Load 時に Upsert が指定された場合、Current に対して書き込まれます。
    Added/Modifed な行の RowState はそのまま維持されます。
    Unchanged だった行は、新しい値に応じて Unchanged または Modified のいずれかになります。
    既存行とマッチしない新規行は、 Added 状態で取り込まれます。
違反を報告
引用返信
■35117 / ResNo.3)  Re[2]: LoadOptionのパラメータの意味
□投稿者/ Wan 付き人(74回)-(2022/07/27(Wed) 18:33:48)
  • アイコンHongliang様、魔界の仮面弁士様
    いつも御指南ありがとうございます。
    お返事したつもりが、遅れていなかったようで、結果的に、お礼が遅くなりすみません。
    両者に御指南頂いた内容を熟読して自己研鑽に励みたいと思います。
    現在格闘中です。

    有難うございました

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

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






Mode/  Pass/


- Child Tree -