Fórum Acess Violation - Erro #529717
25/08/2015
0
Alguém me sugere como corrigir o erro de acess violation está dando o erro em duas partes do sistema!!!
1°
procedure TFrmPrincipal.Button1Click(Sender: TObject); begin FrmCadClientes.ShowModal; end;
2°
//LEVA ESSAS INFORMAÇÕES PARA O FRMCADCLIENTES AONDE INFORMA NO EDIT DA CIDADE FrmCadClientes.EdtCidadeCodigo.Text:=DbgPesquisaCadCidade.Columns[0].Field.AsString; FrmCadClientes.EdtCidadeNome.Text:=DbgPesquisaCadCidade.Columns[1].Field.AsString; FrmCadClientes.EdtEstado.Text:=DbgPesquisaCadCidade.Columns[2].Field.AsString; FrmCadClientes.MskCep.Text:=DbgPesquisaCadCidade.Columns[5].Field.AsString;
Bruno Henrique
Curtir tópico
+ 0Post mais votado
29/08/2015
Tela de Pesquisa de cidades.
{ Private declarations }
public
{ Public declarations }
CidadeCodigo: string;
CidadeNome: string;
CidadeEstado: string;
SiglaUfCidade: string;
CidadeCep: string;
CodigoEstadoCidade: string;
CodigoIbgeCidade: string;
end;
var
FrmPesquisaCadCidades: TFrmPesquisaCadCidades;
implementation
{$R *.dfm}
procedure TFrmPesquisaCadCidades.DbgPesquisaCadCidadeDblClick(Sender: TObject);
begin
Self.ModalResult:= Mrok;
CidadeCodigo := DbgPesquisaCadCidade.Columns[0].Field.AsString;
CidadeNome := DbgPesquisaCadCidade.Columns[1].Field.AsString;
CidadeEstado := DbgPesquisaCadCidade.Columns[2].Field.AsString;
SiglaUfCidade := DbgPesquisaCadCidade.Columns[3].Field.AsString;
CodigoEstadoCidade := DbgPesquisaCadCidade.Columns[4].Field.AsString;
CidadeCep := DbgPesquisaCadCidade.Columns[5].Field.AsString;
CodigoIbgeCidade := DbgPesquisaCadCidade.Columns[6].Field.AsString;
f_operacao := 'A';
FrmPesquisaCadCidades.Close;
end;
procedure TFrmPesquisaCadCidades.DbgPesquisaCadCidadeKeyPress(Sender: TObject;
var Key: Char);
begin
Self.ModalResult:= Mrok;
CidadeCodigo := DbgPesquisaCadCidade.Columns[0].Field.AsString;
CidadeNome := DbgPesquisaCadCidade.Columns[1].Field.AsString;
CidadeEstado := DbgPesquisaCadCidade.Columns[2].Field.AsString;
SiglaUfCidade := DbgPesquisaCadCidade.Columns[3].Field.AsString;
CodigoEstadoCidade := DbgPesquisaCadCidade.Columns[4].Field.AsString;
CidadeCep := DbgPesquisaCadCidade.Columns[5].Field.AsString;
CodigoIbgeCidade := DbgPesquisaCadCidade.Columns[6].Field.AsString;
f_operacao := 'A';
FrmPesquisaCadCidades.Close;
end;
Tela de Cadastro de Cidades botão pesquisar.
procedure TFrmCadCidades.BtnPesquisarClick(Sender: TObject);
begin
FrmPesquisaCadCidades := TFrmPesquisaCadCidades.Create(Application);
try
FrmPesquisaCadCidades.ShowModal;
BtnExcluir.Enabled := True;
BtnGravar.Enabled := False;
if FrmPesquisaCadCidades.modalresult = mrok then
begin
Self.EdtCodigoCidade.Text:= FrmPesquisaCadCidades.CodigoIbgeCidade;
Self.EdtNomeCidade.Text:=FrmPesquisaCadCidades.CidadeNome;
Self.EdtEstadoCidade.Text:=FrmPesquisaCadCidades.CidadeEstado;
Self.EdtSiglaUfCidade.Text:=FrmPesquisaCadCidades.SiglaUfCidade;
Self.EdtCodigoEstadoCidade.Text:=FrmPesquisaCadCidades.CodigoEstadoCidade;
Self.MskCepCidade.Text:=FrmPesquisaCadCidades.CidadeCep;
Self.EdtCodigoIbgeCidade.Text:=FrmPesquisaCadCidades.CodigoIbgeCidade;
BtnAlterar.Enabled := True
end
else
BtnAlterar.Enabled := False;
finally
freeAndnil(FrmPesquisaCadCidades);
end;
end;
e a de clientes ficaria como te falei acima.
Obs: não consigo testar pq não tenho o Delphi 7 Instalado.
Boa sorte
Valquiria Silva
Gostei + 1
Mais Posts
25/08/2015
Thiago Santana
procedure TFrmPrincipal.Button1Click(Sender: TObject); begin FrmCadClientes:= TFrmCadClientes.Create(Self); FrmCadClientes.ShowModal; FrmCadClientes.Free; end;
Gostei + 0
25/08/2015
Bruno Henrique
Gostei + 0
25/08/2015
Bruno Henrique
Gostei + 0
25/08/2015
Bruno Henrique
Descobri o seguinte
Se eu colocar esse código
procedure TFrmPrincipal.Button1Click(Sender: TObject); begin FrmCadClientes := TFrmCadClientes.Create(Application); FrmCadClientes.ShowModal; end;
procedure TFrmPrincipal.Button1Click(Sender: TObject); begin FrmCadClientes := TFrmCadClientes.Create(Application); FrmCadClientes.ShowModal; end;
procedure TFrmPrincipal.Button1Click(Sender: TObject); begin FrmCadClientes.ShowModal; end;
Alguém sabe como resolver???
Grato
Gostei + 0
26/08/2015
Valquiria Silva
Existe algum código no evento onShow do formulário?
Gostei + 0
26/08/2015
Bruno Henrique
Aparentemente era isso mesmo, estava em auto crente, mudei para avaliem... Fiz vários testes e o erro ñ apareceu!!! Pq isso acontece?
Gostei + 0
27/08/2015
Valquiria Silva
O Delphi tem uma configuração Tools/Options/Environment Options/VCL Designer/Auto create forms.
Quando você cria um formulário o delphi olha essa configuração e coloca o Formulário em auto create ou não.
Isso significa que se formulário será criado quando a aplicação for criada. Dê um olhada no arquivo do projeto (.dpr), entre o begin e end, vão aparecer todos os seus formulários que estão em auto create.
O erro Acess Violation, normalmente é por tentar ler/usar/acessar um endereço de memória que não existe.
Aparentemente quando você criava o formulário ele estava criando um novo formulário de clientes e a referencia do seu código :
FrmCadClientes.EdtCidadeCodigo.Text:=DbgPesquisaCadCidade.Columns[0].Field.AsString;
apontava pra um FrmCadClientes não criado.
abs.
Gostei + 0
27/08/2015
Bruno Henrique
Muito bem explicado.Obrigado pela atenção!!!
Bom dia!!!
Grato
Gostei + 0
27/08/2015
Bruno Henrique
Agora ocorre outro erro, eu abri outro tópico por que eu não estava conseguindo inserir as imagens nesse mesmo tópico!!!
Tem como você me ajudar
Link do novo tópico
DbGrid
Gostei + 0
28/08/2015
Valquiria Silva
No formulário de pesquisa você usa:
procedure TFrmPesquisaCadCidades.DbgPesquisaCadCidadeDblClick(Sender: TObject);
begin
pesquisarcidade := true;
FrmCadCidades.DesabilitarEdit;
FrmCadCidades.EdtCodigoCidade.Text := DbgPesquisaCadCidade.Columns[0].Field.AsString;
FrmCadCidades.EdtNomeCidade.Text := DbgPesquisaCadCidade.Columns[1].Field.AsString;
FrmCadCidades.EdtEstadoCidade.Text := DbgPesquisaCadCidade.Columns[2].Field.AsString;
FrmCadCidades.EdtSiglaUfCidade.Text := DbgPesquisaCadCidade.Columns[3].Field.AsString;
FrmCadCidades.EdtCodigoEstadoCidade.Text := DbgPesquisaCadCidade.Columns[4].Field.AsString;
FrmCadCidades.MskCepCidade.Text := DbgPesquisaCadCidade.Columns[5].Field.AsString;
FrmCadCidades.EdtCodigoIbgeCidade.Text := DbgPesquisaCadCidade.Columns[6].Field.AsString;
// LEVA ESSAS INFORMAÇÕES PARA O FRMCADCLIENTES AONDE INFORMA NO EDIT DA CIDADE
FrmCadClientes.EdtCidadeCodigo.Text := DbgPesquisaCadCidade.Columns[0].Field.AsString;
FrmCadClientes.EdtCidadeNome.Text := DbgPesquisaCadCidade.Columns[1].Field.AsString;
FrmCadClientes.EdtEstado.Text := DbgPesquisaCadCidade.Columns[2].Field.AsString;
FrmCadClientes.MskCep.Text := DbgPesquisaCadCidade.Columns[5].Field.AsString;
f_operacao := 'A';
FrmPesquisaCadCidades.Close;
end;
Dessa forma você está amarrando essa pesquisa de cidades diretamente ao formulário de Clientes, o que não é uma boa prática, e vai deixar o formulário de pesquisa dependente do formulário de clientes.
Existem várias formas de resolver isso, sugiro que ao invés de mandar as informações para o formulário de clientes, você recupere as informações do formulário de pesquisa.
Um exemplo:
no formulário de pesquisa:
public
{ Public declarations }
CidadeCodigo : string;
CidadeNome : string;
Estado : string;
Cep : string;
end;
var
FrmPesquisaCadCidades: TFrmPesquisaCadCidades;
implementation
uses UCadCidades, UCadClientes, UCadLoteamentos;
{$R *.dfm}
procedure TFrmPesquisaCadCidades.DbgPesquisaCadCidadeDblClick(Sender: TObject);
begin
pesquisarcidade := true;
FrmCadCidades.DesabilitarEdit;
FrmCadCidades.EdtCodigoCidade.Text := DbgPesquisaCadCidade.Columns[0].Field.AsString;
FrmCadCidades.EdtNomeCidade.Text := DbgPesquisaCadCidade.Columns[1].Field.AsString;
FrmCadCidades.EdtEstadoCidade.Text := DbgPesquisaCadCidade.Columns[2].Field.AsString;
FrmCadCidades.EdtSiglaUfCidade.Text := DbgPesquisaCadCidade.Columns[3].Field.AsString;
FrmCadCidades.EdtCodigoEstadoCidade.Text := DbgPesquisaCadCidade.Columns[4].Field.AsString;
FrmCadCidades.MskCepCidade.Text := DbgPesquisaCadCidade.Columns[5].Field.AsString;
FrmCadCidades.EdtCodigoIbgeCidade.Text := DbgPesquisaCadCidade.Columns[6].Field.AsString;
// LEVA ESSAS INFORMAÇÕES PARA O formulario que chamou
CidadeCodigo := DbgPesquisaCadCidade.Columns[0].Field.AsString;
CidadeNome := DbgPesquisaCadCidade.Columns[1].Field.AsString;
Estado := DbgPesquisaCadCidade.Columns[2].Field.AsString;
Cep := DbgPesquisaCadCidade.Columns[5].Field.AsString;
f_operacao := 'A';
FrmPesquisaCadCidades.Close;
end;
na chamada do formulário de clientes.
procedure TFrmCadClientes.EdtCidadeCodigoKeyPress(Sender: TObject; var Key: Char);
begin
If Key = #47 THEN
begin
Application.CreateForm(TFrmPesquisaCadCidades, FrmPesquisaCadCidades);
try
FrmPesquisaCadCidades.ShowModal;
Self.EdtCidadeCodigo.Text:= FrmPesquisaCadCidades.CidadeCodigo;
Self.EdtCidadeNome.Text:= FrmPesquisaCadCidades.CidadeNome;
Self.EdtEstado.Text:= FrmPesquisaCadCidades.Estado;
Self.MskCep.Text:= FrmPesquisaCadCidades.Cep;
finally
freeandNil(FrmPesquisaCadCidades);
end;
end
else
Key := #0;
end;
Mas essa é uma forma aproveitando o código que você já tem. Você pode melhorar.
Abs.
Gostei + 0
28/08/2015
Bruno Henrique
Snifffffffffffff..... Fiz como você disse, achei uma boa solução, não conhecia esse método!!!
Mais o erro de access violation ainda continua, eu debugo o sistema com F8
e ele começa o access violation aqui
FrmCadCidades.EdtCodigoCidade.Text := DbgPesquisaCadCidade.Columns[0].Field.AsString;
e depois aponta para cá
Self.EdtCidadeCodigo.Text:= FrmPesquisaCadCidades.CidadeCodigo;
Gostei + 0
28/08/2015
Raimundo Pereira
Vou estuda-lo e te retorno
Gostei + 0
28/08/2015
Bruno Henrique
Gostei + 0
28/08/2015
Valquiria Silva
Parece que sim, ele não foi criado em nenhum lugar?
Você precisa dele pra que?
Gostei + 0
28/08/2015
Bruno Henrique
Sim, é onde eu cadastro as cidades!!!Ai eu apresento as informações no dbgrid que é FrmPesquisaCadCidades, que é o mesmo que eu chamo no evento onkeypress do edit do FrmCadClientes.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)