Главная » C++, C++ Builder » Динамические компоненты, часть первая C++ Builder

0

Если бы вы заглянули в эхоконференции (newsgroups) по CBuilder в Internet, то вы увидели бы, что один из наиболее частых вопросов — это как создавать управляющие элементы во время работы приложения. Хотя CBuilder и предоставляет богатый ассортимент компонентов и возможности легкого манипулирования ими в дизайнере форм, многие программисты не хотят связываться со

«спрятанными» (невидимыми) компонентами на форме. Так называемые динамические управляющие элементы — вещь, которую достаточно просто сделать в дизайнере форм. Просто добавляете на форму компонент в том месте, где вы хотите, чтобы он позже появился, а потом устанавливаете его свойство Visible («видимый») в false (ложь). Когда вам нужно, чтобы компонент появился на форме, устанавливаете свойство Visible  в true (истина) и он становится видимым и доступным пользователю. Однако это не  то, что нужно некоторым программистам. Хотя в девяти случаях из десяти этого достаточно, иногда все же вам действительно нужно создавать для пользователя компонент динамически во время работы приложения. В этои примере мы предоставляем возможность создавать компонент не одного, а трех  различных  типов  «на ходу». В добавление к этому вы увидите, как разобраться с  обработкой  сообщений  для динамически созданных компонентов.

Замечание

Вы найдете полный исходный код для программы «Динамические компоненты» на сопроводительном компакт-диске в каталоге Chapter4\DynControl1.

На рис. 4.1 представлена форма, с которой мы будем работать в этом приложении.  Создайте простую форму и притащите на нее три переключателя (компонент TRadioButton) и одно поле ввода (компонент TEdit). Разместите их примерно так, как на рисунке.

Рис. 4.1. Форма приложения «Динамические компоненты»

Во-первых, нам нужно изменить заголовочный файл для формы, чтобы он содержал описания компонентов, которые мы будем создавать. В данном примере мы будем создавать компоненты трех различных типов. Нам нужны описания для статического текста (метки), поля ввода  и кнопки. Вот изменения, которые нужны для данного примера (выделены подсветкой):

#ifndef Unit1H

#define Unit1H

//——————————————————–

#include <vcl\Classes.hpp>

#include <vcl\Controls.hpp>

#include <vcl\StdCtrls.hpp>

#include <vcl\Forms.hpp>

//——————————————————–

class TForm1 : public TForm

{

__published: // IDE-managed components TRadioButton *RadioButton1; TRadioButton *RadioButton2;

TEdit *Edit1;

TRadioButton *RadioButton3;

void __fastcall RadioButton1Click(TObject *Sender); void __fastcall RadioButton2Click(TObject *Sender); void __fastcall RadioButton3Click(TObject *Sender);

private:  // User declarations

TEdit *FpEdit; TLabel *FpLabel; TButton *FpButton;

void  RemoveExistingFields(void);

void __fastcall OnButtonClick( TObject *Sender ); public: // User declarations

__fastcall TForm1(TComponent *Owner);

};

//——————————————————–

extern TForm1 *Form1;

//——————————————————–

#endif

Три указателя на компоненты будут использованы для создания компонентов «на ходу». Метод RemoveExistingFields нам нужен, чтобы избавиться от предыдущего созданного компонента  и убрать его с экрана. И, наконец, метод OnButtonClick будет использован для динамической обработки события нажатия на кнопку.

Во-первых, нам надо инициализировать все указатели на компоненты, чтобы знать, какой из них активен, а какие нет. Добавьте следующий код в конструктор класса:

__fastcall TForm1::TForm1(TComponent *Owner)

: TForm(Owner)

{

FpEdit = NULL; FpLabel = NULL; FpEdit = NULL;

}

Здесь мы просто устанавливаем указатели в NULL (нуль). Это некорректное значение указателя означает, что компонент не создан. Это важно для нас, так как мы планируем создавать компоненты в одном и том же месте формы. Если не следить за тем, какой из них активен, то может случиться, что они все будут одновременно присутствовать и будут  друг  друга перекрывать, что приведет к каше на экране.

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии