2002年2月22日作成 2002年4月11日更新
ここは、 Windows でのプログラム経験が無いおれが、Delphi 6 Personal を使ってみながら、メモをつけるところだ。
Delphi 付属のヘルプにある、チュートリアルを読みながら、テキストエディタを作ってみようとしたが、Personal版に無いコンポーネントが使われていて、訳がわからない。
あきらめて、適当に簡単な実習をして行く事にした。
Delphi というのは、Borland社が提供している製品で、Object Pascal という言語を使った開発環境だ。フォームに部品をペタペタと貼り付けて、イベントに対応するコードをちょこちょこと書けば、windowsアプリケーションを作ることができる。
Object Pascal っていう、聞きなれない(かもしれない)言語を使うが、概念はCとそれほど変わらないので、「Pascal なんてシラネーヨ」というばあいでも、抵抗無く使えるように思う。
この、なかなか便利な Delphi の Personal版が無料でダウンロードして使うことができるのだから、ありがたく使わせていただこうってことだ。
まず、ボタンを押したらBeep音が鳴るアプリケーションを作ってみて、Delphiの大まかな使い方を学んでみる事にする。
とりあえずDelphi 6 を立ち上げてみる。なんだか、ソースコードらしきものが表示されているが、まあ気にしない事にする。
このまま、ファイル−プロジェクトに名前を付けて保存 を実行して、プロジェクトの保存場所を決めよう。今回は G:\delphi\ボタンを押すとBeep\ にでも保存する事にする。
実行すると、Unit1 に名前を付けて保存 ダイアログが出てくる。特に名前を変更する必要も無いので(本当ならプログラムの内容に見合った名前を付けるべきだ)、このまま先ほどのフォルダに保存する。
次に Project1 に名前を付けて保存 ダイアログが出てくるので、ここも名前を変えずに、このまま保存してしまいまおう。(もちろん、好みに応じて名前を変えてもかまわない)
ここからが本題だ。フォームにボタンを一つ貼り付けてみよう。
コンポーネントパレットの Standard に Button があるので、それをダブルクリックすると、フォームにボタンが現れる。このボタンは自由に移動できるので、好きな位置に配置しよう。
続いて、このボタンが押された時の処理を書くわけだが、どこに書いたらいいんだろう? なんて心配はない。
フォーム上でこのボタンを選択した状態で、オブジェクトインスペクタのイベントタブの中の OnClick をダブルクリックすると、テキストエディタが前に出てきて、コードを追加すべき場所にカーソルが移動する。ここに処理を記述すればよいわけだ。今回はBeep音を出したいので Beep; と書けばよい。
これで完了だ。
実行ボタンを押してみよう。
ボタン一つだけの味気ないウインドウが開くはずだ。ボタンを押してみよう。音が出るだろう? 完成だ。
ではこんどは、ボタンを押すと文字を表示するようにしてみよう。
文字を表示するには、まず、表示する場所を確保しなければならないが、何を使ったらいいのだろう? と、コンポーネントパレットを見てみると、Label っていうのが一番単純そうなので、これを使う事にする。さっそくフォームに Label をはりつけてみるが、このラベルに文字を表示させる方法がわからない。
解らない事があったら、まず、Helpを読む事だ。フォームか、オブジェクトツリーで Label1 を選択した状態で F1 キーを押すと、Label のヘルプが開くので、使い方のところを読んでみると、Caption プロパティっていうのを書き換えれば、好きな文字列を表示できそうだという事がわかる。
では、さっそくコードを追加してみよう。
さきほど Beep; と書いた次の行に、 Label1.Caption:='表示させたい文字'; と書けばよい。
実行したところ。
(Label1と表示させたくなければ、あらかじめオブジェクトインスペクタでLabel1のCaptionプロパティを空白にしておけばよい。)
ボタンを押すと、「こんちわ」と表示される。
これで、Delphi でのプログラムの流れは、だいたいつかめたのではないだろうか。あとは、Help で Object Pascal 言語ガイドの「構文の要素」あたりをながめて、Pascal の書き方を把握して、必要に応じて VCL リファレンスヘルプ を見とけば、間に合いそうだ。
んじゃ、タイマでも使って、立ち上げたら勝手に動くものを作ってみようか。単純なところで、一定時間ごとにカウントアップしてゆくものって事にしよう。
まず、新しくプロジェクトを作って、フォームに Timer と Label を貼り付ける。
ここで、貼り付けた Timer を選択した状態で、オブジェクトインスペクタのイベントタブを開き、 OnTimer をダブルクリックして、コードを追加するわけだが、整数型の変数を用意して、カウンタとして使うのだが、Label の Caption プロパティを使って表示させるには、カウンタの変数の内容を文字列に変換しなければならない。ヘルプで調べてみると、VCLリファレンスヘルプのルーチン一覧(カテゴリ別)の数値形式ルーチンに IntToStr という、整数を文字列に変換してくれる関数があったので、これを使えばよいだろう。
実際に書いて見ると
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
Label1: TLabel;
procedure Timer1Timer(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
count: Integer = 0; // 整数型のグローバル変数(count)の宣言と初期化
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Caption:=IntToStr(count); // count 変数の内容を表示
count:=count+1; // count 変数に1加える
end;
end.
こんな感じになった。コメントを付けた3行だけが、実際に書いたところだ。その他の部分には触れていない。カウント用の変数は、タイマールーチンから抜けた後も、内容を保持する必要があるので、グローバル変数にしてみた。(というか、ローカル変数を使うと期待通りの動作にはならない)
これで完成なので、早速実行してみよう。1秒ごとに数字が増えて行くとおもう。増える速さ(タイマーイベントが発生する間隔)は、 Timer の Interval プロパティで変更することができる。1/1000秒単位で指定するので、1000(初期値)で1秒間隔、500で0.5秒間隔となる。実際にオブジェクトインスペクタで変更して、動作を確かめてみるとよいだろう。
こんどは、もうちょっと Windows アプリケーションっぽいものを作ってみよかね。ってことで、テキストファイルを表示させてみる事にする。
まず、フォームを作るが、とりあえず文書を表示させる場所に、Memo を使ってみることにする。フォームに Memo を貼り付けて、Align プロパティを alClient に変更して、Memo をフォームいっぱいに広げる。
次にファイルを開く為に、MainMenu を使ってみる事にする。MainMenu をフォームに貼り付けたら、貼り付けた MainMenu をダブルクリックして、メニューデザイナを開き、テンプレートを挿入−ファイルメニューを選びメニューを追加する。
ここで、いったん実行してみようか。
実行すると、見た目だけはけっこう立派なアプリケーションが表示される。ファイルをクリックすれば、ファイルメニューが表示される。ちょっと感動だ。
しかし、当たり前だが、メニュー内のどの項目を選択しても何も反応が無い。その処理をこれから書いてゆくわけだ。
最初に、簡単そうな終了処理を書いてみようか。
メニューなんかの処理を書くときに、メニューオブジェクトのイベントに直接記述してもかまわないのだが、そうしてしまうとおなじ処理を別の場所から(例えばツールバーとか)呼び出すのが困難になる。(ほんとかな? あんまり解ってない)
そこで、アクションリストというコンポーネントを使って、処理をまとめておいて、メニューやボタンなどからは、アクションリストの中の処理を指定するようにするといいようだ。
ということなので、実際にやってみよう。
フォームにアクションリストを貼り付け、貼り付けたアクションリストをダブルクリックして、アクションリストエディタを開く。ここで、標準アクションの新規追加を選び、ファイル−TFileOpen を選んで追加する。同じように TFileExit も追加する。
次に MainMenu の終了処理に アクションリストの終了処理を指定する。オブジェクトツリーで、MainMenu1−ファイル−終了を選択し、オブジェクトインスペクタのイベントタブの Action の項目の右の▼をクリックすると、アクションリストに追加した項目が現れるので、その中から FileExit1 を選択する。
最後に、実際の終了処理を書く。オブジェクトツリーでアクションリストの FileExit1 を選択し、イベントのところをダブルクリックすると、終了処理を書くべき場所が開くので、そこにコードを追加するわけだが、どう書いたらよいのだろう? Help で調べてみると、VCLリファレンスに TCostomForm.Close っていうのがあって、この Close メゾッドっていうのを使う事で、フォームを閉じる事ができるようだ。これでメインフォームを閉じる事で、アプリケーションは終了すると書いてあるので、これを使えば良いようだ。
Close;
と書いたら、早速実行してみよう。ファイル−終了 で、終了できるようになったはずだ。
次はあれだ、ファイル−開く の処理を作ってみよう。
ファイル−閉じる 処理の時と同じように、MainMenu1−ファイル−開く の Action イベントに FileOpen1 を選択する。これで、ファイル−開く を実行すると、ファイルオープンダイアログが開くようになる。このダイアログで得られたファイル名を利用して、ファイルを読み込むわけだ。
アクションリストの FileOpen1 の OnAccept イベントをダブルクリックすると、ファイルの読み込み処理を記述すべき場所にカーソルが移動するが、どう書いたらよいのだろうか?
Tmemo オブジェクトのヘルプを見ると、Lines プロパティってのがあるが、これは、 TStrings オブジェクトから継承されているようなので、TStrings オブジェクトのヘルプを見てみる、TStrings オブジェクトには、LoadFormFile メソッドがあって、これを使えばテキストファイルを読み込めるようだ。
ファイルオープンダイアログで得られたファイル名は、どうやって参照したらよいだろうか? FileOpen1 の OnAccept イベントのヘルプを見てみると、Dialog プロパティで参照できるようだ。
(これを調べるのにずいぶん時間かかったよ。まだ、ヘルプの読み方がよくわかってないんだよ。もう。)
要するにこう書けってことだ。
Memo1.Lines.LoadFromFile(FileOpen1.Dialog.FileName);
実行してテキストファイルを読み込んでみよう。ちゃんと表示されるはずだ。
実験中…
('A`)