Carregar o dataset no datasource do formulario
bom dia
eu uso delphi 7 e direito o dataset é perdido no datasource dos formularios
uso herança
ja vi algumas pessoas relatando este problema
eu associava via codigo o dataset ao datasource, mas depois de uns testes vi uns erros de memoria
seria mais ou menos ao fechar o form
e ao abrir ele de novo e dar um insert ele dava erro de memoria
como fazer uma rotina para associar o dataset ao datasource?
valeu
eu uso delphi 7 e direito o dataset é perdido no datasource dos formularios
uso herança
ja vi algumas pessoas relatando este problema
eu associava via codigo o dataset ao datasource, mas depois de uns testes vi uns erros de memoria
seria mais ou menos ao fechar o form
e ao abrir ele de novo e dar um insert ele dava erro de memoria
como fazer uma rotina para associar o dataset ao datasource?
valeu
Diego Macario
Curtidas 0
Respostas
Marco Salles
22/01/2011
Geralmnente no formulário Pai vc coloca o DataSource com a propriedade DataSet em branco ou nill
No formulário filhos vc em tempo de designe vc define para aquele formulário qual o dataset ligar ao DataSource
pode ate mesmo ser no evento onCreate desse formulário , mas pode tb ser definido em tempo de projeto
Não é necessário Rotina para Isto
DaSource.DataSet:=Dm.SeuDataSet ; //esta codificação é o RAD do delphi
GOSTEI 0
Diego Macario
22/01/2011
Geralmnente no formulário Pai vc coloca o DataSource com a propriedade DataSet em branco ou nill
No formulário filhos vc em tempo de designe vc define para aquele formulário qual o dataset ligar ao DataSource
pode ate mesmo ser no evento onCreate desse formulário , mas pode tb ser definido em tempo de projeto
Não é necessário Rotina para Isto
DaSource.DataSet:=Dm.SeuDataSet ; //esta codificação é o RAD do delphi
No formulário filhos vc em tempo de designe vc define para aquele formulário qual o dataset ligar ao DataSource
pode ate mesmo ser no evento onCreate desse formulário , mas pode tb ser definido em tempo de projeto
Não é necessário Rotina para Isto
DaSource.DataSet:=Dm.SeuDataSet ; //esta codificação é o RAD do delphi
Cara eu fazia deste modo, infelizmente nao lembro como ocorria o erro
Acho que quando eu cancelava o que estava fazendo, se inserindo ou alterando
Mas enfim, eu chamava no onshow a associação do datasource com o dataset
E uso um rotina generica pra criar o formulario
Assim que eu saia deste form, e abria ele novamente ele dava erro na linha de associar o datasource ao dataset...
Entende
Valeu
GOSTEI 0
Marco Salles
22/01/2011
Mas uma das maneiras é esta .. Não tem pq complicar
Cara eu fazia deste modo, infelizmente nao lembro como ocorria o erro
Acho que quando eu cancelava o que estava fazendo, se inserindo ou alterando
Mas enfim, eu chamava no onshow a associação do datasource com o dataset
E uso um rotina generica pra criar o formulario
Assim que eu saia deste form, e abria ele novamente ele dava erro na linha de associar o datasource ao dataset...
Entende
Valeu
Qual é a rotina que vc utiliza para criar esses formulários . Ja tive problema com isto a um tempo atrás
Como vc sai desse form ?? esta destruindo corretamente essas instancias ciradas ???
Acho que quando eu cancelava o que estava fazendo, se inserindo ou alterando
Mas enfim, eu chamava no onshow a associação do datasource com o dataset
E uso um rotina generica pra criar o formulario
Assim que eu saia deste form, e abria ele novamente ele dava erro na linha de associar o datasource ao dataset...
Entende
Valeu
GOSTEI 0
Diego Macario
22/01/2011
Mas uma das maneiras é esta .. Não tem pq complicar
Cara eu fazia deste modo, infelizmente nao lembro como ocorria o erro
Acho que quando eu cancelava o que estava fazendo, se inserindo ou alterando
Mas enfim, eu chamava no onshow a associação do datasource com o dataset
E uso um rotina generica pra criar o formulario
Assim que eu saia deste form, e abria ele novamente ele dava erro na linha de associar o datasource ao dataset...
Entende
Valeu
Qual é a rotina que vc utiliza para criar esses formulários . Ja tive problema com isto a um tempo atrás
Como vc sai desse form ?? esta destruindo corretamente essas instancias ciradas ???
Cara eu fazia deste modo, infelizmente nao lembro como ocorria o erro
Acho que quando eu cancelava o que estava fazendo, se inserindo ou alterando
Mas enfim, eu chamava no onshow a associação do datasource com o dataset
E uso um rotina generica pra criar o formulario
Assim que eu saia deste form, e abria ele novamente ele dava erro na linha de associar o datasource ao dataset...
Entende
Valeu
Qual é a rotina que vc utiliza para criar esses formulários . Ja tive problema com isto a um tempo atrás
Como vc sai desse form ?? esta destruindo corretamente essas instancias ciradas ???
Rotina de criação do formulario
procedure AbreForm(aClasseForm: TComponentClass; aForm: TForm);begin Application.CreateForm(aClasseForm, aForm); try aForm.ShowModal; finally aForm.Release; aForm := nil; end;end;
Ao sair do formulario nao realizo qualquer procedimento de limpeza
E meu form de cadastro é herdado de outro
ou seja
formbase - formcadbase - formulario de cadastro de coisas....
Valeu
GOSTEI 0
Marco Salles
22/01/2011
esta rotina generica de criação , tanto comumentemente difundida em cursos em videos aulas é passivel
de erros do tipo relatado por vc . Eu ate h jnão entendo como ainda um desses catedráticos na arte de
ensina Delphi , ate hj não reportou erros que podem aparecer utilizando esta rotina tão difundida
Vou fazer um exemplo , para vc
Abre uma Nova Aplicação
Dois Forms e o segundo na secção AVALAIBLEFORMS ( Sera Criado em Tempo de Execucao)
No FormPrincipal um Botão com duas rotinas
No segundo form coloque apenas um edit , com a seguinte Codificação
Execute a APlicação. CHAME PRIMEIRO O BOTÃO QUE CRIA O FORMULÁRIO UTILIZANDO O SEU
METODO DE CRIAÇÃO ( Difundido Na Internet )
Era de se esperar devido a simplicidade do codigo que ao chamar o Formulário este venha
sem o Edit .. Porém sem aparentemente explicação Tem-se um ERRO de ACESSO
Finalize a Aplicaç~çao e Chame o De Novo o Form Utilizando o Novo Método. Perceba não haver erro nenhum
Perceba aoinda mais que se criar novamente o Form pelo Método DIFUNDIDO aparentemente neste exemplo
simples não terá Erro
Então ?????
//METODO SUGERIDO VC VERA PQ procedure CriarOsForm(ClasseFormulario:TComponentClass; var Formulario); // a variável Formulário é assim mesmo, sem um tipo begin Application.CreateForm(ClasseFormulario,Formulario); Tform(Formulario).ShowModal; Tform(Formulario).Release; end; //METODO PADRAO DIFUNDIDO procedure AbreForm(aClasseForm: TComponentClass; aForm: TForm); begin Application.CreateForm(aClasseForm, aForm); try aForm.ShowModal; finally aForm.Release; aForm := nil; end; end; procedure TForm6.Button1Click(Sender: TObject); begin CriarOsForm(TForm7,form7); end; procedure TForm6.Button2Click(Sender: TObject); begin AbreForm(Tform7,Form7); end;
procedure Sumir; begin Form7.Edit1.Visible:=False; end; //No evento OnShow Chamo o Método Sumir procedure TForm7.FormShow(Sender: TObject); begin Sumir; end;
GOSTEI 0
Diego Macario
22/01/2011
esta rotina generica de criação , tanto comumentemente difundida em cursos em videos aulas é passivel
de erros do tipo relatado por vc . Eu ate h jnão entendo como ainda um desses catedráticos na arte de
ensina Delphi , ate hj não reportou erros que podem aparecer utilizando esta rotina tão difundida
Vou fazer um exemplo , para vc
Abre uma Nova Aplicação
Dois Forms e o segundo na secção AVALAIBLEFORMS ( Sera Criado em Tempo de Execucao)
No FormPrincipal um Botão com duas rotinas
No segundo form coloque apenas um edit , com a seguinte Codificação
Execute a APlicação. CHAME PRIMEIRO O BOTÃO QUE CRIA O FORMULÁRIO UTILIZANDO O SEU
METODO DE CRIAÇÃO ( Difundido Na Internet )
Era de se esperar devido a simplicidade do codigo que ao chamar o Formulário este venha
sem o Edit .. Porém sem aparentemente explicação Tem-se um ERRO de ACESSO
Finalize a Aplicaç~çao e Chame o De Novo o Form Utilizando o Novo Método. Perceba não haver erro nenhum
Perceba aoinda mais que se criar novamente o Form pelo Método DIFUNDIDO aparentemente neste exemplo
simples não terá Erro
Então ?????
de erros do tipo relatado por vc . Eu ate h jnão entendo como ainda um desses catedráticos na arte de
ensina Delphi , ate hj não reportou erros que podem aparecer utilizando esta rotina tão difundida
Vou fazer um exemplo , para vc
Abre uma Nova Aplicação
Dois Forms e o segundo na secção AVALAIBLEFORMS ( Sera Criado em Tempo de Execucao)
No FormPrincipal um Botão com duas rotinas
//METODO SUGERIDO VC VERA PQ procedure CriarOsForm(ClasseFormulario:TComponentClass; var Formulario); // a variável Formulário é assim mesmo, sem um tipo begin Application.CreateForm(ClasseFormulario,Formulario); Tform(Formulario).ShowModal; Tform(Formulario).Release; end; //METODO PADRAO DIFUNDIDO procedure AbreForm(aClasseForm: TComponentClass; aForm: TForm); begin Application.CreateForm(aClasseForm, aForm); try aForm.ShowModal; finally aForm.Release; aForm := nil; end; end; procedure TForm6.Button1Click(Sender: TObject); begin CriarOsForm(TForm7,form7); end; procedure TForm6.Button2Click(Sender: TObject); begin AbreForm(Tform7,Form7); end;
No segundo form coloque apenas um edit , com a seguinte Codificação
procedure Sumir; begin Form7.Edit1.Visible:=False; end; //No evento OnShow Chamo o Método Sumir procedure TForm7.FormShow(Sender: TObject); begin Sumir; end;
Execute a APlicação. CHAME PRIMEIRO O BOTÃO QUE CRIA O FORMULÁRIO UTILIZANDO O SEU
METODO DE CRIAÇÃO ( Difundido Na Internet )
Era de se esperar devido a simplicidade do codigo que ao chamar o Formulário este venha
sem o Edit .. Porém sem aparentemente explicação Tem-se um ERRO de ACESSO
Finalize a Aplicaç~çao e Chame o De Novo o Form Utilizando o Novo Método. Perceba não haver erro nenhum
Perceba aoinda mais que se criar novamente o Form pelo Método DIFUNDIDO aparentemente neste exemplo
simples não terá Erro
Então ?????
Marco, fiz tudo que sugeriu e vi q vc tem razao sobre seu codigo
Agora ja que tu diz que esse metodo difundido é errado, como voce estuda?
O que me sugere de material?
Infelizmente não conheço pessoas que mecham com Delphi...
Eu acreditava que esta codigo estava correto, pois ele cria o form, depois que usa libera ele...
Usando o try finally
GOSTEI 0
Diego Macario
22/01/2011
Cara acabei de testar e ainda apresenta o erro....
Olha so, eu associei no oncreate o clientdataset ao datasource...
Quando insiro um dado e clico para sair...
Ele dispara o evento onclosequery com essa rotina
if DataSource1.State in [dsInsert,dsEdit] then begin case MessageDlg('Deseja salvar as alterações realizados no Cadastro ?', mtConfirmation, [mbYes,mbNo,mbCancel], 0) of mrYes: begin btnSalvar.Click; CanClose := False; end ; mrNo: begin DataSource1.DataSet.Cancel; CanClose := True; end ; mrCancel: begin CanClose := False; end ; end; end else if DataSource1.State = dsBrowse then DataSource1.DataSet.Close;
Ao entrar novamente no mesmo form, e dar um insert gera um erro de memoria na linha onde associo o cds ao ds
Olha so, eu associei no oncreate o clientdataset ao datasource...
Quando insiro um dado e clico para sair...
Ele dispara o evento onclosequery com essa rotina
if DataSource1.State in [dsInsert,dsEdit] then begin case MessageDlg('Deseja salvar as alterações realizados no Cadastro ?', mtConfirmation, [mbYes,mbNo,mbCancel], 0) of mrYes: begin btnSalvar.Click; CanClose := False; end ; mrNo: begin DataSource1.DataSet.Cancel; CanClose := True; end ; mrCancel: begin CanClose := False; end ; end; end else if DataSource1.State = dsBrowse then DataSource1.DataSet.Close;
Ao entrar novamente no mesmo form, e dar um insert gera um erro de memoria na linha onde associo o cds ao ds
GOSTEI 0
Marco Salles
22/01/2011
Uma coisa é uma coisa Outra coisa é outra Coisa .. Provei que utilizar o método de criação tão difundida não
é confiável. Mas não significa que resolvera teu problema ( Na dúvida não use .. )
Vc disse o Seguinte :
Ao entrar novamente no mesmo form, e dar um insert gera um erro de memoria na linha onde associo o cds ao ds
então vc entrou ... Isto é PONTO
Deu Insert Gerou um Erro >>> mas na linha na linha onde associo o cds ao ds
Ora se vc associa o cds no FormShow ou no Oncreate , como pode esta Rotina ser novamente executada ????
tem DESINFORMAÇÃO ai ... Se oForm ja Esta Criado ( Instanciado ) ele não executará o OnCreate Novamente
Vamos concatenar as Idéas .. ok
ps) No Evneto Onclose Depois de DataSource.DataSet:=Dm.SeuDataSet ;
pode e deve abri i DataSet
DataSource.DataSet:=Dm.SeuDataSet ;
DataSource.DataSet.open;
GOSTEI 0
Diego Macario
22/01/2011
Uma coisa é uma coisa Outra coisa é outra Coisa .. Provei que utilizar o método de criação tão difundida não
é confiável. Mas não significa que resolvera teu problema ( Na dúvida não use .. )
Vc disse o Seguinte :
Ao entrar novamente no mesmo form, e dar um insert gera um erro de memoria na linha onde associo o cds ao ds
então vc entrou ... Isto é PONTO
Deu Insert Gerou um Erro >>> mas na linha na linha onde associo o cds ao ds
Ora se vc associa o cds no FormShow ou no Oncreate , como pode esta Rotina ser novamente executada ????
tem DESINFORMAÇÃO ai ... Se oForm ja Esta Criado ( Instanciado ) ele não executará o OnCreate Novamente
Vamos concatenar as Idéas .. ok
ps) No Evneto Onclose Depois de DataSource.DataSet:=Dm.SeuDataSet ;
pode e deve abri i DataSet
DataSource.DataSet:=Dm.SeuDataSet ;
DataSource.DataSet.open;
é confiável. Mas não significa que resolvera teu problema ( Na dúvida não use .. )
Vc disse o Seguinte :
Ao entrar novamente no mesmo form, e dar um insert gera um erro de memoria na linha onde associo o cds ao ds
então vc entrou ... Isto é PONTO
Deu Insert Gerou um Erro >>> mas na linha na linha onde associo o cds ao ds
Ora se vc associa o cds no FormShow ou no Oncreate , como pode esta Rotina ser novamente executada ????
tem DESINFORMAÇÃO ai ... Se oForm ja Esta Criado ( Instanciado ) ele não executará o OnCreate Novamente
Vamos concatenar as Idéas .. ok
ps) No Evneto Onclose Depois de DataSource.DataSet:=Dm.SeuDataSet ;
pode e deve abri i DataSet
DataSource.DataSet:=Dm.SeuDataSet ;
DataSource.DataSet.open;
Cara nao entendi bem
No evento onclose do form?
Mas pq no fechar do form?
eu ja tinha pensado q esse erro é mais pelo fato dele esta associando novamente, estou enganado?
Eu n abro no onshow pois uma vez falaram q n é uma boa coisa...
Dificil, pois cada hora uma pessoa diz algo
GOSTEI 0
Marco Salles
22/01/2011
Cara nao entendi bem
No evento onclose do form?
Desculpe-me ... Eu disse OnClose e o correto é no OnCreate ou mesmo no OnShow
DataSource.DataSet:=Dm.SeuDataSet ;No evento onclose do form?
DataSource.DataSet.open;
eu ja tinha pensado q esse erro é mais pelo fato dele esta associando novamente, estou enganado?
esta sim .. Pq a instancia não existe mais .. Vc Criou uma Nova Instancia e depois destroe com Release
Eu n abro no onshow pois uma vez falaram q n é uma boa coisa...
é depende do que vc fez antes no seu onCreate... Mas nada que não possa fazer no seu onShow
Não é uma Regra mas pode ter uma Exceção
Dificil, pois cada hora uma pessoa diz algo
é verdade....
GOSTEI 0
Diego Macario
22/01/2011
Cara nao entendi bem
No evento onclose do form?
Desculpe-me ... Eu disse OnClose e o correto é no OnCreate ou mesmo no OnShow
DataSource.DataSet:=Dm.SeuDataSet ;
DataSource.DataSet.open;
eu ja tinha pensado q esse erro é mais pelo fato dele esta associando novamente, estou enganado?
esta sim .. Pq a instancia não existe mais .. Vc Criou uma Nova Instancia e depois destroe com Release
Eu n abro no onshow pois uma vez falaram q n é uma boa coisa...
é depende do que vc fez antes no seu onCreate... Mas nada que não possa fazer no seu onShow
Não é uma Regra mas pode ter uma Exceção
Dificil, pois cada hora uma pessoa diz algo
é verdade....
Se ele nao existe mais pois foi destruido pelo gerenciador, entao pq esse erro de memoria?
Eu associei ele...
Engraçado que se eu abrir este form, sair...
E abrir outro form ele nao dara este erro...
Mas se eu fecho o form e abro ele logo em seguida e dou um insert...gera este erro de memoria!
GOSTEI 0
Marco Salles
22/01/2011
Manda para mim este exemplinho ... Tem jeito ???
GOSTEI 0
Diego Macario
22/01/2011
Manda para mim este exemplinho ... Tem jeito ???
Logico, se quiser me mandar email ou me add no msn
diego_macario@hotmail.com
GOSTEI 0
Diego Macario
22/01/2011
Problema solucionado
Com nova rotina de criação de formulario
E correçao no close form
Obrigado Marco!
GOSTEI 0
Marco Salles
22/01/2011
Estou enviando
GOSTEI 0