Kézi foxpro 2
Eseményvezérelt alkalmazásmodell
Tegyük fel, hogy mi határozza meg az eseményvezérelt alkalmazásmodellt a FoxPro-ban. Programozási eseményvezérelt annak alapvető alkalmazások azt jelenti, hogy van a számítógépen néhány képernyőt, és váltás közöttük az egérrel jelentkezik aktiváló kódot, működését vezérli minden egyes képernyőn. Ha a képernyőt mások zárják le, a menü segítségével hívhatja fel. A képernyő mindaddig fennáll, amíg a felhasználó bezárja. Az alkalmazás elvár egy "eseményt" (a menüpont kiválasztása, kattintás az egérrel), ez adja a nevet az "eseményvezérelt" kifejezésnek.
A Visual Basic vagy Clipper 5.0-vel ellentétben a FoxPro nem adja meg az esemény várakozási állapotát. Ezt az állapotot kell létrehoznod. Ezt a READ parancs segítségével végezzük.
A READ elvárja, hogy adjon meg adatokat a @ parancs által létrehozott mezőben. GET. mint mindig is, de emellett a csapat készen áll arra, hogy reagáljon minden olyan eseményre, amely potenciálisan azt szeretné elérni. Az ilyen események feldolgozásához VALÓSZATOS záradék van.
Ha a READ VALID konstrukciót func () használjuk. akkor a READ aktív marad, amíg a func () visszatér .T. (Igaz). Addig a pályázat röplabdázni tud, mint a röplabda. Erre azonban az egyszerűség véget ér. Ettől a pillanattól kezdve a helyzet bonyolult.
A menü opció kiválasztásakor a FoxPro végrehajtja a hozzá tartozó parancsot vagy eljárást. Azonban nincs garancia arra, hogy az Ön tevékenységei a VALID záradékhoz tartozó logikát kiváltják. amikor a READ parancs látható. Kiderült, hogy ennek is gondoskodnia kell. Ha olyan ablakra kattintasz, amely nem a csúcson van, meg kell találnia és futtatnia kell a megfelelő .SPR modult. A FoxPro nem kínál mechanizmust ezt automatikusan. Mindazonáltal vannak olyan pontok, ahol beavatkozhatsz az események természetes természetébe, és elküldheted őket egy kényelmes csatornára.
Az egyik ilyen pontot a READ DEACTIVATE klauzula biztosítja a .SPR modulban. A FoxPro képernyőgenerátor minden képernyőt vagy képernyőkészletet a READ parancs segítségével szállít. amelyhez kódkódokat csatolhat. Ezek a blokkok olyan mondatokhoz kapcsolódnak, amelyek a READ: SHOW, SETUP, CLEANUP, ACTIVATE és DEACTIVATE használatával együtt használhatók. Ezek a javaslatok alkotják a FoxPro-ben az eseményvezérelt alkalmazások programozásának kulcsa első részét, READ VALID a második rész, de később fogunk beszélni.
Amikor a GENSCRN végrehajtja a kód generálását, a telepítő kódot a létrehozandó program elején helyezik el, és a lezáró blokk (Cleanup Code) végére kerül. Egy SPR fájl közepén a generátor GET parancsokat helyez. majd READ. A READ-nek legfeljebb három mondata lehet, amelyek mindegyike egy kódblokk vagy egy eljáráshívás lehet.
A SHOW záradékhoz tartozó kód. minden alkalommal végrehajtódik, amikor a SHOW GETS parancs végrehajtásra kerül. ezért célszerű olyan logikát beilleszteni, amely frissíti az aktuális képernyő tartalmát. Ha nincs semmi frissítés, kivéve a GET mezők tartalmát. Hagyja ezt a mondatot üresen. Az eseményvezérelt alkalmazások esetében azonban az ACTIVATE és DEACTIVATE záradékokhoz tartozó kódot kell megadni. rendkívül fontos.
Az ACTIVATE-hez társított kód. végrehajtódik minden alkalommal, amikor megpróbálja felvenni a megfelelő képernyőt, tegye aktívvá. Abban az esetben, ha a program rendelkezik vezérlésekkel a rekordok közötti navigáláshoz, lehetséges, hogy beilleszt egy kódot, amely garantálja, hogy megy a kívánt munkaterülethez ehhez a képernyőhöz, például a SELECT <имя рабочей области>. Ez az ACTIVATE leggyakoribb alkalmazása, és gyakran az egyetlen.
Éppen ellenkezőleg, a DEACTIVATE rendkívül fontos szerepet játszik az eseményvezérelt alkalmazások létrehozásában. Próbálja ki: Indítsa el a FoxPro-t, határozzon meg egy pár windowsot és aktiválja mindkettőt. Most váltakozva kattintson az egyes ablakokra, és nyissa meg az Ablak menüt (Alt + W), nézze meg, mi történik az ablakok nevének felsorolásával. Látni fogja, hogy a sorrend változik. Ez a megközelítés az eseményvezérelt alkalmazások építéséhez.
Számos eseményvezérelt alkalmazásban megtalálja azt a funkciót, amely leolvassa az ablaknevek listáját az utolsó elem meghatározásához. Miért? Nem használható a WONTOP () függvény. Lehet, ha nem használsz képernyőkészlőket. Most már általános gyakorlat az, hogy egyetlen ablakot használunk a vezérlőelemek között a rekordok közötti váltáshoz, az üzemmódok közötti váltáshoz stb. Ennek a funkciónak a megszerzéséhez létre kell hoznia egy sor képernyőt, amely a Control ablakból és az ablakból, majd az ACTIVATE . győződjön meg arról, hogy a következő sorokat adja hozzá:
A WINDOW AKTIVÁLÁSA (az ablak neve)
A VEZÉRLÉS BEÁLLÍTÁSA
Ennek eredményeképpen kiderül, hogy az ablak nem a tetején található, hanem az utolsó előtti. (A gyakorlatban az ablakok listáját fentről lefelé olvashatja, az ablakok nevét pedig a Control néven tárolja).
Hasonlóképpen, nincs gyönyörű út annak meghatározására, hogy melyik ablakot bezárták. Ezért a recepció gyakori, ha a bezárandó ablak neve átmásolódik paraméterként a READ DEACTIVATE kód alatt.
Hogyan történik ez az eseményvezérelt programozás? Először azt feltételezzük, hogy amíg a képernyőn legalább egy aktív ablak jelenik meg, a felhasználó megnyitja az ablakokat, kiválasztja őket a menüből. Használja a következő parancsot:
AZ adatbázis 1 KIVÁLASZTÁSA 1. DO következőprog A "Contact.Spr"
A mellékelt program tartalmazza a NextProg funkciót. a 14-1. listán és a 14-3.
Ez azt jelenti, hogy „ha az adott pillanatban nincs aktív eljárást, futtassa az egyik, hogy választották a menüből, egyébként módosítsa a változó értékét NextProgram és kiadja a CLEAR olvasni”.
A NextProgram az "események sorát" nevezi. Komplex alkalmazásokban, például Tom Rettig irodájában. az események sorozata többszintű lehet, előfordulhat, hogy több kötelező műveletet kell végrehajtania egy bizonyos mód befejezése után, és itt van olyan mechanizmus létrehozása, amely a helyzetének függvényében meghatározza a cselekvéseket. Az eseményvezérelt programozás nem a gyengítéseket jelenti. Egyszerű példánkban azonban a várakozás is egyszerű.
Miért olvassa el a READ. Miért nem csak DO (NewProgram). Ennek az az oka, hogy meg kell tisztítanunk az aktuális feladatot, és a CLEAR READ arra kényszerít, hogy végrehajtsa a READ VALID záradékot. Ez a megközelítés lehetővé teszi, hogy az összes képernyőmódosítási eljárást egyetlen csatornán keresztül irányítsa.
A READ VALID alatt futó eljárás. az Események. A 14-2. Felsorolás tartalmazza.
Három kölcsönösen kizáró esemény lehet:
1) az alkalmazás befejeződött - a felhasználó kiválasztotta a Kilép gombot a menübe;
2) a felhasználó egy másik üzemmódot választott a menüben;
3) a felhasználó rákattintott az egérrel az ablakra.
Példánkban a számjegyekkel végződő ablakok nevét használjuk, ezt azért tettem, hogy egyszerűsítsük a kódot READ VALID-ben. Ha az ablak neve multiwin. akkor a MultiRead tartalmaz egy ablakszámot, amely az ablak nevének visszaállításához használható. Ez megkönnyíti a kód olvasását. A programokban nincsenek kapcsolódó ablakok, de ha igen, akkor az én módszerem jól működik.
Így működik az eseményvezérelt alkalmazás a FoxPro-ban. A Visual FoxPro-ban előfordulhat, hogy nem kell mindezen nehézségekkel átverni. Időközben ez így történik.
Variációk ugyanazon a témán
Az eseményvezérelt alkalmazások létrehozásának megközelítésének számos változatát fejlesztettem ki, és úgy gondolom, hogy érdekesnek és hasznosnak bizonyulnak. Ezeket a lehetőségeket a következő szakaszokban ismertetjük.
A CLEAR READ (READ READ) eredmények a READ VALID alapértelmezett READ alkalmazásban lévő kód kényszerfuttatását eredményezik. Miért nem használhatja ugyanazt az ablaknevet több .SPR fájlban, és csak új program létrehozása nélkül hívhat más programokat? Megpróbáltam, és néhány perc múlva egy működő modellt készítettem.
A példa három fájlt tartalmaz Contact1, Contact2, Contact3. Az ablaknak mindhárom képernyőjén elérhető a Contact név. Ne feledje, hogy a GenScrn ilyen kódot hoz létre:
IF WVISIBLE ("kapcsolat")
ÜZEMBE HELYEZÉS esetén lépjen kapcsolatba az SAME programmal
ELSE
AKCIÓ BEÉRKEZÉSE vegye fel a kapcsolatot NOSHOW
ENDIF
. néhány kódot.
HA NEM LEHETSÉGES ("kapcsolat")
AKTÍV ABLAK névjegyzék
ENDIF
A következő "oldal" felhívásához tegye a következőket:
NextProgram = "Contact3.Spr"
CLEAR READ
Példánkban a GET-nek bizonyos pozíciókat kell megtennie az átfedések elkerülése érdekében. Ha nem tettem volna meg, akkor ezt megtenném:
IF WONTOP () = "KAPCSOLAT"
ÜZEMBE HELYEZÉS esetén lépjen kapcsolatba az SAME programmal
@ 10.1 CLEAR TO 15.57
ENDIF
Egy másik megközelítés megtalálható, ha megnézed azt a kódot, amely több képernyő kimenetét rendezi, amikor a felhasználó kiválasztja a Névjegy opciót a főmenüből.
Az egyik módszer, hogy támogassa a szülő-gyermek fájlokat magában méretének megváltoztatásával a tömb adatokat a gyermek rögzíti és megjeleníti az eredményeket a legerősebb az új GET - tárgyak - egy görgethető listában. A tömb módosul a SHOW klauzulához kapcsolódó eljárásban a szülő képernyőn.
FOR i = 1 nActivCnt
aActivity [i, 6] = DTOC (aActivity [i, 2]) + "|" +;
aActivity [i, 3] + "|" +;
aActivity [i, 4] + "|" +;
aAktivitás [i, 5]
ENDFOR
(Ugyanazt a dolgot is megkaphatja egy SQL utasítással, amely gyorsabb is lehet):
SELECT ACTIVITY.AID, ACTIVITY.DATE, ACTIVITY.TIME, ACTIVITY.TYPE,;
ACTIVITY.CONTACT, DTOC (ACTIVITY.DATE) + '| '+ ACTIVITY.TIME +' | +;
ACTIVITY.TYPE + '| '+ ACTIVITY.CONTACT;
AKTIVITÁSRÓL, KAPCSOLAT;
WHERE CONTACT.ID = ACTIVITY.ID;
INTO ARRAY aActivity
A görgetési listához a képernyő létrehozásakor meg kell jelölnie az 1. elemet, és be kell írnia a kifejezést (Expression) 6 (a fogadott tömb hatodik elemét fel kell sorolni). Ezután kiválaszthat egy elemet a listából, hogy megtalálja a megfelelő bejegyzést a gyermek fájljában.
A VALID szakaszban szereplő kód így néz ki:
IF nActivCnt> 0
SELECT tevékenység
HELYSZÍNE segély = aktivitás [nActivity, 1]
ENDIF
NextActivity = .T.
NextProgram = "activity.spr"
CLEAR READ
Ebben az esetben megtalálhatunk egy gyermekrekordot, ha létezik, vagy hozzáadhat egy újat.
A FoxPro 2.0 számos irányelvet tartalmaz a generátor - parancsok számára, amelyek szabályozzák a kód generálását. A 2.5-ös verzióban számos más direktíva hozzáadásra került, néhány közülük nagyon hasznos.
Az eseményvezérelt FoxPro alkalmazások mindig hatalmas mennyiségű ismétlődő kóddal rendelkeztek. A képernyő-létrehozó programok telepítési és záró részei, ha nem teljesen azonosak, legalábbis nagyon hasonlóak. A 2.5-ös verzió új irányelvet kínál, amely csökkenti a hiba veszélyét, ha ismételten ugyanazt a kódot írja be vagy másolja - ez a #INSERT irányelv.
Az új irányelv csodálatos eszköz. Ha a programok telepítési, zárási, ellenőrzési és egyéb részei közös funkcióval rendelkeznek, csak egyszer kell írni a kódot. A példában (Listing 14-3), kínálok egy pár standard eljárásokkal setup.gen (telepítő eljárás), show.gen (frissítési folyamatában változó a képernyőn), valamint számos egyedi alkalmazások, de az ismétlődő részek a kód - contact.set (a kód telepítési része) és a contact.cln (a kód utolsó része). Ha módosítania kell az alkalmazás működését, csak több szabványos modul javítását kell elvégeznie.
Ne feledje, hogy a kód módosítása a szabványos eljárásokban nem fogja eredményezni a projektmenedzser számára, hogy regenerálja a kódot képernyők létrehozásához. Miután elvégezte a változtatásokat, újra össze kell állítania a projektet a [] Build [All] opcióval. Törölheti azokat a .SPR fájlokat is, amelyekre a módosított modulok megyek, de könnyen elfelejthető.
Számos megközelítést ajánlottam fel. Biztos vagyok benne, hogy sok más megoldást talál.