パスワード保護された Paradox テーブルと dBASE テーブルの操作
メモ: ボーランド データベース エンジン(BDE)の使用は推奨されません。今後 BDE は機能拡張されません。たとえば、BDE では Unicode がサポートされていません。BDE を使用して新たに開発しないことをお勧めします。既存のデータベース アプリケーションを BDE から dbExpress に移行することを検討してください。
セッションコンポーネントには、パスワード保護された Paradox テーブルと dBASE テーブルのパスワードを持たせることができます。セッションにパスワードを追加すると、パスワードで保護されたテーブルをアプリケーションで開くことができます。追加したパスワードをセッションから削除すると、再びそのパスワードを追加するまでは、パスワードを使用しているテーブルをアプリケーションで開くことはできません。
目次
AddPassword メソッドを使用する
AddPassword メソッドは、アクセスにパスワードが必要な暗号化された Paradox テーブルや dBASE テーブルを開く前にアプリケーションがセッションにパスワードを提供できます。パスワードをセッションに追加していない場合は、パスワード保護されたテーブルをアプリケーションが開こうとしたときに、ユーザーに対してパスワード入力を求めるダイアログボックスが表示されます。
AddPassword は、パラメータとしてパスワードの文字列をとります。AddPassword は必要なだけ何回でも呼び出し、パスワードを(一度に 1 つずつ)追加していくことによって、別々のパスワードで保護された複数のテーブルにアクセスできます。
var Passwrd: String; begin Passwrd := InputBox('Enter password', 'Password:', ); Session.AddPassword(Passwrd); try Table1.Open; except ShowMessage('Could not open table!'); Application.Terminate; end; end;
AnsiString PassWrd; PassWrd = InputBox("Enter password", "Password:", ""); Session->AddPassword(PassWrd); try { Table1->Open(); } catch(...) { ShowMessage("Could not open table!"); Application->Terminate(); }
メモ: 上記の InputBox 関数の使用は、デモンストレーションだけを目的としています。実際のアプリケーションでは、PasswordDialog 関数やカスタムフォームなど、入力と同時にパスワードを隠すパスワード入力機能を使用します。
PasswordDialog 関数ダイアログの Add ボタンには、AddPassword メソッドと同じ効果があります。
if PasswordDialog(Session) then Table1.Open else ShowMessage('No password given, could not open table!'); end;
if (PasswordDlg(Session)) Table1->Open(); else ShowMessage("No password given, could not open table!");
RemovePassword および RemoveAllPasswords メソッドを使用する
RemovePassword はメモリから以前に追加されたパスワードを削除します。RemovePassword は、パラメータとして削除するパスワードの文字列をとります。
Session.RemovePassword('secret');
Session->RemovePassword("secret");
RemoveAllPasswords はメモリから以前に追加されたすべてのパスワードを削除します。
Session.RemoveAllPasswords;
Session->RemoveAllPasswords();
GetPassword メソッドと OnPassword イベントを使用する
OnPassword イベントを利用すると、Paradox テーブルと dBASE テーブルのパスワードが要求されたときに、そのパスワードをアプリケーションからどのように提示するかを制御できます。デフォルトのパスワード処理動作をオーバーライドしたい場合は、OnPassword イベントのハンドラを作成します。このハンドラを作成しなければ、パスワード入力用のデフォルトのダイアログが表示されるだけで、特別な動作は行われません。テーブルを開く試みが成功するか、または例外が生成されるだけです。
OnPassword イベントのハンドラを作成する場合は、そのイベントハンドラで次の 2 つのことを行ってください。1 つは AddPassword メソッドを呼び出すこと、もう 1 つは、イベントハンドラの Continue
パラメータを True に設定することです。AddPassword メソッドは、テーブルのパスワードとして使用する文字列をセッションに渡します。Continue
パラメータは、テーブルを開く試みで、これ以上パスワード要求する必要がないことを Delphi に伝えます。Continue
のデフォルト値は False なので、明示的に True に設定する必要があります。イベントハンドラが実行を完了した後に Continue
が False である場合、OnPassword イベントが再び発生します。AddPassword を使って有効なパスワードを渡しておいた場合も同様です。イベントハンドラが実行を完了した後に Continue
が True でも、AddPassword を使って渡した文字列が無効なパスワードであれば、テーブルを開く試みは失敗し、例外が生成されます。
OnPassword イベントは、次の 2 つの状況で発生します。1 つは、有効なパスワードがセッションに渡されていない状態で、パスワード保護されたテーブル(dBASE または Paradox)を開こうとしたときに発生します。(対象テーブルの有効なパスワードが設定してあれば、OnPassword イベントは発生しません)。
もう 1 つは、GetPassword メソッドの呼び出しがあったときです。GetPassword は、セッションに OnPassword イベントハンドラが設定されている場合は OnPassword イベントを生成し、設定されていない場合はデフォルトのパスワードダイアログを表示します。このメソッドの戻り値は、OnPassword イベントハンドラまたはデフォルトのダイアログでパスワードがセッションに追加された場合は True、追加されなかった場合は False になります。
次の例では、Password メソッドがデフォルトセッションの OnPassword イベントハンドラに指定されます。この処理は、グローバルな Session オブジェクトの OnPassword プロパティに Password メソッドを代入することによって行われます。
procedure TForm1.FormCreate(Sender: TObject); begin Session.OnPassword := Password; end;
void __fastcall TForm1::FormCreate(TObject *Sender) { Session->OnPassword = Password; }
Password メソッドでは、InputBox 関数を使ってユーザーにパスワードを要求します。ダイアログに入力されたパスワードは、プログラム上で AddPassword メソッドを使ってセッションに渡します。
procedure TForm1.Password(Sender: TObject; var Continue: Boolean); var Passwrd: String; begin Passwrd := InputBox('Enter password', 'Password:', ); Continue := (Passwrd > ); Session.AddPassword(Passwrd); end;
void __fastcall TForm1::Password(TObject *Sender, bool &Continue) { AnsiString PassWrd = InputBox("Enter password", "Password:", ""); Session->AddPassword(PassWrd); Continue = (PassWrd > ""); }
下に示すように、パスワード保護されたテーブルを開こうとすると、OnPassword イベントが発生します(よってイベントハンドラの Password が実行される)。OnPassword イベント用のハンドラでユーザーがパスワードの入力を求められたとしても、無効なパスワードを指定するなどの不都合が発生すると、テーブルを開けないことがあります。
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 + 'Terminating application...'); Application.Terminate; { アプリケーションの終了 } end; end; end;
void __fastcall TForm1::OpenTableBtnClick(TObject *Sender) { try { // この行によって OnPassword イベントが発生する Table1->Open(); } // テーブルを開けない場合は、例外 catch(...) { ShowMessage("Could not open table!"); Application->Terminate(); } }