摘 要:本文通過使用Delphi和Web Services技術開發簡訊應用程式的執行個體詳細的介紹了如何在Delphi中開發基於Web Services技術的應用程式。 關鍵字:Delphi;Web Service;簡訊應用程式開發 一提起基於Web Services技術的應用程式開發,一般人首先想到的開發工具是Vs.net,其實作為快速應用程式開發工具(RAD)的老大,Delphi從6.0就開始支援Web Services的開發和應用了,本文通過使用Delphi 7.0調用新浪傳送簡訊的Web Service進行簡訊應用程式開發這一執行個體詳細的介紹在Delphi中如何開發基於Web Services的應用系統。 第一步,準備工作,瞭解新浪簡訊Web Service。新浪傳送簡訊的Web Service地址是http://smsinter.sina.com.cn/ws/smswebservice0101.wsdl,該Web Service就只有一個方法,即string sendXml(carrier,userid,password,mobilenumber,content,msgtype)。各個參數全部為string類型,其含義基本如下(可能不正確)。 Carrier:電訊廠商名稱,好像可以隨便輸,建議輸入“Sina”,如果輸入其他的值,訊息發送的特別慢; Userid:您在新浪無線上註冊的手機ID,如果您沒有在http://sms.sina.com.cn上註冊您的手機,你是無法使用本Web Service傳送簡訊的; Password:您在新浪無線上註冊手機時所使用的密碼; Mobilenumber:對方的手機號碼; Content:發送短訊息的內容; Msgtype:發送短訊息的類型,我估計支援多媒體訊息,不過我不知道怎麼使用,似乎隨便輸什麼都可以,我使用的是“Text”。 資費標準請參看新浪無線網站上的相關說明,應該是一條一角錢,不過也或者是一條兩角線,具體不太清楚。由於其後台可能使用了訊息佇列機制,在繁忙的時候,可能會有較長時間的延遲。 第二步,先建立一個空白的應用程式。運行Delphi 7,開啟[File]->[New]->[Application]菜單,Delphi自動產生一個預設的工程。將預設的表單Form1改為sms,然後將改工程儲存為smsdemo.prj。如所示: 圖1 第三步,引入Web Service。,開啟[File]->[New]->[Other]菜單,在彈出的視窗中選擇WebServices Tab頁面,然後選擇其中的WSDL importer選項,單擊OK按鈕彈出WSDL importer Wizard視窗,2所示。在其上的Location of WSDL File or URL 中輸入:http://smsinter.sina.com.cn/ws/smswebservice0101.wsdl (注意,千萬不能輸錯!),單擊Next按鈕後,再單擊Finishi按鈕,完成浪傳送簡訊Web Service的引入。此時工程檔案中會增加一個名字為smswebservice0101.pas的檔案,這是Delphi自動產生的Web Service引入申明檔案,不要手工修改他。 圖2 第四步,調用Web Service的簡訊發送介面。在sms表單中,依次增加四個TEdit控制項,一個TButton控制項,一個TMemo控制項和五個TLabel控制項,按圖3進行排列和設定。 圖3 在smsfrm單元的uses語句中包含smswebservice0101,以便改表單中能夠訪問新浪傳送簡訊的Web Service介面。 在發送按鈕onClick事件中寫入以下代碼: procedure Tsms.Button1Click(Sender: TObject); begin Memo1.Text := GetSMSWebServiceSoapPort.sendXml(Edit1.Text, Edit2.Text, Edit3.Text, Edit4.Text, Edit5.Text,''Text''); end; 注意:Edit1、Edit2、Edit3、Edit4、Edit5分別對應介面上的電訊廠商、使用者名稱、密碼、對方號碼、訊息內容;Memo1對應介面上的反饋。 第五步,使用Web Service的簡訊發送介面進行簡訊發送。編譯、運行smsdemo.prj,在使用者名稱中輸入您在新浪無線上註冊的手機ID、密碼中輸入您在新浪無線上的密碼,然後再輸入對方的手機號碼和訊息內容,單擊發送按鈕,稍候片刻,在反饋資訊框中將會得到該Web Service的反饋資訊,如果一切正常,系統會提示您簡訊發送成功。 小結 從上面的例子我們可以看到,只要理解了Web Services的概念,在Delphi的協助下,開發基於Web Services的應用程式將不是一件很困難的事情。Web Services最適合用於開發跨平台和跨網路進行通訊(因為使用http協議為防火牆所允許)的程式,可以跨越異質架構,聯絡客戶、供應商、企業夥伴以及企業內部之資訊系統,是電子商務B2B、公司資訊等整合的最佳解決方案。各個公司只要把商務邏輯“暴露”出來,成為Web Service,就可以讓任何指定的夥伴調用這些商務邏輯,而不管他們的系統在什麼平台上運行,使用什麼開發工具。Web Services是目前很熱門也是正在迅速發展著的一項技術,本文只是作者在學習中的一點小體會,肯定有理解不深刻甚或錯誤的地方,歡迎大家予以指正。 (全文完) 註:本文參考了http://blog.joycode.com/joy/posts/16939.aspx中提供的新浪簡訊Web Service技術,在此表示感謝。 ShowWindow。 單元 System var CmdShow: Integer; 描述 在程式中,當應用程式建立主視窗時,CmdShow變數包含了 Windows 希望傳遞給 ShowWindow 的參數值。 在庫(DLL)中,CmdShow總是為0。 3.CompilerVersion 常量 指明了Delphi編譯器的版本編號 單元 System const CompilerVersion = 15.0; 描述 使用CompilerVersion可以測試Delphi編譯器的統配層級。如果你想條件化利用了Delphi語言更新特色的代碼,這會很有用(This is useful if you want to conditionalize code that takes advantage of newer features in the Delphi language)。 4.ExitProcessProc 變數 ExitProcessProc 指定在應用程式關閉(shut down)前最後執行的過程(procedure)。 單元 System var ExitProcessProc: procedure; 描述 賦值給 ExitProcessProc 來指定你想在應用程式關閉前執行的過程。ExitProcessProc 的值是一個沒有參數的過程。 5.GetFileVersion 函數 返迴文件版本 單元 SysUtils function GetFileVersion(const AFileName: string): Cardinal; 描述 GetFileVersion返回一個檔案二進位版本號碼中最有意義的32位。AFileName指定檔案名稱,可以使用和LoadLibrary函數相同的路徑搜尋到。 6.GetModuleName 函數 返回給定控制代碼的模組的完全限定名稱(fully qualified name)。 單元 SysUtils function GetModuleName(Module: HMODULE): string; 描述 調用GetModuleFileName來獲得給定控制代碼的模組的完全限定名稱。 Module是模組的控制代碼。 7.HInstance 變數 控制代碼,由Windows提供給模組(module)。 單元 SysInit var HInstance: LongWord; 描述 HInstance 容納了由Windows提供的應用程式或庫的執行個體控制代碼 8.HintWindowClass 變數 指定用於顯示協助提示(help hint)的視窗的類。 單元 Forms var HintWindowClass: THintWindowClass = THintWindow; 描述 當應用程式顯示協助提示(Help Hint)時,它會建立一個HintWindowClass的執行個體來描繪用來顯示提示的視窗。應用程式通過建立THintWindow的衍生類別,然後在應用程式啟動時將衍生類別賦予HintWindowClass變數,能夠定製這個視窗。 9.InitProc 變數 InitProc 是最後一個安裝的初始化過程。 單元 System var InitProc: Pointer; 描述 賦值給InitProc來指定一個你想在應用程式啟動時執行的過程。InitProc是一個無參數過程。例如: procedure MyInitProcedure; ... initialization InitProc := @MyInitProcedure; begin end; 只有一個初始化過程能夠被賦予InitProc變數。如果你的應用程式定義了多個初始化過程,僅最後一個賦予InitProc的會執行。要允許其他初始化過程執行,你必須將過程“連結”到一起,從InitProc的新值中調用原先的值。例如,下面來自ComObj單元的代碼在賦新值前儲存了InitProc原先的值,然後在新賦予的初始化過程中調用儲存在值: SaveInitProc := InitProc; InitProc := @InitComObj; 10.IsConsole 變數 指示模組(module)是否作為控制台應用程式編譯。 單元 System var IsConsole: Boolean; 描述 如果模組作為控制台應用程式編譯,那麼IsConsole變數為True。同時在可執行檔和DLL中將為True(This will be True in both an executable and a DLL)。 11.IsLibrary 變數 指示模組是否是一個DLL。 單元 System var IsLibrary: Boolean; 描述 如果模組是一個DLL,那麼IsLibrary變數為True。 12.JITEnable 變數 控制何時及時調度器會被調用(Controls when the just-in-time debugger is called)。 單元 System var JITEnable: Byte = 0; 描述 使用JITEnable來指示什麼類型的異常會觸發及時調試器。 當JITEnable為0(預設值)時,所有的異常將使用應用程式的異常處理機制處理。及時調試器僅當應用程式沒有提供任何捕獲異常的機制時被調用。注意,除了Delphi單元中的初始化和結束化區,任何包含了Forms單元的應用程式都提供了異常處理(通過Application對象),不會觸發及時調試器(Note that any application that includes the Forms unit provides exception handling (via the Application object) for all but the initialization and finalization sections and does not trigger the just-in-time debugger)。 當JITEnable為1時,任何非原生(non-native)異常(使用其他產品編譯的代碼引發的異常)。都會觸發及時調試器。原生異常由應用程式的異常處理機制處理。 當JITEnable大於1時,所有的異常都會觸發及時調試器。 注意:當你安裝IDE時,它會被註冊為及時調試器。如果你安裝了其他帶調試器的工具,他們可能註冊了自己,而覆蓋了IDE的註冊。 13.Languages 函數 列出可用的支援地區(List the locale for which support is available)。 單元 SysUtils function Languages: TLanguages; 描述 使用由Languages返回的值可以獲得系統支援的關於地區的資訊。這個函數僅可用在Windows平台 14.MainInstance變數 指示主要的可執行檔的執行個體控制代碼。 單元 System var MainInstance: LongWord; 描述 使用MainInstance來獲得一個應用程式中主要的可執行檔的執行個體控制代碼。在使用了執行階段程式庫或包的應用程式中,當你需要可執行檔而不是庫的控制代碼時,這很有用。 注意:當從一個使用其他工具編譯的可執行檔中運行一個CLX動態連結程式庫(Windows)或者共用對象(Linux)時,不要使用MainInstance。 15.MainThreadID變數 指示當前模組中主執行線程。 單元 System var MainThreadID: LongWord; 描述 使用MainThreadID來獲得主執行線程(模組初始化時的當前線程)的線程ID。 在調試時,這個主線程ID顯示線上程狀態盒中。 在Windows上,MainThreadID的值和一些Win32API調用所需要的線程ID是相容的。 16.NoErrMsg變數 控制當執行階段錯誤發生時應用程式是否顯示一個錯誤資訊。 單元 System var NoErrMsg: Boolean = False; 描述 在Windows上,設定NoErrMsg來控制是否有一個訊息顯示來指出有一個執行階段錯誤發生了。當NoErrMsg為false(預設值)時,執行階段錯誤會導致應用程式顯示一個訊息框來提出發生的錯誤的類型。當NoErrMsg為true時,這些訊息將被禁止。 在Linux上,NoErrMsg沒有任何效果。 注意:SysUtils單元會將大部分的執行階段錯誤轉變成異常。如果你的應用程式套件組合含了SysUtils,那麼即使NoErrMsg是false,執行階段錯誤訊息框也未必會顯示。 17.PopupList變數 提供了對發向快顯功能表(popup menu)的Windows訊息的集中處理 單元 Menus var PopupList: TPopupList; 描述 使用PopupList可以訪問應用程式中的全部快顯功能表或者訪問響應快顯功能表訊息的視窗的視窗控制代碼。PopupList維持了在應用程式中建立的全部快顯功能表組件的列表。這個列表儲存一個集中處理髮向這些快顯功能表的Windows訊息的隱藏視窗的控制代碼。 18.RTLVersion常量 指出Delphi執行階段程式庫的版本號碼。 單元 System const RTLVersion = 15.0; 描述 使用RTLVersion可以檢查不依賴於編譯器版本層級的Delphi執行階段程式庫的版本號碼。 19.Screen變數 表現一個螢幕裝置 單元 Forms var Screen: TScreen; 描述 Screen變數是一個表現應用程式運行時所在系統的螢幕的TScreen組件。預設地,應用程式會建立一個基於當前螢幕裝置有關資訊的螢幕組件並將其賦給Screen變數。 20.Win32Platform變數 指定Win32平台的標識符 單元 SysUtils var Win32Platform: Integer = 0; 描述 Win32Platform用於標識系統啟動並執行Win32平台的類型。這將會是下列值之一: 值 含義 VER_PLATFORM_WIN32s 系統是Win32 VER_PLATFORM_WIN32_WINDOWS 系統是Windows 95 VER_PLATFORM_WN32_NT 系統是Windows NT Win32Platform僅在Windows上可用。 |