Объявление и подмена обработчика события C++Builder
От: Imtent  
Дата: 23.11.05 00:37
Оценка:
Помогите, не шарю.
Мне нужно подменять обработчик события клика кнопки при нажатии на эту кнопку.
Обработчики будут содержаться в отдельном классе, и должны при нажатии на кнопку подменяться.
Что бы было яснее, я делаю Визард, и у меня при нажатии на кнопку Next меняется страница,
так вот я хочу что бы обработчик собятия прорисовал всё что нужно и потом подменился на следющий обработчик.

Есть клас обработчиков
class TWizardInst
{

void Page1_Next();
void Page2_Prev();
void Page2_Next();
void Page3_Prev();
void Page3_Next();
...
}
и есть событие

void __fastcall TWizard::Button1Click(TObject *Sender)
{

}

Помогите.
Re: Объявление и подмена обработчика события C++Builder
От: ak_miass Россия  
Дата: 23.11.05 06:17
Оценка:
Здравствуйте, Imtent, Вы писали:

Во первых, зачем так всё усложнять?
Ну если всё-таки надо именно так, то:

1. Класс TWizardInst нужно немного переделать:
class TWizardInst
{

        void __fastcall Page1_Next(TObject *Sender);
        void __fastcall Page2_Prev(TObject *Sender);
        void __fastcall Page2_Next(TObject *Sender);
        void __fastcall Page3_Prev(TObject *Sender);
        void __fastcall Page3_Next(TObject *Sender);

}


2. Где нибудь в privat Wizard-а:
TWizardInst Events;



3. Теперь можно назначить обработчик:
Button1->OnClick = Events.Page1_Next();
Re[2]: Объявление и подмена обработчика события C++Builder
От: ak_miass Россия  
Дата: 23.11.05 06:20
Оценка:
Назначить надо так:
_>
_>Button1->OnClick = Events.Page1_Next;
_>
Re: Объявление и подмена обработчика события C++Builder
От: Softwarer http://softwarer.ru
Дата: 23.11.05 07:55
Оценка:
Здравствуйте, Imtent, Вы писали:

I>Что бы было яснее, я делаю Визард, и у меня при нажатии на кнопку Next меняется страница,

I>так вот я хочу что бы обработчик собятия прорисовал всё что нужно и потом подменился на следющий обработчик.

"Настоящий профессионал на любом языке напишет бейсик-программу" (c)

То, что Вы говорите — антиООП. Нормально это делается примерно так: делаются несколько фреймов-страниц визарда, при необходимости у них (у базового класса) делаются несколько виртуальных методов, собираются в тот или иной контейнер, обработчики Prev/Next постоянны и занимаются тем, что меняют на форме визарда активный фрейм и при необходимости дергают виртуальные методы типа "пришли с предыдущего", "вернулись со следующего".
Re[2]: Объявление и подмена обработчика события C++Builder
От: Imtent  
Дата: 23.11.05 11:14
Оценка:
Здравствуйте, Softwarer, Вы писали:

S>Здравствуйте, Imtent, Вы писали:


I>>Что бы было яснее, я делаю Визард, и у меня при нажатии на кнопку Next меняется страница,

I>>так вот я хочу что бы обработчик собятия прорисовал всё что нужно и потом подменился на следющий обработчик.

S>"Настоящий профессионал на любом языке напишет бейсик-программу" (c)


S>То, что Вы говорите — антиООП. Нормально это делается примерно так: делаются несколько фреймов-страниц визарда, при необходимости у них (у базового класса) делаются несколько виртуальных методов, собираются в тот или иной контейнер, обработчики Prev/Next постоянны и занимаются тем, что меняют на форме визарда активный фрейм и при необходимости дергают виртуальные методы типа "пришли с предыдущего", "вернулись со следующего".


Сейчас у меня так и сделано, фрэймы полжены на PageControl, но проблема в том что специфика визарда такая, что во время его работы могут деактивица контролы, и кнопка из Next может означать начало поиска устройств и других действий, Next может поменять своё предназначение на "Start", а после нажатия на старт, начнётся erasing CD/DVD, после завершения процесса кнопка "Start" будет уже с кепшеном "Finish" т.д, может быть что переход со страницы №2 по кнопке Next на страницу №3 не то же самое что переход на страницу №3 по кнопке Prev со страницы №4. И поэтому я подумал что нужно сделать так, как задавал вопрос.
Re[3]: Объявление и подмена обработчика события C++Builder
От: Softwarer http://softwarer.ru
Дата: 23.11.05 13:39
Оценка:
Здравствуйте, Imtent, Вы писали:

I>Сейчас у меня так и сделано, фрэймы полжены на PageControl, но проблема в том что специфика визарда такая, что во время его работы могут деактивица контролы, и кнопка из Next может означать начало поиска устройств и других действий,


Наздоровье. Если это делается в рамках перехода на следующую страницу — нормально; соответствующий виртуальный метод, реализованный на фрейме. Если же "начало поиска устройств" заполняет список на той же странице — нефиг (с точки зрения вменяемого интерфейса) сажать его на Next, для этого должна быть соответствующая кнопка внутри фрейма.

I>Next может поменять своё предназначение на "Start", а после нажатия на старт, начнётся erasing CD/DVD, после завершения процесса кнопка "Start" будет уже с кепшеном "Finish"


Вообще говоря переименованием кнопок лучше особо не увлекаться — часто лучше сделать лишнюю кнопку. Тем не менее, указанное Вами делается иначе — назначением кнопке разных Action-ов.

I>т.д, может быть что переход со страницы №2 по кнопке Next на страницу №3 не то же самое что переход на страницу №3 по кнопке Prev со страницы №4.


Если помните, я указал методы "перешли на фрейм с предыдущей страницы" и "вернулись со следующей страницы". Разные.

I>И поэтому я подумал что нужно сделать так, как задавал вопрос.


Не вижу связи. Вообще, динамика — хорошая вещь для своих задач, но крайне не рекомендую вырабатывать привычку затыкать ей все дыры без размышления "как бы это сделать попроще".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.