|
|
Meghajtó információ gyűjtő komponens
|
|
Példaprogram letöltése
15122 bájt
|
Készítünk egy olyan komponenst, melynek segítségével egyszerre az összes elérhető meghajtóról megkaphatjuk az alapvető információkat. Ilyen például az, hogy üzemkész-e (floppy, CD esetén fontos), mekkora kapacitású, mennyi a szabadhely rajta, mi a sorozat száma, mi a típusa (pl.: FAT32), stb.
A komponens arra is képes, hogy ha a felhasználó behelyez egy CD lemezt a meghajtóba, akkor automatikusan frissítse az információt az aktuális CD-ről és erről egy eseményben értesítse is alkalmazásunkat.
A mellékelt példaprogram megnyitása előtt a DrivesInfo.pas-ban lévő komponenst telepítenie kell a Delphi alá.
Fontos tudnunk, hogy Delphi 4 Object Inspectora még nem támogatja az Int64 típusú property-ket, így néhány property nem látható, hiába published részben deklarált. Ettől persze programból épp úgy használható. Delphi 5-től kezdve ezzel már nincs gond, ott már az Object Inspector-ban is elérhető az Int64 típusú property.
A komponens Items property-ében érhetők el a kérdéses adatok. Itt, mint egy tömbben, minden egyes elem egy-egy meghajtónak felel meg. Minden elem rendelkezik további property-kkel, melyekből az adott meghajtó adata érhető el. Próbáljuk ki a komponenst úgy, hogy megnyitjuk az Items property-n keresztül annak szerkesztő ablakát, majd behelyezünk egy CD lemezt a meghajtóba. Amint komponensünk érzékeli a CD lemezt, automatikusan frissíteni fogja a property-k értékét.
Az Items elemeinek property-eiből az alábbi információkat tudhatjuk meg:
- Drive - a meghajtó betűjele
- DriveType - a meghajtó típusa (floppy, winchester, CD, stb.)
- SerialNumber - a meghajtó azonosító sorszáma
- VolumeName - a kötet neve
- FileSystem - a meghajtó állomány rendszere (FAT32, NTFS, stb.)
- Ready - igaz, ha a meghajtó üzemkész, pl. Floppy, CD esetén, ha nincs bent lemez, akkor ez a property hamis
- FreeAvailable - a rendelkezésre álló szabad hely
- TotalSpace - a teljes lemezterület mérete
- TotalFree - az összes szabadhely mérete
- UsedSpace - a lefoglalt hely mérete
A komponensnél az OnAfterRefresh esemény jön létre miután CD lemez lett behelyezve, illetve eltávolítva a meghajtóból és a property-k adatai már frissültek.
Ha a ScanFloppy értéke igaz, akkor a komponens automatikusan frissíti a floppy meghajtók adatait. Ennek hátulütője az, hogy ha nincs lemez a floppy meghajtóban, akkor hiba ugyan nem keletkezik, mivel a komponens figyel erre, de amíg próbálkozik elérni a lemezt, az néhány másodpercig feltartja programunkat.
A RefreshItems eljárás hívásával bármikor frissíthetjük manuálisan is a property-k tartalmát. Például mielőtt floppy-t használna programunk érdemes ezt meghívni, majd ellenőrizni, hogy tényleg van-e lemez a meghajtóban, mielőtt használnánk azt.
A komponens működése azon alapszik, hogy amikor annak Loaded metódusa fut, akkor frissíti az Items property elemeinek számát és azok értékeit. A Loaded minden olyan esetben futtatásra kerül, amikor a komponens betöltődik. Így például fut miután a Delphi-ben megnyitottuk az alkalmazásunkat, de fut akkor is amikor elindítjuk programunkat. A Loaded tehát meghívja a RefreshItems-t. Itt töröljük az Items property összes elemét, majd ismételten feltöltjük azt. A rendszerben elérhető meghajtók nevét a GetLogicalDriveStrings függvénnyel kérdezzük le. Itt egy olyan sztringet kapunk vissza, hogy például 'a:\c:\d:\e:\'. Ebből a sztringből egy ciklus segítségével válogatjuk ki az egyes meghajtókat. Minden meghajtónál meghívjuk az AddDriveItem belső eljárásunkat, mely összegyűjti az adott meghajtóról a szükséges információkat. Miután a ciklus lefutott meghívjuk az OnAfterRefresh eseményt, hogy jelezzük az alkalmazásunk felé, hogy változott az Items property elemeinek értéke.
Arra az esetre, ha szerkesztési időben vagyunk és például egy CD lemez behelyezése miatt került sor a frissítésre, akkor az adott Form Designer.Modified hívásával érjük el azt, hogy az Object Inspector tartalma is frissüljön.
procedure TDrivesInfo.RefreshItems;
var
a: array[0..127] of char;
i, l: integer;
s: string;
begin
FItems.Clear;
l:=GetLogicalDriveStrings(128, a);
s:='';
for i:=0 to l-1 do begin
case i mod 4 of
3: begin
AddDriveItem(UpperCase(s));
s:='';
end;
else s:=s+a[i];
end;
end;
if Assigned(FOnAfterRefresh) then begin
FOnAfterRefresh(Self);
end;
if csDesigning in ComponentState then begin
(Owner as TCustomForm).Designer.Modified;
end;
end;
Nézzük most mi is történik az AddDriveItem eljárásban. Itt a GetDriveType függvénnyel kérdezzük le a meghajtó típusát. Ezek után megpróbáljuk beállítani az adott meghajtót, mint aktuális könyvtárat. Ha ez sikerül, akkor nyilván az eszköz üzemkész, ha nem, akkor nincs behelyezve lemez. Ez utóbbi nyilván csak floppy, CD esetén jöhet szóba.
Ha elérhető a meghajtó, csak akkor tudjuk a további információkat lekérdezni. Ehhez a GetVolumeInformation függvényt használjuk. Végső lépésként már csak a lemez méret adatait kell megtudnunk a GetDiskFreeSpaceEx segítségével.
Annak figyelésére hogy mikor kerül be új CD lemez, illetve mikor távolítja el a felhasználó, a WM_DEVICECHANGE üzenetet kell figyelnünk. Kisebb probléma, hogy üzenetet csak olyan ablak kaphat, mely rendelkezik üzenetkezelő eljárással, van ablak azonosítója. Mivel a TComponent nem egy ilyen osztály, így komponens konstruktorában az AllocateHWnd függvény hívásával létrehozunk egy ablakazonosítót (Handle) és a WndProc függvényünket megadjuk, mint ablakkezelő eljárást. Ettől kezdve már tudjuk figyelni a kérdéses Windows üzenetet.
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 148. 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!
|