Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
1 / 1 / 0
Регистрация: 25.09.2019
Сообщений: 39

Динамическое создание объектов на форме

03.02.2022, 22:58. Показов 3705. Ответов 12

Author24 — интернет-сервис помощи студентам
Доброго времени суток, Уважаемые программисты, помогите мне (Видимо недопрограммисту), в общем есть некая форма, на которой должно создаваться N объектов, оно создаётся, только определённого кол-во, как сделать чтоб кол-во этих объектов я мог выбирать сам?

Делаем получается опр-е...
C++ Скопировано
1
2
int const count = 15;
TImage *Order[count];
Далее (пример из формы) создаём сами объекты... Но, как задать кол-во этих объектов самостоятельно?
C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
for(int i = 0; i < count; i++){
        Order[i] = new TImage(AGS);
        Order[i]->Parent = OrderPlatform;
        Order[i]->Name = "idOrder" + (String)(i+1);
        Order[i]->Picture->LoadFromFile("C:\\Users\\Иван\\Desktop\\Диплом\\Art\\Menu\\Order\\BGorder Green.png");
 
        Order[i]->Top = 10 + i*115;
        Order[i]->Left = 10;
        Order[i]->Height = SIzeBGVork->Height;
        Order[i]->Width = SIzeBGVork->Width;
        Order[i]->Anchors = A;
 
        Order[i]->Center = true;
        Order[i]->Stretch = true;
 
        Order[i]->OnClick = Image1Click;
 
        PCountOrder->Caption = "Принято: " + IntToStr(count);
}
После конечно же чистим память...
C++ Скопировано
1
2
3
4
5
6
7
void __fastcall TAGS::FormClose(TObject *Sender, TCloseAction &Action)
{
 for (int i = 0; i < count; i++){
    delete Order[i];
    Order[i] = NULL;
  }
}
Вот как тут избавиться от int const, как бы я не пробовал, компилятор пропускает разные варианты, но при закрытии закрывает форму с ошибкой, что не знает что удалять или что-то подобное...
C++ Скопировано
1
2
int const count = 15;
TImage *Order[count];
Заранее спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.02.2022, 22:58
Ответы с готовыми решениями:

Динамическое создание объектов
Здравствуйте, подскажите пожалуйста как решить задачку... Пусть известно кол-во строк = 10 как сделать так чтоб в одной строке было:...

Динамическое создание объектов
Всем привет! Задача По нажатию кнопки &quot;Create&quot; создается двумерный массив элементов TCheckBox и располагается на форме. По...

Динамическое создание объектов
Как можно сделать, программное создание N-ого количества label'ов Допустим, я в Edit ввожу число 5, и создаётся 5 label'ов

12
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33118 / 21414 / 8219
Регистрация: 22.10.2011
Сообщений: 36,746
Записей в блоге: 9
04.02.2022, 05:07
После конечно же чистим память
Не нужно этого делать. У созданных объектов есть Owner, вот он и будет заниматься удалением всего, чьим владельцем является. Ручное удаление не требуется.
1
1 / 1 / 0
Регистрация: 25.09.2019
Сообщений: 39
04.02.2022, 07:11  [ТС]
Если я правильно понял, мы можем избавиться от
C++ Скопировано
1
int const count =
Сделав
C++ Скопировано
1
int count;
Что даёт нам возможность изменять данные переменной, следовательно, вопрос решён? Хорошо, спасибо, проверю немного позже.
0
случайный прохожий
 Аватар для gunslinger
3170 / 2184 / 638
Регистрация: 20.07.2013
Сообщений: 5,847
04.02.2022, 09:24
Это не поможет. Размер массива должен быть константой.

Посмотри здесь - Ханойские башни, я как-то пытался сделать что-то подобное (связанное с твоим вопросом). Там еще люди хорошие советы давали, но в виду моей глупости я до сих пор не все понял.
Тебе может больше повезет.
1
1 / 1 / 0
Регистрация: 25.09.2019
Сообщений: 39
04.02.2022, 09:29  [ТС]
Очень грустно звучит, но спасибо, будем экспериментировать)
0
Модератор
 Аватар для D1973
9729 / 6325 / 2442
Регистрация: 21.01.2014
Сообщений: 26,955
Записей в блоге: 3
04.02.2022, 09:35
ivauuka99, а что, массив прямо так вот обязателен? Есть же вектора, есть списки...

Добавлено через 1 минуту
Цитата Сообщение от ivauuka99 Посмотреть сообщение
Order[i]->Picture->LoadFromFile("C:\\Users\\Иван\\Desktop\ \Диплом\\Art\\Menu\\Order\\BGorder Green.png");
надеюсь, Вы отдаете себе отчет, что работать этот путь будет только на Вашем компьютере. Надо объяснять, почему?
0
1 / 1 / 0
Регистрация: 25.09.2019
Сообщений: 39
04.02.2022, 09:52  [ТС]
Да есть, нужно захватить их глобально, просто… опорой для изучения, становится диплом)
Приходится тянуть любую информацию, дабы разобраться с собственно поставленной целью!

Добавлено через 46 секунд
Это временно, я сначала строю основу, для дальнейшего связывания его с БД

Добавлено через 2 минуты
В дальнейшем, там будет выводится фото (фон) статуса заказа. То есть если в order статус (срочно, срочно с комментом), то соотвественно он будет забирать из сервера с бд данные и опираться на них.

А пока нужно разобраться с основами формы, настроить и подогнать все под идеал, чтоб потом было проще подогнать все под бд)
Спасибо, за понимание!

Добавлено через 13 минут
Если я правильно понял, то проще сделать:
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
#include <vector>
 
int count;
 
count = (от куда вводим);
 
vector<int> Order;
 
for(int i = 0; i < count; i++){
 
       Order[i] = new TImage(AGS);
        Order[i]->Parent = OrderPlatform;
        Order[i]->Name = "idOrder" + (String)(i+1);
        Order[i]->Picture->LoadFromFile("C:\\Users\\Иван\\Desktop\\Диплом\\Art\\Menu\\Order\\BGorder Green.png");
 
        Order[i]->Top = 10 + i*115;
        Order[i]->Left = 10;
        Order[i]->Height = SIzeBGVork->Height;
        Order[i]->Width = SIzeBGVork->Width;
        Order[i]->Anchors = A;
 
        Order[i]->Center = true;
        Order[i]->Stretch = true;
 
        Order[i]->OnClick = Image1Click;
 
        PCountOrder->Caption = "Принято: " + IntToStr(count);
}
И дело в шляпе?
А освобождение памяти требуется? Или как куда?
0
Модератор
 Аватар для D1973
9729 / 6325 / 2442
Регистрация: 21.01.2014
Сообщений: 26,955
Записей в блоге: 3
04.02.2022, 10:17
Цитата Сообщение от ivauuka99 Посмотреть сообщение
vector<int> Order;
???
могу ошибиться, пишу по памяти, проверить негде пока...
C++ Скопировано
1
2
3
4
5
6
7
8
vector<TImage> Order;
int count = Edit1->Text.ToInt;
TImage *I;
for(int i = 0; i < count; i++) {
  I = new TImage(AGS);
  ...
  Order.push_back(I);
}
как-то так...
1
1 / 1 / 0
Регистрация: 25.09.2019
Сообщений: 39
04.02.2022, 10:19  [ТС]
Ну, да… я просто примером накинул, что смысл правильный, а сами объекты понятны…
Спасибо, после работы обязательно проверю!
0
2 / 2 / 1
Регистрация: 27.10.2019
Сообщений: 27
08.02.2022, 09:35
Цитата Сообщение от ivauuka99 Посмотреть сообщение
Вот как тут избавиться от int const

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//------
private:
  std::vector<TImage*> imgOrder;
  
  
//------------------
OnFormCreate..
{
  TImage* imgImage = new TImage(AGS);
  
  imgImage->Parent = OrderPlatform; 
  imgImage->Name = Format(_TEXT("idOrder%d"), i+1);
  imgImage->Top = 10 + (i*115);
  imgImage->Left = 10;
  imgImage->Height = SIzeBGVork->Height;
  imgImage->Width = SIzeBGVork->Width;
  imgImage->Anchors = A;
  
  imgImage->Center = true;
  imgImage->Stretch = true;
  
  imgImage->OnClick = Image1Click;
  
  imgOrder.push_back(imgImage);
  
  /* а по хорошему тебе надо LoadStr из ресурса */
  PCountOrder->Caption = Format(_TEXT("Принято: %d"), count);
} 
 
 
/*
  _TEXT() это макро и должно использоваться везде где у тебя есть string ""
  _TEXT() преобразовывает "string" в L"string" если надо
 
 
  Все стринги у тебя должны быть в ресурс файле .RC и должен быть header .H c ID ресурсов.
  Так чтобы если тебе надо стринг ты берёшь его из ресурса....
 
  Log->Entry(2, Format(String::LoadStr(IDS_LOOKING_FOR_STYLES_IN).с_str(), stylesDir));
 
  эквивалент
 
  Log->Entry(2, Format(_TEXT("Looking for styles in %s"), stylesDir));
 
  но с фишкой... Я могу изменить текс хоть на китайский без изменения кода. 
*/
 
 
//----------------------------------------
OnFormDestroy..
{
  // ВСЕГДА УДАЛЯЙ ТО ЧТО ТЫ СОЗДАЛ, НЕ СЛУШАЙ НИКОГО ПРО АВТО УДАЛЕНИЕ
  // ЕСЛИ БЫЛ operator new 
  // ДОЛЖЕН БЫТЬ operator delete
  // а если не будет, будешь дело иметь с утечкой памяти!!!
  
  
  while(imgOrder.empty() == false) {
      delete imgOrder.back();
      imgOrder.pop_back();
  }  
}
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33118 / 21414 / 8219
Регистрация: 22.10.2011
Сообщений: 36,746
Записей в блоге: 9
08.02.2022, 11:07
u666sa, твой код вполне способен привести к вылету из-за некорректной работы с указателями. Прекрати давать откровенно вредные советы. И учи матчасть, в частности - касательно механизма владения в VCL.
0
1 / 1 / 0
Регистрация: 25.09.2019
Сообщений: 39
25.02.2022, 00:09  [ТС]
Лучше?)
C++ Скопировано
1
2
3
FileExists(FindFirst(ExtractFilePath(Application->ExeName) + "\\tdata\\user_data\\*.png", faAnyFile, Folder)
ExtractFilePath(Application->ExeName) + "\\tdata\\user_data\\" + Folder.Name
FindClose(Folder);
0
Модератор
 Аватар для D1973
9729 / 6325 / 2442
Регистрация: 21.01.2014
Сообщений: 26,955
Записей в блоге: 3
25.02.2022, 13:21
Цитата Сообщение от ivauuka99 Посмотреть сообщение
Лучше?
Лучше чем что? Или лучше чего? Но даже если опустить эти непонятки, то:
1. FileExists() - это функция, возвращающая логическое значение: истина, если файл существует и ложь, если файла нет. Поэтому использовать ее в том контексте, в каком ее используете Вы, просто бессмысленно.
2. ExtractFilePath() функция, возвращающая путь из имени файла и этот путь уже включает в себя конечный разделитель. Вот выдержка из справки по этой функции:
The resulting string is the leftmost characters of FileName, up to and including the colon or backslash that separates the path information from the name and extension.
Поэтому, добавляя еще один, Вы или получите ошибку или просто файл не найдется - только и всего.
3. FindFirst() - это, как бы, совсем уж древний метод поиска файлов. У Вас ВСВ 6?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.02.2022, 13:21
Помогаю со студенческими работами здесь

Динамическое создание объектов класса
Всем привет. При компиляции выдает ошибку Unit1.cpp(26): E2451 Undefined symbol 'product' и Unit1.cpp(43): E2451 Undefined symbol...

Динамическое создание и удаление объектов VCL
Не получается сделать программу на C++ Bilder Разработать приложение, которое динамически создает и удаляет объекты VCL. На...

Динамическое создание VCL-объектов из dll
Тренируюсь использовать динамически dll. Пока все вроде получается, но есть одна неясность. Задача примерно такая: сделать из dll...

QML. Динамическое создание объектов
Доброго времени суток, форумчане! Только начинаю разбираться с QML и возник следующий вопрос: Каким образом можно динамически добавлять...

Динамическое создание виджетов на форме
Здраствуйте, пробую создание множества виджетов на форме, по кнопке те по нажатию на кнопку на форме пояфляется скажем 10 независимых...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
На любовном киберфронте
Alexander-7 01.04.2025
Недавно на одном малоизвестном сайте знакомств мною заинтересовалась девушка: «Текст немного странный. Но, судя по адресу почты, иностранка», – подумал я. Поколебавшись пару суток, я ответил ей:. . .
Как работает Node.js изнутри
run.dev 29.03.2025
Node. js изменил подход к разработке веб-приложений, позволив использовать JavaScript не только на стороне клиента, но и на сервере. Созданный в 2009 году Райаном Далем, этот открытый,. . .
Моки в Python: Mock Object Library
py-thonny 29.03.2025
Тестирование кода требует особого подхода, когда речь идёт о компонентах, взаимодействующих с внешним миром. Мы часто сталкиваемся с непредсказуемостью HTTP-запросов, чтением данных из базы или. . .
JavaScript: Управление памятью и улучшение производительности
run.dev 29.03.2025
В отличие от низкоуровневых языков программирования, JavaScript не требует ручного выделения и освобождения памяти. Здесь работает автоматический сборщик мусора, который определяет, какие объекты. . .
Мультитенантная архитектура со SpringBoot и PostgreSQL
ArchitectMsa 29.03.2025
SaaS-приложения редко обслуживают одного клиента и обычно они должны поддерживать множество организаций, каждая из которых работает в своём изолированном пространстве. Мультитенантная архитектура. . .
std::span в C++: Производительность и лучшие практики
NullReferenced 28.03.2025
std::span — одно из самых недооценённых нововведений стандарта C++20, которое радикально меняет подход к работе с непрерывными последовательностями данных. По сути, это невладеющее представление. . .
Многопоточность в C#: Threadpool
UnmanagedCoder 28.03.2025
Пул потоков в C# — это коллекция заранее созданных и готовых к использованию потоков, которые находятся в распоряжении приложения. Вместо того чтобы создавать и уничтожать потоки для каждой небольшой. . .
Вопросы на собеседованиях по микросервисам
ArchitectMsa 27.03.2025
Работодатели ищут не просто разработчиков, знающих базовые концепции, а специалистов, разбирающихся в тонкостях масштабирования, отказоустойчивости и производительности. Сейчас на первый план выходят. . .
Взаимодействие Python с REST API
py-thonny 27.03.2025
REST API - это архитектурный стиль взаимодействия компонентов распределённого приложения в сети. Python располагает функциональным набором инструментов для работы с REST API и основная библиотека для. . .
sshd restrictions, ssh access limitations
jigi33 26.03.2025
sshd restrictions | ssh access limitations рестрикции доступа на сервер sshd статья: https:/ / www. golinuxcloud. com/ restrict-allow-ssh-certain-users-groups-rhel подробные расшифровки по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер