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

📄 lc_bcb_105.html

📁 C++Builder教学大全
💻 HTML
📖 第 1 页 / 共 3 页
字号:
  6.在其它应用程序中调用重用窗体。 

  重用窗体的调用同一般DLLs函数或过程的调用完全一致,不再赘述。读者可参看下面的例子。 

 

4.2 窗体重用实例 

 

  下面我们通过一个具体的实例来说明窗体重用的设计过程。我们在一个名为passform.dll 的文件中储存了一个口令设置窗口和一个口令检查窗口。而后在一个Delphi 编写的程序和一个VB编写的程序中进行调用。事实证明这种方法是完全可行的。 

         

4.2.1  窗体重用DLLs的设计 

 

  窗体重用DLLs的设计依照(10.4.1)中介绍的步骤进行。DLLs中的两个窗体 SetPassWordForm和GetPassWordForm分别用于设置和检查口令。它们的设计界面如图所示。 

 

                 

                        图3  口令设置窗口SetPassWordForm设计界面 

 

                   

                        图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. 

 

 

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部分。 

  而后在过程中调用相应函数实现口令的设置和检查。程序运行后的界面如图。 

         

          

 

                        图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; 

 

  根据口令检查的结果,在标签框中显示相应的信息。 

 

4.2.3 VB应用程序调用重用窗体 

 

  VB是微软公司极力推荐的一个可视化开发工具。它虽然并不支持动态链接库的创建,但可以调用标准的Windows API动态链接库和用其它语言编写的动态链接库。为了验证所生成DLLs的普适性,我们用VB开发了一个简单的程序来调用passform.dll中储存的窗体。 

  VB程序的运行界面如图,和(10.5)的Delphi程序基本一致。 

 

                 

 

                        图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参考书。 

  

4.3 小结 

 

  本章我们讨论的是动态链接库编程。许多可视化开发工具(如Visual Basic)不支持 DLLs的创建,而Delphi在这里又有上乘的表现。特别是窗体重用机制是Delphi对Windows下DLLs编程的一个重大改进。在一般的DLLs编程中也体现了Delphi快捷、方便的特点。动态链接库是  

Windows下程序组织的一种重要方式,使用动态链接库可以极大地保护用户在不同开发工具、不同时期所做的工作。利用动态链接库,用户可以逐步去构筑自己的程序模块库,为今后的工作积累素材。 

                                   



           



</pre>

</table>

</center>



</body>



</html>

⌨️ 快捷键说明

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