![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проверка возможности создания объекта в конструкторе [D7]
APXi © (2004-12-03 20:55:00)Есть какой либо класс, в конструкторе проверяется возможность создавать экземпляр объекта, как прервать создание объекта в конструкторе?
APXi (2004-12-03 22:24:00) [1]Тогда еще надо будет делать
if Obj1=nil
then Exit
else Obj1.Free;
Тогда проще в TClass2.CreateObj2 проверять возможность создания этого объекта. Пока вижу выход только через твой пример с Exception.
Alexander Panov (2004-12-03 22:17:00) [2]Прошу прощения, последние 2 строки -
if param=2 then Result := TClass2.Create(param);
end;
Alexander Panov (2004-12-03 22:16:00) [3]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;
Примерно так.
APXi (2004-12-03 22:13:00) [4]// Ты имееш в виду так
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 falsethen 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:02:00) [5]APXi (03.12.04 22:00) [13]
А без создания Exception никак нельзя сделать?
Ну если использовать не конструктор, а class function, то можно в каждом наследнике сщодавать свою функциюи вызывать по цепочке аналогичные функции из предка. Такой вариант тоже не сложен, мне кажется...
APXi (2004-12-03 22:00:00) [6]А без создания Exception никак нельзя сделать?
APXi (2004-12-03 21:59:00) [7]Спасибо большое. Подходит.
Alexander Panov (2004-12-03 21:51:00) [8]Можно еще посоветовать вызывать 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:38:00) [9]
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:35:00) [10]{ 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;
Alexander Panov (2004-12-03 21:24:00) [11]APXi (03.12.04 21:18) [7]
Приведи пример простейшего наследования их тех, что тебе нужны. Попробуем решить проблему.
APXi (2004-12-03 21:18:00) [12]Надо будет что
class function CreateMyObject(flag: Boolean): TSimpleClass
перекрывать для каждоо наследника?
Alexander Panov (2004-12-03 21:18:00) [13]да, писал прямо здесь - опечатки могут быть...
Alexander Panov (2004-12-03 21:17:00) [14]APXi (03.12.04 21:15) [4]
Ну так virtualдля этого есть.
APXi (2004-12-03 21:15:00) [15]А если у меня от класса TSimpleClass наследуются еще 20 классов тогда как?
Alexander Panov (2004-12-03 21:12:00) [16]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:09:00) [17]Нет в конструкторе проверяется возможность создания не другого объекта а именно самого себя.
begin...end (2004-12-03 21:03:00) [18]> APXi (03.12.04 20:55)
Т.е. Вы в конструкторе своего класса создаёте какой-то экземпляр другого класса, и хотите это создание прервать? Именно прервать - никак, насколько я знаю. А зачем это нужно?