由 POS 系統談 Windows 程式開發的風格 |
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
談 Windows 程式開發的風格 ■ DOS 程式的開發風格 :
主程式本身是個大迴圈 , 不停的等待按鍵輸入 ,
然後依照按鍵指定功能跳到副程式(或稱次迴圈),
程序掌控容易 , 因為只有一個入口和一個出口 ,
副程序必須執行完或符合某種條件才能結束 ,
程序執行由上而下,故可將全部程式碼印出研究 ■ Windows 程式的開發風格 :
所有程序的執行依照訊息觸發來執行 , 沒有所謂
的迴圈型副程序(即用 do...while 來控制某一程序
的執行與結束條件)
以目前 GUI 介面的操作風格及滑鼠使用來看
已經沒有什麼問題 , 但某些程式以這種方式來寫
將會非常累 (如 POS 程式) Windows 的事件觸發程序已改變了我們設計程式的風格 ,
但有些程式還是得依照"線性程序結構"來執行 ,
無法也不能用事件觸發來破壞或轉向程式流程.... 使用多個 Form 的 ShowModal 方式就還有點 DOS 的影子
例如 : 在 Form1 上選擇了某項功能後跳到 Form2
Form2 沒有按結束鈕前 , 絕不可能跳回 Form1
但若全部功能都集中在一個 Form 時 , 程序控制將非常複雜
user 可以以滑鼠將焦點移來移去 , 脫離你的程序控制
所以要加入一大堆的旗標做判斷.....
而以 Window 介面開發的程式 , 也沒人將全部程式碼印出觀賞的 ,
因為若不對照操作介面 , 根本不知程式碼中之程序
以哪裡為開頭或結束 專業的 POS 前端系統(收銀機)是不允許有滑鼠來操作的
(市面上那兩本VB & Delphi 介紹 POS 的書籍內容居然有滑鼠介面...)
輸入裝置僅有 POS 之"可程式化鍵盤"以及"條碼掃描器"
POS 收銀機操作機能是有所謂層級的觀念
雖然鍵盤簡單(僅有 1234...[清除],[確認]鍵和一些 FUNCTION Key)
但所有機能都是一層一層下去
再一層一層退回
所以 POS 系統反而以 DOS 來開發比較簡單
舉例來說 , 以退貨這個機能來說 , 其動作流程為 : ----------------------------------------------------------------------
(第一層,系統閒置時)
1.按下[退貨]鍵 (第二層,進入退貨機能-輸入欲退貨之交易序號)
2.畫面訊息欄顯示"請輸入交易序號"
3.按 1,2,3,4.....
4.按[確認]進行步驟 6.
5.或按[清除]鍵,但此時有兩個要判斷的條件:
(a.)若按[清除]前,輸入之數字(交易序號)有值,表要重新輸入交易序號故
回到步驟 2.
(b.)若按[清除]前,輸入之數字(交易序號)是空的,表取消退貨機能,
直接回到第一層,系統閒置狀態 (第三層,進入退貨機能-選擇退貨方式)
6.畫面訊息欄顯示"1.部分退貨 2.全部退貨"
7.按 1,2,3,4.....
8.按[確認]進行判斷 , 若按的是 1 或 2 則進行步驟 10. ,
若按其他數字則秀錯誤訊息並回到步驟 6. 重輸
9.或按[清除]鍵,此時也有兩個要判斷的條件:
(a.)若按[清除]前,輸入之數字(交易序號)有值,表要重新輸入退貨方式故
回到步驟 6.
(b.)若按[清除]前,輸入之數字(交易序號)是空的,表取消選擇輸入退貨方式,
回到前一層(第二層),輸入欲退貨之交易序號
10.實際執行 1.部分退貨 或 2.全部退貨 退貨程序
(若輸入的交易序號找不到 , 還會跳至另一個錯誤處理程序...) 以上大家可注意一點 , 以最常用的[清除]&[確定]鍵來說 ,
同樣的[清除]&[確定] 在不同的時機有不同的意義...
---------------------------------------------------------------------- ■ 以上機能以 DOS 來寫 , 各層一個副程序即可 , 每個副程序處理個別的按鍵意義 ,
程式流程嚴謹 , 不會被 user 亂跳
■ 以上機能若以 Windows 多 Form 方式來寫 , 第一層是主 Form (Form1)
第二層是 Form2 (退貨機能-輸入欲退貨之交易序號) , 第三層是 Form3 (退貨機能-選擇退貨方式)
每層有每層的 KeyDown 判斷 , 每層有每層的邏輯限制 , 合條件則跳至下一層
不合條件則在原層 , 反悔或取消則回上一層 , User 也無法任意轉移 Focus
■ 但問題來了....POS 機能少說也有十幾二十種 , 每一機能都可能有好幾層
每層的邏輯也不同 , 總不能為每一層開一個 Form 吧 , 收銀機上又沒滑鼠及標準 pc 鍵盤,
也不能用 MessageBox 或 InputBox 或 QueryBox 來代替輸入 , 所以只能用一個主 Form ,
各位可以想想 , 在同一個主 Form 的 KeyDown 事件中要如何可以依照各機能進入的層級及時機
來共用 KeyDown ? 那就是使用旗標來判斷 , 事實上很多 Windows POS 系統(包含我們公司開發
的 POS 系統)使用這種方式 , 但也因此程式無論在開發規劃或將來維護 , 都是一個很吃重的負擔 ....
我有想到一個好方法 , 雖還沒實做過但我還沒想到缺點 , (當然不是用 Do....While 去模擬
DOS 的線性程序結構 , 在 Windows 上雖有 Application.process 可讓迴圈不致死繞 ,
但總是不好)不過...在公佈我想到的方法之前,我想看看前輩們有無好的方法或架構 ,
在 Windows 上針對這類"線性程序結構"程式開發上的意見.... ■ 再補充描述一下 DOS vs. Windows 風格的不同: □ Dos 程式以程序為主,事件(鍵盤事件)為輔,即進入某一程序後就一直等在那邊隨時監測你的鍵盤輸入,沒有符合這個程序離開的條件絕不會離開此程序
□ Windows 程式以事件(鍵盤事件)為主,程序為輔 , 按了鍵(OnKeyDown)後,再看看(依旗標控制)要進到哪個程序(而且不能一直卡在那個程序中 , 否則將接不到下一次鍵盤觸發事件)
程序的完成是分週期的 (OnKeyDown -> 旗標決定 -> 程序甲 -> 執行完成否 ? 完成則改變旗標值(下次 KeyDown 就不會再進來程序甲),未完成則 return 繼續等待下一個 KeyDown ; 換句話說 : 副程序在執行期間 , 程式流程仍要返回 KeyDown 事件以等待下一個 KeyDown 事件 , 且要確保 下一個 KeyDown 事件發生後流程會回到原先未完成的程序 , 而不會被別的程序搶走
□ POS 系統畫面不能有可以被 Focus 的元件 , 所以也不能用 Edit 來等待使用者按鍵的輸入 , 況且 POS 鍵盤是所謂的"可程式化鍵盤" , 按下 "1" 這個數字並不是標準 "1" 的 ASCII 碼 , 所以根本不能用一般編輯元件來接收鍵盤碼 , 而要直接抓 ScanCode 來處理 POS 架構比較適合用 DOS 的模式喔 ... 本主題在本站之討論區 :
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=19269
|
dirboy
一般會員 發表:7 回覆:16 積分:9 註冊:2002-07-15 發送簡訊給我 |
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
|
dirboy
一般會員 發表:7 回覆:16 積分:9 註冊:2002-07-15 發送簡訊給我 |
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
引言: ........ 我覺得不論開發什麼系統 用Dos,出來就是Dos 的樣子 用Win,出來就是Win 的樣子 所以在Windows上用mouse是正常的 ........這是在我五,六年前剛從 DOS 轉 Windows 時 就跟那些喜歡把 Windows 寫成像 DOS 介面 同事所講過的話 但為何 五,六年 後的今天我為何又回頭稿這種飛機 ? 原因 1.程式的問題 : 功能的擴充已不是有640K 記憶體限制的 DOS 所能符合 2.網路的問題 : 在 Windows 下 TCP/IP 是民生用品,在 DOS 下 TCP/IP 是奢侈品(但又不能不用) 3.連資料庫的問題 4.最重要的原因 , 客戶的問題 , 客戶要求新一代 POS 系統使用 Windows , 我們的 POS 系統是要開發給數千家連鎖商店使用的 POS , 金額甚達上億 , 不是那種幾千元的套裝 POS 系統... 但您看過類似家樂福,7-11,這種大流量的 POS 系統用滑鼠嗎 ? 並非不願用,而是環境限制不能用 |
dirboy
一般會員 發表:7 回覆:16 積分:9 註冊:2002-07-15 發送簡訊給我 |
|
bruce0211
版主 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
|
cccheng
一般會員 發表:8 回覆:19 積分:5 註冊:2002-05-30 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |