C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как повесить обработку события, описание проблемы внутри
Мишевый_Плюшка
  Отправлено: 06.05.2004, 12:43


Ученик-кочегар

Группа: Участник
Сообщений: 7



Как повесить обработку события для динамически созданного объекта.
Например создаю кнопку :

TSpeedButton *pSpeedButton = new TSpeedButton(ToolBar3);
pSpeedButton->Parent = ToolBar3;
....
....


Как мне обработать событие OnClick для этого баттона?

Спасибо большое!
xTrim
Отправлено: 06.05.2004, 12:54


Машинист паровоза

Группа: Участник
Сообщений: 208



CODE

pSpeedButton->OnClick = OnButton1Click;

wink.gif
Мишевый_Плюшка
Отправлено: 06.05.2004, 13:03


Ученик-кочегар

Группа: Участник
Сообщений: 7



Так извините за мою тупость biggrin.gif
Можна пример плиз? Так наглядней будет smile.gif

Пускай при OnClick будет вылазить сообщение

ShowMessage("Hello World");

Как это написать для динамически созданного батона? smile.gif

Спасиба!
Gedeon
Отправлено: 06.05.2004, 13:14


Ветеран

Группа: Модератор
Сообщений: 1742



CODE

TSpeedButton *pSpeedButton = new TSpeedButton(ToolBar3);
pSpeedButton->Parent = ToolBar3;
pSpeedButton->OnClick = YourFunction;

void __fastcall YourFunction(TObject *Sender){
   ShowMessage("Hello World");
}

В h-файл не забуть добавить обьявление этой функции.
Guest
Отправлено: 06.05.2004, 13:27


Не зарегистрирован







Спасибо! Очень благодарен! smile.gif
Мишевый_Плюшка
Отправлено: 06.05.2004, 16:02


Ученик-кочегар

Группа: Участник
Сообщений: 7



Теперь столкнулся с "видимостью".

Ситуация:

CODE

// Создаю новый динамический СпидБатон

void __fastcall TFMain::ToolButton2Click(TObject *Sender)
{
        Application->CreateForm(__classid(TFTar), &FTar);
        if(! FTar)  return;

        TSpeedButton *pSBTar = new TSpeedButton(ToolBar3);
        pSBTar->Parent = ToolBar3;
        pSBTar->Caption = "Òàðèôû";
        pSBTar->GroupIndex=1;
        pSBTar->Down=true;
        pSBTar->OnClick=pSBTarOnClick;
        ...
        ...
        ...

}

// Обработка события OnClick для диманический созданного выше СпидБатона

void __fastcall TFMain::pSBTarOnClick(TObject *Sender)
{
     ShowMessage("Тра-ля-ля");
     pSBTar->Down=true;   // Вот тут компилятор ругается что ему     незнакома переменная pSBTar. Понятно почему, из-за того что этот Батон был создан в обработчике события нажатия другой кнопки .
}




Как выйти из этой ситуации? В хедере pSBTarOnClick объявлена.

Спасибо!
Gedeon
Отправлено: 06.05.2004, 16:15


Ветеран

Группа: Модератор
Сообщений: 1742



в h-файле
TSpeedButton *pSBTar

В вашем обработчике
CODE

       pSBTar = new TSpeedButton(ToolBar3);
       pSBTar->Parent = ToolBar3;
       pSBTar->Caption = "??????";
       pSBTar->GroupIndex=1;
       pSBTar->Down=true;
       pSBTar->OnClick=pSBTarOnClick;
       ...
       ...
       ...

И все он увидит.
Тока из вопоса понятно одно память вы не освобождаете — а НАДО!
где-нить в onclose формы пишите
delete pSBTar
xTrim
Отправлено: 06.05.2004, 16:15


Машинист паровоза

Группа: Участник
Сообщений: 208



можно так
CODE

void __fastcall TFMain::pSBTarOnClick(TObject *Sender)
{
    ShowMessage("Тра-ля-ля");
    TSpeedButton* b = dynamic_cast<TSpeedButton*>(Sender);
    b->Down=true;
}
xTrim
Отправлено: 06.05.2004, 16:23


Машинист паровоза

Группа: Участник
Сообщений: 208



Gedeon не надо память освобождать в данном случае. Овнера жэ передаем в конструктор, он и отвечает за освобождение. Вот если бы pSBTar = new TSpeedButton(NULL) тогда да.
Мишевый_Плюшка
Отправлено: 06.05.2004, 16:40


Ученик-кочегар

Группа: Участник
Сообщений: 7



QUOTE (Gedeon @ 06/05/2004, 17:17)
в h-файле
TSpeedButton *pSBTar

И все он увидит.
Тока из вопроса понятно одно память вы не освобождаете — а НАДО!
где-нить в onclose формы пишите
delete pSBTar

Ну насчет памяти это понятно.

А вот TSpeedButton *pSBTar объявлять в private или в public ?
Просто не могу поменять ему свойство Down из true в false sad.gif
Не меняется sad.gif



CODE

void __fastcall TFMain::pSBTarOnClick(TObject *Sender)
{
   if(pSBTar->Down==true)
     {
      ShowMessage("Отжимаем");
      pSBTar->Down=false; // все равно остается true :(
     }
  else
     {
      ShowMessage("Нажимаем");
      pSBTar->Down=true;
     }
}


Почему так?
Gedeon
Отправлено: 07.05.2004, 08:55


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (Мишевый_Плюшка @ 06/05/2004, 17:42)
Почему так?

Тут уже не динамическое создание виновато, если посмотреть в хэлп там написано
QUOTE

Specifies whether the button is selected (down) or unselected (up).

__property bool Down = {read=FDown, write=SetDown, default=0};

Description

Read Down to determine whether a speed button is selected. The Down property only applies if the GroupIndex property of the button is nonzero.

When GroupIndex is greater than 0, set Down to true to select a button. When the user clicks on a button in the unselected (up) state, the button is selected and Down is set to true. When the user clicks on a button in the selected (down) state, if Caption is true, the button becomes unselected and Down is set to false.

At design time, specify which button in a group is the initially selected button by setting the Down property of the selected button to true.
Note: When GroupIndex is 0, buttons do not remain in the selected state when clicked.

Т.е. по русски говоря присвойте свойству GroupIndex значение отличное от 0.
Еще хочу обратить ваше внимание на свойство AllowAllUp, если кнопка 1 и оно false, вы не сможете ее отжать.

Вернуться в Вопросы программирования в C++Builder