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

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

22.01.2015, 16:38. Показов 3472. Ответов 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
9929 / 6467 / 2457
Регистрация: 21.01.2014
Сообщений: 27,423
Записей в блоге: 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
33407 / 21517 / 8236
Регистрация: 22.10.2011
Сообщений: 36,918
Записей в блоге: 12
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
33407 / 21517 / 8236
Регистрация: 22.10.2011
Сообщений: 36,918
Записей в блоге: 12
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
33407 / 21517 / 8236
Регистрация: 22.10.2011
Сообщений: 36,918
Записей в блоге: 12
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
9929 / 6467 / 2457
Регистрация: 21.01.2014
Сообщений: 27,423
Записей в блоге: 3
22.01.2015, 18:34
Лучший ответ Сообщение было отмечено Tordek как решение

Решение

В том, о чем я и писал. Функцию void KosmMapOp(void), где создается кнопка SButton, тоже надо сделать членом класса формы. Или явно указать:
C++
1
SButton->OnClick = Form1->SButtonClick
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33407 / 21517 / 8236
Регистрация: 22.10.2011
Сообщений: 36,918
Записей в блоге: 12
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
33407 / 21517 / 8236
Регистрация: 22.10.2011
Сообщений: 36,918
Записей в блоге: 12
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
33407 / 21517 / 8236
Регистрация: 22.10.2011
Сообщений: 36,918
Записей в блоге: 12
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
33407 / 21517 / 8236
Регистрация: 22.10.2011
Сообщений: 36,918
Записей в блоге: 12
23.01.2015, 02:22
Я еще раз повторяю вопрос, как именно ты хочешь удалять? По отдельности, или сразу все?
0
 Аватар для Tordek
58 / 51 / 38
Регистрация: 22.01.2015
Сообщений: 176
23.01.2015, 02:42  [ТС]
Сразу всё.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33407 / 21517 / 8236
Регистрация: 22.10.2011
Сообщений: 36,918
Записей в блоге: 12
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
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru