開發Windows Mobile簡單dict字典-以SQLite為例 (2)
根據上一篇簡單的說明Windows Mobile結合SQLite開發的部分,接下來,重點要說明我自己所撰寫的一個簡單的字典。
該字典程式,我稱之為Sample DICT App,目前的版本為Version 0.1,主要支援Windows Mobile Standard設備。
以下將簡單說明設計該程式的需求:
‧使用者角度:
(a) 簡單提供英文單字詞意的查詢
(b) 支援可以選擇自己想要用的字典、或是自己加入新的字典到程式中使用。
(c) 能夠記錄上一次使用的字典庫。
‧開發者角度:
(a) 行動裝置記憶體通常不多,因此,要有效控制資料庫的連線數。
(b) 要能在不影響使用者操作的情形下更換資料庫。
(c) 支援程式可以讓使用者安裝於不同的目的地。
為了完成上面幾項的需求,我透過下圖來說明:
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. 程式畫面
使用者可以參考上一篇<開發Windows Mobile簡單dict字典-以SQLite為例(1)>,拆解出其他字典檔的資料至SQLite資料庫,
並儲存於該程式安裝的目錄下。
以上二篇是自己根據自己想要的一個小功能的開發經驗,如果大家覺得有趣或有我寫錯的地方,也歡迎大家留言一起討論,
下方也提供.Cab安裝檔讓大家使用。