Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ Builder

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
HiNt
0 / 0 / 0
Регистрация: 02.08.2011
Сообщений: 23
#1

Указатель Sender - C++ Builder

11.08.2011, 12:44. Просмотров 1572. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель Sender (C++ Builder):

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

Sender в С++ - C++ Builder
Привет! Все время сидел на Delphi. И он намного проще и комфортнее С++, но пришлось делать практическую не на нем........ В общем...

Sender и передача массива - C++ Builder
К коде формы создал массив. Двумерный массив являет собой игровое поле. Поэтому я обращался в форме с ним через Screen. Но сделать это в...

Not local sender over smtp - C++ Builder
Здравствуйте, столкнулся с такой проблемой при отправке письма с mail.ru на yandex. После установки соединения выдает ошибку Not local...

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

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

16
mimicria
return (true);
1958 / 1095 / 91
Регистрация: 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);
1958 / 1095 / 91
Регистрация: 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
Супер-модератор
8596 / 2216 / 61
Регистрация: 07.03.2007
Сообщений: 10,773
Завершенные тесты: 1
11.08.2011, 14:14 #6
HiNt, ну объявите параметр в функции funct - TObject* Sender... а в обработчике OnClick просто передавайте в него параметр Sender этого обработчика...
1
Avazart
Эксперт С++
7433 / 5472 / 310
Регистрация: 10.12.2010
Сообщений: 24,395
Записей в блоге: 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
Супер-модератор
8596 / 2216 / 61
Регистрация: 07.03.2007
Сообщений: 10,773
Завершенные тесты: 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
Супер-модератор
8596 / 2216 / 61
Регистрация: 07.03.2007
Сообщений: 10,773
Завершенные тесты: 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
Супер-модератор
8596 / 2216 / 61
Регистрация: 07.03.2007
Сообщений: 10,773
Завершенные тесты: 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
Эксперт С++
7433 / 5472 / 310
Регистрация: 10.12.2010
Сообщений: 24,395
Записей в блоге: 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
Эксперт С++
7433 / 5472 / 310
Регистрация: 10.12.2010
Сообщений: 24,395
Записей в блоге: 17
12.08.2011, 21:02 #15
Это почему, покамесь его поддерживает с++ почему бы и нет?
0
12.08.2011, 21:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2011, 21:02
Привет! Вот еще темы с ответами:

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

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

Static , dynamic_cast, - ( Sender ) не работает сортировка корректно со вторым стринггридом! - C++ Builder
Всем привет! :senor: сразу вопрос. есть PageControl с двумя вкладками. на каждой есть стрингрид. для сортировки по колонкам, в...

Как определить тип Sender'a объекта при использовании динамически созданных объекитах - C++ Builder
Есть динамически созданные объекты на форме: int counter=0; for(int i=1; i<4; i++) { for(int j=1; j<4; j++) { ...


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

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

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