基礎問題8-2 |
それでは、いよいよコンポーネントの配置です。下のように配置してください。 |
 |
フォーム |
コンポーネント |
Name プロパティ |
Form1 |
「コピー」ボタン |
ButtonCopy |
エディット |
Edit1 |
Form2 |
エディット |
Edit1 |
|
ここに、Form2 の Visible プロパティを True にしておいてください(そうしないと、プログラムを実行しても Form2 が表示されません)。
さて、[コピー]ボタンクリックのイベントハンドラはどのようにすればよいでしょうか?何となく次のようになりそうですね。
ところが、これで実行しても(エディットに文字列を入れ[コピー]ボタンを押しても)、何の反応もありません。それは、我々プログラムする側が、「右辺のEdit1はForm1に属するもので、左辺のEdit1はForm2に属するものだ。」と考えていても、C++Builderはこれをいずれも(プログラムが書かれている)Form1上に存在する(同一の)Edit1だと解釈するからです。
このような問題を防ぐため、実は本来は下のように、「どのフォームに所属するコンポーネントか」なのかを明記するようになっています。
ただし、プログラムが記述されているフォーム内に存在するコンポーネントに関しては、フォーム名を省略することができます。この約束事があるので、これまでのような単一フォームの場合は、コンポーネント名の前にフォーム名を付ける必要がなかった訳です。
これは、例えて言うと電話における市外局番のようなものです。Form1 の中から (その外側の)Form2 のコンポーネントを呼び出す場合には市外局番(つまりフォーム名)が必要ですが、Form1 の中のコンポーネント同士で呼び出すのであれば、市外局番は省略しても構わないのです。
そこで、不要な市外局番(フォーム名)を省略すると、上のプログラムは次のように書けます。
実は、これだけでは、display(Form2)は表示されません。
Unit1の中では、display(Form2)というものが何者であるか判断できないからです。Unit1.cppからForm2(Unit2)を使うには、「Form2(Unit2)を使う」という命令を行う必要がある。Form1のUnit1.cppの冒頭に以下のように「#include "display.h"」という行を追加します。 |
|
この行で追加した命令を「インクルード」と呼び、「display.hをインクルードする」などという。display.hはユニットファイルdisplay.cppのヘッダファイルです。
上記のように、ユニットファイルの冒頭には、自動的に「#includ "<vcl.h>"」の他にインクルードを追加しないと使えないものもあります。ヘルプに「ヘッダー」という記述があれば、そこに書かれたファイルをインクルードすればいいでしょう。インクルードはDelphiの「use」にあたります。 |
|
 |