Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание компонентов в run-time [D7, XP]


Flint-1983 ©   (2006-03-12 22:31:00) 

Здравствуйте! Как в режиме run-time  создать любой компонент.
Например, на форме предлагается ввести имя класса компонента, вводим (пусть TButton) и он появляется на той же форме.
Спасибо


Ega23   (2006-03-13 10:04:00) [1]


> x:array[byte] of TButton;


Ну и хранить это дело лучше не в массиве, а в каком-нибудь TObjectList


icWasya   (2006-03-13 09:42:00) [2]

Если уж делать NewInstance, то не забывайте и про FreeInstance

 Obj := GetClass( 'TPanel' ).NewInstance;
 if Obj is TWinControl then
    WinControl := TWinControl( Obj ).Create( Self )
 else begin
   Obj.FreeInstance;
   Exit;
 end;


Defunct   (2006-03-13 02:29:00) [3]

Но эта прога создает еомпоненты заранее известных классов (TButton) а мне нужно выбрать класс run-time, например ч/з combobox.
Пробовал так:
x: array[byte] of TComponent;


Пробуйте типа такого

procedure TForm1.Button1Click(Sender: TObject);
begin
 RegisterClasses( [TButton, TPanel] );  // <-- регистрируем классы
end;

// создаем по имени...
procedure TForm1.Button2Click(Sender: TObject);
var
   Obj : TObject;
   WinControl : TWinControl;
begin
  Obj := GetClass( 'TPanel' ).NewInstance;
  if Obj is TWinControl then
     WinControl := TWinControl( Obj ).Create( Self );

  with WinControl do
  begin
     Parent := Self;
     Left := 10;
     Top := 10;
     Visible := True;
   end
end;


Ihor Osov'yak   (2006-03-13 01:59:00) [4]

см. GetClass для получения класса по его имени и далее Create для создания экземпляра класса.
Перед использованием GetClass возможно придется использовать RegisterClass, посмотрите справку на эту тему.


Flint-1983   (2006-03-12 23:15:00) [5]

Интересуют визуальные классы.
Например:
x:array[byte] of TButton;
..........
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=1 to strtoint(edit1.Text) do
begin
x[i]:=TButton.create(self);
x[i].parent:=form1;
x[i].left:=10;
x[i].top:=10+50*i;
x[i].Width:=250;
x[i].Caption:='Компонент '+x[i].ClassName;
end;
end;
Но эта прога создает еомпоненты заранее известных классов (TButton) а мне нужно выбрать класс run-time, например ч/з combobox.
Пробовал так:
x: array[byte] of TComponent;
.......
x[i]:=TComponent.create(combobox1.Text);, но не получилось


Anatoly Podgoretsky   (2006-03-12 23:04:00) [6]

Создать любой класс можно конструктором Create


Desdechado   (2006-03-12 22:50:00) [7]

а если такого класса нет или он невизуальный?


Наверх

Титульная страница Поиск, карта сайта Написать письмо