InfoCity
InfoCity - виртуальный город компьютерной документации
Реклама на сайте







Размещение сквозной ссылки

 

TMyEditor::Edit()
Что же делает Edit()? Он вызывается при двойном щелчке на компоненте. Edit() запускает первый пункт меню предоставленный редактором компонента. То есть, если GetVerbCount() возвращает значение, большее 0, Edit() вызывает ExecuteVerb(0). Теперь, если компонент должен иметь какие-то особые свойства, мы можем переопределить Edit(), чтобы задать другую реакцию. Например, метод Edit() может вызвать редактор свойства или какой-то мастер. Важно также заметить, что если Edit() не переопределен в новом редакторе компонент, то он сначала будет просматривать свойства объекта и генерировать одно из событий - OnCreate, OnChanged или OnClick - смотря какое он найдет первым. Если в объекте не существует ни одно из этих событий, то вызывается ExecuteVerb(0), как сейчас.

Чтобы продемонстрировать это, мы создадим простой член данных типа AnsiString, который будет содержать имя файла. Переопределим Edit() так, чтобы он вызывал TOpenDialog, в котором можно будет выбрать файл, имя которого затем сохранится в переменной. Вам нужно заново открыть модуль компонента, так что выберите ‘Close All’ из меню ‘File’, а затем ‘Open’. Откройте ExampleEditor.cpp. Добавьте следующий код в заголовочный файл:

//---------------------------------------------------------------------------
class PACKAGE TExampleEditor : public TComponent
{
private:
    AnsiString FFileName;
    void __fastcall SetFileName(AnsiString Value);

protected:
public:
    void __fastcall Something(void);
    void __fastcall SomethingElse(void);
    __fastcall TExampleEditor(TComponent* Owner);
__published:
    __property AnsiString FileName = {read = FFileName, write = SetFileName};
};

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

А этот код добавьте в главный файл:

//---------------------------------------------------------------------------
void __fastcall TExampleEditor::SetFileName(AnsiString Value)
{
FFileName = Value;
// Do whatever else needs doing
}

Мы создали свойство, которое будет отображаться в Object Inspector. Теперь давайте напишем код, который будут отображать TOpenDialog. Добавьте это в h-файл:

class TMyEditor : public TComponentEditor
{
private:
    void __fastcall ExecuteVerb(int Index);
    AnsiString __fastcall GetVerb(int Index);
    int __fastcall GetVerbCount(void);
    void __fastcall Edit(void);

protected:
public:
};

И наконец, добавьте это в главный файл:

//---------------------------------------------------------------------------
void __fastcall TMyEditor::Edit(void)
{
TOpenDialog *OD = new TOpenDialog(Component);
if(OD->Execute())
    {
    ((TExampleEditor *)Component)->FileName = ExtractFileName(OD->FileName);
    Designer->Modified();
    }
delete OD;
}

Важное замечание!


Обратите внимание на вызов Designer->Modified(). Вы ДОЛЖНЫ вызвать Modified(), когда изменяете данные компонента. Если его не вызвать, данные не отобразятся в Object Inspector и данные свойства НЕ сохранятся вместе с компонентом.

Еще раз повторите процесс компиляции и инсталляции. Создайте новое приложение, поместите на форму TExampleEditor и дважды щелкните на нем. Выберите любой файл и нажмите 'Open'. Имя выбранного файла отобразится в Object Inspector в поле свойства FileName. Теперь можете сохранить проект под любым именем.

[Назад][Вперед]


Реклама на InfoCity

Яндекс цитирования



Финансы: форекс для тебя








1999-2009 © InfoCity.kiev.ua