AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi viele shellicons in einem listview anzeigen
Thema durchsuchen
Ansicht
Themen-Optionen

viele shellicons in einem listview anzeigen

Ein Thema von edosoft · begonnen am 27. Nov 2003 · letzter Beitrag vom 29. Nov 2003
Antwort Antwort
Benutzerbild von edosoft
edosoft

Registriert seit: 27. Okt 2003
Ort: Wehingen
258 Beiträge
 
Turbo Delphi für Win32
 
#1

viele shellicons in einem listview anzeigen

  Alt 27. Nov 2003, 21:07
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?
Dominik Weber
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#2

Re: viele shellicons in einem listview anzeigen

  Alt 27. Nov 2003, 22:19
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.
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#3

Re: viele shellicons in einem listview anzeigen

  Alt 27. Nov 2003, 22:41
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
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von edosoft
edosoft

Registriert seit: 27. Okt 2003
Ort: Wehingen
258 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: viele shellicons in einem listview anzeigen

  Alt 28. Nov 2003, 13:21
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!
Dominik Weber
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#5

Re: viele shellicons in einem listview anzeigen

  Alt 28. Nov 2003, 13:29
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.
  Mit Zitat antworten Zitat
Benutzerbild von edosoft
edosoft

Registriert seit: 27. Okt 2003
Ort: Wehingen
258 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: viele shellicons in einem listview anzeigen

  Alt 28. Nov 2003, 13:53
ok danke
Dominik Weber
  Mit Zitat antworten Zitat
Benutzerbild von edosoft
edosoft

Registriert seit: 27. Okt 2003
Ort: Wehingen
258 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: viele shellicons in einem listview anzeigen

  Alt 28. Nov 2003, 17:50
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).
Dominik Weber
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#8

Re: viele shellicons in einem listview anzeigen

  Alt 28. Nov 2003, 18:34
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?
  Mit Zitat antworten Zitat
Benutzerbild von edosoft
edosoft

Registriert seit: 27. Okt 2003
Ort: Wehingen
258 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: viele shellicons in einem listview anzeigen

  Alt 28. Nov 2003, 18:49
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
Dominik Weber
  Mit Zitat antworten Zitat
Benutzerbild von edosoft
edosoft

Registriert seit: 27. Okt 2003
Ort: Wehingen
258 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: viele shellicons in einem listview anzeigen

  Alt 29. Nov 2003, 10:33
Wie kann ich dann die SystemImageList dem ListView zuweisen und den IconIndex rausfinden?
Dominik Weber
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:15 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