powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование Variant в атрибутах
10 сообщений из 10, страница 1 из 1
Использование Variant в атрибутах
    #39680373
PanBuslik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В очередной раз решил проникнуться атрибутами и снова косяк. В документации ограничения на использование в атрибутах 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
Использование Variant в атрибутах
    #39680421
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[MyTest(Int32(1))] попробуйте явное приведение. Иои TValue. Или если не работает то перегрузку конструкторов а в них уже вариант храните. Вообще variant это моветон для ленивых.
...
Рейтинг: 0 / 0
Использование Variant в атрибутах
    #39680423
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite Иои TValue.
Кстати, а что такое TValue? Новая замена Variant?
...
Рейтинг: 0 / 0
Использование Variant в атрибутах
    #39680426
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аналог variant только управляемый и нативный в delphi. По мне удобнее если не требуется поддержка старого кода. И то для TValue есть преобразование из variant
...
Рейтинг: 0 / 0
Использование Variant в атрибутах
    #39680485
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так и не понял, причём здесь Variant ? Ну объявлен MyTestAttribute в модуле, а каким боком он относится к классу TMyClass ?
...
Рейтинг: 0 / 0
Использование Variant в атрибутах
    #39680507
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr, Тем боком, что MyTestAttribute является атрибутом.
...
Рейтинг: 0 / 0
Использование Variant в атрибутах
    #39680523
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Использование Variant в атрибутах
    #39680907
Фотография Dimonka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PanBuslikВ очередной раз решил проникнуться атрибутами и снова косяк. В документации ограничения на использование в атрибутах Variant не нашел, компилятор тоже не ругнулся. Однако при получении атрибутов у класса TMyClass валится ошибка Invalid variant type. Это баг или фича ? :)
Согласен с предыдущим оратором. У тебя всё равно ограниченное количество вариантов инициализации атрибута, поэтому сделай несколько конструкторов на возможные типы (string, integer, double, ненужное вычеркнуть).
...
Рейтинг: 0 / 0
Использование Variant в атрибутах
    #39681418
PanBuslik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем за то что откликнулись! Вариантов решения действительно хватает. Больше скорее интересовало почему валится при использовании Variant. :)
...
Рейтинг: 0 / 0
Использование Variant в атрибутах
    #39681566
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PanBuslikБольше скорее интересовало почему валится при использовании Variant.Ну так Use Debug DCU и F7
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование Variant в атрибутах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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