Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Переопределение обработчика событий

7.4K
24 января 2007 года
Gole
31 / / 31.10.2005
Есть форма на которой размещен какой либо элемент управления (кнопка к примеру). Есть класс при создании объекта которого происходит инициализация поля
 
Код:
TButton *pB;
ссылкой на эту кнопку.
Необходимо затем внутри класса переопределить обработчик OnClick().
Пробовал описывать новую функцию в качестве метода класса, а затем явно указывать новый обработчик
 
Код:
Tree->OnClick = NewProc;

Но постоянно выскакивает сообщение при компиляции типа
 
Код:
[Linker Error] Unresolved external 'TPoisons::' referenced from D:\PROJECTS\DOZA\ECOLOGY TEST 2\MAIN.OBJ
11K
24 января 2007 года
.nornad
125 / / 04.01.2007
Цитата:
Пробовал описывать новую функцию в качестве метода класса,


Приведи хотя бы заголовок функции, как ты её описывал.

11K
24 января 2007 года
.nornad
125 / / 04.01.2007
Кстати, класс основан на чём-то из VCL или просто свой? Если я ничего не путаю, то обработчик может принадлежать (быть методом) только VCL-классу.
246
25 января 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: Gole
Есть форма на которой размещен какой либо элемент управления (кнопка к примеру). Есть класс при создании объекта которого происходит инициализация поля
 
Код:
TButton *pB;
ссылкой на эту кнопку.
Необходимо затем внутри класса переопределить обработчик OnClick().
Пробовал описывать новую функцию в качестве метода класса, а затем явно указывать новый обработчик
 
Код:
Tree->OnClick = NewProc;

Но постоянно выскакивает сообщение при компиляции типа
 
Код:
[Linker Error] Unresolved external 'TPoisons::' referenced from D:\PROJECTS\DOZA\ECOLOGY TEST 2\MAIN.OBJ


Функция должна соответствовать типу обработчика, напр.

Код:
// hpp
class TEdAutoComplete
{
private:
    TEdit*       FEdit;
    TStringList* FAutoList;
    ...
    TKeyPressEvent OnKeyPress; // здесь будет храниться оригинальный обработчик
    void __fastcall OnKeyPress2(TObject *Sender, char &Key); // это наш заменяемый
public:
    void __fastcall Attach(TEdit* AEdit);
    void __fastcall Detach();
    ...

// cpp
void __fastcall TEdAutoComplete::Attach(TEdit* AEdit)
{
    //TODO: Add your source code here
    if(FEdit) Detach();

    if(AEdit)
    {
        FEdit = AEdit;
        OnKeyPress = FEdit->OnKeyPress;
        FEdit->OnKeyPress = OnKeyPress2;
    }
}

void __fastcall TEdAutoComplete::OnKeyPress2(TObject *Sender, char &Key)
{
  if(OnKeyPress)OnKeyPress(Sender, Key);// вызоем оригинальный обработчик
  // далее делаем, что нужно
  if(Key == VK_RETURN)
  {
  ...


для кнопки это будет
class TMyClass
{
TNotifyEvent OnClick;
void __fastcall MyClick(TObject* Sender);
...
};
7.4K
25 января 2007 года
Gole
31 / / 31.10.2005
Спасибо, заработало.
Проблема была в том, что я пытался переопределить обработчик используя указатель на элемент управления который передавался в качестве параметра в метод класса. А нужно было переопределять у указателя - члена класса:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог