Formatar os campos de um dbgrid usando DisplayFormat

Delphi

07/05/2012

Bom dia, estou iniciando no Delphi e usando a versão 2010.
Tenho um sistema para fazer consultas de forma generica usando o comando inherited;
para pegar os parametros nas outras consultas. Porém em uma de minhas consultas, no caso a de produto
os campos de qtd e de valor não estão saindo formatados. ex: Qtde : 4,2 sendo que deveria aparece 4,200
ou o valor R$ 9,9 que deveria aparecer 9,99.

Segue o fonte da unica consulta que não deu certo. Alguém pode me ajudar???

unit untConsultaProduto;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, untConsultaGeneric, untDMPrinc, pngimage, JvExControls, JvXPCore, JvXPButtons,
StdCtrls, JvExStdCtrls, JvEdit, JvValidateEdit, Grids, DBGrids, ExtCtrls, DB;


type
TfrmConsultaProduto = class(TfrmConsultaGeneric)
lblNomeProd: TLabel;

function colunas: String;
procedure edtTextoChange(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure btnConcluidoClick(Sender: TObject);
procedure posicionar;
procedure gridListaDblClick(Sender: TObject);
procedure btnCancelarClick(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
private

procedure montarGrid;

{ Private declarations }
public
procedure pesquisaItem(nome:String);
{ Public declarations }
end;

var
frmConsultaProduto : TfrmConsultaProduto;


implementation

uses ControllConsulta, ControllPrincipais, untPreVenda;

{$R *.dfm}

procedure TfrmConsultaProduto.btnCancelarClick(Sender: TObject);
begin
retCons:= false;
inherited;
//untPreVenda.frmPreVenda.limpaCampos;
if DMPrinc.CDSDadosGrid.RecordCount > 0 then
begin

DMPrinc.CDSDadosGrid.Delete;
DMPrinc.CDSDadosGrid.Append;
untPreVenda.frmPreVenda.gridProdutos.SelectedIndex:=0;
untPreVenda.frmPreVenda.gridProdutos.SetFocus;
end;


end;


procedure TfrmConsultaProduto.btnConcluidoClick(Sender: TObject);
var
ini : TLerINI;
princ :TPrincPedido;
cod : String;
codigo : String;
ret: Boolean;
item : Integer;
begin

cod := ini.config(DAVP,CodBarra);

item := DMPrinc.CDSDadosGrid.RecordCount;
item := item + 1;


with gridLista do
begin
if cod = 0 then
begin
codigo := gridLista.Fields[0].Value;
ret := princ.insereProduto(codigo, 1, item);
// frmPreVenda.gridProdutos.SelectedIndex := frmPreVenda.gridProdutos.SelectedIndex + 2;
posicionar;
end
else
begin
codigo := gridLista.Fields[1].Value;
ret := princ.insereProduto(codigo, 1, item);
posicionar;
end;
end;
retCons:= true;
inherited;


end;

function TfrmConsultaProduto.colunas: String;
var
colunas :String;
begin
colunas := codigo,barras,nome,und_venda,preco_consumidor, qtd_em_estoque;
Result := colunas;




end;

procedure TfrmConsultaProduto.edtTextoChange(Sender: TObject);
begin
inherited;
if edtTexto.Text <> then
begin
pesquisaItem(edtTexto.Text);
end;
end;

procedure TfrmConsultaProduto.FormActivate(Sender: TObject);
begin
inherited;
montarGrid;
nCol := gridLista.Columns.Items[2].FieldName;
pesquisaItem(lblNomeProd.Caption);
gridLista.SetFocus;
end;

procedure TfrmConsultaProduto.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
inherited;
if key = VK_ESCAPE then
begin
if btnCancelar.Enabled = true then
btnCancelarClick(Self);
end;

if key = VK_F10 then
begin
if btnConcluido.Enabled = true then
btnConcluidoClick(Self);

end;

end;

procedure TfrmConsultaProduto.gridListaDblClick(Sender: TObject);
begin
inherited;
btnConcluidoClick(Sender);
end;

procedure TfrmConsultaProduto.montarGrid;
var
retorno: Boolean;
con: TConsulta;
begin

with gridLista do
begin

Columns[0].FieldName := codigo;
Columns[0].Title.Caption := Codigo;
Columns[0].Width := 90;

Columns[1].FieldName := barras;
Columns[1].Title.Caption := Cod. Barras;
Columns[1].Width := 160;

Columns[2].FieldName := nome;
Columns[2].Title.Caption := Nome;
Columns[2].Width := 400;

Columns[3].FieldName := und_venda;
Columns[3].Title.Caption := Uni.;
Columns[3].Width := 50;

Columns[5].FieldName := preco_consumidor;
Columns[5].Title.Caption := Preço;
Columns[5].Width := 100;

Columns[4].FieldName := qtd_em_estoque;
Columns[4].Title.Caption := Qtde.;
Columns[4].Width := 100;

Font.Size := 11;
end;

retorno := con.contuirGrid(colunas, estoque);
with DMPrinc do
begin
TFloatField(CDSConsulta.FieldByName(preco_consumidor)).DisplayFormat:=#,###,##0.00;
TFloatField(CDSConsulta.FieldByName(qtd_em_estoque)).DisplayFormat:=#,###,##0.00;

end;
end;



procedure TfrmConsultaProduto.pesquisaItem(nome: String);
var
consult: TConsulta;
ret: Boolean;
nomeProd : String;
begin
nomeProd := %+nome+%;
ret := consult.procuraItem(colunas,estoque,nCol,nomeProd);
end;

procedure TfrmConsultaProduto.posicionar;
var
ini: TLerINI;
pos : String;
begin
pos := ini.config(ITEM,opcaoItem);
if pos = 0 then
begin
DMPrinc.CDSDadosGrid.Edit;
DMPrinc.CDSDadosGrid.Post;

DMPrinc.CDSDadosGrid.Append;
end
else
begin
DMPrinc.CDSDadosGrid.Edit;
DMPrinc.CDSDadosGrid.Post;
frmPreVenda.gridProdutos.SelectedIndex := frmPreVenda.gridProdutos.SelectedIndex + 2;
end;


end;

end.

Guilherme

Guilherme

Curtidas 0

Melhor post

Joel Rodrigues

Joel Rodrigues

07/05/2012

Rapaz, tente formatar os campos logo após criá-los, não no fim do método como você está fazendo. Veja se surte algum efeito.
GOSTEI 2

Mais Respostas

Guilherme

Guilherme

07/05/2012

Pode me dar um exemplo, pois coloquei logo abaixo do select, e depois testei também na hora de criar as
colunas, mas nas duas ocasioes deram o mesmo erro: CDScONSULTA: FIELD preco_consumidor not found.

Columns[5].FieldName := preco_consumidor;
TFloatField(DMPrinc.CDSConsulta.FieldByName(preco_consumidor)).DisplayFormat:=#,###,##0.00;
Columns[5].Title.Caption := Preço;
Columns[5].Width := 100;


ou


function TfrmConsultaProduto.colunas: String;
var
colunas :String;
begin
colunas := codigo,barras,nome,und_venda,preco_consumidor, qtd_em_estoque;
TFloatField(DMPrinc.CDSConsulta.FieldByName(preco_consumidor)).DisplayFormat:=#,###,##0.00;
Result := colunas;

Mas em nenhuma deu certo deu o mesmo erro...sitado
GOSTEI 0
William

William

07/05/2012

Colega as vezes temos q aproveitar as vantagens que a IDE do delphi nos oferece, supondo que vc esteja usando um ClientDataSet existe uma propriedade para os fields chamada DisplayFormat, através do próprio ObjectInspector vc consegue inserir a formatação desejada para o campo monetário, e não necessita de codificação.

As vezes a simplicidade é o melhor caminho....
GOSTEI 0
Guilherme

Guilherme

07/05/2012

Mas é como eu disse, é uma pesquisa genperica, meu dataset serve para muitas consultas
não tenho um dataset pra cada uma. Entende??? Este é o meu problema.

Se eu entrar no meu datset não existirá nenhum campo para que eu use o a Proriedade do DisplayFormat.
Eu monto as telas de consulta atraves de um metodo, como você pode ver no meu fonte no primeiro post.
Nas outras telas de consulta fiz exatamente daquela forma e funcionou...

Ainda no aguardo de uma solução
GOSTEI 0
William

William

07/05/2012

Bom sendo assim tente trabalhar com o evento AfterOpen, como vc mencionou que usa o mesmo componente para várias consultas vai ter que fazer algumas checagens quando abrir para ver se existe o campo em questão.
GOSTEI 0
Guilherme

Guilherme

07/05/2012

Pode me dar um exemplo de como ficaria, pois sou iniciante no Delphi.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

07/05/2012

Considerando o seu exemplo, tente alterar para a seguinte forma:
Columns[5].FieldName := preco_consumidor;
TFloatField(DMPrinc.CDSConsulta.Fields[5]).DisplayFormat:=´#,###,##0.00´;
Columns[5].Title.Caption := Preço;
Columns[5].Width := 100;
GOSTEI 1
Guilherme

Guilherme

07/05/2012

Ainda não deu certo............ Continua 9,9 onde seria 9,99
O que mais posso Fazer???
GOSTEI 0
William

William

07/05/2012

O jeito é apelar, debuga a aplicação assim quando entrar nesse bloco de código vc verifica se está sendo passado os valores corretos.
GOSTEI 0
William

William

07/05/2012

Colega usa o FormatFloat();
GOSTEI 0
Guilherme

Guilherme

07/05/2012

Ok vou tentar e retorno o resultado pra você...obrigado pela atenção!!!
GOSTEI 0
Guilherme

Guilherme

07/05/2012

Colega usa o FormatFloat();


testei da seguinte forma sem sucesso:

FormatFloat(###,##0.00,CDSConsulta.FieldByName(preco_consumidor).AsFloat);
GOSTEI 0
Guilherme

Guilherme

07/05/2012

Resolvido, usei este comando mais nao depois da grid montada, mas sim na hora
que eu faço o selct no banco.
Deu certinho obrigado a todos pela atenção, em meu primeiro posto....Otima semana a Todos.
GOSTEI 0
Eniorm

Eniorm

07/05/2012

eu formato a celula do grid assim: R$ ###,###,##0.00
sempre funciona como esperado. Se não quiser o R$ é só tirar da string.

Uso isso também exibição formatada de DBEdit, ou no caso do Jedi que eu uso, o JvDBCalcEdit
GOSTEI 0
William

William

07/05/2012

Tá quase lá, vc tem q atribuir o valor.
Coluna(DBGrid) := formatfloat(R$ #####,cds.value);
GOSTEI 0
POSTAR