Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2014, 14:12   #1
Грендайзер
Пользователь
 
Регистрация: 15.10.2013
Сообщений: 29
По умолчанию Обработка нажатия в другом файле

Здравствуйте Недавно начал осваивать C++ Builder в связи с чем возник вопрос. Наваял я некую программку (окошко) на котором полно элементов CheckBox. Всё здорово, нажимаю в форме на элементик 2 раза и открывается файл с кусом кода куда нужно вставить код, который программа должна будит выполнить - всё просто. Только, как я уже писал - элементов этих много, и хотелось бы создать отдельный файлик с кодом, который бы и отвечал за обработку нажатий, иначе код становится чертовски трудным. Можно ли это как то сделать?
Заранее спасибо!
Грендайзер вне форума Ответить с цитированием
Старый 27.08.2014, 15:49   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Можно... хотя я не очень понял что куда надо вставлять, хоть скриншот покажите...
waleri на форуме Ответить с цитированием
Старый 27.08.2014, 16:12   #3
Грендайзер
Пользователь
 
Регистрация: 15.10.2013
Сообщений: 29
По умолчанию

Не думаю, что сриншот поможет, попробую написать, и если не понятно будет тогда срин добавлю. Значит так, нажимаю 2 раза на элемент CheckBox, выскакивает файл с таким вот кодом

Код:
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox25Click(TObject *Sender)
{
  // Здесь наш кодик, который описывает, что сделать при нажатии
}
//---------------------------------------------------------------------------
Так вот приведённый выше кусок кода (весь, не только тот что мы добавляем) я хочу перенести в другой файл например "Обработчик кнопок.cpp", что бы не загромаждать основной код. Например RadioButton в один файл, просто Button в другой... ну и т.д.

Последний раз редактировалось Stilet; 27.08.2014 в 21:54.
Грендайзер вне форума Ответить с цитированием
Старый 28.08.2014, 10:02   #4
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Грендайзер
Конечно можно перенести. Только среда по умолчанию добавляет код в файл формы, поэтому надо немного вручную это делать. Щёлкнул по кнопке/чек-боксу, вырезал появившийся код, вставил его в другой файл по вкусу. Естественно, все правила С по части области видимости никто не отменял и, как минимум, требуется #include файла заголовка формы...

И ещё забыл. Потом, при поиске обработчиков, будет немного неудобно. При клике на тот же чек-бокс, среда скажет, что не смогла найти функцию чек-боксКлик. Так что, если такие трудности не пугают...

Лучше было бы сделать наоборот. В файл формы запихать все обработчики, а вот сам основной код - в другом файле. Тогда всё будет нормально.

Последний раз редактировалось Stilet; 28.08.2014 в 13:59.
FataLL вне форума Ответить с цитированием
Старый 28.08.2014, 10:54   #5
Грендайзер
Пользователь
 
Регистрация: 15.10.2013
Сообщений: 29
По умолчанию

Большое спасибо, вот буквально 10 минут назад сам разобрался. Хотел бы особо подчеркнуть, для тех у кого будит то же вопрос, что приведённый мною код необходимо именно вырезать, а не копировать, т.к. в заголовочнике на него (этот код) создаётся ссылка, и если его просто скопировать, то после нажатия на кнопочку save ссылка удалится, так как код не был дополнен (изменён). Т.о. после копирования в другой фай данного куска кода, программа не скомпилируется.

И раз уж пошла такая пьянка хочу ещё вопросик. И так у меня несколько чекбоксов, но я хочу их обрабатывать в одном обработчике, для этого написал такой код

Код:
void __fastcall TForm1::CheckBox1Click(TObject *Sender)
{

        switch((int)Sender)
        {
           Form1 -> ListBox1 -> Items -> Add(dynamic_cast<TComponent*>(Sender)->Name);
        } 

}
Так вот в переменной Name содержится имя нажатого CheckBox'а, а именно:
CheckBox1, CheckBox2, CheckBox3 и т. д. Что бы понять, какой чекбокс был нажат - из переменной Neme необходимо как то выудить последнюю циферку, как это сделать?

Последний раз редактировалось Stilet; 28.08.2014 в 13:59.
Грендайзер вне форума Ответить с цитированием
Старый 28.08.2014, 11:53   #6
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Не самый оптимальный подход. Зачем назначать один обработчик, если потом приходится отдельно анализировать, что нажато? В любом случае, надо выделить последние цифры из строки... Думаю, это не сложно...
FataLL вне форума Ответить с цитированием
Старый 28.08.2014, 12:14   #7
Грендайзер
Пользователь
 
Регистрация: 15.10.2013
Сообщений: 29
По умолчанию

Цитата:
Сообщение от FataLL Посмотреть сообщение
Не самый оптимальный подход. Зачем назначать один обработчик, если потом приходится отдельно анализировать, что нажато?
Ндааа... Не подумал...
Цитата:
Сообщение от FataLL Посмотреть сообщение
В любом случае, надо выделить последние цифры из строки... Думаю, это не сложно...
Наверняка не сложно... Мне говорили, что в делфи ф-ция для этого есть... а в билдере? Всё же чисто из интереса попробовать нужно...
Грендайзер вне форума Ответить с цитированием
Старый 28.08.2014, 14:20   #8
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Да, нет никаких функций. Надо немного фантазию включить. Например, мы точно знаем длину текстовой строки "CheckBox" - 8 символов. Всё, что после - номер. Как выделить?
Код:
int nNumber = dynamic_cast<TComponent*>(Sender)->Name.Delete( 1, 8 ).ToInt();

// или

int nNumber = atoi( &dynamic_cast<TComponent*>(Sender)->Name.c_str( )[8] );
Ну, и т.д.
FataLL вне форума Ответить с цитированием
Старый 28.08.2014, 16:03   #9
Грендайзер
Пользователь
 
Регистрация: 15.10.2013
Сообщений: 29
По умолчанию

FataLL, большое спасибо, помогли. Буду теперь дальше сидеть творить!!
Грендайзер вне форума Ответить с цитированием
Старый 11.09.2014, 10:21   #10
Грендайзер
Пользователь
 
Регистрация: 15.10.2013
Сообщений: 29
По умолчанию

Снова здравствуйте, появился ещё вопросик. Нужно устанавливать (или снимать) галочку на CheckBox без выполнения кода. В сети нашёл такой кодик
Код:
	
 CheckBox1->OnClick=NULL;
 CheckBox1->Checked=true;
 CheckBox1->OnClick=CheckBox1Click;
Всё работает хорошо. Но вот я создаю ф-цию и помещаю её в отдельный файл

Код:
#include файл заголовка формы
...................
...................
void имя_ф-ции(аргументы)
{CheckBox1->OnClick=NULL;
 CheckBox1->Checked=true;
 CheckBox1->OnClick=CheckBox1Click;}
На строке
"CheckBox1->OnClick=CheckBox1Click;" выскакивает ошибка
[C++ Error] COM_func.cpp(202): E2451 Undefined symbol 'CheckBox1Click'
Как правильно сделать?
Грендайзер вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка нажатия на STATIC DETONAVOMEK Win Api 2 23.07.2012 16:11
поиск ячейки в другом файле maksim_serg Microsoft Office Excel 21 05.08.2010 13:18
Получить в другом файле тот же текст, записанный заглавными буквами. Nightt Помощь студентам 5 21.06.2009 00:01
может ли программма выполнять действия описаные в другом файле? Iceman Общие вопросы Delphi 9 14.03.2009 21:22