Форум: "Основная";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];
ВнизПолучение класса по имени Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.065 c