![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как увидеть из одного юнита класс, описанный во втором [D7, XP]
Creative © (2006-03-03 11:40:00)Есть два юнита: Unit1, Unit2. в первом описан класс MyClass1. во втором описан класс - MyClass2. Одно из полей MyClass2 - FField: TMyClass1. Причем в Unit2 написано uses Unit1. Но компилятор пишет про FField: TMyClass1 - undeclared identifier. Почему?
Точно такая же проблама с глобалной переменной: она объявлена в Unit1, но при вызове ее в Unit2 компилятор ее не узнает.
Я предполагаю, что юниты как то неправильно связаны, но не могу разобраться, как надо.
Creative (2006-03-03 12:45:00) [1]Спасибо всем, все встало на свои места и увиделось
_RusLAN (2006-03-03 12:30:00) [2]_RusLAN © (03.03.06 12:27) [8]
последний end. лишний
:))
_RusLAN (2006-03-03 12:27:00) [3]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.
Сергей М. (2006-03-03 12:13:00) [4]Unit Unit1;
interface
...
type
MyClass1 = class
....
end;
---------------------
Unit Unit2;
interface
uses .., Unit1...
type
MyClass2 = class
....
FField: TMyClass1; //не важно в какой секции
....
end;
Creative (2006-03-03 12:03:00) [5]> Ega23 © (03.03.06 11:55) [4]
> В какой секции поле описано? public? private? Другой?
полу описано в паблике
Creative (2006-03-03 11:57:00) [6]А можно немногоконкретнее: вот есть модуль:
Unit Unit1;
interface
uses
.......;
type
....
end;
private
{ Private declarations }
public
{ Public declarations }
Где именно лучше всего располагаться описаниям классов?
Ega23 (2006-03-03 11:55:00) [7]
> Есть два юнита: Unit1, Unit2. в первом описан класс MyClass1.
> во втором описан класс - MyClass2. Одно из полей MyClass2
> - FField: TMyClass1. Причем в Unit2 написано uses Unit1.
> Но компилятор пишет про FField: TMyClass1 - undeclared
> identifier. Почему?
В какой секции поле описано? public? private? Другой?
msguns (2006-03-03 11:52:00) [8]Чтобы избежать подобных "зацикливаний", надо объекты общего доступа (в данном случае MyClass1 и MyClass2 располагать в местах "общей видимости": Главной форме или датамодуле.
Рекомендуемая иерархия юнитов такова:
1. Датамодуль.
Содержит объекты и функции, доступные из любых юнитов проект. Сам "ни в ком не нуждается"
2. Главная форма.
Содержит объекты, классы и функции, доступные любым статически или динамически создаваемым объектам (формам), а также те из них, которые должны существовать в любой момент времени при обращении к ним из других объектов. Может ссылаться на объекты, классы и функции датамодуля.
3. Подчиненные формы.
Содержат объекты, классы и функции, необходимые для реализации собственно функционала формы, на которые не должно быть ссылок из других юнитов. Сами же они могут ссылаться на объекты, классы и функции Главной формы и датамодуля.
Для реализации более "тонких" связей служат интерфейсы.
Creative (2006-03-03 11:50:00) [9]Вообще то это так и есть
Unit Unit1;
interface
uses
.......;
type
MyClass1 = class
....
end;
что то неправильно?
Сергей М. (2006-03-03 11:42:00) [10]все что должен "видеть" Unit2 должно быть описано в Unit1 не иначе как в разделе INTERFACE