Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2013, 05:12   #1
RealSHELS
Форумчанин
 
Аватар для RealSHELS
 
Регистрация: 04.03.2008
Сообщений: 176
По умолчанию Создание обьекта

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

предположим у нас есть строка
s:string;

она хранит имя компонента
s:='TButton';

как можно теперь создать этот обьект, по типу
(s as TComponent).create; // и чтобы создалась кнопка.

Возможно ли такое вообще?

Заранее спасибо за ответы.
RealSHELS вне форума Ответить с цитированием
Старый 09.11.2013, 09:00   #2
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Нет. Все объекты/переменные должны быть заранее объявлены.
Динамически создавать не объявленные объекты, насколько я знаю, невозможно.
Можно хранить массив кнопок (объявленный, в том числе и динамический), и при вызове функции брать один элемент массива и его создавать.
Прикрепил готовый проект, надеюсь разберешься.

UPD: я что-то вообще не в ту степь пошел... Спать надо по ночам =/
Вложения
Тип файла: rar ButtonsDynamicArray.rar (87.6 Кб, 11 просмотров)
alextrof94$gmail.com

Последний раз редактировалось alextrof94; 09.11.2013 в 09:19.
alextrof94 вне форума Ответить с цитированием
Старый 09.11.2013, 09:12   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

приблизительно так
Код:
var cls: TClass;
s: string;
obj: TObject;

s:='Tbutton';
cls:=GetClass(s);
obj:=cls.Create;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 09.11.2013, 14:11   #4
RealSHELS
Форумчанин
 
Аватар для RealSHELS
 
Регистрация: 04.03.2008
Сообщений: 176
По умолчанию

alextrof94, спасибо, но это не то.

evg_m. попробоавал так, но у меня там
obj:=cls.create(id);
и на эту строчку компилятор матерится
[dcc32 Error] DataUnit.pas(815): E2010 Incompatible types: 'TBaseModel' and 'TObject'

скину пример всего кода чтобы было более понятно

Код:
function TDM.GetBaseModelByTovar(Tovar: TTovarModel): TBaseModel;
var
 Base:TBaseModel;
begin
  case Tovar.idTypeProduct of
    1: Base:=TLaptopBattery.Create(Tovar.idProduct);
    2: Base:=TExternalBattery.Create(Tovar.idProduct);
    3: Base:=TDigitalBattery.Create(Tovar.idProduct);
  else
    Base:=nil;
  end;
 result:=Base;
end;
Соответственно хочу избавиться от этого выбора и заменить на
Код:
function TDM.GetBaseModelByTovar(Tovar: TTovarModel; FClassName: String): TBaseModel;
var
 Base:TBaseModel;
begin
  try
    Base:=GetClass(FClassName).Create(Tovar.idProduct);
  except
    Base:=nil;
  end;
 result:=Base;
end;
TLaptopBattery, TExternalBattery, TDigitalBattery - это наследники класса TBaseModel, в которых переназначены виртуальные методы(функции) базового класса.

Последний раз редактировалось RealSHELS; 09.11.2013 в 14:31.
RealSHELS вне форума Ответить с цитированием
Старый 11.11.2013, 05:58   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

При инстанцировании более низкого по иерархии класса в переменную более высокого класса, надо указывать каст/приведение (в данном случае тобжект пытаетесь записать в бейсмодел, чего дельфи не даст сделать, т.к они несовместимы для присвоения _бинарно_ ).
Код:
Base:=GetClass(FClassName).Create(Tovar.idProduct) as TBaseModel;
phomm вне форума Ответить с цитированием
Старый 11.11.2013, 11:22   #6
RealSHELS
Форумчанин
 
Аватар для RealSHELS
 
Регистрация: 04.03.2008
Сообщений: 176
По умолчанию

компилятор пишет:
[dcc32 Error] DataUnit.pas(816): E2010 Incompatible types: 'TPersistent' and 'TBaseModel'
RealSHELS вне форума Ответить с цитированием
Старый 11.11.2013, 11:31   #7
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Чтобы GetClass надо RegisterClass
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 11.11.2013, 13:00   #8
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Кстати, да, забыл упомянуть, хоть когда пост писал, была мысль припомнить, про регистеркласс.
Вот даже вспомнил, что пример писал кому-то для этакой "рефлексии"
http://www.cyberforum.ru/delphi/thread433417.html
phomm вне форума Ответить с цитированием
Старый 11.11.2013, 13:21   #9
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
FClassName: String
откуда взялось название?
eval вне форума Ответить с цитированием
Старый 11.11.2013, 13:33   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

TbaseModel должен быть наследником TPersistent
возможно не прямым а через цепочку TbaseModel-> TButton->..->Tcomponent-> Tpersistent

1. запрещенные варианты объявления базового класса
Код:
class TBaseModel =class
class TbaseModel =class(TObject)
2. возможные варианты объявления
Код:
class TbaseModel =class(TPeristent) 
class TbaseModel =class(Tcomponent)
class TBaseModel =class(TButton)
// для модуля базового класса
Код:
type
  class TbaseModel =class(TComponent)
  end;
  
  TModelclass =class of TBaseModel;
для модулей наследников базового класса
Код:
type
  class TModelX =class(TBaseModel)
  end;

initialization
  RegClass(TModelX);// обеспечивает возможность нахождения с помощью GetClass
для использования
1. c использование нашего(своего) типа TmodelClass
Код:
var
  modelname: string;
  modelcls: TModelClass;
  mdl: TBaseModel;

modelname:='TModelX';
modelcls:=TModelClass(  GetClass(modelname)  );
mdl:=modelcls.Create(....);
Правильное решение. Всегда будет вызван или конструктор TbaseModel или перекрытый в указанном наследнике

2. c использованием базовых (ну скажем Tcomponent)
Код:
var
  modelname: string;
  modelcls: TcomponentClass;
  mdl: TBaseModel;

modelname:='TModelX';
modelcls:=TComponentClass(  GetClass(modelname)  );
mdl:=modelcls.Create(componentower) as TBaseModel;
Возможное решение! Но конструктор должен быть перекрытым (override) от TComponent.

3. и вроде все верно(по синтаксису), но в целом неверно (смотри в конце)
Код:
var
  modelname: string;
  modelcls: TPersistentClass;
  mdl: TBaseModel;

modelname:='TModelX';
modelcls:= GetClass(modelname);
mdl:=modelcls.Create as TBaseModel;
НЕВЕРНОЕ решение.
здесь наш класс будет сконструирован неправильно.
Будет вызван только TObject.Create; вместо TBaseModel.Create(...) или же вместо Tcomponent.Create(ower: TComponent);
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 11.11.2013 в 13:36.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл. Создание обьекта и добовление в Tlist => Утечка памяти Человек_Борща Общие вопросы Delphi 2 28.01.2012 16:08
создание обьекта в отдельном юните tela Компоненты Delphi 2 08.12.2011 09:53
делфи создание обьекта nyasha2013 Помощь студентам 6 17.05.2011 09:29
Создание иммитации движения обьекта grebljmax Фриланс 5 10.01.2011 00:25
C# получить явное создание обьекта формы Geddar Помощь студентам 3 20.05.2010 13:37