Ir para conteúdo
Fórum Script Brasil
  • 0

Violação De Acesso


Guest VDLR

Pergunta

Pessoal alguém saberia me dizer o motivo deste erro e como corrigir

Access Violation at address 7c80d189 in module ‘Kernel 32.dll’ read of address 00000004

Isto acontece toda vez que digito uma pesquisa no edit e uso a tecla backspace ou detele, dando ok no erro ele me aponta pra esta procedure

aponta pra esta linha na procedure

if DMdados.TBcadequip.Locate('DESCRICAO',copy(EDpesquisa.Text,1,EDpesquisa.SelStart),[loPartialKey]) then

procedure TFRcontvctoequip.EDpesquisaChange(Sender: TObject); 
var 
Aux : integer; 
begin 
  if DMdados.TBcadequip.Locate('DESCRICAO',copy(EDpesquisa.Text,1,EDpesquisa.SelStart),[loPartialKey]) then 
     begin 
        EDpesquisa.OnChange := nil; 
        Aux := EDpesquisa.SelStart; 
        EDpesquisa.Text      := IntToStr(DMdados.TBcadequipREG.Value); 
        EDpesquisa.Text     := DMdados.TBcadequipDESCRICAO.AsString; 
        EDpesquisa.SelStart := Aux; 
        EDpesquisa.OnChange := EDpesquisaChange; 
     end 
     else 
     begin 
     if EDpesquisa.SelStart>0 then 
        begin 
           EDpesquisa.OnChange := nil; 
           Aux := EDpesquisa.SelStart; 
           EDpesquisa.Text:=''; 
           EDpesquisa.Text:=copy(EDpesquisa.Text,1,EDpesquisa.SelStart)+''; 
           EDpesquisa.SelStart := Aux; 
           EDpesquisa.OnChange := EDpesquisaChange; 
        end; 
     end; 
end; procedure TFRcontvctoequip.EDpesquisaChange(Sender: TObject); 
var 
Aux : integer; 
begin 
  if DMdados.TBcadequip.Locate('DESCRICAO',copy(EDpesquisa.Text,1,EDpesquisa.SelStart),[loPartialKey]) then 
     begin 
        EDpesquisa.OnChange := nil; 
        Aux := EDpesquisa.SelStart; 
        EDpesquisa.Text      := IntToStr(DMdados.TBcadequipREG.Value); 
        EDpesquisa.Text     := DMdados.TBcadequipDESCRICAO.AsString; 
        EDpesquisa.SelStart := Aux; 
        EDpesquisa.OnChange := EDpesquisaChange; 
     end 
     else 
     begin 
     if EDpesquisa.SelStart>0 then 
        begin 
           EDpesquisa.OnChange := nil; 
           Aux := EDpesquisa.SelStart; 
           EDpesquisa.Text:=''; 
           EDpesquisa.Text:=copy(EDpesquisa.Text,1,EDpesquisa.SelStart)+''; 
           EDpesquisa.SelStart := Aux; 
           EDpesquisa.OnChange := EDpesquisaChange; 
        end; 
     end; 
end; 

Estou usando clientdataset.

Abraços

VDLR

<_<

Link para o comentário
Compartilhar em outros sites

18 respostass a esta questão

Posts Recomendados

  • 0
Pessoal alguém saberia me dizer o motivo deste erro e como corrigir
Access Violation at address 7c80d189 in module ‘Kernel 32.dll’ read of address 00000004

Isto acontece toda vez que digito uma pesquisa no edit e uso a tecla backspace ou detele, dando ok no erro ele me aponta pra esta procedure

aponta pra esta linha na procedure

if DMdados.TBcadequip.Locate('DESCRICAO',copy(EDpesquisa.Text,1,EDpesquisa.SelStart),[loPartialKey]) then

Tente incluir uma variável para receber o texto a ser pesquisado (ex. StrToSearch), assim você pode avaliar (CTRL+F7) seu conteúdo antes de chamar a função locate, além de chamar a função copy uma única vez e utilizar a variável em todos os pontos em que necessitar.

Uma dica: se há ações que são realizadas tanto dentro do then quando do else, provavelmente este código pode ficar antes e/ou depois do bloco if...then...else, veja abaixo:

procedure TFRcontvctoequip.EDpesquisaChange(Sender: TObject); 
var 
  Aux : integer; 
  StrToSearch :String;
begin 
  EDpesquisa.OnChange := nil; 
  Aux := EDpesquisa.SelStart; 
  StrToSearch := copy(EDpesquisa.Text, 1, EDpesquisa.SelStart);
  if DMdados.TBcadequip.Locate('DESCRICAO', StrToSearch, [loPartialKey]) then
  begin 
   // *** a linha seguinte parece não fazer sentido devido a linha subsequente.
      EDpesquisa.Text := IntToStr(DMdados.TBcadequipREG.Value);
      EDpesquisa.Text := DMdados.TBcadequipDESCRICAO.AsString; 
  end 
  else 
  begin 
      if EDpesquisa.SelStart>0 then 
      begin 
       // *** a linha seguinte parece não fazer sentido devido a linha subsequente.
          EDpesquisa.Text :='';
          EDpesquisa.Text :=StrToSearch;
      end; 
  end; 
  EDpesquisa.SelStart := Aux; 
  EDpesquisa.OnChange := EDpesquisaChange; 
end;

Link para o comentário
Compartilhar em outros sites

  • 0

Michel, obrigado por sua atenção.

Cara fiz o que você falou, mas dá o mesmo erro de violação de acesso. Isto é muito estranho, pois tenho este código em outros enventos OnChange e não dá problema, este erro está acontecendo em dois forms.

Sei lá cara é muito estranho isto, já tentei varias coisa e sempre dá o mesmo erro.

Se você ver alguma coisa.

Abraços

Valdecir

Link para o comentário
Compartilhar em outros sites

  • 0
Cara já fiz isto, coloquei diversos brack-point e a linha que acusa o erro é a do locate.
Conferiu, nestes break's o valor de:

1) DMdados

2) DMdados.TBcadequip

Eles por alguma razão não poderiam estar inválidos?

Tem que por o break antes de usá-los, daí verifica o 1º, se o conteúdo for válido (<> de nil), verifica o 2º.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0
Conferiu, nestes break's o valor de:

1) DMdados

2) DMdados.TBcadequip

Eles por alguma razão não poderiam estar inválidos?

Tem que por o break antes de usá-los, daí verifica o 1º, se o conteúdo for válido (<> de nil), verifica o 2º.

Cara não entendi.

Não sei se estou fazendo certo.

O que fiz foi o seguinte:

Coloquei um break na linha do locate, apertei tecla F9, fui ate o editpesquisa e digitei uma pesquisa, o sistema voltou para o Delphi, apertei novamente a tecla F9 e no sistema a tecla backspace, que me retornou ao delphi, apertei a tecla F8 ai me dá o erro de violação de acesso.

Colocando uns break's antes desta linha, e apertando a tecla F8 o cursor vai pulando para linha após o break, em algumas ocasiões recebo um input do Delphi - Source File not Found: dbalegrid.pas - pedindo para localizar este arquivo. Este dbgrid é um componente que peguei na internet acho que não tem nada a ver com o erro de acesso.

Já alterei este componente e dá o mesmo erro.

Abraço

Valdecir

;)

Feliz Natal........... :D

Link para o comentário
Compartilhar em outros sites

  • 0

VDLR, era quase isso que eu estava falando. Só que quando você pára na linha do break, você não executa de imediato. você utiliza a combinção CTRL+F7 para inspencionar o conteúdo das variáveis que lhe mencinei. Captou?

Access violation normalmente está associado a acesso a área de memória não alocada. Não possibilidade de em algum momento estas variáveis (DMdados, DMdados.TBcadequip) assumirem o valor nil ou lixo?

você não está também mexendo em outro evento do tipo KeyPress ou algo assim, está?

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus, tudo bem.

Fiz o que você orientou, executei o sistema e dei CTRL + F7

Em Expression colocando  DMdados
Em Result recebo o seguinte
([csInheritable], $B4877C, $B48EE0, $B493D0, $B49588, $B496F8, $B49880, $B49998, $B49AF4, $B49BF8, $B49D7C, $B49E80, $B49FD4, $B4A0BC, $B4A270, $B4A390, $B4A4EC, $B4A60C, $B4A75C, $B48C8C, $B4C000, $B4C544, $B4C6FC, $B4C88C, $B4CA14, $B4CBA4, $B4CD5C, $B4CEEC, $B4D050, $B4D1A0, $B4D2E8, $B4D424, $B4BD58, $B4D774, $B4D89C, $B4D9B0, $B4DAF8, $B4DC24, $B4DD34, $B4DE78, $B4DFC4, $B4E128, $B4E26C, $B4E3B4, $B4E53C, $B50E10, $B50EDC, $B517D0, $B51908, $B52384, $B51F34, $B5214C, $B4AC88, $B4AE7C, $B4B038, $B4B1FC, $B4B3F4, $B4B540, $B4B678, $B4B804, $B4B974, $B4BAA8, $B4BC70, $B4328C, $B42978, $B42C40, $B4EAB4, $B4ECAC, $B4EE88, $B4F190, $B4F34C, $B4F534, $B4F6F4, $B4F884, $B4FA18, $B4FBF4, $B4FD50, $B4FEAC, $B4D510, $B4D61C, $B4FFF0, $B50140, $B50294, $B503D4, $B50518, $B5094C, $B50AC8, $B50C48, $B52464, $B53808, $B5390C, $B528E4, $B53C10, $B53D0C, $B53DF4, $B53EDC, $B53FC8, $B54148, $B54284, $B54400, $B54574, $B546F0, $B5483C, $B549DC, $B54B50, $B52990, $B52B58, $B52CE8, $B52E70, $B52FC0, $B42DF8, $B50600, $B507A8, $B4EFE4, $B53464, $B5354C, $B53634, $B53720, $B51464, $B51630)

Em Expression colocando DMdados.TBcaddoc

Em Result recebo o seguinte

([csInheritable])

Cara está certo isto

você não está também mexendo em outro evento do tipo KeyPress ou algo assim, está?

Neste form não estou usando.

Abraço

Valdecir

Link para o comentário
Compartilhar em outros sites

  • 0
VDLR, parece que não há risco de estar acessando conteúdo inválido.

Só para confirmar, você utilizou a sugestão que dei no post #2 no sentido de fazer o processo de copy da string para a variável auxiliar antes de passá-la ao Locate?

Puxa cara eu já fiz isto.

Será que não teria uma outra forma de fazer isto no OnChange do Edit, com este código acontece a mesma coisa

DMdados.TBplanocta.Locate('DESCRCONTA',VarArrayOf([EDpesquisa.Text]),[loCaseInsensitive, loPartialKey]);  

O estranho que isto só acontece no ClientDataSet, tenho o mesmo código com IBtable e não da acontece isto.

Abraço

Valdecir

:( :(

Link para o comentário
Compartilhar em outros sites

  • 0

VDLR, implementei um exemplo, utilizando o código do post #2 e não obtive qualquer erro.

Acessei uma tabela em um banco Firebird, utilizando os componentes: SQLConnection, SQLQuery, DataSetProvider e ClientDataSet ("ligados" nesta sequência). Deve haver alguma partibularidade em seu caso. Alterei, também, algumas propriedades e nada. Não sei mais como lhe ajudar, sinto muito.

Há um probleminha com relação a atualização da caixa de texto quando você, utilizando o back-space, apaga o 1º caracter do texto de pesquisa - a caixa deveria ficar limpa, mas isso não ocorre. Para corrigir:

procedure TMainForm.EDpesquisaChange(Sender: TObject);
var
  Aux : integer;
  StrToSearch :String;
begin
  EDpesquisa.OnChange := nil;
  Aux := EDpesquisa.SelStart;
  StrToSearch := copy(EDpesquisa.Text, 1, EDpesquisa.SelStart);
  if DMdados.TBcadequip.Locate('DESCRICAO', StrToSearch, [loPartialKey]) then
      EDpesquisa.Text := DMdados.TBcadequipDESCRICAO.AsString
  else
      EDpesquisa.Text := StrToSearch;  // *** retirado um if antes desta linha
  EDpesquisa.SelStart := Aux;
  EDpesquisa.OnChange := EDpesquisaChange;
end;

Abraços.

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus, tudo bem.

Não sei se tem alguma coisa haver, estou usando estes componentes:

SQLConnection, SQLDataSet, DataSetProvider, ClientDataSet e DataSource (nesta sequência)

Será que o problema pode estar no SQLDataSet, pois voce testou com SQLQuery.

Abraço

Valdecir

:unsure:

Link para o comentário
Compartilhar em outros sites

  • 0

cara pode até ser estranho, mas eu lutei contra este erro muitas vezes e só parou de me atrapalhar quando eu coloquei uma verificação no OnChange do Edit da busca:

If Edit1.Text <> '' Then

ai aqui você coloca a sua procedure.

Não sei se o seu caso será o mesmo que o meu, mas pra mim funciona até hoje e nunca mais tive este erro.

Alexandre

Link para o comentário
Compartilhar em outros sites

  • 0

Pessoal desculpe a demora, fique todo este tempo sem NET.........

Puxa tentei das duas formas, mas infelizmente deu na mesma. Não sei mais o que fazer com isso, se vocês quiserem dar uma olhada no sistema.

Sei lá de repente é uma coisa tão simples que está na minha cara e eu não estou vendo.

Abraço

Valdecir

:unsure: :(

Link para o comentário
Compartilhar em outros sites

  • 0

opa

tenta descobrir aonde exatamente está o erro pela

call stack do delphi...

talvez ajude pelo menos, faça o seguinte

rode seu programa pelo Delphi, quando der o erro

você clica em OK na mensagem de erro, o editor

irá parar na linha onde o erro aconteceu, o que não

é verdade, literalmente ele ocorreu ali mas pode ter

acontecido em outra unit por exemplo, então com

o editor parado na linha do erro você faz

Control + Alt + S

vai aparecer uma janelinha, a de Call Stack...

nela deve aparecer alguns itens, clique em cada um desses

itens e o editor irá para uma linha relacionada ao erro...

Vale lembrar que este tipo de erro seu pouco provavél será

solucionado por este procedimento pois ele acontece na

dll Kernel32, se fosse um Access Violation, etc seria mais

fácil de encontrá-lo...

Mas tente do modo que falei talvez ajude, ah e se possível,

a cada item da janela da CallStack cole aqui parte do código

onde o editor aponta, assim fica mais fácil alguém te ajudar...

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      652k
×
×
  • Criar Novo...