Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Вниз

Создание компонентов в run-time   Найти похожие ветки 

 
Flint-1983 ©   (2006-03-12 22:31) [0]

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


 
Desdechado ©   (2006-03-12 22:50) [1]

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


 
Anatoly Podgoretsky ©   (2006-03-12 23:04) [2]

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


 
Flint-1983 ©   (2006-03-12 23:15) [3]

Интересуют визуальные классы.
Например:
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);, но не получилось


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

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


 
Defunct ©   (2006-03-13 02:29) [5]

Но эта прога создает еомпоненты заранее известных классов (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;


 
icWasya ©   (2006-03-13 09:42) [6]

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

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


 
Ega23 ©   (2006-03-13 10:04) [7]


> x:array[byte] of TButton;


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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.037 c
1-1140421588
Chaser
2006-02-20 10:46
2006.03.26
Как изменить выделение строки в ListView?


15-1141138547
Nick Denry
2006-02-28 17:55
2006.03.26
"СЕТЕЦЕНТРИЧНАЯ ВОЙНА": ИСТОКИ И ТЕХНИЧЕСКИЕ АСПЕКТЫ


9-1127015559
bulanov
2005-09-18 07:52
2006.03.26
Завершение загрузки текстур (GLScene)


10-1115402391
Chattr
2005-05-06 21:59
2006.03.26
Объединение ячеек ввод формул в TExcelApplication


2-1141905461
fReeZMan
2006-03-09 14:57
2006.03.26
Help!!!! Help!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский