Borland Delphi for Windows
leírás

                      1997. Szabó Anikó (foboszi@ludens.elte.hu)

 

 

Tartalomjegyzék:

I. Bevezetés
II. Az Object Pascal nyelv
III. Az Object Pascal objektumai
IV. Kivételkezelés
V. Dinamikusan szerkesztheto könyvtárak
VI. A Delphi 2. és 3. verziója

 

I. Bevezetés

     A Borland cég 1995 - ben jelentette meg a Delphi első verzióját. Ezt követte 1996-ban a második, majd idén a harmadik verzió bemutatása. A nyelv alapvetően a Turbo Pascal nyelv továbbfejlesztett objektum-orientált verziója. A Delphi megalkotói három fontos szempontot tartottak szem előtt a nyelv elkészítésekor, melyek a következők:

     A programozónak a fejlesztés során lehetősége van választani, hogy a hagyományos programírással készítse el az alkalmazást, vagy pedig az elemek grafikus megjelenítésével, amely lényegesen gyorsítja a folyamatot.

Ebben a leírásban nem lesz szó a nyelvtörténeti áttekintéséről, az integrált fejlesztői környezetről valamint az adatbázis - kezelésről, ezekről bővebb információk találhatóak Vissy Balázs Delphi leírásában.

     Ez a leírás az 1997. évi ELTE programtervező - matematikus szak Programnyelvek III. szemináriumán elhangzott előadás anyaga valamint a Delphi - út a jövőbe ( ComputerBooks,1995. ) című könyv alapján készült.

 

 

II. Az Object Pascal nyelv

     A Delphi alapvetően a Turbo Pascal nyelvre épült, de szükséges volt a nyelv kibővítése új elemekkel, melyek lehetővé teszik a Windows alatti alkalmazások készítését.

1. Új típusok

     A Windows igényei szükségessé tették többek között új egész és logikai típusok bevezetését, melyek a következőek :

Egész típusok
Shortint elojeles 8 bit
Smallint elojeles 16 bit (Csak Delphi 2, 3)
Integer elojeles rendszerfüggo! (Delphi 1 - 16 bit; Delphi 2,3 - 32 bit)
Longint elojeles 32 bit
Byte elojel nélküli 8 bit
Word elojel nélküli 16 bit
Cardinal elojel nélküli rendszerfüggo! (Delphi 1 - 16 bit; Delphi 2,3 - 32 bit)
Logikai típusok
Boolean, ByteBool 1 byte
WordBool 2 byte
LongBool 4 byte

 

     A nyitott paraméterek használatával lehetőségünk nyílik arra, hogy egy alprogram tetszőleges méretű tömbbel vagy stringgel kerüljön meghívásra.

1.1. Nyitott tömb paraméter

    A formális paraméterlistában nyitott tömb használatával elérhetjük, hogy az alprogram tetszőleges méretű aktuális paramétertömmbel hívható legyen. A nyitott tömböt a következő módon deklaráljuk: array of Típus, ahol a Típus a tömb elemeinek típusát jelenti. A tömb utolsó elemének indexét a High() függvény használatával kérdezhetjük le.

     Nyitott tömb paraméter használata esetén az alábbiakra kell ügyelni:

    A nyitott tömb paraméter használatát mutatja a következő példa :

               function Osszeg ( tomb : array of integer ) : integer;
                     var i, ossz : integer;
                     begin
                          ossz := 0;
                           for i := 0 to high ( tomb ) do
                                  ossz := ossz + tomb [ i ];
                           Osszeg := ossz;
                     end; 
       

1.2. Típus nélküli nyitott tömb paraméter

              Lehetőség van arra is, hogy olyan nyitott tömböt deklaráljunk, amelynek az elemei különböző típusúak lehetnek. Ezt az array of const vagy az ezzel ekvivalens array of TVarRec deklaráció megadásával használhatjuk.  Az alprogramban az adott tömbelem típusát egy egyszerű case - szerkezettel kérdezhetjük le.            

1.3. Nyitott string paraméter

     A Delphiben használhatunk tetszőleges hosszúságú string paramétert is a formális paraméterlistában,ehhez a paraméter típusát string helyett OpesString típusúnak kell deklarálni : procedure szoveg ( var sz : OpenString ). A formális paraméter hossza itt is mindig megegyezik az aktuális paraméter hosszával, ami bármilyen string típusú változó lehet. Arra azonban ügyeljünk, hogy ez a paraméterátadás nem használható érték szerinti és konstans paraméterátadásnál, ilyenkor a Delphi az ilyen típussal deklarált paramétereket hagyományos string típusúnak tekinti.

2. Összetett típusú függvényérték

      A Turbo Pascaltól eltérően a Delphiben a függvények visszatérési értéke nem csak a megszokott egyszerű típus lehet, hanem összetett típusú értéket is visszaadhat ( pl. rekord vagy tömb típus ). Nem lehet azonban file vagy Object típusú értéket visszaadni. (class típusút viszont igen)

  

3. A Low( ) és High( ) függvény

Ez a függvény a string, sorszámozott és tömb típusú változók értékhatárainak lekérdezésére szolgál, más típusra azonban nem használható. Sorszámozott típus esetén az értékhatárok alsó és felső korlátait kapjuk vissza, string típusnál a Low ( ) függvény 0 - t, a High ( ) pedig a string deklarált hosszát, tömb típusnál pedig az indexhatárokat  adja meg. A függvény paramétere egyaránt lehet típusnév vagy változó.

4. Az Assigned( ) függvény

     Néha szükség van annak lekérdezésére, hogy egy függvény Nil értékkel tér - e vissza ( pl. hiba esetén ). Ennek kényelmes módját teszi lehetővé az Assigned függvény. Az eddigi   if p = nil then.... lekérdezés helyett az   if Not Assigned ( p ) then...   formátumot használhatjuk. A függvény paramétere lehet mutató vagy eljárás típusú változó.

5. A Break és Continue eljárás

     Ezt a két függvényt használhatjuk abban az esetben, ha valamilyen feltétel teljesülése esetén ki szeretnénk lépni a ciklusból. A Break használatakor a program végrehajtása a ciklus utáni első utasítással folytatódik. Ez hasznos, ha pl. keresésben találat után nincs szükség a ciklus futásának folytatására.

    A Continue eljárás nem lép ki a ciklusból, és csak az adott feltétel teljesülése esetén hajtódik végre az  ez utáni rész, ellenkező esetben a vezérlés visszakerül a ciklus első utasítására.

6. Az Include és Exclude eljárás

     A két eljárás használatával egyszerűen megoldható a halmazhoz egy elem hozzáadása ( Include ) vagy egy elem elvétele ( Exclude ). A két eljárás paramétere egy T típusú halmaz, valamint egy ezzel a típussal kompatibilis kifejezés ( pl. Include ( h , ' a ' )).

7. A nulla - végű stringek

     A hagyományos Pascal stringek a string nulladik elemében tárolják a string hosszát, és ezt követik a string karakterei. A Windows rendszerrutinok azonban C - stílusú stringeket használnak, amelyek végét a #0 jelzi, így szükséges volt bevezetni a nulla - végű stringeket a Delphiben is. Ezek használatára két lehetőség kínálkozik : egyrész PChar  típusú mutató másrészt egy nulla indexszel kezdődő karaktertömb ( array [ 0..n ] of char ) használata.A két módszer közötti különbség, hogy a mutatónak csak 4 byte helyet foglal, míg a tömbnek elemszám + 1 byte - ot. Nulla végű stringekre csak a SysUtils - ban definiált stringkezelő függvényeket használhatjuk ( pl. ' := ' helyett StrCopy ).   Ilyen stringek használatakor az X direktívának bekapcsolt állapotban kell lennie.

III. Az Object Pascal objektumai

   Az Objec Pascalban az objektumok lehetnek Object vagy Class típusúak.
   Az Object típust a régi programokkal való kompatibilitás megőrzése végett benne hagyták a Delphiben, de a Class típus használata lényegesen több lehetőséget biztosít a programozónak. Míg az Object típusú objektumok statikus helyfoglalásúak, és lehetnek önállóak is ( tehát nem származtatott ), addig a Class típusú objektumok dinamikusan jönnek létre, és mindegyiknek van közös őse, a TObject .

1. Osztályok deklarációja

     Osztálydeklaráció csak a program, unit és library deklarációs részében adható meg, eljárás vagy függvény deklarációs részében nem.
     Az osztály deklarációját a Class kulcsszó vezeti be, ezután adjuk meg először az adatmezőket, majd a metódusok fejlécét.

              type Koord = class
                         x, y : integer;
                         constructor Letrehoz ( u, v : integer );
                         function Xkoord : integer;
                         function Ykoord : integer;
               end;

Ezután adjuk meg a metódusok törzsét, az osztály nevét ponttal elválasztva a metódus nevétől.

               constructor  Koord.Letrehoz ( u, v : integer );
                     begin
                          x := u;
                          y := v;
                     end;

Ezután létrehozhatjuk az objektum példányaira mutató pointereket.

             var xy : Koord;

Az objektumpéldányok használata esetén előszőr a konstruktort kell meghívni, és ha már nincs szükségünk az adott példányra, fel kell szabadítani az általa lefoglalt helyet a Free metódus meghívásával.

      ......
      begin
          xy := Koord.Letrehoz ( 5, 8 );
          ........
          xy.Free;
      end;

Az objektumpéldány adatmezőire és metódusaira történő hivatkozásnál a ' . ' és a with kulcsszó használható, hasonlóan a rekord mezőire történő hivatkozáshoz. Itt azonban nem használhatjuk az xy^.___ formátumot.
     

2. Az osztályok felépítése

Az Object Pascal osztálydeklarációja három különböző részt tartalmaz : az adatmezők, a metódusok és a jellemzők megadása.
 

2.1. Adatmezők

     Az adatmezők olyan adatelemek, amelyek az adott osztály minden példányában megtalálhatóak. Ezek deklarálása és kezelése ugyanúgy történik, mint a rekord mezőinél.

2.2. Metódusok

     A metódusok az adott osztályhoz kapcsolódó művelteket tartalmazzák. Ugyanahhoz az osztályhoz tartozó objektumpéldányok közösen használják a metódusokat, ezért minden metódus rendelkezik egy Self paraméterrel, amely  megmutatja, hogy a változtatásokat melyik példány adatain kell elvégezni. Az osztályok két kitüntetett metódussal rendelkeznek, amelyek a konstruktor és a destruktor. A konstruktor tartalmazza az objektum létrehozásával és inicializálásával kapcsolatos műveleteket. A konstruktor függvényként viselkedik, visszatérési értéke az éppen létrehozott objektumpéldány címe. A destruktor pedig az objektumpéldány megszüntetésével kapcsolatos műveleteket tartalmazza. Ha nem írunk destruktort, akkor a Free metódus meghívásakor a Tobject destruktora aktivizálódik.

     A Delphiben ezen kívül léteznek olyan metódusok is, amelyek nem az objektum példányain fejtik ki a hatásukat, hanem magán az osztályon. Ezeket nevezzük osztálymetódusoknak. Deklarálásakor a metódus elé a class szó kerül. (class function...).


2.3. Jellemzők


     A jellemzők az osztály olyan névvel ellátott attributumai, amelyre az írás és az olvasás műveletét definiáljuk. Jellemzők használatához megadjuk a jellemző nevét, típusát, a műveleteit, valamint megadhatunk bizonyos tárolási azonosítókat is.

       property p : word read olvas write ir default 5;

     Ha kifejezésben szerepel a jellemző, akkor értéke a read után megadott mező vagy metódus által visszaadott érték lesz. Értékadás esetén a jellemző értéke a write után megadott mezőnek vagy metódusnak adódik át.

     A tárolási azonosítók között a stored jelzi azt, hogy a jellemző értéke állományba íródott - e; a default után megadható az alapértelmezés szerinti értéke, valamint a nodefault szóval jelölhetjük, ha nincs a jellemzőnek ilyen értéke.

 

3. Az adatrejtés elve

     Alapértelmezésben  az adatmezők, metódusok korlátozás nélküli hozzáférhetőségűek. Azonban a Delphiben azt az elvet próbálták követni, hogy az adatmezők csak a metódusokon keresztül legyenek láthatóak a külvilág számára.
Ennek érdekében az objektumok definiálását érdemes a unitok interface részében elhejezni, és itt megadni a különböző láthatósági jogköröket, melyek a következőek lehetnek :

                    type Koord = class 
                        private 
                              x , y : integer;
                        public
                              constructor Letrehoz ( u , v : integer );
                              function XKoord : integer;
                              function YKoord : integer;
                   end;

A unitokban a különböző jogkörök megadása tetszőleges számban és sorrendben előfordulhat, a főprogramban azonban a public, private, protecded kulcsszavakat figyelmen kívül hagyja.

4. Az objektumpéldányok

     Egy objektumtípushoz több objektumpéldány is tartozhat. Objektumpéldány deklarálására nincsenek megkötések, ezt bárhol megtehetjük. Minden példány rendelkezik saját adatterülettel, a metódusokat azonban közösen használják. Azt hogy az adott metódus éppen melyik példányon fejti ki hatását, a metódus nem látható Self paramétere mutatja.  Az objektum példányairól fontos tudni, hogy a hanyományos memóriafoglaló és - felszabadító műveletek ( new, dispose ) nem használhatóak.

5. Objektumok származtatása

     Az Object Pascalban minden osztálynak egy közös őse van, a Tobject osztály. Ha nem adjuk meg az adott osztály ősét, akkor ez automatikusan a Tobject közvetlen leszármazottja lesz.

     A származtatott osztály az ősosztály minden tulajdonságát örökli, ezek azonban felüldefiniálhatóak; valamint az új osztályhoz adhatunk újabb mezőket és metódusokat is

     A Delphi egyik hiányossága, hogy nincs lehetőség a többszörös öröklődésre, azaz minden osztálynak csak egyetlen közvetlen őse lehet.

     Osztály származtatása esetén ügyelni kell arra, hogy az új osztály konstruktora elvégezze az öröklött mezők inicializálását is. Ezt megtehetjük az örökölt konstruktor meghívásával is. Ha a közvetlen ős osztály metódusait szeretnénk használni, ezt megtehetjük úgy is hogy a metódus neve elé az inherited kulcsszót írjuk.

           type TOs = class
               a , b : integer;
               construcor Letrehoz( x , y : integer );
               ...
           end;
           type TUj = class ( Tos )
               c : integer;
               constructor Letrehoz( x , y , z : integer );
                ....
           end;
             constructor TUj.Letrehoz ( x , y , z : integer );
                  begin
                     inherited Letrehoz ( x , y );
                     c := z;
                  end; 

A származtatott objektumpéldány helyettesítheti az ős objektumpéldányt, viszont fordított esetben ez nem tehető meg.

6. Absztrakt metódusok

Gyakran szükséges lehet, hogy a származtatott osztály metódusait megváltoztassuk. Erre ad lehetőséget a virtuális és dinamikus metódusok használata, melyekkel átdefiniálhatjuk az ősosztály azonos nevű metódusát, így csak futás közben dől el, hogy éppen melyik metódust kell használni. ( Ezt nevezik késői kötésnek ).
               procedure vmi ( .... ); virtual;
    vagy   procedure vmi ( .... ); dynamic;

A konstruktorokon kívül bármely metódus virtuálissá vagy dinamikussá tehető az osztály - hierarchia bármely szintjén, de ezen osztály leszármazottaiban használni kell az override direktívát, amikor ezt a metódust újradefiniáljuk.

               procedure vmi ( ... ); override;
    

     Az alapvető különbség a két módszer között az, hogy virtuális metódus használata esetén a fordító egy táblázatot készít, amely tartalmazza a hierarchia adott szintjéig definiált összes virtuális függvény belépési pontját, míg dinamikus metódus esetén csak az adott osztályban definiált metódusok találhatóak a táblában, és ezek vannak láncba kapcsolva a hierarchia szerint. Ezek alapján a virtuális metódusok használata gyorsabb, mint a dinamikus metódusé, viszont több memóriát foglal.

     Sokszor előfordul, hogy egy virtuális metódust csak azért definiálunk, hogy az osztálydeklaráció teljes legyen. Ilyenkor használhatjuk az absztrakt metódusokat.               

procedure vmi ( ... ); virtual; abstract;

Ezeket a metódusokat a származtatott osztályban mindenképpen újra kell definiálni. Absztrakt metódus csak virtuális vagy dinamikut metódus lehet.

7. Osztályoperátorok

A Delphiben két osztály - operátort használhatunk, melyek :

     

IV. Kivételkezelés

     A Delphi a kivételeket objektumként valósítja meg, ami azért előnyös, mert így a kivételeket hierarchiába lehet csoportosítani jellegüktől függően, egyszerűen tudunk újabb kivételeket definiálni és információt vihetünk a hiba keletkezési helyétől a kezelés helyére.

    A kivételek kezeléséhez a SysUtils unitot kell használni, ha ezt használja egy alkalmazás, akkor minden hiba automatikusan kivétellé válik.

     A kivételeket ugyanúgy kell deklarálni, mint egy osztályt, de ajánlatos ezeket az Exception osztályból származtatni.

1. Kivételek kiváltása

     Egy fellépő kivételt a Raise utasítás segítségével válthatunk ki. Használata esetén nem adja vissza a vezérlést a hiba keletkezési helyére, hanem ez átadódik a kivételkezelőnek.
     A Raise utasítás argumentumában nem osztályt, hanem objektumot kell írni, ezt általában közvetlenül az argumentumban hozzuk létre az adott kivételosztály konstruktorának meghívásával. A kivétel kezelése után a kivételobjektum automatikusan törlődik a memóriából.

        ....
        if ( Hatar < Also ) or ( Hatar > Felso ) then
          raise ERangeError.CreateFmt ( ' Hiba ' , [ Hatar , Also , Felso ] );
        ....

2. Kivételek kezelése

     A kivételek lekezelésére a Try ... Except ...End   utasítás használható. Mikor a program a végrehajtás során ehhez a részhez ér, megpróbálja elvégezni a try után lévő utasításokat. Ha ez sikeres volt, akkor az end utasítás utáni résszel folytatódik a vérehajtás. Ha kivétel lépett fel, akkor a vezérlés a legbelső try .. except utasításhoz kerül. Az except utasítás utáni részben találhatóak a kívételkezelők, melyeket az on kulcsszó vezet be, majd a kivétel típusa után do kulcsszóval a kivételkezelő neve. Ha a legbelső try .. except blokk nem alkalmas az adott kivétel kezelésére, akkor eggyel kifelé lépve folytatja tovább a keresést.  Ha talál olyan kivételt, amely típuskompatibilis az aktuális kivétellel, akkor a legelső ilyet hajtja végre. Sikertelen keresés esetén az else ágban található utasításokat hajtja végre, ha ilyen van, ellenkező esetben futási hibával megáll a program.

               try
                 .....
               except
                    on EZeroDivide do HandleZeroDivide;
               else 
                     HandleAllOthers;
               end;

Ha a kivételblokkban nincsen on .. do megadva, akkor ezt minden kivétel esetén találatnak minősíti, és végrehajtja az itt lévő utasításokat.

     Kivétel csak a raise utasítás hatására vagy a try részben fellépő hiba  esetén keletkezhet.

     Ha a kivételkezelőben magában is kivétel lépne fel, akkor ezt még ezen belül le kell kezelni, különben az eredeti kivétel elvész, és az új kivétel lép a helyébe.

3. Kivételek ismételt előidézése

     Ha egy alprogram nem kezeli le a benne fellépő kivételt, akkor ezt tovább kell adni annak a try .. except utasítának, amely az alprogramot hívta. Ezt nevezik a kivétel ismételt előidézésének, amit egy argumentum nélküli raise utasítással tehető meg.

             try
               ...
             except
                raise;
             end;

     Gyakran előfordul, hogy bizonyos utasításokat mindenféleképpen végre kell hajtani, akkor is, ha a futás során kivétel lépett fel. Így például a megnyitott file - t le kell zárni, attól függetlenül, hogy volt - e hiba a feldolgozás során. Erre szolgál a Try .. Finally utasítás.
Használatakor a try rész végrehajtása után elvégzi a finally részben lévő utasításokat, majd ha volt kivétel, ez automatikusan újra fellép a végrehajtás után.

A SysUtils unitban találhatóak különböző előre definiált kivételek, valamint ezek kezelését támogató rutinok.

 

V. Dinamikusan szerkeszthető könyvtárak

     A DLL - ek használatával elérhetjük, hogy ugyanazt a programkódot több alkalmazás is használhassa megosztva. Ilyen könyvtárat a library modul definiálásával hozhatunk létre. Használatakor csak egy példányban töltődik be a memóriába, és ha már nincs rá szükség, automatikusan törlődik. Az erre történő hivatkozásokat a rendszer oldja fel a kívánt könyvtár betöltésével. A könyvtárból csak eljárásokra és függvényekre történhet hivatkozás, típusok, konstansok és változók elérésére nincs mód. A dinamikusan szerkesztett könyvtárakat más nyelven írt alkalmazások is használhatják.

1. DLL deklarálása

A DLL deklarálása a library modulban történik. Azokat a függvényeket és eljárásokat, amelyeket kívülről elérhetővé kívánunk tenni, export direktívával kell megadni,

          procedure vmi ( ... ); export;

majd egy külön ú.n. exports részben ezeket felsoroljuk. Itt adhatjuk meg, hogy kívülről milyen módon lehet ezekre az alprogramokra hivatkozni. Megadható index, ekkor ezzel a számmal lehet importálni; vagy megadhatunk új hivatkozási nevet. Ha az átnevezés után a resident direktívát is megadjuk, akkor az export információk addig a memóriában maradnak, amíg a DLL be van töltve, így csökkenthető a keresési idő.

                 exports
                      vmi Index 1,
                      vmi2 Name ' Uj ';

2. DLL használata

  Azokat az eljárásokat és függvényeket, amelyeket használni szeretnénk a programunkban, importálni kell, mégpedig far direktívával, mivel a könyvtárak távoli elérésűek. Az importálásra három lehetőség kínálkozik:

	procedure Valami ( i : integer ); far; external ' SAJAT ';

ahol a SAJAT könyvtárban található Valami eljárást importáljuk

	procedure UjNev ( i : integer ); far; external ' SAJAT ' name ' Valami ';

        ahol ugyanezt az eljárást importáljuk UjNev néven

	procedure Uj ( i : integer ); far; external ' SAJAT ' index 1;

 

    Lehetőség van dinamikus importálásra is, ekkor nekünk kell gondoskodnunk a DLL betöltéséről és felszabadításról. A DLL - ből való kilépéshez külön műveleteket definiálhatunk a System unit - ban található ExitProc segítségével. DLL használata esetén ügyeljünk arra, hogy a könyvtárnak nem lehet saját megnyitott file - ja, valamint nem tartalmazhat globális memóriablokk foglalást.

 

VI. A Delphi 2. és 3. verziója

     1996 - ban került piacra a Delphi 2. , majd 1997 - ben a harmadik verziója. Ebben a fejezetben csak néhány szó esik az újdonságokról a teljesség igénye nélkül.

     Mindkét verzió fordítója 32 bites kódot állít elő az 1. verzióval szemben, amely 16 bites volt, ez azonban nem okoz nehézségeket az átállásnál. A harmadik verzió lényeges újdonsága még, hogy az ún. package - technikát használja, így lehetőségünk van arra, az .exe programot a hozzá kapcsolódó .dll fordításától elkülönítve készítsük el, emi kisebb alkalmazást eredményez.

     A Delphi 2. - ben jelent meg a többszálú programozás lehetősége. A Windows95 előnyeinek kihasználása érdekében létrehozták a TThread osztályt.

     A Delphi 2. - ben az űrlap nem csak TForm komponens lehet, hanem ennek leszármazottja is ( virtuális űrlap öröklés )

     A Delphi 2. debuggerét kibővítették a taszk állapot figyelésével.

     Az első verziótól eltérően az előre definiált formokat nem a Gallery  -ben, hanem az Object Repository -ben találhatjuk, valamint a Visual Form Inheritance segítségével virtuálisan származtathatunk párbeszédpaneleket a teljes űrlap kódjából.

     A Delphi 2. - ben található egy adatbázis tallózó, amivel gyorsan áttekinthetjük az adatbázisainkat.

     Új string típusokat vezettek be, így pl. az AnsiString valamint a ShortString típust.

     A Delphi 3. verzióhoz sok új eszközt adtak a korábbi verziókhoz képest, ezekről még a későbbiekben lesz szó.

     A Delphi 3. újabb technikákat tartalmaz az objektumok használatával kapcsolatban, így például az ősosztály metódusának újradefiniálására, valamint saját komponenseket adhatunk a bázis - osztályhoz. A Delphi tartalmazza a Visual Component Library -t ( VCL32 ), amely több, mint száz előre definiált komponenst tartalmaz, közöttük olyan elemeket, melyeket a Windows95 használ, pl : Tree Views, Rich Edit, List Views.

     A Delphi 3. - ban lehetőség van ActiveX komponensek használatára. Az erre szolgáló techológiákat az Active Insight tartalmazza, melyeket a kliens - oldalú fejlesztésnél használunk. Ezek a következőek :

     A Delphi 3. - ban valósították meg az ún. Broker Technologies - t, amely az előzővel ellentétben a szerver - oldalú fejlesztést segíti. Részei a következőek :

A Delphi 3. - ban nem használhatóak a Java komponensek.

Készíthetünk ISAPI (Internet Explorer ) és NSAPI  DLL -t . Ezen eszközök segítségével egyszerűen írhatunk Web alkalmazásokat.

     Az SQL Explorer segítségével teljes táblákat vegy konkrét mezőket helyezhetünk el a formon a ' fogd és vidd '  technikával.

     Használhatunk Oracle, Sybase, Informix, DB2 típusú adatbázisokat, mint native adatbázisok.

     Míg a korábbi verziókban csak a Borland Database Engine - t használhattuk az adtbázissal történő kapcsolat megvalósítására, ebben a verzióban ezenkívül választhatjuk a Btrieve vagy az ODBC Database Engine - t is.

További új eszközök :