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

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

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



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

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

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

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

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

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

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

違反を報告
引用返信

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

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

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

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


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

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


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

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

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

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

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



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

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

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

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

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

違反を報告
引用返信

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

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

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

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

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

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

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


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

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



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

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

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

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

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

違反を報告
引用返信

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

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

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

    貼り付けました。

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

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

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


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

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



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

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


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

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


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


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

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

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

    まさにこれでした。

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

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

    クローズしておきます


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

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35292 / 親記事)  クリックイベントでexeを作成できるか
□投稿者/ TMK 一般人(1回)-(2022/12/17(Sat) 12:07:39)
  • アイコン環境/言語:[C# (VS2008)] 
    分類:[.NET] 

    皆さま こんにちは

    ユーザーフォームのクリックイベントでexeの作成は可能なのでしょうか

    配布用exeを作ろうと思っています。
    exeの目的は、共通のファイル等の操作でヒューマンエラーが起こらないよう、
    ワンクリックで自動的に処理したいのです。

    ただ、動作させる環境を限定させたいので、多少のパラメータをexeに渡す必要があります。
    ユーザーフォームでパラメータを選択し、クリックイベントでパラメータを含んだexeを作成する(exeで参照)、
    そんな感じのプロジェクトを作成したいと思っています。
    パラメータの条件を満たさない環境では何もせずにreturnさせたいのです。

    batファイルでexeを作るようにした方が良いのかなとも思うのですが、
    使用者のことを考えるとユーザーフォームでボタンクリックの方が親切かなと思っています。

    しかし、C#では無理があることなのか私の検索方法が悪いのか、
    あまりヒントとなるネタを見つけることができません。

    ということで、最初に戻るのですが、ユーザーフォームのクリックイベントでexeを作成することは可能なのでしょうか。
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35293 / ResNo.1)  Re[1]: クリックイベントでexeを作成できるか
□投稿者/ KOZ 一般人(15回)-(2022/12/17(Sat) 12:55:31)
  • アイコンNo35292に返信(TMKさんの記事)
    > ユーザーフォームのクリックイベントでexeの作成は可能なのでしょうか

    ソースを出力してコンパイルすればいいのでは。
    「OSに標準付属のC#/VBコンパイラーでソースコードをコンパイルするには?」
    https://atmarkit.itmedia.co.jp/ait/articles/1504/15/news019.html

    パラメタを外部ファイルから読み込むようにした exe ファイルを配布し、
    外部ファイルを編集するのが一般的かなと思います。
違反を報告
引用返信
■35294 / ResNo.2)  Re[1]: クリックイベントでexeを作成できるか
□投稿者/ Hongliang 大御所(636回)-(2022/12/18(Sun) 19:42:04)
  • アイコン「exeを作成する」というとソースコードをコンパイルして実行ファイルを作成することを想像するのですが、
    ひょっとしてなさりたいことは「引数を付けて.exeを起動したい」でしょうか。
    それならば以下のページなどがありますが。
    https://dobon.net/vb/dotnet/process/shell.html
違反を報告
引用返信

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



■記事リスト / ▲上のスレッド
■35281 / 親記事)  作成した白黒画像をWordに貼り付けてから「図として保存」
□投稿者/ x-boy 一般人(1回)-(2022/12/15(Thu) 17:43:42)
  • アイコン環境/言語:[VB2013〜2019] 
    分類:[.NET] 

    開発環境:VB2013〜2019

    こんにちは。
    以下の.NET Tipsを参考に、白黒の画像(二値化)を作成しました。

    2値化して、1bppの白黒画像を作成する
     https://dobon.net/vb/dotnet/graphics/1bpp.html

    PixelFormatはFormat1bppIndexedで、画像ファイルはPng形式で保存しました。
    このファイルのプロパティを見ると、ビットの深さは1になっていて、
    思い通りの白黒画像が出来ました。

    ただ、この画像ファイルをWord2019でWord本文に挿入し、これを
    Wordの右クリックメニュー「図として保存」でpng形式で保存した時、
    保存した画像ファイルをペイントで開くと、色が変になっています。
    具体的には白の部分が何だかグレーっぽい色、黒の部分が透過色になっていました。

    これは画像データの作成方法に問題があるのでしょうか?
    それとも、Word側で1bpp画像をうまく扱えないのでしょうか?
    またはペイントの問題でしょうか?

    ちなみに、「図として保存」でgifやbmp形式を選択して保存するとすれば
    ペイントでも思い通りの白黒になりました。
    (ただしgifは8ビット、bmpは24ビット画像になってしまいました。)

    また、対象のWordファイルを保存して拡張子を.docx→.zipに書き換えて
    このzipファイルの中身を確認すると、Wordに貼り付けた画像がありましたが、
    この画像はきれいな白黒の1bpp画像でした。
違反を報告
引用返信

▽[全レス8件(ResNo.4-8 表示)]
■35286 / ResNo.4)  Re[4]: 作成した白黒画像をWordに貼り付けてから「図として保存」
□投稿者/ x-boy 一般人(2回)-(2022/12/16(Fri) 11:28:15)
  • アイコン皆様、ありがとうございます。
    色々調べると、Wordの「図として保存」は色々と問題があるようで、
    Word側の問題なのかも知れません。

    とりあえずは、別の1bpp形式の画像を作って試してみたいと思いますが、
    System.Drawing.BitmapのSaveでは、gif形式(ImageFormat.Gif)を指定すると
    8ビット画像になってしまうようです。

    System.Drawing.Bitmapクラスを使う以外の方法で1bpp形式の画像を生成するには
    どうすればよいでしょうか?
違反を報告
引用返信
■35287 / ResNo.5)  Re[5]: 作成した白黒画像をWordに貼り付けてから「図として保存」
□投稿者/ 魔界の仮面弁士 大御所(1503回)-(2022/12/16(Fri) 11:51:46)
  • アイコン2022/12/16(Fri) 16:50:52 編集(投稿者)

    No35281に返信(x-boyさんの記事)
    > 以下の.NET Tipsを参考に、白黒の画像(二値化)を作成しました。
    > https://dobon.net/vb/dotnet/graphics/1bpp.html

    ImageCodecInfo + EncoderParameters を指定可能な
    Save メソッドのオーバーロードを指定しても、
    Png フォーマットの細かいパラメーターは指定できないらしいです。(ただし当方未検証)
    https://social.msdn.microsoft.com/Forums/ja-JP/cbae4e4d-be5f-4a8d-a476-cf3dee6c4a49/c45png?forum=netfxgeneralja


    ということで、ImageFormat を指定する方の Save を読んで保存していますが、
    こちらで検証してみても、どうにも Word 側に問題があるっぽい感じがしますね。

    'img0.png はこれです → https://dobon.net/s/img/logo-bt1-108x24.png
    Using src As New Bitmap("E:\img0.png") _
      , dst = Create1bppImage(src)
      dst.Save("E:\img1.png", ImageFormat.Png)
      dst.Save("E:\img2.bmp", ImageFormat.Bmp)
    End Using


    (0) img0.png … 155 バイト Chunk=[IHDR, PLTE, tRNS, IDAT, IEND]
    (1) img1.png … 193 バイト Chunk=[IHDR, sRGB, gAMA, PLTE, pHYs, IDAT, IEND]
    (2) img2.bmp … 446 バイト

    --> 上記を AzConvPNG で圧縮したもの -->
    (3) img3.png … 148 バイト Chunk=[IHDR, PLTE, tRNS, IDAT, IEND]
    (4) img4.png … 135 バイト Chunk=[IHDR, PLTE, IDAT, IEND]
    (5) img5.png … 135 バイト Chunk=[IHDR, PLTE, IDAT, IEND]

    --> それらを Word に貼って「図として保存」したもの -->
    (6) img0_wd.png … 207 バイト 正常画 Chunk=[IHDR, sRGB, gAMA, PLTE, tRNS, pHYs, IDAT, IEND]
    (7) img1_wd.png … 153 バイト 色化け Chunk=[IHDR, sRGB, gAMA, PLTE, tRNS, pHYs, IDAT, IEND]
    (8) img2_wd.png … 153 バイト 色化け Chunk=[IHDR, sRGB, gAMA, PLTE, tRNS, pHYs, IDAT, IEND]
    (9) img3_wd.png … 207 バイト 正常画 Chunk=[IHDR, sRGB, gAMA, PLTE, tRNS, pHYs, IDAT, IEND]
    (10)img4_wd.png … 153 バイト 色化け Chunk=[IHDR, sRGB, gAMA, PLTE, tRNS, pHYs, IDAT, IEND]
    (11)img5_wd.png … 153 バイト 色化け Chunk=[IHDR, sRGB, gAMA, PLTE, tRNS, pHYs, IDAT, IEND]


    正常だった (6) と、化けてしまった (7) を比較してみると、
    ヘッダー, IHDR, sRGB, gAMA, tRNS, pHYs, IEND は同一ですが、
    PLTE(パレット情報) と IDAT(イメージデータ) が変質していました。
違反を報告
引用返信
■35288 / ResNo.6)  Re[6]: 作成した白黒画像をWordに貼り付けてから「図として保存」
□投稿者/ x-boy 一般人(1回)-(2022/12/16(Fri) 14:29:48)
  • アイコン2022/12/16(Fri) 14:33:22 編集(投稿者)

    魔界の仮面弁士様、ありがとうございます。
    ちなみに、

    > (0) img0.png … 155 バイト Chunk=[IHDR, PLTE, tRNS, IDAT, IEND]
    > (1) img1.png … 193 バイト Chunk=[IHDR, sRGB, gAMA, PLTE, pHYs, IDAT, IEND]

    の「Chunk=〜」は、Pngファイルのヘッダ情報でしょうか?

    これを見ると、シロートながら、#Chunk=[IHDR, PLTE, tRNS, IDAT, IEND]になっているものが色化けしていないように見えますが、さっぱり分かりません。
    (sRGBがRGB、gAMAがガンマ値かな、っていう感じですが、良く分かっていません)

    せっかくの機会ですので、ここら辺を勉強したいので、なにか解説サイトがあれば教えて頂けるとありがたいです。


違反を報告
引用返信
■35290 / ResNo.7)  Re[7]: 作成した白黒画像をWordに貼り付けてから「図として保存」
□投稿者/ 魔界の仮面弁士 大御所(1504回)-(2022/12/16(Fri) 16:39:13)
  • アイコンNo35288に返信( x-boyさんの記事)
    > の「Chunk=〜」は、Pngファイルのヘッダ情報でしょうか?

    PNG ヘッダーの後に続く構造体のことです。

    すべてのチャンクは、4 文字の case-sensitive な識別子(type)を持ち、
    それぞれ下記の構造になっています。

     ・4 バイト: "length" (チャンクの data 部のバイト数)
     ・4 バイト: "type" (4 文字でチャンクの種類を表す)
     ・可変長: "data" (チャンクのデータ本体)
     ・4 バイト: "CRC-32" (type と data の誤り検出符号)

    より詳しいレイアウトは、 No35284 で紹介したサイトをご覧ください。
    https://www.setsuki.com/hsp/ext/png.htm


    > これを見ると、シロートながら、#Chunk=[IHDR, PLTE, tRNS, IDAT, IEND]になっているものが色化けしていないように見えますが、さっぱり分かりません。
    こちらに投げてみるとわかりやすいかも。
    https://www.nayuki.io/page/png-file-chunk-inspector


    > (sRGBがRGB、gAMAがガンマ値かな、っていう感じですが、良く分かっていません)
    tRNS チャンクは 0 個 or 1 個存在し、透明度情報を保持しています。
    チャンクデータは可変長で、その構造は IHDR のカラータイプによって異なります。

    gAMA チャンクは 0 個 or 1 個存在し、内包する RGB データのリニア輝度からの
    ガンマ補正値を 4 バイトの値で保持しています。
    https://qiita.com/yoya/items/ce8dffc8a8a19746d87c

    sRGB チャンクは 0 個 or 1 個存在し、画像色が「sRGB 色空間」であることを示します。
    https://www.setsuki.com/hsp/ext/chunk/sRGB.htm
違反を報告
引用返信
■35291 / ResNo.8)  Re[8]: 作成した白黒画像をWordに貼り付けてから「図として保存」
□投稿者/ x-boy 一般人(2回)-(2022/12/16(Fri) 16:49:58)
  • アイコン魔界の仮面弁士様、ありがとうございます。
    ご教示頂いた情報を元に、自分なりに勉強してみます。

違反を報告
引用返信

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






Mode/  Pass/


- Child Tree -