Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Вниз

Проверка возможности создания объекта в конструкторе   Найти похожие ветки 

 
APXi   (2004-12-03 20:55) [0]

Есть какой либо класс, в конструкторе проверяется возможность создавать экземпляр объекта, как прервать создание объекта в конструкторе?


 
begin...end ©   (2004-12-03 21:03) [1]

> APXi   (03.12.04 20:55)

Т.е. Вы в конструкторе своего класса создаёте какой-то экземпляр другого класса, и хотите это создание прервать? Именно прервать - никак, насколько я знаю. А зачем это нужно?


 
APXi   (2004-12-03 21:09) [2]

Нет в конструкторе проверяется возможность создания не другого объекта а именно самого себя.


 
Alexander Panov ©   (2004-12-03 21:12) [3]

APXi   (03.12.04 20:55)
Есть какой либо класс, в конструкторе проверяется возможность создавать экземпляр объекта, как прервать создание объекта в конструкторе?


type
 TSimpleClass=class
 public
   constructor Create;
   class function CreateMyObject(flag: Boolean): TSimpleClass;
 end;

implementation

class function TSimpleClass.CreateMyObject(flag: Boolean): TSimpleClass;
begin
 Result := nil;
 if flag then Result := TSimpleClass.Create;
end;


 
APXi   (2004-12-03 21:15) [4]

А если у меня от класса TSimpleClass наследуются еще 20 классов тогда как?


 
Alexander Panov ©   (2004-12-03 21:17) [5]

APXi   (03.12.04 21:15) [4]
Ну так virtual для этого есть.


 
Alexander Panov ©   (2004-12-03 21:18) [6]

да, писал прямо здесь - опечатки могут быть...


 
APXi   (2004-12-03 21:18) [7]

Надо будет что
class function CreateMyObject(flag: Boolean): TSimpleClass
перекрывать для каждоо наследника?


 
Alexander Panov ©   (2004-12-03 21:24) [8]

APXi   (03.12.04 21:18) [7]
Приведи пример простейшего наследования их тех, что тебе нужны. Попробуем решить проблему.


 
Alexander Panov ©   (2004-12-03 21:35) [9]

{ TClass1 }

constructor TClass1.Create(param: Integer);
begin
 inherited Create;
 FParam := param;
end;

class function TClass1.CreateObj(param: Integer): TClass1;
begin
 Result := nil;
 if param=1 then Result := TClass1.Create(param);
end;

{ TClass2 }

class function TClass2.CreateObj(param: Integer): TClass1;
begin
 Result := nil;
 if param=2 then Result := TClass2.Create(param);
end;

 TClass1=class
 private
   FParam: Integer;
 public
   constructor Create(param: Integer); virtual;
   class function CreateObj(param: Integer): TClass1; virtual;
 end;

 TClass2=class(TClass1)
 public
   class function CreateObj(param: Integer): TClass1; override;
 end;


 
APXi   (2004-12-03 21:38) [10]


type
 TForm2 = class(TForm)
 private
   { Private declarations }
 public
   constructor Create(AOwner: TComponent); override;
 end;

....

constructor TForm2.Create(AOwner: TComponent);
begin
 inherited;
 // Проверяется подключение к базе или еще что нибудь
 // и если все нормально тогда форма создается иначе нет
end;

//=====================================================
 TForm3 = class(TForm2)
 private
   { Private declarations }
 public
   constructor Create(AOwner: TComponent); override;
 end;

....

constructor TForm3.Create(AOwner: TComponent);
begin
 // соответственно вызывается конструктор TForm2
 // и базовая форма может создаться или нет
 inherited;
end;

....

// дальше где нибудь пишу

tmpForm := TForm3.Create(nil);
// если форма не создалась тогда должно быть tmpForm = nil


 
Alexander Panov ©   (2004-12-03 21:51) [11]

Можно еще посоветовать вызывать Exception в конструкторе.

type
EFormCreateError=Exception;
TForm2 = class(TForm)
private
  { Private declarations }
public
  constructor Create(AOwner: TComponent); override;
end;

....

constructor TForm2.Create(AOwner: TComponent);
begin
inherited;
// Проверяется подключение к базе или еще что нибудь
// и если все нормально тогда форма создается иначе нет
if <все ОК>
  then Exit
  else raise EFormCreateError.Create("Error");

end;

//=====================================================
TForm3 = class(TForm2)
private
  { Private declarations }
public
  constructor Create(AOwner: TComponent); override;
end;

....

constructor TForm3.Create(AOwner: TComponent);
begin
// соответственно вызывается конструктор TForm2
// и базовая форма может создаться или нет
try
  inherited;
except
  raise;
end;

end;

....

// дальше где нибудь пишу

try
 tmpForm := TForm3.Create(nil);
except
 Обработка ошибки...
end;
// если форма не создалась тогда должно быть tmpForm = nil



 
APXi   (2004-12-03 21:59) [12]

Спасибо большое. Подходит.


 
APXi   (2004-12-03 22:00) [13]

А без создания Exception никак нельзя сделать?


 
Alexander Panov ©   (2004-12-03 22:02) [14]

APXi   (03.12.04 22:00) [13]
А без создания Exception никак нельзя сделать?


Ну если использовать не конструктор, а class function, то можно в каждом наследнике сщодавать свою функциюи вызывать по цепочке аналогичные функции из предка. Такой вариант тоже не сложен, мне кажется...


 
APXi   (2004-12-03 22:13) [15]

// Ты имееш в виду так


TClass1=class
private
  FParam: Integer;
public
  constructor Create(param: Integer); virtual;
  class function CreateObj(param: Integer): TClass1; virtual;
end;

TClass2=class(TClass1)
public
  class function CreateObj(param: Integer): TClass1; override;
end;

{ TClass1 }

class function TClass1.CreateObj(param: Integer): TClass1;
begin
Result := nil;
if false then Result := TClass1.Create(param);
end;

{ TClass2 }

class function TClass2.CreateObj(param: Integer): TClass1;
begin
Inherited;
Result := nil;
if param=2 then Result := TClass2.Create(param);
end;


 
Alexander Panov ©   (2004-12-03 22:16) [16]

APXi   (03.12.04 22:13) [15]
// Ты имееш в виду так


Нет, не так думал.

TClass1=class
private
 FParam: Integer;
public
 constructor Create(param: Integer); virtual;
 class function CreateObj1(param: Integer): TClass1;
end;

TClass2=class(TClass1)
public
 class function CreateObj2(param: Integer): TClass2; override;
end;

{ TClass1 }

class function TClass1.CreateObj1(param: Integer): TClass1;
begin
Result := nil;
if false then Result := TClass1.Create(param);
end;

{ TClass2 }

class function TClass2.CreateObj2(param: Integer): TClass1;
var
 Obj1: TClass1;
begin
 Result := nil;
 Obj1 :=TClass1.CreateObj1(param);
 if Obj1=nil then Exit;
 if param=2 then Result := TClass2.CreateObj2(param);
end;



Примерно так.


 
Alexander Panov ©   (2004-12-03 22:17) [17]

Прошу прощения, последние 2 строки -

if param=2 then Result := TClass2.Create(param);
end;


 
APXi   (2004-12-03 22:24) [18]

Тогда еще надо будет делать

if Obj1=nil
then Exit
else Obj1.Free;

Тогда проще в TClass2.CreateObj2 проверять возможность создания этого объекта. Пока вижу выход только через твой пример с Exception.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.036 c
14-1101730205
Layner
2004-11-29 15:10
2004.12.19
Люди, кто платит налоги как ЧП? Вопрос: если у меня нет


4-1099662483
Ivolg
2004-11-05 16:48
2004.12.19
Перехват


6-1097245773
P@$l-l0l-(
2004-10-08 18:29
2004.12.19
Sockets. Ошибка при подключении


3-1100848214
Barmutik
2004-11-19 10:10
2004.12.19
Проблема со скоростью запроса


4-1099683711
Piter
2004-11-05 22:41
2004.12.19
Как определить Handle окна, которое находится под курсором мыщи?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский