Инициализация типа варианта Delphi 2007 - PullRequest
1 голос
/ 14 июня 2011

Я пытаюсь объявить константный массив для проверки свойств типа, содержащихся в объекте ввода. но я делаю что-то неправильно, пожалуйста, посмотрите на код ниже:

// Record to hold Name-Value pair for checking entities  
TValues = record  
  Name : WideString;  
  Value : Variant;  
end;  

const  
 coarrType1Properties : array[0..5] of TValues =  
 (  
  (Name : 'HARDWARE'; Value : TRUE),  
  (Name : 'SOFTWARE'; Value : TRUE),  
  (Name : 'TAG'; Value : TRUE),  
  (Name : 'AUTHORIZED'; Value : TRUE),  
  (Name : 'ID'; Value : 700),  
  (Name : 'CODE'; Value : 0)  
 );  

но я получаю ошибку времени компиляции delphi для значения типа, т.е. этот тип не может быть инициализирован. Как предотвратить эту ошибку? Или мы можем предложить альтернативное решение и т. Д. Пожалуйста, помогите ...

Ответы [ 4 ]

7 голосов
/ 14 июня 2011

Для этих (булевых, целочисленных) и других простых типов вы можете инициализировать с помощью TVarData и выполнить тип назад Variant:

type
  TValues = record
    Name: WideString;
    Value: TVarData;
  end;

const
  coarrType1Properties : array[0..5] of TValues = (
    (Name: 'HARDWARE'; Value: (VType: varBoolean; VBoolean: True)),
    (Name: 'SOFTWARE'; Value: (VType: varBoolean; VBoolean: True)),
    (Name: 'TAG'; Value: (VType: varBoolean; VBoolean: True)),
    (Name: 'AUTHORIZED'; Value: (VType: varBoolean; VBoolean: True)),
    (Name: 'ID'; Value: (VType: varInteger; VInteger: 700)),
    (Name: 'CODE'; Value: (VType: varInteger; VInteger: 0))
  );

procedure Test;
var
  I: Integer;
begin
  for I := Low(coarrType1Properties) to High(coarrType1Properties) do
    Writeln(Format('coarrType1Properties[%d]: ''%s'', %s', [I, coarrType1Properties[I].Name, VarToStr(Variant(coarrType1Properties[I].Value))]));
end;
3 голосов
/ 14 июня 2011

Документация гласит:

Типы файлов (включая тип Text) и тип Variant не могут быть инициализированы, то есть вы не можете объявлять типизированные константы или инициализированные переменныеэти типы.

Итак, ваша проблема с вашим вариантом записи участника.Это означает, что вам нужен другой подход, и вам придется отказаться от использования константного массива.

function Values(const Name: WideString; const Value: Variant): TValues;
begin
  Result.Name := Name;
  Result.Value := Value;
end;

type
  TValuesArray = array of TValues;

function ValuesArray(const Values: array of TValues): TValuesArray;
var
  i: Integer;    
begin
  SetLength(Result, Length(Values));
  for i := 0 to high(Result) do
    Result[i] := Values[i];
end;

var
  coarrType1Properties: TValuesArray;

initialization
  coarrType1Properties := ValuesArray([
    Values('HARDWARE', TRUE),
    Values('SOFTWARE', TRUE),
    Values('TAG', TRUE),
    Values('AUTHORIZED', TRUE),
    Values('ID', 700),
    Values('CODE', 0)
  ]);
0 голосов
/ 14 июня 2011

Форма D2007 справки: E2071: этот тип не может быть инициализирован

Типы файлов (включая тип Text) и тип Variant не могут быть инициализированы, то есть нельзя объявить типизированные константы или инициализированные переменные этих типов.

program Produce;

var
  V: Variant = 0;

begin
end.

// Пример пытается объявить инициализированную переменную типа Variant, что недопустимо.

program Solve;

var
  V: Variant;

begin
  V := 0;
end.

Решение состоит в том, чтобы инициализировать нормальную переменную с помощью оператора присваивания.

0 голосов
/ 14 июня 2011

E2071 : Варианты нельзя инициализировать с помощью константного выражения.

...