Большинство проектов в C++Builder содержат разнообразные файлы модулей.
Даже маленький проект может иметь несколько модулей.
Код нашего редактора мы поместим в тот же модуль, что и компонент.
Это понятно - там, где будет компонент, должен быть и редактор.
Минимум методов редактора компонент, которые должны быть переопределены - ExecuteVerb(), GetVerb() и GetVerbCount().
После этого мы можем объявить наследника TComponentEditor.
Добавим следующий код в файл заголовка компонента:
class TMyEditor : public TComponentEditor
{
private:
void __fastcall ExecuteVerb(int Index);
AnsiString __fastcall GetVerb(int Index);
int __fastcall GetVerbCount(void);
protected:
public:
};
//---------------------------------------------------------------------------
class PACKAGE TExampleEditor : public TComponent
{
private:
protected:
public:
void __fastcall Something(void);
void __fastcall SomethingElse(void);
__fastcall TExampleEditor(TComponent* Owner);
__published:
};
//---------------------------------------------------------------------------
GetVerbCount() возвращает количество членов (команд), которые появятся в контекстном меню.
В нашем случае их будет два. GetVerb() возвращает строку, котрая появится в пункте меню, заданном параметром Index.
И наконец, ExecuteVerb() вызывает метод, заданный параметром Index.
Вы должно быть, заметили, что у класса TMyEditor нет конструктора. Там не нужно ничего инициализировать, так что дизайнер форм вызовет конструктор базового класса.
Теперь давайте напишем методы нашего редактора компонент.
Добавьте следующий код в главный файл модуля:
//---------------------------------------------------------------------------
int __fastcall TMyEditor::GetVerbCount(void)
{
return 2;
}
//---------------------------------------------------------------------------
AnsiString __fastcall TMyEditor::GetVerb(int Index)
{
AnsiString str;
switch(Index)
{
case 0: str = "&Something"; break;
case 1: str = "Something&Else"; break;
}
return str;
}
Обратите внимание, что в строку включен амперсанд(&).
Это заставит соответствующую букву появиться подчеркнутой и работать как горячая клавиша для выбора соответствующего пункта меню.
Не забудьте добавить троеточие (...) в конец строки, если соответствующий пункт меню вызывает диалог.
Добавьте следующий код ниже в главный файл модуля:
//---------------------------------------------------------------------------
void __fastcall TMyEditor::ExecuteVerb(int Index)
{
switch(Index)
{
case 0: ((TExampleEditor*)Component)->Something(); break;
case 1: ((TExampleEditor *)Component)->SomethingElse(); break;
}
}
Позвольте прерваться на секунду и поговорить о классе TComponentEditor.
TComponentEditor имеет только два свойства.
Это ‘Component’ и ‘Designer’. Свойство ‘Component’ дает доступ к компоненту в дизайнере форм, который использует этот редактор компонент.
Дизайнер форм создаст редактор для каждой копии класса компонента, когда она будет выбрана в дизайнере.
Свойство Component будет содержать указатель на выбранный компонент.
Component объявлено как (TComponent*), так что вы должны привести его к нужному производному типу для доступа к его методам.
Если вы хотите изменять компонент или читать из него, используйте свойство Component.
Свойство ‘Designer’ обеспечивает доступ к объекту дизайнера форм из C++ Builder's IDE.
Оно используется, чтобы считывать данные или изменять текущую форму или модуль.
Дизайнер форм имеет методы, которые позволяют получить доступ к компонентам в текущем .CPP файле, другим компонентам, определенным во включенных файлах, создавать ил изменять методы в текущем .CPP файле и так далее.
Вы можете найти детальное описание этих методов в файле помощи.
|