リッチクライアント インターフェイスを作成する(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 に対して行った変更を保存します。
- 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 文を追加します。
- 次に、上の図で示したインターフェイスを構築します。 Un_client_main クライアントの[デザイン]タブをクリックし、[ツール パレット]から以下のコンポーネントをフォーム上にドラッグして、上の図のように配置します。
- データベース内を移動するための[TDBNavigator]コントロール。
- データベース テーブルを表示するための[TDBGrid]コントロール。
- データベース テーブルの読み込み、データベース データの更新、ストアド プロシージャの呼び出しを行うための 3 つの[TButton]。 図に示すように、それぞれのTButton の[Caption]を、「Load R/W」、「Apply updates」、「Get project」に設定します。
- 従業員番号用の[TEdit]コントロール。 [Text]プロパティを空白に変更します。
- プロジェクト ID を表示するための[TLabel]コントロール。
- データベースのストアド プロシージャにアクセスしたり、コンポーネントを互いに接続するための、データベース コンポーネントを追加します。
- [TSqlServerMethod]コンポーネントをフォームに配置します。
- [SQLConnection]プロパティをドロップダウン メニューの "SQLConnection1" に設定します。
- [ServerMethodName]プロパティを設定します。 サーバーが起動している場合には、このプロパティのドロップダウン メニューに、使用可能なすべてのサーバー メソッドが表示されます。 "TDSServerModule1.callStoredProcedure" を選択します。これは、ストアド プロシージャを呼び出すサーバー内の関数です。
- [Active]を[True]に設定してはなりません。 [True]に設定すると、このストアド プロシージャはデータセットを返さないため、エラー メッセージが出力されます。
- [TDataSetProvider]をフォームへドラッグします。
- [DataSet]プロパティをドロップダウン メニューの "SQLServerMethod1" に設定します。
- [TClientDataSet]をフォーム上に配置します。
- [ProviderName]プロパティをドロップダウン メニューの "DataSetProvider1" に設定します。
- [TDataSource]をフォームへドラッグします。
- [DataSet]プロパティをドロップダウン メニューの "ClientDataSet1" に設定します。
- データセットに対して読み取り/書き込みアクセスをするためのデータベース コンポーネントを追加します。
- [TDSProviderConnection]をフォームへドラッグします。 このプロバイダ コンポーネントは、データベース内を自由に移動し、更新を反映するためのものです。
- [SQLConnection]プロパティをドロップダウン メニューの "SQLConnection1" に設定します。
- [ServerClassName]プロパティを "TDSServerModule1"に設定します。
- [TClientDataSet]をもう 1 つ、フォーム上に配置します。
- [RemoteServer]プロパティをドロップダウン メニューの "DSProviderConnection1" に設定します。
- [ProviderName]プロパティをドロップダウン メニューの "ServerDataSetProvider1" に設定します。
- [TDataSource]をもう 1 つ、フォームへドラッグします。
- [DataSet]プロパティをドロップダウン メニューの "ClientDataSet2" に設定します。
- TDBGrid と TDBNavigator をデータ ソースに接続します。両コンポーネントの[DataSource]プロパティを "DataSource2" に設定してください。
- 接続を確認します。
- ClientDataSet2(TClientDataSet)の[Active]プロパティを[True]に設定します。 TDBGrid コンポーネントがアクティブになり、データベースの EMPLOYEE テーブルのデータが表示されるはずです。
- ClientDataSet2 の[Active]プロパティを[False]に戻します。 クライアント アプリケーションでは、次に追加するイベント ハンドラで ClientDataSet2 を[True]に設定して、データベース接続をアクティブにします。
- [Load R/W](TButton)のクリック イベントを追加します。 この TButton を選択します。 [オブジェクト インスペクタ]の[イベント]タブで
[OnClick]
イベントをダブルクリックして、スケルトン コードを生成します。 TClientDataSet をアクティブにする次の 1 行を、イベント ハンドラ内に追加します。 - 同様に、[Apply updates](TButton)の
[OnClick]
イベント ハンドラを追加します。 上と同じ手順でイベント ハンドラのスケルトンを作成し、次のコードを追加します。 ApplyUpdates
のパラメータは、許容するエラーの数で、この場合は 0 です。- ストアド プロシージャの呼び出しをセットアップします。
- [プロジェクトの取得](TButton)の
[OnClick]
イベントに対するイベント ハンドラのスケルトンを作成します。 この TButton をクリックすると、サーバーで定義したメソッドが呼び出されます。 このストアド プロシージャは整数値を受け取るため、従業員番号の TEdit に含まれるテキストを整数に変換する必要があります。 これを行うイベント ハンドラのコードは以下のとおりです。 - 上記のコードでは、呼び出したストアド プロシージャから返された値(プロジェクト ID)を、TLabel の[Caption]に設定しています。
- [ファイル|すべて保存]を選択して、すべてのファイルを保存します。
- EMPLOYEE_PROJECT テーブルからデータベース情報を取得します。
- プロジェクトのクライアント部分をビルドして実行します。
- [プロジェクト マネージャ]で ClientDemo を右クリックして[ビルド]を選択し、クライアント プロジェクトをビルドします。 エラーがあれば修正します。
- クライアント アプリケーションを実行します。 次のダイアログが表示されます。
- [Load R/W](TButton)をクリックすると、"ClientDataSet2"(TClientDataSet)がアクティブになります。 TDBGrid には、EMPLOYEE テーブルのエントリが表示されます。 TDBNavigator コントロールもアクティブになり、テーブル エントリの間を移動できるようになります。
- 最後にストアド プロシージャのテストを行います。 有効な従業員番号の 1 つを TEdit コントロールに入力し、[プロジェクトの取得](TButton)をクリックします。 TButton の下のラベルのキャプションが、EMPLOYEE_PROJECT テーブル内の該当するプロジェクト ID に変更されるはずです。
# include "Un_client_classes.h"
これらのコンポーネントを配置した後で、適宜、移動やサイズの変更を行ってください。
メモ: "TDSServerModule1" は、Un_ServerModule のサーバー モジュール クラスです。
Delphi
procedure TForm2.Button3Click(Sender: TObject);
begin
ClientDataSet2.Active := true;
end;
C++
void __fastcall TForm2::Button1Click(TObject *Sender)
{
ClientDataSet2->Active = true;
}
Delphi
procedure TForm2.Button4Click(Sender: TObject);
begin
ClientDataSet2.ApplyUpdates(0);
end;
C++
void __fastcall TForm2::Button2Click(TObject *Sender)
{
ClientDataSet2->ApplyUpdates(0);
}
Delphi
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
}
}
クライアント アプリケーションを実行する前に、データベース テーブルから情報を取得する必要があります。 [データ エクスプローラ]で[INTERBASE]の接続項目を開き、その下の[EMPLOYEE]接続を開きます。 この接続の下の[テーブル]を開きます。 [EMPLOYEE_PROJECT]を右クリックして[テーブルからのデータの取得]を選択すると、テーブルのデータが次のように表示されます。
[EMP_NO]の列に表示されている値をいくつか書き留めておいてください。 アプリケーションで使用している GET_EMP_PROJ というストアド プロシージャでは、EMPLOYEE_PROJECT テーブルにアクセスします。 ストアド プロシージャを使ってこのテーブルからデータを取得するには、有効な従業員番号を知っている必要があります。
これで、アプリケーションとして実行されるクライアントが完成しました。
前のチュートリアル
DataSnap サーバーでサーバー側コンポーネントを作成する