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) |



■記事リスト / ▼下のスレッド
■35177 / 親記事)  Labelで文字単位の背景色
□投稿者/ ま〜 一般人(9回)-(2022/10/19(Wed) 13:09:57)
  • アイコン環境/言語:[basic] 
    分類:[.NET] 

    こんいちは
    Labelで文字単位の反転文字をしたいのですが(特定の文字だけ協調したい)
    こんな事はRichTextで無いと無理なのでしょうか?

違反を報告
引用返信

▽[全レス7件(ResNo.3-7 表示)]
■35181 / ResNo.3)  Re[2]: Labelで文字単位の背景色
□投稿者/ 魔界の仮面弁士 大御所(1463回)-(2022/10/19(Wed) 17:10:24)
  • アイコンNo35180に追記(魔界の仮面弁士の記事)
    > TextBox や RichTextBox で代用するとかですかね。
    > ただしこの場合、キーボードやマウス操作で選択状態を変更できてしまいます。
    > かといって Enabled = False だと、淡色表示になってしまうが悩ましい所。

    Enabled は True のままにしておいて、
    Enter イベントか GotFocus イベントで、
    非アクティブにしてしまえば、何とかなるかな?

    Private Sub TextBox1_GotFocus(sender As Object, e As EventArgs) Handles TextBox1.GotFocus
      ActiveControl = Nothing
    End Sub


    本当は、そもそもフォーカスを受け取らないようにするか、
    あるいはせめて、前回フォーカスのあったコントロールに戻す方が
    望ましいのですけれど…ひとまず手抜き実装ということで。
違反を報告
引用返信
■35182 / ResNo.4)  Re[3]: Labelで文字単位の背景色
□投稿者/ KOZ 一般人(4回)-(2022/10/20(Thu) 05:37:05)
  • アイコン
    No35181に返信(魔界の仮面弁士さんの記事)
    > 本当は、そもそもフォーカスを受け取らないようにするか、
    > あるいはせめて、前回フォーカスのあったコントロールに戻す方が
    > 望ましいのですけれど…ひとまず手抜き実装ということで。
    
    RichTextBox を非表示にして親に描画するとか。
    
    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            RichTextBox1.Visible = False
            RichTextBox1.Text = "こんにちは!"
            RichTextBox1.SelectionStart = 5
            RichTextBox1.SelectionLength = 1
            RichTextBox1.SelectionColor = Color.White
            RichTextBox1.SelectionBackColor = Color.Red
        End Sub
    
        Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
            Using bmp As New Bitmap(RichTextBox1.Width, RichTextBox1.Height)
                RichTextBox1.DrawToBitmap(bmp, New Rectangle(New Point(0, 0), RichTextBox1.Size))
                e.Graphics.DrawImage(bmp, RichTextBox1.Location)
            End Using
        End Sub
    
    End Class
    

違反を報告
引用返信
■35183 / ResNo.5)  Re[4]: Labelで文字単位の背景色
□投稿者/ KOZ 一般人(5回)-(2022/10/20(Thu) 11:42:04)
  • アイコンNo35182に返信(KOZの記事)
    > RichTextBox を非表示にして親に描画するとか。

    https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/RichTextBox.cs,1804

    RichTextBox の DrawToBitmap は機能しなかったのを思い出しました。
    このコードは .NET Framework 4.7 以上だと動きますが 4.6.2 以下だと動きません。
    ま〜さんがお使いの環境によっては、この手は使えません。失礼しました。

違反を報告
引用返信
■35184 / ResNo.6)  Re[5]: Labelで文字単位の背景色
□投稿者/ KOZ 一般人(6回)-(2022/10/21(Fri) 08:15:12)
  • アイコンNo35183に返信(KOZさんの記事)
    > このコードは .NET Framework 4.7 以上だと動きますが 4.6.2 以下だと動きません。
    > ま〜さんがお使いの環境によっては、この手は使えません。失礼しました。

    .NET Framework 4.0 以降であれば、app.config をいじれば大丈夫のようです。

    https://lets-csharp.com/richtextbox-image/

違反を報告
引用返信
■35186 / ResNo.7)  Re[6]: Labelで文字単位の背景色
□投稿者/ ま〜 一般人(10回)-(2022/10/21(Fri) 14:04:58)
  • アイコン魔界さんKOZさんありがとうございます
    センター配置でFontサイズが変動するのでBOXだと入れ物が決まってしないつかいづらかっらので
    Labelだと枠がないのでLabelでなんとかならないかと思っていました
    教えて頂いた内容で解決しました。
    いつもありがとうございます

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

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35159 / 親記事)  TEXTBOXのプロパティを文字列に
□投稿者/ ま〜 一般人(1回)-(2022/10/07(Fri) 16:49:59)
  • アイコン環境/言語:[Vb.NET] 
    分類:[.NET] 

    はじめまして初心者です
    初歩的な質問で申し訳ないのですが
    TEXTBOXのプロパティを文字列に
    TextBox.Font などを文字変数にしたい。どのFontが使われているのか知りたい
    宜しくお願いします
    Vs2022 basic です


違反を報告
引用返信

▽[全レス7件(ResNo.3-7 表示)]
■35162 / ResNo.3)  Re[2]: TEXTBOXのプロパティを文字列に
□投稿者/ まー 一般人(1回)-(2022/10/11(Tue) 12:53:43)
  • アイコン親切丁寧にご指導ありがとうございます。
    感謝です。一歩前に進みました

    > 何のために Font の値を知りたいのでしょうか?
    > その目的によっては、話が変わってくるかもしれません。

    ご推察の様に
    アプリ上で変更したTextBoxの最終的なフォントをファイルに保存しておいて
    次にアプリを開いた時に同じフォントで開くのが目的です
    ほんと助かります


    >>初歩的な質問で申し訳ないのですが
    > 分からないことにたいして、それが技術的に初歩的な事柄であるのかどうかを、
    > どうやって判断しているのかが、微妙に気になってみたり…。
    > (「初歩的な質問かも知れませんが」という表現なら分からなくも無いのですが)

    私は親父世代でしてVB6までは結構ソフト開発しておりました
    第一線から退いたのですが務めていた会社が倒産して再就職先で.NETを勉強しています
    こんな事をしたいとか発想はでるのですが.NETは具体化が難しいので苦しんでます
    実は教えて頂いたサンプルコードも理解出来ない所が多い状態です

    ですのでホント感謝です。
違反を報告
引用返信
■35163 / ResNo.4)  Re[2]: TEXTBOXのプロパティを文字列に
□投稿者/ ま〜 一般人(2回)-(2022/10/11(Tue) 16:59:51)
  • アイコン 関連する内容で追加の質問をさせて頂きたいのですがお手数ですが宜しくお願いします。
    参考にしてFont以外の復元(色とか)もトライして見たのですが上手くいきません
    Labelには文字列として値は入っています。

    'この宣言を理解してない所があります。(Label13は適当に書いてみました。これが要因?)
    Dim pdFont = TypeDescriptor.GetProperties(Label13).Find("Font", False)
    Dim pdBackColor = TypeDescriptor.GetProperties(Label13).Find("BackColor", False)
    Dim pdForeColor = TypeDescriptor.GetProperties(Label13).Find("ForeColor", False)

    '各設定を文字列として保存
    Label13.Text = pdFont.Converter.ConvertToInvariantString(TextBox1.Font)
    Label14.Text = pdBackColor.Converter.ConvertToInvariantString(TextBox1.BackColor)
    Label15.Text = pdForeColor.Converter.ConvertToInvariantString(TextBox1.ForeColor)

    '文字列として保存された Fontなどの値を、実際の オブジェクトに復元したい
    TextBox2.Font = DirectCast(pdFont.Converter.ConvertFromInvariantString(Label13.Text), Font)

    ’   ↑ここまでは上手く行ってます。問題はFont以外です↓(文法が間違っているみたいです)

    TextBox2.BackColor = DirectCast(pdBackColor.Converter.ConvertFromInvariantString(Label14.Text), BackColor)
    TextBox2.ForeColor = DirectCast(pdForeColor.Converter.ConvertFromInvariantString(Label15.Text), ForeColor)

    宜しくお願いします
違反を報告
引用返信
■35164 / ResNo.5)  Re[3]: TEXTBOXのプロパティを文字列に
□投稿者/ 魔界の仮面弁士 大御所(1453回)-(2022/10/11(Tue) 19:04:19)
  • アイコンNo35163に返信(ま〜さんの記事)
    > TextBox2.BackColor = DirectCast(pdBackColor.Converter.ConvertFromInvariantString(Label14.Text), BackColor)
    > TextBox2.ForeColor = DirectCast(pdForeColor.Converter.ConvertFromInvariantString(Label15.Text), ForeColor)
    DirectCast の第二引数には「データ型」を指定します。

    BackColor プロパティは「System.Drawing.Color 型」で
    ForeColor プロパティも「System.Drawing.Color 型」で
    Font プロパティは「System.Drawing.Font 型」で
    Text プロパティは「System.String 型」で
    Enabled プロパティは「System.Boolean 型」ですよね。

    すなわち、
     TextBox1.BackColor = DirectCast(〜, Color)
     TextBox1.ForeColor = DirectCast(〜, Color)
     TextBox1.Font = DirectCast(〜, Font)
     TextBox1.Text = DirectCast(〜, String)
     TextBox1.Enabled = DirectCast(〜, Boolean)
    のように記述することになります。



    > (Label13は適当に書いてみました。これが要因?)
    Label 用の PropertyDescriptor を TextBox 用に対して用いてはいけません。

    PropertyDescriptor にとって重要なのは「どの型のプロパティを扱おうとしているのか」なので、
    コントロールの型を一致させてないと実行時エラーになりえます。


    たとえば
     Dim a = TypeDescriptor.GetProperties(Label1).Find("AutoEllipsis", False)
     Dim b = TypeDescriptor.GetProperties(TextBox1).Find("CharacterCasing", False)
    とした場合、
     MsgBox( a.GetValue(Label1) )
     MsgBox( b.GetValue(TextBox1) )
    とは書けますが、
     MsgBox( a.GetValue(TextBox1) )
     MsgBox( b.GetValue(Label1) )
    にしてしまうと、呼び出し時に例外がスローされます。
    これは ShouldSerializeValue などでも同じことです。


    PropertyDescriptor は:

    Dim pd As PropertyDescriptor = TypeDescriptor.GetProperties(Label1).Find("Font", False)
    のように「コントロールのインスタンス」を通じて取得する方法のほか、

    Dim pd As PropertyDescriptor = TypeDescriptor.GetProperties(GetType(Label)).Find("Font", False)
    のように「コントロールの型」を通じて取得する方法もあります。
違反を報告
引用返信
■35166 / ResNo.6)  Re[4]: TEXTBOXのプロパティを文字列に
□投稿者/ まー 一般人(2回)-(2022/10/13(Thu) 11:10:58)
  • アイコン魔界さんありがとうございます
    やっと出来ました。
    色々と推察して頂いて書いて頂けのが凄く有難かったです。
    ホントにありがとうございました。

    最後に変な質問をさせて頂きたいのですが
    もっと理解を深めたく思うのですがMSDNを見ても難しく感じてます
    たとえば教えて頂いたTypeDescriptor.GetPropertiesとか大体は理解できたのですが
    何もなければこう書くも推測すら出来ません。

    魔界さんはどの様な感じでこの辺りの理解を深められたのでしょうか?
    参考にされたWebなどあましたら教えて頂けたらと思います。親父教育で申し訳ないです。


違反を報告
引用返信
■35171 / ResNo.7)  Re[2]: TEXTBOXのプロパティを文字列に
□投稿者/ ま〜 一般人(5回)-(2022/10/18(Tue) 17:17:35)
  • アイコン解決しました。↑
解決み!
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35075 / 親記事)  DataViewのFindRowsde
□投稿者/ Wan 付き人(62回)-(2022/06/15(Wed) 17:49:25)
  • アイコン環境/言語:[VisualBasic2019 Windows10 Basic Framework4.7.2] 
    分類:[.NET] 

    DataViewについて勉強しています。
    https://docs.microsoft.com/ja-jp/dotnet/api/system.data.dataview.find?view=net-6.0#system-data-dataview-find(system-object())
    のページに次のコードがかかれています。
    Private Sub FindValueInDataView(table As DataTable)
        Dim view As New DataView(table)
        view.Sort = "Customers"
        Dim vals(1) As Object
        vals(0)= "John"
        vals(1) = "Smith"
        Dim i As Integer = view.Find(vals)
        Console.WriteLine(view(i))
    End Sub
    これを参考に次のコードを作成しました。
    Dim myTable As New DataTable
    Dim myColumn As DataColumn
    myColumn = New DataColumn("FirstName")
    myTable.Columns.Add(myColumn)
    myColumn = New DataColumn("LastName")
    myTable.Columns.Add(myColumn)
    Dim myRow As DataRow
    myRow = myTable.NewRow
    myRow.ItemArray = New Object() {"佐々木", "渉"}
    myTable.Rows.Add(myRow)
    myRow = myTable.NewRow
    myRow.ItemArray = New Object() {"山本", "健司"}
    myTable.Rows.Add(myRow)
    myRow = myTable.NewRow
    myRow.ItemArray = New Object() {"山本", "弘子"}
    myTable.Rows.Add(myRow)
    myRow = myTable.NewRow
    myRow.ItemArray = New Object() {"森本", "武"}
    myTable.Rows.Add(myRow)
    Dim myDataView As New DataView(myTable)
    myDataView.Sort = "FirstName"
    Dim test = myDataView.FindRows(New Object() {"山本", "健司"}) '@
    'Dim test = myDataView.FindRows("山本") 'A
    'DataGridView1.DataSource = test 'A
    を作成しました。
    実行してみると、「System.ArgumentException: 'インデックスを付加するキーには 1 値が必要ですが、2 値を取得しました。'」の例外が発生します。
    サンプルコードとどこが違うのでしょうか?
    サンプルのコードが正しく動いた場合は、一つの列の値の中で、二つのKYのどちらかがマッチした場合の行が返されると考えて宜しいのでしょうか?
    
    また、@をコメントアウトして、Aをコメントを外すと例外は発生しませんが、
    DataGridViewに期待する内容が表示されません。
    DataRowView[]をDataGridViewに表示するには、どのようにすれば良いのでしょうか?
    どなたか詳しい方教えてください。
    宜しくお願い致します。
    
    
    
    

違反を報告
引用返信

▽[全レス7件(ResNo.3-7 表示)]
■35078 / ResNo.3)  Re[1]: DataViewのFindRowsde
□投稿者/ 魔界の仮面弁士 大御所(1429回)-(2022/06/15(Wed) 20:27:22)
  • アイコンNo35075に返信(Wanさんの記事)
    > 一つの列の値の中で、二つのKYのどちらかがマッチした場合の行が返されると考えて宜しいのでしょうか?

    FindRows メソッドでの検索は AND 条件です。
    OR 条件で抽出したい場合は、LINQ を使うことができます。

    Dim rowViews = (From r As DataRowView In myDataView Where r("FirstName") = "山本" OrElse r("LastName") = "健司").ToArray()
違反を報告
引用返信
■35079 / ResNo.4)  Re[2]: DataViewのFindRowsde
□投稿者/ Wan 付き人(63回)-(2022/06/16(Thu) 07:57:57)
  • アイコンHongliangさん
    魔界の仮面弁士さん

    いつもご指導ありがとうございます。
    サンプルでも間違えていることがあるんですね?
    色々やってみましたが、上手く行かず途方に暮れていました。
    助かりました。

    DataViewにLINQを使う時に、私ならつい
    From r As DataRowView In myDataView.Rows
    とRowsをつけてしまいそうですが、LINQ to DataSetの仕様という事でしょうか?
    また、r("FirstName")とColumn名が使えるのもLINQ to DataSetの仕様でしょうか?


    最後の質問である。
    DataRowView[]をDataGridViewに表示するには、どのようにすれば良いのでしょうか?
    は、どのようにすれば宜しいのでしょうか?
    追加で、ご指導頂ければ助かります。

違反を報告
引用返信
■35080 / ResNo.5)  Re[3]: DataViewのFindRowsde
□投稿者/ Wan 付き人(64回)-(2022/06/16(Thu) 08:05:30)
  • アイコン
    魔界の仮面弁士さんのコードに.ToArrayをつけて
    DataSouceに入れると図のようになってしまいます。
    
     Dim myDataView As New DataView(myTable) With {.Sort = "FirstName"}
     Dim test = myDataView.FindRows("山本").ToArray 'A
     DataGridView1.DataSource = test 'A
    
    宜しくお願い致します。
    

442×275 => 250×155
イメージ
dobon.jpg
/11KB
違反を報告
引用返信
■35081 / ResNo.6)  Re[4]: DataViewのFindRowsde
□投稿者/ Wan 付き人(65回)-(2022/06/16(Thu) 08:22:40)
  • アイコン.ToListならでました。
    根本的に?何を理解していないのか?
    わかりません?
違反を報告
引用返信
■35084 / ResNo.7)  Re[5]: DataViewのFindRowsde
□投稿者/ wan 一般人(5回)-(2022/06/16(Thu) 22:42:43)
  • アイコン解決しました
解決み!
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35479 / 親記事)  キーボード+バーコードでキーボード入力を無効にしたい
□投稿者/ たろう 一般人(4回)-(2023/08/04(Fri) 10:03:12)
  • アイコン環境/言語:[windows11/Visual Studio 2022/C#] 
    分類:[.NET] 

    バーコードを利用したシステムで、バーコードから情報を読みこんでいるときにキーボードを触るとバーコードから読み込んだ文字列の間に文字が入ってしまいます。

    バーコードはキーボードエミュレーションのため上記は仕方がないのですが、なにか対策をしなければいけません。

    バーコード入力時は特定のテキストボックスにフォーカスがあるので、その時だけキーボードを無効にしてバーコードのみを有効にするような事ができれば良いのですが・・・。

    なにか手だてはないでしょうか。


違反を報告
引用返信

▽[全レス6件(ResNo.2-6 表示)]
■35481 / ResNo.2)  Re[2]: キーボード+バーコードでキーボード入力を無効にしたい
□投稿者/ たろう 一般人(5回)-(2023/08/04(Fri) 13:48:31)
  • アイコンNo35480に返信(魔界の仮面弁士さんの記事)
    > そういった恐れのある環境では、
    > HID エミュレート型ではなく、
    > Serial 型の製品が採用されます。

    そうですよね・・・。
    いえ、まったくおっしゃる通りです。
    このバーコードもキーボードエミュレーションではないモードを持っているようですが
    元請けからできるだけいまの仕組みを変えたくないと言われている状況で何か方法がないか検討しておりました。


    > なお、複数のキーボードが入力されているケースなどでは、
    > SharpDX.RawInput を使うことで、どちらのキーボードの
    > キーが押されたのかを拾うことはできていますが、

    なるほど、キーボードが2つある場合は判断ができるのですね。
    バーコードでも可能かどうかは分かりませんが、参考にさせていただきます。


違反を報告
引用返信
■35483 / ResNo.3)  Re[1]: キーボード+バーコードでキーボード入力を無効にしたい
□投稿者/ とくま 一般人(3回)-(2023/08/04(Fri) 20:37:31)
  • アイコンNo35479に返信(たろうさんの記事)
    ざっくり検索して内容検証してないですが、ウィンドウズメッセージを解析する方向なら
    RAWINPUTHEADERの hDeviceが違うんじゃないかみたいな話とか
    https://teratail.com/questions/215793
    C++の分野だとか、デバイスドライバを自分で作るような話という方向の話はあるようです。

    本音は、
    バーコードリーダーが壊れたときとか、キーボード入力での代替作業が必要となるトラブルは
    必ず起こるので、そのような仕様自体、避けますけどね。現場に直接言われたなら、
    『USB端子をPCの前面に配置しますので、キーボード入力を避けたい場合は、物理的に抜く
    運用でどうでしょうか?』って言っちゃうw趣味で開発するならまだしも、費用対効果を考える
    システムでやる内容ではないようにも思います。
違反を報告
引用返信
■35484 / ResNo.4)  Re[3]: キーボード+バーコードでキーボード入力を無効にしたい
□投稿者/ kiku 一般人(1回)-(2023/08/07(Mon) 19:01:16)
  • アイコンNo35481に返信(たろうさんの記事)
    > ■No35480に返信(魔界の仮面弁士さんの記事)
    >>そういった恐れのある環境では、
    >>HID エミュレート型ではなく、
    >>Serial 型の製品が採用されます。
    >
    > そうですよね・・・。
    > いえ、まったくおっしゃる通りです。
    > このバーコードもキーボードエミュレーションではないモードを持っているようですが
    > 元請けからできるだけいまの仕組みを変えたくないと言われている状況で何か方法がないか検討しておりました。
    >
    >
    >>なお、複数のキーボードが入力されているケースなどでは、
    >>SharpDX.RawInput を使うことで、どちらのキーボードの
    >>キーが押されたのかを拾うことはできていますが、
    >
    > なるほど、キーボードが2つある場合は判断ができるのですね。
    > バーコードでも可能かどうかは分かりませんが、参考にさせていただきます。

    魔界の仮面弁士さんのコメントが妥当と思います。

    もし、入力文字列の長さが固定であれば、
    文字列長で判定し、キーボードからの入力があった場合
    文字列長が想定より長くなることで、
    判定できるのではと思いました。

違反を報告
引用返信
■35485 / ResNo.5)  Re[2]: キーボード+バーコードでキーボード入力を無効にしたい
□投稿者/ たろう 一般人(6回)-(2023/08/08(Tue) 10:48:27)
  • アイコンNo35483に返信(とくまさんの記事)

    デバイスドライバを作ったりということはさすがに難易度が高いので難しいですね…

    とりあえず、「キーボードを触らないで」とお願いする方向になるかもです。
    (「触ってねぇよ。システムの不具合だろう」って言われそうな気もしますが)

違反を報告
引用返信
■35486 / ResNo.6)  Re[4]: キーボード+バーコードでキーボード入力を無効にしたい
□投稿者/ たろう 一般人(7回)-(2023/08/08(Tue) 10:51:27)
  • アイコンNo35484に返信(kikuさんの記事)
    > 魔界の仮面弁士さんのコメントが妥当と思います。

    そうですね…
    文字列は固定長とは限らず、チェックデジットもないというか、フリーフォーマットのようで、用紙ごとに何が書いてあるかは分からないそうで、なかなか難しいです。

    キーボード入力だけはじくというのは簡単ではなさそうなので、本件はこれにて終了といたします。


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

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



■記事リスト / ▲上のスレッド
■35433 / 親記事)  jumbo icon(256x256)が存在するか知る方法
□投稿者/ inunoshi 一般人(1回)-(2023/06/04(Sun) 20:10:12)
  • アイコン環境/言語:[.NET Framework] 
    分類:[.NET] 

    jumbo icon(256x256)の取得をしたいです。
    以下のコードで取得できますが、256x256アイコンを持ってないファイルの場合、
    以下の画像のように48x48アイコンが左上に描画された256x256アイコンが
    取得されていしまいます。
    256x256アイコンを持っていないことを知る方法はありませんでしょうか。
    IImageListを使って知る方法でもわかればありがたいですが、できればWindowsAPIを
    使って知る方法がわかればありがたいです。
    ご存じの方、ご教授ください。



    ---------------------------------------------------------
    //プログラムと同じフォルダに「C:\Windows\winhlp32.exe」の256x256アイコンを出力
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.IO;
    using System.Reflection;

    public class Icon256
    {
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct SHFILEINFO
    {
    public IntPtr hIcon;
    public int iIcon;
    public uint dwAttributes;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
    public string szDisplayName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
    public string szTypeName;
    }

    [DllImport("shell32.dll")]
    static extern int SHGetImageList(uint iImageList, ref Guid riid, out IntPtr ppv);

    [DllImport("comctl32.dll", SetLastError=true)]
    static extern bool ImageList_DrawEx(IntPtr himl, int i, IntPtr hdcDst, int x, int y, int dx, int dy, uint rgbBk, uint rgbFg, int fStyle);

    [DllImport("shell32.dll", EntryPoint = "SHGetFileInfoW", CharSet = CharSet.Unicode)]
    public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, out SHFILEINFO psfi, uint cbFileInfo, uint uFlags);

    public static void Main()
    {
    Bitmap iconImage = new Bitmap(256, 256);
    Guid IID_IImageList = new Guid("46EB5926-582E-4017-9FDF-E8998DAA0950");
    const uint SHIL_JUMBO = 0x0004;
    IntPtr pimgList;

    SHGetImageList(SHIL_JUMBO, ref IID_IImageList, out pimgList);

    uint SHGFI_ICON = 0x00000100;
    uint SHGFI_SYSICONINDEX = 0x00004000;
    uint SHGFI_OVERLAYINDEX = 0x00000040;
    uint vFlags = SHGFI_ICON | SHGFI_SYSICONINDEX | SHGFI_OVERLAYINDEX;

    SHFILEINFO shfi = new SHFILEINFO();
    SHGetFileInfo(@"C:\Windows\winhlp32.exe", 0, out shfi, (uint)Marshal.SizeOf(shfi), vFlags);

    Graphics g = Graphics.FromImage(iconImage);
    uint CLR_DEFAULT = 0xFF000000;
    ImageList_DrawEx(pimgList, shfi.iIcon & 0xFFFFFF, g.GetHdc(), 0, 0, 0, 0, CLR_DEFAULT, CLR_DEFAULT, 0);
    g.Dispose();

    string dstPathName = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + @"\testIcon256.png";
    iconImage.Save(dstPathName);
    }
    }

256×256 => 250×250
イメージ
testIcon256.png
/1KB
違反を報告
引用返信

▽[全レス6件(ResNo.2-6 表示)]
■35443 / ResNo.2)  Re[2]: jumbo icon(256x256)が存在するか知る方法
□投稿者/ inunoshi 一般人(4回)-(2023/06/05(Mon) 22:31:38)
  • アイコン魔界の仮面弁士様

    お忙しい中、お教えいただきありがとうございます。
    IconLib.dllの存在は知りませんでした。
    早速ダウンロードして動かしてみました。
    私の動かし方が悪いと思うのですが、「FirstOrDefault」のところで
    コンパイルエラーになってしまった(Win11標準のcsc.exeでコンパイル)ので
    初心者的なコードで恐縮ですが、以下のようにしたら256x256アイコンの取得ができました。
    256x256アイコンがない場合は何も出力されないことも確認できました。

    ありがとうございました。

    using System;

    public class Icon256
    {
      public static void Main()
      {
        string iconFilePath = @"C:\Windows\notepad.exe";

        var size = new System.Drawing.Size(256, 256);
        var multiIcon = new System.Drawing.IconLib.MultiIcon();
        multiIcon.Load(iconFilePath);
        
        foreach (var singleIcon in multiIcon){
          for(int i = 0; i < singleIcon.Count; i++){
            if(singleIcon[i].Size == size){
              var icon = singleIcon[i];

              if (icon != null)
              {
                string outName = string.Format(@"D:\{0}_256_{1}.ico",
                  System.IO.Path.GetFileNameWithoutExtension(iconFilePath),
                  singleIcon.Name
                );
                using (var sm = new System.IO.FileInfo(outName).Create())
                icon.Icon.Save(sm);
                return;
              }
            }
          }
        }
      }
    }
解決み!
違反を報告
引用返信
■35445 / ResNo.3)  Re[3]: jumbo icon(256x256)が存在するか知る方法
□投稿者/ 魔界の仮面弁士 大御所(1550回)-(2023/06/05(Mon) 22:56:31)
  • アイコンNo35443に返信(inunoshiさんの記事)
    >> using (var sm = new System.IO.FileInfo(outName).Create())
    >> using (icon)
    済みません、前回答のこの部分は
     using (icon)
     using (var sm = new System.IO.FileInfo(outName).Create())
    の書き間違いです。


    > IconLib.dllの存在は知りませんでした。
    私も知りませんでした。
    探せばあるだろうと検索しただけです。


    > 私の動かし方が悪いと思うのですが、「FirstOrDefault」のところで
    > コンパイルエラーになってしまった(Win11標準のcsc.exeでコンパイル)ので
    using System.Linq; を書き忘れていたのではないでしょうか?


    > 初心者的なコードで恐縮ですが、以下のようにしたら256x256アイコンの取得ができました。
    > 256x256アイコンがない場合は何も出力されないことも確認できました。
    色数の異なる複数の 256x256 アイコンが同時に収録されている可能性がある点にも注意してください。

    また、.exe / .dll / .icl の場合、別アイコンの 256x256 サイズ画像を
    含んでいる可能性もあります。


    > icon.Icon.Save(sm);
    保存後は再利用しないでしょうし、Dispose した方が良いかもしれません。

    まぁ、今回は static void Main 自体が直ちに終了するようにしているので、
    Dispose や using を使わずとも、プロセス終了と共に、
    リソースの処分も勝手に行われるでしょうけれどね。

解決み!
違反を報告
引用返信
■35446 / ResNo.4)  Re[4]: jumbo icon(256x256)が存在するか知る方法
□投稿者/ inunoshi 一般人(5回)-(2023/06/05(Mon) 23:41:58)
  • アイコン>> 私の動かし方が悪いと思うのですが、「FirstOrDefault」のところで
    >> コンパイルエラーになってしまった(Win11標準のcsc.exeでコンパイル)ので
    >using System.Linq; を書き忘れていたのではないでしょうか?

    実はいったん「using System.Linq」を入れてみたのですが、以下のエラーが出てしまったので
    あきらめてしまいました。
    Linqは使いこなせれば簡潔に書けて良いと思うのですが、まだまだ使いこなすのに時間かかりそうです。

    csc.exeでのコンパイル時のエラー(FirstOrDefaultの行で出ます)
     error CS1525: '.' は無効です。
     error CS1003: 構文エラーです。':' が必要です。

    >> 初心者的なコードで恐縮ですが、以下のようにしたら256x256アイコンの取得ができました。
    >> 256x256アイコンがない場合は何も出力されないことも確認できました。
    >色数の異なる複数の 256x256 アイコンが同時に収録されている可能性がある点にも注意してください。

    >また、.exe / .dll / .icl の場合、別アイコンの 256x256 サイズ画像を
    >含んでいる可能性もあります。

    ありがとうございます。
    いろいろなファイルで試してみるようにします。

    >> icon.Icon.Save(sm);
    >保存後は再利用しないでしょうし、Dispose した方が良いかもしれません。

    >まぁ、今回は static void Main 自体が直ちに終了するようにしているので、
    >Dispose や using を使わずとも、プロセス終了と共に、
    >リソースの処分も勝手に行われるでしょうけれどね。

    すみません。Mainをすぐに抜けるので手を抜いてしまいました。
    プログラムに組み込む際は後始末をちゃんとするようにします。
解決み!
違反を報告
引用返信
■35447 / ResNo.5)  Re[5]: jumbo icon(256x256)が存在するか知る方法
□投稿者/ 魔界の仮面弁士 大御所(1551回)-(2023/06/06(Tue) 09:42:21)
  • アイコン
    No35446に返信(inunoshiさんの記事)
    > csc.exeでのコンパイル時のエラー(FirstOrDefaultの行で出ます)
    >  error CS1525: '.' は無効です。
    >  error CS1003: 構文エラーです。':' が必要です。
    
    それは LINQ の問題では無いですね。
    エラー行とエラー列を再度確認してみてください。
    
    .FirstOrDefault(〜) が失敗しているのではなく、
    その後に続く ?.Icon の部分を解釈できていないのだと思います。
    
    
    ?.Icon 構文は「null 条件演算子」といって C#6 で追加された文法です。
    csc.exe のオプションに /langversion:6 を追加してみてください。
    https://ufcpp.net/study/csharp/ap_ver6.html#null-conditional
    
    
    現状は恐らく、
     C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe
     C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe
    を使っているのだと思いますが、これらは /langversion:5 までしか理解しませんので、
    Roslyn 世代の csc.exe を利用してください。
    
    なお、C# 6 以降に対応したコンパイラで /langversion:5 を指定した場合は、
      error CS1525: '.' は無効です。
      error CS1003: 構文エラーです。':' が必要です。
    ではなく、
      error CS8026: 機能 'Null を反映する演算子' は C# 5 では使用できません。6 以上の言語バージョンをお 使いください。
    というメッセージに変化するはずです。
    
    
    なお、
     var icon = singleIcon.FirstOrDefault(x => x.Size == size)?.Icon;
    という行を
     var iconImage = singleIcon.FirstOrDefault(x => x.Size == size);
     if (iconImage == null) { continue; }
     var icon = iconImage.Icon;
     if (icon == null) { continue; }
    に書き換えれば、文法レベルを C#3 相当まで下げることができます。

解決み!
違反を報告
引用返信
■35448 / ResNo.6)  Re[6]: jumbo icon(256x256)が存在するか知る方法
□投稿者/ inunoshi 一般人(6回)-(2023/06/06(Tue) 20:49:58)
  • アイコン本来の質問以外のところで文法の手ほどきまでしていただきありがとうございます。

    > それは LINQ の問題では無いですね。
    > エラー行とエラー列を再度確認してみてください。
    >
    > .FirstOrDefault(〜) が失敗しているのではなく、
    > その後に続く ?.Icon の部分を解釈できていないのだと思います。
    >
    >
    > ?.Icon 構文は「null 条件演算子」といって C#6 で追加された文法です。
    > csc.exe のオプションに /langversion:6 を追加してみてください。
    > https://ufcpp.net/study/csharp/ap_ver6.html#null-conditional
    > 現状は恐らく、
    >  C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe
    >  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe
    > を使っているのだと思いますが、これらは /langversion:5 までしか理解しませんので、
    > Roslyn 世代の csc.exe を利用してください。

    はい。
    csc.exeを以下のように使ってコンパイルしました。
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /nologo /t:exe icon256.cs /r:iconlib.dll
    諸事情により、Windows標準のコンパイラを使いたいのでC#5の仕様までで行きたいと思っています。
    ただ、自分ではC#6以上の文法で出たコンパイルエラーを理解するのはスキル不足でした。

    Roslynは初めて知ったので、検索等して自分で勉強してみます。
    手元の環境はVSCode+.NET7.0で開発。最終コンパイルはWin11標準のcsc.exe使用です。

    > なお、
    >  var icon = singleIcon.FirstOrDefault(x => x.Size == size)?.Icon;
    > という行を
    >  var iconImage = singleIcon.FirstOrDefault(x => x.Size == size);
    >  if (iconImage == null) { continue; }
    >  var icon = iconImage.Icon;
    >  if (icon == null) { continue; }
    > に書き換えれば、文法レベルを C#3 相当まで下げることができます。

    C#3相当に書き直していただいたコードまで作ってくださりありがとうございます。
    いただいた内容そのままですが、以下のコードで、Win11標準のcsc.exeでもコンパイルできました。

    ありがとうございました。
    本来の質問以外のところでも大変勉強になりました。

    --------------------------------------------------------------------------
    using System;
    using System.Linq;

    public class Icon256
    {
      public static void Main()
      {
        string iconFilePath = @"C:\Windows\notepad.exe";

        var size = new System.Drawing.Size(256, 256);
        var multiIcon = new System.Drawing.IconLib.MultiIcon();
        multiIcon.Load(iconFilePath);
        foreach (var singleIcon in multiIcon)
        {
          //var icon = singleIcon.FirstOrDefault(x => x.Size == size)?.Icon;
          var iconImage = singleIcon.FirstOrDefault(x => x.Size == size);
          if (iconImage == null) { continue; }
          var icon = iconImage.Icon;
          if (icon == null) { continue; }
     
          if (icon != null)
          {
            string outName = string.Format(@"D:\{0}_256_{1}.ico",
              System.IO.Path.GetFileNameWithoutExtension(iconFilePath),
              singleIcon.Name
            );
            using (icon)
            using (var sm = new System.IO.FileInfo(outName).Create())
            {
              icon.Save(sm);
            }
          }
        }
      }
    }

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

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






Mode/  Pass/


- Child Tree -