AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Icons aus Shell32.dll

Ein Thema von Tpercon · begonnen am 12. Jul 2002 · letzter Beitrag vom 22. Aug 2004
Antwort Antwort
Seite 2 von 3     12 3   
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#11
  Alt 13. Jul 2002, 14:53
Moin Mathias,

meinst Du jetzt die Smallicons?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#12
  Alt 13. Jul 2002, 15:51
@Chris: Nö.

@Tpercon: Wenn du unter dem Imageindex 48 bleibst, dann kannst du die Icons getrost verwenden. Soweit ich das gesehen habe, sind diese identisch. Insofern dürfte es bei dir (Laufwerks-Icons) keine Probleme geben.

Generell wäre aber sicher sakuras Beitrag interessant, weil diese Variante unabhängig von eigenen Zugriffen auf die "shell32.dll" ist. Ich habe mir mal die Freiheit genommen, den für dich wahrscheinlich wichtigen Teil zu extrahieren. sakura wird hoffentlich nicht schimpfen.

Folgendes (gebasteltes ) Beispiel liest die vorhandenen Laufwerke mit den korrekten Icons in eine ListView ein. Die Routinen "DriveExists" und "DriveType" stehen in der DP-Library und sind -natürlich!- auch von sakura:

Code:
procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
  FileInfo: TSHFileInfo;
  ImageListHandle: THandle;
  aIcon: TIcon;
begin
  for i := 0 to 25 do
    if(DriveExists(i)) then
      begin
        fillchar(FileInfo,sizeof(FileInfo),#0);
          ImageListHandle := SHGetFileInfo(pchar(CHR(i+65) + ':\'),
          0, FileInfo, sizeof(FileInfo), SHGFI_ICON or SHGFI_LARGEICON);

        try
          aIcon := TIcon.Create;
          try
            aIcon.Handle := FileInfo.hIcon;

            ListView1.Items.Add;
            ListView1.Items[ListView1.Items.Count-1].Caption   :=
              CHR(i+65) + ':\  (' + DriveType(i) + ')';
            ListView1.Items[ListView1.Items.Count-1].ImageIndex :=
              ImageList1.AddIcon(aIcon);
          finally
            FreeAndNil(aIcon);
          end;
        finally
          DestroyIcon(FileInfo.hIcon);
          ImageList_Destroy(ImageListHandle);
        end;
      end;
end;
Codebasis, Copyright by Sakura.
(Das nur, damit er mich nicht auf 10 Mio US-Dollar verklagt. )

<Edit>

"ShellAPI" und "CommCtrl" (für ImageList_Destroy) nicht vergessen! Außerdem sollte die Imageliste natürlich die Maße 32x32 besitzen. Andernfalls kann man aber auch das Flag SHGFI_SMALLICON benutzen.

Hatte ich doch glatt vergessen zu erwähnen.

</Edit>


Gruß,
Mathias.
  Mit Zitat antworten Zitat
Tpercon

Registriert seit: 7. Jun 2002
638 Beiträge
 
Delphi 5 Professional
 
#13
  Alt 14. Jul 2002, 11:56
OK, funktionieren tut es wunderbar, nur es ist zu langsam.
Ob es was bringt wenn man überprüft ob ein Icon schon in der ImageList ist oder nicht und dann entsprechend das Icon nicht noch einmal bzw. doch einfügt. Oder woher kann dieser Geschwindigkeitsverlust sonst kommen?
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#14
  Alt 14. Jul 2002, 12:27
Zitat von Tpercon:
Ob es was bringt wenn man überprüft ob ein Icon schon in der ImageList ist oder nicht ...
Also, ich bin kein Vulkanier, aber streng logisch gesehen würde ich auf Nein tippen, denn wenn du erst eine Bedingung prüfen musst, geht ja auch ein bisschen Zeit drauf.

Ich gehe mal davon aus, dass du die Icons nicht ständig neu einliest. Wenn du das nur einmal beim Start machst, dann bietet sich doch ein Splashscreen mit einem Progressbar an. Dann weiß der User, dass er einen Moment Geduld haben muss.
  Mit Zitat antworten Zitat
Tpercon

Registriert seit: 7. Jun 2002
638 Beiträge
 
Delphi 5 Professional
 
#15
  Alt 14. Jul 2002, 13:13
Die Laufwerksymbole lade ich natürlich nur beim Start.
Aber die Dateisymbole lade ich ständig neu. Wie denn sonst? Oder sollte ich sämtliche Dateisymbole auf dem System beim Start laden, die Position und die Extension mir in einem Array speichern um sie später zuordnen zu können?

Gruß
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#16
  Alt 14. Jul 2002, 14:12
Was programmierst du eigentlich?
Oder anders: Warum musst du die Dateisymbole ständig neu laden?

Ich glaube, bei Delphi6 gibt´s eine spezielle Listview, die dir die Ordner inkl. Symbolen usw. anzeigt. Damit würdest du sicher besser wegkommen, wenn du eine Datei- und Ordnerstruktur in deinen Programmen brauchst.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#17
  Alt 14. Jul 2002, 14:35
Moin Tpercon,

ich hab' jetzt nich ausprobiert, wie sich das auf die Geschwindigkeit auswirkt, aber Du könntest bei den Dateiicons ja mal versuchen, Dir eine TStringsList mit den schon eingelesenen Extensions aufzubauen, (Sorted=true, Duplicates=dupIgnore), und die Extensions dann mittels AddObject hinzufügen, wobei Du als Objekt jeweils das Icon(Handle) hinzufügst, dass über ExtractAssociatedIcon ausgelesen wird. Dann liessen sich bereits bekannte Icons aus der Liste wohl relativ schnell auslesen lassen.
Oder Du benutzt eine ImageList, der die jeweils neuen Icons hinzugefügt werden, und fügst als Objekt einfach nur die Nummer des Icons in der ImageList hinzu. (auslesen wie vorher).
Damit könntest Du Dir die Verwaltung (Create/Free) der angehängten Iconobjekte sparen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#18
  Alt 14. Jul 2002, 14:46
Zitat von MathiasSimmack:
Ich glaube, bei Delphi6 gibt´s eine spezielle Listview, die dir die Ordner inkl. Symbolen usw. anzeigt.
Hi,

das macht doch die TreeView!? Aber bei der ListView kann man ja auch eigene Symbole benutzen. Er hat D5Ent. Ich weiss nicht ob TreeView da schon dabei ist.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#19
  Alt 14. Jul 2002, 14:56
Moin Daniel B,

der TreeView als solcher ist schon enthalten, nur nicht der ShellTreeView, den Mathias wohl meinte.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Tpercon

Registriert seit: 7. Jun 2002
638 Beiträge
 
Delphi 5 Professional
 
#20
  Alt 14. Jul 2002, 16:15
Die ShellTreeView Komponente zeigt wohl automatisch schon die Icons der Dateien/ Ordner und Laufwerke an?

Aber ich möchte trotzdem die Dateien lieber in der ListView lassen und nur die Ordner/ Laufwerkauswahl über die TreeView machen.

Wie kann man denn herausfinden, ob ein Icon schon in der ImageList ist oder nicht, ohne ne zusätzliche Liste zu benutzen?! Geht das?
Momentan durchsuche ich nämlich die ListView nach der Extension und entscheide so, ob ich das Icon neu hinzufügen muß oder den Index benutzen kann und diese Methode ist schon etwas schneller als zuvor!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:58 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