Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Список полей класса. Можно как то получить в runtime?


Страницы:   1 2 3

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 ???

Нет.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо