none
關於啟動程式先顯示歡迎畫面的問題 RRS feed

  • 問題

  • 各位先進

     

    小弟用C#作一個程式,但啟動很慢,會讓人以為沒有啟動成功,可能會再啟動一次,而造成不必要的麻煩,所以我想在啟動程式時先show一個簡單的Form做歡迎畫面,讓人知道已啟動程式。請問要如何做。

     

    或有什麼方法能讓C#只執行一個程式

    2008年8月19日 上午 01:49

解答

  • 限制只能執行一支程式的方法,可參考:

    http://bytes.com/forum/thread279224.html

     

    歡迎畫面的作法,你可以修改 Program.cs,把預設的 Application.Run(new MainForm()); 的 MainForm 改為你的主視窗。

    (MainForm 只是舉例,要看你的主視窗是哪個)

     

    然後在前面,加上你要顯示的 Welcome Form (Splash Screen) 的程式碼,例如:

    Code Snippet

     

    static void Main(string[] args)

    {

          // show your splash screen, using Dialog mode.

          // 別忘了在初始完成時,下 this.Close(); 關閉 splash screen。

          mySplashScreen.ShowDialog();

     

          Application.Run(new MainForm());

    }

     

     

     

     

    2008年8月19日 上午 02:11
    版主

所有回覆

  • 限制只能執行一支程式的方法,可參考:

    http://bytes.com/forum/thread279224.html

     

    歡迎畫面的作法,你可以修改 Program.cs,把預設的 Application.Run(new MainForm()); 的 MainForm 改為你的主視窗。

    (MainForm 只是舉例,要看你的主視窗是哪個)

     

    然後在前面,加上你要顯示的 Welcome Form (Splash Screen) 的程式碼,例如:

    Code Snippet

     

    static void Main(string[] args)

    {

          // show your splash screen, using Dialog mode.

          // 別忘了在初始完成時,下 this.Close(); 關閉 splash screen。

          mySplashScreen.ShowDialog();

     

          Application.Run(new MainForm());

    }

     

     

     

     

    2008年8月19日 上午 02:11
    版主
  • 小朱大大,你這個跟第一回覆的問題有何關聯?

    你這樣做出一個歡迎光臨的視窗,主視窗還是不動.你在開啟主視窗時還是很慢.

    你的做法應該是在主視窗初始時,去將滑鼠變漏斗或者進度進行中的視窗.

     

    2008年8月20日 上午 12:20
  • Splash Screen 不一定是指歡迎畫面。

    我那樣的想法是在 Splash Screen 視窗中做背景的資料載入,然後由程式自己呼叫 Close(),再繼續主視窗的載入。

     

    Splash Screen 的應用,本來就要看是因為什麼程序拖到載入時間 (connect 到遠端 Server,下載資料等)。

    如果是因為非主視窗的處理造成 delay,就可以利用我那個方法,先在背後處理好全域的初始化 (程式寫在 Splash Screen 的 Form_Load 中),再進入主視窗的載入。

     

    還有一種變形作法,由 Splash Screen 視窗來載入主視窗,不過這樣 Application.Run() 所產生的主執行緒會落不到主視窗上。

     

    例如我在 Main() 中使用這樣的程式碼 (.NET Framework 1.1):

     

    Code Snippet

     

    // pre-initialization


    using (Dialogs.Load load = new Dialogs.Load())
    {
     load.Show();

     

     load.L_LoadMessage.Text = "載入應用程式設定 ...";
     Application.Initialize.LoadSystemConfiguration();

     

     load.L_LoadMessage.Text = "檢查遠端連線能力 ...";
     // detect connection status.
     Application.Initialize.CheckRemoteCanBeConnected();

     

     // try to connect local data server.

     load.L_LoadMessage.Text = "檢查本地資料提供者 ...";
     try
     {
      Application.Initialize.ConnectToDataServer();
     }
     catch (InvalidOperationException e)
     {
      if (e.Message == "DATA_SERVER_NOT_AVAILABLE")
       MsgBox.Error("系統訊息", "無法與資料提供者連線,以致於應用程式無法啟動," +
        "請檢查資料提供者的狀態,或聯絡系統管理員 .");
      else
       MsgBox.Error("系統訊息", "系統因為其他的錯誤而無法啟動," +
                 "請聯絡系統管理員 .\r\n\r\n錯誤參考:\r\n\r\n" + e.Message);

      return;
     }
     catch (Exception e)
     {
      MsgBox.Error("系統訊息", "系統因為其他的錯誤而無法啟動," +
       "請聯絡系統管理員 .\r\n\r\n錯誤參考:\r\n\r\n" + e.Message);
      return;
     }

     load.Close();
    }

     

    ... // run main window.

     

    這支程式可以顯示 Loading 的畫面 (Splash Screen),當然這個畫面是我自己做的,但它也執行了背景初始化的工作,這個方法雖然和我前面給的不同,但效果是相同的。

     

    當然也可以不使用 Splash Screen,但要在主視窗中提前顯示載入的畫面才行。

     

    把指標變成漏斗的方式,未必可以堵使用者的嘴 ...

    2008年8月20日 上午 02:33
    版主
  • 我的做法是在主視窗下加入狀態列,在狀態列下加入進度Bar.

    在Form_Loading時去觸發進度Bar讓它去跑.並把一些控件,指令Disable掉.

    然後用非通步方式執行遠端呼叫.

    非同步完成,將控件,指令Enable

    停止進度Bar.

    當然更進階方式是用延遲讀取方式.

    使用者要哪些資料,操作哪一筆記錄再去讀取,執行哪個控件,元件,表單再去初始.

    而不是一次把全部東西做出來.

     

    2008年8月20日 上午 02:47
  • 感謝小朱大大

     

    我覺得.NET設計的程式在啟動都很慢,尤其在不快的電腦上,所以我採用只執行一次個體,避免使用者的不便,

    2008年8月23日 下午 03:16