Jeg tror der er noger elemetært du ikke har fat i omkring Set type ....
Kig på det følgende kode ... Det laver nøgagtigt det samme :
type InstalledSuite = (BackOffice, DataCenter, AdvancedServer, SmallBusinessServer, SmallBusinessServerRestrictive, TerminalServices); InstalledSuites = set of InstalledSuite;
procedure TForm1.Button1Click(Sender: TObject); var Suites : InstalledSuites; begin Suites := [BackOffice]; Suites := Suites + [DataCenter];
if BackOffice in Suites then ShowMessage(\'BackOffice in Suites\'); if AdvancedServer in Suites then ShowMessage(\'AdvancedServer in Suites\'); end;
type eInstalledSuites = Integer;
procedure TForm1.Button2Click(Sender: TObject); var eSuites : eInstalledSuites; begin eSuites := 0; eSuites := (eSuites or integer(BackOffice)); eSuites := (eSuites or integer(AdvancedServer)); if (eSuites and integer(BackOffice)) <> 0 then ShowMessage(\'BackOffice in Suites\'); if (eSuites and integer(AdvancedServer)) <> 0 then ShowMessage(\'AdvancedServer in Suites\'); (* Grundet Pascals meget typefaste natur skal vi here selv lave overstyringen til en Integer); *) end;
Det skulle give dig et inblik i hvad en set type etenligt er ...
Der er lige et par ting jeg skal have afklaret først
Kan eInstalledSuites indholde flere værdier?
Hvad er grunden til at lave en type af integer, kan man ikke bare have variablen af integer?
eSuites := (eSuites or integer(BackOffice)); Hvad gør or (tildeler integerværdien af BackOffice hvis der eSuites ikke har nogen værdi)
if (eSuites and integer(BackOffice)) <> 0 then Ligeså hvad gør and godt for her (jeg kender godt and, men hvorfor have både eSuites og integer(BackOffice) med.
I eksemplet som jeg har lavet så sker der det samme ved button1Click og ved Button2click. Det er du vel med på ?
Med adndre ord så indeholder variablerne eSuites og Suites nøjagtigt det samme.
I dette konkrete tilfælde så indeholder de BÅDE BackOffice og DataCenter.
Gurnden til at jeg lavede på to måder var for at illustere hvad en Set type er !
En set type ER en integer. Hverken mere eller mindre ....
InstalledSuite er det der hedder en eNumerral type. Hver af de værdier en hver i sær en integer, fortløbende nummeret fra 0 (med mindere du angiver andet)
eSuites := (eSuites or integer(DataCenter)); og Suites := Suites + [DataCenter]; laver det samme ! Jeg tror iøvrigt du misforstår de de \'or\' Her er ikke tale om et logist or hovr man siger den eller den, men der imod et bitvis or den følgende tabel er givet: Skal læses som \"0 or 0 er 0\" \"0 or 1 er 1\" etc. or 0 1 0 0 1 1 1 1
det er det der sket ... Din set type bliver omdannet til en Integer, og så udfører man nogle bit operationer på den integer. Hver af dine enherder i din enumerale type bliver som før skrevet også omdannet til integers og således kan man udføre sine operationer.
Fidusen er at and og or er hinandens resiprokke. dvs hvis du først siger c := c or b, så har c en ny værdi, hvis du så derefter udfører en and på c med b så har c sin oprindelige værdi. Derfor alt det der and sjov ....
\"Hvad er grunden til at lave en type af integer, kan man ikke bare have variablen af integer? \"
Det har jeg også gjort ! Jeg har bare pakket den ind i et pænere og mere beskrivende navn !
Jeg tror du skulle læse lidt på bit vise operatorer ... :-)
Tak Poull > Jeg har lavet et lille projekt til dig der viser hvordan binære operatorer virker .. Hvis du lige skriver til mig så sender jeg dig det ...
Så kan du selv pille i det indtil det går i stykker :-))
Jens B
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.