Imagem no ListView
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
Muito obrigado a todos.
Pedro Leonardo
Pleonardomv
Curtidas 0
Respostas
Fórum Vini
13/10/2004
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:
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;
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;
GOSTEI 0
Pleonardomv
13/10/2004
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
GOSTEI 0
Fórum Vini
13/10/2004
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:
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;
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;
GOSTEI 0
Pleonardomv
13/10/2004
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
Mais uma vez obrigado pela ajuda
[]s
Pedro Leonardo
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
GOSTEI 0
Fórum Vini
13/10/2004
Tudo bem, tente assim:
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;
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;
GOSTEI 0
Pleonardomv
13/10/2004
Vinicius, está dando um erro aqui
T+
Pedro Leonardo
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
GOSTEI 0
Fórum Vini
13/10/2004
Esqueci de trocar o método: :oops:
ImageList1.AddIcon(Ico);
GOSTEI 0
Pleonardomv
13/10/2004
Agora só dá erro na linha
// Tipos incompativeis String e PAnsiChar
Mais uma vez obrigado
Ico.Handle:= ExtractIcon(hInstance, Arquivos[cont], Indices[cont]);
// Tipos incompativeis String e PAnsiChar
Mais uma vez obrigado
GOSTEI 0
Fórum Vini
13/10/2004
Que tanto de erro hein? Desculpa :roll:
Com esse eu acho que vai :P
Se não der, troque PChar por PAnsiChar
Ico.Handle:= ExtractIcon(hInstance, PChar(Arquivos[cont]), Indices[cont]);
Com esse eu acho que vai :P
Se não der, troque PChar por PAnsiChar
GOSTEI 0
Pleonardomv
13/10/2004
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
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
GOSTEI 0
Fórum Vini
13/10/2004
: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:
É 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:
GOSTEI 0
Fórum Vini
13/10/2004
E agora? Deu certo? :roll:
Se deu mais algum erro pode falar que eu te ajudo.. :wink:
Se deu mais algum erro pode falar que eu te ajudo.. :wink:
GOSTEI 0
Pleonardomv
13/10/2004
Olá Vinicius, fiz algumas alterações e deu certo. Segue o código q estou usando
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
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
GOSTEI 0
Fórum Vini
13/10/2004
[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:
E para calcular o índice do ícone de uma DLL você faz assim:
(Lembrando que não pude testar nenhum dos códigos, mas se não funcionar não deixe de avisar :wink: )
T+,
Vinicius;
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;
GOSTEI 0
Jeferson Machia
13/10/2004
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
GOSTEI 0