Fórum Como desenhar no canvas do dbgrid redimensionando a imagem? #340450
16/04/2007
0
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
Curtir tópico
+ 0Posts
16/04/2007
Micheus
if Column.FieldName = ´BMP´ then begin TDBGrid(Sender).Canvas.Draw(Rect.Left,Rect.Top,bmp); end;
[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
Gostei + 0
17/04/2007
Aloizio Castro
[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:
Gostei + 0
19/04/2007
Micheus
[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
Gostei + 0
20/04/2007
Aloizio Castro
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;
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!
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:
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)