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

Вниз

Получение класса по имени   Найти похожие ветки 

 
SpellCaster   (2007-07-25 15:17) [0]

Всем хай!
Возникла у меня идея создавать объекты одной строкой, на основе строкового имени класса. Нашёл функцию FindClass, но она почему-то фурычит только с наследниками Tpersistent, а у меня классы являются потомками Tthread. Конечно, реализовать свой аналог для Tclass несложно, но хотелось бы узнать, нет ли способа сделать это стандартными средствами?
А также философский вопрос: почему функции рассчитаны именно на Tpersistent, есть ли в этом какой-то глубокий смысл?


 
Dimka Maslov ©   (2007-07-25 16:17) [1]

это сделано для возможности визуального создания форм (другими словами создания ресурса), а потом, при выполнении программы - загрущки данных из ресурса и просторения форм.
Другой вопрос зачем нужно создавать TThread по с т р о к о в о м у имени класса? Имя класса вводится пользователем?


 
SpellCaster   (2007-07-25 16:46) [2]

> зачем нужно создавать TThread по с т р о к о в о м у имени класса?
У меня читается тип потока из файла (строка), и в зависимости от него создается объект того или иного класса. Хочу уйти от нагромождения if-ов, плюс облегчить добавление нового.


 
StriderMan ©   (2007-07-25 16:57) [3]


> SpellCaster   (25.07.07 16:46) [2]
> У меня читается тип потока из файла (строка), и в зависимости
> от него создается объект того или иного класса. Хочу уйти
> от нагромождения if-ов, плюс облегчить добавление нового.

лихо завернул!

Как вариант - Оберни поток в TComponent и сохраняй/подгружай его стандартными средствами


 
Юрий Зотов ©   (2007-07-25 17:05) [4]

В программе завести массив (список) классов потоков, а тип потока писать в файл не строкой, а числом - индексом в массиве (списке).


 
SpellCaster   (2007-07-26 13:42) [5]

StriderMan, да на самом деле всё просто.
Юрий Зотов, в принципе я сделал замену стандартным функциям, только в расчёте на Tclass:


var RegClasses: array of record
                      AName: string;
                      AClass: TClass;
                     end;

...

procedure RegClasses(AClasses: array of TClass);
var I: Integer;
begin
SetLength(RegClasses,Length(AClasses));
for I:=Low(AClasses) to High(AClasses) do
begin
 RegClasses[I].AName:=AClasses[I].ClassName;
 RegClasses[I].AClass:=AClasses[I];
end;
end;

function FindClass(AName: string): TClass;
var I: Integer;
begin
Result:=nil;
for I:=0 to Length(RegClasses) do
 if RegClasses[I].AName=AName then
  begin Result:=RegClasses[I].AClass; Break; end;
end;


В общем-то, класс получаю, всё отлично, но почему-то вылезает АВ в TThread.Create на строке

 FSuspended := CreateSuspended;
 FCreateSuspended := CreateSuspended;

Отчего такая фигня происходит - не могу понять.


 
Leonid Troyanovsky ©   (2007-07-26 13:58) [6]


> SpellCaster   (26.07.07 13:42) [5]

> Отчего такая фигня происходит - не могу понять.

Не могу понять, зачем

1. нужен RegClasses, если есть AClasses
2. называть функцию FindClass
3. I:=0 to Length(RegClasses)

--
Regards, LVT.


 
Бурундук ©   (2007-07-26 13:59) [7]

Приведи код CreateSuspended.

PS По моему опыту большинство программистов, впервые
сталкивающихся с ссылками на классы, наступают на грабли
с вызовом конструктора.


 
Бурундук ©   (2007-07-26 14:02) [8]

В смысле приведи код вызова конструктора.


 
SpellCaster   (2007-07-26 16:35) [9]

> [6] Leonid Troyanovsky ©   (26.07.07 13:58)

1. Чтобы в иниц.секции модуля написать RegClasses([...список классов...]). Хотя, в принципе, можно и объявить константный массив, но у меня что-то не получилось. К тому же не хочется задавать длину массива.
2. Чтобы получить класс
3. О! И правда что.

Юзаю я все это хозяйство вот так:

   cl: TClass;
...
 tmp:=PThreadProps(Settings.ClientThr_ThrPropLst.Objects[i])^;
 if tmp.Active then
 begin
  cl:=FindClass("T"+tmp.ThrType+"Thread");
  if cl=nil then ClientThrList[i]:=nil else
     ClientThrList[i]:=TClientThread(cl).Create(tmp);
 end;

вылезает АВ на строке   FSuspended := CreateSuspended;
хотя в отладчике обе переменные доступны для просмотра. мистика?


 
Сергей М. ©   (2007-07-26 16:46) [10]


> мистика?


Нет тут никакой мистики.


>  cl: TClass;


Должно быть не TClass, а TClientThreadСlass,
где TClientThreadСlass = class of TClientThread;


 
Сергей М. ©   (2007-07-26 16:51) [11]

и, соответственно, не

ClientThrList[i]:=TClientThread(cl).Create(tmp);

а просто

ClientThrList[i]:=cl.Create(tmp);

В кр.случае при cl: TClass приводи тип так:

ClientThrList[i]:=TClientThreadClass(cl).Create(tmp);


 
icWasya ©   (2007-07-26 17:54) [12]

И у TClientThread конструктор должен быть виртуальный


 
SpellCaster   (2007-07-27 16:14) [13]

> [11] Сергей М. ©   (26.07.07 16:46)


> ClientThrList[i]:=TClientThreadClass(cl).Create(tmp);

Точняк! Черт, мне стыдно: глупая ошибка :(

> [12] icWasya ©   (26.07.07 17:54)

Всё верно, но я спецом запроектировал классы так, чтобы не было нужды перекрывать конструктор.



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

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

Наверх




Память: 0.5 MB
Время: 0.021 c
2-1189192349
Tack
2007-09-07 23:12
2007.10.07
Выйти из программы после создания главной формы перед ее показом


15-1189361532
редкий гость
2007-09-09 22:12
2007.10.07
Java script


2-1189341140
Yozch1
2007-09-09 16:32
2007.10.07
Как убрать ушки в PageControl


2-1189438763
Jimmy
2007-09-10 19:39
2007.10.07
Собственная иконка своего компонента


2-1189256104
ProgRAMmer Dimonych
2007-09-08 16:55
2007.10.07
Вопрос по TListView