Ir para conteúdo
Fórum Script Brasil
  • 0

Tgraphiccontrol, Timagelist


Thales Pontes Martins

Pergunta

Estou fazendo um componente derivado de TGraphicControl, e este componente tem que desenhar uma série de bitmaps pré definidos, então eu declarei uma var. do tipo TImageList na classe para comportar os bitmaps (porque já tem os métodos de DragDrop e tudo mais...). Só que eu queria saber como eu faço para carregar os bitmaps lá, tipo, eu quero criar uma lista já com os bitmaps carregados pra poder desenha-los. Alquem sabe como posso fazer isso? Eu acho que tem a ver com os arquivos .res, tipo se a unit do meu componente é "Comp.pas" tem um arquivo "Comp.res" que armazenaria os bitmaps, só que eu não sei como eu faço isso.

Obrigado.

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0
Só que eu queria saber como eu faço para carregar os bitmaps lá, tipo, eu quero criar uma lista já com os bitmaps carregados pra poder desenha-los.
Thales, se entendi direito, quando você criar seu componente (método Create) irá também inicilizar a lista neste momento e não em tempo de desenho como se faz normalmente com o TImageList. É isto?
Link para o comentário
Compartilhar em outros sites

  • 0

Poderia ser em tempo de design, porque os bitmaps da lista não irão mudar... Mas comé que eu vou acessar o object inspector de uma classe que eu declarei ali dentro da minha classe, eu teria que ter colocado ela em algum form como componente, não é?

Mas eu acho que já tenho a solução: O image editor que vem com o delphi 6 (não achei no 2006) tem um rescurso de criação de resource files... você coloca todos os bitmaps lá e cria o .res, depois você coloca na unit do componente {$RESOURCE Comp.res}, aí pra carregar o bitmap você usa

bitmap.handle:=loadbitmap(hinstance,strpcopy(@chararray,'nome do bitmap'));

onde chararray é do tipo: array[1..max] of char;

me diga se estou certo.

ou ainda é possivel colocar uma propriedade no componente do tipo tbitmap pra no tempo de design eu colocar o bitmap lá, a escolha do programador.

Qualquer outra sugestão, aprecio.

Link para o comentário
Compartilhar em outros sites

  • 0
você coloca todos os bitmaps lá e cria o .res, depois você coloca na unit do componente {$RESOURCE Comp.res}
Basta somente {$R Comp.res}

bitmap.handle:=loadbitmap(hinstance,strpcopy(@chararray,'nome do bitmap'));

onde chararray é do tipo: array[1..max] of char;

me diga se estou certo.

Correto!!

ou ainda é possivel colocar uma propriedade no componente do tipo tbitmap pra no tempo de design eu colocar o bitmap lá, a escolha do programador.
Neste caso você estaria falando de apenas uma imagem. Acredito que o seu interesse fosse conseguir acessar a lista de imagens do ImageList. Andei tentando pesquisar o fonte do TCustomImageList (ImgList.pas), para tentar achar uma referência ao Editor que é utilizado para adicionar-mos as figuras ao ImageList, mas não achei nada. Neste caso, se você não achar solução ou outro colega não auxiliar, acho que será o caso de criar seu próprio editor de propriedades para inclusão das imagens em tempo de desenho.

Sei que você não gosta muito dessa coisa de por o código do programa à um post, mas tentando achar um meio de lhe ajudar, criei um componente básico apenas com um create, destroy e paint. Notei que também haverá um problema relacionado ao tamanho do bitmap carregado. No exemplo de código abaixo, se for omitidas as mudanças de tamanho do bitmap lido, ocorrerá um erro referente ao tamanho do mesmo ser incompatível. Lembre-se que o editor do ListImage, permite que você decida de a imagem será Redimensionada, Centralizada ou Cortada, sempre de acordo com as dimensões configuradas na propriedade Width e Height do ListImage.

Após adiconar o componente no form, acontece um efeito "interessante": são desenhados retângulos brancos, mas quando o programa é executado a imagem é desenhada corretamente. :huh:

...
Implementation
{$R GCBitmaps.res}

constructor TGCBitmaps.Create(AOwner: TComponent);
  function InsertBitmapRes(BMPResName :string) :boolean;
  var
    BMP :TBitmap;
    CharArray: array[1..50] of char;
  begin
    Result := False;
    BMP := TBitmap.Create;
    try
      BMP.Handle := LoadBitmap(HInstance, StrPCopy(@CharArray, BMPResName));
      BMP.Width := FImageList.Width;
      BMP.Height := FImageList.Height;
      try
        Result := FImageList.Add(BMP, nil) = 0;
      except
        Raise Exception.Create('Erro tentando adicionar bmp');
      end;
    finally
      BMP.Free;
    end;
  end;
begin
  inherited;
  Width := 32;
  Height := 32;
  FImageList := TImageList.Create(Self);
  FImageList.Width := 32;
  FImageList.Height := 32;
  InsertBitmapRes('BITMAP1');
  InsertBitmapRes('BITMAP2');
end;

destructor TGCBitmaps.Destroy;
begin
  FImageList.Free;
  inherited;
end;

procedure TGCBitmaps.Paint;
var
  Image :TBitmap;
  YPos,
  Idx :Integer;
begin
  Inherited;
  Image := TBitmap.Create;
  try
    YPos := 0;
    for Idx := 0 to FImageList.Count -1 do
    begin
      FImageList.GetBitmap(Idx, Image);
      Canvas.Draw(0, YPos, Image);
      Inc(YPos, Image.Height +2);
    end;
  finally
    Image.Free;
  end;
end;

Link para o comentário
Compartilhar em outros sites

  • 0
Após adiconar o componente no form, acontece um efeito "interessante": são desenhados retângulos brancos, mas quando o programa é executado a imagem é desenhada corretamente.

Tem alguma coisa errada aí, num era pra aparecer retangulos brancos não.

acho que será o caso de criar seu próprio editor de propriedades para inclusão das imagens em tempo de desenho.

Eu não faço a menor idéia de como se cria um editor de propriedades, mas eu acho que se eu colocar uma propriedade do tipo tbitmap ele já abre um interfacezinha lá no object inspector pra eu escolher a imagem, não?

Neste caso você estaria falando de apenas uma imagem. Acredito que o seu interesse fosse conseguir acessar a lista de imagens do ImageList.

estava pensando em colocar todos os bitmaps numa imagem só e passar pra propriedade, depois eu uso:

Bitmap.canvas.copyrect(dest, bmp.canvas, source);

onde dest e source são os TRect's e bitmap é o que eu vou adicionar na lista e bmp é o que contém todos.

Só uma pergunta: eu to escrevendo o componente e debugando, aí eu instalo pra testar, aí se eu quiser mudar uma linhazinha e testar denovo eu vou precisar de instalar tudo denovo? Ou só mudando a unit já muda o componente instalado?

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...