stringgrid personalizada

01/03/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

Respostas

03/03/2006

Fernando_ramos

pessoal?

alguém!


Responder Citar

03/03/2006

Thiago Vidal

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:
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&93;);
    StringGrid1.Canvas.StretchDraw(Rect, bmp);
  end;
end;


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


Responder Citar

04/03/2006

Fernando_ramos

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!


Responder Citar

04/03/2006

Edilcimar

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


Responder Citar

04/03/2006

Fernando_ramos

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!


Responder Citar

08/03/2006

Thiago Vidal

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:

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&93;);
    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.


Responder Citar

08/03/2006

Fernando_ramos

amigo.

com certeza ajudou.

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


Responder Citar

08/03/2006

Fernando_ramos

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!


Responder Citar

31/07/2006

Dpinho

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


Responder Citar