Egna typer
Förord
Att deklarera egna typer är något som är väldigt användbart i Delphi. Denna artikel beskriver hur man skapar egna typer och hur de används och implementeras i programmet.Innehåll
»»
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.
Var deklareras typer?
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.
0 Kommentarer