RAD Studio |  |

Retrieving Data from Modeless Forms
See Also
Collapse All

You can easily extract information from modeless forms by calling public member functions of the form or by querying properties of the form. For example, assume an application contains a modeless form called ColorForm that contains a listbox called ColorListBox with a list of colors ("Red," "Green," "Blue," and so on). The selected color name string in ColorListBox is automatically stored in a property called CurrentColor each time a user selects a new color. The class declaration for the form is as follows:

Copy Code

    TColorForm = class(TForm)
      ColorListBox:TListBox;
      procedure ColorListBoxClick(Sender: TObject);
    private
      FColor:String;
    public
      property CurColor:String read FColor write FColor;
    end;

Copy Code

    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};
    };

The OnClick event handler for the listbox, ColorListBoxClick, sets the value of the CurrentColor property each time a new item in the listbox is selected. The event handler gets the string from the listbox containing the color name and assigns it to CurrentColor. The CurrentColor property uses the setter function, SetColor, to store the actual value for the property in the private data member FColor:

Copy Code

    procedure TColorForm.ColorListBoxClick(Sender: TObject);
    var
      Index: Integer;
    begin
      Index := ColorListBox.ItemIndex;
      if Index >= 0 then
        CurrentColor := ColorListBox.Items[Index]
      else
        CurrentColor := '';
    end;

Copy Code

    void __fastcall TColorForm::ColorListBoxClick(TObject *Sender)
    {
    int index = ColorListBox->ItemIndex;
    if (index >= 0) {
    CurrentColor = ColorListBox->Items->Strings[index];
    }
    else
    CurrentColor = "";
    }
    //---------------------------------------------------------------------
    void TColorForm::setColor(String s)
    {
    curColor = s;
    }

Now suppose that another form within the application, called ResultsForm, needs to find out which color is currently selected on ColorForm whenever a button (called UpdateButton) on ResultsForm is clicked. The OnClick event handler for UpdateButton might look like this:

Copy Code

    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;

Copy Code

    void __fastcall TResultsForm::UpdateButtonClick(TObject *Sender)
    {
    if (ColorForm) {
    String s = ColorForm->CurrentColor;
    // do something with the color name string
    }
    }

The event handler first verifies that ColorForm exists using the Assigned function. It then gets the value of ColorForm's CurrentColor property.

Alternatively, if ColorForm had a public function named GetColor, another form could get the current color without using the CurrentColor property (for example, MainColor := ColorForm.GetColor;). In fact, there's nothing to prevent another form from getting the ColorForm's currently selected color by checking the listbox selection directly:

Copy Code

    with ColorForm.ColorListBox do
      MainColor := Items[ItemIndex];

Copy Code

    String TColorForm::getColor()
    {
    return curColor;
    }

Copy Code

    String s = ColorListBox->Items->Strings[ColorListBox->ItemIndex];

However, using a property makes the interface to ColorForm very straightforward and simple. All a form needs to know about ColorForm is to check the value of CurrentColor.

See Also

TForm

Copyright(C) 2009 Embarcadero Technologies, Inc. All Rights Reserved.
What do you think about this topic? Send feedback!