home *** CD-ROM | disk | FTP | other *** search
/ Inside Multimedia 1995 July / IMM0795.ISO / demo / optix / optxfpac.set / STRUKTUR.INF < prev    next >
Text File  |  1995-04-05  |  19KB  |  480 lines

  1.  
  2. 1.  Einmaleins
  3. 2.  Interaktion
  4. 3.  Interne Programmstruktur
  5. 4.  Programmablauf
  6. 5.  Die erste Linie
  7.  
  8.  
  9.  
  10. ---------------------------------------------
  11. 1.  Einmaleins
  12. ---------------------------------------------
  13.  
  14.  
  15. Das wohl einfachste - und daher auch sinnloseste - OPTIX-'FREE'-Programm sieht 
  16. folgendermassen aus:
  17.  
  18.         BEGIN
  19.         END
  20.  
  21. Dieses Programm, mit [F9] gestartet, schaltet Ihre SuperVGA in den Grafikmodus
  22. und löscht den Bildschirm (ein freundliches Schwarz). Hiernach wird wieder in
  23. den Textmodus umgeschaltet und der eben verlassene OPTIX-Texteditor erscheint
  24. wieder. 
  25.  
  26. Trotz der Kürze ist dem Programm folgendes zu entnehmen:
  27.  
  28.     O    Jedes OPTIX-Programm muß die Befehle BEGIN (am
  29.          Anfang des Hauptprogrammteiles) und END (als
  30.          Textendemarkierung) enthalten. Alles, was hinter END
  31.         kommt, wird vom Compiler, bzw. dem RUN-Modus ignoriert.
  32.         Vor BEGIN werden nur bestimmte Befehle akzeptiert, z.B.
  33.         Variablen-Definitionen, Prozeduren und der INCLUDE-
  34.         Befehl.
  35.  
  36.     O    Nach dem Start schaltet die VGA in den Grafikmodus
  37.         (640x480, 800x600 bzw. 320x200 mit 256 Farben) und
  38.         löscht den Bildschirm, d.h. füllt den Bildschirmspeicher
  39.         mit der Farbe 0 aus der aktuellen Farbpalette. Zum Start
  40.         eines Programmes ist immer die Standard-DOS-Palette
  41.         (s. SETPSTD) voreingestellt.
  42.  
  43.     O    Nach Erreichen von END schaltet die VGA wieder in den
  44.         Textmodus des Editors zurück und das Programm kann 
  45.         weiter bearbeitet werden.
  46.  
  47.  
  48. Wir fügen die Zeile  Pause(0) ein:
  49.  
  50.  
  51.             BEGIN
  52.               Pause(0)
  53.             END
  54.  
  55.  
  56.     O    Damit der augenblickliche Zustand des Bildschirms
  57.         erhalten bleibt, wird hier der Befehl PAUSE eingesetzt.
  58.         Z.B. hält PAUSE(4000) das Programm um 4000
  59.         Millisekunden (das sind 4 Sekunden) an. Diese Pause
  60.         kann durch einen Tastendruck vorzeitig beendet werden.
  61.         Als Sonderfall unterbricht PAUSE(0) - wie oben gezeigt -
  62.         den Programmablauf bis zum nächsten Tastendruck oder
  63.         Mausklick.
  64.  
  65.     O    Es ist gleichgültig, ob die Befehle in Groß- oder
  66.         Kleinbuchstaben oder gemischt geschrieben werden.
  67.  
  68. Damit haben wir die grundlegenden Voraussetzungen für ein OPTIX-Programm 
  69. bereits geschaffen.
  70.  
  71. Um uns die bei Programmstart verfügbare Farbpalette anzeigen zu lassen, setzen 
  72. wir statt  Pause den Befehl Showpalette ein:
  73.  
  74.  
  75.             BEGIN
  76.               Showpalette
  77.             END
  78.  
  79.  
  80. Auch dieses Programm wartet auf einen Tastendruck, zeigt jedoch währenddessen 
  81. die Farbpalette an.
  82.  
  83. Womit wir bei der entscheidenden Fähigkeit von OPTIX wären: 
  84.  
  85.         die 256-Farbdarstellung in hoher Auflösung 
  86.         (SVGA in 640x480;  OPTIX-'PRO' bis 1280x1024). 
  87.  
  88. Die 8Bit-Farbverarbeitung (8Bit = 1 Byte = Werte von 0 bis 255) stellt die 
  89. unterste Stufe der sogenannten 'Realbildverarbeitung' dar, d.h. es sind 
  90. Grafiken in einer Farbqualität und Feinkörnigkeit möglich, die den Begriff 
  91. 'Fotorealität' erlauben. Steigert man die Bildschirmauflösung auf 800x600 oder 
  92. gar auf 1280x1024 (-> OPTIX 'PRO'), so können Bilder dargestellt werden, die
  93. von einem normalempfindlichen menschlichen Auge nur aus allernächster Nähe
  94. (kleiner 50cm) von einem optophysikalisch hergestellten Foto unterschieden
  95. werden können.
  96.  
  97. Um nun unter Beweis zu stellen, daß OPTIX-'FREE' spielend in der Lage ist, eine 
  98. Diashow zu präsentieren, folgt das erste Programm (Listing) einer 
  99. Bilddarstellung:
  100.  
  101.  
  102.         Begin
  103.           Readpic('C:\Bilder\Meinbild.BMP')
  104.           Loadpic(0,0)
  105.           Pause(5000)
  106.         End
  107.  
  108.  
  109. Dieses Programm setzt voraus, daß auf der Partition C: Ihrer Festplatte im 
  110. Verzeichnis 'Bilder' ein Vollbild der Größe 640x480 in 256 Farben mit dem 
  111. Namen 'Meinbild.BMP' enthalten ist. Besitzen Sie kein Bild, können Sie es 
  112. sich zum Beispiel durch das Programm PAINTBRUSH unter WINDOWS oder durch 
  113. irgendein anderes Grafikprogramm für 256Farben-Verarbeitung erstellen und 
  114. im BMP-Format abspeichern.
  115.  
  116. Soll es ein Realbild sein, benötigen Sie einen Scanner oder eine sonstige 
  117. Möglichkeit der Grafik-Digitalisierung (Video-Grabber etc.),  die Ihnen ein 
  118. 256Farben-Realbild liefert. Auf dem freien Markt werden auch Disketten und 
  119. CD's mit lizenzsfreien Bildern, Grafiken und Hintergründen angeboten.
  120.  
  121. Nachdem das Bild in den sog. Hintergrundpuffer geladen wurde, wird es durch 
  122. LOADPIC sichtbar gemacht, wobei die beiden Parameter bewirken, daß das Bild 
  123. in höchstmöglicher Geschwindigkeit mit gleichzeitiger Paletteninstallation 
  124. aufgebaut wird (s. unter LOADPIC). Um das Bild kurze Zeit zu betrachten, 
  125. wird eine Fünfsekunden-Pause verfügt, die jedoch durch Tastendruck vorzeitig 
  126. unterbrochen werden könnte. Um ein Unterbrechung zu unterdrücken, kann 
  127. stattdessen der Befehl WAIT verwendet werden.
  128.  
  129. Eine einfache Diashow kann zusammengestellt werden, indem man einfach diese 
  130. drei Zeilen mehrfach aneinanderhängt:
  131.  
  132.         Begin
  133.           Readpic('C:\Bilder\Bild1.BMP')
  134.           Loadpic(0,0)
  135.           Pause(5000)
  136.           Readpic('C:\Bilder\Bild2.BMP')
  137.           Loadpic(0,0)
  138.           Pause(5000)
  139.           Readpic('C:\Bilder\Bild3.BMP')
  140.           Loadpic(0,0)
  141.           Pause(5000)
  142.         End
  143.  
  144. So einfach ist das!
  145.  
  146. Um den Ablauf zu vertonen, benötigen Sie eine Musik-, Sprach- oder Geräusch-
  147. Sequenz von - in diesem Fall - ca. 16 Sekunden (3x5 Sekunden Pause plus ca. 
  148. 1 Sekunde Lade- und Transferzeit). Besitzen Sie eine WAV- oder VOC-Sounddatei, 
  149. so können Sie sie einfach parallel zum Ablauf starten:
  150.  
  151.         Begin
  152.           Readsound('C:\Sounds\Musik.WAV')
  153.           Startsound
  154.           ...
  155.           weiteres wie oben
  156.           ...
  157.         End
  158.  
  159. In diesem Fall wird die Sounddatei 'Musik.WAV'aus dem Verzeichnis 'Sounds' 
  160. der C:-Partition in den XMS-Synchronsoundspeicher geladen und - ohne das Sie 
  161. der interne Ablauf interessieren müßte - absolut störungsfrei parallel zum 
  162. Vorgang des Bildladens und des Bildschirmaufbaus gestartet. Diese völlige 
  163. Synchronizität beliebiger Dauer (nur abhängig von der aktuellen Speichergröße) 
  164. ohne jede Rücksicht auf Bildschirm- oder Festplattenzugriffe darf als ein 
  165. besonderer Leckerbissen des OPTIX-Systems bezeichnet werden.
  166.  
  167.  
  168.  
  169. 2.  Interaktion
  170.  
  171. Ein realgrafisches Animationssystem darf sich jedoch nicht darin erschöpfen, 
  172. nur eine Reihe von Bildern aneinanderzuhängen und ein wenig Musik dazu 
  173. abzuspielen. Das Prädikat 'interaktiv' muß es sich ebenfalls verdienen. Um 
  174. Interaktion (also das Wechselspiel zwischen Programmablauf, Strukturvorgaben 
  175. des Produzenten und dem Variationsbedürfnis des Bedieners) zu ermöglichen, 
  176. sind sogenannten 'Strukturbefehle' vonnöten. 
  177.  
  178. OPTIX200 verfügt über zwei Klassen von Strukturbefehlen. Die eine bezieht sich 
  179. auf die Möglichkeit, dem Benutzer die verschiedensten Wahlmöglichkeiten zur 
  180. Verfügung zu stellen und die andere darauf, das Programm intern in seinem 
  181. Ablauf zu strukturieren.
  182.  
  183. Zur ersten Klasse gehören Befehle wie DEFBUTTON / CHECKBUTTON, GOTOENV, 
  184. CHECKDATE oder TIMEOUT, die eine Definiton von Schaltflächen erlauben, 
  185. anhand derer der Benutzer den Ablauf des Programms von außen steuern kann 
  186. und die implizit eine Programmverzweigung zu dem gewünschten Ziel angeben:
  187.  
  188.         Begin
  189.         Sysfont(3,1)
  190.         Setcolor(3)
  191.         Printat(100,100,'Ist heute Sonntag?')
  192.         Defbutton(100,120,70,28,0,1,0,1,#74,'Marke1')
  193.         Defbutton(100,160,70,28,0,1,0,1,#78,'Marke2')
  194.         Setcolor(4)
  195.         Printat(110,125,' (J)a')
  196.         Printat(110,165,'(N)ein')
  197.         Setcolor(12)
  198.         Checkbutton('exit',30,0)
  199.  
  200.           :Marke1
  201.             Printat(100,200,'Hurra')
  202.             Goto('exit')
  203.           :Marke2
  204.             Printat(100,200,'Schade')
  205.             Goto('exit')
  206.           :exit
  207.           Pause(5000)
  208.         End
  209.  
  210. Dieses kleine Programm gibt eine Textzeile auf dem Bildschirm aus (mit der 
  211. linken oberen Textbox-Ecke an Pos. 100/100), erzeugt zwei Buttons (Tastenobjekte
  212. durch DEFBUTTON), weist diesen Objekten feste Sprungmarken zu (s. unter Lables),
  213. beschriftet diese und wartet dann bei CHECKBUTTON so lange auf einen Tastendruck
  214. oder Mausklick, bis die - als zweiter Parameter - angegebene Zeit von 30 
  215. Sekunden verstrichen ist. Wird zwischenzeitlich die Taste [ J ] (ASCII-Wert 
  216. 74 s. anhängende ASCII-Code-Tabelle) gedrückt, verzweigt OPTIX200 automatisch zu 
  217. dem bei DEFBUTTON definierten - Programmlabel 'Marke1'. Wird dagegen die Taste 
  218. [ N ] für 'Nein' gedrückt, wird zum Label 'Marke2' gesprungen. Das Programm 
  219. fährt dann - direkt im Anschluß an CHECKBUTTON - an dieser Einsprungstelle 
  220. fort. An diesen Stellen wird hier verbal auf die Eingabe reagiert, anschließend 
  221. 5 Sekunden (5000 Millisekunden) gewartet und dann das Programm beendet.
  222.  
  223. CHECKBUTTON reagiert ausschließlich auf den Druck der vorher durch DEFBUTTON 
  224. angegebenen Tasten. Alle anderen Tasten werden ignoriert. Ist der CHECKBUTTON-
  225. Befehl abgearbeitet - also eine Taste bedient  bzw. die angegebene Zeit 
  226. abgelaufen - werden alle vorher angemeldeten DEFBUTTON-Objekte intern gelöscht, 
  227. sodaß also für jede CHECKBUTTON-Abfrage die konkrete DEFBUTTON-Deklaration (en) 
  228. vorgenommen werden muß (müssen). 
  229.  
  230. Eine weitere Möglichkeit, die Tasten zu bedienen, ist, wenn mit der - vorher 
  231. durch CURSON aktivierten - Maus auf den entsprechenden Button (Auswahlknopf) 
  232. geklickt wird. Bei Einsatz von berührungsempfindlichen Bildschirmen mit SVGA-
  233. Mausemulation kann ein Button auch regelrecht mit dem Finger auf dem 
  234. Bildschirm'gedrückt' werden. OPTIX200 tut dann so, als wäre die Tastaturtaste mit 
  235. dem jeweiligen ASCII-Wert bedient worden.
  236.  
  237. Wurde innerhalb der 30 Sekunden kein Bediener-Ereignis festgestellt, springt 
  238. OPTIX200 von CHECKBUTTON aus direkt zum Label 'Exit', wodurch in diesem Fall das 
  239. Programm beendet wird.
  240.  
  241. Über die Maus- oder Touchscreen-Steuerung lassen sich im weitesten Sinne 
  242. 'interaktive' Strukturen verwirklichen, die dann so komplex auf Bediener-
  243. Einflüsse reagieren können, daß ein reine Button-Verwaltung mit automatischer 
  244. Sprungverteilung überfordert wäre (mehr dazu bei der Beschreibung der 
  245. Mausbefehle).  Ebenso sei es routinierten OPTIX-Programmierern vorbehalten, 
  246. durch Befehle wie READKEY, KEYPRESSED, ASC oder CHR eine eigene Tastatur-
  247. verwaltung zu realisieren, die dann auch erheblich komplexer ausfallen kann, 
  248. als die vorgegebenen Konventionen einer CHECKBUTTON-Abfrage. 
  249.  
  250. Dagegen ist eine CHECKBUTTON-Verteilung immer vorzuziehen, wenn es um die 
  251. Übersichtlichkeit von Bediener-Menüs geht, da eine einfachere Strukturierung 
  252. eines Programmablaufs als durch den DEFBUTTON-Befehl kaum denkbar sein dürfte.
  253.  
  254.  
  255.  
  256.  
  257. 3.  Interne Programmstruktur
  258.  
  259.  
  260. OPTIX200 ist eine strukturorientierte Programmiersprache.
  261.  
  262. Das heißt zuallererst, daß es nicht möglich ist, mehrere Befehle einfach in 
  263. eine Zeile zu schreiben, sondern daß jedem Befehl (bzw. jeder Aktion) sozusagen 
  264. eine eigene Zeile 'zusteht'. Das erfordert zwar eine verschwindende Kleinigkeit 
  265. mehr an Speicherplatz auf Ihrer Festplatte, hat aber den unschätzbaren Vorteil, 
  266. daß Sie Ihre eigenen Programme 'verstehen' lernen, da die Einrichtung einer 
  267. optischen Struktur erheblich dazu beiträgt, auch die Ablaufstruktur eines 
  268. Programmes besser zu visualisieren. Das erhöht die Qualität und die Effizienz 
  269. eines Programmes ungemein. Fragen Sie einen professionellen Programmierer, ob 
  270. er auf seine Programmstruktur verzichten würde. Sie dürften ihm alles wegnehmen 
  271. - sogar das Frühstücksbrötchen - aber  nie  seine Programmstrukturierung.
  272.  
  273. Die zweite Konsequenz einer strukturorientierten Programmiersprache ist die 
  274. Verwendung bestimmter Befehle, die immer paarweise verwendet werden und ganz 
  275. speziell dafür zuständig sind, Ordnung zu schaffen, bzw. bestimmte 
  276. Programmteilen je nach ihrer Gültigkeit auszuführen - oder es eben auch zu 
  277. lassen. 
  278.  
  279. OPTIX200 kennt z.B.:
  280.  
  281.   PROCEDURE      FOR        DO          IF    REPEAT
  282.   .......      ....        ....      ....    ....
  283.   RETURN      NEXT        LOOP      ELSE    UNTIL
  284.                       ....
  285.                           ENDIF
  286.  
  287. Keiner dieser Befehle kann für sich allein verwendet werden. So gibt es immer 
  288. einen strukturöffnenden Befehl (oben) mit einem dazugehörigen struktur-
  289. schließenden Befehl (unten). Eine Ausnahme bildet die ELSE-Anweisung 
  290. ('sonst' / 'anderenfalls'), die automatisch den unter ihr folgenden 
  291. Programmteil dann ausführt, wenn die unter IF gestellte Bedingung nicht 
  292. zutreffend war. ELSE ist für die Verwendung von IF/ENDIF nicht unbedingt 
  293. erforderlich, kann allerdings auch nicht alleinstehend verwendet werden. 
  294. IF und ENDIF sind dagegen - wie die anderen Strukturbefehle - aufeinander 
  295. angewiesen. 
  296.  
  297. Eine wichtige Fähigkeit von OPTIX ist es, daß sämtliche Strukturen beliebig 
  298. ineinander 'verschachtelt' werden können. So sind z.B. folgende Konstruktionen 
  299. durchaus denkbar:
  300.  
  301.             PROCEDURE ...
  302.               IF Bedingung
  303.                 ...
  304.               ELSE
  305.                 IF Bedingung
  306.                   FOR I...
  307.                     DO
  308.                       ...
  309.                     LOOP
  310.                     IF Bedingung
  311.                       ...
  312.                       IF Bedingung
  313.                         ...
  314.                       ENDIF
  315.                     ELSE
  316.                       ...
  317.                     ENDIF
  318.                     FOR J...
  319.                    REPEAT
  320.                     ...
  321.                    UNTIL Bedingung
  322.                       ...
  323.                     NEXT(J)
  324.                   NEXT(I)
  325.                  ENDIF
  326.                 ENDIF
  327.               RETURN
  328.                
  329. Werden diese Befehle sinnvoll eingesetzt, ist es immer wieder erstaunlich, 
  330. wieweit es damit möglich ist, einem Programm 'Intelligenz' beizubringen.
  331.     
  332.  
  333.  
  334. 4.  Programmablauf
  335.  
  336. Ein Programm ist in erster Linie die sinnvolle Aneinanderreihung von einzelnen 
  337. Befehlen, die genau in der Reihenfolge Stück für Stück abgearbeitet werden, 
  338. wie sie dem Compiler/Encoder erscheinen. Nur durch die eben genannten Struktur-
  339. Befehle (CHECKBUTTON, TIMEOUT, GOTO, IF, DO, FOR, REPEAT und Prozeduraufrufe 
  340. etc.) läßt sich diese Ablauffolge - unabhängig von ihrem optischen Erscheinen 
  341. im Programmlisting - nach Bedarf beliebig steuern.
  342.  
  343.  
  344. Versuchen wir uns nun ein wenig an der Grafik.
  345.  
  346.         REM  gelbes Kreuz
  347.         BEGIN
  348.           CLEARSCREEN(8)
  349.             PAUSE(1000)
  350.             SETCOLOR(14)
  351.             LINE(0,0,639,479,0)
  352.            LINE(639,0,0,479,0)
  353.            PAUSE(0)
  354.         END
  355.  
  356. Das Programm zeichnet zwei diagonale Linien auf einen grauen Hintergrund. Die 
  357. Hintergrundfarbe wird mit CLEARSCREEN(8) festgelegt. SETCOLOR bestimmt die 
  358. Zeichenfarbe für eine Reihe grafischer Funktionen. In diesem Falle die Farbe 
  359. der beiden Linien. Die Lage einer Linie auf dem Bildschirm wird durch die 
  360. Koordinaten ihres Anfangs- und Endpunktes bestimmt. 
  361.  
  362. 5.  Die erste Linie
  363.  
  364.         LINE(0,0,639,479,2)
  365.  
  366. beginnt demnach auf dem Punkt X = 0 und Y = 0, d.h. in der linken oberen Ecke 
  367. des Bildschirms. Der Endpunkt liegt auf den Koordinaten X = 639 und Y = 479, 
  368. das ist die rechte untere Ecke.  Der fünfte Parameter, der hier mit 2 angegeben
  369. ist, erzeugt eine Zeitverzögerung beim Zeichnen der Linie; je größer der Wert, 
  370. umso langsamer wird die Linie gezeichnet. Die Angabe einer Null bewirkt das 
  371. Zeichnen mit höchstem Tempo. Es lassen sich damit sehr effektvolle dynamische 
  372. Abläufe erzeugen. Wenn wir für die Zeitverzögerung eine 100 einsetzen, kann 
  373. die Linie beim Entstehen gut verfolgt werden:
  374.  
  375.         LINE(0,0,639,479,100)
  376.  
  377. Die Zeichengeschwindigkeit ist unter anderem auch von der Taktfrequenz des 
  378. Computers abhängig; es wäre praktisch, wenn  sich die Zeitverzögerung für 
  379. beide Linien gemeinsam einstellen liesse. Dieses Problem lässt sich durch 
  380. die Einführung von  Variablen lösen.
  381.  
  382. Fortschrittliche Programmiersprachen haben selbstverständlich auch ein 
  383. reichhaltiges Angebot an grafischen Befehlen. Das ist ganz und garnicht 
  384. so selbstverständlich, wie es auf den ersten Blick erscheint. Vor nur 
  385. wenigen Jahren mussten die ALGORITHMEN dazu noch per Hand geschrieben werden - 
  386. und wer weiß schon aus dem Stehgreif, wie ein Kreis oder eine Ellipse 
  387. konstruiert wird.
  388.  
  389. Unter OPTIX haben Sie es da einfacher. In der Befehlsliste im Anhang finden 
  390. Sie eine Fülle von Grafikbefehlen, deren Bedienung denkbar einfach ist. Unser 
  391. Bildschirm ist im Normalfall in der SVGA-Auflösung in 640 Bildpunkte horizontal
  392. und 480 Bildpunkte vertikal eingeteilt. Der Bildpunkt mit der Koordinate 0/0 
  393. liegt dabei in der äußersten Bildschirmecke linksoben. Durch dieses Wissen läßt
  394. sich nun jeder einzelne Bildschirmpunkt auch einzeln benennen. Sie brauchen 
  395. sich also nur zu entscheiden, an welcher Bildschirmposition Sie ein Grafik-
  396. Objekt sehen möchten, übergeben dem Befehl, bzw. vorher dem VIEWPORT die 
  397. entsprechenden Koordinaten und schon erscheint das Objekt.
  398.  
  399. Die folgende Zeile zeichnet einen Ellipsenumriss mit der Farbe 9, deren 
  400. Zentrum genau in der Mitte des Bildschirms liegt.
  401.  
  402.     ELLIPSE(XMAX/2,YMAX/2,120,80,9)
  403.  
  404. Die ersten beiden Parameter bestimmen die Position, der dritte den horizontalen,
  405. der vierte den vertikalen Radius sowie der fünfte die Farbe der Ellipse.  Mit 
  406. diesen Informationen und den Beschreibungen der Befehle werden Sie sicherlich 
  407. keine größeren Probleme mit der Grafik haben.
  408.  
  409. Malen Sie doch mal ein kleines Bild mit dem folgenden Programm.
  410.  
  411.     def(flag)
  412.     def(x)
  413.     def(y)
  414.     def(xx)
  415.     def(yy)
  416.  
  417.     procedure vbox(xl,yo,xr,yu)
  418.        vline(xl,yo,xr,yo,0)
  419.        vline(xl,yo+1,xl,yu-1,0)
  420.        vline(xr,yo+1,xr,yu-1,0)
  421.        vline(xl,yu,xr,yu,0)
  422.     return
  423.  
  424.     begin
  425.     
  426.     setcolor(9)            Text- und Linienfarbe
  427.     printat(10,10,'Bitte Maustaste drücken')
  428.  
  429.     :ever                Hauptschleifenstart 
  430.       repeat            1. REPEATSchleife     ---.
  431.       until mousek<>0        wartet auf Mausklick     ---'
  432.       x:=mousex            Mauskoordinaten in x,y
  433.       y:=mousey            Mauskoordinaten in x,y
  434.       repeat            2. REPEAT-Schleife     --.
  435.         xx:=mousex            neue X-Maus in xx      |    
  436.         yy:=mousey            neue Y-Maus in yy      |
  437.         if mousek=1            linke Maustaste ?      |
  438.           line(X,Y,Xx,Yy,0)        dann Linie zeichnen      |    
  439.           x:=xx            neue Koord. werden..      |
  440.           y:=yy            ...alte Koordinaten      |
  441.         endif                          |
  442.         if mousek=2            rechte Maustaste ?      |
  443.           flag:=true        merken              |
  444.           vbox(x,y,xx,yy)        virtuelle Box zeichnen      |
  445.           vbox(x,y,xx,yy)        virtuelle Box löschen      |
  446.         endif                          |
  447.         if mousek=3            beide Maustasten ?      |
  448.           flag:=false        Merker löschen          |
  449.           viewport(x,y,xx,yy)    Box definieren          |
  450.           cbox(8,9,0)        Vollbox zeichnen      |
  451.           setcolor(12)        andere Farbe          |
  452.           rectangle            Rahmen zeichnen          |
  453.           setcolor(9)        Farbe zurücksetzen      |
  454.         endif                          |
  455.       until mousek=0        Taste losgelassen?    --'
  456.       if flag=true            Merker für Maustaste 2 an ?
  457.         flag:=false            dann Merker löschen 
  458.         viewport(x,y,xx,yy)        Boxkoordinaten definieren
  459.         rectangle            Box nochmal zeichnen
  460.       endif
  461.     goto('ever')            zum Hauptschleifenstart
  462.     end
  463.  
  464. Hier finden Sie gleich ein Beispiel für den Einsatz von Flags.
  465.  
  466. 'Flag'  ist hier eine völlig beliebige Variable, die die Aufgabe hat, sich zu 
  467. merken, ob in der 2. REPEAT-Schleife die rechte Maustaste gedrückt wurde. 
  468. Wurde sie das, wird im virtuellen (XOR-) Modus zweimal eine Box auf dieselbe 
  469. Stelle gezeichnet. Dieses hat den Effekt, daß die Box bei jedem Durchlauf nur 
  470. für einen kurzen Moment zu sehen ist. Wird die rechte Maustaste wieder 
  471. losgelassen, wird anschließend die Box nocheinmal im Standard- (Replace-) 
  472. Modus gezeichnet.
  473.  
  474. Bei diesem Programm wird eine Eigenart einiger Maustreiber deutlich. Sobald
  475. beide Maustasten gleichzeitig gedrückt, schaltet der Maustreiber zwischen zwei
  476. Arbeitsmodi hin und her. Wobei der eine Modus die 'merkwürdige' Angewohnheit
  477. hat, abhängig von der Geschwindigkeit der Mausbewegung die aktuellen Maus-
  478. koordinaten langsam oder schnell zurückzugeben. Diese 'rechteckige' Arbeits-
  479. weise läßt sich bei diesem Programm sehr gut beobachten.
  480.