Fórum Imagem no ListView #254333

13/10/2004

0

Olá lista. Algum colega sabe me informar se existe a possibilidade de carregar uma imagem em um ListView que não seja de um ImageList? Tipo de uma DLL ou solta em algum diretorio?
Muito obrigado a todos.

Pedro Leonardo


Pleonardomv

Pleonardomv

Responder

Posts

13/10/2004

Fórum Vini

Olá,
não entendi bem, se você quiser carregar uma imagem dinamicamente( de um arquivo, ou DLL ) em um ListView, pode usar esse código:
var
  Bmp: TBitmap;
begin
  Bmp:= TBitmap.Create;
  Bmp.LoadFromFile("C:\MeuArquivo.bmp");
  ImageList1.Add( Bmp, nil );
  Bmp.Free;
end;

Lembrando que os itens já devem estar associados aos índices do ImageList e que a altura e largura do C:\MeuArquivo.bmp devem corresponder ao Width e Height do ImageList..

Agora se o que você quer é desenhar uma imagem no ListView independentemente do seu item( no fundo, por exemplo ), me fale que eu posto um exemplo de como usar ListViews owner draws...

Espero ter ajudado,
Vinicius;


Responder

Gostei + 0

13/10/2004

Pleonardomv

vou explicar: Meu Listview lista vários arquivos que estão em pastas diferentes. Eu preciso carregar os icones das respectivas pastas e mostrar no Listview, então pensei em buscar dentro de uma Dll por exemplo, mas estou apanhando igual sego em tiroteio e preciso muito disto. Se vc me ajudar ficarei ETERNAMENTE grato. hahahahaha


Responder

Gostei + 0

13/10/2004

Fórum Vini

Hum.. agora entendi..
Eu, particularmente, prefiro não mexer com DLLs, mas se você quiser eu te passo o exemplo usando-as..
Pode tentar usar um código mais ou menos assim:
const
  Arquivos: array of String =  //Não me lembro se é obrigatório colocar os limites, se der erro aqui, coloque array[0..1] of String
(´C:\MeuArquivo.bmp´,
 ´C:\MeuIcone2.bmp´);
var
  cont: Integer;
  Bmp: TBitmap;
begin
  for cont:= 0 to High(Arquivos) do //Se não der certo com High, me avise
  begin
    Bmp:= TBitmap.Create;
    Bmp.LoadFromFile( Arquivos[cont] );
    ImageList1.Add(Bmp, nil);
    Bmp.Free;
  end;
end;

Lembrando novamente que o Width e Height dos arquivos devem ser os mesmos do Width e Height do ImageList e que os itens do ListView já devem estar associados aos indices do ImageList( O item 0 do ListView vai conter a imagem 0 do ImageList e assim sucessivamente.. mas você tem que preencher os valores )
Se este código não funcionar, me fala que eu dou uma testada aqui.. agora estou sem Delphi..

T+,
Vinicius;


Responder

Gostei + 0

14/10/2004

Pleonardomv

Vinicius obrigado por me ajudar, esse código funcionou, tive apenas que colocar os limites [0..1], mas prefiro que vc me dê um força p/ usar Dll. Vou explicar melhor.
Minha Listview recebe uma pasta contendo vários atalhos para outras pastas. Eu quero que os icones sejam os mesmos dos atalhos sacou? Os atalhos usam os icones de várias Dlls. Quando eu carregar eu faria +/- assim
ICONFILE=C:\WINDOWS\SYSTEM\SHELL32.dll // a Dll com os icones
ICONINDEX=50 // o numero do icone dentro da Dll


Mais uma vez obrigado pela ajuda
[]s
Pedro Leonardo


Responder

Gostei + 0

14/10/2004

Fórum Vini

Tudo bem, tente assim:
const
  Arquivos: array[0..1] of String =  
(´C:\Windows\Moricons.dll´,
´C:\Windows\Shell32.dll´);
  Indices: array[0..1] of Integer = (2, 0)
var
  cont: Integer;
  Ico: TIcon;
begin
  for cont:= 0 to High(Arquivos) do //Se não der certo com High, me avise
  begin
    Ico:= TIcon.Create;
    Ico.Handle:= ExtractIcon(hInstance, Arquivos[cont], Indices[cont]);
    ImageList1.Add(Ico, nil);
    Ico.Free;
  end;
end;

Não se esqueça de colocar a ShellAPI no seu Uses, para a função ExtractFileIcon funcionar... Novamente, não deu pra mim testar o código, se der erro me avise :wink:

Espero ter ajudado,
Vinicius;


Responder

Gostei + 0

14/10/2004

Pleonardomv

Vinicius, está dando um erro aqui
 Ico.Handle:= ExtractIcon(hInstance, Arquivos[cont], Indices[cont]); // Tipos incompativeis String e PAnsiChar 
    ImageList1.Add(Ico, nil); // Tipos incompativeis TBitmap e Ticon


T+
Pedro Leonardo


Responder

Gostei + 0

14/10/2004

Fórum Vini

Esqueci de trocar o método: :oops:
ImageList1.AddIcon(Ico); 



Responder

Gostei + 0

14/10/2004

Pleonardomv

Agora só dá erro na linha
Ico.Handle:= ExtractIcon(hInstance, Arquivos[cont], Indices[cont]);

// Tipos incompativeis String e PAnsiChar

Mais uma vez obrigado


Responder

Gostei + 0

14/10/2004

Fórum Vini

Que tanto de erro hein? Desculpa :roll:
Ico.Handle:= ExtractIcon(hInstance, PChar(Arquivos[cont]), Indices[cont]);

Com esse eu acho que vai :P
Se não der, troque PChar por PAnsiChar


Responder

Gostei + 0

14/10/2004

Pleonardomv

Vinicius estamos quase lá hihihihi.
Agora funcionou mas só carrega o 1° icone da dll. Já fiz algumas mudanças no for cont:= 0 to High(Arquivos) mas não deu certo. Será pq?

Desculpa + 1 x

[]s


Responder

Gostei + 0

14/10/2004

Fórum Vini

:P
É a pasta do Shell32.dll que está errada, o valor certo é C:\Windows\System\Shell32.dll
O índice do ícone pode ser trocado no array índices..:wink:


Responder

Gostei + 0

15/10/2004

Fórum Vini

E agora? Deu certo? :roll:
Se deu mais algum erro pode falar que eu te ajudo.. :wink:


Responder

Gostei + 0

15/10/2004

Pleonardomv

Olá Vinicius, fiz algumas alterações e deu certo. Segue o código q estou usando
procedure TFrmPrincipal.CarregaIconesdaDllClick(Sender: TObject);
const
  Dll = C:\Windows\System\Shell32.dll; 
var
  NumIcons : Integer;
  Icon : TIcon;
  i : Integer;
begin
  Icon := TIcon.Create;
  try
//  Chama ExtractIcon com o último parâmetro = -1
//  para extrair o número de ícones
    NumIcons := ExtractIcon(HInstance,Dll,Cardinal(-1));
    for i := 0 to NumIcons-1 do begin
      Icon.Handle := ExtractIcon(HInstance, Dll, i); 
      ImageList1.AddIcon(Icon);      
    end;
  finally
    Icon.Free;
  end;
end;

Gostaria de saber se eu posso usar mais de uma ImageList.
Por exemplo carregar mais de uma Dll e usar sacou?
Muito obrigado pela ajuda, sem vc eu não teria conseguido
[]s
Pedro Leonardo


Responder

Gostei + 0

15/10/2004

Fórum Vini

[quote:8bfbdd14e5=´Pedro Leonardo M. Vieira´]Gostaria de saber se eu posso usar mais de uma ImageList.[/quote:8bfbdd14e5]
Poder, pode, mas você não pode usar mais um uma ImageList para o mesmo ListView( na verdade pode, mas elas nunca vão ser mostradas ao mesmo tempo, tipo, uma para icones grandes e outra para ícones pequenos )..
Então acho que você vai ter que continuar com um ImageList só, adaptando a sua função dessa maneira: Passe a constante DLL para um array de String, crie outro array( mas não constante ) de Integer, que irá armazenar o número de ícones de cada DLL..
No código, você faz algo assim:
...
  cont: Integer;
begin
  Icon := TIcon.Create;
  try
    for cont:= 0 to High(DLL) do begin
      //  Chama ExtractIcon com o último parâmetro = -1
      //  para extrair o número de ícones
      NumIcons[cont] := ExtractIcon(HInstance,Dll[cont],Cardinal(-1));
      for i := 0 to NumIcons[cont]-1 do begin
        Icon.Handle := ExtractIcon(HInstance, Dll[cont], i);
        ImageList1.AddIcon(Icon);     
      end;
    end;
  finally
    Icon.Free;
  end;
end;

E para calcular o índice do ícone de uma DLL você faz assim:
function GetIndiceIcone(const Indice, iDLL: Integer): Integer;
var
  cont: Integer;
begin
  for cont:= 0 to iDLL do
    Result:= Result + NumIcons[cont];
  Result:= Result + Indice;
end;

(Lembrando que não pude testar nenhum dos códigos, mas se não funcionar não deixe de avisar :wink: )

T+,
Vinicius;


Responder

Gostei + 0

30/09/2015

Jeferson Machia

Pessoal como estou vendo que vocês manjam bastante tanto da listview estou com uma dificuldade muito grande aqui e gostaria muito da ajuda de vocês, já estou me descabelando a dias para montar um aplicativo. Bom vamos lá, tenho um banco de dados mysql onde guarda o nome da imagem e um servidor onde ficam guardada as imagens, bom preciso o seguinte, que quando abrir o aplicativo essas imagens apareçam em lista uma embaixo da outra, dessa forma dando um loop no banco de dados e pegando o nome de todas as imagens que tem lá e exibindo na tela, eu cheguei a fazer com o Timage mas o mesmo eu não consegui fazer repetir, agora pelo que andei vendo a listview seria uma saida mais simples para o que eu preciso, porem como estou pegando essas imagens de um site vou precisar carregar a imagem com o idhttp e fazer o loop para ir mostrando na tela, alguém poderia me dar uma força, pessoal nem que seja uma dica ou algo assim, não estou pedindo nada mastigado não, é que nem sei o que estudar para tentar fazer funcionar, fico no aguardo de alguma juda... Por Favor. Desde já agradeço... Obrigado
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar