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作成した白黒画像をWordに貼り付けてから「図として保存」(8) | Nomal重なったPictureBox同士を透過する方法(7) | Nomalvb.netでExcelファイル操作(7) | NomalTreeViewの現在位置とDataGridViewの現在位置を合わせたい(7) | Nomalラジオボタンの一括設定(7) | NomalLabelで文字単位の背景色(7) | NomalTEXTBOXのプロパティを文字列に(7) | NomalDataAdapter.Updateで構文エラー(6) | Nomalキーボード+バーコードでキーボード入力を無効にしたい(6) | Nomaljumbo icon(256x256)が存在するか知る方法(6) | Nomal画像のスクロール(6) | Nomalタイマーの一括処理(6) | Nomal先頭に空白(スペース)があるファイルを読み込んでRichTextBoxへ書き出すとスペースが削除える(6) | NomalタッチキーボードでIMEを自動で切替えたい(6) | NomalPDFをフォーム上で表示させる方法につきまして(6) | Nomal特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因(6) | Nomal全角シフト中にアクセスキーが効かない(5) | NomalVB.NETからcmdでpingを実行した時の結果(5) | NomalTabPageの背景色(5) | Nomalstyle.displayだと効率悪いから違うやり方をしたいです。(5) | Nomalグリッド表示レコードをJSONに変換(5) | NomalSeleniumで開いているページのTableを編集したい(5) | NomalMP4動画を再生する方法について(5) | NomalLableのカラー色を文字変数から変更したい(5) | NomalDatagridViewでファンクションキーを止めたい(5) | Nomalフォーム背景のみを半透明にしたい(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抽象クラスで実装したクラスの情報を知る(3) | Nomal兆億万表記の文字列を数値に変換できる?(3) | NomalGetDirectoriesでルートを指定するとエラーになる(3) | NomalLinqにおける明示的型指定の方法(3) | 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) | Nomalbitmapが保存できない(2) | Nomal特定ピクセルで画像を読み込みたい(2) | NomalDataGridViewでAlt+Enterで改行したい(2) | NomalProcessクラスからbatファイル実行後、KILLできない(2) | Nomal画面遷移(モーダルとモードレス)(2) | Nomal2つのradの数値から1つの角度を求めるコードを改善できますか?(C++)(2) | 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) | Nomalツールボックスにtableadapterが表示されない(1) | Nomalアセンブリ情報が載らない(1) | Nomal二次元マップから値の取得(1) | NomalDataGridViewのドロップダウンリストの表示と選択後の値を分けたい(1) | NomalVSTOによるエクセルアドインのインストーラーでのアップデート(1) | Nomalクリスタルレポート 明細部のサブレポート(0) | Nomalインストーラにて、ローミングフォルダにファイルを配置したい(0) | NomalChart X軸上の描画を切り替えたい(0) |



■記事リスト / ▼下のスレッド
■35224 / 親記事)  列車の時間ごとの位置情報を表示したいです。
□投稿者/ 福ちゃん 一般人(1回)-(2022/11/12(Sat) 18:49:31)
  • アイコン環境/言語:[windows10,javascript,html5] 
    分類:[その他] 

    こちら、列車の走行位置のプログラムを作っています。
    そこで気になるのが、日付ごとに、ダイヤを変更することは不可能かということです。
    例えば、2022年の例ですと、1月1〜3日は、Aダイヤで運行し、1月10日は、Bダイヤ、一般の日はCダイヤというように、
    3パターンのダイヤパターンを作りたいのですが、
    現状のflagで、やろうとしたところ、これが要するにonとoffの切り替えしかできず、
    すなわち、AかBかというのしか作れないのです。
    つまり、flagに代わる新たなパターンを作りたいのです。
    自分は触り程度しかjavascriptが扱えません。
    省略なしにご教授いただければ幸いです。
    参照元はこちらです。
    http://r113.web.fc2.com/p/viewer/oc-port/index.html
    以下はおおもとのソースです。
    <code>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <!-- saved from url=(0051)http://r113.web.fc2.com/p/viewer/oc-port/index.html -->
    <html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    <meta http-equiv="Content-Style-Type" content="text/css">
    <meta http-equiv="Content-Script-Type" content="text/javascript">
    <meta name="author" content="">
    <meta name="description" content="">
    <meta name="keywords" content="">
    <title>大阪市営地下鉄 ニュートラム(南港ポートタウン線) (コスモスクエア?住之江公園) 列車在線ビューア</title>

    <!--スタイルシート-->
    <link rel="stylesheet" href="./大阪市営地下鉄 ニュートラム(南港ポートタウン線) (コスモスクエア?住之江公園) 列車在線ビューア_files/style.css" type="text/css">

    <!--JavaScript-->
    <script type="text/javascript" src="./大阪市営地下鉄 ニュートラム(南港ポートタウン線) (コスモスクエア?住之江公園) 列車在線ビューア_files/main.js.ダウンロード" charset="UTF-8"></script>
    <script type="text/javascript" src="./大阪市営地下鉄 ニュートラム(南港ポートタウン線) (コスモスクエア?住之江公園) 列車在線ビューア_files/diaTypeJudge.js.ダウンロード" charset="UTF-8"></script>

    <script type="text/javascript" src="./大阪市営地下鉄 ニュートラム(南港ポートタウン線) (コスモスクエア?住之江公園) 列車在線ビューア_files/dia-20130323.js.ダウンロード" charset="UTF-8"></script>
    <script type="text/javascript" src="./大阪市営地下鉄 ニュートラム(南港ポートタウン線) (コスモスクエア?住之江公園) 列車在線ビューア_files/meta.js.ダウンロード" charset="UTF-8"></script>
    <script type="text/javascript" src="./大阪市営地下鉄 ニュートラム(南港ポートタウン線) (コスモスクエア?住之江公園) 列車在線ビューア_files/track.js.ダウンロード" charset="UTF-8"></script>


    <script type="text/javascript">
    </script>

    <style type="text/css">
    </style>

    </head>

    <body onresize="setDisplayArea()">
    この間省略
    &gt; 大阪市営地下鉄 ニュートラム(南港ポートタウン線) (コスモスクエア?住之江公園) 2013年3月23日改正


    <!--JavaScript読み込み-->
    <script type="text/javascript">
    writeBasicHTMLSet();
    main();
    </script>以下略</code>
    <code>
    //平日ダイヤか土・休日ダイヤかを判定する
    function dayJudge(year, month, date, day)
    {
    //alert(year +" "+ month +" "+ date +" "+ day)
    //フラグ
    var weekdayFlag = true;

    //月?金なら立てる
    if(day >= 1 && day <= 5)
    weekdayFlag = day >= 1 && day <= 5;
      else if(day==6)
    weekdayFlag2 = day == 6
    else
    weekdayFlag = false;

    //祝日ならたおす
    if(year == 2013 && month == 1 && date == 1)
    weekdayFlag = false;
    この間省略
    else if(year == 2015 && month == 3 && date == 21)
    weekdayFlag = false;

    return weekdayFlag;
    }
    </code>
    後ちなみに、
    <code>
    function dayJudge(year, month, date, day)
    {
    //alert(year +" "+ month +" "+ date +" "+ day)</code>
    は、
    運行パターンにかかわると思われますが、
    flag形式をやめた場合、
    これは、存置のままでも可能ですか。
    それとも書き換える必要がありますか。
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35225 / ResNo.1)  Re[1]: 列車の時間ごとの位置情報を表示したいです。
□投稿者/ Azulean 大御所(534回)-(2022/11/13(Sun) 14:28:12)
  • アイコン2022/11/13(Sun) 14:35:19 編集(投稿者)

    返信を書くかどうか悩みました。
    一度、"書き込みのルールについて" の "「安易な質問」とは?"、"丸投げした投稿" を読んでみてください。
    下記のあたりが危ういか、抵触しているかになっていると思います。

    > 自分は触り程度しかjavascriptが扱えません。
    > 省略なしにご教授いただければ幸いです。


    No35224に返信(福ちゃんさんの記事)
    > こちら、列車の走行位置のプログラムを作っています。

    参考サイトが作ろうとしているものか、それに近しいものですよね?

    それをコピペしていじるのは、作り出すというよりは改変・翻案といった話になっていくので、著作権の問題が出てきます。
    練習・習作の間は私的複製の範囲で収まるかもしれませんが、外部公開したら著作権侵害のトラブルになるのでご注意ください。


    > そこで気になるのが、日付ごとに、ダイヤを変更することは不可能かということです。
    (略)
    > すなわち、AかBかというのしか作れないのです。

    参考にされている大阪メトロ(旧大阪市交通局)は、平日ダイヤと、土・休日ダイヤしか存在せず、お盆であろうと年末年始であろうと土・休日ダイヤになるだけなので、2 択で十分となります。
    2 択で十分なのに、3 択以上のコードを書く必要はありませんので、参考サイトは bool の flag 管理で実現しているのでしょう。


    > つまり、flagに代わる新たなパターンを作りたいのです。
    > 自分は触り程度しかjavascriptが扱えません。

    「作る」とは「コピペしていじる」ではなく、「自分でアルゴリズムを考え、コードを書いて、デバッグ・修正して目的・目標を実現すること」ですので、「作りたい」のであれば学びを深めて自分で生み出しましょう。

    flag は 2 値分割ですので、任意の N 値分割をするためにはどういったデータ構造・制御構造にすべきかは、開発言語によらない、プログラミング(アルゴリズム)の世界の話です。
    それがうまく構築できるかどうかがまずあって、その後に開発言語・環境における実現方法に落とし込んでいくことになります。


    「javascript がさわりしかわからないのですべて教えて欲しい」は「依頼」です。
    「報酬をもらえる仕事」に値すると思いますので、本気であなたに合わせた教習を望むのなら、そういった対応をしてくれるサービスを探して、対価を払いましょう。


    ※時刻表のデータも勝手に利用するとダメとしている鉄道会社やデータ提供者もあるかもしれません。ご注意ください。
違反を報告
引用返信
■35232 / ResNo.2)  【報告】この投稿はマルチポストです
□投稿者/ (報告) 一般人(1回)-(2022/11/15(Tue) 18:04:07)
  • アイコンこの投稿はマルチポストです。もし元記事の投稿者にマルチポストの心当たりがない場合は、すぐに返信でお知らせください。

    ●マルチポストされている場所
    https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=5398

    ----------
    この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのルールについて」をお読みください。

    ●書き込みのルールについて
    https://dobon.net/vb/bbs/index.html
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35169 / 親記事)  Urlにアクセスするとダウンロードされるファイルを捕まえる
□投稿者/ Wan 付き人(75回)-(2022/10/17(Mon) 17:03:25)
  • アイコン環境/言語:[VisualBasic2019 Windows10 Basic VSTO Framework4.7.2] 
    分類:[.NET] 

    "https://f.irbank.net/files/1944/qq-net-sales.csv"
    上記のUrlにアクセスすると、csvファイルがダウンロードされます。
    このファイルを捕まえて、行単位でループさせたいです。
    次のコードでいけるかな?って思ったのですが、指定されたパスのフォーマットはサポートされていませんとでてしまいます。
    
    一旦Excelファイルに取り込んで、処理しているのですが、直接csvファイルを扱う方法を教えて頂けないでしょうか?
    Dim MyWorkBook As Excel.Workbook = Globals.ThisWorkbook.Application.Workbooks.Open("https://f.irbank.net/files/1944/qq-net-sales.csv")
    
    宜しくお願い致します。
    
    
    Dim sr As StreamReader = New   StreamReader("https://f.irbank.net/files/1944/qq-net-sales.csv")
    While Not sr.EndOfStream
      Dim line As String = sr.ReadLine()
       Dim values As String() = line.Split(","c)
       Dim lists As List(Of String) = New List(Of String)()
       lists.AddRange(values)
       For Each list As String In lists
        System.Console.Write("{0} ", list)
       Next
       System.Console.WriteLine()
    End While

違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35170 / ResNo.1)  Re[1]: Urlにアクセスするとダウンロードされるファイルを捕まえる
□投稿者/ 魔界の仮面弁士 大御所(1455回)-(2022/10/17(Mon) 22:20:54)
  • アイコンNo35169に返信(Wanさんの記事)
    > 一旦Excelファイルに取り込んで、処理しているのですが、
    > 直接csvファイルを扱う方法を教えて頂けないでしょうか?

    えぇと……これはまた、なかなかに変則的な CSV データですね…?
    先頭 4 行が無ければ、 5 列構成の一般的な CSV と言えるのですが。


    ・文字コード:UTF-8 (BOM 無)
    ・改行種別:すべてのレコード末尾に LF 付与
    ・列数:行によって可変……珍しい
    ・空行:あり……0列とみなすべきか1列とみなすべきかが悩みどころ
    ・データ囲み引用符:「"」、ただし無いこともあるのでデータの一部として扱方が良さそう
    ・データ内改行:なし
    ・データ内カンマ:なし


    > System.Console.Write("{0} ", list)
    VSTO の場合、 Console が使えるとは限らないのでは…?


    > 直接csvファイルを扱う方法を教えて頂けないでしょうか?
    Tips ページのこのあたりで出来ませんでしたか?
    https://dobon.net/vb/dotnet/internet/webclientopenread.html
    https://dobon.net/vb/dotnet/internet/webrequest.html


    (案1) WebClient.DownloadString を使う

    Dim wc As New System.Net.WebClient()
    Dim rawData As String = wc.DownloadString("https://f.irbank.net/files/1944/qq-net-sales.csv")
    Dim csv()() As String = rawData.Split(ControlChars.Lf).Select(Function(line) line.Split(","c)).ToArray()


    (案2) My.Computer.Network.DownloadFile を使う

    Dim tmp = My.Computer.FileSystem.GetTempFileName()
    My.Computer.FileSystem.DeleteFile(tmp)
    My.Computer.Network.DownloadFile("https://f.irbank.net/files/1944/qq-net-sales.csv", tmp)
    Dim csv()() As String = File.ReadLines(tmp).Select(Function(line) line.Split(","c)).ToArray()
    My.Computer.FileSystem.DeleteFile(tmp)
違反を報告
引用返信
■35199 / ResNo.2)  Re[2]: Urlにアクセスするとダウンロードされるファイルを捕まえる
□投稿者/ Wan 付き人(76回)-(2022/10/25(Tue) 17:05:31)
  • アイコン返事が遅くなり申し訳ありません。
    教えて頂いた内容で、できました。
    ありがとうございました。

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

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35165 / 親記事)  タブレット等でスワイプによるスクロールを実装
□投稿者/ 炎の妖精さん 一般人(7回)-(2022/10/13(Thu) 10:06:36)
  • アイコン環境/言語:[Windows10(64bit)_VB.NET] 
    分類:[.NET] 

    お世話になっております。

    表題の通り、スワイプでのスクロールを実装したいと考えております。
    Windowsフォーム上に以下のコントロールを配置しました。

    ■FlowLayoutPanel(スクロールを表示してここでスクロールしたい)
    └■UserControl(5*10のボタンが並べられている)
     ├■Button01
     ├■Button02
     …
     ├■Button49
     └■Button50


    なぜこのような配置の仕方をしている理由ですが、
    タブレットの解像度が1920*1280、ボタンや文字もなるべく大きめということもあり、
    5*10のボタンを配置する場合にはタブレットの画面に入りきらない為、スクロールを実装することになりました。

    DataGridViewでは自動でスワイプによるスクロールが出来るのですが、
    上記のような配置の場合ではスクロールが出来ませんでした。
    ※もちろんマウスホイールによるスクロールは可能でした

    処理としてはUserControlのスクロール移動量を取得して
    FlowLayoutPanelにスクロール移動量を付加させるというような処理になるのでしょうか?

    スクロールに関しての処理は初めての為、ご教授いただければ幸いです。
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35167 / ResNo.1)  Re[1]: タブレット等でスワイプによるスクロールを実装
□投稿者/ 魔界の仮面弁士 大御所(1454回)-(2022/10/13(Thu) 11:14:13)
  • アイコン2022/10/13(Thu) 11:18:44 編集(投稿者)

    Windows Touch あるいは スタイラス対応のタブレット デバイスが
    現在手元に無いため、動作を確認せずに回答しています。
    余裕があれば追って確認しますが…とりあえず状況把握として逆質問。


    No35165に返信(炎の妖精さんさんの記事)
    > 上記のような配置の場合ではスクロールが出来ませんでした。
    マウスホイールによる操作の場合、
    「ホバーしたときに非アクティブウィンドウをスクロールする」
    が On / Off の状態で動作が変わるかと思いますが、スワイプの場合、
    上記の設定切替に近い動作にしたいのでしょうか。それともスワイプは
    上記設定によらず、常に同じ動作になって欲しいのでしょうか。
    https://dynabook.com/assistpc/faq/pcdata2/017955.htm


    > Windowsフォーム上に以下のコントロールを配置しました。
    Button, UserControl, FlowLayoutPanel のそれぞれに対して
     ・AutoSize プロパティによって自動変更されるもの
     ・Dock や Anchor などによってリサイズされうるもの
     ・固定サイズで配置されるもの
    などがどうなっているのか定かでは無いので、
    当方で状況を読み切れていない部分があるかもしれませんが:


    今回、FlowLayoutPanel が採用されている理由は何ですか?
    FlowLayoutPanel 内にあるコントロールが UserControl 一つだけなら
    フローレイアウトになることも無さそうなので、素の Panel で良いような。

    (案1) デザイン時にスクロールできない
     Panel1 (AutoScroll = False)
     └UserControl1 (AutoScroll = True , Dock = Fill, Anchor = Top,Left)

    (案2) デザイン時にもスクロール可能だが、カプセル化しにくいかも?
     Panel1 (AutoScroll = True)
     └UserControl1 (AutoScroll = False, Dock = None, Anchor = Top,Left)


    FlowLayoutPanel 版は、Panel 版の 案2 に近い設計なのかと予想していますが、
    上記それぞれを試した時、
     a) マウス(あるいはタッチパッド)によるホイール回転操作
     b) マウスによるパン操作(ホイールを押しながらのドラッグ)あるいは同等のタッチパッド操作
     c) スタイラス(ペン)を画面に押し付けた状態でのスワイプ操作
     d) スタイラスのスクロールボタンを押した状態でのホバー操作
     e) Windows Touch によるスワイプ操作
    の動作に違いが生じるでしょうか。それとも 案1/案2 で変わらないでしょうか。

    a と d は非アクティブ状態でも操作できるのに対して、
    b, c, e はタップ(あるいはクリック)操作が先に入るので、
    常にアクティブウィンドウに対して操作することになるという違いがありそうです。


    ところで、今回のスワイプ操作はどの場所から始める想定でしょうか?
     ア) FlowLayoutPanel のスクロールバー部
     イ) FlowLayoutPanel の余白部(UserControl の外側)
     ウ) UserControl のクライアント領域
     エ) 各ボタンの上
     オ) 上記以外

    フォーカスを受け取れるコントロール、かつ、スクロール可能なコントロールの
    上でスワイプ操作を開始すると、スクロールが発生し無さそうなので
    念のために確認しています。
違反を報告
引用返信
■35168 / ResNo.2)  Re[1]: タブレット等でスワイプによるスクロールを実装
□投稿者/ 炎の妖精さん 一般人(8回)-(2022/10/13(Thu) 11:16:02)
  • アイコンすみません。解決しました。

    他社サイト様にて
    C#で書かれたコードをVB.NETに書き直し
    一部のコードを直したら想定通りの動作となりました。

    ■Windowsフォームアプリにおけるスワイプによるスクロールについて
     ※URLは長いので省略させていただきます。
解決み!
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■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]



■記事リスト / ▲上のスレッド
■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]






Mode/  Pass/


- Child Tree -