パスワード保護された Paradox テーブルと dBASE テーブルの操作

提供: RAD Studio
移動先: 案内検索

データベース セッションの管理:インデックス への移動

メモ: ボーランド データベース エンジン(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 に設定する必要があります。イベントハンドラが実行を完了した後に ContinueFalse である場合、OnPassword イベントが再び発生します。AddPassword を使って有効なパスワードを渡しておいた場合も同様です。イベントハンドラが実行を完了した後に ContinueTrue でも、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();
  }
}

関連項目