Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.10.2010, 14:55
magsys magsys вне форума
Прохожий
 
Регистрация: 07.10.2010
Сообщения: 4
Репутация: 10
По умолчанию как программно обратиться к свойству класса

Существует наследник класса 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  
Старый 07.10.2010, 15:11
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Есть подозрение, что вам нужно несколько другое:
Код:
  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  
Старый 07.10.2010, 15:25
magsys magsys вне форума
Прохожий
 
Регистрация: 07.10.2010
Сообщения: 4
Репутация: 10
По умолчанию

Речь не идет о стандартном обращении к значению свойства.
Можно сделать анализ через IF передаваемого параметра и в зависимости от него возвращать то или иное свойство. Но если свойств 100 штук и они будут наращиваться, то прописывать их нет желания.

Хотелось бы это красиво унифицировать. Функция эта будет использоваться пользователями внутри генератора отчетов, поэтому максимум что они будут знать это имя свойства к которому обратиться.
Ответить с цитированием
  #4  
Старый 07.10.2010, 15:31
magsys magsys вне форума
Прохожий
 
Регистрация: 07.10.2010
Сообщения: 4
Репутация: 10
По умолчанию

Где-то по идеи должна быть таблица для каждого экземпляра класса адресов или еще чего нибудь где хранятся значения свойств, чтобы можно было по имени переменной выдернуть из нее адрес значения данного свойства и потом к нему обратиться. Видится как-то вот так.
Ответить с цитированием
  #5  
Старый 07.10.2010, 15:38
magsys magsys вне форума
Прохожий
 
Регистрация: 07.10.2010
Сообщения: 4
Репутация: 10
По умолчанию

Есть в классе TObject такой метод FieldAddress который возвращает указатель на Published свойства. Но он не работает в нашем случае.
Ответить с цитированием
  #6  
Старый 07.10.2010, 20:30
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Тогда может вот так вас устроит:
Код:
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;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:10.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025