AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Systemicons und Listview

Ein Thema von Lamy · begonnen am 9. Mai 2004 · letzter Beitrag vom 5. Jun 2004
Antwort Antwort
Seite 3 von 4     123 4      
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#21

Re: Systemicons und Listview

  Alt 28. Mai 2004, 15:49
Moin Mathias,

Zitat von MathiasSimmack:
"ShGetFileInfo" funktioniert IMHO leider nicht mit "Bruchstücken",
doch, man kann auch nur die Extension nehmen, und erhält dann das korrekte Handle auf das Icon in der Systemimagelist zurück.
Ich hatte erst vor kurzem dazu ein Beispiel gepostet (Hier im Forum suchenSHGetFileInfo)
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
Benutzerbild von Thunderchild
Thunderchild

Registriert seit: 12. Nov 2003
Ort: Nohra
139 Beiträge
 
Delphi 7 Personal
 
#22

Re: Systemicons und Listview

  Alt 1. Jun 2004, 14:31
Ich habe gestern den ganzen Tag Codeschnipsel und Beiträge hier zu diesem Thema gelesen, weil ich in meinem FTP-Client gern Windows-Icons für die FTP-Liste nehmen möchte. Aber das Höchste, was ich bis jetzt als Index aus GetFileInfo gekriegt habe, ist 2. Das heißt, bis jetzt habe ich nur OverlayIcons zu sehen bekommen. Bitte sag mir einer, was hier falsch ist. Es ist übrigens ein MDI-Programm. Die Imagelist für die Systemicons ist im Hauptformular, die Listenansicht befindet sich auf dem jeweiligen MDIchild.

OnCreate des Hauptformulars:
Delphi-Quellcode:
var hIl:HIMAGELIST;
    fi:TSHFileInfo;
begin
  hIl:=HIMAGELIST(SHGetFileInfo('',0,fi,sizeof(fi),
       SHGFI_SYSICONINDEX or SHGFI_SMALLICON));
  if(hIl<>0) then ilShellIcons.Handle:=hIl;
  // ShareImages ist schon zur Entwurfszeit auf true gesetzt
  // [...]
end;
Die Prozedur, die den ListView füllt:
Delphi-Quellcode:
procedure RefreshList;
var fi:TSHFileInfo; Item:tListItem;
begin
  // [...]
  // Programmeinstellung: Windows-Icons verwenden?
  if fm.Settings.FTPicons=2 then begin
    ZeroMemory(@fi,sizeof(TSHFileInfo)); // brauche ich das überhaupt jedes mal?

    // l ist vom Typ TidListItems, also das Listing des akt. Verzeichnisses.
    SHGetFileInfo(PChar('c:\'+l[i].FileName),0,fi,SizeOf(fi),
                  SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
    Item.ImageIndex:=fi.iIcon;
  end
end;
Das letzte Schöne, das in C geschrieben wurde, war Schuberts 9. Sinfonie.
Meine Softwareseite (Link aktualisiert am 13.12.2006).
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#23

Re: Systemicons und Listview

  Alt 1. Jun 2004, 15:29
Zitat von Christian Seehase:
doch, man kann auch nur die Extension nehmen, und erhält dann das korrekte Handle auf das Icon in der Systemimagelist zurück.
Stimmt, mein Fehler . Ich hatte vergessen, dass es das Flag SHGFI_USEFILEATTRIBUTES gibt.

@Thunderchild: Was war jetzt dein Problem? Du hast Dateien vom FTP-Server, die´s auf deinem Rechner u.U. nicht gibt. Und darum passen die Symbole nicht. Dann folgende Änderung (wie Christian das bereits angedeutet hat):
Delphi-Quellcode:
  ZeroMemory(@fi,sizeof(fi));
  SHGetFileInfo('.HxS',
    FILE_ATTRIBUTE_NORMAL, <-- Dateiattribut
    fi,sizeof(fi),
    SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_SMALLICON or
    SHGFI_USEFILEATTRIBUTES); <-- Flag
In der "iIcon"-Membervariablen hast du jetzt den Index des HxS-Symbols. Du kannst auch einen Dateinamen angeben. Durch das o.g. Flag und das Dateiattribut spielt´s keine Rolle ob die Datei wirklich existiert oder nicht. Es ist als würde sie existieren.

PS: Ach nee, Lamy wollte das ja wissen.
  Mit Zitat antworten Zitat
Benutzerbild von Thunderchild
Thunderchild

Registriert seit: 12. Nov 2003
Ort: Nohra
139 Beiträge
 
Delphi 7 Personal
 
#24

Re: Systemicons und Listview

  Alt 1. Jun 2004, 21:45
Supi, danke. Das isses.

Da würd ich gern noch ne Frage dran hängen:
Wie ich das Icon eines Ordners bekomme, habe ich schnell raus gefunden. Was hat das aber mit dem SHGFI_OPENICON auf sich? Ich hatte gehofft, das ist der aufgeklappte Ordner. Aber irgendwie geht das wieder nicht. Zurück zu meiner eigentlichen Frage: mit welchen Parametern bekomme ich nun noch das Icon des Arbeitsplatzes? Damit möchte ich die Wurzel des FTP-Directories schmücken.

mfG
Das letzte Schöne, das in C geschrieben wurde, war Schuberts 9. Sinfonie.
Meine Softwareseite (Link aktualisiert am 13.12.2006).
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#25

Re: Systemicons und Listview

  Alt 1. Jun 2004, 21:49
Zitat von Thunderchild:
Was hat das aber mit dem SHGFI_OPENICON auf sich? Ich hatte gehofft, das ist der aufgeklappte Ordner.
Ist es normalerweise auch. Ich habe das Ding in der Tree-View-Demo benutzt, und es war aufgeklappt. Bei einigen Spezialordnern (Favoriten, usw.) gibt es IMHO aber keine aufgeklappte Variante.

Zitat:
mit welchen Parametern bekomme ich nun noch das Icon des Arbeitsplatzes?
Puh. Kannst du nicht was einfaches fragen?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#26

Re: Systemicons und Listview

  Alt 2. Jun 2004, 18:59
Moin Thunderchild,

war eine interessante Frage mit dem Arbeitsplatzicon.
Ich hab's jetzt mal so gelöst:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var
  fiWork : TSHFileInfo;
  icWork : TIcon;
  pidlDSK : PItemIdList;
  imWork : IMalloc;

begin
  SHGetSpecialFolderLocation(0,CSIDL_DESKTOP,pidlDSK);
  icWork := TIcon.Create;
  try
    SHGetFileInfo(PChar(pidlDSK),0,fiWork,SizeOf(fiWork),SHGFI_PIDL or SHGFI_ICON or SHGFI_SMALLICON);
    icWork.Handle := fiWork.hIcon;
    Canvas.Draw(10,10,icWork);
  finally
    FreeAndNil(icWork);
    SHGetMalloc(imWork);
    imWork.Free(pidlDSK);
  end;
end;
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
Benutzerbild von Thunderchild
Thunderchild

Registriert seit: 12. Nov 2003
Ort: Nohra
139 Beiträge
 
Delphi 7 Personal
 
#27

Re: Systemicons und Listview

  Alt 3. Jun 2004, 22:38
Danke für die Antwortarbeit. Welcher Unit kann ich denn die PItemIdList entnehmen? Ferner brauche ich nur den IconIndex. Den möchte ich beim Programmstart ermitteln und dann in einer Vari speichern. Brauche ich dann dieses imWork überhaupt noch?
Gruß
Das letzte Schöne, das in C geschrieben wurde, war Schuberts 9. Sinfonie.
Meine Softwareseite (Link aktualisiert am 13.12.2006).
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#28

Re: Systemicons und Listview

  Alt 4. Jun 2004, 07:40
Du brauchst zwei Units:
Delphi-Quellcode:
uses
  ShlObj, // für PItemIdList
  ActiveX; // für IMalloc
Und Ja: mit dem Index geht es auch. Basierend auf Christians Code:
Delphi-Quellcode:
li := lv.Items.Add;
li.Caption := 'Arbeitsplatz';

if(SHGetSpecialFolderLocation(0,CSIDL_DRIVES,pidlDSK) =
  S_OK) then
try
  SHGetFileInfo(pchar(pidlDSK),0,fi,sizeof(fi),
    SHGFI_PIDL or SHGFI_ICON or SHGFI_SYSICONINDEX);
  li.ImageIndex := fi.iIcon;
finally
  SHGetMalloc(imWork);
end;
wobei ich aber CSIDL_DESKTOP durch CSIDL_DRIVES ersetzt habe, denn im PSDK steht:
Zitat:
CSIDL_DRIVES
The virtual folder representing My Computer, [...]
Das andere wäre dieses Symbol, dass du auch in der Schnellstartleiste siehst, bzw. als Root im Windows-Explorer. Aber das Symbol des Arbeitsplatzes (das auf dem Desktop) ist bei mir ein anderes.
  Mit Zitat antworten Zitat
Benutzerbild von Thunderchild
Thunderchild

Registriert seit: 12. Nov 2003
Ort: Nohra
139 Beiträge
 
Delphi 7 Personal
 
#29

Re: Systemicons und Listview

  Alt 4. Jun 2004, 08:30
Danke, es geht.
Aber nochmal nachgehakt: wozu das SHGETMALLOC? Nach meiner Doku hier übergibt das einen Zeiger an das imWork (also damit damit gearbeitet werden kann). Aber weder wird es in der Indexermittlung verwendet, noch dahinter.
Das letzte Schöne, das in C geschrieben wurde, war Schuberts 9. Sinfonie.
Meine Softwareseite (Link aktualisiert am 13.12.2006).
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#30

Re: Systemicons und Listview

  Alt 4. Jun 2004, 08:52
Zitat von Thunderchild:
Danke, es geht.
Aber nochmal nachgehakt: wozu das SHGETMALLOC? Nach meiner Doku hier übergibt das einen Zeiger an das imWork (also damit damit gearbeitet werden kann). Aber weder wird es in der Indexermittlung verwendet, noch dahinter.
Also,
Mit SHGetMalloc der Zeiger auf IMalloc geholt wird. Und IMalloc wird dazu benutzt, den im fremden Prozessraum reservierten Speicher für die PItemIdList wieder freigeben zu lassen (da der Speicher dafür ja nicht von uns reserviert wurde, sondern von Windows)...

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 00:38 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