- Delphiartiklar, tips, forum, länksamling - 

      

START | DELPHI | LÄNKARGÄSTBOK 




 Forum

Grundkurs
  »Introduktion
  »Snabbguide
  »Komponenter
  »Händelser
  »Strängar
  »Räkna med Delphi   »Egna typer
  »Selektion
  »Iteration
  »Menyer
  »Funktioner
  »Arraystrukturer

Tips & Tricks
  »Nya tips
  »Blandat
  »Databaser
  »Filer
  »Forms
  »Grafik
  »Internet
  »Komponenter
  »Matematik
  »Multimedia
  »Objekt/ActiveX
  »Skrivare
  »Strängar
  »System
  »Mest lästa tips

Artiklar
  »Delphi och ADO
  »Bygga en DLL
  »Skapa en enkel rapport
  »Hantera registret
  »Enheter, units
  »Klassen TCanvas
  »Använd LookUp Controls

 Nya tips
 Lägg till tips
 Delphilänkar
 Gästbok

 



 FuzzyDizzie » Delphi » Grundkurs » Egna typer
Operativsystem: Windows 95/98/ME/2000/XP
Delphiversion: Delphi 3 eller senare
Komponenter: TEdit, TButton
  Publicerad: 2002-02-19
Läst: 4322
Röster: 10
Skribent: Staffan Berg

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



 
 
© Copyright 2005 - Staffan Berg
- Alla rättigheter förbehålles -