Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Systemicons und Listview (https://www.delphipraxis.net/21893-systemicons-und-listview.html)

Lamy 9. Mai 2004 16:15


Systemicons und Listview
 
Hi!

Mal wieder ne Frage meinerseits [wie könnts nur ander sein :mrgreen:]

Ich möchte zu meinen Dateien die in einer Listview angezeigt werden, die dzgh. Icons auflisten lassen.

http://www.swissdelphicenter.ch/de/showcode.php?id=421

Wenn ich das aber so übernehme wie das oben im Tut geschrieben steht, führt der immer nur ein einziges Icon auf und fügt es jedem einzelnen Eintrag hinzu.

Warum?
Muss man einen anderen Pfad bei WindowsXp angeben damit das funzt?

alcaeus 9. Mai 2004 16:19

Re: Systemicons und Listview
 
Ich weiß nicht welchen Pfad du meinst, du suchst ja immer nur nach Dateien, zu denen du die Icons hinzufügen willst. Hast du den Code per Copy&Waste übernommen? So wie der aussieht müsste er funktionieren.

Lamy 9. Mai 2004 16:23

Re: Systemicons und Listview
 
Jo, habsch 8) [siehe Ahpha *räusper*]

Luckie 9. Mai 2004 16:28

Re: Systemicons und Listview
 
Dir ist klar: Listbox <> Listview?

Lamy 9. Mai 2004 16:30

Re: Systemicons und Listview
 
?

Sollte doch auch auf eine Listview anzuwenden sein oder nicht?

alcaeus 9. Mai 2004 16:31

Re: Systemicons und Listview
 
nicht auch, sondern nur
Listbox kann nicht vsIcon, vsReport und diese Sachen.

Lamy 9. Mai 2004 16:32

Re: Systemicons und Listview
 
Ach so, sorry, ich meine natürlich Listview, nicht Listbox, Schreibfehler [korrigiert]!!!
:wall:

MathiasSimmack 9. Mai 2004 17:10

Re: Systemicons und Listview
 
Nichts gegen die Schweizer, aber das Beispiel scheint mir ein wenig ... äh ... na, sagen wir: wenig ressourcen-schonend. Die Systemicons werden von Windows durch eine spezielle System-Imageliste zur Verfügung gestellt, an die man rankommen kann.

Das momentane Problem scheint mir zu sein, dass für jede gefundene Datei das Icon ermittelt und in die eigene Imageliste eingetragen wird. Ich habe den Code jetzt nicht 100% analysiert, aber gäbe es bspw. zwei BAT-Dateien, dann würde die Imageliste 2x das gleiche Symbol enthalten.

Ich denke, da kommt man günstiger weg, wenn man besagte System-Imageliste holt und dann nur noch den Index für das jeweilige Icon ermittelt und zuweist. Wie das geht, zeigt u.a. der List-View-Beitrag in den viel gerühmten Win32-API-Tutorials.

Das Wissen lässt sich IMHO auch problemlos auf die VCL übertragen. ;)

Lamy 9. Mai 2004 17:28

Re: Systemicons und Listview
 
öhm...

Da stehen bestimmt viele interessante Sachen drin aber ich hab erstmal Schwierigkeiten durch die Grundlagen durchzusteigen...


Gibts da nicht was einfacheres=

MathiasSimmack 9. Mai 2004 17:55

Re: Systemicons und Listview
 
Na ja, evtl. sehe ich das mehr aus dem Blickwinkel des etwas fortgeschritteneren Anwenders. Ich persönlich finde es nicht allzu schwer.

1. Also, du pappst 2 Imagelisten auf deine Form, lässt sie aber komplett leer. Eine nennst du "ilSmall", die andere "ilBig". Und enorm wichtig!: Stell bei beiden im Objektinspektor die Eigenschaft "ShareImages" auf TRUE.

2. Im "OnCreate"-Ereignis deiner Form machst du folgendes:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  hImgSm,
  hImgBig : HIMAGELIST;
  fi     : TSHFileInfo;
begin
  // Imageliste mit kleinen Symbolen ermitteln
  hImgSm := HIMAGELIST(SHGetFileInfo('',0,fi,sizeof(fi),
    SHGFI_SYSICONINDEX or SHGFI_SMALLICON));
  // und an die Imageliste auf der Form übergeben
  if(hImgSm <> 0) then
    ilSmall.Handle := hImgSm;

  // Imageliste mit großen Symbolen ermitteln
  hImgBig := HIMAGELIST(SHGetFileInfo('',0,fi,sizeof(fi),
    SHGFI_SYSICONINDEX or SHGFI_ICON));
  // und an die Imageliste auf der Form übergeben
  if(hImgBig <> 0) then
    ilBig.Handle := hImgBig;
end;
3. Jetzt kannst du die Dateien auslesen und mit ihrem Symbol anzeigen lassen. Ich habe das auf die Schnelle via Button-Klick und nicht rekursiv machen lassen. Aber es geht ja auch nur um´s Prinzip:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  ds : TSearchRec;
  res : integer;
  li : TListItem;
  fi : TSHFileInfo;
begin
  res := FindFirst('c:\*.*',faAnyFile,ds);
  while(res = 0) do
  begin
    if(ds.Attr and faDirectory = 0) and
      (ds.Name <> '.') and
      (ds.Name <> '..') then
    begin
      // Name der Datei eintragen
      li := Listview1.Items.Add;
      li.Caption := ds.Name;

      // jetzt Zugriff auf die System-Imageliste
      // und nur den Typennamen und das Symbol
      // ermitteln!
      ZeroMemory(@fi,sizeof(fi));
      SHGetFileInfo(pchar('c:\' + ds.Name),0,fi,sizeof(fi),
        SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_TYPENAME);

      // Icon-Index zuweisen, ...
      li.ImageIndex := fi.iIcon;
      // "iIcon" ist eine Integer-Variable und erhält somit
      // wirklich nur den Index auf das Symbol, aber nicht
      // das Symbol als solches. Daher ist es nun egal, wie
      // oft ein Dateityp im Ordner vorkommt.


      // ... & Typennamen als Untereintrag hinzufügen
      li.SubItems.Add(fi.szTypeName);
    end;

    res := FindNext(ds);
  end;
  FindClose(ds);
end;
Fertig. ;)


PS: Wird zwar auch in den Tutorials erwähnt, aber der Vollständigkeit halber: Gib die Imagelisten auf der Form bitte NICHT frei!. Sonst sind evtl. deine Symbole im Explorer weg. :mrgreen: Ein Neustart behebt das Problem. Allerdings dürfen die Imagelisten in dem Fall eben nicht freigegeben werden. Sie werden ja auch nicht in deinem Programm erzeugt sondern vom System zur Verfügung gestellt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:09 Uhr.
Seite 1 von 4  1 23     Letzte »    

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