Rodrigao Postado Outubro 10, 2008 Denunciar Share Postado Outubro 10, 2008 Boa tarde a todos...Peguei uma dica do dbgrid onde mostrava o campo memo em um DBGrid.beleza funcionou certinho, aumente o tamanho da banda onde fica a mensagem e tudo.Só que gostaria de que a mensagem começasse a ser exibida no meio da linha e não no começo. DBGridPLUS1.Canvas.TextRect(Rect, Rect.Left, Rect.Top+15,Column.Field.Text); beleza funcionou 99%. O unico problema é que perdeu todas as propriedades dos outros fields, como Centralizado por ex.alguém já conseguiu ajustar o Top da linha sem perder as propriedades da coluna.AgradecidoRodrigo Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Outubro 10, 2008 Denunciar Share Postado Outubro 10, 2008 Só que gostaria de que a mensagem começasse a ser exibida no meio da linha e não no começo. DBGridPLUS1.Canvas.TextRect(Rect, Rect.Left, Rect.Top+15,Column.Field.Text); beleza funcionou 99%. O unico problema é que perdeu todas as propriedades dos outros fields, como Centralizado por ex.Rodrigao, você deve estar fazendo isto no evento OnDrawColumnCell (ou outro similar), seria interessante que você postasse todo o código como lá está. De qualquer modo, a solução passa por testar se o campo sendo desenhado é o campo memo. Caso não seja, segue com o procedimento default de pintura.Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest Rodrigao Postado Outubro 10, 2008 Denunciar Share Postado Outubro 10, 2008 Boa noite,então ae que esta o detalhe...Alem de querer que o campo meio inicie na metade, tb gostaria de que as outras colunas tbiniciassem na metade. Não só o campo memo. Só que ao fazer isso perde as propriedades align das colunas...Não sei se isso é possivel de se fazer, já procurei um bocado mas não achei nada ainda.AgradecidoRodrigo Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Outubro 11, 2008 Denunciar Share Postado Outubro 11, 2008 (editado) Alem de querer que o campo meio inicie na metade, tb gostaria de que as outras colunas tbiniciassem na metade. Não só o campo memo.isso não estava claro no post anterior...Só que ao fazer isso perde as propriedades align das colunas...isto ocorre porque você desenhando o texto no grid, deverá se preocupar com todas as variantes que estão envolvidas, como por ex.: alinhamento horizontal, se a linha está selecionada ou não e se estando selecionada...Para ganhar o seu tempo, segue uma rotina prontinha para seu uso e, se necessário, adaptação:procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); // procedimento para cálculo e desenho das células procedure DrawAligned(Text :String; Rect :TRect; Alignment :TAlignment); var TxtRect :TRect; TxtHeight, TxtAlign, XOffset, YOffset :Integer; RectWidth :integer; begin with (Sender as TDBGrid) do begin // desenhando o retângulo (célula) Canvas.Brush.Style := bsSolid; Canvas.FillRect(Rect); with Rect do begin Canvas.MoveTo(Right +1, Top -1); Canvas.LineTo(Right +1, Bottom +1); Canvas.LineTo(Left -1, Bottom +1); end; // preparação do alinhamento RectWidth := Rect.Right -Rect.Left +1; case Alignment of taLeftJustify: begin TxtAlign := DT_LEFT; XOffset := Rect.Left +2; end; taCenter : begin TxtAlign := DT_CENTER; XOffset := Rect.Left +(RectWidth -Canvas.TextWidth(Text)) div 2; end; taRightJustify: begin TxtAlign := DT_RIGHT; XOffset := Rect.Left +(RectWidth -Canvas.TextWidth(Text)) -4; end; end; // desenhando o texto na célula Canvas.Brush.Style := bsClear; // na linha abaixo, é testado se o campo é um um campo tipo memorando, para o qual // usamos outro método de desenho que viabiliza o desenho com quebra de linha if Column.Field.FieldType = ftMemo then begin TxtRect := Rect; DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, TxtAlign or DT_WORDBREAK); end else begin // YOffset provoca a centralização do texto na Vertical // se não quizer este alinhamento, basta suprimí-lo nas // duas próximas linhas YOffset := ((Rect.Bottom -Rect.Top) -Canvas.TextHeight('Mj')) div 2; Canvas.TextRect(Rect, XOffset, Rect.Top +YOffset, Text); end; // desenha retângulo pontilhado se a coluna estiver selecionada // e não estiver habilitada a opção de linha selecionada if (gdSelected in State) and not (dgRowSelect in Options) then Canvas.DrawFocusRect(Rect); end; end; begin DrawAligned(Column.Field.AsString, Rect, Column.Alignment); end;O DBGrid deve ter sua propriedade DefaultDrawing = False, e não deve ser chamado o método DefaultDrawColumnCell do DBGrid1.Abraços Editado Outubro 11, 2008 por Micheus Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest Rodrigao Postado Outubro 11, 2008 Denunciar Share Postado Outubro 11, 2008 Muito Obrigado,Me ajudou muito...Consegui fazer certinho o que eu queriaValeuT+Rodrigo Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest Rodrigao Postado Outubro 11, 2008 Denunciar Share Postado Outubro 11, 2008 So mais uma duvida...Em campos currency e calculados ele tira a Formatação...Tem como pintar com essa formatação?AgradecidoRodrigo. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Outubro 11, 2008 Denunciar Share Postado Outubro 11, 2008 Em campos currency e calculados ele tira a Formatação...Tem como pintar com essa formatação?Rodrigao, por acaso você formatou a propriedade DisplayFormat do campo adequadamente?Em geral, usar o AsString, deveria retornar o resultado já formatado de acordo com esta propriedade.Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Rodrigao Postado Outubro 17, 2008 Autor Denunciar Share Postado Outubro 17, 2008 Em campos currency e calculados ele tira a Formatação...Tem como pintar com essa formatação?Rodrigao, por acaso você formatou a propriedade DisplayFormat do campo adequadamente?Em geral, usar o AsString, deveria retornar o resultado já formatado de acordo com esta propriedade.AbraçosBom dia Micheus,Sim, coloquei no componente 0.00 depois #.00 e perde essa formação.Atenciosamente,Rodrigo Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Outubro 17, 2008 Denunciar Share Postado Outubro 17, 2008 Sim, coloquei no componente 0.00 depois #.00 e perde essa formação.Rodrigao, esse lance de sumir a formatação está meio estranho. Mas como fica difícil envestigar, vamos incrementar o procedimento de pintura acima e resolver logo este problema. ;)É interessante, mas a função CurToStr não formata adequadamente este tipo de dados (currency) - pelo menos, no meu entender.Quando você passa uma variável currency para ela, o retorna é basicamente o mesmo que usar StrToFloat. Veja o Ex.: 1568.52 => 1568,52Mas no meu enteder, deveria pelo menos, incluir os separadores de milhar, ou seja, retornar: 1.568,52Mas temos ainda, uma segunda variação desta função, que em teoria deveria resolver este "problema":function CurrToStr(Value: Currency; const FormatSettings: TFormatSettings): string;Com esta, passamos uma variável que é preenchido com todos os parâmetros de formatação do sistema (configurações de localidade), onde usamos a procedure:procedure GetLocaleFormatSettings(LCID: Integer; var FormatSettings: TFormatSettings);para preenchê-la.Mas ainda assim, nada de mudanças. Então, se for para mostrar da forma como citei ser a esperada, é melhor usar a função FormatFloat('#.##0,00', <valor>)Entretanto, se quiser mesmo que ela aparece no formato monetário (R$ 1.568,52), use esta outra função para currency:function CurrToStrF(Value: Currency; Format: TFloatFormat; Digits: Integer): string; (detalhes no help)Eu usarei esta última no código que postei anteriormente - altere-o na posição especificada:... // desenhando o texto na célula Canvas.Brush.Style := bsClear; // caso seja um campo currency, forçamos sua formatação if Column.Field.FieldType = ftCurrency then Text := CurrToStrF(Column.Field.AsCurrency, ffCurrency, 2); // com 2 dígitos de precisão // na linha abaixo, é testado se o campo é um um campo tipo memorando, para o qual // usamos outro método de desenho que viabiliza o desenho com quebra de linha if Column.Field.FieldType = ftMemo then begin TxtRect := Rect; DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, TxtAlign or DT_WORDBREAK); end else ...Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest Rodrigao Postado Outubro 18, 2008 Denunciar Share Postado Outubro 18, 2008 Sim, coloquei no componente 0.00 depois #.00 e perde essa formação.Rodrigao, esse lance de sumir a formatação está meio estranho. Mas como fica difícil envestigar, vamos incrementar o procedimento de pintura acima e resolver logo este problema. ;)É interessante, mas a função CurToStr não formata adequadamente este tipo de dados (currency) - pelo menos, no meu entender.Quando você passa uma variável currency para ela, o retorna é basicamente o mesmo que usar StrToFloat. Veja o Ex.: 1568.52 => 1568,52Mas no meu enteder, deveria pelo menos, incluir os separadores de milhar, ou seja, retornar: 1.568,52Mas temos ainda, uma segunda variação desta função, que em teoria deveria resolver este "problema":function CurrToStr(Value: Currency; const FormatSettings: TFormatSettings): string;Com esta, passamos uma variável que é preenchido com todos os parâmetros de formatação do sistema (configurações de localidade), onde usamos a procedure:procedure GetLocaleFormatSettings(LCID: Integer; var FormatSettings: TFormatSettings);para preenchê-la.Mas ainda assim, nada de mudanças. Então, se for para mostrar da forma como citei ser a esperada, é melhor usar a função FormatFloat('#.##0,00', <valor>)Entretanto, se quiser mesmo que ela aparece no formato monetário (R$ 1.568,52), use esta outra função para currency:function CurrToStrF(Value: Currency; Format: TFloatFormat; Digits: Integer): string; (detalhes no help)Eu usarei esta última no código que postei anteriormente - altere-o na posição especificada:... // desenhando o texto na célula Canvas.Brush.Style := bsClear; // caso seja um campo currency, forçamos sua formatação if Column.Field.FieldType = ftCurrency then Text := CurrToStrF(Column.Field.AsCurrency, ffCurrency, 2); // com 2 dígitos de precisão // na linha abaixo, é testado se o campo é um um campo tipo memorando, para o qual // usamos outro método de desenho que viabiliza o desenho com quebra de linha if Column.Field.FieldType = ftMemo then begin TxtRect := Rect; DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, TxtAlign or DT_WORDBREAK); end else ...AbraçosBoa tarde Micheus,era isto mesmo, deu certo.Muito Obrigado, me quebrou o maior galho.Espero que um dia tenha conhecimento técnico o sufiente para ajudaroutros assim como você tem me ajudado.Atenciosamente,Rodrigo Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Rodrigao
Boa tarde a todos...
Peguei uma dica do dbgrid onde mostrava o campo memo em um DBGrid.
beleza funcionou certinho, aumente o tamanho da banda onde fica a mensagem e tudo.
Só que gostaria de que a mensagem começasse a ser exibida no meio da linha e não no começo.
DBGridPLUS1.Canvas.TextRect(Rect, Rect.Left, Rect.Top+15,Column.Field.Text);
beleza funcionou 99%. O unico problema é que perdeu todas as propriedades dos outros fields, como Centralizado por ex.
alguém já conseguiu ajustar o Top da linha sem perder as propriedades da coluna.
Agradecido
Rodrigo
Link para o comentário
Compartilhar em outros sites
9 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.