No seu Delphi, crie um novo projeto de aplicação Windows. Em seguida, remova o formulário criado do projeto. A seguir, copie e cole os conteúdos abaixo para criar os respectivos arquivos mencionados, Unit1.dfm e Unit2.dfm. Depois, adicione o Unit1.pas criado. Execute a aplicação. Espero que seja o que você procurava. Boa sorte. Sds.
{ Unit1.dfm início } object dbgCalculo: TdbgCalculo Left = 73 Top = 126 BorderStyle = bsDialog Caption = 'Cálculos com ClientDataSets e DBGrids' ClientHeight = 370 ClientWidth = 594 Color = clBtnFace Font.Charset = ANSI_CHARSET Font.Color = clWindowText Font.Height = -12 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False Position = poScreenCenter PixelsPerInch = 96 TextHeight = 14 object lblTotal: TLabel Left = 337 Top = 346 Width = 63 Height = 14 Alignment = taRightJustify Caption = 'Total Geral:' end object dbgCalculo: TDBGrid Left = 4 Top = 4 Width = 584 Height = 333 DataSource = dsCalculo Font.Charset = ANSI_CHARSET Font.Color = clNavy Font.Height = -12 Font.Name = 'Tahoma' Font.Style = [] ParentFont = False TabOrder = 0 TitleFont.Charset = ANSI_CHARSET TitleFont.Color = clWindowText TitleFont.Height = -12 TitleFont.Name = 'Tahoma' TitleFont.Style = [] end object panTotal: TPanel Left = 406 Top = 344 Width = 104 Height = 18 BevelOuter = bvLowered TabOrder = 1 object dbtTotal: TDBText Left = 1 Top = 1 Width = 102 Height = 16 Align = alClient Alignment = taRightJustify DataField = 'TotalValorTotaliza' DataSource = dsCalculo Font.Charset = ANSI_CHARSET Font.Color = clNavy Font.Height = -12 Font.Name = 'Tahoma' Font.Style = [fsBold] ParentFont = False end end object cdsCalculo: TClientDataSet Active = True Aggregates = <> AggregatesActive = True Params = <> BeforePost = cdsCalculoBeforePost OnNewRecord = cdsCalculoNewRecord Left = 184 Top = 212 Data = { 620000009619E0BD010000001800000004000000000003000000620002494404 000100000000000944657363726963616F010049000000010005574944544802 00020032000556616C6F72080004000000000008546F74616C697A6102000300 000000000000} object cdsCalculoID: TIntegerField DisplayWidth = 7 FieldName = 'ID' end object cdsCalculoDescricao: TStringField DisplayLabel = 'Descrição' DisplayWidth = 50 FieldName = 'Descricao' Size = 50 end object cdsCalculoValor: TFloatField DisplayWidth = 10 FieldName = 'Valor' DisplayFormat = '#,##0.00' end object cdsCalculoTotaliza: TBooleanField DisplayLabel = 'Totalizar ?' DisplayWidth = 10 FieldName = 'Totaliza' OnChange = cdsCalculoTotalizaChange OnGetText = cdsCalculoTotalizaGetText OnSetText = cdsCalculoTotalizaSetText end object cdsCalculoValorTotaliza: TFloatField FieldKind = fkInternalCalc FieldName = 'ValorTotaliza' Visible = False end object cdsCalculoTotalValorTotaliza: TAggregateField FieldName = 'TotalValorTotaliza' Active = True Expression = 'SUM(ValorTotaliza)' IndexName = 'DEFAULT_ORDER' end end object dsCalculo: TDataSource DataSet = cdsCalculo Left = 260 Top = 212 end end { Unit1.dfm final } { Unit1.pas início } unit Unit1; interface uses Classes, Forms, Windows, DB, DBClient, StdCtrls, Controls, DBCtrls, ExtCtrls, Grids, DBGrids; type TdbgCalculo = class(TForm) cdsCalculo: TClientDataSet; dsCalculo: TDataSource; dbgCalculo: TDBGrid; panTotal: TPanel; dbtTotal: TDBText; lblTotal: TLabel; cdsCalculoDescricao: TStringField; cdsCalculoID: TIntegerField; cdsCalculoValor: TFloatField; cdsCalculoTotaliza: TBooleanField; cdsCalculoValorTotaliza: TFloatField; cdsCalculoTotalValorTotaliza: TAggregateField; procedure cdsCalculoNewRecord(DataSet: TDataSet); procedure cdsCalculoTotalizaGetText(Sender: TField; var Text: String; DisplayText: Boolean); procedure cdsCalculoTotalizaChange(Sender: TField); procedure cdsCalculoBeforePost(DataSet: TDataSet); procedure cdsCalculoTotalizaSetText(Sender: TField; const Text: String); public constructor Create(AOwner: TComponent); override; end; var dbgCalculo: TdbgCalculo; implementation uses SysUtils; {$R *.dfm} procedure TdbgCalculo.cdsCalculoNewRecord(DataSet: TDataSet); begin cdsCalculoTotaliza.AsBoolean := true; cdsCalculoTotalizaChange(cdsCalculoTotaliza); end; constructor TdbgCalculo.Create(AOwner: TComponent); begin inherited Create(AOwner); // Configura uma lista de campos para uma combo que o DBGrid // automaticamente mostrará quando o usuário for informar // se o valor será totalizado ou não dbgCalculo.Columns[3].PickList.Text := 'NÃO' + sLineBreak + 'SIM'; end; procedure TdbgCalculo.cdsCalculoTotalizaGetText(Sender: TField; var Text: String; DisplayText: Boolean); const lNomes: array[Boolean] of string = ('NÃO', 'SIM'); begin if Sender.IsNull or (Sender.DataSet.RecordCount = 0) then Text := EmptyStr else {if DisplayText then} Text := lNomes[Sender.AsBoolean] {else Text := Sender.AsString} end; procedure TdbgCalculo.cdsCalculoTotalizaChange(Sender: TField); begin // Copia ou não o valor informado para o campo que será totalizado case Sender.AsBoolean of false: cdsCalculoValorTotaliza.AsFloat := 0.00; true: cdsCalculoValorTotaliza.AsFloat := cdsCalculoValor.AsFloat; end; end; procedure TdbgCalculo.cdsCalculoBeforePost(DataSet: TDataSet); begin // Antes de salvar, força recálculo da expressão totalizadora cdsCalculoTotalizaChange(cdsCalculoTotaliza) end; procedure TdbgCalculo.cdsCalculoTotalizaSetText(Sender: TField; const Text: String); begin // Traduz a entrada de strings via DBGrid em valores booleanos if Text = 'NÃO' then Sender.AsBoolean := false; if Text = 'SIM' then Sender.AsBoolean := true; // Posta a alteração para forçar recálculo cdsCalculo.Post; end; end. { Unit1.pas final } De: delphi-br@yahoogrupos.com.br [mailto:delphi...@yahoogrupos.com.br] Em nome de harleydiaskoehler Enviada em: quinta-feira, 7 de janeiro de 2010 09:35 Para: delphi-br@yahoogrupos.com.br Assunto: [delphi-br] Calculo em DBGrid Prezados Colegas Preciso realizar calculos dentro de um dbrig. Utilizo um clientdataset em memoria e tenho diversos registros. São quatro campos: id : integer, ds : string, totaliza : string(S/N) e vl : valor. Atraves de um stringList faço uma carga inicial dos dados que estão em um arquivo texto. O usario valida o campo valor e os altera caso necessário em seguida clica em um botão que faz os calculos dos campos valor onde (totaliza) com a flag = 'S' Gostaria de eliminar esse botão e a medida que o usuario fosse alterando o campo valor, o calculo fosse feito automaticamente, como uma planilha excel. tentei colocar o codigo do botão em diversos eventos do grid ou do proprio clientdataset, mas não consegui fazer funcionar. Alguem ja fez algo parecido ? saudações [As partes desta mensagem que não continham texto foram removidas]