|
|
Á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.
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.
Ha van vessző…
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;
|
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!
|