|
|
Utoljára megnyitott állomány nevek listája
|
|
Példaprogram letöltése
7474 bájt
|
Olyan alkalmazásokban, ahol különböző fájlokat szerkesztünk, például szövegszerkesztők, vagy maga a Delphi, a Fájl menüben találhatunk egy listát az utoljára megnyitott fájlokról. Mindegyik fájlhoz egy menüpont tartozik, amit kiválasztva az adott fájlt betölthetjük. Ha hasonló alkalmazást szeretnénk készíteni, akkor ennek a feladatnak a megoldása viszonylag bonyolult, sok programozást kíván. Kivéve, ha van egy komponensünk, ami mindezt a feladatot magára vállalja, a lista kezelésétől, tárolásától kezdve egészen a menübe való beillesztésig.
A mellékelt példaprogram megnyitása előtt a MRUList.pas-ban lévő komponenst telepítenie kell a Delphi alá.
A komponens feladata abból áll, hogy kezel egy tetszőleges számú elemből álló listát, mely lista elemeit egy szintén tetszőlegesen megadható menüpont után beilleszt egy menübe. Amikor a listához egy új elemet adunk, akkor az kerül a lista elejére, míg a többi elem egy hellyel lejjebb kerül. Ha a megadott számúnál több elemet tartalmaz a lista, akkor az utolsó elemek törlődnek. A menüpontok kezelését is meg kell oldani, méghozzá egy eseménnyel, ami akkor jön létre, amikor valamelyik menüpontot kiválasztotta a felhasználó. Ennél az eseménynél megkapjuk a kiválasztott menüponthoz tartozó lista elemet, illetve annak sorszámát. A listának akkor van értelme, ha azt el is lehet menteni, és a program újbóli indításakor az utoljára használt lista jelenik meg a menüben.
A listának nem feltétlenül kell fájlneveket tartalmaznia, de valószínűleg ez a leggyakoribb alkalmazás.
A komponens MRUList property-je TStringList típusú, és ebben adhatjuk meg a lista elemeit. Az elemek maximális száma a MaxEntries property-ben adható meg. Ha Numbers property értéke igaz, akkor a menüben a menüpontok előtt a sorszámuk is megjelenik. A MenuItem property-ben kell megadni azt a menüpontot, ami után a lista elemek megjelennek a menüben. Ez lehetőleg egy elválasztó vonal legyen (Caption='-'). Az elemek után egy elválasztó vonal automatikusan megjelenik, ezért ezt nem kell előzőleg létrehozni.
A lista mentése a Registry-be történik, ezért a kulcsot a RegistryKey property-ben meg kell adni. A listát a Save metódussal lehet menteni, míg a Load-dal betölteni. Az eljárásoknak nem kell külön paramétert megadni. Természetesen a lista fájlba is elmenthető, illetve onnan betölthető, az MRUList property SaveToFile, illetve LoadFromFile metódusaival.
A lista törléséhez a Clear eljárást kell meghívni.
A menüpontokat egy egyedi azonosítóval látjuk el, amit a Tag property-ben fogunk tárolni. Hogy ne ütközzön a már meglévő menüpontokkal ez az érték, ezért létrehozunk egy típusos konstanst, aminek az értéke lesz az egyedi azonosító kiinduló értéke. Ennek a konstansnak az értékét programból is megváltoztathatjuk, de nem valószínű, hogy erre szükség van.
FIRSTTAGID: longint = 10000;
Minden menüpont OnClick eseményéhez hozzárendeljük a DoClick eljárást. Ebben az eljárásban generálunk egy OnClick eseményt, amihez egy külön típust definiálunk. Az eseménynek a szokásos Sender-en kívül még plusz két paramétere van. Az első aTMenuItem típusú, és a kiválasztott menüpont objektumát adja meg, míg a második a kiválasztott lista elem. Ha a menüpontok sorszámmal vannak ellátva (Numbers=true), akkor is az eredeti sztringet kapjuk meg.
A menüpontok létrehozása, és hozzáadása a menühöz az AddMenuItems eljárásban történik. Ebben először meghívjuk a RemoveMenuItems eljárást, ami törli az előzőleg létrehozott menüpontokat. A törlés egy ciklusban történik, amiben végigmegyünk az adott menü összes menüpontján, és ahol a Tag property értéke nagyobb, vagy egyenlő a FIRSTTAGID konstansban megadott értéknél, azt a menüpontot töröljük.
i:=0;
while i<FMenuItem.Parent.Count do begin
if FMenuItem.Parent.Items[i].Tag>=FIRSTTAGID then
FMenuItem.Parent.Delete(i) else inc(i);
end;
Miután töröltük a menüpontokat, az ndx változóban eltároljuk a MenuItem property-ben megadott menüpont index-ét, illetve ahhoz még hozzáadunk egyet, mivel az első létrehozandó menüpontot ezután a menüpont után kell beszúrni.
ndx:=FMenuItem.Parent.IndexOf(FMenuItem)+1;
Egy ciklussal végigmegyünk a lista elemein, és mindegyikhez létrehozunk egy TMenuItem típusú objektumot. Beállítjuk ennek Tag és Caption property-jeit, és az OnClick eseményhez hozzárendeljük a komponens DoClick eljárását. Ezután beszúrjuk az új menüpontot a megfelelő sorszámú pozícióba.
for i:=0 to FMRUList.Count-1 do begin
mitem:=TMenuItem.Create(self);
mitem.Tag:=FIRSTTAGID+i; mitem.Caption:=FMRUList[i];
if FNumbers then mitem.Caption:=IntToStr(i+1)+'. '+mitem.Caption;
mitem.OnClick:=DoClick;
FMenuItem.Parent.Insert(ndx+i, mitem);
end;
Miután az összes listában lévő elemet beszúrtuk a menübe, még egy elválasztó vonalat is létrehozunk a menüben. Ez egy egyszerű menüpont, aminek a Caption property-jébe egy "-" jelet kell írni.
if FMRUList.Count>0 then begin
mitem:=TMenuItem.Create(self);
mitem.Tag:=FIRSTTAGID+FMRUList.Count;
mitem.Caption:='-';
FMenuItem.Parent.Insert(ndx+FMRUList.Count, mitem);
end;
A mellékelt példaprogramból a komponens használata egyértelműen látszik. Amikor megnyitunk egy fájlt, a komponens Add eljárásával hozzáadjuk azt a listához, ezután a komponens a többit elintézi. Beszúrja az új fájlnevet menübe, és törli a már felesleges elemeket. Amikor kiválasztjuk az egyik fájlnevet a menüből, akkor létrejön egy OnClick esemény, amiben megkapjuk a kiválasztott fájl nevét.
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 467. 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!
|