開發Windows Mobile簡單dict字典-以SQLite為例 (2)

開發Windows Mobile簡單dict字典-以SQLite為例 (2)

根據上一篇簡單的說明Windows Mobile結合SQLite開發的部分,接下來,重點要說明我自己所撰寫的一個簡單的字典。
該字典程式,我稱之為Sample DICT App,目前的版本為Version 0.1,主要支援Windows Mobile Standard設備。
以下將簡單說明設計該程式的需求:
 
‧使用者角度:
(a) 簡單提供英文單字詞意的查詢
(b) 支援可以選擇自己想要用的字典、或是自己加入新的字典到程式中使用。
(c) 能夠記錄上一次使用的字典庫。
 
‧開發者角度:
(a) 行動裝置記憶體通常不多,因此,要有效控制資料庫的連線數。
(b) 要能在不影響使用者操作的情形下更換資料庫。
(c) 支援程式可以讓使用者安裝於不同的目的地。
 
為了完成上面幾項的需求,我透過下圖來說明:

000

ApplicationContext:主要用於控制公用變數、方法、設定檔讀取設定與資料庫連線能力等。
PMenuItem:主要用於根據該應用程式所屬資料夾中存在的.db檔(SQLite的副檔名),所產生的物件項目,
                         並新增於畫面中可選擇。
frmMain:主要使用者操作英文單字詞彙查詢的畫面。
frmAboutMe:單純顯示程式的說明與內容。
Resources與Program:為Windows Mobile專案資源的操作與方法。
由上述的說明,不難得知,如果frmMain想要進行單字的查詢,必須先透過ApplicationContext取得資料庫的連線能力,
才能進行使用,即便以後如果開發多了其他的Controller(或頁面)需要操作資料庫,也會維持單一個連線能力,讓程式能
夠統一管理連線。
另外,因為要讓使用者能夠選擇字典庫,因此,透過PMenuItem繼承MenuItem控制項,讓applicationContext在讀取目
前應用程式資料夾下存在幾個*.db檔(LoadDictionaryies),再加入字典選項清單中讓使用者選擇。最後,為了能讓記錄
使用者最後所選擇的字典庫,透過建立一個config檔,記下使用者的選擇項目(setConfigValue)。
 
根據上述的說明,我相信大家可以明白我到底在做些什麼事情,接下來,便分類說明在開發過程中,遇到個人開發上所
認為需要記錄下來的地方與技術。
 
1. 如何取得目前應用程式所存在的目錄
   1: Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
‧Path.GetDirectoryName(string path):主要回傳指定路徑的目錄資訊。
‧System.Reflection.Assembly:可用於取得目前已載入應用程式定義域之組件的Assembly物件陣列。
           另外,可以透過.GetName()取得這個組件的 AssemblyName。.CodeBase():則取得回傳assembly的存在路徑。
 
2. 取得應用程式的目錄裡所存在的*.db檔
     2-1. 建立一類別繼承MenuItem控制項,並且override它本身onClick事件,讓它能夠在使用者選擇更換字典庫的時候,
             能夠正確更換。
   1: class PMenuItem: MenuItem
   2: {
   3:    protected override void OnClick(EventArgs e)
   4:    {
   5:       //base.OnClick(e);
   6:       List<PMenuItem> itemList = ApplicationContext.LoadDictionaries();
   7:       if (itemList != null)
   8:       {
   9:           int count = itemList.Count;
  10:           for (int i = 0; i < count; i++)
  11:           {
  12:              if (this.Text != itemList[i].Text)
  13:                itemList[i].Checked = false;
  14:           }
  15:       }
  16:       this.Checked = true;
  17:       ApplicationContext.setDBFilePath(ApplicationContext.getAppDIRPath() + this.Text + ".db");
  18:       ApplicationContext.setSQLiiteConnector();
  19:       ApplicationContext.setConfigValue(ApplicationContext._defaultDICT, this.Text);
  20:    }
  21: }
     2-2. 透過List泛型的使用,可以儲存多個MenuItem物件,並交由畫面是顯示。
   1: public static List<PMenuItem> LoadDictionaries()
   2: {
   3:   ItemList = new List<PMenuItem>();
   4:   string[] dbFiles = Directory.GetFiles(appDIRPath, "*.db");
   5:   int count = dbFiles.Length;
   6:   if (count >= 0)
   7:   {
   8:      int x, y;
   9:      count = dbFiles.Length;
  10:      for (int i = 0; i < count; i++) {
  11:         x = dbFiles[i].LastIndexOf("\\") + 1;
  12:         y = dbFiles[i].IndexOf(".");
  13:         PMenuItem objItem = new PMenuItem();
  14:         objItem.Text = dbFiles[i].Substring(x, y - x);
  15:         ItemList.Add(objItem);
  16:      }
  17:      return ItemList;
  18:   }
  19:   else {
  20:      return null;
  21:   }
  22: }
3. 透過程式呼叫IE來瀏覽網頁
   1: System.Diagnostics.Process.Start("iexplore.exe", http://www.dotblogs.com.tw/pou);
     這一段的呼叫方式,主要是用於啟動處理序資源,因此,它也可以用於其他程式的呼叫,例如:word、excel等。
 
4. 程式畫面

Screen001 Screen003 Screen002

使用者可以參考上一篇<開發Windows Mobile簡單dict字典-以SQLite為例(1)>,拆解出其他字典檔的資料至SQLite資料庫,
並儲存於該程式安裝的目錄下。
以上二篇是自己根據自己想要的一個小功能的開發經驗,如果大家覺得有趣或有我寫錯的地方,也歡迎大家留言一起討論,
下方也提供.Cab安裝檔讓大家使用。