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

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

Подскажите пожалуйста по поводу модуля Menus [D7, WinXP]


Dmitry_04 ©   (2004-11-22 20:51:00) 

Подскажите пожалуйста по поводу модуля Menus... Объясните почему в начале тип TMenuItemописан так:

type
 TMenuItem = class;

а после описания нескольких других типов опятьже описан, только по другому:

TMenuItem = class(TComponent)
 private
   ...
 protected
   ...
 public
   ...
 published
   ...
 end;

Как это понимать?


GuAV   (2004-11-22 23:13:00) [1]

Dmitry_04   (22.11.04 22:10) [9]
Но можно ли объявлять по разному два одноименных типа?

Можно. Только тогда это будут два разных типа, даже если объявления будут совпадать.

Dmitry_04   (22.11.04 22:10) [9]
а может все намного проще?

Тогда как ???


Dmitry_04   (2004-11-22 22:10:00) [2]

а может все намного проще? До объявления типа как:

TMenuItem = class(TComponent)
private
  ...
protected
  ...
public
  ...
published
  ...
end;

используется как:

type
TMenuItem = class;

Но можно ли объявлять по разному два одноименных типа?


GuAV   (2004-11-22 21:45:00) [3]

Dmitry_04   (22.11.04 21:44) [7]
Может один класс использует другой а тот в свою очередь первый. Посмотри таки пример из справки в [1].


Dmitry_04   (2004-11-22 21:44:00) [4]

begin...endМожет быть конечно... но почему бы тогда сразу его не описать какой он есть...:)


begin...end   (2004-11-22 21:35:00) [5]


> [5] GuAV ©   (22.11.04 21:32)


> Даже понимать английский особо не нужно просто рассмотри
> код в примере.

Так этта... Код в примере - он ведь тоже... на английском... :-))


GuAV   (2004-11-22 21:32:00) [6]

Dmitry_04   (22.11.04 20:58) [2]
Даже понимать английский особо не нужно просто рассмотри код в примере.

begin...end ©   (22.11.04 21:22) [4]
Всё вроде верно.


begin...end   (2004-11-22 21:22:00) [7]


> [2] Dmitry_04   (22.11.04 20:58)

Я понимаю так... В пределах одной секции описания типов (секции type) можно сначала дать краткое опережающее описание, а потом - обычное полное. В том же модуле Menus объявленный кратко тип TMenuItem используется, например, в объявлении типа TMenuChangeEvent (несколькими строками ниже). Ну захотелось так разработчикам расположить эти объявления, - это их право...
А после этого даётся обычное объявление TMenuItem - с описанием полей, методов, свойств и т.д. Вот это и будет тип TMenuItem. А вначале он был кратко объявлен для того, чтобы указать, что такой класс вообще есть, чтобы его имя можно было указать в описании TMenuChangeEvent, а что это конкретно за TMenuItem, дорогой компилятор, - узнаешь позже... :-)

P.S. Но я могу заблуждаться...


Dmitry_04   (2004-11-22 21:17:00) [8]

???


Dmitry_04   (2004-11-22 20:58:00) [9]

GuAVТы меня извени, я в английском не очень силен, объясни пожалуйста по русски


GuAV   (2004-11-22 20:55:00) [10]

If the declaration of a class type ends with the word class and a semicolon--that is, if it has the form

type className = class;

with no ancestor or class members listed after the word class--then it is a forward declaration. A forward declaration must be resolved by a defining declaration of the same class within the same type declaration section. In other words, between a forward declaration and its defining declaration, nothing can occur except other type declarations.

Forward declarations allow mutually dependent classes. For example,

type
 TFigure = class;  // forward declaration
 TDrawing = class
   Figure: TFigure;
    ...
 end;
 TFigure = class  // defining declaration
   Drawing: TDrawing;
    ...
 end;

Do not confuse forward declarations with complete declarations of types that derive from TObject without declaring any class members.

type
 TFirstClass = class;           // this is a forward declaration
 TSecondClass = class           // this is a complete class declaration
   end;                         //
 TThirdClass = class(TObject);  // this is a complete class declaration


Наверх

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