Главная » C++, C++ Builder » Создаем поле ввода C++ Builder

0

Первый из компонентов, которые мы хотим динамически создать — это поле ввода. Когда пользователь выбирает кнопкой мыши переключатель Создать новое поле ввода, то на форме появится динамически созданное поле ввода. Создайте обработчик события OnClick (выбор, нажатие) для этого переключателя и добавьте в него следующий код. Когда вы закончите набирать этот код (или просматривать код на компакт-диске), мы обсудим, что это все означает:

void __fastcall TForm1::RadioButton1Click(TObject *Sender)

{

RemoveExistingFields();

FpEdit = new TEdit(this); FpEdit->Parent = this;

FpEdit->Left = RadioButton1->Left;

FpEdit->Width = 200;

FpEdit->Height = 20; FpEdit->Top =

RadioButton3->Top + RadioButton3->Height + 20; FpEdit->Visible = true;

}

Предыдущий пример, во-первых, удаляет все существующие компоненты, вызывая метод RemoveExistingFields. Мы рассмотрим его чуть позже. Во-вторых, создает новый компонент TEdit (поле ввода) через оператор new. Компоненты VCL могут быть созданы только через оператор new. Вы не можете просто определить новый компонент VCL, например так:

TEdit mEdit(this); // Это не сработает!

Это ограничение наложено компанией Borland на VCL; оно необходимо, так как библиотека VCL была написана на Pascal и  поэтому, чтобы все работало как  надо,  нужны  определенные закулисные манипуляции.

Как только компонент создан через оператор new (при этом владелец (owner) компонента передается как параметр конструктору), следующим важным шагом является установка свойства Parent (родитель) компонента. Свойство Parent существенно для определения, где компонент должен находиться. Если это свойство не установить, то компонент никогда не  появится  на экране, так как его свойства задаются относительно родителя. Если вы динамически создали компонент и он не появляется, то первым делом проверьте установку свойства Parent перед тем, как искать где-либо еще.

Когда свойство Parent установлено, следующие четыре строки кода просто позиционируют поле ввода на форме. В данном случае мы  хотим, чтобы поле ввода появилось снизу от последнего переключателя (radio button), так что мы устанавливаем позиционные свойства поля ввода через координаты RadioButton3 (третьего переключателя), и все становится хорошо.

Последний шаг — установка свойства Visible (видимый) в логическое  значение  true  (истина), чтобы компонент был виден пользователю. Строго говоря, это необязательно, так как почти для всех компонентов значение свойства Visible по умолчанию есть true.  Однако  стоит  привыкать делать именно так, потому что трудно строить догадки о том, как все это будет работать в будущем.

Чтобы наша программа скомпилировалась, нам надо добавить метод RemoveExistingFields. Вот нужный код:

void  TForm1::RemoveExistingFields(void)

{

if ( FpEdit )

{

delete FpEdit; FpEdit = NULL;

}

if ( FpLabel )

{

delete FpLabel; FpLabel = NULL;

}

if ( FpButton )

{

delete FpButton; FpButton = NULL;

}

}

Как видите, все что мы тут делаем, это удаляем те компоненты, указатели на которые не равны NULL, и ставим их в NULL. Вот почему важно было инициализировать значения указателей в конструкторе формы. Таким образом мы определяем один-единственный компонент и потом удаляем его с формы.

Теперь вы уже сделали достаточно, чтобы скомпилировать и собрать программу. Вам нужно временно закомментировать метод OnButtonClick в заголовочном файле, а потом выбрать команду Project ä Make (или нажать Ctrl+F9) для запуска компиляции и сборки проекта. Запустите полученную программу и щелкните мышью на первом переключателе (создание поля ввода). Вы увидите форму, изображенную на рис. 4.2.

Рис. 4.2. Форма с новым динамическим полем ввода

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

По теме:

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