?? 025.htm
字號(hào):
<p>finally</p>
<p>SetPasswordForm.Free;</p>
<p>end;</p>
<p>end;</p>
<font face="宋體" lang="ZH-CN"><p> 口令成功設(shè)置,把</font>PassWord<font
face="宋體" lang="ZH-CN">的值拷貝給</font>PWord<font face="宋體" lang="ZH-CN">輸出,并返回</font>True<font
face="宋體" lang="ZH-CN">。應(yīng)該注意的是由于</font> PWord<font face="宋體"
lang="ZH-CN">本身就是指針類型,指向一個(gè)字符串的地址,因而雖然</font>PWord<font
face="宋體" lang="ZH-CN">用于輸出,但在參數(shù)表中仍為傳值參數(shù),而不是傳址參數(shù)。另外調(diào)用函數(shù)</font>StrCopy<font
face="宋體" lang="ZH-CN">,要求</font>PWord<font face="宋體" lang="ZH-CN">在傳入前已分配內(nèi)存,否則會(huì)導(dǎo)致一個(gè)一般保護(hù)錯(cuò)。</font>try...finally<font
face="宋體" lang="ZH-CN">用于保護(hù)窗口所占用內(nèi)存資源在任何情況下都能正常釋放,讀者可參看第十二章。</p>
<p> 在口令設(shè)置窗口中,為了確保用戶記住了設(shè)置的口令,在用戶輸入并按回車鍵后,要求用戶再次輸入進(jìn)行確認(rèn)。只有用戶重新輸入的字符串與原設(shè)置口令相同,口令設(shè)置窗口才能正常關(guān)閉</font>
<font face="宋體" lang="ZH-CN">。否則將原設(shè)置口令清空,要求用戶再次輸入。以上功能的實(shí)現(xiàn)在編輯框的</font>OnKeyPress<font
face="宋體" lang="ZH-CN">事件處理過(guò)程中。 </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> 口令檢查窗口的實(shí)現(xiàn)相對(duì)簡(jiǎn)單,只定義了一個(gè)輸出函數(shù)</font>GetPassWord<font
face="宋體" lang="ZH-CN">,用于生成口令檢查窗口并返回口令檢查的結(jié)果。 </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">為輸入的參數(shù),不能為空,由調(diào)用以上函數(shù)的程序負(fù)責(zé)維護(hù)。</p>
<p> 窗口中用戶輸入口令時(shí)回顯在屏幕上的字符由編輯框的</font>PassWordChar<font
face="宋體" lang="ZH-CN">屬性確定。</p>
<p> 在</font>DLLs<font face="宋體" lang="ZH-CN">的工程文件中,把兩個(gè)輸出函數(shù)寫(xiě)到</font>exports<font
face="宋體" lang="ZH-CN">子句中。 </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">應(yīng)用程序調(diào)用重用窗體 </p>
<p> 在</font>Delphi<font face="宋體" lang="ZH-CN">應(yīng)用程序中調(diào)用重用窗體,首先必須包含</font>passform.dll<font
face="宋體" lang="ZH-CN">的兩個(gè)輸出函數(shù): </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>口令設(shè)置部分的實(shí)現(xiàn)代碼為: </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> 首先為口令字符串分配內(nèi)存。當(dāng)口令設(shè)置窗體按</font>Cancel<font
face="宋體" lang="ZH-CN">按鈕取消時(shí),顯示相應(yīng)的信息。</p>
<p> 口令檢查部分的實(shí)現(xiàn)代碼為: </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> 根據(jù)口令檢查的結(jié)果,在標(biāo)簽框中顯示相應(yīng)的信息。 </p>
</font><p>10.4.2.3 VB<font face="宋體" lang="ZH-CN">應(yīng)用程序調(diào)用重用窗體 </p>
<p> </font>VB<font face="宋體" lang="ZH-CN">是微軟公司極力推薦的一個(gè)可視化開(kāi)發(fā)工具。它雖然并不支持動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建,但可以調(diào)用標(biāo)準(zhǔn)的</font>Windows
API<font face="宋體" lang="ZH-CN">動(dòng)態(tài)鏈接庫(kù)和用其它語(yǔ)言編寫(xiě)的動(dòng)態(tài)鏈接庫(kù)。為了驗(yàn)證所生成</font>DLLs<font
face="宋體" lang="ZH-CN">的普適性,我們用</font>VB<font face="宋體"
lang="ZH-CN">開(kāi)發(fā)了一個(gè)簡(jiǎn)單的程序來(lái)調(diào)用</font>passform.dll<font face="宋體"
lang="ZH-CN">中儲(chǔ)存的窗體。</font></p>
<font face="宋體" lang="ZH-CN"><p>下面是</font>VB<font face="宋體" lang="ZH-CN">程序的完整代碼,和</font>Delphi<font
face="宋體" lang="ZH-CN">程序的對(duì)應(yīng)部分基本一致。 </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> 有關(guān)</font>VB<font face="宋體" lang="ZH-CN">編程的一些具體問(wèn)題,讀者可參看有關(guān)的</font>VB<font
face="宋體" lang="ZH-CN">參考書(shū)。 </p>
</font><p>10.4.3 <font face="宋體" lang="ZH-CN">小結(jié) </p>
<p> 本章我們討論的是動(dòng)態(tài)鏈接庫(kù)編程。許多可視化開(kāi)發(fā)工具(如</font>Visual
Basic<font face="宋體" lang="ZH-CN">)不支持</font> DLLs<font face="宋體"
lang="ZH-CN">的創(chuàng)建,而</font>Delphi<font face="宋體" lang="ZH-CN">在這里又有上乘的表現(xiàn)。特別是窗體重用機(jī)制是</font>Delphi<font
face="宋體" lang="ZH-CN">對(duì)</font>Windows<font face="宋體" lang="ZH-CN">下</font>DLLs<font
face="宋體" lang="ZH-CN">編程的一個(gè)重大改進(jìn)。在一般的</font>DLLs<font
face="宋體" lang="ZH-CN">編程中也體現(xiàn)了</font>Delphi<font face="宋體"
lang="ZH-CN">快捷、方便的特點(diǎn)。動(dòng)態(tài)鏈接庫(kù)是</font> Windows<font
face="宋體" lang="ZH-CN">下程序組織的一種重要方式,使用動(dòng)態(tài)鏈接庫(kù)可以極大地保護(hù)用戶在不同開(kāi)發(fā)工具、不同時(shí)期所做的工作。利用動(dòng)態(tài)鏈接庫(kù),用戶可以逐步去構(gòu)筑自己的程序模塊庫(kù),為今后的工作積累素材。</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%" background="bg.gif"><strong><A HREF="026.htm" ><FONT style="FONT-SIZE: 9pt">后一頁(yè)</font></A><BR>
<A HREF="024.htm" ><FONT style="FONT-SIZE: 9pt">前一頁(yè)</font></A><BR>
<A HREF="index.html" ><FONT style="FONT-SIZE: 9pt">回目錄</font></A><BR>
<A HREF="../../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首頁(yè)</font></A><BR>
</strong>
</TD>
</TR>
</table>
</BODY></HTML>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -