
ナッキー |
前回やっと、Webサービスを通じてラッキーアイテムを呼び出すことができましたね。テンプレートを使ったので作る作業は難しくなかったけど、ラッキーアイテムの変更はサーバープログラムの変更が必要ですね。 |
|
|

高橋先生 |
Webサービスを作る手順さえ覚えれば、簡単だったね。機能をそのままWebサービスに置き換えただけだったから、ピンと来なかったかもしれない。今回はデータベースを使って、提供するラッキーアイテムを簡単に変更できるようにしよう。 |
|
|
データベースの作成
最初はデータベースを用意しなくっちゃ、ということなんだけど何から始めたらいいんだっけ?教えて、高橋先生!
高橋先生:ちょっと前にデータベースをやったと思うけど... まぁ、復習ということでもう一度手順を紹介しようか。 ここからはTurbo Delphiに付属の「InterBase7.5」がインストールされていることを前提に話を進めるよ。まだインストールしていない場合は、「第16回アンケートプログラムでデータベース対応」を参考にして。まずは「InterBaseサービスマネージャー」というのを使ってInterBaseサーバーを起動しよう。そのとき「InterBaseをWindowsサービスとして起動する」のチェックをはずしておいてね。 |
ナッキー:小さい画面のボタンをクリックすると、起動するんでしたよね。ちょっとずつ思い出してきました。 |
|
Windows OSのスタートメニューで「Borland InterBase 7.5 Developer [instance = gds_db]」の「InterBase サービスマネージャー [instance = gds_db]」を起動します。
起動したら「ステータス(T)」欄に、「InterBaseをWindowsサービスとして起動する」を確認して、先頭のチェックが付いていたらクリックしてはずします。「ステータス(T)」欄に「InterBaseサーバーは停止中」と表示しているのを確認して、[起動(S)]ボタンをクリックします。「InterBaseサーバーは稼動中」と変化したのを確認してから[閉じる](×)ボタンで終了します。

図01 InterBaseサービスマネージャー
高橋先生:そのままだと、Windowsを終了するまで稼働中になってしまうので、不要になったら、終了しよう。タスクトレイのInterBaseアイコンを右クリックして「シャットダウン(S)」をクリックすれば終了できるよ。 |
ナッキー:毎回、Delphiで作業する前にInterBaseサーバーを起動するんでしたよね。ちょっとは思い出したわ。 |
|
次はデータベースを作るのよね。ツールを使ったと思うんだけど、どうだったかしら?
高橋先生:今度はIBConsoleというツールを使おう。スタートメニューから起動できるよ。リモートサーバーには作れないので、ローカルサーバーに「LUCKYITEM.DB」というデータベースを作成してから、「ITEMS」テーブルを登録する。フィールドは「ID」「BLOODTYPE」「ITEM」の3つでいいね。それぞれのフィールドにデータを入力すればデータベースの完成だ。 |
ナッキー:うっ、全然思い出せません。と、とにかくIBConsoleを探して起動します。 |
|
では、「IBConsole」を起動します。Windows OSのスタートメニューで「Borland InterBase 7.5 Developer [instance = gds_db]」の「IBConsole」をクリックします。
ローカルサーバーの設定は以前やっておいたから、そこへデータベースを登録すればいいんですって。「LoaclServer-gds_db」をダブルクリックします。もしもパスワード入力を要求されたら「masterkey」と入力してログインします。
項目が左欄に並びますが、その中の「Databases」で右ボタンクリックして「データベースの作成(Z)...」を選択して「データベースの作成」ダイアログボックスを表示します。入力するのは「ファイル(F):」と「エリアス(A):」欄です。「ファイル(F):」に保存したいフォルダの名前をドライブ名からすべて記述します。たとえば「C:¥Documents and Settings¥(ユーザー名)¥My Documents¥Borland Studio Projects¥LUCKYITEM.DB」(記事の中にある「¥」はフォントの都合上全角文字で表記しています。実際には半角で記述してください。コピー&ペーストする場合にはご注意ください。)のように書けば、Delphiのデフォルトフォルダに保存できます。データベースの名前もエリアス名も「LUCKYITEM.DB」とします。最後に「オプション」欄の「Default Character Set」項目が「SJIS_0208」であることを確認します。できたら[OK]ボタンをクリックします。

図02 データベースの作成
次はテーブルの作成です。新たに表示された「LUCKYITEM.DB」の下にある「Tables」を選択してから、右側の空白で右クリックしてショートカットメニューを表示します。メニューから「作成(C)...」を選択します。

図03 テーブル作成
すると、「テーブルエディタ」が表示されます。「テーブル名(T)」欄に「ITEMS」を入力して、右側の[フィールドの追加(A)]ボタンをクリックします。

図04 テーブルエディタ
「フィールドプロパティエディタ」ダイアログボックスが表示されるので、3つのフィールドを追加します。まず「名前」欄に「ID」と入力して、左側の「フィールドの種別」で「特定のデータ型(T)」を選択します。

図05 フィールドプロパティ
新たに表示される[データ型の編集]ボタンをクリックします。「データタイプ」ダイアログボックスに「INTEGER」と表示されていることを確認して、[OK]ボタンをクリックします。

図06 データタイプ
「フィールドプロパティエディタ」ダイアログボックスに戻ったら、画面左下の「NOT NULL」にチェックをつけて、IDの値入力を必須とします。できたら[OK]ボタンをクリックします。「テーブルエディタ」ダイアログボックスまで戻りますので、画面右下の[現在のフィールドを追加(A)]をクリックして、「ID」フィールドをプライマリキーに設定します。

図07 プライマリキー
続いて、フィールドを登録します。今度は「BLOODTYPE」フィールドを登録します。「テーブルエディタ」ダイアログボックスで[フィールドの追加(A)]ボタンをクリックして、「フィールドプロパティエディタ」ダイアログボックスを表示します。「名前」欄に「BLOODTYPE」と入力して、左側の「フィールドの種別」で「特定のデータ型(T)」を選択します。[データ型の編集]ボタンをクリックして、「データタイプ」ダイアログボックスのコンボボックスで、「VARCHAR」を選択すると「キャラクタセット」と「文字長」が設定できます。「キャラクタセット」は「SJIS_0208」、「文字長」には「8」と入力して[OK]ボタンをクリックします。「フィールドプロパティエディタ」ダイアログボックスに戻ったら、ここでも「OK」ボタンをクリックします。

図08 BLOODTYPE設定
「BLOODTYPE」と同様にして、「ITEM」フィールドも追加します。「テーブルエディタ」ダイアログボックスで[フィールドの追加(A)]ボタンをクリックして、「フィールドプロパティエディタ」ダイアログボックスの「名前」欄に「ITEM」と入力します。左側の「フィールドの種別」で「特定のデータ型(T)」を選択して、[データ型の編集]ボタンをクリックします。「データタイプ」ダイアログボックスで「VARCHAR」を選択して、「キャラクタセット」に「SJIS_0208」、「文字長」は「16」と入力して[OK]ボタンをクリック、次の「フィールドプロパティエディタ」でも[OK]ボタンをクリックしてフィールドの設定は完了です。確認して、[OK]ボタンをクリックします。

図09 フィールド作成完了
作成した「ITEMS」テーブルが画面右側に表示されますので、右ボタンクリックで表示したショートカットメニューから「プロパティ(P)...」をクリックします。

図10 プロパティ設定
「Properties for : ITEMS」ダイアログボックスを表示したら「データ」タブをクリックしてデータを入力します。「ID」フィールドは1から順に4までつけます。「BLOODTYPE」フィールドは「A」「B」「O」「AB」と1レコードずつ入力します。「ITEM」フィールドは好きな品目を入力します。レコードを追加するにはキーボードの「↓」キーを押します。

図11 データ入力
これで、データベースは完成です。「データ更新ボタン」をクリックしたら、すべての画面を閉じて「IBConsole」を終了します。
データモジュール
何とかデータベースを作ることができましたね。これをWebサービスで使えるようにするのかぁ。どうしたらいいのかな?教えて、高橋先生!
高橋先生:データモジュールを使ってデータベースコンポーネントを上手に管理してみよう。 |
ナッキー:でーたもじゅ~る? |
高橋先生:非ビジュアルコンポーネントに限られるけれど、コンポーネントを配置できる土台となるのがデータモジュールだ。本来データベース関連のコンポーネントを、まとめておくことが目的だけれど、非ビジュアルコンポーネントなら何でも置いておくことができる。 |
ナッキー:フォームはいらないけど、コンポーネントは必要って時に使える土台がデータモジュールってことですね。 |
高橋先生:データモジュールはサーバープログラムに置いておこう。 |
|
では、前回保存したプロジェクトを開きます。Turbo Delphiを起動して、画面中央の「ホームページ」で「UranaiGroup.bdsgroup」を選択。もし一覧に表示されていなければ、ツールバーの[プロジェクトを開く(Ctrl+F11)]ボタンをクリックします。「プロジェクトを開く」ダイアログボックスから「UranaiGroup.bdsgroup」を探します。
「UranaiServer.exe」がアクティブかどうか確認します。画面右上のプロジェクトマネージャで、「UranaiServer.exe」の文字が太字になっていればアクティブなんですって。「FortuneWeb.exe」が太字の場合は、「UranaiServer.exe」をダブルクリックします。
確認したら、ツールバーの[新規作成]ボタンをクリックして「新規作成」ダイアログボックスを表示します。画面左側の「項目カテゴリ(A):」で「Delphiプロジェクト」の下にある「Delphiファイル」をクリックして、画面右側の「データモジュール」を選択して[OK]ボタンをクリックします。

図12 新規作成
小さいフォームみたいなものができました。ここへコンポーネントを配置できるんだって。名前をつけておきます。画面左下のオブジェクトインスペクタ、プロパティページで「その他」カテゴリの「Name」プロパティに「dmdLuckyItem」と入力します。

図13 データモジュール
データベースを使うためのコンポーネントを配置します。画面右下のツールパレットで「dbExpress」カテゴリの「TSQLConnection」コンポーネントと「TSimpleDataset」コンポーネントを1つずつ配置します。配置できたらプロパティ設定です。

図14 コンポーネント配置
TSQLConnectionコンポーネントは、LUCKYITEM.DBとやり取りするために、新しい接続の設定をします。TSQLConnectionコンポーネントをダブルクリック、もしくは右ボタンクリックして「接続の設定(D)...」を選択します。「dbExpress接続」ダイアログボックスが表示されたら、ツールバーで「+」アイコンのついた[接続の追加]ボタンをクリックします。

図15 接続の追加
表示された「接続名の新規追加」ボックスで「ドライバ名(D)」に「InterBase」、「接続名(C)」に「LUCKYITEMDB」を入力して[OK]ボタンをクリックします。

図16接続名の新規追加
「dbExpress接続」ダイアログボックスに戻ったら、「LUCKYITEMDB」が選択されていることを確認して、右欄の「接続の設定(S)」に「LUCKYITEM.DB」を設定します。そのとき、「localhost:C:¥Documents and Settings¥nacky¥My Documents¥Borland Studio Projects¥LUCKYITEM.DB」のように先頭に「localhost:」をつけて、ドライブ名からすべて記述します。IISを使ってWebサービスプログラムを動作させる際には、「localhost:」のようにInterBaseが起動しているサーバー名を指定する必要があるんですって。プログラムをインターネット上にアップするときは、そのアドレスを記述しますが、サーバーアプリと同じ場所に置かなくちゃだめなんですって。次に文字の種類を限定するために「ServarCharSet」に「SJIS_0208」を入力します。できたら[OK(O)]ボタンをクリックします。

図17 Database項目の設定
データベースサーバーへのログイン画面を表示しないようにします。プロパティページで「データベース」カテゴリの[+]ボタンをクリックして展開します。「LoginPrompt」プロパティに「False」をセットします。次にデータベースサーバーに接続します。「データベース」カテゴリの「Connected」プロパティに「True」をセットしてみます。エラーが出ず「True」になれば接続完了です。エラーが出たら「LUCKYITEMDB」にセットした「Database」のデータベース名に間違いがないか、InterBaseサーバーは稼動中かどうか確認してエラーを解消します。
SQLConnection1
カテゴリ名 |
プロパティ名 |
設定値 |
データベース |
LoginPrompt |
False |
Connected |
True |
|
|
|
次にデータ取得の「TSimpleDataSet」コンポーネントです。プロパティページで「リンク」カテゴリの「Connection」プロパティに「SQLConnection1」、「DataSet」プロパティは先頭の[+]ボタンをクリックして展開します。新たに表示されるプロパティで「CommandType」プロパティを「ctTable」にしてから、「CommandText」プロパティを「ITEMS」にします。うまく設定できたことを確かめるために「その他」カテゴリの「Active」プロパティを「True」にしてみます。エラーが出なければ、うまく設定できています。確認できたらFalseに戻してかまいません。「Name」プロパティに「sdsItems」と名前をつけておきます。
SimpleDataSet1
カテゴリ名 |
プロパティ名 |
設定値 |
リンク |
Connection |
SQLConnection1 |
DataSet |
CommandType |
ctTable |
CommandText |
ITEMS |
その他 |
Active |
True (確認後Falseに戻す) |
Name |
sdsItems |
|
|
|
|
次にsdsItemsデータセットをダブルクリック、もしくは右ボタンクリックして「項目の設定(T)...」を選択します。「項目エディタ」という小さなウィンドウが表示されます。白い空欄の上で右ボタンクリックして「すべての項目の追加(F) Ctrl+F」を選択します。そうするとLUCKYITEM.DBで設定したフィールド名が一覧になります。

図18 項目の設定
これで、コンポーネントの設定は完了です。保存しておきましょう。ツールバーの[すべて保存]ボタンをクリックします。ユニット名は「DBUnit」とつけて保存します。
データを読み込む関数
今まではData Controlカテゴリのコンポーネントにデータを表示していたんだけど、コンポーネントなしでどうやってデータを読み込むんだろう?教えて、高橋先生!
高橋先生:もちろん、コードを使って読み込むことができるよ。今回のポイントはA型や、B型といった特定のデータを取り出したいということ。以前SQLを使ってデータを限定する方法に挑戦してもらったけれど、今度はフィルタという機能を使ってみよう。フィルタというのはデータから条件にあったものだけ取り出す手法だ。 |
ナッキー:えー、じゃあSQLと同じですよねぇ。 |
高橋先生: SQLは取り出した結果データをデータセットとして持つのに対して、フィルタは条件を充たしたデータしか見ることはできないけれど、実体はテーブルだ。データ量が多いものはSQL、少ないものはフィルタと考えるといいね。 |
ナッキー:今回はデータがちょっとしかないからフィルタでもOKってことなのね。 |
高橋先生:フィルタの方法はTSimpleDatasetの「Filter」プロパティに条件文を記述する。たとえば NUM > 2000 このように記述すると、NUMフィールドの値が2000より大きいデータだけ読み取ることができる。条件が設定できたら「Filtered」プロパティを「True」にしてフィルタの処理ができるようにする。次にTSimpleDatasetの「FindFirst」メソッドでフィルタを実行。データが見つかったら戻り値が「True」になるから成功したか失敗したかがわかる。今回は1つしかデータがないから関係はないけど、最初の1回は「FindFirst」で実行、2回目以降は「FindNext」メソッドで次のデータを探すことになっているから気をつけてね。あとは、「AsString」や「AsInteger」プロパティでデータを取り出すだけだよ。 |
ナッキー:フィルタを設定してデータを探し出して、メソッドやプロパティを使って値を取得するんですね。 |
高橋先生:ここでは、データモジュールに、ラッキーアイテムだけ取得する関数を作ろう。パラメータはITEMSテーブルの「ID」フィールドに対応する数値。戻り値は「ITEM」フィールドの文字列にする。 |
ナッキー:データモジュールに関数を書くっていうのはわかりましたけど、どこで呼び出すんですか? |
高橋先生:サーバープログラムで呼び出すんだよ。GetUranaiMessage関数で呼び出して、メッセージを作るときに使おう。では、データモジュールに関数を作ってみて。 |
|
いきなり関数を作ってと言われても難しいけど、やり方をちょっとずつ思い出してみましょう。まずはコードエディタにしなくっちゃね。画面中央に「DBUnit」が表示されていることを確認して、画面下の「コード」タブをクリックします。コードエディタが表示できたら、まずは関数の定義をしとかないとね。この関数は「UranaiImpl」ユニットから参照するわけだから、「private」じゃなくて、「public」に書くんですって。関数だから「function」ではじめて、関数名を「GetLuckyItem」とします。パラメータは血液型の番号が入るから「Blood」という名前のInteger型で用意します。戻り値は「ITEM」フィールドの内容だからstring型ね。太字部分を追加します。
type
TdmdLuckyItem = class(TDataModule)
SQLConnection1: TSQLConnection;
sdsItems: TSimpleDataSet;
sdsItemsID: TIntegerField;
sdsItemsBLOODTYPE: TStringField;
sdsItemsITEM: TStringField;
private
{ Private 宣言 }
public
{ Public 宣言 }
function GetLuckyItem(Blood : Integer) : string;
end;
追加した行の最後でキーボードの[Ctlr+Shift+C]を押すと、実装部に関数を作る枠ができるんですって。そういえばそうだったような気が…
できた行に、フィルタを実行するようにコードを書きます。そうだ、条件文を考えなくちゃね。血液型は1から4の数値でパラメータに入ってくるから、ITEMSテーブルの「ID」に対応しているわよね。だから「ID=1」っていう感じでいいのかな?
高橋先生:Filterプロパティは文字列型なので全体を文字列で扱おう。だから「'ID='」と「文字列に変換したBloodパラメータ」を連結しよう。 フィルタの設定ができたら、テーブルを参照できるようにしよう。sdsItemsデータセットの「Open」メソッドを使うよ。データが取得できたら「Close」メソッドで閉じておくといいね。 |
|
そっか、ただ連結しただけだと、Bloodパラメータは数値になっちゃうんだ。じゃあ、そのことに気をつけて、Openメソッドの実行までコードを記述します。太字部分を追加します。
function TdmdLuckyItem.GetLuckyItem(Blood: Integer): string;
begin
sdsItems.Filtered := True;
sdsItems.Filter := 'ID = ' + IntToStr(Blood);
sdsItems.Open;
end;
次は、データを読み込む部分よね。FindFirstメソッドでデータが見つかったらTrue、見つからなかったらFalseになります。データは、項目コンポーネントを設定してあるから、「sdsItemsITEM」コンポーネントの「AsString」プロパティで調べて、「Result」に代入すればいいわ。見つからなかったときは「データが見つかりません。」とすればメッセージにできるわね。最後にデータセットを閉じて、完成ね。
function TdmdLuckyItem.GetLuckyItem(Blood: Integer): string;
begin
sdsItems.Filtered := True;
sdsItems.Filter := 'ID = ' + IntToStr(Blood);
sdsItems.Open;
if sdsItems.FindFirst then
Result := sdsItemsITEM.AsString
else
Result := 'データが見つかりません';
sdsItems.Close;
end;
できたら、ツールバーの[すべて保存]ボタンで保存しておきます。念のためにコンパイルもします。メニューバーの「プロジェクト(P)」の「UranaiServerをコンパイル(C)Ctrl+F9」をクリックします。エラーがでなければ完成です。
ラッキーアイテムの置き換え
次は、この関数を使わなくっちゃ。GetUranaiMessage関数で呼び出せばいいんだっけ。
高橋先生:その前に、変更しておく箇所があるんだ。データモジュールは必要になるまで作っちゃダメなんだよ。 |
ナッキー:作っちゃダメって、どういうことですか? |
高橋先生:プロジェクトソースを見てみよう。プロジェクトマネージャでUranaiServer.exeを右クリックして、「ソース表示(V)」で表示を切り替えるよ。中央辺りに Application.CreateForm(TdmdLuckyItem, dmdLuckyItem); の一文がある。CreateFormメソッドでデータモジュールを生成しているところなんだ。生成って覚えてる? |
ナッキー:えっと、メモリに準備するんでしたっけ? |
高橋先生:そうだね。でも、最初からデータモジュールを準備してしまうとエラーが出てしまう。そこで、この1行を削除しよう。 |
ナッキー:でもそれじゃ、データモジュールを使えなくなっちゃうんじゃないですか? |
高橋先生:必要なときすぐに作って、不要になったら破棄すればいいんだ。以前ビットマップオブジェクトを作ったけれど、同様にして作ればいいよ。オブジェクト変数を「TdmdLuckyItem」型で用意して、「Create」メソッドで生成する。パラメータには生成と破棄に責任を持つOwnerが必要だけれど、今回は「nil」としてOwnerなしということにしよう。そのかわり、関数の中で生成も破棄もきっちりやってね。 |
ナッキー:なんだか大変そうです。できるかな? |
|
とにかく、プロジェクトのコードを表示してコメントにしなくっちゃ。プロジェクトマネージャでUranaiServer.exeを右クリックして、「ソース表示(V)」で表示するコードを切り替えます。コードから「Application.CreateForm(TdmdLuckyItem, dmdLuckyItem);」を探してコメントにします。ついでにランダムなアイテムは使わないので「Randomize」もコメントにします。
begin
// Randomize;
Application.Initialize;
Application.CreateForm(TWebModule5, WebModule5);
// Application.CreateForm(TdmdLuckyItem, dmdLuckyItem);
Application.Run;
end.
次にGetUranaiMessage関数の中でデータモジュールを生成します。プロジェクトマネージャで「UranaiImpl.pas」をダブルクリックしてコードを表示します。表示が切り替わったら、GetUranaiMessage関数の実装部を探します。
不要な部分をコメントにします。「Lucky_No」変数と、「Random」関数を使っている部分、「Lucky_Item」変数への代入は不要なので「//」を行の先頭につけるか、「{ }」で囲みます。
function Turanai.getUranaiMessage(Blood: Integer): string; stdcall;
var
Blood_Type : string;
// Lucky_No : Integer;
Lucky_Item : string;
begin
case Blood of
1 : Blood_Type := 'A型';
2 : Blood_Type := 'B型';
3 : Blood_Type := 'O型';
4 : Blood_Type := 'AB型';
end;
// Lucky_No := Random(5);
// case Lucky_No of
// 0 : Lucky_Item := '携帯電話';
// 1 : Lucky_Item := '手紙';
// 2 : Lucky_Item := '鍵';
// 3 : Lucky_Item := 'デジカメ';
// 4 : Lucky_Item := 'チョコレート♪';
// end;
Result := Blood_Type + 'のあなた、ラッキーアイテムは' + Lucky_Item;
end;
次にデータモジュールを生成します。DBUnitユニットをUranaiImplユニットで使えるようにユニットの追加をする必要があるんですって。[ファイル(F)]メニューの「ユニットを使う(U)...」をクリックします。「ユニットの使用」ダイアログボックスで「DBUnit」を選択して[OK]ボタンをクリックします。

図19 ユニットの使用
これで、データモジュールの生成ができますね。変数「dm」を「TdmdLuckyItem」型で用意して、Createメソッドで生成します。Ownerは「nil」にするって言ってたわよね。太字部分を追加します。
function Turanai.getUranaiMessage(Blood: Integer): string; stdcall;
var
Blood_Type : string;
// Lucky_No : Integer;
Lucky_Item : string;
dm : TdmdLuckyItem;
begin
case Blood of
1 : Blood_Type := 'A型';
2 : Blood_Type := 'B型';
3 : Blood_Type := 'O型';
4 : Blood_Type := 'AB型';
end;
dm := TdmdLuckyItem.Create(nil);
// Lucky_No := Random(5);
(中略)
Result := Blood_Type + 'のあなた、ラッキーアイテムは' + Lucky_Item;
end;
生成できたら、さっき作った「GetLuckyItem」関数を使ってラッキーアイテムを調べます。パラメータには「GetUranaiMessage」関数の「Blood」パラメータをそのまま使います。取得した文字列を「Lucky_Item」変数に代入します。これでデータモジュールは必要ないので、「Free」メソッドというのを使って解放していいんですって。太字部分を追加します。
function Turanai.getUranaiMessage(Blood: Integer): string; stdcall;
var
Blood_Type : string;
// Lucky_No : Integer;
Lucky_Item : string;
dm : TdmdLuckyItem;
begin
case Blood of
1 : Blood_Type := 'A型';
2 : Blood_Type := 'B型';
3 : Blood_Type := 'O型';
4 : Blood_Type := 'AB型';
end;
dm := TdmdLuckyitem.Create(nil);
Lucky_Item := dm.GetLuckyItem(Blood);
dm.Free;
// Lucky_No := Random(5);
(中略)
Result := Blood_Type + 'のあなた、ラッキーアイテムは' + Lucky_Item;
end;
やっと、できましたね。ツールバーの[すべて保存]ボタンをクリックして保存しておきます。[プロジェクト(P)]メニューの「UranaiServerを再構築(B) Shift+F9」をクリックしてプロジェクトを再構築します。
いよいよFortuneWeb.exeでテストしてみます。UranaiServer.exeが更新されたのでWebサーバー用のフォルダにコピーします。Windowsのエクスプローラーなどでマイドキュメントの「Borland Studio Projects」にある「UranaiServer.exe」を「Inetpub」の「Uranai」フォルダに上書きでコピーします。
次にIISマネージャを起動します。デスクトップに作成したIISマネージャのアイコンやスタートメニューから起動したら、画面左側の一覧を[+]ボタンをクリックして、展開します。「規定のWebサイト(停止)」まで表示できたら、ツールバーで、黒い三角のアイコンが付いた[項目を開始します]ボタンをクリックします。

図20 サービスの開始
Delphiに戻って、「FortuneWeb」をテストしてみます。プロジェクトマネージャで「FortuneWeb.exe」をダブルクリックしてアクティブにします。「FortuneWeb.exe」の文字が太字に変わったらアクティブになっています。できたら、ツールバーの[実行]ボタンで実行します。フォームが表示できたら血液型のボタンをクリックしてメッセージを確認します。以前より少し時間がかかりますが、メッセージの内容がデータベースに登録したラッキーアイテムに変化しています。確認して「FortuneWeb.exe」を終了します。

図21 実行テスト
データベースなのでデータの変更も可能です。IBConsoleを起動して、「LUCKYITEM.DB」の「Tables」を選択して、「ITEMS」テーブルをダブルクリックします。「データ」タブをクリックして、ITEMフィールドに適当な項目を入力します。すべて入力できたら、画面下にある矢印のアイコンの付いた[データ更新]ボタンをクリックして、データベースに反映します。

図22 データ再入力
もう一度Delphiに戻って、「FortuneWeb」を実行してみます。血液型のボタンをクリックして、新しいラッキーアイテムが表示されることを確認します。

図23 新しいラッキーアイテム
大成功!では、最後にIISマネージャで[規定のWebサイト]を選択して「停止」ボタンをクリックします。それから、InterBaseサーバーもシャットダウンしておきましょうね。
ナッキー:やっとできました!これでラッキーアイテムを自由に変えられますね。お友達にはFortuneWeb.exeを配布するだけでいいんですね。 |
高橋先生:ちゃんと定期的にデータベースを更新しないとね。もしもデータベースの場所を変更するなら、TSQLConnectionに設定したデータベースの場所も変更しておこう。 |
ナッキー:Webサービスに挑戦してみましたが、私にもできるんだなぁって、びっくりです。 |
高橋先生:じゃあ、次回はブラウザからCGIを使う方法に挑戦してみようか。 |
ナッキー:ここまでできたんだから、きっとできますよね。がんばってやってみます。 |
|