Como criar um ClientDataset em tempo de execução ?
Olá!
Caros amigos!
Estou precisando criar um ClientDataset em tempo de execução.
Estou montando uma rotina em POO e preciso montar esta tabela.
Minha tabela tem os seguinte campos:
Cds_Dados:
Codigo Integer
Nome VarChar(50)
Data TdateTime
Valor Currency
etc....
Preciso fazer isto em tempo de execucao e ao final destrui-la.
A quem responder, desde já meus agradecimentos.
ANT.CARLOS/SP
Caros amigos!
Estou precisando criar um ClientDataset em tempo de execução.
Estou montando uma rotina em POO e preciso montar esta tabela.
Minha tabela tem os seguinte campos:
Cds_Dados:
Codigo Integer
Nome VarChar(50)
Data TdateTime
Valor Currency
etc....
Preciso fazer isto em tempo de execucao e ao final destrui-la.
A quem responder, desde já meus agradecimentos.
ANT.CARLOS/SP
Ant.carlos/sp
Curtidas 3
Melhor post
Joaoshi
03/04/2008
Colega, se entendi direito:
var cdsTemp : TClientDataSet;
begin
-- cdsTemp := TClientDataSet.Create(Self);
-- cdsTemp.Close;
-- cdsTemp.FieldDefs.Clear;
-- cdsTemp.FieldDefs.add(´CODIGO´,ftInteger);
-- cdsTemp.FieldDefs.add(´NOME´,ftString,50);
-- cdsTemp.CreateDataSet;
end;
Espero ter ajudado.
var cdsTemp : TClientDataSet;
begin
-- cdsTemp := TClientDataSet.Create(Self);
-- cdsTemp.Close;
-- cdsTemp.FieldDefs.Clear;
-- cdsTemp.FieldDefs.add(´CODIGO´,ftInteger);
-- cdsTemp.FieldDefs.add(´NOME´,ftString,50);
-- cdsTemp.CreateDataSet;
end;
Espero ter ajudado.
GOSTEI 4
Mais Respostas
Ant.carlos/sp
03/04/2008
Olá!
Caro amigo, obrigado pela atenção.
Beleza, me ajudou muito, mas preciso tbém:
1-Criar um DataSourse e ligar ao CDS.
2-Ao final destruir estes dois componentes.
100+
ANT.CARLOS/SP
Caro amigo, obrigado pela atenção.
Beleza, me ajudou muito, mas preciso tbém:
1-Criar um DataSourse e ligar ao CDS.
2-Ao final destruir estes dois componentes.
100+
ANT.CARLOS/SP
GOSTEI 1
Delphi32
03/04/2008
Basta você adicionar uma variável do tipo TDataSource, criar e ligar a propriedade, exatamente como você faria se usasse os componentes em um form. Abaixo aproveitei o código do joaoshi.
Obs.: mudei o ´Create(Self)´ para ´Create(nil)´. Dessa forma você fica responsável pela liberar o componente da memória. Para fazer isso você usaria:
t+!
var cdsTemp : TClientDataSet; dsTemp: TDataSource; begin cdsTemp := TClientDataSet.Create(nil); cdsTemp.Close; cdsTemp.FieldDefs.Clear; cdsTemp.FieldDefs.add(´CODIGO´,ftInteger); cdsTemp.FieldDefs.add(´NOME´,ftString,50); cdsTemp.CreateDataSet; dsTemp := TDataSource.Create(nil); dsTemp.DataSet := cdsTemp; end;
Obs.: mudei o ´Create(Self)´ para ´Create(nil)´. Dessa forma você fica responsável pela liberar o componente da memória. Para fazer isso você usaria:
cdsTemp.Close; FreeAndNil(cdsTemp); FreeAndNil(dsTemp);
t+!
GOSTEI 2
Wadojr
03/04/2008
No meu caso tenho um clientdatase que não é dinamico porém os fields deste client, são criados dinamicamente ex:
[color=green:64a71871aa] cds_qtd_oper.FieldDefs.Add(´Total_Oper´,ftInteger);
cds_qtd_oper.FieldDefs.Add(´Total_Qtd´,ftFloat);
cds_qtd_oper.FieldDefs.Add(´Rest_Oper´,ftInteger);[/color:64a71871aa]
em algum momento preciso destruir todos os fields que foram criados neste client, para criar outros diferentes. Como faço para destruir todos os fields?
desde já agradeço moçada, abraços!!!
[color=green:64a71871aa] cds_qtd_oper.FieldDefs.Add(´Total_Oper´,ftInteger);
cds_qtd_oper.FieldDefs.Add(´Total_Qtd´,ftFloat);
cds_qtd_oper.FieldDefs.Add(´Rest_Oper´,ftInteger);[/color:64a71871aa]
em algum momento preciso destruir todos os fields que foram criados neste client, para criar outros diferentes. Como faço para destruir todos os fields?
desde já agradeço moçada, abraços!!!
GOSTEI 1
Fabiano Góes
03/04/2008
No meu caso tenho um clientdatase que não é dinamico porém os fields deste client, são criados dinamicamente ex:
[color=green:1ffcf7349f] cds_qtd_oper.FieldDefs.Add(´Total_Oper´,ftInteger);
cds_qtd_oper.FieldDefs.Add(´Total_Qtd´,ftFloat);
cds_qtd_oper.FieldDefs.Add(´Rest_Oper´,ftInteger);[/color:1ffcf7349f]
em algum momento preciso destruir todos os fields que foram criados neste client, para criar outros diferentes. Como faço para destruir todos os fields?
desde já agradeço moçada, abraços!!!
para destruir todos o TFields
var i: integer; begin ClientDataSet1.Close; for i := 0 to ClientDataSet1.FieldDefs.Count - 1 do if i > 0 then ClientDataSet1.FieldDefs.Delete(i-1) else ClientDataSet1.FieldDefs.Delete(i); // criar novamente os TFields end;
GOSTEI 1
Joaoshi
03/04/2008
Ou simplesmente [b:e7a41c2efe]ClientDataSet1.FieldDefs.Clear[/b:e7a41c2efe];
GOSTEI 1
Fabiano Góes
03/04/2008
Ou simplesmente [b:bef783efeb]ClientDataSet1.FieldDefs.Clear[/b:bef783efeb];
muito bem lembrado joaoshi.
alterando meu código:
begin ClientDataSet1.Close; ClientDataSet1.FieldDefs.Clear; // criar novamente os TFields end;
GOSTEI 1
Ant.carlos/sp
03/04/2008
Olá!
Tenha um outro problema:
Preciso agora ativar os eventos desta tabela:
AfterInsert, AfterPost, ...
Desde já meus agradecimentos.
ANT.CARLOS / SP
Tenha um outro problema:
Preciso agora ativar os eventos desta tabela:
AfterInsert, AfterPost, ...
Desde já meus agradecimentos.
ANT.CARLOS / SP
GOSTEI 1
Dmalta
03/04/2008
[b:3c5773bc54][i:3c5773bc54]Dica geral para criar componentes em tempo de execução por código.[/i:3c5773bc54][/b:3c5773bc54]
Começe colocando o componente em design-time no form ou data module. Configure todas as [b:3c5773bc54]propriedades[/b:3c5773bc54] e implemente todos os [b:3c5773bc54]eventos[/b:3c5773bc54] necessários. Esse componente servirá apenas como protótipo e você logo poderá excluí-lo.
Utilize um desses métodos para gerar o código:
1) Visualize o form como texto (´View as Text´ no menu popup), localize o objeto (Ctrl+F para ´Find´), copie a sua definição (Ctrl+C), vá para o editor de código, cole a definição anterior (Ctrl+V) e faça as alterações necessárias para adaptar o texto à sintaxe Delphi. Por exemplo, é necessário trocar ´=´ por ´:=´ e acrescentar ´;´ no fim das linhas.
2) Usando [url=http://gexperts.org/]GExperts[/url] é mais fácil. Apenas selecione o componente e depois clique na opção ´Component to Code´ no menu popup (right-click). Vá para o editor de código e cole (Ctrl+V) o código que o GExpert gerou automaticamente e copiou para a área de transferência.
Por fim, delete o componente protótipo que tinha criado.
Começe colocando o componente em design-time no form ou data module. Configure todas as [b:3c5773bc54]propriedades[/b:3c5773bc54] e implemente todos os [b:3c5773bc54]eventos[/b:3c5773bc54] necessários. Esse componente servirá apenas como protótipo e você logo poderá excluí-lo.
Utilize um desses métodos para gerar o código:
1) Visualize o form como texto (´View as Text´ no menu popup), localize o objeto (Ctrl+F para ´Find´), copie a sua definição (Ctrl+C), vá para o editor de código, cole a definição anterior (Ctrl+V) e faça as alterações necessárias para adaptar o texto à sintaxe Delphi. Por exemplo, é necessário trocar ´=´ por ´:=´ e acrescentar ´;´ no fim das linhas.
2) Usando [url=http://gexperts.org/]GExperts[/url] é mais fácil. Apenas selecione o componente e depois clique na opção ´Component to Code´ no menu popup (right-click). Vá para o editor de código e cole (Ctrl+V) o código que o GExpert gerou automaticamente e copiou para a área de transferência.
Por fim, delete o componente protótipo que tinha criado.
GOSTEI 1
Wadojr
03/04/2008
è isso ae moçada, deu certinho, como sempre,
Valew demaaais, abraços!!
Valew demaaais, abraços!!
GOSTEI 1
Wadojr
03/04/2008
[b:b1fc4aecd9]ANT.CARLOS/SP escreveu:[/b:b1fc4aecd9]
[color=green:b1fc4aecd9]Olá!
Tenha um outro problema:
Preciso agora ativar os eventos desta tabela:
AfterInsert, AfterPost, ...
Desde já meus agradecimentos.
ANT.CARLOS / SP[/color:b1fc4aecd9]
Amigo para inserir eventos no seu ClientDataSet Dinamico basta vc criar uma Procedure que contenha o código que vc precisa e referencia-la.
Ex:[color=green:b1fc4aecd9] procedure AfterPost_Dinamic(DataSet: TDataSet);
procedure TfrmOrcamento.AfterPost_Dinamic(DataSet: TDataSet);
begin
*seu código
end;[/color:b1fc4aecd9]
Quando criar o ClientDataSet referencie sua procedure..
Ex:
[color=green:b1fc4aecd9]//criando o client dinamicamente
cds_qtd_oper := TClientDataSet.Create(nil);
cds_qtd_oper.Close;
// inserindo os eventos necessarios
cds_qtd_oper.AfterOpen := AfterPost_Dinamic;[/color:b1fc4aecd9]
[color=green:b1fc4aecd9]Olá!
Tenha um outro problema:
Preciso agora ativar os eventos desta tabela:
AfterInsert, AfterPost, ...
Desde já meus agradecimentos.
ANT.CARLOS / SP[/color:b1fc4aecd9]
Amigo para inserir eventos no seu ClientDataSet Dinamico basta vc criar uma Procedure que contenha o código que vc precisa e referencia-la.
Ex:[color=green:b1fc4aecd9] procedure AfterPost_Dinamic(DataSet: TDataSet);
procedure TfrmOrcamento.AfterPost_Dinamic(DataSet: TDataSet);
begin
*seu código
end;[/color:b1fc4aecd9]
Quando criar o ClientDataSet referencie sua procedure..
Ex:
[color=green:b1fc4aecd9]//criando o client dinamicamente
cds_qtd_oper := TClientDataSet.Create(nil);
cds_qtd_oper.Close;
// inserindo os eventos necessarios
cds_qtd_oper.AfterOpen := AfterPost_Dinamic;[/color:b1fc4aecd9]
GOSTEI 2
Ant.carlos/sp
03/04/2008
Olá!
Boa tarde!
TEnho novo problema: DBGrid X CDS
Fiz tudo conforme os amigos passaram e funcionou.
Mas, Este CDS está ligado à um DBGRID.
Quando informo os dados no teclado, tudo funiona normalmente.
Quando faço faço uma pesquisa, seleciono o registro, gravo na tabela,
o DBGrid não exibe os dados, embora os mesmos estejam gravados, mas somente nas colunas que gravei, pois nas coluna q digito os dados permanecem.
O problema acontece qdo informo a tabela CDS criada em tempo de execucao.
No meu form, tenho um Cds Protótipo o qual uso pra config. o DBGrid, depois
o subistu-o pelo que eu crie, quando faço isso o DBGrid perde algumas configuraçoes, como por exemplo Campos CheckBox, passam a apresentar o a string
´T´/ou ´F´.
A quem responder, desde já meus agradecimentos.
ANT.CARLOS/SP
Boa tarde!
TEnho novo problema: DBGrid X CDS
Fiz tudo conforme os amigos passaram e funcionou.
Mas, Este CDS está ligado à um DBGRID.
Quando informo os dados no teclado, tudo funiona normalmente.
Quando faço faço uma pesquisa, seleciono o registro, gravo na tabela,
o DBGrid não exibe os dados, embora os mesmos estejam gravados, mas somente nas colunas que gravei, pois nas coluna q digito os dados permanecem.
O problema acontece qdo informo a tabela CDS criada em tempo de execucao.
No meu form, tenho um Cds Protótipo o qual uso pra config. o DBGrid, depois
o subistu-o pelo que eu crie, quando faço isso o DBGrid perde algumas configuraçoes, como por exemplo Campos CheckBox, passam a apresentar o a string
´T´/ou ´F´.
A quem responder, desde já meus agradecimentos.
ANT.CARLOS/SP
GOSTEI 0
Ant.carlos/sp
03/04/2008
Olá!
Bom Resolvi o problema.
Como uso um no meu Form Cds para configurar meu Grid, eu esta usando localmente: Cds_dados.Append,Post.
Mas, para acessar o arquivo q deseja usar, inserido no
Ds_DataSourse := Informe_Nome_Tabela(), deveria usar p/ referir-me a tabela estrangeira, Ds_Datasouse.Dataset.Insert, Post,....
O segredo é usar: Ds_Datasouse.Dataset
Obrigado pessoal
Bom Resolvi o problema.
Como uso um no meu Form Cds para configurar meu Grid, eu esta usando localmente: Cds_dados.Append,Post.
Mas, para acessar o arquivo q deseja usar, inserido no
Ds_DataSourse := Informe_Nome_Tabela(), deveria usar p/ referir-me a tabela estrangeira, Ds_Datasouse.Dataset.Insert, Post,....
O segredo é usar: Ds_Datasouse.Dataset
Obrigado pessoal
GOSTEI 0
Gladstone Matos
03/04/2008
Colega, se entendi direito:
var cdsTemp : TClientDataSet;
begin
-- cdsTemp := TClientDataSet.Create(Self);
-- cdsTemp.Close;
-- cdsTemp.FieldDefs.Clear;
-- cdsTemp.FieldDefs.add(´CODIGO´,ftInteger);
-- cdsTemp.FieldDefs.add(´NOME´,ftString,50);
-- cdsTemp.CreateDataSet;
end;
Espero ter ajudado.
var cdsTemp : TClientDataSet;
begin
-- cdsTemp := TClientDataSet.Create(Self);
-- cdsTemp.Close;
-- cdsTemp.FieldDefs.Clear;
-- cdsTemp.FieldDefs.add(´CODIGO´,ftInteger);
-- cdsTemp.FieldDefs.add(´NOME´,ftString,50);
-- cdsTemp.CreateDataSet;
end;
Espero ter ajudado.
excelente, obrigado! :D
GOSTEI 0