Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.19;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.024 c
4-1099461812
AlexeyM
2004-11-03 09:03
2004.12.19
проблема с hook


14-1101716558
Green_Templar
2004-11-29 11:22
2004.12.19
руссификатор для Windows XP


11-1084281508
Рома
2004-05-11 17:18
2004.12.19
Снимок с экрана


14-1101415256
Agent13
2004-11-25 23:40
2004.12.19
Проблема с CD-ROM


14-1101897095
Xaker
2004-12-01 13:31
2004.12.19
HookMonitor - или КОНЕЦ ВСЕМ Keylogger am !