![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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; |