Fórum Erro de access violation ao tentar chamar o form pela segunda vez. #426369

17/10/2012

0

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***

Responder

Post mais votado

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;

Marco Salles

Marco Salles
Responder

Gostei + 1

Mais Posts

17/10/2012

Alisson Santos

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

Gostei + 0

17/10/2012

Marco Salles

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
Responder

Gostei + 0

17/10/2012

Frederico Brigatte***



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';
Responder

Gostei + 0

17/10/2012

Frederico Brigatte***



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?
Responder

Gostei + 0

17/10/2012

Deivison Melo

Recomendo o uso dos bloco try finally e também FreeAndNil para tirar o objeto da memória
Responder

Gostei + 0

17/10/2012

Frederico Brigatte***

Em que parte do código coloco esses comandos?
Responder

Gostei + 0

17/10/2012

Marco Salles

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 ...
Responder

Gostei + 0

17/10/2012

Deivison Melo

lembrando que esse comando: ReportMemoryLeaksOnShutdown nao existem em versões antigas do delphi...
Responder

Gostei + 0

17/10/2012

Frederico Brigatte***

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

Gostei + 0

17/10/2012

Gilvanio Gonçalves

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+
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar