Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как увидеть из одного юнита класс, описанный во втором [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо