![]() |
Pfade parsen um Icons zu extrahieren
Wie kann ich am schnellsten die realen Pfade parsen.
Es geht mir darum die Icons zu den Pfaden zu extrahieren um diese dann zu meiner Combo zu addieren. Also was ich bekomme sind nur die Ordner. bsp. In der Reihenfolge. Desktop. Computer. Work (D). Musik. Neu. Die Hitgiganten. usw.. Ohne vollständigen Pfad kann ich die Icons nicht extrahieren. Wie also am schnellsten parsen? Beim aktuell selektieren Item ist das kein Problem da habe ich den vollständigen Path und lade ich hier..
Delphi-Quellcode:
Die anderen Pfade bekomme ich hier geliefert aber nicht vollständig.
CDN_FOLDERCHANGE:
begin SelectedPath := PWideChar(OpenDialog.GetDlgPath(CDM_GETFOLDERPATH, WinHandle)); Result := 1; Exit; end;
Delphi-Quellcode:
Das ist mein Problem ;)
WM_DRAWITEM:
begin PDis := Pointer(lp); case PDis^.CtlType of ODT_COMBOBOX: begin cbComboPath.Listclear(cbComboPath.Handle); TxTCount := SendMessageW(PDis.hwndItem, CB_GETCOUNT, 0, 0); SetLength(ComboTxt, TxTCount + 1); for IntI := 1 to TxTCount do begin ComboTxt[IntI] := PWideChar(ListGetText(PDis.hwndItem, IntI)); cbComboPath.ListAdd(cbComboPath.Handle, ComboTxt[IntI]); end; Index := SendMessage(PDis.hwndItem, CB_GETCURSEL, 0, 0); if Index > -1 then cbComboPath.ListSetTopIndex(cbComboPath.Handle, Index + 1); Result := 1; end; end; end; Also es geht nicht darum einen vollständigen Pfad zu parsen.. das ist kein Problem mit Findfirst/Findnext D:\Musik\Neu\Die Hitgiganten Sondern die einzelnen Ordner die nicht bekannt sind angefangen bei "Die Hitgiganten" rekursive zu ermitteln. Bis ich mich letztendlich im Pfad des Desktop befinde. gruss |
AW: Pfade parsen um Icons zu extrahieren
Das wird nicht gehen. Du könntest ja z.B. sowas haben:
Code:
Wenn du jetzt nur "Favoriten" als Text hast - woher soll man ableiten, ob das unter "Musik" oder "Filme" gemeint war?
+C:
+--Musik | +--Favoriten +--Filme +--Favoriten |
AW: Pfade parsen um Icons zu extrahieren
Zitat:
Ich habe es jetzt so gelöst auf einfache weise. Ich bekomme den Pfad hier
Delphi-Quellcode:
Wenn ich jetzt in der Componente Combobox bin "cbComboPath"
CDN_FOLDERCHANGE:
begin DirPath := PWideChar(OpenDialog.GetDlgPath(CDM_GETFOLDERPATH, WinHandle)); if assigned(cbComboPath) then cbComboPath.IconPath := DirPath; Result := 1; Exit; end; Parse ich den Path "DirPath" Hier wird der Pfad in seine Einzelteile zerlegt. Dann hole ich mir das Icon von jeden Pfad.
Delphi-Quellcode:
mir fehlen jedoch 2.
procedure TSkinComboBox.FillList(Path: WideString);
var FileInfo: SHFILEINFO; IntI: Integer; PathRecursive: TSplitStrArray; s: string; begin SetLength(PathRecursive, 0); PathRecursive := Split(Path, '\'); SetLength(IconHandle, High(PathRecursive)); for IntI := 0 to High(PathRecursive) do begin s := s + PathRecursive[IntI] + '\'; SHGetFileInfo(PWideChar(s), FILE_ATTRIBUTE_NORMAL, FileInfo, sizeof(FileInfo), SHGFI_DISPLAYNAME Or SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_ICON); IconHandle[IntI] := FileInfo.HIcon; end; end; Desktop und Computer. Dahingehend muss ich mir noch was überlegen da ich nun falsche Icons den jeweiligen Index in der Combobox zuweise. Weil halt zwei fehlen. gruss |
AW: Pfade parsen um Icons zu extrahieren
Ich habe es nochmal geändert aber irgendwie ist das ein Hack weil Hardgecoded.
Delphi-Quellcode:
Bei Computer gibt er mir ein Folder Icon und das Letzte ist auch irgendwie daneben.
procedure TSkinComboBox.FillList(Path: WideString);
var FileInfo: SHFILEINFO; IntI: Integer; PathRecursive: TSplitStrArray; s: string; begin SetLength(PathRecursive, 0); PathRecursive := Split(Path, '\'); // PathRecursive + 3 der erste Eintrag in der Combo beginnt bei 1 // 0 ist weg bleiben noch 2 // 1 für den Desktop und 2 für Computer SetLength(IconHandle, High(PathRecursive) + 3); for IntI := 1 to High(IconHandle) do begin if IntI = 1 then s := GetSpecialFolder(CSIDL_DESKTOPDIRECTORY) else if IntI = 2 then s := GetSpecialFolder(CSIDL_DRIVES) else // - 3 damit wir wieder auf 0 gelangen. // 0 ist der erste Eintrag im Split Array PathRecursive s := s + PathRecursive[IntI - 3] + '\'; SHGetFileInfo(PWideChar(s), FILE_ATTRIBUTE_NORMAL, FileInfo, sizeof(FileInfo), SHGFI_DISPLAYNAME Or SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_ICON); IconHandle[IntI] := FileInfo.HIcon; end; end; Sieht nach einem Icon mit "Wait Cursor aus." CSIDL_DRIVES für Computer scheint falsch zu sein. Muss noch mal schaun. Die anderen sind soweit in Ordnung. Die Icons sind etwas nach unten gerutscht sollte aber das kleinste Problem sein. gruss |
AW: Pfade parsen um Icons zu extrahieren
Zitat:
Und für die welche versuchen das Icon vom Computer zu bekommen über CSIDL_DRIVES muss ich leider enttäuschen das Icon ist definitiv falsch. Ich habe es am ende über ExtractIconEx und den Index 15 einlesen müssen. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz