HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Állomány kiterjesztéshez tartozó alkalmazások és ikonok meghatározása


Példaprogram letöltése

10628 bájt


Ha adott egy állomány kiterjesztés, pl.: .txt, akkor mindenki, még a Windows Intézője is tudja, hogy ez egy Szöveges állomány, melyhez tartozik egy ikon, amely az Intézőben meg is jelenik. A .txt kiterjesztés mellett azonban még több száz létezik, melyekhez megnevezés és többségükhöz alapértelmezett ikon is tartozik.

Ebben a példában egy olyan programot készítünk, mely meghatározza az összes ismert kiterjesztést és annak megnevezését, tovább a hozzá tartozó ikon képét is kirajzolja, melyet akár le is menthetünk, vagy felhasználhatunk tetszés szerint.

A megoldást a Windows regisztrációs adatbázisa adja. Ebben a HKEY_CLASSES_ROOT főkulcs alatt megtalálható az összes ismert állomány kiterjesztés és a hozzájuk tartozó adatok. Nincs más teendőnk, tehát mint egy olyan alkalmazást készíteni, mely végignézi ezt a listát és kiszedi a megnevezéseket, majd megjeleníti az állományokhoz tartozó ikonokat.

A lista készítése közben szükségünk lesz két információ eltárolásához. Az egyik annak az állománynak a neve, elérési útja, melyben a szükséges ikon megtalálható, míg a másik az ikon sorszáma, mivel, ha az nem ICO állományban kap helyet, hanem mondjuk egy DLL-ben, akkor abban több is lehet nem csak egy, így sorszámuk alapján lehet majd azonosítani őket.
Ezen adatok tárolásához létrehozunk egy TData nevű osztályt, melyben két property tárolja a szükséges adatokat, melyeket akár már az osztály konstruktorán keresztül is át lehet adni.
  TData=class(TPersistent)
…
  public
    constructor Create(p: string; i: integer);
    property Path: string read FPath write SetPath;
    property IconIndex: integer read FIconIndex write SetIconIndex;
  end;

Ezt követően már neki is állhatunk a registry bejegyzések olvasásának.
procedure TForm1.Button1Click(Sender: TObject);
…
  with TRegistry.Create do begin
Megnyitjuk a HKEY_CLASSES_ROOT főkulcsot.
    RootKey:=HKEY_CLASSES_ROOT;
    OpenKey('', false);
Majd az összes bejegyzés nevét a list1 TStringList típusú változóba másoljuk a GetKeyNames eljárással.
    GetKeyNames(list1);
Ezt követően egy ciklussal végigmegyünk ezen a listán.
    for i:=0 to list1.Count-1 do begin
Mivel minket most csak az állomány kiterjesztések érdekelnek, így csak azokkal a bejegyzésekkel foglalkozunk, melyek egy ponttal kezdődnek.
      if list1[i][1]='.' then begin
Ha ilyet találunk a listában, akkor megnyitjuk azt a registry kulcsot.
        OpenKey(list1[i], false);
Beolvassuk a hozzájuk rendelt alapértelmezett értéket, melyből megtudjuk, hogy az adott kiterjesztéshez hol találunk további információt. Például a .txt-hez a txtfile szöveg tartozik. Ebből következik, hogy a HKEY_CLASSES_ROOT alatt található egy txtfile nevű bejegyzés, ahol a .txt állomány kiterjesztés további információi vannak.
        s1:=ReadString('');
        CloseKey;
Felhasználva a kapott értéket ellenőrizzük, hogy ott található-e DefaultIcon bejegyzés.
        if KeyExists(s1+'\DefaultIcon') then begin
Ha van DefaultIcon, akkor megnyitjuk ezt a kulcsot.
          OpenKey(s1+'\DefaultIcon', false);
Kiolvassuk az ott tárolt alapértelmezett értéket, mely megadja számunkra, hogy az állomány kiterjesztéshez milyen ikon tartozik.
          s3:=ReadString('');
          CloseKey;
Ezek után megnyitjuk a kiterjesztésnél kapott címet (txtfile) és innen szintén az alapértéket olvassuk ki, mely nem más lesz mint a kiterjesztéshez rendelt megnevezés, ami a Windows intézőjében is megjelenik az állomány típus oszlopban.
          OpenKey(s1, false);
          s2:=ReadString('');
          if s2<>'' then begin
Ezt követően tároljuk a megtalált állomány kiterjesztést, annak nevét és egy TData típusban a hozzá tartozó ikon állományát és az ikon indexet, melyet a GetIconData függvényünk szolgáltat.
            list2.AddObject(s2+' ['+list1[i]+']', GetIconData(s3));
…

A GetIconData azt a sztringet kapja meg, melyet a DefaultIcon registry kulcs alól olvastunk ki. Maradva a .txt példánál ez a "%SystemRoot%\system32\shell32.dll,-152" sztring lesz. Ebből kell meghatároznunk az elérési útvonalat és az ikon sorszámát.
Az elérési útvonalnál előfordulhat, hogy rendszerváltozókban van megadva azok egy része, mint például itt is: %SystemRoot%. Ha van ikon sorszám, akkor az mindig a sztring végén található, és egy vesszővel van elválasztva a névtől.
function TForm1.GetIconData(s: string): TData;
…
Első lépésünk az, hogy a kapott sztringben lecseréljük az esetleges rendszerváltozókat a valós értékükre.
  ExpandEnvironmentStrings(PChar(s), a, 256);
  s:=a;
Ha ez megtörtént, akkor rákeresünk a vesszőre a sztringben és tároljuk annak pozícióját.
  i:=Pos(',', s);
Ha van vessző…
  if i<>0 then begin
akkor kimásoljuk a sztringből a vessző előtti részt.
    s1:=Trim(Copy(s, 1, i-1));
Bizonyos esetekben előfordulhat, hogy a név idézőjelek között van megadva. Ez esetben az idézőjeleket levágjuk a sztringből.
    if s1[1]='"' then begin
      s1:=Copy(s1, 2, Length(s1)-1);
    end;
    if s1[Length(s1)]='"' then begin
      s1:=Copy(s1, 1, Length(s1)-1);
    end;
Majd kimásoljuk a vessző utáni részt is.
    s2:=Trim(Copy(s, i+1, Length(s)));
Ha nincs vessző, akkor egyszerűbb a helyzet: ilyenkor csak az elérési útvonallal és névvel van dolgunk. Az ikonindex pedig nem használt érték lesz.
  end else begin
    s1:=s;
    s2:='0';
  end;
Végül létrehozunk egy TData objektumot, melynek átadjuk a talált elérési útvonalat és nevet, valamint az ikon sorszámát.
  result:=TData.Create(s1, StrToInt(s2));
end;

Most már csak az adatok megjelenítése marad hátra, melyhez egy egyedi kirajzolású TListBox-ot választunk (Style property lbOwnerDrawVariable). Így a kirajzoláshoz létrejön az OnDrawItem esemény, ahol a ListBox minden egyes sorát mi magunk rajzolhatjuk ki.
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State:
    TOwnerDrawState);
…
Első lépésként lekérdezzük a TData objektumot.
  d:=TData(ListBox1.Items.Objects[Index]);
  StrPCopy(a, d.Path);
Majd betöltjük az adott állományból az ikont.
  FIcon.Handle:=ExtractIcon(HInstance, a, d.IconIndex);
  with ListBox1.Canvas do begin
Ezután kiírjuk az adott elem szövegét és végül kirajzoljuk a hozzátartozó ikont is.
    TextRect(Rect, Rect.Left+40, Rect.Top+2, ListBox1.Items[Index]);
    Draw(Rect.Left+2, Rect.Top+2, FIcon);
  end;
end;



      

Cikksorozat

#IDKategóriaCikk címeSorozat
3916WindowsA javascript nyelv bemutatása1. rész
3946WindowsJavascript változók és operátorok2. rész
3975WindowsKódvezérlés JScript-ben3. rész
4004WindowsFüggvények és objektumok4. rész
4036WindowsFejlett funkciók a JavaScript nyelvben5. rész
4066WindowsFejlett funkciók a JavaScript nyelvben - folytatás6. rész
4116WindowsReguláris kifejezések7. rész
4145WindowsReguláris kifejezések - folytatás8. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2001 évkönyv 667. 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 |