Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi viele shellicons in einem listview anzeigen (https://www.delphipraxis.net/12457-viele-shellicons-einem-listview-anzeigen.html)

edosoft 27. Nov 2003 20:07


viele shellicons in einem listview anzeigen
 
ich will bei einem suchscript die icons mit dem script von meinem letzten beitrag anzeigen. das klappt auch ganz gut, nur will ich diese in einem listview mit dem dateinamen anzeigen und so. wenn ich jetzt die icons in eine imagelist einfüge braucht das script sehr viel länger als wenn ich sie(zum testen) nur auf den bildschirm male. und das listview refresht bei jedem neu eingefügten icon. Wie kann ich die icons irgendwie anders speichern und in des listview einbinden?

MathiasSimmack 27. Nov 2003 21:19

Re: viele shellicons in einem listview anzeigen
 
BeginUpdate/EndUpdate mal ausprobieren. Damit blockierst du die Anzeige der LV, bis alle Objekte geladen sind. Vor dem Füllen der LV "BeginUpdate" aufrufen, wenn du alles drin hast, dann "EndUpdate". Und erst dann wird der Inhalt quasi angezeigt.

Ich kann nicht klagen. Ich habe eben mal die List-View-Demo aus den Win32-API-Tutorials ins Windows-Verzeichnis kopiert und gestartet. Die Demo liest ja alle Dateien im aktuellen Ordner ein und zeigt sie, samt Symbol, in der LV an. Hat nicht lange gedauert, und immerhin stecken in meinem 98er-Ordner ~280 Dateien.

neolithos 27. Nov 2003 21:41

Re: viele shellicons in einem listview anzeigen
 
Man braucht die Icon gar nicht in die Liste einfügen.

1. System-Image-List-Handle besorgen
Delphi-Quellcode:
var dwAttr : Cardinal;
    fInf : TSHFileInfo;
begin
  if alSmall then
     dwAttr := SHGFI_SMALLICON
  else
     dwAttr := SHGFI_LARGEICON;

  FillMemory(@fInf, SizeOf(fInf), 0);
  Result := SHGetFileInfo(PChar(GetWinDir), 0, fInf, SizeOf(fInf) ,
              SHGFI_SYSICONINDEX or dwAttr);
end;
2. Shared-Delphi-Image-List anlegen + Handle setzen
Delphi-Quellcode:
  if fSysImgLsts[alSmall] = nil then
     begin
       fSysImgLsts[alSmall] := TCustomImageList.Create(nil);
       with fSysImgLsts[alSmall] do
         begin
           ShareImages := true;
           Handle := ShlImgs.SysImgLst(alSmall);
         end;
     end;
  Result := fSysImgLsts[alSmall];
3. Image-Index besorgen
Code:
Siehe SHGetFileInfo
das ganz du aber selber versuchen, damit man auch was dabei lernt, einfach mal im internet suchen

edosoft 28. Nov 2003 12:21

Re: viele shellicons in einem listview anzeigen
 
und wie kann ich die icons den listview einträgen zuweisen?

bis jetzt hab ichs so:
ListView.Images:=ImageList;
ListViewItem.ImageIndex:=ImageList.AddIcon(GetIcon (...));

GetIcon ist eine selbergemachte Funktion die des Icon mit der funktion von Sakura ermittelt und als TIcon zurückgibt.

Beim Aufruf von ImageList.AddIcon() erhalte ich ja den Index des Icons als Rückgabe.

Wenn ich des aber so mache refresht sich das ganze ListView bei jedem ImageList-update und es geht mit der Zeit(wenn viele icons da sind) noch mal länger zum eins hinzufügen. Die suche soll aber schnell gehen!

BSP:
1 Suche ohne Icons-auslesen: 10 sek.
2 Suche mit Icons-auslesen und(zum test) mit canvas bloß auf den Bildschirm malen: 11 sek.
3 Suche mit Icons in des ImagelIst eintragen(ohne Listviewicons setzen): 30sek

es soll aber immer so schnell gehen wie in Punkt 2 weil da ja die icons auch schon ausgelesen werden-> des Imagelist verschwendet viel zu viel zeit!

MathiasSimmack 28. Nov 2003 12:29

Re: viele shellicons in einem listview anzeigen
 
Nicht verzagen, bei Luckie nachschlagen. Die List-View-Demo ist zwar nonVCL, aber das Prinzip ändert sich ja nicht. (Kapitel "Symbole, die Zweite" im oberen Drittel lesen!)

Du brauchst keine eigene Imageliste, du benutzt die aus dem System und holst dir bloß den Index des jeweiligen Symbols. Darum geht das auch im o.g. Beispiel ruck-zuck.

edosoft 28. Nov 2003 12:53

Re: viele shellicons in einem listview anzeigen
 
ok danke

edosoft 28. Nov 2003 16:50

Re: viele shellicons in einem listview anzeigen
 
Aus den API-Tutorials werd ich einfach nicht schlau.
Ich möchte die Icons in ein TListView einbinden.

Bis jatzt hab ich dieses Problem mit einer TImageList gelöst und den ListView-Items mit ImageIndex einen Bildindex zugewiesen. Aber wie ich oben schon geschrieben habe geht das zu langsam.

Gibt's da nicht irgendeine VCL-Variante mit der ich dieses Problem lösen kann?

Zitat:

BeginUpdate/EndUpdate mal ausprobieren. Damit blockierst du die Anzeige der LV, bis alle Objekte geladen sind. Vor dem Füllen der LV "BeginUpdate" aufrufen, wenn du alles drin hast, dann "EndUpdate". Und erst dann wird der Inhalt quasi angezeigt.

Ich kann nicht klagen. Ich habe eben mal die List-View-Demo aus den Win32-API-Tutorials ins Windows-Verzeichnis kopiert und gestartet. Die Demo liest ja alle Dateien im aktuellen Ordner ein und zeigt sie, samt Symbol, in der LV an. Hat nicht lange gedauert, und immerhin stecken in meinem 98er-Ordner ~280 Dateien.
1. Ich kann kein Begin/EndUpdate benutzen da die Einträge ja auch während dem Suchvorgang upgedatet werden sollen(siehe Windows Suche).

2. So schnell ist das API-ListView aber auch wieder nicht! Da ist zum Beispiel das VirtualListView Demo von Delphi bissle schneller(oder der ShellListView Komponent in D7).

MathiasSimmack 28. Nov 2003 17:34

Re: viele shellicons in einem listview anzeigen
 
Zitat:

Zitat von edosoft
1. Ich kann kein Begin/EndUpdate benutzen da die Einträge ja auch während dem Suchvorgang upgedatet werden sollen(siehe Windows Suche).

Verstehe ich jetzt nicht. Warum sollst du das nicht nutzen können?

Zitat:

2. So schnell ist das API-ListView aber auch wieder nicht! Da ist zum Beispiel das VirtualListView Demo von Delphi bissle schneller(oder der ShellListView Komponent in D7).
Und warum nimmst du dann nicht eine von beiden?

edosoft 28. Nov 2003 17:49

Re: viele shellicons in einem listview anzeigen
 
Weil ich
1. Die gefundenen Einträge ständig aktualisieren will und nicht erst wenn fertig gesucht ist und
2. Das API-Tool nicht blick und bis jetzt alles mit VCL soweit fertig hab

edosoft 29. Nov 2003 09:33

Re: viele shellicons in einem listview anzeigen
 
Wie kann ich dann die SystemImageList dem ListView zuweisen und den IconIndex rausfinden?


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz