HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Különböző típusú adatok tömbben való tárolása


Avagy a Variant tömbök használata

Példaprogram letöltése

4640 bájt

Ebben a cikkben a Variant tömbök kezelésére szolgáló függvényeket, illetve azok használatát mutatjuk be. Segítségükkel különböző típusú adatokat tárolhatunk ugyanazon tömbben. A mellékelt példaprogram segítségével bemutatjuk az egyes függvények használatát.

Első lépésben létre kell hozni a tömböt a következő függvénnyel:
VarArrayCreate
function VarArrayCreate(
const Bounds: array of Integer;
VarType: TVarType
): Variant;
Paraméterek
const Bounds: array of Integer
Ahol Bounds a tömb határait jelzi.
VarType: TVarType
A VarType paraméter a tömb elemeinek típusát adja meg.
Lássuk a példaprogramot:
  try
    A := VarArrayCreate([0, 4], varVariant);
  except
  on EVariantArrayCreateError do
    ShowMessage('Nem sikerült a tömböt létrehozni!');
  end;
  A[0]:=1;
  A[1]:=1234.5678;
  A[2]:='Hello!';
  A[3]:=True;
  A[4]:=VarArrayOf([1, 10, 100, 1000]);
Láthatjuk, hogy a tömbnek 5 eleme van, melyek Variant típusúak. A tömböt rögtön fel is töltjük. Az első elem Integer, a második Float, a harmadik String, a negyedik Boolean, míg az ötödik elem szintén egy Variant típusú tömb.
Amennyiben a tömb létrehozása nem sikerül, EVariantArrayCreateError kivétel keletkezik.
A létrehozott Variant tömb dimenzióinak számát az alábbi függvénnyel kapjuk meg.
VarArrayDimCount
function VarArrayDimCount(
const A: Variant
): Integer;
Paraméterek
const A: Variant
Ahol ’A’ a Variant típusú tömb neve.
Visszatérési érték
A függvény a dimenziók számával tér vissza, amennyiben az adott Variant tömb típusú, ellenkező esetben nullát kapunk eredményként.
  Label3.Caption:='Dimenziószám: '+IntToStr(VarArrayDimCount(A));
Esetünkben a dimenziók száma 1 lesz.
A tömb alsó és felső határainak lekérdezésére is egy-egy függvény áll rendelkezésre, melyek a következők:
VarArrayLowBound
function VarArrayLowBound(
const A: Variant;
Dim: Integer
): Integer;
Paraméterek
const A: Variant
Ahol ’A’ a Variant típusú tömb neve.
Dim: Integer
Ebben a paraméterben kell megadni, hogy – amennyiben több van - melyik dimenzió határait szeretnénk lekérdezni.
Visszatérési érték
A tömb alsó határát kapjuk vissza eredményként.
VarArrayHighBound
function VarArrayHighBound(
const A: Variant;
Dim: Integer
): Integer;
Paraméterek
const A: Variant
Ahol ’A’ a Variant típusú tömb neve.
Dim: Integer
Ebben a paraméterben adjuk meg, hogy – amennyiben több van - melyik dimenzió határait szeretnénk lekérdezni.
Visszatérési érték
A tömb felső határát kapjuk vissza eredményként.
Példánkban ez a következőképp néz ki:
  Label4.Caption:='A tömb alsó határa: '+IntToStr(VarArrayLowBound(A,1));
  Label5.Caption:='A tömb felső határa: '+IntToStr(VarArrayHighBound(A,1));
Amennyiben egy API függvényhívásban szeretnénk hivatkozni a tömbünkre, akkor a VarArrayRef függvényt kell használnunk, mely egy új Variant típusú tömböt hoz létre egy, az általunk megadott tömbre hivatkozva. Az így létrejött tömböt közvetett úton elérhetik a külső függvények is.
A függvény felépítése a következő:
VarArrayRef
function VarArrayRef(
const A: Variant
): Variant;
Paraméterek
const A: Variant
Ebben a paraméterben kell megadnunk azt a tömböt, amelyre hivatkozni szeretnénk.
Visszatérési érték
Eredményként az általunk megadott függvénnyel teljesen megegyező típusú Variant tömb jön létre.
A forráskód a következő:
  B:=VarArrayRef(A);
A példaprogramban először létrehozzuk az ’A’ nevű Variant tömböt, majd a VarArrayRef függvénnyel egy ’B’ nevű hivatkozást. Láthatjuk, hogy minden paramétere megegyezik az eredeti tömbével.
Azt, hogy a Variant objektumunk valóban tömb típusú-e, a VarIsArray függvénnyel kérdezhetjük le.
VarIsArray
function VarIsArray(
const A: Variant
): Boolean; overload;
Paraméterek
const A: Variant
A vizsgálandó Variant neve.
Visszatérési érték
Amennyiben True-val tér vissza, a vizsgált Variant tömb típusú.
  if VarIsArray(A)=True then
    ShowMessage('Az "A" variant tömb típusú.')
  else
    ShowMessage('Az "A" variant nem tömb típusú.');
A tömböt lehetőségünk van átméretezni is a VarArrayRedim függvénnyel. A megadott értékre a tömb felső határát tudjuk megnövelni.
VarArrayRedim
procedure VarArrayRedim(
A: Variant;
HighBound: Integer
);
Paraméterek
A: Variant
A Variant tömb neve.
HighBound: Integer
A tömb felső határának új értéke.
Megjegyzés
A tömb eredeti elemei változatlanok maradnak, míg az új elemek nulla vagy üres értéket kapnak.
A forráskódban az eredeti felső határt kitoljuk 10-re:
  try
    VarArrayRedim(A, 10);
    Label5.Caption:='A tömb felső határa: '+IntToStr(VarArrayHighBound(A,1));
  except
  on EVariantArrayCreateError do
    ShowMessage('Nem sikerült a tömb átméretezése!'+#13+'Amennyiben a tömb zárolva van, oldja azt fel!');
 end;
Amennyiben a megadott Variant nem tömb típusú, vagy nincs elég memória az átméretezéshez, EVariantArrayCreateError kivétel keletkezik.
Fontos tudni, hogy amennyiben a tömb zárolva van, nem lehet átméretezést végrehajtani.
Nézzük is meg a zárolás módját:
VarArrayLock
function VarArrayLock(
const A: Variant
): Pointer;
Paraméterek
const A: Variant
A Variant tömb neve.
Visszatérési érték
Egy mutatót kapunk vissza, mely a tömb elemeire mutat.
Megjegyzés
Átméretezés zárolt állapotban a tömbön nem hajtható végre.
A példánkban a P mutatóban kapjuk vissza a tömb adatait.
  try
    P := VarArrayLock(A);
    Label13.Caption:='Állapot: Zárolva';
  except
  on EVariantInvalidArgError do
    ShowMessage('A variant-nak tömb típusúnak kell lennie!');
  end;
Amennyiben a zárolást fel szeretnénk oldani, a következő függvényt kell meghívnunk:
VarArrayUnlock
procedure VarArrayUnlock(
var A: Variant
);
Paraméterek
var A: Variant
A zárolt Variant tömb neve.
    VarArrayUnlock(A);
Mindkét fenti függvény esetében EVariantInvalidArtgError kivétel keletkezik, amennyiben a megadott Variant nem tömb típusú.

Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2003 évkönyv 433. 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!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |