Az DBase nyelv család

Objektum-orientált programozás

Osztályok,objektumok

Clipper:

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:

Error : Hibakezelõ osztály

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
Get : Adatbeviteli osztály

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
TBrowse : Adatáttekintési osztály

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

Foxpro:

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]