Acess Violation - Erro

Delphi

25/08/2015

Bom dia!!!

Alguém me sugere como corrigir o erro de acess violation está dando o erro em duas partes do sistema!!!


procedure TFrmPrincipal.Button1Click(Sender: TObject);
begin
FrmCadClientes.ShowModal;
end;



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

Bruno Henrique

Curtidas 0

Melhor post

Valquiria Silva

Valquiria Silva

29/08/2015

Bruno, como sugestão eu faria para a tela de cadastro de cidades o mesmo esquema que para a tela de cadastro de clientes e tiraria a referencia dessas tela da tela de pesquisa de cidades, dessa forma vc pode usar pesquisa de cidades em todas as telas que for necessário sem precisar mexer nela, apenas tratando o formulário que chama a nova tela.

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
GOSTEI 1

Mais Respostas

Thiago Santana

Thiago Santana

25/08/2015

Tenta efetuar a chamada do seu form da seguinte forma:

procedure TFrmPrincipal.Button1Click(Sender: TObject);
begin

FrmCadClientes:= TFrmCadClientes.Create(Self);
  FrmCadClientes.ShowModal;
  FrmCadClientes.Free;
end;
GOSTEI 0
Bruno Henrique

Bruno Henrique

25/08/2015

Não deu certo infelizmente. Continua dando o erro!!! O que mais pode tentar
GOSTEI 0
Bruno Henrique

Bruno Henrique

25/08/2015

Ajuda!!!
GOSTEI 0
Bruno Henrique

Bruno Henrique

25/08/2015

Pessoal, boa noite!!!

Descobri o seguinte

Se eu colocar esse código
procedure TFrmPrincipal.Button1Click(Sender: TObject);
begin
  FrmCadClientes := TFrmCadClientes.Create(Application);
  FrmCadClientes.ShowModal;
end;
no meu botão ele não ocorre mais o erro de access violation porém o meu clientdataset não atualiza mais meu dbgrid, agora se eu tirar o codigo
procedure TFrmPrincipal.Button1Click(Sender: TObject);
begin
  FrmCadClientes := TFrmCadClientes.Create(Application);
  FrmCadClientes.ShowModal;
end;
e deixar meu código assim
procedure TFrmPrincipal.Button1Click(Sender: TObject);
begin
  FrmCadClientes.ShowModal;
end;
o meu clientdataset atualiza normal o meu dbgrid, porém ele me retorna o erro de access violation novamente.

Alguém sabe como resolver???

Grato
GOSTEI 0
Valquiria Silva

Valquiria Silva

25/08/2015

Bruno, o formulário FrmCadClientes está em auto create?

Existe algum código no evento onShow do formulário?
GOSTEI 0
Bruno Henrique

Bruno Henrique

25/08/2015

Valquiria, boa noite!!!!

Aparentemente era isso mesmo, estava em auto crente, mudei para avaliem... Fiz vários testes e o erro ñ apareceu!!! Pq isso acontece?
GOSTEI 0
Valquiria Silva

Valquiria Silva

25/08/2015

Bruno, bom dia.

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
Bruno Henrique

Bruno Henrique

25/08/2015

Valquiria, bom dia!!!


Muito bem explicado.Obrigado pela atenção!!!

Bom dia!!!

Grato
GOSTEI 0
Bruno Henrique

Bruno Henrique

25/08/2015

Valquiria, boa noite!!!

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
Valquiria Silva

Valquiria Silva

25/08/2015

Bruno, vi seu código no tópico https://www.devmedia.com.br/forum/showmodal-zicado-nao-acho-solucao/530014

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
Bruno Henrique

Bruno Henrique

25/08/2015

Valquiria, boa tarde!!!

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
Raimundo Pereira

Raimundo Pereira

25/08/2015

Bruno é possivel conseguir o link do sistema zipado ?
Vou estuda-lo e te retorno
GOSTEI 0
Bruno Henrique

Bruno Henrique

25/08/2015

Sim é possível!!! Tem algum lugar que eu posso colocar o link?
GOSTEI 0
Valquiria Silva

Valquiria Silva

25/08/2015

Bruno CadCidades é outro formulário?

Parece que sim, ele não foi criado em nenhum lugar?
Você precisa dele pra que?
GOSTEI 0
Bruno Henrique

Bruno Henrique

25/08/2015

Valquiria, boa tarde!!!

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
Raimundo Pereira

Raimundo Pereira

25/08/2015

https://mega.nz/#fm manda o link para meu email - rcp@outlook.com.br
GOSTEI 0
Bruno Henrique

Bruno Henrique

25/08/2015

Link do código fonte!!! Para me ajudarem

http://www.4shared.com/rar/n3rD6bbiba/Programao.html
GOSTEI 0
Bruno Henrique

Bruno Henrique

25/08/2015

Link do Fonte


Mega

4 Shared
GOSTEI 0
Valquiria Silva

Valquiria Silva

25/08/2015

Então vc tem que criar ele em algum lugar. Porque quando você vai chamar

FrmCadCidades.EdtCodigoCidade.Text := DbgPesquisaCadCidade.Columns[0].Field.AsString;

se vc verificar com o debug selecione o FrmCadCidades e aperte Ctrl+F7 e verá que o valor dele será = nil.

Ou seja ele não foi criado.

Veja em que parte do código fica melhor cria-lo.

att
GOSTEI 0
Bruno Henrique

Bruno Henrique

25/08/2015

Valquiria, desculpa a ignorância mais qual o melhor lugar que você acha para criar ele? Eu crio como vocês falaram dessa forma???



begin
Application.CreateForm(TFrmCadCidades, FrmCadCidades);
finally
freeandNil(FrmCadCidades);
end;
end
GOSTEI 0
Valquiria Silva

Valquiria Silva

25/08/2015

Bruno, eu não entendi muito bem para o que vc usa ele.

Mas se você criar da forma como escreveu o erro vai continuar, porque vc está criando e imediatamente destruindo.

Você teria que deixar ele criado pelo que entendi, e depois de usar destruir.

Então chame junto quando vc cria a tela de pesquisa e destrua quando destruir a tela de pesquisa.
GOSTEI 0
Bruno Henrique

Bruno Henrique

25/08/2015

Valquiria, boa tarde!!!

Só para ficar bem explicado tirei print dos forms para você compreender!!!

Form - FrmCadCidades
[img:descricao=FrmCadCidades]http://arquivo.devmedia.com.br/forum/imagem/316964-20150828-165206.jpg[/img]

[img:descricao=FrmPesquisaCadCidades]http://arquivo.devmedia.com.br/forum/imagem/316964-20150828-165649.jpg[/img]

[img:descricao=FrmCadClientes]http://arquivo.devmedia.com.br/forum/imagem/316964-20150828-165702.jpg[/img]
GOSTEI 0
Raimundo Pereira

Raimundo Pereira

25/08/2015

Bruno ,

A questão é que você usa dois eventos no grid , keypress e dbclick

[img]http://arquivo.devmedia.com.br/forum/imagem/437747-20150828-170159.png[/img]

[img]http://arquivo.devmedia.com.br/forum/imagem/437747-20150828-170211.png[/img]

[img]http://arquivo.devmedia.com.br/forum/imagem/437747-20150828-170220.png[/img]


O erro está ocorrendo no envento keypress porquê você leva os dados para FrmCadClientes sendo que você não criou o form FrmCadClientes
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;

Correção >>>


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:=FrmPesquisaCadCidades.SQLDataSet1.FieldByName('CODIGOCIDADE').AsString;
//FrmCadClientes.EdtCidadenOME.Text:=FrmPesquisaCadCidades.SQLDataSet1.FieldByName('NOMECIDADE').AsString;
//FrmCadClientes.EdtEstado.Text:=FrmPesquisaCadCidades.SQLDataSet1.FieldByName('ESTADOCIDADE').AsString;
//FrmCadClientes.MskCep.Text:=FrmPesquisaCadCidades.SQLDataSet1.FieldByName('CEPCIDADE').AsString;
//FrmPesquisaCadCidades := TFrmPesquisaCadCidades.Create(Application);
//try
//FrmCadClientes.ShowModal;
//finally
//FrmCadClientes.Release;
//FrmCadClientes := nil;
//end;
FrmCadClientes := TFrmCadClientes.Create(Application);
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;
GOSTEI 0
Raimundo Pereira

Raimundo Pereira

25/08/2015

Analisando melhor ele vai apresentar o erro em varias rotinas do sistema.
Que só dar para resolver
FrmSEU_FORM := TFrmSEU_FORM.Create(Application);

Pós no Auto Create você só tem o Form_Principal,

Valquiria, você tem alguma indicação ?
GOSTEI 0
Valquiria Silva

Valquiria Silva

25/08/2015

vou baixar o fonte, mas não consigo ver hoje.
Posto amanhã.
GOSTEI 0
Bruno Henrique

Bruno Henrique

25/08/2015

Ok... Obrigado a todos pela atenção
GOSTEI 0
Bruno Henrique

Bruno Henrique

25/08/2015

Valquiria, obrigado!!!

A sua solução foi muito boa, quase deu certo, modifiquei algumas partes e deu certo!!! Obrigado!!!

Abcs

Ps.: Obrigado P2 também pela ajuda!!!
GOSTEI 0
POSTAR