Carregar o dataset no datasource do formulario

Delphi

22/01/2011

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
Diego Macario

Diego Macario

Curtidas 0

Respostas

Marco Salles

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

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
 
 

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

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 ???        
GOSTEI 0
Diego Macario

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 ???
 
 
 
 
 

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

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  
//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 ?????
GOSTEI 0
Diego Macario

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
 

//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

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
GOSTEI 0
Marco Salles

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

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; 
 
 
 
 


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

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 ;
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

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

Marco Salles

22/01/2011

Manda para mim este exemplinho ... Tem jeito ???
GOSTEI 0
Diego Macario

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

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

Marco Salles

22/01/2011

Estou enviando
GOSTEI 0
POSTAR