powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Dynamic (runtime) control creating?
10 сообщений из 10, страница 1 из 1
Dynamic (runtime) control creating?
    #33275587
gl@z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не подскажет ли кто-нибудь пожалуйста, решение той проблемой?
Мне нужно добавлять к форме VCL-controls - как DBEditBox, ComboBox и т.д.
Брой и вид контролл заранее (перед выполнения программы) не известен.

Заранее спасибо!
...
Рейтинг: 0 / 0
Dynamic (runtime) control creating?
    #33275756
Joker_Ya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gl@zНе подскажет ли кто-нибудь пожалуйста, решение той проблемой?
Мне нужно добавлять к форме VCL-controls - как DBEditBox, ComboBox и т.д.
Брой и вид контролл заранее (перед выполнения программы) не известен.

Заранее спасибо!

var t : TComboBox;
begin
t := TComboBox.Create(Form1);
t.Top := 5;
t.Top := 20;
t.Parent := Form1;
end;
...
Рейтинг: 0 / 0
Dynamic (runtime) control creating?
    #33276001
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну а если билдер , то

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
{
 TComboBox *t; 
 t = new TComboBox(this);
 t->Top =  5 ;
 t->Left =  20 ;
 t->Parent = this;
};


 ш
(';')
(V),(V),,
Код: plaintext
 JS 
...
Рейтинг: 0 / 0
Dynamic (runtime) control creating?
    #33300281
gl@z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за помощ, ребята! Вот чего добился - публикую код моей примерной прогой, создающая динамически ТЕdit и TComboBox controls - если кому-нибудь понадобится.
Теперь новая проблема появилась - как динамически задать Events конкретних новосоздаденьiм контролям? Может, кто-нибудь подскажет решение? Опять благодарю в аванс!
...
Рейтинг: 0 / 0
Dynamic (runtime) control creating?
    #33300286
gl@z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот и код:

file Unit_1.cpp:
Код: plaintext
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.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit_1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1 *Form1;

TEdit* pe[ 6 ]; //array of pointers to 6 TEdit Controls
const int EditBoxCount =  6 ; //number of TEdit controls

TStringList* ComboNames = new TStringList; //list of ComboBox-names
TComponentList* Combos = new TComponentList; //list of ComboBox-components
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
int t =  40 , m =  0 ;  //variables for TEdit Top coordinate and name sufix
TComboBox *Cbx;     //variable for ComboBox component
int CbxCount = Edit2->Text.ToInt(); //number of components to create
AnsiString NamePrefix = "MyCombo";

Combos->Clear(); //clear the list of ComboBox-components

//Creating desired number of ComboBoxes...
for (CbxCount; CbxCount> 0 ; CbxCount--){
 Cbx = new TComboBox(this);
 Cbx->Name = NamePrefix + IntToStr(m+= 1 );
 Cbx->Top = t+= 25 ;
 Cbx->Left =  192 ;
 Cbx->Width =  145 ;
 Cbx->Parent = this;
 ComboNames->Add(Cbx->Name); //adds the name of the created control to the list
 Combos->Add(Cbx); //adds the created ComboBox to list of components
}

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int t =  40 , l =  8 ; //variables for TEdit Top and Left coordinates
 const char* pszNamePrefix = "MyEdit"; //temporary name-prefix variable

//clear TEdit array
   for (int i= 0 ;i<EditBoxCount;i++)
    if (pe[i]) delete pe[i];

//creating TEdit controls
    for (int i= 0 ;i<EditBoxCount;i++)
    {
        pe[i] = new TEdit(this);
        pe[i]->Name = pszNamePrefix + IntToStr(i+ 1 );
        pe[i]->Left = l;
        pe[i]->Top = t+= 25  ;
        pe[i]->Parent = this;
    }

//destroy name-prefix variable
    delete pszNamePrefix;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
 //destroy the list of ComboBox-names
  delete ComboNames;

 //destroy the list of ComboBox-controls
  delete Combos;

  //clear TEdit array
  for (int i= 0 ;i<EditBoxCount;i++)
    if (pe[i]) delete pe[i];
}
//---------------------------------------------------------------------------



file Unit_1.dfm:
Код: plaintext
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.
object Form1: TForm1
  Left =  286 
  Top =  127 
  Width =  365 
  Height =  640 
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = - 11 
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  OnDestroy = FormDestroy
  PixelsPerInch =  96 
  TextHeight =  13 
  object Button2: TButton
    Left =  192 
    Top =  4 
    Width =  142 
    Height =  30 
    Caption = 'Create             ComboBoxes'
    TabOrder =  1 
    OnClick = Button2Click
  end
  object Edit2: TEdit
    Left =  236 
    Top =  8 
    Width =  25 
    Height =  21 
    BevelInner = bvNone
    BevelOuter = bvNone
    TabOrder =  0 
    Text = '2'
  end
  object Button1: TButton
    Left =  8 
    Top =  4 
    Width =  127 
    Height =  28 
    Caption = 'Create 6 EditBoxes'
    TabOrder =  2 
    OnClick = Button1Click
  end
end


file Unit_1.h:
Код: plaintext
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.
//---------------------------------------------------------------------------

#ifndef Unit_1H
#define Unit_1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
        TEdit *Edit2;
        TButton *Button2;
        TButton *Button1;
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall FormDestroy(TObject *Sender);
private:	// User declarations
public:		// User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

...
Рейтинг: 0 / 0
Dynamic (runtime) control creating?
    #33300615
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
...
void __fastcall MyOnClick(Sender * TObject)
{
   ShowMessage("Hello World");
};
...
 {
  ...
  TComboBox *t; 
  t = new TComboBox(this);
  t->Top =  5 ;
  t->Left =  20 ;
  t->Parent = this;
  t->OnClick = MyOnClick;
 }



 ш
(';')
(V),(V),,
Код: plaintext
 JS 
...
Рейтинг: 0 / 0
Dynamic (runtime) control creating?
    #33301558
gl@z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, принцип понял, но очевидно чего-то путаю при реализации. Линкер вьiдает сообщение:
Cannot convert `void (__fastcall *)(System::Tobject *)` to `void (__fastcall * (__closure)(System::Tobject *) (System::Tobject *)`

В чем дело? Функцию OnMyClick объявил в начале файла Unit_1.cpp:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
...
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;

void __fastcall MyOnClick(TObject *Sender);

TStringList* ComboNames = new TStringList; //list of ComboBox-names
...

Имплементацию сделал ниже, опять там:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
...
void __fastcall MyOnClick(TObject *Sender)
{
   ShowMessage("Hello World");
};
//---------------------------------------------------------------------------

void __fastcall TForm1::Edit1Enter(TObject *Sender)
{
ShowMessage("Hello world");
}
//---------------------------------------------------------------------------
...

Ну и линкер ругается... А если евент поменять примерно на t->OnClick = Edit1Enter, все идет нормално. Укажите, пожалуйста, в чем ошибаюсь?
...
Рейтинг: 0 / 0
Dynamic (runtime) control creating?
    #33301568
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В дельфе обработчик дожен быть методом класса. Здесь, скорее всего, то же самое.
...
Рейтинг: 0 / 0
Dynamic (runtime) control creating?
    #33301663
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей АлексеевичВ дельфе обработчик дожен быть методом класса. Здесь, скорее всего, то же самое.

Точно , это просто мой недочет .

Обработчик , должен быть метадом класса.
как уже сказали,

то есть например
Код: plaintext
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.
...
class TForm1 : public TForm
{
__published:// IDE-managed Components
        TEdit *Edit2;
        TButton *Button2;
        TButton *Button1;
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall FormDestroy(TObject *Sender);
private:// User declarations
public:// User declarations
        __fastcall TForm1(TComponent* Owner);
public: // ...
      void __fastcall MyOnClick(Sender * TObject);
};

...

void __fastcall TForm1::MyOnClick(Sender * TObject)
{
   ShowMessage("Hello World");
};
...
 {
  ...
  TComboBox *t; 
  t = new TComboBox(this);
  t->Top =  5 ;
  t->Left =  20 ;
  t->Parent = this;
  t->OnClick = MyOnClick;
 }
...
Рейтинг: 0 / 0
Dynamic (runtime) control creating?
    #33301976
gl@z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем болшьое спасибо! Все понял, скоригировал, откомпилировал – работает безпроблемно. Впрочем, я тоже так думал, но елементарную и глупую ошибку допустил: вместо TForm1:: – Form1:: написал.. :-/
Успехов!
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Dynamic (runtime) control creating?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]