ナッキーの「Turbo Delphiはじめて奮戦記」 - 第24回 CGIでブラウザからデータベースアクセス

By: Hitoshi Fujii

Abstract: Webサービスアプリはバッチリ動かせましたね。今度はブラウザからCGIを呼び出して、データベースアクセスをしてみます。

Hide image
nacky75

ナッキー

前回、データベースを変更すると、すぐに占い結果の内容を変更することができました。これでアップデートの手間が省けるんだけど、最初はプログラム配布が必要よねぇ。ブラウザのWebページから、占い結果を取得することはできないのかしら?

 

Hide image
takahashi75b

高橋先生

今度はWebサービスから離れて、CGIから直接データベースにアクセスしてみよう。ツールを使って簡単なWebページも作ろう。


    Webページ作成

占いのWebページを作るのよね。どんな風に作ればいいんだろう?教えて、高橋先生!

高橋先生:Webページは「HTML(HyperText Markup Language)」という言語を使って作ることができる。文字に「タグ」というしるしを付けて、Webページを表現しているんだ。タグの種類を勉強すればメモ帳でもWebページを作成することができる。

ナッキー:へぇ、それじゃあすぐに作ることができるんですね。

高橋先生:そうは言っても、始めから勉強するとそれなりの時間がかかるよ。今回はDelphiに付いているツールを使おう。

ナッキー:Webページを作るためのツールまで付いているんですか!びっくりです。

高橋先生:新規作成のとき使うオブジェクトリポジトリに入っている。もしも、使いやすいものが手元にあればそれを使用してもかまわないよ。今回はツールを使って作成して、興味があったらHTMLタグをもっと勉強してみるのもいいね。使い方を紹介するコンテンツはたくさんあるから、インターネットで検索してみるといい。

ナッキー:今は、とにかく作ってみたいな。付属のツールを使ってやってみます。

高橋先生:じゃあ、ホームページの[新規作成]ボタンで「Webドキュメント」カテゴリの「HTMLページ」を選択してみよう。

ナッキー:はーい!


では、Turbo Delphiを起動して、ツールバーの[新規作成]ボタンをクリックします。オブジェクトリポジトリが開いたら左欄の「項目カテゴリ(A):」で「Webドキュメント」を選択して、右欄の「HTMLページ」を選択して[OK]ボタンをクリックします。「Untitled1.htm」という仮のファイル名で新規作成できました。

Hide image
01新規作成

図01 新規作成

画面中央に「作業中のページはフローレイアウトモードで、オブジェクトはワープロ内でのように上から下に並べられます。~」と書かれています。入力すると、この文字は見えなくなります。文字だけなら、ワープロソフトを使うように入力すればいいんですって。この中央部分をクリックし、入力用のカーソルを表示してから、ためしに「あなたの血液型をクリックしてください」と、入力してみます。

Hide image
02文字の入力

図02 文字の入力

文字が小さいので少し大きくしてみましょう。入力した文字全体を選択して、「3」と表記されているサイズ変更コンボボックスで「6」に変更します。

Hide image
03フォントサイズ変更

図03フォントサイズ変更

サイズを変更すると長くなるので、途中で改行を入れます。「血液型を」と「クリック」の間で[Enter]キーを押して改行します。

Hide image
04改行

図04 改行

それから中央に配置します。文字全体を選択して、ツールバーの[中央に揃える]ボタンをクリックします。

Hide image
05中央配置

図05 中央配置

こんな感じで作成できるなら簡単ね。次は血液型を表示すればいいわ。

高橋先生:血液型を表の中にひとつずつ入れると、きれいに並べられると思うんだ。2×2の4つのマス目を持つ表を中央に配置しよう。ここではマス目のことを「セル」と呼ぶよ。

ナッキー:どうやって表を挿入するんですか?

高橋先生:ツールバーの[TABLEタグの挿入]ボタンをクリックすると「TABLEタグの挿入」ダイアログボックスが表示されるよ。必要な項目は「行(R):」「列(C):」「幅(W):」「高さ(H):」「文字配置(L):」「境界サイズ(Z):」「テキスト位置揃え(T):」。

ナッキー:ふーん。ダイアログボックスで設定ができるんですね。


表を挿入します。文の末尾にカーソルを置いて、改行を入れておきます。次にツールバーの右上にある[TABLEタグの挿入]ボタンをクリックして、「TABLEタグの挿入」ダイアログボックスを表示します。2×2の表を挿入するので「行(R):」と「列(C):」に「2」を入力します。次に表のサイズを設定します。「テーブル属性」の「幅(W):」に「250」、「高さ(H):」に「100」を入力します。さらに、表に入力した文字をセルのちょうど中央に配置したいので、「文字配置(L):」に「center」、「セル属性」の画面右下部で「テキスト位置揃え(T):」に「middle」を設定します。表の枠線をはっきり見えるように太くします。テーブル属性の右中央で「境界サイズ(Z):」に「3」を入力します。確認して、[OK]ボタンをクリックします。

Hide image
06TABLEタグの挿入

図06 TABLEタグの挿入

TABLEタグの挿入

項目

設定値

行(R)

2

列(C)

2

幅(W):

250

高さ(H)

100

文字配置(L)

center

テキスト位置揃え(T)

middle

境界サイズ(Z)

3


Hide image
07TABLEタグの挿入ダイアログ

図07 TABLEタグの挿入ダイアログボックス

表が挿入されました。それぞれのセルに「A型」「B型」「O型」「AB型」と入力します。入力ができたら、セルの境界線をマウスで調整します。だいたい同じ大きさになればOKですって。うまく、マウスで移動できない場合は、セルにカーソルを置いてから、オブジェクトインスペクタ「プロパティ」ページの「width」プロパティに「120」と入力します。

Hide image
08幅調整

図08 幅調整

セルに色を付けます。「A型」のセルにカーソルを置いて、プロパティページの「bgcolor」プロパティで[ダイアログ](…) ボタンをクリックします。「色のセレクタ」ダイアログボックスが表示されますので、お好きな色を選択します。同じようにして、「B型」「O型」「AB型」のセルにも背景色を設定します。

ほかに、フォントを変更したり文字の色を変えたりしても、いいんですって。見た目はこれでOKね。

高橋先生:次はリンクの作成だね。

ナッキー:リンクってクリックすると次の画面に移る設定ですよね。プログラムのイベントみたいにプログラムを書いているんですか?

高橋先生:タグを記述するだけだよ。文字を<A HREF=”アドレス”>と</A>で挟むんだ。でも、ツールバーの[リンクの作成]ボタンを使えば、「ハイパーリンク」ダイアログボックスにアドレスを入力するだけでいいよ。リンク先は、これから作成する「ResultPage.exe」というCGIにしよう。CGIが完成したらEXEファイルを、Webサービスを置いたUranaiフォルダに置くことにするよ。

ナッキー:なーんだ、ちゃんとボタンが用意されているんですね。

高橋先生:1つ注意してほしいことがある。「ハイパーリンク」ダイアログボックスにはアドレスだけでなく、どの血液型かということも含めてほしい。「?」のうしろに「Blood=血液型」を追加しよう。「?Blood=A」や「?Blood=B」のように記述する。そうするとCGIの中で、「?」の後ろに付けた「Blood」という名前で中に入っている値を扱うことができるんだ。「ResultPage.exe?Blood=A」のように書いて。

ナッキー:「A型」という文字をクリックしたら「A」という文字をCGIで取得できるってことですね。それならCGIの中で、処理を分岐することができますね。CGIの中では「Blood」っていう変数として扱うのかしら?

高橋先生:「Blood」の値は、CGIの中で「Request.QueryFields.Values['Blood']」として扱うことができる。

ナッキー:ちゃんと読み込む方法があるんですね。じゃあ、リンクを設定してみます。


血液型をクリックしたら占い結果を表示するように、リンクを設定します。リンク先は、これから作成する「ResultPage.exe」というCGIです。保存先はInetpubのUranaiフォルダなので、インターネット上では「http://localhost/Uranai/ResultPage.exe」というアドレスになります。ただし今回のように、Webページの.htmファイルとCGIが同じサーバーに配置されている場合には、先頭の http://localhost/Uranai/ の部分は省略可能なんですって。それから、どの血液型を選択したか、CGIに知らせるために「?Blood=A」のように「?Blood=血液型」で付け加えます。

リンクの設定には、設定する文字列を選択してツールバーの[リンクの作成]ボタンをクリックします。「ハイパーリンク」ダイアログボックスが表示されたら、「種類(T):」が「http:」となっていることを確認して、「URL(U):」に

ResultPage.exe?Blood=A

と入力します。できたら[OK]ボタンをクリックします。同じようにして、「B型」「O型」「AB型」を設定します。

Hide image
09リンクの作成

図09 リンクの作成

やっと完成しましたね。名前をつけて保存します。ツールバーの[保存]ボタンをクリックして、「Uranai.htm」というファイル名で保存します。

Hide image
10Uranaiページ完成

図10 Uranaiページ完成

高橋先生:同じようにして、もう1つWebページを作成して。

ナッキー:やっとできたと思ったのに、もう1つ作るんですか?

高橋先生:今度は、結果を表示するためのWebページを作って欲しい。

ナッキー:は~い。復習だと思ってがんばります。


では、同じようにしてもう1つ作ります。ツールバーの[新規作成]ボタンをクリックします。オブジェクトリポジトリが開いたら、左欄の「項目カテゴリ(A):」で「Webドキュメント」を選択して、右欄の「HTMLページ」を選択して[OK]ボタンをクリックします。

画面中央に「A型のあなたの(改行)ラッキーアイテムは」と入力します。全体を選択して文字サイズを変更します。ツールバーのサイズ変更コンボボックスで「6」を入力します。さらに中央に揃えるため、[中央に揃える]ボタンをクリックします。改行して新たな行に表を挿入します。今回はセルを1つにします。[TABLEタグの挿入]ボタンをクリックしたら、「行(R):」と「列(C):」に「1」を入力します。表のサイズを設定します。「幅(W):」に「220」、「高さ(H):」に「55」を入力します。さらに、表に入力した文字をセルのちょうど中央に配置したいので、「文字配置(L):」に「center」、「テキスト位置揃え(T):」に「middle」を設定します。表の枠線をはっきり見えるように太くします。「境界サイズ(Z):」に「3」を入力します。色もつけておきます。「Background Color:」の[ダイアログ](…)ボタンをクリックしてお好きな色を選んで、[OK]ボタンをクリックします。「TABLEタグの挿入」ダイアログボックスに戻ったら、すべての設定を確認して[OK]ボタンをクリックします。

TABLEタグの挿入

項目

設定値

行(R)

1

列(C)

1

幅(W):

220

高さ(H)

55

文字配置(L)

center

テキスト位置揃え(T)

middle

境界サイズ(Z)

3

Background Color

お好きな色


表の中に「オムライス」と入力して完成ですね。名前をつけて保存しておきます。ツールバーの[保存]ボタンをクリックして、「Result.htm」というファイル名で保存します。

Hide image
11Resultページ完成

図11 Resultページ完成

    CGIの作成

何とかWebページが作成できました。次は占い結果を表示するCGIを作成します。CGIってどうやって作るんだったっけ?教えて、高橋先生!

高橋先生:以前はWebサービスの実行形式としてCGIを選択したけれど、今回はWebページの実行形式としてCGIを選択するよ。新規作成のオブジェクトリポジトリで「WebBroker」カテゴリを選択して「Webサーバーアプリケーション」をクリックする。途中のダイアログボックスは「CGI実行形式(C)」を選択してね。

ナッキー:オブジェクトリポジトリにCGIって書いてあるわけじゃないんですね。


間違えないようにしないとね。さっそく、作ってみます。まずツールバーの[新規作成]ボタンをクリックします。左欄の「項目カテゴリ(A):」で「WebBroker」を選択します。次に右欄に表示された「Webサーバーアプリケーション」を選択して、[OK]ボタンをクリックします。ダイアログボックスでは「CGI実行形式(C)」を選択してっと。

Hide image
12Webサーバーアプリケーショ

図12 CGI実行形式を選択

画面が切り替わったわ。あれ、さっきの「Uranai.htm」や「Result.htm」は?

高橋先生:大丈夫だよ。保存しておいたから「Borland Studio Projects」にあるはずだよ。プロジェクトにファイルを追加すればいいよ。ツールバーの[プロジェクトに追加 (Shift+F11)]をクリックして「プロジェクトに追加」ダイアログボックスを表示しよう。

ナッキー:一覧に「Uranai.htm」や「Result.htm」がありません。

高橋先生:ファイルの種類が異なっていないかな?「ファイルの種類(T):」で「すべてのファイル(*.*)」を選択してから、探してみて。

ナッキー:あ、ありました!

高橋先生:ついでに、前回作成した「DBUnit.pas」も追加しておこう。作成した「GetLuckyItem」関数を使ってラッキーアイテムを取得する。

ナッキー:Webサービスのために作成したのに、CGIで使うことができますか?

高橋先生:データベースを使ってラッキーアイテムを探すユニットだったね。InterBaseを起動してから開けば大丈夫だよ。作成した関数はどこでも使うことができるよ。

ナッキー:先にInterBaseを起動するんですね。気をつけます。


では、InterBaseから起動します。Windows OSのスタートメニューで「Borland InterBase 7.5 Developer [instance = gds_db]」の「InterBase サービスマネージャー [instance = gds_db]」を起動します。

起動したら「ステータス(T)」欄に、「InterBaseサーバーは停止中」と表示しているのを確認して、[起動(S)]ボタンをクリックします。

プロジェクトにユニットを追加します。ツールバーの[プロジェクトに追加]ボタンをクリックして「DBUnit.pas」を選択します。[開く(O)]ボタンをクリックしたらユニットが追加できます。そのときもしも「接続エラー」が表示されたら、InterBaseサーバーがうまく起動していません。確認して起動します。一度接続が切れた状態になるとSQLConnection1コンポーネントの接続が切れた状態になります。この場合は、「データベース」カテゴリの「Connection」を「True」に設定しておきます。

高橋先生:やっと準備ができたね。次はCGIの作成だ。新しく作成したプロジェクトにはデータモジュールのようなユニットが付いている。これはWebモジュールという特殊なユニット。

ナッキー:データモジュールって、以前データベース用のコンポーネントを置くために用意した土台でしたよね。

高橋先生:そうそう。でもこれはWebモジュールだから、ちょっとだけ違うよ。CGIが呼び出されたときに、動かすイベントハンドラは「Actions」プロパティに登録する。

ナッキー:イベントハンドラの登録ってプロパティに設定するんですか?

高橋先生:「Actions」プロパティに直接イベントを作るのではないんだ。「Actions」プロパティにアクション項目を登録して、アクション項目のイベントハンドラに動作を記述する。

ナッキー:なーんだ。「Actions」プロパティにイベントを登録するのではないんですね。

高橋先生:DBUnitに作った関数を使ってラッキーアイテムを取得するから、DBUnitを使用するように設定するのを忘れないで。作成したWebページから送られるのは「A」や「AB」といった文字列だ。関数のパラメータは数値だから、「A」→「1」のように置き換えよう。DBUnitは自動生成してはいけなかったね。プロジェクトソースで削除しておく。

ナッキー:そのままでは使えないんですね。いろいろ気をつけまーす。


Webモジュールがあるユニットを表示します。デザインの画面であることを確認します。画面左下のオブジェクトインスペクタ、「プロパティ」ページの「その他」カテゴリで「Actions」プロパティの[ダイアログ](…)ボタンをクリックします。

Hide image
13Actionsプロパティ

図13 Actionsプロパティ

そうすると「Actionの編集」ダイアログボックスが表示されます。ダイアログボックスの中のツールバーに[新規追加(Ins)]ボタンがあるので、クリックします。

Hide image
14新規追加ボタン

図14 新規追加ボタン

次にイベントを作成します。作成したアクション項目を選択して、オブジェクトインスペクタを「イベント」ページに切り替えます。イベントは「OnAction」だけです。ダブルクリックしてイベントハンドラを作成します。「Actionの編集」ダイアログボックスは[閉じる]ボタンをクリックして終了しておきます。

コードエディタに切り替わったら、さっきプロジェクトに追加した「DBUnit」のユニットを追加します。「ファイル(F)」メニューの「ユニットを使う(U)...Alt+F11」を選択します。「ユニットの使用」ダイアログボックスが表示されたら、「DBUnit」が選択されていることを確認して、[OK]ボタンをクリックします。

Hide image
15ユニットの使用

図15 ユニットの使用

ユニットを追加したら、先ほど作成したイベントハンドラに戻ります。関数を呼ぶために、データモジュールを生成します。そのため「dm」関数を「TdmdLuckyItem」型で作ります。他に血液型を入れておくための「Blood_Type」変数をstring型で、関数のパラメータで使うために血液型を数値で表した「Blood_ID」変数をInteger型で、取得したラッキーアイテムを入れる「Blood_Item」変数をstring型で用意します。コード上に「WebModule2」と表記されていますが、末尾の数値は異なっていてもかまいません。太字部分を追加します。

procedure TWebModule2.WebModule2WebActionItem1Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  dm : TdmdLuckyItem;
  Blood_Type : string;
  Blood_ID : Integer;
  Blood_Item : string;
begin

end;

Webページから送られてきた血液型をBlood_Type変数に代入して、数値に変換するコードを記述します。太字部分を追加します。

procedure TWebModule2.WebModule2WebActionItem1Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  dm : TdmdLuckyItem;
  Blood_Type : string;
  Blood_ID : Integer;
  Blood_Item : string;
begin
  Blood_Type := Request.QueryFields.Values['Blood'];

  if Blood_Type = 'A' then
    Blood_ID := 1
  else if Blood_Type = 'B' then
    Blood_ID := 2
  else if Blood_Type = 'O' then
    Blood_ID := 3
  else if Blood_Type = 'AB' then
    Blood_ID := 4
  else
    Blood_ID := 0;
end;

これで、関数に使うパラメータが用意できました。データモジュールを生成して関数を呼び出します。太字部分を追加します。

procedure TWebModule2.WebModule2WebActionItem1Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  dm : TdmdLuckyItem;
  Blood_Type : string;
  Blood_ID : Integer;
  Blood_Item : string;
begin
  Blood_Type := Request.QueryFields.Values['Blood'];

  if Blood_Type = 'A' then
    Blood_ID := 1
  else if Blood_Type = 'B' then
    Blood_ID := 2
  else if Blood_Type = 'O' then
    Blood_ID := 3
  else if Blood_Type = 'AB' then
    Blood_ID := 4
  else
    Blood_ID := 0;

  dm := TdmdLuckyItem.Create(nil);
  Blood_Item := dm.GetLuckyItem(Blood_ID);
  dm.Free;
end;

これで、ラッキーアイテムを取得できたわ。そうそう、DBUnitの自動生成をコメントにするんだったわね。プロジェクトソースを開きます。プロジェクトマネージャで「Project5」を右ボタンクリックします。末尾の数字は異なっていてもかまいません。メニューから「ソース表示(V)」をクリックします。表示できたら「TdmdLuckyItem」を生成している部分をコメントにします。

begin
  Application.Initialize;
  Application.CreateForm(TWebModule2, WebModule2);
  //  Application.CreateForm(TdmdLuckyItem, dmdLuckyItem);
  Application.Run;
end.

あとはWebページに表示するだけね。あ、でもどうやって表示するの?教えて、高橋先生!

高橋先生:コード上でWebページを作れば、中に取得したラッキーアイテムを埋め込むことができるよね。さっき、作った「Result.htm」のソースコードを使って作成しよう。HTMLタグを記述する前に文書の種類を特定するために、この1行からはじめよう。

Response.ContentType := 'text/html';

そして、HTMLタグは「Response.Content」に文字列として代入して使う。

ナッキー:え?そのコードを実行するとWebページができちゃうの?びっくりです。

高橋先生:「Result.htm」のソースコードを表示するには、プロジェクトに追加するか、エクスプローラで「Result.htm」ファイルを右ボタンクリックして、「編集(E)」を選択するとコードが表示される。プロジェクトに追加した場合は、開いてコードエディタを表示すればソースコードが表示できるよ。

ナッキー:まさか、ソースコードをコピーして使うんじゃないですよね。

高橋先生:それそれ。コピーして使ったら簡単だよ。あとは文字が入っているところに変数などを使って可変にすればいい。


プロジェクトに「Result.htm」を追加します。ツールバーの[プロジェクトに追加 (Shift+F11)]をクリックして「プロジェクトに追加」ダイアログボックスを表示します。「ファイルの種類(T):」を「すべてのファイル*.*」に変更してファイルを探します。「Result.htm」ファイルを選択して、[開く(O)]ボタンをクリックします。プロジェクトマネージャで「Result.htm」をダブルクリックして開きます。デザインの画面が表示されますので、「コード」タブをクリックして、コードエディタに切り替えます。全体を選択してコピーしておきます。

もう一度、Webモジュールのコードエディタに戻ります。文書の種類を指定する「Response.ContentType := 'text/html;」を記述して、「Response.Content」にコピーしたHTMLタグを代入します。「A型」と表記しているところを「Blood_Type」、「オムライス」を「Blood_Item」に置き換えて、前後を「'」と「+」でつなげます。文が長くなるので、「ヘッダー」と「ボディ」、それから、ヘッダーの<HTML>を閉じるフッターといわれる部分に分けておきましょう。strHeader変数とstrBody変数、strFooter変数を用意して、それぞれに代入します。変数宣言3つと、タグの代入を記述します。太字部分を追加します。

procedure TWebModule2.WebModule2WebActionItem1Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  dm : TdmdLuckyItem;
  Blood_Type : string;
  Blood_ID : Integer;
  Blood_Item : string;
  strHeader : string;
  strBody : string;
  strFooter : string;
begin
  Blood_Type := Request.QueryFields.Values['Blood'];

(中略)

  Response.ContentType := 'text/html';
  strHeader := '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 '
+ 'Transitional//EN"><html><head><title></title></head>'; strBody := '<body><p align="center"><font size="6">' + Blood_Type
+ '型のあなたの<br>ラッキーアイテムは</font></p>'
+ '<p align="center"></p>'
+ '<table cellspacing="1" cellpadding="1" width="220" border="3" align="center" height="55" bgcolor="#ffff99">'
+ '<tr><td bgcolor="#ffff99">'
+ '<p align="center">' + Blood_Item + '</p></td></tr>'
+ '
</table></body>'; strFooter := '</html>'; Response.Content := strHeader + strBody + strFooter; end;

これで完成です。保存して再構築してみます。ツールバーの[すべて保存]ボタンをクリックして保存します。ユニットは「ResultUnit」、プロジェクトは「ResultPage」とつけます。保存できたら、「プロジェクト(P)」メニューの「ResultPageを再構築(B)」をクリックします。エラーが出なければOKです。

    CGIのテスト

できたら、テストしてみたいですよね。でもテストの仕方がよくわかりません。教えて、高橋先生!

高橋先生:まず、使うファイルを「Inetpub」の「Uranai」フォルダにコピーしよう。次にIISの起動。そしてブラウザで「Uranai.htm」を表示してみよう。

ナッキー:Webページから呼び出すからブラウザでテストするんですね。


では、エクスプローラで「Uranai.htm」と「ResultPage.exe」を「Inetpub」の「Uranai」フォルダにコピーします。次に、IISマネージャを起動します。デスクトップに作成したIISマネージャのアイコンやスタートメニューから起動したら、画面左側の一覧を[+]ボタンをクリックして、展開します。「規定のWebサイト(停止)」まで表示できたら、ツールバーで、黒い三角のアイコンが付いた[項目を開始します]ボタンをクリックします。

Hide image
16サービスの開始

図16 サービスの開始

開始できたらブラウザを起動します。「アドレス(D)」欄に「http://localhost/Uranai/Uranai.htm」と入力して[Enter]キーを押します。うまく表示できましたか?

Hide image
17Uranai_htm表示

図17 Uranai.htm表示

できたら、次は血液型を選んでクリックします。CGIが働いて、Webページを作ってくれます。

Hide image
18ResultPage表示

図18 ResultPage表示

やった!うまく動きました。

ナッキー:なんとか動いてほっとしました。[実行]ボタンでテストしないと、なんだか不安です。動いてよかったぁ。

高橋先生:やり方さえ、わかれば今度も簡単だったんじゃないかな。

ナッキー:手順は簡単ですけど、仕組みはまだまだ難しいです。

高橋先生:ナッキーも基本を押さえてきたんだから、あとは経験だね。

ナッキー:そ、そうなんですかぁ?

高橋先生:たくさん、いろいろ挑戦してみるのが習得の近道なんだよ。

ナッキー:分かりました。

高橋先生:ナッキー、ということで次からは応用編にしようと思うんだけど。

ナッキー:え、「はじめて奮戦記」は終わりなの?

高橋先生:いつまでも、はじめてじゃないでしょ。応用編からは厳しくいくよ。

ナッキー:きゃー、お手やわらかに…。

高橋先生:はっはっは。


Hide image
nacky75

ということで、わたくしナッキーこと佐竹那月の「Turbo Delphiはじめて奮戦記」は、今回をもって終了とさせていただきます。次回からは、もっと厳しくなった高橋先生に鍛えられる応用編に突入するそうです。大丈夫かなぁ。


ナッキーの「Turbo Delphiはじめて奮戦記」

Prev | Index




Server Response from: ETNASC04