Instanciar objetos
Bom dia. Gostaria da ajuda de vocês em uma procedure para instanciar e finalizar classes que são criadas dinamicamente. Eu passo um array de classes. Segue abaixo:
procedure prClasses( FClasses : array of TObject; FOpr : String );
var
vsmiI : SmallInt;
begin
if FOpr = F then // Finalizar
begin
for vsmiI := 0 to Pred( Length( FClasses ) ) do
begin
if Assigned( FClasses[ vsmiI ] ) then
FClasses[ vsmiI ].Destroy;
end;
end
else // Create
for vsmiI := 0 to Pred( Length( FClasses ) ) do
begin
if not( Assigned( FClasses[ vsmiI ] ) ) then
FClasses[ vsmiI ] := TObject.Create;
end;
end;
Uso em um formulário como exemplo:
.
.
.
private
FCC : TCliente;
FCEC : TEndCli;
procedure TFormCadClientes.FormCreate(Sender: TObject);
begin
inherited;
//if not( Assigned( FCC ) ) then
//FCC := TCliente.Create;
//if not( Assigned( FCEC ) ) then
//FCEC := TEndCli.Create;
prClasses( [ FCC, FCEC ], C );
end;
procedure TFormCadClientes.FormClose(Sender: TObject; var Action: TCloseAction);
begin
prClasses( [ FCC ], F );
Action := caFree;
FormCadClientes := nil;
inherited;
end;
Na seção private do form, declaro a duas classes que quero criar, TCliente e TEndCli e a operação(F = Destruir C = Create). Para a opção F tudo ocorre normalmente, mas para a opção C os objetos são criaddos
mas na hora de usar o objeto acontece um erro de access violation.
if FCC.fnLoad( FIntID ) then // Erro de access violation
begin
end;
procedure prClasses( FClasses : array of TObject; FOpr : String );
var
vsmiI : SmallInt;
begin
if FOpr = F then // Finalizar
begin
for vsmiI := 0 to Pred( Length( FClasses ) ) do
begin
if Assigned( FClasses[ vsmiI ] ) then
FClasses[ vsmiI ].Destroy;
end;
end
else // Create
for vsmiI := 0 to Pred( Length( FClasses ) ) do
begin
if not( Assigned( FClasses[ vsmiI ] ) ) then
FClasses[ vsmiI ] := TObject.Create;
end;
end;
Uso em um formulário como exemplo:
.
.
.
private
FCC : TCliente;
FCEC : TEndCli;
procedure TFormCadClientes.FormCreate(Sender: TObject);
begin
inherited;
//if not( Assigned( FCC ) ) then
//FCC := TCliente.Create;
//if not( Assigned( FCEC ) ) then
//FCEC := TEndCli.Create;
prClasses( [ FCC, FCEC ], C );
end;
procedure TFormCadClientes.FormClose(Sender: TObject; var Action: TCloseAction);
begin
prClasses( [ FCC ], F );
Action := caFree;
FormCadClientes := nil;
inherited;
end;
Na seção private do form, declaro a duas classes que quero criar, TCliente e TEndCli e a operação(F = Destruir C = Create). Para a opção F tudo ocorre normalmente, mas para a opção C os objetos são criaddos
mas na hora de usar o objeto acontece um erro de access violation.
if FCC.fnLoad( FIntID ) then // Erro de access violation
begin
end;
Jordelino Santos
Curtidas 0
Respostas
Gustavo Bretas
16/12/2011
Jordelino, pelo que eu entendi, esta dando access violation pq vc cria o objeto dentro do array no escopo da procedure e esta tentando acessar os métodos pela classe, de uma olhada no padrão Singleton, talvez possa te ajudar.
http://pt.wikipedia.org/wiki/Singleton
GOSTEI 0