In dit  stukje wil ik  eens gaan kijken  naar zogenaamde GADGETS.
Dat zijn oa. die dingen  die je overal langs het scherm ziet. Bv.
om het  scherm te sluiten,  om het kleiner te  maken  of naar  de
achtergrond te brengen.
Maar GADGETS zijn ook bv. die dingen waar je een programmanaam in
opgeeft in de meeste commercieele programma's.  Ook gebiedjes die
je kunt aantikken zijn GADGETS.

Ik vertel steeds  een stukje en laat dan  wat regels zien.  Samen
vormen al  die regels een  programma  dat het  een en  ander laat
zien.

Allereerst  hebben we  een aantal libraries nodig omdat niet alle
kommando's een onderdeel van Basic zijn :

  WINDOW CLOSE 1
  DEFINT a-z
  TRUE=-1
  FALSE=0
  Okay=FALSE

  LIBRARY "exec.library"
  LIBRARY "intuition.library"
  LIBRARY "graphics.library"

  DECLARE FUNCTION AllocMem& LIBRARY

We gaan 10  GADGETS aanmaken.  Deze moeten in CHIP-geheugen komen
te liggen. We geven CHIP-geheugen aan met het getal 65539 :

  GadCnt = 10
  MemType& = 65539&

  DIM Rp&(1),Wp&(1)

In de volgende arrays houden we  de gegevens  van alle 10 GADGETS
bij.
Gad&() is het adres van elke GADGET-struktuur.
StrBuf&() is de pointer naar een buffer voor de string-GADGETS.
SpecInfo&()  is een  pointer naar  de speciale INFO-struktuur van
de string-GADGETS.

  DIM Gad&(GadCnt),StrBuf&(GadCnt),SpecInfo&(GadCnt)

Nu moeten we het scherm  openen en de omrandingen  van de diverse
GADGETS tekenen. Een gebiedje dat we moeten kunnen aantikken moet
ook als zodanig te herkennen zijn.
Eerst het openen van het scherm  en het opslaan van de nodige in-
formatie :

  SCREEN 1,640,200,4,2
  WINDOW 1,"Gadget-Window",(0,0)-(631,186),0,1
  Rp&(1)=WINDOW(8)
  Wp&(1)=WINDOW(7)
  PALETTE 0,0,0,0
  PALETTE 1,3/16,7/16,13/16
  PALETTE 2,0,5/16,13/16
  PALETTE 3,9/16,11/16,0

  SetDrMd& (Rp(1),0)

Nu de hokjes tekenen :

  REM Eerste string-GADGET
  LINE(3,5)-(306,18),4,bf:LINE(5,6)-(304,17),0,b
  LINE(7,8)-(302,15),0,bf

  REM Tweede string-GADGET
  LINE(3,21)-(306,34),9,bf:LINE(5,22)-(304,33),0,b
  LINE(7,24)-(302,31),0,bf

  REM ....
  LINE(3,37)-(306,50),9,bf:LINE(5,38)-(304,49),0,b
  LINE(7,40)-(302,47),0,bf

  LINE(3,53)-(306,66),9,bf:LINE(5,54)-(304,65),0,b
  LINE(7,56)-(302,63),0,bf

  LINE(3,69)-(306,82),9,bf:LINE(5,70)-(304,81),0,b
  LINE(7,72)-(302,79),0,bf

  LINE(3,85)-(208,98),9,bf:LINE(5,86)-(206,97),0,b
  LINE(7,88)-(204,95),0,bf

  LINE(211,85)-(237,98),9,bf:LINE(213,86)-(235,97),0,b
  LINE(215,88)-(233,95),0,bf

  LINE(240,85)-(306,98),9,bf:LINE(242,86)-(304,97),0,b
  LINE(244,88)-(302,95),0,bf

  BooleanGADGETS:
  LINE(500,25)-(564,38),4,bf:LINE(502,26)-(562,37),0,b
  LINE(500,50)-(564,63),9,bf:LINE(502,51)-(562,62),0,b

  IntuitionTEKST:
  Move& Rp&(1),513&,34&
  PRINT "Enter"
  Move& Rp&(1),519&,59&
  PRINT "Eind"
  SetDrMd& Rp&(1),1

Nu komt het eigenlijke aanmaken van de GADGETS.  Daarvoor gebrui-
ken we een SUB aan het  einde van het  programma omdat de routine
tien keer moet worden aangeroepen met steeds andere waarden.
De aanroep van de SUB gaat met de volgende waarden :

MakeGad Nummer,LinkerKant,BovenKant,Lengte,Hoogte,Type,Aantal
        Karakters,Karakters te Zien,Volgende GADGET

Het type kan zijn : BOOLEAN=0, PROPORTIONAL=3 of STRING=4
BOOLEAN zijn JA-NEE GADGETS.
PROPORTIONAL zijn schuif-GADGETS.
STRING zijn invoer-GADGETS.

  REM STRING-GADGETS
  MakeGad 1,8,8,304,8,4,37,41,2
  MakeGad 2,8,24,304,8,4,37,41,3
  MakeGad 3,8,40,304,8,4,37,41,4
  MakeGad 4,8,56,304,8,4,37,41,5
  MakeGad 5,8,72,304,8,4,37,41,6
  MakeGad 6,8,88,192,8,4,24,41,7
  MakeGad 7,216,88,20,8,4,3,3,8
  MakeGad 8,252,88,52,8,4,6,11,9

  REM BOOLEAN GADGETS
  MakeGad 9,500,25,65,14,1,0,0,10
  MakeGad 10,500,50,65,14,1,0,0,0

Nu doet de Amiga alles zelf.  We hoeven er alleen op te letten of
EIND of ENTER is aangetikt.  De Amiga geeft in  het GADGET-struk-
tuur door of  dat is gebeurd.  Wij hoeven  alleen maar te kijken.
Het invoeren  van de string-GADGETS  doet de Amiga  ook zelf.  In
Basic kunnen we het ingevoerde later terugvinden.
Als je EIND intikt stopt het programma.
Als je ENTER intikt worden de strings doorgegeven aan Basic.
De te testen  gegevens zitten  in Gad&(9)  en Gad&(10) en wel het
12e en 13e byte. We testen op bit 8.
Dus het stukje Basic wat op de twee BOOLEAN-GADGETS wacht :

  MAIN:

  WHILE -1
  G1=PEEKW(Gad&(9)+12)
  G2=PEEKW(Gad&(10)+12)

  IF G1 AND 128 THEN GOSUB FixData
  IF G2 AND 128 THEN CleanUp

  WEND

Nu komt het stuk FIXDATA,  de routine die de 8  strings doorgeeft
aan Basic.  Daarvoor moet een stuk geheugen  uitgelezen worden en
omgezet in een string :

  FixData:
  LOCATE 14,1 : COLOR 11 : PRINT "Een ogenblikje..."
  FOR cnt=1 TO 8
     Dat$(cnt)=""
     Char=0
     WHILE PEEK(StrBuf&(cnt)+Char) <> 0
        Dat$(cnt)=Dat$(cnt)+CHR$(PEEK(StrBuf&(cnt)+Char))
        Char=Char+1
     WEND
  NEXT

Nu zijn de 8 strings uitgelezen en kunnen ze worden afgedrukt :

  LOCATE 15,1 : COLOR 14
  FOR cnt=1 TO 8
     PRINT SPACE$(60)
  NEXT
  LOCATE 15,1
  FOR cnt=1 TO 8
     PRINT Dat$(cnt)
  NEXT
  RETURN

De volgende routine  is de eigenlijke GADGET-routine.  Deze maakt
de GADGET-struktuur  en alloceert er geheugen voor.  Tevens wordt
aan de Amiga doorgegeven dat de GADGET bestaat.  Het heeft al die
gegevens nodig die het MakeGad-kommando doorgeeft.  De routine is
daarom in de vorm van een SUB geschreven :

  SUB MakeGad (n,l,t,w,h,type,v,max,nxt) STATIC
  SHARED Wp&(),Gad&(),SpecInfo&(),StrBuf&()
  SHARED MemType&

Per GADGET worden  48 bytes  geheugen  gealloceerd,  dan 64 bytes
voor de tekstbuffer en tenslotte 64 bytes voor de speciale info:

     Gad&(n)=     AllocMem(48,MemType&)
     StrBuf&(n)=  AllocMem(64,MemType&)
     SpecInfo&(n)=AllocMem(64,MemType&)
     IF type<>4 THEN S&=0 ELSE S&=SpecInfo&(n)

Nu wordt de struktuur van de GADGET ingevuld :

  GADGETStruktuur:
     POKEL Gad&(n),nxt            :REM Wijzer naar volgende GADGET
     POKEW Gad&(n)+4,l            :REM Linker hoek
     POKEW Gad&(n)+6,t            :REM Boven hoek
     POKEW Gad&(n)+8,w            :REM Breedte
     POKEW Gad&(n)+10,h           :REM Hoogte
     POKEW Gad&(n)+12,0
     POKEW Gad&(n)+14,1
     POKEW Gad&(n)+16,type        :REM type 1, 3 of 4
     POKEL Gad&(n)+18,0
     POKEL Gad&(n)+22,0
     POKEL Gad&(n)+26,0           :REM Normale karakterset
     POKEL Gad&(n)+30,0
     POKEL Gad&(n)+34,S&          :REM Eventuele speciale info
     POKEW Gad&(n)+38,n           :REM GADGET ID
     POKEL Gad&(n)+40,0

Als de GADGET een string-GADGET  is dan moet er ook geheugen zijn
om de  tekst in te voeren.  Dat gebeurt  ook in een struktuur. De
speciale info daarvoor is :

  SpecInfoStruktuur:
     IF type = 4 THEN
        POKEL SpecInfo&(n),StrBuf&(n) :REM Buffer
        POKEL SpecInfo&(n)+4,0        :REM Undo-Buffer
        POKEW SpecInfo&(n)+8,0        :REM Startpositie
        POKEW SpecInfo&(n)+10,max     :REM Max. aantal karakters
        POKEW SpecInfo&(n)+12,0       :REM Display positie
        POKEW SpecInfo&(n)+14,0       :REM Undo positie
        POKEW SpecInfo&(n)+16,0       :REM Aantal karakters
        POKEW SpecInfo&(n)+18,v       :REM Aantal zichtbare kar.
        POKEW SpecInfo&(n)+20,0
        POKEL SpecInfo&(n)+22,0
        POKEL SpecInfo&(n)+26,0
        POKEL SpecInfo&(n)+30,0
        POKEL SpecInfo&(n)+34,0
        POKEL SpecInfo&(n)+38,0
     END IF

En nu het GADGET toevoegen, dwz. doorgeven aan de AMIGA :

     AddGadget& Wp&(1),Gad&(n),n

  END SUB

We missen nu nog 1 routine, namelijk die, die de boel opruimt als
het scherm gesloten wordt.  Deze routine geeft ook  alle geheugen
terug aan de Amiga. De routine wordt aangeroepen door het drukken
van het EIND-GADGET :

  CleanUp:
  WINDOW CLOSE 1
  SCREEN CLOSE 1
  FOR cnt=1 to GadCnt
     FreeMem& Gad&(cnt),48
     FreeMem& StrBuf&(cnt),64
     FreeMem& SpecInfo&(cnt),64
  NEXT
  LIBRARY CLOSE
  WINDOW 1,"BASIC",(0,0)-(617,187),31,-1
  END


Zo dat was het....

Om het verhaal helemaal te begrijpen is het het beste dat u kijkt
wat het programma doet.
Hier nog een kleine omschrijving :

Het programma laat 8 hoekjes zien die kunnen worden aangetikt. In
die hokjes komt dan een cursor te staan en u kunt tekst intikken.
Alle cursor-besturingen werken in die hokjes. Tevens zijn er twee
hokjes  met de  woorden  ENTER en EIND.  Deze doen precies wat ze
zeggen.

Het programma zit in de directory voorbeelden en heet :

 - Gadgets
