С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648

Клонирование в Runtime компонента, созданного в DesignTime

13.11.2018, 06:59. Показов 1837. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте.

На этапе проектирования создаётся компонент Button1, настраивается ряд его свойств.
Теперь стоит задача: при загрузке формы создать ряд из абсолютно таких же кнопок, расположенных друг под другом.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
    TButton *btn[5];
    btn[0] =  Button1;
    btn[0]->Tag = 0;
    btn[0]->OnClick = BtnClick;
 
    for (int i=1;i<5;i++)
    {
        btn[i] = new TButton(this);
        btn[i]->Parent = this;
        btn[i]->Caption = Button1->Caption;
        btn[i]->Top = btn[i-1]->Top + Button1->Height + 10;
        btn[i]->Left = Button1->Left;
        btn[i]->Width = Button1->Width;
        btn[i]->Height = Button1->Height;
        btn[i]->Tag = i;
        btn[i]->OnClick = BtnClick;
    }
}
Довольно громоздко получается. А если у Button1 изменены не только размеры и заголовок...
А если кнопок не 5 а 50.
Нельзя ли одной командой присваивать все свойства Button1 очередному члену массива btn?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.11.2018, 06:59
Ответы с готовыми решениями:

Определить, как запускается приложение - в DesignTime или в RunTime
Работаем с обычным приложением (формой), не элементом управления. В качестве примера приведу следующую ситуацию. При работе над проектом...

This view is not constrained. It only has designtime positions, so it will jump to (0,0) at runtime unless you add the c
Друзья! Привет! Только начал изучать разработку под андроид, так вот, при добавлении элементов в макет, появляется сообщение из сабжа....

Добавление ранее созданного компонента в проект
Здравствуйте! Я недавно стал изучать Qt. Использую Qt-Creator. Создал компоненту (кнопку по урокам), а как теперь создать новый...

19
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
13.11.2018, 10:38
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

jkrnd, нечто подобное и меня когда-то интересовало. Вот в этой теме есть вариант решения (через MemoryStream). Возможно пригодится...
1
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,240
13.11.2018, 10:50
А просто свойства скопировать - не пойдет что-ли? Ну в смысле, что берем свойства компонента времени проектирования и копируем в свойства динамически созданных компонентов. - Так не будет что-ли работать?
1
Модератор
 Аватар для D1973
9909 / 6446 / 2455
Регистрация: 21.01.2014
Сообщений: 27,364
Записей в блоге: 3
13.11.2018, 10:58
FFPowerMan, это прямо в стартовом топике было проделано... Но, по мнению ТС-а
Цитата Сообщение от jkrnd Посмотреть сообщение
Довольно громоздко получается.
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
13.11.2018, 11:04
TFrame? Не, не слышал. Плевать, что он решает задачу на раз, достаточно просто его СОЗДАТЬ, и все то, что непосильным трудом было настроено в дизайнере, будет автоматически продублировано в экземпляре фрейма, мы будем добавлять тонну кода чтобы склонировать компонент...
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
13.11.2018, 12:27
Не понимаю, где вы эту тонну увидели.
А давайте сравним, - мои тонны__
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
  TMemoryStream *sLeds = new TMemoryStream;
   sLeds->WriteComponent(Shape99);
   delete Shape99;
   for (int i=0;i<10;i++)   /* TShape *led[10] */
   {
     led[i] = new TShape(Form1);
     led[i]->Parent = Form1;
     sLeds->Position = 0;
     sLeds->ReadComponent(led[i]);
     led[i]->Left=160+i*28;
     led[i]->Name="mLed"+IntToStr(1+i);
   }
   delete sLeds;
и ваш новенький с иголочки фрейм (плюс два его файла, как я понимаю - cpp и h дополнительно).
(Мне действительно интересно, потому что практически с ними не работал, ... не проникся в своё время).
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
13.11.2018, 12:36  [ТС]
nick42, можно проект с примером выложить где на форме при проектировании создаётся один Shape (образец), а после старта проекта мы видим вертикальную полоску из 10-ти его клонов.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
13.11.2018, 12:38
А давайте.

C++
1
2
3
4
5
6
7
8
9
   int p = 30;
   for(int i = 0; i < 10; i++)
   {
       TFrame2 *fr = new TFrame2(this);
       fr->Name = "Tframe" + IntToStr(i);
       fr->Parent = this;
       fr->Top = (p += 25);
       fr->Left = 20;
   }
Только для начала - мой код гарантированно будет обрабатывать нажатие на кнопку, а вышеприведенный - чихать хотел на то, что на OnClick кнопки что-то там назначено, и оно тоже должно скопироваться и отработать при нажатии на кнопку-клон. Оно не работает. Будем продолжать писать велосипеды?
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
13.11.2018, 12:41  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
мой код
Можно пример с Вашим кодом, я не совсем понимаю о чём спор.
0
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
13.11.2018, 12:43  [ТС]
На всякий случай выложу картинку, поясняющую что мне нужно
Миниатюры
Клонирование в Runtime компонента, созданного в DesignTime  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
13.11.2018, 12:51
Добавил код

P.S.

Цитата Сообщение от jkrnd Посмотреть сообщение
выложу картинку, поясняющую что мне нужно
Выложу картинку, получающуюся при применении фреймов:
C++
1
2
3
4
5
6
7
8
9
10
   int p = 10;
   for(int i = 0; i < 30; i++)
   {
       TFrame2 *fr = new TFrame2(this, i); // переопределенный конструктор фрейма, принимающий дополнительно целое число
       fr->Name = "Tframe" + IntToStr(i);
       fr->Parent = this;
       fr->Top = (p += 27);
       fr->Left = i < 15 ? 20 : 350;
       if(i == 14) p = 10;
   }
Миниатюры
Клонирование в Runtime компонента, созданного в DesignTime  
2
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
13.11.2018, 13:07  [ТС]
volvo, Добавил Frame2 (New Frame). Подключил к форме:
C++
1
2
#include "Unit1.h"
#include "Unit2.h"
Добавил на форму кнопку:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    int p = 30;
    for(int i = 0; i < 10; i++)
    {
        TFrame2 *fr = new TFrame2(this);
        fr->Name = "Tframe" + IntToStr(i);
        fr->Parent = this;
        fr->Top = (p += 25);
        fr->Left = 20;
    }   
}
кликаю, ничего не происходит
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
13.11.2018, 13:13
Цитата Сообщение от jkrnd Посмотреть сообщение
nick42, можно проект с примером
Пожалуйста. По двойному щелчку на форме создается клавиатура по кнопке-образцу
Миниатюры
Клонирование в Runtime компонента, созданного в DesignTime  
Вложения
Тип файла: zip 13.ZIP (182.4 Кб, 3 просмотров)
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
13.11.2018, 13:14

Не по теме:

Какая-то кошачья разборка :)



Вот проект, который использовался в 11-ом посте:
Вложения
Тип файла: zip copy_btn.zip (68.3 Кб, 7 просмотров)
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
13.11.2018, 13:29  [ТС]
volvo, похоже это то, что мне нужно. (Никогда не использовал Frame).

Добавлено через 7 минут
Frame - это фрагмент формы без бордюра, который можно дублировать. У меня всё построено на работе с массивами компонентов. Как и где их теперь создавать?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
13.11.2018, 13:31
Сделай массив фреймов, и работай с ним
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
13.11.2018, 13:54
Цитата Сообщение от jkrnd Посмотреть сообщение
У меня всё построено на работе с массивами компонентов
jkrnd, можно еще выделить "коллектив" компонентов и определить его как новый компонент - Component-Create Component Template. Не пробовал? Правда, это годится только для дизайн-режима и для динамически создаваемых не подойдет.
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
13.11.2018, 14:25  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Сделай массив фреймов
на фрейме метка lblChan и одно окно редактирования edDescr
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
TForm1 *Form1;
TFrame2 *fr[25];
//================================================================================================================================================
 
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
    int top = -29;
    const int left = 10;
    const int ystep = 29;
 
    for(int i = 0; i < 25; i++)
    {
        fr[i] = new TFrame2(this);
        fr[i]->Name = "Tframe" + IntToStr(i);
        fr[i]->Parent = this;
        fr[i]->Top = (top += ystep);
        fr[i]->lblChan->Caption = IntToStr(i);
        fr[i]->Left = left;
    }
 
}
как теперь узнать к какому фрeйму я обратился в следующем обработчике события:
C++
1
2
3
4
void __fastcall TFrame2::edDescrChange(TObject *Sender)
{
//....
}
Мне нужно присвоить содержимое edDescr переменной String с таким же индексом, что и фрейм.
И наоборот, при загрузке формы это окно редактирования должно инициализироваться переменной String с таким же индексом, что и фрейм.
Пусть это будет
C++
1
String s[25]
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
13.11.2018, 14:37
имя фрейма получается так:
C++
1
2
3
4
void __fastcall TFrame2::edDescrChange(TObject *Sender)
{
    String frame_name = static_cast<TControl*>(Sender)->Parent->Name;
}
, но можно получать и сразу индекс, зная что он хранится в lblChan того же фрейма:

C++
1
    int index = static_cast<TFrame2*>(static_cast<TControl*>(Sender)->Parent)->lblChan->Caption.ToInt();
Добавлено через 2 минуты
Цитата Сообщение от jkrnd Посмотреть сообщение
И наоборот, при загрузке формы это окно редактирования должно инициализироваться переменной String с таким же индексом, что и фрейм.
А для этого нужно просто в конструкторе добавить:
C++
1
    edDescr->Text = S[index]; // index - это второй параметр конструктора в данном случае
2
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
13.11.2018, 14:42  [ТС]
volvo, всё понял, спасибо. Надеюсь видимость переменных в модулях фреймов, аналогична как в модулях формы и классы перехватчики подсоединяются также.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.11.2018, 14:42
Помогаю со студенческими работами здесь

Изменение свойств динамически созданного компонента
Здравствуйте! Из подключенного DLL файла динамически создаю форму, также динамически размещаю на ней компоненты. Хочется узнать, как к...

Не находится заголовочный файл созданного компонента
Пробую создать новый компонент на основе базового. Знаний по этой теме очень мало, обучаюсь по Архангельскому. Создал заготовку компонента,...

Изменение размеров компонента мишью в RunTime
собственно требуется работа с панелью в режиме RunTime, чтобы при клике на ней появлялись 8 точек (как в DesignTime) и с помощью этих точек...

Вызов события для программно созданного компонента
Добрый вечер! У меня программно создается вкладка с richtextbox. Как я могу вызвать именно для нужного мне richtextbox событие...

Как Поменять Owner у созданного компонента TMemo
есть две панели Panel1 и Panel2 Создаю во время работы программы TMemo Memo:=TMemo.Create(Panel1); Memo.parent:=Panel1; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru