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


Автор: Syrex 30.1.2007, 16:22
Создаю проект. Создаю ActionManager. Создаю Action1 и Action2. Далее создаю OnExecute для Action1 и Action2 (общий)
Код

void __fastcall TMainF::Action1and2Execute(TObject *Sender)
{
        SpravText=(TObject *)Sender->Caption;

}

Задача: Как вытащить Caption того Action, который вызвал в данный момент OnExecute?

Автор: Anikmar 30.1.2007, 16:37
А в чем проблема?
Код

void __fastcall TMainF::Action1and2Execute(TObject *Sender)
{
        SpravText=((TAction *)Sender)->Caption;
}


Добавлено @ 16:38 
Наверное правильнее будет
Код

TAction *pAction;
pAction = dynamic_cast<TAction>(Sender);
SpravText = pAction->Caption;

Автор: Syrex 30.1.2007, 16:47
Код

pAction = dynamic_cast<TAction>(Sender); //Cannot cast from 'TObject *' to 'TAction'

Автор: Anikmar 30.1.2007, 16:49
Звездочку забыл.
Надо pAction = dynamic_cast<TAction*>(Sender);

Автор: Syrex 30.1.2007, 16:57
Спасибо огромное!

Автор: dumb 31.1.2007, 02:25
dynamic_cast побочные эффекты имеет, которые нужно учитывать. smile

я б так сделал:
Код

  if (Sender->InheritsFrom(__classid(TAction)))
    SpravText = static_cast<TAction*>(Sender)->Caption;

Автор: Anikmar 31.1.2007, 12:22
Цитата(dumb @  31.1.2007,  02:25 Найти цитируемый пост)
dynamic_cast побочные эффекты имеет, которые нужно учитывать. 


Не особо ориентируюсь в тонкостях. Можно просветить?

Автор: dumb 31.1.2007, 14:27
Цитата(F1)

...
The conversion to a base class is resolved at compile time. A conversion from a base class to a derived class, or a conversion across a hierarchy is resolved at runtime.
...
If a pointer cast fails, the returned pointer is valued 0. If a cast to a reference type fails, the Bad_cast exception is thrown.


проверять на "нулевость" результат приведения указателя надо. smile

Автор: Любитель 31.1.2007, 14:34
Цитата(dumb @  31.1.2007,  02:25 Найти цитируемый пост)
я б так сделал:

А я б так:
Код

if (pAction = dynamic_cast<TAction*>(Sender))
  SpravText = pAction->Caption;

Автор: Anikmar 31.1.2007, 15:14
Цитата(dumb @  31.1.2007,  14:27 Найти цитируемый пост)
проверять на "нулевость" результат приведения указателя надо.  

Самое смешное - я просто забыл напечатать. Естественно надо, но это очевидно...

Автор: Vyacheslav 31.1.2007, 16:44
Цитата(dumb @  31.1.2007,  02:25 Найти цитируемый пост)
я б так сделал:

Я бы так не делал, а сделал бы вот так
Код

void __fastcall TMainF::Action1and2Execute(TObject *Sender)
{
    if(  TAction *  pAction = dynamic_cast<TAction*>(Sender) ) {
       SpravText=pAction->Caption;
   }
}

Автор: dumb 31.1.2007, 19:02
Любитель,
Vyacheslav,
чем обусловлен выбор?

Автор: Любитель 4.2.2007, 16:11
Vyacheslav, не понял приницпиальной разницы. Кроме вынесения pAction в другую область видимости. Как таковое это логичнее, просто в превом посте объявление pAction было отделено, возникает тупая мысль, что это специально... (всмысле показывается, что pAction используется где-то ещё, хотя ИМХО глупо)

dumb, лично для меня просто приятностью более чистых плюсов.

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