Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
HiNt
0 / 0 / 0
Регистрация: 02.08.2011
Сообщений: 23
1

Указатель Sender

11.08.2011, 12:44. Просмотров 1733. Ответов 16
Метки нет (Все метки)

Почему sender не работает в функциях?

C++
1
2
3
float funct(){
((TButton*)Sender)->Caption="Hi"
}
Компилятор выдает ошибку "[C++ Error] Unit1.cpp(45): E2451 Undefined symbol 'Sender'"

А вот если это написать в самом OnClick, то работает. Но мне нужно в функцию.

//С++ Builder
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2011, 12:44
Ответы с готовыми решениями:

Если в класс нужно передать указатель на указатель на массив строк неизвестной длинны?
Как проинициализировать массив строк wchar_t * (произвольного размера) , если...

Sender в С++
Привет! Все время сидел на Delphi. И он намного проще и комфортнее С++, но...

Not local sender over smtp
Здравствуйте, столкнулся с такой проблемой при отправке письма с mail.ru на...

Sender и передача массива
К коде формы создал массив. Двумерный массив являет собой игровое поле. Поэтому...

Использование TObject *Sender в своих функциях
Всем доброго времени суток. Столкнулся с проблемой что при использовании...

16
mimicria
return (true);
1960 / 1097 / 219
Регистрация: 19.04.2011
Сообщений: 2,345
11.08.2011, 12:49 2
Потому что в OnClick Sender передается в качестве параметра
0
HiNt
0 / 0 / 0
Регистрация: 02.08.2011
Сообщений: 23
11.08.2011, 12:51  [ТС] 3
Да, но как мне сделать обработку "НажатаяКнопка->Caption"?
0
mimicria
return (true);
1960 / 1097 / 219
Регистрация: 19.04.2011
Сообщений: 2,345
11.08.2011, 13:03 4
Передать Sender в функцию
0
HiNt
0 / 0 / 0
Регистрация: 02.08.2011
Сообщений: 23
11.08.2011, 14:06  [ТС] 5
А на примере можно?
0
Lord_Voodoo
Супер-модератор
8609 / 2237 / 133
Регистрация: 07.03.2007
Сообщений: 10,826
Завершенные тесты: 1
11.08.2011, 14:14 6
HiNt, ну объявите параметр в функции funct - TObject* Sender... а в обработчике OnClick просто передавайте в него параметр Sender этого обработчика...
1
Avazart
Эксперт С++
7722 / 5631 / 549
Регистрация: 10.12.2010
Сообщений: 25,397
Записей в блоге: 17
11.08.2011, 19:24 7
C++
1
2
3
4
5
6
7
8
9
10
11
void funct(TObject *vSender)
{
((TButton*)vSender)->Caption="Hi";
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
funct(Sender);
}
//---------------------------------------------------------------------------
0
Lord_Voodoo
Супер-модератор
8609 / 2237 / 133
Регистрация: 07.03.2007
Сообщений: 10,826
Завершенные тесты: 1
12.08.2011, 10:03 8
HiNt, хотя либо ты задачу нам полностью не объяснил, либо я не понимаю, зачем лепить функцию?
0
HiNt
0 / 0 / 0
Регистрация: 02.08.2011
Сообщений: 23
12.08.2011, 10:49  [ТС] 9
Я вообще занимался делфи до этого времени. Там все просто
Delphi
1
(Sender as TButton).caption:='Hi';
работает во всех процедурах и функциях. Например, чтобы написать функцию смены надписи кнопок, если у тебя их больше 10. Дабы не копировать весь текст, просто вызывать функцию в каждой кнопке.
0
Lord_Voodoo
Супер-модератор
8609 / 2237 / 133
Регистрация: 07.03.2007
Сообщений: 10,826
Завершенные тесты: 1
12.08.2011, 10:59 10
HiNt, двойка вам... этого делать абсолютно не надо... достаточно одного обработчика, который вешается на все кнопки циклом... а приведение типа объекта Sender к TButton позволит вам узнать, на какую из них нажали...
0
HiNt
0 / 0 / 0
Регистрация: 02.08.2011
Сообщений: 23
12.08.2011, 11:09  [ТС] 11
Ну что взять с самоучки... А можно на примере, как узнать какую кнопку нажали (я всегда узнавал через свойство Tag) и как записать
C++
1
2
3
int x;
x=1; 
ButtonX->Caption="Hi";
в виде программного кода?
Я понимаю что такой код работать не будет, но, судя по вашим словам, это возможно. Как?
0
Lord_Voodoo
Супер-модератор
8609 / 2237 / 133
Регистрация: 07.03.2007
Сообщений: 10,826
Завершенные тесты: 1
12.08.2011, 11:22 12
HiNt, пример не напишу, нет под рукой билдера... но объясню на пальцах:
1) создаем процедуру, аналогичную обработчику OnClick(прощего всего на любой кнопке кликнуть и перенести заготовку в методы класса (в private или public))...
2) приведение типов я думаю вы знаете - dynamic_cast или (TButton*)...
3) анализировать можно кнопку либо по ее имени, либо по caption, либо tag... это уже как вам удобно...
4) чтобы привязать обработчик всем кнопкам, достаточно им просто присвоить указатель на вашу процедуру:
Button1->OnClick = OnMyClick;
5) зациклить тоже достаточно просто перебором всех компонентов на форме свойство Components или с помощью FindComponent, если у вас есть список их имен... посмотрите по форуму, такие проблемы уже поднимались на нем...

ну вот и усе... если непонятно что-то, пишите... доберусь до билдера даже явлю пример, хотя все же попробуйте разобраться сами - больше пользы, чем от простого копипаста...
и на счет самоучки - мы все по сути своей самоучки... различие только в том, что одни разбираются сами, а другие ждут помощи... а чью сторону выберете вы, решать только вам...
1
Avazart
Эксперт С++
7722 / 5631 / 549
Регистрация: 10.12.2010
Сообщений: 25,397
Записей в блоге: 17
12.08.2011, 18:57 13
Можно не писать ф-ции просто прописать обработчик для одной кнопки и назначить его для всех
C++
1
2
3
4
5
6
void __fastcall TForm1::Button2Click(TObject *Sender)
{
((TButton*)Sender)->Caption="Hi!";
ShowMessage("Событие в кнопке "+((TButton*)Sender)->Name); 
}
//---------------------------------------------------------------------------
А еще лучше использовать ActionList для дублирования событий
0
Изображения
 
rangerx
12.08.2011, 20:30
  #14

Не по теме:

Цитата Сообщение от HiNt Посмотреть сообщение
C++
1
((TButton*)Sender)->Caption="Hi"
В C++ не следует использовать приведения типов в стиле языка C. Для этого есть static_cast, dynamic_cast, const_cast, и reinterpret_cast.

0
Avazart
Эксперт С++
7722 / 5631 / 549
Регистрация: 10.12.2010
Сообщений: 25,397
Записей в блоге: 17
12.08.2011, 21:02 15
Это почему, покамесь его поддерживает с++ почему бы и нет?
0
OstapBender
584 / 523 / 75
Регистрация: 22.03.2011
Сообщений: 1,585
12.08.2011, 21:52 16
считается что такие явные приведения ведут к малозаметным трудно отлавливаемым ошибкам, а приведение вроде static cast<unsigned>(i); типа привлечет к себе внимание своим видом. оно и подсвечивается обычно.
а так да, разницы нет.
0
Avazart
Эксперт С++
7722 / 5631 / 549
Регистрация: 10.12.2010
Сообщений: 25,397
Записей в блоге: 17
12.08.2011, 22:08 17
Когда приходится приводить несколько раз (компонент в компоненте), то запись становится уж больно грамосткой и без длинной записи dynamic_cast.
А вообще dynamic_cast я восновном использую когда не уверен что класс именно этого типа
0
12.08.2011, 22:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2011, 22:08

Откуда берется FormPaint(TObject *Sender)?
Здравствуйте! Мы только начали изучать графику, и я никак не могу разобраться...

C++ Builder OnMouseMove не меняется Sender при ssLeft
Здраствуйте! Есть код, который при движении мыши и нажатии лкм выводит в...

Вызывается 2 раза void __fastcall TForm2::ListBox1Click(TObject *Sender)
Помогите. В чём дело? Функция void __fastcall TForm2::ListBox1Click(TObject...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru