Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798

Как клонировать кнопку на форме?

24.12.2011, 19:34. Показов 2003. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вопрос, казалось бы, банальный, но вот не придумаю..., да, главное - не уверен, возможно ли это в чистом виде. В общем, компонент SpeedButton в единичном виде сильно видоизменяется (размеры, цвет и тип шрифта, групповая принадлежность, видимость...). Теперь в динамике создается массив таких кнопок (по числу букв алфавита); все они должны быть похожи на вот эту единственную, отличаясь только свойствами Left и Caption. Если в цикле просто копировать компонент, то каждая последующая "присваивает" компонент себе, и в итоге остается "прародитель", только на месте последней созданной кнопки. Писать много не хочется, поэтому и спрашиваю... - может кто знает метод или приём такого клонирования? Поделитесь, пожалуйста. [может нужно на базе той первой создать класс и потом уже массив, но не TSpeedButton, а этого нового класса?]
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.12.2011, 19:34
Ответы с готовыми решениями:

Как клонировать кнопку?
всем привет,скажите как в windows forms сделать так что бы ,ну вот допустим у меня есть кнопка button 4,как сделать так что бы с button...

При нажатии на кнопку на первой форме, скрывать кнопку на второй
Вот такая проблема товарищи, за простите. Есть VBA код на кнопке авторизация кнопка лежит на форме1 , при нажатию на кнопку нужно чтобы...

На форме создать кнопку и по нажатию на эту кнопку открыть фотографию
Салют всем форумчанам! Помогите мне! Как реализовать следующую задумку - на форме создать кнопку и по нажатию на эту кнопку окрывается...

8
Тутошний я
 Аватар для Grey
2147 / 1202 / 225
Регистрация: 03.11.2009
Сообщений: 4,424
Записей в блоге: 2
25.12.2011, 00:28
C++
1
2
3
4
5
6
7
8
9
10
Char Al[5]={'A','B','C','D','E'};
for (int j=1;j<=5;j++)
{
TButton*button=new TButton(this);
button->Parent=this;
button->Caption=Al[j-1];
button->Left=10;
button->Top=j*25+30;
button->Show();
}
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
25.12.2011, 01:02  [ТС]
Grey, спасибо, но это-то как раз понятно. Я имел ввиду наследовать свойства от одной кнопки.
Вот такой код у меня__
C++
1
2
3
4
5
6
7
8
9
10
11
12
      for (int i=0;i<33;i++) 
    {
        /* alvit - строка "АБВГ...ЭЮЯ"  sbet - 1-я кнопка */
        sbut[i] = new TSpeedButton(this);
        sbut[i]->Parent = Form1;
        sbut[i]->Font = sbet->Font; 
        sbut[i]->Caption = alvit[1+i]; 
        sbut[i]->Height=44; sbut[i]->Width=44; 
        sbut[i]->Top=272+(48*(i/11)); 
        sbut[i]->Left=64+48*(i%11); 
        sbut[i]->Enabled = false;
    }
но сейчас я вижу, что "экономия" - это только ширина и высота кнопки. Так что и так сгодится. Но тема клонирования для меня не закрыта (на будущее..., хотелось бы уметь).
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
25.01.2013, 00:26  [ТС]
- дабы не оставлять свою же тему незавершенной, делюсь, как я вышел из положения__
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;
- по образцу Shape99 создается поток MemoryStream и в цикле создаваемым вновь шейпам устанавливаются параметры образца, меняя лишь имена и координаты. Кстати, так же можно сохранять всю форму с динамически созданными компонентами (например, в конце обработчика OnFormShow). И потом при желании восстановить все в первозданном виде (такая тема здесь неоднократно поднималась...)__
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::FormDblClick(TObject *Sender)
{
   if (koor+16 > ClientWidth) {      // koor - X  OnMouseDown
     if (ComponentCount) while(ComponentCount) delete Components[0] ;
     else {
       sM->Position = 0;            //  sM  -  MemoryStream  ãëîáàëüíàÿ
       sM->ReadComponent(Form1);
       // áåç ýòîãî ñâàëèâàåòñÿ íà îøèáêó ïðè ðàáîòå ->
       for (int i=0;i<10;i++) led[i]=((TShape*)FindComponent("mLed"+IntToStr(i+1)));
     }
   }
}
И все бы хорошо, но где-то я, видимо, не так создаю компоненты. Потому что после восстановления формы шейпы на форме появляются, но чтобы к ним обратиться по индексам ( led[index] ), после восстановления формы приходится индексированный массив шейпов заново "привязывать" поиском компонентов по имени (иначе вываливается на "фиолетовый аксес"). Вопрос, я понимаю, не простой, но и здесь же не одни дилетанты, вроде меня, обретаются. Поэтому еще раз повторяю (чтоб окончательно закрыть тему) - как надо динамически создавать массив компонентов, чтобы после сохранения-восстановления формы со всеми компонентами посредством потока MemoryStream у него оставалась связь с компонентами (извиняюсь, если не грамотно сформулировал) ?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
25.01.2013, 01:20
Что мешает наследоваться ?
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
//---------------------------------------------------------------------------
class TMyButton: public TButton
{
    public:
        virtual __fastcall TMyButton(TComponent* Owner,String Caption="",int Left=0):TButton(Owner)
            {
                this->Caption= Caption;
                this->Left= Left;
                Width= 20;
                //...
            }
};
//---------------------------------------------------------------------------
std::vector<TMyButton*> vMyBtn;
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for( size_t i=0; i<10; i++)
    {
        TMyButton* MyButtonX=   new TMyButton(this,String( char('A'+i) ),i*25);
        MyButtonX->Parent= this;
        vMyBtn.push_back(MyButtonX);
    }
}
//---------------------------------------------------------------------------
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
25.01.2013, 15:34  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Что мешает наследоваться ?
- отсутствие целесообразности; если уж начинать перечислять все недефолтовые свойства компонента, то на кой мне это делать, создавая отдельный класс? Я с таким же успехом могу эти присвоения зарисовать в цикле создания нового элемента массива (а этого я как раз делать и не хочу; достаточно того, что я потрудился, корежа компонент в конструкторе).
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
25.01.2013, 15:42
Цитата Сообщение от nick42 Посмотреть сообщение
если уж начинать перечислять все недефолтовые свойства компонента, то на кой мне это делать, создавая отдельный класс?
А в чем проблема ? Много писанины ? Настолько привыкли к благам визуального программирования ?
Цитата Сообщение от nick42 Посмотреть сообщение
корежа компонент в конструкторе
Первый раз слышу что бы наследование называли корЁжинием ...
Да и конструктор необязательно изменять можно просто его переопределить...
Я же просто добавил расширенный мне показалась так будет легче создавать...


Насколько я помню ReadComponent() /WriteComponent() работают криво и не очевидно ( и кажется сохраняют при том не все свойства)
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
25.01.2013, 16:17  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Первый раз слышу что бы наследование называли корЁжинием ...
просто я не тот конструктор имел в виду, - работу в дизайн-режиме, когда конкретный визуальный компонент меняю под свои нужды и в плане геометрии, и в плане остальных свойств (посредством диспетчера).

Добавлено через 27 минут
P.S. снова оговорился: не "диспетчера", а "инспектора объектов"
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
25.01.2013, 21:37
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
//---------------------------------------------------------------------------
/* ХЗ что это и с чем его едят ... */
void RegisterClassesWithStreamingSystem()
{
    // Make sure that, as part of the startup
    // code, the streaming classes are registered
    // with the streaming system.
    #pragma startup RegisterClassesWithStreamingSystem
    Classes::RegisterClass(__classid(TButton));
    Classes::RegisterClass(__classid(TShape));
}
//---------------------------------------------------------------------------
TComponent* __fastcall Clone(TComponent* Component)
{
    std::auto_ptr<TMemoryStream> MS(new TMemoryStream);
 
    MS->WriteComponent(Component);
    MS->Seek(0, soFromBeginning);
 
    return MS->ReadComponent(NULL);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TButton* B = dynamic_cast<TButton*>(Clone(Button1));
    B->Parent=  this;
 
    B->Top=  rand()%Height;
    B->Left= rand()%Width;
    B->Caption= "Clone";
 
    TShape* Sh = dynamic_cast<TShape*>( Clone(Shape1) );
    Sh->Parent= this;
 
    Sh->Top=  rand()%Height;
    Sh->Left= rand()%Width;
}
//---------------------------------------------------------------------------
http://docwiki.embarcadero.com... C%2B%2B%29

Добавлено через 9 минут
Опять же что хреного в этом коде, так то что почему то Owner ( и Parent ) компонентов не задается ... а значит нужно заботится о их удалении вручную.

Возможно еще стоит покопать в сторону TWriter и TReader классов...

http://cppbuilder.ru/articles/0039.php

Добавлено через 2 часа 48 минут
Есть еще такой видоизменённый вариант

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
#include <memory>
#include <cassert>
//---------------------------------------------------------------------------
template<typename ComponentType>
ComponentType* __fastcall Clone(ComponentType* Object,String Name="")
{
        assert( !Object->ClassNameIs("TComponent") );
 
        std::auto_ptr<TMemoryStream> MS(new TMemoryStream);
        std::auto_ptr<TStringStream> SS(new TStringStream);
 
        MS->WriteComponent(Object);
        MS->Position = 0;
        ObjectBinaryToText(MS.get(), SS.get());
 
        String Text=
             (Name.IsEmpty() )
                 ?
                    StringReplace(SS->DataString,Object->Name+":","", TReplaceFlags()<<rfIgnoreCase)
                 :
                    StringReplace(SS->DataString,Object->Name,Name, TReplaceFlags()<<rfIgnoreCase);
 
        SS->Clear();
        SS->WriteString(Text);
        SS->Position = 0;
 
        MS->Clear();
        ObjectTextToBinary(SS.get(), MS.get() );
        MS->Position = 0;
 
        ComponentType* NewShape=  new ComponentType(Object->Owner);
        NewShape->Parent= Object->Parent;
 
        MS->ReadComponent(NewShape);
 
        return NewShape;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        TShape* Sh = Clone(Shape1);
 
        Sh->Top=  rand()%(Height- Sh->Height);
        Sh->Left= rand()%(Width-  Sh->Width);
 
        TButton* B = Clone(Button1);
 
        B->Top=  rand()%(Height- B->Height);
        B->Left= rand()%(Width-  B->Width);
}
//---------------------------------------------------------------------------
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.01.2013, 21:37
Помогаю со студенческими работами здесь

Как поменять "дефолтную" кнопку на форме?
Доброе утро! Подскажите, плиз, как сделать, чтобы когда пользователь нажимает Enter, срабатывала не первая-за-текущим-контролом кнопка, а...

C# как enter(om) активировать кнопку в форме?
c# как enter(om) активировать кнопку в форме??? хочу Enter нажимать и что бы оно активировала кнопку &quot;ок&quot; даже если мой курсор...

Как в форме создать кнопку поиска?
можете скинуть код для создания поиска я недавно начал изучать но не понял как создать кнопку поиска

Как программно создать кнопку на форме?
Как из Form1 программно создать кнопку(textbox и тд) на Form2? Спасибо

Как Скрыть кнопку в форме Документа
Подскажите пожалуйста как скрыть кнопку формы документа для определенного пользователя Добавлено через 12 минут Обычная форма


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru