Fórum Como desenhar no canvas do dbgrid redimensionando a imagem? #340450

16/04/2007

0

Pessoal, tenho o codigo abaixo para desenha uma imagem no dbgrid:

  if Column.FieldName = ´BMP´ then
    begin
      TDBGrid(Sender).Canvas.Draw(Rect.Left,Rect.Top,bmp);
    end;


Mas gostaria de saber como desenhar redimensionando, tipo:

[color=blue:d56e69e193]->[/color:d56e69e193] Tenho uma imagem de 90 x 90 px
[color=blue:d56e69e193]->[/color:d56e69e193] Tenho um espaço na célula do grid de 50 x 50 px
[color=blue:d56e69e193]->[/color:d56e69e193] ao desenhar esta imagem no na célula, boa parte da imagem é cortada


[color=darkblue:d56e69e193][size=18:d56e69e193]Como desenha-la exibindo todo seu conteúdo e sem aumentar o tamanho da célula?[/size:d56e69e193][/color:d56e69e193]

Aguardo pela ajuda de todos.

Abraços
:wink:


Aloizio Castro

Aloizio Castro

Responder

Posts

16/04/2007

Micheus

Pessoal, tenho o codigo abaixo para desenha uma imagem no dbgrid:
  if Column.FieldName = ´BMP´ then
    begin
      TDBGrid(Sender).Canvas.Draw(Rect.Left,Rect.Top,bmp);
    end;
Mas gostaria de saber como desenhar redimensionando, tipo: [color=blue:c3773eff7d]->[/color:c3773eff7d] Tenho uma imagem de 90 x 90 px [color=blue:c3773eff7d]->[/color:c3773eff7d] Tenho um espaço na célula do grid de 50 x 50 px [color=blue:c3773eff7d]->[/color:c3773eff7d] ao desenhar esta imagem no na célula, boa parte da imagem é cortada [color=darkblue:c3773eff7d][size=18:c3773eff7d]Como desenha-la exibindo todo seu conteúdo e sem aumentar o tamanho da célula?[/size:c3773eff7d][/color:c3773eff7d] Aguardo pela ajuda de todos. Abraços :wink:
[b:c3773eff7d]_anderson_[/b:c3773eff7d], partindo das informações que vc colocou acima, tente assim:
[i:c3773eff7d]TDBGrid(Sender).Canvas.CopyRect(Rect, bmp.Canvas, Rect(0, 0, bmp.width, bmp.height));[/i:c3773eff7d]

CopyRect vai fazer a cópia da imagem no canvas de bmp, da posição (0, 0, width, height <=> 0, 0, 90, 90) para o Rect da célula de seu DBGrid. Como as dimensões são proporcionais o resultado deve ficar bom.

Abraços


Responder

Gostei + 0

17/04/2007

Aloizio Castro

Micheus, gerou o seguinte erro:

[color=red:1fe1c1eaf8][Pascal Error] Unit1.pas(46): E2029 ´)´ expected but ´,´ found [Pascal Error] Unit1.pas(46): E2034 Too many actual parameters [Pascal Error] Unit1.pas(46): E2029 ´END´ expected but ´)´ found [Pascal Error] Unit1.pas(49): E2029 Declaration expected but identifier ´FreeAndNil´ found [Pascal Error] Unit1.pas(51): E2029 ´.´ expected but ´;´ found [Pascal Fatal Error] Project1.dpr(5): F2063 Could not compile used unit ´Unit1.pas´[/color:1fe1c1eaf8]


[color=darkblue:1fe1c1eaf8]onde:[/color:1fe1c1eaf8]

[31] procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
[32]   DataCol: Integer; Column: TColumn; State: TGridDrawState);
[33] var
[34]   Bmp : TBitMap;
[35] begin
[36]   Bmp := TBitmap.Create;
[37]   Bmp.LoadFromFile(´F:\Anderson\Avatar\Anderson.bmp´);
[38]
[39]   // Mantém o DefaultRowHeigth com uma altura para caber tudo
[40]   if TDbGridHack(TDBGrid(Sender)).RowHeights[0] <> 90 then
[41]     TDbGridHack(TDBGrid(Sender)).DefaultRowHeight := 90;
[42]
[43]   if Column.Index = 0 then
[44]     begin
[45]       //TDBGrid(Sender).Canvas.StretchDraw(Rect,bmp);
[46]       TDBGrid(Sender).Canvas.CopyRect(Rect, bmp.Canvas, (0, 0, bmp.width, bmp.height));
[47]     end;
[48]
[49]   FreeAndNil(Bmp);
[50] 
[51] end;


O codigo está com as linhas numeradas para identificar o erro..
[color=darkblue:1fe1c1eaf8][i:1fe1c1eaf8]
Micheus, você pode notar que na linha 45 eu consegui um codigo para desenhar utilizando [b:1fe1c1eaf8]Stretch[/b:1fe1c1eaf8], mas mesmo assim gostaria de ver sua dica funcionando, será que poderia me ajudar?!?[/i:1fe1c1eaf8][/color:1fe1c1eaf8]

Abraços :wink:


Responder

Gostei + 0

19/04/2007

Micheus

[b:e22f2f9677]_anderson_[/b:e22f2f9677], vc apenas esqueceu de colocar a função rect na instrução da linha 46. Observe:
[i:e22f2f9677]TDBGrid(Sender).Canvas.CopyRect(Rect, bmp.Canvas, (0, 0, bmp.width, bmp.height));[/i:e22f2f9677]

mas deveria ser:
[i:e22f2f9677]TDBGrid(Sender).Canvas.CopyRect(Rect, bmp.Canvas, [b:e22f2f9677]Rect[/b:e22f2f9677](0, 0, bmp.width, bmp.height));[/i:e22f2f9677]

Talvez seja necessário preceder a chamada da função Rect com o nome da unit onde se encontra (se não me engano seria Classes.Rect), já que há um parâmetro com o mesmo nome dentro desta procedure.

Outra coisa, para otimizar seu código, carregue o bmp apenas quando for pintar a coluna onde ele deve aparecer. Não esqueça que este evento ocorre para cada coluna, bem como para o número de linhas visíveis.

Também não sei se é uma boa idéia definir DefaultRowHeight neste evento, porque muito provavelmente a alteração desta propriedade resultará numa nova repintura do grid. Vc não poderia fazer isto na inicialização do form? Avalie isto.

Abraços


Responder

Gostei + 0

20/04/2007

Aloizio Castro

[b:0e04a63c68]_anderson_[/b:0e04a63c68], vc apenas esqueceu de colocar a função rect na instrução da linha 46. Observe: [i:0e04a63c68]TDBGrid(Sender).Canvas.CopyRect(Rect, bmp.Canvas, (0, 0, bmp.width, bmp.height));[/i:0e04a63c68] mas deveria ser: [i:0e04a63c68]TDBGrid(Sender).Canvas.CopyRect(Rect, bmp.Canvas, [b:0e04a63c68]Rect[/b:0e04a63c68](0, 0, bmp.width, bmp.height));[/i:0e04a63c68] Talvez seja necessário preceder a chamada da função Rect com o nome da unit onde se encontra (se não me engano seria Classes.Rect), já que há um parâmetro com o mesmo nome dentro desta procedure.


Vc tah certo, na hora de postar no forum eu retirei o Rect, mas o que estava errado era a falta de referencia a unit q contem a classe!

veja como ficou:
  if Column.Index = 0 then
    begin
      //TDBGrid(Sender).Canvas.StretchDraw(Rect,bmp);
      TDBGrid(Sender).Canvas.CopyRect(Rect, bmp.Canvas,Classes.Rect(0, 0, bmp.width, bmp.height));
    end;



Outra coisa, para otimizar seu código, carregue o bmp apenas quando for pintar a coluna onde ele deve aparecer. Não esqueça que este evento ocorre para cada coluna, bem como para o número de linhas visíveis.


Este codigo era soh pra teste, o bd eh um bd do alias dbdemos com poucos registros, por isto este descaso com a performance!!
Vlw pela dica!

Também não sei se é uma boa idéia definir DefaultRowHeight neste evento, porque muito provavelmente a alteração desta propriedade resultará numa nova repintura do grid. Vc não poderia fazer isto na inicialização do form? Avalie isto.


Eu avaliei isto.. existem momentos em q é necessário fechar e abrir o dataset, daew o grid perde a altura estabelecida da linhas. Para que isto nao aconteça a todo momento gerando repaint, tem um if como vc pode notar no codigo!!

  // Mantém o DefaultRowHeigth com uma altura para caber tudo
  if TDbGridHack(TDBGrid(Sender)).RowHeights[0] <> 90 then
    TDbGridHack(TDBGrid(Sender)).DefaultRowHeight := 90;



Bem, agora funcionou perfeitamente cara, vlw pela dica!!

Abraços :wink:


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar