⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lc_bcb_105.txt

📁 c++ builder 的一些txt文档
💻 TXT
📖 第 1 页 / 共 3 页
字号:
 
10.4.2 窗体重用实例 
 
  下面我们通过一个具体的实例来说明窗体重用的设计过程。我们在一个名为passform.dll 的文件中储存了一个口令设置窗口和一个口令检查窗口。而后在一个Delphi 编写的程序和一个VB编写的程序中进行调用。事实证明这种方法是完全可行的。 
         
10.4.2.1  窗体重用DLLs的设计 
 
  窗体重用DLLs的设计依照(10.4.1)中介绍的步骤进行。DLLs中的两个窗体 SetPassWordForm和GetPassWordForm分别用于设置和检查口令。它们的设计界面如图所示。 
 
                 
                        图10.3  口令设置窗口SetPassWordForm设计界面 
 
                   
                        图10.4  口令检查窗口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:'; 
              end 
              else 
              begin 
                Verified := True; 
                StrPCopy(PassWord,Edit1.text); 
                Edit1.text := ''; 
                Label1.caption := 'Please Verify PassWord:'; 
              end; 
            Key := #0; 
          end; 
        end; 
 
  口令检查窗口的实现相对简单,只定义了一个输出函数GetPassWord,用于生成口令检查窗口并返回口令检查的结果。 
 
        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为输入的参数,不能为空,由调用以上函数的程序负责维护。 
  窗口中用户输入口令时回显在屏幕上的字符由编辑框的PassWordChar属性确定。 
  在DLLs的工程文件中,把两个输出函数写到exports子句中。 
 
        library PassForm; 
 
        uses 
        GetPass in 'GETPASS.PAS' {PasswordForm}, 
        Setpass in 'SETPASS.PAS' {SetPassWordForm}; 
 
        exports 
        GetPassword,SetPassWord; 
 
        begin 
        end. 
 
 
10.4.2.2        Delphi应用程序调用重用窗体 
 
  在Delphi应用程序中调用重用窗体,首先必须包含passform.dll的两个输出函数: 
 
        function GetPassword(Password: PChar): Boolean; 
                far; external 'c:\dlls\PassForm'; 
        function SetPassword(PassWord: PChar): Boolean; 
                far; external 'c:\dlls\PassForm'; 
 
  这位于程序单元的implementation部分。 
  而后在过程中调用相应函数实现口令的设置和检查。程序运行后的界面如图。 
         
          
 
                        图10.5  Delphi应用程序调用重用窗体运行界面 
 
  口令设置部分的实现代码为: 
 
        procedure TForm1.SetButtonClick(Sender: TObject); 
        begin 
          PassWord := StrAlloc(40); 
          if SetPassWord(PassWord) = False then 
         MessageDlg('PassWord is not set',mtInformation,[mbOK],0);    
        end; 
 
  首先为口令字符串分配内存。当口令设置窗体按Cancel按钮取消时,显示相应的信息。 
  口令检查部分的实现代码为: 
 
        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; 
 
  根据口令检查的结果,在标签框中显示相应的信息。 
 
10.4.2.3 VB应用程序调用重用窗体 
 
  VB是微软公司极力推荐的一个可视化开发工具。它虽然并不支持动态链接库的创建,但可以调用标准的Windows API动态链接库和用其它语言编写的动态链接库。为了验证所生成DLLs的普适性,我们用VB开发了一个简单的程序来调用passform.dll中储存的窗体。 
  VB程序的运行界面如图,和(10.5)的Delphi程序基本一致。 
 
                 
 
                        图10.6  VB应用程序调用重用窗体运行界面 
 
  下面是VB程序的完整代码,和Delphi程序的对应部分基本一致。 
 
        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 
 
  有关VB编程的一些具体问题,读者可参看有关的VB参考书。 
  
10.4.3 小结 
 
  本章我们讨论的是动态链接库编程。许多可视化开发工具(如Visual Basic)不支持 DLLs的创建,而Delphi在这里又有上乘的表现。特别是窗体重用机制是Delphi对Windows下DLLs编程的一个重大改进。在一般的DLLs编程中也体现了Delphi快捷、方便的特点。动态链接库是  
Windows下程序组织的一种重要方式,使用动态链接库可以极大地保护用户在不同开发工具、不同时期所做的工作。利用动态链接库,用户可以逐步去构筑自己的程序模块库,为今后的工作积累素材。 
  
                                         [上一篇] [下一篇]
           [本讨论区] [返回首页] [分类讨论区] [全部讨论区]   讨论区
--
※ 来源:.西北网络中心兵马俑 BBS 站 bbs.xanet.edu.cn.[FROM: 202.117.1.151]
 
  返回首页
  分类讨论区
  全部讨论区

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -