口令成功設(shè)置,把PassWord的值拷貝給PWord輸出,并返回True。應(yīng)該注意的是由于 PWord本身就是指針類(lèi)型,指向一個(gè)字符串的地址,因而雖然PWord用于輸出,但在參數(shù)表中仍為傳值參數(shù),而不是傳址參數(shù)。另外調(diào)用函數(shù)StrCopy,要求PWord在傳入前已分配內(nèi)存,否則會(huì)導(dǎo)致一個(gè)一般保護(hù)錯(cuò)。try...finally用于保護(hù)窗口所占用內(nèi)存資源在任何情況下都能正常釋放,讀者可參看第十二章。
在口令設(shè)置窗口中,為了確保用戶記住了設(shè)置的口令,在用戶輸入并按回車(chē)鍵后,要求用戶再次輸入進(jìn)行確認(rèn)。只有用戶重新輸入的字符串與原設(shè)置口令相同,口令設(shè)置窗口才能正常關(guān)閉 。否則將原設(shè)置口令清空,要求用戶再次輸入。以上功能的實(shí)現(xiàn)在編輯框的OnKeyPress事件處理過(guò)程中。
procedure TSetPassWordForm.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Edit1.text = '' then Exit;
if Key = #13 then
begin
if Verified then
if StrPas(PassWord) = Edit1.text then
begin
OKBtn.Enabled := True;
Edit1.Enabled := False;
OKBtn.SetFocus;
end
else
begin
Verified := False;
MessageDlg('PassWord is InValid.',mtWarning,[mbOK],0);
Edit1.text := '';
PassWord := '';
Label1.Caption := 'Please Input PassWord:';
end
else
begin
Verified := True;
StrPCopy(PassWord,Edit1.text);
Edit1.text := '';
Label1.caption := 'Please Verify PassWord:';
end;
Key := #0;
end;
end;
口令檢查窗口的實(shí)現(xiàn)相對(duì)簡(jiǎn)單,只定義了一個(gè)輸出函數(shù)GetPassWord,用于生成口令檢查窗口并返回口令檢查的結(jié)果。
function GetPassword(Password: PChar): Boolean;
var
GetPasswordForm: TGetPasswordForm;
begin
Result := False;
GetPasswordForm := TGetPasswordForm.Create(Application);
try
with GetPasswordForm do
if ShowModal = mrOK then
if UpperCase(Edit1.Text) <> StrPas(StrUpper(Password)) then
MessageDlg('Invalid Password', mtWarning, [mbOK], 0)
else
Result := True;
finally
PasswordForm.Free;
end;
end;
PassWord為輸入的參數(shù),不能為空,由調(diào)用以上函數(shù)的程序負(fù)責(zé)維護(hù)。
窗口中用戶輸入口令時(shí)回顯在屏幕上的字符由編輯框的PassWordChar屬性確定。
在DLLs的工程文件中,把兩個(gè)輸出函數(shù)寫(xiě)到exports子句中。
library PassForm;
uses
GetPass in 'GETPASS.PAS' {PasswordForm},
Setpass in 'SETPASS.PAS' {SetPassWordForm};
exports
GetPassword,SetPassWord;
begin
end.
10.4.2.2 Delphi應(yīng)用程序調(diào)用重用窗體
在Delphi應(yīng)用程序中調(diào)用重用窗體,首先必須包含passform.dll的兩個(gè)輸出函數(shù):
function GetPassword(Password: PChar): Boolean;
far; external 'c:\dlls\PassForm';
function SetPassword(PassWord: PChar): Boolean;
far; external 'c:\dlls\PassForm';
這位于程序單元的implementation部分。
口令設(shè)置部分的實(shí)現(xiàn)代碼為:
procedure TForm1.SetButtonClick(Sender: TObject);
begin
PassWord := StrAlloc(40);
if SetPassWord(PassWord) = False then
MessageDlg('PassWord is not set',mtInformation,[mbOK],0);
end;
首先為口令字符串分配內(nèi)存。當(dāng)口令設(shè)置窗體按Cancel按鈕取消時(shí),顯示相應(yīng)的信息。
口令檢查部分的實(shí)現(xiàn)代碼為:
procedure TForm1.TestButtonClick(Sender: TObject);
begin
if PassWord = nil then
begin
MessageDlg('Set password first', mtInformation, [mbOK], 0);
SetButton.SetFocus;
Exit;
end;
if GetPassword(PassWord) then
Label1.Caption := 'You are Wellcome !'
else
Label1.Caption := 'Sorry,You are InValid User.';
end;
根據(jù)口令檢查的結(jié)果,在標(biāo)簽框中顯示相應(yīng)的信息。
10.4.2.3 VB應(yīng)用程序調(diào)用重用窗體
VB是微軟公司極力推薦的一個(gè)可視化開(kāi)發(fā)工具。它雖然并不支持動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建,但可以調(diào)用標(biāo)準(zhǔn)的Windows API動(dòng)態(tài)鏈接庫(kù)和用其它語(yǔ)言編寫(xiě)的動(dòng)態(tài)鏈接庫(kù)。為了驗(yàn)證所生成DLLs的普適性,我們用VB開(kāi)發(fā)了一個(gè)簡(jiǎn)單的程序來(lái)調(diào)用passform.dll中儲(chǔ)存的窗體。
下面是VB程序的完整代碼,和Delphi程序的對(duì)應(yīng)部分基本一致。
Option Explicit
Declare Function GetPassWord Lib "c:\dlls\passform.dll" (ByVal PassWord As String) As Integer
Declare Function SetPassWord Lib "c:\dlls\passform.dll" (ByVal PassWord As String) As Integer
Dim PassWord As String * 40
Sub Check_Click ()
If PassWord = "" Then
MsgBox ("Enter sample password first")
SetPass.SetFocus
Else
If GetPassWord(PassWord) Then
StatusLbl.Caption = "You are Welcome!"
Else
StatusLbl.Caption = "Sorry,You are Invalid User."
End If
End If
End Sub
Sub SetPass_Click ()
If SetPassWord(PassWord) = 0 Then
MsgBox ("PassWord is not Set.")
End If
End Sub
有關(guān)VB編程的一些具體問(wèn)題,讀者可參看有關(guān)的VB參考書(shū)。
10.4.3 小結(jié)
本章我們討論的是動(dòng)態(tài)鏈接庫(kù)編程。許多可視化開(kāi)發(fā)工具(如Visual Basic)不支持 DLLs的創(chuàng)建,而Delphi在這里又有上乘的表現(xiàn)。特別是窗體重用機(jī)制是Delphi對(duì)Windows下DLLs編程的一個(gè)重大改進(jìn)。在一般的DLLs編程中也體現(xiàn)了Delphi快捷、方便的特點(diǎn)。動(dòng)態(tài)鏈接庫(kù)是 Windows下程序組織的一種重要方式,使用動(dòng)態(tài)鏈接庫(kù)可以極大地保護(hù)用戶在不同開(kāi)發(fā)工具、不同時(shí)期所做的工作。利用動(dòng)態(tài)鏈接庫(kù),用戶可以逐步去構(gòu)筑自己的程序模塊庫(kù),為今后的工作積累素材。
相關(guān)推薦:2010年9月計(jì)算機(jī)等級(jí)考試試題及答案解析專(zhuān)題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |