質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

1793閲覧

メッセージ通知先の変更方法について。

yuki00079

総合スコア45

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2016/12/05 10:44

編集2016/12/05 10:51

###前提・実現したいこと
作成しているアプリケーションに自動実行オプションを追加するにあたって困っていることがございます。
ロジック内にはメッセージボックスを表示する箇所が多く存在し、自動化とは言えメッセージが表示されることにより止まってしまいます。bat等からキックし自動で処理を行うのが目的のためコマンドラインからの実行時にはメッセージ表示を行わないようにと考えております。別のプロジェクトに分けてしまうのも冗長的ですし、かと言って引数がある場合のみ表示しないような条件分岐は実装箇所が多くメンテの面でも微妙です。関数化し、引数を受けたときのみメッセージ通知を変更することも考えたのですが何か良き方法はございますでしょうか。

分かりにくい説明で申し訳ございません。

###該当のソースコード

'ダミーコマンドライン引数。 Dim opt As Boolean = True If opt Then Console.WriteLine("自動実行処理") Else MessageBox.Show("手動実行処理", "テスト", MessageBoxButtons.OK, MessageBoxIcon.Information) End If

###補足情報(言語/FW/ツール等のバージョンなど)
上記のような分岐ではメンテに手間がかかる上、コードが読みにくい。
設計時から問題といえばそうかもしれません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんにちは。
VB.NETはちょっと詳しくないのでC#で失礼します。
以下のようなユーティリティクラスを作ってしまい、MessageBoxの呼び出し自体をそれ経由に置き換えてしまえば良いと思います。

csharp

1public static class MyMessageBox 2{ 3 private readonly static bool opt = <コマンドライン引数>; 4 5 public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon) 6 { 7 if (opt) 8 { 9 // opt == true の処理 10 return DialogResult.OK; // okが押されたことにする 11 } 12 else 13 { 14 return MessageBox.Show(text, caption, buttons, icon); // 戻り値を一切使わないならvoidにしてしまうでも良い 15 } 16 } 17} 18 19// 使う時は 20MyMessageBox.Show("手動実行処理", "テスト", MessageBoxButtons.OK, MessageBoxIcon.Information); // optがtrueの時は何も実行されない

投稿2016/12/05 23:40

編集2016/12/06 02:25
tamoto

総合スコア4105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

MessageBoxやConsoleを直接呼ぶのではなく一旦受け皿となるクラスを定義しましょう。

例えば、IMessagingインターフェースを定義し、MessageBoxを利用したもの、Consoleを利用したものそれぞれを実装します。

public interface IMessaging { void Information(string message); } public class UIMessaging : IMessaging { public void Information(string message) { MessageBox.Show(message, "確認", MessageBoxButtons.OK, MessageBoxIcon.Information) } } public class ConsoleMessaging : IMessaging { public void Information(string message) { Console.WriteLine($"{DateTime.Now:hh:mm:ss} {message}"); } }

IMessagingの取得方法については、Depenency Injectionを使用するのが最良ですが、それが分からない場合にはstaticクラスにこのIMessagingインターフェースを実装したクラスを持たせてしまいましょう。後は、コンソール呼び出しが確定する何等かのオプション指定でコレを差し替えれば完成。

public static My { public static IMessaging Messaging { get; set; } } public void Main() { if (/* コンソールで実行された場合 */) { My.Messaging = new ConsoleMessaging(); } else { My.Messaging = new UIMessaging(); } My.Messaging.Information("アプリケーションを起動しました。"); }

この場合、UIMessagingとConsoleMessagingは別々に定義できるので、それぞれの処理が混在することもなく、すっきりします。
難点は途中で差し替えれないことですが、たぶん不要だろうと思うのでこういう形で提案させて戴きます。

投稿2016/12/07 03:04

編集2016/12/07 06:36
haru666

総合スコア1591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki00079

2016/12/07 06:31

当方の求める実装に近いと考え、ベストアンサーとさせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問