Msgstr "Размер опубликованного набора"% s "составляет> 4 байта". Как исправить эту ошибку компилятора? - PullRequest
3 голосов
/ 23 января 2010

У меня есть набор значений перечисления, которые имеют 138 значений. Что-то вроде:

type
  TSomething = (sOne, sTwo, sThree, ..., ..., sOnehundredAndThirtyeight);
  TSomethings = set of TSomething;

....

  TSomething = class(TPersistent)
  private
    fSomethings: TSomethings;
  published
    property Somethings: TSomethings read fSomethings write fSomethings;
  end;

При компиляции я получаю следующее сообщение об ошибке:

[DCC Error] uProfilesManagement.pas(20): E2187 Size of published set 'Something' is >4 bytes

Есть идеи, как я могу включить набор такого размера в опубликованное свойство?

Мне нужно включить этот набор в опубликованный раздел, поскольку я использую OmniXMLPersistent для сохранения класса в XML, а он сохраняет только опубликованные свойства.

Ответы [ 2 ]

2 голосов
/ 23 января 2010

Может быть, вам нужен следующий трюк (я не использую OmniXML и не могу его проверить):

type
  TSomething = (sOne, sTwo, sThree, ..., sOnehundredAndThirtyeight);
  TSomethings = set of TSomething;

  TSomethingClass = class(TPersistent)
  private
    fSomethings: TSomethings;
    function GetSomethings: string;
    procedure SetSomethings(const Value: string);
  published
    property Somethings: string read GetSomethings write SetSomethings;
  end;


{ TSomethingClass }

function TSomethingClass.GetSomethings: string;
var
  thing: TSomeThing;
begin
  Result:= '';
  for thing:= Low(TSomething) to High(TSomething) do begin
    if thing in fSomethings then Result:= Result+'1'
    else Result:= Result+'0';
  end;
end;

procedure TSomethingClass.SetSomethings(const Value: string);
var
  I: Integer;
  thing: TSomeThing;
begin
  fSomethings:= [];
  for I:= 0 to length(Value) - 1 do begin
    if Value[I+1] = '1' then Include(fSomethings, TSomething(I));
  end;
end;
1 голос
/ 23 января 2010

К сожалению, компилятор не допускает, чтобы наборы больше 32 бит содержались в опубликованном разделе. Размер набора в байтах можно вычислить как High(set) div 8 - Low(set) div 8 + 1.

Вы можете либо уменьшить размер набора, либо использовать собственный класс вместо набора, либо разделить перечисление на несколько наборов, каждый из которых имеет размер 32 бита.

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