![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Существует наследник класса TList
TMyList = class(TList) private FValue1: string; FValue2: Integer; property property Value1: string read FValue1 write FValue1; property Value2: Integer read FValue2 write FValue2; end; Var FMyList: TMyList V: Variant; Существует потребность написать универсальную функцию, которая бы возвращала значение свойства через параметр, типа такого function MyListGetValue(Param: string): Variant; begin ..... {Как реализовать} end; Перечисление через IF свойств не подходит, т.к. класс периодически расширяется а механизм обращений должен быть постоянным Обращение к функции должно быть примерно таким: V := MyListGetValue('VALUE1'); V := MyListGetValue('VALUE2'); Как реализовать механизм обращения к свойствам класса. |
#2
|
||||
|
||||
![]() Есть подозрение, что вам нужно несколько другое:
Код:
TMyCalss = class private Values: Array[1..2] of Variant; function GetValue(const Index: Integer): Variant; procedure SetValue(const Index: Integer; const Value: Variant); public property IntValue: Variant index 1 read GetValue write SetValue; property StrValue: Variant index 2 read GetValue write SetValue; end; ... function TMyCalss.GetValue(const Index: Integer): Variant; begin Result := Values[Index] end; procedure TMyCalss.SetValue(const Index: Integer; const Value: Variant); begin Values[Index] := Value end; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
![]() Речь не идет о стандартном обращении к значению свойства.
Можно сделать анализ через IF передаваемого параметра и в зависимости от него возвращать то или иное свойство. Но если свойств 100 штук и они будут наращиваться, то прописывать их нет желания. Хотелось бы это красиво унифицировать. Функция эта будет использоваться пользователями внутри генератора отчетов, поэтому максимум что они будут знать это имя свойства к которому обратиться. |
#4
|
|||
|
|||
![]() Где-то по идеи должна быть таблица для каждого экземпляра класса адресов или еще чего нибудь где хранятся значения свойств, чтобы можно было по имени переменной выдернуть из нее адрес значения данного свойства и потом к нему обратиться. Видится как-то вот так.
|
#5
|
|||
|
|||
![]() Есть в классе TObject такой метод FieldAddress который возвращает указатель на Published свойства. Но он не работает в нашем случае.
|
#6
|
||||
|
||||
![]() Тогда может вот так вас устроит:
Код:
Uses TypInfo; procedure TForm7.FormCreate(Sender: TObject); Var ATypeInfo: PTypeInfo; ATypeData: PTypeData; I, N: Integer; List: PPropList; begin ATypeInfo := TypeInfo(TForm7); ATypeData := GetTypeData(ATypeInfo); N := ATypeData.PropCount; GetMem(List, SizeOf(PPropInfo) * N); GetPropInfos(ClassInfo, List); for i := 0 to N - 1 do ListBox1.Items.Add(List[i].Name); end; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |