home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / GEM / AESFORMS.D < prev    next >
Encoding:
Modula Definition  |  1990-10-09  |  9.8 KB  |  227 lines

  1. DEFINITION MODULE AESForms;
  2.  
  3.  
  4. (*  Megamax Modula-2 GEM-Library :  Die AES Formularfunktionen
  5.  *
  6.  *  Autor: Manuel Chakravarty           Erstellt :  05.11.87
  7.  *
  8.  *  Version   2.2     V#0015
  9.  *)
  10.  
  11.  
  12. (*      Dieses Modul unterstützt die Benutzung von Formularen (Dialogboxen).
  13.  *
  14.  *      Die Prozeduren 'FormError' und 'FormAlert' führen dabei einen kom-
  15.  *      pletten Dialog und bauen die benötigte Objektbaumstruktur selbst-
  16.  *      ständig auf.
  17.  *      Die restlichen Routinen übernehmen jeweils Teilaufgaben beim Führen
  18.  *      eines Dialogs mit einer vom Benutzer frei definierbaren Dialogbox,
  19.  *      deren Definition in Form eines Objektbaumes (siehe 'GEMGlobals')
  20.  *      vorhanden sein muß.
  21.  *)
  22.  
  23.  
  24. FROM GrafBase   IMPORT Rectangle;
  25.  
  26. FROM GEMGlobals IMPORT GemChar, PtrObjTree;
  27.  
  28.  
  29.                         (*  Form Manager  *)
  30.                         (*  ============  *)
  31.  
  32. PROCEDURE FormCenter (tree: PtrObjTree): Rectangle;
  33.  
  34.         (*  Zentriert Dialogbox und liefert den belegten Bildschirmbereich.
  35.          *
  36.          *  Dabei ist 'tree' der Objektbaum, der die Box beschreibt und es
  37.          *  werden die Ausmaße und die neue Position der Dialogbox als Funk-
  38.          *  tionswert geliefert.
  39.          *)
  40.  
  41.  
  42. TYPE    FormDialMode    = (reserveForm, growForm, shrinkForm, freeForm);
  43.         
  44. PROCEDURE FormDial (flag: FormDialMode; little, big: Rectangle);
  45.  
  46.         (*  Bereitet einen Dialog vor und beendet ihn auch wieder.
  47.          *
  48.          *  Eingabeparameter:
  49.          *  -----------------
  50.          *
  51.          *  'flag'      -- Bestimmt die Funktion der Routine (siehe unten).
  52.          *  'big'       -- Größe und Position der Dialogbox (z.B. von
  53.          *                 'FormCenter').
  54.          *  'little'    -- Bildschirmbereich in dem das Objekt (Menüpunkt,
  55.          *                 Icon, etc.) liegt, das den Dialog ausgelößt hat.
  56.          *                 Wird nur bei 'growForm' und 'shrinkForm' gebrau-
  57.          *                 cht.
  58.          *
  59.          *  Funktionen:
  60.          *  -----------
  61.          *
  62.          *  'reserveForm' -- Reserviert den von der Dialogbox belegten Bild-
  63.          *                   schirmbereich.
  64.          *  'growForm'    -- Zeichnet ein sich ausdehnendes Rechteck.
  65.          *  'shrinkForm'  -- Zeichnet ein schrumpfendes Rechteck.
  66.          *  'freeForm'    -- Gibt den von der Dialogbox belegten Bildschirm-
  67.          *                   bereich wieder frei, dabei wird das Neuzeichnen
  68.          *                   des Bereichs veranlaßt.
  69.          *
  70.          *  Die zweite und dritte Funktion ist optional, daß heißt sie sind
  71.          *  beide schön anzusehen, für das korrekt Funktionieren des Dialogs
  72.          *  sind sie aber nicht notwendig.
  73.          *
  74.          *  Der vierte Modus ist gut geeignet das Neuzeichnen, bestimmter
  75.          *  Bildschirmausschnitte, zu erzwingen.
  76.          *)
  77.         
  78. PROCEDURE FormDo (tree: PtrObjTree; first: CARDINAL; VAR retBut: CARDINAL);
  79.  
  80.         (*  Führt einen Teildialog durch, daß heißt alle vom Benutzer inner-
  81.          *  halb der Dialogbox durchgeführten Aktionen werden selbständig
  82.          *  ausgewehrtet. Erst beim Selektieren eines Objektes mit gesetztem
  83.          *  'selectExitFlg'-Flag oder Anklicken eines Objektes mit gesetztem
  84.          *  'touchExitFlag' kehrt die Routine zurück.
  85.          *
  86.          *  Eingabeparameter:
  87.          *  -----------------
  88.          *
  89.          *  'tree'      -- Objektbaum, der die Dialogbox beschreibt.
  90.          *  'first'     -- Objektindex, der edierbaren Zeichenkette, auf
  91.          *                 der der Cursor zuerst plaziert werden soll.
  92.          *                 'Root' sollte übergeben werden, falls kein sol-
  93.          *                 ches Feld existiert, oder das erste im Baum be-
  94.          *                 nutzt werden soll.
  95.          *
  96.          *  Ausgabeparameter:
  97.          *  -----------------
  98.          *
  99.          *  'retBut'    -- Index des Objektes, dessen Selektieren oder An-
  100.          *                 klicken den Teildialog abgebrochen hat.
  101.          *
  102.          *    WICHTIG: Wird die Dialogbox mit einem Doppelklick verlassen,
  103.          *             so ist das höchstwertige Bit von 'retBut' gesetzt,
  104.          *             d.h., der Wert ist um 32768 größer und muß unbedingt
  105.          *             abgezogen werden, wenn der Wert als Index im Baum
  106.          *             weiterbenutzt oder verglichen werden soll!
  107.          *
  108.          *  Voraussetzung für das korrekte Funktionieren, dieser Prozedur,
  109.          *  ist, daß sich die von 'tree' beschriebene Dialogbox schon auf
  110.          *  dem Bildschirm befindet.
  111.          *)
  112.          
  113.  
  114. PROCEDURE FormAlert (    defBut: CARDINAL;
  115.                      REF str   : ARRAY OF CHAR;
  116.                      VAR retBut: CARDINAL);
  117.  
  118.         (*  Führt einen vollständigen Dialog mit dem Benutzer. Der Dialog
  119.          *  ist auf einen maximal 5 zeiligen Text und die Angabe von bis
  120.          *  zu 3 Knöpfen begrenzt.
  121.          *
  122.          *  Es bestimmt 'defBut' den Standardknopf, d.h. den Knopf, der
  123.          *  selektiert wird, sobald der Benutzer die <Return>-Taste drückt.
  124.          *  Außerdem bestimmt 'str' den Inhalt der Dialogbox und 'retBut'
  125.          *  liefert den Knopf, dessen Selektion den Dialog beendet hat.
  126.          *
  127.          *  Diese Art von Formularen wird meist für Fehler- oder Warnmel-
  128.          *  dungen benutzt, ihr Inhalt wird wie folgt festgelegt.
  129.          *
  130.          *  Aufbau von 'str':
  131.          *  -----------------
  132.          *
  133.          *  Syntax:    '[' <Icon> '][' <Text> '][' <Knöpfe> ']'
  134.          *
  135.          *  Dabei ist,
  136.          *
  137.          *    <Icon> eine Zahl zwischen 0 und 3
  138.          *
  139.          *              0 -- kein Icon (Piktogramm)
  140.          *              1 -- NOTE-Icon
  141.          *              2 -- WAIT-Icon
  142.          *              3 -- STOP-Icon
  143.          *
  144.          *    <Text> ein String, der in maximal 5 Blöcke mit 29 Zeichen
  145.          *    aufgeteilt ist. Die Trennung der einzelnen Blöcke, die von
  146.          *    der Routine in verschiedenen Zeilen ausgegeben werden, fin-
  147.          *    det durch '|' statt;
  148.          *
  149.          *    <Knöpfe> ist ebenfalls eine Zeichenkette, die durch '|' in
  150.          *    diesmal höchstens 3 Blöcke zu je 9 Zeichen geteilt wird.
  151.          *    Jeder Block wird auf dem Bildschirm zu einem Knopf (button).
  152.          *    Die Buttons werden von links nach rechts von 1 bis 3 durch-
  153.          *    nummeriert.
  154.          *
  155.          *  Eine Besonderheit dieses Dialoges ist, daß der Bildschirmhinter-
  156.          *  grund automatisch gerettet und am Dialogende wiederhergestellt
  157.          *  wird.
  158.          *
  159.          *  Beispiel:
  160.          *  ---------
  161.          *
  162.          *    FormAlert(1,'[3][ *** BUS ERROR *** | in Zeile 5!][ Pech ]',but)
  163.          *
  164.          *    Es würde das STOP-Icon erscheinen mit dem Text ' *** BUS
  165.          *    ERROR *** ' in der ersten und ' in Zeile 5!' in zweiten
  166.          *    Zeile. Der einzige Knopf wäre gleichzeitig Standardknopf
  167.          *    und besäße den Text ' Pech '.
  168.          *    'but' muß eine Variable vom Typ CARDINAL sein.
  169.          *)
  170.  
  171. PROCEDURE FormError (errNo: INTEGER);
  172.  
  173.         (*  Gibt eine Systemfehlermeldung mit Hilfe einer Alertbox aus.
  174.          *
  175.          *  'errNo' kann die folg. Werte annehmen:
  176.          *
  177.          *    2, 3, 18: "Diese Anwendung kann Datei oder Ordner nicht finden"
  178.          *    4: "Kein Platz mehr für weitere Fenster - Bitte eins schließen"
  179.          *    5: "Datei existiert bereits oder ist Schreibgeschützt"
  180.          *    8, 10, 11: "Es steht nicht genug Speicher für diese Anwendung
  181.          *                zur Verfügung"
  182.          *    15: "Dieses Laufwerk ist nicht vorhanden"
  183.          *
  184.          *  Diese Werte entsprechen übrigens den Fehlernummern bei MS-DOS.
  185.          *)
  186.  
  187. PROCEDURE FormKeyboard (    tree   : PtrObjTree;
  188.                             index  : CARDINAL;
  189.                         VAR nextObj: CARDINAL;
  190.                         VAR ch     : GemChar;
  191.                         VAR cont   : BOOLEAN);
  192.                         
  193.         (*  Diese Prozedur verarbeitet die bei einer Dialogsitzung anfal-
  194.          *  lenden Steuerzeichen.
  195.          *  Es ist 'tree' ein Zeiger auf das Dialogformular und 'index', der
  196.          *  Baumindex des zu edierenden Objekts (= 0, falls keines vorhanden).
  197.          *  'nextObj' ist der Index des nächsten Objekts und 'ch' enthält die
  198.          *  betätigte Taste. Falls 'ch' ein Steuerzeichen enthält, so wird
  199.          *  dies bearbeitet und 'ch' der Wert 0C zugewiesen, sonst wird 'ch'
  200.          *  nicht verändert und kann mit 'AESObject.EditObjText' weiterver-
  201.          *  arbeitet werden. 'nextObj' liefert das nächste Objekt.
  202.          *  Ist 'cont = FALSE', so sollte der Teildialog abgebrochen werden,
  203.          *  da zum Beispiel ein mit 'selectExitFlg' gekennzeichnetes Objekt
  204.          *  angewählt wurde.
  205.          *)
  206.  
  207. PROCEDURE FormButton (    tree   : PtrObjTree;
  208.                           index  : CARDINAL;
  209.                           clicks : CARDINAL;
  210.                       VAR nextObj: CARDINAL;
  211.                       VAR cont   : BOOLEAN);
  212.                       
  213.         (*  Mit Hilfe dieser Routine können die Mausklicks einer Dialog-
  214.          *  sitzung verarbeitet werden.
  215.          *  'tree' ist der Formularbaum und 'index' enthält das angeklickte
  216.          *  Objekt. In 'clicks' steht, wie oft der Mausknopf gedrückt wurde
  217.          *  und in 'nextObj' wird das nächste Objekt zurückgegeben.
  218.          *  Je nach Objekttyp von 'obj' führt die Routine die entsprechenden
  219.          *  Aktionen aus, wie zum Beispiel Objekt selektieren und Radioknöpfe
  220.          *  verändern.
  221.          *  Ist 'cont = FALSE', so sollte der Teildialog abgebrochen werden,
  222.          *  da zum Beispiel ein mit 'selectExitFlg' gekennzeichnetes Objekt
  223.          *  angewählt wurde.
  224.          *)
  225.  
  226.  
  227. END AESForms.