GO BACK

Delphi教室 その4


「コンポーネントの操作」


■位置と大きさを変更する


 プログラムでは、コンポーネントの状態を操作することで表示などを変更することがよくあります。先にEditコンポーネントでやったように、テキストの表示を変更したりするだけでなく、表示の位置や大きさ、各種の性質変更などもやっぱりコンポーネントに用意されているプロパティを操作することで行ないます。そこで、主なプロパティとその操作法について説明していくことにしましょう。

 まずは、位置と大きさからです。コンポーネントの位置と大きさは、以下のような整数値のプロパティで用意されています。

Top――コンポーネントの縦位置

Left――コンポーネントの横位置

Width――コンポーネントの横幅

Height――コンポーネントの縦幅

 これらを取り出せば現在の位置や大きさがわかりますし、変更すればその場で位置や大きさが変わります。実際に簡単なサンプルを作ってみましょう。

 
procedure TForm1.Button1Click(Sender: TObject);  
var
  h,w: Integer;

begin
	w := Button1.Width;
	h := Button1.Height;
  Button1.Width := h;
  Button1.Height := w;
end;

 

 これは、Button1の縦幅と横幅を入れ替えるプロシージャです。Button1のOnClickに設定して使います。プロジェクトを実行してボタンをクリックすると、その度にボタンの縦横の大きさが入れ代わります。

 このように、整数のプロパティは、単純に値を計算して設定したりするだけで操作できるので非常に便利です。他にもこうした整数のプロパティはありますから、調べてみると良いでしょう。

 

■表示色を変更する


 プロパティは、単純にテキストや整数で設定できるものばかりではありません。中には特別な値を必要とするものもあります。例えば、「色」です。

 色の値は、実をいえば整数なのです。が、適当に数字を指定しても思ったような色にすることはできません。色の値は、きちんと決まったフォーマットに従って記された値でないといけないのです。このため、「色の値として使える値」としてDelphiには「TColor」というタイプが用意されています。色は、このTColorの値を設定しないといけないのです。

 このTColorの値の利用法としては2つのやり方があります。まず、もっとも簡単なのは、Delphiにあらかじめ用意されている色の値を利用する方法。Delphiには、よく使われる色のTColorの値が用意してあるんですよ。それを使えば、単純に色を操作できるんです。主なものをあげておくと、こんな感じになります。

clNone, clAqua, clBlack, clBlue, clCream, clDkGray, clFuchsia, clGray, clGreen,
clLime, clLtGray, clMaroon, clMedGray, clMoneyGreen, clNavy, clOlive, clPurple,
clRed, clSkyBlue, clSilver, clTeal, clWhite, clYellow 

 これらの値を、色のプロパティに設定すれば、それだけでコンポーネントの色を変更することができます。例えば、以下のように実行すると、フォームの色がパープルに変更されてしまいます。

 Form1.Color := clPurple; 

 もう1つ、「RGBを指定して直接TColor値を作る」という方法もあります。これは、RGBという関数を利用します。この関数は、以下のような形で呼び出すと、TColorの値を得ることができます。

《TColorの変数》 := RGB( 赤の値 , 緑の値 , 青の値 );

 ()内の赤・緑・青の各値は、0〜255の整数で指定します。これを使えば、自由にTColorの値を作り、色を設定することができるわけです。「TColorの変数を用意して使う」というと、一体どうするんだ?と思うかも知れませんが、これは普通の整数などと同じようにvarでTColorというタイプのものを用意すればいいんですよ。

 では、これも簡単なサンプルを上げておきましょう。Edit1、Edit2、Edit3という3つのEditにそれぞれRGBの値を入力し、それを元にフォームの色を変更するサンプルを作ってみましょう。

 
procedure TForm1.Button1Click(Sender: TObject); 
var
	R,G,B: Integer;
	C: TColor;

begin
	try
		R := StrToInt(Edit1.Text);
		G := StrToInt(Edit2.Text);
		B := StrToInt(Edit3.Text);
		C := RGB(R,G,B);
		Form1.Color := C;
	except
		Beep;
	end;
end;

 

 これが、その例です。いかがです、色が自由に扱えるとなかなか面白いことができそうでしょう? テキストから数字を取り出すため、ここではtryを使って例外処理をしています。またexcept部分では「Beep」というのを実行していますが、これは文字通りビープ音(警告音)を鳴らす命令です。

 このTColorのように、Delphiでは整数やテキストといった繁用のもの以外のタイプの値がたくさん登場します。Object Pascalでは、比較的簡単に新しいタイプを作ることができるんです。このため、普通の整数やテキストで設定するのが難しいプロパティは、「ええい、オリジナルのタイプを作っちゃえ」とばかりに、どんどん独自のタイプを作ってしまってるんですね。

 このため、Delphiに慣れない内は「えっ、TColor? なに、この値は?」というように、見なれない値のタイプに出くわす度に立ち止まってしまいがちです。どんなものかよくわからなくとも、とにかく「どうやって値を利用すればいいのか」さえわかればちゃんと使えるのですから、最初の内は、あまり「その値の中身がどうなっているのか」ということは詮索しないで進みましょう。使い方だけ理解すればとりあえずOK、と割り切ってください。ある程度Delphiがわかってくれば、そうした特殊なタイプの中身も次第に見えくるはずですから。

 

■フォントとTFontオブジェクト


 TColorは、特別なタイプではあっても、要するに値を代入して使うやり方自体は普通の変数と変わりありません。が、中にはちょっと扱い方の違ったタイプのものもあります。それは「オブジェクト」の値です。

 オブジェクトというのは、要するに「さまざまな値や機能がひとまとめになったもの」といえばいいでしょうか。それ自身の中にさまざまなものが入っていて、それを呼び出したりして使うことのできるものなのです。ですから、ただの値というより、一つの独立したミニミニプログラムみたいなものをイメージしたほうがいいでしょう。

 プロパティの中には、このオブジェクトを値として設定するものもあります。その代表的な例が、フォントでしょう。フォント関係のプロパティは、全て「TFont」というオブジェクトが設定されています。この中に、フォント名やフォントのサイズ、フォントの表示色といった値などが入っているんです。これは、ボタンやフォームの中にさまざまなプロパティが入っているのと同じ感覚で考えると良いでしょう。(というより、ボタンやフォームも実はオブジェクトなんですけど・・)

 こうした「オブジェクト内のプロパティ」は、オブジェクト名の後にドットをつけてプロパティ名を記述して指定できます。――例えば、Edit1コンポーネントのフォントのサイズを変更するにはどうしたらいいか考えてみましょう。Editコンポーネントのフォントは、「Font」というプロパティとして用意されています。そしてフォントサイズは、後述しますが「Size」というプロパティとして用意されています。ということは、Edit1のフォントサイズを変更するには、

Edit1.Font.Size := 24;

こんな感じで書けばいいことになります。わかりますか? Fontプロパティにフォントのオブジェクトがあって、その更に中にSizeプロパティがあるわけですから、「Edit1.Font.Size」というように、順番にドットで区切って記述した形になるわけです。

 では、TFontオブジェクトの中に入っている主なプロパティをざっと整理しておきましょう。

Name――フォント名。Stringで設定する

Size――フォントサイズ。整数で設定する

Color――テキストカラー。TColorで設定する

Style――フォントスタイル。TFontStylesという特別なタイプの値で設定する

 はい、またもやわけわからんタイプが出てきましたね(笑)。TFontStylesというやつです。これは、「一度にいくつもの値をまとめて設定できる」という面妖な仕組みになっています。一般に「集合型」と呼ばれるもので、あらかじめ用意されている値の中から、使いたいものをいくつかまとめてセットする、という不思議なものなんですね。

 このTFontStyles用の値として、Delphiには以下のようなものが用意されています。

fsBold――太字
fsItalic――斜体
fsUnderline――下線付き
fsStrikeOut――打ち消し線付き

 これらの中から、設定したい項目を[]記号の中に、必要なだけカンマで区切って記述したのがTFontStylesの値です。例えば、「Edit1をボールド&イタリックにする」ということならば、

Edit1.Font.Style := [fsBold,fsItalic];

このようになるわけです。まぁ、この集合型というやつは、慣れないとちょっと扱いにくいものですので、とりあえずここでは「こうやってフォントスタイルは設定するんだ」ということだけわかればいいでしょう。・・あ、ちなみに「プレーンな状態に戻す」という場合は、からっぽの値を設定します。つまり、 [] だけをプロパティにセットします。

 まあ、これはちょっと読んだだけでは具体的な使い方がわからないでしょうから、簡単な例を上げておきましょう。

 
procedure TForm1.Button1Click(Sender: TObject); 
begin
	if fsBold in Edit1.Font.Style then
  begin
  	Edit1.Font.Style := [fsItalic];
		Edit1.Font.Color := clRed;
  end
  else
  begin
  	Edit1.Font.Style := [fsBold];
		Edit1.Font.Color := clBlue;
  end;
end;

 

 これは、ボタンをクリックする度に、Edit1コンポーネントのフォントスタイルとフォントカラーを交互に切り替えるプロシージャです。クリックすると「青・ボールド」から「赤・イタリック」へ、また「青・ボールド」へ・・とくり返し変わります。

 ここでは、最初にif文を使って「Edit1がボールドかどうか?」をチェックしてますが、ここで不思議な条件式になっていますね?

if fsBold in Edit1.Font.Style then ・・・

 これは、「Edit1.Font.Styleの値の中に、fsBoldが含まれているかどうか」を示しています。集合型の値では、「この中に、この値が含まれているか」というのを「in」というもので調べることができます。

調べる値 in 集合型の値

 このように記述するわけです。集合型の値はいくつもの値が設定されますので、「fsBold = Edit1.Font.Style」というやり方ではうまく「ボールドかどうか」を調べることができないのです。なんだかよくわからない!という人は、「フォントのスタイルは、○○ in ×× という形で調べるんだ」ということだけ頭に入れておけばいいでしょう。

 とりあえず、ここで紹介したようなプロパティは、多くのコンポーネントでサポートされている標準的なものですので、まずこれらを使えるようになりましょう。それからコンポーネント特有のプロパティなどを使えるようにしていけば、コンポーネント利用の幅も広がってくるはずです。

 


GO NEXT


GO HOME