Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.10.2012, 09:41
vladdv89 vladdv89 вне форума
Прохожий
 
Регистрация: 13.10.2012
Сообщения: 3
Репутация: 10
По умолчанию Согласованное описание системы классов

Попытался построить систему классов. Классы TFieldSpec и TTableSpec перекрестно ссылаются друг на друга через объектные свойства.

Код:
   unit Objects;

	interface

	uses
	  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
	  Dialogs;

	type
	  TForm1 = class(TForm)
	  private
		{ Private declarations }
	  public
		{ Public declarations }
	  end;
	type
	  TDataTypeID = (DataTypeId_String, DataTypeId_SmallInt, DataTypeId_Integer,
	  DataTypeId_Word, DataTypeId_Boolean, DataTypeId_Float, DataTypeId_Currency,
	  DataTypeId_BCD, DataTypeId_FMTBCD, DataTypeId_Date, DataTypeId_Time,
	  DataTypeId_DateTime, DataTypeId_Timestamp, DataTypeId_Bytes, DataTypeId_Varbytes,
	  DataTypeId_Blob, DataTypeId_Memo, DataTypeId_Graphic, DataTypeId_FMTMemo,
	  DataTypeId_FixedChar, DataTypeId_WideString, DataTypeId_LargeInt, DataTypeId_Array,
	  DataTypeId_FixedWideChar, DataTypeId_WideMemo);
	type
	  TAlignSpec=(AlignSpec_Left, AlignSpec_Right, AlignSpec_Center);
	  TDomainSpec = class(Tobject)
	  private
		FName : String;
		FDescription : String;
		FDataTypeId : TDataTypeId;
		FLength : Cardinal;
		FCharLength : Cardinal;
		FPrecision : Cardinal;
		FScale : Cardinal;
		FWidth : Word;
		FAlignSpec : TAlignSpec;
		FShowNull : Boolean;
		FShowLeadNulls : Boolean;
		FThousandsSeparator : Boolean;
	  public
		property Name: String read FName;
		property Description: String read FDescription;
		property DataTypeId: TDataTypeId read FDataTypeId;
		property Length: Cardinal read FLength;
		property CharLength: Cardinal read FCharLength;
		property Precision: Cardinal read FPrecision;
		property Scale: Cardinal read FScale;
		property Width: Word read FWidth;
		property Align: TAlignSpec read FAlignSpec;
		property ShowNull: Boolean read FShowNull;
		property ShowLeadNulls: Boolean read FShowLeadNulls;
		property ThousandsSeparator: Boolean read FThousandsSeparator;
	  end;
	  TFieldSpec=class(Tobject)
	  private
		FPosition : integer;
		FName : string;
		FDescription : string;
		FCan_input : Boolean;
		FCan_edit : Boolean;
		FShow_in_grid : Boolean;
		FShow_in_details : Boolean;
		FIs_mean : Boolean;
		FAutocalculated : Boolean;
		FRequired : Boolean;
		FTableSpec : TTableSpec;
		FDomainSpec : TDomainSpec;
	  public
		property Position : integer read FPosition;
		property Name: String read FName;
		property Description: String read FDescription;
		property Can_input : Boolean read FCan_input;
		property Can_edit : Boolean read FCan_edit;
		property Show_in_grid : Boolean read FShow_in_grid;
		property Show_in_details : Boolean read FShow_in_details;
		property Is_mean : Boolean read FIs_mean;
		property Autocalculated : Boolean read FAutocalculated;
		property Required : Boolean read FRequired;
		property TableSpec : TTableSpec read FTableSpec;
		property DomainSpec : TDomainSpec read FDomainSpec;
	  end;
	  TTableSpec=class(Tobject)
	  private
		FName : string;
		FDescription : string;
		FCan_add : Boolean;
		FCan_edit : Boolean;
		FCan_delete : Boolean;
		FFields : array[1..100] of TFieldSpec;
	  public
		property Name: String read FName;
		property Description: String read FDescription;
		property Can_add : Boolean read FCan_add;
		property Can_edit : Boolean read FCan_edit;
		property Can_delete : Boolean read FCan_delete;
		property Fields : array read FFields;
	  end;
	var
	  Form1: TForm1;

	implementation

	{$R *.dfm}

	end.
При компиляции получил ошибку
Код:
    [Error] Objects.pas(66): Undeclared identifier: 'TTableSpec'
	[Error] Objects.pas(82): Identifier redeclared: 'TTableSpec'
	[Error] Objects.pas(96): Identifier expected but 'ARRAY' found
	[Error] Objects.pas(96): READ or WRITE clause expected, but identifier 'FFields' found
	[Error] Objects.pas(97): Type expected but 'END' found
	[Hint] Objects.pas(89): Private symbol 'FFields' declared but never used
	[Fatal Error] FirstTask.dpr(5): Could not compile used unit 'Objects.pas'
Как описать систему классов желательно в одном модуле?
Ответить с цитированием
  #2  
Старый 13.10.2012, 10:31
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от vladdv89
Попытался построить систему классов. Классы TFieldSpec и TTableSpec перекрестно ссылаются друг на друга через объектные свойства.
Нужно сделать опережающее объявление класса:
Код:
   TTableSpec=class;

  // Теперь можно описывать класс который использует этот идентификатор:
   TFieldSpec=class(Tobject)
   private
     FPosition : integer;
...
     FTableSpec : TTableSpec;
...
   end;

  // А теперь описываем уже предварительно объявленный класс:
   TTableSpec=class(Tobject)
   private
     FName : string;
...
     FFields : array[1..100] of TFieldSpec;
...
   end;

Цитата:
Сообщение от vladdv89
Как описать систему классов желательно в одном модуле?
Такое можно сделать именно в одном модуле и даже более того - в одном блоке type.
Ответить с цитированием
  #3  
Старый 13.10.2012, 15:36
icsander icsander вне форума
Новичок
 
Регистрация: 17.04.2011
Сообщения: 87
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Нужно сделать опережающее объявление класса:
poli-smen совершенно прав. Смотрите исходники VCL - там много таких примеров. Можно многому научиться и многое понять.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:37.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter