Fórum Acess Violation - Erro #529717

25/08/2015

0

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

Responder

Post mais votado

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

Valquiria Silva

Valquiria Silva
Responder

Gostei + 1

Mais Posts

25/08/2015

Thiago Santana

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

Gostei + 0

25/08/2015

Bruno Henrique

Não deu certo infelizmente. Continua dando o erro!!! O que mais pode tentar
Responder

Gostei + 0

25/08/2015

Bruno Henrique

Ajuda!!!
Responder

Gostei + 0

25/08/2015

Bruno Henrique

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
Responder

Gostei + 0

26/08/2015

Valquiria Silva

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

Existe algum código no evento onShow do formulário?
Responder

Gostei + 0

26/08/2015

Bruno Henrique

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

Gostei + 0

27/08/2015

Valquiria Silva

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

Gostei + 0

27/08/2015

Bruno Henrique

Valquiria, bom dia!!!


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

Bom dia!!!

Grato
Responder

Gostei + 0

27/08/2015

Bruno Henrique

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
Responder

Gostei + 0

28/08/2015

Valquiria Silva

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

Gostei + 0

28/08/2015

Bruno Henrique

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

Gostei + 0

28/08/2015

Raimundo Pereira

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

Gostei + 0

28/08/2015

Bruno Henrique

Sim é possível!!! Tem algum lugar que eu posso colocar o link?
Responder

Gostei + 0

28/08/2015

Valquiria Silva

Bruno CadCidades é outro formulário?

Parece que sim, ele não foi criado em nenhum lugar?
Você precisa dele pra que?
Responder

Gostei + 0

28/08/2015

Bruno Henrique

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

Gostei + 0

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

Aceitar