|
|
Új oszlop felvétele a Windows Intézőjébe
|
|
Példaprogram letöltése
7965 bájt
|
Amikor a Windows Intézőjében a részletes nézet van kiválasztva, akkor több információ is megjelenik az egyes állományokról a nevükön kívül. Ilyen információ a típus, méret, stb.
Lehetőségünk van olyan Delphi-s alkalmazást készíteni, melynek segítségével a Windows intézőjében megjeleníthetünk új oszlopokat, így minden egyes állomány mellé egy tetszőleges értéket kiírhatunk.
Ennek megvalósítására a Win 2000-től kezdve van lehetőségünk, illetve minden olyan rendszeren, ahol az Internet Explorer 5-ös, vagy ennél magasabb verziója van telepítve. Ez utóbbi frissíti ugyanis a Shell32.dll-t a megfelelő verziószámúra, így az IColumnProvider interfész, melyre a megvalósításhoz szükségünk lesz, már rendelkezésre fog állni.
A mellékelt példa kipróbálásához az alábbi lépésekre van szükség:
- zárja be az összes futó Windows Intézőt
- fordítsa le a mellékelt DLL-t
- válassza a Run - Register ActiveX Server menüpontot
- indítson el egy Windows Intézőt
- válassza a részletes nézetet (Nézetek - Részletek)
- kattintson az állományok listájának fejlécén jobb gombbal
- a megjelenő menüből válassza az Egyéb menüpontot
- a megjelenő ablakban jelölje be az Animare nevű oszlopot, majd zárja az ablakot
Ekkor megjelenik egy új oszlop Animare felirattal, az oszlop értékei egy egyszerű sorszámozás egytől kezdve az összes állomány darabszámáig.
Az IColumnProvider felhasználásához egy ActiveX DLL-t kell létrehoznunk, melyben egy COM objektumot készítünk fel a szükséges feladat elvégzésére. A létrehozáshoz a File - New menüpont választása után az ActiveX lapon válasszuk az ActiveX Library-t, majd ugyanitt a COM objektum elemet. Ez utóbbinak a TColumnHandlerObject nevet adtuk a mellékelt példában. Ennél az objektumnál implementáljuk az IColumnProvider interfészt.
TColumnHandlerObject = class(TComObject, IColumnProvider)
protected
function IColumnProvider.Initialize=ColumnInit;
function ColumnInit(psci: PSHColumnInit): HRESULT;
stdcall;
function GetColumnInfo(dwIndex: DWORD; psci:
PSHColumnInfo): HRESULT; stdcall;
function GetItemData(pscid: PSHColumnID; pscd:
PSHColumnData; out pvarData: Variant): HRESULT; stdcall;
end;
Az IColumnProvider Initialize függvénye a munkafolyamat kezdetén kerül meghívásra, vagyis amikor egy-egy oszlop adatainak megjelenítésére lesz szükség. Itt elvégezhetjük a szükséges inicializálásokat programunk számára. Paraméterként kapunk egy TSHColumnInit struktúrára mutató pointert. Ebben egyetlen érdekes mező a wszFolder nevű. Ebben kapjuk annak a könyvtárnak az elérési útvonalát, melynél megjelenik aktuálisan a saját oszlopunk.
A GetColumnInfo függvényt akkor hívja meg DLL-ünkből az Intéző, ha szüksége van azokra az információkra, hogy az egyes oszlopaink milyen tulajdonsággal rendelkeznek. Itt a dwIndex paraméterben kapjuk azt a számot, melyből kiderül, hogy hányadik oszlopunk adatait kell megadnunk. Paraméterként kapunk továbbá egy TSHColumnInfo struktúrára mutató pointert. Ennek egyes mezőibe kell megadnunk a szükséges értékeket. Például a scid.fmtid mezőbe a COM objektumunk osztály azonosítóját (GUID). Az oszlopunkban megjelenített adatok típusát a vt nevű mezőbe adhatjuk meg egy konstans segítségével. A VT_I4 konstans egy négy bájt hosszú szám típusra utal. A további VT_xxx konstansokat megtaláljuk az ActiveX.pas unit-ban. Az fmt mező az oszlopunk igazítását írja elő. A LVCFMT_CENTER konstans a középre történő igazítást adja meg. A wszTitle mezőbe adhatjuk meg azt a sztringet, amely az új oszlop fejléc szövege lesz.
function TColumnHandlerObject.GetColumnInfo(
dwIndex: DWORD; psci: PSHColumnInfo): HRESULT;
begin
result:=S_FALSE;
case dwIndex of
0: begin
psci^.scid.fmtid:=Class_ColumnHandlerObject;
psci^.scid.pid:=0;
psci^.vt:=VT_I4;
psci^.fmt:=LVCFMT_CENTER;
psci^.csFlags:=SHCOLSTATE_TYPE_INT;
psci^.cChars:=10;
StringToWideChar('Animare', @psci^.wszTitle[1],
MAX_COLUMN_NAME_LEN);
StringToWideChar('Leírás', @psci^.wszDescription[1],
MAX_COLUMN_DESC_LEN);
result:=S_OK;
end;
end;
end;
Végül már csak annyi a teendőnk, hogy megadjuk hogy az egyes állományok, illetve alkönyvtárak mellett a mi oszlopunkban milyen érték szerepeljen. Amikor erről kell rendelkeznünk, akkor kerül meghívásra a GetItemData függvény. Itt a pvarData paraméterbe kell visszaadnunk azt az értéket, melyet az adott állomány mellett szeretnénk viszontlátni. Szintén paraméterként kapunk egy mutatót, mely egy TSHColumnData struktúrára mutat. Ebből megtudhatjuk, hogy melyik az aktuális állomány. A wszFile mezője tartalmazza az állomány nevet, míg a dwFileAttributes az állomány attribútumait, végül a kiterjesztését a pwszExt mezőből ismerhetjük meg.
function TColumnHandlerObject.GetItemData(
pscid: PSHColumnID; pscd: PSHColumnData;
out pvarData: Variant): HRESULT;
begin
pvarData:=FI;
inc(FI);
result:=S_OK;
end;
Ha elkészült a DLL, akkor nem elegendő csupán ActiveX szerverként regisztrálni. Ahhoz, hogy a Windows Intézője is megtalálja, a HKEY_CLASSES_ROOT főkulcs alá a Folder\ShellEx\ColumnHandlers\ címre be kell jegyeznünk a COM objektumunk GUID-ját.
A bejegyzéshez, illetve annak törléséhez felhasználjuk, hogy egy a TComObjectFactory osztályból származtatott objektumnál felülírható az UpdateRegistry eljárás, melyben tetszőleges regisztráció elvégezhető. Ez az eljárás akkor fog futni, amikor ActiveX szerverként regisztráljuk, illetve eltávolítjuk a DLL-t.
procedure TColumnHandlerFactory.UpdateRegistry(
Register: Boolean);
begin
inherited;
with TRegistry.Create do begin
RootKey:=HKEY_CLASSES_ROOT;
if Register then begin
OpenKey('Folder\ShellEx\ColumnHandlers\'+
GUIDToString(Class_ColumnHandlerObject), true);
CloseKey;
end else begin
DeleteKey('Folder\ShellEx\ColumnHandlers\'+
GUIDToString(Class_ColumnHandlerObject));
end;
Free;
end;
end;
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 199. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|