Fórum Erro de access violation ao tentar chamar o form pela segunda vez. #426369
17/10/2012
0
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***
Curtir tópico
+ 0Post mais votado
17/10/2012
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
Gostei + 1
Mais Posts
17/10/2012
Alisson Santos
Gostei + 0
17/10/2012
Marco Salles
Não são todos modelos de interfaces (SDI/MDI/TDI) que se pode colocar dentro do try finally
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';
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?
Gostei + 0
17/10/2012
Deivison Melo
Gostei + 0
17/10/2012
Frederico Brigatte***
Gostei + 0
17/10/2012
Marco Salles
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
17/10/2012
Deivison Melo
Gostei + 0
17/10/2012
Frederico Brigatte***
Gostei + 0
17/10/2012
Gilvanio Gonçalves
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
Clique aqui para fazer login e interagir na Comunidade :)