Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2007年10月31日] [更新 2016年05月02日] Delphi サンプルプログラム集
568_ADO による Paradox データベース接続
動作確認等 Windows 7 U64(SP2) + Delphi XE Pro
568_ADO_Paradox.zip [3,965 KB]  2016年05月02日版 (EXE 同梱)







ADO による Paradox データベース接続


Windows のデータアクセスの ADO (Micrsoft ActiveX Data Object) というものがあります.
Delphi には,これを利用するためのコンポーネント類が ADODB.pas に用意されています.

本サンプルプログラム集には,この ADODB 関係のコンポーネントを使用して,JET データベースエンジンまたは Paradox データベースを扱う例があります.ADO で接続する方法は,システムに BDE がインストールされていない環境でも Paradox のデータを扱うことができます.

ADO による接続では,接続文字列という文字列でデータベース関係の情報を設定します.この中にプロバイダの指定があります.一連のサンプルでは,このプロバイダに Microsoft.Jet.OLEDB.4.0 を使用しています.


[備考]
Paradox も BDEも,Borland 社でのサポートが 1997年10月21日で終了しています.



図1
Microsoft.Jet.OLEDB.4.0 で接続可能なデータベース関係
  • 32 ビットアプリ用はレジストリの以下の場所にある
  • 64 ビット版 Windows の 場合
    [HKEY_LOCAL_MACHINE] [SOFTWARE] [Wow6432Node] [Microsoft]
  • 32 ビット版Windows の場合
    [HKEY_LOCAL_MACHINE] [SOFTWARE] [Microsoft]

  • 64 ビット版 Windows の 32 ビット用レジストリエディタは,
    C:\Windows\SysWOW64\Regedit
    で起動できる.ここにも同じ内容がある

  • ISAM Formats が [Extended Properties] に指定可能な値

以下は,サンプルプログラム集の ADO 関係の記事へのリンクです.





01_「照合順序が正しくありません」の回避



Paradox データベースを扱うサンプルプログラムでは,下図のように,
     「照合順序が正しくありません」
というエラーダイアログが現れることがあります.このエラーは,実行環境の PC の以下のレジストリの値を修正することで回避することができます.ただし,レジストリへの書き込みは,Vista 以降では管理者権限で実行する必要があります.
サンプルは,このレジストリの値の読出しと,設定のためのコードです.


図2
レジストリの値が正しくない場合

  • 図3
  • レジストリの CollatingSequence の値を Japanese にする
  • ADO で Paradox に接続するには,Mspbde40.dll を使用する


レジストリの操作は,管理者権限が必要です,そこで,このプロジェクトでは,起動時に管理者として実行できるように,アプリケーションマニフェストを組み込んでいます.
添付の EXE を起動すると,以下の確認画面が現れます.




図4
ユーザアカウント制御


もし,管理者権限で実行しないと,レジストリの操作に失敗します.失敗した場合は,次のようなダイアログを表示するようにしています.


図5
レジストリ操作の失敗


設計時画面と,実行して,レジストリの値を取得した結果例です.


図6
設計時画面
図7
レジストリの値をチェックしたところ
  • 結果は Ascii なので ADO 関係の Paradox のサンプルが正常動作しない場合がある

リスト1
レジストリの CollatingSequence 値をチェックまはた変更するサンプルコード
unit CheckRegistryUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    btnCheckReg: TButton;
    Panel1: TPanel;
    btnWriteRegJPN: TButton;
    btnWriteRegASCII: TButton;
    procedure btnCheckRegClick(Sender: TObject);
    procedure btnWriteRegJPNClick(Sender: TObject);
    procedure btnWriteRegASCIIClick(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses Registry;

{$R *.dfm}

//=============================================================================
//  JETエンジンのParadoxの設定値を調べる
//  設定内容の確認だけ
//
//  Vista以降のOSでは管理者権限で実行しないと「そのような設定項目は...」となる
//
//  64bit版のWindowsの,32bit用アプリのAppKeyの値は以下となっているがWindowsが
//  自動でリダイレクトする
//  Software\Wow6432Node\Microsoft\Jet\4.0\Engines\Paradox'
//=============================================================================
procedure TForm1.btnCheckRegClick(Sender: TObject);
var
  Reg     : TRegistry;
  AppKey  : String;
  AppItem : String;
begin
  Panel1.Caption := '';

  //Registryオブジェクトを作成
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    AppKey      := 'Software\Microsoft\Jet\4.0\Engines\Paradox';
    AppItem     := 'CollatingSequence';
    if Reg.OpenKey(AppKey, False) then begin
      try
        //CollatingSequenceの設定を文字列として取得
        Panel1.Caption := Reg.ReadString(AppItem);
        Reg.CloseKey;
      except
        MessageDlg('設定項目の取得に失敗しました.', mtInformation, [mbOK], 0);
      end;
    end else begin
      MessageDlg('そのような設定項目はありません.', mtInformation, [mbOK], 0);
    end;
  finally
    //TRegistryオブジェクトを解放
    FreeAndNil(Reg);
  end;
end;
//=============================================================================
//  JETエンジンのParadoxの設定値に'Japanese'を書込む
//=============================================================================
procedure TForm1.btnWriteRegJPNClick(Sender: TObject);
var
  Reg     : TRegistry;
  AppKey  : String;
  AppItem : String;
begin
  Panel1.Caption := '';

  //Registryオブジェクトを作成
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    AppKey      := 'Software\Microsoft\Jet\4.0\Engines\Paradox';
    AppItem     := 'CollatingSequence';
    if Reg.OpenKey(AppKey,False) then begin
      try
        //CollatingSequenceの設定を文字列として書込み取得
        Reg.WriteString(AppItem, 'Japanese');
        Panel1.Caption := Reg.ReadString(AppItem);
      except
        MessageDlg('値の書込みに失敗しました.', mtInformation, [mbOK], 0);
      end;
    end;
  finally
    //TRegistryオブジェクトを解放
    FreeAndNil(Reg);
  end;
end;

//=============================================================================
//  JETエンジンのParadoxの設定値に'Ascii'を書込む
//=============================================================================
procedure TForm1.btnWriteRegASCIIClick(Sender: TObject);
var
  Reg     : TRegistry;
  AppKey  : String;
  AppItem : String;
begin
  Panel1.Caption := '';

  //Registryオブジェクトを作成
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    AppKey      := 'Software\Microsoft\Jet\4.0\Engines\Paradox';
    AppItem     := 'CollatingSequence';
    if Reg.OpenKey(AppKey,False) then begin
      try
        //CollatingSequenceの設定を文字列として書込み取得
        Reg.WriteString(AppItem, 'Ascii');
        Panel1.Caption := Reg.ReadString(AppItem);
      except
        MessageDlg('値の書込みに失敗しました.', mtInformation, [mbOK], 0);
      end;
    end;
  finally
    //TRegistryオブジェクトを解放
    FreeAndNil(Reg);
  end;
end;

end.




02_外部データベース ドライバ (11265) で予期しないエラーが発生


BDE がインストールされている環境で,Paradox のデータを扱うサンプルを実行した時に,


外部データベース ドライバ (11265) で予期しないエラーが発生しました。.

というエラーが発生した場合,以下の BDEAdmmin.exe の記事を参考にして,Paradox の NET DIR の設定を確認してみてください.



図8
外部データベースドライバの予期しないエラー




03_BDE がインストールされていない環境での動作


BDE がインストールされていない環境では,接続文字列が確定した後で,次のコードを追加すれば動作することを,Windows XP を新規インストールした直後の状態で確認しました.
このコードは当初,Windows Vista と Windows 7 での動作のために追加したものですが,BDE がインストールされていない環境でも必要なようです.

このコードを追加しても,Windows Vista 以降の 32 ビットの Windows では,管理者権限で実行しないと例外が発生して動作しないことがあるようです.例外の内容,例外発生時のメッセージ,原因については不明です.



リスト2
BDE がインストールされていない環境では以下のコードが必要な場合がある
  ADOConnection1.Connected   := True;
  ADOQuery1.ConnectionString := ADOConnection1.ConnectionString;




04_Paradox データベースに接続 ( TADOTable )


上で述べたレジストリが正しく設定されていれば,BDEを使用しなくても Paradox データベースに ADO 関係のコンポーネントを使用して接続できるようになります.TDBGrid で表示し,データの編集なども可能です.データを編集して更新する際に,データの構造によっては,
  • 更新可能なクエリであることが必要です
  • クエリが複雑すぎます
のエラーが発生することがあります.その場合には,Priamry Key (一次キー) を作成するとか,取得する項目数を少なくしたクエリを実行することで対応します.
ただし,「更新可能なクエリであることが必要です」のエラーは,この後の TQuery を使用する方法では,これ以外の原因でも発生します.

以下は TADOTable コンポーネントだけを使用して Paradox データベースに接続します.


図9
設計時画面
図10
実行画面
  • 添付の Paradox データベースの表
  • [番号] をキー項目にしてある

リスト3
Paradox データベースに TADOTable で接続
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    DBGrid1: TDBGrid;
    ADOTable1: TADOTable;
    DataSource1: TDataSource;
    Button1: TButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  フォームを閉じる時はClose
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ADOTable1.Close;
end;

//=============================================================================
//  指定のParadoxデータベースの表をDBGridに表示
//  TADOTableだけを使用した例
//
//  オブジェクト・インスペクタで以下を設定
//  DataSource1.DataSet := ADOTable1;
//  DBGrid1.DataSource  := DataSource1;
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  StrProvider  : String;
  StrDBFile    : String;
  StrExtended  : String;
begin
  ADOTable1.Close;

  //プロバイダ
  StrProvider := 'Provider=Microsoft.Jet.OLEDB.4.0;';

  //Paradoxデータベース(Paradoxではフォルダがデータベース)の場所
  StrDBFile := 'Data Source=' + '../ParadoxData;';

  StrExtended := 'Extended Properties="Paradox 5.x;"';

  //接続文字列
  ADOTable1.ConnectionString := StrProvider + StrDBFile + StrExtended;

  ADOTable1.TableName := 'ParaTest.DB';
  ADOTable1.Open;

  //各項目の表示幅を設定
  //DBGridの各カラムの幅設定でもいい
  ADOTable1.Fields[0].DisplayWidth := 5;
  ADOTable1.Fields[1].DisplayWidth := 10;
  ADOTable1.Fields[2].DisplayWidth := 10;
  ADOTable1.Fields[3].DisplayWidth := 10;
end;

end.




05_Paradox データベースに接続 ( TADOQuery )


TADOQuery コンポーネントだけを使用して Paradox データベースに接続する例です.

TADOQuery を使用する場合,SQL 文を書いて実行しないと,データを表示しません.
Delphi のコミュニティの場で質問される方の中には,クエリーの使用を積極的に避けている方がいますが,簡単な検索はもちろん,少し複雑な検索や集計を実行するにはクエリーは便利で欠かせないものです.と言うより,データベースでは SQL は必須と言って過言ではないでしょう.
このサンプルで使用している SELECT * FROM ParaTest という SQL 文は,
  • SELECT  選ぶ(選べ),何を
  • *     全ての項目を( * の代りに項目をカンマで区切って指定可能)
  • FROM   何から(どこから)
  • ParaTest ParaTest という表から
ということを意味しています.


図11
設計時画面
図12
実行画面
  • 添付の Paradox データベースの表
  • [番号] をキー項目にしてある

リスト4
Paradox データベースに TADOQuery で接続
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    Button1: TButton;
    ADOQuery1: TADOQuery;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  フォームを閉じる時はClose
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ADOQuery1.Close;
end;

//=============================================================================
//  指定のParadoxデータベースの表をDBGridに表示
//  TADOQueryだけを使用した例
//
//  オブジェクト・インスペクタで以下を設定
//  DataSource1.DataSet := ADOQuery1;
//  DBGrid1.DataSource  := DataSource1;
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  StrProvider  : String;
  StrDBFile    : String;
  StrExtended  : String;
begin
  //プロバイダ
  StrProvider := 'Provider=Microsoft.Jet.OLEDB.4.0;';

  //Paradoxデータベース(Paradoxではフォルダがデータベース)の場所
  StrDBFile := 'Data Source=' + '../ParadoxData;';

  StrExtended := 'Extended Properties=Paradox 5.x;';

  //接続文字列
  ADOQuery1.ConnectionString := StrProvider + StrDBFile + StrExtended;

  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT * FROM ParaTest ');
  ADOQuery1.Open;

  //各項目の表示幅を設定
  //DBGridの各カラムの幅設定でもいい
  ADOQuery1.Fields[0].DisplayWidth := 5;
  ADOQuery1.Fields[1].DisplayWidth := 10;
  ADOQuery1.Fields[2].DisplayWidth := 10;
  ADOQuery1.Fields[3].DisplayWidth := 10;
end;

end.




06_Paradox データベースに接続 ( TADOConnection + TADOQuery )


TADOConnection と TADOQuery コンポーネントを使用して Paradox データベースに接続します.
TADOConnection を使用すると,詳細な設定やトランザクション等の制御が可能となります.

TADOQuery を使用する場合,SQL 文を書いて実行しないと,データを表示しません.
Delphi のコミュニティの場で質問される方の中には,クエリーの使用を積極的に避けている方がいますが,簡単な検索はもちろん,少し複雑な検索や集計を実行するにはクエリーは便利で欠かせないものです.と言うより,データベースでは SQL は必須と言ってもいいでしょう.
このサンプルで使用している SELECT * FROM ParaTest という SQL 文は,
  • SELECT  選ぶ(選べ),何を
  • *     全ての項目を( * の代りに項目をカンマで区切って指定可能)
  • FROM   何から(どこから)
  • ParaTest ParaTest という表から
ということを意味しています.


図13
設計時画面
図14
実行画面
  • 添付の Paradox データベースの表
  • [番号] をキー項目にしてある

リスト5
Paradox データベースに TADOConnection と TADOQuery で接続
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    Button1: TButton;
    ADOQuery1: TADOQuery;
    ADOConnection1: TADOConnection;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  フォームを閉じる時はデータベース切断
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ADOConnection1.Connected := False;
end;

//=============================================================================
//  指定のParadoxデータベースの表をDBGridに表示
//  TDOConnectionとTADOQueryを使用した例
//
//  オブジェクト・インスペクタで以下を設定
//  ADOConnection1.LoginPrompt := False;
//  ADOQuery1.Connection       := ADOConnection1;
//  DataSource1.DataSet        := ADOQuery1;
//  DBGrid1.DataSource         := DataSource1;
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  StrDBDir     : String;
  StrExtended  : String;
begin
  ADOConnection1.Connected := False;

  //プロバイダ
  ADOConnection1.Provider := 'Microsoft.Jet.OLEDB.4.0';

  //Paradoxデータベース(Paradoxではフォルダがデータベース)の場所
  StrDBDir    := 'Data Source=' + '../ParadoxData;';
  StrExtended := 'Extended Properties=Paradox 5.x;';

  //接続文字列
  ADOConnection1.ConnectionString := StrDBDir + StrExtended;

  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT * FROM ParaTest ');
  ADOQuery1.Open;

  //各項目の表示幅を設定
  //DBGridの各カラムの幅設定でもいい
  ADOQuery1.Fields[0].DisplayWidth := 5;
  ADOQuery1.Fields[1].DisplayWidth := 10;
  ADOQuery1.Fields[2].DisplayWidth := 10;
  ADOQuery1.Fields[3].DisplayWidth := 10;
end;

end.




07_旧 Paradox データの日本語文字化け対策


Delphi 7 等の古いバージョンの Delphi に付属していた Paradox のサンプルデータには日本語が含まれていました.この日本語が含まれている表データを,本ページのように,ADO を使用してデータベースコントロールに表示すると,下図のように,日本語が文字化けすることがあります.



図15
ADO 接続で TDBGrid にデータを表示
  • BDE 関係のコンポーネントを使用すれば文字化けはしない
図16
文字化け対策をした結果
  • 本サンプルで変換した Paradox のデータを ADO 接続で表示

以下のサンプルコードを使用して,Paradox の表データを作成し直せば,この日本語の文字化けを回避できます.
TBatchMove を使用して,元の表からデータを読み出して,新規に表を作成して,そこにコピーするだけです.コピー先に同じ名前のファイルがある場合は,上書きと同じになります.
*.db, *.px 以外のファイルをコピー先のファイルにコピーすると,以下のような.予期しないエラーが発生する可能性があります.

外部データベース ドライバ (12034) で予期しないエラーが発生しました。.


[備考]
添付の EXE は,システムに BDE がインストールされていないと実行できません.また,添付のプロジェクトは,BDE 関係のコンポーネントが利用できる環境でないとコンパイルできません.




図17
設計時画面
図18
実行画面
  • 上の TEdit のテキストが,日本語を含む Paradox のデータベースの場所
  • 下の TEdit のテキストは,変換後のデータを保存する場所
  • TListBox に表示されているのが表のファイル名一覧
  • ボタンクリックで転送開始
図19
変換した結果のファイル類
  • *.MB ファイルは自動転送
  • 必要であれば *.PX (インデックスファイル) をこのフォルダにコピーする
図20
予期しないエラーが発生しました
  • *.DB, *.PX 以外のファイルが,同じフォルダ内にあると発生することがある

リスト6
古い Delphi に付属の Paradox データの日本語が文字化するのを回避
データベースの表データを読み込んで,新しい表に書き込むだけ
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DBTables, DB, ADODB, StdCtrls, ExtCtrls, Buttons;

type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    Edit1: TEdit;
    Panel1: TPanel;
    Edit2: TEdit;
    BatchMove1: TBatchMove;
    Table1: TTable;
    Table2: TTable;
    Button1: TButton;
    SpeedButton1: TSpeedButton;
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses
  FileCtrl;

{$R *.dfm}

//=============================================================================
//  FormCreate時に各種初期設定
//  ADOConnecton1,ADOQuery1はFormに配置しデフォルトの状態で使用
//  それ以外の設定はこのサンプルコード内で行っている
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.Text := 'C:\Program Files\Common Files\Borland Shared\Data';
  Edit1.Text := 'C:\Program Files (x86)\Common Files\Borland Shared\Data';
  Edit2.Text := ExpandFileName('..\91_NewPdxData');

  SpeedButton1Click(nil);
end;

//=============================================================================
//  Edit1のKeyDownイベント処理
//=============================================================================
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_RETURN then begin
    SpeedButton1Click(nil);
  end;
end;

//=============================================================================
//  Paradoxデータベースの表(テーブル)の一覧を作成
//  フォルダの選択ダイアログを表示してフォルダを選択する
//=============================================================================
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  LPdxDBName : string;
  LTableList : TStrings;
  i          : Integer;
begin
  ListBox1.Items.Clear;

  //ADO等DB関係の設定
  ADOQuery1.Close;
  ADOConnection1.Connected      := False;
  ADOConnection1.Mode           := cmShareDenyRead;
  ADOConnection1.KeepConnection := False;
  ADOConnection1.Connected      := False;
  ADOConnection1.LoginPrompt    := False;
  ADOQuery1.Connection          := ADOConnection1;
  ADOQuery1.Prepared            := True;

  //Paradoxデータベース名
  LPdxDBName := Trim(Edit1.Text);
  if not DirectoryExists(LPdxDBName) then exit;

  if Sender <> nil then begin
    if not SelectDirectory('Paradoxデータベース選択', '', LPdxDBName) then exit;
  end;
  Edit1.Text := LPdxDBName;

  ADOConnection1.Provider := 'Microsoft.Jet.OLEDB.4.0';
  //接続文字列
  ADOConnection1.ConnectionString := 'Data Source='
                                   + LPdxDBName
                                   + ';Extended Properties="Paradox 5.x;"';

  //ListBox1にテーブルの一覧を表示
  LTableList := TStringList.Create;
  try
    ListBox1.Items.BeginUpdate;
    ADOConnection1.GetTableNames(LTableList);
    for i := 0 to LTableList.Count - 1 do begin
      ListBox1.Items.Add(LTableList[i] + '.db');
    end;
  finally
    ListBox1.Items.EndUpdate;
    LTableList.Free;
  end;

  ADOQuery1.Close;
  ADOConnection1.Connected := False;
end;

//=============================================================================
//  Delphi 7等に付属のParadoxの日本語文字は,Windows Vista以降では文字化けする
//  その対策用のコード
//  TBatchMoveで一度読み込んで上書き保存するだけ
//  これは,Windows XP以前で実行しても意味はない
//
//  Table2が存在しない場合は新規に作成される
//  *.MB(画像等のバイナリ)ファイルは自動で転送される
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
begin
  if ListBox1.Items.Count <= 0 then exit;

  ForceDirectories(Trim(Edit2.Text) );

  BatchMove1.Source        := Table1;
  BatchMove1.Destination   := Table2;
  BatchMove1.Mode          := batCopy;
  BatchMove1.Transliterate := True;

  Table1.DatabaseName := Trim(Edit1.Text);
  Table1.TableType    := ttParadox;
  Table2.DatabaseName := Trim(Edit2.Text);
  Table2.TableType    := ttParadox;

  for i := 0 to ListBox1.Items.Count - 1 do begin
    Table1.TableName := ListBox1.Items[i];
    Table2.TableName := Table1.TableName;

    BatchMove1.Execute;
  end;

  MessageBox(Handle, '終了しました', '変換', MB_ICONINFORMATION);
end;

end.


本ページは ADO の操作関係の記事ですので,Paradox のテーブル名一覧 (表名の一覧) 取得に ADO を使用しています.TSession コンポーネントを使用すると,Paradox のテーブル名の一覧 (表名の一覧) を以下のように取得できます.


リスト7
TSession コンポーネントを使用して Paradox の表の一覧を取得する
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  LPdxDBName : string;
  LTableList : TStrings;
begin
  LTableList := TStringList.Create;
  try
    LPdxDBName := Trim(Edit1.Text);
    Session1.SessionName := 'Session1';
    Session1.GetTableNames(LPdxDBName, '*.DB', True, False, LTableList);
    ListBox1.Items := LTableList;
  finally
    FreeAndNil(LTableList);
    Session1.Close;
  end;
end;