Erro de access violation ao tentar chamar o form pela segunda vez.

Delphi

17/10/2012

Ao chamar o form pela primeira vez funciona, ao fechar o form e chamar novamente da erro de access violation.

Tenho um form Clientes, chamo esse form no menu Principal assim:

procedure TfrmPrincipal.SubMenuClientesClick(Sender: TObject);
begin
  Application.CreateForm(TfrmClientes, frmClientes);
  frmClientes.Show;
  frmClientes.pgDados.ActivePageIndex := 0;
  frmClientes.dbData_Cad.SetFocus;
end;


Ao sair do form faço isso:
procedure TfrmClientes.btnSairClick(Sender: TObject);
begin
  DM.cdsClientes.Close;
  LimpaTela;
  btnGravarVeiculo.Enabled := False;
  Close;
end;

procedure TfrmClientes.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
   Action := caFree;
   frmClientes.Destroy;
end;
Frederico Brigatte***

Frederico Brigatte***

Curtidas 0

Melhor post

Marco Salles

Marco Salles

17/10/2012

porque o frmClientes.Destroy; ?? O Action neste caso ja libera





procedure TfrmClientes.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
frmClientes:=nil;
end;


e altere ..



procedure TfrmPrincipal.SubMenuClientesClick(Sender: TObject);
begin
if frmClientes = nil then
Application.CreateForm(TfrmClientes, frmClientes);
frmClientes.Show;
frmClientes.pgDados.ActivePageIndex := 0;
frmClientes.dbData_Cad.SetFocus;
end;
GOSTEI 1

Mais Respostas

Alisson Santos

Alisson Santos

17/10/2012

Coloca a criação do formulario dentro de um try/finally, e da um freeandnil para que ele possa fazer a liberação corretamente.
GOSTEI 0
Marco Salles

Marco Salles

17/10/2012

Coloca a criação do formulario dentro de um try/finally, e da um freeandnil para que ele possa fazer a liberação corretamente.


Não são todos modelos de interfaces (SDI/MDI/TDI) que se pode colocar dentro do try finally
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

17/10/2012



Eu tinha colo0cado isso no onCreate do frmClientes, quando comentei essas linhas funcionou, tem sentido isso?

dbCpf.Field.EditMask:= '999.999.999-99;1;_';
dbCep.Field.EditMask:= '00.000-000;1;_';
dbTel_Res.Field.EditMask:= '(99) 9999-9999';
dbTel_Com.Field.EditMask:= '(99) 9999-9999';
dbTel_Cel.Field.EditMask:= '(99) 9999-9999';
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

17/10/2012



Eu tinha colo0cado isso no onCreate do frmClientes, quando comentei essas linhas funcionou, tem sentido isso?

dbCpf.Field.EditMask:= '999.999.999-99;1;_';
dbCep.Field.EditMask:= '00.000-000;1;_';
dbTel_Res.Field.EditMask:= '(99) 9999-9999';
dbTel_Com.Field.EditMask:= '(99) 9999-9999';
dbTel_Cel.Field.EditMask:= '(99) 9999-9999';




Marco Antonio, o que faz o código que vc postou? Tem como explicar para eu entender?
GOSTEI 0
Deivison Melo

Deivison Melo

17/10/2012

Recomendo o uso dos bloco try finally e também FreeAndNil para tirar o objeto da memória
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

17/10/2012

Em que parte do código coloco esses comandos?
GOSTEI 0
Marco Salles

Marco Salles

17/10/2012

Em que parte do código coloco esses comandos?


Se vc for utilizar com o modal ou interfaces MDI não se utiliza o try finally . Ja disse isso no inicio do post

O Action libera , utilize o ReportMemoryLeaksOnShutdown:=true; e veja se tem Vazamento de memória com esta Arquitetura

Vc vai ver que não tem ...
GOSTEI 0
Deivison Melo

Deivison Melo

17/10/2012

lembrando que esse comando: ReportMemoryLeaksOnShutdown nao existem em versões antigas do delphi...
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

17/10/2012

O que esses códigos fazem? É para eu entender o que estou fazendo.
GOSTEI 0
Gilvanio Gonçalves

Gilvanio Gonçalves

17/10/2012

O que esses códigos fazem? É para eu entender o que estou fazendo.


Amigo, o que foi dito a respeito de usar o try finally excepty é o seguinte

o bloco try-catch-finally é usado para envolver o código onde existe a
possibilidade de uma exceção/erro ocorrer.
Um bloco try-catch-finally é constituído das seguintes seções :

Try
'Código que pode gerar(levantar) um erro.
Catch
'Código para tratamento de erros.
Finally
'Código de execução obrigatória.

usa-se também o tratamento de exceções try,excepty, finally

Razões na prática

•Se acontecer algum erro na minha aplicação que eu não programei nada, faça…
•Se acontecer algum erro ao tentar gravar tal informação, mostra para o usuário,
a mensagem de erro para que eu possa identificar melhor.
•Se o usuário não preencher o código do produto, então informe a esse usuário em formato de exceção,
que é necessário preencher, ora essa!
•Olha, se depois que eu criar tal objeto e no meio do código acontecer algum erro ou não,
libere tal objeto da memória.

Acredito que agora já da pra ter um entendimento melhor da necessidade do tratamento de exceções.

Comando Try, Except

O Conjunto de Try e Except, quer dizer, quando estiver dentro do Try e acontecer algum erro, mostre o que está dentro do Except

exemplo:
procedure TForm1.Button1Click(Sender: TObject);  
var 
 x,y,i:integer;  

begin 
 x :=100;  
 y := 0;  

 try 

 x:= x div y; //Divisão por Zero gerará uma exceção  
 except 
  showmessage('Houve um erro ao tentar dividir x por y, pois y=0');  

 end;  
 end;


quanto a ao FreeAndNil:

Procedimento FreeAndNil = Além de realizar a chamada do destrutor do objeto, tb cria um ponteiro de memória
para este mesmo objeto para poder atribuir nil a sua referência e assim, impedir que este objeto possua uma
instância inválida.sendo que somente o free tem também faz o mesmo efeito.

bém espero que tenha entendido o tratamento de exceções:

agora neste procedimento que vc coloca no oncreate.

dbCpf.Field.EditMask:= '999.999.999-99;1;_';
dbCep.Field.EditMask:= '00.000-000;1;_';
dbTel_Res.Field.EditMask:= '(99) 9999-9999';
dbTel_Com.Field.EditMask:= '(99) 9999-9999';
dbTel_Cel.Field.EditMask:= '(99) 9999-9999';

vc pode usar as mascaras no proprio campo de sua tabela usando, o fields editor, opção maskEdit.
assim pode evitar o erro de carregar as mascaras no oncrete do form, ok.

At+
GOSTEI 0
POSTAR