筆者花了半年時間學習REALbasic, 一邊學習新的語法, 一邊在重寫舊的VB6 Library, 因為要確定新的工具能不能符合我們的要求, 所以測試了很多方面不同的功能 :
- 資料庫
基本上ODBC, MySQL, MSSQL, PostgreSQL, Oracle 等等的Connector 都有齊了, 如果你要開啟Access(MDB) 問題也不大, 但是筆者會建議你轉用REALSQLdatabase (單機版) 或 REALSQLServerDatabase (資料伺服器), REALSQLdatabase 即是Sqlite, 只是名稱不同罷了, 如果你有細心查閱過網上的比較文章, Sqlite 的效能比Access(MDB) 好多了, 我不在此再敍述一遍, 在市場上很多的電子產品或設備, 都已經在使用Sqlite 的資料庫, 本人慣常會使用Navicat for Sqlite 或SQLiteManager 編輯Sqlite 資料庫, 但有一點要特別注意, REALSQLdatabase 的加密算法跟Navicat 不同, 如果資料庫用程式碼加密了, Navicat 是開啟不了的, 反之用Navicat 加密資料庫, REALbasic 也開啟不了, 我已測試過網上十多款不同的Sqlite 工具, 只有SQLiteManager 是跟REALSQLdatabase(REALbasic) 是共通的, 以下為他們的官方網站 :
Navicat for SQLitehttp://www.navicat.com/en/products/navicat_sqlite/sqlite_overview.htmlSQLiteManager http://www.sqlabs.com/- 日期格式
大家可能會很奇怪, 為何筆者老是喜歡用Double 來儲存日期及時間的資料, 第一個原因是VB6 預設就是用Double 型態來儲存日期時間, 我們都用慣了, 而且經多年使用, 已累積了一套完整的方法在Double 與日期格式之間游走, 另一個主要考慮是如何能讓編寫的程式能兼容更多的資料庫, 舉例來說, 如果你希望軟件能同時支援單機版(Access MDB) 及網絡版(MSSQL/MySQL), 你便要在設計資料庫初期, 使用相同的資料表欄位(Field) 型態, Access 有日期時間格式的資料型態, MySQL 沒有, 所以我們統一使用Double, Access 有Boolean 型態的欄位, MySQL也沒有, 我們也統一使用了Integer(Small Integer), 好處是同一套SQL語法同時用在不同的資料庫上, 這個方法我們真正使用了十年, 也沒有問題, 也試過再増加多一種資料庫PostgreSQL, 只需要少許修改便完成了, 不要盲目聽從微軟的指引, 單機版軟件也要裝一個MSSQL Desktop 版本, 真的發神經 !
日期及時間的轉換及計算方式http://www.inisoft.mo/smfportal/index.php?topic=37.0Realbasic 日期與 VB6日期(Double) 的互換函數 http://www.inisoft.mo/smfportal/index.php?topic=26.0- RS232 連接埠
在REALbasic 內Serial 是一個單線性的控件, 所以功能也不夠VB.Net 2010 強, 但當然也易用很多, 基面上與VB6 是相同的, 下面的程式碼是筆者其中一段初始化連接Counter Sign的使用方式, 相關說明文件如下 :
Real Software Documentation Wiki - Serialhttp://docs.realsoftware.com/index.php/Serial
Function InitCounterSignSerial(CounterSignSerial As Serial, SerialPort As Integer) As boolean
dim tmpResult as boolean
tmpResult=false
If SerialPort > 0 Then
CounterSignSerial.Close
CounterSignSerial.Baud=serial.Baud9600
CounterSignSerial.DTR=true
CounterSignSerial.Bits=serial.Bits8
CounterSignSerial.Stop=serial.StopBits1
CounterSignSerial.Parity=serial.ParityNone
CounterSignSerial.RequestToSend=false
CounterSignSerial.SerialPort=system.SerialPort("COM"+str(serialport))
tmpresult=CounterSignSerial.open
End If
return tmpresult
Exception Err
CatchErrorType(Err,CurrentMethodName)
End Function
- Grid / Listbox
當需要瀏覽大量資料時, Grid 控制項基本上是你的唯一選擇, 所以筆者無論學習任何工具語言, 都盡量先熟習Grid 控件的使用方法, 在REALbasic 內ListBox 可同時用作ListView, TreeView 及Grid 的功能, 各位網友可參考以前的文章:
Grid Plugin 及Listbox控件介紹 http://www.inisoft.mo/smfportal/index.php?topic=6.0- 報表工具
因為REALbasic有一套完善的繪圖指令, 所以縱使用簡單的Canvas控件也可以做出美觀的報表及預覧介面, 但如閣下希望更效率地編寫複雜的報表, 可以参考筆者從前介紹報表控件的文章:
Report Plugin 及相關技術文件http://www.inisoft.mo/smfportal/index.php?topic=5.0 - ESC/POS 列印模式
在Windows 平檯下, 各位網友如需要使用POS 印表機, 我建議也一併購買The MBS Realbasic Win Plugin 這個產品, 它們可以直接將ESC/POS 指令傳送往印表機, 否則的話你便找找那一個方法能讓你直接控制Printer Port, 使用這個Plugin 的好處是可以直接選取指定的印表機, 以Print Job 的形式將列印文件(ESC/POS 相關的程式碼)放進指定印表機的Print Queue 內, 筆者寫的CashierXtra 也是用這個Plugin 來處理Epson, Star 及大陸的平價POS Printer, 但當然你要自己負責印表機的內置編碼問題, 內置簡體GB Code 的印表機便不能以Line Print Mode 列印正體中文, 只能以Graphic Mode 才能列印, 但不能同時使用ESC/POS指令了。
Monkeybread Software - The MBS Realbasic Win Plugin 11.2http://www.monkeybreadsoftware.de/realbasic/plugin-win.shtml- Multi Thread
REALbasic 的Thread 執行緒並不是一個完全的的多工執行緒, 或多或少會受主程式的影響, 官方文件也提及這一點, 雖然功能不及VB.Net 2010 強大, 但是它真的很容易使用, 至少不用處理Delegate 這個問題, 在REALbasic 的Thread 內, 你可以隨時修改主程式內各控制項的屬性, 在VB.Net 2010 是不容許的, 必須編寫一堆Delegate 的程式碼才能做到同樣的效果, 筆者曾經使用過Thread 在每隔一秒的週期內不斷輪詢(Polling) 停車場的閘機, 取回車輛的入場、出場記錄及閘機狀態等, 效果相當穏定, 比起我的舊版本VB6 要另外編寫一個ActiveX Dll 來處理, 真的好太多了。
Real Software Documentation Wiki - Threadhttp://docs.realsoftware.com/index.php/Thread - ActiveX/Com
- DLL / SDK
- 圖形介面處理
- 自訂控制項
- 印表機
RealBasic 在Windows平檯下有一個非常嚴重問題, 就是關於列印時選擇印表機, 在Realbasic 開發的軟件下, 每次列印必須開啟PageSetupDialog 設定相關列印設定, 才能生成Graphics 物件, 如需省略選擇印表機的部份, 必須預先儲存之前已設定好的SetupString, 然後留給以後直接列印時使用, 在Mac 的環境下, 儲存這個SetupString 並沒有什麼大問題, 但在Windows 環境下可能因為內部編碼的分別, 當直接載入已儲存的SetupString 便會立即當掉Realbasic 的軟件, 問了很多網友及Realbasic 的支援人員也沒有答覆, 花了兩年時間找答案, 到了最後還是自己解決問題 !
http://forums.realsoftware.com/viewtopic.php?f=1&t=35483http://www.inisoft.mo/smfportal/index.php/topic,196.0.html- 完成項目
- 個人總結