В 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
разделы.