モードレス フォームからのデータの取得
フォームからのデータの取得 への移動
モードレス フォームの情報は、フォームの public メンバ関数を呼び出すか、フォームのプロパティを問い合わせることにより、簡単に取得することができます。たとえば、色("Red"、"Green"、"Blue" など)のリストを表示する ColorListBox というリスト ボックスを含んだ ColorForm というモードレス フォームがアプリケーションにあるとしましょう。ColorListBox で選択された色の名前文字列は、ユーザーが新しい色を選択するたびに CurrentColor というプロパティに自動的に格納されます。このフォームのクラス宣言は次のようになります。
TColorForm = class(TForm)
ColorListBox:TListBox;
procedure ColorListBoxClick(Sender: TObject);
private
FColor:String;
public
property CurColor:String read FColor write FColor;
end;
class TColorForm : public TForm {
__published: // IDE-managed Components
TListBox *ColorListBox;
void __fastcall ColorListBoxClick(TObject *Sender);
private: // User declarations
String getColor();
void setColor(String);
String curColor;
public: // User declarations
virtual __fastcall TColorForm(TComponent* Owner);
__property String CurrentColor = {read = getColor, write = setColor};
};
このリスト ボックスの OnClick イベント ハンドラ ColorListBoxClick では、リスト ボックスで新しい項目が選択されるたびに CurrentColor プロパティの値を設定します。このイベント ハンドラでは、色の名前を格納したリスト ボックスから文字列を取得して CurrentColor に割り当てます。CurrentColor プロパティでは、設定関数 SetColor を使用して、プロパティの実際の値を private データ メンバ FColor に格納します。
procedure TColorForm.ColorListBoxClick(Sender: TObject);
var
Index: Integer;
begin
Index := ColorListBox.ItemIndex;
if Index >= 0 then
CurrentColor := ColorListBox.Items[Index]
else
CurrentColor := '';
end;
void __fastcall TColorForm::ColorListBoxClick(TObject *Sender) {
int index = ColorListBox->ItemIndex;
if (index >= 0) { // make sure a color is selected
CurrentColor = ColorListBox->Items->Strings[index];
}
else // no color selected
CurrentColor = "";
}
// ---------------------------------------------------------------------
void TColorForm::setColor(String s) {
curColor = s;
}
ここで、アプリケーション内の別のフォーム ResultsForm で、その ResultsForm 上のボタン(UpdateButton)がクリックされるたびに、ColorForm で現在選択されている色を調べる必要があるとしましょう。UpdateButton の OnClick イベント ハンドラは、たとえば、次のようになります。
procedure TResultForm.UpdateButtonClick(Sender: TObject);
var
MainColor: String;
begin
if Assigned(ColorForm) then
begin
MainColor := ColorForm.CurrentColor;
{do something with the string MainColor}
end;
end;
void __fastcall TResultsForm::UpdateButtonClick(TObject *Sender) {
if (ColorForm) { // verify ColorForm exists
String s = ColorForm->CurrentColor;
// do something with the color name string
}
}
このイベント ハンドラでは、まず、ColorForm が存在するかどうかを、Assigned 関数を使って確認します。そのあと、ColorForm の CurrentColor プロパティの値を取得します。
あるいは、ColorForm に GetColor という public 関数があれば、CurrentColor プロパティを使用せずに、現在選択されている色を別のフォームから取得することができます(たとえば、MainColor := ColorForm.GetColor;
など)。実際には、次のように、もう一方のフォームからリスト ボックスの選択内容を直接調べて、ColorForm で現在選択されている色を取得することは自由にできます。
with ColorForm.ColorListBox do
MainColor := Items[ItemIndex];
String s = ColorListBox->Items->Strings[ColorListBox->ItemIndex];
ただし、プロパティを使用すると、ColorForm へのインターフェイスが非常にわかりやすく簡単なものになります。ColorForm については、CurrentColor の値を調べることさえフォームが知っていればよいことになります。