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

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

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



■記事リスト / ▼下のスレッド
■35135 / 親記事)  特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因
□投稿者/ わっしー 一般人(1回)-(2022/08/24(Wed) 21:33:40)
  • アイコン環境/言語:[Windows10] 
    分類:[.NET] 

    インストーラーを作成して、社内の人に配布をして利用していただいております。
    100人以上の方に問題なく使っていただけてますか、1名だけ「パディングは無効なので削除できません」とエラーが発生します。
    アンインストール→インストールを何度か試していただきましたが改善せず
    再度インストーラーを作り直して、インストールしてみましたが改善できませんでした。

    コード内に暗号化/復号の処理があるため、そこでのエラーと思われますが、特定のPCだけで発生しているため、全く原因がわからない状態です。

    皆様にお力添えいただきたく、よろしくお願いいたします。
450×167 => 250×92
イメージ
1661344420.png
/16KB
違反を報告
引用返信

▽[全レス6件(ResNo.2-6 表示)]
■35138 / ResNo.2)  Re[2]: 特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因
□投稿者/ 魔界の仮面弁士 大御所(1446回)-(2022/08/25(Thu) 02:12:25)
  • アイコンNo35137に追記(魔界の仮面弁士の記事)
    > 参考情報としてこのあたり。
    > https://social.msdn.microsoft.com/Forums/security/ja-JP/fbd89c41-0af8-4b1a-8106-fa9a69e4488b/24489214952127012395123881235612390?forum=vbgeneralja

    もう一つこの辺りの回答も。手前味噌ですが。
    http://bbs.wankuma.com/index.cgi?mode=al2&namber=78391&KLOG=133
違反を報告
引用返信
■35139 / ResNo.3)  Re[2]: 特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因
□投稿者/ わっしー 一般人(2回)-(2022/08/26(Fri) 13:11:37)
  • アイコンNo35137に返信(魔界の仮面弁士さんの記事)

    ご回答ありがとうございます。
    URLを参照してパディングに意味がわかりました。

    暗号化/復号は下記のURLの内容をそのまま使用しています。
    https://dobon.net/vb/dotnet/string/encryptfile.html

    上記の方法の場合にご指摘いただいた理由でエラーになる可能性はございますでしょうか?

    エラー画面の詳細のキャプチャも添付させていただきます。

    恐れ入りますが、よろしくお願いいたします。

1184×160 => 250×33
イメージ
1661487093.png
/14KB
違反を報告
引用返信
■35140 / ResNo.4)  Re[3]: 特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因
□投稿者/ 魔界の仮面弁士 大御所(1447回)-(2022/08/26(Fri) 15:00:58)
  • アイコンNo35139に返信(わっしーさんの記事)
    > エラー画面の詳細のキャプチャも添付させていただきます。
    Visual Basic をお使いのようですね。では VB の文法で回答します。


    > 暗号化/復号は下記のURLの内容をそのまま使用しています。
    > https://dobon.net/vb/dotnet/string/encryptfile.html
    そのページには複数の実装がありますよね…?
    今回はスタックトレースを貼って頂いたので、

    https://dobon.net/vb/dotnet/string/encryptfile.html#codecaption1
    Sub DecryptFile(sourceFile As String, destFile As String, key As Byte(), iv As Byte())

    ではなく

    https://dobon.net/vb/dotnet/string/encryptfile.html#codecaption5
    Sub DecryptFile(sourceFile As String, destFile As String, password As String)

    の方であることは分かりましたが、もう少し具体的に示して欲しかったです。
    (サイトでは Shared Sub になっていましたが、Module1 上なので Shared を外しているものと想像)


    ちなみに、.NET Core においては、RijndaelManaged クラスは非推奨とされており、
    かわりに Aes.Create メソッドを使うべきとアナウンスされていたりします。
    もっとも .NET Framework の場合は、 Obsolete にはなっていないのですけれどね。
    (AES と Rijndael の違いについては、ここでは触れずにおきます)

    一応念のため、.NET Framework バージョンも教えてください。


    > 上記の方法の場合にご指摘いただいた理由でエラーになる可能性はございますでしょうか?
    どうでしょうね。今ちょっと、検証やコードレビューする余裕が無いのです…。

    ただ、既定のパラメーターの場合、CBC の PKCS#7 パディングになっているはず。


    なのでひとまず、復号側の実装で、
     Dim rijndael As New System.Security.Cryptography.RijndaelManaged()
    の行を
     Dim rijndael As New System.Security.Cryptography.RijndaelManaged()
     rijndael.Padding = System.Security.Cryptography.PaddingMode.None
    に変更してみてください。


    本当にパディングだけの問題なら、復号後のファイルサイズは 16 の倍数バイトとなり、
    復号されたデータの末尾に最大 16 バイトのゴミデータが付与されるはずです。
    (末尾にゴミが付く点を除けば、暗号化は正しく解除されるはず)

    この末尾データは、16 の倍数に揃えるためのパディングデータであり、
    「末尾 16 バイトがすべて &H10」
    「末尾 15 バイトがすべて &H0F」
    「末尾 14 バイトがすべて &H0E」
    「末尾 13 バイトがすべて &H0D」
      :
      :
    「末尾 3 バイトがすべて &H03」
    「末尾 2 バイトがすべて &H02」
    「末尾 1 バイトが &H01」
    のいずれかになります。
    たとえば元が 0 バイトのファイルであった場合、復号したファイルは
    &H10 のみでパディングされた 16 バイトになるということです。


    もし、末尾が上記いずれのパターンでも無かった場合や、あるいは
    それでも途中でエラーになるようであれば、暗号化されたファイル
    もしくはパスワードのいずれかが破損している事を意味するでしょう。
違反を報告
引用返信
■35142 / ResNo.5)  Re[4]: 特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因
□投稿者/ 魔界の仮面弁士 大御所(1448回)-(2022/08/26(Fri) 16:04:40)
  • アイコン2022/08/26(Fri) 16:05:59 編集(投稿者)

    No35140に追記(魔界の仮面弁士の記事)
    > それでも途中でエラーになるようであれば、暗号化されたファイル
    > もしくはパスワードのいずれかが破損している事を意味するでしょう。

    ファイルのサイズが「16 の倍数バイト」であるかどうかを確認する作業は
    『暗号化されたファイルのサイズ』と
    『Padding なしで複号した結果ファイル』の
    両方に対して行ってください。

    暗号データが 16 の倍数バイトでは無い場合は、
    暗号データ自体の破損を意味します。
違反を報告
引用返信
■35143 / ResNo.6)  Re[5]: 特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因
□投稿者/ わっしー 一般人(3回)-(2022/08/26(Fri) 21:33:41)
  • アイコンNo35142に返信(魔界の仮面弁士さんの記事)
    > 2022/08/26(Fri) 16:05:59 編集(投稿者)

    ありがとうございます。

    .NET Frameworkはバージョン4.6になります。

    すみません、仰る通り、サイトの2つ目の方の暗号化/復号を利用しており
    Module1にPublic Sub で記載しており、別のForm部分から呼び出すようにしています。


     Dim rijndael As New System.Security.Cryptography.RijndaelManaged()
     rijndael.Padding = System.Security.Cryptography.PaddingMode.None
    に変更して、インストーラーを作成して、エラーが出ているPCで試してみます。

    私のPCではエラーはでないのですが、暗号化されているファイルは16の倍数バイトになっていました。
    エラーが出ているPCで、どうなっているかも確認してみます。


違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35494 / 親記事)  VB.NETからcmdでpingを実行した時の結果
□投稿者/ ぱんだ 一般人(1回)-(2023/08/22(Tue) 19:38:48)
  • アイコン環境/言語:[環境:Windows11 Pro 64bit 使用言語:VB.NET(Visual Studio 2022)] 
    分類:[.NET] 

    はじめまして。
    
    最近プログラミングを始めようと思い立ち以下のサンプルを試してみたのですが、
    pingのように結果がリアルタイム?で何度も返ってくる場合のサンプルコードを
    知りたいです。
    https://dobon.net/vb/dotnet/process/standardoutput.html
    
    ipconfigなどのように結果が1回で終わるものは上記のサンプルで出来ました。
    
    Visual Studio 2022をWindows11 Pro 64bitで使用しています。
    
    お手数をおかけしますが、よろしくお願いいたします。
    

違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■35495 / ResNo.1)  Re[1]: VB.NETからcmdでpingを実行した時の結果
□投稿者/ KOZ 一般人(23回)-(2023/08/22(Tue) 21:00:42)
  • アイコン
    No35494に返信(ぱんださんの記事)
    > pingのように結果がリアルタイム?で何度も返ってくる場合のサンプルコードを
    > 知りたいです。
    
    Process.StandardOutput は StreamReader です。
    EndOfStream プロパティが True になるまで ReadLine を繰り返してください。
    
    Using p As New Process
        p.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec")
        p.StartInfo.UseShellExecute = False
        p.StartInfo.RedirectStandardOutput = True
        p.StartInfo.RedirectStandardInput = False
        p.StartInfo.CreateNoWindow = True
        p.StartInfo.Arguments = "/c ping 127.0.0.1"
        p.Start()
        Dim reader = p.StandardOutput
        Do Until reader.EndOfStream
            Dim buffer = reader.ReadLine()
            Console.WriteLine(buffer)
        Loop
        p.WaitForExit()
    End Using
    Console.WriteLine("何かキーを押すと終了します。")
    Console.ReadKey()
    

違反を報告
引用返信
■35496 / ResNo.2)  Re[2]: VB.NETからcmdでpingを実行した時の結果
□投稿者/ ぱんだ 一般人(2回)-(2023/08/22(Tue) 23:54:44)
  • アイコン
    早速の返信ありがとうございます。
    おかげさまで以下のコードで実現できて助かりました。
    これから少しづつ学んでいこうと思います。
    ありがとうございました。
    
            Using p As New Process
                p.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec")
                p.StartInfo.UseShellExecute = False
                p.StartInfo.RedirectStandardOutput = True
                p.StartInfo.RedirectStandardInput = False
                p.StartInfo.CreateNoWindow = True
                p.StartInfo.Arguments = "/c ping 127.0.0.1"
                p.Start()
                Dim reader = p.StandardOutput
                Do Until reader.EndOfStream
                    Dim buffer = reader.ReadLine()
                    '以下3行を追加
                    Debug.Print(buffer)
                    TextBox1.Text = TextBox1.Text & vbCrLf & buffer
                    Me.Refresh()
                Loop
                p.WaitForExit()
            End Using

違反を報告
引用返信
■35497 / ResNo.3)  Re[2]: VB.NETからcmdでpingを実行した時の結果
□投稿者/ ぱんだ 一般人(3回)-(2023/08/23(Wed) 00:12:12)
  • アイコン
    KOZさん
    
    度々すみません。
    以下のコードと添付写真の通り作成してみたのですが、
    例えば添付写真のように途中でキャンセルする方法はありますか?
    実行中は他のボタンも押せなくなってしまいます。
    何度も申し訳ありませんが、可能でしたらサンプルコードを教えて
    いただけましたら幸いです。
    何卒よろしくお願いいたします。
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            'Process.StandardOutput は StreamReader です。
            'EndOfStream プロパティが True になるまで ReadLine を繰り返してください。
    
            Using p As New Process
                p.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec")
                p.StartInfo.UseShellExecute = False
                p.StartInfo.RedirectStandardOutput = True
                p.StartInfo.RedirectStandardInput = False
                p.StartInfo.CreateNoWindow = True
                'p.StartInfo.Arguments = "/c ping 127.0.0.1"
                p.StartInfo.Arguments = "/c " & TextBox2.Text
                p.Start()
                Dim reader = p.StandardOutput
                Do Until reader.EndOfStream
                    Dim buffer = reader.ReadLine()
                    'Console.WriteLine(buffer)
                    Debug.Print(buffer)
                    TextBox1.Text = TextBox1.Text & vbCrLf & buffer
                    Me.Refresh()
                Loop
                p.WaitForExit()
            End Using
            'Console.WriteLine("何かキーを押すと終了します。")
            'Console.ReadKey()
        End Sub

639×389 => 250×152
イメージ
2023-08-23.png
/11KB
違反を報告
引用返信
■35498 / ResNo.4)  Re[3]: VB.NETからcmdでpingを実行した時の結果
□投稿者/ KOZ 一般人(24回)-(2023/08/23(Wed) 05:54:27)
  • アイコン
    2023/08/23(Wed) 05:57:00 編集(投稿者)
    
    ■No35497に返信(ぱんださんの記事)
    
    CTRL+C を送ってキャンセルでいいんですかね?
    
    Imports System.Runtime.InteropServices
    
    Public Class Form1
    
        Private cmdProcess As Process
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            If cmdProcess IsNot Nothing Then Return
            TextBox1.Clear()
            cmdProcess = New Process
            cmdProcess.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec")
            cmdProcess.StartInfo.UseShellExecute = False
            cmdProcess.StartInfo.RedirectStandardOutput = True
            cmdProcess.StartInfo.RedirectStandardInput = False
            cmdProcess.StartInfo.CreateNoWindow = True
            cmdProcess.StartInfo.Arguments = "/c " & TextBox2.Text
            cmdProcess.Start()
            Task.Run(AddressOf ReadTask)
            Button1.Enabled = False
            Button2.Enabled = True
        End Sub
    
        Private Sub ReadTask()
            Dim reader = cmdProcess.StandardOutput
            Do Until reader.EndOfStream
                Dim buffer = reader.ReadLine()
                Invoke(Sub()
                           TextBox1.AppendText(vbCrLf & buffer)
                           Refresh()
                       End Sub)
            Loop
            cmdProcess.WaitForExit()
            cmdProcess.Dispose()
            cmdProcess = Nothing
            Invoke(Sub()
                       Button1.Enabled = True
                       Button2.Enabled = False
                   End Sub)
        End Sub
    
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            If AttachConsole(cmdProcess.Id) Then
                SetConsoleCtrlHandler(IntPtr.Zero, True)
                GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0)
                cmdProcess.WaitForExit()
                SetConsoleCtrlHandler(IntPtr.Zero, False)
                FreeConsole()
            End If
        End Sub
    
        Private Const CTRL_C_EVENT = 0
        Private Const CTRL_BREAK_EVENT = 1
    
        <DllImport("Kernel32")>
        Private Shared Sub GenerateConsoleCtrlEvent(dwCtrlEvent As Integer, dwProcessGroupId As Integer)
        End Sub
    
        <DllImport("Kernel32")>
        Private Shared Function AttachConsole(dwProcessId As Integer) As Boolean
        End Function
    
        <DllImport("Kernel32")>
        Private Shared Function SetConsoleCtrlHandler(HandlerRoutine As IntPtr, add As Boolean) As Boolean
        End Function
    
        <DllImport("Kernel32")>
        Private Shared Function FreeConsole() As Boolean
        End Function
    
    End Class
    

違反を報告
引用返信
■35501 / ResNo.5)  Re[4]: VB.NETからcmdでpingを実行した時の結果
□投稿者/ ぱんだ 一般人(1回)-(2023/08/23(Wed) 21:05:09)
  • アイコン
    2023/08/23(Wed) 21:08:45 編集(投稿者)
    
    KOZさん
    
    早速ありがとうございます。
    
    複雑な処理が必要なんですね!
    サンプルコードを元に勉強していきたいと思います。
    本当にどうもありがとうございました。

違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35467 / 親記事)  TabPageの背景色
□投稿者/ くるり 一般人(1回)-(2023/07/08(Sat) 22:40:02)
  • アイコン環境/言語:[.NET Framework 4.8 , Windows11 , VB.Net] 
    分類:[.NET] 

    お世話になっています。

    TabPageにTextboxを設置し、背景色(BackColor)をTabPageと同色にしようと試みていますが、TabPageの背景色初期値がTransparentのため、Textboxの背景色には設定できません。
    TabPageの親コントロールであるTabControlにはそもそも背景色を設定するプロパティはなく、かといって、Formの背景色ともTabPageの背景色は異なります。

    イメージとしては、ファイルなどのプロパティにある編集不可のTextboxのように親コントロールと同色のReadonlyのTextboxを設置したいのですが、何か良い方法はあるでしょうか。
    (Labelコントールは、テキストを選択できないのでNG)

    最後の手段としては、TabPageの背景色である#F9F9F9を直接指定しようと思いますが、コントロールの色や形状はOSのバージョンに依存するので、できれば、TabPageと同色の背景色を自動で設定できるようにしたいと考えています。
違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■35468 / ResNo.1)  Re[1]: TabPageの背景色
□投稿者/ くるり 一般人(2回)-(2023/07/08(Sat) 22:47:17)
  • アイコン補足です。

    >TabPageの背景色である#F9F9F9を直接指定しようと思いますが

    この色は、TabPageのスクリーンショットを取って、ペイントで確認したものです。
違反を報告
引用返信
■35469 / ResNo.2)  Re[1]: TabPageの背景色
□投稿者/ KOZ 一般人(21回)-(2023/07/09(Sun) 19:46:06)
  • アイコン
    No35467に返信(くるりさんの記事)
    > 親コントロールと同色のReadonlyのTextboxを設置したいのですが、何か良い方法はあるでしょうか。
    
    DrawToBitmap で bmp に描画して、GetPixel で色を取得するとか。
    
    Public Class Form1
    
        Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
            Dim sz = TabPage1.Size
            Using bmp As New Bitmap(sz.Width, sz.Height)
                TabPage1.DrawToBitmap(bmp, New Rectangle(Point.Empty, sz))
                Dim bkColor = bmp.GetPixel(1, 1)
                TextBox1.BackColor = bkColor
            End Using
        End Sub
    
    End Class

違反を報告
引用返信
■35470 / ResNo.3)  Re[2]: TabPageの背景色
□投稿者/ くるり 一般人(3回)-(2023/07/10(Mon) 04:39:52)
  • アイコン>DrawToBitmap で bmp に描画して、GetPixel で色を取得するとか。

    サンプルコードをご提示いただき、ありがとうございます。
    こんな簡単に色情報を取得できるのですね。目からうろこです。

    ご提示いただいたコードを参考にすることで、目的としている機能の実装ができました。
    ありがとうございます。
解決み!
違反を報告
引用返信
■35471 / ResNo.4)  Re[3]: TabPageの背景色
□投稿者/ 魔界の仮面弁士 大御所(1556回)-(2023/07/10(Mon) 11:02:30)
  • アイコンNo35470に返信(くるりさんの記事)
    > こんな簡単に色情報を取得できるのですね。目からうろこです。

    ちなみに、TabPage の背景色は単色とは限りません。

    OS 側の設定テーマによっては、グラデーションがかかっているなど、
    座標ごとに複数の色が使用されていることがあります。
    http://dobon.net/vb/dotnet/graphics/drawvisualcontrol.html

    https://rarara.org/community/programming/%E3%82%BF%E3%83%96%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E8%83%8C%E6%99%AF%E8%89%B2%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%EF%BC%9F/
解決み!
違反を報告
引用返信
■35472 / ResNo.5)  Re[4]: TabPageの背景色
□投稿者/ くるり 一般人(4回)-(2023/07/10(Mon) 23:44:17)
  • アイコン2023/07/11(Tue) 12:09:39 編集(投稿者)
    2023/07/11(Tue) 12:06:40 編集(投稿者)

    > ちなみに、TabPage の背景色は単色とは限りません。
    > OS 側の設定テーマによっては、グラデーションがかかっているなど、
    > 座標ごとに複数の色が使用されていることがあります。

    情報ありがとうございます。

    なるほど。
    実は、どこかののプロパティなどから取得できないものか、
    もやもやしたものがありましたが、TabPageの背景色はグラデーションが
    設定されているなどOSのテーマに依存しており、プロパティから取得できる類の
    ものではなさそうですね。

    教えていただいたURLも参考になりそうです。ありがとうございます。

    サンプルはC++でしたが、VB.Netでグラデーションを想定した対応を実装するとすれば
    ・同じサイズのTabPage背景をメモリ上に描画(http://dobon.net/vb/dotnet/graphics/drawvisualcontrol.html)
    ・Textboxがある座標の画像を切り抜き、ブラシを作成
    ・ブラシを用いてTextboxを描画(OwnerDraw)
    といった流れですね。おそらく。

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

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35416 / 親記事)  style.displayだと効率悪いから違うやり方をしたいです。
□投稿者/ えっぴー 一般人(1回)-(2023/05/11(Thu) 13:00:19)
  • アイコン環境/言語:[javascript] 
    分類:[その他] 

    style.displayだと効率悪いから違うやり方をしたいです。
    以下はhtmlです。
    なぜ効率悪いかというと、
    一つ一つ、
    セレクトごとに、
    document.getElementById('Box1').style.display = "";と、
    document.getElementById('Box1').style.display = "none";
    を書かなければならないからです。
    構文が長くなってしまい、非効率です。
    しかし、document.getElementById自体1つしか書けないのです。
    for文を使う必要があるのです。
    ご教授願えたら幸いです。
    <div class="col-auto my-1">
    <label for="sample">選択してください</label>
    </div>
    <div class="col-auto my-1">
    <select class="form-control" id="sample" onchange="viewChange();">
    <option value="select1">one</option>
    <option value="select2">two</option>
    <option value="select3">three</option>
    </select>
    </div>
    <div class="col-auto my-5">
    <div id="Box1" class="my-5">
    <p>one</p>
    </div>
    <div id="Box2" class="my-5">
    <p>two</p>
    </div>
    <div id="Box3" class="my-5">
    <p>three</p>
    </div>
    </div>
    <script>
    function viewChange(){
    if(document.getElementById('sample')){
    id = document.getElementById('sample').value;
    if(id == 'select1'){
    document.getElementById('Box1').style.display = "";
    document.getElementById('Box2').style.display = "none";
    document.getElementById('Box3').style.display = "none";
    }else if(id == 'select2'){
    document.getElementById('Box1').style.display = "none";
    document.getElementById('Box2').style.display = "";
    document.getElementById('Box3').style.display = "none";
    }
    else if(id == 'select3'){
    document.getElementById('Box1').style.display = "none";
    document.getElementById('Box2').style.display = "none";
    document.getElementById('Box3').style.display = "";
    }
    }

    window.onload = viewChange;
    }
    </script>
    javascript全文を書いていただければ幸いです。
違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■35417 / ResNo.1)  Re[1]: style.displayだと効率悪いから違うやり方をしたいです。
□投稿者/ 魔界の仮面弁士 大御所(1544回)-(2023/05/11(Thu) 13:27:36)
  • アイコン2023/05/11(Thu) 13:31:57 編集(投稿者)

    No35416に返信(えっぴーさんの記事)
    > style.displayだと効率悪いから違うやり方をしたいです。
    そもそもなぜ、style を直接操作したいのでしょうか。
    基本的には css クラスで操作する設計にするべきだと思いますが…。
    https://ja.javascript.info/styles-and-classes

    CSS や JS 向けのフレームワークを使うにせよ使わないにせよ、
    広域的操作であれば class / className で調整した方が便利かと。


    > セレクトごとに、
    > document.getElementById('Box1').style.display = "";と、
    > document.getElementById('Box1').style.display = "none";
    > を書かなければならないからです。
    短縮表記だけの話なら、
     const $id = document.getElementById;
    みたいにエイリアスを用意して、
     $id('box1').style.display = 'none';
    などとは書けますね。

    あるいは CSSStyleDeclaration オブジェクト自体をキャッシュした
     let boxStyle = document.getElementById('Box1').style;
    などを用意しておけば、以降は
     boxStyle.display = 'none';
    と書くことはできますが…いずれにせよ、style は積極的に使うべきでなく、
    基本的には CSS クラスで制御するようにし、それで処理しきれない要素に
    限定して、style の直接操作を試みた方が良いでしょう。


    > しかし、document.getElementById自体1つしか書けないのです。
    document.querySelector
    document.querySelectorAll
    を使わないのは何故ですか? (CSS セレクター指定)
    https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Selectors
違反を報告
引用返信
■35418 / ResNo.2)  Re[2]: style.displayだと効率悪いから違うやり方をしたいです。
□投稿者/ えっぴー 一般人(2回)-(2023/05/11(Thu) 14:00:44)
  • アイコン全文と言いました。
    僕は天才のように、断片的な情報から組み合わせて、完成したものを作る能力はございません。
違反を報告
引用返信
■35419 / ResNo.3)  Re[3]: style.displayだと効率悪いから違うやり方をしたいです。
□投稿者/ 福ちゃん 一般人(3回)-(2023/05/11(Thu) 17:34:17)
  • アイコンもういいです。
    あなたを役立たずとみなします。
解決み!
違反を報告
引用返信
■35420 / ResNo.4)  Re[4]: style.displayだと効率悪いから違うやり方をしたいです。
□投稿者/ 魔界の仮面弁士 大御所(1545回)-(2023/05/11(Thu) 18:32:47)
  • アイコン
    No35418に返信(えっぴーさんの記事)
    > 全文と言いました。
    https://codepen.io/benshi-orator/pen/poxVZbg


    No35419に返信(福ちゃんさんの記事)
    > もういいです。
    解決済みチェックの「スレッドを閉じる目的ではチェックしないでください!」
    と書かれた赤文字を読まれましたか?

    掲示板の投稿ルールを守って利用してください。
    https://dobon.net/vb/bbs/index.html

違反を報告
引用返信
■35421 / ResNo.5)  【注意】ルールをお守りください
□投稿者/ 管理人 一般人(1回)-(2023/05/12(Fri) 03:16:45)
  • アイコンえっぴーさんの今までのご投稿(別のお名前でのご投稿もありますが)を拝見させていただくと、明らかに書き込みのルールが守られていません。

    書き込みのルールについて
    https://dobon.net/vb/bbs/index.html

    しかし、それ以前の問題として、No35419 のご投稿は、人を侮辱した内容であり、あまりにひどいです。よって、大変申し訳ありませんが、えっぴーさんのご投稿を一時的に禁止させていただきます。

    今後はルールをお守りいただけると約束していただけるのであれば、投稿禁止を解除させていただきますので、その場合は管理人へご連絡ください。

    なお、さらなる迷惑行為が行われた場合は、さらに厳しい対応をとらせていただくことになってしまうかもしれませんので、絶対にやめてください。

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

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



■記事リスト / ▲上のスレッド
■35401 / 親記事)  グリッド表示レコードをJSONに変換
□投稿者/ けい 一般人(1回)-(2023/05/01(Mon) 17:08:45)
  • アイコン環境/言語:[Windows10、VB.NET2022] 
    分類:[.NET] 

    お世話になります。

    DataGridView1に表示されているレコードを、
    JSON形式に変換したいと考えています。

    レコードはこちらの内容です(2列3行)。
    【商品(クラス名:Shohin)】
    商品C=10000
    商品名=商品A
    商品C=10001
    商品名=商品B
    商品C=10002
    商品名=商品C

    VB.NETでJSONを扱う方法に、
    元々VB.NETに備わっている機能を使う、
    JSON.NETを使う、
    の2種類があると思いますが、
    ここではセキュリティの面もあり、
    前者を使います。

    DataGridView1にレコードが表示されており、
    Button1を押すと、
    TextBox1にJSON変換データが表示されます。
    (商品データ以外の前後の部分はここでは割愛します。)

    コードは以下の通りです。

    Public Class Shohin
    Public Property 商品C As Integer
    Public Property 商品名 As String
    End Class

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim data() As Shohin
    ReDim data(2)
    Dim sw As New System.Runtime.Serialization.Json.DataContractJsonSerializer(GetType(Shohin))
    Dim ms As New MemoryStream()
    Dim output As String
    For i = 0 To 2
    data(i) = New Shohin
    data(i).商品C = DataGridView1.Rows(i).Cells(0).Value
    data(i).商品名 = DataGridView1.Rows(i).Cells(1).Value
    sw.WriteObject(ms, data(i))
    Next
    output = Encoding.UTF8.GetString(ms.ToArray())
    TextBox1.Text = output
    End Sub

    上記のコードを実行しますと、
    表示結果が、
    次のようになります。

    {"商品C":10000,"商品名":"商品A"}
    {"商品C":10001,"商品名":"商品B"}
    {"商品C":10002,"商品名":"商品C"}

    これですと、{}の間にカンマ(,)がついておりません。
    {"商品C":10000,"商品名":"商品A"}
    ,{"商品C":10001,"商品名":"商品B"}
    ,{"商品C":10002,"商品名":"商品C"}
    のようにしたいです。

    上記Forループ内で、
    1行目ではない場合は、
    sw.WriteObject(ms, ",")
    sw.WriteObject(ms, data(i))
    と記述しますと、
    表示結果が下記のようになってしまいます。

    {"商品C":10000,"商品名":"商品A"}
    ","{"商品C":10001,"商品名":"商品B"}
    ","{"商品C":10002,"商品名":"商品C"}

    いろいろ調べておりますが、
    わかりませんでした。

    まことにお手数と存じますが、
    どうぞよろしくお願いいたします。


違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■35402 / ResNo.1)  Re[1]: グリッド表示レコードをJSONに変換
□投稿者/ 魔界の仮面弁士 大御所(1541回)-(2023/05/01(Mon) 18:32:48)
  • アイコン
    No35401に返信(けいさんの記事)
    > ここではセキュリティの面もあり、
    > 前者を使います。

    リファレンス上では、DataContractJsonSerializer クラスではなく
    System.Text.Json 名前空間の API の利用が推奨されていますね。

    https://learn.microsoft.com/ja-jp/dotnet/api/system.runtime.serialization.json.datacontractjsonserializer?view=netframework-4.8.1


    > これですと、{}の間にカンマ(,)がついておりません。
    それは For ループで
     For i = 0 To 2
      sw.WriteObject(ms, data(i))
     Next
    という出力方法をとっているからですよね。

    Array を丸ごと渡しましょう。

     Dim data() As Shohin = {
      New Shohin With {.商品C = 10000, .商品名 = "商品A"},
      New Shohin With {.商品C = 10001, .商品名 = "商品B"},
      New Shohin With {.商品C = 10002, .商品名 = "商品C"}
     }
     Dim serializer As New DataContractJsonSerializer(GetType(Shohin()))
     Dim ms As New MemoryStream()
     serializer.WriteObject(ms, data)
     TextBox1.Text = System.Text.Encoding.UTF8.GetString(ms.ToArray())
違反を報告
引用返信
■35403 / ResNo.2)  Re[2]: グリッド表示レコードをJSONに変換
□投稿者/ けい 一般人(2回)-(2023/05/01(Mon) 19:31:17)
  • アイコンNo35402に返信(魔界の仮面弁士さんの記事)
    > Array を丸ごと渡しましょう。

    ありがとうございます^^。
    やってみます。

    また、1つの課題なのですが、
    実際には、商品レコードの数がソフト実行の度に異なるため、
    下記のように「New Shohin With」を前もって決まった数だけ書いておけないという点があります。
    この部分で、毎回読み取るレコードの数だけ、
    New Shohin Withをループさせるようなことができるか、
    が課題です。

    研究してみます。


    >  Dim data() As Shohin = {
    >   New Shohin With {.商品C = 10000, .商品名 = "商品A"},
    >   New Shohin With {.商品C = 10001, .商品名 = "商品B"},
    >   New Shohin With {.商品C = 10002, .商品名 = "商品C"}
    >  }
    >  Dim serializer As New DataContractJsonSerializer(GetType(Shohin()))
    >  Dim ms As New MemoryStream()
    >  serializer.WriteObject(ms, data)
    >  TextBox1.Text = System.Text.Encoding.UTF8.GetString(ms.ToArray())
違反を報告
引用返信
■35404 / ResNo.3)  Re[3]: グリッド表示レコードをJSONに変換
□投稿者/ けい 一般人(3回)-(2023/05/01(Mon) 19:36:09)
  • アイコンNo35402に返信(魔界の仮面弁士さんの記事)
    data()を配列と考え、
    宣言の後、
    レコードの数を満たすまで、
    New Shohin With行を要素として追加していく、
    ことができないか、試してみます。
違反を報告
引用返信
■35405 / ResNo.4)  Re[3]: グリッド表示レコードをJSONに変換
□投稿者/ 魔界の仮面弁士 大御所(1542回)-(2023/05/01(Mon) 19:48:46)
  • アイコンNo35403に返信(けいさんの記事)
    > 下記のように「New Shohin With」を前もって決まった数だけ書いておけないという点があります。

    No35401 の元投稿が Dim data() As Shohin という
    配列宣言だったからそれを真似ただけでのことです。
    別に配列でも List(Of ) でも同じことですよ。

    件数が不定なら、List(Of ) の方が良いでしょうね。

    ' 実際は data.Add(〜) を繰り返す感じになるはず
    Dim data As New List(Of Shohin)() From {
      New Shohin With {.商品C = 10000, .商品名 = "商品A"},
      New Shohin With {.商品C = 10001, .商品名 = "商品B"},
      New Shohin With {.商品C = 10002, .商品名 = "商品C"}
    }

    'GetType を配列から List(Of ) に変更
    Dim serializer As New DataContractJsonSerializer(GetType(List(Of Shohin)))
    Dim ms As New MemoryStream()
    serializer.WriteObject(ms, data)

    TextBox1.Text = System.Text.Encoding.UTF8.GetString(ms.ToArray())

違反を報告
引用返信
■35406 / ResNo.5)  Re[4]: グリッド表示レコードをJSONに変換
□投稿者/ けい 一般人(4回)-(2023/05/02(Tue) 11:59:46)
  • アイコンNo35405に返信(魔界の仮面弁士さんの記事)

    ありがとうございます。
    以下のコードでできました。


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim data As New List(Of Shohin)
    Dim serializer As New DataContractJsonSerializer(GetType(List(Of Shohin)))
    Dim ms As New MemoryStream()

    data.Add(New Shohin With {.商品C = 10000,.商品名 = "商品A"})
    data.Add(New Shohin With {.商品C = 10001,.商品名 = "商品B"})
    data.Add(New Shohin With {.商品C = 10002,.商品名 = "商品C"})

    serializer.WriteObject(ms, data)
    TextBox1.Text = Encoding.UTF8.GetString(ms.ToArray())

    End Sub


    実際には、レコードの数だけ、
    data.AddをFor〜Nextループさせます。

    解決できました。
    まことにありがとうございました。
    勉強になりました。
    今後ともどうぞよろしくお願い申し上げます。
解決み!
違反を報告
引用返信

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






Mode/  Pass/


- Child Tree -