etPassWordForm和GetPassWordForm分别用于设置和检查口令。
窗体类TSetPassWordForm定义了两个数据成员Verified和PassWord,用于记录口令确认状态和设置的口令。TSetPassWordForm的定义如下:
type TSetPassWordForm = class(TForm) Label1: TLabel; Edit1: TEdit; OKBtn: TBitBtn; CancelBtn: TBitBtn; procedure FormCreate(Sender: TObject); procedure Edit1KeyPress(Sender: TObject; var Key: Char); private { Private declarations } Verified: Boolean; public { Public declarations } PassWord: PChar; end;
窗口生成时,对数据成员和部件状态进行初始化:
procedure TSetPassWordForm.FormCreate(Sender: TObject); begin Verified := False; PassWord := StrAlloc(40); OKBtn.Enabled := False; Label1.Caption := ''Please Input PassWord:''; end;
按钮OKBtn在程序启动时Enabled属性设置为False,直到口令被正确设置后Enabled属性才恢复为True。这样就保证了只有口令被正确设置后,口令设置窗口才能正常关闭。否则只能按Cancel按钮取消。
在口令设置代码单元中定义了一个输出函数SetPassWord,用于生成口令设置窗口并返回设置的口令:
function SetPassWord(PWord: PChar): Boolean; var SetPassWordForm: TSetPassWordForm; begin Result := False; SetPassWordForm := TSetPassWordForm.Create(Application); try with SetPasswordForm do if ShowModal = mrOK then begin StrCopy(PWord,StrUpper(Password)); Result := True; end; finally SetPasswordForm.Free; end; end;
口令成功设置,把PassWord的值拷贝给PWord输出,并返回True。应该注意的是由于
PWord本身就是指针类型,指向一个字符串的地址,因而虽然PWord用于输出,但在参数表中仍为传值参数,而不是传址参数。另外调用函数StrCopy,要求PWord在传入前已分配内存,否则会导致一个一般保护错。try...finally用于保护窗口所占用内存资源在任何情况下都能正常释放,读者可参看第十二章。
在口令设置窗口中,为了确保用户记住了设置的口令,在用户输入并按回车键后,要求用户再次输入进行确认。只有用户重新输入的字符串与原设置口令相同,口令设置窗口才能正常关闭。否则将原设置口令清空,要求用户再次输入。以上功能的实现在编辑框的OnKeyPress事件处理过程中。
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:'';
|