Fórum Imagem no ListView #254333
13/10/2004
0
Muito obrigado a todos.
Pedro Leonardo
Pleonardomv
Curtir tópico
+ 0Posts
13/10/2004
Fórum Vini
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
13/10/2004
Pleonardomv
Gostei + 0
13/10/2004
Fórum Vini
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
14/10/2004
Pleonardomv
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
14/10/2004
Fórum Vini
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
14/10/2004
Pleonardomv
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
14/10/2004
Fórum Vini
ImageList1.AddIcon(Ico);
Gostei + 0
14/10/2004
Pleonardomv
Ico.Handle:= ExtractIcon(hInstance, Arquivos[cont], Indices[cont]);
// Tipos incompativeis String e PAnsiChar
Mais uma vez obrigado
Gostei + 0
14/10/2004
Fórum Vini
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
14/10/2004
Pleonardomv
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
14/10/2004
Fórum Vini
É 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
15/10/2004
Fórum Vini
Se deu mais algum erro pode falar que eu te ajudo.. :wink:
Gostei + 0
15/10/2004
Pleonardomv
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
15/10/2004
Fórum Vini
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
30/09/2015
Jeferson Machia
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)