リッチクライアント インターフェイスを作成する(InterBase チュートリアル)
チュートリアル:Delphi および C++ アプリケーションで InterBase データベースを使用する への移動
ここでは、サーバーを使用するクライアントを作成します。 このクライアントでは、サーバーの次の機能を両方使用します。
- ストアド プロシージャを呼び出して値を返す
- データベース テーブル内のデータを表示し、更新する
次の図は、コンポーネントを追加した後のクライアント アプリケーションのフォームです。
ユーザーが扱うビジュアル コンポーネントは、フォームの左側にあります。 データベースにアクセスするために使用する非ビジュアル コンポーネントは、右側にあります。
以下の手順でクライアント アプリケーションを作成します。
- サーバー アプリケーションと同じプロジェクト グループ内に、クライアント アプリケーションを作成します。プロジェクト マネージャでプロジェクト グループ名を右クリックし、[新規プロジェクトを追加...]を選択するか、[プロジェクト|新規プロジェクトを追加...]を選択します。
- [新規作成]ダイアログ ボックスが表示されます。
- Delphi の場合は、[Delphi プロジェクト]カテゴリを選択してから、[VCL フォーム アプリケーション]を選択します。
- C++Builder の場合は、[C++Builder プロジェクト]カテゴリを選択してから、[VCL フォーム アプリケーション]を選択します。
- [OK]をクリックします。 新しいフォームを選択し、[オブジェクト インスペクタ]で[Caption]プロパティを「Client demo」に設定します。 [ファイル|すべて保存]を選択してファイルを保存します。
- Delphi の場合は、ユニットを「Un_client_main.pas」という名前で保存します。 プロジェクトは「ClientDemo.dproj」という名前で保存します。
- C++ の場合は、ユニットを「Un_client_main.cpp」という名前で保存します。 プロジェクトは「ClientDemo.cbproj」という名前で保存します。
- 次に、前のセクションでビルドしたサーバーを実行します。 [プロジェクト マネージャ]で ServerDemo.exe をダブルクリックします。 [実行|デバッガを使わずに実行]を選択して、サーバーを実行します。 表示された[ServerForm]ダイアログは最小化しても構いません。
'
'メモ: 次のステップでサーバーに接続し、DataSnap クライアント クラスを生成するには、サーバーが起動している必要があります。
- TSQLConnection コンポーネントを新しいフォーム上に配置し、そのプロパティを設定します:
- [Driver] プロパティを [DataSnap]に設定します。 [オブジェクト インスペクタ]で、[Driver] プロパティの左にある
+
をクリックし、詳細なプロパティを表示します。- [Port]を「211」(デフォルト)に設定します。
- [HostName]を「localhost」(デフォルト)に設定します。
- これらのプロパティは、[Params]プロパティを変更して設定することもできます。 [Params]プロパティの参照([...])ボタンをクリックして、[値リストの編集]ダイアログを開きます。 このダイアログでプロパティの値を入力し、[OK]をクリックすると、値が設定されます。
- [LoginPrompt]を[False]に設定して、クライアントがサーバーに接続するたびにユーザー名とパスワードを入力するダイアログが表示されないようにします。
- [Connected]を[True]に設定します。
- サーバーが起動している状態で、TSQLConnection を右クリックし、コンテキスト メニューから[DataSnap クライアント クラスの生成]を選択します。 この作業を行うと、新しいユニットが生成されます。 クライアント クラスが含まれている新しく生成されたユニットを保存します。
- Delphi の場合は、ユニットを 「Un_client_classes.pas」という名前で保存します。
- C++ の場合は、ユニットを「Un_client_classes.cpp」という名前で保存します。
- Un_client_main に対して行った変更を保存します。
- [Driver] プロパティを [DataSnap]に設定します。 [オブジェクト インスペクタ]で、[Driver] プロパティの左にある
- Un_client_classes ユニットを Un_client_main にリンクします。
- Delphi の場合は、[Un_client_main]タブをクリックしてから[コード]タブをクリックし、Un_client_main の
uses
句に Un_client_classes を追加します。 - C++ の場合は、コード エディタ上部の[Un_client_main.cpp]タブをクリックしてから、コード エディタ下部の[Un_client_main.cpp]タブをクリックします。 Un_client_main.cpp に含まれる他の include 文の後に、次の include 文を追加します。
#include "Un_client_classes.h"
- Delphi の場合は、[Un_client_main]タブをクリックしてから[コード]タブをクリックし、Un_client_main の
- 次に、上の図で示したインターフェイスを構築します。 Un_client_main クライアントの[デザイン]タブをクリックし、[ツール パレット]から以下のコンポーネントをフォーム上にドラッグして、上の図のように配置します。
- データベースをナビゲートするための TDBNavigator コントロール。
- データベース テーブルを表示するための TDBGrid コントロール。
- データベース テーブルの読み込み、データベース データの更新、ストアド プロシージャの呼び出しを行うための 3 つの TButtons。
- データベースのストアド プロシージャにアクセスしたり、コンポーネントを互いに接続するための、データベース コンポーネントを追加します。
- TSqlServerMethod コンポーネントをフォーム上に配置します。
- [SQLConnection] プロパティをドロップダウン メニューの[SQLConnection1]に設定します。
- [ServerMethodName]プロパティを設定します。 サーバーが起動している場合には、このプロパティのドロップダウン メニューに、使用可能なすべてのサーバー メソッドが表示されます。 "TDSServerModule1.callStoredProcedure" を選択します。これは、ストアド プロシージャを呼び出すサーバー内の関数です。
- [Active]を True に設定してはなりません。 [True]に設定すると、このストアド プロシージャはデータセットを返さないため、エラー メッセージが出力されます。
- TDataSetProvider をフォーム上にドラッグします。
- [DataSet]プロパティをドロップダウン メニューの "SQLServerMethod1" に設定します。
- TClientDataSet をフォーム上に配置します。
- [ProviderName]プロパティをドロップダウン メニューの "DataSetProvider1" に設定します。
- TDataSource をフォーム上にドラッグします。
- [DataSet]プロパティをドロップダウン メニューの "ClientDataSet1" に設定します。
- TSqlServerMethod コンポーネントをフォーム上に配置します。
- データセットに対して読み取り/書き込みアクセスをするためのデータベース コンポーネントを追加します。
- TDSProviderConnection をフォーム上にドラッグします。 このプロバイダ コンポーネントは、データベース内を自由に移動し、更新を反映するためのものです。
- [SQLConnection] プロパティをドロップダウン メニューの "SQLConnection1" に設定します。
- [ServerClassName]プロパティを "TDSServerModule1" に設定します。
'
'メモ: TDSServerModule1 は、Un_ServerModule のサーバー モジュール クラスです。- 別の TClientDataSet をフォーム上に配置します。
- [RemoteServer]プロパティをドロップダウン メニューの "DSProviderConnection1" に設定します。
- [ProviderName]プロパティをドロップダウン メニューの "ServerDataSetProvider1" に設定します。
- 別の TDataSource をフォーム上にドラッグします。
- [DataSet]プロパティをドロップダウン メニューの "ClientDataSet2" に設定します。
- TDBGrid と TDBNavigator をデータソースに接続するため、両コンポーネントの DataSource プロパティを "DataSource2" に設定します。
- 接続を確認します。
- ClientDataSet2 TClientDataSet の Active プロパティを True に設定します。TDBGrid コンポーネントがアクティブになり、データベースの EMPLOYEE テーブルのデータが表示されるはずです。
- ClientDataSet2 の Active プロパティを Falase に戻します。クライアント アプリケーションでは、次に追加するイベント ハンドラで ClientDataSet2 を[True]に設定して、データベース接続をアクティブにします。
- "Load R/W" TButton のクリック イベントを追加します。この TButton を選択します。オブジェクト インスペクタ の [イベント] タブで、
OnClick
イベントを ダブルクリックして、スケルトン コードを生成します。TClientDataSett をアクティブにする次の 1 行を、イベント ハンドラ内に追加します。
Delphi
procedure TForm2.Button3Click(Sender: TObject); begin ClientDataSet2.Active := true; end;
C++
void __fastcall TForm2::Button1Click(TObject *Sender) { ClientDataSet2->Active = true; }
- 同様に、
OnClick
イベント ハンドラを[Apply updates]TButton に追加します。上と同じ手順でイベント ハンドラのスケルトンを作成し、次のコードを追加します。
Delphi
procedure TForm2.Button4Click(Sender: TObject); begin ClientDataSet2.ApplyUpdates(0); end;
C++
void __fastcall TForm2::Button2Click(TObject *Sender) { ClientDataSet2->ApplyUpdates(0); }
ApplyUpdates
のパラメータは、許容するエラーの数で、この場合は 0 です。
- TDSProviderConnection をフォーム上にドラッグします。 このプロバイダ コンポーネントは、データベース内を自由に移動し、更新を反映するためのものです。
- ストアド プロシージャの呼び出しをセットアップします。
- イベント ハンドラのスケルトンを、[Get project]TButton の
OnClick
イベントに作成します。この TButton をクリックすると、サーバーで定義したメソッドが呼び出されます。 このストアド プロシージャは整数値を受け取るため、従業員番号の TEdit に含まれるテキストを整数に変換する必要があります。 これを行うイベント ハンドラのコードは以下のとおりです。
procedure TForm2.Button1Click(Sender: TObject); var mykey : Integer; //variable to hold text from edit box myServer : TDSServerModule1Client; //server proxy we will call begin mykey := StrToInt(Edit1.Text); //conversion to integer SQLConnection1.Open; // Server creation using the SQLConnection for communication myServer := TDSServerModule1Client.Create(SQLConnection1.DBXConnection); try // Calling method that calls the stored procedure with the key. // Set label to value returned from stored procedure. Label1.Caption := myServer.callStoredProcedure(mykey); finally if SQLConnection1.Connected then SQLConnection1.Close; myServer.Free; //free up the server end; end;
C++
void __fastcall TForm2::Button3Click(TObject *Sender) { int mykey; //variable to hold text from edit box TDSServerModule1Client *myServer; //server proxy we will call mykey = StrToInt(Edit1->Text); //conversion to integer SQLConnection1->Open(); // Server creation using the SQLConnection for communication myServer = new TDSServerModule1Client(SQLConnection1->DBXConnection); try { // Calling method that calls the stored procedure with the key. // Set label to value returned from stored procedure. Label1->Caption = myServer->callStoredProcedure(mykey); } __finally { if (SQLConnection1->Connected) SQLConnection1->Close(); delete myServer; //free up the server } }
- 上記のコードでは、呼び出したストアド プロシージャから返された値(プロジェクト ID)を、TLabel の[Caption]に設定しています。
- イベント ハンドラのスケルトンを、[Get project]TButton の
- [ファイル|すべて保存]を選択して、すべてのファイルを保存します。
- EMPLOYEE_PROJECT テーブルからデータベース情報を取得します。 クライアント アプリケーションを実行する前に、データベース テーブルから情報を取得する必要があります。 [データ エクスプローラ]で[INTERBASE]の接続項目を開き、その下の[EMPLOYEE]接続を開きます。 この接続の下の[テーブル]を開きます。 [EMPLOYEE_PROJECT]を右クリックして[表示]を選択すると、テーブルのデータが次のように表示されます: [EMP_NO]の列に表示されている値をいくつか書き留めておいてください。 アプリケーションで使用している GET_EMP_PROJ というストアド プロシージャでは、EMPLOYEE_PROJECT テーブルにアクセスします。 ストアド プロシージャを使ってこのテーブルからデータを取得するには、有効な従業員番号を知っている必要があります。
- プロジェクトのクライアント部分をビルドして実行します。
- [プロジェクト マネージャ]で ClientDemo を右クリックして[ビルド]を選択し、クライアント プロジェクトをビルドします。 エラーがあれば修正します。
- クライアント アプリケーションを実行します。 次のダイアログが表示されます。
- [Load R/W]TButton をクリックすると、"ClientDataSet2" TClientDataSet がアクティブになります。TDBGrid には、EMPLOYEE テーブルのエントリが表示されます。 TDBNavigator コントロールもアクティブになり、テーブル エントリの間を移動できるようになります。
- TDBGrid のセルを選択して、値を変更することができます。 [Apply updates](TButton)をクリックすると、変更がデータベースに反映されます。
- 最後にストアド プロシージャのテストを行います。 有効な従業員番号の 1 つを TEdit コントロールに入力し、[プロジェクトの取得](TButton)をクリックします。 TButton の下のラベルのキャプションが、EMPLOYEE_PROJECT テーブル内の該当するプロジェクト ID に変更されるはずです。
前へ