home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / window / winedit / winedit.txt < prev    next >
Encoding:
Text File  |  1993-07-28  |  108.6 KB  |  3,068 lines

  1. ******************************************************************
  2. ******************************************************************
  3. ****                   W I N E D I T                          ****
  4. ******************************************************************
  5. ******************************************************************
  6.  
  7. Universeller Menü- und Maskengenerator
  8.  
  9.  
  10. ******************************************************************
  11. 0. INHALT
  12. ******************************************************************
  13. 1.   Kurzbeschreibung
  14. 2.   Konzept
  15. 3.   Leistungsmerkmale
  16. 4.   Technische Daten
  17. 5.   Installation
  18. 6.   Maskengenerator
  19. 6.1    Arbeitsfläche
  20. 6.2    Untermenüs
  21. 6.2.1    Datei
  22. 6.2.2    Schirm
  23. 6.2.3    Block
  24. 6.2.4    Text
  25. 6.2.5    Attribut
  26. 6.2.6    Maske
  27. 6.2.7    Feld
  28. 6.2.8    Vorgaben
  29. 6.3    Maskenerstellung
  30. 6.3.1    Einfache Textmaske
  31. 6.3.2    Ein/Ausgabemaske
  32. 6.3.3    Menümaske
  33. 7.   Interface
  34. 7.1    Basisroutinen
  35. 7.2    Tastaur und Maus
  36. 7.3    Freie Ein- und Ausgabe
  37. 7.4    Feldtyp-Gebundene Ein- und Ausgabe
  38. 7.5    Menü-Verwaltung
  39. 7.6    Abruf von Maskeninformationen
  40. 7.7    Maus-Routinen
  41. 7.8    Bildschirmroutinen (allgemein)
  42. 7.9    MICROSOFT-Maus-Interfaceroutinen
  43. 8.  Zu den Beispielprogrammen
  44. 9.  Urheberrechtsschutz-Erklärung
  45. 10. Haftungsausschluß
  46.  
  47.  
  48. ******************************************************************
  49. 1. KURZBESCHREIBUNG
  50. ******************************************************************
  51.  
  52. WINEDIT steht für ein Hilfsmittel zur Programmierung voll 
  53. mausunterstützter Benutzeroberflächen unter MS-DOS (PC-DOS) für 
  54. IBM PC/XT- kompatible Rechner
  55.  
  56.  
  57.  
  58. Das Programm ist unter dem Betriebssystem PC-DOS bzw. MS-DOS 
  59. ab Version 2.0 auf dem IBM-PC/AT und kompatiblen Rechnern mit 
  60. mindestens 256K Hauptspeicher, einem Disketten-Laufwerk und einer 
  61. im 80*25-Zeichen-Modus arbeitenden Bildschirmkarte lauffähig. 
  62. Optional kann eine MICROSOFT-kompatible Maus eingesetzt werden. 
  63. Schnittstellen zu den Programmiersprachen TURBO-C (ab 1.0) und 
  64. TURBO-Pascal (ab4.0) von BORLAND sind verfügbar.
  65.  
  66.  
  67. ******************************************************************
  68. 2. KONZEPT
  69. ******************************************************************
  70.  
  71. Im folgenden soll erläutert werden, warum die Programmierung 
  72. einer Text- und Semigrafik-orientierten
  73. Benutzeroberfläche für ein stark eingeschränktes Spektrum von 
  74. Rechnern im Zeitalter der standardisierten grafikorientierten 
  75. Benutzeroberflächen kein Anachronismus ist.
  76. Es existieren derzeit wohl mehrere Millionen Rechner, auf welche 
  77. die Merkmale IBM-kompatibel, 80*25 Zeichen- Textbildschirm, 
  78. Betriebssystem MS-DOS (PC-DOS) zutreffen. Den meißten dieser 
  79. Rechner ist gemein, daß sie von ihren Resourcen her kaum fähig 
  80. sind, dem Trend zu immer rechenaufwendigeren grafikorientierten 
  81. Programmsystemen zu folgen. Wenn diese Rechner auch nicht mehr 
  82. den Stoff bieten, der die Computerzeitschriften füllt, so ist in 
  83. ihnen doch noch eine enorme Rechenleistung manifestiert, die diese 
  84. Rechner auch in Zukunft noch eine gewichtige Rolle spielen läßt.
  85. Auch unter einem anderen Aspekt macht die Einschränkung auf ein 
  86. enges Spektrum von Rechnern Sinn. Statt einer universellen, 
  87. rechnerunabhängigen Lösung kann hier eine spezielle, dafür aber 
  88. stark optimierte Lösung angeboten werden.
  89. Das Softwareangebot in der angesprochenen Rechnersparte ist 
  90. riesig und unüberschaubar. Trotzdem wird es auch in Zukunft 
  91. notwendig sein, für die ja real existierenden Rechner Software zu 
  92. entwickeln. Der Schwerpunkt dieser Softwareentwicklung wird nicht 
  93. in großen Standardprogrammen mit mehreren hundert Menschjahren 
  94. Arbeitaufwand liegen.
  95. Vielmehr sind es kleine, spezielle Lösungen manchmal begrenzter 
  96. Lebensdauer, welche zum Einsatz der PC-Veteranen zu 
  97. programmieren sind. Beispiele sind der Einsatz von PC's als Mess- 
  98. Steuer- oder Reglungsrechner. PC's werden oft zu Testzwecken 
  99. programmiert, PC's stellen die Schnittstellen von Transputernetzen 
  100. zur Außenwelt dar.
  101. Gemein ist solchen kleinen und speziellen Lösungen, daß der 
  102. investierbare Entwicklungsaufwand meist recht begrenzt ist. Für 
  103. die Programmierung einer zeitgemäßen Benutzerschnittstelle mit 
  104. beispielsweise einem voll mausunterstützten Menüsystem ist in der 
  105. Regel keine Zeit. Hier nun beginnt das Konzept WINEDIT.
  106. WINEDIT bietet alle notwendigen Funktionen zur Realisierung eines 
  107. zeitgemäßen Benutzerinterfaces. Mit wenigen Befehlen und einem 
  108. sehr einfachen und schnell zu handhabenden Maskengenerator kann 
  109. ohne erwähnbarem Lernaufwand in kurzer Zeit eine absolut 
  110. professionelle Bedienoberfläche. Die Hilfsmittel sind so programmiert, 
  111. daß dem Anwender keine neuartige Programmstruktur aufgezwungen 
  112. wird. Vielmehr fügen sich die Funktionen derartig gut in gewohnte 
  113. Strukturen ein, daß selbst der nachträgliche Einbau in bestehende 
  114. Programme einfach vollziehbar ist.
  115.  Grundsatz der Programmierung der Hilfsfunktion war eine 
  116. minimierte Fehlerträchtigkeit. Falsche Anwendung der Funktionen 
  117. führt oft zu merkwürdigen, selten aber zu fatalen Ergebnissen.
  118.  
  119.  
  120. ******************************************************************
  121. 3. LEISTUNGSMERKMALE
  122. ******************************************************************
  123.  
  124. Mit Hilfe des Menü- und Maskengenerators WINEDIT, welcher ohne 
  125. Programmierkenntnisse bedienbar ist, können interaktiv beliebige 
  126. Bildschirmmasken entworfen werden.
  127. Diese Masken können beispielsweise Menüs, Ein u. Ausgabemasken 
  128. oder auch Hilfstexte sein. Innerhalb des Generators wird Text, 
  129. Farbe Attribut (Farbe) und Größe der Masken festgelegt.
  130. Ferner besteht die Möglichkeit der Definition von Feldern. Felder 
  131. sind frei definierbare Unterbereiche einer Maske, welchen im 
  132. Generator eine Reihe von Eigenschaften (Farben für Eingabe, 
  133. Ausgabe, Menüs, Formate, Datentypen, Wertebereiche usw. ) 
  134. zugeordnet werden können.
  135. Auf Basis der Felddefinitionen können innerhalb des Programms mit 
  136. Hilfe der Schnittstellen-Funktionen komplexe Operationen zur Ein-
  137. und Ausgabe wie auch zur Anwahl von Menüpunkten automatisiert 
  138. werden. Die komplette Maskenbeschreibung wird in einer 
  139. Maskendatei abgespeichert, diese wird dann zur Laufzeit vom 
  140. Anwenderprogramm geladen. Das Erscheinungsbild eines Programmes 
  141. kann somit ohne erneute Compilierung verändert werden.
  142. Die Masken eines Programms können mit Hilfe des 
  143. Bibliotheksverwalters WINLIB zu einer Maskenbibliothek 
  144. zusammengefaßt werden.
  145. Innerhalb der Programms erfolgt der Bezug auf Masken sowie deren 
  146. Felder über Referenznummern.
  147. Schon mit Kenntniss weniger Grundfunktionen lassen sich 
  148. erstaunliche Ergebnisse erzielen. Weitere Funktionen dienen der 
  149. Konfiguration von Grundfunktionen, sind also im ersten Ansatz 
  150. nicht relevant.
  151. Insgesamt stehen Funktionen zur Verwaltung von Bildschirm, 
  152. Tastaur und Maus zur Verfügung. Einfach erzielbare Ergebnisse 
  153. sind beispielsweise:
  154.  
  155.  
  156. -     Windowing mit automatischer Rücksicherung des 
  157.    Bildhintergrundes
  158. -     Menüs jeglicher Ausprägung
  159. -     Menü-Hirachien, in denen über mehrere Ebenen hinweg mit der 
  160.    Maus Anwahlen vollzogen werden können
  161. -     Hilfstextsysteme, in denen man sich durch Anwahl von 
  162.    Stichworten weiterbewegen kann (die Anwahl ist 
  163.    selbstverständlich mit Maus oder Cursortasten möglich)
  164. -     Markieren von Blöcken durch Aufziehen dieser mit der Maus
  165. -     Stringeingaben mittels Zeileneditor
  166. -     Verschiedene Ein-und Ausgabefunktionen, unter anderem auch 
  167.    eine Maskenversion des altbekannten printf(...)
  168. -     Komplexe Ein-und Ausgabefunktionen zum automatiserten 
  169.    Einlesen und Ausgeben von Datenstrukturen
  170. -     Verwaltung virtueller Bildschirme zur optimierten Ausgabe
  171.  
  172.  
  173. ******************************************************************
  174. 4. TECHNISCHE DATEN
  175. ******************************************************************
  176.  
  177. -     Es werden maximal 256 Masken verwaltet (Erweiterung 
  178.    verfügbar)
  179. -     Die Schachtelungstiefe von geöffneten Masken auf dem 
  180.    Bildschirm ist lediglich durch die Größe des Hauptspeichers 
  181.    des Rechners begrenzt.
  182. -     Maximal 2KByte des Programm-Stacks werden beansprucht
  183. -     Der Speicherbedarf einer Maske ist abhängig vom Zustand 
  184.    dieser. Mit
  185.  
  186.           n = Zeilen*Spalten*2  (der Maske)  und
  187.           d = Maskendateigröße
  188.  
  189.       ergeben sich folgende Werte [Byte] :
  190.  
  191.     -     Nach dem Laden (w_load(..)) :
  192.               a) Ohne virtuelles Bild : d
  193.               b) Mit virtuellem Bild  : d + n
  194.  
  195.     -     Nach dem Öffen (w_open(..)) :
  196.               a) Ohne virtuelles Bild : d + n
  197.               b) Mit virtuellem Bild  : d + n + n
  198.  
  199.     -     Nach dem Schließen (w_close(..)) :
  200.               a) Ohne virtuelles Bild : d
  201.               b) Mit virtuellem Bild  : d + n
  202.  
  203.     -     Nach dem Löschen (w_erase(..)) :
  204.               0 Bytes
  205.  
  206.  
  207. ******************************************************************
  208. 5. INSTALLATION
  209. ******************************************************************
  210.  
  211. Grundsätzlich läßt sich des Programmpaketes WINEDIT in zwei 
  212. unabhängige Teile gliedern (logisch wie gegebenfalls nacher auch 
  213. physikalisch auf Disketten !): Diese Teile sind einerseits der 
  214. schnittstellenunabhängige Maskengenerator WINEDIT und der 
  215. Bibliotheks-Verwalter WINLIB und andererseits die 
  216. schnittstellenspezifischen Funktionsbibliotheken (W_TBC_LM.LIB, 
  217. W_TBP_55.TPU, usw.) mit den einzelnen WINEDIT-Hilfsroutinen.
  218.  
  219.  
  220. Eine spezielle Installationsprozedur ist zur Inbetriebnahme des 
  221. Maskengenerators sowie der Schnittstellen nicht notwendig. Es 
  222. empfiehlt sich, auf der Festplatte ein Verzeichnis mit dem Namen 
  223. WINEDIT einzurichten und die Dateien der gelieferten Disketten in 
  224. dieses Verzeichnis zu kopieren: z.B.
  225.               MD C:\WINEDIT
  226.               (*DISKETTE 1 einlegen*)
  227.               COPY A:\WINEDIT\*.* C:\WINEDIT
  228.               (*DISKETTE 2 einlegen*)
  229.               COPY A:\WINEDIT\*.* C:\WINEDIT
  230.               (*DISKETTE 3 einlegen*)
  231.               COPY A:\WINEDIT\*.* C:\WINEDIT
  232.  
  233. Der Maskengenerator kann aber auch direkt von der Diskette 
  234. gestartet werden.
  235. Steht keine Festplatte zur Verfügung, so empfiehlt es sich, die 
  236. schon angedeutete Zweiteilung vorzunehmen:
  237.  
  238. Zu Generierung, Editierung und Verwaltung von Masken wird eine 
  239. Diskette mit mindestens den Dateien WINEDIT.EXE, WINEDIT.LIB und 
  240. WINLIB.EXE angelegt.
  241.  
  242. Die Programmerstellung notwendigen Dateien, also W_DEF.H und 
  243. W_TBC_LM.LIB für die TURBO-C-Schnittstelle bzw. 
  244. W_TBP_40/50/55.TPU für TURBO-Pascal-4/5-Schnittstelle sind auf die 
  245. entsprechende Compilerdiskette zu kopieren.
  246.  
  247.  
  248. Soll der Maskengenerator (die Dateien WINEDIT.EXE und 
  249. WINEDIT.LIB) aus jedem beliebigen Pfad aufgerufen werden können, 
  250. so ist die PATH-Anweisung in der Datei \autoexec.bat um den Pfad 
  251. zu ergänzen, in dem sich die genannten zwei Dateien befinden. 
  252. Befinden sich die Dateien beispielsweise auf der Festplatte C im 
  253. Pfad winedit, so ist die PATH-Anweisung um  ;C:\winedit zu 
  254. ergänzen. Sie könnte dann beispielsweise wie folgt aussehen:
  255.  
  256.                           PATH=C:\TC;C:\TURBO;C:\SW5;C:\WINEDIT
  257.  
  258. Es besteht die Möglichkeit, den Maskengenerator derart zu 
  259. konfigurieren, daß die direkten Bildspeicherzugriffe durch deutlich 
  260. langsamere BIOS-Aufrufe ersetzt werden, so daß eine 
  261. Maskenabänderung auch auf einem nicht voll kompatiblen Rechner 
  262. möglich ist. Dazu ist die Environment-Variable WINEDIT wie folgt zu 
  263. setzen:
  264.  
  265.                           SET WINEDIT=1
  266.  
  267. Der Normalzustand wird mit
  268.  
  269.                           SET WINEDIT=0
  270.  
  271. wieder hergestellt.
  272.  
  273.  
  274. Für die verschiedenen Entwicklungsumgebungen sind entsprechende 
  275. Konfigurations und Projektdateien verfügbar. Die Pfadangaben 
  276. müssen eventuell den speziellen Gegebenheiten angepasst werden, 
  277. so daß die WINEDIT-Interfacedateien auch gefunden werden.
  278. Näheres dazu findet sich in den Handbüchern der Compiler (-> 
  279. Directories).
  280.  
  281. ******************************************************************
  282. 6. MASKENGENERATOR
  283. ******************************************************************
  284.  
  285. Der Maskengenerator WINEDIT arbeitet als eigenständiges Programm 
  286. unabhängig von der einzusetzenden Schnittstelle zur 
  287. Programmiersprache. Er ist unter Verwendung der WINEDIT-
  288. Hilfsfunktionen programmiert worden; somit kann sein Aussehen 
  289. jederzeit durch Veränderung der zugehörigen Masken in der 
  290. Maskenbibliothek WINEDIT.LIB den individuellen Erfordernissen 
  291. angepaßt werden.
  292.  
  293.  
  294. Mit Hilfe des Maskengenerators erzeugt der Anwender interaktiv die 
  295. gewünschten Bildschirmmasken und versieht diese mit den 
  296. erforderlichen Merkmalen wie Menüs oder Ein-und Ausgabekanälen 
  297. in Gestalt von Feldern. Die komplette Maskenbeschreibung wird 
  298. anschließend in einer Maskendatei gespeichert. Diese Datei wird 
  299. dann später vom Anwender-Programm gelesen, die Maske ist damit 
  300. verfügbar.
  301.  
  302. Der Maskengenerator ist ohne Programmierkenntnisse bedienbar. 
  303. Der Abbruch einer Aktion erfolgt grundsätzlich mit ESC oder 
  304. rechter Maustaste, eine Anwahl wird mit ENTER oder linker 
  305. Maustaste durchgeführt. Über die Funktionstaste F1 sind 
  306. verschiedene kontextbezogene (Arbeitsfläche, Untermenüs..) 
  307. Hilfstexte abrufbar, welche die Möglichkeiten des Vorgehens 
  308. verdeutlichen.
  309. Alternativ zu den Menüs können Befehle auch über 
  310. Tastenkombinationen, welche in den Untermenüs angegeben sind, 
  311. eingegeben werden.
  312. Die Tastenkombination [ALT][F1] bringt die Belegung der 
  313. Funktionstasten zur Anzeige.
  314.  
  315. Um den Einstieg zu erleichtern, empfiehlt sich das Laden schon 
  316. vorhandener Masken ( aus dem Beispiel oder aus der 
  317. Maskenbibliothek WINEDIT.LIB ), deren Funktion schon erfahren 
  318. wurde. Die einzelnen Merkmale einer Maske können in eine 
  319. Protokolldatei ausgegeben werden.
  320.  
  321. Der Maskengenerator WINEDIT kann zu einem Demolauf veranlaßt 
  322. werden. Näheres dazu findet sich in der Datei LIESMICH.
  323.  
  324.  
  325. ==================================================================
  326. 6.1 ARBEITSFLÄCHE
  327. ==================================================================
  328. Zu unterscheiden sind jederzeit Arbeitsfläche und Menü des 
  329. Generators. Die Arbeitsfläche dient der Gestaltung der einzelnen 
  330. Masken, indem der Bildschirm wie in einem 
  331. Textverarbeitungsprogramm beschrieben werden kann. Der Cursor, 
  332. also die Schreibmarke, kann hierbei mit den Pfeiltasten bewegt 
  333. werden oder durch Druck auf die linke Maustaste auf dem 
  334. Mauscursor positioniert werden.
  335.  
  336. Mit der Funktionstaste 10 (F10), der ESC-Taste oder der rechten 
  337. Maustaste wird das Menü aktiviert. Mit einem weiteren ESC oder 
  338. dem Drücken der rechten Maustaste gelangt man vom Menü zurück 
  339. in die Arbeitsfläche.
  340.  
  341. Hilfstexte sind zur Arbeitsfläche und zu jedem Untermenü mit der 
  342. Taste F1 oder der mittleren (bzw. beiden) Maustaste(n) abrufbar. 
  343. Durch Halten der ALT-Taste und drücken von F1 (°F1) wird die 
  344. Belegung der Funktionstasten zur Anzeige gebracht.
  345.  
  346. Mit linker Maustaste oder ENTER-Taste werden positive Quittungen 
  347. gegeben (z.B. wird etwas angewählt ), rechte Maustaste und ESC-
  348. Taste werden allgemein als negative Eingabe (Abbruch) gewertet.
  349.  
  350. Hält man in der Arbeitsfläche die linke Maustaste gedrückt und 
  351. bewegt dabei die Maus, so wird ein rechteckiger Bildschirmbereich, 
  352. ein Block, markiert. Mit diesem markierten Block teilt man 
  353. bestimmten Menüfunktionen mit, auf welchen Bildschirmbereich sie 
  354. wirken sollen. Beispielsweise wird bei einer Farbänderung immer 
  355. nur die Farbe des markierten Blocks geändert. Wird Text gelöscht, 
  356. so nur der Text im markierten Block !
  357.  
  358. Wird die linke Maustaste gedrückt, während sich der Mauscursor 
  359. auf einem Feld befindet, so wird Information zu dem jeweiligen Feld 
  360. ausgegeben.
  361.  
  362. ==================================================================
  363. 6.2 UNTERMENÜS
  364. ==================================================================
  365. Im folgen wird eine Beschreibung zu jedem einzelnen Menüpunkt, 
  366. nach Untermenüs geordnet, gegeben. Diese Beschreibung ist 
  367. ausführlicher als die Hilfstexte im Maskengenerator, von der 
  368. Struktur her jedoch identisch. Somit wird das Verständnis für die 
  369. Hilfstexte gefördert.
  370.  
  371.  
  372. ------------------------------------------------------------------
  373. 6.2.1 DATEI
  374.  
  375. LADEN: Eine irgendwann zuvor geschriebene Maskendatei kann zur 
  376.    Weiterverarbeitung wieder in den Generator geladen werden. 
  377.    Die aktuelle Maske im Generator wird hierbei überschrieben.
  378. SCHREIBEN: Eine im Maskengenerator erzeugte oder veränderte 
  379.    Maske wird in eine Datei geschrieben. Somit steht diese Maske 
  380.    auch nach Beendigung des Maskengenerators noch zur 
  381.    Verfügung.
  382. PROTOKOLL: Eine Protokoll-Datei zur aktuell geladenen Maske des 
  383.    Generators wird unter einem anzugebenden Namen erzeugt. 
  384.    Diese Datei wird in einem ausdruckbaren ASCII-Format 
  385.    geschrieben und kann Dokumentationzwecken dienen. Inhalt 
  386.    des Protokolls sind alle wesentlichen Merkmale der Maske wie 
  387.    z.B. Größe, Text, Felddefinitionen usw. .
  388. ASCII: Eine ASCII-Datei, welche beispielsweise mit einem 
  389.    Textverarbeitungsprogramm erzeugt wurde, kann in den 
  390.    Maskengenerator importiert und somit Bestandteil der Maske 
  391.    werden. Die Cursor-Position gibt Startzeile und Startspalte an, 
  392.    ab der der Text in die Maske zu schreiben ist.
  393. DOS-Shell: Will man den Maskengenerator kurzzeitig verlassen, um 
  394.    z.B. DOS-Befehle einzugeben, so ist dieser Menüpunkt 
  395.    anzuwählen. Mit dem DOS-Befehl EXIT gelangt man zurück in 
  396.    den Generator, die aktuelle Arbeitskontext ist dabei erhalten 
  397.    geblieben.
  398. BEENDEN: WINEDIT wird endgültig verlassen. Eine letzte Abfrage 
  399.    vor dem Beenden ermöglicht ein abschließendes Sichern der 
  400.    aktuellen Maske.
  401.  
  402.  
  403. ------------------------------------------------------------------
  404. 6.2.2 SCHIRM
  405.  
  406. Unter dem Hauptmenüpunkt SCHIRM verbergen sich 
  407. Einstellmöglichkeiten, die weniger der Gestaltung der Maske als 
  408. vielmehr der Veränderung des Bildschirmaussehens wärend der 
  409. Maskenerstellung dienen.
  410.  
  411. MASKENGRÖSSE AN/AUS bestimmt, ob der nicht zur Maske 
  412.    gehörende Bildschirmteil mit ░░ ausgeblendet wird oder 
  413.    sichtbar ist. Auch wenn der Bereich ausgeblendet wird, kann 
  414.    der nicht zur Maske gehörende Bildschirmteil beschrieben 
  415.    werden. Beipielsweise können dort Maskenteile 
  416.    zwischengespeichert werden.
  417. ATTRIBUTE AN/AUS bestimmt, ob die Attribute des Bildschirms 
  418.    angezeigt werden oder nicht. Ein Ausschalten kann sinnvoll 
  419.    sein, wenn z.B. Block und zu markierender Text das gleiche 
  420.    Attribut haben, so daß der markierte Block nicht erkennbar 
  421.    ist.
  422. FELDER AN/AUS bestimmt, ob die Felder oder die darüber 
  423.    liegenden Texte der Maske sichtbar sind. Sobald 
  424.    Feldoperationen unternommen werden, wird dieser Schalter 
  425.    automatisch auf AN gestellt, daß Schreiben von Text schaltet 
  426.    die Felder automatisch wieder aus. Ob Felder sichtbar sind 
  427.    oder nicht, hat Einfluß auf den Wirkungsbereich von 
  428.    Maskenoperationen : Nur sichtbare Felder werden in Masken-
  429.    Operationen (Kopieren, Verschieben..) miteinbezogen.
  430. NORMALATTRIBUT ermöglicht eine Farbwahl für die Arbeitsfläche, 
  431.    sofern dort keine anderen Farben gesetzt wurden. Werden 
  432.    Farben gelöscht, so bedeutet dies nichts anderes, als das die 
  433.    Farben durch das NORMALATTRIBUT ersetzt werden.
  434. REVERSATTRIBUT ermöglicht eine Auswahl der Farbe, in der ein 
  435.    markierter Block dargestellt wird. Eine Änderung ist sinnvoll, 
  436.    wenn die Blockfarbe mit der Maskenfarbe übereinstimmmt.
  437. SCHATTENATTRIBUT legt die Farbe zum Schattieren von Masken 
  438.    fest. Siehe auch Untermenü Maske/Schattieren !
  439. KONFIGURATION SICHERN sichert die Einstellungen dieses Menüs, 
  440.    die Vorgaben für die Feld-Definition sowie die Namensvorgabe 
  441.    zum Laden einer Maskendatei dauerhaft. Somit steht die gleiche 
  442.    Einstellung nach jedem Start Maskengenerators zur Verfügung
  443. INITIALEINSTELLUNG überschreibt die gesicherte Konfiguration mit 
  444.    der Initialeinstellung.
  445.  
  446.  
  447. ------------------------------------------------------------------
  448. 6.2.3 BLOCK
  449.  
  450. Ein Block markiert einen rechteckigen Bereich auf dem Bildschirm, 
  451. dieser wird revers dargestellt wird. Dieser Block bezeichnet einen 
  452. Bildschirmbereich, auf den nachfolgende Operationen dann wirken: 
  453. Beim Löschen von Text wird beispielsweise nur der Text im Block 
  454. gelöscht !
  455. DEFINIEREN: Ein Block als Teil des Bildschirms wird festgelegt: 
  456.    Eine Ecke des Blockes liegt an der aktuellen Cursorposition, 
  457.    die Ausmaße können mit den Cursortasten, PGUP,PGDOWN,HOME, 
  458.    END oder dem Mauscursor verändert werde. Die Größe wird mit 
  459.    ENTER oder linker Maustaste festgesetzt. Bequemer läßt sich 
  460.    ein Block durch Halten der linken Maustaste und Bewegen des 
  461.    Mauscursors definieren. Bei Loßlassen der Maustaste ist dabei 
  462.    die Blockdefinition abgeschlossen.
  463. FÜLLEN füllt den markierten Block mit einem Zeichen aus der 
  464.    erscheinenden ASCII-Tabelle.
  465. RAHMEN umrahmt einen Block auf dessen äußersten Rand mit dem 
  466.    im erscheinenden Menü angewählten Rahmentyp. 
  467.    Kreuzungspunkte werden entsprechen den überschriebenen 
  468.    Rahmenzeichen automatisch angepaßt. Alte Rahmen lassen sich 
  469.    durch Umrahmung mit Leerzeichen löschen !
  470.  
  471.  
  472. ------------------------------------------------------------------
  473. 6.2.4 TEXT
  474.  
  475. KOPIEREN: Der Text im markierten Block wird kopiert. Dabei kann 
  476.    die Textkopie mit Cursortasten oder Maus über den Schirm an 
  477.    den Zielort bewegt und dort durch ENTER oder linke Maustaste 
  478.    abgelegt werden.
  479. VERSCHIEBEN verschiebt den markierten Text in gleicher Weise wie 
  480.    beim KOPIEREN, der Quellblock wird jedoch mit Leerzeichen 
  481.    überschrieben.
  482. LÖSCHEN: Der Text des markierten Blocks wird mit Leerzeichen 
  483.    überschrieben.
  484. TABELLE: Eine ASCII-Tabelle wird ausgegeben, aus der ein Zeichen 
  485.    ausgewählt werden kann. Dieses wird dann an die aktuelle 
  486.    Cursor-Positiong geschrieben, als sei dieses Zeichen von der 
  487.    Tastatur erzeugt worden.
  488. ATTRIBUT ermöglicht die Anwahl eines Attributes, mit dem dann 
  489.    der Text im markierten Block versehen wird.
  490.  
  491.  
  492. ------------------------------------------------------------------
  493. 6.2.5 ATTRIBUT
  494.  
  495. Das Attribut eines Zeichens ist ein diesem zugeordneter Zahlwerte, 
  496. welcher das Erscheinungsbild des Zeichen (also Farbe, blinkend 
  497. oder nicht usw.) bestimmt. Die folgenden Aktionen beziehen sich 
  498. nur auf die Attribute, lassen den Text unberührt:
  499.  
  500. KOPIEREN kopiert die Attribute des markierten Blockes. Dabei kann 
  501.    die Attributkopie mit Cursortasten oder Maus über den Schirm 
  502.    an den Zielort bewegt und dort durch ENTER oder linke 
  503.    Maustaste abgelegt werden.
  504. VERSCHIEBEN verschiebt die Attribute des markierten Blockes. Der 
  505.    Quellblock erhält hierbei das Normalattribut der Arbeitsfläche. 
  506.    Siehe auch Menüpunkt SCHIRM.
  507. LÖSCHEN löscht die Attribute im markierten Block, überschreibt 
  508.    diese also mit dem Normalattribut der Arbeitsfläche. Siehe auch 
  509.    Menüpunkt SCHIRM.
  510.  
  511.  
  512. ------------------------------------------------------------------
  513. 6.2.6 MASKE
  514.  
  515. Die Operationen KOPIEREN, VERSCHIEBEN und LÖSCHEN beziehen 
  516. sich auf Text, Attribut und sichtbare Felder des Blockes. Zu 
  517. beachten ist, daß Felder ausserhalb der Maske automatisch gelöscht 
  518. werden und das Felder nicht übereinander liegen können (siehe 
  519. auch Menüpunkt FELDER).
  520.  
  521. Eine Besonderheit ergibt sich für die Funktion VERSCHIEBEN, wenn 
  522. kein Block markiert ist: Dann wird die komplette Maske mit Feldern 
  523. (auch wenn diese nicht sichtbar sind) verschoben. Der 
  524. Maskenbereich wird hierbei entsprechend angepaßt. Somit kann mit 
  525. einer einzigen Operation die Position einer Maske auf dem 
  526. Bildschirm verändert werden.
  527.  
  528. GRÖSSE SETZEN setzt die Maskengröße entsprechen dem markierten 
  529.    Block, denn nicht jede Maske soll den ganzen Bildschirm 
  530.    füllen. Alle Felder außerhalb der neuen Maskengröße werden 
  531.    damit gelöscht.
  532. SCHATTIEREN schattiert die Maske. Der Schatten liegt rechts und 
  533.    unten  i n n e r h a l b  des Bereichs der Maske. Das 
  534.    Schattenattribut kann unter Menüpunkt SCHIRM eingestellt 
  535.    werden. Die manuelle Definition eines Schattens ist möglich: 
  536.    Dazu ist der rechten oberen Ecke innerhalb der Maske 
  537.    entsprechend der Größe des Schattenversatzes das Attribut mit 
  538.    der Nummer 0hex zu geben. Dem eigentlichen Schatten ist dann 
  539.    in üblicher Weise eine geeignete Schattenfarbe (Textattribut !) 
  540.    zuzuordnen.
  541. INFO gibt eine Information zur aktuellen Maske des Generators aus 
  542.    (Name, Größe, Anzahl der Felder..)
  543.  
  544.  
  545. ------------------------------------------------------------------
  546. 6.2.7 FELD
  547.  
  548. Felder sind Unterbereiche einer Maske, welche durch Feldnummern 
  549. unterschieden werden. Ihre Position und länge ist beliebig, die 
  550. Höhe ist auf genau eine Zeile festgelegt.
  551. Feldern können bestimmte Merkmale zugeordnet werden (Untermenü 
  552. VORGABEN). In einem Anwenderprogramm werden Felder dann auf 
  553. zwei unterschiedliche Arten genutzt: Ein Feld kann eine Stelle der 
  554. Maske angeben, an der Ein-und Ausgaben gemacht werden. Eine 
  555. Gruppe von Feldern kann ein Menü bilden. Die Felder sind dann 
  556. die anwählbaren Positionen des Menüs.
  557.  
  558. Bei Feld-Operationen ist zu beachten, daß Felder nur innerhalb 
  559. einer Maske existieren können. Wird beispielsweise ein Feld aus dem 
  560. Maskenbereich rausgeschoben, so wird dieses Feld automatisch 
  561. gelöscht.
  562. Ausserdem können niemals zwei Felder übereinander liegen. Würde 
  563. bei dem KOPIEREN eines Feldes ein anderes Feld überschrieben 
  564. werden, so würde diese Kopieraktion nicht ausgeführt werden.
  565.  
  566. ANLEGEN füllt den markierten Block mit Feldern, sofern sich dort 
  567.    keine alten Felder befinden. Hierbei wird pro Zeile des Blockes 
  568.    ein Feld erzeugt.
  569. GRÖSSE ÄNDERN ändert die Breite der durch den markierten Block 
  570.    berührten Felder auf Blockbreite.
  571. KOPIEREN kopiert die Felder im Block an die aktuelle 
  572.    Cursorposition.
  573. VERSCHIEBEN verschiebt die Felder im markierten Block zur 
  574.    aktuellen Cursorposition.
  575. LÖSCHEN: Alle Felder im markierten Block werden gelöscht.
  576. NUMMERIEREN BELIEBIG nummeriert alle Felder mit Nummer 0 
  577.    beginnend und jeweils aufwärts zählend so, wie sie mit der 
  578.    linken Maustaste oder ENTER (wenn der Cursor drauf ist) 
  579.    angklickt werden.
  580. ZEILENWEISE NUMMERIEREN nummeriert zeilenweise von links nach 
  581.    rechts alle Felder mit 0 beginnend.
  582. SPALTENWEISE NUMMERIEREN nummeriert spaltenweise von oben 
  583.    nach unten mit 0 beginnend.
  584. INFO gibt Information des durch den Cursor markierten Feldes 
  585.    aus. Durch Anklicken mit der linken Maustaste wird das 
  586.    gleiche Ergebnis erreicht. Angezeigt wird die komplette 
  587.    Beschreibung des Feldes, diese kann direkt geändert werden.
  588.  
  589.  
  590.  
  591. ---------------------------------------------------------------
  592. 6.2.8 VORGABEN (für Felder)
  593.  
  594. Vorgaben sind die Feldmerkmale, die jedem neu erzeugtem Feld als 
  595. Grundeinstellung zugewiesen werden. Auch können einzelne 
  596. Vorgaben nachträglich in Feldern gesetzt werden. Die Vorgaben 
  597. können verändert werden.
  598.  
  599. EDITIEREN ermöglicht die Veränderung der Vorgaben.
  600. LESEN ließt die Feldmerkmale des durch den Cursor markierten 
  601.    Feldes ein und macht diese zur neuen Vorgabe.
  602. KOPIEREN ordnet den Feldern im markierten Block nachträglich 
  603.    das gesamte Bündel an Vorgaben zu.
  604.  
  605. Die verbleibenden Funktionen ordnen den Feldern im markierten 
  606. Block jeweil einzelne Vorgaben zu:
  607.  
  608. REVERS-ATTRIBUT  setzt das Reversattribut
  609. EINGABE-ATTRIBUT setzt das Attribut für Eingaben
  610. AUSGABE-ATTRIBUT setzt das Attribut für Ausgaben
  611. INITIALISIERUNG bestimmt, ob ein Feld vor Beschreiben komplett 
  612.    gelöscht werden oder der nicbt überschriebene Teil des Feldes 
  613.    erhalten bleiben soll, falls die Ausgabe kürzer als das Feld ist. 
  614.    Diese Einstellung ist beispielsweise wichtig, wenn Felder 
  615.    gleichzeitig Menüpunkt als auch Ein/Ausgabefeld sein sollen: 
  616.    z.B.links im Feld die anwählbare Position, rechts im Feld der 
  617.    Ort der Eingabe.
  618. FORMAT EINGABE (=1) erzeugt eine rechtsbündige Eingabe, 
  619.    ansonsten erfolgt die Eingabe linksbündig.
  620. FORMAT AUSGABE (=1) erzeugt eine rechtsbündige Ausgabe, 
  621.    ansonsten erfolgt die Ausgabe linksbündig.
  622. UEBERSCHREIBEN (=1) Eingabe-Editor arbeitet im Überschreib-
  623.    Modus, ansonsten im Einfüge-Modus.
  624. DATENTYP übernimmt für die Felder im Block Datentyp und 
  625.    Wertebereich der Vorgabe.
  626.  
  627.  
  628. ==================================================================
  629. 6.3 MASKENERSTELLUNG
  630. ==================================================================
  631.  
  632.  
  633. ---------------------------------------
  634. 6.3.1 Einfache Textmaske
  635.  
  636. Folgend findet sich eine kurze Beschreibung der Arbeitsschritte, 
  637. die zur Erstellung einer einfachen Textmaske erforderlich sind.
  638.  
  639. -     Zunächst ist der Masken- und Menügenerator WINEDIT zu 
  640.    starten.
  641. -     Einmal auf der WINEDIT-Arbeitsfläche angekommen, beginnt man 
  642.    mit der textlichen Gestaltung der Maske:
  643.     -     Man bewegt also jeweils die Schreibmarke mit den 
  644.        Pfeiltasten an die gewünschte Bildschirmposition.
  645.     -     Dort schreibt man dann jeweils die Texte, die nachher Teil 
  646.        der Maske sein sollen.
  647. -     Nun möchte man vielleicht den Text umrahmen, dazu
  648.     -     geht man mit ESC oder F10 in das Untermenü BLOCK und 
  649.        wählt dort DEFINIEREN mit ENTER an;
  650.     -     verändert nun mit den Pfeiltasten die Blockgröße so, daß 
  651.        der Block den zu umrahmenden Bereich markiert und
  652.     -     schließt die Blockdefinition mit ENTER ab;
  653.     -     geht man wieder mit ESC in das Untermenü BLOCK und 
  654.        wählt dort Umrahmen an.
  655.     -     Im erscheinenden Rahmenmenü wählt man den 
  656.        gewünschten Rahmentyp mit den Pfeiltasten an und 
  657.        Bestätigt mit ENTER. Der Rahmen ist fertig.
  658. -     Die Farbe der ganzen oder von Teilen der Maske soll 
  659.    verändert werden. Dazu
  660.     -     legt man wie schon beschrieben den Bereich fest, indem 
  661.        man einen entsprechenden Block definiert;
  662.     -     geht dann mit ESC oder F10 ins Untermenü TEXT und 
  663.        wählt dort ATTRIBUT an.
  664.     -     sucht sich in der Farbtabelle etwas Hübsches aus und 
  665.        Bestätigt mit ENTER. Der ehemals markierte Block hat nun 
  666.        die gewünschte Farbe.
  667. -     Soll die Maske später nicht den ganzen Bildschirm überdecken, 
  668.    so ist
  669.     -     der eigentliche Teil der Maske (eben ohne Ränder) mit 
  670.        einem Block zu markieren und
  671.     -     im Untermenü Maske die Maskengrösse entsprechen dem 
  672.        Block zu setzen.
  673. -     Vor Beendigung des Maskengenerators sollte die Maske 
  674.    gesichert werden, indem man im Untermenü DATEI die Funktion 
  675.    SICHERN aufruft. Den angebotenen Standardnamen kann man 
  676.    durch einen beliebigen eigenen Namen ersetzen.
  677.  
  678. Die erzeugte Maske kann nun von einem Anwenderprogramm geladen 
  679. und benutzt werden. Mann kann sich nach Verlassen des 
  680. Maskengenerators das Ergebnis noch einmal anschauen, indem man 
  681. das Beispielprogramm MENUE mit dem Maskennamen als Parameter 
  682. aufruft (z.B. MENUE TEST.MSK).
  683.  
  684.  
  685. ------------------------------------------
  686. 6.3.2 EIN/AUSGABEMASKE
  687.  
  688. Die Rahmenhandlungen zur Erstellung einer Maske mit 
  689. Ein/Ausgabefeld gleichen denen wie in 6.3.1 beschrieben. Eine Stelle 
  690. der Maske, an der Ein- und Ausgaben gemacht werden können, 
  691. wird durch ein Feld gekennzeichnet. Es sind also lediglich 
  692. Arbeitsschritte zur Definition eines Feldes hinzuzufügen:
  693.  
  694. -     Durch Markieren eines Blockes ist der Ort der Ein/Ausgabe 
  695.    festzulegen. Geht dieser Block über mehrere Zeilen, so wird 
  696.    pro Zeile ein Feld in der Breite des Blockes angelegt.
  697. -     Mit ESC und Pfeiltasten bewegt man sich in das Untermenü 
  698.    VORGABEN und wählt dort EDITIEREN an.
  699. -     Die Feldvorgaben können nun wie gewünscht eingestellt 
  700.    werden:
  701.     -     Beispielsweise läßt sich für Eingabe und Ausgabe getrennt 
  702.        Farbe und Format festlegen.
  703.     -     Weiter kann vorgegeben werden, ob der Editor bei 
  704.        Eingaben im Einfüge- oder Überschreibmodus arbeitet.
  705.     -     Es kann festgelegt werden, ob ein Feld vor Schreib- bzw. 
  706.        Leseaktionen komplett gelöscht werden soll oder ob nur 
  707.        der jeweils neu überschriebene Teil verändert wird.
  708.     -     Jedem Feld kann ein Datentyp zugeordnet werden. Ferner 
  709.        kann der Wertebereich innerhalb dieses Datentyps pro 
  710.        Feld definiert werden.
  711. -     Im Untermenü FELD wählt man nun die Position ANLEGEN: Im 
  712.    markierten Block werden nun Felder mit den gewählten 
  713.    Vorgaben angelegt. Die Felder werden mit Karos dargestellt.
  714. -     Zur Kontrolle kann man nun in der Arbeitsfläche den Cursor 
  715.    auf eines der angelegten Felder bewegen.
  716. -     Dann wählt man im Untermenü FELD INFO an: Eine Information 
  717.    zu angewählten Feld wird ausgegeben. Die eingestellten 
  718.    Vorgaben sind nun zu Merkmalen des Feldes geworden. Durch 
  719.    Betätigen der ENTER-Taste kann man die Feld-Merkmale auch 
  720.    direkt verändern, mit ESC gelangt man zurück in die 
  721.    Arbeitsfläche.
  722. -     Die Feld-Information zeigt auch an, welche Nummer einem Feld 
  723.    zugeordnet ist. Die Nummer ist wichtig, da über sie das Feld 
  724.    im Programm angesprochen wird. Entspricht die 
  725.    Feldnummerierung nicht den Wünschen, so hat man im 
  726.    Untermenü FELD die Möglichkeit zur Umnummerierung.
  727.  
  728. Der Datentyp eines Feldes ist keine zwingende Vorgabe. Es gibt 
  729. programmtechnisch immer die Möglichkeit, ein Feld beispielsweise 
  730. als String-Feld und gleichzeitig auch als Datums-Feld zu benutzen.
  731.  
  732.  
  733. ------------------------------------------
  734. 6.3.3  MENÜMASKE
  735.  
  736. So wie Ein/Ausgabeorte der Maske als Felder definiert werden, wird 
  737. auch jede einzelne Position eines Menüs als Feld definiert. Somit ist 
  738. die Struktur der Menüs beispielsweise hinsichtlich der Lage der 
  739. einzelnen anwählbaren Positionen auf dem Bildschirm völlig wahlfrei.
  740. Im Gegensatz zu den Ein/Ausgabefeldern interressiert für ein 
  741. Menüfeld lediglich die Vorgabe des Reversattributs. Dies ist die 
  742. Farbe, mit der eine ausgewählte Menüposition dargestellt wird. 
  743. Diese Farbe sollte sich somit möglichst vom Hintergrund abheben.
  744. Ansonsten sind die gleichen Arbeitsschritte wie in 6.3.2 
  745. auszuführen.
  746. Zu beachten ist, daß für ein sinnvolles Menü mindestens zwei 
  747. Felder notwendig sind, denn man sollte ja zwischen etwas 
  748. auswählen können.
  749. Die Feldnummern haben folgende Bedeutung: die Menü-Funktion 
  750. W_SWITCH liefert jeweils die Nummer des angewählten Feldes als 
  751. Ergebnis zurück.
  752.  
  753. Natürlich kann ein Feld gleichzeitig Menüfeld als auch 
  754. Ein/Ausgabefeld sein, z.b. wenn die anwählbaren Aktionen variieren!
  755.  
  756.  
  757.  
  758. ******************************************************************
  759. 7. INTERFACE
  760. ******************************************************************
  761.  
  762. Den einzelnen Routinenbeschreibungen ist jeweils der Funktionskopf 
  763. in C und Pascal-Syntax vorangestellt.
  764.  
  765.  
  766. ==================================================================
  767. 7.1  Basisroutinen
  768. ==================================================================
  769.  
  770. Die folgenden stellen die Basisroutinen der WINEDIT-Schnittstelle 
  771. dar und sind mithin für jegliche Maskenoperationen unverzichtbar. 
  772. Es lassen sich zwei Standard-Sequenzen zur Ausgabe einer Maske 
  773. angeben:
  774.  
  775. a) w_init->w_load    ->w_open->w_close             ->w_deinit
  776. b) w_init    ->w_load->w_open->w_close->w_erase    ->w_deinit
  777.  
  778. Sequenz a) ist zu verwenden, wenn die Maskendateien am 
  779. Programmanfang einmalig geladen werden.
  780. Sequenz b) ermöglicht ein Laden von Masken im Bedarfsfall, nach 
  781. Abbrauch der Maske wird diese dann wieder aus dem Speicher 
  782. entfernt.
  783.  
  784.  
  785.  
  786. -------------------------------------------------------
  787. int w_init(int bios)
  788. function  w_init(bios:integer):integer;
  789.  
  790. w_init führt die Initialisierung zur Verwendung der WINEDIT-
  791. Routinen durch und ist damit grundsätzlich als erste der WINEDIT-
  792. Routinen aufzurufen. In w_init wird die Mausinitialisierungsroutine 
  793. w_mous_init() aufgerufen. Der Parameter <bios> bestimmt, ob ein 
  794. direkter Zugriff auf den Bildspeicher erfolgt oder die wesentlich 
  795. langsameren Bios-Routinen verwendet werden. Eine Standard-
  796. Attribut-Umsetztabelle wird aktiviert. Diese führt bei Farbmonitoren 
  797. zu keiner Umsetzung, bei Monochrom-Monitoren werden die 
  798. Attribute 71hex bis 7fhex auf 70hex (Revers!) abgebildet.
  799.  
  800. Parameter
  801.  
  802. bios= 0        : Direkter Zugriff;
  803. bios<>0;       : Bios-Routinen;
  804.  
  805. Ergebnis
  806.  
  807. 1    : Maus konnte in Betrieb genommen werden
  808. 0    : Maus fehlerhaft oder nicht vorhanden
  809.  
  810.  
  811.  
  812. -------------------------------------------------------
  813. void w_deinit(void)
  814. function  w_deinit:integer;
  815.  
  816. W_deinit schließt die Verwendung der WINEDIT-Routinen ab und ist 
  817. somit grundsätzlich vor Beendigung eines Programms aufzurufen. 
  818. Eventuell noch geöffnete Masken werden geschlossen, der allokierte 
  819. Speicherbereich wird wieder freigegeben. Bei angeschlossener Maus 
  820. muß diese Funktion u n b e d i n g t vor Verlassen des Programms 
  821. aufgerufen werden, ansonsten führen nachfolgende Mausaktionen 
  822. unweigerlich zum Systemabsturz.
  823.  
  824.  
  825.  
  826. -------------------------------------------------------
  827. int w_error(void)
  828. function  w_error:integer;
  829.  
  830. w_error liefert die Nummer des seit dem vorletzten Aufruf von 
  831. w_error zuletzt aufgetretenen Fehlers zurück. Die interne 
  832. Fehlervariable wird also zurückgesetzt, so daß ein zweimaliges 
  833. Aufrufen mit dem zweiten Aufruf den Returnwert 0 liefert.
  834.  
  835. Ergebnis
  836.  
  837.  0,   : kein Fehler
  838.  1   : Kein Speicher verfügbar
  839.  2   : Masken-Maximalzahl erreicht
  840.  3   : Maskendatei nicht gefunden
  841.  4   : Masken datei nicht gefunden in der Bibliothek
  842.  5   : Maskendatei ist fehlerhaft
  843.  6   : Maskendatei ist fehlerhaft in der Bibliothek
  844. 10   : Maskennummer ist unzulässig
  845. 11   : Feldnummer ist unzulässig
  846. 13   : Libary-Datei nicht gefunden
  847. 14   : Libary-Datei ist fehlerhaft
  848. 15   : Maske hat kein virtuelles Bild
  849.  
  850.  
  851. -------------------------------------------------------
  852. int w_load(char *filename,int mode)
  853. function  w_load(filename:string; mode:integer):integer;
  854.  
  855. w_load lädt eine Maskendatei, also eine kodierte Beschreibung der 
  856. Bildschirmmaske, in den Arbeitsspeicher. Die Maske erscheint nicht 
  857. auf dem Bildschirm.
  858.  Mit dem Parameter mode wird festgelegt, ob der Maske ein 
  859. virtueller Bildschirm im Arbeitsspeicher des Rechners zugeordnet 
  860. werden soll. Die Zuordnung eines virtuellen Schirms erfordert 
  861. Zeilen*Spalten*2 zusätzliche Bytes an Speicher.
  862.  Nicht erforderlich ist ein virtueller Schirm, wenn lediglich immer 
  863. die ursprügliche Bildschirmmaske, wie sie im Maskengenerator 
  864. erstellt wurde, ausgegeben werden soll. Irgendwelche 
  865. Veränderungen auf der Bildschirmmaske, beispielsweise durch Ein- 
  866. und Ausgaben würden nach Schließen und erneutem Öffnen der 
  867. Maske verloren gehen und müßten gegebenenfalls nachgeschrieben 
  868. werden .
  869.  Erforderlich ist der virtuelle Schirm, wenn beim Schließen einer 
  870. Maske der aktuelle Maskeninhalt erhalten bleiben soll. Auch ist 
  871. seine Verwendung sinnvoll, wenn eine Vielzahl von Ausgaben auf 
  872. eine Maske auszuführen sind. Die Ausgaben können dann auf den 
  873. virtuellen Schirm erfolgen, mit dem Öffnen der Maske erscheinen 
  874. das komplette Bild. Ist das Ergebnis der Funktion 0 oder positiv, 
  875. so ist dies die Masken(referenz)nummer, mit der die Maske 
  876. adressiert wird.
  877. Ein negatives Ergebnis erhält man im Fehlerfall, die Fehlernummer 
  878. ist dann mit w_error() zu ermitteln.
  879.  
  880. Parameter
  881.  
  882. mode = 0: Virtuelles Bild wird eingerichtet
  883. mode = 1: Kein virtuelles Bild
  884.  
  885. Ergebnis
  886.  
  887.   0-255   : Maskennummer (wnum)
  888. < 0       : Fehler
  889.  
  890.  
  891.  
  892. -------------------------------------------------------
  893. int w_open(int wnum)
  894. function  w_open(wnum:integer):integer;
  895.  
  896. w_open gibt eine Maske auf den Bildschirm aus. Existiert zur Maske 
  897. ein virtueller Schirm, so wird dessen Inhalt sichtbar. Andernfalls 
  898. wird ein temporärer virtueller Schirm eingerichtet. Das Maskenbild 
  899. wird aus der kodierten Maskenbeschreibung erzeugt und 
  900. ausgegeben, der temporäre Schirm wird wieder verworfen. Der 
  901. Hintergrund der Maske wird gesichert, so daß er beim Schließen 
  902. der Maske wiederhergestellt werden kann.
  903.  
  904. Ergebis
  905.  
  906. 1   : Erfolgreiche Ausführung
  907. 0   : Fehler
  908.  
  909.  
  910.  
  911. -------------------------------------------------------
  912. int w_close(void)
  913. function  w_close:integer;
  914.  
  915. w_close nimmt die zuletzt geöffnete Maske vom Bildschirm, der 
  916. ursprüngliche Bildinhalt wird wiederhergestellt. Existiert zur Maske 
  917. ein virtueller Schirm, so wird die zu schließende Maske mit ihrem 
  918. aktuellen Inhalt auf diesen geschrieben.
  919.  
  920. Ergebnis
  921.  
  922. 1    : Eine Maske konnte geschlossen werden
  923. 0    : Es war keine Maske mehr geöffnet
  924.  
  925.  
  926. -------------------------------------------------------
  927. int w_erase(int wnum)
  928. function  w_erase(wnum:integer):integer;
  929.  
  930. w_erase löscht die kodierte Maskenbeschreibung im Speicher, die 
  931. Maskennummer <wnum> verliert ihre Gültigkeit.
  932. Vor erneuter Verwendung der Maske muß diese mit w_load(..) erst 
  933. wieder geladen werden. w_erase darf nur auf geschlossene Masken 
  934. angewendet werden.
  935. Sinnvoll ist die Verwendung von w_erase, wenn beispielsweise 
  936. Hilfstextmasken aus Speicherplatzgründen erst bei Bedarf zugeladen 
  937. und anschließend komplett aus dem Speicher beseitigt werden 
  938. sollen.
  939.  
  940. Ergebnis
  941.  
  942. 1    : Fehlerfreie Ausführung
  943. 2    : Fehler (ungültige Maskennummer)
  944.  
  945.  
  946.  
  947. -------------------------------------------------------
  948. int w_lib_open(char *lib_name)
  949. function  w_lib_open(name:string):integer;
  950.  
  951. w_lib_open eröffnet eine Maskenbibliothek. Nachfolgende Aufrufe 
  952. von w_load beziehen sich dann auf die in <lib_name> angegebene 
  953. Maskenbibliothek, die Maskendateien werden ausschließlich in dieser 
  954. gesucht. Es können nicht mehrere Maskenbibliotheken zur gleichen 
  955. Zeit geöffnet sein.
  956. Zum Anlegen einer Maskenbibliothek ist das Hilfsprogramm WINLIB 
  957. zu verwenden.
  958.  
  959. Ergebnis
  960.  
  961. 1    : Die Maskenbibliothek konnte eröffnet werden
  962. 0    : Fehler
  963.  
  964.  
  965. -------------------------------------------------------
  966. int w_lib_close(void)
  967. function  w_lib_close:integer;
  968.  
  969. w_lib_close schließt eine zuvor geöffnete Maskenbibliothek, w_load 
  970. sucht anschließend die Maskendateien wieder als eigenständige 
  971. Dateien.
  972.  
  973. Ergebnis
  974.  
  975. 1    : Die Maskenbibliothek konnte geschlossen werden
  976. 0    : Fehler
  977.  
  978.  
  979. -------------------------------------------------------
  980. void w_setcolors(byte colortable[256]);
  981. procedure w_setcolors(colortable:pointer);
  982.  
  983. Mit dieser Funktion wird eine Attribut-Umsetztabelle geladen. Jedes 
  984. Attribut i wird nachfolgend durch das Attribut <colortable[i]> 
  985. ersetzt. Da w_init eine Standard-Umsetztabelle erzeugt, ist ein 
  986. Aufruf von w_setcolors nur nach w_init sinnvoll, muß jedoch vor 
  987. dem Laden (mit w_load) einer umzusetzenden Maske erfolgen.
  988.  
  989.  
  990.  
  991. -------------------------------------------------------
  992. byte *w_getcolortable(void);
  993. function  w_getcolortable:pointer;
  994.  
  995. Liefert einen Zeiger auf die interne Attribut-Umsetztabelle, in der 
  996. die jeweils zuletzt gesetzte Tabelle gespeichert ist.
  997.  
  998. Ergebnis: Zeiger auf die Attribut-Tabelle
  999.  
  1000.  
  1001.  
  1002. ==================================================================
  1003. 7.2 Tastatur und Maus
  1004. ==================================================================
  1005. Die folgenden zwei Routinen verwalten Maus und Tastatur, wobei 
  1006. Mausaktionen benutzerseitig als erweiterte Tastaturcodes 
  1007. erscheinen. Genaugenommen liefern die Funktionen als Ergebnis 
  1008. Zahlwerte, welche entsprechend den Definitionen in W_DEF.H bzw. 
  1009. W_TBP_XX.IFC bzw. dem ASCII-Code zu interpretieren sind.
  1010.  
  1011.  
  1012. -------------------------------------------------------
  1013. int w_kbd(int mode)
  1014. function  w_kbd(mode:integer):integer;
  1015.  
  1016. w_kbd liefert Zeichen von der Tastatur. In der Betriebsart 
  1017. REQUEST ( <mode> = 1 ) wird auf ein einlaufendes Zeichen 
  1018. gewartet, dieses wird dann als Ergebnis zurückgeliefert. In der 
  1019. Betriebsart SAMPLE ( <mode> = 0 ) wird nach einem eventuell 
  1020. vorhandenen Zeichen der Tastatur abgefragt. Ist ein Zeichen 
  1021. vorhanden, so wird dieses als Ergebnis zurückgeliefert. Ansonsten 
  1022. ist das Ergebnis 0. Der Tastaturcode ist den Definitionen der 
  1023. Header-Datei W_DEF.H (TURBO-C) bzw. der Datei W_TBP_XX.IFC 
  1024. (TURBO-Pascal) zu entnehmen.
  1025.  
  1026.  
  1027. Parameter
  1028.  
  1029. mode = 0 : SAMPLE-Mode
  1030. mode = 1 : REQUEST-Mode
  1031.  
  1032.  
  1033. Ergebnis
  1034.  
  1035. 0     : Kein Zeichen vorhanden ( Nur SAMPLE-Mode )
  1036. sonst : Tastencode
  1037.  
  1038.  
  1039.  
  1040. -------------------------------------------------------
  1041. int w_mousekbd(int mode)
  1042. function  w_mousekbd(mode:integer):integer;
  1043.  
  1044. w_mousekbd arbeitet bezogen auf Tastaturaktionen genau wie 
  1045. w_kbd, zusätzlich werden den verschiedenen Mausaktionen 
  1046. Zahlwerte zugeordnet. Eine mögliche Mausaktion ist das kurze 
  1047. Anklicken einer Maustaste, genaugenommen das Drücken und 
  1048. Loßlassen der Taste ohne die Maus zu bewegen, . Man erhält dann 
  1049. die unter den Definitionen MOUSE_R_B (rechter Knopf), MOUSE_L_B 
  1050. (linker Knopf) oder MOUSE_M_B (mittlerer Knopf) verborgenen 
  1051. Zahlwerte. Wird die Maustaste länger gedrückt, so erhält man statt 
  1052. dessen die Werte MOUSE_R_B_P, MOUSE_L_B_P oder MOUSE_M_B_P, 
  1053. das .._P steht für 'Pressed'. Wenn Tasten gedrückt werden, so 
  1054. werden sie auch irgendwann wieder losgelassen. Das Loslassen wird 
  1055. mit den Zeichen MOUSE_R_B_R, MOUSE_L_B_R oder MOUSE_M_B_R 
  1056. mitgeteilt, das .._R steht für 'Released'. Wird die Maus bewegt, so 
  1057. empfängt man über w_mousekbd das Zeichen MOUSE_MOVE. Mit der 
  1058. Funktion w_mousekbd zusammenwirkende Funktionen, z.B zum 
  1059. Ermitteln von Mauskoordinaten, finden sich im Kapitel Maus-
  1060. Routinen.
  1061.  
  1062.  
  1063.  
  1064. ==================================================================
  1065. 7.3  Freie Ein- und Ausgabe
  1066. ==================================================================
  1067.  
  1068. Die hier beschriebenen Routinen dienen der Ein- und Ausgabe 
  1069. unter Vernachlässigung der feldspezifischen Datentypen und 
  1070. Wertebereiche. Im Maskengenerator lassen sich folgende 
  1071. Feldeigenschaften definieren: Ausgabeformat (links oder 
  1072. rechtsbündig), Attribut, Löschen des Feldes vor Verwendung, 
  1073. Einfüg oder Überschreib-Modus bei Eingaben, Datentypen und 
  1074. Wertebereiche.
  1075. Die Basis-Ausgabefunktion ist w_out_str, die entsprechende Basis-
  1076. Eingabefuntion ist w_in_str. Mit Hilfe dieser Basis-Funktionen 
  1077. werden alle weiteren Ein- und Ausgabefunktionen realisiert. Die bei 
  1078. den Basis-Funktionen gemachten Angaben haben also für weitere 
  1079. Funktionen Gültigkeit, so sind beispielsweise die Returnwerte der 
  1080. Ein-Ausgaberoutinen einheitlicht wie folgt festgelegt: 1 steht für 
  1081. erfolgreiche Ausführung, -1 steht für einen Abruch durch ESC. Mit 
  1082. -3 werden Fehler angezeigt, -2 weist auf einen Abbruch durch eine 
  1083. Fremdtaste hin.
  1084.  
  1085.  
  1086.  
  1087. -------------------------------------------------------
  1088. int w_out_str(int wnum,int field,char *s)
  1089. function w_out_str(wnum,field:integer;s:string):integer;
  1090.  
  1091. w_out_str gibt den String <s> auf das Feld <field> der Maske 
  1092. <wnum> aus. Existiert die angegebene Masken- bzw. Kanalnummer 
  1093. nicht, so erfolgt die Ausgabe an der aktuellen Cursor-Position. Die 
  1094. Ausgabe erfolgt direkt auf den Bildschirm.
  1095.  
  1096. Ergebnis
  1097.  
  1098. 1    : Erfolgreiche Ausführung
  1099. -3   : Ausgabe an aktueller Position
  1100.  
  1101.  
  1102.  
  1103. -------------------------------------------------------
  1104. int w_vout_str(int wnum,int field,char *s)
  1105. function w_vout_str(wnum,field:integer;s:string):integer;
  1106.  
  1107. w_vout_str gleicht im wesentlichen w_out_str, die Ausgabe erfolgt 
  1108. auf den virtuellen Schirm.
  1109.  
  1110. Ergebnis
  1111.  
  1112. 1    : Erfolgreiche Ausführung
  1113. -3   : Fehler
  1114.  
  1115.  
  1116.  
  1117. -------------------------------------------------------
  1118. int w_printf(int wnum, int field,va_list arg_list, ...)
  1119. Im Pascal-Interface nicht verfügbar
  1120.  
  1121. w_printf führt eine formatierte Ausgabe auf den Feld <field> der 
  1122. Maske <wnum> aus. Die Parameterliste va_list arg_list (!),.. ist in 
  1123. gleicher Weise wie bei der Standard-C-Funktion printf anzugeben, 
  1124. also erst der Formatstring und dann folgend eventuelle Variablen. 
  1125. Die Ausgabe erfolgt direkt auf den Bildschirm. Diese Funktion ist 
  1126. nicht im Pascal-Interface verfügbar!
  1127.  
  1128.  
  1129. -------------------------------------------------------
  1130. int w_vprintf(int wnum, int field,va_list arg_list, ...)
  1131. Im Pascal-Interface nicht verfügbar
  1132.  
  1133. w_vprintf gleicht im wesentlichen w_printf, die Ausgabe erfolgt auf 
  1134. den virtuellen Schirm. Diese Funktion ist nicht im Pascal-Interface 
  1135. verfügbar!
  1136.  
  1137.  
  1138. -------------------------------------------------------
  1139. void w_out_temp_attribute(uchar attribute)
  1140. procedure w_out_temp_attribute(attribute:byte);
  1141.  
  1142. w_out_temp_attribute überschreibt das Feld-Attribut mit dem 
  1143. Parameter <attribute>. Die nächste Ausgabeoperation auf Bildschirm 
  1144. oder virtuellem Schirm erfolgt also in der 'Farbe' <attribute>
  1145.  
  1146.  
  1147.  
  1148. -------------------------------------------------------
  1149. void w_out_temp_format(int format);
  1150. procedure w_out_temp_format(format:integer);
  1151.  
  1152. w_out_temp_format überschreibt das Feld-Format mit dem Parameter 
  1153. <format>. Die nächste Ausgabeoperation auf Bildschirm oder 
  1154. virtuellem Schirm erfolgt also in dem angegebenen Format.
  1155.  
  1156. Parameter:
  1157.  
  1158. format = 0: Ausgabe linksbündig
  1159. format = 1: Ausgabe rechtsbündig
  1160.  
  1161.  
  1162.  
  1163. ----------------------------------------------
  1164. int w_vout(int wnum)
  1165. function  w_vout(wnum:integer):integer;
  1166.  
  1167. w_out gibt das virtuelle Bild einer mit <wnum> zu spezifizierenden 
  1168. Maske auf den Bildschirm aus. Der Hintergrund wird nicht 
  1169. gesichert. In der Regel ist diese Funktion zu verwenden, wenn das 
  1170. Bild einer schon geöffneten Maske mit dem im Hintergrund 
  1171. aufgebauten virtuellen Bild zu überschreiben ist.
  1172.  
  1173. Ergebnis
  1174.  
  1175. 1    : Fehlerfreie Ausführung
  1176.  
  1177.  
  1178.  
  1179. ----------------------------------------------
  1180. int  w_out_byte(int wnum,int fnum,byte b);
  1181. function  w_out_byte(wnum,fnum:integer;b:byte):integer;
  1182.  
  1183.  
  1184. w_out_byte gibt das Byte <b> auf das Feld <field> der Maske 
  1185. <wnum> unter Verwendung der Funktion w_out_str aus. Alle 
  1186. Angaben zu w_out_str haben entsprechen Gültigkeit.
  1187.  
  1188.  
  1189. ----------------------------------------------
  1190. int  w_vout_byte(int wnum,int fnum,byte b);
  1191. function  w_vout_str(wnum,field:integer;s:string):integer;
  1192.  
  1193. Virtuelle Version zu w_vout_byte;
  1194.  
  1195.  
  1196. ----------------------------------------------
  1197. int  w_out_char(int wnum,int fnum,char c);
  1198. function  w_out_char(wnum,fnum:integer;c:char):integer;
  1199.  
  1200. Siehe w_out_byte !
  1201.  
  1202.  
  1203. ----------------------------------------------
  1204. int  w_vout_char(int wnum,int fnum,char c);
  1205. function  w_vout_char(wnum,fnum:integer;c:char):integer;
  1206.  
  1207. Siehe w_vout_byte !
  1208.  
  1209.  
  1210.  
  1211. ----------------------------------------------
  1212. int  w_out_int(int wnum,int fnum,int i);
  1213. function  w_out_int(wnum,fnum,i:integer):integer;
  1214.  
  1215. Siehe w_out_byte !
  1216.  
  1217.  
  1218. ----------------------------------------------
  1219. int  w_vout_int(int wnum,int fnum,int i);
  1220. function  w_vout_int(wnum,fnum,i:integer):integer;
  1221.  
  1222. Siehe w_vout_byte !
  1223.  
  1224.  
  1225. ----------------------------------------------
  1226. int  w_out_word(int wnum,int fnum,word w);
  1227. function  w_out_word(wnum,fnum:integer;w:word):integer;
  1228.  
  1229. Siehe w_out_byte !
  1230.  
  1231.  
  1232. ----------------------------------------------
  1233. int  w_vout_word(int wnum,int fnum,word w);
  1234. function  w_vout_word(wnum,fnum:integer;w:word):integer;
  1235.  
  1236. Siehe w_vout_byte !
  1237.  
  1238.  
  1239. ----------------------------------------------
  1240. int  w_out_long(int wnum,int fnum,long l);
  1241. function  w_out_longint(wnum,fnum:integer;l:longint):integer;
  1242.  
  1243. Siehe w_out_byte !
  1244.  
  1245.  
  1246. ----------------------------------------------
  1247. int  w_vout_long(int wnum,int fnum,long l);
  1248. function  w_vout_longint(wnum,fnum:integer;l:longint):integer;
  1249.  
  1250. Siehe w_vout_byte !
  1251.  
  1252.  
  1253. ----------------------------------------------
  1254. int  w_out_double(int wnum,int fnum,double *d);
  1255. function  w_out_double(wnum,fnum:integer;var d:double):integer;
  1256.  
  1257. Siehe w_out_byte !
  1258.  
  1259.  
  1260. ----------------------------------------------
  1261. int  w_vout_double(int wnum,int fnum,double *d);
  1262. function  w_vout_double(wnum,fnum:integer;var d:double):integer;
  1263.  
  1264. Siehe w_vout_byte !
  1265.  
  1266.  
  1267. ----------------------------------------------
  1268. int  w_out_date(int wnum,int fnum,DAte *d);
  1269. function  w_out_date(wnum,fnum:integer;var d:DAte):integer;
  1270.  
  1271. Der Datums-Datentyp DAte findet sich in den Schnittstellen-
  1272. Beschreibungen. Siehe auch w_out_byte !
  1273.  
  1274.  
  1275. ----------------------------------------------
  1276. int  w_vout_date(int wnum,int fnum,DAte *d);
  1277. function  w_vout_date(wnum,fnum:integer;var d:DAte):integer;
  1278.  
  1279. Virtuelle Version zu w_out_date.
  1280. Siehe w_vout_byte !
  1281.  
  1282.  
  1283. ----------------------------------------------
  1284. int  w_out_time(int wnum,int fnum,TIme *d);
  1285. function  w_out_time(wnum,fnum:integer;var t:time):integer;
  1286.  
  1287. Der Uhrzeit-Datentyp TIme findet sich in den Schnittstellen-
  1288. Beschreibungen. Siehe w_out_byte !
  1289.  
  1290.  
  1291. ----------------------------------------------
  1292. int  w_vout_time(int wnum,int fnum,TIme *d);
  1293. function  w_vout_time(wnum,fnum:integer;var t:time):integer;
  1294.  
  1295. Virtuelle Version zu w_out_time.
  1296. Siehe w_vout_byte !
  1297.  
  1298.  
  1299. ----------------------------------------------
  1300. int  w_out_dmark(int wnum,int fnum,DMark *d);
  1301. function  w_out_dmark(wnum,fnum:integer;var d:DMark):integer;
  1302.  
  1303. Der Währungs-Datentyp DMark findet sich in den Schnittstellen-
  1304. Beschreibungen. Siehe w_out_byte !
  1305.  
  1306.  
  1307. ----------------------------------------------
  1308. int  w_vout_dmark(int wnum,int fnum,DMark *d);
  1309. function  w_vout_dmark(wnum,fnum:integer;var d:DMark):integer;
  1310.  
  1311. Virtuelle Version zu w_out_dmark.
  1312. Siehe w_vout_byte !
  1313.  
  1314.  
  1315. -------------------------------------------------------
  1316. int w_in_str(int wnum,int field,int strlen,char *s,char *legal)
  1317. function  w_in_str(wnum,field,stringlen:integer;var 
  1318. s:string;legal:string):integer;
  1319.  
  1320. w_in_str ließt einen String der maximalen Laenge <strlen> im Feld 
  1321. <field> der Maske <wnum> ein, wobei lediglich die in <legal> 
  1322. angegebenen Zeichen akzeptiert werden.
  1323. Die Länge des einzulesenden Strings <strlen> kann größer als die 
  1324. Länge des Feldes sein, das notwendige  Scrollen wird automatisch 
  1325. ausgeführt. Ist <strlen> mit 0 angegeben, so wird ein String mit 
  1326. maximal der Feldlänge + 1 eingelesen. Eingabe-Attribut und Format 
  1327. sowie Schreib-Modus werden durch die Felddefinitionen der Maske 
  1328. bestimmt. Das Eingabeformat kann links- als auch rechtsbündig 
  1329. erfolgen.
  1330. Wird nacheinander der gleiche String editiert, so bleibt der Cursor 
  1331. an der jeweils zuletzt aktuellen Position stehen.
  1332. Der Initial-Schreib-Modus (Überschreiben oder Einfügen ) ist an 
  1333. der Cursor-Gestalt erkennbar. Während des Einlesens stehen die 
  1334. üblichen Tasten zum Editieren zur Verfügung ([Home], [End], [->], 
  1335. [<-], [Backspace], [Insert]. Die Eingabe wird mit [CR] bestätigt, ein 
  1336. Abbruch erfolgt mit [ESC]. Ein Abbruch bei Fremd-Tasten ist mit 
  1337. der Funktion w_in_break_on_key einstellbar . Die erste Taste des 
  1338. Editors kann vorgegeben , die letzte Taste abgefragt werden.
  1339.  
  1340.  
  1341. Ergebnis:
  1342.  
  1343. 1    : Eingabe wurde mit [CR] abgeschlossen
  1344. -1   : Eingabe wurde mit [ESC] abgebrochen
  1345. -2   : Eingabe wurde durch Fremdtaste abgebrochen
  1346. -3   : Fehler
  1347.  
  1348.  
  1349. -------------------------------------------------------
  1350. int  w_in_break_on_key(int mode);
  1351. function  w_in_break_on_key(mode:integer):integer;
  1352.  
  1353. Bewirkt, das der Zeileneditor w_in_str und alle Eingabe-Funktionen, 
  1354. die diesen benutzen, bei Fremdtasten abbrechen. Die jeweilige Taste 
  1355. ist mit w_in_last_key ermittelbar.
  1356.  
  1357. Parameter:
  1358.  
  1359. mode = 0 : Kein Abbruch
  1360. mode = 1 : Abbruch bei Fremdtasten ausser MOUSE_MOVE
  1361. mode = 2 : Abbruch bei Fremdtasten einschließlich MOUSE_MOVE
  1362. mode = -1: Keine Veränderung, zb. zur Abfrage !
  1363.  
  1364. Ergebnis:
  1365.  
  1366. Zuletzt eingestellter mode-Wert
  1367.  
  1368.  
  1369. -------------------------------------------------------
  1370. int  w_in_last_key(void);
  1371. function  w_in_last_key:integer;
  1372.  
  1373. Liefert unbedingt die zuletzt in w_in_str (und w_in_str benutzende 
  1374. Funktionen) verwendete Taste !
  1375.  
  1376. Ergebnis:
  1377.  
  1378. Letzte Taste
  1379.  
  1380.  
  1381. -------------------------------------------------------
  1382. void w_in_first_key(int key);
  1383. function  w_in_last_key:integer;
  1384.  
  1385. Gibt die erste Taste für den Zeileneditor w_in_str vor. So  würde 
  1386. dieser beispielsweise bei einem vorgegebenen KEY_ESC sofort 
  1387. wieder abbrechen.
  1388.  
  1389. Parameter:
  1390.  
  1391. key : Erste Taste im Zeileneditor
  1392.  
  1393.  
  1394. -------------------------------------------------------
  1395. void w_in_reset_curpos(void);
  1396. procedure w_in_reset_curpos;
  1397.  
  1398. w_in_str behält die aktuelle Cursorposition bei, wenn nacheinander 
  1399. der gleiche String editiert wird. Dies läßt sich durch Aufruf von 
  1400. w_in_reset_curpos für den folgenden Aufruf von w_in_str 
  1401. unterbinden.
  1402.  
  1403.  
  1404.  
  1405.  
  1406. -------------------------------------------------------
  1407. int w_in_long(int wnum,int field,long *destin,long min,long max)
  1408. function w_in_longint(wnum,field:integer;var destin:longint;
  1409.                       min,max:longint):integer;
  1410.  
  1411. w_in_long ließt einen 'long' im Wertebereich von <min> bis <max> 
  1412. ein. <destin> ist ein Zeiger auf die Zielvariable, in die der Wert 
  1413. geschrieben werden soll. Intern ruft w_in_long die Funktion 
  1414. w_in_str auf, so daß die Angaben über Tastenfunktionen von dort 
  1415. zu übernehmen sind. Die Programmierung weiterer solcher 
  1416. Funktionen unter Verwendung von w_in_str ist denkbar.
  1417.  
  1418.  
  1419.  
  1420. -------------------------------------------------------
  1421. int w_in_word(int wnum,int field,word *destin,word min,word max)
  1422. function  w_in_word(wnum,field:integer;var destin:word;min,
  1423.                     max:word):integer;
  1424.  
  1425. Eigabe im Format Word, ansonsten wie w_in_long
  1426.  
  1427.  
  1428. -------------------------------------------------------
  1429. int w_in_int(int wnum,int field,int *destin,int min,int max)
  1430. function w_in_int(wnum,field:integer;var destin:integer;
  1431.                  min,max:integer):integer;
  1432.  
  1433. Eigabe im Format Integer, ansonsten wie w_in_long
  1434.  
  1435.  
  1436.  
  1437. -------------------------------------------------------
  1438. int w_in_int(int wnum,int field,int *destin,int min,int max)
  1439. function w_in_int(wnum,field:integer;var destin:integer;
  1440.                  min,max:integer):integer;
  1441.  
  1442. Eigabe im Format Integer, ansonsten wie w_in_long
  1443.  
  1444.  
  1445.  
  1446. -------------------------------------------------------
  1447. int  w_in_double(int wnum,int fnum,double *destin,double 
  1448. *min,double *max);
  1449. function  w_in_double(wnum,fnum:integer;var 
  1450. destin,min,max:double):integer;
  1451.  
  1452. Eigabe im Format Double, ansonsten wie w_in_long. Der Double-Wert 
  1453. kann in beliebigem Double-Format ( Exponential oder Festpunkt-
  1454. Darstellung usw. ).
  1455.  
  1456.  
  1457. -------------------------------------------------------
  1458. int  w_in_date(int wnum,int fnum,DAte *destin,DAte *min,DAte *max);
  1459. function  w_in_date(wnum,fnum:integer;var 
  1460. destin,min,max:DAte):integer;
  1461.  
  1462. Eigabe im Format DAte, ansonsten wie w_in_long. Die Eingabe muß 
  1463. im Format Tag.Monat.Jahr (z.B., 25.3.1997) erfolgen, wobei die 
  1464. Jahreszahl vollständig anzugegeben ist. Schaltjahre werden 
  1465. berücksichtigt, so daß z.B. die Eingabe vom 29.2.91 nicht akzeptiert 
  1466. werden würde.
  1467.  
  1468.  
  1469. -------------------------------------------------------
  1470. int  w_in_time(int wnum,int fnum,TIme *destin,TIme *min,TIme *max);
  1471. function  w_in_time(wnum,fnum:integer;var 
  1472. destin,min,max:TIme):integer;
  1473.  
  1474. Eigabe im Format TIme, ansonsten wie w_in_long. Die Eingabe muß 
  1475. im Format Stunde:Minute:Sekunde  (z.B., 23:11:00) erfolgen.
  1476.  
  1477.  
  1478. -------------------------------------------------------
  1479. int  w_in_dmark(int wnum,int fnum,DMark *destin,DMark *min,DMark 
  1480. *max);
  1481. function  w_in_dmark(wnum,fnum:integer;var 
  1482. destin,min,max:DMark):integer;
  1483.  
  1484. Eigabe im Format DMark, ansonsten wie w_in_long. Das DMark-
  1485. Format setzt sich aus eine Mark und einen Pfennig-Anteil, getrennt 
  1486. durch ein Komma, zusammen. Für fehlende Anteile kann ein - 
  1487. angegeben werden. (z.B. -,90  -,-  12  23,99)
  1488.  
  1489.  
  1490.  
  1491. ==================================================================
  1492. 7.4 Feldtyp-Gebundene Ein- und Ausgabe
  1493. ==================================================================
  1494.  
  1495. Die folgenden Routinen berücksichtigen im Gegensatz zu denen der 
  1496. freien Ein-und Ausgabe den jedem Feld zugeordneten Datentyp und 
  1497. dessen Wertebereich. Dadurch lassen sich sehr komfortable 
  1498. vollautomatisierte komplexe Ein- und Ausgabeoperationen mit 
  1499. beispielsweise nur einem Funktionsaufruf realisieren. Ansonsten 
  1500. sind alle über die freie Ein-und Ausgabe gemachten Aussagen auch 
  1501. hier gültig.
  1502.  
  1503.  
  1504. -----------------------------------------------------------
  1505. int w_in_struct(int wnum,int first,int last,void *destin);
  1506. function  w_in_struct(wnum,first,last:integer;var destin):integer;
  1507.  
  1508. w_in_struct ließt in einer Eingabeschleife Werte der Felder <first> 
  1509. bis <last> der Maske vollautomatisch ein. Dabei werden die den 
  1510. Feldern zugeordneten Datentypen sowie deren Wertebereiche 
  1511. berücksichtigt. Die Ergebisse werden in der Reihenfolge der 
  1512. Feldnummern an die durch <destin> bezeichnete Speicherstelle 
  1513. geschrieben. Die Speicherstelle sollte einer Datenstruktur 
  1514. zugeordnet sein, die den Felddefinitionen entspricht.
  1515. Zur Vermeidung von Fehlern kann mit der Funktion w_struct_sizeof 
  1516. die Größe des zu beschreibenden Speicherbereichs ermittelt werden.
  1517.  
  1518. w_in_struct wird gebildet aus einer Kombination der jeweiligen 
  1519. Eingabefunktionen des Datentyps mit der Funktion w_switch zur 
  1520. menüartigen Anwahl des jeweils zu bearbeitenden Feldes.
  1521. Der Feldzugriff erfolgt also nicht in einer Sequenz sondern 
  1522. vielmehr wahlfrei.
  1523.  
  1524. Entscheident für die Arbeitsweise sind die Einstellungen, die vor 
  1525. Aufruf von w_in_struct an den Funktionen w_in_str und w_switch 
  1526. bezüglich der break_on_key-Funktionen vorgenommen wurden.
  1527.  
  1528. Führt keine der beiden Funktionen einen Abbruch bei Fremdtasten 
  1529. aus, so gilt folgendes: Die Anwahl eines Feldes zum Beschreiben 
  1530. erfolgt mit Enter-Taste bzw. linker Maustaste, zur Menü-Ebene 
  1531. gelangt man mit den gleichen Tasten oder ESC bzw. rechter 
  1532. Maustaste zurück.
  1533.  
  1534. Bricht beispielsweise die Eingabe mit einer Fremdtaste ab, so wird 
  1535. diese Fremdtaste an w_switch weitergereicht und kann z.b. dort 
  1536. schon ein Anspringen des nächsten Feldes bewirken.
  1537. Umgekehrt würde ein Abbruch von w_switch bei z.B. einer 
  1538. Buchstabentaste dazu führen, daß diese Taste in w_in_.. schon zum 
  1539. Beschreiben eines Feldes verwendet werden würde.
  1540. Nur wenn beide beide Funktionen (w_in.. und w_switch) bei 
  1541. Fremdtasten abbrechen, bricht auch w_in_struct bei einer 
  1542. Fremdtaste ab. Ansonsten würde die Fremdtaste beim Weiterreichen 
  1543. von w_in.. zu w_switch (oder umgekehrt) hängenbleiben.
  1544.  
  1545.  
  1546. Parameter:
  1547.  
  1548. wnum  : Maskennummer
  1549. first : Nummer des ersten zu bearbeitenden Feldes
  1550. last  : Nummer des letzten zu bearbeitenden Feldes
  1551. destin: Zeiger auf Zielstruktur
  1552.  
  1553. Ergebnis:
  1554.  
  1555. siehe w_in_str bzw.  w_switch
  1556.  
  1557.  
  1558. -------------------------------------------------------
  1559. int  w_struct_sizeof(int wnum,int first,int last);
  1560. function  w_struct_sizeof(wnum,first,last:integer):integer;
  1561.  
  1562. Ermittelt den durch die von <first> bis <last> bezeichnete 
  1563. Feldsequenz belegten Speicherplatz in Bytes. Die Größe von String-
  1564. Typen ist durch die Länge des Feldes + einem weiteren Byte 
  1565. festgelegt. Ist <first> = <last>, so ermittelt man die Größe des 
  1566. Datentyps eines Feldes. (siehe auch w_in_struct). Sollte die Größe 
  1567. wiederholt differieren, so könnte in der Entwicklunsumgebung 
  1568. WORD-ALIGNMENT (Ausrichtung auf Wortgrenzen des Speichers !) 
  1569. eingestellt sein, so daß Strukturen u.U. Lücken enthalten.
  1570.  
  1571.  
  1572. wnum  : Maskennummer
  1573. first : Nummer des ersten zu zählenden Feldes
  1574. last  : Nummer des letzten zu zählenden Feldes
  1575.  
  1576. Ergebnis:
  1577.  
  1578. >=0  :  Anzahl der Bytes
  1579. sonst:  Fehler
  1580.  
  1581.  
  1582. -------------------------------------------------------
  1583. int w_struct_init(int wnum,int first,int last,void *destin,int max);
  1584. function  w_struct_init(wnum,first,last:integer;var 
  1585. destin;max:integer):integer;
  1586.  
  1587. Initialisert eine Datenstruktur mit den Minimal oder Maximalwerten, 
  1588. die jedem Feld zugeordnet sind. String-Typen werden mit 
  1589. Leerzeichen belegt. Siehe auch w_in_struct !
  1590.  
  1591. Parameter:
  1592.  
  1593. wnum  : Maskennummer
  1594. first : Nummer des ersten zu bearbeitenden Feldes
  1595. last  : Nummer des letzten zu bearbeitenden Feldes
  1596. destin: Zeiger auf Zielstruktur
  1597.  
  1598.  
  1599. -------------------------------------------------------
  1600. int  w_out_struct(int wnum,int first,int last,void *source);
  1601. function  w_out_struct(wnum,first,last:integer;var source):integer;
  1602.  
  1603. Gibt eine Datenstruktur auf zuzuordnende Maskenfelder aus. Siehe 
  1604. auch w_in_struct.
  1605.  
  1606. Parameter:
  1607.  
  1608. wnum  : Maskennummer
  1609. first : Nummer des ersten zu bearbeitenden Feldes
  1610. last  : Nummer des letzten zu bearbeitenden Feldes
  1611. source: Zeiger auf die Quelldaten
  1612.  
  1613.  
  1614. -------------------------------------------------------
  1615. int  w_vout_struct(int wnum,int first,int last,void *source);
  1616. function  w_vout_struct(wnum,first,last:integer;var source):integer;
  1617.  
  1618. Virtuelle Version von w_out_struct.
  1619.  
  1620.  
  1621.  
  1622. -------------------------------------------------------
  1623. int w_in_field(int wnum,int fnum,void *destin);
  1624. function  w_in_field(wnum,fnum:integer;var buffer):integer;
  1625.  
  1626. Ließt einen der Feldefinition von <fnum> entsprechenden Wert mit 
  1627. Hilfe von w_in_str(..) ein und schreibt diesen an die durch <destin> 
  1628. gekennzeichnete Speicherstelle.
  1629.  
  1630. Ergebnis
  1631.  
  1632. 1  : OK
  1633. -1 : ESC
  1634. -2 : Fremdtaste
  1635. -3 : Fehler
  1636.  
  1637. -------------------------------------------------------
  1638. int w_out_field(int wnum,int fnum,void *source);
  1639. function  w_out_field(wnum,fnum:integer;var buffer):integer;
  1640.  
  1641. Gibt einen Wert auf das Feld <fnum> aus. Die durch <source> 
  1642. angegebene Speicherstelle wird dabei entsprechend der 
  1643. Feldefinition von <fnum> interpretiert.
  1644.  
  1645. Ergebnis
  1646.  
  1647. 1  : OK
  1648. -3 : Fehler
  1649.  
  1650.  
  1651. -------------------------------------------------------
  1652. int w_vout_field(int wnum,int fnum,void *source);
  1653. function  w_vout_field(wnum,fnum:integer;var buffer):integer;
  1654.  
  1655. Virtuelle Version von w_out_field(..).
  1656.  
  1657.  
  1658. ==================================================================
  1659. 7.5  Menü-Verwaltung
  1660. ==================================================================
  1661.  
  1662. Folgende Routinen dienen dem Aufbau von Menüs nahezu jeglicher 
  1663. Ausprägung. Sie adaptieren sich den jeweiligen Feld-Definitionen 
  1664. der Masken.
  1665.  
  1666.  
  1667. -------------------------------------------------------
  1668. int w_switch(int wnum)
  1669. function  w_switch(wnum:integer):integer;
  1670.  
  1671. w_switch ist eine Funktion zum Aufbau vollständig 
  1672. mausunterstützter Menüs beliebiger Ausprägung. Das Konzept ist 
  1673. folgendes: Im Maskengenerator WINEDIT werden die einzelnen 
  1674. Schirmbilder, welche die Menüs ausmachen, erstellt. Die anwählbaren 
  1675. Positionen des Menüs, also Worte oder Wortgruppen einer Zeile, 
  1676. werden im Maskengenerator als Felder definiert und nummeriert.
  1677. Diese Information ist in der mit w_load geladenen 
  1678. Maskenbeschreibung enthalten und wird bei Aufruf von w_switch 
  1679. gelesen. w_switch veranlasst nun, daß eine Auswahl zwischen den 
  1680. Feldern der Maske <wnum> getroffen werden kann. Das jeweils 
  1681. angewählte Feld wird mit einer im Maskengenerator frei wählbaren 
  1682. Farbe, dem Revers-Attribut, markiert. Der Anwender kann nun 
  1683. mittels Cursortasten oder Mauszeiger die Markierung auf den 
  1684. Feldern wandern lassen. In der Standardkonfiguration wird eine 
  1685. Bestätigung der Anwahl mit einem [CR] oder der linken Maustaste 
  1686. erzielt, ein Abbruch erfolgt bei [ESC] oder rechter Maustaste. Die 
  1687. Reihenfolge des Feldmarkierens bei Benutzung der Cursortasten 
  1688. erfolgt nicht nach den Nummern der Felder, vielmehr wird so 
  1689. Verfahren, daß in der Regel die vom Anwender visuell als 
  1690. naheliegendst empfundene Veränderung ausgeführt wird. Es sind 
  1691. also beispielsweise auch in einer Hilfstextmaske diffus verteilt 
  1692. liegende Felder sinnvoll anwählbar.
  1693. Über nachfolgend beschriebene Funktionen ist w_switch vielfältig 
  1694. konfigurierbar, die Konfiguration ist maskenspezifisch, w_switch 
  1695. kann also bei jeder Maske anders agieren. Der problemlose Aufbau 
  1696. hirachischer Menüs ist möglich, selbst die Bewegung des 
  1697. Mauszeigers auf Felder zuvor geöffneter Masken wird erkannt. Die 
  1698. dazu notwendige Programmstruktur ist dem Beispiel, dort 
  1699. insbesondere der Routine MENUE, zu entnehmen.
  1700.  
  1701.  
  1702. Ergebnis
  1703.  
  1704. 0 - 255 Feldnummer des angewählten Ortes
  1705. -1      Abbruch
  1706. -2      Fremde Taste ( siehe w_switch_break_on_key() )
  1707. -3      Fehler
  1708.  
  1709.  
  1710.  
  1711. -------------------------------------------------------
  1712. int w_switch_pos(int wnum,int position)
  1713. function  w_switch_pos(wnum,position:integer):integer;
  1714.  
  1715. w_switch_pos setzt, wenn <position> eine gültige Feldnummer der 
  1716. Maske <wnum> darstellt, die Nummer des markierten Feldes für den 
  1717. nächsten Aufruf von w_switch auf eben <position>.
  1718. Das Ergebnis der Funktion ist die aktuell markierte Feldnummer, 
  1719. ein Aufruf wie w_switch_pos(wnum,-1) liefert also die aktuelle 
  1720. Position, ändert sonst nichts.
  1721.  
  1722. Ergebnis
  1723.  
  1724. 0 - 255 : Aktuell markierte Position
  1725. < 0     : Fehler ( Ungültige Maskennummer <wnum> )
  1726.  
  1727.  
  1728. -------------------------------------------------------
  1729. int w_switch_first_key(int wnum,int key)
  1730. function w_switch_first_key(wnum,key:integer):integer;
  1731.  
  1732. w_switch_first_key gibt die erste Taste in w_switch vor; d.h. das 
  1733. die erste Taste nicht von Tastatur oder Maus gelesen wird. Somit 
  1734. kann man z.B. durch vorrangehendes Positionieren (w_switch_pos) 
  1735. und Vorgeben der ENTER-Taste ein automatisches Ausführen von 
  1736. Menüs erzeugen.Siehe auch w_switch_visible_cr ..
  1737.  
  1738.  
  1739. -------------------------------------------------------
  1740. int w_switch_last_key(int wnum)
  1741. function  w_switch_last_key(wnum:integer):integer;
  1742.  
  1743. w_switch_last_key liefert den Wert der in w_switch bei Anwendung 
  1744. auf Maske <wnum> zuletzt gedrückten Taste als Ergebnis. Aktionen 
  1745. der Maus werden auch als Tasten ausgewertet. Ein Abbruch kann 
  1746. erfolgt sein durch KEY_ESC oder rechter Maustaste (MOUSE_L_B), 
  1747. wenn w_switch_mouse_esc(..,1) eingestellt war kann auch ein
  1748. MOUSE_MOVE die letzte Taste gewesen sein.
  1749. Soll w_switch mit jeder Fremdtaste abbrechen, ist also 
  1750. w_switch_break_on_key(..,1) eingestellt, so kann mit 
  1751. w_switch_last_key diese Fremdtaste ermittelt werden.
  1752. Der Tastaturcode ist den Definitionen der Header-Datei W_DEF.H 
  1753. (TURBO-C) bzw. der Datei W_TBP_XX.IFC (TURBO-Pascal) zu 
  1754. entnehmen.
  1755.  
  1756. Ergebnis
  1757.  
  1758. 0     : Maskennummer ungültig
  1759. sonst : Tastaturcode der zuletzt gedrückten Taste
  1760.  
  1761.  
  1762.  
  1763. -------------------------------------------------------
  1764. int w_switch_visible_cr(int wnum)
  1765. function  w_switch_visible_cr(wnum:integer):integer;
  1766.  
  1767. w_switch_visible_cr bewirkt, das w_switch bei Aufruf mit der 
  1768. Maskennummer <wnum> lediglich das aktuelle Feld markiert und 
  1769. ohne Aktionen des Anwenders entgegenzunehmen wie bei einem 
  1770. KEY_CR des Anwenders beendet, wobei ein Abfragen der letzten 
  1771. Taste jedoch eine 0 zum Ergebnis haben würde. w_switch liefert die 
  1772. Nummer des zuletzt markierten Feldes zurück. Dieser kann zuvor 
  1773. mit w_switch_pos eingestellt werden, so das die Verzweigung 
  1774. steuerbar ist. Diese Betriebsart ist sinnvoll, wenn die Anwahl der 
  1775. Menüpunkte zusetzlich mittels 'Hotkeys' möglich sein und durch das 
  1776. zusätzliche Aufklappen der Menüs die Hirachie dieser 
  1777. veranachaulicht werden soll. Diese Betriebsart ist nur für den 
  1778. nächsten Aufruf von w_switch mit der Maskennummer <wnum> 
  1779. gültig und wird dann selbsttätig zurückgesetzt.
  1780.  
  1781.  
  1782. Ergebnis
  1783.  
  1784. 1    : Betriebsart konnte eingestellt werden
  1785. 0    : Fehler (ungültige Maskennummer)
  1786.  
  1787.  
  1788.  
  1789. -------------------------------------------------------
  1790. int w_switch_unvisible_cr(int wnum)
  1791. function  w_switch_unvisible_cr(wnum:integer):integer;
  1792.  
  1793. w_switch_visible_cr bewirkt, das sich w_switch bei Aufruf mit der 
  1794. Maskennummer sofort und ohne Aktionen des Anwenders 
  1795. entgegenzunehmen wie bei einem KEY_CR beendet,  ein Abfragen 
  1796. der letzten Taste würde jedoch eine 0 zum Ergebnis haben. 
  1797. w_switch liefert die Nummer des zuletzt markierten Feldes zurück, 
  1798. dieser kann mit w_switch_pos eingestellt werden. Diese Betriebsart 
  1799. ist sinnvoll, wenn die Anwahl der Menüpunkte ohne Erscheinen der 
  1800. Menüs zusetzlich mittels 'Hotkeys' möglich sein soll. Diese 
  1801. Betriebsart ist nur für den nächsten Aufruf von w_switch mit der 
  1802. Maskennummer <wnum> gültig und wird dann sebsttätig 
  1803. zurückgesetzt.
  1804.  
  1805.  
  1806. Ergebnis
  1807.  
  1808. 1    : Betriebsart konnte eingestellt werden
  1809. 0    : Fehler (ungültige Maskennummer)
  1810.  
  1811.  
  1812.  
  1813. -------------------------------------------------------
  1814. int w_switch_auto_esc(int wnum)
  1815. function  w_switch_auto_esc(wnum:integer):integer;
  1816.  
  1817. w_switch_auto_esc veranlaßt, daß sich w_switch bei Aufruf mit 
  1818. <wnum> ohne Aktionen des Anwenders entgegenzunehmen sofort wie 
  1819. bei einem KEY_ESC beendet,  ein Abfragen der letzten Taste würde 
  1820. jedoch eine 0 zum Ergebnis haben.
  1821. Sinnvoll ist diese Funktion dann anzuwenden, wenn beispielsweise 
  1822. nach Ausführung einer zuvor angewählten Aktion der Rückweg 
  1823. über die Menüleiste übersprungen werden soll. Diese Betriebsart ist 
  1824. nur für den folgenden Aufruf von w_switch mit der Maskennummer 
  1825. <wnum> gültig, sie wird dann selbsttätig zurückgesetzt.
  1826.  
  1827. Ergebnis
  1828.  
  1829. 1    : Betriebsart konnte eingestellt werden
  1830. 0    : Fehler (ungültige Maskennummer)
  1831.  
  1832.  
  1833.  
  1834. -------------------------------------------------------
  1835. int w_switch_range(int wnum,int first,int last)
  1836. function  w_switch_number_of_places(wnum,first,last:integer):integer;
  1837.  
  1838. w_switch_range begrenzt den Bereich der Menü-Felder einer Maske: 
  1839. Normalerweise werden alle Felder einer Maske in eine Menüauswahl 
  1840. miteinbezogen. Unter Verwendung von w_switch_range wird die 
  1841. Anzahl der verwendeten Felder auf <last>-<first>+1 eingeschränkt. 
  1842. Sinnvolle Anwendungen ergeben sich, wenn die Anzahl der 
  1843. anwählbaren Objekte ( z.B. Dateien) variabel ist.
  1844.  
  1845. Ergebnis
  1846.  
  1847. 1    : Anzahl konnte eingestellt werden
  1848. 0    : Fehler
  1849.  
  1850.  
  1851.  
  1852. -------------------------------------------------------
  1853. int w_switch_mouse_esc(int wnum,int mode)
  1854. function  w_switch_mouse_esc(wnum,mode:integer):integer;
  1855.  
  1856. w_switch_mouse_esc ermöglicht den Aufbau einer Menü-Hirachie aus 
  1857. verschiedenen Masken, in der durch Positionierung des 
  1858. Mauscursors auch sichtbare Felder von zuvor geöffneten Masken 
  1859. angewählt werden können. Die geöffneten Masken werden intern in 
  1860. einem Maskenstapel verwaltet, notwendigerweise ist dieser 
  1861. Maskenstapel ein Abbild der auf dem Bildschirm gestapelten Masken. 
  1862. Ist diese Betriebsart für die Maske eines Untermenüs beliebiger 
  1863. Tiefe eingestellt, und wird aus diesem Untermenü mit dem 
  1864. Mauscursor ein sichtbares Feld zB. der Hauptmenüzeile angewählt, 
  1865. so veranlasst w_switch ein auto_esc (siehe w_switch_auto_esc) für 
  1866. alle alle Zwischenmenüs auf dem Weg zum Hauptmenü, das 
  1867. Hauptmenü wird entsprechend positioniert (siehe w_switch_pos). 
  1868. Vorraussetzung zum Funktionieren ist natürlich eine gewisse 
  1869. Programmstruktur, die den Beispielen entnommen werden kann.
  1870.  
  1871. Parameter
  1872.  
  1873. mode=1 : Betriebsart an
  1874. mode=0 : Betriebsart aus
  1875.  
  1876. Ergebnis
  1877.  
  1878. 1    : Betriebsart konnte eingestellt werden
  1879. 0    : Fehler (ungültige Maskennummer)
  1880.  
  1881.  
  1882.  
  1883. -------------------------------------------------------
  1884. int w_switch_mouse_cr(int wnum,int mode)
  1885. function  w_switch_mouse_cr(wnum,mode:integer):integer;
  1886.  
  1887. w_switch_mouse_cr stellt eine Betriebsart ein, in der bei 
  1888. Anwendung von w_switch auf die Maske der Nummer <wnum> schon 
  1889. das Positionieren des Mauscursors auf ein Feld als Anwahl diese 
  1890. Feldes interpretiert wird. Programmtechnisch stellt sich diese 
  1891. Betriebsart so da, als wenn tatsächlich eine Anwahl durch Drücken 
  1892. der linken Maustaste erfolgt wäre. Eine sinnvolle Anwendugen wäre 
  1893. die Programmierung bei Mausanwahl selbsttätig aufklappender 
  1894. Untermenüs.
  1895.  
  1896. Parameter
  1897.  
  1898. mode=1 : Betriebsart an
  1899. mode=0 : Betriebsart aus
  1900.  
  1901. Ergebnis
  1902.  
  1903. 1    : Betriebsart konnte eingestellt werden
  1904. 0    : Fehler (ungültige Maskennummer)
  1905.  
  1906.  
  1907.  
  1908. -------------------------------------------------------
  1909. int w_switch_mark_mode(int wnum,int mode)
  1910. function  w_switch_mark_mode(wnum,mode:integer):integer;
  1911.  
  1912. w_switch_mark_mode verändert die Art, in der bei Anwendung von 
  1913. w_switch auf Maske <wnum> das angewählten Feld markiert wird. 
  1914. Die erste Möglichkeit der Markierung besteht in der Veränderung 
  1915. des Attributs, die zweite darin, jeweils Pfeile auf der ersten und 
  1916. letzten Stelle des Feldes zu plazieren.
  1917. Dort sollten dann möglicht keine wichtigen Zeichen stehen. Die 
  1918. dritte Möglichkeit besteht darin, die ersten Beiden zu kombinieren. 
  1919. <mode> = 3,4,5 entspricht den Möglichkeiten 0,1,2 mit dem 
  1920. Unterschied, daß bei Markierungswechsel durch Cursortasten der 
  1921. Mauscursor nachgeführt wird.
  1922.  
  1923. Parameter
  1924.  
  1925. mode=0 : Attribut
  1926. mode=1 : Pfeile
  1927. mode=2 : Attribut + Pfeile
  1928. mode=4 : Attribut + Mauscursornachführung
  1929. mode=5 : Pfeile + Mauscursornachführung
  1930. mode=6 : Attribut + Pfeile + Mauscursornachführung
  1931.  
  1932.  
  1933. Ergebnis
  1934.  
  1935. 1    : Betriebsart konnte eingestellt werden
  1936. 0    : Fehler (ungültige Maskennummer)
  1937.  
  1938.  
  1939.  
  1940. -------------------------------------------------------
  1941. int w_switch_break_on_key(int wnum,int mode)
  1942. function  w_switch_break_on_key(wnum,mode:integer):integer;
  1943.  
  1944. w_switch_break_on_key veranlaßt w_switch bei Anwendung auf 
  1945. Maske <wnum> mit jeder fremden Taste abzubrechen. Ein solcher 
  1946. Abbruch ist durch das Ergebnis -2 der Funktion w_switch 
  1947. erkennbar, die Fremdtaste läßt sich mittels w_switch_last_key 
  1948. ermitteln. Fremdtasten sind alle Tasten, die nicht der Menueauswahl 
  1949. dienen. Keine Fremdtasten
  1950. sind also die Cursortasten (KEY_C_L, KEY_C_R, KEY_C_U, KEY_C_D), 
  1951. Escape-Taste (KEY_ESC) und rechte Maustaste (MOUSE_R_B) sowie 
  1952. Return-Taste (KEY_CR) und linke Maustaste (MOUSE_L_B). Für 
  1953. <mode> = 2 führt auch ein MOUSE_R_B zum Abbruch, wenn sich der 
  1954. Mauscursor zum Zeitpunkt des Tastendrucks nicht auf einem Feld 
  1955. der Maske befindet.
  1956.  
  1957.  
  1958. Parameter
  1959.  
  1960. mode= 0 : Kein Abbruch
  1961. mode= 1 : Abbruch bei Fremdtasten
  1962. mode= 2 : Abbruch bei Fremdtasten und MOUSE_R_B außerhalb
  1963. mode=-1 : Keine Veränderung
  1964.  
  1965. Ergebnis
  1966.  
  1967. -1    : Fehler (ungültige Maskennummer)
  1968. sonst : aktueller Modus
  1969.  
  1970.  
  1971. -------------------------------------------------------
  1972. int w_switch_matrix(int wnum,int mode,int left,int right,int
  1973.                           top,int bottom)
  1974. function w_switch_matrix(wnum,mode,left,right,top,
  1975.                           bottom:integer):integer;
  1976.  
  1977. w_switch_matrix erwartet eine rechteckige ,symmetrische und
  1978. zeilenweise nummerierte Anordnung der Felder. Mit <mode> =1 wird 
  1979. erreicht, daß ein wegen der Symmetrien deutlich vereinfachter 
  1980. Markieralgorithmus eingesetzt wird. Dies vermindert den 
  1981. anfänglichen Zeitverzug bei Anwendung von w_switch auf Masken 
  1982. mit einer großen Anzahl (zB. > 30) von Feldern. Die vier Parameter 
  1983. <left>, <right>, <top> und <bottom> dienen der Realisierung eines 
  1984. Scrollbetriebs. Sie bezeichnen die vier Seiten eines Rechtecks. Wird 
  1985. beispielsweise der Parameter <right> auf 1 gesetzt, so würde 
  1986. w_switch abbrechen, wenn ein Feld am rechten Rand der Matrix 
  1987. markiert ist und die Taste KEY_C_R gedrückt werden würde. So hat 
  1988. der Programmierer die Möglichkeit, die Texte der Felder zu ändern, 
  1989. um ein Scrollen zu erzeugen. Gleiches gilt natürlich für die 
  1990. anderen drei Seiten. Ist auch nur einer dieser vier Parameter 
  1991. ungleich 1, so wird intern <mode>=1 gesetzt.
  1992.  
  1993. Parameter
  1994.  
  1995. mode=0 : Komlexer Markieralgotithmus, wenn alle Parameter 0
  1996. mode=1 : Vereinfachter Makieralgorithmus
  1997.  
  1998. right=1: Abbruch bei KEY_C_R am rechten Rand
  1999. right=0: Kein Abbruch
  2000.  
  2001. Ergebnis
  2002.  
  2003. 1    : Betriebsart konnte eingestellt werden
  2004. 0    : Fehler (ungültige Maskennummer)
  2005.  
  2006.  
  2007.  
  2008.  
  2009. ==================================================================
  2010. 7.6  Abruf von Maskeninformationen
  2011. ==================================================================
  2012.  
  2013. Die folgenden Funktionen dienen dem Abruf von 
  2014. Maskeninformaationen. Diese können Verwendung zur 
  2015. Programmierung eigener Hilfsfunktionen finden.
  2016.  
  2017.  
  2018.  
  2019. -------------------------------------------------------
  2020. int w_xyon_field(int mnum,int x,int y)
  2021. function  w_xyon_field(wnum,x,y:integer):integer;
  2022.  
  2023. w_xyon_field gibt an, ob sich die in <x> und <y> angegebenen
  2024. Koordinaten im Bereich eines Feldes der über <wnum> adressierten 
  2025. Maske befindet. Der sinnvolle Wertebereich der Koordinaten liegt im 
  2026. Bereich des 80*25-Textbilschirms, also (1 <= x <= 80) und (1 <= y 
  2027. <= 25).
  2028.  
  2029. Ergebnis
  2030.  
  2031. -1      : Kein entsprechendes Feld vorhanden
  2032. -2      : Die Maskennummer ist fehlerhaft
  2033. sonst   : Feld-Nummer, auf dem die Koordinaten liegen
  2034.  
  2035.  
  2036.  
  2037. -------------------------------------------------------
  2038. int w_xyon_win(int mnum,int x,int y)
  2039. function  w_xyon_win(wnum,x,y:integer):integer;
  2040.  
  2041. w_xyon_win prüft ob die angegebenen Koordinaten im Bereich der 
  2042. mit <wnum> adressierten Maske liegen.
  2043.  
  2044.  
  2045. 1       : Die Koordinaten liegen innerhalb der Maske
  2046. 0       : Die Koordinaten liegen außerhalb
  2047. -1      : Die Maskennummer ist fehlerhaft
  2048.  
  2049.  
  2050.  
  2051.  
  2052. -------------------------------------------------------
  2053. int w_is_wnum(int wnum)
  2054. function  w_is_wnum(wnum:integer):integer;
  2055.  
  2056. w_is_wnum prüft, ob  <wnum> eine gültige Maskennummer ist
  2057.  
  2058. Ergebnis
  2059.  
  2060. 1    : Ist gültig
  2061. 0    : Ist ungültig
  2062.  
  2063.  
  2064.  
  2065. -------------------------------------------------------
  2066. int w_is_field(int wnum,int field)
  2067. function  w_is_field(wnum,field:integer):integer;
  2068.  
  2069. w_is_field prüft, ob <field> eine gültige Feldnummer der Maske 
  2070. <wnum> ist.
  2071.  
  2072. Ergebnis
  2073.  
  2074. 1    : <field> gültig
  2075. 0    : <field> oder <wnum> ist ungültig
  2076.  
  2077.  
  2078.  
  2079. -------------------------------------------------------
  2080. char *w_info_vscreen(int wnum)
  2081. function  w_info_vscreen(wnum:integer):pointer;
  2082.  
  2083. w_info_vscreen liefert einen Zeiger auf das virtuelle Bild einer mit 
  2084. w_load(..,0) geladenen Maske.
  2085.  
  2086. Ergebnis
  2087.  
  2088. NULL  : Maske hat kein virtuelles Bild
  2089. sonst : Zeiger auf das virtuelle Bild
  2090.  
  2091.  
  2092. -------------------------------------------------------
  2093. char *w_info_bscreen(int wnum)
  2094. function  w_info_bscreen(wnum:integer):pointer;
  2095.  
  2096. w_info_bscreen liefert einen Zeiger auf den gesicherten Hintergrund 
  2097. einer geöffneten Maske.
  2098.  
  2099. Ergebnis
  2100.  
  2101. NULL  : Maske nicht geöffnet
  2102. sonst : Zeiger auf den Hintergrund
  2103.  
  2104.  
  2105. -------------------------------------------------------
  2106. int w_info_win_left(int wnum)
  2107. function  w_info_win_left(wnum:integer):integer;
  2108.  
  2109. w_info_win_left liefert die Nummer der ersten zur Maske <wnum> 
  2110. gehörenden Spalte. Die Gültigkeit der Maskennummer <wnum> wird 
  2111. nicht überprüft.
  2112.  
  2113. Ergebnis
  2114.  
  2115. 1 - 80 : Nummer der ersten Spalte
  2116.  
  2117.  
  2118.  
  2119. -------------------------------------------------------
  2120. int w_info_win_right(int wnum)
  2121. function  w_info_win_right(wnum:integer):integer;
  2122.  
  2123. w_info_win_right liefert die Nummer der letzten zur Maske <wnum> 
  2124. gehörenden Spalte. Die Gültigkeit der Maskennummer <wnum> wird 
  2125. nicht überprüft.
  2126.  
  2127. Ergebnis
  2128.  
  2129. 1 - 80 : Nummer der letzten Spalte
  2130.  
  2131.  
  2132.  
  2133. -------------------------------------------------------
  2134. int w_info_win_top(int wnum)
  2135. function  w_info_win_top(wnum:integer):integer;
  2136.  
  2137. w_info_win_top liefert die Nummer der ersten zur Maske <wnum> 
  2138. gehörenden Zeile. Die Gültigkeit der Maskennummer <wnum> wird 
  2139. nicht überprüft.
  2140.  
  2141. Ergebnis
  2142.  
  2143. 1 - 25 : Nummer der ersten Zeile
  2144.  
  2145.  
  2146.  
  2147. -------------------------------------------------------
  2148. int w_info_win_bottom(int wnum)
  2149. function  w_info_win_bottom(wnum:integer):integer;
  2150.  
  2151. w_info_win_bottom liefert die Nummer der letzten zur Maske <wnum> 
  2152. gehörenden Zeile. Die Gültigkeit der Maskennummer <wnum> wird 
  2153. nicht überprüft.
  2154.  
  2155. Ergebnis
  2156.  
  2157. 1 - 25 : Nummer der letzten Zeile
  2158.  
  2159.  
  2160. -------------------------------------------------------
  2161. int w_info_field_num(int wnum)
  2162. function  w_info_field_num(wnum:integer):integer;
  2163.  
  2164. w_info_field_num liefert die Anzahl der Felder der Maske
  2165. <wnum>. Die Gültigkeit der Maskennummer <wnum> wird nicht 
  2166. überprüft.
  2167.  
  2168. Ergebnis
  2169.  
  2170. Anzahl der Felder
  2171.  
  2172.  
  2173.  
  2174. -------------------------------------------------------
  2175. int w_info_field_x(int wnum,int field)
  2176. function  w_info_field_x(wnum,field:integer):integer;
  2177.  
  2178. w_info_field_x liefert die Startspalte des Feldes <field> der Maske 
  2179. <wnum>. Die Gültigkeit der Maskennummer <wnum> und der 
  2180. Feldnummer <field> wird nicht überprüft.
  2181.  
  2182. Ergebnis
  2183.  
  2184. Startspalte des Feldes
  2185.  
  2186.  
  2187.  
  2188. -------------------------------------------------------
  2189. int w_info_field_y(int wnum,int field)
  2190. function  w_info_field_y(wnum,field:integer):integer;
  2191.  
  2192. w_info_field_y liefert die Startzeile des Feldes <field> der Maske 
  2193. <wnum>. Die Gültigkeit der Maskennummer <wnum> und der IO-
  2194. Kanalnummer <field> wird nicht überprüft.
  2195.  
  2196. Ergebnis
  2197.  
  2198. Startzeile des Felds
  2199.  
  2200.  
  2201.  
  2202. -------------------------------------------------------
  2203. int w_info_field_width(int wnum,int field)
  2204. function  w_info_field_width(wnum,field:integer):integer;
  2205.  
  2206. w_info_field_width liefert die Länge des Felds <field> der Maske 
  2207. <wnum>. Die Gültigkeit der Maskennummer <wnum> und der IO-
  2208. Kanalnummer <field> wird nicht überprüft.
  2209.  
  2210. Ergebnis
  2211.  
  2212. Länge des Felds
  2213.  
  2214.  
  2215.  
  2216. -------------------------------------------------------
  2217. int w_info_field_rev_attrib(int wnum,int field)
  2218. function  w_info_field_rev_attrib(wnum,field:integer):integer;
  2219.  
  2220. w_info_field_rev_attrib liefert das Revers-Attribut des Felds <field> 
  2221. der Maske <wnum>. Die Gültigkeit der Maskennummer <wnum> und 
  2222. der Feldnummer <field> wird nicht überprüft.
  2223.  
  2224. Ergebnis
  2225.  
  2226. Revers-Attribut des Felds
  2227.  
  2228.  
  2229. -------------------------------------------------------
  2230. int   w_info_field_out_attrib(int wnum,int fnum);
  2231. function  w_info_field_out_attrib(wnum,fnum:integer):integer;
  2232.  
  2233. Siehe w_info_field_rev_attr ..
  2234.  
  2235. Ergebnis
  2236.  
  2237. Ausgabe-Attribut des Felds
  2238.  
  2239.  
  2240.  
  2241. -------------------------------------------------------
  2242. int   w_info_field_in_attrib(int wnum,int fnum);
  2243. function  w_info_field_in_attrib(wnum,fnum:integer):integer;
  2244.  
  2245. Siehe w_info_field_rev_attr ..
  2246.  
  2247. Ergebnis
  2248.  
  2249. Eingabe-Attribut des Felds
  2250.  
  2251.  
  2252. -------------------------------------------------------
  2253. int   w_info_field_in_right(int wnum,int fnum);
  2254. function  w_info_field_in_right(wnum,fnum:integer):integer;
  2255.  
  2256. Liefert das Eingabe-Format des Feldes
  2257.  
  2258. Ergebnis:
  2259.  
  2260. 0 : linksbündig
  2261. 1 : rechtsbündig
  2262.  
  2263.  
  2264.  
  2265. -------------------------------------------------------
  2266. int   w_info_field_out_right(int wnum,int fnum);
  2267. function  w_info_field_out_right(wnum,fnum:integer):integer;
  2268.  
  2269. Liefert das Ausgabe-Format des Feldes
  2270.  
  2271. Ergebnis:
  2272.  
  2273. 0 : linksbündig
  2274. 1 : rechtsbündig
  2275.  
  2276.  
  2277. -------------------------------------------------------
  2278. int   w_info_field_in_owrite(int wnum,int fnum);
  2279. function  w_info_field_in_owrite(wnum,fnum:integer):integer;
  2280.  
  2281. Liefert den Schreibmodus des Editors für dieses Feld
  2282.  
  2283. Ergebnis:
  2284.  
  2285. 0 : Einfügen
  2286. 1 : Überschreiben
  2287.  
  2288.  
  2289. -------------------------------------------------------
  2290. int   w_info_field_del(int wnum,int fnum);
  2291. function  w_info_field_del(wnum,fnum:integer):integer;
  2292.  
  2293. Sagt aus, ob eine Feld vor einer Aktion immer komplett gelöscht 
  2294. wird.
  2295.  
  2296. Ergebnis:
  2297.  
  2298. 0 : nicht löschen
  2299. 1 : löschen
  2300.  
  2301.  
  2302. -------------------------------------------------------
  2303. int   w_info_field_type(int wnum,int fnum);
  2304. function  w_info_field_type(wnum,fnum:integer):integer;
  2305.  
  2306. Liefert eine Angabe über den Datentyp eines Feldes. Dazu sind 
  2307. folgende Konstanten definiert:
  2308.  
  2309. ISSTRING     0
  2310. ISCHAR       1
  2311. ISBYTE       2
  2312. ISINT        3
  2313. ISWORD       4
  2314. ISLONG       5
  2315. ISDOUBLE     6
  2316. ISDATE       7
  2317. ISTIME       8
  2318. ISDMARK      9
  2319.  
  2320. Ergebnis:
  2321.  
  2322. Datentyp
  2323.  
  2324. -------------------------------------------------------
  2325. void *w_info_field_min(int wnum,int fnum,void *min);
  2326. function  w_info_field_min(wnum,fnum:integer;min:pointer):pointer;
  2327.  
  2328. Liefert die untere Wertebereichsgrenze des Feldes. Der Wert wird 
  2329. an die durch <destin> bezeichnete Stelle des Speichers geschrieben 
  2330. und ist entsprechend des Datentyps des Feldes zu interpretieren .
  2331.  
  2332.  
  2333. -------------------------------------------------------
  2334. void *w_info_field_max(int wnum,int fnum,void *max);
  2335. function  w_info_field_max(wnum,fnum:integer;max:pointer):pointer;
  2336.  
  2337. Liefert die obere Wertebereichsgrenze des Feldes. Der Wert wird an 
  2338. die durch <destin> bezeichnete Stelle des Speichers geschrieben 
  2339. und ist entsprechend des Datentyps des Feldes zu interpretieren .
  2340.  
  2341.  
  2342.  
  2343. ==================================================================
  2344. 7.7  Maus-Routinen
  2345. ==================================================================
  2346.  
  2347. Die folgenden Mausfunktionen interpretieren die Maus als 
  2348. Bestandteil der Tastatur. Vorraussetzung zur Verwendung der 
  2349. folgenden Funktionen ist, daß alle Tastaturabfragen mit der 
  2350. Funktion w_mousekbd ausgeführt werden. Die virtuellen 
  2351. Mauskoordinaten werden intern auf Schirmkoordinaten des 80*25 
  2352. Zeichen-Textschirms umgerechnet.
  2353.  
  2354.  
  2355. -------------------------------------------------------
  2356. int w_mouse_init(void)
  2357. function  w_mouse_init:integer;
  2358.  
  2359. w_mouse_init initialisiert die folgenden w_mouse_.. -Funktionen. 
  2360. Wird w_init verwendet, so kann ein seperater Aufruf von 
  2361. w_mouse_init entfallen.
  2362.  
  2363. Ergebnis
  2364.  
  2365. 1    : Initialisierung konnte erfolgen
  2366. 0    : Maus nicht vorhanden oder fehlerhaft
  2367.  
  2368.  
  2369.  
  2370. -------------------------------------------------------
  2371. int w_mouse_deinit(void)
  2372. function  w_mouse_deinit:integer;
  2373.  
  2374. w_mouse_deinit deinitialisiert die Maus. Sie wird für den Anwender 
  2375. unsichtbar. Um die Maus wieder zu aktivieren, ist w_mouse_init 
  2376. aufzurufen. Auf diesem Wege läßt sich beispielsweise für bestimmte 
  2377. Programmteile die Mausaktivität unterdrücken.
  2378.  
  2379. Ergebnis
  2380.  
  2381. 1    : Deinitialisierung konnte erfolgen
  2382. 0    : Maus war nicht initialisiert
  2383.  
  2384.  
  2385. -------------------------------------------------------
  2386. int w_mouse_exist(void)
  2387. function  w_mouse_exist:integer;
  2388.  
  2389. w_mouse_exist sucht im Speicher des Rechners nach einem 
  2390. geladenen Maustreiber
  2391.  
  2392. Ergebnis
  2393. 1    : Treiber gefunden
  2394. 0    : Kein Treiber gefunden
  2395.  
  2396.  
  2397.  
  2398. -------------------------------------------------------
  2399. void w_mouse_gotoxy(int x,int y)
  2400. procedure w_mouse_gotoxy(x,y:integer);
  2401.  
  2402. w_mouse_gotoxy bewegt den Mauscursor an die durch Spalte <x>
  2403. und Zeile <y> bezeichnete Stelle des 80*25-Zeichen Textbildschirms
  2404.  
  2405.  
  2406.  
  2407. -------------------------------------------------------
  2408. int w_mouse_cur_x(void)
  2409. function  w_mouse_cur_x:integer;
  2410.  
  2411. w_mouse_cur_x liefert die aktuelle (current) x-Koordinate des 
  2412. Mauscursors. Eine Abfrage dieser Funktion ist  sinnvoll, wenn 
  2413. zuvor ein MOUSE_MOVE von w_mousekbd empfangen wurde
  2414.  
  2415. Ergebnis
  2416.  
  2417. Aktuelle x-Koordinate (Spalte)
  2418.  
  2419.  
  2420.  
  2421. -------------------------------------------------------
  2422. int w_mouse_cur_y(void)
  2423. function  w_mouse_cur_y:integer;
  2424.  
  2425. w_mouse_cur_y liefert die aktuelle (current) y-Koordinate des 
  2426. Mauscursors. Eine Abfrage dieser Funktion ist  sinnvoll, wenn 
  2427. zuvor ein MOUSE_MOVE von w_mousekbd empfangen wurde
  2428.  
  2429. Ergebnis
  2430.  
  2431. Aktuelle y-Koordinate (Spalte)
  2432.  
  2433.  
  2434. -------------------------------------------------------
  2435. int w_mouse_pre_x(void)
  2436. function  w_mouse_pre_x:integer;
  2437.  
  2438. w_mouse_pre_x liefert die x-Koordinate des Mauscursors zur Zeit 
  2439. des letzten Tastenniederdrucks. Eine Abfrage dieser Funktion ist 
  2440. z.B. sinnvoll, wenn zuvor ein MOUSE_R_B_P von w_mousekbd 
  2441. empfangen wurde
  2442.  
  2443. Ergebnis
  2444.  
  2445. x-Koordinate während des Tastendrucks
  2446.  
  2447.  
  2448.  
  2449. -------------------------------------------------------
  2450. int w_mouse_pre_y(void)
  2451. function  w_mouse_pre_y:integer;
  2452.  
  2453. w_mouse_pre_y liefert die y-Koordinate des Mauscursors zur Zeit 
  2454. des letzten Tastenniederdrucks. Eine Abfrage dieser Funktion ist 
  2455. z.B. sinnvoll, wenn zuvor ein MOUSE_R_B_P von w_mousekbd 
  2456. empfangen wurde
  2457.  
  2458. Ergebnis
  2459.  
  2460. y-Koordinate während des Tastendrucks
  2461.  
  2462.  
  2463.  
  2464. -------------------------------------------------------
  2465. int w_mouse_rel_x(void)
  2466. function  w_mouse_rel_x:integer;
  2467.  
  2468. w_mouse_pre_x liefert die x-Koordinate des Mauscursors zur Zeit 
  2469. des letzten Tastenhubs. Eine Abfrage dieser Funktion ist z.B. 
  2470. sinnvoll, wenn zuvor ein MOUSE_L_B_R von w_mousekbd empfangen 
  2471. wurde
  2472.  
  2473. Ergebnis
  2474.  
  2475. x-Koordinate während des Tastenhubs
  2476.  
  2477.  
  2478.  
  2479. ------------------------------------------------------
  2480. int w_mouse_rel_y(void)
  2481. function  w_mouse_rel_y:integer;
  2482.  
  2483. w_mouse_pre_y liefert die y-Koordinate des Mauscursors zur Zeit 
  2484. des letzten Tastenhubs. Eine Abfrage dieser Funktion ist z.B. 
  2485. sinnvoll, wenn zuvor ein MOUSE_L_B_R von w_mousekbd empfangen 
  2486. wurde
  2487.  
  2488. Ergebnis
  2489.  
  2490. y-Koordinate während des Tastenhubs
  2491.  
  2492.  
  2493.  
  2494.  
  2495. ==================================================================
  2496. 7.8  Bildschirmroutinen (allgemein)
  2497. ==================================================================
  2498.  
  2499. Über die folgenden Routinen wickeln die bisher beschriebenen 
  2500. Routinen die Bildschirmverwaltung ab. Sie werden vom Anwender im 
  2501. Normalfall nicht benötigt, können aber zur Programmierung einiger 
  2502. Spezialitäten recht nützlich sein.
  2503.  
  2504.  
  2505.  
  2506. -------------------------------------------------------
  2507. void v_init(int bios);
  2508. procedure v_init(bios:integer);
  2509.  
  2510. Initialisiert die Bildschirmroutinen. Der Parameter <bios> legt fest, 
  2511. ob der Bildschirmzugriff direkt auf den Bildspeicher oder über die 
  2512. langsamen BIOS-Routinen erfolgen soll. V_init wird von w_init 
  2513. aufgerufen.
  2514.  
  2515. Parameter
  2516.  
  2517. bios= 0        : Direkter Zugriff;
  2518. bios<>0;       : Bios-Routinen;
  2519.  
  2520.  
  2521. -------------------------------------------------------
  2522. int v_mono(void);
  2523. function v_mono:integer;
  2524.  
  2525. Testet auf Monochrom-Monitor;
  2526.  
  2527. Ergebnis:
  2528.  
  2529. 0 : Color
  2530. 1: Mono
  2531.  
  2532.  
  2533.  
  2534. -------------------------------------------------------
  2535. int  v_getwin (int left, int top, int right, int bottom, void *buffer);
  2536. function  v_getwin(left,top,right,bottom:integer;var buffer):integer;
  2537.  
  2538. v_getwin liest den Inhalt (Text und Attribute !) des mit <left>, 
  2539. <top>, <right> und <bottom> bezeichneten Bildschirmrechtecks und 
  2540. schreibt diesen an die durch <destin> spezifizierte Speicherstelle. 
  2541. Wenn eine Maus installiert ist, so wird der Mauscursor vor dem 
  2542. direkten Bildspeicherzugriff verdeckt und anschließend wieder
  2543. hergestellt. Der unter <destin> verfügbare Speicherplatz muß
  2544. eine Größe von (right-left+1)*(bottom-top+1)*2 Bytes haben. Es wird 
  2545. abwechselnd je ein Bildschirmzeichen und ein Attribut gelesen.
  2546.  
  2547. Ergebnis
  2548.  
  2549. 1    : Fehlerfreie Ausführung
  2550. 0    : Fehler (Koordinaten ausserhalb des Bildschirms)
  2551.  
  2552.  
  2553.  
  2554. -------------------------------------------------------
  2555. int  v_putwin (int left, int top, int right, int bottom, void *buffer);
  2556. function  v_putwin(left,top,right,bottom:integer;var buffer):integer;
  2557.  
  2558. v_putwin beschreibt den durch <left>, <top>, <right>
  2559. und <bottom> bezeichneten Bildschirmausschnitts mit der unter 
  2560. <destin> gespeicherten Bildinformation (Text und Attribute). Wenn 
  2561. eine Maus installiert ist, so wird der Mauscursor vor dem direkten 
  2562. Bildspeicherzugriff verdeckt und anschließend wieder hergestellt. 
  2563. Siehe auch v_getwin.
  2564.  
  2565. Ergebnis
  2566.  
  2567. 1    : Fehlerfreie Ausführung
  2568. 0    : Fehler, z.B. Koordinaten ausserhalb des Bildschirms
  2569.  
  2570.  
  2571.  
  2572.  
  2573. -------------------------------------------------------
  2574. int  v_gettext (int left, int top, int right, int bottom, void *buffer);
  2575. function  v_gettext(left,top,right,bottom:integer;var buffer):integer;
  2576.  
  2577. v_gettext liest den Text des mit <left>, <top>, <right> und <bottom> 
  2578. bezeichneten Bildschirmrechtecks und schreibt diesen an die durch 
  2579. <destin> spezifizierte Speicherstelle. Wenn eine Maus installiert ist, 
  2580. so wird der Mauscursor vor dem direkten Bildspeicherzugriff 
  2581. verdeckt und anschließend wieder hergestellt. Der unter <destin> 
  2582. verfügbare Speicherplatz muß eine Größe von (right-left+1)*(bottom-
  2583. top+1) Bytes haben.
  2584.  
  2585. Ergebnis
  2586.  
  2587. 1    : Fehlerfreie Ausführung
  2588. 0    : Fehler (Koordinaten ausserhalb des Bildschirms)
  2589.  
  2590.  
  2591.  
  2592. -------------------------------------------------------
  2593. int  v_puttext (int left, int top, int right, int bottom, void *buffer);
  2594. function  v_puttext(left,top,right,bottom:integer;var buffer):integer;
  2595.  
  2596. v_puttext beschreibt den durch <left>, <top>, <right>
  2597. und <bottom> bezeichneten Bildschirmausschnitts mit der unter 
  2598. <destin> gespeicherten Textinformation. Wenn eine Maus installiert 
  2599. ist, so wird der Mauscursor vor dem direkten Bildspeicherzugriff 
  2600. verdeckt und anschließend wieder hergestellt. Siehe auch v_gettext.
  2601.  
  2602. Ergebnis
  2603.  
  2604. 1    : Fehlerfreie Ausführung
  2605. 0    : Fehler, z.B. Koordinaten ausserhalb des Bildschirms
  2606.  
  2607.  
  2608.  
  2609. -------------------------------------------------------
  2610. int  v_getattr (int left, int top, int right, int bottom, void *buffer);
  2611. function  v_getattr(left,top,right,bottom:integer;var buffer):integer;
  2612.  
  2613. v_getattr liest die Attribute des mit <left>, <top>, <right> und 
  2614. <bottom> bezeichneten Bildschirmrechtecks und schreibt diese an 
  2615. die durch <destin> spezifizierte Speicherstelle. Wenn eine Maus 
  2616. installiert ist, so wird der Mauscursor vor dem direkten 
  2617. Bildspeicherzugriff verdeckt und anschließend wieder hergestellt. 
  2618. Der unter <destin> verfügbare Speicherplatz muß eine Größe von 
  2619. (right-left+1)*(bottom-top+1) Bytes haben.
  2620.  
  2621. Ergebnis
  2622.  
  2623. 1    : Fehlerfreie Ausführung
  2624. 0    : Fehler (Koordinaten ausserhalb des Bildschirms)
  2625.  
  2626.  
  2627.  
  2628. -------------------------------------------------------
  2629. int  v_putattr (int left, int top, int right, int bottom, void *buffer);
  2630. function  v_putattr(left,top,right,bottom:integer;var buffer):integer;
  2631.  
  2632. v_putattr beschreibt den durch <left>, <top>, <right>
  2633. und <bottom> bezeichneten Bildschirmausschnitts mit den unter 
  2634. <destin> gespeicherten Attributen. Wenn eine Maus installiert ist, so 
  2635. wird der Mauscursor vor dem direkten Bildspeicherzugriff verdeckt 
  2636. und anschließend wieder hergestellt. Siehe auch v_getattr.
  2637.  
  2638. Ergebnis
  2639.  
  2640. 1    : Fehlerfreie Ausführung
  2641. 0    : Fehler, z.B. Koordinaten ausserhalb des Bildschirms
  2642.  
  2643.  
  2644.  
  2645. -------------------------------------------------------
  2646. int  v_movewin(int sx1, int sy1, int sx2, int sy2, int dx1, int dy1);
  2647. function  v_movewin(sx1,sy1,sx2,sy2,dx1,dy1:integer):integer;
  2648.  
  2649. v_movewin verschiebt den Inhalt (Text und Attribute !) des mit 
  2650. <sx1>, <sy1>, <sx2> und <sy2> bezeichneten Bildschirmrechtecks um 
  2651. <dx1> bzw. <dy1>. Wenn eine Maus installiert ist, so wird der 
  2652. Mauscursor vor dem direkten Bildspeicherzugriff verdeckt und 
  2653. anschließend wieder hergestellt.
  2654.  
  2655. Ergebnis
  2656.  
  2657. 1    : Fehlerfreie Ausführung
  2658. 0    : Fehler (Koordinaten ausserhalb des Bildschirms)
  2659.  
  2660.  
  2661.  
  2662. -------------------------------------------------------
  2663. void v_gotoxy(int x, int y);
  2664. procedure v_gotoxy(x,y:integer);
  2665.  
  2666. Der Textcursor wird auf die durch Zeile <y> und Spalte <x> 
  2667. gekennzeichnete Bildschirmposition gesetzt.
  2668.  
  2669. Ergebnis
  2670.  
  2671. 1    : Fehlerfreie Ausführung
  2672. 0    : Fehler (Koordinaten ausserhalb des Bildschirms)
  2673.  
  2674.  
  2675. -------------------------------------------------------
  2676. word v_wherexy(void);
  2677. function  v_wherexy:word;
  2678.  
  2679. Die aktuelle Position des Textcursor wird ermittelt, wobei die Zeile 
  2680. im High-Byte und die Spalte im Low-Byte des Ergebniswortes 
  2681. angegeben wird.
  2682.  
  2683. Ergebnis
  2684.  
  2685. High-Byte : Zeile
  2686. Low -Byte : Spalte
  2687.  
  2688.  
  2689. -------------------------------------------------------
  2690. int  v_wherex(void);
  2691. function  v_wherex:integer;
  2692.  
  2693. Die Spalte der aktuelle Position des Textcursor wird ermittelt.
  2694.  
  2695. Ergebnis
  2696.  
  2697. Spalte des Textcursors
  2698.  
  2699.  
  2700.  
  2701. -------------------------------------------------------
  2702. int  v_wherey(void);
  2703. function  v_wherey:integer;
  2704.  
  2705. Die Zeile der aktuelle Position des Textcursor wird ermittelt.
  2706.  
  2707. Ergebnis
  2708.  
  2709. Zeile des Textcursors
  2710.  
  2711.  
  2712. -------------------------------------------------------
  2713. word v_getcursor(void);
  2714. function  v_getcursor:word;
  2715.  
  2716. Liefert einen dem Aussehen des Cursors entsprechenden Wert. Das 
  2717. High-Byte des Ergebniswortes enthält die Startzeile und das Low-
  2718. Byte die Endzeile des Cursorblocks (in Bildpunkten !).
  2719.  
  2720. Ergebnis
  2721.  
  2722. High-Byte : Startzeile
  2723. Low -Byte : Endzeile
  2724.  
  2725.  
  2726.  
  2727. -------------------------------------------------------
  2728. void v_setcursor(word shape);
  2729. procedure v_setcursor(shape:word);
  2730.  
  2731. Setzt das Aussehen des Textcursors. Das High-Byte von <shape> 
  2732. enthält die Startzeile, das Low-Byte die Endzeile des Cursorblocks 
  2733. (in Bildpunkten !).
  2734.  
  2735.  
  2736. -------------------------------------------------------
  2737. void v_hidecursor(void);
  2738. procedure v_hidecursor;
  2739.  
  2740. Der Textcursor wird dunkel geschaltet.
  2741.  
  2742.  
  2743.  
  2744. -------------------------------------------------------
  2745. void v_showcursor(void);
  2746. procedure v_showcursor;
  2747.  
  2748. Der Textcursor wird auf den ursprünglichen Wert vor dem 
  2749. Verdunkeln durch v_hidecursor gesetzt.
  2750.  
  2751.  
  2752.  
  2753. -------------------------------------------------------
  2754. void v_clrscr(void);
  2755. procedure v_clrscr;
  2756.  
  2757. Der Textbildschirm wird gelöscht.
  2758.  
  2759.  
  2760.  
  2761. ==================================================================
  2762. 7.9 MICROSOFT-MAUS-INTERFACEFUNKTIONEN
  2763. ==================================================================
  2764.  
  2765. Die folgenden 17 Funktionen sind die Grundfunktionen eines 
  2766. Microsoft-kompatiblen Maustreibers. Über die kurze Beschreibung 
  2767. hinausgehende Informationen  entnehmen sie bitte ihrem Maus-
  2768. Handbuch. Es sollte vor Aufruf einer dieser 17 Funktionen 
  2769. sichergestellt sein, daß auch tatsächlich ein Maustreiber geladen 
  2770. wurde.
  2771.  
  2772.  
  2773. -------------------------------------------------------
  2774. int  mouse_init(word *buttons)
  2775. function  mouse_init(var buttons:word):integer;
  2776.  
  2777. mouse_init initialisiert die Soft- und Hardware der Maus, die Anzahl 
  2778. der Mausknöpfe wird in buttons zurückgeliefert.
  2779. Die Maus ist noch unsichtbar und muß mit mouse_show_cursor()
  2780. zur Anzeige gebracht werden.
  2781.  
  2782. Ergebnis
  2783.  
  2784. -1    : Maus betriebsbereit
  2785. 0     : Maus nicht betriebsbereit
  2786.  
  2787.  
  2788.  
  2789. -------------------------------------------------------
  2790. void mouse_show_cursor(void)
  2791. procedure mouse_show_cursor;
  2792.  
  2793. Der interne Cursorzähler wird um 1, jedoch maximal auf 0, erhöht. 
  2794. Hat der interne Cursorzähler den Wert 0, so wird der Mauscursor 
  2795. zur Anzeige gebracht.
  2796.  
  2797.  
  2798.  
  2799. -------------------------------------------------------
  2800. void mouse_hide_cursor(void)
  2801. procedure mouse_hide_cursor;
  2802.  
  2803. Der interne Cursorzähler wird um 1 heruntergezählt, der 
  2804. Mauscursor verschwindet vom Bildschirm. Dies ist sinnvoll, wenn 
  2805. beispielsweise ein direkter Zugriff auf den Bildspeicher erfolgen 
  2806. soll.
  2807.  
  2808.  
  2809.  
  2810. -------------------------------------------------------
  2811. word mouse_get_status(word *buttons,int *xpos,int *ypos)
  2812. function  mouse_get_status(var buttons,xpos,ypos:integer):word;
  2813.  
  2814. mouse_get_status liefert in <*xpos> und <*ypos> die aktuellen 
  2815. Mauskoordinaten, in <*buttons> findet sich Information über die 
  2816. jeweils gedrückten Maustasten.
  2817. Bit 0 entspricht der linken, Bit 1 der rechten und, wenn 
  2818. vorhanden, Bit 2 der mittleren Maustaste.
  2819.  
  2820.  
  2821. Ergebnis
  2822.  
  2823. *buttons
  2824.  
  2825.  
  2826.  
  2827. -------------------------------------------------------
  2828. void mouse_set_pos(int xpos,int ypos)
  2829. procedure mouse_set_pos(xpos,ypos:integer);
  2830.  
  2831. mouse_set_pos setzt den Mauscursor auf die virtuellen 
  2832. Mauskoordinaten xpos und ypos
  2833.  
  2834.  
  2835.  
  2836. -------------------------------------------------------
  2837. word mouse_get_press_status(word button,word *status,int 
  2838.                            *presses,int *xppos,int *yppos)
  2839. function  mouse_get_press_status(button:word;var status,presses 
  2840.                                :word;var xppos,yppos:integer):word;
  2841.  
  2842. mouse_get_press_status liefert die Anzahl der Tastendrücke 
  2843. (presses) der über <buttons> adressierten Maustaste seit dem 
  2844. letzten Aufruf dieser Funktion. In <*xppos> und <*yppos> werden 
  2845. die Cursorkoordinaten während des letzten Tastendrucks 
  2846. übergeben. Das Ergebnis der Funktion liefert ein Bild der aktuell 
  2847. gedrückten Maustasten. Bei der Adressierung der abzufragenden 
  2848. Maustaste ist statt der üblichen Bitzuordnung 0 für Links, 1 für 
  2849. Rechts und 2 für die mittlere Taste anzugeben. Bei dem 
  2850. Funktionsergebnis gilt wieder folgende Zuordnung: Bit 0
  2851. entspricht der linken, Bit 1 der rechten und, wenn vorhanden, Bit 
  2852. 2 der mittleren Maustaste.
  2853.  
  2854. Ergebnis
  2855.  
  2856. Aktuell gedrückte Maustasten
  2857.  
  2858.  
  2859.  
  2860. -------------------------------------------------------
  2861. word mouse_get_release_status(word button,word *status,int
  2862.                              *releases,int *xrpos,int *yrpos)
  2863. function  mouse_get_release_status(button:word;var status,releases
  2864.                              :word;var xrpos,yrpos:integer):word;
  2865.  
  2866. mouse_get_realease_status liefert die Anzahl der Tastenhübe
  2867. (realeases) der über <buttons> adressierten Maustaste seit dem 
  2868. letzten Aufruf dieser Funktion. In <*xrpos> und <*yrpos> werden 
  2869. die Cursorkoordinaten während des letzten Tastendrucks 
  2870. übergeben. Das Ergebnis der Funktion liefert ein Bild der aktuell 
  2871. gedrückten Maustasten. Bei der Adressierung der abzufragenden 
  2872. Maustaste ist statt der üblichen Bitzuordnung 0 für Links, 1 für 
  2873. Rechts und 2 für die mittlere Taste anzugeben. Bei dem 
  2874. Funktionsergebnis gilt wieder folgende Zuordnung: Bit 0 entspricht 
  2875. der linken, Bit 1 der rechten und, wenn vorhanden, Bit 2 der 
  2876. mittleren Maustaste.
  2877.  
  2878. Ergebnis
  2879.  
  2880. Aktuell gedrückte Maustasten
  2881.  
  2882.  
  2883.  
  2884. -------------------------------------------------------
  2885. void mouse_set_xrange(int xmin,int xmax)
  2886. procedure mouse_set_xrange(xmin,xmax:integer);
  2887.  
  2888. mouse_set_xrange schränkt die horizontale Bewegungsfreiheit
  2889. der Maus auf den in <xmin> und <xmax> angegebenen Bereich ein.
  2890.  
  2891.  
  2892.  
  2893. -------------------------------------------------------
  2894. void mouse_set_yrange(int ymin,int ymax)
  2895. procedure mouse_set_yrange(ymin,ymax:integer);
  2896.  
  2897. mouse_set_yrange schränkt die vertikale Bewegungsfreiheit der 
  2898. Maus auf den in <ymin> und <ymax> angegebenen Bereich ein.
  2899.  
  2900.  
  2901.  
  2902. -------------------------------------------------------
  2903. void mouse_def_graphcursorblock(int xhotspot,int yhotspot,word
  2904.                                 cursormaskpointer)
  2905. procedure mouse_def_graphcursorblock(xhotspot,yhotspot:
  2906.                                 integer;cursormaskpointer:word);
  2907.  
  2908. mouse_def_graphcursorblock definiert das Aussehen des 
  2909. Mauscursors im Grafikmode der Bildschirmkarte. Für 
  2910. <cursormaskpointer> ist ein Intrasegmentzeiger (16 Bit)
  2911. auf einen Cursordefinitionblock einzusetzen. Der 
  2912. Cursordefinitionsblock besteht aus einer 16*16 Bit großen 
  2913. Schirmmaske gefolgt von einer 16*16 Bit großen Cursormaske. Die 
  2914. Lage der Mauskoordinate (hot spot) innerhalb eines 16*16 Bit 
  2915. großen Blockes wird mit <xhotspot> und <yhotspot> angegeben, der 
  2916. Wertebereich der Koordinaten liegt jeweils zwischen -16 und +16.
  2917.  
  2918.  
  2919. -------------------------------------------------------
  2920. void mouse_def_textcursor(word cursorselect,word screenmask,word
  2921.                           cursormask)
  2922. procedure mouse_def_textcursor(cursorselect,screenmask,
  2923.                           cursormask:word);
  2924.  
  2925. mouse_def_textcursor definiert das Aussehen des Mauscursors
  2926. im Textmode der Bildschirmkarte. Mit <cursorselect> = 0 wird
  2927. der Softwaretextcursor angewählt, sein Erscheinungsbild wird
  2928. durch <screenmask> und <cursormask> geprägt. Das niederwertige 
  2929. Byte von <screenmask> und <cursormask> bezieht sich auf das 
  2930. Symbol (ASCII-Code) des Cursors, das höherwertige Byte jeweils 
  2931. auf das Attribut. <screenmask> wird mit dem ursprünglichen 
  2932. Bildinhalt einer Und-Verknüpfung unterzogen, also können Teile 
  2933. des ursprünglichen Bildinhaltes ausgeblendet werden. Das Ergebnis 
  2934. dieser Operation wird mit <cursormask> einer Exclusiv-Oder-
  2935. Verküpfung unterzogen, Bits können also negiert oder belassen 
  2936. werde. Mit <cursorselect> = 1 wird der Hardwaretextcursor 
  2937. angewählt. Die Parameter <screenmask> und <cursormask> enthalten 
  2938. nun die erste und letzte Abtastzeile des Cursors. Diese Werte sind 
  2939. von der gewählten Video-Betriebsart abhängig, die Werte liegen 
  2940. zwischen 0 und 7 bei farbiger sowie zwischen 0 und 11 bei 
  2941. monochromer Darstellung.
  2942.  
  2943.  
  2944.  
  2945. -------------------------------------------------------
  2946. void mouse_get_motioncounter(int *xcount,int *ycount)
  2947. procedure mouse_get_motioncounter(var xcount,ycount:integer);
  2948.  
  2949. Mouse_get_motioncounter liefert die Anzahl der ausgeführten
  2950. Mausschritte seit dem letzten Aufruf dieser Funktion. Negative 
  2951. Werte für <*xcount> bzw. <*ycount> entsprechen einer Bewegung 
  2952. nach links bzw. nach oben, positive Werte entsprechen einer 
  2953. Bewegung nach rechts bzw. nach unten.
  2954.  
  2955.  
  2956.  
  2957. -------------------------------------------------------
  2958. void mouse_def_eventhandler(word eventmask,void far *handler())
  2959. procedure mouse_def_eventhandler(eventmask:word;handler:pointer);
  2960.  
  2961. mouse_def_eventhandler ermöglicht das Betreiben einer eigenen 
  2962. Maus-Interrupt-Routine <handler>, welche unter Beachtung der in 
  2963. <eventmask> angegebenen Bedingungen aufgerufen wird.
  2964.  
  2965. Parameter <eventmask>:
  2966.  
  2967. Bit 0  : Mauscursor wurde bewegt
  2968. Bit 1  : Linke Taste wurde gedrückt
  2969. Bit 2  : Linke Taste wurde gehoben
  2970. Bit 3  : Rechte Taste wurde gedrückt
  2971. Bit 4  : Rechte Taste wurde gehoben
  2972. Bit 5  : Mittlere Taste wurde gedrückt
  2973. Bit 6  : Mittlere Taste wurde gehoben
  2974.  
  2975.  
  2976.  
  2977. -------------------------------------------------------
  2978. void mouse_ligthpen_emulation_on(void)
  2979. procedure mouse_ligthpen_emulation_on;
  2980.  
  2981. mouse_ligthpen_emulation_on schaltet die Lightpen-Emulation
  2982. an.
  2983.  
  2984.  
  2985. -------------------------------------------------------
  2986. void mouse_ligthpen_emulation_off(int xpos,int ypos)
  2987. procedure mouse_ligthpen_emulation_off(xpos,ypos:integer);
  2988.  
  2989. mouse_ligthpen_emulation_off schaltet die Lightpen-Emulation
  2990. aus.
  2991.  
  2992.  
  2993.  
  2994. -------------------------------------------------------
  2995. void mouse_set_motion_per_pixel_ratio(int xstep,int ystep)
  2996. procedure mouse_set_motion_per_pixel(xstep,ystep:integer);
  2997.  
  2998. mouse_set_motion_per_pixel_ratio set die Bewegungsfaktoren der 
  2999. Maus in x- und y-Richtung.
  3000.  
  3001.  
  3002. -------------------------------------------------------
  3003. void mouse_conditional_hide_cursor(int left, int right, int top,
  3004.                                    int bottom)
  3005. procedure mouse_conditional_hide_cursor(left,right,top, Bottom: 
  3006.                                    integer);
  3007.  
  3008. void mouse_conditional_hide_cursor erlaubt die definition eines 
  3009. Rechtecks, in dem der Mauscursor nicht sichtbar ist. So kann 
  3010. beispielsweise dieser Bildbereich in direktem Zugriff auf den 
  3011. Bildspeicher verändert werden kann.
  3012.  
  3013.  
  3014.  
  3015.  
  3016. ==================================================================
  3017. 8. ZU DEN BEISPIELPROGRAMMEN
  3018. ==================================================================
  3019.  
  3020. Nähere Information zur Ausführung erster Programmier-Schritte 
  3021. sollten den Programmier-Beispielen entnommem werden. Durch 
  3022. Übersetzung und Variation dieser lassen sich die notwendigen 
  3023. Grundkenntnisse schnell erwerben. Insbesondere das Beispiel 
  3024. MENUE.C (bzw. MENUE.PAS), welches eine Maskendatei zur Anzeige 
  3025. bringt und (wenn vorhanden) ein Menü auf der Maske aktiviert, 
  3026. verdeutlicht mit seinen wenigen Programmzeilen die notwendige 
  3027. Elementarsequenz zur Maskenbehandlung. BEISPIEL.C (bzw. 
  3028. BEISPIEL.EXE) enthält eher komplexere Programmteile.
  3029. LAGER.C zeigt, wie ganze Datensätze mit dem Aufruf nur einer 
  3030. Funktion editiert werden können.
  3031.  
  3032.  
  3033. ==================================================================
  3034. 9. URHEBERRECHTSSCHUTZ-ERKLÄRUNG
  3035. ==================================================================
  3036.  
  3037. ALLE RECHTE:
  3038.  
  3039. Dipl.Ing (FH) Michael Schmiech, Ring 14, 2257 Breklum
  3040.  
  3041. Alle Rechte an diesem Programm liegen bei M.Schmiech.
  3042. Mit dem Erwerb dieses Produkts wird dem Käufer ein einfaches 
  3043. Recht zur Nutzung des Urheberrechts-geschützten Programms 
  3044. eingeräumt. Dieses Recht zur Nutzung bezieht sich ausschließlich 
  3045. darauf, das Produkt auf oder im Zusammenhang mit jeweils einem 
  3046. Computer zu benutzen. Eine weitergehende Nutzung ist dem Käufer 
  3047. nicht gestattet. Der Käufer kann seine Nutzungsrechte am Produkt 
  3048. nicht an einen Dritten übertragen. Das Programm ist ein mit großem 
  3049. Aufwand hergestelltes Qualitätsprodukt. Unerlaubte Kopierung, 
  3050. Vervielfältigung, Verleih oder Vermietung stellt daher einen 
  3051. Diebstahl geistigen Eigentums dar und wird von mir urheber-
  3052. rechtlich verfolgt. Die Veränderung des Programmcodes ist nicht 
  3053. zulässig. Mit dem Kauf des Produkts erkennt der Käufer diese 
  3054. Regelungen zum Schutz des Urheberrechts an.
  3055.  
  3056.  
  3057.  
  3058. ==================================================================
  3059. 10. HAFTUNGSAUSSCHLUß
  3060. ==================================================================
  3061.  
  3062. Bei der Programmerstellung wurde mit großer Sorgfalt vorgegangen. 
  3063. Trotzdem können Fehler nicht vollständig ausgeschlossen werden. 
  3064. Für direkt oder indirekt entstandene Schäden, die aus der Nutzung 
  3065. der Software entstanden sind, kann ich daher keine Haftung 
  3066. übernehmen.
  3067.  
  3068.