クラスが他のクラスを所持している場合があります。例えば、ここでは、本クラスと本棚クラスの例をみてみます。
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 に格納される事になります。「本棚を表示」ボタンで本棚に入っている本を列挙します。