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

Listbox - Dúvidas Não Comuns


fajo

Pergunta

Estou aprimorando um programa de Mensagens pela rede interna e preciso tirar algunas dúvidas; quando o programa é executado ele já detecta em outros computadores da rede que tem o programa rodando e ai já coloca o nome do pc no listbox, cujo procedimento é:

procedure Tform.MessageUserListChange(Sender: TObject; UserList: TStrings); 
var i: string; 
begin 
Listbox1.Items := UserList; //captura todos os usuários onLine 
end;

as dúvidas são:

1. Como colocar uma imagem antes de cada item;

2. É possível aumentar o espaço entre os itens;

Obrigado

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

opa

o que você quer fazer é tipo o que o MSN faz,

ou qualquer outro programa de bate papo,

uma lista dos usuários com possíveis informações

adicionais, como foto e tal...

Bom na verdade acho que você não vai conseguir fazer

isso com um Listbox, não do jeito que você quer, você

teria que fazer um componente com essas possibilidades,

onde você pode derivá-lo de um outro componente, tipo

TCustomListBox...

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
...

Bom na verdade acho que você não vai conseguir fazer

isso com um Listbox, não do jeito que você quer, você

teria que fazer um componente com essas possibilidades,

onde você pode derivá-lo de um outro componente, tipo

TCustomListBox...

Churc, permita-me um parênteses: é possível sim.

O componente TListBox tem a propriedade Style que através das opções lbOwnerDrawFixed e lbOwnerDrawVariable, esta última associada ao evento OnMeasureItem, viabilizam a customização da lista via evento OnDrawItem.

...

as dúvidas são:

1. Como colocar uma imagem antes de cada item;

2. É possível aumentar o espaço entre os itens;

fajo, tendo em vista a aplicação que você faz, vou exemplificar para o caso mais simples que é: altura fixa dos itens da lista.

Como você não mensionou, vou supor que você utilizará uma lista de imagens (TImageList), seria a opção mais abrangente.

Aparentemente sua lista de usuários, conterá apenas o nome dos mesmos. Vou supor uma condição em que o ícone apresentado será adequado a uma determinada opção (tipo on-line, off-line, ...). Há várias formas de associar esta informação ao item da lista, eu vou optar por guardá-la na lista Objects da propriedade Items do TListBox. O importante não é onde estará guardada, mas sim como utilizá-la.

É importante que suas imagens tenham o mesmo tamanho, preferencialmente com a altura desejada para o item da lista, para que sejam mantidas as proprorções/aspectos. Esta informação será utilizada na definição das propriedades Height e Width do TImageList e posteriormente no desenho do TListBox.

1) No seu form, selecione a TListBox e defina a propriedade Style para lbOwnerDrawFixed;

2) Adicionei ao TImageList 3 imagens, com a cor de fundo clOlive; No processo de adição de cada imagem a lista, alterei Transparent Color para clNone (detectado como clOlive) e em Options defini Center. Tive que fazer isso para conseguir desenhar as imagens com transparência.

3) No evento OnCreate do form, atribuimos a altura da imagem +2 para a altura da linha (o dois é para as bordas):

ListBox1.ItemHeight := ImageList1.Height +2;

4) No evento OnDrawItem colocamos o seguinte código:

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
const
  IconMargin  = 4;
  TextMargin  = 6;
var
  OffSetY :Integer;
  StatusIcon :TBitmap;
begin
 // Pinta o fundo do retângulo
  (Control as TListBox).Canvas.FillRect(Rect);
 // Para centralizar o texto na altura, iremos calcular aqui em que posição (Y)
 // deverá ser desenhado o texto
  OffSetY := ((Rect.Bottom -Rect.Top) -(Control as TListBox).Canvas.TextHeight('A')) div 2;
 // Para as próximas etapas, desenharemos apenas dentro do retângulo,
 // não interferindo nas suas bordas
  Inc(Rect.Left, 1 +IconMargin);  // também ajustamos o início do icone
  Inc(Rect.Top, 1);
  Dec(Rect.Bottom, 1);
  Dec(Rect.Right, 1);
 // Alocamos um bitmap para obter uma figura referente ao status da lista de imagens
  StatusIcon := TBitmap.Create;
  try
   // obtemos o bitmap da lista, referente ao status armazenado no item de Objects
   // a conversão ser faz necessária porque Objects armazena ponteiros
    if ImageList1.GetBitmap((LongInt((Control as TListBox).Items.Objects[Index])), StatusIcon) then
     // Utilizando a função BrushCopy, pintamos o bitmap na definida por Rect.
     // A função fará um stretch da imagem se utilizar outro tamanho que não o da imagem
      (Control as TListBox).Canvas.BrushCopy(Classes.Rect(Rect.Left, Rect.Top, Rect.Left +ImageList1.Width, Rect.Top +ImageList1.Height),
                                             StatusIcon,  // imagem
                                             Classes.Rect(0, 0, ImageList1.Width -1, ImageList1.Height -1),   // área da imagem a copiar
                                             StatusIcon.Canvas.Pixels[0, 0]);  // cor de fundo (usamos o pixel superior-esquerdo
  finally
 // liberamos o bitmap alocado
    StatusIcon.Free;
  end;
 // Para desenhar o texto após o icone, devemos avançar o início do retângulo para
 // além da largura da imagem + a margem desejada
  Inc(Rect.Left, ImageList1.Width +TextMargin);
  (Control as TListBox).Canvas.TextRect(Rect,  // área onde será desenhado o texto
                                        Rect.Left,  // início na posição X
                                        Rect.Top +OffSetY,  // início na posição Y
                                        (Control as TListBox).Items[Index]);
end;

Obs.: Devido ao conflito entre o nome da função e do parâmetro, temos que indicar a que rect nos referimos, logo apontamos a unit Classes aonde a função se encontra.

O demo para download está aqui(aguardar uns segundos até opção de download aparecer). Há n variações possíveis, dependendo do que você utilizar, então, qualquer dúvida é só perguntar.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Guest Visitante

Micheus, obrigado pela resposta, ainda não tive tempo de testar, pois estou no trabalho, só na parte da tarde poderei testá-lo, mas, parece que não tem erro! aproveitando, tem como anexar um arquivo a mensagem enviada? Conhece algum componente, eu estou trabalhando com o TMessenger, não sei se ele faz isso!!

Obrigado

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

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