Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
58 / 51 / 38
Регистрация: 22.01.2015
Сообщений: 176
1

Использование new по отношению к компонентам формы

22.01.2015, 16:38. Показов 2775. Ответов 43
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Уже несколько дней не могу решить проблему. В одной из своих функций создаю временный Image и SpeedButton с помощью new. И, вроде всё работает, ошибок нет, НО пытался создать обработчик событий этой кнопки, а его будто и нету, при нажатии на кнопку ничего не происходит. Подскажите, в чём же ошибка? В Unit1.h обьявил ф-цию нажатия на кнопку, вроде все грамотно, но..
Вот фрагменты кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void KosmMapOp(void)
{TImage *Image=new TImage(Form1);
Image->Parent=Form1;
Image->Picture->LoadFromFile("Images\\Карта космодрома.bmp");
Image->Stretch=true;
Image->Left=176;
Image->Top=56;
Image->Height=452;
Image->Width=633;
Buttvis();
Form1->Memo1->Visible=0;
Form1->Memo2->Visible=0;
TSpeedButton *SButton=new TSpeedButton(Form1);
SButton->Parent=Form1;
SButton->Left=784;
SButton->Top=56;
SButton->Height=25;
SButton->Width=25;
SButton->Glyph->LoadFromFile("Images\\buttonclose.bmp");
 
}
//...
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
void __fastcall TForm1::SButtonClick(TObject *Sender)
{Form1->Memo1->Visible=1;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.01.2015, 16:38
Ответы с готовыми решениями:

Как обращаться к компонентам формы в классе, не прописывая везде имя формы
Добрый вечер. Имеем одну форму (Class Form2), ну или две как у меня, было принято решение раскидать...

Цикл по компонентам формы
Подскажите, пожалуйста, как реализовать задачу. На форме есть много разных Edit, Label. Мне...

Цикл по компонентам формы
На форме несколько текстбоксов, для каждого делаем if (textBox1.Text.Contains('.')) ...

Обращение к компонентам формы
Добрый вечер, господа форумчане . Суть проблемы кратко : Задача состоит в том , что бы ...

43
Модератор
9256 / 6034 / 2379
Регистрация: 21.01.2014
Сообщений: 25,795
Записей в блоге: 3
22.01.2015, 16:56 2
Tordek, на мой взгляд, функцию void KosmMapOp(void) имеет смысл сделать членом класса формы. А по существу... Где в твоем коде назначение события OnClick для вновь созданной кнопки? Я что-то не увидел ничего похожего на...
C++
1
SButton->OnClick = ... //Имя твоей написанной функции
0
58 / 51 / 38
Регистрация: 22.01.2015
Сообщений: 176
22.01.2015, 17:14  [ТС] 3
Цитата Сообщение от Tordek Посмотреть сообщение
void __fastcall TForm1::SButtonClick(TObject *Sender) {Form1->Memo1->Visible=1; }
Я написал отдельным обработчиком событий. Или так нельзя?

Добавлено через 1 минуту
И как осуществить ваше предложение?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
22.01.2015, 17:52 4
Цитата Сообщение от Tordek Посмотреть сообщение
Я написал отдельным обработчиком событий
Это написан сам обработчик. Теперь компоненту надо сказать, что когда сработает OnClick, должна выполниться та функция:
C++
1
SButton->OnClick = SButtonClick;
1
58 / 51 / 38
Регистрация: 22.01.2015
Сообщений: 176
22.01.2015, 17:57  [ТС] 5
volvo, Он не понимает, что такое SButtonClick, В чем проблема?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
22.01.2015, 18:00 6
Прототип в классе формы есть?

C++
1
2
3
4
5
6
7
8
9
10
11
class TForm1 : public TForm
{
__published: // IDE-managed Components
    // ...
 
private: // User declarations
    void __fastcall SButtonClick(TObject *Sender); // Здесь, например
 
public: // User declarations
    __fastcall TForm1(TComponent* Owner);
};
0
58 / 51 / 38
Регистрация: 22.01.2015
Сообщений: 176
22.01.2015, 18:03  [ТС] 7
Цитата Сообщение от volvo Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
class TForm1 : public TForm
{
__published: // IDE-managed Components
  void __fastcall SButtonClick(TObject *Sender); //У меня он здесь
private: // User declarations
 
public: // User declarations
 __fastcall TForm1(TComponent* Owner);
};
Есть
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
22.01.2015, 18:04 8
Значит, должно понимать.
0
58 / 51 / 38
Регистрация: 22.01.2015
Сообщений: 176
22.01.2015, 18:10  [ТС] 9
volvo, но пишет: "undefined symbol 'SButtonClick'". В чём может быть дело?
0
Модератор
9256 / 6034 / 2379
Регистрация: 21.01.2014
Сообщений: 25,795
Записей в блоге: 3
22.01.2015, 18:34 10
Лучший ответ Сообщение было отмечено Tordek как решение

Решение

В том, о чем я и писал. Функцию void KosmMapOp(void), где создается кнопка SButton, тоже надо сделать членом класса формы. Или явно указать:
C++
1
SButton->OnClick = Form1->SButtonClick
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
22.01.2015, 18:36 11
Ах, так у тебя KosmMapOp - не метод класса формы? Тогда понятно, делай эту функцию методом класса формы лучше всего...
0
58 / 51 / 38
Регистрация: 22.01.2015
Сообщений: 176
22.01.2015, 19:37  [ТС] 12
D1973, каак сделать KosmMapOp методом класса? Я без понятия, подскажите, пожалуйста..

Добавлено через 43 минуты
volvo, а Вы можете обьяснить, пожалуйста?

Добавлено через 2 минуты
Или нет, спасибо большое, уже нет необходимости. Заработало!!
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
22.01.2015, 19:39 13
Лучший ответ Сообщение было отмечено BRcr как решение

Решение

Внести следующие изменения:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
header-файл:
 
class TForm1 : public TForm
{
__published: // IDE-managed Components
    // ...
 
private: // User declarations
    void __fastcall KosmMapOp(void);  // <--- Раз, добавить строку
 
public: // User declarations
    __fastcall TForm1(TComponent* Owner);
};
cpp-файл:
C++
1
2
3
4
void __fastcall TForm1::KosmMapOp(void) // <--- Два, исправить строку
{TImage *Image=new TImage(Form1);
Image->Parent=Form1;
// ... дальше без изменений
1
58 / 51 / 38
Регистрация: 22.01.2015
Сообщений: 176
23.01.2015, 01:40  [ТС] 14
Ща попробую и так, интересно ведь.

Добавлено через 35 секунд
volvo, Так тоже работает, но вопрос - чем такой способ лучше?

Добавлено через 5 часов 44 минуты
А теперь ещё одна проблема(( Сделал всё как вы сказали, но как мне теперь удалить созданные обьекты??
Подскажите, пожалуйста, ещё раз.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
23.01.2015, 02:05 15
Цитата Сообщение от Tordek Посмотреть сообщение
как мне теперь удалить созданные обьекты??
Способов много, смотря как ты хочешь удалять. Если все, что создавалось, должно быть удалено сразу - то проще всего добавить компоненты после создания в общий TObjectList, и потом, когда компоненты больше не нужны - удалить этот ObjectList, что повлечет за собой удаление всех компонентов, содержащихся в нем...

Либо более избирательно: назначать каждому компоненту при создании имя (свойство Name), и потом искать его через FindComponent по имени и удалять...
0
58 / 51 / 38
Регистрация: 22.01.2015
Сообщений: 176
23.01.2015, 02:16  [ТС] 16
Я создал их с помощью new. По идее, теперь удалять должен с помощью delete, но нужно их удалить из обработчика кнопки SButton. Как это сделать, если Оба эти компоненты не локальные??
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
23.01.2015, 02:22 17
Я еще раз повторяю вопрос, как именно ты хочешь удалять? По отдельности, или сразу все?
0
58 / 51 / 38
Регистрация: 22.01.2015
Сообщений: 176
23.01.2015, 02:42  [ТС] 18
Сразу всё.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
23.01.2015, 02:58 19
Лучший ответ Сообщение было отмечено Tordek как решение

Решение

В таком случае
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void __fastcall TForm1::KosmMapOp(void)
{TImage *Image=new TImage(Form1);
Image->Parent=Form1;
ObjList->Add(Image); // Добавляем в список объектов
Image->Picture->LoadFromFile("Images\\Карта космодрома.bmp");
Image->Stretch=true;
Image->Left=176;
Image->Top=56;
Image->Height=452;
Image->Width=633;
Buttvis();
Form1->Memo1->Visible=0;
Form1->Memo2->Visible=0;
TSpeedButton *SButton=new TSpeedButton(Form1);
SButton->Parent=Form1;
ObjList->Add(SButton); // Это тоже добавляем в список объектов
SButton->Left=784;
SButton->Top=56;
SButton->Height=25;
SButton->Width=25;
SButton->Glyph->LoadFromFile("Images\\buttonclose.bmp");
}
 
//...
 
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
    ObjList = new TObjectList(); // переменная TObjectList *ObjList описывается в классе формы...
}
 
// ...
 
// когда нужно удалить все объекты, созданные ранее динамически - просто вызываешь:
delete ObjList;
При удалении ObjectList-а, для каждого из тех объектов, который в нем хранится, будет вызван деструктор, и все они будут уничтожены...
2
58 / 51 / 38
Регистрация: 22.01.2015
Сообщений: 176
23.01.2015, 03:17  [ТС] 20
А как поместить эти компоненты в Список?

Добавлено через 8 минут
Ай, не заметил, поздно уже. Спасибо!!

Добавлено через 8 минут
Но всё-равно не работает. Теперь программа не видит Список в KosmMapOp-е, т.к. тот локальный в FormCreat-е.
0
23.01.2015, 03:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.01.2015, 03:17
Помогаю со студенческими работами здесь

Позиция формы по отношению к другой форме
Нужно сделать, чтобы форма отображалась ровно над другой формой. Использовал Location, но не...

Обращение к компонентам другой формы
добрый день, господа! у меня такой вопрос. есть 2 формы Form1 и Form2. на первой форме...

Доступ к компонентам формы из потока
имеется условно: private void button1_Click(object sender, EventArgs e) { Thread FirstThread =...

Обращение к компонентам другой формы
Есть две формы: mainwindow.ui searchdialog.ui на форме searchdialog есть кнопка pushButton,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru