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

Вниз

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

 
Влад   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.059 c
4-1260613396
GreyWolf
2009-12-12 13:23
2013.03.22
Установка CoInitFlags в COINIT_MULTITHREADED портит иконки файлов


15-1340765651
ClawClaw
2012-06-27 06:54
2013.03.22
Mozilla FireFox и нагрев ноутбука


15-1339074806
Дмитрий С
2012-06-07 17:13
2013.03.22
Задача о деньгах.


15-1344643133
wl
2012-08-11 03:58
2013.03.22
творение? потом...


15-1327513350
alexdn
2012-01-25 21:42
2013.03.22
Сервер





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский