Главная » C++, C++ Builder » Форма для определения новых методов – приложение просмотра классов в CBuilder

0

Первая форма, которую нам потребуется добавить в  проект, — это форма для определения и добавления новых методов в компонент. Эта форма позволит пользовате лю определить название метода, тип возвращаемого значения, а также типы и названия аргументов. Вся эта информация будет скомбинирована в стандартное  для C++ описание метода и добавлена в список методов, которые будут добавлены в класс при его генерации. Это позволит нам использовать один и тот же код во всех местах, где мы имеем дело с методами. На рис. 17.8 показана форма, которую мы будем использовать для описания новых методов.

Рис. 17.8. Форма для определения новых методов

Весь код, который нам надо добавить в эту форму, будет относиться к моменту ее создания. Нам надо установить заголовки колонок сетки и сделать сами колонки правильной ширины. Добавьте обработчик для события Create формы; в этот обработчик добавьте следующие строки:

void __fastcall TForm2::FormCreate(TObject *Sender)

{

StringGrid1->Cells[1][0] = "Field Type"; StringGrid1->Cells[2][0] = "Argument Name"; StringGrid1->ColWidths[0] = 10;

StringGrid1->ColWidths[1] = 100;

StringGrid1->ColWidths[2] =  StringGrid1->Width-140;

}

Как видите, ничего сложного. Мы просто задаем значения для заголовков и  ширины  колонок, чтобы при запуске эта форма  выглядела прилично. Единствен ное, пожалуй,  неочевидное действие, которое надо проделать над этой формой, — это изменить свойства Options объекта StringGrid так, чтобы флаги goEditing и goTabs были установлены в значение true. Флаг goEditing позволяет пользователю редактировать данные прямо в ячейках сетки (мы это делаем для того, чтобы пользователь вообще смог ввести значения типов и названий), а установка флага goTabs позволяет использовать клавишу Tab для перемещения между ячейками сетки.

Теперь, когда форма создана и определена, осталось только вывести ее на экран при нажатии пользователем на кнопку Новые на странице методов нашего диалога. Мы сделаем это как всегда в новом обработчике, но для начала добавим ссылку на эту форму при помощи команды меню File

д  Include  Unit  Hdr.  Ниже  приведен  код  для  обработчика  нажатия  на  кнопку  Новые  страницы методов:

void __fastcall TPagesDlg::Button5Click(TObject *Sender)

{

if ( Form2->ShowModal() )

{

// Строим строку метода

AnsiString s = Form2->MethodReturn->Text; s += " ";

s += Form2->MethodName->Text;

s += "( ";

// Аргументы

boolean bFlag = false;

for ( int i=1; i<Form2->StringGrid1->RowCount; ++i )

{

AnsiString strArg = "";

// В колонке типов должен быть указан тип

if ( Form2->StringGrid1->Cells[1][i].Length() )

{

if ( bFlag ) s += ", ";

strArg += Form2->StringGrid1->Cells[1][i];

strArg += " ";

strArg += Form2->StringGrid1->Cells[2][i]; s += strArg;

bFlag = true;

}

}

s += ");";

// Добавляем в список

ListBox2->Items->Add( s );

}

}

Ну что ж, на данный момент страничка методов более-менее закончена. Конечно, нам еще придется вернуться к ней для того, чтобы получить данные, определенные в ней, но этим мы займемся позже. А пока что давайте обратимся к страничке свойств и посмотрим, что ждет нас там.

Страница свойств

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

Рис. 17.9. Форма для определения новых свойств

Создав форму определения свойств и добавив ее в проект, можно приступать к обработке кнопки Новые страницы свойств. Добавьте обработчик для этой кнопки; в него добавьте  следующие строки:

void __fastcall TPagesDlg::Button8Click(TObject *Sender)

{

if ( Form1->ShowModal() )

{

AnsiString s = Form1->PropertyType->Text; s += " ";

s += Form1->PropertyName->Text;

ListBox4->Items->Add( s );

}

}

Форма отображается  как  модальное окно,  в нее  заносится  информация  о  новом  свойстве,  при нажатии кнопки OK генерируется строка свойства, имеющая вид:

<тип-свойства> <название свойства>

Таким образом, каждое новое свойство, добавляемое нами в компонент, будет иметь в начале название типа. Свойства же, подсаженные в компонент, как правило, указываются только по названиям. Это отличие позволит нам корректно сгенерировать  свойства  и  ассоциированные  с ними переменные класса для нашего компонента.

Мы уже обработали перемещения элементов из списка в список, так что со страницей свойств мы на этом прощаемся. Пришло время заняться серьезным делом: сгенерировать собственно описание компонента.

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

По теме:

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