Access Violation at adress .... in module .... XXX.exe
Prezados, estou com a seguinte dificuldade:
criei uma tela de cadastro básica e um DM, com DbExpress (firebird).
Ela está funcionando perfeitamente. No entanto, para construir o sistema criei um form principal. Esse form chama a tela de cadastro.
Quando eu chamo a tela de cadastro dessa maneira, ao gravar as alterações eu obtenho o seguinte erro:
"Access Violation at address 007AAB75 in module 'Academia.exe'. Read of address 0000003AC."
O DM e o form principal estão em auto-create. O form de cadastro está em avaible.
O que eu estranho, é que o erro está exatamente na linha de gravação, e não na abertura da conexão do DM. Alguém sabe o que estou deixando de fazer?
Ressalto novamente, se eu retiro o form principal e deixo a tela de cadastro com o DM em auto-create, ele funciona perfeitamente.
Não tenho muita experiência em Delphi, talvez seja uma bobeira, mas de qualquer forma gostaria da ajuda de vocês.
Desde já obrigado!
Segue o código:
_____________________________________________________________-
criei uma tela de cadastro básica e um DM, com DbExpress (firebird).
Ela está funcionando perfeitamente. No entanto, para construir o sistema criei um form principal. Esse form chama a tela de cadastro.
Quando eu chamo a tela de cadastro dessa maneira, ao gravar as alterações eu obtenho o seguinte erro:
"Access Violation at address 007AAB75 in module 'Academia.exe'. Read of address 0000003AC."
O DM e o form principal estão em auto-create. O form de cadastro está em avaible.
O que eu estranho, é que o erro está exatamente na linha de gravação, e não na abertura da conexão do DM. Alguém sabe o que estou deixando de fazer?
Ressalto novamente, se eu retiro o form principal e deixo a tela de cadastro com o DM em auto-create, ele funciona perfeitamente.
Não tenho muita experiência em Delphi, talvez seja uma bobeira, mas de qualquer forma gostaria da ajuda de vocês.
Desde já obrigado!
Segue o código:
_____________________________________________________________-
implementation
{$R *.dfm}
uses DataModule;
procedure TfrmCadastro.btnGravarClick(Sender: TObject);
begin
dmCadastro.cdsAcademia.Open;
dmCadastro.cdsAcademia.Edit;
dmCadastro.cdsAcademia.Append;
dmCadastro.cdsAcademia.FieldByName('NOME').Value:=frmCadastro.edtNome.Text; {<---ERRO OCORRE NESTA LINHA}
dmCadastro.cdsAcademia.Post;
dmCadastro.cdsAcademia.ApplyUpdates(-1);
dmCadastro.cdsAcademia.Close;
end;Giovani
Curtidas 0
Respostas
Ricardo
12/11/2014
Vamos lá...
dmCadastro.cdsAcademia.FieldByName('NOME').Value := edtNome.Text;
Você está querendo editar um registro existente ou adicionar um novo?
Usar as duas linhas abaixo? ou você edita ou insere.
dmCadastro.cdsAcademia.Edit;
dmCadastro.cdsAcademia.Append;
Observe esses pontos que já vai resolver.
dmCadastro.cdsAcademia.FieldByName('NOME').Value := edtNome.Text;
Você está querendo editar um registro existente ou adicionar um novo?
Usar as duas linhas abaixo? ou você edita ou insere.
dmCadastro.cdsAcademia.Edit;
dmCadastro.cdsAcademia.Append;
Observe esses pontos que já vai resolver.
GOSTEI 0
Ricardo
12/11/2014
Outra coisa que esqueci de citar: Você já criou o dataset?
Se não, então tem que colocar a linha dmCadastro.cdsAcademia.CreateDataSet antes da linha dmCadastro.cdsAcademia.Open.
Se não, então tem que colocar a linha dmCadastro.cdsAcademia.CreateDataSet antes da linha dmCadastro.cdsAcademia.Open.
GOSTEI 0
Giovani
12/11/2014
Opa, então Ricardo, como eu disse a aplicação funciona!
Ela só dá o Access Violation quando eu crio um form principal pelo qual eu acesso o form de cadastro. Se eu coloco o form de cadastro direto no auto-create e retiro o form principal do projeto, não há erro algum e o registro é salvo no banco.
O problema não está no dataset, nem nos comandos de inserção, portanto.
De qualquer maneira, eu fiz o que vc recomendou. A mensagem de erro continua a mesma.
Ela só dá o Access Violation quando eu crio um form principal pelo qual eu acesso o form de cadastro. Se eu coloco o form de cadastro direto no auto-create e retiro o form principal do projeto, não há erro algum e o registro é salvo no banco.
O problema não está no dataset, nem nos comandos de inserção, portanto.
De qualquer maneira, eu fiz o que vc recomendou. A mensagem de erro continua a mesma.
GOSTEI 0
Giovani
12/11/2014
Gente, se interessar a alguém. Eu troquei o 'frmCadastro' do código por Self e daí o erro de Access Violation cessou.
Valeu, Abs!
Valeu, Abs!
GOSTEI 0
Ricardo
12/11/2014
Que bom Giovani que resolveu, mas vamos a umas considerações:
dmCadastro.cdsAcademia.Edit;
dmCadastro.cdsAcademia.Append;
ou mesmo que fosse
dmCadastro.cdsAcademia.Append;
dmCadastro.cdsAcademia.Edit;
isso não existe. Ou insere ou edita.
O self é para o próprio form gerenciar a forma com ele é executado e encerrado. No autocreate é própria aplicação que vai cria-lo na memória no momento da execução do sistema; daí o erro.
dmCadastro.cdsAcademia.Edit;
dmCadastro.cdsAcademia.Append;
ou mesmo que fosse
dmCadastro.cdsAcademia.Append;
dmCadastro.cdsAcademia.Edit;
isso não existe. Ou insere ou edita.
O self é para o próprio form gerenciar a forma com ele é executado e encerrado. No autocreate é própria aplicação que vai cria-lo na memória no momento da execução do sistema; daí o erro.
GOSTEI 0