Главная страница
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.025 c
4-1175766573
Степан Журавлев
2007-04-05 13:49
2007.10.07
GetParent


2-1189081170
voe
2007-09-06 16:19
2007.10.07
Цикл пока недостикнит конца запроса


8-1167250641
crasher
2006-12-27 23:17
2007.10.07
Слежение за объектом через веб-камеру


2-1189336186
Алик
2007-09-09 15:09
2007.10.07
Как лучше и надежней записывакть/читать стринг из файла


15-1189168930
Углук
2007-09-07 16:42
2007.10.07
Прошу удалить мой аккаунт