?? 025.htm
字號:
<p>finally</p>
<p>SetPasswordForm.Free;</p>
<p>end;</p>
<p>end;</p>
<font face="宋體" lang="ZH-CN"><p> 口令成功設置,把</font>PassWord<font
face="宋體" lang="ZH-CN">的值拷貝給</font>PWord<font face="宋體" lang="ZH-CN">輸出,并返回</font>True<font
face="宋體" lang="ZH-CN">。應該注意的是由于</font> PWord<font face="宋體"
lang="ZH-CN">本身就是指針類型,指向一個字符串的地址,因而雖然</font>PWord<font
face="宋體" lang="ZH-CN">用于輸出,但在參數表中仍為傳值參數,而不是傳址參數。另外調用函數</font>StrCopy<font
face="宋體" lang="ZH-CN">,要求</font>PWord<font face="宋體" lang="ZH-CN">在傳入前已分配內存,否則會導致一個一般保護錯。</font>try...finally<font
face="宋體" lang="ZH-CN">用于保護窗口所占用內存資源在任何情況下都能正常釋放,讀者可參看第十二章。</p>
<p> 在口令設置窗口中,為了確保用戶記住了設置的口令,在用戶輸入并按回車鍵后,要求用戶再次輸入進行確認。只有用戶重新輸入的字符串與原設置口令相同,口令設置窗口才能正常關閉</font>
<font face="宋體" lang="ZH-CN">。否則將原設置口令清空,要求用戶再次輸入。以上功能的實現在編輯框的</font>OnKeyPress<font
face="宋體" lang="ZH-CN">事件處理過程中?!?lt;/p>
</font><p>procedure TSetPassWordForm.Edit1KeyPress(Sender: TObject; var Key: Char);</p>
<p>begin</p>
<p>if Edit1.text = '' then Exit;</p>
<p>if Key = #13 then</p>
<p>begin</p>
<p>if Verified then</p>
<p>if StrPas(PassWord) = Edit1.text then</p>
<p>begin</p>
<p>OKBtn.Enabled := True;</p>
<p>Edit1.Enabled := False;</p>
<p>OKBtn.SetFocus;</p>
<p>end</p>
<p>else</p>
<p>begin</p>
<p>Verified := False;</p>
<p>MessageDlg('PassWord is InValid.',mtWarning,[mbOK],0);</p>
<p>Edit1.text := '';</p>
<p>PassWord := '';</p>
<p>Label1.Caption := 'Please Input PassWord:';</p>
<p>end</p>
<p>else</p>
<p>begin</p>
<p>Verified := True;</p>
<p>StrPCopy(PassWord,Edit1.text);</p>
<p>Edit1.text := '';</p>
<p>Label1.caption := 'Please Verify PassWord:';</p>
<p>end;</p>
<p>Key := #0;</p>
<p>end;</p>
<p>end;</p>
<font face="宋體" lang="ZH-CN"><p> 口令檢查窗口的實現相對簡單,只定義了一個輸出函數</font>GetPassWord<font
face="宋體" lang="ZH-CN">,用于生成口令檢查窗口并返回口令檢查的結果?!?lt;/p>
</font><p>function GetPassword(Password: PChar): Boolean;</p>
<p>var</p>
<p>GetPasswordForm: TGetPasswordForm;</p>
<p>begin</p>
<p>Result := False;</p>
<p>GetPasswordForm := TGetPasswordForm.Create(Application);</p>
<p>try</p>
<p>with GetPasswordForm do</p>
<p>if ShowModal = mrOK then</p>
<p>if UpperCase(Edit1.Text) <> StrPas(StrUpper(Password)) then</p>
<p>MessageDlg('Invalid Password', mtWarning, [mbOK], 0)</p>
<p>else</p>
<p>Result := True;</p>
<p>finally</p>
<p>PasswordForm.Free;</p>
<p>end;</p>
<p>end;</p>
<font face="宋體" lang="ZH-CN"><p> </font>PassWord<font face="宋體" lang="ZH-CN">為輸入的參數,不能為空,由調用以上函數的程序負責維護。</p>
<p> 窗口中用戶輸入口令時回顯在屏幕上的字符由編輯框的</font>PassWordChar<font
face="宋體" lang="ZH-CN">屬性確定。</p>
<p> 在</font>DLLs<font face="宋體" lang="ZH-CN">的工程文件中,把兩個輸出函數寫到</font>exports<font
face="宋體" lang="ZH-CN">子句中?!?lt;/p>
</font><p>library PassForm; </p>
<p>uses</p>
<p>GetPass in 'GETPASS.PAS' {PasswordForm},</p>
<p>Setpass in 'SETPASS.PAS' {SetPassWordForm}; </p>
<p>exports</p>
<p>GetPassword,SetPassWord; </p>
<p>begin</p>
<p>end. </p>
<p>10.4.2.2 Delphi<font face="宋體" lang="ZH-CN">應用程序調用重用窗體 </p>
<p> 在</font>Delphi<font face="宋體" lang="ZH-CN">應用程序中調用重用窗體,首先必須包含</font>passform.dll<font
face="宋體" lang="ZH-CN">的兩個輸出函數: </p>
</font><p>function GetPassword(Password: PChar): Boolean;</p>
<p>far; external 'c:\dlls\PassForm';</p>
<p>function SetPassword(PassWord: PChar): Boolean;</p>
<p>far; external 'c:\dlls\PassForm';</p>
<font face="宋體" lang="ZH-CN"><p> 這位于程序單元的</font>implementation<font
face="宋體" lang="ZH-CN">部分。</font></p>
<font face="宋體" lang="ZH-CN"><p>口令設置部分的實現代碼為: </p>
</font><p>procedure TForm1.SetButtonClick(Sender: TObject);</p>
<p>begin</p>
<p>PassWord := StrAlloc(40);</p>
<p>if SetPassWord(PassWord) = False then</p>
<p>MessageDlg('PassWord is not set',mtInformation,[mbOK],0); </p>
<p>end;</p>
<font face="宋體" lang="ZH-CN"><p> 首先為口令字符串分配內存。當口令設置窗體按</font>Cancel<font
face="宋體" lang="ZH-CN">按鈕取消時,顯示相應的信息。</p>
<p> 口令檢查部分的實現代碼為: </p>
</font><p>procedure TForm1.TestButtonClick(Sender: TObject);</p>
<p>begin</p>
<p>if PassWord = nil then</p>
<p>begin</p>
<p>MessageDlg('Set password first', mtInformation, [mbOK], 0);</p>
<p>SetButton.SetFocus;</p>
<p>Exit;</p>
<p>end;</p>
<p>if GetPassword(PassWord) then</p>
<p>Label1.Caption := 'You are Wellcome !'</p>
<p>else</p>
<p>Label1.Caption := 'Sorry,You are InValid User.';</p>
<p>end;</p>
<font face="宋體" lang="ZH-CN"><p> 根據口令檢查的結果,在標簽框中顯示相應的信息?!?lt;/p>
</font><p>10.4.2.3 VB<font face="宋體" lang="ZH-CN">應用程序調用重用窗體 </p>
<p> </font>VB<font face="宋體" lang="ZH-CN">是微軟公司極力推薦的一個可視化開發工具。它雖然并不支持動態鏈接庫的創建,但可以調用標準的</font>Windows
API<font face="宋體" lang="ZH-CN">動態鏈接庫和用其它語言編寫的動態鏈接庫。為了驗證所生成</font>DLLs<font
face="宋體" lang="ZH-CN">的普適性,我們用</font>VB<font face="宋體"
lang="ZH-CN">開發了一個簡單的程序來調用</font>passform.dll<font face="宋體"
lang="ZH-CN">中儲存的窗體。</font></p>
<font face="宋體" lang="ZH-CN"><p>下面是</font>VB<font face="宋體" lang="ZH-CN">程序的完整代碼,和</font>Delphi<font
face="宋體" lang="ZH-CN">程序的對應部分基本一致?!?lt;/p>
</font><p>Option Explicit</p>
<p>Declare Function GetPassWord Lib "c:\dlls\passform.dll" (ByVal PassWord As
String) As Integer</p>
<p>Declare Function SetPassWord Lib "c:\dlls\passform.dll" (ByVal PassWord As
String) As Integer </p>
<p>Dim PassWord As String * 40</p>
<p>Sub Check_Click ()</p>
<p>If PassWord = "" Then</p>
<p>MsgBox ("Enter sample password first")</p>
<p>SetPass.SetFocus</p>
<p>Else</p>
<p>If GetPassWord(PassWord) Then</p>
<p>StatusLbl.Caption = "You are Welcome!"</p>
<p>Else</p>
<p>StatusLbl.Caption = "Sorry,You are Invalid User."</p>
<p>End If</p>
<p>End If</p>
<p>End Sub</p>
<p>Sub SetPass_Click ()</p>
<p>If SetPassWord(PassWord) = 0 Then</p>
<p>MsgBox ("PassWord is not Set.")</p>
<p>End If</p>
<p>End Sub</p>
<font face="宋體" lang="ZH-CN"><p> 有關</font>VB<font face="宋體" lang="ZH-CN">編程的一些具體問題,讀者可參看有關的</font>VB<font
face="宋體" lang="ZH-CN">參考書?!?lt;/p>
</font><p>10.4.3 <font face="宋體" lang="ZH-CN">小結 </p>
<p> 本章我們討論的是動態鏈接庫編程。許多可視化開發工具(如</font>Visual
Basic<font face="宋體" lang="ZH-CN">)不支持</font> DLLs<font face="宋體"
lang="ZH-CN">的創建,而</font>Delphi<font face="宋體" lang="ZH-CN">在這里又有上乘的表現。特別是窗體重用機制是</font>Delphi<font
face="宋體" lang="ZH-CN">對</font>Windows<font face="宋體" lang="ZH-CN">下</font>DLLs<font
face="宋體" lang="ZH-CN">編程的一個重大改進。在一般的</font>DLLs<font
face="宋體" lang="ZH-CN">編程中也體現了</font>Delphi<font face="宋體"
lang="ZH-CN">快捷、方便的特點。動態鏈接庫是</font> Windows<font
face="宋體" lang="ZH-CN">下程序組織的一種重要方式,使用動態鏈接庫可以極大地保護用戶在不同開發工具、不同時期所做的工作。利用動態鏈接庫,用戶可以逐步去構筑自己的程序模塊庫,為今后的工作積累素材。</font></p>
<font face="宋體" lang="ZH-CN"><p> </font></p>
<BR>
<hr color="#EE9B73" size="1" width="94%">
</TD>
<TD CLASS="tt3" VALIGN="bottom" width="8%" bgcolor="#e0e0e0"><strong><A HREF="026.htm"><FONT style="FONT-SIZE: 9pt">后一頁</font></A><BR>
<A HREF="024.htm"><FONT style="FONT-SIZE: 9pt">前一頁</font></A><BR>
<A HREF="index.html"><FONT style="FONT-SIZE: 9pt">回目錄</font></A><BR>
<A HREF="../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首頁</font></A><BR>
</strong>
</TD>
</TR>
</table>
</BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -