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

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

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

Студворк — интернет-сервис помощи студентам
Здравствуйте. Уже несколько дней не могу решить проблему. В одной из своих функций создаю временный 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.01.2015, 16:38
Ответы с готовыми решениями:

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

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

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

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

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

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
 Аватар для Tordek
58 / 51 / 38
Регистрация: 22.01.2015
Сообщений: 176
22.01.2015, 18:03  [ТС]
Цитата Сообщение от 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
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
22.01.2015, 18:04
Значит, должно понимать.
0
 Аватар для Tordek
58 / 51 / 38
Регистрация: 22.01.2015
Сообщений: 176
22.01.2015, 18:10  [ТС]
volvo, но пишет: "undefined symbol 'SButtonClick'". В чём может быть дело?
0
Модератор
 Аватар для D1973
9911 / 6448 / 2455
Регистрация: 21.01.2014
Сообщений: 27,374
Записей в блоге: 3
22.01.2015, 18:34
Лучший ответ Сообщение было отмечено Tordek как решение

Решение

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

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

Добавлено через 2 минуты
Или нет, спасибо большое, уже нет необходимости. Заработало!!
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
22.01.2015, 19:39
Лучший ответ Сообщение было отмечено 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
 Аватар для Tordek
58 / 51 / 38
Регистрация: 22.01.2015
Сообщений: 176
23.01.2015, 01:40  [ТС]
Ща попробую и так, интересно ведь.

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

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

Либо более избирательно: назначать каждому компоненту при создании имя (свойство Name), и потом искать его через FindComponent по имени и удалять...
0
 Аватар для Tordek
58 / 51 / 38
Регистрация: 22.01.2015
Сообщений: 176
23.01.2015, 02:16  [ТС]
Я создал их с помощью new. По идее, теперь удалять должен с помощью delete, но нужно их удалить из обработчика кнопки SButton. Как это сделать, если Оба эти компоненты не локальные??
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
23.01.2015, 02:22
Я еще раз повторяю вопрос, как именно ты хочешь удалять? По отдельности, или сразу все?
0
 Аватар для Tordek
58 / 51 / 38
Регистрация: 22.01.2015
Сообщений: 176
23.01.2015, 02:42  [ТС]
Сразу всё.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
23.01.2015, 02:58
Лучший ответ Сообщение было отмечено 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
 Аватар для Tordek
58 / 51 / 38
Регистрация: 22.01.2015
Сообщений: 176
23.01.2015, 03:17  [ТС]
А как поместить эти компоненты в Список?

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

Добавлено через 8 минут
Но всё-равно не работает. Теперь программа не видит Список в KosmMapOp-е, т.к. тот локальный в FormCreat-е.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.01.2015, 03:17
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru