Rösta på artikeln
Egna deklarerade datatyper
Egna datatyper
Med de datayper du har stiftat bekantskap med klarar du dig
ganska bra med, men inte alltid. Anta att du har ett program som sysslar med tidmätning
av något slag och därför har deklarerat en variabel
var dag : integer;
som skall kunna anta värden 1 .. 7.
När du börjar skriva det programmet bestämmer du dig för att
'söndag' skall svara mot värdet 1. Då du nästa vecka skall fortsätta med programmet
har du glömt detta och räknar med att 'måndag' har värdet 1. Detta kan leda till effekter
som kan vara nog så besvärliga att rätta till i efterhand.
I Pascal kan du komma till rätta med denna problematik genom
att själv deklarera en passande datatyp.
type Tdag = (son,man,tis,ons,tors,fre,lor);
Ordet type är ett reserverat ord som används för att
deklarera egna datatyper.
För datatypen TDag ovan kan bara de sju värdena som räknats
upp komma ifråga. I Delphi är det vanligt att identifierare för typer börjar med bokstaven
T följt av själva namnet. När datatypen deklareras genom uppräkning av värden, sägs
datatypen vara av uppräknad typ (enumerated type).
Ordningsnumret för det första uppräknade värdet får alltid ordningsnummer
0. Värdet son har alltså ordningsnummer 0.
Efter en typdeklaration är det fritt fram att deklarera en variabel
av datatypen.
var dag : TDag;
och sedan tilldela den något av de uppräknade värdena.
dag := son;
Försöker du ge den ett annat värde t ex dag := 5; kommer
kompilatorn att protestera mot detta. Talet 5 är ett heltal och kan alltså inte lagras
i en variabel av typen TDag.
Precis som för alla andra identifierare i Delphi kan typidentifierare
deklareras var som helst. Det kan vara bra att komma ihåg att typen endast gäller
för den omgivning i vilken den är deklarerad.
Är typen deklareras inne i en händelseprocedur gäller typen
endast i denna. Försöker man sedan att använda den någon annanstans kommer det ånyo
en protest från kompilatorn. Det normala är att man deklarerar datatyperna som globala
i interface-delen i en enhet. Den kan då användas i alla delar av programmet. Prova
med att skriva in följande i ett projekt.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
Tdag = (son,man,tis,ons,tors,fre,lor);
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
dag : TDag;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
dag := tors;
Edit1.Text := IntToStr(Ord(dag));
end;
end. |
I programmet ovan görs en tilldelning
dag := tors;
vilket fungerar utmärkt. Däremot går det inte att visa värdet
på vanligt sått t ex med hjälp av en editeringsruta. Vi blir tvungna att använda ordningsnumret
för att visa vilket värde dag har.
Edit1.Text :=
dag; {OBS!!! Felaktigt}
Detta fungerar bättre...
Edit1.Text :=
IntToStr(Ord(dag));
Det är också möjligt att deklarera typer som är en delmängd
av andra typer.
type
storbokstav = 'A'..'Z';
litenbokstav = 'a'..'z';
underbefal = korpral..furir;
brakort = tio..ess;
Observera beträffande delmängder av en datatyp att ordningsnumret
för ett element fortfarande är detsamma.
Ord('A') ger
värdet 65
Ord(ess) ger
värdet 13
Typkonvertering
I Delphi kan du faktiskt använda själva datatypen för att göra
en konvertering till motsvarande datatyp. Detta gäller alla enkla, ordnade datatyper.
Nedan några exempel på typkonverteringar.
char(65) ger resultatet
'A'
longint(5) ger
resultatet 5
TDag(3) ger
resultatet ons
För att testa att köra en typkonvertering rent praktiskt så
begär ett nytt projekt och placera en ComboBox och en editeringsruta på ett formulär.
Skriv sedan in nedanstående procedur i kombinationsrutan Click-händelse.
procedure TForm1.CBClick(Sender: TObject);
begin
dag := TDag(CBItemindex);
Edit1.Text := IntToStr(Ord(dag));
end;
|
Kör programmet. Klicka på nedåtpilen i kombinationsrutan. Välj
ett värde i listan. Motsvarande värde skall nu synas i editeringsrutan Edit1.
Itemindex innehåller numret på den valda raden. Detta nummer
konverteras till värdet med motsvarande ordningsnummer i datatypen TDag för att slutligen
lagras i variabeln dag.
|