Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Delphi RTTI: GetPropInfo для перечисляемых типов

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Ludens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Столкнулся с тем, что главная RTTI-функция GetPropInfo выдает ошибку Access Violation в том случае, если аргументом выступает перечисляемый тип, базирующийся не на нуле.
Вот пример:

Код:
unit Unit1;
 
interface
 
uses TypInfo,
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Menus,
  StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  type
    TZeroBased = (zbZero, zbOne, zbTwo); // первый элемент 0
    TOneBased = (obOne = 1, obTwo, obThree); // первый элемент 1
  var
    FZeroBased: TZeroBased;
    FOneBased: TOneBased;
  published
    property ZeroBased: TZeroBased read FZeroBased write FZeroBased;
    property OneBased: TOneBased read FOneBased write FOneBased;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
// отрабатывает нормально
  Button1.Caption := GetPropInfo(Form1, 'ZeroBased')^.Name;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
// выдает ошибку Access Violation
  Button2.Caption := GetPropInfo(Form1, 'OneBased')^.Name;
end;
 
end.

Не баг ли это в TypInfo? Никто не сталкивался с подобным?

Всего записей: 1512 | Зарегистр. 16-01-2006 | Отправлено: 14:41 24-07-2015
NeoAnomaly

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ludens, не в TypInfo, как и сказано в документации GetPropInfo вернёт nil, если нет такого свойства(или что равносильно, rtti информации). Для TOneBased вообще не генерируется TypeInfo. By design, на сколько я понимаю...

Всего записей: 418 | Зарегистр. 23-03-2010 | Отправлено: 15:36 24-07-2015 | Исправлено: NeoAnomaly, 15:45 24-07-2015
Ludens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NeoAnomaly
Да, верно, это я неправильно выразился. На самом деле, GetPropInfo не ошибку выдает, а nil возвращает. Но это тоже дико странно, потому что, во-первых, в документации нигде не сказано о таком ограничении, что для моего TOneBased вообще не генерируется TypeInfo. А во-вторых, в TTypeData предусмотрены поля MinValue и MaxValue, и для tkEnumeration они означают как раз минимальное и максимальное значения индекса (я проверял). Зачем тогда было вводить MinValue, если оно может быть только нулем?

Всего записей: 1512 | Зарегистр. 16-01-2006 | Отправлено: 16:35 24-07-2015
NeoAnomaly

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Зачем тогда было вводить MinValue, если оно может быть только нулем?

Ludens, ну, как вариант могу предложить следующий пример: в компиляторе есть некая функция для работы с числовыми типами и для того, чтобы не писать отдельную функцию или не добавлять лишнего кода, или как задел на будущее для перечислений также присутствует этот параметр.
 
Мне вот больше не понятна ситуация с record-ами, почему для них не генерируют инфу.  

Всего записей: 418 | Зарегистр. 23-03-2010 | Отправлено: 21:22 24-07-2015
Ludens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Мне вот больше не понятна ситуация с record-ами, почему для них не генерируют инфу.  

это действительно загадка мистических тайн.  
 
Добавлено:

Цитата:
Для TOneBased вообще не генерируется TypeInfo. By design

Да, ты прав. Проверить это оказалось проще простого:
функция System.TypeInfo(TOneBased) даже не nil возвращает, а выдает ошибку во время компиляции: [DCC Error] Unit1.pas(48): E2134 Type 'TOneBased' has no type info.
Тогда как TypeInfo(TZeroBased) компилируется без звука.

Всего записей: 1512 | Зарегистр. 16-01-2006 | Отправлено: 21:44 24-07-2015
NeoAnomaly

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ludens в общем пока остаётся смириться, кстати какую версию дельфи используешь?
 
Нашёл тут вопрос на stackoverflow с коментом от разраба компилера.  

Всего записей: 418 | Зарегистр. 23-03-2010 | Отправлено: 22:20 24-07-2015
Ludens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Нашёл тут вопрос на stackoverflow с коментом от разраба компилера.  

О! Так это ж ровно мой вопрос, почти теми же словами! Спасибо!
А Delphi я использую XE, хотя в данном случае, как я понял, это не имеет значения.

Всего записей: 1512 | Зарегистр. 16-01-2006 | Отправлено: 08:59 25-07-2015
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Delphi RTTI: GetPropInfo для перечисляемых типов


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru