Access Violation
Ao sair de um procedimento, ao passar pelo ultimo end da uma mensagem de access violation, alguem sabe o que é?
Prilady
Curtidas 0
Respostas
Marco Salles
20/03/2007
Algum objeto que não esta instancaido , que não existe ou que ja foi destruido
Tipo isso
Coloque o fragemento de código para mais esclarecimentos
Tipo isso
var
umObjeto:TButton;
begin
umObjeto:=TButton.create(nil);
umObjeto.free;
umObjeto.name:=´VaiDarZebra´;
end;
Coloque o fragemento de código para mais esclarecimentos
GOSTEI 0
Prilady
20/03/2007
O CÓDIGO É O SEGUINTE:
procedure TfrmMenu.btnPesquisarClick(Sender: TObject);
var
fornec01: tfornec01;
aierro:integer;
pcHost,pcDir,pcNive :array[0..79] of char;
begin
psaux:=´´;
StrPCopy(pcHost,asHost);
StrPCopy(pcDir,asPath);
StrPCopy(pcNive,asNivel);
aiErro := IniciaServidor(strnew(pchost));
If (aiErro = 0) then
AbreBancoDeDados(strnew(pcDir),strnew(pcNive),aiSegur,aiModo);
aiErro := ReiniciaSequencial(strnew(´fornec01´));
If (aiErro = 0) then
aiErro := LeProximoRegistroSequencial(strnew(´fornec01´),@fornec01);
uiTotal := 1;
aiErro := ReiniciaSequencial(strnew(´fornec01´));
If (aiErro = 0) then aiErro := LeProximoRegistroSequencial(strnew(´fornec01´),@fornec01);
uvDados[1] := TStringList.Create;
uvDados[2] := TStringList.Create;
While aiErro = 0 do
begin
psAux := ´99.999.999/9999-99´;
uvDados[1].Add(Picture(fornec01.a017cgc,psAux));
psAux := ´´;
uvDados[2].Add(Picture(fornec01.a017nom,psAux));
if fornec01.a017nom[1] = edtBusca.Text then
begin
sgFornecedores.Cells[0,uitotal] := fornec01.a017nom;
inc(uiTotal);
end;
aiErro := LeProximoRegistroSequencial(strnew(´fornec01´),@fornec01);
next
end;
FechaBancoDeDados;
FinalizaServidor;
end;
procedure TfrmMenu.btnPesquisarClick(Sender: TObject);
var
fornec01: tfornec01;
aierro:integer;
pcHost,pcDir,pcNive :array[0..79] of char;
begin
psaux:=´´;
StrPCopy(pcHost,asHost);
StrPCopy(pcDir,asPath);
StrPCopy(pcNive,asNivel);
aiErro := IniciaServidor(strnew(pchost));
If (aiErro = 0) then
AbreBancoDeDados(strnew(pcDir),strnew(pcNive),aiSegur,aiModo);
aiErro := ReiniciaSequencial(strnew(´fornec01´));
If (aiErro = 0) then
aiErro := LeProximoRegistroSequencial(strnew(´fornec01´),@fornec01);
uiTotal := 1;
aiErro := ReiniciaSequencial(strnew(´fornec01´));
If (aiErro = 0) then aiErro := LeProximoRegistroSequencial(strnew(´fornec01´),@fornec01);
uvDados[1] := TStringList.Create;
uvDados[2] := TStringList.Create;
While aiErro = 0 do
begin
psAux := ´99.999.999/9999-99´;
uvDados[1].Add(Picture(fornec01.a017cgc,psAux));
psAux := ´´;
uvDados[2].Add(Picture(fornec01.a017nom,psAux));
if fornec01.a017nom[1] = edtBusca.Text then
begin
sgFornecedores.Cells[0,uitotal] := fornec01.a017nom;
inc(uiTotal);
end;
aiErro := LeProximoRegistroSequencial(strnew(´fornec01´),@fornec01);
next
end;
FechaBancoDeDados;
FinalizaServidor;
end;
GOSTEI 0
Marco Salles
20/03/2007
So uma pergunta .
Deixando como comentário as duas ultimas instruçoes
Voce ainda tem o erro ::::
Tente tb deixar como comentário somente a Ultima
Deixando como comentário as duas ultimas instruçoes
//FechaBancoDeDados;
//FinalizaServidor;
Voce ainda tem o erro ::::
Tente tb deixar como comentário somente a Ultima
FechaBancoDeDados;
//FinalizaServidor;
GOSTEI 0
Marco Salles
20/03/2007
So uma pergunta .
Deixando como comentário as duas ultimas instruçoes
Voce ainda tem o erro ::::
Tente tb deixar como comentário somente a Ultima
Deixando como comentário as duas ultimas instruçoes
//FechaBancoDeDados;
//FinalizaServidor;
Voce ainda tem o erro ::::
Tente tb deixar como comentário somente a Ultima
FechaBancoDeDados;
//FinalizaServidor;
GOSTEI 0
Prilady
20/03/2007
Mesmo tirando essas duas rotinas ainda da erro. Se eu tirar a função da dll leproximoregistrosequencial ele nao da mais erro, mas preciso dela pra pegar os valores, provavelmente é ela que esta gerando erro. Se tivesse como liberar ela da memoria depois de usa-la... mas não sei como fazer isso... obrigada
GOSTEI 0
Marco Salles
20/03/2007
Se tivesse como liberar ela da memoria depois de usa-la... mas não sei como fazer isso... obrigada
Jeito tem... Mas engraçado que se voce[b:4ebbfb40c8] não[/b:4ebbfb40c8] libera-la não daria acesso violado , a nao ser que voce estivesse usando algo nela que não existisse mais...
Vejo que nesta sua dll voce so usa muito a função leproximoregistrosequencial , não seria uma opção chamar esta função em rumtime atraves de Tipo Procedimental ????
Por fim se voce suspeita que esta função que esta dando este erro , verifique qual são os objetos que estão presentes nelas e que foram destruidos .. Este tipo de erro a grosso modo se dá atarvés d acesso a algo que não esta mais na memória
GOSTEI 0
Prilady
20/03/2007
Gente deu certo, muito obrigada, mas não me perguntem como que eu nem sei, acho que digitei o nome errado de algum objeto, obrigada
GOSTEI 0