Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Top do DBGrid


Rodrigao

Pergunta

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

  • 0
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

Link para o comentário
Compartilhar em outros sites

  • 0

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 tb

iniciassem 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.

Agradecido

Rodrigo

Link para o comentário
Compartilhar em outros sites

  • 0
Alem de querer que o campo meio inicie na metade, tb gostaria de que as outras colunas tb

iniciassem 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 por Micheus
Link para o comentário
Compartilhar em outros sites

  • 0
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

Link para o comentário
Compartilhar em outros sites

  • 0
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

Bom dia Micheus,

Sim, coloquei no componente 0.00 depois #.00 e perde essa formação.

Atenciosamente,

Rodrigo

Link para o comentário
Compartilhar em outros sites

  • 0
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,52

Mas no meu enteder, deveria pelo menos, incluir os separadores de milhar, ou seja, retornar: 1.568,52

Mas 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

Link para o comentário
Compartilhar em outros sites

  • 0
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,52

Mas no meu enteder, deveria pelo menos, incluir os separadores de milhar, ou seja, retornar: 1.568,52

Mas 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

Boa 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 ajudar

outros assim como você tem me ajudado.

Atenciosamente,

Rodrigo

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...