Como desenhar no canvas do dbgrid redimensionando a imagem?
Pessoal, tenho o codigo abaixo para desenha uma imagem no dbgrid:
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:
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
Curtidas 0
Respostas
Micheus
16/04/2007
Pessoal, tenho o codigo abaixo para desenha uma imagem no dbgrid:
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: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
Aloizio Castro
16/04/2007
Micheus, gerou o seguinte erro:
[color=darkblue:1fe1c1eaf8]onde:[/color:1fe1c1eaf8]
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:
[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:
GOSTEI 0
Micheus
16/04/2007
[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
[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
Aloizio Castro
16/04/2007
[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:
GOSTEI 0