Atom Nieuws jaargang 2000 nummer 1
../../../images/back.gif ../../../images/exit.gif ../../../images/forward.gif
pagina 9
Atomic Windows
Voorbeeld programmeren in AW: Tips & trucs

In onderstaand verhaal staan enkele bruikbare tips en trucs beschreven voor problemen die ik ben tegengekomen tijdens het programmeren in Atomic Windows.
Alle beschreven programma’s gebruiken de file AWFONT waarin de gebruikte font- en iconentabel zit. Deze file staat ook op de disk.

Verticale instelbare schuifbalk:
sv2112117.gif Het is wel eens makkelijk om een bepaalde instelling te doen of een variabele te wijzigen dmv het verschuiven van een blokje in een schuifbalk.
Truc:
Dit kan ook in Atomic Windows door gebruik te maken van de AW karakters code 0-10 (11-31 zijn nog leeg). Dit zijn namelijk de karakters die AW gebruikt om specifieke AW objecten op het scherm te plaatsen. Welk karakter bij welke code hoort staat hieronder:


Karakter om schaduw in een DLGPUSHBUTTON te creëren
#01,#01,#01,#01,#01,#01,#01,#01 ; VERT.LIJN 00

Karakters om een schuifbalk in de DLGLISTBOX te creëren
#FF,#80,#80,#80,#80,#80,#80,#FF ; SCHUIFKNOP 01
#80,#88,#9C,#BE,#9C,#9C,#80,#FF ; SCHUIFBALKPIJL HOOG 02
#FF,#80,#9C,#9C,#BE,#9C,#88,#80 ; SCHUIFBALKPIJL LAAG 03
#AA,#D5,#AA,#D5,#AA,#D5,#AA,#D5 ; MIDDEN SCHUIFRASTER 04

Karakters om een DLGRADIOBUTON te creëren
#3C,#42,#99,#BD,#BD,#99,#42,#3C ; RADIOBUTTON VOL 05
#3C,#42,#81,#81,#81,#81,#42,#3C ; RADIOBUTTON LEEG 06

Karakters om een DLGCHECKBOX te creëren
#FE,#C6,#AA,#92,#AA,#C6,#FE,#00 ; CHECKBOX VOL 07
#FE,#82,#82,#82,#82,#82,#FE,#00 ; CHECKBOX LEEG 08

Karakters om een kader met vakjes te creëren
#00,#01,#00,#01,#00,#01,#00,#55 ; LEGE RUIT VULPATROON 09
#FE,#FF,#FE,#FF,#FE,#FF,#FE,#55 ; INV. RUIT VULPATROON 10

Ik heb een procedure gemaakt om de schuifbalk te plaatsen. De aanroep van de procedure is als volgt: BALK ( MIN, MAX, WAARDE, X-POS, Y-POS, H).
Eerst plaatsen we een lege verticale schuifbalk met pijltjes op positie X_POS, Y_POS met hoogte H op het scherm. Daarna berekenen we de positie van de schuifknop met behulp van de waardes MIN, MAX, WAARDE, H en Y-POS. Nu plaatsen we de schuifknop. Het enigste wat we nog moeten doen is kijken wanneer er met de muis op een pijltje gedrukt wordt om de waarde + positie schuifknop dan aan te passen. Dit doe ik d.m.v. het DLGHOTSPOT commando op positie X-POS,Y-POS met breedte 1 en hoogte H.

Programma:
Het programma ziet er dan als volgt uit:

10 PROGRAM SCHUIFBALK
20
30 DIM V64
40 *LO.AWFONT 7000
50 A=0 ;REM LAAGSTE WAARDE
60 B=9 ;REM HOOGSTE WAARDE
70 C=(B+A)/2 ;REM HUIDIGE WAARDE
80 H=15 ;REM HOOGTE BALK
90
100 PROC BALK(A,B,C,X,Y,H)
110 DLGFRAME “”,0,X,Y,1,H ;REM KADER OM SCHUIFBALK
120 $V=” “
130 ?V=2;DLGLABEL $V,0,X,Y ;REM PLAATS PIJL HOOG
140 ?V=3;DLGLABEL $V,0,X,(Y+H) ;REM PLAATS PIJL NEER
150 ?V=4
160 F.I=1 TO H-2
170 DLGLABEL $V,0,X,(Y+I) ;REM PLAATS RASTER
180 N.
190 P=((C-A)*(H-3))/(B-A)+Y+1 ;REM BEREKEN POSITIE KNOP
200 ?V=1;DLGLABEL $V,0,X,P ;REM PLAATS KNOP
210 PEND
220
230 CLEAR4;DLGCLS;DLGPOINTER 0 ;REM SCHERM SCHOON
240 DLGBASE #7000
250 DLGCREATE Q,”Schuifbalk Demo”,104,6,1,20,22; REM PLAATS LEEG VENSTER
260 DLGHOTSPOT 100,16,4,1,H,X,Y ;REM MARKEER POSITIE BALK
270a BALK(A,B,C,16,4,H) ;REM PLAATS BALK
280 $V=”Waarde : 00”;V?9=C/10+48;V?10=C%10+48 ;REM VUL WAARDE IN
290 DLGLABEL $V,32,2,11 ;REM PLAATS TEKST
300 DLGEND
310
320 XIF Q=100 THEN ;REM OP BALK GEDRUKT??
330 CASE Y OF
340 <0> IF C>A;C=C-1 ;REM PLAATS WAS PIJL HOOG
350 <H-1> IF C<B;C=C+1 ;REM PLAATS WAS PIJL NEER
360 CEND
370 ELSE
380
390 IF Q=100;GOTO a ;REM INDIEN OK DAN STOP
400 CLS;END

Meervoudige selectie in listbox:
sv2112118.gif In het eerste voorbeeld programmeren in AW heb ik laten zien hoe het DLGLISTBOX commando werkt. De beperking van dit commando is echter dat je maar 1 keus kunt maken uit de lijst, terwijl het wel eens voor kan komen dat er meerdere selecties nodig zijn uit een lijst.
Truc:
De truc die hier toegepast is, is door weer gebruik te maken van de AW karakters maar nu specifiek de codes 05 (radiobutton vol) en 06 (radiobutton leeg). Aan elke keuze die in de listbox-array geplaatst wordt, wordt ASCII code 06 toegevoegd. Wanneer de listbox aangeroepen wordt zal men dus een lijst zien waar voor elke keuze een leeg rondje staat. Wanneer men nu een keus maakt uit de lijst moet aan de hand van de gemaakte keuze de positie van de 05/06 code berekent worden om van een code 06 een code 05, of van een code 05 een code 06 te maken. Dit kan met een bewerking, namelijk een XOR met 3.

05=0000.1001 06=0000.1010
03=0000.0011 03=0000.0011
------------ XOR ------------ XOR
06=0000.1010 05=0000.1001

Wanneer de listbox nu weer aangeroepen wordt zal het rondje voor de laatst gemaakte keuze vol of leeg zijn. Om een bewerking uit te voeren met de gemaakte keuzes, moet je met een stapgrootte door de listbox-array heenstappen en kijken of voor een keuze de code 05 staat.

Programma:
In een programma ziet het er als volgt uit:

10 PROGRAM MEERKEUZE
20
30 DIM K120,V64
40 *LOAD AWFONT 7000
50 M=10 ;REM AANTAL IN LIJST
60
70 $V=”.Keuze00”;V?6=6 ;REM STRING MET RONDJE
80 F.I=0 TO 9 ;REM CODE 6=LEEG RONDJE
90 V?6=I/10+48
100 V?7+I%10+48
110 $(K+I*9+12)=$V ;REM ZET STRING IN ARRAY
120 N.
130
140 CLEAR4;DLGCLS;DLGPOINTER 0 ;REM SCHOON SCHERM
150 DLGBASE#7000
160aDLGCREATE A,”Meerkeuze Demo”,104,63,19,17 REM PLAATS LEEG VENSTER
170 DLGLISTBOX 100,K,1,3,8,10,M,0 ;REM PLAATS LIJST
180 DLGPUSHBUTTON 110,”Check”,32,11,7 ;REM PLAATS DRUKKNOP
190 DLGEND
200
210 CASE A OF
220 <100> ?(K+K?11*9+12)=?(K+K?11*9+12):3 ;REM IN LIJST GEDRUKT
230 <110> T=0 ;REM OP DRUKKNOP GEDRUKT
240 F.I=0 TO M-1
250 IF ?(K+I*9+12)=5;T=T+1 ;REM TEL SELECTIE
260 N.
270 $V=”Aantal = 00”
280 V?7=T/10+48 ;REM VUL AANTAL IN
290 V?8=T%10+48
300 DLGLABEL $V,32,1,14 ;REM PLAATS TEKST
310 PAUSE 100 ;REM EFFE WACHTEN
320 CEND
330
340 IF A<>0;G.a ;REM INDIEN OK DAN STOP
350 END

Voortgangsbalk:
sv2112119.gif
Om in een bepaald proces aan te geven hoe ver het proces al uitgevoerd is, kan men gebruik maken van een voortgangsbalk. Bijvoorbeeld bij het formatteren van een diskette wil men graag zien hoe ver het proces gevorderd is.

Truc:
In AW is zoiets ook mogelijk. Als eerste moet je een string definiëren waar net zoveel spaties instaan als de lengte van de balk moet zijn. Deze string moet dmv het DLGLABEL commando in style geïnverteerd en grijs op het scherm geprint worden. Afhankelijk van de voortgang wordt nu op dezelfde positie een geinverteerde spatie geprint waardoor de zwarte balk steeds langer wordt.

Programma:
Onderstaand programma laat zien hoe dit in zijn werk gaat.

10 PROGRAM VOORTGANGSBALK
20
30 DIM V64
40 *LO.AWFONT 7000
50 $V=” “ ;REM BALK = 20 SPATIES
60
70 CLEAR4;DLGCLS;DLGPOINTER 0 ;REM SCHOON SCHERM
80 DLGBASE #7000
90 DLGCREATE A,”Voortgangsbalk Demo”,40,4,8,24,7;REM LEEG VENSTER
100 DLGFRAME “”,0,2,4,(LEN V),1 ;REM KADER OM BALK
110a DLGLABEL $V,24,2,4 ;REM PLAATS BALK
120 F.I=0 TO LEN V-1
130 DLGLABEL “ “,8,(I+2),4 ;REM PLAATS ZWARTE BALK
140 PAUSE 30 ;REM EFFE WACHTEN
150 N.
160
160 PAUSE 100 ;REM BALK COMPLEET
170 G.a ;REM OPNIEUW

Bewegende iconen:
Om een programma er aantrekkelijker uit te laten zien kun je gebruik maken van bewegende iconen.
Truc:
De truc die hier toegepast wordt is het snel plaatsen van verschillende iconen op dezelfde positie. Je moet dus een aantal iconen ontwerpen waarbij in elk volgende icoon een verschuiving of verandering moet staan. Wanneer deze dan een voor een op dezelfde positie op het scherm geplaatst worden, lijkt het net of het icoon beweegt.

Programma:
Onderstaand programma laat dit zien voor de iconen 0 t/m 5. Je moet dus wel zelf deze iconen ontwerpen en opslaan.

10 PROGRAM BEWEGENDE ICONEN
20
30 *LO.AWFONT 7000
40
50 CLEAR4;DLGCLS;DLGPOINTER 0 ;REM SCHOON SCHERM
60 DLGBASE #7000
70 DLGCREATE A,”Iconen Demo”,40,6,8,22,8 ;REM LEEG VENSTER
80 DLGLABEL “Bewegende Iconen”,22,5,4 ;REM PLAATS STRING
90 DLGFRAME “”,0,2,4,2,2 ;REM PLAATS KADER
100 S=0 ;REM TELLER OP 0
110 DO
120 DLGICON 0,S,””,16,2,4 ;REM PLAATS ICOON
130 S=S+1;IF S=6;S=0 ;REM TEST OP LAATSTE
140 PAUSE 10 ;REM EVEN WACHTEN
150 U.0

Tot zo ver weer een verhaal over programmeren in Atomic Windows.
De volgende keer weer meer.
Groeten, Kees van Oss

../../../images/back.gif ../../../images/exit.gif ../../../images/forward.gif