ble1.Open Except ShowMessage(''''Could not open table!''''); Application.Terminate; End; End; 上面这个例子中调用InputBox函数让用户输入口令,也可以调用PasswordDialog函数,或者用TEdit构件做一个编辑框,把PasswordChar属性设为星号。 如果用PasswordDialog函数的话,需要传递BDE会话期对象作为参数,程序示例如下: Procedure TForm1.Button1Click(Sender: TObject); Begin If PasswordDialog(Session) then Table1.Open Else ShowMessage(''''No password given, could not open table!''''); End; 上述程序将打开一个“Enter password”对话框,如图4.1所示。 图4.1 输入口令 对话框上的“Add”按钮相当于调用AddPassword函数,“Remove”按钮相当于调用RemovePassword函数,“Remove All”按钮相当于RemoveAllPasswords函数。 注意:要在程序中调用PasswordDialog函数,必须引用DBPWDlg单元。 如果您没有调用AddPassword或PasswordDialog函数来提供口令,当访问有口令保护的Paradox表和dBase表时,就会自动弹出如图4.1所示的对话框,让用户输入口令。 4.6.2 RemovePassword和RemoveAllPasswords TSession的RemovePassword用于删除一个先前用AddPassword输入的口令。RemovePassword只需要传递一个参数,即要删除的口令。程序示例如下: Session.RemovePassword(''''1234''''); TSession的RemoveAllPasswords函数用于删除先前所有输入的口令,程序示例如下: Session.RemoveAllPasswords; 4.6.3 OnPassword和GetPassword 当程序试图打开一个受口令保护的Paradox表时将触发该事件,应当在处理这个事件的句柄中调用AddPassWord函数输入一个口令,然后把Continue参数设为True。 调用GetPassword函数也会触发OnPassword事件。下面这个例子动态地把一个方法作为处理OnPassword事件的句柄: Procedure TForm1. FormCreate(Sender: TObject); Begin Session.OnPassword := Password; End; Password又调用InputBox函数打开一个输入框让用户输入口令,如果用户输入了口令的话,就把Continue参数设为True。 Procedure TForm1.Password(Sender: TObject; var Continue: Boolean); var Passwrd: String; Begin Passwrd := InputBox(''''Enter password'''', ''''Password:'''', ''''''''); Continue := (Passwrd > ''''''''); Session.AddPassword(Passwrd); End; 如果用户输入的口令是错误的,则仍然不能打开Paradox表,因此,凡是要打开一个Paradox表的代码必须能处理异常。 Procedure TForm1.OpenTableBtnClick(Sender: TObject); const CRLF = #13 + #10; Begin Try Table1.Open; {将触发OnPassword事件} Except On E:Exception Do Begin ShowMessage(''''Error!''''+CRLF+E.Message+CRLF); Application.Terminate; End; End; End; 4.7 管理多个BDE会话期对象 如果要创建一个多线程的数据库应用程序,就需要用多个TSession构件,而且必须在设计期显式地加到窗体或数据模块上,还要保证它们的SessionName属性是相异的。 Delphi 4用TSessionList来管理和操纵一个应用程序中所有的BDE会话期对象,并且已自动声明了TSessionList的对象示例Sessions。 如果要动态地创建一个新的BDE会话期对象,这就要用到TSessionList的OpenSession函数。这个函数只需要传递一个参数,即要创建的BDE会话期的名称。程序示例如下: Sessions.OpenSession(''''RunTimeSession'''' + IntToStr(Sessions.Count + 1)); 上述代码能保证BDE会话期的名称不会与已有的BDE会话期重复。 TSessionList定义了一些属性和方法用来操纵BDE会话期对象,这里简单介绍一下: .Count 返回BDE会话期对象的个数,包括活动的和非活动的; .FindSession 查找一个指定的BDE会话期对象,如果没有找到,就返回NIL; .GetSessionNames 返回所有BDE会话期对象的SessionName属性组成的列表; .List 通过这个属性可以按名称访问一个BDE会话期对象; .OpenSession 动态地创建一个BDE会话期对象; .Sessions 通过这个属性可以按序号访问一个BDE会话期对象。 在多线程的数据库应用程序中,在打开一个数据库之前,首先要检查这个数据库是否已经被其他线程打开。怎么检查呢?用TSessionList的Count属性和Sessions属性遍历所有的BDE会话期对象,逐个检查每个BDE会话期对象的Databases属性中是否包含要打开的数据库,如果有的话,说明这个数据库已经被某个线程打开,也就是说,不能再在这个BDE会话期内打开数据库,您得换下一个再进行检查。 如果所有的BDE会话期对象都在使用这个数据库,就必须创建一个新的BDE会话期对象,然后再打开数据库。
上一页 [1] [2] |