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

Программное создание элементов формы.

21.01.2012, 17:44. Показов 15221. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Только начал освоение C++, работаю в Borland С++ Builder 6. Возникла потребность создания Edit -ов на форме программным путем, то есть количество edit -ов заранее неизвестно, при нажатии на кнопку добавить элемент необходимо Создать новый Edit на форме, старые сместить ниже (ну как выставить атрибуты позиции, размера понятно), может кто то подсказать каким образом это можно реализовать?
Каким образом вообще программно можно создать элементы формы?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.01.2012, 17:44
Ответы с готовыми решениями:

Программное создание формы
В проекте имеется несколько готовых форм, которые не создаются автоматически. Как программно правильно создать(или активизировать) форму и...

Программное создание объектов формы
Задача простая - вывести на форму определённое (вычисляемое) количество контейнеров с текстом и потом их программно перемещать в...

Программное создание ярлыка...
Всем привет :) Как программно создать ярлык программы на рабочем столе и в панели быстрого запуска?

10
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 14
21.01.2012, 19:15  [ТС]
Спасибо за пример.
Возник вопрос по конкретной ситуации... Пробую сделать форму работы со стеком.
изначально использовал Memo просто для написания программы, теперь дело дошло до удобства использования. Проблема в следующем -> Необходимо каждому новому edit менять имя, что я и делаю, но сделал это коряво в цикле, при каждом нажатии он пытается создать новые элементы от 1 до последнего, в том числе с уже существующими именами, нету ли идей как этого избежать?
То есть следить какие Edit[i] уже созданы и пропускать их.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __fastcall TFormStek::BtnAddClick(TObject *Sender)
{
int i;
int n=(st->Size()+1);
for (i = 1; i <= n; i++)
{
TEdit* T=new TEdit(FormStek);
 T->Parent=FormStek;
 T->Left=30;
 T->Top=40+30*i;
 T->Name="Edit" + IntToStr(i);
 T->Caption=(Element->Text);
}
}
Добавлено через 32 минуты
Решил проблему. введением двух глобальных переменных:
C++
1
2
int i;
int k;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TFormStek::BtnAddClick(TObject *Sender)
{
TEdit* T=new TEdit(FormStek);
if(k!=1)
i=1;
i=i+1;
 T->Parent=FormStek;
 T->Left=30;
 T->Top=40+30*i;
 T->Name="Edit" + IntToStr(i);
 T->Text=Edit1->Text;
 k=1;
AnsiString msg = Edit1->Text;
st->Push(msg.c_str());
Memo1->Lines->Add(Edit1->Text);
}
Добавлено через 16 минут
Возникает очередной вопрос - необходима смена значений Top у ранее созданных Edit, то есть
если i=3 то Edit2->Top=40+30;
если i=4 то Edit3->Top=40+30; Edit2->Top=40+30*2;
если i=5 то Edit4->Top=40+30; Edit3->Top=40+30*2;Edit2->Top=40+30*3;
и т.д... что то никак не могу придумать реализацию этого....
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
21.01.2012, 19:32
русско-английский словарик в помощь :
C++
1
2
3
4
5
6
7
8
9
10
11
12
if (i==3) {
  Edit2->Top=40+30;
}
else if (i==4) {
  Edit2->Top=40+30*2;
  Edit3->Top=40+30;
}
else if (i==5) {
  Edit2->Top=40+30*3; 
  Edit3->Top=40+30*2;
  Edit4->Top=40+30;
}
0
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 14
21.01.2012, 20:07  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
русско-английский словарик в помощь :
C++
1
2
3
4
5
6
7
8
9
10
11
12
if (i==3) {
  Edit2->Top=40+30;
}
else if (i==4) {
  Edit2->Top=40+30*2;
  Edit3->Top=40+30;
}
else if (i==5) {
  Edit2->Top=40+30*3; 
  Edit3->Top=40+30*2;
  Edit4->Top=40+30;
}
Проблема в том что количество Edit неограничено, неизвестно заранее сколько их будет

Добавлено через 8 минут
то есть надо сделать "какой то цикл" с "какой то" общей формулой

Добавлено через 3 минуты
А главная проблема - я не знаю как обратиться к ранее созданным Edit -ам

Добавлено через 22 минуты
Вроде похоже на правду, но вызов Edit -ов неверный, помогите плз кто знает, как можно вызвать Edit[i] ???
C++
1
2
3
4
5
6
7
8
9
10
if (i>=3)
{
int o;
for (o = 3; o <= i; o++)
{
TEdit* B;
B->Top=27*(i-(o-2));
B->Name="Edit" + IntToStr(o);
}
}
0
3 / 3 / 2
Регистрация: 22.01.2012
Сообщений: 21
22.01.2012, 13:53
а почему нужно использовать именно Edit 'ы? не проще ли обойтись каким-нибудь StringList, например?
0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
22.01.2012, 14:07
Цитата Сообщение от Spenser13 Посмотреть сообщение
Проблема в том что количество Edit неограничено, неизвестно заранее сколько их будет
А нельзя после каждого созданного Edita сохранять его номер (например в ини), и при создании нового считать эту информацию и на ее основе создавать новый Edit
например создал Edit2, записываеш в ини 2, теперь создадим новый:
считываем из ини
C++
1
Str = 2 + 1;
и создаем новый Edit3
C++
1
Edit->Name="Edit" + "Str";
и опять записываем в ини Str (3).
0
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 14
22.01.2012, 15:52  [ТС]
Цитата Сообщение от Gypnofrog Посмотреть сообщение
а почему нужно использовать именно Edit 'ы? не проще ли обойтись каким-нибудь StringList, например?
Уже было сделано с Memo все, но на для наглядности решил использовать Edit.
Там 3 формы 1 для стеков, другая для деков, третья для очередей. И чтобы наглядно и красиво показать разницу между ними, решил использовать Edit ы ну и +Label над ними тоже создавать.

Но в целом честно говоря, просто чтобы получше освоить CPP Builder, просто - есть цель, возникают трудности, необходимо найти пути их решения, а когда будет готово все, тебя уже не поставит в тупик подобная задача.

Добавлено через 1 час 33 минуты
Цитата Сообщение от Samrisbe Посмотреть сообщение
А нельзя после каждого созданного Edita сохранять его номер (например в ини), и при создании нового считать эту информацию и на ее основе создавать новый Edit
например создал Edit2, записываеш в ини 2, теперь создадим новый:
считываем из ини
C++
1
Str = 2 + 1;
и создаем новый Edit3
C++
1
Edit->Name="Edit" + "Str";
и опять записываем в ини Str (3).
ну как я понимаю это просто другой способ записи того что было
C++
1
Edit->Name="Edit" + IntToStr(i);
Вопрос как потом вытянуть
C++
1
Edit[i]->Top
и присвоить ему значение

Добавлено через 4 минуты
В итоге сейчас у меня пока получилось
Переменные глобальные
C++
1
2
int i;
int k;
И сам click кнопки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
TEdit* T=new TEdit(FormStek);
if(k!=1)
{
i=1;
}
i=i+1;
if (i>=3)
  for (int o = 2; o < FormStek->ComponentCount; o++)
        {
                        if(((TEdit*)FormStek->Components[o])->Tag == o)
                        {
                        Edit1->Text="Ïî òåãó èùåò";
 
                                ((TEdit*)FormStek->Components[o])->Top = 27*(i-(o-2));
                        }
        }
 T->Parent=FormStek;
 T->Left=30;
 T->Top=27;
 T->Name="Edit" + IntToStr(i);
 T->Text=Edit1->Text;
 T->Tag = i;
 k=1;
Добавлено через 1 минуту
но даже при такой записи почему то не ищет по тегу, то есть Edit1->Text остается неизменным, даже при 10 созданных Edit ах
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
23.01.2012, 01:32
Цитата Сообщение от Spenser13 Посмотреть сообщение
for (int o = 2; o < FormStek->ComponentCount; o++)
{
if(((TEdit*)FormStek->Components[o])->Tag == o)
{
Edit1->Text="По тегу ищет";
((TEdit*)FormStek->Components[o])->Top = 27*(i-(o-2));
}
}
Я вашей мысли никак уловить не могу... Цикл от 2 до количества компонентов -1, если у компонента с индексом "o" значение метки будет равно идексу "o" (лучше забудьте название этой переменной), то записать в Edit1 текст "по тегу ищет" и изменить данные положения этого едита. Попахивает все-таки необходимостью использования банального Memo, ListBox, RichEdit...
Цитата Сообщение от Spenser13 Посмотреть сообщение
но даже при такой записи почему то не ищет по тегу, то есть Edit1->Text остается неизменным, даже при 10 созданных Edit ах
Tag не равен индексу, какая тут загадка? Видимо не записываете данные или записываете не верно. И честно говоря так и не понял зачем. Чтобы определить динамческий Edit? так запишите какую-нибудь константу в них, чтобы не надо было вычислять он или не он. А если просто Edit определить, тогда ClassNameIs в помощь.
0
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 14
23.01.2012, 07:19  [ТС]
Цитата Сообщение от DefineTrueFalse Посмотреть сообщение
Я вашей мысли никак уловить не могу... Цикл от 2 до количества компонентов -1, если у компонента с индексом "o" значение метки будет равно идексу "o" (лучше забудьте название этой переменной), то записать в Edit1 текст "по тегу ищет" и изменить данные положения этого едита. Попахивает все-таки необходимостью использования банального Memo, ListBox, RichEdit...

Tag не равен индексу, какая тут загадка? Видимо не записываете данные или записываете не верно. И честно говоря так и не понял зачем. Чтобы определить динамческий Edit? так запишите какую-нибудь константу в них, чтобы не надо было вычислять он или не он. А если просто Edit определить, тогда ClassNameIs в помощь.
Данная запись была сделана по совету
в Этой теме
Вопрос решил, но иным способом, в той теме выложено все.
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
23.01.2012, 08:01
Цитата Сообщение от Spenser13 Посмотреть сообщение
Данная запись была сделана по совету
в Этой теме
Вопрос решил, но иным способом, в той теме выложено все.
Там вам дали пример (и даже объяснили, что как и почему), как динамически создавать компоненты и управлять ими, но это не панацея. На форме созданы не только ваши Edit, но и другие компоненты, так что пробегаясь по списку, далеко не всегда индекс компонента будет совпадать с его Tag, заданным вами. А в случае, когда поиск начинается с 2, то возникает еще большие сомнений в этом. Могу посоветовать начинать не с управления войск, а научится управлять хотя бы одной боевой единицей, иными словами динамически создайте один компонент и попробуйте управиться с ним. А использовать его имя, метку, позицию, указатель или что-то другое для его определения, это уже третье дело.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.01.2012, 08:01
Помогаю со студенческими работами здесь

Программное создание элементов класса
Здравствуйте. Столкнулся с проблемой: программно создаю несколько объектов класса LabeledEdit. Код работает, но к ним нельзя обратиться в...

Программное создание БД на с++
Народ подскажите пожалуйста как создать программно mdb файл. Делал так Variant acs =...

Программное создание формы
Пишу программу в блокноте чтобы лучше выучить язык, у меня возникла такая проблемка установил на форме элемент MainMenuStrip и ToolStrip но...

Программное создание элемента формы
Создаю элемент с помощью процедуры. procedure TForm1.ComboCreate(i: Integer; name: string); begin Combo:=TsComboBoxEx.Create(Form1); ...

Программное создание и удаление ревизита формы в 1с 8.3 УФ
Всем добрый день. Никак не могу понять как удалить ранее программно созданный реквизит формы в обработке Создаю так: ...


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

Или воспользуйтесь поиском по форуму:
11
Закрытая тема Создать тему
Новые блоги и статьи
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
Dispose и Finalize в C#
stackOverflow 12.06.2025
Работая с C# больше десяти лет, я снова и снова наблюдаю одну и ту же историю: разработчики наивно полагаются на сборщик мусора, как на волшебную палочку, которая решит все проблемы с памятью. Да,. . .
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »