Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Pfade parsen um Icons zu extrahieren (https://www.delphipraxis.net/190381-pfade-parsen-um-icons-zu-extrahieren.html)

EWeiss 29. Sep 2016 09:16


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:
CDN_FOLDERCHANGE:
begin
  SelectedPath := PWideChar(OpenDialog.GetDlgPath(CDM_GETFOLDERPATH, WinHandle));
  Result := 1;
  Exit;
end;
Die anderen Pfade bekomme ich hier geliefert aber nicht vollständig.

Delphi-Quellcode:
    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;
Das ist mein Problem ;)

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

Medium 29. Sep 2016 13:26

AW: Pfade parsen um Icons zu extrahieren
 
Das wird nicht gehen. Du könntest ja z.B. sowas haben:
Code:
+C:
+--Musik
| +--Favoriten
+--Filme
  +--Favoriten
Wenn du jetzt nur "Favoriten" als Text hast - woher soll man ableiten, ob das unter "Musik" oder "Filme" gemeint war?

EWeiss 29. Sep 2016 13:37

AW: Pfade parsen um Icons zu extrahieren
 
Zitat:

Zitat von Medium (Beitrag 1349201)
Das wird nicht gehen. Du könntest ja z.B. sowas haben:
Code:
+C:
+--Musik
| +--Favoriten
+--Filme
  +--Favoriten
Wenn du jetzt nur "Favoriten" als Text hast - woher soll man ableiten, ob das unter "Musik" oder "Filme" gemeint war?

Hmm... vielleicht habe ich mich auch nicht richtig ausgedrückt.

Ich habe es jetzt so gelöst auf einfache weise.
Ich bekomme den Pfad hier

Delphi-Quellcode:
          CDN_FOLDERCHANGE:
            begin
              DirPath := PWideChar(OpenDialog.GetDlgPath(CDM_GETFOLDERPATH, WinHandle));
              if assigned(cbComboPath) then
                cbComboPath.IconPath := DirPath;
              Result := 1;
              Exit;
            end;
Wenn ich jetzt in der Componente Combobox bin "cbComboPath"
Parse ich den Path "DirPath"

Hier wird der Pfad in seine Einzelteile zerlegt.
Dann hole ich mir das Icon von jeden Pfad.

Delphi-Quellcode:
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;
mir fehlen jedoch 2.
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

EWeiss 29. Sep 2016 14:10

AW: Pfade parsen um Icons zu extrahieren
 
Ich habe es nochmal geändert aber irgendwie ist das ein Hack weil Hardgecoded.
Delphi-Quellcode:
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;
Bei Computer gibt er mir ein Folder Icon und das Letzte ist auch irgendwie daneben.
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

EWeiss 1. Okt 2016 06:37

AW: Pfade parsen um Icons zu extrahieren
 
Zitat:

Die Icons sind etwas nach unten gerutscht sollte aber das kleinste Problem sein.
Habe ich behoben.

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