Array
(
)

stringgrid personalizada

Fernando_ramos
   - 01 mar 2006

Amigos,

bom dia.

Utilizo o stringgri em meu sistema para mostrar dados cadastrados no meu banco de dados. Porém agora me deparei com a necessidade de criar um coluna no meu stringgrid que mostre uma IMAGEM.

Alguém poderia me ajudar nisso?


obrigado!


Fernando_ramos
   - 03 mar 2006

pessoal?

alguém!


Thiago Vidal
   - 03 mar 2006

uma alternativa que talvez possa funcionar para você, seria criar um TObjectList, que contém TODOS os bitmaps que precisam ser desenhados, a vantagem do ObjectList, é que ele já libera a memória (Free) de todos os objectos automaticamente quando é destruído.

segue um exemplo básico:
#Código

interface

uses ..., Contnrs;

type
TForm1 = class(TForm)
...
private
Imagens: TObjectList;
end;

...

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
Imagens := TObjectList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Imagens.Free;
end;

procedure TForm1.FormShow(Sender: TObject);
var
bmp: TBitmap;
begin
while not ClientDataSet1.Eof do
begin
// Durante a rotina que monta o seu StringGrid, adicione as imagens ao TObjectList
bmp := TBitmap.Create;
// bmp.LoadFromFile ou bmp.LoadFromStream
Imagens.Add(bmp);
ClientDataSet1.Next;
end;

end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
bmp: TBitmap;
begin
// Na coluna que vai desenhar os itens
if (ACol = 3) then
begin
// Pega o bitmap de volta da lista, com o typecast
bmp := TBitmap(Imagens[ARow-1]);
StringGrid1.Canvas.StretchDraw(Rect, bmp);
end;
end;


qualquer dúvida, estou à disposição.


Fernando_ramos
   - 04 mar 2006

amigo.

funcionou legal!

mas ja abusando de sua boa vontade, veja se pode me ajudar.

no caso a imagem ocupou toda a celula do stringgrid, no caso se eu quizesse apenas centralizar uma imagema na celula, seria possivel?

até por que ele esticou a imagem....fazendo com que ela perdesse a resolução!

obrigado!


Edilcimar
   - 04 mar 2006

neste caso basta diminuir a largura da coluna do stringgrid onde está a imagem


Fernando_ramos
   - 04 mar 2006

na verdade..a imagem assume o tamanho da celula....ou seja mesmo eu diminuindo a celula ela fica com o tamanho da celula, e suponhamos q eu nao possa diminuir a celula!! sacaram!!

bom....eu fiz o seguinte ajustei o tamanho da imagem pelo width e height, ficou legal...so que para ficar 100¬ eu queria alinha a imagem no centro.
pq atualmente ela esta no canto superior esquerdo!

se alguem puder ajudar!


Thiago Vidal
   - 08 mar 2006


Citação:
no caso a imagem ocupou toda a celula do stringgrid, no caso se eu quizesse apenas centralizar uma imagema na celula, seria possivel?


Basta trocar o StretchDraw, pelo Draw, e calcular as coordenadas para centralizar... exemplo:

#Código

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
bmp: TBitmap;
x, y: Integer;
begin
// Na coluna que vai desenhar os itens
if (ACol = 3) then
begin
// Pega o bitmap de volta da lista, com o typecast
bmp := TBitmap(Imagens[ARow-1]);
x := (Rect.Right - Rect.Left + bmp.Width) div 2;
y := (Rect.Bottom - Rect.Top + bmp.Height) div 2;
StringGrid1.Canvas.Draw(x, y, bmp);
end;
end;


desculpe pela demora... espero ter ajudado.


Fernando_ramos
   - 08 mar 2006

amigo.

com certeza ajudou.

porém , antes com o StretchDraw a imagem aparecia em todos os registros, agora a imagem aparece apenas uma vez!


Fernando_ramos
   - 08 mar 2006

amigo.

na verdade a impressão q da é q aparece sim..para todo registro..porém todas na mesma posição. dando a impressão de q so aparece uma vez!


Dpinho
   - 31 jul 2006

Estou utilizando a rotina acima, ficou como eu queria com o dbstringgrid, so falta eu ter a condição de colocar dois dbtext na celula, alguem sabe como fazer isto