home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / window / windowc / window.doc < prev   
Encoding:
Text File  |  1993-07-29  |  166.4 KB  |  3,385 lines

  1.  
  2.         Jürgen Altfeld
  3.         Hofkurat-Diehl-Str. 7
  4.  
  5.         D-8042 Oberschleißheim (bei München)
  6.  
  7.         West Germany                            Tel.: (089) 315 44 44
  8.  
  9.  
  10.  
  11.  
  12.         Mitglied  der  I.d.S
  13.  
  14.     ┌──────────────────────────────────────────────────────────────────────┐
  15.     │                                                                      │
  16.     │              █▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒      ████████ Autoren               │
  17.     │              ██ ┌─╖   ┌╖┌───╖ ▒▒     █▒▒▒▒▒▒▒▒ Händler               │
  18.     │              ██ │ ║   │║│╔══╝ ▒▒    █▒▓▓▓▓▓▓▓▓ Anwender              │
  19.     │              ██ │ ║┌──┘║│╙──╖ ▒▒   █▒▓                               │
  20.     │              ██ │ ║│╔═╕║╘══╕║ ▒▒ ──────────────────────              │
  21.     │              ██ │ ║│╙─┘║┌──┘║ ▒▒ Interessengemeinschaft              │
  22.     │              ██ ╘═╝╘═══╝╘═══╝ ▒▒ deutschsprachiger                   │
  23.     │              ██████████████████▒ Shareware                           │
  24.     │                                                                      │
  25.     └──────────────────────────────────────────────────────────────────────┘
  26.  
  27.  
  28.  
  29.     ╔══════════════════════════════════════════════════════════════════════╗
  30.     ║                                                                      ║
  31.     ║   ╔═╗     ╔═╗                         ╔═╗                            ║
  32.     ║   ║ ║     ║ ║   ╔═╗                   ║ ║                            ║
  33.     ║   ║ ║     ║ ║   ╚═╝                   ║ ║                            ║
  34.     ║   ║ ║ ╔═╗ ║ ║   ╔═╗   ╔══════╗   ╔════╝ ║   ╔══════╗   ╔═╗     ╔═╗   ║
  35.     ║   ║ ║ ║ ║ ║ ║   ║ ║   ║ ╔══╗ ║   ║ ╔══╗ ║   ║ ╔══╗ ║   ║ ║ ╔═╗ ║ ║   ║
  36.     ║   ║ ║ ║ ║ ║ ║   ║ ║   ║ ║  ║ ║   ║ ║  ║ ║   ║ ║  ║ ║   ║ ║ ║ ║ ║ ║   ║
  37.     ║   ║ ╚═╝ ╚═╝ ║   ║ ║   ║ ║  ║ ║   ║ ╚══╝ ║   ║ ╚══╝ ║   ║ ╚═╝ ╚═╝ ║   ║
  38.     ║   ╚═════════╝   ╚═╝   ╚═╝  ╚═╝   ╚══════╝   ╚══════╝   ╚═════════╝   ║
  39.     ║                                                                      ║
  40.     ╚══════════════════════════════════════════════════════════════════════╝
  41.  
  42.  
  43.       ┌───────┐         ┌───────┐  ┌───────┐  ┌───────┐  ┌─┐    ┌┐
  44.       │ ┌─────┘         └──┐ ┌──┘  │ ┌───┐ │  │ ┌───┐ │  │ │    └┘ ┌──────┐
  45.       │ │                  │ │     │ │   │ │  │ │   │ │  │ │       │ ┌────┘
  46.       │ │       ┌─────┐    │ │     │ │   │ │  │ │   │ │  │ │       │ └────┐
  47.       │ │       └─────┘    │ │     │ │   │ │  │ │   │ │  │ │       └────┐ │
  48.       │ └─────┐            │ │     │ └───┘ │  │ └───┘ │  │ └────┐  ┌────┘ │
  49.       └───────┘            └─┘     └───────┘  └───────┘  └──────┘  └──────┘
  50.  
  51.  
  52.  
  53.  
  54.         Anfragen  jeder  Art,  die  eine schriftliche Antwort oder einen
  55.         telefonischen Rückruf von mir erfordern, werden nur gegen  einen
  56.         Unkostenbeitrag   von   DM   3,--  (am  besten  in  Briefmarken)
  57.         bearbeitet!
  58.  
  59.  
  60.  
  61.  
  62.  
  63.                WINDOW.C - Die Toolbox für Quick-C ab Version 2.0
  64.               ===================================================
  65.  
  66.  
  67.  
  68.         Inhaltsverzeichnis:
  69.  
  70.              Kapitel:             Themen:
  71.  
  72.                 1.    Allgemeines
  73.                 1.1       Kurzbeschreibung
  74.                 1.2       Hard- und Softwarevoraussetzungen
  75.                 1.3       Konfiguration der Quick-C-Entwicklungsumgebung
  76.                 1.4       Installation der Toolbox auf Festplatte / Disk.
  77.                 1.5       Erweiterungen der Toolbox
  78.                 2.    Haftung und Lizenzvertrag
  79.                 2.1       Lizenzvertrag und Rechte Dritter
  80.                 2.2       Haftung und Gewähr
  81.                 3.    Einleitung
  82.                 4.    Neue Datentypen und Variablen der Toolbox
  83.                 4.1       Windows
  84.                 4.2       Menüpunkte
  85.                 4.3       Globale Variablen
  86.                 5.    Funktionen der Toolbox
  87.                 5.1       Verwaltung der Toolbox
  88.                 5.2       Allgemeine Ein- / Ausgaben beim Bildschirm
  89.                 5.3       Windows
  90.                 5.4       Menüs
  91.                 5.5       Dateiverwaltung
  92.                 5.6       Sonstige
  93.                 6.    Beispiele und praktische Hinweise
  94.                 7.    Programm-Beispiel
  95.                 8.    Anwenderfreundliche Menüs
  96.  
  97.  
  98.                 Anhang:
  99.  
  100.                 A     Kurzreferenz / Zusammenfassung der wichtigsten
  101.                       globalen Variablen und Funktionen
  102.                    1.     Globale Variablen
  103.                    2.     Funktionen
  104.                    3.     Einfügedateien innerhalb der Toolbox
  105.                 B      Evtl. auftretende Probleme und deren Lösung
  106.                 C      Inkrementales Compilieren
  107.  
  108.  
  109.  
  110.  
  111.                            Dokumentation von WINDOW.C
  112.                           ============================
  113.  
  114.  
  115.  
  116.         Stand der Dokumentation: 16.07.90
  117.  
  118.         Versions-Nummer der Toolbox "WINDOW.C": v1.0 (bei Vollversion)
  119.                                                 v1.0sw (bei Shareware)
  120.  
  121.  
  122.  
  123.  
  124.         Diese   Dokumentation   beschreibt   sowohl   die   registrierte
  125.         Vollversion als auch die Shareware-Version.  Bitte beachten Sie,
  126.         daß  in  der Shareware-Version einige leistungsstarke Funktionen
  127.         nicht enthalten sind (z.  B.  "inhalt", "color" u.   a.)!   Auch
  128.         wurden  einige  Hinweis-Fenster  eingebaut.   Ansonsten  hat die
  129.         Shareware-Version keinerlei programmtechnische  Einschränkungen.
  130.         Die    Shareware-Version   ist   voll   aufwärtskompatibel   zur
  131.         Vollversion.
  132.  
  133.  
  134.         In der Shareware-Version dürfen keinerlei Veränderungen  an  dem
  135.         Quelltext  der  Toolbox vorgenommen werden!  Außerdem dürfen die
  136.         mit der Shareware-Version der Toolbox erstellten  Programme  nur
  137.         für   persönliche   (unentgeltliche)  Zwecke  verwendet  werden.
  138.         Sobald  Sie  die  Programme   unentgeltlich   weitergeben   oder
  139.         verkaufen wollen, müssen Sie sich registrieren lassen!
  140.  
  141.  
  142.  
  143.  
  144. -----  1. Allgemeines  -------------------------------------------------------
  145.  
  146.  
  147.         1.1 Kurzbeschreibung
  148.  
  149.             Die   Toolbox   "WINDOW.C"   beinhaltet   eine   Reihe   von
  150.             Unterroutinen,    mit    deren    Hilfe    man   komfortable
  151.             Benutzeroberflächen in eigene Programme einbauen kann.   Sie
  152.             haben   nun   die   Möglichkeit,   fast   unbegrenzt   viele
  153.             Bildschirmfenster (Windows) zu öffnen.  Dabei wird der  alte
  154.             Bildschirm-  hintergrund  nach  dem  Schließen  des  Windows
  155.             wieder restauriert.
  156.  
  157.             Sie können außerdem beliebige Auswahl-Menüs in Ihre Programme
  158.             einbauen, seien es Pop-Up- oder Pull-Down-Menüs.
  159.  
  160.             Mit Hilfe von Fenstern können beliebige Dialogboxen erstellt
  161.             werden.
  162.  
  163.             Sämtliche Farben sind vom Anwender anpassbar.  Es  existiert
  164.             sogar  eine  Funktion,  die  in  einem  Window  alle  Farben
  165.             anzeigt.  Der Anwender kann dann die Farben  auswählen,  die
  166.             seinen Wünschen am meisten entsprechen.
  167.  
  168.             Die  Toolbox  arbeitet  mit  allen Grafikkarten zusammen, die
  169.             einen Textmodus darstellen können, d.  h.  die kompatibel zur
  170.             MDA-Karte sind.  Beim Aktivieren der Toolbox wird automatisch
  171.             die passende Bildschirmkarte erkannt und der beste  Textmodus
  172.             eingeschaltet.
  173.  
  174.             Der  Grafikmodus wird NICHT unterstützt.  Es kann nur in den
  175.             Textmodi gearbeitet werden, die den Text  mit  einer  Breite
  176.             von 80 Zeichen und mindestens 25 Zeilen darstellen.
  177.  
  178.             Des weiteren ist eine Funktion integriert, die  die  bequeme
  179.             Auswahl  einer Datei erlaubt.  In komfortabelster Weise kann
  180.             man den Pfad oder das Laufwerk wechseln, ohne daß man  deren
  181.             Bezeichnungen   eintippt.   Die  gesamte  Steuerung  erfolgt
  182.             innerhalb eines Windows und ist menü-orientiert!
  183.  
  184.             Es  wird  eine  Funktion  zur   komfortablen   Eingabe   und
  185.             Bearbeitung von Strings mitgeliefert.
  186.  
  187.             Die   Toolbox  ermöglicht  es,  die  eigenen  Programme  mit
  188.             kontext-sensitiven Hilfefunktionen zu versehen.  Die bereits
  189.             in  der   Toolbox   vorgefertigten   Funktionen   beinhalten
  190.             ebenfalls,      soweit      notwendig,     kontext-sensitive
  191.             Hilfsbildschirme.
  192.  
  193.             Das mitgelieferte Programm "DEMO.EXE" demonstriert, was  die
  194.             Toolbox alles kann.
  195.  
  196.             Die   Toolbox   unterstützt   übrigens   alle  Speichermodelle
  197.             (Small, Medium, Compakt, Large und Huge).  Probleme sind  mir
  198.             bisher  nicht  bekannt.   Für  entsprechende Hinweise bin ich
  199.             dankbar.
  200.  
  201.             Zeitkritische   Routinen   wurden   komplett   in   Assembler
  202.             geschrieben.  Hierdurch wird die hohe  Verarbeitungsgeschwin-
  203.             digkeit der Toolbox erreicht.
  204.  
  205.             Die Auslieferung der Toolbox  erfolgt  mit  dem  vollständig
  206.             dokumentierten  Quellcode  in  C  und Assembler!  Somit sind
  207.             Änderungen ohne weiteres möglich.
  208.  
  209.  
  210.  
  211.         1.2 Hard- und Softwarevoraussetzungen
  212.  
  213.             Hardware-Voraussetzungen zum Compilieren:
  214.  
  215.             - mind. 2 Diskettenlaufwerke (Festplatte empfohlen) für den
  216.               Microsoft Quick C Compiler
  217.  
  218.             - mind. 512 KByte verfügbaren Arbeitsspeicher
  219.  
  220.             - DOS 3.0 oder höher
  221.  
  222.             - beliebige Grafikkarte
  223.  
  224.  
  225.             Software-Voraussetzungen zum Compilieren:
  226.  
  227.             - Microsoft  Quick  C  Compiler  Version  2.0 oder höher zum
  228.               Compilieren des Quelltextes (WINDOW.C).  Der  Microsoft  C
  229.               Compiler  MSC kann nicht benutzt werden, da der eingebaute
  230.               In-Line-Assembler  von  Quick  C  2.0  zum  Einbinden  von
  231.               Assembler-Routinen  verwendet  wird;  ebensowenig kann der
  232.               Turbo-C,  Power  C  oder  sonst  ein  anderer   C-Compiler
  233.               verwendet  werden,  ohne  daß  die Toolbox vorher an diese
  234.               Compiler angepaßt wurde.
  235.  
  236.  
  237.             Hard- und Software-Voraussetzungen für die mit  der  Toolbox
  238.             erstellten Programme:
  239.  
  240.             - DOS 3.0 oder höher
  241.  
  242.             - mind. 1 Diskettenlaufwerk
  243.  
  244.             - beliebige Grafikkarte
  245.  
  246.             - mind. 512 KB Speicherplatz
  247.  
  248.  
  249.  
  250.         1.3 Konfiguration der Quick-C-Entwicklungsumgebung
  251.  
  252.            !!!   W I C H T I G:   !!!
  253.  
  254.            Für    die    Benutzung    der    Toolbox    innerhalb    der
  255.            Quick-C-Entwicklungsumgebung    müssen    die     nachfolgend
  256.            aufgeführten   Einstellungen  vorgenommen  werden,  ansonsten
  257.            arbeitet die Toolbox nicht korrekt!
  258.  
  259.            Die Benutzung der Entwicklungsumgebung wird  sehr  empfohlen,
  260.            weil sie keinerlei Nachteile mit sich bringt!
  261.  
  262.            Die Größe des Stacks muß mindestens auf 8192 Bytes festgelegt
  263.            werden.  Innerhalb der Quick-C-Entwicklungsumgebung geschieht
  264.            dies  in dem Menü "Optionen -> Make...  -> Linker-Marken" bei
  265.            dem Eingabefeld "Stapelgröße".  Sollten  Sie  Ihre  Programme
  266.            von  der  Befehlszeile  aus  compilieren,  müssen  Sie  einen
  267.            entsprechenden  "Schalter"  angeben  (z.   B.   "qcl   /F2000
  268.            Beispiel.C",  wobei  /F2000  den  Stapel auf die hexadezimale
  269.            Größe 0x2000 = dezimal 8192 Bytes einstellt).
  270.  
  271.            In dem Menü "Optionen ->  Make...   ->  Compiler-Marken"  muß
  272.            außerdem
  273.  
  274.            - die Warnstufe auf "Stufe 1",
  275.            - die Programmiersprache auf "MS Erweiterung",
  276.            - die Zeigerprüfung auf "ausgeschaltet" und
  277.            - "Inkrementaler  Compiler"  auf  "eingeschaltet"  (mit  "X"
  278.              angekreuzt)
  279.  
  280.            gesetzt werden.
  281.  
  282.  
  283.  
  284.         1.4 Installation der Toolbox auf Festplatte bzw. Diskette
  285.  
  286.             Der  Quick-C-Compiler  benötigt  für seine Arbeit mindestens
  287.             zwei  Diskettenlaufwerke.   Um  das  ständige  Wechseln  von
  288.             Disketten  zu  vermeiden, wird für diese Toolbox jedoch eine
  289.             Festplatte   mit   mindestens    einem    Megabyte    freien
  290.             Speicherplatz empfohlen.
  291.  
  292.             Zur  Installation   der   Toolbox   muß   man   zuerst   die
  293.             Einfügedatei   "WINDOW.H"   in   das   Unterverzeichnis  der
  294.             Headerdateien  kopieren.   Dadurch  wird  das   inkrementale
  295.             Compilieren  erst ermöglicht.  Inkrementales Compilieren ist
  296.             nur mit  der  Vollversion  der  Toolbox  möglich!   Bei  der
  297.         !!! Installation    der    Shareware-Version   entfällt   dieser
  298.             Schritt.  "Headerdateien" sind alle Einfügedateien  mit  der
  299.             Datei-Extension   ".H"   (z.    B.   die  altbekannte  Datei
  300.             "stdio.h").  Standardmäßig befinden sich  diese  Dateien  in
  301.             einem   Unterverzeichnis   mit   dem  Namen  "INC",  z.   B.
  302.             "C:\QC2\INC".    Wird   mit   dem   "#include"-Befehl   eine
  303.             Headerdatei  in ein C-Programm eingebunden, so sucht Quick-C
  304.             auch   in   diesem   Verzeichnis   nach   der    gewünschten
  305.             Headerdatei.
  306.  
  307.             Die  Toolbox  wird  ebenfalls  mit "#include" in die eigenen
  308.             Programme  eingebunden.   Deshalb   muß   die   Toolboxdatei
  309.             "WINDOW.H"   in   das  richtige  Header-Verzeichnis  kopiert
  310.             werden.    Sollten   Sie    den    Verzeichnisnamen    Ihrer
  311.             Einfügedateien nicht mehr wissen, geben Sie einfach "set" im
  312.             Kommando-Modus von DOS ein.  Sie sehen dann den Inhalt aller
  313.             Umgebungsvariablen.    Neben  dem  Variablennamen  "INCLUDE"
  314.             können Sie nun den Pfad der Headerdateien  ablesen  (z.   B.
  315.             "INCLUDE=C:\QC2\INC").
  316.  
  317.             Zum Kopieren gehen Sie folgendermaßen vor:
  318.  
  319.             - Legen Sie die Toolbox-Diskette in das Laufwerk A:
  320.             - Schalten Sie auf das Laufwerk A: um
  321.             - kopieren  Sie  die Datei "WINDOW.H" auf Ihre Festplatte in
  322.               das Verzeichnis Ihrer Headerdateien:
  323.  
  324.               copy window.h c:\qc2\inc
  325.  
  326.             - Arbeiten  Sie  ohne Festplatte, müssen Sie stattdessen die
  327.               Datei "WINDOW.H" in das Headerverzeichnis  Ihrer  Quick-C-
  328.               Diskette kopieren (in das Laufwerk B: einlegen!):
  329.  
  330.               copy window.h b:\qc2\inc
  331.  
  332.  
  333.             Natürlich ist beim "copy"-Befehl der  tatsächliche  Pfadname
  334.             zu dem Header-Verzeichnis anzugeben.
  335.  
  336.         !!! Jetzt  müssen  Sie  (sowohl bei der Vollversion als auch bei
  337.             der  Shareware-Version)   nur   noch   den   Quelltext   der
  338.             eigentlichen   Toolbox   (Datei   "WINDOW.C")  in  dasjenige
  339.             Verzeichnis kopieren, in dem Sie  Ihre  Programme  entwerfen
  340.             und kompilieren.  Dazu gehen Sie folgendermaßen vor:
  341.  
  342.             copy window.c c:\qc2         (bei Festplatte)
  343.  
  344.             copy window.c b:\qc2         (bei Diskette)
  345.  
  346.             Sie können beim "copy"-Befehl natürlich auch  jeden  anderen
  347.             Pfadnamen  angeben,  wenn  sich  Ihre  C-Programme  in einem
  348.             anderen Verzeichnis  befinden.   Ich  persönlich  würde  den
  349.             Quelltext  "WINDOW.C"  sogar  in das gleiche Verzeichnis wie
  350.             die Datei "WINDOW.H" kopieren, also in das  Verzeichnis  der
  351.             Include-Dateien.   Der Vorteil hierbei ist, daß Quick-C beim
  352.             Einfügen der Toolbox die Datei  "WINDOW.C"  praktisch  immer
  353.             findet,  weil  der  Suchpfad  für die Einfügedateien bekannt
  354.             ist.
  355.  
  356.             Die Toolbox ist nun einsatzbereit.
  357.  
  358.             Bitte beachten Sie, daß keine anderen Dateien mit dem  Namen
  359.             "WINDOW.C"     oder    "WINDOW.H"    in    den    jeweiligen
  360.             Arbeitsverzeichnissen von  Quick-C  existieren  dürfen.   Es
  361.             könnte sonst passieren, daß eine andere Datei (und nicht die
  362.             Toolbox)  in  Ihre  Programme  eingebunden wird.  Sollte ein
  363.             solcher Namenskonflikt auftreten, benennen  Sie  die  andere
  364.             Datei  einfach  um  (z.   B.  "ren window.c window1.c") oder
  365.             löschen Sie diese, wenn Sie nicht mehr benötigt wird.
  366.  
  367.  
  368.  
  369.  
  370.         1.5 Erweiterungen der Toolbox
  371.  
  372.             Haben  Sie irgendwelche neuen Funktionen entworfen, die auch
  373.             andere C-Programmierer interessieren könnten?  Wenn ja, dann
  374.             setzen Sie sich doch einfach mit mir in Verbindung!  Ich bin
  375.             an sinnvollen Erweiterungen der Toolbox  sehr  interessiert.
  376.             Gute  Erweiterungen  werden  von  mir  angekauft  und in die
  377.             Toolbox  eingebaut!   Voraussetzung  ist,  daß  Ihre   neuen
  378.             Funktionen  möglichst  fehlerfrei arbeiten, strukturiert und
  379.             modular  programmiert  sind  und  mit  einer   ausführlichen
  380.             Dokumentation versehen wurden.
  381.  
  382.             Wie ich inzwischen erfahren habe, kommt demnächst eine  neue
  383.             Version   von  Turbo-C  auf  den  Markt  (Turbo-C  v3.0  mit
  384.             objektorientiertem C++).  Diese Version besitzt nun  endlich
  385.             die     Fähigkeit,     mit    Hilfe    des    "_asm"-Befehls
  386.             Assembler-Programm in ein C-Programm einzubauen  (genau  wie
  387.             in  Quick-C).   Leider  weiß  ich  noch nicht, inwieweit die
  388.             beiden "_asm"-Befehle kompatibel zueinander sind.  Da  meine
  389.             Toolbox  neben  diesem  "_asm"-Befehl  und einigen kleineren
  390.             Ausnahmen keine  Microsoft-spezifischen  Befehle  verwendet,
  391.             dürfte  eine Anpassung an Turbo-C v3.0 ohne größere Probleme
  392.             möglich sein.  Sollte es jemand  schaffen,  die  Toolbox  an
  393.             diesen  Compiler  (oder  auch  an  jeden anderen C-Compiler)
  394.             anzupassen, bin ich  am  Ankauf  dieser  angepaßten  Version
  395.             brennend interessiert!  Bitte wenden Sie sich in diesem Fall
  396.             umgehend an mich.
  397.  
  398.  
  399.  
  400.  
  401.  
  402. ------  2. Haftung und Lizenzvertrag  -----------------------------------------
  403.  
  404.  
  405.         2.1 Lizenzvertrag und Rechte Dritter
  406.  
  407.             Alle  Rechte  an  dieser  Toolbox liegen bei Jürgen Altfeld,
  408.             Hofkurat-Diehl-Str.   7  in  D-8042  Oberschleißheim   (West
  409.             Germany).   Mit  dem  Erwerb dieses Produkts wird dem Käufer
  410.             ein  einfaches  Recht  zur  Benutzung  der  urheberrechtlich
  411.             geschützten Toolbox eingeräumt.
  412.  
  413.             Die Vollversion der Toolbox  darf  nur  auf  einem  einzigen
  414.             Rechner  zur  gleichen  Zeit benutzt werden.  Der Käufer der
  415.             Toolbox muß dafür Sorge tragen, daß kein Dritter die Toolbox
  416.             benutzen  kann.    Mehrfachinstallationen   bedürfen   eines
  417.             gesonderten Kaufvertrages (es werden Rabatte gewährt!).
  418.  
  419.             Es    ist    verboten,    die    registrierte    Vollversion
  420.             weiterzugeben.  Der Käufer der reg.  Vollversion kann  seine
  421.             Nutzungsrechte nicht an einen Dritten übertragen.
  422.  
  423.             Benutzer  der  registrierten  Vollversion  brauchen  hierfür
  424.             keine Lizenzgebühren bei der  gewerblichen  Veräußerung  der
  425.             mit dieser Toolbox erstellten Applikationen zu zahlen (keine
  426.             Run-Time-Lizenzen oder -Gebühren erforderlich!).
  427.  
  428.             Registrierte Benutzer der Vollversion dürfen  den  Quellcode
  429.             beliebig  verändern.   Die  Weitergabe  des  originalen oder
  430.             geänderten Quellcodes ist jedoch nicht erlaubt!
  431.  
  432.             Der  registrierte  Benutzer  der  Vollversion hat das Recht,
  433.             Updateversionen der Toolbox zum  Vorzugspreis  zu  erwerben.
  434.             Bitte   haben   Sie   Verständnis  dafür,  daß  nicht  jeder
  435.             registrierte Anwender persönlich  bei  kleineren  Änderungen
  436.             informiert  werden  kann.  Melden Sie sich einfach ab und zu
  437.             bei mir und erkundigen Sie sich nach dem neuesten Stand  des
  438.             Programmes.  Bei entscheidenden Änderungen und Erweiterungen
  439.             werden Sie selbstverständlich von mir benachrichtigt!
  440.  
  441.             Der  Autor  der Toolbox ist berechtigt, Aktualisierungen der
  442.             Software nach eigenem Ermessen zu erstellen.
  443.  
  444.             Das  Programm  ist  ein  mit  viel   Aufwand   hergestelltes
  445.             Qualitätsprodukt.   Unerlaubte  Kopierung, Vervielfältigung,
  446.             Verleih oder Vermietung  stellt  einen  Diebstahl  geistigen
  447.             Eigentums dar und wird zivil- und strafrechtlich verfolgt.
  448.  
  449.             Sämtliche  Rechte  Dritter  bleiben  unberührt, insbesondere
  450.             auch die eingetragenen Markenzeichen.
  451.  
  452.             Wer  sich  mit  diesen  unter  Nummer 2.1 oder 2.2 genannten
  453.             Bedingungen nicht einverstanden erklärt, darf diese Software
  454.             nicht anwenden, benutzen oder weitergeben.
  455.  
  456.             Ausnahmen   und   Sondervereinbarungen   bedürfen  zu  Ihrer
  457.             Gültigkeit der schriftlichen Genehmigung.
  458.  
  459.  
  460.  
  461.         2.2 Haftung und Gewähr
  462.  
  463.             Ich  übernehme  keine  Haftung  für  die  Fehlerfreiheit der
  464.             Software.  Insbesondere übernehme ich  keine  Gewähr  dafür,
  465.             daß die Software den Anforderungen und Zwecken des Erwerbers
  466.             genügt  oder  mit  anderen  von  ihm ausgewählten Programmen
  467.             zusammenarbeitet.   Die  Verantwortung  für   die   richtige
  468.             Auswahl  und die Folgen der Benutzung der Software sowie der
  469.             damit beabsichtigten oder  erzielten  Ergebnisse  trägt  der
  470.             Erwerber.
  471.  
  472.             Das   gleiche   gilt   für   das  die  Software  begleitende
  473.             schriftliche Material und die Dokumentationen.
  474.  
  475.             Sollte   der  Datenträger  (die  Diskette)  oder  die  damit
  476.             ausgelieferte Hardware fehlerhaft sein, so kann der Erwerber
  477.             Ersatzlieferung  während  der  Gewährleistungszeit   von   6
  478.             Monaten  ab  Lieferung verlangen.  Er muß dazu die Diskette,
  479.             die evtl.  mit  ihr  ausgelieferte  Hardware  einschl.   der
  480.             Reservekopien  und  des  schriftlichen  Materials  und einer
  481.             Kopie der Rechnung/Quittung an mich zurückgeben.
  482.  
  483.             Wer sich mit diesen unter  Nummer  2.1  oder  2.2  genannten
  484.             Bedingungen nicht einverstanden erklärt, darf diese Software
  485.             nicht anwenden, benutzen oder weitergeben.
  486.  
  487.  
  488.  
  489. ------  3. Einleitung  --------------------------------------------------------
  490.  
  491.            Im  Prinzip  bietet  jedes Programm eine Reihe von Funktionen
  492.            an, die je nach Wunsch des Benutzers ausgeführt  werden.   Es
  493.            ist  die  Aufgabe  der Benutzeroberfläche, alle Möglichkeiten
  494.            eines Programmes übersichtlich am Bildschirm darzustellen und
  495.            eine bedienerfreundliche Auswahlmöglichkeit anzubieten.
  496.  
  497.            Bewährt   hat  sich  dabei  das  Verwenden  von  Pop-Up-  und
  498.            Pull-Down-Menüs.
  499.  
  500.            Nun wäre es  unsinnig,  eine  solche  doch  recht  aufwendige
  501.            Benutzeroberfläche  lediglich  für  ein  einziges Programm zu
  502.            schreiben.  Diese Mühe hätte sich kaum  gelohnt.   Sinnvoller
  503.            ist   eine   universell  einsetzbare  Toolbox,  die  zugleich
  504.            flexible Benutzeroberflächen  ermöglicht.   Dabei  darf  auch
  505.            eine kontext-sensitive Hilfefunktion nicht fehlen.
  506.  
  507.            Das  Ergebnis  meiner Arbeit ist das Programm "WINDOW.C".  Da
  508.            es alleine nicht lauffähig ist, weil  es  nur  Werkzeuge  zum
  509.            Erstellen     eigener    Benutzeroberflächen    bereitstellt,
  510.            bezeichnet man "WINDOW.C" als Toolbox (= "Werkzeugkiste").
  511.  
  512.            Ursprünglich   war   die   Toolbox   lediglich   für   meinen
  513.            persönlichen Gebrauch gedacht.  Als  ich  mich  jedoch  etwas
  514.            umsah,   was  es  an  Toolboxen  so  alles  gibt,  mußte  ich
  515.            feststellen,  daß  weder  der  Public-Domain-Markt  noch  der
  516.            professionelle  Markt  Tools  zu  einem  günstigen  Preis (!)
  517.            bereitstellt, die inklusive  des  vollständig  dokumentierten
  518.            Quellcodes ausgeliefert werden.  Also setzte ich mich hin und
  519.            schrieb diese ausführliche Dokumentation.
  520.  
  521.            Ich  hoffe,  daß  hierdurch  auch  andere  Programmierer  die
  522.            Möglichkeit   haben,   qualitativ  hochwertige  Programme  zu
  523.            erstellen, ohne hierfür viel Geld ausgeben zu müssen.
  524.  
  525.            Für  Geldspenden als Anerkennung und zur Unterstützung meiner
  526.            Arbeit bin ich natürlich sehr dankbar.
  527.  
  528.            !!!   W I C H T I G:   !!!
  529.  
  530.            Bitte beachten Sie, daß vor der  Benutzung  der  Toolbox  die
  531.            Quick-C-Entwicklungsumgebung  entsprechend  der unter Kapitel
  532.            1.3 genannten Angaben konfiguriert werden muß!
  533.  
  534.  
  535.  
  536. ------  4. Neue Datentypen und Variablen der Toolbox  -------------------------
  537.  
  538.  
  539.         4.1 Windows
  540.  
  541.             Auch  wenn  die  Möglichkeiten  der  Fenstertechnik  bereits
  542.             relativ  alt  sind,  wurden  sie auf dem PC lange Zeit nicht
  543.             genutzt.   Erst  in  jüngerer   Zeit   kommen   immer   mehr
  544.             Anwenderprogramme    auf    den   Markt,   bei   denen   die
  545.             Fenstertechnik zum festen Bestandteil der Benutzeroberfläche
  546.             gehört.  Dabei ist  es  gar  nicht  so  schwer,  Fenster  in
  547.             eigene  Programme einzubauen.  Die Aktivierung eines Windows
  548.             läuft in den meisten Fällen nach folgendem Schema ab:
  549.  
  550.             1. Speichern des Bildschirmhintergrundes, in dem das Fenster
  551.                dargestellt werden soll
  552.  
  553.             2. Zeichnen eines Rahmens für das zu öffnende Fenster
  554.  
  555.             3. Ausgabe des gewünschten Fensterinhalts auf dem Bildschirm
  556.  
  557.             Der  Fensterinhalt  kann  z.   B.   eine  Liste von Optionen
  558.             (Menü), eine Arbeitsfläche zur  Eingabe  eines  Textes,  ein
  559.             Hinweis  oder  sonst  etwas sein.  Ein weiteres Beispiel ist
  560.             die kontext-sensitive  Hilfe.   "Kontext-sensitiv"  bedeutet
  561.             nichts  anderes,  als  daß  der  Hilfe-Text abhängig von der
  562.             Situation ist, in der sich  Anwender  gerade  befindet.   Es
  563.             werden  also nur Hilfen für die Probleme angezeigt, die beim
  564.             augenblicklichen  Programmstatus  auch  wirklich   auftreten
  565.             können.
  566.  
  567.             Ein großes Problem ist die Textausgabe bei  Überschneidungen
  568.             von  mehreren Fenstern.  Hier dürfte nur der Text ausgegeben
  569.             werden, der nicht durch ein anderes  Fenster  verdeckt  ist.
  570.             Es  ist  klar,  daß  der  Aufwand an Speicher und Verwaltung
  571.             irgendwann nicht mehr im Verhältnis zum Resultat steht.  Bei
  572.             der Toolbox wurde deshalb  ein  Kompromiß  geschlossen:  Das
  573.             Problem  der  Textausgaben  liegt ganz allein beim Anwender.
  574.             Er muß dafür sorgen, daß  der  Text  auch  wirklich  an  der
  575.             richtigen  Stelle  landet.   Es  empfiehlt  sich von selbst,
  576.             Textausgaben nur in das jeweils  zuletzt  geöffnete  Fenster
  577.             durchzuführen.
  578.  
  579.             Auch  diese  Toolbox  bietet  die  Möglichkeit,  Fenster  zu
  580.             verwalten.  Dazu werden jedoch einige Informationen über das
  581.             zu verwaltende Fenster benötigt.  Zweckmäßigerweise faßt man
  582.             diese Informationen in einer C-Struktur zusammen:
  583.  
  584.             static struct window
  585.             {
  586.                int  x, y;           /* linke obere Window-Ecke */
  587.                int  dx, dy;         /* Breite und Höhe des Windows */
  588.                int  wattr;          /* Hintergrund-Farbe des Windows */
  589.                int  rand, rattr;    /* Rand-Art und Rand-Farbe */
  590.                char *name;          /* Zeiger auf Window-Überschrift */
  591.                int  xpos;           /* X-Koordinate der Überschrift */
  592.                int  nattr;          /* Farbe der Überschrift */
  593.                struct window *vorher; /* Zeiger auf vorher geöffn. Window */
  594.                void *wmalloc;       /* Zeiger auf Puffer für Hintergrund */
  595.             };
  596.  
  597.             Damit man diese  Struktur  besser  anwenden  kann,  benennen
  598.             wir sie einfach um und schaffen somit einen neuen Datentyp:
  599.  
  600.             typedef struct window WINDOW;
  601.  
  602.             Bitte  beachten  Sie  die Großschreibung!
  603.  
  604.             Es  folgen  nun   die   Erläuterungen   zu   den   einzelnen
  605.             Struktur-Mitgliedern:
  606.  
  607.             x, y:   Gibt   die  Position  der  linken  oberen  Ecke  des
  608.                   Fensters am Schirm  an.   Die  Position  0,0  ist  die
  609.                   linke obere Bildschirmecke.
  610.  
  611.                   x-Werte von 0 - 79
  612.                   y-Werte von 0 - 25
  613.  
  614.             dx, dy: "dx" steht für die gewünschte Breite des Fensters in
  615.                     Textzeichen.    "dy"   steht  entsprechend  für  die
  616.                     gewünschte  Höhe  des  Fensters.   Breite  und  Höhe
  617.                     verstehen  sich  inklusive des Rahmens.  Das für den
  618.                     Text zur Verfügung stehende Fensterinnere ist  somit
  619.                     kleiner!
  620.  
  621.             wattr: Neben den Informationen über  die  Art  des  Zeichens
  622.                    (ASCII-Code)   wird   im   Bildschirmspeicher   einer
  623.                    Grafikkarte auch die Information über die  Farbe  des
  624.                    Zeichens  gespeichert.   Grundsätzlich  gibt  es zwei
  625.                    verschiedene     Grafikkarten:     Monochrome     und
  626.                    Farbgrafik-Karten.
  627.  
  628.                    Zu  den  monochromen Grafikkarten gehören z.  B.  die
  629.                    MDA-, die Herkules- und andere Grafikkarten.
  630.  
  631.                    Zu  den  Farbgrafik-Karten  gehören u.  a.  die CGA-,
  632.                    EGA-, VGA-, MCGA- und weitere Grafikkarten.
  633.  
  634.                    Die  Grafikkarten  erlauben  für  jedes  Zeichen  die
  635.                    zusätzliche  Angabe eines Bildschirm-Attributes.  Das
  636.                    Attribut bestimmt, wie ein Zeichen dargestellt  wird.
  637.                    In   "wattr"   wird  nun  die  Hintergrund-Farbe  des
  638.                    Windows, also das Attribut, gespeichert.
  639.  
  640.                    Abhängig von der installierten  Grafikkarte  gibt  es
  641.                    zwei  Möglichkeiten,  wie  dieses  Attribut aufgebaut
  642.                    ist.   Bei  Farbgrafik-Karten   können   verschiedene
  643.                    Farben    gleichzeitig   dargestellt   werden.    Das
  644.                    Attributbyte ist deshalb folgendermaßen aufgebaut:
  645.  
  646.                        ┌───┬───┬───┬───┬───┬───┬───┬───┐
  647.                    Bit │ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │
  648.                        └─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┘
  649.                          │   └───┼───┘   │   └───┼───┘
  650.                          │       │       │       │
  651.                          │       │       │       └─>  Farbe des Zeichens
  652.                          │       │       │
  653.                          │       │       └─> Intensität der Zeichen-Farbe
  654.                          │       │              0 = normal
  655.                          │       │              1 = hell
  656.                          │       │
  657.                          │       └─> Hintergrund-Farbe des Zeichens
  658.                          │
  659.                          └─> Blinken (bzw. intensive Hintergrundfarbe)
  660.                                 0 = aus
  661.                                 1 = an
  662.  
  663.                    Bei der monochromen Bildschirmkarte (dazu gehört auch
  664.                    die  Herkules-Karte) sieht es etwas anders aus.  Zwar
  665.                    kann man jede beliebige Bitkombination in dieses Byte
  666.                    laden, doch werden im Gegensatz zur  Farbgrafik-Karte
  667.                    nur     die    nachfolgenden,    fest    vorgegebenen
  668.                    Kombinationen erkannt, da  keine  Farben  dargestellt
  669.                    werden  können.   Damit  man  diese  Bitkombinationen
  670.                    nicht auswendig lernen muß, sind folgende symbolische
  671.                    Konstanten in der Toolbox bereits vordefiniert:
  672.  
  673.                    NORMAL         (Attribut   7)  =  normale Darstellung
  674.                    HELL           ( "        15)  =  helle Darstellung
  675.                    INVERS         ( "       112)  =  inverse Darstellung
  676.                    UNTERSTRICHEN  ( "         1)  =  unterstrichen
  677.                    UI             ( "         9)  =  unterstrichen und hell
  678.  
  679.                    Bitte   beachten   Sie   die   Großschreibung  dieser
  680.                    symbolischen Konstanten.  In der Programmiersprache C
  681.                    wird  nämlich  normalerweise   zwischen   Groß-   und
  682.                    Kleinschreibung unterschieden!
  683.  
  684.                    Für die Farbgrafik-Karte  sind  folgende  symbolische
  685.                    Konstanten in der Toolbox vordefiniert:
  686.  
  687.                    SCHWARZ        ( Attribut 0 )
  688.                    BLAU           ( "        1 )
  689.                    GRUEN          ( "        2 )
  690.                    ZYAN           ( "        3 )
  691.                    ROT            ( "        4 )
  692.                    VIOLETT        ( "        5 )
  693.                    BRAUN          ( "        6 )
  694.                    WEISS          ( "        7 )
  695.                    DUNKELGRAU     ( "        8 )
  696.                    HELLBLAU       ( "        9 )
  697.                    HELLGRUEN      ( "       10 )
  698.                    HELLZYAN       ( "       11 )
  699.                    HELLROT        ( "       12 )
  700.                    HELLVIOLETT    ( "       13 )
  701.                    GELB           ( "       14 )
  702.                    HELLWEISS      ( "       15 )
  703.  
  704.                    Der Hintergrund ist bei diesen Voreinstellungen immer
  705.                    schwarz.  Soll  der  Hintergrund  eine  andere  Farbe
  706.                    haben,  muß  ein neues Attribut-Byte berechnet werden
  707.                    (siehe Funktion "attribut"; Kapitel 5.6).
  708.  
  709.             rand: Dieser  Wert  gibt  an,  ob und wenn ja welcher Rahmen
  710.                   um das Window gezeichnet werden soll.  Es  sind  Werte
  711.                   von 0 bis 3 zulässig:
  712.  
  713.                   0  =  Fenster mit doppeltem Strich als Rahmen
  714.                   1  =  Fenster mit einfachem Strich als Rahmen
  715.                   2  =  komplett ausgefüllter Rahmen (mit dem Zeichen "█")
  716.                   3  =  Rahmen wird waagrecht als doppelter Strich,
  717.                         senkrecht als einfacher Strich dargestellt
  718.  
  719.                   Wird   eine   Zahl   außerhalb   dieses  Wertebereichs
  720.                   angegeben,  so  wird  standardmäßig  der  Rahmen   "0"
  721.                   gezeichnet.
  722.  
  723.                   Soll kein Rahmen  gezeichnet  werden,  nimmt  man  den
  724.                   Rahmen  "2"  mit  derselben  Vordergrundfarbe  wie der
  725.                   Hintergrund des Windows dargestellt wird.
  726.  
  727.             rattr: Hier   wird   das   Bildschirm-Attribut  des  Rahmens
  728.                    gespeichert.   Der  Aufbau   dieses   Attributs   ist
  729.                    derselbe wie der von "wattr".
  730.  
  731.             *name: Hier  wird  der  Zeiger  auf eine mit einem Null-Byte
  732.                    abgeschlossene    Zeichenkette     abgelegt.      Die
  733.                    Zeichenkette  erscheint  als  Namen  des  Fensters am
  734.                    oberen Fensterrand.   Ist  der  Zeiger  gleich  NULL,
  735.                    bleibt das Fenster ohne Namen.
  736.  
  737.             xpos: Gibt  den  horizontalen  Offset  vom  linken  Rand des
  738.                   Fensters  an, an dem der Name erscheinen soll.  "xpos"
  739.                   kann also einen Wert von 0  bis  79  annehmen.   Durch
  740.                   Angabe  eines  passenden  Wertes sollte sichergestellt
  741.                   werden, daß der Namen des  Windows  (die  Überschrift)
  742.                   auch  wirklich  in der Mitte des oberen Fensterrahmens
  743.                   erscheint.
  744.  
  745.                   Die Zeile, in der  die  Überschrift  erscheinen  soll,
  746.                   berechnet die Toolbox automatisch.
  747.  
  748.                   Wurde keine Überschrift angegeben ("*name" = NULL), so
  749.                   wird dieser Wert ignoriert.
  750.  
  751.             nattr: Dies ist das  Bildschirm-Attribut  des  Namens.   Der
  752.                    Aufbau entspricht dem von "wattr".
  753.  
  754.             *vorher: Die  Toolbox  verwaltet diese Variable selbständig.
  755.                      Hier wird ein Zeiger auf  die  Window-Struktur  des
  756.                      Fensters  abgelegt,  das unmittelbar davor geöffnet
  757.                      wurde.   Ist  der  Zeiger  gleich  NULL,  ist   das
  758.                      Fenster das erste am Bildschirm.
  759.  
  760.             *wmalloc: Hier  speichert  die  Toolbox einen Zeiger ab, der
  761.                       auf    die    Speicheradresse    des    geretteten
  762.                       Bildschirm-Hintergrunds   zeigt.    Enthält  diese
  763.                       Variable einen NULL-Zeiger, so ist  dieses  Window
  764.                       im  Augenblick  nicht  geöffnet.  Aus diesem Grund
  765.                       muß der Zeiger mit NULL initialisiert  werden,  da
  766.                       sonst  die  Toolbox das Fenster nicht öffnet.  Der
  767.                       Zeiger  dient  auch  als   Schutzmaßnahme,   damit
  768.                       dasselbe  Fenster  nicht  mehrmals  geöffnet  oder
  769.                       geschlossen wird.
  770.  
  771.  
  772.  
  773.         4.2 Menüpunkte
  774.  
  775.             Mit dem Öffnen und Schließen von Windows  alleine  kann  man
  776.             noch  wenig  anfangen.   Man  muß innerhalb der Fenster auch
  777.             bestimmte Daten ein- oder ausgeben können.  Dazu  gehört  z.
  778.             B.   das  Anzeigen  eines Auswahlmenüs, aus dem der Anwender
  779.             bestimmte Menüpunkte anwählen kann.
  780.  
  781.             Da man auch zum Aufbau und zur Verwaltung eines  Menüpunktes
  782.             eine   ganze   Menge  von  Informationen  benötigt,  ist  es
  783.             sinnvoll,    diese    ebenfalls    in    einer    C-Struktur
  784.             zusammenzufassen:
  785.  
  786.             static struct menu
  787.             {
  788.                int x, y;            /* Position des Menüpunktes am Screen */
  789.                int  nattr;          /* Farb-Attribut des Menüpunkt-Namens */
  790.                char *name;          /* Zeiger auf Namen des Menüpunktes */
  791.                int  nr;             /* Identifikations-Nr. des Menüpunktes */
  792.                char page;           /* Flag für neue Seite */
  793.                struct window *window; /* Zeiger auf vorher zu öffn. Window */
  794.                struct menu *sub;    /* erster Menüpunkt des Untermenüs */
  795.                struct menu *next;   /* Zeiger auf nächsten Menüpunkt */
  796.                struct menu *prev;   /* Zeiger auf vorherigen Menüpunkt */
  797.                struct menu *father; /* Zeiger auf Vatermenü des Submenüs */
  798.             };
  799.  
  800.             Auch diese Struktur wurde zu einem neuen Datentyp umbenannt:
  801.  
  802.             typedef struct menu MENU;
  803.  
  804.             Die  vielen  Daten  in  dieser Struktur mögen vielleicht als
  805.             unnötig "aufgebläht" erscheinen, aber diese Struktur ist zur
  806.             Verwaltung   eines   einzigen   (!)   Menüpunktes   wirklich
  807.             notwendig.
  808.  
  809.             Die  Sache  sieht  jedoch  komplizierter  aus,  als sie ist.
  810.             Nicht alle Variablen der Struktur muß  der  Benutzer  selbst
  811.             initialisieren.    Die  Toolbox  verwaltet  diese  zum  Teil
  812.             automatisch.  Eine andere Variable wird nur  benötigt,  wenn
  813.             mit diesem Menüpunkt ein Untermenü verbunden ist.
  814.  
  815.             Doch nun zu der Bedeutung der einzelnen Struktur-Elemente:
  816.  
  817.             x, y: Gibt  die  Position des Menüpunktes am Bildschirm  an.
  818.                   Die Position 0,0 ist die linke obere Bildschirmecke.
  819.  
  820.                   x-Werte von 0 - 79
  821.                   y-Werte von 0 - 25
  822.  
  823.                   Um auch  die  Auswahl  aus  sehr  vielen  Optionen  zu
  824.                   ermöglichen, können zweidimensionale Menüs verarbeitet
  825.                   werden.  "Zweidimensional" bedeutet, daß die einzelnen
  826.                   Menüpunkte sowohl untereinander als AUCH nebeneinander
  827.                   auf dem Bildschirm angeordnet sind.
  828.  
  829.             nattr: Dies ist das Bildschirm-Attribut, mit  dem  der  Name
  830.                    des  Menüpunktes  am  Bildschirm angezeigt wird.  Der
  831.                    Aufbau entspricht dem von "wattr" im Kapitel 4.1.
  832.  
  833.             *name: Hier wird der Zeiger auf  eine  mit  einem  Null-Byte
  834.                    abgeschlossene     Zeichenkette     abgelegt.     Die
  835.                    Zeichenkette erscheint als Namen des  Menüpunktes  an
  836.                    der  bei  "x" und "y" angegebenen Stelle.  Der Zeiger
  837.                    darf nicht gleich NULL sein, da sonst kein  Menüpunkt
  838.                    angezeigt wird!
  839.  
  840.             nr: Wird  bei  der  Menüauswahl  ein   Menüpunkt   mit   der
  841.                 ENTER-Taste angewählt oder die Auswahl mit der ESC-Taste
  842.                 bzw.   F1-Taste  (Hilfe)  abgebrochen,  so  übergibt die
  843.                 Toolbox der aufrufenden Funktion einen  Zeiger  auf  die
  844.                 entsprechende Menü-Struktur zurück.  Es ist jedoch nicht
  845.                 gerade  einfach, anhand dieses Zeigers gezielte Aktionen
  846.                 im Hauptprogramm zu veranlassen,  da  normalerweise  nur
  847.                 der  Name  der  Struktur  ("*name") Rückschlüsse auf den
  848.                 gewählten Menüpunkt zuläßt.  Aus  diesem  Grund  ist  es
  849.                 sinnvoll,  jede  Struktur  eines  Menüpunktes  mit einer
  850.                 Identifikations-Nummer  zu  versehen,  anhand  der  dann
  851.                 gezielt  weitere  Aktionen  von der aufrufenden Funktion
  852.                 durchgeführt werden können.
  853.  
  854.                 Die  Identifikations-Nummer  ist  eine  beliebige  Zahl.
  855.                 Zahlen  lassen  sich  in der Programmiersprache C jedoch
  856.                 einfacher vergleichen als Strings.  Insofern stellt  die
  857.                 Identifikations-Nummer   eine   Vereinfachung   für  den
  858.                 Programmierer dar.
  859.  
  860.                 Es ist auch denkbar,  mehrere  Menüs  mit  der  gleichen
  861.                 Nummer  zu  versehen.   Dies wäre z.  B.  sinnvoll, wenn
  862.                 mehrere Menüpunkte ein und dieselbe Aufgabe zu  erfüllen
  863.                 haben.
  864.  
  865.             page: Es   kommt   manchmal   vor,   daß   eine   Reihe  von
  866.                   zusammengehörigen   Menüpunkten   nicht    auf    eine
  867.                   Bildschirm-Seite passen.  Möglich ist dies z.  B.  bei
  868.                   größeren  Listen,  aus denen der Anwender eine Auswahl
  869.                   treffen soll (siehe auch Funktion "inhalt").  Hier ist
  870.                   es sinnvoll, wenn  der  Anwender  auf  dem  Bildschirm
  871.                   zwischen  mehreren  Seiten von Menüpunkten hin und her
  872.                   blättern kann (ähnlich einer Speisekarte).  Dafür  ist
  873.                   diese Variable zuständig.
  874.  
  875.                   Zulässige Werte sind:
  876.  
  877.                   page = 0  -> der Menüpunkt gehört zur bisherigen Seite
  878.                   page <> 0 -> dieser Menüpunkt  ist  der  Anfang  einer
  879.                                neuen Seite
  880.  
  881.                   Besteht      ein      Auswahlmenü     aus     mehreren
  882.                   Bildschirmseiten,  so  kann  der  Anwender   mit   den
  883.                   Tasten  "PgUp"  (Bild  hoch)  und  "PgDn" (Bild unten)
  884.                   zwischen den Seiten hin und her wechseln.
  885.  
  886.                   Beim  Wechseln  der  Bildschirmseite  wird  der Inhalt
  887.                   eines  evtl.   vorhandenen  Bildschirmfensters   NICHT
  888.                   gelöscht.   Man  muß  deshalb  dafür  sorgen,  daß die
  889.                   Menüpunkte der  neuen  Seite  genau  an  der  gleichen
  890.                   Stelle  liegen,  an  der auch die Menüpunkte der alten
  891.                   Seite sind.
  892.  
  893.                   In  der  Regel  sollte  man  auf   mehrseitige   Menüs
  894.                   verzichten,  da sie nicht gerade der Übersichtlichkeit
  895.                   dienen.  Sie lassen  sich  meistens  auch  durch  eine
  896.                   geschickte   Aufteilung   der   Menüs  in  Haupt-  und
  897.                   Untermenüs vermeiden.
  898.  
  899.             *window: Wie  bereits  erwähnt,  können  alle  Punkte  eines
  900.                      Menüs    an   beliebigen   Positionen   am   Schirm
  901.                      erscheinen.   Übersichtlicher  ist  es   natürlich,
  902.                      wenn   diese   untereinander   oder   nebeneinander
  903.                      angeordnet   sind.     Um    diese    Punkte    als
  904.                      zusammengehörig  zu  kennzeichnen, kann automatisch
  905.                      ein Bildschirmfenster um sie gezogen werden.   Dies
  906.                      hat    auch    den    Vorteil,    daß    der   alte
  907.                      Bildschirmhintergrund durch  die  Menüpunkte  nicht
  908.                      für immer zerstört wird.
  909.  
  910.                      Zeigt    die    Variable    "*window"    auf   eine
  911.                      Window-Struktur, so öffnet die Toolbox  zuerst  ein
  912.                      Fenster,  bevor  die  zusammengehörigen  Menüpunkte
  913.                      auf dem Bildschirm ausgegeben  werden.   Wurde  die
  914.                      Lage  und  die  Größe des Fensters richtig gewählt,
  915.                      landen alle Punkte des Menüs darin.
  916.  
  917.                      Soll KEIN Fenster  geöffnet  werden  (z.   B.   zur
  918.                      Ausgabe  der  Menüzeile  am  oberen  Bildschirmrand
  919.                      bei Pull-Down-Menüs),  so  muß  "*window"  mit  dem
  920.                      NULL-Zeiger initialisiert werden.
  921.  
  922.                      WICHTIG: Es wird nur dann ein Window geöffnet, wenn
  923.                               die    Variable   "*window"   des   ERSTEN
  924.                               Menüpunktes der ERSTEN Seite eines  Haupt-
  925.                               oder   Submenüs   einen   Zeiger  auf  die
  926.                               entsprechende Menü-Struktur enthält.   Bei
  927.                               allen   nachfolgenden  (zusammengehörigen)
  928.                               Menüpunkten wird  die  Variable  "*window"
  929.                               NICHT beachtet!
  930.  
  931.             *sub: Soll  beim  Anwählen  eines  Menüpunktes mit der Taste
  932.                   ENTER ein weiteres Menü ("Untermenü")  erscheinen,  so
  933.                   muß  dieser  Zeiger  auf  die Menü-Struktur des ersten
  934.                   Menüpunktes des Untermenüs zeigen.
  935.  
  936.                   Soll  KEIN  Untermenü   geöffnet   werden,   muß   die
  937.                   Variable "*sub" als Wert den NULL-Zeiger enthalten.
  938.  
  939.                   Der  Zeiger  MUSS  auf  den   ersten   Menüpunkt   des
  940.                   Untermenüs  zeigen,  wenn  das  Menü  mit der Funktion
  941.                   "PrepareMenu" initialisiert wird,  weil  es  sonst  zu
  942.                   einer  fehlerhaften  Zeigerverkettung  und damit einem
  943.                   unbrauchbaren Menü kommt!  Erst nach dem Aufruf dieser
  944.                   Funktion darf der Zeiger so "verbogen" werden, daß  er
  945.                   auf   irgendeinen   anderen   Menüpunkt  des  GLEICHEN
  946.                   Untermenüs  verweist.   In  diesem  Fall   steht   der
  947.                   Auswahl-Cursor  nach dem Aufruf des Untermenüs auf dem
  948.                   hier angegeben Menüpunkt.
  949.  
  950.                   Ein Untermenü stellt ein für sich eigenständiges  Menü
  951.                   dar, genauso wie das Hauptmenü.  Deshalb kann man auch
  952.                   ein  Submenü  nur  mit  der  ESC-Taste  oder durch das
  953.                   Anwählen eines Menüpunktes verlassen.
  954.  
  955.             *next, *prev, *father:
  956.  
  957.                Eine einzelne  Menüstruktur  beschreibt  lediglich  einen
  958.                einzelnen   Menüpunkt.    Ein  Menü  besteht  jedoch  aus
  959.                mindestens zwei Menüpunkten.  Wie weiß die  Toolbox  nun,
  960.                welche  Punkte  zusammen  gehören?   Ganz  einfach!   Die
  961.                zusammengehörigen Menüpunkte werden zu einer  verketteten
  962.                Liste  verbunden,  die  dann  das  gesamte  Menü  bilden.
  963.                Hierfür sind diese Zeiger notwendig.
  964.  
  965.                "*next"  zeigt  auf   die   Menü-Struktur   des   jeweils
  966.                nachfolgenden Auswahlpunktes. Ist der Zeiger gleich NULL,
  967.                so  folgt  kein weiterer Menüpunkt, und die Struktur wird
  968.                damit als die letzte des Menüs angesehen.
  969.  
  970.                "*prev" zeigt jeweils auf den  vorhergehenden  Menüpunkt.
  971.                Ist  der  Zeiger  gleich NULL, so ist diese Menü-Struktur
  972.                der erste Auswahlpunkt des Menüs.
  973.  
  974.                Der  "*father"-Zeiger  verweist auf die Menü-Struktur des
  975.                "aufrufenden" Menüpunktes.  Ist er NULL, so gehört dieser
  976.                Menüpunkt zum Hauptmenü, ansonsten zu einem Untermenü.
  977.  
  978.                Der einzige Zeiger, der  von  dem  Benutzer  der  Toolbox
  979.                initialisiert  werden  muß,  ist der "*next"-Zeiger.  Die
  980.                Verkettung mit den "*prev"- und  "*father"-Zeigern  nimmt
  981.                die Toolbox automatisch vor, wenn die Benutzung der Menüs
  982.                mit der Funktion "PrepareMenu" vorbereitet wird.
  983.  
  984.  
  985.  
  986.         4.3 Globale Variablen
  987.  
  988.  
  989.             int  f0, f1, f2, f3;
  990.  
  991.                Jeder   Anwender   hat  andere  Wünsche.   Dies  betrifft
  992.                insbesondere    auch   die   farbliche   Gestaltung   von
  993.                Programmen.  Von einem guten Programm erwartet  man,  daß
  994.                der  Anwender  die Farben der Benutzeroberfläche beliebig
  995.                verändern kann.  Dies ist um so  mehr  erforderlich,  als
  996.                daß     es    im    PC-Bereich    keinen    einheitlichen
  997.                Grafikkarten-Standard  gibt.   Auch   die   verschiedenen
  998.                Monitor-Typen  (Farbe, Schwarz-Weiß, Bernstein, Grün, LCD
  999.                usw.) machen es dem Programmierer nicht  gerade  einfach,
  1000.                eine   immer  passende  farbliche  Gestaltung  für  seine
  1001.                Programme zu finden.
  1002.  
  1003.                Um  dieses Problem einigermaßen in den Griff zu bekommen,
  1004.                wurden diese Variablen eingeführt.  In jeder dieser  vier
  1005.                Variablen   ist   ein   anderes  Bildschirm-Attribut-Byte
  1006.                gespeichert.  Beim Initialisieren der  Toolbox  ermittelt
  1007.                diese die Art der angeschlossenen Hardware und belegt die
  1008.                Variablen   mit   den  entsprechenden  Farbwerten.   Jede
  1009.                Funktion dieser Toolbox, die  in  irgendeiner  Weise  ein
  1010.                Bildschirm-Attribut  benötigt, greift auf diese Variablen
  1011.                zurück, soweit der Programmierer nicht  andere  Attribute
  1012.                angegeben  hat.   Welchen  Sinn  hat  das?   -  Will  der
  1013.                Anwender andere Farben verwenden, so braucht er  nur  die
  1014.                neuen  Farb-Attribute  auszuwählen.  Das Programm muß die
  1015.                gewählten Werte dann in diesen Variablen abspeichern.  Da
  1016.                alle Funktionen  der  Toolbox  auf  diese  Farb-Variablen
  1017.                zurückgreifen,   werden   die  Farben  den  Wünschen  des
  1018.                Anwenders entsprechend eingesetzt.
  1019.  
  1020.                Die Variablen haben im einzelnen folgende Bedeutung:
  1021.  
  1022.                f0: normale Darstellung
  1023.                f1: erste hervorgehobene Darstellung
  1024.                f2: zweite hervorgehobene Darstellung
  1025.                f3: dritte hervorgehobene Darstellung
  1026.  
  1027.                Beim Öffnen  der  Toolbox  (mit  der Funktion "OpenTool")
  1028.                werden  die  Variablen  abhängig  von   der   eingebauten
  1029.                Grafik-Karte mit folgenden Werten belegt:
  1030.  
  1031.                     Monochrome Karte:        Farbgrafik-Karte:
  1032.  
  1033.                f0:      NORMAL               WEISS auf BLAUEN Hintergrund
  1034.                f1:      HELL                 GELB  auf BLAUEN Hintergrund
  1035.                f2:      UNTERSTRICHEN        HELLROT auf BLAUEN Hintergr.
  1036.                f3:      UI                   SCHWARZ auf BLAUEN Hintergr.
  1037.  
  1038.                Bei manchen Funktionen der Toolbox kann der Programmierer
  1039.                entscheiden,  welches  Farb-Attribut   verwendet   werden
  1040.                soll.   Man  sollte hier immer eine dieser Farb-Variablen
  1041.                angeben,  um  das  Programm  möglichst  global   an   die
  1042.                farblichen  Bedürfnisse  anpassbar  zu  halten.   Bei der
  1043.                Textausgabe z.  B.  (mit der Funktion "fastprint") ist es
  1044.                besser, als  Farbattribut  z.   B.   "f1"  anzugeben  als
  1045.                "GELB".
  1046.  
  1047.                Achtung: Die Variablen f0 bis f3 können  innerhalb  eines
  1048.                         Funktionsblockes auch    als   Farbangabe   beim
  1049.                         Initialisieren der Window-  und  Menü-Strukturen
  1050.                         verwendet  werden (die Strukturen sind somit nur
  1051.                         lokal  sichtbar).   Werden  die  Variablen   vor
  1052.                         Aufruf  der  Funktion  "OpenTool"  verwendet, so
  1053.                         enthalten sie jedoch immer die Attribute für die
  1054.                         Farbgrafik-Karte.  Dies  liegt  daran,  daß  die
  1055.                         Toolbox  erst  beim  Öffnen  (mit  der  Funktion
  1056.                         "OpenTool")   die   angeschlossene   Grafikkarte
  1057.                         ermittelt   und   die   Variablen   f0   bis  f3
  1058.                         entsprechend  initialisiert,  die  Windows   und
  1059.                         Menüpunkte  aber  bereits  VOR  dem  Öffnen  der
  1060.                         Toolbox definiert werden müssen!  Dies läßt sich
  1061.                         umgehen, indem man nach dem Öffnen  der  Toolbox
  1062.                         (am   besten  innerhalb  einer  Funktion)  jedem
  1063.                         Window und Menüpunkt erneut  den  Inhalt  dieser
  1064.                         Variablen  als  Farbwert  zuweist.   Dazu ist es
  1065.                         natürlich  erforderlich,  daß  die  Window-  und
  1066.                         Menü-Strukturen  als GLOBALE VARIABLEN definiert
  1067.                         werden, weil sie sonst innerhalb  der  Funktion,
  1068.                         in  der die erneute Farbzuweisung erfolgt, nicht
  1069.                         sichtbar     (zugänglich)      sind.       Diese
  1070.                         Vorgehensweise  hat  einen  großen Vorteil: Will
  1071.                         der  Anwender  die  Farben   der   Windows   und
  1072.                         Menüpunkte  ändern,  so  braucht  innerhalb  des
  1073.                         Programms  nur  diese  Funktion  aufgerufen   zu
  1074.                         werden,  und  schon  haben die Fenster und Menüs
  1075.                         eine  andere  Farbe!   Das   Programm   "DEMO.C"
  1076.                         arbeitet  nach  diesem Prinzip.  Man sollte sich
  1077.                         diesen Quelltext deshalb genauer ansehen und ihn
  1078.                         analysieren.
  1079.  
  1080.                         Übrigens  dürfen  bei  der  Initialisierung  der
  1081.                         globalen  Strukturen (Windows, Menüs etc.) keine
  1082.                         anderen  globalen  Variablen  angegeben  werden!
  1083.                         Das  bedeutet,  daß  die Variablen "f0" bis "f3"
  1084.                         noch nicht verwendet werden können.   Am  besten
  1085.                         setzt man deshalb den Pseudowert "0" ein, da die
  1086.                         Farben dann später initialisiert werden.
  1087.  
  1088.  
  1089.             unsigned int screen;
  1090.  
  1091.                     In  dieser  Variablen  speichert  die  Toolbox   die
  1092.                     Segment-Adresse  des  Bildschirmspeichers  ab.   Der
  1093.                     Programmierer braucht sich allerdings in  der  Regel
  1094.                     nicht  um die Verwaltung dieser Variable zu kümmern,
  1095.                     sie  wird  von  der  Toolbox   automatisch   belegt.
  1096.                     Willkürliche  Veränderungen  dieses Variablen-Wertes
  1097.                     können katastrophale Folgen für  den  Programmablauf
  1098.                     haben!
  1099.  
  1100.                     Praktisch alle Funktionen der Toolbox schreiben  und
  1101.                     lesen  die  notwendigen Informationen direkt in bzw.
  1102.                     aus  dem  Bildschirmspeicher.    Die   Adresse   des
  1103.                     Bildschirmspeichers  holen  sich  die Funktionen aus
  1104.                     der Variable "screen".  Durch gezielte Veränderungen
  1105.                     der Segmentadresse kann man erreichen,  daß  z.   B.
  1106.                     eine  andere Bildschirmseite verwendet wird oder die
  1107.                     Ein-/Ausgaben in einem virtuellen  Bildschirmbereich
  1108.                     gepuffert werden.
  1109.  
  1110.                     Bei   monochromen   Grafikkarten   steht  in  dieser
  1111.                     Variablen  der  hexadezimale  Wert  "0xB000".    Bei
  1112.                     Farbgrafik-Karten enthält sie den Wert "0xB8000".
  1113.  
  1114.                     Bei  manchen PC's, die nicht 100%-ig kompatibel sind
  1115.                     (z.   B.   einige  alte  Siemens-PC's),   kann   der
  1116.                     Bildschirmspeicher    auch    an    einer    anderen
  1117.                     Segment-Adresse liegen.  In einem solchen  Fall  muß
  1118.                     in   der   Variablen   "screen"  der  passende  Wert
  1119.                     eingetragen werden, nachdem die Funktion  "OpenTool"
  1120.                     aufgerufen wurde.
  1121.  
  1122.                     Für Hinweise, bei welchen  PC's  meine  Toolbox  die
  1123.                     Segment-Adresse   des   Bildschirmspeichers   falsch
  1124.                     ermittelt, bin ich jederzeit dankbar.   Bitte  geben
  1125.                     Sie  in  diesem  Fall  auch die neue Segment-Adresse
  1126.                     bzw.  die notwendigen Änderungen an  meiner  Toolbox
  1127.                     an. Die Anwender werden es Ihnen danken!
  1128.  
  1129.  
  1130.             unsigned int farbe;
  1131.  
  1132.                    Diese  Variable  wird  beim  Vorbereiten  der Toolbox
  1133.                    (Funktion "OpenTool") mit folgenden Werten belegt:
  1134.  
  1135.                    farbe = 0    -> monochrome Grafikkarte entdeckt
  1136.                    farbe = 1    -> Farbgrafik-Karte entdeckt
  1137.  
  1138.                    Das Ändern dieser Variablen  hat  keine  Auswirkungen
  1139.                    auf die Arbeitsweise der Toolbox. Sie dient lediglich
  1140.                    zur   Information  des  Programmierers.   In  manchen
  1141.                    Programmen ist diese Information recht nützlich.
  1142.  
  1143.  
  1144.             int select;
  1145.  
  1146.                     Die   Funktion    "UseMenu"    gibt    einen    sog.
  1147.                     Abbruchs-Code   zurück,   der  in  dieser  Variablen
  1148.                     gespeichert wird.  Folgende Werte sind möglich:
  1149.  
  1150.                     select == 0  -> ENTER-Taste gedrückt
  1151.                     select == 1  -> ESC-Taste im Hauptmenü gedrückt
  1152.                     select == 2  -> F1-Taste für Hilfe gedrückt
  1153.                     select == 3  -> interner Fehler aufgetreten
  1154.  
  1155.                     Die Arbeitsweise der Funktion "UseMenu" wird  später
  1156.                     noch ausführlich erläutert (siehe Kapitel 5.4).
  1157.  
  1158.  
  1159.             int fehler;
  1160.  
  1161.                     Die Variable "fehler" wird doppelt verwendet.
  1162.  
  1163.                     Einmal  benutzt  die  Funktion  "hardfehler"   diese
  1164.                     Variable,    um    bei    aufgetretenen   kritischen
  1165.                     Hardware-Fehlern (für  Assembler-Programmierer:  INT
  1166.                     24h)  einen  Programmierfehler  im  Quick-C Compiler
  1167.                     (Version 2.0) auszugleichen. Dieser Verwendungszweck
  1168.                     ist für den Anwender der Toolbox  nicht  weiter  von
  1169.                     Bedeutung.
  1170.  
  1171.                     Die   zweite   und   wichtigere   Verwendung  dieser
  1172.                     Variablen ist die Rückgabe eines  Fehler-Status  bei
  1173.                     der   Funktion   "inhalt".    Ist  ein  Fehler  beim
  1174.                     Anwenden jener Funktion  aufgetreten,  gibt  sie  in
  1175.                     dieser Variablen die Art des Fehlers zurück:
  1176.  
  1177.                     fehler == 0  ->  kein Fehler aufgetreten
  1178.                     fehler == 1  ->  Abbruch durch Drücken der ESC-Taste
  1179.                     fehler == 2  ->  Fehler beim Öffnen eines Windows
  1180.                     fehler == 3  ->  ungültiges Laufwerk angegeben
  1181.                     fehler == 4  ->  Fehler beim Aufruf von "malloc"
  1182.                     fehler == 5  ->  Fehler beim Zugriff auf ein Laufwerk
  1183.                     fehler == 6  ->  sonstige Fehler
  1184.  
  1185.                     Auf  die  genaue  Arbeitsweise der Funktion "inhalt"
  1186.                     und deren  Rückgabe-Werte  wird  später  detailliert
  1187.                     eingegangen (siehe Kapitel 5.5).
  1188.  
  1189.  
  1190.  
  1191. ------  5. Funktionen der Toolbox  --------------------------------------------
  1192.  
  1193.            Nachdem  nun  alle   wichtigen   Strukturen   und   Variablen
  1194.            beschrieben sind, können wir zu einem nicht weniger wichtigen
  1195.            Teil übergehen, nämlich zu den Funktionen der Toolbox.
  1196.  
  1197.            Die Toolbox wurde weitgehend modular aufgebaut.  Der modulare
  1198.            Aufbau hat bekannterweise viele Vorteile:
  1199.  
  1200.            - Erleichterung der Fehlersuche
  1201.            - unabhängiges Austesten der einzelnen Module
  1202.            - einzelne Module müssen nur einmal  geschrieben  werden  und
  1203.              können  dann  auch  von  anderen Modulen und Programmen als
  1204.              Baustein benutzt werden
  1205.            - die einzelnen Module lassen sich leicht  ändern,  erweitern
  1206.              oder austauschen
  1207.  
  1208.            Durch den modularen Aufbau der Toolbox gibt es  jedoch  viele
  1209.            Funktionen, die der Programmierer überhaupt nicht kennen muß,
  1210.            weil  sie  nur  innerhalb  der  Toolbox  (intern)  aufgerufen
  1211.            werden.  Diese internen Funktionen werden hier deshalb  nicht
  1212.            genauer  erwähnt.   Sollten  trotzdem  Informationen hierüber
  1213.            benötigt  werden,   empfehle   ich   einen   Blick   in   den
  1214.            kommentierten Quellcode.  Hier wird JEDE Funktion ausführlich
  1215.            beschrieben.
  1216.  
  1217.            Einige  Funktionen  benötigen  zusätzlichen Speicherplatz zum
  1218.            Zwischenspeichern  von  Daten   (z.    B.    die   Funktionen
  1219.            "OpenWindow",  "inhalt"  u.   a.).  Dieser Speicherplatz wird
  1220.            mit Hilfe der Standard-Funktion "malloc" in den Heap-Speicher
  1221.            gelegt.  Durch die dynamische Speicherplatz-Reservierung  auf
  1222.            dem  Heap  wird  kein  unnötiger  Speicherplatz verschwendet.
  1223.            Entsprechend hängen die Extremwerte der Toolbox auch von  der
  1224.            Größe  des noch zur Verfügung stehenden RAM-Hauptspeichers ab
  1225.            (z.  B.  die maximale Anzahl der  Windows,  die  gleichzeitig
  1226.            geöffnet werden können).
  1227.  
  1228.            Diese  Dokumentation  beschreibt nur jene Funktionen, die der
  1229.            Programmierer "im alltäglichen Leben" auch wirklich  aufrufen
  1230.            und benutzen wird bzw. kann.
  1231.  
  1232.            Bitte  beachten Sie, daß die Namen der Funktionen zum Teil in
  1233.            gemischter Groß- und Kleinschreibung definiert wurden.   Dies
  1234.            ist  kein Zufall.  Hierdurch soll vielmehr verhindert werden,
  1235.            daß der Programmierer  zufällig  eigene  Funktionen  mit  dem
  1236.            gleichen  Namen  verwendet, wie sie in der Toolbox vorkommen.
  1237.            Dies würde bei den Programmen zu seltsamen  Laufzeitverhalten
  1238.            führen, wenn der Fehler nicht entdeckt wird.
  1239.  
  1240.            Eine   alphabetisch   sortierte  Auflistung  aller  wichtigen
  1241.            Funktionen der Toolbox finden Sie in der Kurzreferenz  dieser
  1242.            Dokumentation (siehe Anhang A).
  1243.  
  1244.  
  1245.         5.1 Verwaltung der Toolbox
  1246.  
  1247.             int OpenTool()
  1248.  
  1249.                Diese  Funktion  initialisiert  die  Toolbox  und muß auf
  1250.                jeden Fall einmal aufgerufen werden, bevor irgendeine der
  1251.                anderen Funktionen der Toolbox verwendet werden kann.  Am
  1252.                besten ruft man  diese  Funktion  gleich  zu  Beginn  des
  1253.                Programmes  auf,  also  als ersten Befehl in der Funktion
  1254.                main():
  1255.  
  1256.                ...
  1257.  
  1258.                int main()
  1259.                {
  1260.                   /* Variablen werden hier deklariert */
  1261.  
  1262.                   if( OpenTool() == 0 )    /* Fehler aufgetreten? */
  1263.                      return ( 1 );         /* ja, dann beende Hauptprogramm */
  1264.  
  1265.                ...
  1266.  
  1267.                   CloseTool();
  1268.  
  1269.                }
  1270.  
  1271.                ...
  1272.  
  1273.                Danach  braucht  diese  Funktion  während  des   gesamten
  1274.                Programmablaufes nicht mehr aufgerufen zu werden.
  1275.  
  1276.                "OpenTool()"    ermittelt   als   erstes   die   aktuelle
  1277.                DOS-Version.  Ist diese niedriger  als  Version  3.0,  so
  1278.                gibt die Funktion eine Fehlermeldung aus.
  1279.  
  1280.                Außerdem   wird  der  passende  Textmodus  ermittelt  und
  1281.                eingestellt.  Kann  kein  passender  Videomodus  gefunden
  1282.                werden, so gibt die Funktion ebenfalls eine Fehlermeldung
  1283.                aus.
  1284.  
  1285.                In der Vollversion prüft die Funktion zusätzlich, ob noch
  1286.                mindestens 20 KB Hauptspeicherplatz  für  den  Heap  frei
  1287.                sind.   Wenn  nicht, gibt die Funktion eine Fehlermeldung
  1288.                aus und bricht ab.
  1289.  
  1290.                Danach   werden  diverse  globale  und  lokale  Variablen
  1291.                initialisiert, u.  a.  die Variablen  "f0,  f1,  f2,  f3,
  1292.                select" und andere.
  1293.  
  1294.                Weiterhin  merkt sich die Funktion die momentane Form des
  1295.                Hardware-Cursors und macht diesen dann unsichtbar.   Dies
  1296.                ist notwendig, weil der Cursor sonst den Bildschirmaufbau
  1297.                stören würde.
  1298.  
  1299.                Schließlich verbiegt die Funktion noch den Interrupt 24h,
  1300.                der   beim  Auftreten  eines  kritischen  Hardwarefehlers
  1301.                aufgerufen  wird.    Dies   geschieht   mit   Hilfe   der
  1302.                Toolbox-Internen  Funktion  "_hardfehler".   Das Umleiten
  1303.                des Interrupts 24h ist notwendig, weil sonst z.   B.   im
  1304.                Falle  eines  nicht  verriegelten Diskettenlaufwerkshebel
  1305.                die  DOS-Meldung   "(R)etry,   (i)gnore   or   (c)ancel?"
  1306.                erscheinen  und  den  gesamten Bildschirmaufbau zerstören
  1307.                würde.
  1308.  
  1309.                "OpenTool" gibt einen ganzzahligen  Ergebniswert  zurück.
  1310.                Ist  dieser  Wert  gleich  null,  so ist irgendein Fehler
  1311.                aufgetreten (falsche  DOS-Version,  falsche  Grafikkarte,
  1312.                zuwenig  Speicherplatz  frei  usw.).  In diesem Fall darf
  1313.                die Toolbox nicht verwendet  werden.   Vielmehr  ist  das
  1314.                Hauptprogramm zu beenden!
  1315.  
  1316.  
  1317.             void CloseTool()
  1318.  
  1319.                Diese Funktion ist das  Gegenstück  zu  "OpenTool".   Sie
  1320.                sollte  vor  der Beendigung des Hauptprogrammes unbedingt
  1321.                aufgerufen werden.  Sie  schließt  alle  noch  geöffneten
  1322.                Windows  und  gibt  den  reservierten  Heap-Speicherplatz
  1323.                frei.    Außerdem   wird    die    alte    Gestalt    des
  1324.                Hardware-Cursors  wieder  hergestellt,  d.   h.   er wird
  1325.                normalerweise wieder sichtbar.
  1326.  
  1327.                Der verbogene Interrupt 24h (siehe  Funktion  "OpenTool")
  1328.                wird  NICHT  wieder  auf  die alte Routine gesetzt!  Dies
  1329.                erledigt DOS automatisch, wenn das Programm beendet  ist.
  1330.                Für Assembler-Programmierer: Die Adresse, auf die der INT
  1331.                24h vorher gezeigt hat, wird von DOS im "Programm Segment
  1332.                Präfix" (PSP) an dem Offset 12h zwischengespeichert.
  1333.  
  1334.                Es wird kein Ergebniswert zurückgeliefert.
  1335.  
  1336.  
  1337.  
  1338.         5.2 Allgemeine Ein- / Ausgaben beim Bildschirm
  1339.  
  1340.             int set_textmode()
  1341.  
  1342.                Die  Funktion  ermittelt  den  besten,  zur   eingebauten
  1343.                Grafikkarte  passenden Videomodus.  Dieser Textmodus wird
  1344.                dann eingeschaltet, der Bildschirm gelöscht und die erste
  1345.                Bildschirmseite  des   Textmodus   aktiviert.    Außerdem
  1346.                speichert   "set_textmode()"  in  der  globalen  Variable
  1347.                "farbe" die Art der  eingebauten  Grafikkarte  ab  (siehe
  1348.                auch  Kapitel  4.3).   Ist  "farbe" gleich eins, so wurde
  1349.                eine Farbgrafik-Karte entdeckt.  Ist "farbe" gleich null,
  1350.                wurde eine monochrome Grafikkarte entdeckt.
  1351.  
  1352.                "set_textmode()"   gibt   einen   Ganzzahlwert  (Integer)
  1353.                zurück.  Ist dieser  Rückgabewert  gleich  null,  so  ist
  1354.                irgendein  Fehler beim Einstellen des passenden Textmodus
  1355.                aufgetreten (vermutlich ist die Grafikkarte nicht für die
  1356.                Toolbox geeignet oder wird nicht erkannt).
  1357.  
  1358.                Meldet  die  Funktion einen Wert ungleich null zurück, so
  1359.                wurde sie erfolgreich (ohne Fehler) beendet.
  1360.  
  1361.                Diese Funktion braucht in der  Regel  nie  aufgerufen  zu
  1362.                werden,  da  sie  eigentlich nur Toolbox-Intern verwendet
  1363.                wird.  Bei manchen Programmen kann es  jedoch  vorkommen,
  1364.                daß  der aktuelle Videomodus verstellt wurde (z.  B.  bei
  1365.                einer DOS-Shell).  In einem solchen Fall sollte man diese
  1366.                Funktion aufrufen, um wieder den  zur  Toolbox  passenden
  1367.                Videomodus zu aktivieren.
  1368.  
  1369.  
  1370.             void fastprint( x, y, attribut, text )
  1371.                int x, y, attribut
  1372.                char far *text
  1373.  
  1374.                Diese  Funktion  ermöglicht  die  Textausgabe   auf   dem
  1375.                Bildschirm.  "text" ist ein far-Zeiger auf eine mit einem
  1376.                Null-Byte  abgeschlossene  Zeichenkette.  Sie können auch
  1377.                einen  near-Zeiger  übergeben,  da   bei   der   Übergabe
  1378.                automatisch eine Typumwandlung durchgeführt wird.
  1379.  
  1380.                "attribut" ist das Bildschirmattribut, in  dem  der  Text
  1381.                erscheinen soll, also dessen Darstellungs-Farbe.  Es sind
  1382.                dieselben   Attribute   wie  für  den  Fensterhintergrund
  1383.                möglich  (siehe   Kapitel   4.1   "Windows"   unter   der
  1384.                Struktur-Variable "wattr").
  1385.  
  1386.                Die Variablen "x" und "y" geben die Spalte und die  Zeile
  1387.                an,  in der der Text erscheinen soll.  Für "x" sind Werte
  1388.                von 0 bis 79, für "y" Werte von 0 bis 24 möglich.
  1389.  
  1390.                Als Steuerzeichen im Text ist lediglich der Code 10 (line
  1391.                feed; "\n") erlaubt.  Dieser bewirkt einen Sprung in eine
  1392.                neue Zeile.  Dabei steht der Cursor dann  wieder  in  der
  1393.                Spalte, die in der Variablen "x" übergeben wurde.
  1394.  
  1395.                Alle  anderen  Steuerzeichen  werden  auf  dem Bildschirm
  1396.                ausgegeben.   Dies  kann  absichtlich   dazu   mißbraucht
  1397.                werden.    Auch  der  Tabulator  wird  als  Sonderzeichen
  1398.                ausgegeben.   Die  nächste  Tabulatorstelle  wird  jedoch
  1399.                nicht angesprungen!
  1400.  
  1401.                Wird bei der Ausgabe des Textes der rechte Bildschirmrand
  1402.                erreicht  (Spalte  80), so wird die Ausgabe in der Spalte
  1403.                eins der nächsten Zeile fortgesetzt.
  1404.  
  1405.                Beispiel:   fastprint( 10, 4, f0, "Zeile 4\nSpalte 10" );
  1406.  
  1407.                "fastprint" schreibt den auszugebenden Text direkt in den
  1408.                Bildschirmspeicher.   Dadurch   wird   die   enorm   hohe
  1409.                Geschwindigkeit  bei  der  Textausgabe erreicht.  Es kann
  1410.                allerdings   bei   einigen   älteren    CGA-Karten    zum
  1411.                kurzzeitigen   Flimmern   und  Flackern  des  Bildschirms
  1412.                während der Textausgabe kommen.
  1413.  
  1414.                Bei  den Textausgaben liegt die Verantwortung vollständig
  1415.                beim Programmierer, ob der  Text  auch  wirklich  an  der
  1416.                richtigen Stelle und innerhalb des Windows landet.
  1417.  
  1418.                Die Funktion gibt keine Werte zurück.
  1419.  
  1420.  
  1421.             void string ( x, y, attribut, anzahl, zeichen )
  1422.                int x, y, attribut, anzahl
  1423.                unsigned char zeichen
  1424.  
  1425.                Diese  Funktion  gibt  das  in  der  Variablen  "zeichen"
  1426.                angegebene ASCII-Zeichen sooft auf dem Bildschirm aus wie
  1427.                es in der Variablen "anzahl" angegeben wurde.
  1428.  
  1429.                "attribut"  ist  das Farbattribut, in dem die Zeichen auf
  1430.                dem    Bildschirm    erscheinen    sollen,    also    die
  1431.                Darstellungs-Farbe.   Es sind dieselben Attribute wie für
  1432.                den  Fensterhintergrund  möglich   (siehe   Kapitel   4.1
  1433.                "Windows" unter der Struktur-Variablen "wattr").
  1434.  
  1435.                Die  Variablen "x" und "y" geben die Spalte und die Zeile
  1436.                an, in der die Zeichen erscheinen sollen.  Für  "x"  sind
  1437.                Werte von 0 bis 79, für "y" Werte von 0 bis 24 möglich.
  1438.  
  1439.                Wird  bei   der   Ausgabe   des   Zeichens   der   rechte
  1440.                Bildschirmrand  erreicht (Spalte 80), so wird die Ausgabe
  1441.                in der Spalte eins der nächsten Zeile fortgesetzt.
  1442.  
  1443.                Die Funktion liefert keine Werte zurück.
  1444.  
  1445.  
  1446.             void cls( attribut )
  1447.                int attribut
  1448.  
  1449.                Der  gesamte  Bildschirm   wird   mit   der   angegebenen
  1450.                Attribut-Farbe gelöscht.
  1451.  
  1452.                "attribut"  ist  das  Bildschirmattribut,  mit  dem   der
  1453.                Bildschirm    gefüllt    werden    soll,    also   dessen
  1454.                Darstellungs-Farbe.  Es sind dieselben Attribute wie  für
  1455.                den   Fensterhintergrund   möglich   (siehe  Kapitel  4.1
  1456.                "Windows" unter der Struktur-Variable "wattr").
  1457.  
  1458.  
  1459.             void rahmen( x, y, breite, hoehe, art, attribut )
  1460.                int x, y, breite, hoehe, art, attribut
  1461.  
  1462.                Diese  Funktion  zeichnet  den angegebenen Rahmen auf dem
  1463.                Bildschirm.
  1464.  
  1465.                Die Variablen "x" und "y" geben die linke obere Ecke  des
  1466.                Rahmens an.  "x" muß die Spalte, "y" die Zeile der linken
  1467.                oberen  Ecke enthalten.  Für "x" sind Werte von 0 bis 79,
  1468.                für "y" von 0 bis 24 möglich.
  1469.  
  1470.                "breite"  steht  für die gewünschte Breite des Rahmens in
  1471.                Textzeichen.   "hoehe"   steht   entsprechend   für   die
  1472.                gewünschte  Höhe des Rahmens.
  1473.  
  1474.                "art" gibt an, welcher Rahmen gezeichnet werden soll.  Es
  1475.                sind Werte von 0 bis 3 zulässig:
  1476.  
  1477.                0  =  doppelter Strich als Rahmen
  1478.                1  =  einfacher Strich als Rahmen
  1479.                2  =  komplett ausgefüllter Rahmen (mit dem Zeichen "█")
  1480.                3  =  Rahmen wird waagrecht als doppelter Strich,
  1481.                      senkrecht als einfacher Strich dargestellt
  1482.  
  1483.                Wurde eine Zahl außerhalb dieses Wertebereichs angegeben,
  1484.                so wird als Vorgabe der Rahmen "0" gezeichnet.
  1485.  
  1486.                "attribut" ist das Bildschirmattribut, mit dem der Rahmen
  1487.                gezeichnet  werden  soll, also dessen Darstellungs-Farbe.
  1488.                Es    sind    dieselben    Attribute    wie    für    den
  1489.                Fensterhintergrund  möglich  (siehe Kapitel 4.1 "Windows"
  1490.                unter der Struktur-Variable "wattr").
  1491.  
  1492.                Die Funktion liefert keinen Ergebniswert zurück.
  1493.  
  1494.  
  1495.             char *input( x, y, attr, text, cpos )
  1496.                int x, y, attr
  1497.                char *text
  1498.                int cpos
  1499.  
  1500.                Beim  Aufruf  dieser  Funktion  wird  der Text angezeigt,
  1501.                den man editieren kann.   Besteht  der  Text  aus  lauter
  1502.                Leerzeichen, so erwartet die Funktion nur eine Eingabe.
  1503.  
  1504.                Die Variablen "x" und "y" geben an, an  welcher  Position
  1505.                der  zu  editierende  Text  erscheinen  bzw.  die Eingabe
  1506.                erfolgen soll.  "x" gibt die Spalte an, "y" die Zeile auf
  1507.                dem Bildschirm.  Für "x" sind Werte von 0 bis 79, für "y"
  1508.                Werte von 0 bis 24 möglich.
  1509.  
  1510.                In  "attr"  muß  das  gewünschte  Farbattribut  angegeben
  1511.                werden, mit dem der zu editierende Text bzw.  die Eingabe
  1512.                erfolgen soll (Aufbau des  Attributs  siehe  Kapitel  4.1
  1513.                unter der Struktur-Variable "wattr").
  1514.  
  1515.                In  der  Variable  "*text"  wird  ein  Zeiger   auf   den
  1516.                Speicherplatz  übergeben,  der für die Eingabe reserviert
  1517.                worden ist.  Es können maximal soviele Zeichen eingegeben
  1518.                werden,  wie   dieser   Speicherplatz   groß   ist   (das
  1519.                abschließende   Null-Byte,   mit  dem  der  Speicherplatz
  1520.                abgeschlossen sein muß,  wird  nicht  mitgezählt!).   Der
  1521.                Inhalt  dieses  Speicherplatzes wird zuerst am Bildschirm
  1522.                angezeigt, danach kann man ihn  editieren.   Enthält  der
  1523.                Speicherplatz  nicht  lediglich  Leerzeichen, so kann man
  1524.                diesen Text editieren.   Enthält  der  Speicherplatz  nur
  1525.                Leerzeichen,  so  wird  ein  "leerer  Text" editiert (was
  1526.                soviel bedeutet wie eine beliebige Eingabe).
  1527.  
  1528.                Wichtig  ist,  daß  der  reservierte  Speicherplatz durch
  1529.                ein Null-Byte am Ende markiert sein muß, da  es  sich  um
  1530.                einen normalen Textstring handelt!
  1531.  
  1532.                Die Variable "cpos" gibt an, an welcher Stelle  innerhalb
  1533.                des  zu  editierenden  Textes  sich  der Cursor zu Beginn
  1534.                (nach dem Aufruf dieser Funktion) befindet.   Für  "cpos"
  1535.                sind   Werte   von  null  bis  zur  maximalen  Länge  des
  1536.                reservierten   Speicherplatzes   zulässig.    Wird    ein
  1537.                ungültiger  Wert  angegeben,  so steht der Cursor am Ende
  1538.                des Textes (also an der Stelle ganz rechts, ab  der  dann
  1539.                nur  noch  Leerzeichen  folgen;  besteht der Text nur aus
  1540.                Leerzeichen,  steht  der  Cursor  trotzdem  an der Stelle
  1541.                null, nämlich ganz links).
  1542.  
  1543.                Man  kann  natürlich  absichtlich  einen  ungültigen Wert
  1544.                für "cpos" angeben (z.  B.  "-1"), wenn man den Cursor am
  1545.                Ende des Textes stehen haben möchte.
  1546.  
  1547.                Als Rückgabewert wird ein  Zeiger  auf  den  reservierten
  1548.                Speicherplatz   zurückgegeben.   Ist  der  zurückgegebene
  1549.                Zeiger der NULL-Zeiger, so wurde  die  Funktion  mit  der
  1550.                ESC-Taste abgebrochen!
  1551.  
  1552.                Hinweis: Das   Drücken   der   F1-Taste  für  Hilfe  wird
  1553.                         innerhalb dieser Funktion nicht beachtet!
  1554.  
  1555.                Der   Cursor   kann   nicht   außerhalb  des  angegebenen
  1556.                Bildschirmbereichs  bewegt  werden.   Zum   Bewegen   des
  1557.                Cursors  innerhalb  des  gültigen Bildschirmbereichs sind
  1558.                die  Tasten  "Cursor  links",  "Cursor  rechts",   "POS1"
  1559.                ("HOME")  und  "END"  erlaubt.   Mit  der  Taste  "Einfg"
  1560.                ("INS")  kann  man  zwischen   dem   Einfüge-   und   dem
  1561.                Überschreibmodus  wechseln.   Die  Taste  "DEL" ("Lösch")
  1562.                löscht das Zeichen, auf dem der Cursor gerade  steht  und
  1563.                schiebt  den Text rechts davon um eine Stelle nach links.
  1564.                Die Löschtaste "<-" löscht das Zeichen links  vom  Cursor
  1565.                und  schiebt  den  Text  rechts  davon  ebenfalls um eine
  1566.                Stelle nach links.  Die "ESC"-Taste bricht  die  Funktion
  1567.                ab.  Mit der "ENTER"-Taste wird die Eingabe ordnungsgemäß
  1568.                bestätigt und die Funktion ebenfalls beendet.
  1569.  
  1570.                Der  zu  editierende  Text  sollte  nicht  länger  als 79
  1571.                Zeichen  sein,  da  er   sonst   nicht   mehr   in   eine
  1572.                Bildschirmzeile paßt.  Dadurch wird das Editieren unnötig
  1573.                erschwert,  weil  die  Cursortasten  "hoch"  und "runter"
  1574.                NICHT verwendet werden dürfen!
  1575.  
  1576.                Sollen nur Zahlenwerte eingegeben werden, so muß man  den
  1577.                eingegebenen  Text  nach  Beendigung der Funktion "input"
  1578.                mit der passenden Bibliotheksfunktion in einen Zahlenwert
  1579.                umwandeln und in einer geeigneten  numerischen  Variablen
  1580.                abspeichern.   Dabei ist zu beachten, daß der reservierte
  1581.                Speicherplatz  so  groß  sein   muß,   daß   die   größte
  1582.                einzugebende  Zahl als Text eingegeben werden kann.  Jede
  1583.                Ziffer benötigt eine Textstelle!
  1584.  
  1585.                Beispiel:        input( 10, 4, f1, "ändern?", -1 );
  1586.  
  1587.                Der Text "ändern?" wird in Spalte 10 der Zeile 4 mit  dem
  1588.                Farb-Attribut  "f1" ausgegeben.  Der Cursor steht am Ende
  1589.                des Textes.  Der Text kann dann editiert werden.
  1590.  
  1591.  
  1592.         5.3 Windows
  1593.  
  1594.             void wcls ( x, y, xx, yy, attribut )
  1595.                int x, y, xx, yy, attribut
  1596.  
  1597.                Diese Funktion löscht einen Bildschirmausschnitt.
  1598.  
  1599.                "attribut"   ist  das  Bildschirmattribut,  mit  dem  der
  1600.                Bildschirmausschnitt gefüllt  werden  soll,  also  dessen
  1601.                Darstellungs-Farbe.   Es sind dieselben Attribute wie für
  1602.                den  Fensterhintergrund  möglich   (siehe   Kapitel   4.1
  1603.                "Windows" unter der Struktur-Variable "wattr").
  1604.  
  1605.                Die Variablen "x" und "y" geben die Spalte und die  Zeile
  1606.                der  linken oberen Ecke an.  Für "x" sind Werte von 0 bis
  1607.                79, für "y" Werte von 0 bis 24 möglich.
  1608.  
  1609.                "xx" und "yy" enthalten die Breite (in Zeichen)  und  die
  1610.                Höhe  (in Zeilen), die der Bildschirmausschnitt groß ist.
  1611.                Abhängig von "x" und "y" sind Werte von  0  bis  79  (für
  1612.                "xx") und 0 bis 24 (für "yy") möglich.
  1613.  
  1614.                Überschreitungen der gültigen Wertbereiche  werden  nicht
  1615.                abgefangen.   Sie können zu unvorhergesehenen Ergebnissen
  1616.                führen!
  1617.  
  1618.                Es werden keine Werte zurückgegeben.
  1619.  
  1620.  
  1621.             int OpenWindow( wi )
  1622.                WINDOW *wi
  1623.  
  1624.                Durch den Aufruf dieser  Funktion  wird  ein  Bildschirm-
  1625.                Fenster (= Window) geöffnet.
  1626.  
  1627.                Der  übergebene  Zeiger  "*wi"  muß  auf  die  gewünschte
  1628.                WINDOW-Struktur zeigen (siehe Kapitel 4.1),  die  bereits
  1629.                vorher  mit den entsprechenden Daten initialisiert worden
  1630.                ist.
  1631.  
  1632.                Ein   bereits   geöffnetes   Window  wird  NICHT  nochmal
  1633.                geöffnet!
  1634.  
  1635.                Konnte  das  Window ohne Fehler geöffnet werden, gibt die
  1636.                Funktion einen Wert ungleich null zurück.
  1637.  
  1638.                Der Wert null als Rückgabewert bedeutet, daß  das  Window
  1639.                durch   irgendwelche   Probleme  (Speicherplatz,  bereits
  1640.                vorher geöffnet etc.) nicht geöffnet werden konnte.
  1641.  
  1642.  
  1643.             int CloseWindow()
  1644.  
  1645.                Diese  Funktion  schließt   dasjenige   Window,   welches
  1646.                zuletzt geöffnet wurde, also das oberste Fenster.
  1647.  
  1648.                Die   Windows   müssen  in  der  umgekehrten  Reihenfolge
  1649.                geschlossen werden, in der sie geöffnet wurden, damit der
  1650.                Bildschirmhintergrund nicht verändert wird.
  1651.  
  1652.                Es  werden  keine  Parameter  benötigt,  da  die  Toolbox
  1653.                automatisch  weiß, welches Window das oberste Fenster ist
  1654.                und als nächstes geschlossen werden muß.
  1655.  
  1656.                Gibt die Funktion den Rückgabewert null zurück,  so  sind
  1657.                bereits alle Windows geschlossen!
  1658.  
  1659.  
  1660.             void CloseAll( void )
  1661.  
  1662.                Die  Funktion  "CloseAll" schließt ALLE Windows, die noch
  1663.                offen sind.
  1664.  
  1665.                Es  werden  keine  Eingabe-Parameter  erwartet,  da   die
  1666.                Funktion das Schließen der Fenster selbständig überwacht.
  1667.  
  1668.                Es wird kein Rückgabewert zurückgegeben.
  1669.  
  1670.  
  1671.             void GoMain( item )
  1672.                MENU *item
  1673.  
  1674.                Diese Funktion schließt solange das oberste Fenster,  bis
  1675.                das Window des Hauptmenüs das oberste Fenster ist.
  1676.  
  1677.                In   der   Variable   "item"   muß  der  Zeiger  auf  die
  1678.                MENU-Struktur irgendeines Menüpunktes  übergeben  werden.
  1679.                Die  Funktion  sucht  mit Hilfe dieses Zeigers den ersten
  1680.                Menüpunkt des Hauptmenüs heraus.  Dort entnimmt sie dann,
  1681.                welches Fenster zum Hauptmenü gehört und schließt solange
  1682.                das oberste Fenster, bis das Window  des  Hauptmenüs  das
  1683.                oberste Fenster ist.
  1684.  
  1685.                Ist   das  Window  des  Hauptmenüs  nicht  geöffnet  oder
  1686.                existiert kein Window zu diesem Menü, bricht die Funktion
  1687.                ab, ohne irgendein Fenster zu schließen.
  1688.  
  1689.                Diese  Funktion  wird dann benötigt, wenn man nicht weiß,
  1690.                welche Windows eines Menüs noch offen  sind,  man  jedoch
  1691.                wieder  das  Hauptmenü aufrufen will.  Dabei würde es nur
  1692.                stören, wenn die Fenster von Submenüs noch offen sind.
  1693.  
  1694.                Es wird kein Rückgabewert zurückgeliefert.
  1695.  
  1696.  
  1697.         5.4 Menüs
  1698.  
  1699.             void PrepareMenu( first, vater )
  1700.                MENU *first
  1701.                MENU *vater
  1702.  
  1703.                Diese  Funktion  bereitet  die Benutzung eines kompletten
  1704.                Menüs vor, indem alle notwendigen Menü-Strukturen mit den
  1705.                entsprechenden Zeigern verkettet werden.
  1706.  
  1707.                Die  Variable  "first"  muß  auf  die "MENU"-Struktur des
  1708.                ERSTEN MENÜPUNKTES des HAUPTMENÜS zeigen!  Als  Wert  für
  1709.                die  Variable  "vater"  sollte  man immer den NULL-Zeiger
  1710.                übergeben,  da  das  Hauptmenü  nicht  gleichzeitig   ein
  1711.                Untermenü sein kann!
  1712.  
  1713.                Für  jeden  einzelnen  Menüpunkt  muß  man  eine einzelne
  1714.                "MENU"-Struktur initialisieren.  Außerdem  muß  in  jeder
  1715.                "MENU"-Sruktur  der  "*next"-Zeiger initialisiert werden,
  1716.                damit die Toolbox weiß, welche Menüpunkte zusammengehören
  1717.                und in welcher Reihenfolge die Menüpunkte vom Menü-Cursor
  1718.                zu durchlaufen sind.
  1719.  
  1720.                Die Funktion "PrepareMenu" hangelt sich  dann,  ausgehend
  1721.                vom   übergebenen   Menüpunkt  "*first",  mit  Hilfe  der
  1722.                "*next"-Zeiger  von  Punkt  zu  Punkt  und   stellt   die
  1723.                Verbindung  der Menüpunkte und der Submenüs untereinander
  1724.                her   (siehe   Kapitel   4.2,   "*sub"-,   "*prev"-   und
  1725.                "*father"-Zeiger innerhalb jeder Menü-Struktur).
  1726.  
  1727.                Diese  Funktion  muß nur ein einziges Mal zu Beginn eines
  1728.                Programmes aufgerufen  werden,  um  ein  komplettes  Menü
  1729.                für die Benutzung vorzubereiten.
  1730.  
  1731.                Sollen  innerhalb  eines  Programmes  mehrere UNABHÄNGIGE
  1732.                Menüs verwendet werden,  die  nicht  irgendwie  verbunden
  1733.                sind   (z.    B.   als  Submenü),  so  muß  die  Funktion
  1734.                "PrepareMenu" für jedes dieser Menüs  einzeln  aufgerufen
  1735.                werden.
  1736.  
  1737.                Es wird kein Rückgabewert zurückgeliefert.
  1738.  
  1739.                Hinweis: Die Funktion  ruft  sich  selbst  rekursiv  auf!
  1740.                         Sollte es zu Problemen kommen, weil der Stack zu
  1741.                         klein  ist, muß er im Programm vergrößert werden
  1742.                         (siehe  Kapitel  1.3).   Dieses  Problem   tritt
  1743.                         äußerst  selten auf, und zwar nur bei Menüs, die
  1744.                         sehr  viele  (tiefgehende)  Untermenüs  besitzen
  1745.                         (z.  B.  Submenü "Datei laden" im Submenü "Laden
  1746.                         von   Diskette"  im  Submenü  "Lesezugriffe"  im
  1747.                         Submenü "Übertragen" im Hauptmenü "Zugriffe  auf
  1748.                         Datenträger"...).  Im Allgemeinen sollte man auf
  1749.                         solche  tiefgehenden  Submenüs  verzichten, weil
  1750.                         sie  nicht  gerade  die  Übersichtlichkeit   und
  1751.                         Benutzerfreundlichkeit fördern.
  1752.  
  1753.  
  1754.             void cursor( attr )
  1755.                int attr
  1756.  
  1757.                Durch den  Aufruf  dieser  Funktion legt man fest, welche
  1758.                Farbe der Auswahl-Cursor bei den  Menüpunkten  sowie  der
  1759.                Cursor bei der "Input"-Funktion haben soll.
  1760.  
  1761.                "attr" ist das Bildschirm-Attribut, das bitweise  codiert
  1762.                ist    (Aufbau    siehe    Kapitel    4.1    unter    der
  1763.                Struktur-Variablen "wattr").
  1764.  
  1765.                Enthält "attr" der Wert "-1", so wird  der  Cursor  immer
  1766.                invers  zur  aktuellen  Farbe  dargestellt,  d.   h.  die
  1767.                Vorder- und die Hintergrundfarben werden vertauscht.
  1768.  
  1769.                Solange  diese  Funktion  nicht aufgerufen wird, gilt als
  1770.                Vorgabe, daß der Cursor invers dargestellt  wird  ("attr"
  1771.                gleich   "-1"   bei  Farbgrafik-Karten;  bei  monochromen
  1772.                Grafikkarten   wird   der    Cursor    invers    blinkend
  1773.                dargestellt).
  1774.  
  1775.                Die Funktion liefert keine Werte zurück.
  1776.  
  1777.  
  1778.             MENU *UseMenu( item )
  1779.                MENU *item
  1780.  
  1781.                Diese  Funktion  bringt  ein  Menü  auf  den  Bildschirm.
  1782.                Übergeben  wird  ein  Zeiger  auf die "MENU"-Struktur des
  1783.                Menüpunktes, auf dem der Auswahl-Cursor  (ein  besonderer
  1784.                Cursor in Form eines Lichtbalkens, der über die einzelnen
  1785.                Menüpunkte geschoben wird) zu Beginn stehen soll.
  1786.  
  1787.                Das entsprechende Haupt-  oder  Submenü  wird  angezeigt,
  1788.                vorher  ggf.   ein Window geöffnet und der Auswahl-Cursor
  1789.                angezeigt.
  1790.  
  1791.                Die  Reihenfolge,  in  der die Menüpunkte innerhalb eines
  1792.                Menüs durch Betätigen der Cursortasten aufleuchten,  wird
  1793.                nicht durch die Position am Bildschirm, sondern durch die
  1794.                Verkettung  der  einzelnen  Menü-Strukturen untereinander
  1795.                bestimmt.   Deshalb  sollten   die   Menü-Strukturen   so
  1796.                miteinander  verkettet  werden,  daß  die Reihenfolge der
  1797.                Verkettung so  ist,  wie  die  Menüpunkte  am  Bildschirm
  1798.                durchlaufen  werden  sollen.  Bei zweidimensionalen Menüs
  1799.                wird allerdings beim Betätigen der Cursortasten  "rechts"
  1800.                oder  "links"  automatisch der Cursor zum nächstgelegenen
  1801.                Nachbarpunkt        bewegt.         Deshalb        müssen
  1802.                nebeneinanderliegende Menüpunkte nicht direkt miteinander
  1803.                verkettet  sein.   Man  sollte  bei  der  Verkettung  von
  1804.                zweidimensionalen   Menüs   vielmehr   nach  dem  Prinzip
  1805.                vorgehen: Zuerst  von  oben  nach  unten,  dann  von  der
  1806.                nächsten Spalte rechts wieder von oben nach unten, usw.
  1807.  
  1808.                Einmal  kann  der Auswahl-Cursor mit den Cursortasten der
  1809.                Zehnertastatur bewegt werden.   Auch  die  Tasten  "POS1"
  1810.                ("HOME"),  "END"  "PgUp"  sowie  der  "PgDn"  bewegen den
  1811.                Cursor entsprechend.   Die  zweite  Möglichkeit  ist  das
  1812.                Drücken   einer   alphanumerischen   Taste,  wodurch  der
  1813.                Auswahl-Cursor zum nächsten Menüpunkt bewegt wird, dessen
  1814.                Bezeichnung mit diesem Zeichen  beginnt.   Die  Auslösung
  1815.                der  Menüfunktion  erfolgt  in  beiden  Fällen  über  die
  1816.                "RETURN"-  bzw.    "ENTER"-Taste.    Gibt   es   zu   dem
  1817.                angewählten  Menüpunkt  ein Submenü, wird dieses geöffnet
  1818.                und die Auswahl beginnt von neuem.
  1819.  
  1820.                Mit  der  "ESC"-Taste  gelangt  man  zum  vorherigen Menü
  1821.                (Vatermenü)  zurück,  wenn  man  sich  in  einem  Submenü
  1822.                befindet.   Das  Window  des  Submenüs  wird dabei wieder
  1823.                geschlossen.  Drückt man die  "ESC"-Taste  im  Hauptmenü,
  1824.                wird  die  Menü-Auswahl  abgebrochen  (das  Fenster   des
  1825.                Hauptmenüs wird jedoch NICHT geschlossen!).
  1826.  
  1827.                Durch   Drücken   der   F1-Taste   für   Hilfe  wird  die
  1828.                Menü-Auswahl ebenfalls abgebrochen.
  1829.  
  1830.                Als   Rückgabewert   erhält  man  einen  Zeiger  auf  die
  1831.                MENU-Struktur   des   ausgewählten   Menüpunktes.     Der
  1832.                NULL-Zeiger wird zurückgegeben, wenn bei der Menü-Auswahl
  1833.                ein schwerer Fehler aufgetreten ist.
  1834.  
  1835.                In der globalen Variablen "select" kann der Grund für die
  1836.                Beendigung  der Menü-Auswahl entnommen werden (siehe auch
  1837.                Kapitel 4.3).
  1838.  
  1839.                Folgende Werte für "select" sind möglich:
  1840.  
  1841.                0 = es wurde ein Menüpunkt mit der "ENTER"-Taste angewählt
  1842.                1 = es wurde die "ESC"-Taste im Hauptmenü gedrückt
  1843.                2 = es wurde die "F1"-Taste für Hilfe zu einem Menüpunkt
  1844.                    gedrückt (kontext-sensitive Hilfe möglich!)
  1845.                3 = es ist ein interner Fehler aufgetreten!
  1846.  
  1847.                Hat  der  Anwender  die  ESC-Taste  im Hauptmenü gedrückt
  1848.                (select = 1), so will er damit ausdrücken, daß er  keinen
  1849.                Menüpunkt auswählen wollte.
  1850.  
  1851.                Die Rückgabe eines Zeigers auf den ausgewählten Menüpunkt
  1852.                hat folgenden  Grund:  Innerhalb  der  MENU-Struktur  des
  1853.                ausgewählten    Menüpunktes    ist    die    individuelle
  1854.                Identifikations-Nummer abgespeichert (siehe  Kapitel  4.2
  1855.                unter der Struktur-Variablen "nr").  Mit ihrer Hilfe läßt
  1856.                sich  leicht eine entsprechende Programmaktion einleiten,
  1857.                die von dem ausgewählten Menüpunkt abhängig ist.
  1858.  
  1859.                Beispiel:
  1860.  
  1861.                ...
  1862.                MENU *punkt1, *mp;
  1863.                ...
  1864.                mp = UseMenu( punkt1 );  /* Menü anzeigen und benutzen  */
  1865.                if( select == 0 )        /* Menüpunkt mit ENTER gewählt */
  1866.                   switch( mp->nr )
  1867.                   {
  1868.                      case 1:   ...;
  1869.                      case 2:   ...;
  1870.                      case 3:   ...;
  1871.                      ...
  1872.                   }
  1873.                ...
  1874.  
  1875.                Die Funktion schließt bei Beendigung keine  Fenster!   Es
  1876.                steht  deshalb  in  der Verantwortung des Programmierers,
  1877.                die noch offenen Windows zu schließen,  wann  und  soweit
  1878.                dies notwendig ist.
  1879.  
  1880.  
  1881.  
  1882.         5.5 Dateiverwaltung
  1883.  
  1884.             char *inhalt( pfad, maske )
  1885.                char *pfad
  1886.                char *maske
  1887.  
  1888.                Diese  Funktion vereint die Informationen des DOS-Befehls
  1889.                "DIR" mit den DOS-Befehlen "CD", "A:", "B:" usw.
  1890.  
  1891.                Die  Funktion  ermöglicht  innerhalb  eines  Windows  die
  1892.                Auswahl einer Datei aus einer Liste  aller  Dateien,  die
  1893.                sich  in  dem angegebenen Verzeichnis befinden und die zu
  1894.                der genannten  Dateimaske  passen.   Der  Pfad  oder  das
  1895.                Laufwerk können geändert werden.
  1896.  
  1897.                In  der  Shareware-Version der Toolbox ist diese Funktion
  1898.                durch einen Hinweis-Bildschirm ersetzt worden.
  1899.  
  1900.                In  der  Variable  "*pfad"  muß   der   kompletten   Pfad
  1901.                (einschließlich   Laufwerk,   z.    B.    "C:\DOS")  OHNE
  1902.                abschließenden  Rückwärtsstrich  (=  Backslash   =   "\")
  1903.                übergeben  werden.   Lediglich  beim  Rootverzeichnis  (=
  1904.                Wurzel,   z.    B.    "C:\")   muß   der    abschließende
  1905.                Rückwärtsstrich  mit  angegeben  werden, da hierdurch das
  1906.                Wurzelverzeichnis markiert wird.
  1907.  
  1908.                In  der  Variable  "maske"  muß  die  Vorgabe   für   die
  1909.                Dateimaske  übergeben  werden.   Die  Dateimaske gibt an,
  1910.                welche Dateien angezeigt  werden  sollen.   Es  sind  die
  1911.                gleichen  Stellvertreterzeichen  wie  beim DIR-Befehl von
  1912.                DOS erlaubt ("?" und "*").  Dabei steht ein "?"  für  ein
  1913.                einzelnes  Zeichen, ein "*" für eine beliebige Anzahl von
  1914.                Zeichen.  Mit der Dateimaske "*.*" werden alle Dateien im
  1915.                aktuellen Verzeichnis angezeigt.  Die Dateimaske  "*.exe"
  1916.                zeigt   z.   B.   nur  alle  EXE-Dateien  im  angegebenen
  1917.                Verzeichnis an.
  1918.  
  1919.                In   der   Regel   sollte   man   als   Vorgabe  für  die
  1920.                Dateimaske  "*.*"  wählen,  da  hierdurch  alle   Dateien
  1921.                angezeigt werden.
  1922.  
  1923.                Als  erstes  fragt die Funktion "inhalt" den Anwender, ob
  1924.                er   mit   der   Vorgabe-Dateimaske   einverstanden   ist
  1925.                (Variable  "maske").   Auf  Wunsch  kann der Anwender die
  1926.                vorgegebene  Dateimaske  ändern.   Die  Abfrage   erfolgt
  1927.                innerhalb  eines  kleinen Fensters, das mit der aktuellen
  1928.                Farbe der globalen Variable "f1" dargestellt wird.
  1929.  
  1930.                Dann werden alle passenden Dateien  aus  dem  angegebenen
  1931.                Laufwerk  und  Pfad  (Variable  "pfad")  innerhalb  eines
  1932.                Windows angezeigt.   Sowohl  das  Fenster  als  auch  die
  1933.                angezeigten Dateien haben die aktuelle Farbe der globalen
  1934.                Variable   "f0".   Der  Anwender  kann  nun  (vollständig
  1935.                menügesteuert)   eine   Datei   aus   dieser   Auflistung
  1936.                auswählen.
  1937.  
  1938.                Wahlweise    kann    der    Anwender   auch   in   andere
  1939.                Unterverzeichnisse oder zu anderen  Laufwerken  wechseln.
  1940.                Hierfür  gibt es bestimmte Befehle (z.  B.  "A:", "CD .."
  1941.                usw.).  Die Befehle werden mit der  aktuellen  Farbe  der
  1942.                globalen Variable "f2" angezeigt.
  1943.  
  1944.                Ebenso  werden  alle  Unterverzeichnisse  des   aktuellen
  1945.                Pfades  angezeigt.  Die Darstellung erfolgt mit der Farbe
  1946.                der  globalen  Variable  "f3".   Durch   Anwählen   eines
  1947.                Unterzeichnisses wird dorthin verzweigt.
  1948.  
  1949.                Mit    der   Taste   "F1"   kann   man   sich   sämtliche
  1950.                Tastenbelegungen  und  die  Bedeutung  der  verschiedenen
  1951.                Anzeigen ansehen (= Hilfe).
  1952.  
  1953.                Sollte irgendein Fehler auftreten, z.  B.  keine Diskette
  1954.                im Laufwerk usw.,  so  wird  automatisch  zum  vorherigen
  1955.                Laufwerk   (normalerweise  Festplatte  C:)  umgeschaltet.
  1956.                Sollte auch hier ein Fehler auftreten, wird die  Funktion
  1957.                abgebrochen.
  1958.  
  1959.                Eine   Besonderheit  ist  bei  Computern  mit  nur  einem
  1960.                Diskettenlaufwerk  (unabhängig   von   der   Anzahl   der
  1961.                Festplatten) zu beachten: Hier simuliert DOS das Laufwerk
  1962.                B:,  indem  in Wirklichkeit nur das Laufwerk A: verwendet
  1963.                wird.    Beim   Umschalten   zwischen   diesen   "beiden"
  1964.                Laufwerken  wird  jedoch  eine Meldung angezeigt, die den
  1965.                gesamten Bildschirmaufbau zerstört.  Um die zu  vermeiden
  1966.                ermittelt die Funktion mit Hilfe des BIOS-Interrupts 11h,
  1967.                ob auch wirklich ein Laufwerk B: (physikalisch) vorhanden
  1968.                ist.   Falls  nicht,  wird das Umschalten auf Laufwerk B:
  1969.                ignoriert.
  1970.  
  1971.                Als  Rückgabewert  übergibt  die  Funktion "inhalt" einen
  1972.                Zeiger auf einen Textstring.  Dieser String  enthält  den
  1973.                Dateinamen der ausgewählten Datei inclusive des Laufwerks
  1974.                und des Pfads (z.  B.  "C:\WORD\WORD.EXE")!
  1975.  
  1976.                Wird der  NULL-Zeiger  zurückgegeben,  so  ist  irgendein
  1977.                Fehler  aufgetreten.   In  der globalen Variable "fehler"
  1978.                ist dann die  Fehler-Ursache  zu  entnehmen  (siehe  auch
  1979.                Kapitel 4.3 "Globale Variablen").  Folgende Fehlernummern
  1980.                sind möglich:
  1981.  
  1982.                0 = kein Fehler aufgetreten
  1983.                1 = Abbruch der Datei-Auswahl-Funktion mit der ESC-Taste
  1984.                2 = Fehler beim Öffnen eines Windows
  1985.                3 = ungültiges Laufwerk/Pfad angegeben
  1986.                4 = Fehler bei der Speicherreservierung (zuwenig Speicher?)
  1987.                5 = Fehler beim Zugriff auf ein Laufwerk
  1988.                6 = sonstiger Fehler
  1989.  
  1990.                Achtung: Der  Textstring,  auf  den  der   zurückgegebene
  1991.                         Zeiger  deutet,  wurde  nur  als lokale Variable
  1992.                         deklariert.  Wird die Funktion  "inhalt"  erneut
  1993.                         aufgerufen,  so wird der alte Inhalt des Strings
  1994.                         überschrieben.  Aus diesem Grund sollte  man  in
  1995.                         der   aufrufenden   Funktion   sofort  nach  der
  1996.                         ordnungsgemäßen Beendigung der Funktion "inhalt"
  1997.                         den Textstring  in  eine  eigene  Stringvariable
  1998.                         kopieren    (mit   der   Bibliotheks-   Funktion
  1999.                         "strcpy").   Ansonsten  kann   es   zu   fatalen
  2000.                         Seiteneffekten  kommen, weil der Textstring dann
  2001.                         plötzlich auf eine ganz andere Datei zeigt!
  2002.  
  2003.                Diese Funktion ist äußerst nützlich.  In praktisch  jedem
  2004.                größeren Programm ist es notwendig, auf bestimmte Dateien
  2005.                zuzugreifen,   die   der  Anwender  ausgewählt  hat.   So
  2006.                benötigen Textverarbeitungen zum Beispiel den  Namen  der
  2007.                Datei,  die bearbeitet werden soll.  Für diese Fälle kann
  2008.                man die Funktion "inhalt"  verwenden.   Sie  spart  einem
  2009.                viel      Programmier-Arbeit      und     ist     äußerst
  2010.                anwenderfreundlich!
  2011.  
  2012.                Die Funktion kann auch dazu  verwendet  werden,  nur  das
  2013.                Inhaltsverzeichnis    (=   Direktory)   eines   Laufwerks
  2014.                anzuzeigen.
  2015.  
  2016.                Der Bildschirmhintergrund wird durch diese Funktion nicht
  2017.                verändert.
  2018.  
  2019.                Beispiel:
  2020.  
  2021.                ...
  2022.                textdatei = inhalt( 'C:\\texte\\allgemein', '*.txt' );
  2023.                ...
  2024.  
  2025.                Innerhalb der Anweisung "inhalt" fällt  Ihnen  vielleicht
  2026.                auf,   daß   der  Pfad  einen  doppelten  Backslash  "\\"
  2027.                enthält.  Würden Sie versuchen, den Pfad so zu verwenden,
  2028.                wie er an sich richtig  aussieht  ("C:\texte\allgemein"),
  2029.                dann  würde  die  Zeichenkombination "\t" als Escapefolge
  2030.                für  ein  Tabulator-Zeichen  interpretiert  werden.    Um
  2031.                innerhalb   der  Anführungsstriche  eines  Strings  einen
  2032.                wirklichen Schrägstrich links zu erzielen, müssen Sie dem
  2033.                C-Compiler den doppelten Schrägstrich links  geben.   Der
  2034.                Grund  hierfür  liegt in der Tatsache begründet, daß in C
  2035.                der  einfache   Rückstrich   "\"   zur   Markierung   von
  2036.                Escapesequenzen verwendet wird.
  2037.  
  2038.                Aus Speicherplatzgründen können von der Funktion "inhalt"
  2039.                nicht  mehr  als  209  Dateien   und   Unterverzeichnisse
  2040.                gleichzeitig  angezeigt  werden.   Sollte ein Verzeichnis
  2041.                mehr  Einträge  besitzen,   werden   diese   nicht   mehr
  2042.                eingelesen und auch nicht angezeigt.
  2043.  
  2044.                Auf dem Bildschirm können  nicht  mehr  als  54  Einträge
  2045.                gleichzeitig  angezeigt  werden.   Mit  den Tasten "PgUp"
  2046.                und   "PgDn"   kann   man   deshalb   zwischen   mehreren
  2047.                Anzeige-Seiten wechseln.
  2048.  
  2049.  
  2050.  
  2051.         5.6 Sonstige
  2052.  
  2053.             int attribut( vg, hg, blinken )
  2054.                int vg, hg, blinken
  2055.  
  2056.                Sowohl bei den Variablen und Datenstrukturen als auch bei
  2057.                vielen  Funktionen  der  Toolbox muß ein (Farb-) Attribut
  2058.                übergeben werden.   Das  Attribut  gibt  an,  in  welcher
  2059.                Darstellungsart   (bei   monochromer   Grafikkarte)  bzw.
  2060.                Darstellungsfarbe    (bei     Farbgrafik-Karten)     eine
  2061.                Bildschirmausgabe erfolgen soll.
  2062.  
  2063.                Das  Attribut  ist  bitweise  codiert  (siehe Kapitel 4.1
  2064.                unter der Struktur-Variablen "wattr").  Die Codierung der
  2065.                einzelnen Bits ist jedoch nicht gerade einfach.  Auch ist
  2066.                nicht jeder C-Programmierer in der  Lage,  mit  einzelnen
  2067.                Bits  umzugehen,  obwohl dies in der Programmiersprache C
  2068.                häufig erforderlich ist.  Deshalb  wurde  diese  Funktion
  2069.                geschaffen.
  2070.  
  2071.                "attribut" führt die bitweise Codierung  der  angegebenen
  2072.                Farben zum passenden Attribut-Byte durch.
  2073.  
  2074.                "vg" gibt die Vordergrundfarbe (Textfarbe) an,  "hg"  muß
  2075.                die  Hintergrundfarbe  enthalten.  Die Variable "blinken"
  2076.                gibt an, ob der Text in diesen Farben blinken  soll  oder
  2077.                nicht.   Ist  "blinken"  gleich  null, so blinkt der Text
  2078.                nicht.  Jeder andere Wert als null liefert  das  Attribut
  2079.                mit blinkender Farbe zurück.
  2080.  
  2081.                Der  ganzzahlige  Rückgabewert   liefert   das   komplett
  2082.                codierte  Attribut  zurück, das in dieser Form z.  B.  in
  2083.                den Funktionen weiter verwendet werden kann.
  2084.  
  2085.                Hinweis: Bei    manchen     Grafikkarten     wird     die
  2086.                         Hintergrundfarbe  aufgehellt,  anstatt  daß  der
  2087.                         Text  blinkt.   Dies  ist  abhängig  von   einem
  2088.                         Registerwert  der  Grafikkarte und stellt keinen
  2089.                         schwerwiegenden Fehler dar.  Auf  eine  Behebung
  2090.                         dieses    Problems    wird   deshalb   vorläufig
  2091.                         verzichtet!
  2092.  
  2093.                Folgende  Parameter  sind  bei der Funktion "attribut" z.
  2094.                B.  erlaubt:
  2095.  
  2096.                ...
  2097.                int farbe;
  2098.                ...
  2099.                farbe = attribut( 7, 0, 0 );
  2100.                farbe = attribut( ROT, BLAU, 1 );
  2101.                farbe = attribut( 9, GELB, 100 );
  2102.                farbe = attribut( GRUEN, 1, -1 );
  2103.                ...
  2104.  
  2105.  
  2106.             int invert( attr )
  2107.                int attr
  2108.  
  2109.                Die   Funktion   "invert"    liefert    das    angegebene
  2110.                Bildschirm-Attribut invertiert zurück.
  2111.  
  2112.                Die  Variable  "attr"  enthält  das  Bildschirm-Attribut,
  2113.                das invertiert werden soll.
  2114.  
  2115.                Als Rückgabewert wird das invertierte Bildschirm-Attribut
  2116.                zurückgegeben,  wobei  ein evtles.  Blinken ausgeschaltet
  2117.                wurde.
  2118.  
  2119.                Hinweis: Invertieren  bedeutet,  daß  die   Vorder-   und
  2120.                         Hintergrundfarbe vertauscht werden.
  2121.  
  2122.  
  2123.             int alnum( zeichen )
  2124.                int zeichen
  2125.  
  2126.                Das in der Variable  "zeichen"  übergebene  ASCII-Zeichen
  2127.                wird  daraufhin  untersucht,  ob  es ein alphanumerisches
  2128.                Zeichen ist (alphanumerisch  bedeutet,  daß  das  Zeichen
  2129.                entweder  ein  Klein-  bzw.  Großbuchstabe oder aber eine
  2130.                Ziffer von 0 bis 9 ist).
  2131.  
  2132.                Im Gegensatz  zur  Bibliotheksfunktion  "isalnum"  werden
  2133.                auch  die  deutschen  Umlaute  ("ä",  "ö",  "ü", "ß") als
  2134.                alphanumerische Zeichen erkannt.
  2135.  
  2136.                Als Rückgabewert wird "0"  zurückgegeben,  wenn  es  sich
  2137.                um KEIN alphanumerisches Zeichen handelt.
  2138.  
  2139.  
  2140.             int lower( zeichen )
  2141.                int zeichen
  2142.  
  2143.                Das in der Variable  "zeichen"  angegebene  ASCII-Zeichen
  2144.                wird  in  einen Kleinbuchstaben umgewandelt, wenn es sich
  2145.                um einen Buchstaben handelt.
  2146.  
  2147.                Im Gegensatz zur Bibliotheksfunktion "tolower" werden von
  2148.                der Funktion "lower" auch die deutschen Umlaute "Ä",  "Ö"
  2149.                und    "Ü"    in   die   entsprechenden   Kleinbuchstaben
  2150.                umgewandelt.
  2151.  
  2152.                Lediglich das Zeichen "ß" wird nicht umgewandelt, weil es
  2153.                keine äquivalente Großschreibung besitzt.
  2154.  
  2155.                Als  Rückgabewert  erhält  man das beim Aufruf angegebene
  2156.                ASCII-Zeichen  zurück,  daß  (soweit  möglich)   in   den
  2157.                passenden Kleinbuchstaben umgewandelt wurde.
  2158.  
  2159.                War  "zeichen"  kein  Buchstabe,  so  wird der ASCII-Wert
  2160.                unverändert zurückgegeben.
  2161.  
  2162.  
  2163.             int color( text )
  2164.                char *text
  2165.  
  2166.                Die   Funktion   "color"   zeigt   in  einem  Window  die
  2167.                Darstellungs-Farben bzw.  -Arten  aller  256  Bildschirm-
  2168.                Attribute   an   (siehe   auch   Kapitel  4.1  unter  der
  2169.                Struktur-Variablen  "wattr").   Der  Anwender  kann  dann
  2170.                eines dieser Attribute auswählen.
  2171.  
  2172.                Das   Window   hat   die   aktuelle  Farbe  der  globalen
  2173.                Variable "f0".
  2174.  
  2175.                In der Shareware-Version der Toolbox ist  diese  Funktion
  2176.                durch einen Hinweis-Bildschirm ersetzt worden.
  2177.  
  2178.                Die  Variable "*text" zeigt auf einen Textstring, der als
  2179.                Window-Überschrift    ausgegeben     wird     (z.      B.
  2180.                "Vordergrundfarbe  auswählen"  usw.).   "*text" darf auch
  2181.                den NULL-Zeiger enthalten.  In  diesem  Fall  wird  keine
  2182.                Fenster-Überschrift angezeigt.
  2183.  
  2184.                Ist die in "*text" angegebene Überschrift länger  als  34
  2185.                Zeichen, so werden nur die ersten 34 Zeichen angezeigt!
  2186.  
  2187.                Man  kann  diese  Funktion verwenden, um den Anwender aus
  2188.                allen möglichen Farben diejenigen  auswählen  zu  lassen,
  2189.                welche  er am schönsten findet.  Entsprechend farbig kann
  2190.                man dann das Programm gestalten.  Weitere Hinweise hierzu
  2191.                finden Sie unter dem Kapitel 4.3 "Globale Variablen"  bei
  2192.                den Variablen "f0" bis "f3".
  2193.  
  2194.                Das  Drücken  der  F1-Taste  für Hilfe wird innerhalb der
  2195.                Funktion "color" nicht beachtet.
  2196.  
  2197.                Als Rückgabewert liefert  die  Funktion  das  ausgewählte
  2198.                (fertig  codierte)  Bildschirm-Attribut-Byte  zurück.  Es
  2199.                sind Werte von 0 bis 255 möglich.  Sollte der  Wert  "-1"
  2200.                zurückgegeben werden, so wurde die Funktion durch Drücken
  2201.                der  "ESC"-Taste  abgebrochen  bzw.   es  ist ein anderer
  2202.                interner Fehler aufgetreten.
  2203.  
  2204.                Der Bildschirmhintergrund wird durch diese Funktion nicht
  2205.                verändert.
  2206.  
  2207.  
  2208.  
  2209. ------  6. Beispiele und praktische Hinweise  ---------------------------------
  2210.  
  2211.            Hier  folgen  nun  einige  Hinweise,  wie  und  vor  allem in
  2212.            welcher Reihenfolge  eine  Menü-Oberfläche  mit  der  Toolbox
  2213.            entworfen werden sollte.
  2214.  
  2215.            Zu  beachten  ist,  daß  die Toolbox in der vorliegenden Form
  2216.            als "#include"-Datei ausgelegt worden  ist,  daß  heißt,  sie
  2217.            wird  vom Hauptprogramm mit Hilfe des Kommandos "#include" in
  2218.            den Source-Text eingebunden und jedesmal mit compiliert.  Das
  2219.            hat  zur  Folge,  daß  alle  globalen   Variablen   auch   im
  2220.            Hauptprogramm verfügbar sind.
  2221.  
  2222.            Es   ist  genauso  möglich,  die  Toolbox  zum  inkrementalen
  2223.            Compilieren zu  verwenden.   Das  spart  viel  Zeit,  da  sie
  2224.            dadurch  nicht  jedesmal neu compiliert werden muß.  Weil das
  2225.            inkrementale   Compilieren   jedoch   sehr   viel   mehr   an
  2226.            Vorbereitungen  erfordert  ("extern"-Definitionen usw.), soll
  2227.            an dieser Stelle nicht näher darauf eingegangen werden.   Die
  2228.            Vollversion der Toolbox unterstützt jedoch auch das  schnelle
  2229.            inkrementale  Compilieren.   Weitere  Informationen  hierüber
  2230.            können Sie  dem  Anhang  C  dieser  Dokumentation  und  Ihren
  2231.            Quick-C- Handbüchern entnehmen.
  2232.  
  2233.            Beim  Entwerfen  von  neuen  Menüs  sollte  man  in folgender
  2234.            Reihenfolge vorgehen:
  2235.  
  2236.            a) Überlegen Sie sich, welche Funktionen Sie von dem Menü aus
  2237.               steuern wollen, verteilen Sie diese sinnvoll in Untermenüs
  2238.               und benennen  Sie  die  einzelnen  Menüpunkte  schließlich
  2239.               mit selbsterklärenden Bezeichnungen.
  2240.  
  2241.               Am besten fertigt man sich eine Zeichnung an, in  der  das
  2242.               Hauptmenü   und   alle   Untermenüs  mit  der  annähernden
  2243.               Bildschirmposition  vermerkt  sind.   Überlegen  Sie  sich
  2244.               auch, ob die Menüpunkte innerhalb eines Windows erscheinen
  2245.               sollen  und  falls  ja, wie groß jedes dieser Windows sein
  2246.               muß.
  2247.  
  2248.               Es  ist  zu  empfehlen, daß die Menüpunkte jedes einzelnen
  2249.               Menüs (Haupt-  oder  Untermenü)  innerhalb  eines  Windows
  2250.               liegen,  damit der darunterliegende Bildschirminhalt nicht
  2251.               zerstört wird.
  2252.  
  2253.               Menüs sollen  anwenderfreundlich  sein.   Es  ist  deshalb
  2254.               sinnvoll, daß die "Menütiefe" nicht tiefer als drei Stufen
  2255.               reicht.    Das   bedeutet,   daß   das  Hauptmenü  mehrere
  2256.               Untermenüs  haben  darf.   Jedes  dieser  Untermenüs  darf
  2257.               nochmals  mehrere Untermenüs besitzen.  Weitere Untermenüs
  2258.               innerhalb der "Unter-Untermenüs" sollten jedoch  vermieden
  2259.               werden.  Grafisch sieht das folgendermaßen aus:
  2260.  
  2261.                                      ┌──────────────────┐
  2262.          Tiefe 1:                    │  Hauptmenü:      │
  2263.                                      ├──────────────────┤
  2264.                      ┌───────────────│  Datei...        │
  2265.                      │               │  Setup...        │───────┐
  2266.                      │               │  Suchen          │       │
  2267.                      │               │  Ende            │       │
  2268.                      │               └──────────────────┘       │
  2269.                      │                                          │
  2270.                      │                                          │
  2271.                      │    ┌─────────────────┐  ┌───────────┐    │
  2272.          Tiefe 2:    └──> │ Untermenü       │  │ Untermenü │ <──┘
  2273.                           ├─────────────────┤  ├───────────┤
  2274.                           │ Laden           │  │ Farben    │
  2275.                           │ Sichern         │  │ Drucker   │
  2276.                      ┌────│ Sichern als...  │  │ Tastatur  │
  2277.                      │    └─────────────────┘  └───────────┘
  2278.                      │
  2279.                      │
  2280.                      │
  2281.                      │    ┌──────────────────────────┐
  2282.          Tiefe 3:    └──> │ Untermenü                │
  2283.                           ├──────────────────────────┤
  2284.                           │ Alte Datei überschreiben │
  2285.                           │ Alte Datei umbenennen    │
  2286.                           │ Sicherheitskopie machen  │
  2287.                           └──────────────────────────┘
  2288.  
  2289.  
  2290.               Wie   man  in  der  Grafik  sieht,  kann  man  anhand  des
  2291.               Menüpunktes  bereits  sehen,  ob  ein  weiteres  Untermenü
  2292.               vorhanden  ist  oder  nicht.  Dies erkennt man an den drei
  2293.               nachfolgenden  Punkten   ("...").    Dadurch   wird   eine
  2294.               Menü-Oberfläche noch anwenderfreundlicher!
  2295.  
  2296.  
  2297.  
  2298.            b) Als  nächstes  sollte  man  alle notwendigen Variablen und
  2299.               Strukturen im Programm  aufstellen.   Am  einfachsten  und
  2300.               kürzesten  geht  das, indem man bereits bei der Variablen-
  2301.               und   Struktur-Deklaration   die   entsprechenden    Werte
  2302.               zuweist.   Beachten Sie dabei die Verkettung der einzelnen
  2303.               Menüpunkte, die über den Zeiger "*next" hergestellt werden
  2304.               muß (siehe Kapitel 4.2).   Dies  ist  problemlos  möglich,
  2305.               soweit man dabei folgendes beachtet:
  2306.  
  2307.               Der  Zeiger  "*next"  soll auf den nachfolgenden Menüpunkt
  2308.               verweisen, das heißt seine Adresse enthalten.  Die Adresse
  2309.               kann schon während der Strukturdefinition  mit  Hilfe  des
  2310.               Adreßoperators  "&"  ermittelt werden, jedoch nur für jene
  2311.               Strukturen, die  dem  Compiler  bis  zu  diesem  Zeitpunkt
  2312.               bekannt sind.  Das bedeutet:
  2313.  
  2314.               Soll   die   Adresse   der   Menü-Struktur  des  folgenden
  2315.               Menüpunktes mit Hilfe von "&" ermittelt werden, so muß die
  2316.               Struktur des folgenden Menüpunktes bereits  bekannt  sein,
  2317.               was nur möglich ist, wenn sie VORHER definiert worden ist.
  2318.  
  2319.               Schließlich    muß    der    "next"-Zeiger   der   letzten
  2320.               Menü-Struktur einer Menüstufe auf "NULL"  gesetzt  werden,
  2321.               damit die Toolbox den letzten Menüpunkt erkennen kann.
  2322.  
  2323.          !!!  Das oben Erklärte bedeutet im Prinzip nichts anderes,  als
  2324.          !!!  daß die Menüpunkt-Strukturen in umgekehrter Reihenfolge im
  2325.               Programm  definiert  werden  müssen, als wie sie später am
  2326.           !   Bildschirm erscheinen werden.
  2327.  
  2328.               Ähnliches  gilt für die Deklaration der Window-Strukturen.
  2329.               Auch hier muß die Window-Struktur bereits bekannt (d.   h.
  2330.               deklariert)   worden   sein,   BEVOR  sie  mit  Hilfe  des
  2331.               Adreßoperators "&" an eine Menüstruktur  übergeben  werden
  2332.               kann.
  2333.  
  2334.               Die Reihenfolge, in der  die  Menüpunkte  innerhalb  eines
  2335.               Menüs  durch  Betätigen der Cursortasten aufleuchten, wird
  2336.               nicht durch die Position am Bildschirm, sondern durch  die
  2337.               Verkettung  der  einzelnen  Menü-Strukturen  untereinander
  2338.               bestimmt!
  2339.  
  2340.               Es  ist zu empfehlen, alle Menü- und Window-Strukturen als
  2341.               globale  Variablen  zu  definieren.    Dazu   müssen   Sie
  2342.               außerhalb einer Funktion deklariert werden.
  2343.  
  2344.               Hierzu ein kurzes Programmbeispiel:
  2345.  
  2346.               WINDOW klein = { 5, 5, 20, 8, f1, f1, 1 }
  2347.               MENU punkt3 = { 7, 11, f0, "Punkt Nr. 3", 3, 0, 0, 0, 0, 0, 0 }
  2348.               MENU punkt2 = { 7,  9, f0, "Punkt Nr. 2", 2, 0, 0,
  2349.                               0, &punkt3, 0, 0 }
  2350.               MENU punkt1 = { 7,  7, f0, "Punkt Nr. 1", 1, 0, &klein,
  2351.                               0, &punkt2, 0, 0 }
  2352.  
  2353.               Hier  ist die Reihenfolge der Deklaration richtig gewählt.
  2354.               Obwohl  der  Menüpunkt  3  auf  dem  Bildschirm   in   der
  2355.               Reihenfolge  nach  Menüpunkt 2 und dieser nach Menüpunkt 1
  2356.               kommt,  wurden  sie   in   der   umgekehrten   Reihenfolge
  2357.               deklariert,  so  daß  die  Adresse  der  Struktur  bei der
  2358.               Definition des jeweiligen Menüpunktes bereits dem Compiler
  2359.               bekannt ist und mit "&" ermittelt werden kann.
  2360.  
  2361.               Sollte beim Aufruf von "PrepareMenu" bzw.  eines Menüs der
  2362.               Rechner  abstürzen  oder  irgendwelche  anderen "seltsamen
  2363.               Vorgänge" passieren, so könnte dies an einer  fehlerhaften
  2364.               Verkettung  liegen  (z.  B.  wenn der "*next"-Zeiger einer
  2365.               Menü-Struktur  auf   die   eigene   Adresse   zeigt,   der
  2366.               "next"-Zeiger   des  letzten  Menüpunktes  nicht  mit  dem
  2367.               "NULL"-Zeiger markiert wurde usw.).
  2368.  
  2369.               Das hier Erklärte sieht weitaus komplizierter aus, als  es
  2370.               in  Wirklichkeit  ist.  Damit sie das hier Erläuterte auch
  2371.               wirklich verstehen, könnten  Sie  versuchen,  verschiedene
  2372.               kleine  Menüs zu entwerfen.  Vorher sollten Sie jedoch das
  2373.               nun folgende Beispiel-Programm durcharbeiten.
  2374.  
  2375.               Ich empfehle außerdem, daß Sie den C-Quellcode  aller  auf
  2376.               dieser  Diskette befindlichen Beispiel- und Demo-Programme
  2377.               durcharbeiten,   analysieren   und   ein    wenig    damit
  2378.               experimentieren.
  2379.  
  2380.  
  2381.  
  2382. ------  7. Programm-Beispiel  -------------------------------------------------
  2383.  
  2384.            Das  folgende  Programm-Beispiel  verdeutlicht,  wie  man auf
  2385.            einfachste  Art  und  Weise  eine   gute   Benutzeroberfläche
  2386.            erstellen  kann.   Das  Programm  befindet  sich auch auf der
  2387.            Diskette unter dem Namen "Beispiel.C".  Bei  diesem  Beispiel
  2388.            kann man sehr gut die oben besprochene, verdrehte Reihenfolge
  2389.            bei   den  Struktur-Definitionen  sowie  die  Auswertung  der
  2390.            Identifikationsnummer der Menüpunkte erkennen.
  2391.  
  2392.            Die  Toolbox  wird   übrigens   mit   dem   "#include"-Befehl
  2393.            eingebunden:
  2394.  
  2395.            #include <window.c>
  2396.  
  2397.            Man kann Quick-C auf zwei  Arten  mitteilen,  wo  nach  einer
  2398.            Einfügedatei   zu   suchen   ist.    Für   Dateien   in   den
  2399.            "Standardverzeichnissen"    stellt    man    den    betreffen
  2400.            Dateinamen zwischen Winkelklammern ( <> ).
  2401.  
  2402.            Die  Standardverzeichnisse  für  Quick-C sind die mit INCLUDE
  2403.            (der Variablen des DOS-Environment) bestimmten Verzeichnisse.
  2404.  
  2405.            Eine    zweite    Variation    ist,    den    Dateinamen   in
  2406.            Anführungszeichen einzuschließen: #include "window.c"
  2407.  
  2408.            Diese Schreibweise bewirkt, daß der Compiler  im  Verzeichnis
  2409.            der  gegenwärtigen Quelldatei nach der Einfügedatei zu suchen
  2410.            beginnt.  Findet er die Datei dort nicht, wird die  Suche  in
  2411.            den Standardverzeichnissen fortgesetzt.
  2412.  
  2413.            "WINDOW.C"  sollte  nach  der   ersten   Methode   (mit   den
  2414.            Winkelklammern)  eingebunden werden.  Dadurch verhindert man,
  2415.            daß versehentlich eine andere Datei mit  dem  gleichen  Namen
  2416.            wie die Toolbox eingebunden wird.
  2417.  
  2418.  
  2419.            Hier  folgt nun das Programm.  Es ist ganze 150 Zeilen klein.
  2420.            Es demonstriert damit  die  Leistungsfähigkeit  der  Toolbox.
  2421.            Das  Programm  ist  auch  in der ausführbaren Version auf der
  2422.            Diskette enthalten (Datei "Beispiel.EXE").  Wer  die  Toolbox
  2423.            anhand  dieses  Programmes besser verstehen lernen will, kann
  2424.            das Programm mit Hilfe der  Einzelschritt-Debug-Funktion  von
  2425.            Quick-C v2.0 durchgehen.
  2426.  
  2427.            In    diesem    Beispiel    werden    die    Menüpunkt-   und
  2428.            Window-Strukturen   nicht   global,   sondern   lokal   (also
  2429.            beschränkt sichtbar) definiert.  In der Praxis ist es besser,
  2430.            diese  Strukturen  außerhalb  einer  Funktion zu deklarieren,
  2431.            damit sie global sichtbar sind.  Dadurch sind Änderungen  (z.
  2432.            B.  an der Farbe; siehe Kapitel 4.3 "globale Variablen" unter
  2433.            der Anmerkung "Achtung:") leichter möglich.
  2434.  
  2435.  
  2436. /* Beispiel.C --- Erläutert die Anwendung der verschiedenen neuen
  2437.                   Funktionen und (Struktur-) Variablen in der Toolbox
  2438.                   "Window.C".
  2439.  
  2440. */
  2441.  
  2442. #include <window.c>
  2443.  
  2444. int main()
  2445. {
  2446.    int a;                               /* Hilfsvariablen */
  2447.    MENU *m1, *m2;
  2448.  
  2449.    /* Definition (= deklaration) der Bildschirmfenster */
  2450.  
  2451.    WINDOW main = { 33, 3, 17, 8, f1, 0, f1, "> Hauptmenü <", 35, f1, 0, 0 };
  2452.    WINDOW sub1 = { 20, 9, 20, 7, f0, 1, f0, " Datei ", 26, f0, 0, 0 };
  2453.    WINDOW sub2 = { 40, 9, 15, 7, f2, 2, f2, " Setup ", 44, f2, 0, 0 };
  2454.    WINDOW sub3 = { 30, 14, 30, 7, f3, 3, f3, " Sichern als... ", 37, f3, 0, 0
  2455.                  };
  2456.    WINDOW help = { 10, 10, 60, 5, f0, 4, f0, " Kontextsensitive Hilfe ",
  2457.                    29, f1, 0, 0 };
  2458.  
  2459.    /* Jetzt folgt die Definition der einzelnen Menüpunkte. Hierbei ist
  2460.       die umgekehrte Reihenfolge der Menüpunkte bei der Deklaration
  2461.       deutlich erkennbar. Auf dem Bildschirm werden die Menüpunkte
  2462.       dagegen in der Reihenfolge durchlaufen, in der sie miteinander
  2463.       verkettet wurden.
  2464.    */
  2465.  
  2466.    MENU sub3p3 = { 32, 18, f0, " Sicherheitskopie machen  ", 33, 0,
  2467.                    0, 0, 0, 0, 0 };
  2468.    MENU sub3p2 = { 32, 17, f0, " Alte Datei umbenennen    ", 32, 0,
  2469.                    0, 0, &sub3p3, 0, 0 };
  2470.    MENU sub3p1 = { 32, 16, f0, " Alte Datei überschreiben ", 31, 0,
  2471.                    &sub3, 0, &sub3p2, 0, 0 };
  2472.  
  2473.    MENU sub2p3 = { 42, 13, f0, " Farben   ", 23, 0,
  2474.                    0, 0, 0, 0, 0 };
  2475.    MENU sub2p2 = { 42, 12, f0, " Drucker  ", 22, 0,
  2476.                    0, 0, &sub2p3, 0, 0 };
  2477.    MENU sub2p1 = { 42, 11, f0, " Tastatur ", 21, 0,
  2478.                    &sub2, 0, &sub2p2, 0, 0 };
  2479.  
  2480.    MENU sub1p3 = { 22, 13, f0, " Sichern als... ", 13, 0,
  2481.                    0, &sub3p1, 0, 0, 0 };
  2482.    MENU sub1p2 = { 22, 12, f0, " Sichern        ", 12, 0,
  2483.                    0, 0, &sub1p3, 0, 0 };
  2484.    MENU sub1p1 = { 22, 11, f0, " Laden          ", 11, 0,
  2485.                    &sub1, 0, &sub1p2, 0, 0 };
  2486.  
  2487.    MENU mainp4 = { 36, 8, f0, " ENDE      ", 04, 0,
  2488.                    0, 0, 0, 0, 0 };
  2489.    MENU mainp3 = { 36, 7, f0, " Suchen    ", 03, 0,
  2490.                    0, 0, &mainp4, 0, 0 };
  2491.    MENU mainp2 = { 36, 6, f0, " Setup...  ", 02, 0,
  2492.                    0, &sub2p1, &mainp3, 0, 0 };
  2493.    MENU mainp1 = { 36, 5, f0, " Datei...  ", 01, 0,
  2494.                    &main, &sub1p1, &mainp2, 0, 0 };
  2495.  
  2496.    /* Damit wären alle notwendigen Variablen und Strukturen deklariert.
  2497.       Als nächstes beginnt die Initialisierung der Toolbox und des
  2498.       kompletten Menüs:
  2499.    */
  2500.  
  2501.    if( OpenTool() == 0 )    /* Fehler beim Öffnen der Toolbox aufgetreten? */
  2502.       return( 1 );             /* ja, dann breche das Hauptprg. mit einem
  2503.                                   Fehlercode ab */
  2504.  
  2505.    PrepareMenu( &mainp1, NULL );   /* Menü vorbereiten, d. h. alle not-
  2506.                                       wendigen Zeiger-Verkettungen
  2507.                                       usw. durchführen */
  2508.  
  2509.    /* Nun wird das Hauptmenü aufgerufen */
  2510.  
  2511.    m2 = &mainp1;
  2512.  
  2513.    while( 1 == 1 )                      /* Endlosschleife erzeugen */
  2514.    {
  2515.       m1 = UseMenu( m2 );               /* Hauptmenü aufrufen */
  2516.  
  2517.       if( select == 1 )                 /* ESC im Hauptmenü gedrückt? */
  2518.          break;                       /* ja, dann Endlosschleife abbrechen */
  2519.  
  2520.       if( m1 == NULL )                  /* schwerer Fehler aufgetreten? */
  2521.       {
  2522.          CloseAll();                    /* ja, dann alle Windows schließen */
  2523.          CloseTool();                   /* Toolbox schließen */
  2524.          return( 1 );                   /* Programm abbrechen */
  2525.       }
  2526.  
  2527.       m2 = m1;                          /* gewählten Menüpunkt beim nächsten
  2528.                                            mal aufrufen */
  2529.  
  2530. if( select == 2 )                 /* Hilfe (F1) gedrückt? */
  2531.       {
  2532.          if( OpenWindow( &help ) == 0 ) /* Fehler beim Öffnen des Hilfe-
  2533.                                            Fensters aufgetreten? */
  2534.          {
  2535.             CloseAll();                 /* ja, dann schließe alle Windows */
  2536.             CloseTool();                /* Schließe die Toolbox */
  2537.             return( 1 );                /* und breche das Programm ab */
  2538.          }
  2539.          fastprint( 12, 12, f1, "Hier steht normalerweise der Hilfe-Text.\n\\
  2540. Bitte eine beliebige Taste drücken..." );
  2541.          a = getch();                         /* warte auf Tastendruck */
  2542.          CloseWindow();                 /* schließe Hilfefenster wieder */
  2543.       }
  2544.  
  2545.       if( select == 0 )                 /* einen Menüpunkt angewählt? */
  2546.       {
  2547.          if( m1->nr == 23 )             /* Farben-Setup angewählt? */
  2548.          {
  2549.             color( " Bitte passende Farbe auswählen: " );
  2550.             continue;                   /* Endlosschleife von vorne begin. */
  2551.          }
  2552.          if( m1->nr > 30  &&  m1->nr < 33 )  /* Laufwerkszugriffe? */
  2553.          {
  2554.             inhalt( "A:\\", "*.*" );         /* DIR anzeigen... */
  2555.             continue;                        /* Endlosschleife fortsetzen */
  2556.          }
  2557.             /* Hinweis: Die Funktionen "inhalt" und "color" sind in der
  2558.                         Shareware-Version der Toolbox NICHT enthalten! */
  2559.          if( m1->nr == 04 )                  /* Menüpunkt "Ende" gewählt? */
  2560.             break;                           /* ja, dann beende Endlosschl.*/
  2561.          printf( "\a" );        /* sonst Signalton ausgeben */
  2562.       }
  2563.    }            /* Wiederholung der Endlosschleife... bis ESC im Hauptmenü
  2564.                    zum Beenden des Programms gedrückt wurde! */
  2565.  
  2566.  
  2567.    if( OpenWindow( &help ) == 0 )       /* Fehler beim Öffnen des Hilfe-
  2568.                                            Fensters aufgetreten? */
  2569.    {
  2570.       CloseAll();                       /* ja, dann schließe alle Windows */
  2571.       CloseTool();                      /* Schließe die Toolbox */
  2572.       return( 1 );                      /* und breche das Programm ab */
  2573.    }
  2574.    fastprint( 15, 12, f1, "Zum Ende bitte eine beliebige Taste drücken... " );
  2575.    a = getch();                         /* warte auf Tastendruck */
  2576.    CloseAll();                          /* Schließe dann alle Windows */
  2577.    CloseTool();                         /* Schließe die Toolbox !!! */
  2578.  
  2579. /* Programmende */
  2580.  
  2581.    return( 0 );            /* Beende Programm mit Rückgabewert "OK" */
  2582.  
  2583. }
  2584.  
  2585.  
  2586.  
  2587. ------  8. Anwenderfreundliche Menüs ------------------------------------------
  2588.  
  2589.  
  2590.            Das Gebiet der Software-Ergonomie hat in den  letzten  Jahren
  2591.            einen enormen Aufschwung erlebt.  Noch anfang der 80er Jahren
  2592.            war  es  gang  und  gebe,  daß nach dem Programmstart nur ein
  2593.            kleiner Cursor erschien und sonst nichts!  Kein  Hinweis  war
  2594.            zu finden, um was für ein Programm es sich überhaupt handelt,
  2595.            geschweige  denn von einer kurzen Dokumentation.  Der Einsatz
  2596.            eines  solchen  Programmes  erforderte   vom   Anwender   oft
  2597.            tiefgehendes  Wissen.  Noch heute gibt es Programme, die nach
  2598.            diesem Prinzip arbeiten.  Hier denke man insbesondere an  die
  2599.            sog.   externen DOS-Befehle wie "BACKUP", "RESTORE" usw., die
  2600.            nicht einmal eine  kurze  Hilfe  oder  eine  Befehlsübersicht
  2601.            anbieten, wenn der Anwender einen Fehler macht.
  2602.  
  2603.            Heute hingegen hat ein Programm ohne eine anwenderfreundliche
  2604.            Bedienerführung  kaum mehr Chancen, sich gegen die Konkurrenz
  2605.            zu behaupten.
  2606.  
  2607.            Wie aber muß nun eine optimale  Benutzeroberfläche  aussehen?
  2608.            Diese  Frage  ist  gar  nicht so einfach zu beantworten.  Die
  2609.            Praxis  zeigt  nämlich,  daß  auf  dem   Markt   ein   buntes
  2610.            Durcheinander  herrscht.   Die einen schwören auf Piktogramme
  2611.            nach GEM-Manier, andere empfinden Pull-Down-Menüs  oder  eine
  2612.            einfache   Kommandosprache  als  optimal.   Der  Leidtragende
  2613.            dieses Durcheinanders ist letztlich der Anwender, der sich in
  2614.            dem "Dschungel" der Benutzeroberflächen"  zurechtfinden  muß.
  2615.            Dies ist wohl auch mit ein Grund dafür, daß der Branchenriese
  2616.            IBM  das SAA-Konzept (SAA = Systems Application Architecture)
  2617.            eingeführt  hat.   Das  Ziel   des   SAA-Konzepts   ist   es,
  2618.            hardware-unabhängige   Software  entwickeln  zu  können,  die
  2619.            aufgrund  ihrer  einheitlichen  Oberfläche  leicht  erlernbar
  2620.            ist.      Übrigens     enthält     auch    die    integrierte
  2621.            Entwicklungsoberfläche  von  QUICK-C  v2.0   viele   typische
  2622.            SAA-Elemente.
  2623.  
  2624.            Die   Toolbox   WINDOW.C   unterstützt   sowohl  Pop-Up-  und
  2625.            Pull-Down-Menüs als auch eigene Menükonzepte.  Hier  erhalten
  2626.            Sie  noch  einmal  einen Überblick, wie sich diese Menüformen
  2627.            unterscheiden:
  2628.  
  2629.            Pop-Up-Menüs:
  2630.  
  2631.            Die  Pop-Up-Menüs  unterstützen  theoretisch  eine unendliche
  2632.            Anzahl von senkrecht selektierbaren Einträgen, die  innerhalb
  2633.            eines  Windows  zusammengefaßt sind.  Die Anzahl der Einträge
  2634.            ist  bei  WINDOW.C  nur  durch   den   verfügbaren   Speicher
  2635.            begrenzt.    Pop-Up-Menüs  können  für  jeden  Eintrag  einen
  2636.            Hilfetext besitzen, müssen es aber nicht.
  2637.  
  2638.            Pull-Down-Menüs:
  2639.  
  2640.            Die Pull-Down-Menüs bestehen aus einer waagrechten Menüleiste
  2641.            am  oberen  Bildschirmrand  und  einem,  für  jeden   Eintrag
  2642.            vorhandenen    Untermenü    mit    senkrecht   selektierbaren
  2643.            Einträgen.  Die Einträge der Untermenüs  sind  jeweils  durch
  2644.            ein   Window  zusammengefaßt.   Pull-Down-Menüs  stellen  dem
  2645.            Benutzer also  eine  zweidimensionale  Menüschnittstelle  zur
  2646.            Verfügung.
  2647.  
  2648.            Sonstige Menüs:
  2649.  
  2650.            Zu  den  sonstigen Menüs zählen insbesondere die horizontalen
  2651.            Menüs von  WORD  und  LOTUS  1-2-3,  aber  auch  jede  andere
  2652.            exotische Anordnungsform von Menü-Einträgen.
  2653.  
  2654.  
  2655.            Doch  nun  wieder  zurück  zur  Ausgangsfrage:  Wie  hat eine
  2656.            optimale Benutzeroberfläche auszusehen?
  2657.  
  2658.            Zuerst   einmal   ist  hier  die  Anzahl  der  Menüpunkte  zu
  2659.            erwähnen.  Als optimale Anzahl von  Einträgen  für  ein  Menü
  2660.            haben  sich  fünf  bis  neun  Menüpunkte bewährt.  Sobald ein
  2661.            Programm mehr als neun  Funktionen  anzubieten  hat,  ist  es
  2662.            sinnvoll, diese entsprechend auf Untermenüs aufzuteilen.
  2663.  
  2664.            Bei  der  Aufteilung  der Menüpunkte in die Untermenüs stellt
  2665.            sich zwangsläufig die Frage, nach welchem  Ordnungskriteritum
  2666.            dies  geschehen  soll.   Als  Faustregel  gilt,  daß  nur die
  2667.            Menüpunkte zusammen in ein Menü aufgenommen  werden  sollten,
  2668.            die    auch   durch   einen   logischen   Zusammenhang   klar
  2669.            zusammengehören.   Der  logische  Zusammenhang  muß  für  den
  2670.            Anwender eindeutig erkennbar sein!
  2671.  
  2672.            Wenn  der Name des aufrufenden Menüpunktes nicht zusammen mit
  2673.            dem Untermenü auf dem Bildschirm zu sehen ist, läßt sich  nur
  2674.            schwer  ein  logischer Zusammenhang erkennen.  Deshalb sollte
  2675.            man unbedingt dafür sorgen, daß der  Menüpunkt,  mit  welchem
  2676.            das  Untermenü  aufgerufen  wurde, klar ersichtlich ist.  Das
  2677.            läßt sich z.  B.  dadurch  erreichen,  daß  das  Fenster  als
  2678.            Überschrift den Namen genau dieses Menüpunktes trägt.
  2679.  
  2680.            Die  einzelnen  Menüpunkte selbst sollen eindeutig sein.  Man
  2681.            muß bereits am Namen des Menüpunktes erkennen können, was für
  2682.            eine Funktion damit ausgeführt wird.  Man sollte es unbedingt
  2683.            vermeiden, zweideutige Bezeichnungen zu verwenden.  Wenn  man
  2684.            beispielsweise   einen   erstellten   Text   auf  Datenträger
  2685.            speichern   möchte,   sollte   der   Menüpunkt   nicht   etwa
  2686.            "Übertragen"   (!?),   sondern   "Text   speichern"   heißen.
  2687.            Natürlich darf man bei der Formulierung der Menüpunkte  nicht
  2688.            in  den  absoluten  Computerjargon  zurückfallen,  obwohl das
  2689.            manchmal schwerfällt, weil man damit  oft  einen  Sachverhalt
  2690.            viel  präziser  formulieren kann.  Unbedingt vermeiden sollte
  2691.            man   jedoch   die   Übersetzung   von    Fachwörtern    oder
  2692.            Wortneuschöpfungen.
  2693.  
  2694.            Übrigens wird es allzu oft vergessen, in die Menüführung eine
  2695.            Möglichkeit einzubauen, eine Menüebene zu verlassen, ohne daß
  2696.            eine   Auswirkung   auf  das  Programm  stattfindet.   Gerade
  2697.            ungeübte  Anwender   werden   sich   öfter   in   den   Menüs
  2698.            "verlaufen".  Kann man dann die aktuelle Menüebene nicht mehr
  2699.            verlassen,  ohne  irgendeine  Programm-Funktion  auszuführen,
  2700.            könnte es zu großen Problemen kommen.
  2701.  
  2702.            Ziemlich   schnell  wird  sich  der  Anwender  in  eine  gute
  2703.            Menüführung   eingewöhnen.    Doch   irgendwann   kommt   der
  2704.            Zeitpunkt,   an   dem   der   Anwender   nicht  erst  mehrere
  2705.            Menüebenen  durchwälzen  will,   bevor   er   eine   Funktion
  2706.            ausführen  kann.   Hier bietet sich nun die "Hot-Key"-Methode
  2707.            an.   Mit  dieser  Methode  wird  durch  das  Drücken   einer
  2708.            bestimmten  Tastenkombination  eine  Programm-Funktion direkt
  2709.            ausgeführt.  Ein Umweg  über  die  Menüführung  wird  dadurch
  2710.            vermieden.
  2711.  
  2712.            Als "Hot key" ("heiße Taste") bieten sich  die  Kombinationen
  2713.            aus   einer   Sondertaste   ("ALT",   "CTRL"...)   und  einer
  2714.            Buchstabentaste an.  Von der Verwendung  der  Funktionstasten
  2715.            wird  allerdings  dringend  abgeraten, weil es einfacher ist,
  2716.            sich einen Buchstaben zu merken, der  in  Beziehung  mit  dem
  2717.            Namen  eines  Menüpunktes  steht, als irgendeine Nummer einer
  2718.            Taste.  Es wäre z.  B.  denkbar, die Tastenkombination "CTRL"
  2719.            plus "S" für  den  Aufruf  der  Menüfunktion  "Speichern"  zu
  2720.            verwenden.
  2721.  
  2722.            Damit  der  Anwender  die "hot-keys" schneller lernt, sollten
  2723.            diese  zu  jedem  Menüpunkt  mit  angezeigt  werden,  z.   B.
  2724.            "Speichern <CTRL> + <S>".
  2725.  
  2726.            Eine  optimale  Benutzeroberfläche  mit  anwenderfreundlichen
  2727.            Menüs  macht  nicht  selten einen erheblichen Teil der ganzen
  2728.            Programmierarbeit aus.  Die Mühe lohnt sich jedoch.  WINDOW.C
  2729.            wird Ihnen dabei helfen, diese Zeit zu verringern  und  somit
  2730.            eine Menge Entwicklungskosten zu sparen!
  2731.  
  2732.  
  2733.  
  2734.  
  2735.  
  2736.                               A n h a n g
  2737.                              =============
  2738.  
  2739.  
  2740. ------  Anhang A: Kurzreferenz / Zusammenfassung der wichtigsten  -------------
  2741.                   globalen Variablen und Funktionen
  2742.  
  2743.                   Dieser  Anhang  beschreibt  die  Charakteristiken  der
  2744.                   wichtigsten globalen  Variablen  und  der  Funktionen.
  2745.                   Die Erörterungen dieses Anhangs geben jedoch nur einen
  2746.                   kurzen   Überblick.    Eine   komplette   Beschreibung
  2747.                   befindet  sich  an  den  entsprechenden  Stellen   der
  2748.                   vorangegangenen Dokumentation.
  2749.  
  2750.                   Die  Variablen-  und Funktions-Namen sind alphabetisch
  2751.                   sortiert, wodurch das Suchen erleichtert  wird.   Nach
  2752.                   den   einzelnen   Kategorien   sortierte  Auflistungen
  2753.                   befinden  sich  ebenfalls   in   der   vorangegangenen
  2754.                   Dokumentation.
  2755.  
  2756.  
  2757.  
  2758.         1. Globale Variablen
  2759.  
  2760.  
  2761.         int f0, f1, f2, f3;
  2762.  
  2763.                         In   diesen   Variablen    werden    die    vier
  2764.                         verschiedenen  Farb-Attribute  für  die normale,
  2765.                         erste,   zweite   und   dritte    hervorgehobene
  2766.                         Zeichen-Darstellung   gespeichert.   Siehe  auch
  2767.                         Kapitel 4.3
  2768.  
  2769.  
  2770.         unsigned int farbe;
  2771.  
  2772.                    Diese  Variable  wird  beim  Vorbereiten  der Toolbox
  2773.                    (Funktion "OpenTool") mit folgenden Werten belegt:
  2774.  
  2775.                    farbe = 0    -> monochrome Grafikkarte entdeckt
  2776.                    farbe = 1    -> Farbgrafik-Karte entdeckt
  2777.  
  2778.                    Das Ändern dieser Variablen  hat  keine  Auswirkungen
  2779.                    auf die Arbeitsweise der Toolbox. Sie dient lediglich
  2780.                    zur   Information  des  Programmierers.   In  manchen
  2781.                    Programmen ist diese Information recht nützlich.
  2782.  
  2783.  
  2784.         int fehler;     Gibt  bei  Beendigung der Funktion "inhalt"  den
  2785.                         Fehler-Status zurück:
  2786.  
  2787.                         fehler == 0  ->  kein Fehler aufgetreten
  2788.                         fehler == 1  ->  Abbruch durch Drücken der ESC-Taste
  2789.                         fehler == 2  ->  Fehler beim Window-Öffnen
  2790.                         fehler == 3  ->  ungültiges Laufwerk angegeben
  2791.                         fehler == 4  ->  Fehler beim Aufruf von "malloc"
  2792.                         fehler == 5  ->  Fehler beim Laufwerks-Zugriff
  2793.                         fehler == 6  ->  sonstige Fehler
  2794.  
  2795.  
  2796.         MENU:           Dieser  neue Datentyp dient der zusammengefaßten
  2797.                         Speicherung   aller   Informationen,   die   zum
  2798.                         Verwalten  eines einzelnen Menüpunktes notwendig
  2799.                         sind:
  2800.  
  2801.         static struct menu
  2802.         {
  2803.            int  x, y          /* Position des Menüpunktes am Bildschirm */
  2804.            int  nattr;        /* Farb-Attribut des Menüpunkt-Namens */
  2805.            char *name;        /* Zeiger auf Namen des Menüpunktes */
  2806.            int  nr;           /* Identifikationsnummer des Menüpunktes */
  2807.            char page;         /* Flag für neue Seite (<> 0: 1. MP der Seite) */
  2808.            struct window *window; /* Zeiger auf vorher zu öffnendes Window */
  2809.            struct menu *sub;    /* Zeiger auf ersten Menüpunkt des Untermenüs */
  2810.            struct menu *next;   /* Zeiger auf nächsten Menüpunkt */
  2811.            struct menu *prev;   /* Zeiger auf vorherigen Menüpunkt */
  2812.            struct menu *father; /* Zeiger auf Vatermenü des Submenüs */
  2813.         };
  2814.         typedef struct menu MENU;
  2815.  
  2816.  
  2817.         unsigned int screen;
  2818.  
  2819.                     In   dieser  Variablen  speichert  die  Toolbox  die
  2820.                     Segment-Adresse  des  Bildschirmspeichers  ab.   Der
  2821.                     Programmierer  braucht  sich allerdings in der Regel
  2822.                     nicht um die Verwaltung dieser Variable zu  kümmern,
  2823.                     sie   wird   von  der  Toolbox  automatisch  belegt.
  2824.                     Willkürliche Veränderungen  dieses  Variablen-Wertes
  2825.                     können  katastrophale  Folgen für den Programmablauf
  2826.                     haben!  Siehe auch Kapitel 4.3
  2827.  
  2828.  
  2829.         int select;     Diese Variable enthält einen  Abbruchscode,  der
  2830.                         angibt, aus welchem Grund die Funktion "UseMenu"
  2831.                         beendet wurde:
  2832.  
  2833.                         select == 0  ->  ENTER-Taste gedrückt
  2834.                         select == 1  ->  ESC-Taste gedrückt
  2835.                         select == 2  ->  F1-Taste für Hilfe gedrückt
  2836.                         select == 3  ->  interner Fehler aufgetreten
  2837.  
  2838.  
  2839.         WINDOW:         Dieser   neu   erzeugte   Datentyp   dient   der
  2840.                         Speicherung   aller   Informationen,   die   zur
  2841.                         Verwaltung  eines  einzelnen  Windows  notwendig
  2842.                         sind.
  2843.  
  2844.         static struct window
  2845.         {
  2846.            int  x, y;           /* linke obere Window-Ecke */
  2847.            int  dx, dy;         /* Breite und Höhe des Windows */
  2848.            int  wattr;          /* Hintergrund-Farbe des Windows */
  2849.            int  rand, rattr;    /* Rand-Art und Rand-Farbe */
  2850.            char *name;          /* Zeiger auf Window-Überschrift (Namen) */
  2851.            int  xpos;           /* X-Koordinate der Überschrift */
  2852.            int  nattr;          /* Farbe der Überschrift */
  2853.            struct window *vorher;   /* Zeiger auf vorher geöffnetes Window */
  2854.            void *wmalloc;       /* Zeiger auf Puffer-Speicher für Hintergrund */
  2855.         };
  2856.         typedef struct window WINDOW;
  2857.  
  2858.            Für den Rand sind folgende Zahlenwerte gültig:
  2859.  
  2860.                 0  =  doppelter Strich als Rahmen
  2861.                 1  =  einfacher Strich als Rahmen
  2862.                 2  =  komplett ausgefüllter Rahmen (Zeichen "█")
  2863.                 3  =  Rahmen wird waagrecht als doppelter Strich,
  2864.                       senkrecht als einfacher Strich dargestellt
  2865.  
  2866.  
  2867.  
  2868.         2. Funktionen
  2869.  
  2870.  
  2871.         int     alnum( int zeichen )
  2872.  
  2873.                         Prüft,  ob  das  angegebene  ASCII-Zeichen   zum
  2874.                         alphanumerischen  Bereich gehört (A-Z, a-z, 0-9,
  2875.                         deutsche Umlaute).  Ergibt einen  Wert  ungleich
  2876.                         null,  wenn  das  Zeichen zum alphanum.  Bereich
  2877.                         gehört.  Siehe auch Kapitel 5.6
  2878.  
  2879.  
  2880.         int     attribut( int vg, int hg, int blinken )
  2881.  
  2882.                         Berechnet   das   Farb-Attribut-Byte   mit   der
  2883.                         Vordergrundfarbe "vg", der Hintergrundfarbe "hg"
  2884.                         und  evtl.  mit Blinken (wenn Variable "blinken"
  2885.                         ungleich  null  ist).    Ergibt   das   bitweise
  2886.                         codierte Attribut.  Siehe auch Kapitel 5.6
  2887.  
  2888.  
  2889.         void    CloseAll( void )
  2890.  
  2891.                         Schließt   ALLE  noch  offenen  Windows.   Keine
  2892.                         Parameter.  Siehe auch Kapitel 5.3
  2893.  
  2894.  
  2895.         void    CloseTool( void )
  2896.  
  2897.                         Bereitet die Rückkehr  zum  Betriebssystem  vor,
  2898.                         indem       die      alten      Voreinstellungen
  2899.                         wiederhergestellt   werden.     Ergibt    keinen
  2900.                         Rückgabewert.  Siehe auch Kapitel 5.1
  2901.  
  2902.  
  2903.         int     CloseWindow()
  2904.  
  2905.                         Schließt  das  zuletzt geöffnete Fenster wieder.
  2906.                         Ergibt den Wert  null,  wenn  kein  Window  mehr
  2907.                         offen ist.  Siehe auch Kapitel 5.3
  2908.  
  2909.  
  2910.         void    cls( int attr )
  2911.  
  2912.                         Löscht   den   gesamten   Bildschirm   mit   der
  2913.                         angegebenen Farbe.  Keine Rückgabewerte.   Siehe
  2914.                         auch Kapitel 5.2
  2915.  
  2916.  
  2917.         int     color( char *text )
  2918.  
  2919.                         Zeigt in einem Window alle 256 Farb-Attribute an
  2920.                         und   ermöglicht   die   Auswahl   eines  dieser
  2921.                         Attribute.  Ergibt das  gewählte  Farb-Attribut.
  2922.                         Wird  der  Wert "-1" zurückgegeben, so wurde die
  2923.                         Funktion    durch    Drücken    der    ESC-Taste
  2924.                         abgebrochen.  Siehe auch Kapitel 5.6
  2925.  
  2926.                         Diese  Funktion  ist  in  der  Shareware-Version
  2927.                         nicht enthalten!
  2928.  
  2929.  
  2930.         void    cursor( int attr )
  2931.  
  2932.                         Legt  die  Farbe  des  Input-  und  Menü-Cursors
  2933.                         fest.  Bei "attr" gleich "-1"  wird  der  Cursor
  2934.                         immer   invers   dargestellt.    Ergibt   keinen
  2935.                         Rückgabewert.  Siehe auch Kapitel 5.4
  2936.  
  2937.  
  2938.         void    fastprint( int x, int y, int attribut, char far *text )
  2939.  
  2940.                         Gibt einen Text auf dem Bildschirm  aus.   Keine
  2941.                         Rückgabewerte.  Siehe auch Kapitel 5.2
  2942.  
  2943.  
  2944.         void    GoMain( MENU *item )
  2945.  
  2946.                         Schließt  solange  das  oberste Fenster, bis das
  2947.                         Window des Hauptmenüs das oberste  ist.   Ergibt
  2948.                         keinen Rückgabewert.  Siehe auch Kapitel 5.3
  2949.  
  2950.  
  2951.         char *  inhalt( char *pfad, char *maske1 )
  2952.  
  2953.                         Diese  Funktion  ermöglicht  die  Auswahl  einer
  2954.                         Datei innerhalb eines Windows  aus  einer  Liste
  2955.                         aller  Dateien  des  angegebenen Verzeichnisses.
  2956.                         Wechsel  des  Pfades  und  des  Laufwerks   sind
  2957.                         möglich.  Ergibt einen Zeiger auf den String des
  2958.                         kompletten   Pfades   und  des  Dateinamens  der
  2959.                         ausgewählten  Datei.    Wird   der   NULL-Zeiger
  2960.                         zurückgegeben,      ist     irgendein     Fehler
  2961.                         aufgetreten.  In der globalen Variable  "fehler"
  2962.                         steht   dann  die  Fehler-Ursache.   Siehe  auch
  2963.                         Kapitel 5.5
  2964.  
  2965.                         Diese  Funktion  ist  in  der  Shareware-Version
  2966.                         nicht enthalten!
  2967.  
  2968.  
  2969.         char *  input( int x, int y, int attr, char *text, int cpos )
  2970.  
  2971.                         Der angegebene  Text  wird  angezeigt  und  kann
  2972.                         editiert   (bearbeitet)   werden.    Ergibt  den
  2973.                         Zeiger    "*text"    auf    den     reservierten
  2974.                         Speicherplatz.  Wird stattdessen der NULL-Zeiger
  2975.                         zurückgegeben,  so hat der Anwender die Funktion
  2976.                         mit  der  ESC-Taste  abgebrochen.   Siehe   auch
  2977.                         Kapitel 5.2
  2978.  
  2979.  
  2980.         int     invert( int attr )
  2981.  
  2982.                         Invertiert das angegebene Farb-Attribut.  Ergibt
  2983.                         das invertierte Attribut. Siehe auch Kapitel 5.6
  2984.  
  2985.  
  2986.         int     lower( int zeichen )
  2987.  
  2988.                         Wandelt  das  angegebene  ASCII-Zeichen  in  den
  2989.                         entsprechenden Kleinbuchstaben  um,  wobei  auch
  2990.                         die  deutschen  Umlaute (ä, ö, ü) berücksichtigt
  2991.                         werden.  Ergibt das umgewandelte Zeichen.  Siehe
  2992.                         auch Kapitel 5.6
  2993.  
  2994.  
  2995.         int     OpenTool( void )
  2996.  
  2997.                         Bereitet  die Toolbox zur Verwendung vor.  Diese
  2998.                         Funktion  muß  einmal  aufgerufen  worden  sein,
  2999.                         bevor  irgendeine  andere  Funktion  der Toolbox
  3000.                         aufgerufen werden darf.  Ergibt den  Wert  null,
  3001.                         wenn  ein  Fehler  aufgetreten ist.  Die Toolbox
  3002.                         darf  in  diesem  Fall  nicht  verwendet werden!
  3003.                         Siehe auch Kapitel 5.1
  3004.  
  3005.  
  3006.         int     OpenWindow( WINDOW *wi )
  3007.  
  3008.                         Öffnet  ein  Bildschirmfenster.  Ergibt den Wert
  3009.                         null, wenn  das  Window  nicht  geöffnet  werden
  3010.                         konnte   (Fehler...)  oder  bereits  offen  ist.
  3011.                         Siehe auch Kapitel 5.3
  3012.  
  3013.  
  3014.         void    PrepareMenu( MENU *first, MENU *vater )
  3015.  
  3016.                         Bereitet die Benutzung  eines  kompletten  Menüs
  3017.                         vor,  indem  alle  notwendigen Initialisierungs-
  3018.                         arbeiten     durchgeführt      werden.       Als
  3019.                         "vater"-zeiger   muß   immer  der  "NULL"-Zeiger
  3020.                         übergeben werden.  Keine  Rückgabewerte.   Siehe
  3021.                         auch Kapitel 5.4
  3022.  
  3023.  
  3024.         void    rahmen( int x, int y, int breite, int hoehe,
  3025.                         int art, int attribut )
  3026.  
  3027.                         Zeichnet  den   angegebenen   Rahmen   auf   dem
  3028.                         Bildschirm.  Ergibt keinen Rückgabewert.
  3029.  
  3030.                         "art"  gibt an, welcher Rahmen gezeichnet werden
  3031.                         soll. Es sind Werte von 0 bis 3 zulässig:
  3032.  
  3033.                         0  =  doppelter Strich als Rahmen
  3034.                         1  =  einfacher Strich als Rahmen
  3035.                         2  =  komplett ausgefüllter Rahmen (Zeichen "█")
  3036.                         3  =  Rahmen wird waagrecht als doppelter Strich,
  3037.                               senkrecht als einfacher Strich dargestellt
  3038.  
  3039.                         Siehe auch Kapitel 5.2
  3040.  
  3041.  
  3042.         int     set_textmode()
  3043.  
  3044.                         Ermittelt  den  besten Textmodus zur vorhandenen
  3045.                         Hardware,  stellt  diesen  ein  und  löscht  den
  3046.                         Bildschirm.    Ergibt   den   Wert   null,  wenn
  3047.                         irgendein Fehler aufgetreten  ist.   Siehe  auch
  3048.                         Kapitel 5.2
  3049.  
  3050.  
  3051.         void    string( int x, int y, int attribut, int anzahl,
  3052.                         unsigned char zeichen )
  3053.  
  3054.                         Gibt   das   ASCII-Zeichen    "zeichen"    sooft
  3055.                         nebeneinander  auf dem Bildschirm aus, wie es in
  3056.                         der Variablen "anzahl" angegeben wurde.   Ergibt
  3057.                         keinen Rückgabewert. Siehe auch Kapitel 5.2
  3058.  
  3059.  
  3060.         MENU *  UseMenu( MENU *item )
  3061.  
  3062.                         Aktiviert  das  angegebene  Menü.   Der Anwender
  3063.                         kann  dann  einen  Menüpunkt  auswählen,   Hilfe
  3064.                         anfordern oder Abbrechen.  Ergibt den Zeiger auf
  3065.                         den  gewählten  Menüpunkt.  Die globale Variable
  3066.                         "select" enthält den Grund  für  die  Beendigung
  3067.                         der Funktion. Siehe auch Kapitel 5.4
  3068.  
  3069.  
  3070.         void    wcls( int x, int y, int xx, int yy, int attribut )
  3071.  
  3072.                         Diese Funktion löscht einen Bildschirmausschnitt.
  3073.                         Kein Rückgabewert! Siehe auch Kapitel 5.3
  3074.  
  3075.  
  3076.  
  3077.         3. Einfügedateien innerhalb der Toolbox
  3078.  
  3079.  
  3080.            Die Toolbox benötigt eine Reihe von Einfügedateien.   Quick-C
  3081.            v2.0   wird   bereits   mit  einer  beachtlichen  Anzahl  von
  3082.            Einfügedateien  ausgeliefert.   Davon  bindet   die   Toolbox
  3083.            "WINDOW.C"     nachfolgende    Einfügedateien    ein.     Der
  3084.            Programmierer muß in seinem Hauptprogramm diese Dateien nicht
  3085.            erneut einbinden.  Das doppelte Einbinden von  Einfügedateien
  3086.            hat  nur eine Nebenwirkung: Es verschwendet unnötig viel Zeit
  3087.            zum Compilieren!
  3088.  
  3089.            #include <bios.h>
  3090.            #include <conio.h>
  3091.            #include <ctype.h>
  3092.            #include <dos.h>
  3093.            #include <graph.h>
  3094.            #include <malloc.h>
  3095.            #include <stdio.h>
  3096.            #include <stdlib.h>
  3097.            #include <string.h>
  3098.  
  3099.           Bitte  beachten  Sie, daß die aufgeführten Einfügedateien beim
  3100.           inkrementalen Compilieren für Ihr Programm nicht mehr sichtbar
  3101.           sind!  Das bedeutet, daß Sie sich in diesem Fall wieder selbst
  3102.           um  die  benötigten   Einfügedateien   kümmern   müssen   (mit
  3103.           "#include" selbst einfügen). Siehe auch Anhang C
  3104.  
  3105.  
  3106.  
  3107.  
  3108. ------  Anhang B: Evtl. auftretende Probleme und deren Lösung  ----------------
  3109.  
  3110.  
  3111.         Problem: In  den  Speichermodellen  "small" oder "medium" stürzt
  3112.                  das Programm ab oder läuft inkorrekt.
  3113.  
  3114.              ->  Die  Toolbox  verwendet   die   Macros   "FP_OFF"   und
  3115.                  "FP_SEG".   Dadurch  dürfen  in  diesen  beiden kleinen
  3116.                  Speichermodellen keine Funktionen und Daten  als  "far"
  3117.                  deklariert   werden  (weitere  Informationen  hierüber:
  3118.                  innerhalb  der  Quick-C-Entwicklungsumgebung  mit   der
  3119.                  F1-Taste   Hilfe   zu  diesen  beiden  Macros  anzeigen
  3120.                  lassen).  Am besten löst man dieses Problem, indem  man
  3121.                  ein   anderes   Speichermodell   verwendet  oder  keine
  3122.                  "far"-Elemente definiert.
  3123.  
  3124.  
  3125.         Problem: Das  ausführbare  Programm läuft nicht (Rechner-Absturz
  3126.                  oder Endlosschleife).
  3127.  
  3128.              ->  Wahrscheinlich  haben  Sie   einen   Fehler   bei   der
  3129.                  Menüverkettung      gemacht.       Alle     notwendigen
  3130.                  Menüstrukturen   müssen   miteinander   durch    Zeiger
  3131.                  verbunden  werden.   Wurde  hier  ein  Zeiger  auf eine
  3132.                  falsche Struktur oder Speicherstelle gesetzt, so stürzt
  3133.                  der Rechner normalerweise ab.   Genauere  Informationen
  3134.                  hierüber siehe Kapitel 6 Buchstabe b.
  3135.  
  3136.                  Natürlich  kann  der Absturz auch viele andere Ursachen
  3137.                  haben.     Im    Einzelfall    empfehle    ich    einen
  3138.                  Einzelschrittdurchlauf  mit  dem  Debugger,  falls  die
  3139.                  Ursache nicht sofort gefunden werden kann.
  3140.  
  3141.  
  3142.         Problem: Beim   Compilieren   tritt   (manchmal)   die   Warnung
  3143.                  "Warnung:  'funktion'  neu  definiert"   (Warnung   Nr.
  3144.                  C4414) auf.
  3145.  
  3146.              ->  Diese  Warnung  kann  ignoriert werden.  Sie tritt auf,
  3147.                  weil in der Toolbox nicht alle Funktionen am Anfang des
  3148.                  Quelltextes mit einem Prototypen vordefiniert wurden.
  3149.  
  3150.  
  3151.         Problem: Es   tritt   der    Laufzeitfehler    "-Stapelüberlauf"
  3152.                  (Laufzeitfehler "R6000") auf.
  3153.  
  3154.              ->  Der  Stapel (Stack) für das ausführbare Programm ist zu
  3155.                  klein.  Bitte vergewissern Sie  sich,  daß  der  Stapel
  3156.                  gemäß   Kapitel  1.3  dieser  Dokumentation  vergrößert
  3157.                  wurde.  Sollte der Fehler auch bei der  ordnungsgemäßen
  3158.                  Stapelgröße  von  acht Kilobyte auftreten so muß dieser
  3159.                  zusätzlich  vergrößert  werden   (Menü   "Optionen   ->
  3160.                  Make...     ->    Linker-Marken"    unter   dem   Punkt
  3161.                  Stapelgröße).  Dieser Fehler tritt meistens nur bei den
  3162.                  Programmen  auf,  die  viel  Gebrauch  von   rekursiven
  3163.                  Funktionen machen.
  3164.  
  3165.  
  3166.         Problem: Es  tritt der Laufzeitfehler "-Unzulässiger Far-Zeiger"
  3167.                  auf (Laufzeitfehler "R6013").
  3168.  
  3169.              ->  Die Toolbox greift mit Hilfe von Far-Zeigern direkt auf
  3170.                  den  Bildschirmspeicher zu.  Dieser liegt außerhalb des
  3171.                  Programm-Bereichs.  Es  handelt  sich  hier  um  keinen
  3172.                  "echten"  Fehler,  weil  die  Bereichsüberschreitung so
  3173.                  gewollt ist.  Normalerweise  tritt  dieser  Fehler  nur
  3174.                  auf,  wenn  die  Zeigerprüfung  aktiv ist.  Die Toolbox
  3175.                  schaltet die Zeigerprüfung automatisch aus.   Irgendwie
  3176.                  wurde   die   Zeigerprüfung  jedoch  wieder  aktiviert.
  3177.                  Dieser Fehler läßt sich  beheben,  indem  man  im  Menü
  3178.                  "Optionen  ->  Make...   -> Compiler-Marken" die Option
  3179.                  "Zeigerprüfung" ausschaltet oder den  Quelltext  erneut
  3180.                  mit   Hilfe   des   Pragmas   "#pointer_check(  off  )"
  3181.                  compiliert.
  3182.  
  3183.  
  3184.         Problem: Auf dem Bildschirm  sind  keine  Bildschirmausgaben  zu
  3185.                  sehen  (u.   U.   ist  er mit einer einheitlichen Farbe
  3186.                  gelöscht)  und  es  erscheint  auch  kein  Text,  keine
  3187.                  Windows und keine Menüs.
  3188.  
  3189.              ->  Vermutlich   werden   die   Bildschirmausgaben  in  den
  3190.                  falschen Bildschirmspeicherbereich geschrieben.
  3191.  
  3192.                  In  der  Variablen  "screen"  speichert die Toolbox die
  3193.                  Segment-Adresse  des   Bildschirmspeichers   ab.    Der
  3194.                  Programmierer  braucht  sich  in der Regel nicht um die
  3195.                  Verwaltung dieser Variable zu kümmern, sie wird von der
  3196.                  Toolbox automatisch belegt.
  3197.  
  3198.                  Bei manchen PC's, die  nicht  100%-ig  kompatibel  sind
  3199.                  (z.    B.    einige   alte   Siemens-PC's),   kann  der
  3200.                  Bildschirmspeicher    auch     an     einer     anderen
  3201.                  Segment-Adresse  liegen.   In einem solchen Fall muß in
  3202.                  der Variablen "screen" der  passende  Wert  eingetragen
  3203.                  werden,  nachdem  die  Funktion  "OpenTool"  aufgerufen
  3204.                  wurde.  Diese Änderung muß im Quellcode des  Programmes
  3205.                  erfolgen.   Das  somit entstandene ausführbare Programm
  3206.                  ist dadurch mit  ziemlicher  Sicherheit  nur  noch  auf
  3207.                  Computern  dieses gleichen Typs lauffähig.  Es ist auch
  3208.                  möglich, die Funktion "OpenTool" so zu ändern, daß  sie
  3209.                  den "seltsamen" PC erkennt und automatisch die richtige
  3210.                  Segmentadresse  ermittelt.   Dadurch  wäre das erzeugte
  3211.                  Programm wieder auf allen PC's lauffähig.
  3212.  
  3213.                  Weitere Hinweise können Sie beim Kapitel 4.3 unter  der
  3214.                  Variable "screen" entnehmen.
  3215.  
  3216.  
  3217.         Problem: In  den  kleinen  Speichermodellen  (Small,  Medium und
  3218.                  Compakt) wird die  Warnung  C4060  ("Umwandlung  langer
  3219.                  Adresse  zu  kurzer  Adresse")  oder  die Warnung C4062
  3220.                  ("near/far-Fehler     im      Argument:      Umwandlung
  3221.                  durchgeführt") gemeldet.
  3222.  
  3223.              ->  Diese  Warnungen  können  ignoriert werden.  Sie kommen
  3224.                  zustande, weil die Toolbox von far-Zeigern (32 statt 16
  3225.                  Bits!) Gebrauch  macht.   Die  kleinen  Speichermodelle
  3226.                  können    jedoch    nur   near-Zeiger   und   -Adressen
  3227.                  verarbeiten (16  Bits).   Aus  diesem  Grund  muß  eine
  3228.                  Umwandlung  durchgeführt werden.  Soweit bisher bekannt
  3229.                  ist, haben diese Warnungen auf  die  Programmausführung
  3230.                  keinen Einfluß.
  3231.  
  3232.  
  3233.         Problem: Bei  globalen  Strukturen  (z.  B.  Windows und Menüs),
  3234.                  die  gleichzeitig  mit  der  Deklaration  initialisiert
  3235.                  werden,  tritt  der  Fehler  C2098  "Ausdruck ist keine
  3236.                  Adresse"   oder   der   Fehler    C2097    "Unzulässige
  3237.                  Initialisierung" auf.
  3238.  
  3239.              ->  Bei   globalen  Variablen  und  Strukturen  dürfen  nur
  3240.                  Zahlenwerte  angegeben   werden,   keinesfalls   jedoch
  3241.                  Variablen!   Wahrscheinlich  haben  Sie versucht, einer
  3242.                  globalen Struktur oder einer Variable  gleich  bei  der
  3243.                  Deklaration   mit   dem  Wert  einer  anderen  globalen
  3244.                  Variable zu initialisieren, wie z.  B.  so:
  3245.  
  3246.                  WINDOW hier = { 1, 1, 10, 5, f0, 1, f2, ... }
  3247.  
  3248.                  Bei  diesem  Beispiel  wurden  bereits   die   globalen
  3249.                  Farb-Variablen  "f0"  und  "f2"  angegeben.   Dies  ist
  3250.                  verboten!    Sie   müssen   hier   stattdessen    einen
  3251.                  Pseudowert  (z.   B.   "0")  einsetzen  und später eine
  3252.                  Funktion aufrufen, die dem  Window  die  entsprechenden
  3253.                  Farben zuweist, z.  B.  so:
  3254.  
  3255.                  ...
  3256.                  hier->wattr = f0;
  3257.                  hier->rattr = f2;
  3258.                  ...
  3259.  
  3260.                  Weitere  Hinweise  können  Sie  unter  dem  Kapitel 4.3
  3261.                  "Globale Variablen" bei  der  Erklärung  der  Variablen
  3262.                  "f0" bis "f3", Zwischenüberschrift "Achtung" entnehmen.
  3263.  
  3264.  
  3265.         Problem: Die Toolbox "Window.C"  arbeitet  nicht  in  Verbindung
  3266.                  mit    anderen   Toolboxen   (Rechnerabstürze,   falsch
  3267.                  arbeitende Funktionen usw.).
  3268.  
  3269.              ->  Die  Toolbox  "Window.C" wurde so programmiert, daß sie
  3270.                  auch zu anderen Toolboxen kompatibel sein  müßte.   Der
  3271.                  einzige "Schwachpunkt" ist das Umleiten des INT 24h mit
  3272.                  Hilfe  der  Funktion  "_harderr"  von Quick-C.  Dadurch
  3273.                  wird bei  einem  evtl.   auftretenden  schweren  Fehler
  3274.                  sofort   die   Toolbox-interne   Funktion  "hardfehler"
  3275.                  aufgerufen.  Sollte eine andere Toolbox  ebenfalls  den
  3276.                  Interrupt  24h verbiegen, wird es zu größeren Problemen
  3277.                  kommen.
  3278.  
  3279.                  Dieses Problem läßt sich nur durch  eine  Änderung  der
  3280.                  Toolbox  lösen.   Am  besten  wenden Sie sich direkt an
  3281.                  mich.  Bitte geben Sie sowohl  die  Versionsnummer  der
  3282.                  Toolbox  "Window.C"  als auch den Namen und die Version
  3283.                  der anderen Toolbox an.
  3284.  
  3285.  
  3286.  
  3287.  
  3288.  
  3289.  
  3290. ------  Anhang C: Inkrementales Compilieren  ----------------------------------
  3291.  
  3292.  
  3293.         Der  Compiler  von  Quick-C  Version  2.0  wurde  gegenüber  der
  3294.         Version  1.0  vollständig  überarbeitet.  So compiliert er jetzt
  3295.         bei jedem neuen Lauf nur die Teile eines Quelltextes,  die  sich
  3296.         seit  der  letzten  Compilation verändert haben.  Dadurch ergibt
  3297.         sich eine unglaubliche Geschwindigkeitssteigerung.
  3298.  
  3299.         Diese   Form   des   Compilierens   nennt   man   "inkrementales
  3300.         Compilieren".   Zum  inkrementalen Compilieren ist es allerdings
  3301.         erforderlich, daß das Programm  in  mehrere  Teile  aufgespalten
  3302.         und getrennt abgespeichert wird.
  3303.  
  3304.         Es  gibt  verschiedene  Gründe  für  das  Teilen  einer Datei in
  3305.         mehrere Module.  Neben der  Wiederverwendbarkeit  von  einzelnen
  3306.         Programmteilen   in   anderen   Programmen   (sog.    Toolboxen)
  3307.         erleichtert das Teilen auch  die  Bearbeitung  und  Wartung  von
  3308.         Programmen.
  3309.  
  3310.         Auch die Toolbox "WINDOW.C" kann zum  inkrementalen  Compilieren
  3311.         verwendet  werden,  wodurch  das  Compilieren  sehr viel rascher
  3312.         abläuft.    Hierzu    sind    jedoch    einige    Vorbereitungen
  3313.         erforderlich.    Nachfolgend   wird  nun  beschrieben,  wie  man
  3314.         innerhalb  der  Entwicklungsumgebung  seine  eigenen   Programme
  3315.         zusammen mit der Toolbox inkremental compiliert.  Zur leichteren
  3316.         Erklärung  nehmen  wir  im folgenden an, Sie wollen Ihr Programm
  3317.         namens "SCHULE.C" inkremental compilieren.
  3318.  
  3319.         Die wichtigste Änderung ist folgende:
  3320.  
  3321.         Statt  der  Datei  "WINDOW.C"  müssen  Sie  nun die Header-Datei
  3322.         "WINDOW.H"  in  ihr  Programm  (SCHULE.C)   einfügen   (#include
  3323.         <window.H>  statt  #include <window.C>).  In dieser Header-Datei
  3324.         sind alle notwendigen Strukturen, Variablen und  Funktionen  als
  3325.         "extern" deklariert.
  3326.  
  3327.         Als  nächstes  müssen  Sie  für  das  Programm,  daß inkremental
  3328.    !!!  compiliert werden soll, eine neue Programmliste erstellen:
  3329.  
  3330.         Öffnen  Sie  das  Menü  "Make"  und  wählen  Sie  "Programmliste
  3331.         bestimmen"   (nur   bei   eingeschaltetem   vollständigen   Menü
  3332.         möglich!).   Schreiben  Sie  dann den Namen Ihres Programmes mit
  3333.         der Extension  ".MAK"  als  Namen  für  die  Datei,  welche  die
  3334.         Programmliste    enthalten    soll   (also   "SCHULE.MAK";   die
  3335.         Erweiterung "MAK" wird für Beschreibungsdateien  verwendet)  und
  3336.         drücken Sie die Eingabetaste.
  3337.  
  3338.         Es  erscheint dann ein Dialogfeld.  Hier fügen Sie nun die Datei
  3339.         "WINDOW.C" und den Dateinamen Ihres  Programmes  (SCHULE.C)  der
  3340.         Programmliste  zu.   Unter  Umständen  müssen Sie dabei den Pfad
  3341.     !!! oder gar das Laufwerk wechseln, weil sich die  Datei  "WINDOW.C"
  3342.         in  dem  Verzeichnis  der  Headerdateien  befindet  (siehe  auch
  3343.         Kapitel 1.4).
  3344.  
  3345.         Sobald  beide Programme in der Programmliste erscheinen, klicken
  3346.         Sie  zur  Sicherung  der  ".MAK"-Datei  das  Befehlsfeld  "Liste
  3347.         speichern" an.
  3348.  
  3349.         Diese  Programmliste  informiert  Quick-C  nun  beim Compilieren
  3350.         daran, daß mehrere Quelldateien in einem  Programm  zu  vereinen
  3351.         sind.
  3352.  
  3353.         Wollen  Sie  außerdem  weitere  Programm-Module  mitcompilieren,
  3354.         müssen auch diese in die Programmliste aufgenommen werden.
  3355.  
  3356.         Beachten Sie bitte, daß  der  Basisname  der  Programmliste  dem
  3357.         Dateinamen   Ihres  Programmes  gleichen  sollte  (SCHULE.C  und
  3358.         SCHULE.MAK).  Dadurch fragt Quick-C beim Laden Ihres  Programmes
  3359.         automatisch, ob Sie die Programmliste verwenden wollen.
  3360.  
  3361.         Ab sofort wird Ihr Programm nun inkremental compiliert.
  3362.  
  3363.         Hinweis: Inkrementales Compilieren ist nur mit  der  Vollversion
  3364.                  der   Toolbox   möglich,   da  hierzu  die  Headerdatei
  3365.                  "WINDOW.H" benötigt wird (diese wird in der  Shareware-
  3366.                  Version nicht mitgeliefert!).
  3367.  
  3368.         Bitte beachten Sie außerdem folgendes:
  3369.  
  3370.         Die  im Anhang A unter dem Kapitel 3 aufgeführten Einfügedateien
  3371.         sind durch das inkrementale Compilieren für Ihr  Programm  nicht
  3372.         mehr   sichtbar!    Das   bedeutet,  daß  Sie  nun  wieder  alle
  3373.         Einfügedateien selbst mit "#include" einfügen müssen, soweit sie
  3374.         diese benötigen.
  3375.  
  3376.         Weiterhin    sind    die    Toolbox-internen   Funktionen   beim
  3377.         inkrementalen Compilieren NICHT mehr sichtbar, d.  h.  man  kann
  3378.         auf  sie  nicht  mehr  zugreifen!  Sollte dies dennoch erwünscht
  3379.         sein, muß man in die Headerdatei "Window.H" den  Prototypen  der
  3380.         gewünschten   internen   Funktion   mit   dem  Vorsatz  "extern"
  3381.         einfügen.  Will man  z.   B.   die  interne  Funktion  "_locate"
  3382.         verwenden, muß man folgende Zeile in die Headerdatei einfügen:
  3383.  
  3384.                   extern unsigned int _locate( int x, int y );
  3385.