| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
marcosbaixista Profissional

Registrado: Quinta-Feira, 18 de Março de 2010 Mensagens: 594 Localização: Maringá/PR
|
Enviada: Seg Set 16, 2013 1:30 pm Assunto: Access Violation ao abrir Query pela segunda vez.[Resolvido] |
|
|
Boa tarde pessoal.
Estou enfrentando um grave problema em minha aplicação quando tento abrir uma ADQuery pela segunda vez.
Estou usando FireDAC com Firebird.
O código que estou usando é esse:
| Código: |
Function AcessoTela(Tela: Integer; Usuario: Integer): TPermissao; stdcall;
var
Botoes: TPermissao;
Campo: String;
I: Integer;
begin
IniciaDLL;
try
try
SetLength(Botoes, 4);
DadosFuncao.QryAuxiliar.Close;
DadosFuncao.QryAuxiliar.SQL.Clear;
DadosFuncao.QryAuxiliar.SQL.Add('SELECT * FROM FUNCAOUSU WHERE CODTELA = ' + IntToStr(Tela) + ' AND CODUSUARIO = ' + IntToStr(Usuario));
DadosFuncao.QryAuxiliar.Open; // O Access Violation acontece quando passa por essa linha.
for I:= 0 to 3 do begin
case I of
0:Campo:= 'CONSULTAR';
1:Campo:= 'INCLUIR';
2:Campo:= 'ALTERAR';
3:Campo:= 'EXCLUIR';
end;
if DadosFuncao.QryAuxiliar.FieldByName(Campo).AsString = '' then
Botoes[I] := 'n'
else
Botoes[I] := DadosFuncao.QryAuxiliar.FieldByName(Campo).AsString;
end;
DadosFuncao.QryAuxiliar.Close;
Result:= Botoes;
except
on erro: Exception do begin
if not TVerificaException.TrataExcception(erro) then begin
Assert(False, '');
TVerificaException.SalvarLog(erro);
raise;
end;
end;
end;
finally
Finalize(Botoes);
FinalizaDLL;
end;
end;
|
O erro só acontece quando chamo essa função pela segunda vez, na primeira ele funciona perfeitamente.
Alguém saberia me dizer porque isso ta acontecendo?
Muito obrigado a todos.
Editado pela última vez por marcosbaixista em Ter Set 24, 2013 1:55 pm, num total de 1 vez |
|
| Voltar ao Topo |
|
 |
marcosbaixista Profissional

Registrado: Quinta-Feira, 18 de Março de 2010 Mensagens: 594 Localização: Maringá/PR
|
Enviada: Seg Set 16, 2013 11:04 pm Assunto: |
|
|
| Alguém? |
|
| Voltar ao Topo |
|
 |
magnolima Novato

Registrado: Segunda-Feira, 16 de Setembro de 2013 Mensagens: 53
|
Enviada: Ter Set 17, 2013 7:07 am Assunto: |
|
|
O contexto do seu Try...Except está muito longo, reduza ele para ver se o problema é realmente na abertura da conexão, de repente é algum outro erro e você está sendo "engando" pelo try... Sugestão, comente os trys e veja qual é o erro real, depois devolva o try para controlá-los.
Abraços |
|
| Voltar ao Topo |
|
 |
marcosbaixista Profissional

Registrado: Quinta-Feira, 18 de Março de 2010 Mensagens: 594 Localização: Maringá/PR
|
Enviada: Ter Set 17, 2013 1:38 pm Assunto: |
|
|
Olá MagnoLima.
Obrigado pela ajuda.
Tentei fazer o que você sugeriu e não deu resultado.
Tentei tbm trocar os componentes de conexão pelos da paleta Interbase e ocorre o mesmo problema, o que significa que não é pal no componente.
Dentro desta DLL, tenho outras funções que acessam o mesmo componente e não ocorre erro algum, rodam normalmente sem dar problemas.
Essa função estava funcionando normalmente até dias atrás, e do nada começou a dar Access Violation quando chama ela pela segunda vez. Comportamento muito estranho.
Não sei mais o que fazer pra solucionar isso, vou ter que acabar refazendo essa DLL pelo jeito.
Se tiver mais alguma idéia, será muito bem vindo.
Obrigado amigo. |
|
| Voltar ao Topo |
|
 |
cyberdisk Colaborador

Registrado: Domingo, 4 de Julho de 2010 Mensagens: 2391 Localização: São José dos Campos - SP
|
Enviada: Ter Set 17, 2013 4:52 pm Assunto: |
|
|
troque a Function por procedure que voce vai descobrir onde esta o problema
abraço _________________ O conhecimento abre muitas portas |
|
| Voltar ao Topo |
|
 |
marcosbaixista Profissional

Registrado: Quinta-Feira, 18 de Março de 2010 Mensagens: 594 Localização: Maringá/PR
|
Enviada: Ter Set 17, 2013 11:42 pm Assunto: |
|
|
Olá amigo.
Mais usando Procedure eu não consigo receber o retorno, tem como fazer com procedure? Preciso chamar esse bloco de código e pegar o retorno, que é atribiudo a uma variável na tela principal.
| cyberdisk escreveu: | troque a Function por procedure que voce vai descobrir onde esta o problema
abraço |
|
|
| Voltar ao Topo |
|
 |
cyberdisk Colaborador

Registrado: Domingo, 4 de Julho de 2010 Mensagens: 2391 Localização: São José dos Campos - SP
|
Enviada: Qua Set 18, 2013 12:30 am Assunto: |
|
|
em uma procedure voce tem que passar o resultado para uma variavel global
ou então experimente deixar a IniciaDLL e a FinalizaDll fora da function para ver o resultado
abraço _________________ O conhecimento abre muitas portas |
|
| Voltar ao Topo |
|
 |
marcosbaixista Profissional

Registrado: Quinta-Feira, 18 de Março de 2010 Mensagens: 594 Localização: Maringá/PR
|
Enviada: Ter Set 24, 2013 1:54 pm Assunto: |
|
|
O problema foi resolvido declarando na uses da DLL o Sharemen.
Lendo o Help do Delphi, diz que isso gerencia a memoria da DLL. Por esse motivo eu estava tendo vários erros não só com o array como também na criação do datamodule e abertura de query´s na DLL. |
|
| Voltar ao Topo |
|
 |
|