![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Список полей класса. Можно как то получить в runtime?
Begin © (2005-06-27 17:14:00)GetPropList(self.ClassInfo... и т.д. не сработал. Вернее, сработал, но только для получения published-свойств... А можно ли как то получить список тех полей, которые не-published ???
Вот к примеру :
TSomeClass = class
field1 : integer; //Вот эти поля сильно охота
field2 : integer; //получить в runtime
published
property prop1; // это вот GetPropList'ом возвращется,
// только надо не его...
end;
Спасибо заранее...
Begin (2005-06-27 17:49:00) [41]
> никаких "циклов" ! это - изначально бредовая идея ...
TSomeClass = class
selfStatus : byte
f1 : TOneClass;
f2 : TTwoClass;
...
fN : TNthClass;
end;
constructor TSomeClass.Create
f1 := TOneClass.Create;
if self.SelfStatus = 1 then TOneClass.init(1);
if self.SelfStatus = 2 then TOneClass.init(2);
// и т.д. ????????? Громоздко до жути получается
// передать параметр сразу в Create по определенным причинам
// не могу, отчего и существует метод init...
end;
Юрий Зотов (2005-06-27 17:47:00) [42]> Begin (27.06.05 17:30) [11]
> Есть группа полей, которые есть потомки, но от других
> классов. Охота выполнить Create, и некий набор инициирующих
> действий не в тупую, а в цикле. Опять, же подразумевается
> возможность увеличения или уменьшения списка полей в
> будущем....
type
TMyClass = class(...)
private
FField0: TMyField0;
...
public
function GetFieldCount: integer; virtual;
function GetField(Index: integer): TObject; virtual;
...
end;
function TMyClass.GetFieldCount: integer;
begin
Result := ...
end;
function TMyClass.GetField(Index: integer): TObject;
begin
case Index of
0: Result := FField0;
...
end
end;
Если в потомке появились дополнительные поля, то он перекрывает эти 2 метода:
function TMyClassDescendant.GetFieldCount: integer;
begin
Result := inherited GetFieldCount + ...
end;
function TMyClassDescendant.GetField(Index: integer): TObject;
var
N: integer;
begin
N := inherited GetFieldCount;
if Index < N then
Result : = inherited GetField(Index)
else
case Index - N of
0: Result := ...;
...
end
end;
Теперь, создав в программе такой объект, можем проходить в цикле по его полям и инициализировать их. Что и требовалось.
P.S.
Уменьшить список полей в потомке, как Вы понимаете, невозможно, его можно только увеличить. Для уменьшения же в любом случае придется править код - в том числе, и эти 2 метода.
Eraser (2005-06-27 17:44:00) [43]Eraser © (27.06.05 17:33) [12]
Глупость написал...
Begin
Охота выполнить Create, и некий набор инициирующих действий не в тупую, а в цикле.
Прийдётся "в тупую" делать...
Digitman (2005-06-27 17:37:00) [44]
> Private-блока там вообче нет
ну это, конечно же, твое право, хотя не воздержусь от предостережений на эту тему
> Есть группа полей, которые есть потомки, но от других классов
каждый класс из иерархии наследования, объявив некое поле, становится ответственен за его инициализацию
никаких "циклов" ! это - изначально бредовая идея ...
Eraser (2005-06-27 17:33:00) [45]Begin (27.06.05 17:30) [11]
Есть группа полей, которые есть потомки, но от других классов.
Попробуй что-то типа этого TObject(FMyObject).Create;
Begin (2005-06-27 17:30:00) [46]
> Digitman © (27.06.05 17:23) [7]
>
> > Begin (27.06.05 17:18) [2]
>
>
> лезть в приватные данные "чужих" объектов как минимум не
> этично)
Ни БожеМой !!!! :) Это данные моего объекта, и они никак не приватные. Private-блока там вообче нет.
> evvcom © (27.06.05 17:21) [5]
>
> > Выходит, при желании
>
> А чем вызвано подобное желание?
Есть группа полей, которые есть потомки, но от других классов. Охота выполнить Create, и некий набор инициирующих действий не в тупую, а в цикле. Опять, же подразумевается возможность увеличения или уменьшения списка полей в будущем....
Юрий Зотов (2005-06-27 17:28:00) [47]Уточнение.
Все эти списки основаны на RTTI, а она генерится только для свойств (а не для полей), только для published и только при включенной {$M+} (для самого класса или любого его предка).
Digitman (2005-06-27 17:27:00) [48]
> Begin (27.06.05 17:24) [8]
а ты как хотел ?
Begin (2005-06-27 17:24:00) [49]Ну дык... поля Field1 и Field2 будут видны при вызове любого экземпляра класса, однако если в классе отсутствует явная секция published, то вызов GetPropList вызывает виолейшн, а если секция явно прописана, то показывает только property's из оной...
Digitman (2005-06-27 17:23:00) [50]
> Begin (27.06.05 17:18) [2]
лезть в приватные данные "чужих" объектов как минимум не этично)
begin...end (2005-06-27 17:22:00) [51]> evvcom © (27.06.05 17:19) [3]
Зависит от {M}.
evvcom (2005-06-27 17:21:00) [52]
> Выходит, при желании
А чем вызвано подобное желание?
Digitman (2005-06-27 17:21:00) [53]выходит - так
evvcom (2005-06-27 17:19:00) [54]Насколько я помню, поля field1 и field2 как раз будут published.
Begin (2005-06-27 17:18:00) [55]Лаконично. Категорично. Вызывает грусть. Выходит, при желании оперировать полями в рантайме, все оные должны стать именно published имеено property's ????
begin...end (2005-06-27 17:15:00) [56]> Begin (27.06.05 17:14)
> А можно ли как то получить список тех полей, которые
> не-published ???
Нет.