Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование Variant в атрибутах / 10 сообщений из 10, страница 1 из 1
27.07.2018, 17:47
    #39680373
PanBuslik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Variant в атрибутах
В очередной раз решил проникнуться атрибутами и снова косяк. В документации ограничения на использование в атрибутах Variant не нашел, компилятор тоже не ругнулся. Однако при получении атрибутов у класса TMyClass валится ошибка Invalid variant type. Это баг или фича ? :)

Код

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
unit Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;


type
  MyTestAttribute = class(TCustomAttribute)
  protected
    FTestValue: Variant;
  public
    constructor Create(aTestValue: Variant);
    property TestValue: Variant read FTestValue write FTestValue;
  end;


type
  TMyClass = class(TObject)
  private
    FField2: Integer;
    FField3: Double;
    FField1: string;
    FField6: TObject;
    FField4: Boolean;
    FField5: TDateTime;
  public
    property Prop1: string read FField1 write FField1;
    property Prop2: Integer read FField2 write FField2;
    property Prop3: Double read FField3 write FField3;
    [MyTest(1)]
    property Prop4: Boolean read FField4 write FField4;
    property Prop5: TDateTime read FField5 write FField5;
    property Prop6: TObject read FField6 write FField6;
  end;


type
  TForm1 = class(TForm)
    ResultMemo: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    FMyClass: TMyClass;
    procedure ShowRttiInfo;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses
  System.Rtti;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowRttiInfo;
end;

procedure TForm1.ShowRttiInfo;
var
  ctx: TRttiContext;
  t: TRttiType;
  p: TRttiProperty;
  a: TCustomAttribute;
begin
  ResultMemo.Clear;
  ctx := TRttiContext.Create;
  for t in ctx.GetTypes do
  begin
    if t.Name = 'TMyClass' then
    begin
      for p in t.GetProperties do
      begin
        ResultMemo.Lines.Add(Format('Name: %s; Visibility: %d; Type: %s', [p.Name, Integer(p.Visibility), p.PropertyType.ToString]));
        ResultMemo.Lines.Add('Attributes:');

        for a in p.GetAttributes do
          ResultMemo.Lines.Add(a.ClassName);
      end;
      ResultMemo.Lines.Add('Attributes of the class');
      for a in t.GetAttributes do
        ResultMemo.Lines.Add(a.ClassName);
    end;
  end;
end;

{ DBFieldAttribute }

constructor MyTestAttribute.Create(aTestValue: Variant);
begin
  FTestvalue := aTestValue;
end;

end.

...
Рейтинг: 0 / 0
27.07.2018, 21:44
    #39680421
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Variant в атрибутах
[MyTest(Int32(1))] попробуйте явное приведение. Иои TValue. Или если не работает то перегрузку конструкторов а в них уже вариант храните. Вообще variant это моветон для ленивых.
...
Рейтинг: 0 / 0
27.07.2018, 21:53
    #39680423
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Variant в атрибутах
X-Cite Иои TValue.
Кстати, а что такое TValue? Новая замена Variant?
...
Рейтинг: 0 / 0
27.07.2018, 21:59
    #39680426
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Variant в атрибутах
Аналог variant только управляемый и нативный в delphi. По мне удобнее если не требуется поддержка старого кода. И то для TValue есть преобразование из variant
...
Рейтинг: 0 / 0
28.07.2018, 02:06
    #39680485
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Variant в атрибутах
Так и не понял, причём здесь Variant ? Ну объявлен MyTestAttribute в модуле, а каким боком он относится к классу TMyClass ?
...
Рейтинг: 0 / 0
28.07.2018, 11:23
    #39680507
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Variant в атрибутах
DimaBr, Тем боком, что MyTestAttribute является атрибутом.
...
Рейтинг: 0 / 0
28.07.2018, 13:22
    #39680523
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Variant в атрибутах
PanBuslikВ документации ограничения на использование в атрибутах Variant не нашел
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Annotating_Types_and_Type_Members You can only use constant expressions, including sets, strings, and ordinal expressions.

PanBuslikЭто баг или фича ? :)
Посмотри на реализацию System.Classes.DefaultAttribute. Вариантное значение, но куча перегруженных конструкторов.
...
Рейтинг: 0 / 0
30.07.2018, 10:52
    #39680907
Dimonka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Variant в атрибутах
PanBuslikВ очередной раз решил проникнуться атрибутами и снова косяк. В документации ограничения на использование в атрибутах Variant не нашел, компилятор тоже не ругнулся. Однако при получении атрибутов у класса TMyClass валится ошибка Invalid variant type. Это баг или фича ? :)
Согласен с предыдущим оратором. У тебя всё равно ограниченное количество вариантов инициализации атрибута, поэтому сделай несколько конструкторов на возможные типы (string, integer, double, ненужное вычеркнуть).
...
Рейтинг: 0 / 0
31.07.2018, 09:53
    #39681418
PanBuslik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Variant в атрибутах
Спасибо всем за то что откликнулись! Вариантов решения действительно хватает. Больше скорее интересовало почему валится при использовании Variant. :)
...
Рейтинг: 0 / 0
31.07.2018, 14:04
    #39681566
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Variant в атрибутах
PanBuslikБольше скорее интересовало почему валится при использовании Variant.Ну так Use Debug DCU и F7
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование Variant в атрибутах / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]