Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как запрограммировать событие в моем классе?


Автор: Нитонисе 30.10.2010, 19:06
Есть такой класс
Код

class myClass
{
  public:
    void setX(int newX) {X = newX;}
    void calculate() {XX = X*X};

  protected:
    int X;
    int XX;
};


Нужно сделать так, чтобы класс знал, что у него меняется параметр "Х" и автоматически вызывал метод calculate(). То есть реагировал на событие. Понятно, что этот метод можно прямо прописать в setX, но такой способ мне не подходит не буду объяснять почему, просто надо именно реакция на событие  smile 

Автор: borisbn 31.10.2010, 10:01
Цитата(Нитонисе @  30.10.2010,  19:06 Найти цитируемый пост)
не буду объяснять почему

в таком случае, скорее всего, тебе и не поможет никто smile

Автор: Нитонисе 31.10.2010, 10:29
Цитата(borisbn @  31.10.2010,  10:01 Найти цитируемый пост)
в таком случае, скорее всего, тебе и не поможет никто

Наверно непонятно сформулировал  smile 

Автор: borisbn 31.10.2010, 16:02
Цитата(Нитонисе @  31.10.2010,  10:29 Найти цитируемый пост)
Наверно непонятно сформулировал

похоже на то.
Если тебе нужно, чтобы класс сам узнал о том, что меняется X ( вызвалась ф-ция setX ), то ничего лучше нет, как вызывать в функции setX ф-цию calculate()
Если же тебе нужно, чтобы о событии изменения узнал бы кто-то снаружи класса, то нужно городить события типа __property TNotifyEvent

Автор: Нитонисе 31.10.2010, 16:33
Цитата(borisbn @  31.10.2010,  16:02 Найти цитируемый пост)
Если тебе нужно, чтобы класс сам узнал о том, что меняется X ( вызвалась ф-ция setX ), то ничего лучше нет, как вызывать в функции setX ф-цию calculate()Если же тебе нужно, чтобы о событии изменения узнал бы кто-то снаружи класса, то нужно городить события типа __property TNotifyEvent

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

Автор: xvr 1.11.2010, 12:40
Цитата(Нитонисе @  30.10.2010,  19:06 Найти цитируемый пост)
Нужно сделать так, чтобы класс знал, что у него меняется параметр "Х" и автоматически вызывал метод calculate(). 
Опиши твой X как __propery

Код

class myClass
{
  public:
    void setX(int newX) {X = newX;}
    void calculate() {XX = X*X};
  protected:
    int real_X;
    __property int X = {read=real_X, write=update_x};
    int XX;
    void update_x(int x) {real_X=x; calculate();}
};

Автор: Нитонисе 1.11.2010, 13:35
Цитата(xvr @  1.11.2010,  12:40 Найти цитируемый пост)
Опиши твой X как __propery

Не стречал такого. Где доступно о "__property" этом можно почитать?

Автор: xvr 1.11.2010, 14:26
Цитата(Нитонисе @  1.11.2010,  13:35 Найти цитируемый пост)
Не стречал такого.
 smile Весь Builder на них построен.

Цитата(Нитонисе @  1.11.2010,  13:35 Найти цитируемый пост)
Где доступно о "__property" этом можно почитать?
В help'е Builder'а вестимо


Автор: Нитонисе 1.11.2010, 15:54
Цитата(xvr @  1.11.2010,  14:26 Найти цитируемый пост)
  Весь Builder на них построен.

Я имел ввиду литературу по С++) проперти - это билдеровская фишка?

Автор: xvr 1.11.2010, 16:27
Цитата(Нитонисе @  1.11.2010,  15:54 Найти цитируемый пост)
проперти - это билдеровская фишка?
Да, чисто Builder'овская. На С++ можно сделать аналог, через класс с перегруженным оператором приведения типа и присваиванием (по 1 инстансу на каждую проперть). 

Автор: mrbrooks 1.11.2010, 20:06
Цитата(xvr @  1.11.2010,  16:27 Найти цитируемый пост)
Да, чисто Builder'овская. На С++ можно сделать аналог, через класс с перегруженным оператором приведения типа и присваиванием (по 1 инстансу на каждую проперть). 

по сути это паттерн Command

Добавлено через 57 секунд
но есть ли смысл с ним работать в дебилдере - вещь не однозначная.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)