AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Pfade parsen um Icons zu extrahieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pfade parsen um Icons zu extrahieren

Ein Thema von EWeiss · begonnen am 29. Sep 2016 · letzter Beitrag vom 1. Okt 2016
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

Pfade parsen um Icons zu extrahieren

  Alt 29. Sep 2016, 09:16
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

Geändert von EWeiss (29. Sep 2016 um 10:19 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#2

AW: Pfade parsen um Icons zu extrahieren

  Alt 29. Sep 2016, 13:26
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?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Pfade parsen um Icons zu extrahieren

  Alt 29. Sep 2016, 13:37
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

Geändert von EWeiss (29. Sep 2016 um 13:40 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Pfade parsen um Icons zu extrahieren

  Alt 29. Sep 2016, 14:10
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

Geändert von EWeiss (11. Jul 2019 um 15:45 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Pfade parsen um Icons zu extrahieren

  Alt 1. Okt 2016, 06:37
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
  Mit Zitat antworten Zitat
Antwort Antwort


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