Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 959

/ вопрос открыт /

Здравствуйте, товарищи эксперты!
Поставил себе дома на новую машину Delphi 2010 - разбираюсь с новым RTTI.
Собственно вопрос после прочтения цикла статей http://www.tdelphiblog.com/2010/01/2009.html
Могу ли я использовать атрибуты методов и свойств для введения своей структуризации и классификации свойств и методов? Т.е. если я задам свои атрибуты MethodNameAttribute, MethodTypeAttribute, то же самое для свойств - смогу ли я затем с помощью RTTI вывести к примеру в ListBox список пользовательских методов объекта (с типом = 'user', к прпимеру) и т.п. ? Я думаю идея ясна.
Если кто-то работал уже с атрибутами - расскажите пожалуйста подробнее - как это правильно сделать.
Спасибо.

mirt.steelwater Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: mirt.steelwater (статус: Посетитель)
Вопрос отправлен: 26 января 2011, 10:32
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 26 января 2011, 11:33; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 26 января 2011, 10:40 [#1]:

Никто не мешает перечислить в цикле все методы объекта, а потом у каждого спросить его атрибуты. Если есть нужный атрибут - выводим.
Галочка "подтверждения прочтения" - вселенское зло.
mirt.steelwater

mirt.steelwater (статус: Посетитель), 26 января 2011, 11:11 [#2]:

т.е. нужно делать что-то вроде такого?
Type
  TMethodAttribute = class (TCustomAttribute)
  private
       f_Group: String;
       f_Name: String;
  public
       constructor Create(aName: String; aGroup: String = '');
       property Group : String read f_Group write f_Group;
       property Name : String read f_Name write f_Name;
  end;
 
  TMyObject = Class (TObject)
  public
      [TMethod ('Мой метод №1','user_group')]
      procedure MyMethod1;
      [TMethod ('Мой метод №2','user_group')]
      procedure MyMethod2;
      [TMethod ('Мой метод №3','admin_group')]
      procedure MyMethod3;
  end;
Ⓐ свобода сопротивление солидарность
mirt.steelwater

mirt.steelwater (статус: Посетитель), 26 января 2011, 11:19 [#3]:

и в отрисовке списка методов:
procedure TForm1.Button1Click (Sender: TObject);
var
  ctx : TRttiContext;
  t : TRttiType;
  m : TRttiMethod;
  a : TCustomAttribute;
begin
  ListBox1.Clear;
 
  ctx := TRttiContext.Create;
  try
    t := ctx.GetType (TMyClass);
 
    for m in t.GetMethods do
      for a in m.GetAttributes do
        if a is TMethodAttribute then
         begin
         if (  ( TMethodAttribute (a).Group = 'user_group' ) and IsUser (Operator)  ) then
             ListBox1.Items.Add ( 'метод доступен пользователям: ' + TMethodAttribute (a).Name );
         if (  ( TMethodAttribute (a).Group = 'admin_group' ) and IsAdmin (Operator)  ) then
             ListBox1.Items.Add ( 'метод доступен администраторам: ' + TMethodAttribute (a).Name );
        end;
 
  finally
    ctx.Free;
  end;
end;
насколько верен такой подход?
на данный момент я не использую атрибуты таким образом ни в одном проэкте, просто пытаюсь найти применение новым возможностям языка.
Ⓐ свобода сопротивление солидарность
Вадим К

Вадим К (статус: Академик), 26 января 2011, 11:28 [#4]:

данный код работает как ожидается?
Галочка "подтверждения прочтения" - вселенское зло.
mirt.steelwater

mirt.steelwater (статус: Посетитель), 26 января 2011, 11:32 [#5]:

да, еще одно - с циклом вроде понятно
но как мне получить атрибут внутри метода?
т.е. если я хочу при возникновении исключения в методе в описании ошибки добавлять имя метода через атрибут или имя класса через атрибут?
procedure TMyObject.procedure MyMethod1;
begin
    try
        // ...
    except on E: Exception do
        raise Exception.CreateFmt ('Ошибка объекта %s в методе %s : '#13#10'%s',[имя класса через атрибут?, имя метода
через атрибут?, E.Message]);
    end;
end;
Ⓐ свобода сопротивление солидарность
mirt.steelwater

mirt.steelwater (статус: Посетитель), 26 января 2011, 11:33 [#6]:

<<данный код работает как ожидается?
не знаю - я сейчас на работе, проверить не могу - дома посмотрю, но должен по-идее..
Ⓐ свобода сопротивление солидарность

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:50
Выполнено за 0.03 сек.