В Delphi, проблема с использованием определений типов в единицах - PullRequest
4 голосов
/ 27 июня 2011

Использование 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 USES 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 Ответ

6 голосов
/ 27 июня 2011

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

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

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

...