none
C#流程控制方法 RRS feed

  • 問題

  • 各位先進大家好,小弟目前有一個流程控制的問題想要請教,

    如果我想要做一個動作流程:

    在自動模式下

    1.相機拍照->2.量測照片->3.結束動作->回到動作1

    在手動模式下

    利用Windows Froms Application建立 1.相機拍照按鈕(執行相機拍照動作) 2.量測照片按鈕(執行量測照片動作)

    =================================================================

    現在我困惑的是我介面用Windows Froms Application來寫,因為它好規劃好整理,可是我在網路上找到的一些設計模式的文章

    為利用Console Application來寫,這我就困惑了,如果是這樣那麼要如何將Windows Froms Application與Console Application作資料傳遞與連

    結,還是Windows Froms Application也是有設計模式的方法呢?請各位先進解答一下!感謝!

                                           

    2018年3月13日 上午 07:41

解答

  • Windows Forms 的 Main 通常就只用來啟用第一個 Form , 你應該把程式寫在 Form 裡面.

    大致上長這樣

    (1) 先把那些相關類別準備好

    abstract class Command
        {
            protected ReceiverRobot robot;
    
            // 設定實際執行命令的物件
            public Command(ReceiverRobot robot)
            {
                this.robot = robot;
            }
    
            // 用來呼叫執行命令的物件,開始執行命令
            abstract public void Execute();
        }
    
        class GoAheadCommand : Command
        {
            public GoAheadCommand(ReceiverRobot robot)
                : base(robot)
            {
            }
    
            public override void Execute()
            {
                robot.GoAhead();
            }
        }
    
        class TurnLeftCommand : Command
        {
            public TurnLeftCommand(ReceiverRobot robot)
                : base(robot)
            {
            }
    
            public override void Execute()
            {
                robot.TurnLeft();
            }
        }
    
        // 向右轉的命令
        class TurnRightCommand : Command
        {
            public TurnRightCommand(ReceiverRobot robot)
                : base(robot)
            {
            }
    
            public override void Execute()
            {
                robot.TurnRight();
            }
        }
    
        // 實際執行命令的物件
        class ReceiverRobot
        {
            public void GoAhead()
            {
                System.Windows.Forms.MessageBox.Show("向前走一步");
            }
    
            public void TurnLeft()
            {
                System.Windows.Forms.MessageBox.Show("向左轉");
            }
    
            public void TurnRight()
            {
                System.Windows.Forms.MessageBox.Show("向右轉");
            }
        }
    
        class Invoker
        {
            private IList<Command> cmds = new List<Command>();
    
            public void SetCommand(Command command)
            {
                cmds.Add(command);
            }
    
            public void Run()
            {
                foreach (Command command in cmds)
                {
                    command.Execute();
                }
            }
    
        }

    (2) 接著在 Form1 的設計畫面放一個 Button , 點他倆下, 會出現空的  Button1_Click Method (同時他也把這方法委派給 Button1.Click 事件了)
     然後改一下那個 Button1_Click的程式碼內容

        private void button1_Click(object sender, EventArgs e)
            {
                Invoker invoker = new Invoker(); // 發命令物件
    
                ReceiverRobot robot = new ReceiverRobot(); // 執行命令物件
    
                GoAheadCommand cmd_go_ahead = new GoAheadCommand(robot); // 向前走指令
                TurnLeftCommand cmd_turn_left = new TurnLeftCommand(robot); // 左轉指令
                TurnRightCommand cmd_turn_right = new TurnRightCommand(robot); // 右轉指令
    
                // 設定要執行的命令
                invoker.SetCommand(cmd_go_ahead);
                invoker.SetCommand(cmd_go_ahead);
                invoker.SetCommand(cmd_turn_left);
                invoker.SetCommand(cmd_go_ahead);
                invoker.SetCommand(cmd_turn_right);
    
                // 開始執行命令
                invoker.Run();
            }

    就完成了

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 seanhua 2018年3月19日 上午 06:18
    2018年3月16日 上午 09:05
    版主

所有回覆

  • 原則上 console 的程式碼跟 Windows Form 相容,除了螢幕畫面存取外。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2018年3月13日 下午 01:52
  • 設計模式講的是解決特定程式碼撰寫上的問題,與使用Windows Froms Application或Console Application應該無關,之所以書本上用Console Application,通常是因為它是範例,用Console Application寫起來比較快,不需要特別有UI,範例程式碼不會夾雜一些處理UI的code,反而讓閱讀者困擾

    微軟免費線上課程

    HTML5 & JavaScript程式開發實戰(MyBook)

    開發ASP.NET您要瞭解的基楚

    http://www.dotblogs.com.tw/ian (MyBlog)

    2018年3月14日 上午 02:41
  • 建議把設計模式實作在Windows Forms Application即可, 可以不需要傳遞
    2018年3月14日 上午 06:50
  • 您好!我依照您的建議將設計模式寫在Windows Forms Application內,但是它會出現Main傳遞的錯誤,

    還有一個問題想要請教,Console Application碼如果寫在Windows Forms Application內,要如何顯示出Console

    Application介面的結果呢?以下是我參考網路上的範例程式,不知小弟是有那裡寫錯了,請各位先進參考一下!

    
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;

    namespace Moudle
    {
        public partial class Form1 : Form
        {
            
            // 用來發出命令的類別
            class Invoker
            {
                private IList<Command> cmds = new List<Command>();

                public void SetCommand(Command command)
                {
                    cmds.Add(command);
                }

                public void Run()
                {
                    foreach (Command command in cmds)
                    {
                        command.Execute();
                    }
                }

            }
            static void Main(string[] args)
            {
                // 初始化各個物件
                Invoker invoker = new Invoker(); // 發命令物件

                ReceiverRobot robot = new ReceiverRobot(); // 執行命令物件

                GoAheadCommand cmd_go_ahead = new GoAheadCommand(robot); // 向前走指令
                TurnLeftCommand cmd_turn_left = new TurnLeftCommand(robot); // 左轉指令
                TurnRightCommand cmd_turn_right = new TurnRightCommand(robot); // 右轉指令

                // 設定要執行的命令
                invoker.SetCommand(cmd_go_ahead);
                invoker.SetCommand(cmd_go_ahead);
                invoker.SetCommand(cmd_turn_left);
                invoker.SetCommand(cmd_go_ahead);
                invoker.SetCommand(cmd_turn_right);

                // 開始執行命令
                invoker.Run();

                Console.Read();
            }
            // 命令的抽像類別,用來衍生各種命令,建構時,須設定實際執行命令的物件
            abstract class Command
            {
                protected ReceiverRobot robot;

                // 設定實際執行命令的物件
                public Command(ReceiverRobot robot)
                {
                    this.robot = robot;
                }

                // 用來呼叫執行命令的物件,開始執行命令
                abstract public void Execute();
            }

            // 向前走一步的命令
            class GoAheadCommand : Command
            {
                public GoAheadCommand(ReceiverRobot robot)
                    : base(robot)
                {
                }

                public override void Execute()
                {
                    robot.GoAhead();
                }
            }

            // 向左轉的命令
            class TurnLeftCommand : Command
            {
                public TurnLeftCommand(ReceiverRobot robot)
                    : base(robot)
                {
                }

                public override void Execute()
                {
                    robot.TurnLeft();
                }
            }

            // 向右轉的命令
            class TurnRightCommand : Command
            {
                public TurnRightCommand(ReceiverRobot robot)
                    : base(robot)
                {
                }

                public override void Execute()
                {
                    robot.TurnRight();
                }
            }

            // 實際執行命令的物件
            class ReceiverRobot
            {
                public void GoAhead()
                {
                    Console.WriteLine("向前走一步");
                }

                public void TurnLeft()
                {
                    Console.WriteLine("向左轉");
                }

                public void TurnRight()
                {
                    Console.WriteLine("向右轉");
                }
            }
                  
            
            public Form1()
            {
                InitializeComponent();

            }

            private void Form1_Load(object sender, EventArgs e)
            {

            }
        }
    }

    • 已編輯 seanhua 2018年3月15日 上午 01:11
    2018年3月15日 上午 01:04
  • 前面說過,涉及螢幕存取的部分不共用。

    你可以考慮用個 TextBox 輸出,或先用 MessageBox 輸出。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2018年3月15日 下午 05:04
  • 感謝先進的提醒,小弟沒有注意到,

    目前將程式中的Console.WriteLine("向前走一步");修改為MessageBox.Show("向前走一步");

                        Console.WriteLine("向左轉");修改為MessageBox.Show("向左轉");

                        Console.WriteLine("向右轉");修改為MessageBox.Show("向右轉");

    在此小弟還有幾個疑問想要請教,

    1.在我上面的程式中Console.Read();這個指令是將螢幕指令輸出,

    但如果改為MessageBox 輸出,我要如何修改呢?

    2.為何我需要將此程式static void Main(string[] args)改為static void main(string[] args)程式在DEBUG才不會有錯誤呢?

    3.小弟程式模式的範例擺放的位置是否有錯誤呢?

    再請各位先進指導一下,感謝~

    2018年3月16日 上午 07:20
  • Windows Forms 的 Main 通常就只用來啟用第一個 Form , 你應該把程式寫在 Form 裡面.

    大致上長這樣

    (1) 先把那些相關類別準備好

    abstract class Command
        {
            protected ReceiverRobot robot;
    
            // 設定實際執行命令的物件
            public Command(ReceiverRobot robot)
            {
                this.robot = robot;
            }
    
            // 用來呼叫執行命令的物件,開始執行命令
            abstract public void Execute();
        }
    
        class GoAheadCommand : Command
        {
            public GoAheadCommand(ReceiverRobot robot)
                : base(robot)
            {
            }
    
            public override void Execute()
            {
                robot.GoAhead();
            }
        }
    
        class TurnLeftCommand : Command
        {
            public TurnLeftCommand(ReceiverRobot robot)
                : base(robot)
            {
            }
    
            public override void Execute()
            {
                robot.TurnLeft();
            }
        }
    
        // 向右轉的命令
        class TurnRightCommand : Command
        {
            public TurnRightCommand(ReceiverRobot robot)
                : base(robot)
            {
            }
    
            public override void Execute()
            {
                robot.TurnRight();
            }
        }
    
        // 實際執行命令的物件
        class ReceiverRobot
        {
            public void GoAhead()
            {
                System.Windows.Forms.MessageBox.Show("向前走一步");
            }
    
            public void TurnLeft()
            {
                System.Windows.Forms.MessageBox.Show("向左轉");
            }
    
            public void TurnRight()
            {
                System.Windows.Forms.MessageBox.Show("向右轉");
            }
        }
    
        class Invoker
        {
            private IList<Command> cmds = new List<Command>();
    
            public void SetCommand(Command command)
            {
                cmds.Add(command);
            }
    
            public void Run()
            {
                foreach (Command command in cmds)
                {
                    command.Execute();
                }
            }
    
        }

    (2) 接著在 Form1 的設計畫面放一個 Button , 點他倆下, 會出現空的  Button1_Click Method (同時他也把這方法委派給 Button1.Click 事件了)
     然後改一下那個 Button1_Click的程式碼內容

        private void button1_Click(object sender, EventArgs e)
            {
                Invoker invoker = new Invoker(); // 發命令物件
    
                ReceiverRobot robot = new ReceiverRobot(); // 執行命令物件
    
                GoAheadCommand cmd_go_ahead = new GoAheadCommand(robot); // 向前走指令
                TurnLeftCommand cmd_turn_left = new TurnLeftCommand(robot); // 左轉指令
                TurnRightCommand cmd_turn_right = new TurnRightCommand(robot); // 右轉指令
    
                // 設定要執行的命令
                invoker.SetCommand(cmd_go_ahead);
                invoker.SetCommand(cmd_go_ahead);
                invoker.SetCommand(cmd_turn_left);
                invoker.SetCommand(cmd_go_ahead);
                invoker.SetCommand(cmd_turn_right);
    
                // 開始執行命令
                invoker.Run();
            }

    就完成了

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 seanhua 2018年3月19日 上午 06:18
    2018年3月16日 上午 09:05
    版主
  • 感謝Bill Chung先進的耐心與詳細指導,小弟跟接觸C#程式不久,還有很多地方不懂,

    未來還有很多問題希望各位先進提點,也感謝樓上的先進熱情解答!目前疑惑與問題已經解決.

    2018年3月19日 上午 06:17