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

 
Как определить что вызвало функцию
Doctor_
Отправлено: 15.08.2004, 21:27


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







есть несколько динамически создаваемых кнопок, которые при нажатии вызывают одну функцию обработки. Как в функции определить какая из кнопок ее вызвала? В функцию передается ссылка Sender типа TObject, но я че-то не могу догнать как это поюзать sad.gif Хелп! Лучше с примером.
Георгий
Отправлено: 15.08.2004, 23:01


Почетный железнодорожник

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



в обработчике нажатия кнопки объект Sender должен представлять собой сам экземпляр объекта кнопка, которую нажали.
шмякаем на форму 2 кнопки и:
CODE
void __fastcall TForm1::Button1Click(TObject *Sender)
{
static int y = 0;
TButton *ptrButton = new TButton(this);
ptrButton->Parent=this;
ptrButton->Top=y;
ptrButton->Visible=true;
ptrButton->Enabled=true;
ptrButton->Caption=y;
y+=ptrButton->Height;
ptrButton->OnClick=this->Button2Click;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
AnsiString str;
TButton *ptrButton = dynamic_cast<TButton*>(Sender);

if ( !ptrButton ) str = "critical error";
else
{
const int top = ptrButton->Top;
const int vert= top / ptrButton->Height;
str.printf("clicked button top=%i calclated vertical position=%i", top, vert );
};
Application->MessageBox( str.c_str(), "обработчик нажатия кнопки", MB_OK);
}
очевидно, что все данные имеющиеся как свойства кнопки легко доступны.
отсюда вывод — если прикладная логика требует дополнительных данных, ассоциированных с каждой кнопкой, то наиболее логично создать своего потомка от стандартной кнопки и в его свойства внести дополнительные данные.

например, если динамически создаётся 3 кнопки (да, нет, отмена), то для однозначной идентификации достаточно прочитать в обработчике поле Caption.

а если на форме есть несколько кнопок с одинаковыми названиями, но отличающиеся по положению в пользовательском интерфейсе, то придётся или идентифицировать их по координатам или по дополнительным атрибутам.
кул! мой 500й ответ по летоисчислению нового движка форума biggrin.gif

Отредактировано Георгий — 16/08/2004, 00:06
Gedeon
Отправлено: 16.08.2004, 08:19


Ветеран

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



У этих кнопок есть свойство Tag, вот и назначайте с последовательным инкриментом при создании, а потом читайте.

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