Как delphi конвертирует свойства ModalResult? - PullRequest
3 голосов
/ 02 августа 2010

Надеюсь, это быстро, и "Легко, если вы знаете, как" ...

Я пишу какой-то класс Сериализации / Сценариев для генерации форм на лету, на днях я попытался установить TColor и получил ошибку clBtnFace is not a valid integer value или что-то в этом роде и обнаружил, что константы, используемые в свойствах, зарегистрированы, чтобы их можно было преобразовать в целое число, и поэтому я добавил код для извлечения преобразователя и его использования.

Теперь у меня есть похожая проблема со свойством ModalResult, но я не могу понять, как десериализатор DFM обрабатывает это свойство? Любые идеи, как это преобразует mrOK в целое число?

Редактировать

Не так много примеров, чтобы привести:

PropInfo := GetPropInfo(Instance, PropertyName);
SetPropValue(Instance, PropInfo, PropertyValue);

Если в данном случае Instance - это TButton, PropertyName - это «ModalResult», а PropertyValue - «mrOK»

Ответы [ 3 ]

6 голосов
/ 02 августа 2010

Для этого не нужно:

const
  { Dialog Box Command IDs }
  {$EXTERNALSYM IDOK}
  IDOK = 1;          ID_OK = IDOK;

const
  mrNone     = 0;
  mrOk       = idOk;

type
  TModalResult = Low(Integer)..High(Integer);

TModalResult каким-то образом является поддиапазоном для Integer, а mrOK является просто константой Integer.

4 голосов
/ 02 августа 2010

На самом деле не хочу отвечать на мой вопрос, но так как никто другой не знает ...

Конвертер для ModalResults отсутствует, Delphi сохраняет целочисленное представление в DFM, как говорит VilleK в комментарии к вопросу. В качестве решения я зарегистрировал новый конвертер

const
  ModalResults: array[0..10] of TIdentMapEntry = (
    (Value: mrNone; Name: 'mrNone'),           
    (Value: mrOk; Name: 'mrOk'),               
    (Value: mrCancel; Name: 'mrCancel'),       
    (Value: mrAbort; Name: 'mrAbort'),         
    (Value: mrRetry; Name: 'mrRetry'),         
    (Value: mrIgnore; Name: 'mrIgnore'),       
    (Value: mrYes; Name: 'mrYes'),             
    (Value: mrNo; Name: 'mrNo'),               
    (Value: mrAll; Name: 'mrAll'),             
    (Value: mrNoToAll; Name: 'mrNoToAll'),     
    (Value: mrYesToAll; Name: 'mrYesToAll'));



function ModalResultToIdent(ModalResult: Longint; var Ident: string): Boolean;
begin
    Result := IntToIdent(ModalResult, Ident, ModalResults);
end;

function IdentToModalResult(const Ident: string; var ModalResult: Longint): Boolean;
begin
    Result := IdentToInt(Ident, ModalResult, ModalResults);
end;
initialization
    RegisterIntegerConsts(TypeInfo(TModalResult), IdentToModalResult, ModalResultToIdent);
1 голос
/ 03 августа 2010

Оба приведенных вами примера являются поддиапазонами числовых значений.Как таковой RTTI действительно знает только базовое целое число.Другие примеры включают TCursor, TFontCharset и TTabOrder.

Если у вас есть такой тип:

  TEnum = (exOne,exTwo,exThree);

Вы можете использовать RTTI для получения и установки 'exOne','exTwo' и 'exThree' как строки.

Это можно сделать с помощью этих методов в TypInfo.pas

function GetEnumName(TypeInfo: PTypeInfo; Value: Integer): string;
function GetEnumValue(TypeInfo: PTypeInfo; const Name: string): Integer;

Если вы хотите использовать константы, определенные для цветов, или ModalResultsвы должны построить свой выигранный словарь с постоянным именем в значение, которое затем сможете реализовать в своих собственных подпрограммах сериализации.

TColor реализует статический словарь под названием «Цвета», который можно использовать, если вы используете только 52 цвета, которые онподдерживает.

  Colors: array[0..51] of TIdentMapEntry = (
    (Value: clBlack; Name: 'clBlack'),
    ...
    (Value: clWindowText; Name: 'clWindowText'));

Затем вы можете сделать следующее, чтобы получить имя цвета.

var
  ColorName : String;
begin
  // Color Value must be between 0 and 51 otherwise index out of bounds
  ColorName := Colors[ColorValue];  
end;

Затем вы можете перебрать элементы в массиве цветов, чтобы определить значение для данногоимя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...