HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Word dokumentum címének megjelenítése a Windows Intézőben


Példaprogram letöltése

13810 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.
Mostani példánkban azt valósítjuk meg, hogy létrehozunk egy Címsor 1 nevű oszlopot, melyben a Word dokumentumaiból kiolvassuk azt a sort, mely Címsor 1 stílussal lett formázva. Így az Intézőben a dokumentum megnyitása nélkül is láthatóak lesznek a szövegeinknek adott címek.

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 a Címsor 1 menüpontot.
Ekkor megjelenik egy új oszlop Címsor 1 felirattal, az oszlop értékei a következőképpen alakulnak:
  • egy mínusz karakter akkor, ha az adott állomány nem DOC
  • DOC állomány esetén, ha annak első sora Címsor 1, illetve Heading 1 stílusra van formázva, akkor ennek a szövege.
IColumnProvider
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_LPWSTR konstans egy null terminált unicode sztring 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_LEFT konstans az oszlopon belüli igazítást adja meg, mely ez esetben balra történik. 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_LPWSTR;
      psci^.fmt:=LVCFMT_LEFT;
Mivel a Word dokumentumok megnyitása és a tartalmuk olvasása lassú művelet, így a csFlags-ban nem csak az új oszlop típusát kell megadnunk, mely jelen esetben sztring, hanem a SHCOLSTATE_SLOW konstanssal ezt a lassú végrehajtást is jeleznünk kell. Ennek hatására a Windows Intézője először megjeleníti a könyvtár tartalmát, majd csak ezután hívja meg alkalmazásunk GetItemData függvényét minden egyes állománynál. Így amikor már megjelent a könyvtár tartalma a Címsor 1 oszlop még üres lesz, majd szép sorban minden állománynál ez az oszlop is feltöltésre kerül a megfelelő értékkel.
      psci^.csFlags:=SHCOLSTATE_TYPE_STR+SHCOLSTATE_SLOW;
      psci^.cChars:=30;
      StringToWideChar('Címsor 1', @psci^.wszTitle[1], MAX_COLUMN_NAME_LEN);
      StringToWideChar('DOC, RTF Címsor 1 szövege', @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;
...
  s:=Trim(LowerCase(pscd.wszFile));
  p:='';
Abban az esetben, ha DOC kiterjesztésű állományt találunk, akkor azt meg kell nyitnunk, hogy ellenőrizhessük van-e benne Címsor 1 stílusú szöveg.
  if ExtractFileExt(s)='.doc' then begin
    try
      application:=CreateOleObject('Word.Application');
      application.Documents.Open(s);
      document:=application.ActiveDocument;
Az egyszerűség kedvéért nem nézzük végig a teljes dokumentumot, hanem csak annak első sorát vizsgáljuk, vagyis kiolvassuk a stílusának nevét a „t” változóba. Ha a teljes dokumentumot szeretnénk vizsgálni, akkor egy ciklust kell készítenünk, mely végigmegy Paragraphs.Item(x) elemein és így minden bekezdést ellenőrizhetünk.
      t:=document.Paragraphs.Item(1).Style.NameLocal;
Ha a stílus a számunkra megfelelő, akkor tároljuk a dokumentumban lévő szöveget.
      if (t='Címsor 1') or (t='Heading 1') then begin
        p:=document.Paragraphs.Item(1).Range.Text;
      end;
      application.Quit;
      application:=Unassigned;
    except
    end;
  end else begin
    p:='-';
  end;
Az eredmény sztringet már csak konvertálnunk kell a megfelelő formátumra és a pvarData változón keresztül visszaadhatjuk azt az Intézőnek megjelenítésre.
  VarCast(pvarData, p, varOleStr);
  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 2002 évkönyv 229. 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!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |