В Delphi, проблема с использованием определений типов в единицах

Использование Delphi 2010... У меня есть набор бинарных свойств, которые я хочу сгруппировать. Я определил это как таковой...

type
    TTableAttributeType = (
        tabROOT = 1, 
        tabONLINE = 2, 
        tabPARTITIONED = 3, 
        tabCOMPRESSED = 4,  
        );

// Make a set of of the Table Attribute types...
type
      TTableAttrSet = Set of TTableAttributeType;

В моем модуле MAIN.PAS я могу создать переменную типа TTableAttrSet. Другой модуль, UTILS.PAS, также должен понимать тип TTableAttrSet. Об этом заботятся пункты USES...

Основные ИСПОЛЬЗОВАНИЯ Util... Util ИСПОЛЬЗОВАНИЯ Main (2-й использует пункты, в разделе реализации, поэтому я не получаю проблемы круговой ссылки....

Все идет нормально. Моя проблема в том, что мне нужно передать переменную var типа TTableAttrSet FROM main в Utils.

В main.pas

procedure TForm1.Button1Click(Sender: TObject);
    var
    TabAttr : TTableAttrSet;

    begin
    TestAttr (TabAttr);
    end;

а в UTILS.PAS у меня есть

procedure TestAttr(var Attr: TTableAttrSet);
begin
      Attr := [tabROOT, tabCOMPRESSED];
end;

Когда я пытаюсь это сделать, я сталкиваюсь с несколькими проблемами... Проблема 1). Когда я определяю определение моей процедуры наверху utils.pas,

procedure TestAttr(var Attr: TTableAttrSet);

Я получаю сообщение об ошибке, что TTableAttrSet является необъявленным идентификатором. Это имеет смысл, поскольку определение находится в Main.pas, а "использует Main.pas" - ПОСЛЕ моих определений процедуры. Как мне обойти это? На данный момент я продублировал определение типа TTableAttrSet в верхней части файла Utils.pas, а также Main.pas, но это "не похоже на правильный путь".

Проблема 2). Большая проблема, с которой я сталкиваюсь - это ошибка компиляции. на телефонной линии в Main.pas

TestAttr(TabAttr);

Я получаю ошибку "Типы фактических и формальных параметров var должны быть идентичными". Насколько мне известно, они идентичны. На что жалуется компилятор?

1 ответ

Решение

Простое решение - переместить декларацию TTableAttributeType в подразделение Utils. Вы не можете объявить это дважды, потому что тогда у вас есть два разных типа. Это бесполезно для вас, вам нужен только один тип.

Это решение будет работать до тех пор, пока основной блок не должен ссылаться TTableAttributeType в его разделе интерфейса. Поскольку блок Utils явно должен это делать, это создаст круговую зависимость между разделами интерфейса модуля, что является недопустимым.

Если и единицы Main, и Utils должны ссылаться TTableAttributeType в их разделах интерфейса необходимо создать еще один модуль, который просто содержит объявления типов. Это подразделение может быть использовано как Utils, так и Main в их interface разделы.

Другие вопросы по тегам