Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Создать класс по имени   Найти похожие ветки 

 
Влад   (2012-05-14 23:19) [0]

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private    { Private declarations }
 public     { Public declarations }
 end;

 TBase = class
 public
   procedure Show; virtual;
 end;

 TChild = class(TBase)
 public
   procedure Show; override;
 end;

var
 Form1: TForm1;

implementation
{$R *.dfm}

procedure TBase.Show;
begin
 ShowMessage("{ TBase }");
end;

procedure TChild.Show;
begin
 inherited;
 ShowMessage("{ TChild }");
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 D: TBase;

 function CreateByName(sName: string):TBase;
 begin
// Classes.FindClass требует TPersistent
// то есть:
// NewClass: TPersistentClass;
// NewClass := FindClass(sName);
// и т.п.

   Result := Как тут создать экземпляр по имени, именно от TObject?
// ( можно TThread, но это все равно, он от объекта тоже сразу идет)?

 end;

begin
//что бы сработало напрмер такое
  D := CreateByName("TBase");
  D.Show;
  D := CreateByName("TChild");
  D.Show;
end;


 
Loginov Dmitry ©   (2012-05-14 23:55) [1]

Используйте собственный механизм для регистрации классов. Сгодится обычный TStringList.

Как-то так:


type
 TBaseClass = class of TBase;

procedure TForm1.Button1Click(Sender: TObject);
var
 AList: TStringList;
 AClass: TBaseClass;
 Obj: TBase;
begin
 // Создание списка классов
 AList := TStringList.Create;

 // Регистрация своего класса в списке
 AList.AddObject(TBase.ClassName, TObject(TBase));
 AList.AddObject(TChild.ClassName, TObject(TChild));

 // Поиск класса по его имени
 AClass := TBaseClass(AList.Objects[AList.IndexOf("TBase")]);
 Obj := AClass.Create;
 Obj.Show;
 Obj.Free;

 AClass := TBaseClass(AList.Objects[AList.IndexOf("TChild")]);
 Obj := AClass.Create;
 Obj.Show;
 Obj.Free;

 AList.Free;
end;


 
AV ©   (2012-05-15 08:45) [2]

покопался-покопался, а задачка не так уж тривиальна, имхо:)

проще и понятнее тогда тупо

function CreateByName(sName: string):TBase;
begin
  Result := nil;
  if sName = "TBase" then
     Result := TBase.Create;
  if sName = "TChild" then
     Result := TChild.Create;
end;


 
Ega23 ©   (2012-05-15 09:14) [3]


> покопался-покопался, а задачка не так уж тривиальна, имхо:)


Что тут нетривиального-то? Либо что-то типа [1], либо RegisterClass


 
Омлет ©   (2012-05-15 09:14) [4]

RegisterClass
RegisterClasses
GetClass
FindClass
F1


 
Омлет ©   (2012-05-15 09:17) [5]

Пардон, не дочитал.

>  Как тут создать экземпляр по имени, именно от TObject?

тогда 1.


 
Palladin ©   (2012-05-15 09:17) [6]


> AV ©   (15.05.12 08:45) [2]

А в чем копался?


 
icWasya ©   (2012-05-15 09:29) [7]

>AV ©   (15.05.12 08:45) [2]
Когда классов пять - десять, то можно и перебором.

А если делать так, как советует Loginov Dmitry[1], то к базовому классу надо добавить виртуальный конструктор.

TBase = class
public
  constructor Create; virtual; //<<======
  procedure Show; virtual;
end;


И, если в классах наследниках конструкторы не тривиальные, не забывать у них Override;


 
Омлет ©   (2012-05-15 09:30) [8]

Хотя, начиная с 2010 есть TRttiContext.FindType. После чего можно вызвать конструктор TRttiInstanceType.GetMethod("Create").Invoke(...).


 
AV ©   (2012-05-15 10:13) [9]


> А в чем копался?
+
> Что тут нетривиального-то?

в чем.. как достучаться до класса..
Tobject реализацию, как обращения ходят в файндкласс


> Омлет ©   (15.05.12 09:30) [8]
>
> Хотя, начиная с 2010 есть TRttiContext.FindType. После чего
> можно вызвать конструктор TRttiInstanceType.GetMethod("Create").
> Invoke(...).

Да, тоже такое находил на каком-то форуме
но D7, к сожалению, у самого.



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

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.095 c
4-1261510346
denis_l
2009-12-22 22:32
2013.03.22
Определение пользователя который запустил процесс


2-1334905984
Sa1exn
2012-04-20 11:13
2013.03.22
Изменение шрифта для форм


2-1340872916
vasa777
2012-06-28 12:41
2013.03.22
Опции


2-1331843715
Zheksonz
2012-03-16 00:35
2013.03.22
Управление шаговым двигателем через LPT


2-1332165801
Валера
2012-03-19 18:03
2013.03.22
Не компилируется проект с компонентом RS232