A Clipper 5.0 készítõi egy speciális adattípus - az objektum - fogalmát vezették be. Hangsúlyozzák azonban, hogy a Clipper nem objektumorientált nyelv, csupán annak néhány elemét tartalmazza.
Az objektumok egyszerû adatértékek, amelyek elõre definiált szerkezettel és viselkedésmóddal rendelkeznek. A néhány elõre definiált objektumtípust - amelyet osztályoknak neveznek - a rendszer kezeli. A létezõ osztályokon kívül újak létrehozása nem lehetséges.
Minden osztályhoz speciális függvények és változók tartoznak, amelyek alkalmazásával az illetõ osztály objektumainak állapota lekérdezhetõ, illetve módosítható. Ezek használata során egy-egy üzenetet kell továbbítani az objektum számára. Ez az üzenetküldés speciális szintaktikai szabályok betartásával, és az üzenetküldõ operátorral ( : ) történik.
Formája:
< objektum > : < szelektor > [ ( < argumentumlista > ) ]
A Clipper osztályai:
Egy hibaobjektum a jelentkezõ hibajelzésekrõl ad információkat. Amikor egy hibajelzés jelentkezik, létrejön egy hibaobjektum, és ez, mint egy argumentumérték átadódik az ERRORBLOCK függvénynek.
A hibaobjektum a BEGIN SEQUENCE utasítás BREAK kulcsszavának alkalmazásával egy RECOVER utasításhoz irányítható, ahol lokális hibakezelésre használható fel.
Külsõ hivatkozási változók például a következõk:
canDefault |
alapértelmezés visszaállítása |
canRetry |
hiba utáni helyes visszaállítást jelzi |
description |
hibakód karakteres leírása |
filename |
a hibával összefüggõ állomány neve |
operation |
a hibát eredményezõ mûvelet leírása |
genCode |
Clipper-hiba kódja |
osCode |
az operációs rendszer hiba-kódja |
subCode |
alrendszer-specifikus hibakód |
tries |
a hibás mûvelet javítási kísérleteinek száma |
Az adatok beviteli és szerkesztési mechanizmusának lelke.
A GET objektumok segítségével történik az adatok formázása, szerkesztése, beleértve a kurzormozgatást és a helyességellenõrzést.
A GET objektum az egyes változókhoz kapcsolódik, de közvetlenül nem tudja manipulálni azokat, csak egy kódblokkon keresztül. A GET objektum átveszi a változó értékét tartalmazó kódblokkot. Ezt az értéket megjeleníthetõ formára konvertálja, és bemásolja a szerkesztési pufferbe. A szerkesztési puffer tartalma jelenik meg a képernyõn, amely már szerkeszthetõ. Az itt végrehajtott módosítások érvényre jutnak a GET változó értékében.
Külsõ hivatkozási változók például a következõk:
badDate |
jelzi a hibás dátumot a szerkesztési pufferben |
block |
a GET-et a változóval összekötõ kódblokk |
changed |
jelzi a puffermódosítást |
col |
a GET oszlopszáma |
decPos |
a tizedespont helye a szerkesztési pufferben |
hasFocus |
a GET objektum input fókuszának jelzése |
name |
a GET változó neve |
pos |
a szerkesztési puffer kurzorpozíciója |
row |
a GET sorszáma |
Külsõ eljárások:
assign |
átadja a szerkesztési puffer tartalmát a GET változónak |
display |
a GET megjelenítése a képernyõn |
reset |
törli a GET belsõ állapotinformációit |
killFocus |
az input fókusz törlése |
setFocus |
fókuszt ad az objektumnak |
end, home, left right |
kurzor mozgató eljárások a sor végére, elejére, eggyel balra illetve jobbra |
wordLeft, wordRight |
kurzor mozgató eljárások egy szóval balra illetve jobbra |
backspace |
kurzortól balra álló karaktert törli |
delLeft, delRight |
kurzortól balra illetve jobbra álló karaktert törli |
delWordLeft, delWordRight |
kurzortól balra illetve jobbra álló szót törli |
insert, overStrike |
karakter beszúrása illetve átírása a szerkesztési pufferben |
A TBrowse objektum a táblázatos formában történõ adatáttekintés és formázás hatékony és rugalmas eszköze.
Egy TBrowse objektum egy vagy több TBColumn objektummal áll kapcsolatban. Egy TBColumn objektum az adatáttekintõ táblázat egy oszlopával kapcsolatos információkat hordozza.Egy mûvelet hatására a TBrowse objektum átveszi a kódblokk értéke szerinti adatokat, amelyek sorokba és oszlopokba rendezve megjelennek a képernyõ kijelölt területén.
A TBrowse objektum egy belsõ, úgynevezett browse kurzorral rendelkezik. Az az adat, amelyre a browse kurzor mutat, alászínezõdik, ugyanakkor az aktuális kurzor ennek az adatnak az elsõ karakterén áll.
Osztályszintû függvények:
TBrowseNew: |
egy új TBrowse objektum létrehozása |
egy új TBrowse objektum létrehozása adatbázishoz |
Külsõ hivatkozási változók például:
autoLite |
alászínezést ellenõrzõ logikai érték |
colPo |
aktuális kurzoroszlop |
colSep |
oszlopelválasztó karakter |
freeze |
befagyasztott oszlopok száma |
headSep |
a fejrészt elkülönítõ karakter |
hitBottom |
az adatterület végét jelzi |
rowPos |
az aktuális kurzorpozíció sora |
Kurzormozgató eljárások:
down, up |
kurzort egy sorral lejjebb / feljebb viszi |
home, end |
a kurzort a látható adat elejére / végére viszi |
left, right |
a kurzort egy oszloppal balra / jobbra viszi |
Vegyes eljárások:
addColumn |
egy TBColumn objektum hozzáadása a TBrowse objektumhoz |
getColumn |
a megadott TBColumn objektum lekérdezése |
setColumn |
egy TBColumn objektum felcserélése egy másikkal |
TBColumn |
Adatmegjelenítési osztály |
Egy TBColumn objektum valamely TBrowse objektum egy adatoszlopával kapcsolatos információkat tartalmazza.
Osztályszintû függvény:
TBColumnNew:egy új TBColumn objektum létrehozása
Külsõ hivatkozási változók például:
block |
oszlop értékét tartalmazó kódblokk |
colSep |
az oszlopelválasztó karakter |
footing, heading |
lábjegyzet / fejrész oszlop |
footSep, headSep |
a lábjegyzetet / fejrészt elkülönítõ karakter |
width |
a képernyõ oszlopszélessége |
A felhasználó definiálhat saját osztályokat a következõ szintaxissal:
DEFINE CLASS OsztályNév1 AS SzülõOsztáy [OF osztálykönyvtár] [OLEPUBLIC] [[PROTECTED | HIDDEN PropertyNév1, PropertyNév2 ...] [Object.]PropertyNév = kifejezés ...] [ADD OBJECT [PROTECTED] OjektumNév AS OsztályNév2 [NOINIT] [WITH propertylista]]... [[PROTECTED | HIDDEN] FUNCTION | PROCEDURE Név [_ACCESS | _ASSIGN] | THIS_ACCESS [NODEFAULT] utasítások [ENDFUNC | ENDPROC]]... ENDDEFINE
A SzülõOsztály egyike lehet a FoxPro bázisosztályoknak, amik különbözõ controlokat és egyéb segédeszközöket valósítanak meg.
Az alábbiak a FoxPro 8.0 Õsosztályai:
CheckBox |
Collection |
Column |
ComboBox |
CommandButton |
CommandGroup |
Container |
Control |
Cursor |
CursorAdapter |
Custom |
DataEnvironment |
EditBox |
Exception |
Form |
FormSet |
Grid |
Header |
Hyperlink |
Image |
Label |
Line |
ListBox |
OLEControl |
OLEBoundControl |
OptionButton |
OptionGroup |
Page |
PageFrame |
ProjectHook |
Relation |
Separator |
Shape |
Session |
Spinner |
TextBox |
Timer |
ToolBar |
XMLAdapter |
XMLTable |
XMLField |
Ezek közül fontos számunkra a CUSTOM, valamint az EXCEPTION osztály.
A CUSTOM osztályból tetszõleges osztályokat származtathatunk.
Az EXCEPTION osztály egy új lehetõség a FoxPro 8.0-ban. Ezen osztályból szármasztatott osztályokat használhatjuk a kivételkezelésben.
A tagok elrejthetõk, és kezdõértékkel láthatók el.
Az ADD OBJECT parancs egy OsztályNév2 típusú objektumot ad az
osztályhoz.
A NOINIT hatására ennek az INIT metódusa nem fut le az objektum létrehozásakor,
a WITH kulcsszó után inicializálhatjuk a felsorolt propertyket.
A FUNCTION és PROCEDURE kulcsszavakkal definiálhatunk tagfüggvényeket.
A NODEFAULT kulcsszóval elérhetjük, hogy az átdefiniált metódusok meghívása esetén ne hívódjon meg az
alapértelmezett implementáció (a szülõosztály változata).
A DODEFAULT(par1, par2, …) hívással ezt bármikor meghívhatjuk.
Tagfüggvényen belül az aktuális objektumra a THIS referenciával hivatkozhatunk.
Az _ACCESS és _ASSIGN metódusok olyan metódusok, amik automatikusan meghívódnak,
ha egy property értékét megváltoztatjuk, vagy lekérdezzük.
Ezekkel megvalósítható értékellenõrzés is.
A THIS_ACCESS metódus mindig meghívódik, ha egy objektumon bármilyen mûveletet végzünk, paraméterként megkapja, hogy melyik tagján végeztünk mûveletet. Ennek egy objektumreferenciát kell visszaadni, általában a THIS-t.
Objektumot a CREATEOBJECT(’OsztályNév’, par1, par2, ...) paranccsal hozhatunk létre, ezzel egy rá mutató referenciát kapunk vissza. A rendszer meghívja az objektum INIT eseményét a megadott paraméterekkel. Az objektumok memóriában történõ elhelyezését nem tudjuk befolyásolni. A törlésükrõl a rendszer gondoskodik (GC).
A CREATE CLASS és a MODIFY CLASS parancsok hatására a Class Designer segítségével futási idõben is definiálhatunk osztályokat, amibõl késõbb objektumokat hozhatunk létre. A Class Designer-t futtatáson kívül is használhatjuk, a fentieknek megfelelõ osztálydefiníciót interaktív módon is elkészíthetjük.
A Visual FoxPro bázisosztályok egy halom eseménykezelõ metódust definiálnak, amelyek automatikusan meghívódnak az adott esemény bekövetkezésekor. Ezek természetesen átdefiniálhatók. A számunkra legfontosabb osztályok:
Az osztályok fontosabb eseményei
Destroy |
az objektum megszûnésekor következik be |
Error |
futási idejû hiba hatására hívódik meg. Használható hibakezelésre. |
Init |
az objektum létrehozásakor fut le |
A CUSTOM osztály néhány fontosabb attribútuma
Application |
az alkalmazásobjektumra mutató referencia |
BaseClass |
az õsosztály neve |
Class |
az osztály neve |
ClassLibrary |
az osztályt tartalmazó osztálykönyvtár fájlneve |
Comment |
információt tartalmaz az osztályról |
Name |
az objektum hivatkozási neve |
WhatsThisHelpID |
help topic azonosítója |
Az EXCEPTION osztály attribútuma
BaseClass |
az õsosztály neve |
Class |
az osztály neve |
ClassLibrary |
az osztályt tartalmazó osztálykönyvtár fájlneve |
Comment |
információt tartalmaz az osztályról |
Name |
az objektum hivatkozási neve |
Details |
a Message attribútumra utaló információ |
ErrorNo |
a hiba száma |
LineContents |
a kivétel-objektumot létrehozó sor tartalma |
LineNo |
a kivétel-objektumot létrehozó sor száma |
Message |
hibaüzenet |
Procedure |
a hibát kiváltó sor taralma |
StackLevel |
a verem szint a kiváltás pillanatában |
Tag |
extra adatokat tartalmaz a program számára |
UserValue |
a THROW generált érték |
Lehetõségünk van osztálykönyvtárak (.vcx) létrehozására. Erre használhatók a következõ eljárások
üres könyvtár létrehozása
CREATE CLASSLIB < name >
könyvtár bezárása
RELEASE CLASSLIB < ClassLibraryName1 > | ALIAS < AliasName1 > [, < ClassLibraryName2 > | ALIAS < AliasName2 > . . . ] [IN < APPFileName> | < EXEFileName > ]
osztály hozzáadása
ADD CLASS < ClassName > [OF < ClassLibraryName1 >] TO < ClassLibraryName2 > [OVERWRITE]
könyvtár megnyitása
SET CLASSLIB TO < ClassLibraryName > [IN < APPFileName > | < EXEFileName > ] [ADDITIVE] [ALIAS AliasName]