Форум: "Начинающим";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
ВнизКак увидеть из одного юнита класс, описанный во втором Найти похожие ветки
← →
Creative (2006-03-03 11:40) [0]Есть два юнита: Unit1, Unit2. в первом описан класс MyClass1. во втором описан класс - MyClass2. Одно из полей MyClass2 - FField: TMyClass1. Причем в Unit2 написано uses Unit1. Но компилятор пишет про FField: TMyClass1 - undeclared identifier. Почему?
Точно такая же проблама с глобалной переменной: она объявлена в Unit1, но при вызове ее в Unit2 компилятор ее не узнает.
Я предполагаю, что юниты как то неправильно связаны, но не могу разобраться, как надо.
← →
Сергей М. © (2006-03-03 11:42) [1]все что должен "видеть" Unit2 должно быть описано в Unit1 не иначе как в разделе INTERFACE
← →
Creative (2006-03-03 11:50) [2]Вообще то это так и есть
Unit Unit1;
interface
uses
.......;
type
MyClass1 = class
....
end;
что то неправильно?
← →
msguns © (2006-03-03 11:52) [3]Чтобы избежать подобных "зацикливаний", надо объекты общего доступа (в данном случае MyClass1 и MyClass2 располагать в местах "общей видимости": Главной форме или датамодуле.
Рекомендуемая иерархия юнитов такова:
1. Датамодуль.
Содержит объекты и функции, доступные из любых юнитов проект. Сам "ни в ком не нуждается"
2. Главная форма.
Содержит объекты, классы и функции, доступные любым статически или динамически создаваемым объектам (формам), а также те из них, которые должны существовать в любой момент времени при обращении к ним из других объектов. Может ссылаться на объекты, классы и функции датамодуля.
3. Подчиненные формы.
Содержат объекты, классы и функции, необходимые для реализации собственно функционала формы, на которые не должно быть ссылок из других юнитов. Сами же они могут ссылаться на объекты, классы и функции Главной формы и датамодуля.
Для реализации более "тонких" связей служат интерфейсы.
← →
Ega23 © (2006-03-03 11:55) [4]
> Есть два юнита: Unit1, Unit2. в первом описан класс MyClass1.
> во втором описан класс - MyClass2. Одно из полей MyClass2
> - FField: TMyClass1. Причем в Unit2 написано uses Unit1.
> Но компилятор пишет про FField: TMyClass1 - undeclared
> identifier. Почему?
В какой секции поле описано? public? private? Другой?
← →
Creative (2006-03-03 11:57) [5]А можно немногоконкретнее: вот есть модуль:
Unit Unit1;
interface
uses
.......;
type
....
end;
private
{ Private declarations }
public
{ Public declarations }
Где именно лучше всего располагаться описаниям классов?
← →
Creative (2006-03-03 12:03) [6]> Ega23 © (03.03.06 11:55) [4]
> В какой секции поле описано? public? private? Другой?
полу описано в паблике
← →
Сергей М. © (2006-03-03 12:13) [7]Unit Unit1;
interface
...
type
MyClass1 = class
....
end;
---------------------
Unit Unit2;
interface
uses .., Unit1...
type
MyClass2 = class
....
FField: TMyClass1; //не важно в какой секции
....
end;
← →
_RusLAN © (2006-03-03 12:27) [8]Creative (03.03.06 11:57) [5]
private
{ Private declarations }
public
{ Public declarations }
Где именно лучше всего располагаться описаниям классов?
privat и public уже относятся к описанию класса.
а структура модуля это:
unit Unit1;
interface
uses ...
var ...
...
implementation
uses ...
var ...
...
initialization
...
finalization
...
end.
end.
← →
_RusLAN © (2006-03-03 12:30) [9]_RusLAN © (03.03.06 12:27) [8]
последний end. лишний
:))
← →
Creative (2006-03-03 12:45) [10]Спасибо всем, все встало на свои места и увиделось
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.012 c