クラスが他のクラスを所持している場合があります。例えば、ここでは、本クラスと本棚クラスの例をみてみます。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
// 本クラス
TBook = class(TObject)
private
FBookName: string;
public
constructor Create(bookName: string);
procedure GetName;
end;
// 本棚クラス
TBookShelf = class(TObject)
private
FBookArray: array[0..2] of TBook; // 本クラスを所持します
public
constructor Create;
destructor Destroy; override;
procedure ShowBook;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TBook }
constructor TBook.Create(bookName: string);
begin
FBookName := bookName;
end;
procedure TBook.GetName;
begin
ShowMessage(FBookName);
end;
{ TBookShelf }
constructor TBookShelf.Create;
var
i: Integer;
begin
for i := Low(FBookArray) to High(FBookArray) do
begin
// 本棚クラスが生成される時に、本クラスも生成します。
case i of
0: FBookArray[i] := TBook.Create('First_Book');
1: FBookArray[i] := TBook.Create('Second_Book');
2: FBookArray[i] := TBook.Create('Third_Book');
end;
end;
end;
destructor TBookShelf.Destroy;
var
i: Integer;
begin
// 本棚クラスが破棄されるときに、本クラスも一緒に破棄します。
for i := Low(FBookArray) to High(fBookArray) do
fBookArray[i].Free;
inherited;
end;
procedure TBookShelf.ShowBook;
var
i: Integer;
begin
for i := Low(FBookArray) to High(FBookArray) do
FBookArray[i].GetName;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
BookShelf : TBookShelf;
begin // ←ここにブレークポイントを設置して
// F7 キーを押していってください。
// 本棚クラスを生成
BookShelf := TBookShelf.Create;
BookShelf.ShowBook;
BookShelf.Free; // 破棄
end;
end.
このように、あるクラスが、別のクラスを所持することもあります。また、 コメントに書いたように、ブレークポイントを設置して、F7 キーを押していってください。一文ずつ実行していくので、その様子が、良く分かると思います。
これだけでは、少しつまらないので、本のタイトルを Edit に入力して、ListBox に本棚の内容を表示させるようにしてみましょう。一旦、終了して、[ ファイル | 新規作成 | アプリケーション ] を選択してください。(Button * 2、Edit * 1、ListBox * 1)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
ListBox1: TListBox;
Button2: TButton;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
TBook = class(TObject)
private
FBookName: string;
public
constructor Create(bookName: string);
function GetName: string;
end;
TBookShelf = class(TObject)
private
FBookCount: Integer; // 現在、何冊の本があるか
FBookArray: array[1..5] of TBook;
public
constructor Create;
destructor Destroy; override;
procedure InsertBook(bookName: string);
procedure ShowBook;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
BookShelf: TBookShelf;
{ TBook }
constructor TBook.Create(bookName: string);
begin
FBookName := bookName;
end;
function TBook.GetName: string;
begin
Result := FBookName;
end;
{ TBookShelf }
constructor TBookShelf.Create;
begin
FBookCount := 0; // 現在、本は本棚にありません。
end;
destructor TBookShelf.Destroy;
var
i: Integer;
begin
for i := 1 to FBookCount do
FBookArray[i].Free;
inherited;
end;
procedure TBookShelf.InsertBook(bookName: string);
begin
if FBookCount = 5 then
begin
ShowMessage('本棚には、もう入りきりません。');
exit;
end;
Inc(FBookCount); // 本が増えました。
FBookArray[FBookCount] := TBook.Create(bookName);
ShowMessage(bookName + 'を本棚に入れました。');
end;
procedure TBookShelf.ShowBook;
var
i: Integer;
begin
if FBookCount = 0 then
begin
ShowMessage('現在、本棚に本はありません。');
exit;
end;
Form1.ListBox1.Items.Add('『 本棚 』');
for i := 1 to FBookCount do
Form1.ListBox1.Items.Add(FBookArray[i].GetName);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
BookShelf := TBookShelf.Create;
Edit1.Text := '';
Button1.Caption := '本を本棚に';
Button2.Caption := '本棚を表示';
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
BookShelf.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if Edit1.Text = '' then
begin
ShowMessage('本のタイトルを入力してください。');
exit;
end;
BookShelf.InsertBook(Edit1.Text);
Edit1.Text := '';
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ListBox1.Clear;
BookShelf.ShowBook;
end;
end.
「本を本棚に」 ボタン(Button1)を押す事で、Edit に入力した『本の名前』が Book クラスの FName フィールドに代入され、そしてそのオブジェクトが BookShelf(本棚)クラスのフィールドである FBookArray に格納される事になります。「本棚を表示」ボタンで本棚に入っている本を列挙します。