ishellfolder felület - 31. fejezet
Ez az interfész megfelel egy mappát - az egyik helyet felfedező nevét alapelemeit. Miért volt szükséges bevezetni a „mappa”, amikor nem volt már közös „mappa” és a „könyvtár”? Ellentétben az utóbbi kettő, a mappát nem lehet csak a rendszeres jellemzője a fájlrendszert. Ez lehet a virtuális -, mint a nyomtatók mappában dokumentumok vagy a vezérlőpulton. Bármilyen mappát tartalmazhat objektumok gyűjteménye a névtér szerkezetét.
IshellFoider kap egy mutatót a felület, amely megfelel a mappát, akkor dolgozni vele, mint egy COM objektumot. A "tip" (root könyvtár) nevét a tér egy asztali mappába (Desktop). Get felület isheiiFoider ezt a mappát, akkor hívja a funkciót:
funkció SHGetDesktopFolder (var ppshf: IShellFolder): HRESULT;
Logic működik a leírt felület a következő: először meg kell szerezni egy interfész kívánt mappára, akkor továbbra is együttműködik annak tartalmát. A tartalom a lista minden eleme a mappa által képviselt szerkezet pitemiDList. Ez a szerkezet nem adta; az egyetlen szükséges mező hosszát bájtban megismerésével léphetünk a következő tétel. Ez azt jelenti, kiderül egy közönséges láncot. Minden más területeken megfelelő funkciókat és módszereket ishellFoider felület.
Tekintsük ishellFoider interfész funkciók. Az „aktuális” a lap. 31.1 utal, hogy a mappát, amely jelenleg IShellFolder interfész.
Táblázat 31.1. Interfész funkciók IShellFolder
A harmadik lehetőség, hogy a kívánt mappát pidi - interaktív, a Shell API funkciókat.
funkció ShBrowseForFolder (var Ipbi: TBrowselnfo): PItemlDList;
Mielőtt felhívását kell fejeznie TBrowselnfo típusú szerkezet, amely különösen pidi az elem, amely a gyökér. A funkció meghívása után, a felhasználó lát előtt a mappaválasztó párbeszédablak (ábra. 31,3).
Ábra. 31.3. Mappaválasztó párbeszédablak jön létre, amikor a függvény hívásakor ShBrowseForFolder
Ebben a példában a gyökér szolgál Sajátgép virtuális mappában. A felhasználó választhat egyet a fájlrendszer mappák (mert a zászló TBrowseinfo.uiFlags, az egyenlő
A kimeneti függvény a pidi mappa, akinek a neve eltávolítjuk belőle meghívásával egy másik funkció Shell - shGetPathFromList.
eljárás TForml / ButtonlClick (Sender: TObject);
StartPIDL, ResPIDL. PItemlDList;
S, Path. ArraytO..max_path-l] Of WideChar;
01eCheck (SHGetSpecialFolderLocation (Handle, CSIDL_DRIVES, StartPIDL));
IpszTitle = „Válassza ki a mappát”;
ha SHGETPathFromlDList (ResPIDL, @Path [0])
majd Labe11.Caption: = StrPas (@Path [0]);
A kapott neve itt látható a címke 1 komponens.
ha nem sikerül (DeskTop.ParseDisplayName
(Self.Handle, nil, StringToWideChar (Editl.Text, ws, MAX_PATH), N, pidi, attr))
Ezután kezdődik ShowMessage ( „Ismeretlen név”);
Kilépés; végén; OleCheck (DeskTop.BindToObject (Pidl, nil, IID_IShellFolder, Pointer (NewShellFolder)>);
SHCONTF_FOLDERS vagy SHCONTF_NONFOLDERS, Enumerator)); míg Enumerator.Next (1, Pidl, Numpidls) = S_OK do
NewShellFolder.GetDisplayNameOf (PIDL, SHGDN_FORPARSING, strret); esetében StrRet.uType a STRRET_CSTR:
s: = StrRet.cStr; STRRET_OFFSET:
P: = @ PIDL.mkid.abID [StrRet.uOffset - sizeof (PIDL.mkid.cb)];
SetString (s, P, PIDL.mkid.cb - StrRet.uOffset);
A ErEOleSysError do ShowMessage ( '');
Ebben a példában, a kívánt mappa név nyert Edit1 komponenst. Miután megkapta a mutatót, hogy a felület, majd ishellFoider IEnumiDList felület, a program kitölti a névsort kapott Memol.Lines fájlokat.
Amellett, hogy a nevét a legtöbb fájlrendszer-objektumok, akkor „kap” egy csomó hasznos információt. Gyakran felmerül a kérdés: hogyan kell bontania egy ikon megfelel egy adott fájl vagy benne tárolt?
Módon lehet elérni ezt több. A legegyszerűbb - a függvényhívás:
működnek SHGetFileInfo (pszPath: PAnsiChar; dwFileAttributes: DWORD;
var psfi: TSHFilelnfo; cbFilelnfo, uFlags: UINT): DWORD;
PszPath paraméter lehet egy mutatót, mint egy húr a fájl nevét, és a szerkezet a forma Pidl. Függvény kitölti psfi szerkezete (típus TSHFilelnfo) cbFilelnfo bájt hosszúságú. Attól függően, hogy mit jelent a szó zászlók (uFlags paraméter) a kimeneten lehet változatos információkat. Különösen, ha a paraméter értékek vannak beállítva uFlags SHGFI_SYSICONINDEX és SHGFI_ICON, akkor a szerkezet rögzíti psfi jelvény számát a fájlt a rendszer image listán, és a függvény eredménye fogja kezelni ezt a listát. Akkor tudja használni (pl eszköztárak) az alábbiak szerint:
eljárás TForml.FormCreate (Sender: TObject);
SHGFI_SYSICONINDEX vagy SHGFI_ICON);
SendMessage (ToolBarl.Handle, TB_SETIMAGELIST, 0, ImageListHandle);
Hasonlóképpen, akkor távolítsa el az ikont, amely megfelel az adott fájlt. Ennek része a Shell további funkciók célja, hogy kivonat ikonok:
- funkció Extractlcon (hlnst: HINST; IpszExeFileName: PChar; nlconlndex: UINT): HICON;
Ez a funkció eltávolítja az ikont a IpszExeFileName fájlt (ez legyen a fájltípus EXE, DLL vagy ICO) és visszaadja a fogantyút. Ha az ikon nem található, a visszatérési érték 0.
- funkció ExtractAssociatedIcon (hInst: HINST; IpIconPath: PChar; var Ipilcon: Word): HICON;
Ez a funkció lehet dolgozni fájlokat különböző formátumokban. Eleinte ő, mint az előzőt, keresi az ikonra a fájl. Ha nem, kísérletet teszünk, hogy megtalálják a ikonra az alkalmazás társított fájl típusát. Például egy kiterjesztésű fájl doc egyik Microsoft Word ikon eltávolításra kerül.