著作権の保護期間延長に反対します

2002年2月22日作成 2002年4月11日更新

Delphi 6 Personal

ここは、 Windows でのプログラム経験が無いおれが、Delphi 6 Personal を使ってみながら、メモをつけるところだ。

Delphi 付属のヘルプにある、チュートリアルを読みながら、テキストエディタを作ってみようとしたが、Personal版に無いコンポーネントが使われていて、訳がわからない。

あきらめて、適当に簡単な実習をして行く事にした。


Delphi というのは、Borland社が提供している製品で、Object Pascal という言語を使った開発環境だ。フォームに部品をペタペタと貼り付けて、イベントに対応するコードをちょこちょこと書けば、windowsアプリケーションを作ることができる。

Object Pascal っていう、聞きなれない(かもしれない)言語を使うが、概念はCとそれほど変わらないので、「Pascal なんてシラネーヨ」というばあいでも、抵抗無く使えるように思う。

この、なかなか便利な Delphi の Personal版が無料でダウンロードして使うことができるのだから、ありがたく使わせていただこうってことだ。


とりあえず使ってみる

まず、ボタンを押したらBeep音が鳴るアプリケーションを作ってみて、Delphiの大まかな使い方を学んでみる事にする。

Delphi 6 を立ち上げたところ とりあえず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 と 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);

実行してテキストファイルを読み込んでみよう。ちゃんと表示されるはずだ。


実験中…


webmaster@kyoutan.jpn.org

('A`)