home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / delite / delite.doc next >
Text File  |  1992-04-01  |  265KB  |  5,909 lines

  1.  
  2.  
  3.  
  4. deLite-Programmierhandbuch
  5.  
  6. Version 2.0     Juli 1991
  7.  
  8. 1. Auflage      (C) BrainLab 1991
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.                 rarely, rarely comest thou, spirit of delight
  16.                                 (Shelley, 1821)
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.                                - 1 -
  67.  
  68.  
  69. Inhalt
  70.  
  71. 1       Einführung.......................................................4
  72. Eigenschaften von deLite.................................................4
  73. Voraussetzungen..........................................................4
  74. Über dieses Handbuch.....................................................4
  75. Der Aufbau von deLite....................................................5
  76. Die Programmentwicklung mit deLite.......................................5
  77.  
  78. 2       Das deLite-Programmiermodell.....................................6
  79. Botschaften und Ereignisse...............................................6
  80. Callback-Prozeduren......................................................6
  81. Die Anmeldung der Empfangsprozedur.......................................6
  82. Der Botschaftenfluß......................................................7
  83. Interaktive Hilfsfunktionen..............................................8
  84. Die allgemeine Hilfe.....................................................8
  85. Die kontextabhängige Hilfe...............................................8
  86. Menüs und Dialoge........................................................8
  87. Die Maus-Schnittstelle...................................................9
  88. Die Tastatur-Schnittstelle...............................................9
  89. Konventionen der Datei-Benennung........................................10
  90. Die Initialisierungs-Datei..............................................10
  91. Konventionen der Maus- und Tastaturbedienung............................10
  92.  
  93. 3       Die Verwendung von Menüs........................................12
  94. Die Definition von Menüs mit dem Menü-Compiler..........................12
  95. Die Behandlung von Menü-Meldungen.......................................12
  96. Die Modifikation von Menüpunkten........................................13
  97. Menüpunkte mit einer Überprüfungsmarke versehen.........................13
  98. Menüpunkte sperren......................................................13
  99. Ermitteln des Zustandes des Menüpunktes.................................13
  100. Ermitteln des Menütextes................................................14
  101. Austauschen eines Menüpunktes...........................................14
  102.  
  103. 4       Die Dialoge.....................................................15
  104. Objektorientierte Programmierung........................................15
  105. Ein modaler Dialog......................................................15
  106. Welche Dialogelemente gibt es?..........................................18
  107. CheckBox................................................................18
  108. Button..................................................................18
  109. UserButton..............................................................18
  110. RadioButtons............................................................18
  111. RadioButton.............................................................18
  112. SelectBox...............................................................19
  113. ListBox.................................................................19
  114. EditField...............................................................19
  115. Slider..................................................................19
  116. UserRadioButtons........................................................19
  117. UserRadioButton.........................................................20
  118. LabelText...............................................................20
  119. LabelFrame..............................................................20
  120. FileRequester...........................................................20
  121. Die Behandlung von Dialogereignissen....................................21
  122.  
  123. 5       Die Verwendung von Fenstern.....................................22
  124. Von Fenstern, Viewports und Klienten....................................22
  125. Viewports...............................................................22
  126. Fenster.................................................................22
  127. Klienten................................................................22
  128. Der Dispatcher..........................................................23
  129. Die Benutzung von Fenstern..............................................24
  130.  
  131.                                - 2 -
  132.  
  133.  
  134. Dialogfenster...........................................................24
  135. Die Anmeldung weiterer Klienten.........................................25
  136. Nicht-modale Dialoge....................................................26
  137.  
  138. 6       Die graphischen Operationen.....................................29
  139. Elementare Zeichenoperationen...........................................29
  140. Setzen eines Pixels.....................................................29
  141. Zeichnen einer Linie....................................................29
  142. Zeichnen eines Rechtecks................................................29
  143. Zeichnen einer rechteckigen Fläche......................................29
  144. Zeichnen eines Kreises..................................................29
  145. Zeichnen eines Kreissegmentes...........................................29
  146. Verändern des Linienstils...............................................29
  147. Der Grafikcursor........................................................30
  148. Der Standard-Zeichensatz................................................30
  149. Ausgabe eines Textes im Standardzeichensatz.............................30
  150. Ermitteln der Größe eines Zeichens......................................30
  151. Der skalierbare Zeichensatz.............................................31
  152. Zeichenrichtung und Textstyles..........................................31
  153. Weitere Funktionen......................................................31
  154. Zeichnen von Ikonen.....................................................31
  155.  
  156. 7       Die Initialisierungsdatei.......................................33
  157. Aufbau der Initialisierungsdatei........................................33
  158. Systemabschnitte........................................................34
  159. Datentypen der Initialisierungsdatei....................................34
  160. Der Name................................................................34
  161. Der geschützte String...................................................34
  162. Der Longint.............................................................34
  163. Listen in der Initialisierungsdatei.....................................35
  164. Benutzung der Initialisierungsdatei.....................................35
  165. Zugriff auf Namen.......................................................35
  166. Zugriff auf geschützte Strings..........................................36
  167. Zugriff auf Longints....................................................36
  168. Benutzung von Listen....................................................37
  169.  
  170. 8       Die Verwendung von Systemtimern.................................39
  171. Setzen eines Systemtimers...............................................39
  172. Stoppen eines Systemtimers..............................................39
  173.  
  174. 9       Referenz........................................................41
  175.  
  176. 10      Verzeichnis der Objekte.........................................71
  177. Die Objekthierarchie....................................................71
  178. Konventionen............................................................71
  179. Bitkodierte Informationen...............................................71
  180.  
  181. Anhang A Konfigurationsmöglichkeiten....................................85
  182. Der Abschnitt Paths.....................................................85
  183. Der Abschnitt Hardware..................................................85
  184. Der Abschnitt memory....................................................85
  185. Der Abschnitt colors....................................................86
  186.  
  187. Anhang B Fehlermeldungen................................................87
  188.  
  189. Anhang C Kompatibilität zu deLite 1.X-Applikationen.....................91
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.                                - 3 -
  197.  
  198.  
  199. 1 Einführung
  200.  
  201. Eigenschaften von deLite
  202.  
  203. Mit  dem  deLite  Toolkit  für Turbo-Pascal  verleihen  Sie Ihren 
  204. Programmen  ein ansprechendes  Äußeres,  ohne das Rad ein zweites 
  205. Mal  erfinden  zu  müssen.   Unter  deLite  erstellte   Programme 
  206. profitieren von einer Vielzahl nützlicher Eigenschaften: 
  207.  
  208.         -Pulldown-Menüs, die zur Laufzeit modifiziert 
  209.          werden können 
  210.         -Mausbedienung mit Ereignissteuerung 
  211.         -kontextsensitive Hilfsfunktionen 
  212.         -Treiber für eine Vielzahl von Grafikkarten, auch mit 256 Farben 
  213.         -objektorientierte Dialoge 
  214.         -Komfortabler Zugriff auf eine Initialisierungsdatei
  215.  
  216. Der  Preis,  den  Sie für diese  Vorteile  bezahlen,  ist gering: 
  217. deLite  macht  Ihre  Programme  nur  um  etwa  70k  länger;  eine 
  218. intelligente  Speicherverwaltung  sorgt dafür, daß Ihnen auch bei 
  219. einem  Dutzend  sich  überlappender  Fenster  der Arbeitsspeicher 
  220. nicht  knapp  wird.  Das deLite-Programmiermodell  ist leicht  zu 
  221. verstehen  und  orientiert   sich  an  den  Paradigmen   moderner 
  222. Oberflächen wie Microsoft Windows oder OS/2 Presentation Manager. 
  223. Eine Reihe von Beispielprogrammen  erleichtert Ihnen den Einstieg 
  224. in den Umgang mit deLite. 
  225.  
  226. Voraussetzungen 
  227.  
  228. DeLite ist in Turbo-Pascal  6.0 geschrieben  und besteht aus zwei 
  229. Units, die von Ihrem Programm importiert werden müssen. Eine Maus 
  230. ist nicht unbedingt notwendig, aber doch sehr empfehlenswert.  Da 
  231. die  Speicherverwaltung  von  deLite  unter  Umständen  auf  Ihre 
  232. Festplatte    zurückgreifen    muß,    um   Bildschirmausschnitte 
  233. auszulagern,  ist etwa ein MByte freier Speicherplatz  notwendig. 
  234. Noch  besser  ist  es,  wenn  Sie über  EMS verfügen.   Natürlich 
  235. benötigen  Sie einen grafikfähigen  Bildschirmadapter,  um deLite 
  236. verwenden zu können.  Für die Verwendung  der Dialoge sollten Sie 
  237. zumindest    über    Grundkenntnisse    der    objektorientierten 
  238. Programmierung unter Turbo-Pascal 6.0 verfügen. 
  239.  
  240. Über dieses Handbuch 
  241.  
  242. Dieses  Handbuch  informiert  Sie  über  die  Programmierung  mit 
  243. deLite.   Das  zweite  Kapitel  erläutert  in  groben  Zügen  die 
  244. Konzeption  von  deLite  und macht  Sie mit dem zugrundeliegenden 
  245. Programmiermodell  vertraut.  Das  Kapitel  enthält  ein  kleines 
  246. Beispielprogramm.   Im dritten  Kapitel  wird die Erstellung  und 
  247. Benutzung von Menüs erläutert. Hier erfahren Sie, wie Sie mit dem 
  248. Menücompiler  arbeiten  und wie Sie das Aussehen  von Menüpunkten 
  249. ändern können.  Das vierte Kapitel  erläutert  den Umgang mit dem 
  250. Dialogmanager von deLite. Der Dialogmanager erlaubt es Ihnen, aus 
  251. vielen vorhandenen  und ggf.  neu von Ihnen erstellten  Elementen 
  252. beliebige  Dialogfelder  zu erstellen,  über  die  Sie  beliebige 
  253. Interaktionen  mit  dem  Anwender  Ihres  Programmes  realisieren 
  254. können.   Das  fünfte  Kapitel  behandelt   die  Aufteilung   des 
  255. Bildschirms in mehrere Teile, die getrennt verwaltet werden.  Ein 
  256. Beispielprogramm zeigt, wie die Bildschirmaufteilung zur Laufzeit 
  257. geändert  werden  kann.  Außerdem  wird  in  diesem  Kapitel  der 
  258. Mechanismus  der  Botschaftenverteilung  erläutert.  Im  sechsten 
  259. Kapitel erfahren  Sie, welche graphischen  Primitive  Ihnen unter 
  260.  
  261.                                - 4 -
  262.  
  263.  
  264. deLite  zur Verfügung  stehen.   Das sind  elementare  graphische 
  265. Funktionen  wie etwa das Zeichnen  einer  Linie  oder  das Setzen 
  266. eines  Punktes.   Im siebten  Kapitel  wird  der Zugriff  auf die 
  267. Initialisierungsdatei   behandelt.    Die   Initialisierungsdatei 
  268. enthält  die  zur  Konfiguration   Ihres  Programmes   benötigten 
  269. Einstellungen  und wird  von deLite  benutzt,  um den verwendeten 
  270. Grafiktreiber  und  einiges  mehr  zu  spezifizieren.  Das  achte 
  271. Kapitel beschreibt die Verwendung  von Timerevents.   TimerEvents 
  272. sind  ab  deLite   Version   2.0  verfügbar   und  erlauben   die 
  273. Realisierung  von reproduzierbar  zeitabhängigen  Funktionen  auf 
  274. unterschiedlich  schnellen  Rechnern.  Das neunte Kapitel enthält 
  275. eine vollständige  Referenz aller Funktionen  und Prozeduren  von 
  276. deLite.   Dieser  Teil ist alphabetisch  geordnet  und dient  als 
  277. Nachschlagewerk. Alle Funktionen und Prozeduren von deLite werden 
  278. mit ihrer vollständigen Deklaration erläutert. Das zehnte Kapitel 
  279. enthält  eine Liste aller  von deLite  deklarierten  Objekte  und 
  280. ihrer  Methoden.  Hier  finden  Sie  auch  eine  Darstellung  der 
  281. Objekthierarchie. Im Anhang finden Sie neben einem Index Hinweise 
  282. zur Konfiguration  und Installation von deLite.  Anwender älterer 
  283. deLite-Versionen  erfahren  hier, welche  Änderungen  nötig sind, 
  284. damit Ihre Programme unter deLite 2.0 laufen. 
  285.  
  286. Der Aufbau von deLite 
  287.  
  288. Das deLite-Toolkit  besteht aus zwei Units, vielen Grafiktreibern 
  289. und  einigen  Hilfsprogrammen.    Das  Unit  Kernel  enthält  die 
  290. Schnittstelle  zu den dynamisch nachgeladenen Grafiktreibern  und 
  291. stellt   alle   elementaren   Grafikbefehle,    die   sogenannten 
  292. graphischen  Primitive,  zur Verfügung.   Außerdem enthält es die 
  293. Routinen  für den Zugriff auf die Initialisierungsdatei.   Kernel 
  294. und Grafiktreiber  können  als Ersatz  für das Unit Graph und die 
  295. BGI-Treiber  von Borland's Turbo-Pascal  verstanden  werden, auch 
  296. wenn  der Funktionsumfang  nicht  identisch  ist.  Gegenüber  den 
  297. BGI-Treibern  bietet  der  deLite-Kernel  den Vorteil,  in vielen 
  298. Belangen  schneller  zu sein und den Zugriff auf wesentlich  mehr 
  299. Grafiktreiber  zu bieten.  Andere, seltener benötigte  Funktionen 
  300. des Unit Graph werden  Sie bei deLite  nicht finden;  dazu zählen 
  301. zum Beispiel alle Operationen  zum Füllen von Flächen.   Das Unit 
  302. API setzt auf dem Kernel  auf und stellt  eine Fensterverwaltung, 
  303. einen Menümanager  und Dialoge zur Verfügung.   Das API verwendet 
  304. als weitere  Units  eine Speicherverwaltung  und eine  Liste  der 
  305. sprachabhängigen  Zeichenketten.  Das API stellt komplexe, bequem 
  306. anzuwendende Mechanismen für die Maussteuerung und die Verwaltung 
  307. der Fenster  zur Verfügung,  die sich der elementaren  Prozeduren 
  308. des Kernel bedienen.  Kernel-Funktionen,  die ausschließlich  für 
  309. das API von Bedeutung  sind, werden im Referenzteil  im Kapitel 8 
  310. nicht aufgeführt. 
  311.  
  312. Die Programmentwicklung mit deLite 
  313.  
  314. DeLite  verwendet  eine eigene Exit-Prozedur,  die Laufzeitfehler 
  315. des  Programms  abfängt  und  in  den  Textmodus  zurückschaltet. 
  316. Während  der Programmentwicklung  ist es allerdings  praktischer, 
  317. Laufzeitfehler  von  der  integrierten  Entwicklungsumgebung  von 
  318. Turbo-Pascal abfangen zu lassen.  Zu diesem Zweck sollten Sie die 
  319. Prozedur  DebugOn  zu Beginn  Ihres Programms  aufrufen,  die die 
  320. ursprüngliche Exit-Prozedur wieder aktiviert. 
  321.  
  322.  
  323.  
  324.  
  325.  
  326.                                - 5 -
  327.  
  328.  
  329. 2 Das deLite-Programmiermodell 
  330.  
  331. Die Programmierung  unter  deLite  unterscheidet  sich in einigen 
  332. Belangen deutlich von der gewohnten sequentiellen Programmierung. 
  333. Unter einer graphischen  Oberfläche hat der Programmierer  keinen 
  334. direkten  Zugang  mehr zu den Systemressourcen  wie der Maus, der 
  335. Tastatur oder dem Bildschirm.   Besonders  drastisch  wird dieser 
  336. Unterschied  bei der Bearbeitung  von Eingaben.  Botschaften  und 
  337. Ereignisse Anstatt die Eingabegeräte  periodisch abzufragen, wird 
  338. in  einem  ereignisgesteuerten   System  eine  Nachricht  an  die 
  339. Empfangsprozedur   des  Hauptprogramms   gesendet,   sobald  eine 
  340. entsprechende  Aktion des Benutzers  geschehen  ist.  Botschaften 
  341. sind elementar für das Verständnis des deLite Programmiermodells. 
  342. Eine Botschaft  enthält  die Information  über ein Ereignis,  das 
  343. stattgefunden  hat.  Ereignisse  in diesem  Sinne  sind vor allem 
  344. Eingaben  über die Tastatur  oder die Maus, aber auch abstraktere 
  345. Ereignisse   wie  das  Auswählen   eines  Menüpunktes   oder  die 
  346. Aufforderung,   den  Bildschirminhalt   neu  zu  zeichnen.   Eine 
  347. Botschaft   wird   durch   den  varianten   Verbundtyp   EventTyp 
  348. repräsentiert. 
  349.  
  350.         EventTyp = RECORD
  351.                      TimeStamp  : Word;
  352.                      Case Class : EventTypes of
  353.                        TimerEvent  : (
  354.                             ClientID     : Integer;
  355.                             TimerChannel : Integer;
  356.                                      );
  357.                        DialogEvent : (
  358.                             ID,MSG       : integer;
  359.                             DlgAdr       : Pointer;
  360.                                      );
  361.                        Menu         : (MenuItemID : Integer);
  362.                        LeMouse, DoubleClick, MouseUnNormalized,
  363.                        NormKey, AltKey, CtrlKey, FKey,
  364.                        DoRedraw, Terminate, 
  365.                        UserEvent
  366.                        Void        : (
  367.                             Attrib       : CHAR;
  368.                             x,y          : INTEGER;
  369.                                      );
  370.                    End; { Case & Record }
  371.  
  372. Der Aufzählungstyp  Class gibt an, um welche Art von Ereignis  es 
  373. sich handelt.   Dabei  wird grob unterschieden  zwischen  Timer-, 
  374. Dialog- und einer Reihe weiterer Events. 
  375.  
  376. Callback-Prozeduren
  377.  
  378. Um das Hauptprogramm  von einem Ereignis  in Kenntnis  zu setzen, 
  379. wird  dessen  Hauptempfangsprozedur  aufgerufen.   Das  ist  eine 
  380. Prozedur  vom  vordefinierten   Typ  EventReceiveProc,   der  das 
  381. Ereignis  in Form einer Variable  vom Typ Event,  der sogenannten 
  382. Botschaft,  übergeben wird.  Diese Art von Prozeduren  bezeichnet 
  383. man auch als Callback-Prozeduren,  da eine übergeordnete  Instanz 
  384. sie  bei Bedarf  aufruft.   Vorher  allerdings  ist es notwendig, 
  385. dieser   übergeordneten    Instanz,    in   unserem    Fall   dem 
  386. deLite-Toolkit,  den  Namen  der  Callback-Prozedur  mitzuteilen. 
  387. Diesen Vorgang bezeichnet  man als Anmeldung.
  388.  
  389. Die  Anmeldung  der Empfangsprozedur 
  390.  
  391.                                - 6 -
  392.  
  393.  
  394.  
  395. Der komplette Initialisierungsvorgang von deLite wird nach Aufruf 
  396. der Prozedur OpenMainApplication  durchgeführt.   Dieser Prozedur 
  397. werden   drei   Variablen   übergeben,   von   denen   eine   die 
  398. Empfangsprozedur selbst ist. 
  399.  
  400.         TYPE EventReceiveProc = Procedure(MyMessage: EventTyp);
  401.         Function OpenMainApplication(EventHandler: EventReceiveProc;
  402.                                  modus: integer;
  403.                                  Name: NameString): integer;
  404.  
  405. Daneben  wird  der Name des Programms  und in modus  ein Flag für 
  406. einige  optionale  Eigenschaften  übergeben.   Der Name dient als 
  407. Dateiname  zum  Einlesen  der Resourcen  wie der Menüs  oder  der 
  408. Hilfetexte.  Üblicherweise besteht die Empfangsprozedur aus einem 
  409. Case-Konstrukt,    innerhalb   dessen   auf   die   verschiedenen 
  410. Ereignistypen   reagiert   wird.    Allerdings   ist   es   nicht 
  411. erforderlich,  auf alle Ereignisse  wirklich zu reagieren;  viele 
  412. Ereignisse  wie  z.B.  Menüereignisse  können  zunächst  durchaus 
  413. ignoriert   werden   und  erst   zu  einem   späteren   Zeitpunkt 
  414. implementiert  werden.   Auf diese Weise unterstützt  deLite  den 
  415. Top-Down Entwurf Ihres Programms. 
  416.  
  417. Der Botschaftenfluß 
  418.  
  419. Prinzipiell   wäre   es   möglich,   nach   der   Anmeldung   der 
  420. Empfangsprozedur  die Kontrolle  vollständig  an deLite abzugeben 
  421. und  erst  nach   der  Beendigung   des  Programms   wieder   zum 
  422. Hauptprogramm zurückzukehren.   DeLite geht einen anderen Weg, um 
  423. Ihnen  die  Möglichkeit  offenzuhalten,  in  den  Botschaftenfluß 
  424. einzugreifen.  Das wäre z.B.  dann notwendig, wenn Sie den Wunsch 
  425. hätten,   weitere   Ereignisse   zu  generieren,   um  etwa   ein 
  426. rudimentäres Multitasking zu realisieren.  Nach der erfolgreichen 
  427. Ausführung    der   Prozedur    OpenMainApplication    wird   das 
  428. Hauptprogramm   in  eine  Schleife  einsteigen,   die  erst  nach 
  429. Beendigung  des  Programms  wieder  verlassen  wird.   In  dieser 
  430. Schleife   wird  jeweils  mit  GetEvent  ein  Ereignis   aus  der 
  431. Warteschlange  geholt  und  mit  DispatchMessage  dem System  zur 
  432. Weiterverarbeitung   übergeben.    Das  kleine  Beispiel  "hello" 
  433. illustriert diesen Vorgang: 
  434.  
  435.         PROGRAM hello;
  436.         USES Kernel, API;
  437.         VAR  MyEvent           : EventTyp;      
  438.              StillRunning      : boolean;
  439.  
  440.         {$F+ } 
  441.         Procedure HandleMsg(MyMessage: EventTyp); 
  442.         Begin  
  443.           With MyMessage Do    
  444.             Case Class Of      
  445.               Menu    : Case MenuItemID of
  446.                              0  : StillRunning := false;
  447.                              10 : ErrWindow(30,30,'Hello world');
  448.                         End;
  449.             End;
  450.         End;
  451.         {$F- }
  452.  
  453.         Begin  
  454.           StillRunning := true;  
  455.  
  456.                                - 7 -
  457.  
  458.  
  459.           If OpenMainApplication(HandleMsg,APP_NOFONT,'hello') = 0 then
  460.             while StillRunning Do      
  461.               begin        
  462.                GetEvent(MyEvent);        
  463.                DispatchMessage(MyEvent);      
  464.               end;    
  465.           CloseMainApplication;
  466.         End.
  467.  
  468. In  diesem   Beispiel   wird   die   Empfangsprozedur   HandleMsg 
  469. angemeldet.   Der  Parameter  APP_NOFONT  zeigt  an, daß es nicht 
  470. notwendig  ist, einen skalierbaren  Zeichensatz  zur Verfügung zu 
  471. stellen.  Die Menübeschreibung  zu diesem Programm definiert zwei 
  472. Menüpunkte mit den Identifikationsnummern 0 und 10, von denen die 
  473. erste   zum   Beenden   des   Programms   dient.   Die   Prozedur 
  474. DispatchMessage  steuert  den  Fluß  der  Botschaften  durch  das 
  475. System.   Sie entscheidet,  ob die Nachricht  unmittelbar  an die 
  476. Empfangsprozedur  des Hauptprogramms  zu senden ist oder zunächst 
  477. vom Menümanager  zu verarbeiten  ist.   Der Menümanager  ist eine 
  478. Empfangsprozedur  innerhalb von deLite, die für die Menüsteuerung 
  479. zuständig ist.  Sie generiert Meldungen der Klasse Menu, die dann 
  480. über   DispatchMessage   wieder   an  die  Empfangsschleife   des 
  481. Hauptprogramms geschickt werden. 
  482.  
  483. Interaktive Hilfsfunktionen
  484.  
  485. Unter  deLite  stehen  Ihnen  automatisch   zwei  leistungsfähige 
  486. Mechanismen   zur  Hilfestellung   zur  Verfügung.   Neben  einer 
  487. allgemeinen  Hilfsfunktion  mit einem  Index  bietet  deLite  die 
  488. Möglichkeit,    in   Abhängigkeit   vom   Programmzustand    eine 
  489. kontextabhängige Hilfe aufzurufen. 
  490.  
  491. Die allgemeine Hilfe 
  492.  
  493. DeLite fügt automatisch  ganz rechts am Menübalken  einen Eintrag 
  494. "F1=Hilfe" ein.  Wird dieser Menüpunkt ausgewählt,  oder wird die 
  495. Funktionstaste   F1  betätigt,  ohne  daß  ein  Kontext  für  die 
  496. interaktive  Hilfe  erkannt  wird, erscheint  ein Index,  aus dem 
  497. einzelne Stichworte ausgewählt werden können. Diese Hilfsfunktion 
  498. sollte ganz allgemein die Bedienung des Programms erläutern. 
  499.  
  500. Die kontextabhängige Hilfe 
  501.  
  502. Wird  die Taste  F1 betätigt,  wenn ein Menü offen  ist oder  ein 
  503. Dialog  aktiv  ist,  wird  der Name des Menüpunktes  bzw.  ein im 
  504. Dialog definiertes  Stichwort  dazu verwendet,  aus einer zweiten 
  505. Hilfsdatei  einen Text zu suchen und in einem Fenster anzuzeigen. 
  506. Der  Hilfetext   sollte   konkrete   Informationen   zum  jeweils 
  507. ausgewählten Menüpunkt bzw.  zum gerade aktiven Dialog geben.  Es 
  508. ist  möglich,   für  die  Dialoge  auf  diese  Hilfsfunktion   zu 
  509. verzichten.    Die  Hilfetexte  sind  vom  Programm  getrennt  in 
  510. ASCII-Dateien  abgelegt  und können deshalb  leicht  ausgetauscht 
  511. werden, ohne das Programm  neu übersetzen  zu müssen.  Sie nehmen 
  512. keinen  Platz  im Arbeitsspeicher  in Anspruch,  da sie immer nur 
  513. kurzzeitig eingeladen werden. 
  514.  
  515. Menüs und Dialoge 
  516.  
  517. DeLite verfügt über einen leistungsfähigen Menümanager, der Ihnen 
  518. die  Verwaltung  der  Menüsteuerung  vollständig  abnimmt.  Menüs 
  519. werden in einer ASCII-Datei  definiert,  mit dem Menücompiler  in 
  520.  
  521.                                - 8 -
  522.  
  523.  
  524. ein  binäres  Format  konvertiert   und  zur  Laufzeit  dynamisch 
  525. eingeladen.   Menüs können  sowohl  mit der Maus als auch mit der 
  526. Tastatur  bedient  werden;  für  jeden  Eintrag  kann  ein Hotkey 
  527. definiert  werden,  mit dessen  Hilfe die Auswahl  auch ohne Maus 
  528. besonders  schnell erfolgt.  Das Erscheinungsbild  der Menüs kann 
  529. jederzeit verändert werden.  Menüeinträge  können gesperrt werden 
  530. oder mit einer Überprüfungsmarke versehen werden.  Der Name eines 
  531. Eintrags  kann vom Programm  geändert  werden.  Jeder Menüeintrag 
  532. wird bei der Definition mit einer Identifikationsnummer versehen. 
  533. Diese Nummer wird der Empfangsprozedur  mitgeteilt, wenn ein Menü 
  534. ausgewählt wurde, und muß bei jeder Modifikation  des zugehörigen 
  535. Menüpunktes  angegeben  werden.  DeLite verwendet Pulldown-Menüs, 
  536. wie  sie  heute  in  vielen  Programmen  verwendet  werden.   Ein 
  537. Menübalken  ist  stets  sichtbar  und erlaubt  die Auswahl  eines 
  538. Untermenüs,  aus dem dann  der eigentliche  Menüpunkt  ausgewählt 
  539. wird.   Die  Anzahl  der  Einträge  im Menübalken  oder  in einem 
  540. Untermenü  ist  nur  durch  die Größe  des Bildschirms  begrenzt. 
  541. Komplexere Interaktionen werden über Dialoge realisiert.  Dialoge 
  542. bestehen aus beliebig zu kombinierenden graphischen Elementen wie 
  543. Schaltern,  Eingabefeldern,  Listen  und  Schiebereglern.  DeLite 
  544. bietet viele vordefinierte  Dialogelemente  und erlaubt  es Ihnen 
  545. auch, neue Dialogelemente zu definieren. Einzelne Elemente können 
  546. zu Gruppen zusammengefasst  werden und bilden so neue, komplexere 
  547. Dialogelemente,  die  genauso  einfach  wie die Grundelemente  zu 
  548. verwenden sind. 
  549.  
  550. Die Maus-Schnittstelle
  551.  
  552. Da die Maus als asynchrones  Gerät jederzeit bedient werden kann, 
  553. werden  Mausereignisse  in einer  Warteschlange,  der Eventqueue, 
  554. zwischengespeichert, um dann bei Bedarf abgerufen und verarbeitet 
  555. zu werden.  In dieser Warteschlange werden die Mausereignisse  in 
  556. ihrer  ursprünglichen   Form  gespeichert,  das  heißt,  daß  die 
  557. Mauskoordinaten  sich  auf die linke  obere  Ecke des Bildschirms 
  558. beziehen.  Später, nachdem die Mausereignisse von DispatchMessage 
  559. verarbeitet worden sind, werden die Mauskoordinaten normalisiert, 
  560. bevor sie an den Empfänger weitergeleitet  werden.  Das bedeutet, 
  561. daß sich Mausereignisse, wenn sie der Empfangsprozedur  übergeben 
  562. werden,  auf  die  linke  obere  Ecke  des  aktuellen   Viewports 
  563. beziehen.   Unter einem Viewport  versteht man einen rechteckigen 
  564. Bildschirmausschnitt,  auf den sich alle graphischen  Operationen 
  565. beziehen.   Beachten Sie, daß es immer mindestens  zwei Viewports 
  566. gibt:   Der  Menübalken  nimmt  am  oberen  Bildschirmrand  einen 
  567. schmalen Streifen in Anspruch,  während dem Hauptprogramm  in der 
  568. Regel   der  restliche   Teil   des  Bildschirms   gehört.    Die 
  569. Normalisierung der Mauskoordinaten  ist notwendig, damit sich Ihr 
  570. Programm nicht um die Bildschirmaufteilung kümmern muß. 
  571.  
  572. Die Tastatur-Schnittstelle
  573.  
  574. Tastaturereignisse werden wie Mausereignisse in der Warteschlange 
  575. zwischengespeichert.  Da die PC-Tastaturen in der Lage sind, mehr 
  576. als 256 verschiedene  Tastencodes  zu generieren,  werden mehrere 
  577. Klassen von Tastaturereignissen unterschieden. Der Eintrag Attrib 
  578. eines Events enthält  die Taste selbst,  während  Class die Werte 
  579. ALTKEY, CTRLKEY, FKEY oder NORMKEY annehmen kann. Auf diese Weise 
  580. wird unterschieden, ob eine Taste in Verbindung mit ALT oder CTRL 
  581. betätigt  wurde oder ob eine Funktionstaste  gedrückt  wurde.  Zu 
  582. beachten ist, daß die ENTER-Taste in die Klasse CTRLKEY fällt. In 
  583. vielen Fällen wird es nicht nötig sein, auf Tastaturereignisse zu 
  584. reagieren. Tastaturereignisse, die sich auf die Menüs oder aktive 
  585.  
  586.                                - 9 -
  587.  
  588.  
  589. Dialoge   beziehen,   werden   vom  System   automatisch   selbst 
  590. verarbeitet. 
  591.  
  592. Konventionen der Datei-Benennung
  593.  
  594. Unter deLite gelten eine Reihe von Konventionen für die Benennung 
  595. der Dateien,  an die Sie sich  halten  müssen,  wenn Ihr Programm 
  596. funktionieren  soll.  Eine lauffähige Anwendung besteht neben der 
  597. ausführbaren EXE-Datei noch aus mindestens fünf weiteren Dateien: 
  598. Die  Initialisierungsdatei   enthält   Informationen   über   die 
  599. verwendete Grafikkarte und einiges mehr und hat die Endung ".ini" 
  600. Die Menübeschreibung  in kompilierter Form befindet sich in einer 
  601. Datei mit der Endung ".rsc"  Die allgemeine  Hilfetexte  befinden 
  602. sich in einer Datei mit der Endung  ".hlp"  Die kontextabhängigen 
  603. Hilfetexte   befindet   sich  in  einer   Datei   mit  dem  Namen 
  604. "online.hlp" Der Grafiktreiber  trägt die Endung ".vdi".  Er muss 
  605. sich allerdings nicht im gleichen Verzeichnis wie das ausführbare 
  606. Programm befinden.  Daneben können noch skalierbare  Zeichensätze 
  607. vorhanden  sein, die die Dateiendung  ".fnt" tragen.  Sollten Sie 
  608. über die Bedeutung  einer Datei im unklaren  sein, können Sie sie 
  609. einfach  mit  dem  DOS-Befehl  TYPE  ansehen.   Alle  vom  System 
  610. verwendeten binären Dateien tragen einen druckbaren Vorspann, der 
  611. weitere Informationen gibt. 
  612.  
  613. Die Initialisierungs-Datei
  614.  
  615. Die   Initialisierungsdatei   enthält   die   Informationen   zur 
  616. Konfiguration  Ihres Programmes.   Sie ist in einzelne Abschnitte 
  617. unterteilt,  deren Titel jeweils in eckigen Klammern  geschrieben 
  618. ist.  Einige Abschnitte sind bereits vom System belegt und dienen 
  619. der   Konfiguration   des   Grafiktreibers,    der   skalierbaren 
  620. Zeichensätze,  der  Farben  und der Speicherverwaltung.   Darüber 
  621. hinaus  können  Sie  eigene  Abschnitte  hinzufügen  und in Ihrem 
  622. Programm verwenden;  deLite stellt einen Satz von Prozeduren  zur 
  623. Verfügung,   die  den  Zugriff  auf  die  Informationen   in  der 
  624. Initialisierungsdatei   ermöglichen.    Beachten   Sie,  daß  das 
  625. Vorhandensein  einiger Einträge notwendig ist, um Ihr Programm zu 
  626. starten.   Ohne  die Angabe  des Videotreibers  wird die Prozedur 
  627. OpenMainApplication einen Fehler zurückliefern.  Andere Einträge, 
  628. wie etwa die Farbzuordnung, sind fakultativ und werden vom System 
  629. durch  Standardwerte   ersetzt,   falls  keine  Angaben   in  der 
  630. Initialisierungsdatei      gemacht      werden.       Da      die 
  631. Initialisierungsdatei  im ASCII-Format  abgelegt  ist,  kann  sie 
  632. leicht mit einem herkömmlichen Texteditor modifiziert werden. Wir 
  633. empfehlen,  von  dieser  Möglichkeit  der Konfiguration  in Ihrem 
  634. Programm Gebrauch zu machen. 
  635.  
  636. Konventionen der Maus- und Tastaturbedienung
  637.  
  638. Bei der Definition  der Bedienung der Menüs und der Dialoge haben 
  639. wir eine Reihe von Konventionen  aufgestellt, die sich an gängige 
  640. Standards anlehnen.  -Die linke Maustaste wählt Elemente aus -Die 
  641. rechte   Maustaste   schliesst   das  gerade  offene   Menü  -Die 
  642. ESCAPE-Taste  schließt offene Menüs oder Dialoge -Die ENTER-Taste 
  643. wählt markierte  Elemente aus Die Einträge  im Menübalken  können 
  644. über  die  Tastatur  erreicht  werden,  indem  die  ALT-Taste  in 
  645. Verbindung  mit dem jeweiligen Hotkey betätigt wird Innerhalb der 
  646. Menüs  kann  die Menümarkierung  mit den Cursortasten  verschoben 
  647. werden  Die  Funktionstaste  F1 aktiviert  die Hilfefunktion  Wir 
  648. empfehlen, diese Konventionen  auch bei der Programmierung  Ihrer 
  649. eigenen Programmteile zu beachten.  Insbesondere die Belegung der 
  650.  
  651.                                - 10 -
  652.  
  653.  
  654. Maustasten und die Verwendung der ESCAPE/ENTER-Tasten sollte auch 
  655. von Ihnen in dieser Form eingehalten werden. 
  656.  
  657.  
  658.  
  659.  
  660.  
  661.  
  662.  
  663.  
  664.  
  665.  
  666.  
  667.  
  668.  
  669.  
  670.  
  671.  
  672.  
  673.  
  674.  
  675.  
  676.  
  677.  
  678.  
  679.  
  680.  
  681.  
  682.  
  683.  
  684.  
  685.  
  686.  
  687.  
  688.  
  689.  
  690.  
  691.  
  692.  
  693.  
  694.  
  695.  
  696.  
  697.  
  698.  
  699.  
  700.  
  701.  
  702.  
  703.  
  704.  
  705.  
  706.  
  707.  
  708.  
  709.  
  710.  
  711.  
  712.  
  713.  
  714.  
  715.  
  716.                                - 11 -
  717.  
  718.  
  719. 3 Die Verwendung von Menüs
  720.  
  721. Die Definition von Menüs mit dem Menü-Compiler 
  722.  
  723. Der  erste  Schritt  bei  der  Definition  eines  Menüs  ist  die 
  724. Erstellung  einer  Menübeschreibung  mit Hilfe eines Texteditors. 
  725. Sie können dafür den Editor  von Turbo-Pascal  verwenden.   Diese 
  726. Menübeschreibung  wird anschließend mit dem Menücompiler  in eine 
  727. binäre  Form übersetzt.   Die dabei entstehende  Datei  trägt die 
  728. Endung ".rsc". Die Syntax der Menübeschreibungssprache lehnt sich 
  729. an  den  Ressource-Compiler   für  Microsoft  Windows  an.   Eine 
  730. Menübeschreibung beginnt mit dem Schlüsselwort MENU, dem der Name 
  731. der zu erzeugenden  Datei  folgt.   Dieser  Name  entspricht  dem 
  732. Projektnamen,    der    OpenMainApplication    übergeben    wird. 
  733. Anschließend  folgt eine Anzahl von Untermenübeschreibungen,  die 
  734. jeweils   mit   dem   Schlüsselwort   POPUP   beginnen   und   in 
  735. BEGIN/END-Konstrukten   eine  Aufzählung  der  Menüeinträge   mit 
  736. MENUITEM enthalten.  Jeder Menübeschreibung und jedem Menüeintrag 
  737. müssen drei Argumente folgen:  Der in doppelten Anführungszeichen 
  738. geklammerte  Text enthält das Stichwort;  danach folgt der Hotkey 
  739. und die Identifikationsnummer. Im Stichwort sollte dem Hotkey ein 
  740. Ampersand-Symbol   (kaufmännisches   Und)   vorausgehen,   um  zu 
  741. kennzeichnen,    daß   der   folgende   Buchstabe   unterstrichen 
  742. dargestellt  werden soll.  Innerhalb  der Untermenübeschreibungen 
  743. können     Separatorlinien      zur     optischen      Abgrenzung 
  744. zusammengehörender  Gruppen von Menüeinträgen  eingefügt  werden. 
  745. Optional     kann     den     MENUITEM-Einträgen     nach     der 
  746. Identifikationsnummer  das Schlüsselwort  INACTIVE  oder  CHECKED 
  747. folgen, um anzuzeigen,  daß der entsprechende  Menüpunkt  inaktiv 
  748. oder   mit   einer   Überprüfungsmarke   versehen   ist.    Beide 
  749. Schlüsselworte  können auch kombiniert werden.  Beachten Sie, daß 
  750. MENUITEM-Zeilen  mit  einem  Semikolon  enden  müssen.  Nach  dem 
  751. letzten  POPUP-Block  muß  ein abschliessendes  END stehen.   Ein 
  752. Beispiel    zeigt   die   Menübeschreibung    für   das   "hello, 
  753. world"-Programm aus dem zweiten Kapitel. 
  754.  
  755.         MENU hello
  756.         POPUP "&Hello" H 100 
  757.         BEGIN  
  758.           MENUITEM "&Hi there!" H 101;
  759.           MENUITEM "SEPARATOR"
  760.           MENUITEM "&Goodbye" G 0; 
  761.         END 
  762.         END
  763.  
  764. Übersetzt wird die Menübeschreibung  unter Angabe des Dateinamens 
  765. als Kommandozeilenparameter. In den Beispielprogrammen enden alle 
  766. Menübeschreibungen mit ".rc", hier wäre also mit compile hello.rc 
  767. die  Übersetzung   vorzunehmen.    Der  Menücompiler   wird   bei 
  768. erfolgreicher  Übersetzung  die Meldung OK ausgeben, anderenfalls 
  769. weist er unter Angabe der Zeilennummer auf den Fehler hin. 
  770.  
  771. Die Behandlung von Menü-Meldungen
  772.  
  773. Die    Behandlung    von   Menümeldungen    geschieht    in   der 
  774. Empfangsprozedur des Hauptprogrammes.  Menümeldungen besitzen die 
  775. Klasse Menu und enthalten im Element MenuItemID der Botschaft vom 
  776. Typ   EventTyp   die   Identifikationsnummer   des  dazugehörigen 
  777. Menüeintrages.   Eine  Meldung  wird erst dann abgeschickt,  wenn 
  778. wirklich  ein Menüpunkt  ausgewählt  worden ist, das Öffnen eines 
  779. Menüs  und  anschließende   Verlassen   oder  die  Benutzung  der 
  780.  
  781.                                - 12 -
  782.  
  783.  
  784. interaktiven Hilfe zieht keine Meldung an das Hauptprogramm  nach 
  785. sich.    Üblicherweise   wird  die  Empfangsprozedur   aus  einem 
  786. Case-Konstrukt bestehen, dessen Selektoren wieder Case-Konstrukte 
  787. sind. Es ist empfehlenswert, die einzelnen Identifikationsnummern 
  788. der Menüpunkte nicht direkt als Selektoren  zu verwenden, sondern 
  789. zu Beginn  als Konstante  zu deklarieren,  um symbolisch  auf die 
  790. Menüpunkte   zugreifen   zu  können.   Anderenfalls   leidet  bei 
  791. umfangreichen Menübäumen die Lesbarkeit des Quelltextes. 
  792.  
  793. Die Modifikation von Menüpunkten
  794.  
  795. Zur Modifikation des Aussehens von Menüpunkten existiert ein Satz 
  796. von Prozeduren und eine vordefinierte  Liste von Konstanten.  Der 
  797. Zugriff  auf die Menüpunkte  geschieht  nicht  über ihren  Namen, 
  798. sondern  grundsätzlich  über  die  Identifikationsnummer.  DeLite 
  799. besitzt  die Fähigkeit,  mehrere Menübäume  verwalten  zu können, 
  800. daher muß zusätzlich ein Handle auf das betroffene Menü übergeben 
  801. werden. Das Handle auf das Menü ist nichts anderes als ein Zeiger 
  802. auf  die Wurzel  des Menübaums,  für den ein spezieller  Datentyp 
  803. definiert   wurde.    Das  Handle  auf  das  Hauptmenü   ist  dem 
  804. Hauptprogramm  zunächst  nicht  bekannt,  es  muß  erst  mit  der 
  805. Funktion GetMenu erzeugt werden. 
  806.  
  807. Menüpunkte mit einer Überprüfungsmarke versehen
  808.  
  809. Die   Prozedur    CheckMenuItem    setzt   oder   entfernt    die 
  810. Überprüfungsmarke vor dem Menüeintrag.  Die Überprüfungsmarke ist 
  811. als Häkchen links neben dem Menüeintrag sichtbar. 
  812.  
  813.         Procedure CheckMenuItem(Menu:   hmenu;
  814.                                 ID:     MenuID;
  815.                                 wCheck: MenuFlags);
  816. Die Variable wCheck kann einen der folgenden Werte annehmen:
  817. MF_CHECKED                      setzt die Überprüfungsmarke
  818. MF_UNCHECKED                    entfernt die Überprüfungsmarke
  819.  
  820. Menüpunkte sperren
  821.  
  822. Die Prozedur EnableMenuItem  sperrt einen Menüpunkt oder gibt ihn 
  823. frei.  Gesperrte  Menüpunkte  werden grau dargestellt  und können 
  824. nicht ausgewählt  werden.   Die Hilfsfunktion  bleibt  allerdings 
  825. weiterhin funktionsfähig. 
  826.  
  827.         Procedure EnableMenuItem(Menu:    hmenu;
  828.                                  ID:      MenuID;
  829.                                  wEnable: MenuFlags);
  830. Die Variable wEnable kann einen der folgenden Werte annehmen:
  831. MF_ENABLED                      erlaubt die Auswahl des Menüpunktes
  832. MF_DISABLED                     sperrt den Menüpunkt
  833.  
  834. Ermitteln des Zustandes des Menüpunktes
  835.  
  836. Mit  Hilfe  der  Funktion  GetMenuFlags  kann  der Zustand  eines 
  837. Menüpunktes  erfragt werden.  Der Zustand ist bitkodiert  und muß 
  838. deshalb   durch   UND-Verknüpfung   mit   den   zu   ermittelnden 
  839. Zustandsflags ermittelt werden. 
  840.  
  841.         Function GetMenuFlags(Menu: hMenu;           
  842.                               ID  : MenuID):MenuFlags;
  843.   
  844.         If GetMenuFlags(GetMenu,101) and MF_CHECKED = MF_CHECKED then ...
  845.  
  846.                                - 13 -
  847.  
  848.  
  849.  
  850.  
  851. Ermitteln des Menütextes
  852.  
  853. Die Prozedur  GetMenuString  belegt  eine Stringvariable  mit dem 
  854. Text eines Menüpunktes.   Diese Prozedur ist nützlich, um vor dem 
  855. Ersetzen eines Menüpunktes den alten Eintrag zu retten. 
  856.  
  857.         Procedure GetMenuString(Menu: hmenu;
  858.                                 ID:   MenuID;
  859.                                 Var   StrPtr: String);
  860.  
  861. Austauschen eines Menüpunktes
  862.  
  863. Die Prozedur ReplaceMenuItem  ersetzt einen Menüpunkt durch einen 
  864. anderen.  Dazu sind neben dem Text die Identifikationsnummer  und 
  865. der Hotkey des neuen Menüpunktes anzugeben. 
  866.  
  867.         Procedure ReplaceMenuItem(Menu     :hMenu;
  868.                                   ID       :MenuID;
  869.                                   NewItem  : String;
  870.                                   IDNewItem:MenuID;
  871.                                   NewHotKey:char);
  872.  
  873.  
  874.  
  875.  
  876.  
  877.  
  878.  
  879.  
  880.  
  881.  
  882.  
  883.  
  884.  
  885.  
  886.  
  887.  
  888.  
  889.  
  890.  
  891.  
  892.  
  893.  
  894.  
  895.  
  896.  
  897.  
  898.  
  899.  
  900.  
  901.  
  902.  
  903.  
  904.  
  905.  
  906.  
  907.  
  908.  
  909.  
  910.  
  911.                                - 14 -
  912.  
  913.  
  914. 4 Dialoge
  915.  
  916. Dialoge  sind neben den Menüs  die wichtigste  Möglichkeit  unter 
  917. deLite, mit dem Anwender eines Programmes zu kommunizieren.   Ein 
  918. Dialog   ist  eigentlich   eine   aus  mehreren   Dialogelementen 
  919. zusammengesetzte Eingabemaske.  Eine Vielzahl von Dialogelementen 
  920. wird von deLite bereits zur Verfügung gestellt,  dazu zählen z.B. 
  921. Schalter, Texteingabefelder  und Schieberegler.   Die vorhandenen 
  922. Dialogelemente  können modifiziert werden, weitere Dialogelemente 
  923. können  definiert  werden,  und Dialogelemente  können zu Gruppen 
  924. zusammengefasst    werden,    die   dann   als   neue,   komplexe 
  925. Dialogelemente  eingesetzt  werden  können.   Normalerweise  sind 
  926. Dialoge modal, das heißt, während ein Dialog aktiv ist, erhält er 
  927. alle  Ereignisse  und  läßt  Ereignisse   für  andere  Teile  des 
  928. Programmes unberücksichtigt.   Solange ein Dialog offen ist, wird 
  929. es also  in der  Regel  nicht  möglich  sein,  die  Menüzeile  zu 
  930. aktivieren.   In Verbindung mit Klienten (die im nächsten Kapitel 
  931. behandelt  werden) ist es allerdings  auch möglich,  nicht-modale 
  932. Dialoge  zu erzeugen.   Auf diese  Weise  kann zum Beispiel  eine 
  933. Schalterleiste implementiert werden, die einen Streifen am linken 
  934. oder rechten Bildrand  einnimmt  und darauf mehrere Schalter  zur 
  935. Verfügung stellt. 
  936.  
  937. Objektorientierte Programmierung
  938.  
  939. Dialoge und Dialogelemente  sind als Objekte deklariert.  Sollten 
  940. Sie mit der objektorientierten Programmierung noch nicht vertraut 
  941. sein,  empfehlen  wir,  das Kapitel  I im Buch "Objektorientierte 
  942. Programmierung   und   Turbo-Vision"   Ihrer   Dokumentation   zu 
  943. Turbo-Pascal  zu lesen.  Für den Anfang genügt es, zu wissen, daß 
  944. ein Objekt nichts anderes als ein Record ist, der neben Variablen 
  945. auch  Prozeduren  und  Funktionen,   die  sogenannten   Methoden, 
  946. enthält.    Innerhalb   dieser  Methoden   sind  alle  im  Objekt 
  947. deklarierten  Variablen  und anderen Methoden sichtbar, als hätte 
  948. man eine WITH-Anweisung  verwendet.   Objekte  können von anderen 
  949. Objekten abgeleitet  werden und so eine Objekthierarchie  bilden. 
  950. Abgeleitete   Objekte   erben   dabei   alle  Eigenschaften   des 
  951. ursprünglichen   Objektes,   besitzen  also  alle  Variablen  und 
  952. Methoden, die auch im usprünglichen Objekt deklariert wurden. Das 
  953. abgeleitete Objekt deklariert nur die Methoden und Variablen, die 
  954. entweder zu den geerbten hinzukommen oder aber modifiziert werden 
  955. müssen.    Letzteres    wird    als    Polymorphie    bezeichnet: 
  956. Unterschiedliche  Objekte verwenden für ähnliche Aufgaben gleiche 
  957. Bezeichner,  und  Turbo-Pascal  wählt  automatisch  die  korrekte 
  958. Methode.   So besitzt jedes Dialogelement  von deLite eine eigene 
  959. Methode  mit dem Namen  Draw, die das Element  auf dem Bildschirm 
  960. zeichnet.   Der Dialogmanager  muß sich nicht darum kümmern,  mit 
  961. welchem  Typ von Objekt  er es zu tun hat; ein Aufruf der Methode 
  962. Draw wird stets die gewünschte  Methode aufrufen.  Vererbung  und 
  963. Polymorphie  können  Sie  sich  zunutze  machen,  wenn  Sie  neue 
  964. Dialogelemente kreieren möchten.  Leiten Sie Ihr neues Objekt von 
  965. dem  Dialogelement  ab,  das  mit Ihrem  Wunschobjekt  die meiste 
  966. Ähnlichkeit hat, und deklarieren Sie die eine oder andere Methode 
  967. neu.  Damit  überschreiben  Sie  die  gleichnamigen  Methoden  im 
  968. Ursprungsobjekt,   und  schon   verfügen   Sie  über   ein  neues 
  969. Dialogelement. 
  970.  
  971. Ein modaler Dialog
  972.  
  973. Nichts ist so anschaulich  wie ein Beispiel:  Die Abbildung zeigt 
  974. einen modalen  Dialog, der zur Eingabe  eines Dateinamens  dienen 
  975.  
  976.                                - 15 -
  977.  
  978.  
  979. soll.   Er besteht  aus zwei Knöpfen,  einem Texteingabefeld  und 
  980. einer   Überprüfungsbox.    Außerdem   enthält   er   noch   eine 
  981. Beschriftung.   Der Anwender  kann den Dateinamen  im Editierfeld 
  982. eingeben, auf Wunsch die Überprüfungsbox Read Only anklicken, und 
  983. bestätigt  seine  Eingaben  durch  die  Betätigung   des  mit  OK 
  984. beschrifteten Schaltknopfes.  Betätigt er alternativ dazu den mit 
  985. Abbruch  beschrifteten  Knopf, wird der Dialog beendet  und seine 
  986. Eingaben werden verworfen. 
  987.  
  988.  
  989. Der  Programmcode  zur Erzeugung  und Bedienung  dieses  Dialoges 
  990. besteht aus zwei Prozeduren. Die Prozedur DlgEventHandler ist die 
  991. Botschaftenempfangsprozedur,  die  alle  Meldungen  des  Dialoges 
  992. entgegennimmt.   Sie  muß  wie alle  Callback-Prozeduren  mit der 
  993. FAR-Direktive  übersetzt  werden und wird in der ersten Anweisung 
  994. der Funktion GetFileName angemeldet.  Jedes Dialogelement erzeugt 
  995. Botschaften,  wenn es betätigt  wird:   Ein Knopf meldet,  daß er 
  996. gedrückt wurde; ein Dialogfeld  meldet, daß sein Inhalt verändert 
  997. wurde.  Nicht immer muß jede Meldung beachtet werden:  In unserem 
  998. Beispiel  wird  nur  auf  die  Meldungen  DLG_OK  und  DLG_CANCEL 
  999. geachtet,   die   von  den  beiden   Knöpfen   gesendet   werden. 
  1000. Dialogelemente  merken sich ihren Zustand  bis zum Schließen  des 
  1001. Dialoges, so daß es oft genügt, kurz vor Beendigung  des Dialoges 
  1002. den Zustand der Elemente zu erfragen. 
  1003.  
  1004. procedure DlgEventHandler(TheEvent: EventTyp); far;
  1005. var MYDLG: PDLG;
  1006. begin
  1007.   MYDLG := TheEvent.DlgAdr;
  1008.   If TheEvent.Class = DialogEvent then
  1009.     Case TheEvent.MSG of
  1010.       DLG_OK     :  MYDLG^.DestroyDialog;
  1011.       DLG_CANCEL :  begin
  1012.                       MYDLG^.flags := MYDLG^.flags or MF_CANCELLED;
  1013.                       MYDLG^.DestroyDialog;
  1014.                     end;
  1015.       end;
  1016. end;
  1017.  
  1018. Die Prozedur  DlgEventHandler  reagiert  auf die beiden Meldungen 
  1019. DLG_OK  und DLG_CANCEL  in ähnlicher  Weise.   In jedem Fall wird 
  1020. durch einen Aufruf  von DestroyDialog  der Dialog  beendet.   Der 
  1021. Schaltknopf  mit der Aufschrift Abbruch sendet bei Betätigung die 
  1022. Nachricht  DLG_CANCEL,  in diesem  Fall wird zusätzlich  das Flag 
  1023. MF_CANCELLED  im Dialog  gesetzt,  damit  der Dialog  feststellen 
  1024. kann, daß er abgebrochen  wurde.  Beachten Sie, daß die Botschaft 
  1025. vom Typ EventTyp  ein Feld  mit der Bezeichnung  DlgAdr  enthält. 
  1026. Dieses  Feld  enthält  einen  Zeiger  auf den Dialog.   So ist es 
  1027. möglich, innerhalb  einer Botschaftenempfangsprozedur  bequem auf 
  1028. Methoden und Variablen des betroffenen Dialoges zuzugreifen,  und 
  1029. zudem kann so eine Empfangsprozedur  für viele Dialoge  verwendet 
  1030. werden.       Tatsächlich       deklariert       deLite      eine 
  1031. Botschaftenempfangsprozedur mit der Bezeichnung DefEventProc, die 
  1032. exakt   der  Prozedur   DlgEventHandler   aus  unserem   Beispiel 
  1033. entspricht  und  die daher  hätte  verwendet  werden  können. Die 
  1034. Funktion  GetFileName  ist die eigentliche  Dialogprozedur.   Sie 
  1035. liefert  als  unmittelbares  Ergebnis  TRUE  zurück,  sofern  der 
  1036. Anwender den Dialog mit OK beendet hat.  In diesem Fall enthalten 
  1037. die   Variablenparameter   name   und  readonly   die  im  Dialog 
  1038. ausgewählten  Werte.  Die Variable  MyDialog ist eine Instanz des 
  1039. Objektes   Dialog.   Dazu  wird  für  jede  Art  von  verwendetem 
  1040.  
  1041.                                - 16 -
  1042.  
  1043.  
  1044. Dialogelement  ein  Zeiger  deklariert.   Hier  lernen  Sie  eine 
  1045. Konvention  von deLite kennen:   Die Bezeichner  von Zeigern  auf 
  1046. Dialogelemente  bestehen  aus dem Namen  des Dialogelementes  und 
  1047. einem  vorangestellten  P.  Ein  Zeiger  auf ein Objekt  vom  Typ 
  1048. Checkbox  ist  demnach  vom Typ PCheckBox.   Die erste  Anweisung 
  1049. MyDialog.Init  initialisiert  ein Dialogfenster der Größe 300x100 
  1050. Pixel  und ordnet  ihm die Empfangsprozedur  DlgEventHandler  zu. 
  1051. Anschließend   werden   nacheinander   Dialogelemente   vom   Typ 
  1052. LabelText,  EditField,  CheckBox  und  zwei  mal Button  erzeugt, 
  1053. initialisiert und jeweils mit AddItem dem Dialog hinzugefügt. Die 
  1054. new-Anweisungen  enthalten jeweils Konstruktoraufrufe,  die unter 
  1055. deLite  stets  Init  heißen  und  für  jedes  Dialogelement   die 
  1056. Koordinaten, eine ID-Nummer und ggf. weitere Parameter enthalten. 
  1057. Die   beiden   Schaltknöpfe   zeigen   eine   Besonderheit:   Mit 
  1058. MakeDefaultItem  bzw.  MakeCancelItem  werden die Knöpfe  mit den 
  1059. Tasten ENTER bzw.  ESC verbunden  und senden anstelle der Meldung 
  1060. DLG_BUTTON, die Knöpfe normalerweise  bei Betätigung zusammen mit 
  1061. Ihrer ID-Nummer senden, die Meldungen DLG_OK bzw. DLG_CANCEL. 
  1062.  
  1063. function GetFileName(var name: string; var readonly: boolean):boolean;
  1064. Var MyDialog   : Dialog;
  1065.     MyCheckBox : PCheckbox;
  1066.     MyEditField: PEditField;
  1067.     MyButton   : PButton;
  1068.     MyLabelText: PLabelText;
  1069. begin
  1070.   MyDialog.Init(300,100, 0, DlgEventHandler);
  1071.  
  1072.   new(MyLabelText, Init(10,10, 101, 'Dateiname:'));    { ID 101 }
  1073.   MyDialog.AddItem(MyLabelText);
  1074.  
  1075.   new(MyEditField, Init(10,30, 20, 20, 102, ''));      { ID 102 }
  1076.   MyDialog.AddItem(MyEditField);
  1077.  
  1078.   new(MyCheckBox, Init(10,60, 103, 'Read Only'));      { ID 103 }
  1079.   MyDialog.AddItem(MyCheckBox);
  1080.  
  1081.   new(MyButton, Init(200,10, 80,30, 104, 'OK'));       { ID 104 }
  1082.   MyDialog.AddItem(MyButton);
  1083.   MyButton^.MakeDefaultItem;
  1084.  
  1085.   new(MyButton, Init(200,50, 80, 30, 105, 'Abbruch')); { ID 105 }
  1086.   MyDialog.AddItem(MyButton);
  1087.   MyButton^.MakeCancelItem;
  1088.  
  1089.   MyDialog.Show;            { Dialog zeichnen  }
  1090.   MyDialog.DoDialog;        { Dialog ausführen }
  1091.  
  1092.   if (MyDialog.flags and MF_CANCELLED) = 0 then
  1093.     begin
  1094.       GetFileName := true;
  1095.       MyEditField := MyDialog.FindDlgItem(101);
  1096.       name        := MyEditField^.GetString;
  1097.  
  1098.       MyCheckBox  := MyDialog.FindDlgItem(103);
  1099.       ReadOnly    := MyCheckBox^.IsChecked;
  1100.     end
  1101.   else GetFileName := false;
  1102.   MyDialog.Done;
  1103. end;
  1104.  
  1105.  
  1106.                                - 17 -
  1107.  
  1108.  
  1109. Nach  dem  Zeichnen  des  Dialoges  mit Show  ruft  die Anweisung 
  1110. DoDialog   den  Dialogmanager   auf.   Er  enthält   eine  eigene 
  1111. GetEvent/DispatchMessage-Schleife und beendet diese erst, nachdem 
  1112. die Methode DestroyDialog aufgerufen wurde.  Danach werden, falls 
  1113. der Dialog  mit OK abgeschlossen  wurde,  die Parameter  name und 
  1114. readonly mit den Werten der Dialogelemente belegt.  Done schließt 
  1115. den Dialog. 
  1116.  
  1117. Welche Dialogelemente gibt es?
  1118.  
  1119. Einige  Dialogelemente  haben  Sie  bereits  kennengelernt.    Im 
  1120. folgenden   finden  Sie  eine  Liste  aller  Dialogelemente   mit 
  1121. Abbildungen  Ihres Aussehens und der für die Anwendung  wichtigen 
  1122. Methoden.  Kapitel 9 enthält ein vollständiges  Verzeichnis aller 
  1123. von deLite deklarierten Objekte, dem auch die Objekthierarchie zu 
  1124. entnehmen  ist.  Für die Anwendung der Dialogelemente  sind diese 
  1125. zusätzlichen  Informationen  nicht wichtig,  wohl aber, falls Sie 
  1126. eigene Elemente erzeugen möchten. 
  1127.  
  1128. CheckBox        
  1129. Konstruktor:    Init(x1,y1,TheID: Integer; TheText: LabelStr) 
  1130. Methoden:       Function IsChecked: Boolean 
  1131.                 Procedure Check 
  1132.                 Procedure UnCheck 
  1133. Botschaften:    DLG_CHECKED 
  1134.                 DLG_UNCHECKED 
  1135.                 
  1136. Die  Checkbox  ist  eine  quadratische  Schaltfläche,   die  eine 
  1137. boolesche   Information   trägt,   die  beim  Auswählen   jeweils 
  1138. invertiert wird.  Der Initialzustand ist FALSE und kann mit Hilfe 
  1139. der Prozedur Check auf TRUE gesetzt werden. Der Beschriftungstext 
  1140. ist fester  Bestandteil  der CheckBox.   Bei jeder  Änderung  des 
  1141. Zustands wird eine entsprechende Botschaft gesendet. 
  1142.  
  1143. Button          
  1144. Konstruktor:    Init(x1, y1, dx, dy, TheID: Integer; TheText: LabelStr) 
  1145. Botschaften:    DLG_BUTTON 
  1146.  
  1147. Der Button ist eine quadratische Schaltfläche, die bei Betätigung 
  1148. eine Botschaft sendet. 
  1149.  
  1150. UserButton 
  1151. Konstruktor:    Init(x1, y1, dx, dy, xb, yb, TheID:   Integer;  
  1152.                 TheHK:   char; TheIcon:   Pointer) 
  1153. Botschaften:    DLG_BUTTON  
  1154.  
  1155. Der UserButton ist eine quadratische Schaltfläche wie der Button, 
  1156. enthält allerdings  anstelle  der Beschriftung  eine Grafikikone. 
  1157. Die  Parameter  xb und yb enthalten  die  Größe  der Grafikikone, 
  1158. TheIcon ist ein Zeiger auf die Ikone. 
  1159.  
  1160. RadioButtons    
  1161. Konstruktor:    Init(x1, y1, dx, dy, TheId: Integer; TheText: 
  1162.                 LabelStr; nextB: PRadioButton) 
  1163. Methoden:       function WhosChecked: Integer 
  1164.                 procedure CheckButton(TheID: Integer) 
  1165. Botschaften:    DLG_RADIO 
  1166.  
  1167. RadioButtons sind Gruppen von Schaltflächen,  von denen immer nur 
  1168. eine gedrückt sein kann.  Wird ein RadioButton  gesetzt, wird der 
  1169. zuvor gesetzte gelöscht.   Das Objekt RadioButtons  trägt nur den 
  1170.  
  1171.                                - 18 -
  1172.  
  1173.  
  1174. Rahmen  und die Beschriftung,  die Schaltflächen  selbst sind vom 
  1175. Typ  RadioButton  und müssen  einzeln  in Form  eines  rekursiven 
  1176. Aufrufs definiert werden.  
  1177.  
  1178. RadioButton 
  1179. Konstruktor:    Init(x1, y1, TheID:  Integer;  TheText:  LabelStr;
  1180.                 nextB:  PRadioButton)  
  1181.  
  1182. Ein  RadioButton  ist eine  einzelne  Schaltfläche,  die zu einem 
  1183. Objekt vom Typ RadioButtons  gehört.  Der Aufruf erfolgt rekursiv 
  1184. innerhalb des Konstruktors von RadioButtons. 
  1185.  
  1186. SelectBox
  1187. Konstruktor:    Init(x1, y1, wid, TheID: Integer; GetFirst, 
  1188.                 GetNext: ListProc)
  1189. Methoden:       Procedure Update
  1190.                 Function GetSelected: ListString
  1191.                 Procedure Select(TheString: ListStr)
  1192. Botschaften:    DLG_BOXSELECT
  1193.                 DLG_BOXCHANGE
  1194.  
  1195. Die SelectBox erlaubt die Auswahl eines Elementes aus einer Liste 
  1196. von  Elementen.   Mit Hilfe  der beiden  Schaltflächen  kann  das 
  1197. jeweils  nächste bzw.  vorherige  Element in der Liste ausgewählt 
  1198. werden.   Die Liste wird mit Hilfe  der Prozeduren  GetFirst  und 
  1199. GetNext eingelesen.   Der Parameter wid gibt an, wieviele Zeichen 
  1200. im Anzeigefeld Platz finden. 
  1201.  
  1202. ListBox
  1203. Konstruktor:    Init(x1, y1, wid, len, TheID: Integer; GetFirst, 
  1204.                 GetNext: GetListProc)
  1205. Methoden:       procedure Update
  1206.                 Function GetSelected: GetListString
  1207. Botschaften:    DLG_LISTSELECT
  1208.  
  1209. Die Listbox erlaubt wie die SelectBox die Auswahl eines Elementes 
  1210. aus einer  Liste  von Elementen,  allerdings  sind  hier  mehrere 
  1211. Elemente gleichzeitig sichtbar.  Der Parameter len gibt dabei an, 
  1212. wieviele  Elemente  sichtbar  sind.  Die Liste wird mit Hilfe der 
  1213. Prozeduren GetFirst und GetNext eingelesen. 
  1214.  
  1215. EditField
  1216. Konstruktor:            Init(x, y, len, max, TheID: Integer; 
  1217.                         deflt: String)
  1218. Methoden:               procedure SetString(TheStr: string)
  1219.                         function GetString: string
  1220.                         function IsInteger: boolean
  1221.                         function GetValue: Integer
  1222. Botschaften:            DLG_EDITCHGD
  1223.  
  1224. Das EditField dient der Eingabe einer Zeichenkette. Der Parameter 
  1225. len gibt an, wievielen  Zeichen innerhalb  des Fensters  sichtbar 
  1226. sein  sollen.   Der  Parameter  max  gibt  die  Maximallänge  der 
  1227. Zeichenkette an.  Sollte max größer sein als len, wird der Inhalt 
  1228. des Editierfeldes  entsprechend  in der Anzeige verschoben.   Der 
  1229. Inhalt  kann  auch  als  Integerwert  interpretiert  werden.  Die 
  1230. Methode  IsInteger  stellt  fest,  ob  der  Inhalt  eine  gültige 
  1231. Integerzahl darstellt. 
  1232.  
  1233. Slider
  1234. Konstruktor:            Init(x1, y1, len, TheID, pmin, 
  1235.  
  1236.                                - 19 -
  1237.  
  1238.  
  1239.                         pmax: Integer; dir: dirtype)
  1240. Methoden:               function GetPos: Integer
  1241.                         procedure SetPos(ThePos: Integer)
  1242. Botschaften:            DLG_SLIDERMOVED
  1243.                         DLG_SLIDERRLSD
  1244.                         
  1245. Ein Slider ist ein Schieberegler,  dessen tatsächliche Ausdehnung 
  1246. in Pixeln  im Parameter  len angegeben  wird.   Proportional  zur 
  1247. Position  des Schiebereglers  wird eine  Integergröße  verändert, 
  1248. deren Grenzen in den Parametern  pmin und pmax definiert  werden. 
  1249. Für  den  Parameter  dir  ist  zur  Zeit  nur  die Konstante  hor 
  1250. zugelassen. Später wird es auch vertikale Slider geben. 
  1251.  
  1252. UserRadioButtons
  1253.  
  1254. Konstruktor:    Init(x1, y1, dx, dy, TheId: Integer; 
  1255.                 TheText: LabelStr; nextB:PRadioButton)
  1256. Methoden:       function WhosChecked: Integer
  1257.                 procedure CheckButton(TheID: Integer)
  1258. Botschaften:    DLG_RADIO
  1259.  
  1260. UserRadioButtons  sind Gruppen von Schaltflächen, von denen immer 
  1261. nur eine gedrückt  sein kann.  Wird ein UserRadioButton  gesetzt, 
  1262. wird der zuvor gesetzte  gelöscht.   Das Objekt  UserRadioButtons 
  1263. trägt  nur  den  Rahmen  und die Beschriftung,  die Schaltflächen 
  1264. selbst  sind vom Typ UserRadioButton  und müssen einzeln  in Form 
  1265. eines rekursiven  Aufrufs definiert  werden.  Im Unterschied  zum 
  1266. RadioButton  besteht  der  UserRadioButton   aus  einer  beliebig 
  1267. großen, mit einer Grafikikone beschrifteten Schaltfläche. 
  1268.  
  1269. UserRadioButton
  1270. Konstruktor:    Init(x1, y1, TheID: Integer; TheText: LabelStr;
  1271.                 nextB:PRadioButton)
  1272.                 
  1273. Ein  RadioButton  ist eine  einzelne  Schaltfläche,  die zu einem 
  1274. Objekt vom Typ RadioButtons  gehört.  Der Aufruf erfolgt rekursiv 
  1275. innerhalb des Konstruktors von RadioButtons. 
  1276.  
  1277. LabelText
  1278. Konstruktor:    Init(x1, y1, TheID: Integer; TheText: LabelStr)
  1279. Methoden:       procedure SetLabel(TheText: LabelStr)
  1280.  
  1281. Ein Labeltext ist ein einfacher  Text innerhalb des Dialoges, der 
  1282. sich völlig passiv verhält.   Er kann nicht betätigt  werden  und 
  1283. sendet keine Botschaften. 
  1284.  
  1285. LabelFrame
  1286. Konstruktor:    Init(x1, y1, dx, dy, TheID: integer; TheText: LabelStr)
  1287.  
  1288. Ein LabelFrame  ist ein Rahmen mit Beschriftung,  wie er auch für 
  1289. RadioButtons  verwendet wird.  Mit Hilfe des LabelFrame  kann die 
  1290. logische   Zusammengehörigkeit    von   Dialogelementen   optisch 
  1291. dargestellt werden. 
  1292.  
  1293. FileRequester
  1294. Konstruktor:    Init(x,y,lin,TheID: Integer; ThePath, TheMask: String)
  1295. Methoden:       Function GetSelected: String
  1296.                 Function GetPath: String
  1297. Botschaften:    DLG_FILEREQ
  1298.  
  1299. Der   Filerequester   ist  eine   aus  mehreren   Dialogelementen 
  1300.  
  1301.                                - 20 -
  1302.  
  1303.  
  1304. zusammengesetzte Gruppe zur Ermittlung eines Dateinamens. Jeweils 
  1305. eine ListBox  wird zur Auswahl  der Datei  und des Verzeichnisses 
  1306. verwendet. 
  1307.  
  1308. Die Behandlung von Dialogereignissen
  1309.  
  1310. Bei der Verwendung eines Dialoges müssen Sie im Init-Aufruf  eine 
  1311. Empfangsprozedur  angeben,  die die von den Dialogen  gelieferten 
  1312. Meldungen bearbeitet.   Dialoge liefern grundsätzlich  Ereignisse 
  1313. der Klasse DialogEvent  und übergeben im Feld MSG die eigentliche 
  1314. Botschaft  als  Integerwert,  für  den  entsprechende  Konstanten 
  1315. definiert   sind.   Das  Feld  ID  enthält   die  ID-Nummer   des 
  1316. Dialogelemente:   Falls Sie mehrere Dialogelemente  gleichen Typs 
  1317. verwenden,  müssen Sie anhand der ID-Nummer entscheiden,  welches 
  1318. Element  der Urheber der Botschaft  ist.  Das Feld DlgAdr enthält 
  1319. einen Zeiger auf den Dialog,  zu dem die Dialogelemente  gehören. 
  1320. Über diesen  Zeiger können Sie Methoden  und Felder  des Dialoges 
  1321. referenzieren. 
  1322.  
  1323.  
  1324.  
  1325.  
  1326.  
  1327.  
  1328.  
  1329.  
  1330.  
  1331.  
  1332.  
  1333.  
  1334.  
  1335.  
  1336.  
  1337.  
  1338.  
  1339.  
  1340.  
  1341.  
  1342.  
  1343.  
  1344.  
  1345.  
  1346.  
  1347.  
  1348.  
  1349.  
  1350.  
  1351.  
  1352.  
  1353.  
  1354.  
  1355.  
  1356.  
  1357.  
  1358.  
  1359.  
  1360.  
  1361.  
  1362.  
  1363.  
  1364.  
  1365.  
  1366.                                - 21 -
  1367.  
  1368.  
  1369. 5 Die Verwendung von Fenstern
  1370.  
  1371. Von Fenstern, Viewports und Klienten
  1372.  
  1373. Im zweiten Kapitel haben Sie bereits erfahren, daß der Bildschirm 
  1374. im  Normalfall  in  zwei  Bereiche  aufgeteilt  ist.   Am  oberen 
  1375. Bildschirmrand  wird ein Streifen  für die Menüs  verwendet,  der 
  1376. Rest des Bildschirms gehört Ihrem Programm. In vielen Fällen wird 
  1377. diese Aufteilung ausreichend  sein, aber es gibt Situationen,  in 
  1378. denen es wünschenswert  ist, daß die verfügbare  Bildschirmfläche 
  1379. in  weitere  Segmente  aufgeteilt  wird.  Unter  deLite  gibt  es 
  1380. grundsätzlich zwei Möglichkeiten, den Bildschirm aufzuteilen. Für 
  1381. das Verständnis  dieser  Möglichkeiten  ist es notwendig,  einige 
  1382. Begriffe zu klären. 
  1383.  
  1384. Viewports
  1385.  
  1386. Unter  einem  Viewport  versteht  man eine beliebige  rechteckige 
  1387. Fläche auf dem Bildschirm, die so angesteuert  wird, als wäre sie 
  1388. ein eigenständiger  Bildschirm.   Das heißt,  daß die linke obere 
  1389. Ecke eines Viewports  stets die logischen Koordinaten  (0,0) hat, 
  1390. unabhängig  von der tatsächlichen  Position des Viewports auf dem 
  1391. Bildschirm.  Graphische Operationen,  die die logische Fläche des 
  1392. Viewports überschreiten  würden, werden vom System an den Grenzen 
  1393. des Viewports abgeschnitten.   Diesen Vorgang bezeichnet  man als 
  1394. Clipping.   Zu einem Zeitpunkt  kann immer nur ein Viewport aktiv 
  1395. sein.   Es  ist  möglich,  die  Größe  des  Viewports  und  seine 
  1396. tatsächlichen Eckkoordinaten zu erfragen. 
  1397.  
  1398. Fenster
  1399.  
  1400. Ein Fenster ist eine rechteckige  Fläche auf dem Bildschirm,  die 
  1401. mit   einem   Rahmen    versehen    ist   und   eine   definierte 
  1402. Hintergrundfarbe  besitzt.   Beim Öffnen eines Fensters  wird vom 
  1403. System  automatisch  ein  Viewport  auf  das Innere  des Fensters 
  1404. gesetzt.  Vorher wird der vom Fenster verdeckte  Bildschirminhalt 
  1405. gerettet,  um beim Schließen  des Fensters  wieder  rekonstruiert 
  1406. werden  zu  können.    Fenster  werden  in  einer  Stapelstruktur 
  1407. verwaltet.    Das  bedeutet,  daß  es  möglich  ist,  über  einem 
  1408. geöffneten  Fenster  weitere  Fenster  zu öffnen,  ohne das erste 
  1409. Fenster  zu schließen.   Die Fenster  werden  in der  umgekehrten 
  1410. Reihenfolge  geschlossen,  daher  der Ausdruck  Stapel.   Nur das 
  1411. oberste Fenster ist jeweils aktiv, die darunter liegenden Fenster 
  1412. können nicht beschrieben  werden.  Beim Schließen  eines Fensters 
  1413. wird das jeweils darunterliegende Fenster aktiviert. Da immer nur 
  1414. das oberste  Fenster  aktiv  ist,  eignen  sich  Fenster  nur zur 
  1415. Darstellung  von  temporären  Informationen.   Für die permanente 
  1416. Aufteilung der Bildschirmfläche sind sie ungeeignet. 
  1417.  
  1418. Klienten
  1419.  
  1420. Zur dauerhaften Aufteilung des Bildschirms  dienen Klienten.  Ein 
  1421. Klient     besteht     aus    einem     Viewport     und    einer 
  1422. Botschaften-Empfangsprozedur.    Im  Normalfall  existieren  zwei 
  1423. Klienten:  Der Menümanager ist ein systeminterner Klient, dem als 
  1424. Viewport der schmale Streifen am oberen Bildschirmrand zugeordnet 
  1425. ist,   und   die   Hauptapplikation,   die   mit   der   Prozedur 
  1426. OpenMainApplication   angemeldet  wurde,  besitzt  die  restliche 
  1427. Bildschirmfläche.    Eine  wichtige  Einschränkung  unterscheidet 
  1428. Klienten  von Fenstern:   Es ist nicht möglich, daß die Viewports 
  1429. der Klienten  sich überlappen.   Jeder Klient besitzt eine eigene 
  1430.  
  1431.                                - 22 -
  1432.  
  1433.  
  1434. Empfangsprozedur  für Botschaften.   Die Prozedur DispatchMessage 
  1435. verteilt  Mausereignisse  anhang  der  den Klienten  zugeordneten 
  1436. Viewports.   So ist gewährleistet,  daß die Empfangsprozedur  des 
  1437. Hauptprogramms  niemals  ein Mausereignis  erhält, das im Bereich 
  1438. des  Menübalkens  stattgefunden  hat.  Es  ist  möglich,  weitere 
  1439. Klienten   anzumelden   und  ihnen   Teile   des  Viewports   der 
  1440. Hauptapplikation  zuzuteilen.  Das Beispielprogramm DXFView macht 
  1441. von dieser Möglichkeit  Gebrauch  und teilt die Arbeitsfläche  in 
  1442. vier  kleine  Bereiche  ein, in denen  getrennt  voneinander  die 
  1443. Möglichkeit  besteht,  Grafiken  zu  betrachten.  Diese  Klienten 
  1444. bekommen  nur  die Mausereignisse  zugesandt,  die sich  in ihren 
  1445. Viewports abgespielt  haben.  Das Beispielprogramm  DXFView nutzt 
  1446. diese Eigenschaft,  um mit der Maus den jeweils  aktiven Klienten 
  1447. auswählen zu können.  Die zusätzlich angemeldeten Klienten können 
  1448. wieder abgemeldet  werden.  Allerdings  ist es nicht möglich, die 
  1449. Hauptapplikation  abzumelden,  ohne das Programm zu beenden.  Das 
  1450. ist notwendig, da die Empfangsprozedur der Hauptapplikation stets 
  1451. die Menümeldungen zugesandt bekommt. Da die zusätzlichen Klienten 
  1452. die Arbeitsfläche der Hauptapplikation  überlagern, gibt es einen 
  1453. Konflikt  bei der Zuordnung  der Mausereignisse  zu den Klienten: 
  1454. Die immer  noch aktive  Hauptapplikation  würde  alle  Ereignisse 
  1455. bekommen,  da ihr Viewport  die gesamte  Arbeitsfläche  einnimmt. 
  1456. Deshalb  muß  in diesem  Fall  die  Hauptapplikation  suspendiert 
  1457. werden.  Suspendieren bedeutet, daß der Dispatcher sie nicht mehr 
  1458. bei der Zuteilung von Mausereignissen berücksichtigt.  Ereignisse 
  1459. anderer  Klassen  (Menüs,  Tastatur)  werden  nach wie vor an die 
  1460. Hauptapplikation  gesendet.  Nach der Reaktivierung  empfängt die 
  1461. Hauptapplikation  wieder  alle  Arten  von  Ereignissen.  Um  die 
  1462. Klienten  voneinander  zu unterscheiden,  trägt jeder Klient eine 
  1463. Identifikationsnummer,  die ID.  Die ID der Hauptapplikation kann 
  1464. mit  der  Prozedur   GetMainID   erfragt  werden,  die  ID's  der 
  1465. zusätzlich angemeldeten Klienten werden bei der Anmeldung mit der 
  1466. Prozedur OpenSubApplication  zurückgeliefert.  Die Prozeduren zum 
  1467. An-  oder  Abmelden  von  Klienten  und  zur  Modifikation  ihrer 
  1468. Arbeitsweise und ihres Aussehens erfordern alle die Angabe der ID 
  1469. des jeweiligen Klienten. Im Gegensatz zu Fenstern retten Klienten 
  1470. nicht  den  von ihrem  Viewport  überlagerten  Bildschirmbereich. 
  1471. Deshalb muß jeder Klient in der Lage sein, seinen Viewport neu zu 
  1472. zeichnen,  wenn er die Botschaft  DoRedraw erhält.  Es existieren 
  1473. Prozeduren,  mit denen einem  Klienten  eine Botschaft  geschickt 
  1474. werden kann.  In der nächsten  Version von deLite wird es möglich 
  1475. sein,  einem  Klienten  Streifen  an einem  der  Bildschirmränder 
  1476. zuzuteilen    und   damit   die   Grösse   des   Viewports    der 
  1477. Hauptapplikation dynamisch zu reduzieren.  Nach der Neuaufteilung 
  1478. der  Viewports   unter  den  Klienten  ist  der  Bildschirminhalt 
  1479. ungültig, er muß neu gezeichnet  werden.  DeLite würde dann jedem 
  1480. der Klienten ein Redraw senden. 
  1481.  
  1482. Der Dispatcher
  1483.  
  1484. Es wurde bereits erwähnt, daß der Dispatcher  die Verteilung  der 
  1485. Botschaften  anhand  der  den  Klienten  zugeordneten   Viewports 
  1486. vornimmt.   Allerdings  gibt es Situationen,  in denen ein Klient 
  1487. alle Ereignisse zugesandt bekommen möchte. Das ist z.B. der Fall, 
  1488. wenn ein Menü aufgeklappt wurde und anschließend ein Mausereignis 
  1489. im Viewport  der Hauptapplikation  stattgefunden  hat.  In diesem 
  1490. Fall hat der Benutzer  des Programms  seine  Entscheidung,  einen 
  1491. Menüpunkt auszuwählen, geändert: Das Menü muß geschlossen werden, 
  1492. bevor das Hauptprogramm seine Arbeit wieder aufnimmt.  Für solche 
  1493. Situationen besteht die Möglichkeit, die Prozedur DispatchMessage 
  1494. vorübergehend  außer  Kraft  zu setzen  und die  Zuteilung  aller 
  1495.  
  1496.                                - 23 -
  1497.  
  1498.  
  1499. Ereignisse  zu verlangen.  Die Prozeduren  ReceiveExclusive  bzw. 
  1500. ContinueToDispatch   steuern  diesen  Mechanismus. Der  Empfänger 
  1501. einer Botschaft kann davon ausgehen, daß sein Viewport aktiv ist. 
  1502. Seine   Zeichenoperationen   würden   also   in  seinem   eigenen 
  1503. Bildschirmsegment   stattfinden.    Es  besteht  allerdings   die 
  1504. Möglichkeit,  den Viewport eines anderen Klienten zu erfragen und 
  1505. zu setzen. Die dazugehörigen Prozeduren heißen SetTheViewPort und 
  1506. GetTheViewPort  und erfordern  die Angabe  der ID des betroffenen 
  1507. Viewports. 
  1508.  
  1509. Die Benutzung von Fenstern
  1510.  
  1511. Fenster  können geöffnet,  benutzt und wieder geschlossen  werden 
  1512. und besitzen  einen Rahmen  und eine in der Initialisierungsdatei 
  1513. definierte Farbe. Sie retten selbständig den von ihnen verdeckten 
  1514. Bildschirminhalt   und  rekonstruieren  ihn  nach  dem  Schließen 
  1515. wieder.   Da dabei zum Teil recht beachtliche  Mengen an Speicher 
  1516. umgeschichtet   werden   müssen,   verwendet   eine  intelligente 
  1517. Speicherverwaltung  bei Bedarf EMS-Speicher  und lagert Teile auf 
  1518. Festplatte  aus.  Beim Öffnen eines Fensters muß dessen Größe und 
  1519. Position in Pixeln angegeben  werden.  Möchte man ein Fenster zur 
  1520. Ausgabe  von  Text  verwenden  und dabei  den Standardzeichensatz 
  1521. benutzen,   ist  es  notwendig,   die  Größe  eines  Fensters  in 
  1522. Abhängigkeit   von   der  Grösse   der  Zeichen   des  jeweiligen 
  1523. Zeichensatzes  zu  dimensionieren.  Da  die  deLite-Grafiktreiber 
  1524. unterschiedliche Zeichensätze für jede Grafikkarte verwenden, muß 
  1525. diese Information  zur Laufzeit  erfragt werden.  Zu diesem Zweck 
  1526. existieren  eine  Reihe  von  Funktionen,   mit  denen  man  alle 
  1527. wichtigen Parameter erfragen kann. Mit Hilfe der Funktionen FontX 
  1528. und FontY  kann  die Größe  eines  Zeichens  in Pixeln  ermittelt 
  1529. werden.  Die Funktionen  PortMaxX  und PortMaxY liefern die Größe 
  1530. des  zu dem  Fenster  gehörenden  Viewports  und  können  benutzt 
  1531. werden,  um  graphische   Ausgaben  an  die  Größe  des  Fensters 
  1532. anzupassen.     Ein   Beispiel   zeigt   die   Anwendung   dieser 
  1533. Möglichkeiten. Das Programmfragment öffnet ein Fenster, das Platz 
  1534. für 10 Textzeilen  mit 40 Spalten bietet, schreibt  mit Hilfe der 
  1535. Prozedur  WriteWin  einen Text in die oberste  Zeile und zeichnet 
  1536. Linien in die Diagonalen des Fensters. 
  1537.  
  1538.         Procedure Demo;
  1539.         Begin
  1540.           OpenWindow(25,25,25+40*FontX,25+10*FontY);
  1541.           WriteWin('Guten Tag',0,0,0);
  1542.           Line(0,0,PortMaxX,PortMaxY,0);
  1543.           Line(0,PortMaxY,PortMaxX,0,0);
  1544.           WaitConfirm; { Warten auf eine Bestätigung }
  1545.           CloseWindow;
  1546.         End;
  1547.  
  1548. Nach  dem Schließen  des Fensters  mit CloseWindow  ist der zuvor 
  1549. verwendete  Viewport  wieder aktiv.  Es ist wichtig,  daß vor dem 
  1550. Befehl zum Schließen  des Fensters ein WaitConfirm  steht.  Diese 
  1551. Prozedur zieht alle Ereignisse an sich und endet, sobald eine der 
  1552. Maustasten gedrückt wurde oder ESCAPE bzw.  ENTER betätigt wurde. 
  1553. So werden alle Ereignisse geschluckt,  und es ist sichergestellt, 
  1554. daß kein Klient zwischenzeitlich aktiv wird.  Während ein Fenster 
  1555. offen ist, kann auf diese Weise kein anderer  Programmteil  tätig 
  1556. werden. 
  1557.  
  1558. Dialogfenster
  1559.  
  1560.  
  1561.                                - 24 -
  1562.  
  1563.  
  1564. Noch  eleganter  ist  es,  für  diese  Aufgabe  einen  Dialog  zu 
  1565. verwenden,  der  einen  einzigen  Schaltknopf  zum Schließen  des 
  1566. Dialogfensters     beinhaltet.     Die     dazu     erforderliche 
  1567. Botschaftenempfangsprozedur  ist in deLite bereits enthalten  und 
  1568. trägt den Namen DefEventproc. Sie wertet nur die beiden Meldungen 
  1569. DLG_OK und DLG_CANCEL  aus und schließt beim Empfang einer dieser 
  1570. Meldungen den Dialog. Nach der Darstellung des Dialoges mit Hilfe 
  1571. der Methode Show haben Sie Gelegenheit,  selbst das Dialogfenster 
  1572. zu   beschreiben.     Anschließend    wird   mit   DoDialog   die 
  1573. Ereignisabarbeitung begonnen. 
  1574.  
  1575.         procedure Demo2;
  1576.         var MyDialog : Dialog;
  1577.             MyButton : PButton;
  1578.         begin
  1579.           MyDialog.Init(40*FontX, 12*FontY, 0, DefEventProc);
  1580.           MyDialog.Move(25, 25);
  1581.  
  1582.           new(MyButton, Init(2*FontX, 9*FontY, 36*FontX, 2*FontY, 100, 'OK'));
  1583.           MyDialog.AddItem(MyButton);
  1584.           MyButton^.MakeDefaultItem;
  1585.  
  1586.           MyDialog.Show;
  1587.           WriteWin('Guten Tag', 1, 1, black);
  1588.           Line(0,0, PortMaxX,  PortMaxY-4*FontY, black);
  1589.           Line(PortMaxX, 0, 0, PortMaxY-4*FontY, black);
  1590.  
  1591.           MyDialog.DoDialog;
  1592.           MyDialog.Done;
  1593.         end;
  1594.  
  1595. Die Anmeldung weiterer Klienten
  1596.  
  1597. In einem Beispiel  werden wir zeigen, wie der Bildschirm  in vier 
  1598. gleichgroße Segmente aufgeteilt wird.  Die Hauptapplikation  wird 
  1599. zu diesem Zweck suspendiert. 
  1600.  
  1601.         Procedure VierFenster;
  1602.         Var ThePort: ViewPortType;
  1603.             XSize  : integer;
  1604.             YSize  : integer;
  1605.             XOrg   : integer;
  1606.             YOrg   : integer;
  1607.             XEnd   : integer;
  1608.             YEnd   : integer;
  1609.             Msg    : EventTyp;
  1610.         begin
  1611.           ClearViewPort;                   { Fenster löschen }
  1612.           GetViewSettings(ThePort);
  1613.           With ThePort Do
  1614.             begin
  1615.               XSize := (x2-x1) div 2 - 2;  { Ausdehnung in x-Richtung }
  1616.               YSize := (y2-y1) div 2 - 4;  { dito in y-Richtung }
  1617.               XOrg  := x1;
  1618.               YOrg  := y1 + 3;
  1619.               XEND  := x2;
  1620.               YEnd  := y2;
  1621.             end;
  1622.  
  1623.           ID1 := OpenSubApplication(Fenster1,0,'Fenster 1',
  1624.                                     XOrg,YOrg,Xorg+XSize,YOrg+YSize);
  1625.  
  1626.                                - 25 -
  1627.  
  1628.  
  1629.  
  1630.           ID2 := OpenSubApplication(Fenster2,0,'Fenster 2',
  1631.                                     XEND-XSize,YOrg,XEND,YOrg+YSize);
  1632.  
  1633.           ID3 := OpenSubApplication(Fenster3,0,'Fenster 3',
  1634.                                     XOrg,YEnd-YSize,Xorg+XSize,YEnd);
  1635.  
  1636.           ID4 := OpenSubApplication(Fenster4,0,'Fenster 4',
  1637.                                     XEnd-XSize,YEnd-YSize,XEnd,YEnd);
  1638.  
  1639.           SuspendApplication(MyID);    { Hauptfenster deaktivieren }
  1640.  
  1641.           MSG.Class := DoRedraw;
  1642.  
  1643.           PostMessage(MSG, ID1);       { alle Fenster neu zeichnen }
  1644.           PostMessage(MSG, ID2);
  1645.           PostMessage(MSG, ID3);
  1646.           PostMessage(MSG, ID4);
  1647.         end;
  1648.  
  1649. Beachten   Sie,  daß  die  von  der  Prozedur  OpenSubApplication 
  1650. zurückgelieferten  IDs  gespeichert  werden,  da sie später  noch 
  1651. benötigt  werden.  Die Prozedur PostMessage  dient dazu, den vier 
  1652. neuen  Klienten  eine  Botschaft  vom  Typ  DoRedraw  zu  senden. 
  1653. Daraufhin zeichnen die Klienten in ihren Viewport eine Grafik. 
  1654.  
  1655. Nicht-modale Dialoge
  1656.  
  1657. Im Gegensatz  zu den  modalen  Dialogen  hält  ein  nicht-modaler 
  1658. Dialog die Ausführung  der anderen  Teile eines Programmes  nicht 
  1659. an.   Findet  innerhalb  seines  Viewports  ein  Ereignis  statt, 
  1660. arbeitet  er  es wie  jeder  andere  Dialog  ab,  finden  dagegen 
  1661. Ereignisse  über den Viewports anderer Klienten statt, übernehmen 
  1662. diese  deren  Bearbeitung.   Damit ist klar, wie ein nichtmodaler 
  1663. Dialog  zu realisieren  ist und warum wir seine  Erstellung  erst 
  1664. jetzt  beschreiben:    Ein  nichtmodaler   Dialog  erfordert  die 
  1665. Kombination  eines Klienten  mit einem Dialog.  Wir haben bereits 
  1666. erwähnt, daß es unter deLite nicht möglich ist, Klienten mit sich 
  1667. überlappenden Viewports zu verwalten.  Trotzdem gibt es sinnvolle 
  1668. Anwendungen für nichtmodale Dialoge.  Das Beispielprogramm  teilt 
  1669. die Bildschirmfläche in zwei Bereiche auf. Neben der eigentlichen 
  1670. Arbeitsfläche  befindet  sich  am rechten  Bildrand  ein schmaler 
  1671. Streifen,  auf dem vier Schaltflächen  installiert  werden.  Dazu 
  1672. verwenden   wir   das   Dialogelement   UserRadioButtons-    jede 
  1673. Schaltfläche  soll  hier  für  eine  Betriebsart  des  Programmes 
  1674. stehen, es kann also stets nur eine Schaltlfläche  gedrückt sein. 
  1675. Bei  einem  modalen  Dialog  hätte  man nach  der Definition  der 
  1676. Dialogelemente die Methode DoDialog aufgerufen.  Da DoDialog eine 
  1677. eigene GetEvent/DispatchMessage-Schleife  besitzt, lässt es keine 
  1678. anderen  Klienten  mehr  zum Zuge  kommen.   Für die nichtmodalen 
  1679. Dialoge  wird deshalb anstelle  eines Aufrufs  von DoDIalog  eine 
  1680. Empfangsprozedur  dem Dispatcher  bekanntgemacht,  die ihrerseits 
  1681. die Empfangsprozedur des Objektes Dialog aufruft. 
  1682.  
  1683.         Program exampl01;
  1684.         Uses API, Kernel;
  1685.  
  1686.         CONST ProjektName  = 'exampl01';
  1687.  
  1688.         VAR   LaunchResult      : integer;
  1689.               MyEvent           : EventTyp;
  1690.  
  1691.                                - 26 -
  1692.  
  1693.  
  1694.               StillRunning      : boolean;
  1695.               WorkID,
  1696.               IconBarID         : integer;                   { 2 Klienten }
  1697.               IconBar           : Dialog;
  1698.               MyID              : integer;
  1699.               PrintColor        : byte;  { Bestückungsdruck }
  1700.  
  1701.  
  1702.         Procedure HandleMsg(MyMessage: EventTyp); far;
  1703.         var xx,yy : integer;
  1704.         { Hier werden die Botschaften behandelt. }
  1705.         Begin
  1706.           With MyMessage Do
  1707.             Case Class Of
  1708.               Menu    : begin
  1709.                           Case x of
  1710.                              0       : StillRunning := false;
  1711.                           end;
  1712.                         end;
  1713.             end; { Case Class }
  1714.         End;
  1715.         
  1716.         procedure IconBarEventHandler(TheEvent: EventTyp); far;
  1717.         begin
  1718.           With TheEvent Do
  1719.             If Class = DialogEvent then
  1720.               begin                      
  1721.  
  1722.               end;
  1723.         end;
  1724.  
  1725.         procedure IconBarClient(TheEvent: EventTyp); far;
  1726.         begin
  1727.           IconBar.HandleEvent(TheEvent);    { Der Client leitet nur weiter }
  1728.         end;
  1729.  
  1730.  
  1731.         Procedure IconBarAn;
  1732.         Var ThePort: ViewPortType;
  1733.             XSize  : integer;
  1734.             YSize  : integer;
  1735.             XOrg   : integer;
  1736.             YOrg   : integer;
  1737.             XEnd   : integer;
  1738.             YEnd   : integer;
  1739.             Msg    : EventTyp;
  1740.             MyUserRadios: PUserRadios;
  1741.         begin
  1742.           ClearViewPort;                       { Fenster löschen }
  1743.           GetViewSettings(ThePort);
  1744.           With ThePort Do
  1745.             begin
  1746.               XSize := x2-x1;
  1747.               YSize := y2-y1;
  1748.               XOrg  := x1;
  1749.               YOrg  := y1;
  1750.               XEND  := x2;
  1751.               YEnd  := y1+ySize;
  1752.             end;
  1753.  
  1754.           IconBar.Init(50,ysize, 0, IconBarEventHandler);
  1755.  
  1756.                                - 27 -
  1757.  
  1758.  
  1759.           IconBar.Move(xend-50,0);
  1760.           new(MyUserRadios, Init(0,0,50,ysize,411,
  1761.                 new(PUserRadio, Init(0,0,48,48,39,39,412,nil,
  1762.                  new(PUserRadio, Init(0,50,48,48,39,39,413,nil,
  1763.                   new(PUserRadio, Init(0,100,48,48,39,39,414,nil,
  1764.                    new(PUserRadio, Init(0,150,48,48,39,39,415, 
  1765.                                     nil,nil))))))))));
  1766.           IconBar.AddItem(MyUserRadios);
  1767.           MyUserRadios^.CheckButton(412);
  1768.  
  1769.           IconBarID:= OpenSubApplication(IconBarClient, 0, 'Iconbar',
  1770.                              xend-50,yorg,xend,yorg+ysize);
  1771.           SetTheViewPort(IconBarID);
  1772.           IconBar.Show;
  1773.  
  1774.           WorkID   := OpenSubApplication(HandleMsg,APP_NOFRAME,'Editor',
  1775.                              XOrg,YOrg,XEND-51,Yend);
  1776.  
  1777.  
  1778.           SuspendApplication(MyID);           { Hauptfenster deaktivieren }
  1779.  
  1780.         end;
  1781.  
  1782.         Begin
  1783.           StillRunning := true;
  1784.           LaunchResult := OpenMainApplication(HandleMsg,
  1785.                                                APP_NOFONT,
  1786.                                                ProjektName);
  1787.  
  1788.           If LaunchResult = 0 then
  1789.           begin
  1790.             MyId := GetMainID;
  1791.             IconBarAn;
  1792.             while StillRunning Do
  1793.               begin
  1794.                 GetEvent(MyEvent);
  1795.                 DispatchMessage(MyEvent);
  1796.               end;
  1797.             IconBar.Done;
  1798.             CloseMainApplication;
  1799.           end
  1800.           Else
  1801.             Writeln('Programm kann nicht gestartet werden. Fehler: ',
  1802.                      LaunchResult);
  1803.         End.
  1804.         
  1805. Beachten Sie, daß vor dem Aufruf von CloseMainApplication am Ende 
  1806. des Programmes  der Destruktor  IconBar.Done  aufgerufen wird, um 
  1807. den Speicherplatz  des Dialoges  freizugeben.   Sie finden dieses 
  1808. Beispiel auch auf Ihrem Diskettensatz. 
  1809.  
  1810.  
  1811.  
  1812.  
  1813.  
  1814.  
  1815.  
  1816.  
  1817.  
  1818.  
  1819.  
  1820.  
  1821.                                - 28 -
  1822.  
  1823.  
  1824. 6 Die graphischen Operationen
  1825.  
  1826. Die von deLite zur Verfügung gestellten  graphischen  Operationen 
  1827. umfassen   neben   bitorientierten    Funktionen   zum   Zeichnen 
  1828. elementarer  Symbole auch Funktionen zum Zeichnen und Verschieben 
  1829. von Bitmaps.   Neben einem Zeichensatz  fester  Größe unterstützt 
  1830. deLite auch skalierbare  Zeichensätze,  die ohne Qualitätsverlust 
  1831. nahezu  beliebig  vergrößert  werden können.   Für alle in diesem 
  1832. Abschnitt  beschriebenen  Operationen  gilt, daß sie sich auf den 
  1833. aktuell gesetzten Viewport beziehen.  Alle Operationen  verwenden 
  1834. einen   Clipping-Algorithmus,   der   sicherstellt,   daß   keine 
  1835. Bildschirmbereiche  außerhalb  des aktiven Viewports  beschrieben 
  1836. werden. 
  1837.  
  1838. Elementare Zeichenoperationen
  1839.  
  1840. Die   elementaren   Zeichenoperationen    dienen   dem   Zeichnen 
  1841. sogenannter  graphischer  Primitive.  Durch Kombination  mehrerer 
  1842. Primitive können komplexere Grafiken erstellt werden. 
  1843.  
  1844. Setzen eines Pixels
  1845.  
  1846. Die  Prozedur  SetPoint  setzt  ein  einzelnes   Pixel  in  einer 
  1847. beliebigen Farbe. 
  1848.  
  1849.         Procedure SetPoint(x,y: Integer; color: Byte)
  1850.  
  1851. Zeichnen einer Linie
  1852.  
  1853. Die Prozedur Line zeichnet eine Linie zwischen zwei Punkten.
  1854.  
  1855.         Procedure Line(x1,y1,x2,y2: Integer; color: Byte)
  1856.  
  1857. Zeichnen eines Rechtecks
  1858.  
  1859. Die Prozedur Rectangle zeichnet ein nicht ausgefülltes Rechteck.
  1860.  
  1861.         Procedure Rectangle(x1,y1,x2,y2: Integer; color: Byte)
  1862.  
  1863. Zeichnen einer rechteckigen Fläche
  1864.  
  1865. Die Prozedur Bar zeichnet eine ausgefüllte rechteckige Fläche.
  1866.  
  1867.         Procedure Bar(x1,y1,x2,y2: Integer; color: Byte)
  1868.  
  1869. Zeichnen eines Kreises
  1870.  
  1871. Die Prozedur Circle zeichnet  einen Kreis.  Anzugeben  sind neben 
  1872. der Farbe die Koordinaten des Mittelpunktes und der Radius. 
  1873.  
  1874.         Procedure Circle(mx,my,radiud: Integer; color: Byte)
  1875.  
  1876. Zeichnen eines Kreissegmentes
  1877.  
  1878. Die Prozedur Arc zeichnet ein Kreissegment.  Anzugeben sind neben 
  1879. der Farbe die Koordinaten des Mittelpunktes  und der Anfangs- und 
  1880. Endwinkel des Kreissegmentes. 
  1881.  
  1882.         Procedure Arc(mx,my,phia,phib,radius: Integer; color: Byte)
  1883.  
  1884. Verändern des Linienstils
  1885.  
  1886.                                - 29 -
  1887.  
  1888.  
  1889.  
  1890. Mit Hilfe der Prozeduren SetLinePattern bzw.  GetLinePattern kann 
  1891. das Linienmuster gesetzt bzw.  ermittelt werden.  Die Vorbelegung 
  1892. des Linienmusters ist die durchgezogene Linie SolidLn. 
  1893.  
  1894.         Procedure SetLinePattern(Pattern: Word)
  1895.         Function GetLinePattern:Word
  1896.  
  1897. Der Grafikcursor
  1898.  
  1899. DeLite definiert einen Grafikcursor, der die Position der jeweils 
  1900. nächsten Ausgabe bestimmt.  Der Grafikcursor bleibt immer auf dem 
  1901. Punkt der letzten  Ausgabe stehen und wird bei der Überschreitung 
  1902. von Fenstergrenzen  nicht beeinflusst.  Folgende Befehle arbeiten 
  1903. mit dem Grafikcursor bzw.  beeinflussen dessen Position: 
  1904.  
  1905.         Function GetX :  Integer 
  1906.         Function GetY :  Integer 
  1907.         Procedure LineRel(X,Y  : Integer) 
  1908.         Procedure LineTo(X,Y :  Integer) 
  1909.         Procedure MoveRel(X,Y : Integer) 
  1910.         Procedure MoveTo(X,Y :  Integer) 
  1911.         Procedure OutText(Str : String) 
  1912.         Procedure OutTextXY(X,Y : Integer; Str : String) 
  1913.  
  1914. Alle  Prozeduren,  die mit dem Grafikcursor  arbeiten,  verwenden 
  1915. eine vorher zu setzende Zeichenfarbe.   Die Zeichenfarbe kann mit 
  1916. der Prozedur SetColor gesetzt werden.  
  1917.  
  1918.         Procedure SetColor(Color : Byte) 
  1919.  
  1920. Der Standard-Zeichensatz
  1921.  
  1922. Der Standard-Zeichensatz  wird von deLite  für Menüs  und Dialoge 
  1923. verwendet.    Seine  Auflösung  richtet  sich  nach  dem  jeweils 
  1924. verwendeten Grafiktreiber  und beträgt für VGA-Karten 8x16 Pixel. 
  1925. Die Kopplung  des Zeichensatzes  an den Grafiktreiber  bietet den 
  1926. Vorteil,  daß die Zeichen  auch bei hochauflösenden  Grafikkarten 
  1927. lesbar  bleiben.   Damit  sich  Ihr  Programm   unterschiedlichen 
  1928. Zeichengrößen anpassen kann, stehen Funktionen zur Verfügung, die 
  1929. Ihnen Informationen  über die Größe des verwendeten Zeichensatzes 
  1930. geben.  Ausgabe  eines Textes im Standardzeichensatz  Zur Ausgabe 
  1931. eines  Textes  stehen   zwei  Prozeduren   zur  Verfügung.    Sie 
  1932. unterscheiden sich in der Art der Angabe der Position, an der der 
  1933. Text  auszugeben  ist.   Während  die  Prozedur  OutTextAPI   die 
  1934. Koordinaten  in Pixeln erwartet, müssen bei der Prozedur WriteWin 
  1935. die gewünschte Zeile und Spalte angegeben werden. 
  1936.  
  1937.         Procedure OutTextAPI(x,y: Integer; InString: String; color, 
  1938.                              attrib: Byte)
  1939.         Procedure WriteWin(str: string; x,y: integer; color: Byte)
  1940.  
  1941. Ermittlung der Größe eines Zeichens
  1942.  
  1943. Die Funktionen GetFontX und GetFontY liefern die Ausdehnung eines 
  1944. Zeichens  in Pixeln  zurück.   In Verbindung  mit  der Länge  des 
  1945. auszugebenden  Textes  können  diese  Funktionen  dazu  verwendet 
  1946. werden,  die  von einem  Text  eingenommene  Bildschirmfläche  zu 
  1947. berechnen.  Auf  diese  Weise  kann  die  benötigte  Größe  eines 
  1948. Fensters zur Textausgabe berechnet werden oder ein Text innerhalb 
  1949. eines Fensters zentriert werden. 
  1950.  
  1951.                                - 30 -
  1952.  
  1953.  
  1954.  
  1955.         Function GetFontX: Byte
  1956.         Function GetFontY: Byte
  1957.  
  1958. Der skalierbare Zeichensatz
  1959.  
  1960. Der skalierbare  Zeichensatz  wird beim Start  Ihrer  Applikation 
  1961. eingeladen, kostet also zusätzlichen Speicherplatz. Sie haben die 
  1962. Wahl zwischen vier verschiedenen Zeichensätzen  und müssen in der 
  1963. Initialisierungsdatei  angeben, welchen Zeichensatz Sie verwenden 
  1964. möchten.  Zur  Zeit  stehen  die  Zeichensätze  SIMPLEX,  DUPLEX, 
  1965. TRIPLEX  und GOTHIC zur Verfügung,  weitere Zeichensätze  sind in 
  1966. Vorbereitung.   Falls   Sie   keinen   skalierbaren   Zeichensatz 
  1967. benötigen,  sollten  Sie beim Aufruf von OpenMainApplication  als 
  1968. modus die Konstante  APP_NOFONT  übergeben.   In diesem Fall wird 
  1969. kein  Zeichensatz  eingeladen,   und  Sie  sparen  Speicherplatz. 
  1970. Sollten  Sie  trotzdem   versuchen,   die  Prozedur  zur  Ausgabe 
  1971. skalierbarer  Texte  zu verwenden,  wird  Ihr Programm  mit einem 
  1972. Laufzeitfehler  abbrechen.   Die Prozedur DrawText zeichnet einen 
  1973. Text unter Verwendung des skalierbaren Zeichensatzes. 
  1974.  
  1975.         Procedure DrawText(x0,y0,fakx,faky: Integer;
  1976.                            var str: string; color: Byte)
  1977.  
  1978. Die Parameter  FakX und FakY erlauben die unabhängige  Skalierung 
  1979. der Zeichen in beiden Koordinatenachsen. 
  1980.  
  1981. Zeichenrichtung und Textstyles
  1982.  
  1983. Durch  die neuen Prozeduren  OutText  und OutTextXY  ist es jetzt 
  1984. möglich, den skalierbaren  Zeichensatz nicht nur in horizontaler, 
  1985. sondern auch in vertikaler  Richtung,  sowie in unterschiedlichen 
  1986. Ausrichtungen auszugeben. 
  1987.  
  1988. Weitere Funktionen
  1989.  
  1990. Neben  diesen  allgemein  verwendbaren   graphischen  Operationen 
  1991. stellt  der deLite-Kernel  noch einige sehr spezielle  Funktionen 
  1992. zur  Verfügung,  die  in erster  Linie  vom  deLite-API  benötigt 
  1993. werden. Diese meisten dieser Funktionen werden Sie nur benötigen, 
  1994. wenn Sie den Leistungsumfang des API erweitern möchten. 
  1995.  
  1996. Zeichnen von Ikonen
  1997.  
  1998. Ikonen sind vordefinierte  Bitmaps, die graphische  Informationen 
  1999. enthalten. Dabei unterscheidet deLite zwei verschiedene Arten von 
  2000. Ikonen.  Systemikonen sind innerhalb des Grafiktreibers definiert 
  2001. und  enthalten  die  vom  API  benötigten  Symbole.  Dazu  zählen 
  2002. beispielsweise  die  stilisierten  Pfeile,  die  innerhalb  eines 
  2003. Listendialoges    die   Schaltflächen    zum   Verschieben    der 
  2004. Auswahlmarkierung   kennzeichnen.    Mit   Hilfe   der   Prozedur 
  2005. DrawSysIcon können solche Ikonen zur Anzeige gebracht werden. 
  2006.  
  2007.         Procedure DrawSysIcon(ScrX,ScrY: Integer; Nr, Attrib: Byte)
  2008.  
  2009. Sie benötigen Systemikonen nur, wenn Sie den Leistungsumfang  des 
  2010. API erweitern  möchten.   Es ist nicht  möglich,  von Pascal  aus 
  2011. weitere Systemikonen zu definieren.  Im Gegensatz dazu stehen die 
  2012. anwenderdefinierten Ikonen zu Ihrer Verfügung. Anwenderdefinierte 
  2013. Ikonen  können  mit Hilfe der Prozedur  DrawNormIcon  zur Anzeige 
  2014. gebracht werden. 
  2015.  
  2016.                                - 31 -
  2017.  
  2018.  
  2019.  
  2020.         Procedure DrawNormIcon(ScrX,ScrY: Integer; Dx,Dy: Integer;
  2021.         Typ, Color: Byte; Storage: Pointer)
  2022.  
  2023. Ein Beispiel  soll zeigen,  wie Sie eigene Ikonen in Ihr Programm 
  2024. aufnehmen können.  Die Beispielprozedur öffnet ein Fenster in der 
  2025. Mitte   des  Bildschirmes   und  zeichnet   darin  das  Logo  der 
  2026. Technischen Universität Berlin.  Das Fenster verschwindet wieder, 
  2027. nachdem es duch WaitConfirm bestätigt wurde. 
  2028.  
  2029.         Type  IcoArray = Record
  2030.                            DeltaX : Integer;
  2031.                            DeltaY : Integer;
  2032.                            IcoArr : Array[0..199] of Byte;
  2033.                          End;
  2034.  
  2035.         Const TuB : IcoArray = (DeltaX : 39; DeltaY : 39; { Das TU Logo }
  2036.         IcoArr : $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
  2037.                  $00,$00,$00,$00,$00,$1f,$ff,$ff,$e0,$00,$3f,$ff,$ff,$f1,$ff,
  2038.                  $7f,$ff,$ff,$f9,$f9,$7f,$ff,$ff,$f9,$f7,$7f,$ff,$ff,$f9,$f1,
  2039.                  $3f,$ff,$ff,$f9,$ff,$1f,$ff,$ff,$f9,$d1,$00,$00,$0f,$f9,$ff,
  2040.                  $00,$7f,$8f,$f3,$82,$00,$7f,$8f,$f3,$fe,$00,$7f,$8f,$f3,$ee,
  2041.                  $00,$7f,$8f,$f3,$e2,$00,$7f,$8f,$f3,$fe,$00,$7f,$8f,$f3,$ce,
  2042.                  $00,$7f,$8f,$f3,$d6,$00,$ff,$9f,$f3,$c6,$00,$ff,$1f,$e7,$fc,
  2043.                  $00,$ff,$1f,$e7,$e4,$00,$ff,$1f,$e7,$d4,$00,$ff,$1f,$e7,$04,
  2044.                  $00,$ff,$1f,$e7,$fc,$00,$ff,$1f,$e7,$fc,$00,$ff,$1f,$e7,$fc,
  2045.                  $01,$ff,$1f,$e7,$fc,$01,$fe,$3f,$e7,$fc,$01,$fe,$3f,$cf,$fc,
  2046.                  $01,$fe,$3f,$cf,$f8,$01,$fe,$3f,$cf,$f8,$01,$fe,$3f,$cf,$f8,
  2047.                  $01,$fe,$3f,$cf,$f0,$01,$fe,$1f,$cf,$f0,$01,$fe,$0f,$cf,$e0,
  2048.                  $00,$00,$07,$cf,$c0,$00,$00,$03,$cf,$00,$00,$00,$00,$00,$00,
  2049.                  $00,$00,$00,$00,$00));
  2050.  
  2051.         Procedure ZeigeTuBLogo;
  2052.         Begin
  2053.           OpenWindow((GetMaxX+1) div 2,(GetMaxY+1) div 2,
  2054.                      (GetMaxX+1) div 2 +50,(GetMaxX+1) div 2 + 50);
  2055.           DrawNormIcon(5,5,TuB.DeltaX,TuB.DeltaY,1,0,@Tub40.IcoArr);
  2056.           WaitConfirm;
  2057.           CloseWindow;
  2058.         End;
  2059.  
  2060.  
  2061.  
  2062.  
  2063.  
  2064.  
  2065.  
  2066.  
  2067.  
  2068.  
  2069.  
  2070.  
  2071.  
  2072.  
  2073.  
  2074.  
  2075.  
  2076.  
  2077.  
  2078.  
  2079.  
  2080.  
  2081.                                - 32 -
  2082.  
  2083.  
  2084. 7 Die Initialisierungsdatei
  2085.  
  2086. Die Initialisierungsdatei enthält Informationen zur Konfiguration 
  2087. Ihrer   Applikation   und   wird   beim   Start   des   Programms 
  2088. interpretiert.   So kann Ihre Applikation  bequem vom Anwender an 
  2089. unterschiedliche  Umgebungen  angepaßt werden, ohne neu übersetzt 
  2090. werden zu müssen. DeLite entnimmt der Initialisierungsdatei unter 
  2091. anderem die Information,  welcher Grafiktreiber  zu verwenden ist 
  2092. und   wo  er  sich   befindet.    Ein   komfortabler   Satz   von 
  2093. Zugriffsprozeduren  erlaubt  es Ihnen,  der Initialisierungsdatei 
  2094. weitere  Informationen  hinzuzufügen  und  von Ihrer  Applikation 
  2095. einlesen  zu lassen.   Die Initialisierungsdatei  trägt den Namen 
  2096. Ihrer Applikation,  gefolgt  von der Endung  '.INI'.   Sie ist im 
  2097. ASCII-Format   abgelegt   und  kann   daher   leicht   mit  einem 
  2098. gewöhnlichen Editor modifiziert werden. Sie können den Editor von 
  2099. Turbo-Pascal dafür verwenden. 
  2100.  
  2101. Aufbau der Initialisierungsdatei
  2102.  
  2103. Die  Initialisierungsdatei  ist  in  Abschnitte  gegliedert,  die 
  2104. jeweils durch einen Blockbezeichner  voneinander  getrennt  sind. 
  2105. Der  Blockbezeichner  muß  in  eckige  Klammern  eingefaßt  sein. 
  2106. Innerhalb der Abschnitte werden Schlüsselwörter  definiert, denen 
  2107. ohne  Leerschritte   ein  Gleichheitszeichen   folgen  muß.   Dem 
  2108. Gleichheitszeichen  folgt  der diesem  Schlüsselwort  zugewiesene 
  2109. Parameter.  Ein Semikolon kennzeichnet einen Kommentar.  Der Rest 
  2110. der Zeile hinter  einem Semikolon  wird nicht mehr interpretiert. 
  2111. Steht das Semikolon  am Beginn  einer Zeile,  so wird die gesamte 
  2112. Zeile ignoriert. Die vom Kernel gestellten Zugriffsprozeduren auf 
  2113. die   Initialisierungsdatei    unterscheiden    weder   bei   den 
  2114. Abschnittsbezeichnern,  noch  bei  den Schlüsselwörtern  zwischen 
  2115. Groß-     und    Kleinschreibung.      Die    Erweiterung     der 
  2116. Initialisierungsdatei  um eigene  Abschnitte  und Schlüsselwörter 
  2117. unterliegt keinen Einschränkungen. Sie dürfen auch den vom System 
  2118. verwendeten Abschnitten weitere Schlüsselwörter  hinzufügen.  Der 
  2119. folgende  Ausschnitt  einer  Initialisierungsdatei  soll  für die 
  2120. Beschreibung der weiteren Abschnitte als Beispiel dienen: 
  2121.  
  2122.         ;Beispiel einer Initialisierungsdatei
  2123.         
  2124.         [paths]
  2125.         VDIDir=C:\TURBO\DELITE\DRIVER           ;Verzeichnis der Treiber
  2126.         FontDir=C:\TURBO\DELITE                 ;Verzeichnis der Zeichensätze
  2127.         
  2128.         [hardware]
  2129.         Video=VGA                               ;Wählt den Grafiktreiber aus
  2130.         Font=Simplex                            ;Der skalierbare Zeichensatz
  2131.         
  2132.         [Farbtabelle]
  2133.         ;       Name    Farbe   Linientyp
  2134.         LAYER=  0       15      CONTINUOUS
  2135.         LAYER=  1       2       CONTINUOUS
  2136.         LAYER=  2       3       CONTINUOUS
  2137.         LAYER=  3       15      CONTINUOUS
  2138.         LAYER=  4       5       CONTINUOUS
  2139.         LAYER=  5       6       CONTINUOUS
  2140.         LAYER=  6       14      CONTINUOUS
  2141.         LAYER=  7       7       CONTINUOUS
  2142.         
  2143.         [User]
  2144.         WelcomeText="Hallo Frank, schön dich zu sehen"  ;ein String
  2145.  
  2146.                                - 33 -
  2147.  
  2148.  
  2149.         MaxOpenFiles=10                                 ;ein LongInt
  2150.  
  2151.  
  2152. Systemabschnitte
  2153.  
  2154. Einige Abschnitte  und Schlüsselwörter  der Initialisierungsdatei 
  2155. werden vom System selbst zur Konfiguration verwendet. Während die 
  2156. meisten der Einträge  auch fehlen dürfen und in diesem Fall durch 
  2157. sinnvolle Voreinstellungen ersetzt werden, ist es zum Starten der 
  2158. deLite-Applikation   zwingend  erforderlich,  daß  der  Abschnitt 
  2159. [hardware]  vorhanden  ist.   In ihm muß das Schlüsselwort  Video 
  2160. enthalten   sein,   das   den   zu   verwendenden   Grafiktreiber 
  2161. spezifiziert.   Beachten  Sie, daß die Endung  '.VDI'  nicht  mit 
  2162. angegeben  werden darf.  Wird im Abschnitt  [paths] mit Hilfe des 
  2163. Schlüsselwortes  VDIDir kein anderer Pfad definiert, sucht deLite 
  2164. den  Grafiktreiber   im  aktuellen   Verzeichnis.    Falls   Ihre 
  2165. deLite-Applikation einen skalierbaren Zeichensatz benutzt, so muß 
  2166. dieser  im Abschnitt  [hardware]  hinter  dem Schlüsselwort  Font 
  2167. angegeben werden.  Wie bei den Grafiktreibern ist es auch für die 
  2168. Zeichensätze  möglich,  im Abschnitt  [paths] ein anderes als das 
  2169. aktuelle  Verzeichnis  anzugeben.   Der Pfad wird dazu hinter dem 
  2170. Schlüsselwort  FontDir  eingetragen.   Das System sucht weiterhin 
  2171. nach  dem  Abschnitt  [colors],  der  die vom System  verwendeten 
  2172. Farben  definiert.   Fehlt dieser  Abschnitt,  werden  vom System 
  2173. geeignete Voreinstellungen verwendet.  Die Speicherverwaltung von 
  2174. deLite    ist    ebenfalls    über    die   Initialisierungsdatei 
  2175. konfigurierbar.   Im Abschnitt  [memory]  kann definiert  werden, 
  2176. unter welchen Randbedingungen  anstelle des Heap-Speichers andere 
  2177. Speichermedien verwendet werden sollen. Eine Auflistung aller vom 
  2178. System  verwendeten  Abschnitte  und Schlüsselwörter  sowie deren 
  2179. Voreinstellungen findet sich im Anhang A wieder. 
  2180.  
  2181. Datentypen der Initialisierungsdatei
  2182.  
  2183. Für die dem Schlüsselwort  folgenden Parameter stellt deLite drei 
  2184. Datentypen zur Verfügung. Zu jedem Datentyp existiert eine eigene 
  2185. Zugriffsprozedur. 
  2186.  
  2187. Der Name
  2188.  
  2189. Namen sind Zeichenketten, die ein einzelnes Wort darstellen.  Der 
  2190. Name darf keine Leerzeichen  oder Tabulatoren  enthalten.  In der 
  2191. deLite Terminologie  wird der Name auch als ungeschützter  String 
  2192. bezeichnet.  Die Länge eines Namens ist auf 255 Zeichen begrenzt. 
  2193. In der Beispieldatei findet sich die folgende Namensdefinition: 
  2194.  
  2195.         VDIDir=C:\DELITE\DRIVER
  2196.  
  2197.  
  2198. Der  geschützte String
  2199.  
  2200. Strings sind Zeichenketten, die auch Leerschritte und Tabulatoren 
  2201. enthalten dürfen.  Sie sind in doppelte Hochkommas eingerahmt und 
  2202. dürfen  selbst kein doppeltes  Hochkomma  enthalten.   Die deLite 
  2203. Terminologie verwendet dafür den Begriff geschützter String.  Die 
  2204. Beispieldatei enthält die Stringdefinition: 
  2205.  
  2206.         WelcomeText="Hallo Frank, schön Dich zu sehen."
  2207.  
  2208.  
  2209. Der LongInt
  2210.  
  2211.                                - 34 -
  2212.  
  2213.  
  2214.  
  2215. Der  LongInt  ist  ein ganzzahliger,  numerischer  Wert.   Er ist 
  2216. identisch zum gleichnamigen Turbo Pascal Typ und umfaßt damit den 
  2217. Wertebereich von -2147483648 bis 2147483647. Unsere Beispieldatei 
  2218. verwendet die LongInt Definition: 
  2219.  
  2220.         MaxFiles=10
  2221.  
  2222.  
  2223.  
  2224. Listen in der Initialisierungsdatei
  2225.  
  2226. Die  bisher  behandelten  Einträge  in der  Initialisierungsdatei 
  2227. dienten  jeweils  der Spezifikation  eines einzelnen  Parameters. 
  2228. Darüber  hinaus  bietet  deLite die Möglichkeit,  beliebig  viele 
  2229. Parameter gleichen Typs in Form einer Liste zu spezifizieren. Zur 
  2230. Definition  einer Liste ist das gleiche  Schlüsselwort  innerhalb 
  2231. eines Abschnittes  mehrmals hintereinander  zu verwenden.   Jedes 
  2232. Auftreten dieses Schlüsselwortes  definiert jeweils einen Eintrag 
  2233. in der Liste.   Zudem  darf jeder  Eintrag  in der Liste  mehrere 
  2234. Parameter  enthalten,  die auch unterschiedlichen  Datentyps sein 
  2235. dürfen.  Dementsprechend  stellt deLite Prozeduren zur Verfügung, 
  2236. mit  denen  auf  die  einzelnen  Elemente  eines  Listeneintrages 
  2237. zugegriffen  werden kann.  Die Beispieldatei  definiert unter dem 
  2238. Abschnitt  [Farbtabelle]  eine  Liste  mit  acht  Einträgen,  die 
  2239. jeweils  drei  Parameter  enthalten.   Die  Parameter  sind  duch 
  2240. Leerzeichen oder Tabulatoren voneinander getrennt. 
  2241.  
  2242. Benutzung der Initialisierungsdatei
  2243.  
  2244. Zur  Benutzung  der  Initialisierungsdatei  stehen  dem  Anwender 
  2245. insgesamt drei Funktionen zur Verfügung.  Zwei weitere Funktionen 
  2246. erlauben  den Umgang mit Listen und werden im nächsten  Abschnitt 
  2247. beschrieben. Die Zugriffsprozeduren für die Initialisierungsdatei 
  2248. sind   alle  als  boolsche   Funktionen   deklariert.    Ist  das 
  2249. Funktionsergebnis TRUE, so war die Zugriffsaktion erfolgreich und 
  2250. der   gesuchte    Parameter    befindet    sich    in   der   als 
  2251. Variablenparameter übergebenen Variable.  Bei nicht erfolgreichem 
  2252. Zugriff  auf die Initialisierungsdatei  ist das Funktionsergebnis 
  2253. FALSE.  In diesem Fall kann eine genauere Analyse des Fehlers mit 
  2254. der Funktion KernelError erfolgen. Sie liefert ein Byte, das eine 
  2255. Fehlernummer  enthält.  Die  Deklaration  kann  dem  Referenzteil 
  2256. entnommen  werden.   Im Anhang  B befindet  sich eine Liste aller 
  2257. deLite Fehlernummern. Die Fehlernummern des Kernel reihen sich in 
  2258. diese Liste ein. 
  2259.  
  2260. Zugriff auf Namen 
  2261.  
  2262. Für   den  Zugriff   auf  Namen   ist  im  Kernel   die  Funktion 
  2263. GetInitFileName deklariert: 
  2264.  
  2265.         Function GetInitFileName(Block: BlockIDString; KeyWord: KeyString;
  2266.         Var OutVal: ValueString):Boolean;
  2267.  
  2268. Sie    sucht    in    der    Initialisierungsdatei    nach    dem 
  2269. Abschnittsbezeicher Block und dem Schlüsselwort KeyWord.  War der 
  2270. Zugriff  erfolgreich,   befindet   sich  der  dem  Schhlüsselwort 
  2271. folgende  Name in der als OutVal übergebenen  Variable.   Mit der 
  2272. schon bekannten Beispieldatei  und dem folgenden Programmfragment 
  2273. läßt sich der zu verwendende skalierbare Zeichensatz erfragen: 
  2274.  
  2275.  
  2276.                                - 35 -
  2277.  
  2278.  
  2279.         Procedure WriteFontName;
  2280.         Var TheFontName : String;
  2281.         Begin
  2282.           If GetInitFileName('hardware','Font',TheFontName) Then
  2283.             Begin
  2284.               OpenWindow(0,0,GetFontX*50,GetFontY*4)
  2285.               WriteWin('Der verwendete Font heißt:',0,1);
  2286.               WriteWin(TheFontName,0,2);
  2287.               WaitConfirm;
  2288.               CloseWindow
  2289.           Else
  2290.             ErrWindow(0,0,'Der Font wurde nicht spezifiziert');
  2291.         End
  2292.  
  2293. Zugriff auf geschützte Strings
  2294.  
  2295. Die Funktion  für den Zugriff auf geschützte  Strings ist der für 
  2296. den Zugriff auf Namen sehr ähnlich.  Beachten Sie allerdings, daß 
  2297. die   doppelten   Hochkommas   des  geschützten   Strings   nicht 
  2298. Bestandteil der in Outval übergebenen Zeichenkette sind: 
  2299.  
  2300.         Function GetInitFileString(Block: BlockIDString; KeyWord: KeyString;
  2301.         Var OutVal: ValueString):Boolean;
  2302.  
  2303.  
  2304.         Procedure WriteWelcomeText;
  2305.         Var WelcomeText : String;
  2306.         Begin
  2307.           If GetInitFileString('User','WelcomeText',WelcomeText) Then
  2308.             Begin
  2309.               OpenWindow(0,0,GetFontX*Length(WelcomeText),GetFontY*3);
  2310.               WriteWin(WelcomeText,0,1);
  2311.               WaitConfirm;
  2312.               CloseWindow;
  2313.             End
  2314.           Else
  2315.             ErrWindow(0,0,'WelcomeText wurde nicht spezifiziert');
  2316.         End;
  2317.  
  2318.  
  2319. Zugriff auf LongInts
  2320.  
  2321. Die Funktion für den Zugriff auf LongInts  folgt in der Logik den 
  2322. beiden    vorangegangenen.    Auch    sie    sucht    nach    dem 
  2323. Abschnittsbezeichner Block und dem Schlüsselwort KeyWord.  Der in 
  2324. OutVal übergebene Parameter allerdings ist ein LongInt, wie er in 
  2325. Turbo Pascal deklariert  wird.  Das folgende  Beispiel  zeigt die 
  2326. Verwendung von GetInitFileInteger: 
  2327.  
  2328.         Function GetInitFileName(Block: BlockIDString; KeyWord: KeyString;
  2329.         Var OutVal: ValueString):Boolean;
  2330.  
  2331.  
  2332.         Procedure WriteMaxFiles;
  2333.         Var MaxFiles : LongInt
  2334.         Begin
  2335.           If GetInitFileInteger('User','MaxFiles',MaxFiles) Then
  2336.               OpenWindow(0,0,GetFontX*50,GetFontY*5)
  2337.               WriteWin('Es dürfen maximal',0,1);
  2338.               WriteWin(MaxFiles,0,2);
  2339.               WriteWin('Files geöffnet werden',0,3);
  2340.  
  2341.                                - 36 -
  2342.  
  2343.  
  2344.               WaitConfirm;
  2345.               CloseWindow
  2346.           Else
  2347.             ErrWindow(0,0,'MaxFiles wurde nicht spezifiziert');
  2348.         End;
  2349.  
  2350.  
  2351. Benutzung von Listen
  2352.  
  2353. Die  Benutzung  von  Listen  in  der  Initialisierungsdatei   ist 
  2354. schwieriger, da nicht von vornherein feststeht, wieviele Einträge 
  2355. die Liste besitzt.  Da zudem ein Listeneintrag  mehrere Parameter 
  2356. unterschiedlichen Datentyps enthalten kann, muß der Programmierer 
  2357. vereinbaren, in welcher Reihenfolge die Parameter angeordnet sein 
  2358. müssen.   Der  Zugriff  auf die Elemente  einer  Liste  geschieht 
  2359. deshalb  in zwei Schritten.   Im ersten Schritt  wird die jeweils 
  2360. nächste  Zeile  der  Liste  vollständig  eingelesen.  Im  zweiten 
  2361. Schritt wird die Zeile in einzelnen Parameter  zerlegt.  Da jeder 
  2362. Parameter  von einem der drei Grunddatentypen  sein kann,  stehen 
  2363. hierfür drei Hilfsfunktionen zur Verfügung. 
  2364.  
  2365.         Function GetParaName(Var Line,OutVal: String):Boolean;
  2366.         Function GetParaString(Var Line,OutVal: String):Boolean;
  2367.         Function GetParaInteger(Var Line: String; Var OutVal: LongInt):Boolean;
  2368.  
  2369.  
  2370.         Function GetInitFileListFirst(Block: BlockIDString; KeyWord: KeyString;
  2371.         Var OutVal  : ValueString) : Boolean;
  2372.  
  2373.         Function GetInitFileListNext(KeyWord: KeyString;
  2374.         Var OutVal: ValueString):Boolean;
  2375.  
  2376. GetInitFileListFirst liest die erste Zeile im Abschnitt Block mit 
  2377. dem Schlüsselwort  KeyWord.   Alle weiteren  Zeilen  können durch 
  2378. wiederholten Aufruf von GetInitFileListNext  gelesen werden.  Das 
  2379. Ende der Liste ist erreicht,  sobald die Funktion  den Wert FALSE 
  2380. zurückliefert.    Beachten   Sie,   daß   beide   Funktionen   im 
  2381. Variablenparameter  OutVal  den gesamten  nach  dem Schlüsselwort 
  2382. verbleibenden Rest der Zeile zurückliefern.  Diese Zeile kann mit 
  2383. den Hilfsfunktionen GetParaName, GetParaString und GetParaInteger 
  2384. in einzelne  Parameter  der drei Grunddatentypen  zerlegt werden. 
  2385. Der auf diese Weise  gewonnene  Parameter  wird dabei verbraucht. 
  2386. Durch mehrmaligen  Aufruf der Hilfsfunktionen  lassen sich so aus 
  2387. einer Zeile mehrere Parameter beliebigen  Datentyps  extrahieren. 
  2388. Das   folgende   Programmbeispiel   zeigt,   wie  ein  Feld   von 
  2389. Verbundtypen  mit Werten aus der Initialisierungsdatei  vorbelegt 
  2390. werden kann.  Gleichzeitig soll demonstriert werden, wie sich die 
  2391. Syntax der vorher vereinbarten  Listeneinträge  prüfen läßt.  Der 
  2392. diesem  Programmfragment   zugrunde  liegende   Abschnitt   einer 
  2393. Initialisierungsdatei  ist unserer Beispieldatei  entnommen.  Der 
  2394. Abschnitt ist dort unter [Farbtabelle] zu finden. 
  2395.  
  2396.         Type FarbEintrag = Record
  2397.                              LayerName  : String[15];
  2398.                              LayerFarbe : Byte;
  2399.                              LayerTyp   : String[15];
  2400.                            End;
  2401.         Type Farbtabelle = Array[0..7] of FarbEintrag;
  2402.         
  2403.         Var  DieFarbtabelle : Farbtabelle;
  2404.              EingabeZeile   : String;
  2405.  
  2406.                                - 37 -
  2407.  
  2408.  
  2409.              LayerName      : String;
  2410.              LayerFarbe     : LongInt;
  2411.              LayerTyp       : String;
  2412.         
  2413.         Procedure LiesFarbtabelle;
  2414.         Var I : Integer;
  2415.         Begin
  2416.           I := 0;
  2417.           If GetInitFileListFirst('Farbtabelle','Layer',EingabeZeile) Then
  2418.             Begin
  2419.               Repeat
  2420.                 If GetParaName(EingabeZeile,LayerName) Then
  2421.                   Begin
  2422.                     If GetParaInteger(EingabeZeile,LayerFarbe) Then
  2423.                       Begin
  2424.                         If GetParaName(EingabeZeile,LayerTyp) Then
  2425.                           Begin
  2426.                             DieFarbTabelle[i].LayerName  := LayerName;
  2427.                             DieFarbtabelle[i].LayerFarbe := LayerFarbe;
  2428.                             DieFarbtabelle[i].LayerTyp   := LayerTyp;
  2429.                           End
  2430.                         Else ErrWindow(0,0,
  2431.                              'LayerTyp falsch oder nicht angegeben.');
  2432.                       End
  2433.                     Else ErrWindow(0,0,
  2434.                          'LayerFarbe falsch oder nicht angegeben.');
  2435.                   End
  2436.                 Else ErrWindow(0,0,'LayerName falsch oder nicht angegeben');
  2437.                 I := I+1;
  2438.               Until (Not GetInitFileListNext('Layer',EingabeZeile)) or (I > 7);
  2439.             End
  2440.           Else ErrWindow(0,0,'Abschnitt oder Schlüsselwort nicht gefunden');
  2441.         End;
  2442.  
  2443.  
  2444.  
  2445.  
  2446.  
  2447.  
  2448.  
  2449.  
  2450.  
  2451.  
  2452.  
  2453.  
  2454.  
  2455.  
  2456.  
  2457.  
  2458.  
  2459.  
  2460.  
  2461.  
  2462.  
  2463.  
  2464.  
  2465.  
  2466.  
  2467.  
  2468.  
  2469.  
  2470.  
  2471.                                - 38 -
  2472.  
  2473.  
  2474. 8 Die Verwendung von Systemtimern
  2475.  
  2476. Ab Version 2.0 ist deLite in der Lage, Timerevents zu generieren. 
  2477. Dafür stehen bis zu 15 voneinander  unabhängige  Systemtimer  zur 
  2478. Verfügung.  Nach dem Ablauf eines Systemtimers wird ein Event mit 
  2479. der Klasse TimerEvent erzeugt.  Das Feld ClientID des Timerevents 
  2480. enthält     die    beim    Setzen    des    Timers    vereinbarte 
  2481. Identifikationsnummer.   Das Feld Channel enthält die Kanalnummer 
  2482. des Timers und liegt im Bereich von 2 bis 16.  Zwei weitere Timer 
  2483. mit den Kananlnummern 0 und 1 werden von deLite selbst verwendet. 
  2484.  
  2485. Setzen eines Systemtimers
  2486.  
  2487. Das Setzen eines Systemtimers geschieht mit der Funktion 
  2488.  
  2489.         Function SetTimer(ClientID : Integer; Mode, 
  2490.                           MiliSecs : Word) : Integer
  2491.  
  2492. Der Parameter ClientID ist eine frei wählbare, positive Zahl, die 
  2493. größer   als  eins  sein  muss.   Anhand  dieser  Zahl  kann  die 
  2494. Empfangsprozedur  eines  Anwenderprogrammes   nach  Erhalt  eines 
  2495. Timerevents erkennen, wem dieses Timerevent gehört. Wir empfehlen 
  2496. als  ClientID  die  ID zu verwenden,  die  durch  GetMainID  oder 
  2497. OpenSubApplication   zurückgeliefert   wird.    Mit   Mode   wird 
  2498. festgesetzt, in welchem Modus der Timer startet. DeLite definiert 
  2499. die Konstanten SingleShot und ContinuousShots  zur Moduswahl.  Im 
  2500. Modus  SingleShot   generiert   der  Systemtimer   ein  einzelnes 
  2501. Timerevent  , das nach Ablauf  der durch MiliSecs  spezifizierten 
  2502. Zeitdauer ausgelöst wird. Danach stoppt der Timer selbsttätig und 
  2503. gibt sich wieder  frei.  Ein mit diesen  Modus gestarteter  Timer 
  2504. kann  vorzeitig  mit  der  Prozedur  StopTimer   angehalten   und 
  2505. freigegeben werden. Der Modus SingleShot kann z.B. dazu verwendet 
  2506. werden, um bei einer Benutzereingabe  zusätzlich einen Timeout zu 
  2507. überwachen.     Im   Modus   ContinuousShots    werden    jeweils 
  2508. kontinuierlich  nach  Ablauf  des durch  MiliSecs  spezifizierten 
  2509. Zeitintervalls  Timerevents  ausgelöst.   DeLite macht von diesem 
  2510. Modus  z.B.   beim  Blinken  des  Cursors  in  Texteingabefeldern 
  2511. Gebrauch. Ein mit diesem Modus initialisierter Timer stoppt nicht 
  2512. von selbst und muss daher explizit  durch die Prozedur  StopTimer 
  2513. angehalten  und  freigegeben   werden.   Der  Parameter  MiliSecs 
  2514. spezifiziert  die Zeitdauer,  nach  der ein Timerevent  ausgelöst 
  2515. wird.  Die Angabe  erfolgt  in Millisekunden.   Ein Wert von 1000 
  2516. würde nach einer Sekunde ein Event auslösen.  Beachten Sie bitte, 
  2517. daß die Auflösung des Timers aus hardwaretechnichen  Gründen 18.2 
  2518. ms beträgt.  Das heißt, daß der angegebene Zeitwert immer auf ein 
  2519. ganzzahliges Vielfach von 18.2 ms gerundet wird. Der Rückgabewert 
  2520. der Funktion  SetTimer  liefert  die Kanalnummer  des verwendeten 
  2521. Timers.   Damit  hat  ein  Anwenderprogramm   grundsätzlich   die 
  2522. Möglichkeit,  mehrere Timer mit der selben ID zu verwenden und zu 
  2523. unterscheiden.   Wird die Kanalnummer -1 zurückgeliefert,  konnte 
  2524. kein weiterer Timer mehr gestartet werden. 
  2525.  
  2526. Stoppen eines Systemtimers
  2527.  
  2528. Um einen  aktiven  Timer  zu stoppen,  verwenden  Sie  bitte  die 
  2529. Prozedur 
  2530.  
  2531.         Procedure StopTimer(ClientID, TimerChannel : Integer)
  2532.  
  2533. Geben Sie dazu als ClientID  den selben Wert an, der beim Starten 
  2534. des Timers verwendet wurde.  Als TimerChannel muß die Kanalnummer 
  2535.  
  2536.                                - 39 -
  2537.  
  2538.  
  2539. des Timers angegeben werden.  Sie wurde als Rückgabewert  von der 
  2540. Funktion SetTimer geliefert.  Der Timer wird durch diese Prozedur 
  2541. sofort angehalten und freigegeben. 
  2542.  
  2543.  
  2544.  
  2545.  
  2546.  
  2547.  
  2548.  
  2549.  
  2550.  
  2551.  
  2552.  
  2553.  
  2554.  
  2555.  
  2556.  
  2557.  
  2558.  
  2559.  
  2560.  
  2561.  
  2562.  
  2563.  
  2564.  
  2565.  
  2566.  
  2567.  
  2568.  
  2569.  
  2570.  
  2571.  
  2572.  
  2573.  
  2574.  
  2575.  
  2576.  
  2577.  
  2578.  
  2579.  
  2580.  
  2581.  
  2582.  
  2583.  
  2584.  
  2585.  
  2586.  
  2587.  
  2588.  
  2589.  
  2590.  
  2591.  
  2592.  
  2593.  
  2594.  
  2595.  
  2596.  
  2597.  
  2598.  
  2599.  
  2600.  
  2601.                                - 40 -
  2602.  
  2603.  
  2604. 9 Referenz
  2605.  
  2606. Dieses Kapitel enthält eine alphabetische  Liste aller Funktionen 
  2607. und Prozeduren des deLite-Toolkits.  Es ist jeweils angegeben, in 
  2608. welchem  Unit die Prozedur  deklariert  ist, wie die vollständige 
  2609. Deklaration lautet und welche Bedeutung die übergebenen Parameter 
  2610. haben.  In vielen Fällen erläutert ein Beispiel die Anwendung der 
  2611. Prozedur.  Beachten Sie bitte auch die Objektreferenz  in Kapitel 
  2612. 10. 
  2613.  
  2614.  
  2615. ActivateApplication                                                     API
  2616.  
  2617. Deklaration     Procedure ActivateApplication(ID: Integer)
  2618. Funktion        Reaktiviert den Viewport eines Klienten
  2619. Parameter       ID              Identifikationsnummer des Klienten
  2620. Hinweis         Mausereignisse werden einem Klienten zugeschickt, wenn 
  2621.                 sie innerhalb seiner Viewports stattgefunden haben. 
  2622.                 Mit der Prozedur SuspendApplication kann der 
  2623.                 Dispatcher angewiesen werden, den Viewport eines 
  2624.                 Klienten bei der Verteilung von Mausereignissen nicht 
  2625.                 zu berücksichtigen. ActivateApplication hebt die Wirkung 
  2626.                 eines Aufrufs von SuspendApplication wieder auf.
  2627. Siehe auch      SuspendApplication, GetMainID
  2628.  
  2629.  
  2630. Arc                                                                     Kernel
  2631.  
  2632. Deklaration     Procedure Arc(Mx,My: Integer; PhiA, PhiB, 
  2633.                 radius: Integer; Color: Byte)
  2634. Funktion        Zeichnet ein Kreissegment
  2635. Parameter       Mx,My   Koordinaten des Mittelpunktes
  2636.                 PhiA,PhiB       Anfangs- und Endwinkel
  2637.                 radius  Radius
  2638.                 Color   Farbe
  2639. Hinweis         Die Zeichnung erfolgt im mathematisch positiven Sinn.
  2640. Beispiel                Arc(100,100,180,0,100,15)
  2641.                 zeichnet die untere Hälfte eines weißen Kreises an der 
  2642.                 Position (100,100) mit dem Radius 100. Um die obere Hälfte 
  2643.                 eines Kreises zu zeichnen, müßten Anfangs- und Endwinkel 
  2644.                 vertauscht werden.
  2645. Siehe auch      Circle
  2646.  
  2647.  
  2648. Bar                                                                     Kernel
  2649.  
  2650. Deklaration     Procedure Bar(x1,y1,x2,y2 : Integer; Color : Byte);
  2651. Funktion        Zeichnet eine ausgefüllte rechteckige Fläche
  2652. Parameter       x1,y1   Koordinaten der linken oberen Ecke
  2653.                 x2,y2   Koordinaten der rechten unteren Ecke
  2654.                 Color   Farbe
  2655. Hinweis         Die Koordinaten der Ecken können vertauscht werden
  2656.  
  2657.  
  2658. CheckMenuItem                                                           API
  2659.  
  2660. Deklaration     Procedure CheckMenuItem(Menu: hmenu; ID: MenueID; 
  2661.                                         wCheck: MenueFlags)
  2662. Funktion        Setzt oder entfernt eine Überprüfungsmarke vor einem 
  2663.                 Menüeintrag
  2664. Parameter       Menu    Zeiger auf den Menübaum
  2665.  
  2666.                                - 41 -
  2667.  
  2668.  
  2669.                 ID      Identifikationsnummer des Menüeintrages
  2670.                 wCheck  MF_CHECKED oder MF_UNCHECKED
  2671. Hinweis         Die Angabe von MF_CHECKED bewirkt das Setzen einer 
  2672.                 Überprüfungsmarke, während MF_UNCHECKED die Überprüfungs-
  2673.                 marke entfernt. Die Überprüfungsmarke ist als Häkchen 
  2674.                 links neben dem Menütext sichtbar.
  2675. Beispiel                CheckMenuItem(GetMenu,101,MF_CHECKED)
  2676.                 setzt eine Überprüfungsmarke vor den Menüeintrag 101 im 
  2677.                 Hauptmenü
  2678. Siehe auch      EnableMenuItem, GetMenuFlags, GetMenuString, GetSubMenu, 
  2679.                 GetMenu, ReplaceMenuItem
  2680.  
  2681.  
  2682. Circle                                                                  Kernel
  2683.  
  2684. Deklaration     Procedure Circle(Mx,My : Integer; radius : Integer; 
  2685.                                  Color : Byte)
  2686. Funktion        Zeichnet einen Kreis
  2687. Parameter       My,My   Koordinaten des Mittelpunktes
  2688.                 radius  Radius
  2689.                 Color   Farbe
  2690. Hinweis         Verzerrungen durch das vom Monitor abweichende Höhen/
  2691.                 Breitenverhältnis der Grafikkarte werden korrigiert.
  2692. Siehe auch      Arc
  2693.  
  2694.  
  2695. ClearWindow                                                             API
  2696.  
  2697. Deklaration     Procedure ClearWindow
  2698. Funktion        Löscht das aktuelle Fenster
  2699. Hinweis         Einige Grafiktreiber erlauben die Vereinbarung einer anderen 
  2700.                 Hintergrundfarbe als Schwarz. In diesem Fall bewirkt ein 
  2701.                 Löschen des Viewports die Belegung des Viewports mit der in 
  2702.                 der Initialisierungsdatei angegebenen Hintergrundfarbe. 
  2703. Siehe auch      ClearViewPort
  2704.  
  2705.  
  2706. CloseMainApplication                                                    API
  2707.  
  2708. Deklaration     Procedure CloseMainApplication
  2709. Funktion        Beendet die laufende Anwendung und schaltet zurück in den 
  2710.                 Textmodus. 
  2711. Hinweis         Alle erforderlichen Deinstallationen werden durchgeführt. Ein 
  2712.                 Aufruf von CloseMainApplication ist üblicherweise die letzte 
  2713.                 Anweisung einer deLite-Applikation.
  2714. Siehe auch      OpenMainApplication
  2715.  
  2716.  
  2717. CloseSubApplication                                                     API
  2718.  
  2719. Deklaration     Procedure CloseSubApplication(ID: Integer)
  2720. Funktion        Schließt eine Subapplikation. Der entsprechende Klient wird 
  2721.                 aus der Klientenliste entfernt.
  2722. Parameter       ID              Identifikationsnummer des Klienten
  2723. Hinweis         Der vom Viewport des Klienten zuvor belegte Bildschirmbereich 
  2724.                 wird nicht wiederhergestellt. 
  2725. Siehe auch      OpenSubApplication
  2726.  
  2727.  
  2728. CloseWindow                                                             API
  2729.  
  2730.  
  2731.                                - 42 -
  2732.  
  2733.  
  2734. Deklaration     Procedure CloseWindow
  2735. Funktion        Schließt ein mit OpenWindow geöffnetes Fenster
  2736. Hinweis         Da auch alle Dialogfunktionen ihre Fenster mit OpenWindow 
  2737.                 öffnen, würde CloseWindow auch einen gerade offenen Dialog 
  2738.                 schließen. Tatsächlich bestehen die Prozeduren zum Schließen 
  2739.                 von Dialogen lediglich aus einem Aufruf von CloseWindow. 
  2740.                 Es wird immer das oberste Fenster geschlossen. Dabei wird 
  2741.                 der zuvor verdeckte Bildschirminhalt wiederhergestellt.
  2742. Siehe auch      OpenWindow
  2743.  
  2744. ContinueToDispatch                                                      API
  2745.  
  2746. Deklaration     Procedure ContinueToDispatch
  2747. Funktion        Beendet den exklusiven Empfang von Botschaften
  2748. Hinweis         Die Prozedur ContinueToDispatch macht einen vorherigen Aufruf 
  2749.                 von ReceiveExclusive rückgängig. Danach nimmt der Dispatcher 
  2750.                 seine Arbeit wieder auf und verteilt die Botschaften an die 
  2751.                 jeweils zuständigen Klienten.
  2752. Siehe auch      ReceiveExclusive
  2753.  
  2754.  
  2755. DispatchMessage                                                         API
  2756.  
  2757. Deklaration     Procedure DispatchMessage(TheMessage: EventTyp)
  2758. Funktion        Schickt eine zuvor mit GetEvent geholte Botschaft zur 
  2759.                 Weiterleitung an den Dispatcher
  2760. Parameter       TheMessage              Die Botschaft
  2761. Hinweis         Der  Dispatcher   wird  die  Botschaft   an  den  dafür 
  2762.                 zuständigen Klienten senden, indem dessen Empfangsprozedur  
  2763.                 mit der  Botschaft als übergebenem  Parameter  aufgerufen
  2764.                 wird. Mausereignisse werden  dem  Klienten  übermittelt, 
  2765.                 in  dessen Viewport  sie stattgefunden  haben.   In diesem 
  2766.                 Fall werden  die Koordinaten auf Werte relativ  zur linken
  2767.                 oberen  Ecke  des Viewports    umgerechnet. Andere Ereignisse 
  2768.                 werden der Empfangsprozedur der Hauptapplikation  zugeschickt.
  2769.                 Sollte ein Klient sich als exclusiver Klient angemeldet haben,
  2770.                 erhält er auch Mausereignisse, die sich nicht innerhalb seines
  2771.                 Viewports abgespielt  haben.  Solche  Ereignisse  können  
  2772.                 nicht  auf  die Koordinaten  des Viewports  bezogen werden und
  2773.                 erhalten  anstelle der Klasse LeMouse die Klasse 
  2774.                 MouseUnnormalized. 
  2775.  
  2776. Beispiel        
  2777.         Procedure EventHandler(TheEvent: EventTyp);
  2778.         Begin
  2779.           If TheEvent.Class = MouseUnnormalized then
  2780.             begin
  2781.               TheEvent.Class := LeMouse;
  2782.               ContinueToDispatch;
  2783.               DispatchMessage(TheEvent);
  2784.             end;
  2785.  
  2786.         Das Programmfragment entstammt einer Botschaftenempfangsprozedur, 
  2787.         die sich kurzzeitig als exclusiver Klient angemeldet  hat Nachdem 
  2788.         eine Botschaft empfangen wird, die nicht normalisiert werden kann 
  2789.         und daher eigentlich  einem anderen Klienten gehört, wird der Typ 
  2790.         der Botschaft  wieder auf LeMouse  zurückgesetzt  und erneut  dem 
  2791.         Dispatcher  gegeben,  nachdem  er mit  ContinueToDispatch  wieder 
  2792.         aktiviert  wurde.  So ist sichergestellt,  daß die Botschaft doch 
  2793.         noch  beim richtigen  Empfänger  ankommt.
  2794. Siehe auch      GetEvent, PostMessage 
  2795.  
  2796.                                - 43 -
  2797.  
  2798.  
  2799.  
  2800.  
  2801. DrawNormIcon                                                            Kernel
  2802.  
  2803. Deklaration     Procedure DrawNormIcon(ScrX,ScrY, Dx, Dy : Integer;
  2804.                 Typ, Color: Byte; Storage: Pointer)
  2805. Funktion        Zeichnet ein anwenderdefiniertes Icon
  2806. Parameter       ScrX, ScrY      Position der linken oberen Ecke
  2807.                 Dx, Dy  Ausmasse des Icons in Pixeln
  2808.                 Typ             Zur Zeit wird nur der Typ 1 verwendet
  2809.                 Color   Zeichenfarbe des Icons  
  2810.                 Storage Zeiger auf die Bitmap des Icons
  2811. Hinweis         Icons sind bitweise abgelegte, monochrome Grafiken, deren 
  2812.                 einzelnen Zeilen immer auf Byte-Grenzen enden. Der Parameter 
  2813.                 Typ ist für zukünftige Erweiterungen vorgesehen. Es wird zur 
  2814.                 Zeit nur der Typ 1 verwendet. Dieser Typ gibt an, daß das Icon 
  2815.                 mit der Zeichenfarbe Color in die Grafik geschrieben wird.
  2816.                 Das Beispiel zeigt eine Prozedur, die das Logo der Technischen 
  2817.                 Universität Berlin in ein Fenster in die Mitte des Bildschirms
  2818.                 zeichnet und danach auf Bestätigung wartet. Die Konstanten-
  2819.                 definition TuB enthält die Bitmap des Logos.
  2820. Beispiel
  2821.         Type  IcoArray = Record
  2822.                            DeltaX : Integer;
  2823.                            DeltaY : Integer;
  2824.                            IcoArr : Array[0..199] of Byte;
  2825.                          End;
  2826.  
  2827.         Const TuB : IcoArray = (DeltaX : 39; DeltaY : 39; { Das TU Berlin
  2828.                                                             Logo }
  2829.         IcoArr : $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
  2830.                  $00,$00,$00,$00,$00,$1f,$ff,$ff,$e0,$00,$3f,$ff,$ff,$f1,$ff,
  2831.                  $7f,$ff,$ff,$f9,$f9,$7f,$ff,$ff,$f9,$f7,$7f,$ff,$ff,$f9,$f1,
  2832.                  $3f,$ff,$ff,$f9,$ff,$1f,$ff,$ff,$f9,$d1,$00,$00,$0f,$f9,$ff,
  2833.                  $00,$7f,$8f,$f3,$82,$00,$7f,$8f,$f3,$fe,$00,$7f,$8f,$f3,$ee,
  2834.                  $00,$7f,$8f,$f3,$e2,$00,$7f,$8f,$f3,$fe,$00,$7f,$8f,$f3,$ce,
  2835.                  $00,$7f,$8f,$f3,$d6,$00,$ff,$9f,$f3,$c6,$00,$ff,$1f,$e7,$fc,
  2836.                  $00,$ff,$1f,$e7,$e4,$00,$ff,$1f,$e7,$d4,$00,$ff,$1f,$e7,$04,
  2837.                  $00,$ff,$1f,$e7,$fc,$00,$ff,$1f,$e7,$fc,$00,$ff,$1f,$e7,$fc,
  2838.                  $01,$ff,$1f,$e7,$fc,$01,$fe,$3f,$e7,$fc,$01,$fe,$3f,$cf,$fc,
  2839.                  $01,$fe,$3f,$cf,$f8,$01,$fe,$3f,$cf,$f8,$01,$fe,$3f,$cf,$f8,
  2840.                  $01,$fe,$3f,$cf,$f0,$01,$fe,$1f,$cf,$f0,$01,$fe,$0f,$cf,$e0,
  2841.                  $00,$00,$07,$cf,$c0,$00,$00,$03,$cf,$00,$00,$00,$00,$00,$00,
  2842.                  $00,$00,$00,$00,$00));
  2843.  
  2844.         Procedure ZeigeTuBLogo;
  2845.         Begin
  2846.           OpenWindow((GetMaxX+1) div 2,(GetMaxY+1) div 2,
  2847.                      (GetMaxX+1) div 2 +50,(GetMaxX+1) div 2 + 50);
  2848.           DrawNormIcon(5,5,TuB.DeltaX,TuB.DeltaY,1,0,@Tub40.IcoArr);
  2849.           WaitConfirm;
  2850.           CloseWindow;
  2851.         End;
  2852.  
  2853.  
  2854. DrawText                                                                Kernel
  2855.  
  2856. Deklaration     Procedure DrawText(X0, Y0, FakX, FakY: Integer;
  2857.                 Var Str: String; color: Byte)
  2858. Funktion        Zeichnet einen Text mit Hilfe eines skalierbaren Zeichensatzes
  2859. Parameter       X0, Y0  Startposition
  2860.  
  2861.                                - 44 -
  2862.  
  2863.  
  2864.                 FakX, FakY      Skalierungsfaktoren für die Ausgabe der 
  2865.                                 Buchstaben
  2866.                 Str             Der zu zeichnende Text
  2867.                 color   Die Farbe des Textes
  2868. Hinweis         Die von deLite verwendeten skalierbaren Zeichensätze können 
  2869.                 durch die Angabe von FakX und FakY in den Richtungen der 
  2870.                 beiden Hauptachsen unabhängig voneinander skaliert werden. 
  2871.                 Die Faktoren geben dabei die Höhe und Breite der Buchstaben in 
  2872.                 Pixeln auf dem Bildschirm an. Der Wertebereich dieser Faktoren 
  2873.                 muss innerhalb der Grenzen von 1 - 512 liegen.
  2874.                 
  2875.                 Das Beispiel gibt den Text 'Hello, world' in der Farbe weiß in 
  2876.                 der linken oberen Ecke des aktuellen ViewPort aus. Die Höhe 
  2877.                 der Zeichen beträgt 32 Pixel auf dem Bildschirm.
  2878.                 Ab deLite Version 1.1 steht für die Ausgabe von Texten mit 
  2879.                 Hilfe des skalierbaren Zeichensatzes die wesentlich 
  2880.                 mächtigeren Prozeduren OutText und OutTextXY zur Verfügung. 
  2881.                 DrawText sollte deshalb nicht mehr verwendet werden.
  2882. Beispiel                DrawText(0,0,32,32,'Hello, world',15)
  2883. Siehe auch      InitFont, OutText, OutTextXY
  2884.  
  2885.  
  2886. EnableMenuItem                                                          API
  2887.  
  2888. Deklaration     Procedure EnableMenuItem(Menu: hMenu; ID: MenuID;
  2889.                 wEnable: MenuFlags)
  2890. Funktion        Sperrt oder erlaubt die Auswahl eines Menüeintrages
  2891. Parameter       Menu    Zeiger auf das Menü
  2892.                 ID              ID des Menüeintrages
  2893.                 wEnable kann einen der folgenden Werte annehmen
  2894.                         MF_ENABLED      erlaubt die Auswahl des Eintrags
  2895.                         MF_DISABLED     sperrt die Auswahl des Eintrags
  2896. Hinweis         Gesperrte Menüeinträge werden optisch entsprechend
  2897.                 gekennzeichnet. Die kontextabhängige Hilfe bleibt auch für 
  2898.                 gesperrte Menüeinträge funktionsfähig.
  2899. Beispiel                EnableMenuItem(GetMenu,101,MF_DISABLED);
  2900.                 sperrt den Eintrag 101 im Hauptmenü
  2901. Siehe auch      GetMenu, GetMenuFlags,CheckMenuItem
  2902.  
  2903.  
  2904. ErrWindow                                                               API
  2905.  
  2906. Deklaration     Procedure ErrWindow(x,y: Integer; errtext: String)
  2907. Funktion        Gibt einen Text in einem Fenster als Fehlermeldung aus
  2908. Parameter       x,y             Position des Fensters
  2909.                 errtext Die Fehlermeldung
  2910. Hinweis         Fehlermeldungen werden von dieser Prozedur in einem Fenster 
  2911.                 mit der Hintergrundfarbe ErrBkColor ausgegeben. Diese Farbe 
  2912.                 ist standardmässig rot, kann aber in der Initialisierungsdatei 
  2913.                 umdefiniert werden. 
  2914. Siehe auch      OpenWindow, WriteWin, SysWindow
  2915.  
  2916.  
  2917. FlushQueue                                                              Kernel
  2918.  
  2919. Deklaration     Procedure FlushQueue
  2920. Funktion        Verwirft alle Einträge der Botschaftenwarteschlange
  2921. Hinweis         Während der Ausführung zeitaufwendiger Programmteile, in 
  2922.                 denen längere Zeit keine Botschaften mit GetEvent geholt 
  2923.                 werden, kann es sein, daß die Botschaftenwarteschlange 
  2924.                 komplett gefüllt wird. Ohne einen Aufruf von FlushQueue 
  2925.  
  2926.                                - 45 -
  2927.  
  2928.  
  2929.                 würden die zwischenzeitlich angefallenen Botschaften danach 
  2930.                 abgearbeitet werden. In Situationen, in denen das unerwünscht 
  2931.                 ist, kann ein Aufruf von FlushQueue die Warteschlange 
  2932.                 vollständig löschen
  2933. Siehe auch      GetEvent, PutEvent
  2934.  
  2935.  
  2936. FrameSubApplication                                                     API
  2937.  
  2938. Deklaration     Procedure FrameSubApplication(ID, color: Integer)
  2939. Funktion        Zeichnet einen Rahmen um den Viewport eines Klienten
  2940. Parameter       ID              Identifikationsnummer des Klienten
  2941.                 color   Farbe des Rahmens
  2942. Hinweis         Bei der Aufteilung der Bildschirmfläche auf mehrere Klienten 
  2943.                 kann es sinnvoll sein, den jeweils aktiven Klienten zu 
  2944.                 kennzeichnen. Mit Hilfe von FrameSubApplication kann die 
  2945.                 Farbe der Rahmen um die Viewports der einzelnen Klienten 
  2946.                 individuell gesetzt werden. Ein Aufruf von FrameSubApplication 
  2947.                 bleibt wirkungslos, falls bei der Anmeldung des Klienten mit 
  2948.                 OpenSubApplication als Filter APP_NOFRAME angegeben wurde.
  2949. Siehe auch      OpenSubApplication
  2950.  
  2951.  
  2952. GetDriverName                                                           Kernel
  2953.  
  2954. Deklaration     Function GetDriverName: String
  2955. Funktion        Liefert den Namen des benutzten Grafiktreibers
  2956. Ergebnis        Der Name des Grafiktreibers wird als String zurückgeliefert
  2957. Hinweis         Für die Standardgrafikadapter sind die Namen EGA, VGA und HGC 
  2958.                 definiert worden, Grafikkarten mit höherer Auflösung enthalten 
  2959.                 in der Regel zusätzlich einen Hinweis auf die Auflösung und 
  2960.                 die Anzahl der verfügbaren Farben. 
  2961.  
  2962.  
  2963. GetEvent                                                                Kernel
  2964.  
  2965. Deklaration     Procedure GetEvent(Var Event : EventTyp)
  2966. Funktion        Liefert das nächste Ereignis aus der Ereigniswarteschlange
  2967. Parameter       Event   Das Ereignis
  2968. Hinweis         Der Verbundtyp EventTyp beschreibt die innerhalb des Systems 
  2969.                 auftretenden Ereignisse und Botschaften. Während Ereignisse 
  2970.                 unmittelbar von der Hardware erzeugt werden, dienen 
  2971.                 Botschaften dem Austausch von Informationen zwischen den 
  2972.                 einzelnen Klienten und dem deLite API. Botschaften werden 
  2973.                 z.B. erzeugt, wenn ein Menüpunkt ausgewählt wird.
  2974.                 EventTyp = RECORD
  2975.                              TimeStamp  : Word;
  2976.                              Case Class : EventTypes of
  2977.                                TimerEvent  : (
  2978.                                         ClientID     : Integer;
  2979.                                             TimerChannel : Integer;
  2980.                                      );
  2981.                        DialogEvent : (
  2982.                             ID,MSG       : integer;
  2983.                             DlgAdr       : Pointer;
  2984.                                      );
  2985.                        Menu         : (MenuItemID : Integer);
  2986.                        LeMouse, DoubleClick, MouseUnNormalized,
  2987.                        NormKey, AltKey, CtrlKey, FKey,
  2988.                        DoRedraw, Terminate, 
  2989.                        UserEvent
  2990.  
  2991.                                - 46 -
  2992.  
  2993.  
  2994.                        Void        : (
  2995.                             Attrib       : CHAR;
  2996.                             x,y          : INTEGER;
  2997.                                      );
  2998.                    End; { Case & Record }
  2999.  
  3000. Die Verbundkomponente  Class enthält die Art des Ereignisses oder 
  3001. der Botschaft.   Abhängig  von ihrem Inhalt werden  die folgenden 
  3002. drei Verbundkomponenten  unterschiedlich  interpretiert.  Hat das 
  3003. Ereignis   etwa   eine   räumliche   Bedeutung,    wie   es   bei 
  3004. Mausereignissen der Fall ist, so geben die Felder x und y den Ort 
  3005. des  Ereignisses  an.  Die  folgende  Auflistung  beschreibt  die 
  3006. Bedeutung  der einzelnen Verbundkomponenten  in Abhängigkeit  von 
  3007. Class.  Die jeweils nicht beschriebenen Verbundkomponenten  haben 
  3008. keine Bedeutung.
  3009.  
  3010. LeMouse                 Ein Mausereignis ist aufgetreten. Attrib enthält
  3011.                         bitweise kodiert den Status der Maustasten. Die 
  3012.                         Verbundkomponenten x und y enthalten die Position des
  3013.                         Mausereignisses. Die Mausereignisse vom Typ LeMouse
  3014.                         sind normalisiert, das heißt, sie sind relativ zur
  3015.                         linken oberen Ecke des Viewports des empfangenden
  3016.                         Klienten. Die einzelnen Bits der Verbundkomponente
  3017.                         Attrib haben die folgende Bedeutung: 
  3018.  
  3019.                                 $01 = Die Maus hat sich bewegt
  3020.                                 $02 = Linke Maustaste wurde gedrückt
  3021.                                 $04 = Linke Maustaste wurde losgelassen
  3022.                                 $08 = Rechte Maustaste wurde gedrückt
  3023.                                 $10 = Rechte Maustaste wurde losgelassen
  3024.                                 $20 = Mittlere Maustaste wurde gedrückt
  3025.                                 $40 = Mittlere Maustaste wurde losgelassen
  3026.  
  3027. MouseUnnormalized       Ein Mausereignis ist aufgetreten. Für die Verbund-
  3028.                         komponente Attrib gilt das gleiche wie bei LeMouse.
  3029.                         Die Verbundkomponenten x und y enthalten die Position
  3030.                         des Mausereignisses. Das Ereignis konnte nicht 
  3031.                         normalisiert werden, fand also außerhalb des Viewports
  3032.                         des empfangenden Klienten statt.
  3033. NormKey                 Ein normale Taste wurde gedrückt. Die Verbund-
  3034.                         komponente Attrib enthält den ASCII Wert der 
  3035.                         gedrückten Taste.
  3036. AltKey                  Ein Taste wurde in Verbindung mit der Taste Alt 
  3037.                         gedrückt. Attrib enthält den ASCII Wert der 
  3038.                         gedrückten Taste.
  3039. CtrlKey                 Eine Taste wurde in Verbindung mit der Taste Ctrl 
  3040.                         gedrückt. Attrib enthält den ASCII Wert der gedrückten 
  3041.                         Taste. Beachten Sie, daß die Taste RETURN  als CtrlKey 
  3042.                         mit Attrib=m übergeben wird.
  3043. Fkey                    Eine Funktionstaste wurde gedrückt. Attrib enthält den 
  3044.                         Scan Code der gedrückten Funktionstaste.
  3045. Menu                    Ein Menüpunkt wurde ausgewählt. Die Verbundkomponente 
  3046.                         MenuItemID enthält die in der Menüressource 
  3047.                         vereinbarte Nummer.
  3048. DoRedraw                Der Viewport des Klienten ist zerstört worden, er muß 
  3049.                         vom Klienten erneut gezeichnet werden. 
  3050. DialogEvent             Ein Dialogelement wurde betätigt. MSG enthält die 
  3051.                         Nachricht, ID enthält die ID-Nummer des betätigten 
  3052.                         Dialogelementes. In DlgAdr wird die Adresse des 
  3053.                         Dialoges, zu dem das Element gehört, übergeben.
  3054. TimerEvent              Ein Timer ist abgelaufen. ClientID enthält die beim 
  3055.  
  3056.                                - 47 -
  3057.  
  3058.  
  3059.                         Starten des Timers mittels SetTimer vereinbarte 
  3060.                         ID-Nummer. In TimerChannel wird die interne 
  3061.                         Kanalnummer übergeben.
  3062. void                    Die Ereigniswarteschlange ist leer.
  3063. Siehe auch      DispatchMessage, FlushQueue, PostMessage, PutEvent
  3064.  
  3065.  
  3066. GetFirstTopic                                                           API
  3067.  
  3068. Deklaration     Procedure GetFirstTopic(Var Name: NameString: var eol: boolean)
  3069. Funktion        Liefert das erste Hilfestichwort aus der allgemeinen Hilfedatei
  3070. Parameter       Name            enthält nach der Ausführung das Stichwort
  3071.                 eol             wird TRUE, falls keine weiteren Stichworte 
  3072.                                 enthalten sind
  3073. Hinweis         Diese Prozedur wird als Callback-Prozedur von der allgemeinen 
  3074.                 Hilfe verwendet. Die Prozedur kann einem Listendialog zur 
  3075.                 Ermittlung der Liste der Einträge dienen. Die allgemeine 
  3076.                 Hilfedatei trägt den Namen des Hauptprogramms, der bei 
  3077.                 OpenMainApplication angegeben wurde, und endet auf '.hlp'.
  3078. Siehe auch      GetNextTopic
  3079.  
  3080.  
  3081. GetFontX                                                                Kernel
  3082.  
  3083. Deklaration     Function GetFontX: Byte
  3084. Funktion        Liefert die Breite eines Zeichens des Standardzeichensatzes in 
  3085.                 Pixeln
  3086. Ergebnis        Das Ergebnis vom Typ Byte wird bei Standard-EGA und VGA-Karten 
  3087.                 8 Pixel und bei der Hercules-Karte 9 Pixel betragen. Bei 
  3088.                 Karten mit sehr hoher Auflösung sind die Zeichen größer, um 
  3089.                 die Lesbarkeit zu gewährleisten.
  3090. Hinweis         Diese Funktion wird vorteilhaft eingesetzt, wenn die Größe 
  3091.                 eines Textausgabefensters zu berechnen ist. Es ist nicht zu 
  3092.                 empfehlen, die Größe solcher Fenster fest zu dimensionieren, 
  3093.                 da dann unter Umständen auf Grafikkarten mit sehr hoher 
  3094.                 Auflösung nicht alle Zeichen im Fenster Platz finden
  3095. Siehe auch      GetFontY, WriteWin
  3096.  
  3097.  
  3098. GetFontY                                                                Kernel
  3099.  
  3100. Deklaration     Function GetFontY: Byte
  3101. Funktion        Liefert die Höhe eines Zeichens des Standardzeichensatzes in 
  3102.                 Pixeln
  3103. Ergebnis        Das Ergebnis vom Typ Byte wird bei EGA-Karten 14 und bei 
  3104.                 VGA-Karten 16 Pixel betragen. Bei Karten mit höherer Auflösung 
  3105.                 sind die Zeichen größer, um die Lesbarkeit zu gewährleisten.
  3106. Hinweis         Diese Funktion wird vorteilhaft eingesetzt, wenn die Größe 
  3107.                 eines Textausgabefensters zu berechnen ist. Anstatt die Größe
  3108.                 des Fensters fest zu dimensionieren, sollte sie aus der Anzahl 
  3109.                 der Zeilen und FontY bzw. der Anzahl der Spalten und FontX 
  3110.                 berechnet werden.
  3111. Siehe auch      GetFontX, WriteWin
  3112.  
  3113.  
  3114. GetInitFileInteger                                                      Kernel
  3115.  
  3116. Deklaration     Function GetInitFileInteger(Block: BlockIDString;
  3117.                 KeyWord: KeyString; Var OutVal: LongInt):Boolean
  3118. Funktion        Liefert einen LongInt aus der Initialisierungsdatei.
  3119. Parameter       Block   Name des Abschnitts, in dem das Schlüsselwort gesucht
  3120.  
  3121.                                - 48 -
  3122.  
  3123.  
  3124.                         wird.
  3125.                 KeyWord Name des gesuchten Schlüsselwortes.
  3126.                 OutVal  Enthält nach der Ausführung den gesuchten LongInt Wert
  3127. Ergebnis        Das Funktionsergebnis teilt Erfolg (TRUE) oder Mißerfolg
  3128.                 (FALSE) der Suche mit.
  3129. Beispiel
  3130.                 Das Programmbeispiel entnimmt der Initialisierungsdatei einen 
  3131.                 vom Benutzer  festgelegten  Wert für die maximal offenenen
  3132.                 Files der Applikation.  Für das Beispiel sei folgender
  3133.                 Ausschnitt aus einer Initialisierungsdatei angenommen: 
  3134.  
  3135.         [User]
  3136.         WelcomeText="Hallo Frank, schön dich zu sehen"  ;ein String
  3137.         MaxOpenFiles=10                                 ;ein LongInt
  3138.  
  3139.         Funktion GiveMaxOpenFiles : Byte;
  3140.         Var OpenFiles : LongInt;
  3141.         Begin
  3142.           MaxOpenFile := 0;
  3143.           If GetInitFileInteger('User','MaxOpenFiles',OpenFiles) Then
  3144.             If (OpenFiles > 0) and (OpenFiles < 30) Then
  3145.               MaxOpenFiles := OpenFiles;
  3146.         End;
  3147. Siehe auch      GetInitFileName, GetInitFileString, GetInitFileListFirst,
  3148.                 GetInitFileListNext, GetParaInteger, GetParaName, GetParaString
  3149.  
  3150.  
  3151. GetInitFileListFirst                                                    Kernel
  3152.  
  3153. Deklaration     Function GetInitFileListFirst(Block: BlockIDString;
  3154.                 KeyWord: KeyString; Var OutVal: ValueString):Boolean
  3155. Funktion        Liefert den Rest der Zeile nach dem Schlüsselworte KeyWord. 
  3156. Parameter       Block   Name des Abschnitts, in dem das Schlüsselwort gesucht
  3157.                         wird.
  3158.                 KeyWord Name des gesuchten Schlüsselwortes.
  3159.                 OutVal  Enthält nach der Ausführung den Rest der Zeile nach
  3160.                         dem ersten Vorkommen des Schlüsselwortes KeyWord.
  3161. Ergebnis        Das Funktionsergebnis teilt Erfolg (TRUE) oder Mißerfolg
  3162.                 (FALSE) der Suche mit.
  3163. Hinweis         Um aus der durch GetInitFileListFirst gewonnenen Eingabezeile 
  3164.                 einzelne Parameter zu extrahieren, benutzen Sie bitte die 
  3165.                 Funktionen GetParaInteger, GetParaName  oder  GetParaString.
  3166. Beispiel        
  3167.                 Das Programmierbeispiel belegt ein Feld von Verbunden mit 
  3168.                 Werten aus der Initialisierungsdatei vor. Die 
  3169.                 Initialisierungsdatei enthalte folgenden Abschnitt:
  3170.  
  3171.         [Farbtabelle]
  3172.         ;       Name    Farbe   Linientyp
  3173.         LAYER=  0       15      CONTINUOUS
  3174.         LAYER=  1       2       CONTINUOUS
  3175.         LAYER=  2       3       CONTINUOUS
  3176.         LAYER=  3       15      CONTINUOUS
  3177.         LAYER=  4       5       CONTINUOUS
  3178.         LAYER=  5       6       CONTINUOUS
  3179.         LAYER=  6       14      CONTINUOUS
  3180.         LAYER=  7       7       CONTINUOUS
  3181.         
  3182.  
  3183.         Type FarbEintrag = Record
  3184.                              LayerName  : String[15];
  3185.  
  3186.                                - 49 -
  3187.  
  3188.  
  3189.                              LayerFarbe : Byte;
  3190.                              LayerTyp   : String[15];
  3191.                            End;
  3192.         Type Farbtabelle = Array[0..7] of FarbEintrag;
  3193.         
  3194.         Var  DieFarbtabelle : Farbtabelle;
  3195.              EingabeZeile   : String;
  3196.              LayerName      : String;
  3197.              LayerFarbe     : LongInt;
  3198.              LayerTyp       : String;
  3199.         
  3200.         Procedure LiesFarbtabelle;
  3201.         Var I : Integer;
  3202.         Begin
  3203.           I := 0;
  3204.           If GetInitFileListFirst('Farbtabelle','Layer',EingabeZeile) Then
  3205.             Begin
  3206.               Repeat
  3207.                 If GetParaName(EingabeZeile,LayerName) Then
  3208.                   Begin
  3209.                     If GetParaInteger(EingabeZeile,LayerFarbe) Then
  3210.                       Begin
  3211.                         If GetParaName(EingabeZeile,LayerTyp) Then
  3212.                           Begin
  3213.                             DieFarbTabelle[i].LayerName  := LayerName;
  3214.                             DieFarbtabelle[i].LayerFarbe := LayerFarbe;
  3215.                             DieFarbtabelle[i].LayerTyp   := LayerTyp;
  3216.                           End
  3217.                         Else ErrWindow(0,0,
  3218.                              'LayerTyp falsch oder nicht angegeben.');
  3219.                       End
  3220.                     Else ErrWindow(0,0,
  3221.                          'LayerFarbe falsch oder nicht angegeben.');
  3222.                   End
  3223.                 Else ErrWindow(0,0,'LayerName falsch oder nicht angegeben');
  3224.                 I := I+1;
  3225.               Until (Not GetInitFileListNext('Layer',EingabeZeile)) or (I > 7);
  3226.             End
  3227.           Else ErrWindow(0,0,'Abschnitt oder Schlüsselwort nicht gefunden');
  3228.         End;
  3229. Siehe auch      GetInitFileInteger, GetInitFileName, GetInitFileString,
  3230.                 GetInitFileListNext, GetParaInteger, GetParaName, GetParaString
  3231.  
  3232.  
  3233. GetInitFileListNext                                                     Kernel
  3234.  
  3235. Deklaration     Function GetInitFileListNext(KeyWord: KeyString; 
  3236.                 Var OutVal: ValueString):Boolean
  3237. Funktion        Liefert bei wiederholtem Aufruf jeweils eine neue Zeile nach 
  3238.                 dem Schlüsselwort KeyWord. Die Suche muß zuvor mit 
  3239.                 GetInitFileListFirst eingeleitet worden sein.
  3240. Parameter       KeyWord Name des gesuchten Schlüsselwortes.
  3241.                 OutVal  Enthält nach der Ausführung den Rest der Zeile nach 
  3242.                         dem ersten Vorkommen des Schlüsselwortes KeyWord.
  3243. Ergebnis        Das Funktionsergebnis teilt mit, ob noch eine weitere Zeile 
  3244.                 gefunden wurde (TRUE), oder ob kein weiteres Schlüsselwort 
  3245.                 mehr gefunden wurde (FALSE).
  3246. Hinweis         Um aus der durch GetInitFileListNext gewonnenen Eingabezeile 
  3247.                 einzelne Parameter zu extrahieren, benutzen Sie bitte die 
  3248.                 Funktionen GetParaInteger, GetParaName oder GetParaString. 
  3249.                 Ein umfangreiches Programmierbeispiel finden Sie bei 
  3250.  
  3251.                                - 50 -
  3252.  
  3253.  
  3254.                 GetInitFileListFirst.
  3255. Siehe auch      GetInitFileInteger, GetInitFileName, GetInitFileString,
  3256.                 GetInitFileListFirst, GetParaInteger, GetParaName,
  3257.                 GetParaString
  3258.  
  3259.  
  3260. GetInitFileName                                                         Kernel
  3261.  
  3262. Deklaration     Function GetInitFileName(Block: BlockIDString;
  3263.                 KeyWord: KeyString; Var OutVal: ValueString):Boolean
  3264. Funktion        Liefert einen Namen (ungeschützten String) aus der
  3265.                 Initialisierungsdatei.
  3266. Parameter       Block   Name des Abschnitts, in dem das Schlüsselwort gesucht
  3267.                         wird.
  3268.                 KeyWord Name des gesuchten Schlüsselwortes.
  3269.                 OutVal  Enthält nach der Ausführung den gesuchten Namen
  3270. Ergebnis        Das Funktionsergebnis teilt Erfolg (TRUE) oder Mißerfolg
  3271.                 (FALSE) der Suche mit.
  3272. Beispiel        
  3273.                 Das Beispiel entnimmt der Initialisierungsdatei den Namen 
  3274.                 VDIDir. Angegeben ist ein Auszug aus der Initialisierungsdatei
  3275.                 und das dazugehörige Programmfragment.
  3276.         
  3277.         [paths]
  3278.         VDIDir=C:\TURBO\DELITE\DRIVER           ;Verzeichnis der Treiber
  3279.         
  3280.         
  3281.         Funktion GetPath : String;
  3282.         Begin
  3283.           If GetInitFileString('paths','VDIDir',ThePath) Then
  3284.             GetPath := ThePath
  3285.           Else GetPath := 'NONE';
  3286.         End;
  3287. Siehe auch      GetInitFileInteger, GetInitFileString, GetInitFileListFirst,
  3288.                 GetInitFileListNext, GetParaInteger, GetParaName,
  3289.                 GetParaString
  3290.  
  3291.  
  3292. GetInitFileString                                                       Kernel
  3293.  
  3294. Deklaration     Function GetInitFileString(Block: BlockIDString;
  3295.                 KeyWord: KeyString; Var OutVal: ValueString): Boolean 
  3296.  
  3297. Funktion        Liefert einen String (geschützten String) aus der
  3298.                 Initialisierungsdatei.
  3299. Parameter       Block   Name des Abschnitts, in dem das Schlüsselwort gesucht
  3300.                         wird.
  3301.                 KeyWord Name des gesuchten Schlüsselwortes.
  3302.                 OutVal  Enthält nach der Ausführung den gesuchten String
  3303. Ergebnis        Das Funktionsergebnis teilt Erfolg (TRUE) oder Mißerfolg
  3304.                 (FALSE) der Suche mit.
  3305. Beispiel        
  3306.                 Das Beispiel zeigt einen Ausschnitt aus der 
  3307.                 Initialisierungsdatei und ein Programmfragment zur Ausgabe 
  3308.                 eines geschützten Strings.
  3309.  
  3310.         [User]
  3311.         WelcomeText="Hallo Frank, schön dich zu sehen"  ;ein String
  3312.         
  3313.         Procedure WelcomeUser;
  3314.         Var TheUser : String;
  3315.  
  3316.                                - 51 -
  3317.  
  3318.  
  3319.         Begin
  3320.           If GetInitFileString('User','WelcomeText',TheUser) Then
  3321.             Begin
  3322.               OpenWindow(0,0,GetFontX*Length(TheUser),GetFontY*3);
  3323.               WriteWin(TheUser,0,1,15);
  3324.               WaitConfirm;
  3325.               CloseWindow;
  3326.             End
  3327.           Else ErrWindow(0,0,'Keine Begrüßung angegeben.');
  3328.         End;
  3329. Siehe auch      GetInitFileInteger, GetInitFileName, GetInitFileListFirst, 
  3330.                 GetInitFileListNext, GetParaInteger, GetParaName, GetParaString
  3331.  
  3332.  
  3333. GetLinePattern                                                          Kernel
  3334.  
  3335. Deklaration     Function GetLinePattern: Word
  3336. Funktion        Liefert den aktuell gesetzten Linienstil
  3337. Ergebnis        Das niederwertigste Byte des Ergebnisses enthält den Linienstil
  3338. Siehe auch      SetLinePattern
  3339.  
  3340.  
  3341. GetMainID                                                               API
  3342.  
  3343. Deklaration     Function GetMainID: Integer
  3344. Funktion        Liefert die Identifikationsnummer der Hauptapplikation
  3345. Ergebnis        Das Ergebnis ist eine positive Integerzahl
  3346. Hinweis         Die Angabe der Identifikationsnummer eines Klienten ist bei 
  3347.                 einer Reihe von Operationen notwendig. Im Gegensatz zu 
  3348.                 Subapplikationen, bei denen die Identifikationsnummer beim 
  3349.                 Anmelden zurückgeliefert wird, muß die Identifikationsnummer 
  3350.                 der Hauptapplikation mit dieser Prozedur erst in Erfahrung 
  3351.                 gebracht werden. Die meisten Operationen mit Klienten sind 
  3352.                 allerdings nur dann wichtig, wenn die Bildschirmfläche auf 
  3353.                 mehrere Klienten verteilt werden soll.
  3354. Beispiel                SuspendApplication(GetMainID)
  3355.                 veranlaßt den Dispatcher, den Viewport der Hauptapplikation 
  3356.                 bei der Verteilung von Botschaften unberücksichtigt zu lassen.
  3357. Siehe auch      SuspendApplication, ActivateApplication, OpenMainApplication, 
  3358.                 OpenSubApplication, FrameSubApplication, PostMessage, 
  3359.                 DispatchMessage
  3360.  
  3361.  
  3362. GetMaxColors                                                            Kernel
  3363.  
  3364. Deklaration     Function GetMaxColors: Byte
  3365. Funktion        Liefert die Anzahl der darstellbaren Farben des verwendeten 
  3366.                 Grafiktreibers
  3367. Ergebnis        Das Ergebnis vom Typ Byte liefert den Wert der höchsten 
  3368.                 darzustellenden Farbe. Bei einer Karte mit 16 Farben wäre das 
  3369.                 15. Bei monochromen Karten wird hier eine 1 zurückgeliefert.
  3370.  
  3371.  
  3372. GetMaxX                                                                 Kernel
  3373.  
  3374. Deklaration     Function GetMaxX: Integer
  3375. Funktion        Liefert die horizontale Grösse der Grafikseite
  3376. Ergebnis        Das Ergebnis vom Typ Integer entspricht der grössten 
  3377.                 Koordinate in X-Richtung auf der Grafikseite. Die kleinste 
  3378.                 Koordinate hat den Wert 0.
  3379. Hinweis         Ein gesetzter Viewport hat keinen Einfluß auf das Resultat 
  3380.  
  3381.                                - 52 -
  3382.  
  3383.  
  3384.                 dieser Funktion.
  3385. Siehe auch      GetMaxY, PortMaxX, PortMaxY
  3386.  
  3387.  
  3388. GetMaxY                                                                 Kernel
  3389.  
  3390. Deklaration     Function GetMaxY: Integer
  3391. Funktion        Liefert die vertikale Grösse der Grafikseite
  3392. Ergebnis        Das Ergebnis vom Typ Integer entspricht der größten Koordinate 
  3393.                 in Y-Richtung auf der Grafikseite. Die kleinste Koordinate hat
  3394.                 den Wert 0.
  3395. Hinweis         Ein gesetzter Viewport hat keinen Einfluß auf das Resultat 
  3396.                 dieser Funktion.
  3397. Siehe auch      GetMaxX, PortMaxX, PortMaxY
  3398.  
  3399.  
  3400. GetMenu                                                                 API
  3401.  
  3402. Deklaration     Function GetMenu: hMenu
  3403. Funktion        Liefert den Zeiger auf das Menü
  3404. Ergebnis        Der Typ hMenu ist als Zeiger definiert und ist NIL, solange 
  3405.                 kein Menü geladen worden ist
  3406. Hinweis         Der Zeiger auf das Menü muß bei allen Funktionen zur 
  3407.                 Modifikation der Menüs angegeben werden. Diese Konvention 
  3408.                 wurde eingeführt, damit es in einer späteren Version möglich 
  3409.                 ist, mehrere Menüs zu verwalten.
  3410. Siehe auch      EnableMenuItem, CheckMenuItem, GetMenuFlags
  3411.  
  3412.  
  3413. GetMenuFlags                                                            API
  3414.  
  3415. Deklaration     Function GetMenuFlags(Menu: hMenu; ID: MenuID):MenuFlags
  3416. Funktion        Liefert die Attribute eines Menüeintrages
  3417. Parameter       Menu    Zeiger auf das Menü
  3418.                 ID              Identifikationsnummer des Menüeintrages
  3419. Ergebnis        Der Typ MenuFlags ist als Byte definiert und enthält bit-
  3420.                 kodiert die Attribute des Menüeintrages
  3421. Hinweis         Um festzustellen, ob ein bestimmtes Attribut gesetzt ist, 
  3422.                 muß der Ergebniswert mit den Konstanten MF_CHECKED oder 
  3423.                 MF_DISABLED UND-verknüpft werden.
  3424. Beispiel        If GetMenuFlags(GetMenu, 101) and MF_CHECKED then ...
  3425. Siehe auch      EnableMenuItem, CheckMenuItem, GetMenu
  3426.  
  3427.  
  3428. GetMenuString                                                           API
  3429.  
  3430. Deklaration     Procedure GetMenuString(Menu: hmenu; ID: MenueID; 
  3431.                 Var StrPrt: String)
  3432. Funktion        Liefert den Text eines Menüeintrages
  3433. Parameter       Menu            Zeiger auf das Menü
  3434.                 ID              Identifikationsnummer des Menüeintrages
  3435.                 StrPtr          enthält nach der Ausführung den Menütext
  3436. Hinweis         Der Menütext enthält in der Regel ein Ampersandsymbol ("&") zur
  3437.                 optischen Kennzeichnung der Abkürzungstaste (Hotkey) des Menüs.
  3438. Siehe auch      GetMenu, ReplaceMenu
  3439.  
  3440.  
  3441. GetNextTopic                                                            API
  3442.  
  3443. Deklaration     Procedure GetNextTopic(Var Name: NameString; Var eol: boolean)
  3444. Funktion        Liefert das nächste Hilfestichwort aus der allgemeinen Hilfe-
  3445.  
  3446.                                - 53 -
  3447.  
  3448.  
  3449.                 datei
  3450. Parameter       Name            enthält nach der Ausführung das Stichwort
  3451.                 eol             wird TRUE, falls keine weiteren Stichworte 
  3452.                                 enthalten sind
  3453. Hinweis         Diese Prozedur wird als Callback-Prozedur von der allgemeinen 
  3454.                 Hilfe verwendet. Die Prozedur kann einem Listendialog zur 
  3455.                 Ermittlung der Liste der Einträge dienen. Die allgemeine Hilfe-
  3456.                 datei trägt den Namen des Hauptprogramms, der bei 
  3457.                 OpenMainApplication angegeben wurde, und endet auf '.hlp'.
  3458. Siehe auch      GetFirstTopic   
  3459.  
  3460.  
  3461. GetPalette                                                              Kernel
  3462.  
  3463. Deklaration     Procedure GetPalette(ThePalette: Byte; Var R,G,B: Byte)
  3464. Funktion        Liefert den Eintrag der Farbpalette als RGB Wert.
  3465. Parameter       ThePalette      Index des Paletteneintrages
  3466.                 R, G, B         enthalten nach dem Aufruf die Anteile an den 
  3467.                                 Grundfarben
  3468. Hinweis         Bei Grafikkarten ohne Farbpalette wie z.B. der Hercules 
  3469.                 Monochrom Karte liefert GetPalette eine  Null für die 
  3470.                 Farbanteile.
  3471. Siehe auch      SetPalette, GetMaxColors
  3472.  
  3473.  
  3474. GetParaInteger                                                          Kernel
  3475.  
  3476. Deklaration     Function GetParaInteger(Var Line: String; Var OutVal: 
  3477.                 LongInt): Boolean
  3478. Funktion        Extrahiert einen LongInt aus dem in Line übergebenen String.
  3479. Parameter       Line            Enthält die Eingabezeile
  3480.                 OutVal          Enthält nach der Ausführung den extrahierten 
  3481.                                 LongInt
  3482. Ergebnis        Zeigt an, ob aus der Eingabezeile ein LongInt extrahiert 
  3483.                 werden konnte (TRUE)
  3484. Hinweis         Durch die Ausführung von GetParaInteger wird der extrahierte 
  3485.                 Parameter verbraucht. Mit wiederholten Aufrufen können daher 
  3486.                 mehrere Parameter extrahiert werden.
  3487.                 Die Verwendung von GetParaInteger ist nur in Verbindung mit 
  3488.                 den Funktionen GetInitFileListFirst und GetInitFileListNext 
  3489.                 sinnvoll. Ein  Programmierbeispiel findet sich dort.    
  3490. Siehe auch      GetParaName, GetParaString, GetInitFileListFirst, 
  3491.                 GetInitFileListNext
  3492.  
  3493.  
  3494. GetParaName                                                             Kernel
  3495.  
  3496. Deklaration     Function GetParaName(Var Line: String; Var OutVal: 
  3497.                 ValueString): Boolean
  3498. Funktion        Extrahiert einen Namen aus dem in Line übergebenen String.
  3499. Parameter       Line            Enthält die Eingabezeile
  3500.                 OutVal          Enthält nach der Ausführung den extrahierten 
  3501.                                 Namen
  3502. Ergebnis        Zeigt an, ob aus der Eingabezeile ein Name extrahiert werden 
  3503.                 konnte (TRUE)
  3504. Hinweis         Durch die Ausführung von GetParaName wird der extrahierte 
  3505.                 Parameter verbraucht. Mit wiederholten Aufrufen können daher 
  3506.                 mehrere Parameter extrahiert werden.
  3507.                 Die Verwendung von GetParaName ist nur in Verbindung mit den 
  3508.                 Funktionen GetInitFileListFirst und GetInitFileListNext 
  3509.                 sinnvoll. Ein  Programmierbeispiel findet sich dort.    
  3510.  
  3511.                                - 54 -
  3512.  
  3513.  
  3514. Siehe auch      GetParaInteger, GetParaString, GetInitFileListFirst, 
  3515.                 GetInitFileListNext
  3516.  
  3517.  
  3518. GetParaString                                                           Kernel
  3519.  
  3520. Deklaration     Function GetParaString(Var Line: String; 
  3521.                 Var OutVal: ValueString): Boolean
  3522. Funktion        Extrahiert einen geschützten String aus dem in Line 
  3523.                 übergebenen String.
  3524. Parameter       Line            Enthält die Eingabezeile
  3525.                 OutVal          Enthält nach der Ausführung den geschützen 
  3526.                                 String
  3527. Ergebnis        Zeigt an, ob aus der Eingabezeile ein geschützter String 
  3528.                 extrahiert werden konnte (TRUE)
  3529. Hinweis         Durch die Ausführung von GetParaString wird der extrahierte 
  3530.                 Parameter verbraucht. Mit wiederholten Aufrufen können daher 
  3531.                 mehrere Parameter extrahiert werden.
  3532.                 Die Verwendung von GetParaString ist nur in Verbindung mit den 
  3533.                 Funktionen GetInitFileListFirst und GetInitFileListNext 
  3534.                 sinnvoll. Ein  Programmierbeispiel findet sich dort.    
  3535. Siehe auch      GetParaInteger, GetParaName, GetInitFileListFirst, 
  3536.                 GetInitFileListNext
  3537.  
  3538.  
  3539. GetTextLength                                                           Kernel
  3540.  
  3541. Deklaration     Function GetTextLength(InString: String):Integer
  3542. Funktion        Liefert die Länge in Pixeln, die ein Text auf dem 
  3543.                 Bildschirm einnehmen würde.
  3544. Parameter       InString        Der Text, dessen Länge ermittelt werden soll
  3545. Ergebnis        Liefert die Länge in Pixeln, die der Text InString auf dem 
  3546.                 Bildschirm einehmen würde.
  3547. Hinweis         Während die Höhe der Zeichen des skalierbaren Zeichensatzes 
  3548.                 direkt in Pixeln angegeben werden kann, ist es bei einem 
  3549.                 Proportionalzeichensatz nicht möglich, die Länge eines Textes 
  3550.                 vorher festzulegen. Sollte es trotzdem nötig sein, den 
  3551.                 Platzbedarf eines Textes zu ermitteln, kann diese Funktion 
  3552.                 verwendet werden.
  3553.  
  3554.  
  3555. GetTextSettings                                                         Kernel
  3556.  
  3557. Deklaration     Procedure GetTextSettings(Var Textinfo : TextSettingsType)
  3558. Funktion        Liefert Informationen über die Formatierung des skalierbaren 
  3559.                 Zeichensatzes
  3560. Parameter       Textinfo        Enthält nach der Ausführung Informationen 
  3561.                                 über die Formatierung des skalierbaren 
  3562.                                 Zeichensatzes.
  3563. Hinweis         Die Prozedur GetTextSettings liefert die Informationen über 
  3564.                 die aktuelle Formatierung des skalierbaren Zeichensatzes in 
  3565.                 Form eines Verbundtyps TextSettingsType. Die Informationen, 
  3566.                 die dieser Typ enthält, werden von den Prozeduren OutText 
  3567.                 und OutTextXY beachtet. Der Typ TextSettingsType ist im Kernel
  3568.                 deklariert:
  3569.         TextSettingsType = Record
  3570.                              TheFont      :Word;
  3571.                              TheDirection : Word;
  3572.                              TheCharSizeX : Word;
  3573.                              TheCharSizeY : Word;
  3574.                              TheHoriz     : Word;
  3575.  
  3576.                                - 55 -
  3577.  
  3578.  
  3579.                              TheVert      : Word;
  3580.                            End;
  3581.                 Die einzelnen Komponenten dieses Verbundtyps haben die 
  3582.                 Bedeutung:
  3583.                 TheFont         Der aktuell benutzte Font. In der vorliegenden
  3584.                                 Version von deLite kann nur ein einziger Font 
  3585.                                 während der Ausführung des Programmes geladen 
  3586.                                 werden. Dieser wird immer die Nummer Null 
  3587.                                 tragen. Der Eintrag Font wird durch die 
  3588.                                 prozedur SetTextStyle gesetzt. Auch dort kann 
  3589.                                 als Font nur eine Null angegeben werden. Die 
  3590.                                 Fontnummer Null kann auch als vordefinierte 
  3591.                                 Konstante DefaultFont angegeben werden.
  3592.                 TheDirection    Gibt an, ob bei Textausgabe mittels OutText 
  3593.                                 und OutTextXY horizontal oder vertikal 
  3594.                                 geschrieben wird. Der Eintrag wird durch 
  3595.                                 SetTextDirection und SetTextStyle beeinflusst.
  3596.                 CharSizeX       siehe CharSizeY
  3597.                 CharSizeY       Gibt die Höhe eines Großbuchstaben des skalier-
  3598.                                 baren ZeiChensatzes in Pixeln an. Der Wert 
  3599.                                 CharSizeX ist ein Verhältnisfaktor zu diesem 
  3600.                                 Wert. Ist CharSizeX kleiner als CharSizeY, 
  3601.                                 wird der Zeichensatz gestaucht ausgegeben. Ist
  3602.                                 CharSizeX größer, wird der Zeichensatz 
  3603.                                 gestreckt. Hat CharSizeX den gleichen Wert wie
  3604.                                 CharSizeY, wird der Zeichensatz als normaler 
  3605.                                 Proportionalzeichensatz ausgegeben. Der Eintrag
  3606.                                 wird durch SetTextUserScale, SetTextHeight und
  3607.                                 SetTextStyle beeinflusst.
  3608.                 TheHoriz        Enthält die Ausrichtung des sklaierbaren 
  3609.                                 Zeichensatzes in horizontaler Richtung. Der 
  3610.                                 Eintrag kann die Werte LeftText (0), 
  3611.                                 CenterText (1) und RightText (2) annehmen. Zur
  3612.                                 Erklärung der Bedeutung dieser Werte sei auf 
  3613.                                 SetTextJustify verwiesen. Der Eintrag wird 
  3614.                                 durch SetTextJustify beeinflusst.
  3615.                 TheVert         Enthält die Ausrichtung des skalierbaren 
  3616.                                 Zeichensatzes in vertikaler Richtung. Der 
  3617.                                 Eintrag kann die Werte BottomText (0), 
  3618.                                 CenterText (1) und BottomText (2) annehmen. 
  3619.                                 Zur Erklärung der Bedeutung dieser Werte sei 
  3620.                                 auf SetTextJustify verwiesen. Der Eintrag wird 
  3621.                                 durch SetTextJustify beeinflusst.
  3622. Siehe auch      OutText, OutTextXY, SetTextDirection, SetTextHeight, 
  3623.                 SetTextJustify, SetTextUserScale, GetTextLength
  3624.  
  3625.  
  3626. GetTheViewPort                                                          API
  3627.  
  3628. Deklaration     Procedure GetTheViewPort(ID: Integer; 
  3629.                 Var Viewport: ViewPortType)
  3630. Funktion        Liefert den Viewport eines Klienten
  3631. Parameter       ID              Die ID des Klienten
  3632.                 Viewport        enthält nach der Ausführung den Viewport
  3633.                 Der Typ ViewPortType ist im Kernel wie folgt definiert:
  3634.  
  3635.         TYPE ViewPortType = RECORD
  3636.                               x1,y1,x2,y2: integer;
  3637.                             End;
  3638.  
  3639. Siehe auch      SetTheViewPort
  3640.  
  3641.                                - 56 -
  3642.  
  3643.  
  3644.  
  3645.  
  3646. GetX                                                                    Kernel
  3647.  
  3648. Deklaration     Function GetX: Integer
  3649. Funktion        Liefert die X-Koordinate des Grafikcursors
  3650. Siehe auch      GetY, MoveTo, MoveRel, LineTo, LineRel
  3651.  
  3652.  
  3653. GetY                                                                    Kernel
  3654.  
  3655. Deklaration     Function GetY: Integer
  3656. Funktion        Liefert die Y-Koordinate des Grafikcursors
  3657. Siehe auch      GetX, MoveTo, MoveRel, LineTo, LineRel
  3658.  
  3659.  
  3660. HideMouse                                                               Kernel
  3661.  
  3662. Deklaration     Procedure HideMouse
  3663. Funktion        Versteckt die Maus
  3664. Hinweis         Während Grafikoperationen muß die Maus vor dem Überschreiben
  3665.                 geschützt werden. Zu diesem Zweck wird vor jeder 
  3666.                 Grafikoperation automatisch der Mauszeiger entfernt und 
  3667.                 anschließend neu gezeichnet. Möchte man sehr viele Grafik-
  3668.                 operationen hintereinander ausführen, kann es sein, daß das 
  3669.                 Retten des Mauszeigers mehr Zeit in Anspruch nimmt als die 
  3670.                 eigentlichen Grafikoperationen. Dann empfiehlt es sich, die 
  3671.                 Maus vor Beginn der ersten Grafikoperation mit HideMouse zu 
  3672.                 verstecken und hinterher wieder mit ShowMouse sichtbar zu 
  3673.                 machen.
  3674. Siehe auch      ShowMouse
  3675.  
  3676.  
  3677. KernelError                                                             Kernel
  3678.  
  3679. Deklaration     Function KernelError : Integer
  3680. Funktion        Liefert den Fehlerstatus der letzten Kernel-Operation
  3681. Ergebnis        Der zurückgelieferte Integerwert hat die im Anhang B 
  3682.                 aufgelistete Bedeutung
  3683. Hinweis         Der Fehlerstatus wird nach dem Aufruf von KernelError gelöscht
  3684.  
  3685.  
  3686. Line                                                                    Kernel
  3687.  
  3688. Deklaration     Procedure Line(x1,y1,x2,y2 : Integer; Color : Byte)
  3689. Funktion        Zeichnet eine Linie
  3690. Beispiel                Line(0 ,0 ,PortMaxX ,PortMaxY,15);
  3691.                 zeichnet eine weiße diagonale Linie von links oben nach 
  3692.                 rechts unten.
  3693. Siehe auch      GetLinePattern, SetLinePattern
  3694.  
  3695.  
  3696. LineRel                                                                 Kernel
  3697.  
  3698. Deklaration     Procedure LineRel(X, Y: Integer)
  3699. Funktion        Zeichnet eine Linie relativ zur aktuellen Position 
  3700.                 des Grafikcursors
  3701. Parameter       X, Y    Die relative Differenz zur Cursorposition
  3702. Hinweis         LineRel verwendet den durch SetLinePattern gesetzten 
  3703.                 Linienstil und die durch SetColor gesetzte Farbe. Der
  3704.                 Grafikcursor wird auf den Endpunkt der Linie gesetzt.
  3705.  
  3706.                                - 57 -
  3707.  
  3708.  
  3709. Siehe auch      GetX, GetY, LineTo, MoveRel, MoveTo, SetColor, SetLinePattern
  3710.  
  3711.  
  3712. LineTo                                                                  Kernel
  3713.  
  3714. Deklaration     Procedure LineTo(X, Y: Integer)
  3715. Funktion        Zeichnet eine Linie von der aktuellen Position des 
  3716.                 Grafikcursors zum angegebenen Punkt
  3717. Parameter       X, Y    Die Koordinaten des Zielpunktes
  3718. Hinweis         LineTo verwendet den durch SetLinePattern gesetzten Linienstil
  3719.                 und die durch SetColor gesetzte Farbe. Der Grafikcursor wird 
  3720.                 auf den Endpunkt der Linie gesetzt.
  3721. Siehe auch      GetX, GetY, LineRel, MoveRel, MoveTo, SetColor, SetLinePattern
  3722.  
  3723.  
  3724. MoveRel                                                                 Kernel
  3725.  
  3726. Deklaration     Procedure MoveRel(X, Y: Integer)
  3727. Funktion        Bewegt den Grafikcursor relativ zur aktuellen Position
  3728. Parameter       X, Y    Die Koordinatendifferenz
  3729. Hinweis         Die Position des Grafikcursors bezieht sich immer auf den 
  3730.                 aktuellen Viewport. Der Grafikcursor selbst unterliegt nicht 
  3731.                 dem Clipping.
  3732. Siehe auch      GetX, GetY, LineRel, LineTo, MoveTo, SetColor
  3733.  
  3734.  
  3735. MoveTo                                                                  Kernel
  3736.  
  3737. Deklaration     Procedure MoveTo(X, Y: Integer)
  3738. Funktion        Setzt den Grafikcursor auf die angegebene Position
  3739. Parameter       X, Y    Die neuen Koordinaten 
  3740. Hinweis         Die Position des Grafikcursors bezieht sich immer auf den 
  3741.                 aktuellen Viewport
  3742. Siehe auch      GetX, GetY, LineRel, LineTo, MoveRel, SetColor
  3743.  
  3744.  
  3745. OnLineHelp                                                              API
  3746.  
  3747. Deklaration     Procedure OnLineHelp(topic: String)
  3748. Funktion        Ruft die interaktive Hilfe auf
  3749. Parameter       topic   Das Hilfestichwort
  3750. Hinweis         Die Menüsteuerung und die Dialoge bedienen sich dieser 
  3751.                 Funktion zur Realisierung der kontextabhängigen Hilfe. Das 
  3752.                 Hilfestichwort wird in der Datei online.hlp gesucht und ggf. 
  3753.                 der nach dem Stichwort folgende Text ausgegeben. Sollte die 
  3754.                 Datei nicht existieren oder das Stichwort nicht gefunden 
  3755.                 werden, wird eine entsprechende Fehlermeldung ausgegeben. 
  3756.                 Das Stichwort muß in der Hilfedatei in eckigen Klammern 
  3757.                 geschrieben werden. Stichworte werden vor dem Aufruf der 
  3758.                 Hilfsfunktion von evtl. vorhandenen Ampersand-Symbolen befreit.
  3759. Beispiel        
  3760.         [Load File]
  3761.         Mit dieser Funktion laden Sie
  3762.         eine neue Datei zur Bearbeitung. 
  3763.         Gegebenenfalls werden Sie darauf
  3764.         hingewiesen, daß die alte Datei
  3765.         überschrieben wird
  3766.  
  3767.         [Save File]
  3768.         Speichert die im Speicher
  3769.         befindliche Datei.
  3770.  
  3771.                                - 58 -
  3772.  
  3773.  
  3774.  
  3775.         Dieser Auszug aus der Hilfedatei online.hlp enthält Informationen zu 
  3776.         den Stichworten Load File und Save File. Die Texte sollten nicht mehr
  3777.         als 34 Spalten und 12 Zeilen enthalten.
  3778.  
  3779.  
  3780. OpenMainApplication                                                     API
  3781.  
  3782. Deklaration     Function OpenMainApplication(EventHandler: EventReceiveProc; 
  3783.                 modus: Integer; Name: NameString): Integer
  3784. Funktion        Öffnet die Hauptapplikation
  3785. Parameter       EventHandler    Die Empfangsprozedur
  3786.                 modus           Modus der Hauptapplikation. Wird hier anstatt 
  3787.                                 0 der Wert APP_NOFONT angegeben, wird kein 
  3788.                                 skalierbarer Zeichensatz geladen
  3789.                 Name            Der Name der Applikation
  3790. Ergebnis        Das Ergebnis ist 0, falls die Hauptapplikation erfolgreich 
  3791.                 geöffnet werden konnte, und ungleich Null, wenn ein Fehler 
  3792.                 auftrat. Die möglichen Fehler sind im Anhang spezifiziert
  3793. Hinweis         Der angegebene Name wird verwendet, um die Dateinamen für die 
  3794.                 Initialisierungsdatei, die Menübeschreibung und die allgemeine
  3795.                 Hilfe zu erzeugen. Daher stehen diese Funktionen erst nach dem 
  3796.                 Öffnen der Hauptapplikation zur Verfügung.
  3797.                 OpenMainApplication prüft zunächst, ob es zum ersten Mal 
  3798.                 ausgeführt wird. Danach wird versucht, die Menübeschreibung 
  3799.                 einzulesen. Anschließend wird die Initialisierungsdatei 
  3800.                 geöffnet und der Eintrag für den verwendeten Grafiktreiber 
  3801.                 gesucht. Falls als modus nicht APP_NOFONT angegeben wurde, 
  3802.                 wird zusätzlich nach dem Eintrag für den skalierbaren 
  3803.                 Zeichensatz gesucht und der Zeichensatz geladen. Sollte bis 
  3804.                 hierhin kein Fehler aufgetreten sein, wird in den Grafikmodus 
  3805.                 geschaltet und der Menübalken angezeigt.
  3806. Beispiel
  3807.         Begin
  3808.           StillRunning := true;
  3809.           LaunchResult := OpenMainApplication(HandleMsg,
  3810.                                               APP_NOFONT,
  3811.                                               ProjektName);
  3812.  
  3813.           If LaunchResult = 0 then        { erfolgreich gestartet }
  3814.           begin
  3815.             while StillRunning Do
  3816.               begin
  3817.                 GetEvent(MyEvent);
  3818.                 DispatchMessage(MyEvent);
  3819.               end;
  3820.             CloseMainApplication;
  3821.           end
  3822.           Else
  3823.             Writeln('Programm kann nicht gestartet werden.
  3824.                      Fehler:',LaunchResult);
  3825.         End.
  3826.  
  3827.         Das Beispiel zeigt ein typisches Hauptprogramm. Die Empfangsprozedur 
  3828.         HandleMsg wurde angemeldet und das Flag APP_NOFONT wurde angegeben, 
  3829.         um zu verhindern, daß ein skalierbarer Zeichensatz geladen wird. Nach 
  3830.         der Anmeldung tritt das Programm in eine Schleife ein, die fortwährend 
  3831.         Botschaften mit GetEvent holt und mit DispatchMessage weiterleitet.
  3832. Siehe auch      CloseMainApplication, GetEvent, DispatchMessage
  3833.  
  3834.  
  3835.  
  3836.                                - 59 -
  3837.  
  3838.  
  3839. OpenSubApplication                                                      API
  3840.  
  3841. Deklaration     Function  OpenSubApplication(EventHandler: EventReceiveProc; 
  3842.                 Filter: Integer; Name: NameString; x1,y1,x2,y2: Integer): 
  3843.                 Integer
  3844. Funktion        Meldet einen Klienten an und und weist ihm einen Viewport zu
  3845. Parameter       EventHandler    Die Empfangsprozedur des Klienten
  3846.                 Filter          Wird hier anstatt 0 der Wert APP_NOFRAME 
  3847.                                 angegeben, wird um den Viewport des Klienten 
  3848.                                 kein Rahmen gezeichnet. 
  3849.                 Name            Der Name des Klienten
  3850.                 x1,y1,x2,y2     Die Koordinaten des Viewports
  3851. Ergebnis        Zurückgeliefert wird die Identifikationsnummer des Klienten. 
  3852.                 Konnte der Klient nicht angemeldet werden, etwa weil die 
  3853.                 maximale Anzahl von Klienten bereits erreicht war, wird -1 
  3854.                 zurückgeliefert.
  3855. Hinweis         Der Viewport des Klienten wird den Viewport der 
  3856.                 Hauptapplikation, der nach wie vor aktiv ist, überlappen. 
  3857.                 Deshalb muß der Viewport der Hauptapplikation beim Einsatz 
  3858.                 weiterer Klienten deaktiviert werden.
  3859. Siehe auch      CloseSubApplication, SuspendApplication, DispatchMessage
  3860.  
  3861.  
  3862. OpenWindow                                                              API
  3863.  
  3864. Deklaration     Procedure OpenWindow(x1,y1,x2,y2 : integer)
  3865. Funktion        Öffnet ein Fenster
  3866. Parameter       x1,y1   Koordinaten der linken oberen Ecke
  3867.                 x2,y2   Koordinaten der rechten unteren Ecke
  3868. Hinweis         Vor dem Öffnen des Fensters wird der vom Fenster zu 
  3869.                 verdeckende Bildschiminhalt gerettet. Nach dem Schließen 
  3870.                 mit CloseWindow wird der Bildschirminhalt rekonstruiert. 
  3871.                 Während das Fenster geöffnet ist, ist der aktuelle Viewport 
  3872.                 auf das Fenster gesetzt. Das Fenster besitzt einen Rahmen und 
  3873.                 eine in der Initialisierungsdatei festgelegte Hintergrundfarbe.
  3874.                 Fenster sollten nur zur temporären Anzeige von Informationen 
  3875.                 dienen und grundsätzlich einen Aufruf der Prozedur WaitConfirm
  3876.                 vor dem Befehl zum Schließen des Fensters enthalten. 
  3877.                 WaitConfirm empfängt alle Ereignisse und stellt so sicher, 
  3878.                 daß kein Klient aktiv werden kann, während das Fenster offen 
  3879.                 ist. Beim Empfang von ESCAPE, ENTER oder der Betätigung einer 
  3880.                 Maustaste kehrt WaitConfirm zurück.
  3881. Beispiel                
  3882.                 OpenWindow(10,10,200,200);
  3883.                 Line(0,0,190,190,15);
  3884.                 WaitConfirm;
  3885.                 CloseWindow;
  3886.  
  3887. Siehe auch      WaitConfirm, CloseWindow
  3888.  
  3889.  
  3890. OutTextAPI                                                              Kernel
  3891.  
  3892. Deklaration     Procedure OutTextAPI(x,y : Integer; InString : String; 
  3893.                 Color, Attrib : Byte)
  3894. Funktion        Gibt einen Text im aktuell gesetzten Viewport aus
  3895. Parameter       x,y             Koordinaten
  3896.                 InString        Der Text
  3897.                 Color   Farbe
  3898.                 Attrib  Das Attribut. Möglich sind folgende Werte
  3899.                         0       Textausgabe normal
  3900.  
  3901.                                - 60 -
  3902.  
  3903.  
  3904.                         1       Text unterstrichen
  3905. Hinweis         Es wird der (nicht skalierbare) Standardzeichensatz verwendet.
  3906. Siehe auch      FontX, FontY
  3907.  
  3908.  
  3909. OutText                                                                 Kernel
  3910.  
  3911. Deklaration     Procedure OutText(str: String)
  3912. Funktion        zeichnet einen Text mit Hilfe des skalierbaren Zeichensatzes
  3913. Parameter       str             Der auszugebende Text
  3914. Hinweis         Der Text wird ab der Cursorposition unter Berücksichtigung 
  3915.                 der gesetzten  Formatierung und Ausrichtung ausgegeben. 
  3916. Siehe auch      OutTextXY, SetTextHeight, SetTextJustify, SetTextStyle, 
  3917.                 SetTextUserScale, GetTextSettings, GetTextLength
  3918.  
  3919.  
  3920. OutTextXY                                                               Kernel
  3921.  
  3922. Deklaration     Procedure OutTextXY(X, Y: Integer; str: String)
  3923. Funktion        zeichnet einen Text mit Hilfe des skalierbaren Zeichensatzes
  3924. Parameter       X,Y             Die Koordinaten
  3925.                 str             Der auszugebende Text
  3926. Hinweis         Der Text wird unter Beachtung der Formatierung und der 
  3927.                 Textausrichtung durch die Prozeduren SetTextStyle und 
  3928.                 SetTextJustify ausgegeben. Der Grafikcursor wird hinter den 
  3929.                 letzten Buchstaben des Textes plaziert. Das passiert auch dann,
  3930.                 wenn der Text den aktuellen Viewport überschreitet. Ein 
  3931.                 Zeilenumbruch findet nicht statt.
  3932. Siehe auch      SetTextDirection, SetTextHeight, SetTextJustify, SetTextStyle, 
  3933.                 SetTextUserScale, GetTextSettings, GetTextLength
  3934.  
  3935.  
  3936. PortMaxX                                                                Kernel
  3937.  
  3938. Deklaration     Function PortMaxX : Integer
  3939. Funktion        Liefert die horizontale Größe des aktuellen Viewports
  3940. Ergebnis        Das Ergebnis vom Typ Integer entspricht der größten Koordinate 
  3941.                 in X-Richtung des aktuellen Viewports. Die kleinste Koordinate
  3942.                 ist stets 0.
  3943. Hinweis         Diese Funktion sollte für Zeichenoperationen innerhalb eines 
  3944.                 Fensters bzw. Viewports verwendet werden, die eine Anpassung 
  3945.                 erforderlich machen. 
  3946. Siehe auch      PortMaxY, GetMaxX, GetMaxY
  3947.  
  3948.  
  3949. PortMaxY                                                                Kernel
  3950.  
  3951. Deklaration     Function PortMaxY : Integer
  3952. Funktion        Liefert die vertikale Größe des aktuellen Viewports
  3953. Ergebnis        Das Ergebnis vom Typ Integer entspricht der größten 
  3954.                 Koordinate in X-Richtung des aktuellen Viewports. Die kleinste
  3955.                 Koordinate ist stets 0.
  3956. Hinweis         Diese Funktion sollte für Zeichenoperationen innerhalb eines 
  3957.                 Fensters bzw. Viewports verwendet werden, die eine Anpassung 
  3958.                 erforderlich machen. 
  3959. Siehe auch      PortMaxX, GetMaxX, GetMaxY
  3960.  
  3961.  
  3962. PostMessage                                                             API
  3963.  
  3964. Deklaration     Procedure PostMessage(TheMessage: EventTyp; TheID: integer)
  3965.  
  3966.                                - 61 -
  3967.  
  3968.  
  3969. Funktion        Sendet eine Nachricht an einen bestimmten Klienten
  3970. Parameter       TheMessage      Die Nachricht
  3971.                 TheID           Die ID des Klienten
  3972. Hinweis         Beim Einsatz mehrerer Klienten kann mit dieser Prozedur 
  3973.                 zwischen den Klienten kommuniziert werden, etwa um einem 
  3974.                 Klienten die Botschaft DoRedraw zum Neuzeichnen zu senden. 
  3975. Siehe auch      GetEvent, DispatchMessage, OpenSubApplication, 
  3976.                 SuspendApplication
  3977.  
  3978.  
  3979. PutEvent                                                                Kernel
  3980.  
  3981. Deklaration     Procedure PutEvent(Event: EventTyp)
  3982. Funktion        schreibt ein Ereignis in die Ereigniswarteschlange
  3983. Parameter       Event           Die Nachricht
  3984. Hinweis         Mit PutEvent können maximal 16 Ereignisse in die Warteschlange
  3985.                 geschrieben werden. Ein so in die Warteschlange aufgenommenes 
  3986.                 Ereignis wird in der Regel das nächste Ereignis sein, das von 
  3987.                 GetEvent geliefert wird.
  3988. Siehe auch      GetEvent
  3989.  
  3990.  
  3991. Rectangle                                                               Kernel
  3992.  
  3993. Deklaration     Procedure Rectangle(x1,y1,x2,y2 : Integer; Color : Byte)
  3994. Funktion        Zeichnet ein nicht ausgefülltes Rechteck
  3995. Parameter       x1,y1   Koordinaten der linken oberen Ecke
  3996.                 x2,y2   Koordinaten der rechten unteren Ecke
  3997.                 Color   Farbe des Rechtecks
  3998.                 
  3999. ReplaceMenuItem                                                         API
  4000.  
  4001. Deklaration     ReplaceMenuItem(Menu: hMenu; ID: MenueID; NewItem: String; 
  4002.                 IDNewItem: MenueID; NewHotKey: char)
  4003. Funktion        Ersetzt einen Menüeintrag durch einen anderen
  4004. Parameter       Menu            Zeiger auf das Menü
  4005.                 ID              Identifikationsnummer des zu ersetzenden 
  4006.                                 Menüeintrages
  4007.                 NewItem         Titel des neuen Menüeintrages
  4008.                 IDNewItem       Identifikationsnummer des neuen Menüeintrages
  4009.                 NewHotKey       Abkürzungstaste (Hotkey) des neuen 
  4010.                                 Menüeintrages
  4011. Hinweis         Der Titel des neuen Menüeintrages sollte ein Ampersand-Symbol 
  4012.                 zur Kennzeichnung des zu unterstreichenden Buchstabens als 
  4013.                 Hinweis auf die Abkürzungstaste enthalten.
  4014. Beispiel        ReplaceMenuItem(GetMenu, 101, 'Zoom &Picture', 102, 'P');
  4015.                 ersetzt den Eintrag 101 im Hauptmenü durch einen neuen 
  4016.                 Eintrag mit der gleichen Identifikationsnummer und der 
  4017.                 Abkürzungstaste "P".
  4018. Siehe auch      GetMenu, EnableMenuItem, CheckMenuItem
  4019.  
  4020.  
  4021. SetBackColor                                                            Kernel
  4022.  
  4023. Deklaration     Procedure SetBackColor(NewColor: Word)
  4024. Funktion        Setzt die Hintergrundfarbe
  4025. Parameter       NewColor        Die neue Hintergrundfarbe
  4026. Hinweis         Dieser Aufruf kann nur auf Karten mit Farbpalette 
  4027.                 funktionieren. Die Hintergrundfarbe wird dabei durch 
  4028.                 Vertauschen der Paletteneinträge erzeugt.
  4029.  
  4030.  
  4031.                                - 62 -
  4032.  
  4033.  
  4034.  
  4035. SetColor                                                                Kernel
  4036.  
  4037. Deklaration     Procedure SetColor(DieFarbe : Byte)
  4038. Funktion        Setzt die aktuelle Zeichenfarbe
  4039. Parameter       DieFarbe        Die aktuelle Zeichenfarbe
  4040. Hinweis         Diese Prozedur setzt die aktuelle Zeichenfarbe für die 
  4041.                 Prozeduren LineRel, LineTo, MoveRel, MoveTo, OutText und 
  4042.                 OutTextXY. Die Defaultfarbe ist auf jeder Grafikkarte weiss.
  4043. Siehe auch      LineRel, LineTo, OutText, OutTextXY
  4044.  
  4045.  
  4046. SetLinePattern                                                          Kernel
  4047.  
  4048. Deklaration     Procedure SetLinePattern(Pattern: Word)
  4049. Funktion        Setzt ein neues Linienmuster
  4050. Parameter       Das niederwertigste Byte enthält das Linienmuster. 
  4051.                 Vordefiniert sind die Muster
  4052.                 SolidLn         durchgezogene Linie
  4053.                 DottedLn        gepunktete Linie
  4054.                 CenterLn        strichpunktierte Linie
  4055.                 DashedLn        gestrichelte Linie
  4056. Hinweis         Vorbelegt ist das Muster SolidLn    
  4057. Siehe auch      GetLinePattern, Line
  4058.  
  4059.  
  4060. SetMousePos                                                             Kernel
  4061.  
  4062. Deklaration     Procedure SetMousePos(x,y : Integer)
  4063. Funktion        Setzt die Koordinaten der Maus
  4064. Parameter       x,y     absolute Koordinaten der neuen Mausposition
  4065. Hinweis         Die Koordinaten beziehen sich nicht auf den aktuell 
  4066.                 gesetzten Viewport.
  4067. Siehe auch      SetMouseRange
  4068.  
  4069.  
  4070. SetMouseRange                                                           Kernel
  4071.  
  4072. Deklaration     Procedure SetMouseRange(x1,y1,x2,y2 : Integer)
  4073. Funktion        definiert den Bewegungsbereich der Maus
  4074. Parameter       x1,y1   Koordinaten der linken oberen Ecke des Bereiches
  4075.                 x2,y2   Koordinaten der rechten unteren Ecke des Bereiches
  4076. Hinweis         Die Angabe der Koordinaten erfolgt absolut, wird also nicht 
  4077.                 auf den aktuell gesetzten Viewport bezogen. 
  4078. Beispiel        SetMouseRange(0 ,0 ,GetMaxX , GetMaxY)
  4079.                 definiert die gesamte Bildschirmfläche als Bewegungsbereich 
  4080.                 der Maus.
  4081. Siehe auch      SetMousePos
  4082.  
  4083.  
  4084. SetPalette                                                              Kernel
  4085.  
  4086. Deklaration     Procedure SetPalette(ThePalette,R,B,G: Byte)
  4087. Funktion        Setzt einen Paletteneintrag neu
  4088. Parameter       ThePalette              Index des Paletteneintrages
  4089.                 R, G, B         Anteile der Grundfarbwerte
  4090. Hinweis         Bei Grafikkarten ohne Farbpalette bleibt ein Aufruf von 
  4091.                 SetPalette ohne Wirkung.
  4092. Siehe auch      GetPalette, GetMaxColors
  4093.  
  4094.  
  4095.  
  4096.                                - 63 -
  4097.  
  4098.  
  4099. SetPoint                                                                Kernel
  4100.  
  4101. Deklaration     Procedure SetPoint(x,y : Integer; Color: Byte)
  4102. Funktion        Zeichnet einen Punkt
  4103. Parameter       x,y     Koordinaten des Punktes
  4104.                 color   Farbe des Punktes
  4105.  
  4106.  
  4107. SetProjectName                                                          Kernel
  4108.  
  4109. Deklaration     Procedure SetProjectName(TheName: String)
  4110. Funktion        Macht den Projektnamen dem System bekannt
  4111. Parameter       TheName         Der Projektname
  4112. Hinweis         Der Projektname wird verwendet, um die Dateinamen für die 
  4113.                 Initialisierungs-, Resource- und Hilfedateien zu erzeugen. 
  4114.                 Die Prozedur OpenMainApplication bedient sich dieser Prozedur, 
  4115.                 um den Projektnamen bekannt zu machen. Möchte man auf die 
  4116.                 Initialisierungsdatei zugreifen, bevor die Prozedur 
  4117.                 OpenMainApplication aufgerufen wurde, muß der Projektname 
  4118.                 explizit mit SetProjectName bekannt gemacht werden. Diese 
  4119.                 Prozedur kann auch dazu verwendet werden, auf fremde 
  4120.                 Initialisierungsdateien zuzugreifen.
  4121. Siehe auch      OpenMainApplication
  4122.  
  4123.  
  4124. SetTextDirection                                                        Kernel
  4125.  
  4126. Deklaration     Procedure SetTextDirection(Dir: Word)
  4127. Funktion        Legt fest, ob der skalierbare Zeichensatz über die Prozeduren 
  4128.                 OutText und OutTextXY horizontal (von links nach rechts) oder 
  4129.                 vertikal (von unten nach oben) ausgegeben werden soll.
  4130. Parameter       Dir     Richtungsangabe. Möglich sind folgende Werte
  4131.                                 0       horizontale Richtung
  4132.                                 1       vertikale Richtung
  4133. Hinweis         Der Parameter Dir legt fest, in welcher Richtung der skalier-
  4134.                 bare Font ausgegeben werden soll. Dazu sind die zwei 
  4135.                 Konstanten HorizDir (0) und VertDir (1) vordefinert.
  4136.                 HorizDir        Der Text wird in horizontaler Ausrichtung 
  4137.                                 (von links nach rechts) ausgebeben.
  4138.                 VertDir         Der Text wird in verikaler Ausrichtung 
  4139.                                 (von unten nach oben) ausgegeben.
  4140.                 Die Voreinstellung ist HorizDir (0).
  4141. Siehe auch      GetTextSettings, OutText, OutTextXY, SetTextHeight, 
  4142.                 SetTextJustify, SetTextUserScale, GetTextLength
  4143.  
  4144.  
  4145. SetTextHeight                                                           Kernel
  4146.  
  4147. Deklaration     Procedure SetTextHeight(CharSize : Word)
  4148. Funktion        Legt die Größe des skalierbaren Zeichensatzes für die Ausgabe 
  4149.                 mit den Prozeduren OutText und OutTextXY fest.
  4150. Parameter       CharSize                Größe der Zeichen
  4151. Hinweis         CharSize gibt die Größe eines Großbuchstabens des skalierbaren
  4152.                 Zeichensatzes in Pixeln an. Wählt man für die Größe z.B. 32, 
  4153.                 wird ein großes 'M' 32 Pixel an Höhe auf dem Bildschirm ein-
  4154.                 nehmen. 
  4155. Siehe auch      GetTextSettings, OutText, OutTextXY, SetTextDirection, 
  4156.                 SetTextJustify, SetTextUserScale, GetTextLength
  4157.  
  4158.  
  4159. SetTextJustify                                                          Kernel
  4160.  
  4161.                                - 64 -
  4162.  
  4163.  
  4164.  
  4165. Deklaration     Procedure SetTextJustify(Horiz, Vert: Word)
  4166. Funktion        Legt die Ausrichtung eines Textes zu seiner Grundlinie für 
  4167.                 die Ausgabe mit den Prozeduren OutText und OutTextXY fest.
  4168. Parameter       Horiz   horizontale Ausrichtung  
  4169.                         0       Linksbündige Ausgabe
  4170.                         1       Zentrierte Ausgabe      
  4171.                         2       Rechtsbündige Ausgabe
  4172.                 Vert    vertikale Ausrichtung
  4173.                         0       Ausgabe auf der Grundlinie
  4174.                         1       Ausgabe zentriert zur Grundlinie
  4175.                         2       Ausgabe unter der Grundlinie
  4176. Hinweis         Bei der Ausgabe eines Textes mit Hilfe der Prozeduren OutText 
  4177.                 und OutTextXY wird durch die Angabe der Koordinaten X und Y 
  4178.                 bzw. des Grafikcursors festgelegt, an welcher Stelle die 
  4179.                 Textausgabe erfolgen soll. Die Ausrichtung des Textes bestimmt
  4180.                 dabei, wie die Koordinaten des Ausgabepunktes interpretiert 
  4181.                 werden. Für die horizontale Ausrichtung gilt:
  4182.                 0       Der Text wird linksbündig, das heisst ab der Stelle 
  4183.                         X,Y ausgegeben.         
  4184.                 1       Der Text wird zentriert ausgegeben, das heisst der 
  4185.                         Punkt X,Y stellt den Mittelpunkt des Textes dar
  4186.                 2       Der Text wird rechtsbündig ausgegeben, das heisst der 
  4187.                         Punkt X,Y markiert das Ende des Textes.
  4188.                 Die Grundlinie verläüft vom Punkt X,Y ausgehend in Schreib-
  4189.                 richtung. Für die vertikale Ausrichtung gilt
  4190.                 0       Normale Ausgabe. Die Buchstaben stehen auf der 
  4191.                         Grundlinie.
  4192.                 1       Zentrierte Ausgabe. Die Grundlinie geht durch die 
  4193.                         Mitte der Großbuchstaben.
  4194.                 2       Hängende Ausgabe. Die Großbuchstaben hängen an der 
  4195.                         Grundlinie
  4196.                 Es stehen die vordefinierten Konstanten LeftText (0), 
  4197.                 CenterText (1) und RightText (2) für die horizontale- und 
  4198.                 BottomText (0), CenterText (1) und TopText (2) für die 
  4199.                 vertikale Ausrichtung zur Verfügung. Die Voreinstellungen 
  4200.                 sind LeftText (horizontal) und BottomText (vertikal).
  4201. Siehe auch      GetTextSettings, OutText, OutTextXY, SetTextDirection, 
  4202.                 SetTextHeight, SetTextUserScale, GetTextLength
  4203.  
  4204.  
  4205. SetTextStyle                                                            Kernel
  4206.  
  4207. Deklaration     Procedure SetTextStyle(Font, Direction : Word; CharSize : Word)
  4208. Funktion        Setzt das Format für die Textausgabe über die Prozeduren 
  4209.                 OutText und OutTextXY.
  4210. Parameter       Font    Der Zeichensatz, für den die Formate gelten
  4211.                 Direction       Die Ausgaberichtung
  4212.                 CharSize        Die Größe des Zeichensatzes
  4213. Hinweis         Die aktuelle Version von deLite erlaubt nur einen einzigen 
  4214.                 Font zu laden und zu benutzen. Eine spätere Version soll 
  4215.                 dagegen mehrere Fonts gleichzeitig ermöglichen. Diesem 
  4216.                 Sachverhalt trägt der Parameter Font Rechnung. Verwenden Sie 
  4217.                 in der vorliegenden Version für diesen Parameter immer den 
  4218.                 vordefinierten Wert DefaultFont (0).
  4219.                 Mit dem Parameter Direction können Sie bestimmen, in welcher 
  4220.                 Richtung der skalierbare Zeichensatz ausgegeben wird. Es 
  4221.                 können die vordefinierten Werte HorizDir (0) und VertDir (1) 
  4222.                 angegeben werden. Sehen Sie dazu auch die Erklärungen zu der 
  4223.                 Prozedur SetTextDirection.
  4224.                 Mit CharSize bestimmen Sie, wie groß der Text auf dem 
  4225.  
  4226.                                - 65 -
  4227.  
  4228.  
  4229.                 Bildschirm ausgegeben wird. Die Angabe entspricht dabei der 
  4230.                 Pixelgröße eines Großbuchstaben. Beachten Sie bitte auch die 
  4231.                 Erklärungen zur Prozedur SetTextHeight.
  4232. Siehe auch      GetTextSettings, OutText, OutTextXY, SetTextHeight, 
  4233.                 SetTextJustify, SetTextUserScale, GetTextLength
  4234.  
  4235.  
  4236. SetTextUserScale                                                        Kernel
  4237.  
  4238. Deklaration     SetTextUserScale(CharSizeX, CharSizeY : Word)
  4239. Funktion        Setzt unabhängige Skalierungsfaktoren für die X- und 
  4240.                 Y-Ausdehnung des skalierbaren Zeichensatzes. Der Parameter 
  4241.                 wirkt sich auf die Prozeduren OutText und OutTextXY aus.
  4242. Parameter       CharSizeX               Breite der Buchstaben
  4243.                 CharSizeY               Höhe der Buchstaben
  4244. Hinweis         Mit CharSizeY bestimmen Sie, wieviele Pixel ein Großbuchstabe 
  4245.                 des skalierbaren Zeichensatzes auf dem Bildschirm einnimmt. 
  4246.                 Da die mitgelieferten Zeichensätze Proportionalschriften sind,
  4247.                 kann man den Parameter CharSizeX nicht direkt als Zeichenbreite
  4248.                 interpretieren. Vielmehr stellt dieser Parameter einen 
  4249.                 Verhältnisfaktor zur Höhe der Zeichen dar. Möchten Sie, daß 
  4250.                 der Zeichensatz unverzerrt ausgegeben wird, wählen Sie den 
  4251.                 selben Wert wie CharSizeY (Dies entspricht einem Aufruf von 
  4252.                 SetTextHeight). Möchten Sie den Zeichensatz stauchen, muss 
  4253.                 der Wert CharSizeX kleiner sein als CharSizeY. Zum Dehnen 
  4254.                 wählen Sie CharSizeX größer als CharSizeY.
  4255.                 Die Funktion GetTextLenght ermittelt die Länge in Pixeln, 
  4256.                 die ein String auf dem Bildschirm einnimmt.
  4257. Siehe auch      GetTextSettings, OutText, OutTextXY, SetTextDirection, 
  4258.                 SetTextHeight, SetTextJustify, GetTextLength
  4259.  
  4260.  
  4261. SetTheViewPort                                                          API
  4262.  
  4263. Deklaration     Procedure SetTheViewPort(ID: integer)
  4264. Funktion        Setzt den Viewport eines Klienten
  4265. Parameter       ID              Identifikationsnummer des Klienten
  4266. Hinweis         Vor dem Aufruf der Empfangsprozedur eines Klienten wird sein 
  4267.                 Viewport aktiviert. Mit Hilfe dieser Prozedur kann ein 
  4268.                 Klient auch den Viewport eines anderen Klienten beschreiben.
  4269. Siehe auch      GetTheViewPort
  4270.  
  4271. SetTimer                                                                Kernel
  4272.  
  4273. Deklaration     Function  SetTimer(ClientId : Integer; Mode, 
  4274.                 MiliSecs : Word) : Integer
  4275. Funktion        Startet einen Systemtimer
  4276. Parameter       ClientID        Identifikationsnummer zur Unterscheidung der 
  4277.                                 einzelnen Timer
  4278.                 Mode            Modus, mit dem der Timer gestartet wird. 
  4279.                                 Möglich sind die Werte: 
  4280.                                 1       SingleShot Modus
  4281.                                 2       ContinuousShots Modus
  4282.                 MiliSecs        Zeitdauer in Milisekunden
  4283. Ergebnis        Das Ergebnis vom Typ Integer stellt die intern verwendetete 
  4284.                 Kanalnummer des Timers dar und liegt im Bereich von 2 bis 16. 
  4285.                 Falls der Rückgabewert -1 geliefert wird, sind alle Timer 
  4286.                 belegt und es konnte kein neuer Timer mehr gestartet werden. 
  4287.                 In diesem Fall müsen Sie warten, bis wieder ein Timer frei 
  4288.                 wird, oder Sie müssen explizit einen Timer mit StopTimer 
  4289.                 freigegen.
  4290.  
  4291.                                - 66 -
  4292.  
  4293.  
  4294. Hinweis         DeLite stellt dem Anwenderprogramm 15 voneinander unabhängige 
  4295.                 Systemtimer zur Verfügung. Nachdem ein Systemtimer mit 
  4296.                 SetTimer gestartet wurde und die Zeitdauer MiliSecs vergangen 
  4297.                 ist, wird ein Event mit der Klasse TimerEvent generiert. Der 
  4298.                 Selektor ClientID des Timerevents enhält dann die bei SetTimer
  4299.                 vereinbarte Ientifikationsnummer. Werden mehrere Timer von 
  4300.                 verschiedenen Klienten gestartet, können die generierten 
  4301.                 Events anhand der Idendifikation unterschieden werden. Der 
  4302.                 Selektor TimerChannel des Events enhält die Kanalnummer des 
  4303.                 Timers, eine Zahl zwischen 2 und 16. Damit können sogar 
  4304.                 Timer unterschieden werden, die von dem selben Klienten 
  4305.                 gestartet wurden. Die Kanalnummer ist dieselbe, die als 
  4306.                 Rückgabewert der Funktion geliefert wird. Sie wird auch zum 
  4307.                 Stoppen des Timers mit StopTimer benötigt.
  4308.                 Die Systemtimer von deLite arbeiten in zwei Modi. Im Modus 
  4309.                 SingleShot generiert der Timer nach Ablauf der Zeitspanne 
  4310.                 MiliSecs ein einzelnes Timerevent und gibt sich danach 
  4311.                 selbstätig frei. Sie können den Timer allerdings vor Ablauf 
  4312.                 seiner Zeit mit StopTimer freigeben. Das kann für die 
  4313.                 Überwachung eines Timeout sinvoll sein.
  4314.                 Im Modus ContinuousShots generiert der Timer in periodischen 
  4315.                 Zeitabständen Timervents. Die Zeitdauer zwischen zwei Events 
  4316.                 beträgt den in MiliSecs übergebenen Wert in Milisekunden. 
  4317.                 Ein mit diesem Modus gestarteter Timer muß mit StopTimer 
  4318.                 explizit freigegeben werden.
  4319. Siehe auch      StopTimer, GetEvent
  4320.  
  4321.  
  4322. ShowMouse                                                               Kernel
  4323.  
  4324. Deklaration     Procedure ShowMouse
  4325. Funktion        Macht den Mauszeiger wieder sichtbar
  4326. Hinweis         Nachdem der Mauszeiger durch einen Aufruf von HideMouse 
  4327.                 versteckt wurde, kann der Mauszeiger durch ShowMouse wieder 
  4328.                 sichtbar gemacht werden.
  4329.                 Beachten Sie, daß mehrere Aufrufe von HideMouse genauso 
  4330.                 viele Aufrufe von ShowMouse erforden, um den Mauszeiger 
  4331.                 wieder erscheinen zu lassen.
  4332. Siehe auch      HideMouse
  4333.  
  4334.  
  4335. StopTimer                                                               Kernel
  4336.  
  4337. Deklaration     Procedure StopTimer(ClientID, TimerChannel : Integer)
  4338. Funktion        Stoppt einen zuvor mit SetTimer gestarteten Systemtimer
  4339. Parameter       ClientID        Die beim Starten des Timers mit SetTimer 
  4340.                                 vereinbarte Identifikationsnummer
  4341.                 TimerChannel    Interne Kanalnummer des Timers. Dieser Wert 
  4342.                                 wurde Ihnen als Rückgabewert der Funktion 
  4343.                                 SetTimer geliefert
  4344. Siehe auch      SetTimer
  4345.  
  4346.  
  4347. SuspendApplication                                                      API
  4348.  
  4349. Deklaration     Procedure SuspendApplication(ID: integer)
  4350. Funktion        Deaktiviert den Viewport eines Klienten
  4351. Parameter       ID              Identifikationsnummer des Klienten
  4352. Hinweis         Mausereignisse werden einem Klienten zugeschickt, wenn sie 
  4353.                 innerhalb seines Viewports stattgefunden haben. Mit der 
  4354.                 Prozedur SuspendApplication kann der Dispatcher angewiesen 
  4355.  
  4356.                                - 67 -
  4357.  
  4358.  
  4359.                 werden, den Viewport eines Klienten bei der Verteilung von 
  4360.                 Mausereignissen nicht zu berücksichtigen. ActivateApplication 
  4361.                 hebt die Wirkung eines Aufrufs von SuspendApplication wieder 
  4362.                 auf.
  4363. Siehe auch      ActivateApplication, GetMainID
  4364.  
  4365.  
  4366. SysWindow                                                               API
  4367.  
  4368. Deklaration     Procedure SysWindow(x,y: integer; errtext: string)
  4369. Funktion        Gibt einen Text in einem Fenster aus
  4370. Parameter       x,y     Position des Fensters
  4371.                 errtext Der Text
  4372. Hinweis         Die Prozedur SysWindow wartet nach dem Öffnen des Fensters 
  4373.                 und der Ausgabe des Textes auf eine Bestätigung des Benutzers. 
  4374.                 Bis auf die andere Hintergrundfarbe unterscheidet sich diese 
  4375.                 Prozedur nicht von ErrWindow.
  4376. Siehe auch      OpenWindow, WriteWin, ErrWindow
  4377.  
  4378.  
  4379. UpCase                                                                  Kernel
  4380.  
  4381. Deklaration     Function UpCase(InChar: Char): Char
  4382. Funktion        Liefert zu einem Zeichen den entsprechenden Großbuchstaben
  4383. Parameter       InChar  Das Zeichen
  4384. Ergebnis        Zurückgeliefert wird der Großbuchstabe. 
  4385. Hinweis         Diese Funktion überlagert die Turbo-Pascal Funktion Upcase 
  4386.                 und besitzt zusätzlich die Fähigkeit, auch Umlaute und 
  4387.                 diakritische Zeichen konvertieren zu können.
  4388. Siehe auch      UpString
  4389.  
  4390.  
  4391. UpString                                                                Kernel
  4392.  
  4393. Deklaration     Procedure UpString(Var TheString: String)
  4394. Funktion        Wandelt einen String in Großbuchstaben
  4395. Parameter       TheString       enthält den zu wandelnden String
  4396. Hinweis         Diese Prozedur bedient sich der Funktion UpCase und ist daher
  4397.                 auch in der Lage, Umlaute und diakrische Zeichen zu 
  4398.                 konvertieren.
  4399. Siehe auch      UpCase
  4400.  
  4401.  
  4402. WaitConfirm                                                             API
  4403.  
  4404. Deklaration     Procedure WaitConfirm
  4405. Funktion        Liest solange Ereignisse, bis ENTER, ESCAPE oder eine 
  4406.                 Maustaste betätigt werde
  4407. Hinweis         Diese Prozedur wird dazu verwendet, bei einem geöffneten 
  4408.                 Fenster auf eine Bestätigung des Anwenders zu warten, bevor 
  4409.                 das Fenster geschlossen wird. Die Verwendung von WaitConfirm 
  4410.                 stellt sicher, daß keine Klienten aktiv werden können, 
  4411.                 während das Fenster geöffnet ist.
  4412. Siehe auch      OpenWindow
  4413.  
  4414.  
  4415. WriteWin                                                                API
  4416.  
  4417. Deklaration     Procedure WriteWin(str: string; x,y: integer; Color: Byte)
  4418. Funktion        Gibt einen Text im aktuell gesetzten Viewport aus
  4419. Parameter       str             Der Text
  4420.  
  4421.                                - 68 -
  4422.  
  4423.  
  4424.                 x,y             Position 
  4425.                 Color   Farbe
  4426. Hinweis         Die Position wird hier nicht in Pixelkoordinaten, sondern in 
  4427.                 Cursorkoordinaten angegeben. X und Y geben also Spalte und 
  4428.                 Zeile an.
  4429. Beispiel                WriteWin('hello world',1,1,15)
  4430.                 druckt den angegebenen Text in weißer Farbe in die erste 
  4431.                 Zeile des Viewports.
  4432. Siehe auch      OutTextAPI
  4433.  
  4434.  
  4435. XORBAR                                                                  Kernel
  4436.  
  4437. Deklaration     Procedure XORBar(x1,y1,x2,y2: Integer)
  4438. Funktion        Invertiert eine ausgefüllte rechteckige Fläche
  4439. Parameter       x1,y1           Koordinaten der linken oberen Ecke
  4440.                 x2,y2           Koordinaten der rechten unteren Ecke
  4441. Hinweis         XORBar invertiert eine ausgefüllte rechteckige Fläche in 
  4442.                 der Graphik. Dazu wird eine Exklusiv-Oder Verknüpfung 
  4443.                 verwendet. Wird XORBar noch einmal mit den gleichen 
  4444.                 Parametern aufgerufen, wird durch die doppelte Invertierung 
  4445.                 der Ausgangszustand der Graphik wieder hergestellt. Dieser 
  4446.                 Effekt kann z.B. zur Selektierung eines Objektes benutzt 
  4447.                 werden.
  4448. Beispiel
  4449.                 XORBar(0,0,100,100); {Recheck invertiert}
  4450.                 WaitConfirm;
  4451.                 XORBar(0,0,100,100); {Invertierung wieder aufgeheben }
  4452.  
  4453. Siehe auch      Bar, XORLine, XORRectangle
  4454.  
  4455.  
  4456. XORLine                                                                 Kernel
  4457.  
  4458. Deklaration     Procedure XORLine(x1,y1,x2,y2 : Integer; Thickness : Byte)
  4459. Funktion        Invertiert eine Linie
  4460. Parameter       x1,y1           Startpunkt der Linie
  4461.                 x2,y2           Endpunkt der Linie
  4462. Hinweis         XORLine invertiert eine Linie in der Graphik. Dazu wird eine 
  4463.                 Exklusiv-Oder Verknüpfung verwendet. Wird XORLine noch einmal 
  4464.                 mit den gleichen Parametern aufgerufen, wird durch die 
  4465.                 doppelte Invertierung der Ausgangszustand der Graphik wieder 
  4466.                 hergestellt. Dieser Effekt kann z.B. zur Selektierung eines 
  4467.                 Objektes benutzt werden.
  4468. Beispiel
  4469.                 XORLine(0,0,100,100); {Linie invertieren }
  4470.                 WaitConfirm;
  4471.                 XORLine(0,0,100,100); {Invertierung wieder aufheben }
  4472.  
  4473. Siehe auch      Line, XORBar, XORRectangle
  4474.  
  4475.  
  4476. XORRectangle                                                            Kernel
  4477.  
  4478. Deklaration     Procedure XORRectangle(x1,y1,x2,y2 : Integer; Thickness : Byte)
  4479. Funktion        Invertiert ein nicht ausgefülltes Rechteck
  4480. Parameter       x1,y1           linke obere Ecke des Rechteckes
  4481.                 x2,y2           rechte untere Ecke des Rechteckes
  4482. Hinweis         XORRectangle invertiert ein nicht ausgefülltes Rechteck in 
  4483.                 der Graphik. Dazu wird eine Exklusiv-Oder Verknüpfung 
  4484.                 verwendet. Wird XORRectangle noch einmal mit den gleichen 
  4485.  
  4486.                                - 69 -
  4487.  
  4488.  
  4489.                 Parametern aufgerufen, wird durch die doppelte Invertierung 
  4490.                 der Ausgangszustand der Graphik wieder hergestellt. Dieser 
  4491.                 Effekt kann z.B. zur Selektierung eines Objektes benutzt 
  4492.                 werden.
  4493. Beispiel                
  4494.                 XORRectangle(0,0,100,100); {Recheck invertieren }
  4495.                 WaitConfirm;
  4496.                 XORRectangle(0,0,100,100); {Invertierung wieder aufheben }
  4497.  
  4498. Siehe auch      Rectangle, XORBar, XORLine
  4499.  
  4500.  
  4501.  
  4502.  
  4503.  
  4504.  
  4505.  
  4506.  
  4507.  
  4508.  
  4509.  
  4510.  
  4511.  
  4512.  
  4513.  
  4514.  
  4515.  
  4516.  
  4517.  
  4518.  
  4519.  
  4520.  
  4521.  
  4522.  
  4523.  
  4524.  
  4525.  
  4526.  
  4527.  
  4528.  
  4529.  
  4530.  
  4531.  
  4532.  
  4533.  
  4534.  
  4535.  
  4536.  
  4537.  
  4538.  
  4539.  
  4540.  
  4541.  
  4542.  
  4543.  
  4544.  
  4545.  
  4546.  
  4547.  
  4548.  
  4549.  
  4550.  
  4551.                                - 70 -
  4552.  
  4553.  
  4554. 10 Verzeichnis der Objekte
  4555.  
  4556. Dieses Kapitel  enthält  eine alphabetisch  geordnete  Auflistung 
  4557. aller von deLite definierten  Objekte.  Beachten Sie, daß wir bei 
  4558. der   Darstellung    eines   Objektes   nur   die   jeweils   neu 
  4559. hinzugekommenen   oder  modifizierten   Variablen   und  Methoden 
  4560. beschreiben.   Da ein abgeleitetes Objekt auch alle Variablen und 
  4561. Methoden  seiner  Vorfahren  erbt,  kann  es sein,  daß Sie  eine 
  4562. Information  über  ein bestimmtes  Feld  nicht  in dem jeweiligen 
  4563. Objekt,   sondern   in  einem  seiner  Vorfahren   finden.    Der 
  4564. unmittelbare  Vorfahre  - sofern  es einen  gibt- ist jeweils  in 
  4565. kursiver Schrift rechts neben dem Objektnamen angegeben. 
  4566.  
  4567. Die Objekthierarchie
  4568.  
  4569. Die Objekthierarchie finden Sie im gedruckten Handbuch. Die ent-
  4570. sprechende Grafik kann hier nicht wiedergegeben werden.
  4571.  
  4572. Konventionen
  4573.  
  4574. Bei  der  Vergabe  von Namen  für Methoden  und Konstanten  folgt 
  4575. deLite  einer  Reihe von Konventionen.   Bei der Erweiterung  der 
  4576. Objekte  sollten Sie sich diesen Konventionen  anschließen.   Der 
  4577. Name eines  Zeigers  auf ein Objekt  bildet  sich sich stets  aus 
  4578. einem P und dem nachgestellten Namen Objektnamen: PObject=^Object 
  4579. Die   von  Dialogelementen   im  Feld   MSG  des  Records   Event 
  4580. übermittelten  Botschaften  sind  als Konstanten  definiert,  die 
  4581. stets mit dem Präfix DLG_ beginnen. Die Flags des Objektes DIALOG 
  4582. beginnen  stets  mit dem Präfix  MF_ Die Statusinformationen  von 
  4583. Dialogelementen  beginnen  stets mit Präfix sf Konstruktoraufrufe 
  4584. tragen   die  Bezeichnung   Init  Destruktoraufrufe   tragen  die 
  4585. Bezeichnung Done 
  4586.  
  4587. Bitkodierte Informationen
  4588.  
  4589. Die Objekte  verwenden  an vielen Stellen  bitkodierte  Werte zur 
  4590. Speicherung von Statusinformationen.  Der Zugriff auf diese Werte 
  4591. erfolgt über logische Verknüpfungen:  So verwenden Sie zum Setzen 
  4592. eines Bits den OR-Operator. 
  4593.  
  4594.         flags := flags or sfNoFocus
  4595.  
  4596. Weitere  Informationen  zu diesem Thema finden Sie im Kapitel  11 
  4597. des Buches  "Objektorientierte  Programmierung  und Turbo-Vision" 
  4598. Ihrer Turbo-Pascal Dokumentation. 
  4599.  
  4600.  
  4601. Button                                                                  DlgItem
  4602.  
  4603. Ein  Button   ist  eine   rechteckige   Schaltfläche   mit  einer 
  4604. Beschriftung,   die  bei  Betätigung  eine  Botschaft  DLG_BUTTON 
  4605. erzeugt.  Der Button trägt keine Statusinformation  und verändert 
  4606. demnach seinen Zustand nicht nach Betätigung; er funktioniert wie 
  4607. ein Taster,  der immer wieder betätigt  werden  kann und jedesmal 
  4608. die gleiche Botschaft erzeugt. 
  4609.  
  4610. Felder
  4611. TheLabel        TheLabel: LabelStr
  4612.                 Enthält die Beschriftung der Schaltfläche
  4613. Methoden
  4614. Init            constructor Init(x1, y1, dx, dy, TheID: Integer; 
  4615.  
  4616.                                - 71 -
  4617.  
  4618.  
  4619.                 TheText: LabelStr)
  4620.                 Die Parameter x1 und y1 enthalten die Position des 
  4621.                 Buttons innerhalb des Dialogfensters, dx und dy 
  4622.                 geben die horizontale und vertikale Ausdehnung an. 
  4623.                 Die Beschriftung TheText wird zentriert auf der 
  4624.                 Schaltfläche gezeichnet. TheID ist die Identifi-
  4625.                 kationsnummer des Buttons.
  4626. Draw            procedure Draw
  4627.                 Die Methode zum Zeichnen des Buttons.
  4628. HandleEvent     procedure HandleEvent(TheEvent: EventTyp)
  4629.                 Die Botschaftenempfangsprozedur des Buttons.
  4630.  
  4631. CheckBox                                                                DlgItem
  4632.  
  4633. Eine  CheckBox  ist  eine  quadratische  Schaltfläche,  die  eine 
  4634. boolesche  Information  trägt  und ihren  Zustand  bei Betätigung 
  4635. ändert.    Je  nach  erreichtem   Zustand   wird  eine  Botschaft 
  4636. DLG_CHECKED oder DLG_UNCHECKED erzeugt. Beachten Sie die Methoden 
  4637. Check,    Uncheck    und   IsChecked,    die   Bestandteil    des 
  4638. Ursprungsobjektes DlgItem sind. 
  4639.  
  4640. Felder  
  4641. TheLabel        TheLabel: LabelStr
  4642.                 enthält die Beschriftung der Checkbox, die rechts neben der 
  4643.                 Schaltfläche gezeichnet wird
  4644. Methoden
  4645. Init            constructor Init(x1, y1, TheID: Integer; TheText: LabelStr)
  4646.                 Anzugeben sind die Position und die ID-Nummer der Checkbox 
  4647.                 sowie die Beschriftung
  4648. Draw            procedure Draw
  4649.                 Die Methode zum Zeichnen der CheckBox
  4650. HandleEvent     procedure HandleEvent(TheEvent: EventTyp)
  4651.                 Die Botschaftenempfangsprozedur der CheckBox
  4652.  
  4653.  
  4654. Dialog
  4655.  
  4656. Dialog  ist  das  Basisobjekt,  das  Sie für jedes  Dialogfenster 
  4657. benötigen.   Es  enthält  die  Methoden  und  Informationen   zur 
  4658. Verwaltung  des  Dialogfensters  und  zur  Steuerung  der mit dem 
  4659. Dialog verbundenen Dialogelemente. 
  4660.  
  4661. Felder
  4662. Origin          Origin: DPoint
  4663.                 Origin enthält die Koordinaten der linken oberen Ecke des 
  4664.                 Dialogfensters
  4665. Size            Size: DPoint
  4666.                 Size enthält die Größe des Dialogfensters.
  4667. Caption         Caption: LabelStr
  4668.                 Sofern beim Init-Aufruf das Flag MF_CAPTION übergeben wurde, 
  4669.                 enthält das Dialogfenster am oberen Rand eine Titelzeile. 
  4670.                 Die Variable Caption enthält die Beschriftung der Titelzeile, 
  4671.                 die mit Hilfe der Methode SetCaption gesetzt wurde.
  4672. topic           topic: LabelStr
  4673.                 Topic enthält das mit Hilfe der Methode SetTopic gesetzte 
  4674.                 Hilfestichwort, das für die Online-Hilfe verwendet wird. Wird 
  4675.                 kein Hilfestichwort gesetzt, bleibt eine Hilfeanforderung 
  4676.                 über die Taste F1 wirkungslos.
  4677. Flags           Flags: Word
  4678.                 In Flags werden bitkodiert Statusinformationen des Dialoges 
  4679.                 abgelegt. Dazu sind folgende Konstanten definiert:
  4680.  
  4681.                                - 72 -
  4682.  
  4683.  
  4684.                 MF_CAPTION              Der Dialog besitzt eine Titelzeile
  4685.                 MF_CANCELLED            Der Dialog wurde abgebrochen
  4686.                 MF_POPPEDUP             Der Dialog ist bereits gezeichnet
  4687. rdy             rdy: boolean
  4688.                 Die Methode DoDialog fordert so lange weitere Events an und 
  4689.                 arbeitet sie ab, bis die Variable rdy den Wert TRUE annimmt. 
  4690.                 Die Methode DestroyDialog bricht auf diese Weise den Dialog ab.
  4691. marked          marked: boolean
  4692.                 Die Variable marked gibt an, ob das zur Zeit markierte 
  4693.                 Element bereits entsprechend gezeichnet wurde. Auf diese 
  4694.                 Weise wird verhindert, daß ein angeklicktes Dialogelement 
  4695.                 ständig neu gezeichnet wird, während die Maustaste gedrückt 
  4696.                 ist.
  4697. Focus           Focus: PDialog
  4698.                 Focus ist ein Zeiger auf das aktuell fokussierte Dialogelement.
  4699.                 Das fokussierte Element bekommt alle Ereignisse, die keine 
  4700.                 Positionsereignisse sind, also etwa alle Tastaturereignisse. 
  4701.                 Nicht immer ist ein Dialogelement fokussiert.
  4702. FirstItem       FirstItem: PDialog
  4703.                 Die Dialogelemente werden in einer Baumstruktur mit dem 
  4704.                 Dialog verbunden. FirstItem ist ein Zeiger auf das erste 
  4705.                 Element dieses Baumes. 
  4706. Port            Port: ViewPortType
  4707.                 Port enthält den tatsächlichen Viewport des Dialogfensters, 
  4708.                 also die realen Koordinaten der Eckpunkte des Dialoges. Diese 
  4709.                 Werte unterscheiden sich von den in Origin abgelegten  
  4710.                 Koordinaten, da Origin den von der Menüzeile eingenommenen 
  4711.                 Platz nicht berücksichtigt.
  4712. DlgOwner        DlgOwner: EventReceiveProc
  4713.                 DlgOwner ist ein Zeiger auf die Dialogempfangsprozedur, die 
  4714.                 beim Aufruf von Init angegeben wurde. Diese Prozedur bekommt 
  4715.                 alle von den Dialogelementen erzeugten Meldungen zugeschickt.
  4716. Methoden
  4717. Init            constructor Init(dx,dy: Integer; Flag: Word; 
  4718.                 TheProc: EventReceiveProc)
  4719.                 Vor der Verwendung des Dialoges muß der Konstruktor Init 
  4720.                 aufgerufen werden. Er initialisiert alle Felder mit 
  4721.                 Initialwerten. Die Parameter dx und dy geben die Größe des 
  4722.                 Dialogfensters in Pixeln an und werden in Size abgelegt. 
  4723.                 Origin wird so berechnet, daß das Dialogfenster in der 
  4724.                 Bildschirmmitte zentriert erscheint. Als Flag kann eine der 
  4725.                 unter Flags angegebenen Konstanten übergeben werden; im 
  4726.                 Normalfall hat es den Wert 0. Die in TheProc übergebene 
  4727.                 Botschaftenempfangsprozedur muß mit der FAR-Direktive 
  4728.                 übersetzt werden.
  4729. Done            destructor Done
  4730.                 Done gibt den von den mit dem Dialog verbunden Dialogelementen 
  4731.                 eingenommenen Speicher frei, indem es deren eigene Done-
  4732.                 Methoden aufruft, und entfernt anschließend das Dialogfenster 
  4733.                 vom Bildschirm. Done geht davon aus, daß Ihre Instanz des 
  4734.                 Objektes Dialog selbst nicht als dynamische Variable erzeugt 
  4735.                 wurde, sondern als gewöhnliche Variable deklariert wurde. 
  4736.                 Hier erfolgt also keine Speicherplatzfreigabe.
  4737. Move            procedure Move(x,y: Integer)
  4738.                 Move verschiebt das Dialogfenster an die angegebene Position. 
  4739. SetCaption      procedure SetCaption(Capt: LabelStr)
  4740.                 Belegt die Variable Caption mit dem angegebenen String. Die 
  4741.                 Titelzeile wird jedoch nur angezeigt, falls Init mit dem Flag 
  4742.                 MF_CAPTION aufgerufen wurde.
  4743. SetTopic        procedure SetTopic(top: LabelStr)
  4744.                 Setzt das Hilfestichwort für den Dialog. Im Initialzustand 
  4745.  
  4746.                                - 73 -
  4747.  
  4748.  
  4749.                 ist das Hilfestichwort leer, so daß eine Betätigung der F1-
  4750.                 Taste wirkungslos bliebe.
  4751. Show            procedure Show
  4752.                 Öffnet das Dialogfenster und zeigt den Dialog, indem es die 
  4753.                 Draw-Methoden aller verbundenen Dialogelemente aufruft.
  4754. AddItem         procedure AddItem(TheItem: PDialog)
  4755.                 AddItem fügt dem Dialog ein Dialogelement hinzu. 
  4756. DestroyDialog   procedure DestroyDialog
  4757.                 Beendet die Abarbeitung der Methode DoDialog, indem die 
  4758.                 Variable rdy auf den Wert TRUE gesetzt wird.
  4759. DoDialog        procedure DoDialog
  4760.                 DoDialog führt den Dialog aus. Es fordert laufend Events an 
  4761.                 und verteilt sie an die jeweils zuständigen Dialogelemente, 
  4762.                 die ihrerseits Botschaften erzeugen und über HandleEvent an 
  4763.                 die in Init angegebene Empfangsprozedur senden. Sobald aus 
  4764.                 der Empfangsprozedur heraus DestroyDialog aufgerufen wurde, 
  4765.                 wird DoDialog abgebrochen.
  4766. HandleEvent     procedure HandleEvent(MyEvent: EventTyp)
  4767.                 HandleEvent empfängt die von den Dialogelementen erzeugten 
  4768.                 Botschaften und leitet sie ggf. an die in Init angegebene 
  4769.                 Empfangsprozedur weiter. Einige Botschaften werden nicht 
  4770.                 weitergeleitet, sondern unmittelbar verarbeitet. 
  4771. FindDlgItem     function FindDlgItem(ID: Integer):Pointer
  4772.                 Über FindDlgItem wird ein generischer Zeiger auf das 
  4773.                 Dialogelement mit der angegebenen ID-Nummer angefordert. 
  4774.                 Existiert kein Element mit dieser Nummer, wird NIL zurück-
  4775.                 geliefert. 
  4776. SetTheFocus     procedure SetTheFocus(ID: Integer)
  4777.                 Mit Hilfe von SetTheFocus kann ein bestimmtes Dialogelement 
  4778.                 gezielt fokussiert werden. Ein Beispiel illustriert die
  4779.                 Anwendung dieser Prozedur: Nehmen wir an, Sie möchten in 
  4780.                 einem Dialogfeld zwei Zahlenwerte einlesen und erzeugen zu 
  4781.                 diesem Zweck einen Dialog mit den Schaltknöpfen OK und 
  4782.                 Abbruch und zwei Editierfeldern. In der 
  4783.                 Botschaftenempfangsprozedur empfangen Sie ein Event der 
  4784.                 Klasse DialogEvent, dessen Feld MSG den Inhalt DLG_OK trägt: 
  4785.                 Es wurde also der Schaltknopf OK betätigt. Sie  möchten den 
  4786.                 Dialog allerdings nur dann mit DestroyDialog schließen, 
  4787.                 falls die beiden Editierfelder auch wirklich gültige Zahlen 
  4788.                 enthalten. Sollten Sie feststellen, daß das nicht der Fall 
  4789.                 ist, verzichten Sie auf den Aufruf von DestroyDialog und 
  4790.                 setzen mit SetTheFocus den Fokus auf das erste fehlerhafte 
  4791.                 Editierfeld. Danach wird das Editierfeld markiert sein, und 
  4792.                 der Anwender kann den Inhalt des Editierfeldes sofort 
  4793.                 verändern.
  4794. GetEvent        procedure GetEvent(Var MyEvent: EventTyp)
  4795.                 Die Dialoge verwenden diese überlagerte Version von GetEvent, 
  4796.                 die selbst die Normalisierung der Ereignisse auf den Viewport 
  4797.                 des Dialoges übernimmt.
  4798.  
  4799. DlgGroup                                                                DlgItem
  4800.  
  4801. DlgGroup  ist ein aus mehreren Dialogelementen  zusammengesetztes 
  4802. Element.  Die einzelnen zu der Gruppe gehörenden  Elemente senden 
  4803. ihre Nachrichten  an das übergeordnete  Objekt  vom Typ DlgGroup, 
  4804. das diese Nachrichten  verarbeitet  und ggf.  Nachrichten  an die 
  4805. Dialogempfangsprozedur sendet. 
  4806.  
  4807. Felder
  4808. ItemGroup       ItemGroup: PDialog
  4809.                 ein Zeiger auf die Kette von Dialogelementen, die zu der 
  4810.  
  4811.                                - 74 -
  4812.  
  4813.  
  4814.                 Gruppe gehören. Die hier eingebundenen Elemente können selbst 
  4815.                 wieder Gruppen sein.
  4816. Methoden
  4817. Init            constructor Init(x1, y1, TheID: Integer)
  4818.                 Init ruft erst den Konstruktor von DlgItem auf und belegt 
  4819.                 anschließend das Feld ItemGroup mit NIL.
  4820. Done            destructor Done
  4821.                 Gibt den von der Gruppe benötigten Speicherplatz frei.
  4822. AddItem         procedure AddItem(TheItem: PDialog)
  4823.                 Fügt der Gruppe ein weiteres Dialogelement hinzu.
  4824. GetSuccessor    function GetSuccessor: PDialog
  4825.                 liefert das erste zu der Gruppe gehörende Dialogelement zurück.
  4826. Draw            procedure Draw
  4827.                 zeichnet die gesamte Gruppe, indem die Draw-Methoden aller 
  4828.                 Gruppenmitglieder aufgerufen werden.
  4829. FindGroupItem   function FindGroupItem(TheId: Integer):Pointer
  4830.                 liefert einen Zeiger auf das angegebene Gruppenelement zurück.
  4831. GlueGroup       procedure GlueGroup
  4832.                 Verbindet die einzelnen zu einer Gruppe gehörenden Elemente 
  4833.                 miteinander, indem die Felder owner und parent entsprechend 
  4834.                 belegt werden und die Koordinaten der einzelnen Elemente um 
  4835.                 die Koordinaten der Gruppe selbst korrigiert werden.
  4836.  
  4837. DlgItem
  4838.  
  4839. DlgItem  ist das Urobjekt  aller  Dialogelemente.   Es ist selbst 
  4840. nicht funktionsfähig, sondern nur in Form seiner Nachkommen. 
  4841.  
  4842. Felder
  4843. Origin          Origin: DPoint
  4844.                 enthält die Koordinaten der linken oberen Ecke des Elementes
  4845. Area            Area: DRect
  4846.                 enthält die aktive Fläche des Elementes. Diese Angabe wird 
  4847.                 bei der Zuordnung von Positionsereignissen verwendet.
  4848. Status          Status: Word
  4849.                 Das Feld Status enthält bitkodiert Informationen, die das 
  4850.                 Verhalten des Dialogelementes modifizieren. Möglich sind 
  4851.                 folgende, als Konstanten definierte Werte:
  4852.                 sfFocused       Das Dialogelement ist fokussiert
  4853.                 sfMarked        Dialogelement ist markiert
  4854.                 sfNoFocus       Das Dialogelement kann nicht fokussiert werden
  4855.                 sfDefault       Das Dialogelement sendet bei Betätigung DLG_OK
  4856.                 sfCancel        Das Dialogelement sendet bei Betätigung 
  4857.                                 DLG_CANCEL
  4858.                 sfPhoenix       Nachdem das Element zum ersten Mal gezeichnet 
  4859.                                 wurde,wird dieses Flag gelöscht
  4860.                 sfGroup         Das Dialogelement besteht aus mehreren 
  4861.                                 Elementen
  4862.                 sfBlind         Das Dialogelement empfängt keine Botschaften
  4863.                 sfChecked       Das Dialogelement ist mit einer Überprüfungs-
  4864.                                 marke versehen (nur bei CheckBox)
  4865.                 sfRepeat        Das Dialogelement möchte bei gedrückter 
  4866.                                 Maustaste wiederholt Botschaften erhalten.
  4867.                 sfDisabled      Das Dialogelement ist vorübergehend passiv. 
  4868.                                 Dieses Flag muß in der HandleEvent-Methode 
  4869.                                 beachtet werden.
  4870. ID              ID: Integer
  4871.                 Die Identifikationsnummer des Dialogelementes. Jedes 
  4872.                 Dialogelement muß eine einzigartige Identifikationsnummer 
  4873.                 tragen, die jeweils im Init-Aufruf angegeben wird. Beachten 
  4874.                 Sie, daß Identifikationsnummern ab 30000 für das System 
  4875.  
  4876.                                - 75 -
  4877.  
  4878.  
  4879.                 reserviert sind.
  4880. Next            Next: PDialog
  4881.                 Next ist ein Zeiger auf das nächste Dialogelement. Die 
  4882.                 Methode AddItem des Objektes Dialog nimmt die Verkettung der 
  4883.                 Dialogelemente vor.
  4884. parent          parent: PDialog
  4885.                 Dialogelemente, die zu einer Gruppe gehören, enthalten in 
  4886.                 diesem Feld einen Zeiger auf das DlgGroup-Objekt, zu dem sie 
  4887.                 gehören.
  4888. master          master: PDLG
  4889.                 Master ist ein Zeiger auf den Dialog, zu dem die Dialog-
  4890.                 elemente gehören.
  4891. owner           owner: EventReceiveProc
  4892.                 Das Feld Owner zeigt auf die Empfangsprozedur, der die 
  4893.                 erzeugten Botschaften zu schicken sind. 
  4894. Methoden
  4895. Init            constructor Init(x1, y1, TheID: Integer)
  4896.                 Der Aufruf von Init belegt die Felder Origin und ID mit den 
  4897.                 angegebenen Werten und setzt alle anderen Felder auf Initial-
  4898.                 werte. Von DlgItem abgeleitete Objekte müssen in ihrem 
  4899.                 eigenen Konstruktor zunächst den Konstruktor von DlgItem 
  4900.                 aufrufen.
  4901. Done            destructor Done
  4902.                 Der virtuelle Destruktor Done gibt den vom Dialogelement 
  4903.                 benötigten Speicherplatz frei.
  4904. GetSuccessor    function GetSuccessor: PDialog
  4905.                 liefert das nächste Dialogelement - also den Inhalt von Next.
  4906. SetFocus        procedure SetFocus
  4907.                 Setzt das Flag sfFocused im Feld status.
  4908. ClearFocus      procedure ClearFocus
  4909.                 Löscht das Flag sfFocused im Feld status.
  4910. SetMark         procedure SetMark
  4911.                 Setzt das Flag sfMarked im Feld status.
  4912. ClearMark       procedure ClearMark
  4913.                 Löscht das Flag sfMarked im Feld status.
  4914. EnableItem      procedure EnableItem
  4915.                 Löscht das Flag sfDisabled im Feld status.
  4916. DisableItem     procedure DisableItem
  4917.                 Setzt das Flag sfDisabled im Feld status.
  4918. ClearPhoenix    procedure ClearPhoenix
  4919.                 Löscht das Flag sfPhoenix im Feld status.
  4920. SetPhoenix      procedure SetPhoenix
  4921.                 Setzt das Flag sfPhoenix im Feld status.
  4922. Check           procedure Check
  4923.                 Setzt das Flag sfChecked im Feld status.
  4924. Unchecked       procedure Uncheck
  4925.                 Löscht das Flag sfChecked im Feld status.
  4926. SetRepeat       procedure SetRepeat
  4927.                 Setzt das Flag sfRepeat im Feld status.
  4928. IsChecked       function IsChecked: Boolean
  4929.                 liefert den Zustand des Flags sfChecked im Feld status.
  4930. Draw            procedure Draw
  4931.                 Draw ist eine abstrakte, virtuelle Funktion zum Zeichnen 
  4932.                 des Dialogelementes, die von den Nachfolgern von DlgItem 
  4933.                 überlagert werden muß. Draw muß dabei die Flags sfChecked, 
  4934.                 sfFocused, sfMarked, sfPhoenix und sfChecked beachten und 
  4935.                 das Aussehen des Dialogelementes jeweils so zeichnen, daß 
  4936.                 sich der Zustand dieser Flags darin wiederspiegelt. 
  4937. HandleEvent     procedure HandleEvent(TheEvent: EventTyp)
  4938.                 HandleEvent wird aufgerufen, sobald ein Ereignis für das 
  4939.                 Dialogelement vorliegt. Diese Methode ist virtuell und muß 
  4940.  
  4941.                                - 76 -
  4942.  
  4943.  
  4944.                 von den Nachfolgern von DlgItem überlagert werden. 
  4945.                 HandleEvent muß das Flag sfDisabled beachten.
  4946. SendMessage     procedure SendMessage(TheMsg: Integer)
  4947.                 SendMessage wird von den Dialogelementen aus deren 
  4948.                 HandleEvent-Prozedur aufgerufen, um ein Ereignis an die 
  4949.                 in Dialog.Init angemeldete Empfangsprozedur zu senden. 
  4950.                 SendMessage sendet eine Nachricht der Klasse DialogEvent 
  4951.                 und belegt das Feld MSG des Event-Records mit dem übergebenen 
  4952.                 Wert. Zusätzlich belegt es das Feld ID mit der ID-Nummer 
  4953.                 des Dialogelementes und das Feld DlgAdr mit der Adresse des 
  4954.                 Dialoges, zu dem das Dialogelement gehört, also dem Inhalt 
  4955.                 des Feldes master. So ist es dem Empfänger der Nachricht 
  4956.                 möglich, über MyEvent^.DlgAdr auf Felder und Methoden des 
  4957.                 Dialoges zuzugreifen.
  4958. IsInRect        function IsInRect(TheEvent: EventTyp): boolean
  4959.                 Sofern das übergebene Event zu der Klasse LeMouse gehört, 
  4960.                 wird geprüft, ob das Event innerhalb der durch das Feld Area 
  4961.                 gegebenen Fläche stattgefunden hat.
  4962. MakeDefaultItem procedure MakeDefaultItem
  4963.                 Setzt das Flag sfDefault im Feld Status. Das so markierte 
  4964.                 Dialogelement sendet bei Betätigung die Botschaft DLG_OK. 
  4965.                 In der Regel enthält jeder Dialog einen Button mit der 
  4966.                 Beschriftung OK, dessen Flag sfDefault gesetzt ist.
  4967. MakeCancelItem  procedure MakeCancelItem
  4968.                 Setzt das Flag sfCancel im Feld Status. Das so markierte 
  4969.                 Dialogelement sendet bei Betätigung die Botschaft DLG_CANCEL.
  4970. GimmeFocus      procedure GimmeFocus
  4971.                 Fokussiert das betroffene Dialogelement. Dies geschieht, 
  4972.                 indem die Botschaft DLG_GIVEFOCUS an Dialog gesendet wird, 
  4973.                 der entsprechend reagiert. So können Dialogelemente selbst 
  4974.                 den Fokus beantragen.
  4975.  
  4976. DPoint
  4977.  
  4978. Felder
  4979. X, Y            X, Y: Integer
  4980.                 enthalten eine Koordinate.
  4981. Methoden
  4982. Move            procedure Move(dx, dy: Integer)
  4983.                 verschiebt die Koordinate um die angegebenen Werte.
  4984.  
  4985. DRect.
  4986.  
  4987. Felder
  4988. P1, P2          P1, P2: DPoint
  4989.                 enthalten die Koordinaten der linken oberen und der rechten 
  4990.                 unteren Ecke eines Rechteckes.
  4991. Methoden
  4992. Assign          procedure Assign(x1, y1, x2, y2: Integer)
  4993.                 Belegt die Koordinaten mit den angegebenen Werten.
  4994. Move            procedure Move(dx, dy: Integer)
  4995.                 Verschiebt das Rechteck um die angegebenen Werte.
  4996.  
  4997. EditField                                                               DlgItem
  4998.  
  4999. EditField   ist   ein   einzeiliges   Feld   zur  Eingabe   einer 
  5000. Zeichenkette,  die wahlweise  als String  oder  als Integer-Größe 
  5001. interpretiert werden kann und deren Länge begrenzt werden kann. 
  5002.  
  5003. Felder
  5004. thelen          thelen: Integer
  5005.  
  5006.                                - 77 -
  5007.  
  5008.  
  5009.                 Die sichtbare Länge des Editierfeldes in Cursoreinheiten
  5010. maxlen          maxlen: Integer
  5011.                 Die maximale Länge der zu editierenden Zeichenkette. Ist 
  5012.                 die tatsächliche Länge größer als die sichtbare Länge, wird 
  5013.                 der Ausschnitt des Editierfeldes entsprechend verschoben.
  5014. curpos          curpos: Integer
  5015.                 Die relative Cursorposition innerhalb des Editierfeldes
  5016. abspos          abspos: Integer
  5017.                 Die absolute Cursorposition innerhalb des Editierfeldes 
  5018.                 inklusive der eventuell nicht sichtbaren Zeichen.
  5019. cursor          cursor: boolean
  5020.                 Gibt an, ob der Cursor zur Zeit sichtbar ist.
  5021. altered         altered: boolean
  5022.                 Gibt an, ob der Inhalt der Zeichenkette seit des letzten 
  5023.                 Sendens einer Botschaft DLG_EDITCHGD modifiziert wurde.
  5024. TheString       TheString: String
  5025.                 Der Inhalt des Editierfeldes
  5026. Methoden
  5027. Init            constructor Init(x, y, len, max, TheID: Integer; deflt: String)
  5028.                 Anzugeben sind neben der Position und der ID die Breite des 
  5029.                 Editierfeldes in Cursoreinheiten und die maximale Länge der 
  5030.                 zu editierenden Zeichenkette. In deflt wird die Vorbelegung 
  5031.                 des Editierfeldes übergeben.
  5032.  
  5033. Draw            procedure Draw
  5034.                 Zeichnet das Editierfeld
  5035. HandleEvent     procedure HandleEvent(TheEvent: EventTyp)
  5036.                 Die Botschaftenempfangsprozedur des Editierfeldes
  5037. ClearFocus      procedure ClearFocus
  5038.                 Überlagert die gleichnamige Methode aus DlgItem. Das 
  5039.                 Editierfeld sendet beim Abgeben des Fokus, sofern die Variable 
  5040.                 altered den Wert TRUE hat, die Botschaft DLG_EDITCHGD.
  5041. SetString       procedure SetString: String
  5042.                 Belegt den Inhalt des Editierfeldes mit dem angegebenen String.
  5043. GetString       function GetString: String
  5044.                 liefert den Inhalt des Editierfeldes
  5045. IsInteger       function IsInteger: boolean
  5046.                 liefert TRUE zurück, falls der Inhalt des Editierfeldes eine 
  5047.                 gültige Integerzahl darstellt.
  5048. GetValue        function GetValue: Integer
  5049.                 liefert den Inhalt des Editierfeldes als Integerzahl.
  5050.  
  5051. FileRequester                                                   DlgGroup
  5052.  
  5053. FileRequester  ist  eine  aus mehreren  Gruppen  zusammengesetzte 
  5054. Gruppe zur Ermittlung  eines Dateinamens.   Bei der Auswahl einer 
  5055. Datei wird die Botschaft DLG_FILEREQ gesendet. 
  5056.  
  5057. Felder 
  5058. lines           lines: Integer 
  5059.                 Die Anzahl der gleichzeitig sichtbaren Verzeichniseinträge. 
  5060.                 Die Anzahl der sichtbaren Dateieinträge ist lines+2. 
  5061. Methoden 
  5062. Init            constructor Init(x,y,lin, TheID: Integer, ThePath: String; 
  5063.                 TheMask: string) 
  5064.                 Anzugeben sind neben den Koordinaten, der Zahl der gleichzeitig
  5065.                 sichtbaren Verzeichniseinträge und der ID-Nummer der Pfad, 
  5066.                 von dem aus der FileRequester startet, und eine Dateimaske. 
  5067. Done            destructor Done 
  5068.                 Gibt den vom FileRequester benötigten Speicherplatz wieder 
  5069.                 frei. 
  5070.  
  5071.                                - 78 -
  5072.  
  5073.  
  5074. Draw            procedure Draw 
  5075.                 Zeichnet den FileRequester. 
  5076. HandleEvent     procedure HandleEvent(TheEvent: EventTyp) 
  5077.                 Die Botschaftenempfangsprozedur des Filerequesters. 
  5078. GetSelected     function GetSelected: String 
  5079.                 liefert den ausgewählten Dateinamen zurück. 
  5080. GetPath         function GetPath: String 
  5081.                 liefert das Verzeichnis der ausgewählten Datei zurück 
  5082.  
  5083. LabelFrame                                                              DlgItem
  5084.  
  5085. LabelFrame ist ein passives Dialogelement.   Es besteht aus einem 
  5086. Rahmen und einer Beschriftung und soll den logischen Zusammenhang 
  5087. von Dialogelementen optisch unterstreichen. 
  5088.  
  5089. Felder 
  5090. TheLabel        TheLabel: LabelStr 
  5091.                 Enthält die Beschriftung. 
  5092. Methoden 
  5093. Init            constructor Init(x1, y1, dx, dy, TheID: Integer; 
  5094.                 TheText: LabelStr) 
  5095.                 Anzugeben sind Position und Größe des Rahmens, seine ID-
  5096.                 Nummer und die zu verwendende Beschriftung. Die Beschriftung 
  5097.                 unterbricht das obere Segment des Rahmens. 
  5098. Draw            procedure Draw 
  5099.                 Zeichnet den Rahmen. 
  5100.  
  5101. LabelText                                                               DlgItem
  5102.  
  5103. Objekte des Typs LabelText dienen der Beschriftung von Dialogen. 
  5104.  
  5105. Felder 
  5106. TheLabel        TheLabel: LabelStr 
  5107.                 Enthält die Beschriftung. 
  5108. Methoden
  5109. Init            constructor Init(x1, y1, TheID: Integer; TheText: LabelStr) 
  5110.                 Der Text wird an der angegebenen Position linksbündig 
  5111.                 gezeichnet. 
  5112. Draw            procedure Draw 
  5113.                 Zeichnet den Text. 
  5114. SetLabel        procedure SetLabel(TheText: LabelStr) 
  5115.                 Belegt den Text neu mit dem angegebenen Wert. 
  5116.  
  5117. ListBox                                                         DlgGroup
  5118.  
  5119. Die ListBox  dient der Auswahl  eines Elementes  aus einer Liste. 
  5120. Enthält  die Liste  mehr Elemente,  als gleichzeitig  dargestellt 
  5121. werden  können,  kann  der  sichtbare   Ausschnitt   entsprechend 
  5122. verschoben  werden.  Die Liste wird über zwei Prozeduren  vom Typ 
  5123. GetListProc  eingelesen,  die  beim  Konstruktoraufruf  anzugeben 
  5124. sind.  Sobald ein Element  selektiert  wurde,  wird die Botschaft 
  5125. DLG_LISTSELECT gesendet. 
  5126.  
  5127. Felder 
  5128. Itemwidth       Itemwidth: Integer 
  5129.                 Die sichtbare Breite der Liste. 
  5130. ListLength      ListLength: Integer 
  5131.                 Die Anzahl der gleichzeitig sichtbaren Einträge der Liste 
  5132. ListPtr         ListPtr: Integer 
  5133.                 Die markierte Zeile innerhalb des sichtbaren Ausschnitts 
  5134.                 der Liste 
  5135.  
  5136.                                - 79 -
  5137.  
  5138.  
  5139. select          select: ListStr 
  5140.                 Der zuletzt selektierte Eintrag der Liste 
  5141. GetFirstProc    GetFirstProc: GetListProc 
  5142.                 Die Callback-Prozedur zur Ermittlung des ersten Eintrages 
  5143.                 der Liste. 
  5144.                 Zusammen mit GetNextProc wird so die Liste aufgebaut. 
  5145. GetNextProc     GetNextProc: GetListProc 
  5146.                 Die Callback-Prozedur zur Ermittlung des jeweils nächsten 
  5147.                 Eintrages der Liste. 
  5148. TheList         TheList: PTextListItem 
  5149.                 Die Liste ist als doppelt verkettete Liste abgelegt. TheList 
  5150.                 zeigt auf das erste Element der Liste 
  5151. Current         Current: PTextListItem
  5152.                 Current zeigt auf das aktuell markierte Element 
  5153. Top             Top: PtextListItem 
  5154.                 Top zeigt auf das erste sichtbare Listenelement 
  5155. Methoden 
  5156. Init            constructor Init(x,y, wid, len, TheID: Integer; 
  5157.                 GetFirst, GetNext: GetListProc) 
  5158.                 Anzugeben sind Position, Größe und ID der ListBox und die 
  5159.                 beiden Callback-Prozeduren zum Aufbau der Liste. 
  5160. Done            destructor Done 
  5161.                 Gibt den gesamten von der ListBox in Anspruch genommenen 
  5162.                 Speicherplatz inklusive der Liste selbst frei. 
  5163. Draw            procedure Draw 
  5164.                 Zeichnet die ListBox. 
  5165. HandleEvent     procedure HandleEvent(TheEvent: EventTyp) 
  5166.                 Die Botschaftenempfangsprozedur der ListBox. 
  5167. ReadList        procedure ReadList 
  5168.                 liest die Liste ein. 
  5169. RemoveList      procedure RemoveList 
  5170.                 gibt die Liste frei. 
  5171. Update          procedure Update 
  5172.                 verwirft die aktuelle Liste und liest sie neu ein. 
  5173. GetSelected     function GetSelected: String 
  5174.                 liefert das zuletzt selektierte Element 
  5175.  
  5176. RadioButton                                                             DlgItem
  5177.  
  5178. Mehrere  RadioButtons   bilden  zusammen   eine  Gruppe  vom  Typ 
  5179. RadioButtons.  RadioButtons verhalten sich so wie Knöpfe an alten 
  5180. Radios:  Betätigt man einen, springt der zuvor gedrückte  heraus. 
  5181. Im  Unterschied   zu  den  meisten   anderen  Gruppen  steht  bei 
  5182. RadioButtons  nicht von vornherein  fest, welche Elemente  zu der 
  5183. Gruppe gehören. Daher erfolgt die Definition einer solchen Gruppe 
  5184. in einem rekursiven Aufruf. 
  5185.  
  5186. Felder 
  5187. TheLabel        TheLabel: LabelStr 
  5188.                 Die Beschriftung des RadioButton erscheint rechts neben 
  5189.                 dem Element 
  5190. MyGroup         MyGroup: PRadioButtons 
  5191.                 MyGroup ist ein Zeiger auf das übergeordnete Gruppenelement 
  5192.                 vom Typ RadioButtons. 
  5193. Methoden 
  5194. Init            constructor Init(x1,y1, TheID: Integer; TheText: 
  5195.                 LabelStr; nextB: PRadioButton)
  5196.                 Neben der Position, der ID und der Beschriftung wird in 
  5197.                 nextB ein Zeiger auf den jeweils nächsten zu definierenden 
  5198.                 RadioButton übergeben. Der letzte RadioButton muß hier den 
  5199.                 Wert NIL übergeben. 
  5200.  
  5201.                                - 80 -
  5202.  
  5203.  
  5204. Draw            procedure Draw 
  5205.                 Die Methode zum Zeichnen des RadioButton. 
  5206. HandleEvent     procedure HandleEvent(TheEvent: EventTyp) 
  5207.                 Die Botschaftenempfangsprozedur des RadioButton. 
  5208.                 
  5209. RadioButtons                                                    DlgGroup 
  5210.  
  5211. RadioButtons ist die übergeordnete Gruppe, deren Elemente vom Typ 
  5212. RadioButton  sind.  RadioButtons  selbst enthält lediglich  einen 
  5213. Rahmen und eine Beschriftung.   Bei Betätigung  eines RadioButton 
  5214. wird die Botschaft DLG_RADIO gesendet. 
  5215.  
  5216. Felder 
  5217. Title           Title: LabelStr 
  5218.                 Der Titel der RadioButtons-Gruppe. Er erscheint 
  5219.                 oberhalb der Gruppe und unterbricht das obere Segment des 
  5220.                 Rahmens um die Gruppe 
  5221. Methoden 
  5222. Init            constructor Init(x1, y1, dx, dy, TheID: 
  5223.                 Integer; TheText: LabelStr; nextB: RadioButton) 
  5224.                 Die Parameter des Konstruktors sind Position, Größe, ID und 
  5225.                 Titel der Gruppe und ein Zeiger auf das erste Element vom 
  5226.                 Typ RadioButton. 
  5227. Draw            procedure Draw 
  5228.                 Die Methode zum Zeichnen der RadioButtons-Gruppe 
  5229. HandleEvent     procedure HandleEvent(TheEvent: EventTyp) 
  5230.                 Die Botschaftenempfangsprozedur von RadioButtons. 
  5231. WhosChecked     function WhosChecked: Integer
  5232.                 Liefert die ID des aktuell gedrückten RadioButton.
  5233. CheckButton     procedure CheckButton(TheId: Integer)
  5234.                 Betätigt den RadioButton mit der angegebenen ID-Nummer.
  5235. Beispiel        Das Beispiel definiert eine RadioButtons-Gruppe mit vier 
  5236.                 Elementen vom Typ RadioButton und fügt sie dem Dialog 
  5237.                 MyDialog hinzu. Der RadioButton mit der ID 36 wird gesetzt.
  5238.  
  5239.     new(MyRadioButtons, Init(10,270,150,50,34,'Wählen Sie:',
  5240.         new(PRadioButton,Init(5,10,35,'Alt',
  5241.          new(PRadioButton, Init(5,30,36,'Kölsch',
  5242.           new(PRadioButton, Init(80,10,37,'Pils',
  5243.            new(PRadioButton, Init(80,30,38,'Weizen',nil))))))))));
  5244.     MyDialog.AddItem(MyRadioButtons);
  5245.     MyRadioButtons^.CheckButton(36); { Kölsch }
  5246.  
  5247. SelectBox                                                       DlgGroup
  5248.  
  5249. Die SelectBox  dient ähnlich  wie die ListBox  der Auswahl  eines 
  5250. Elementes  aus einer Liste.   Allerdings  ist in diesem  Fall nur 
  5251. jeweils ein Element sichtbar,  so daß mit der SelectBox  auch die 
  5252. Aufgabe einer RadioButtons-Gruppe übernommen werden kann, bei der 
  5253. immer genau ein Element aus einer Anzahl von Elementen aktiv ist. 
  5254. Mit Hilfe zweier Schaltflächen kann das jeweils sichtbare Element 
  5255. vor- bzw.  zurückgeschaltet  werden,  wobei jeweils die Botschaft 
  5256. DLG_BOXCHANGE  gesendet  wird.  Bei der Auswahl  des selektierten 
  5257. Elementes wird DLG_BOXSELECT gesendet. 
  5258.  
  5259. Felder
  5260. Itemwidth       Itemwidth: Integer
  5261.                 Die sichtbare Breite des Fensters in Cursoreinheiten
  5262. GetFirstProc    GetFirstProc: GetListProc
  5263.                 Die Callback-Prozedur zur Ermittlung des ersten 
  5264.                 Eintrages der Liste. Zusammen mit GetNextProc wird 
  5265.  
  5266.                                - 81 -
  5267.  
  5268.  
  5269.                 so die Liste aufgebaut.
  5270. GetNextProc     GetNextProc: GetListProc
  5271.                 Die Callback-Prozedur zur Ermittlung des jeweils 
  5272.                 nächsten Eintrages der Liste.
  5273. TheList         TheList: PTextListItem
  5274.                 Die Liste ist als doppelt verkettete Liste abgelegt. 
  5275.                 TheList zeigt auf das erste Element der Liste
  5276. Current         Current: PTextListItem
  5277.                 Current zeigt auf das aktuell markierte Element
  5278. Methoden
  5279. Init            constructor Init(x,y, wid, TheID: Integer; 
  5280.                 GetFirst, GetNext: GetListProc)
  5281.                 Anzugeben sind Position, Breite und ID der SelectBox und die 
  5282.                 beiden Callback-Prozeduren zum Aufbau der Liste.
  5283. Done            destructor Done
  5284.                 Gibt den gesamten von der SelectBox in Anspruch genommenen 
  5285.                 Speicherplatz inklusive der Liste selbst frei.
  5286. Draw            procedure Draw
  5287.                 Zeichnet die SelectBox.
  5288. HandleEvent     procedure HandleEvent(TheEvent: EventTyp)
  5289.                 Die Botschaftenempfangsprozedur der SelectBox.
  5290. ReadList        procedure ReadList
  5291.                 liest die Liste ein.
  5292. RemoveList      procedure RemoveList
  5293.                 gibt die Liste frei.
  5294. Update          procedure Update
  5295.                 verwirft die aktuelle Liste und liest sie neu ein.
  5296. GetSelected     function GetSelected: String
  5297.                 liefert das zuletzt selektierte Element
  5298. Select          procedure Select(TheString: LabelStr)
  5299.                 Selektiert das angegebene Element, sofern es existiert
  5300. ClearFocus      procedure ClearFocus
  5301.                 überlagert die gleichnamige Methode aus DlgItem.
  5302.  
  5303. Slider                                                                  DlgItem
  5304.  
  5305. Der  Slider   ist  ein  Schieberegler,   dessen   Position   eine 
  5306. Integergröße kontrolliert.   Der Slider sendet bei jeder Bewegung 
  5307. die  Botschaft  DLG_SLIDERMOVED   und  nach  dem  Loslassen   die 
  5308. Botschaft DLG_SLIDERRLSD. 
  5309.  
  5310. Felder
  5311. min, max        min, max: Integer
  5312.                 Die obere und untere Grenze der Integergröße, die 
  5313.                 proportional zur Position des Sliders verändert wird.
  5314. pos             pos: Integer    
  5315.                 Die aktuelle Position des Sliders in Pixeln.
  5316. Methoden
  5317. Init            constructor Init(x1, y1, len, TheID, pmin, pmax: Integer; 
  5318.                 dir: dirtype)
  5319.                 In x1 und y1 wird die Koordinate des Sliders innerhalb des 
  5320.                 Dialoges angegeben. Len spezifiziert die tatsächliche 
  5321.                 Ausdehnung der Schiebereglerfläche in Pixeln, während pmin 
  5322.                 und pmax den Bereich der dem Slider zugeordneten Integergröße 
  5323.                 entsprechen. Dir steht für die Ausrichtung des Sliders, hier 
  5324.                 ist zur Zeit nur der Wert hor zulässig.
  5325. Draw            procedure Draw
  5326.                 Die Zeichenmethode des Sliders.
  5327. HandleEvent     procedure HandleEvent(TheEvent: EventTyp)
  5328.                 Die Botschaftenempfangsprozedur des Sliders.
  5329. GetPos          function GetPos: Integer
  5330.  
  5331.                                - 82 -
  5332.  
  5333.  
  5334.                 liefert eine der Position des Sliders proportionale 
  5335.                 Integergröße.
  5336. SetPos          procedure SetPos(thepos: integer)
  5337.                 setzt die Position des Sliders neu.
  5338.         
  5339. UserButton                                                              DlgItem
  5340.  
  5341. Ein  UserButton  ist eine  rechteckige,  mit einer  Bitmap-Grafik 
  5342. versehene  Schaltfläche,   die  bei  Betätigung   eine  Botschaft 
  5343. DLG_BUTTON erzeugt.  Der UserButton trägt keine Statusinformation 
  5344. und verändert  demnach seinen Zustand  nicht nach Betätigung;  er 
  5345. funktioniert  wie ein Taster,  der immer wieder  betätigt  werden 
  5346. kann und jedesmal die gleiche Botschaft erzeugt. 
  5347.  
  5348. Felder
  5349. dxb, dyb        dxb, dyb: Integer
  5350.                 Die Ausdehnung der Bitmap-Grafik in Pixeln.
  5351. hk              hk: char
  5352.                 Ein Hotkey, der in Verbindung mit der ALT-Taste den 
  5353.                 UserButton betätigt. Diese Funktion wird zur Zeit noch 
  5354.                 nicht unterstützt.
  5355. IconPtr         IconPtr: Pointer
  5356.                 Ein Zeiger auf die Bitmap-Grafik des UserButton.
  5357. Methoden
  5358. Init            constructor Init(x1, y1, dx, dy, xb, yb, TheID: Integer; 
  5359.                 TheHk: char;  TheIcon: Pointer)
  5360.                 Die Parameter x1 und y1 enthalten die Position des 
  5361.                 UserButtons innerhalb des Dialogfensters, dy und dy geben 
  5362.                 die horizontale und vertikale Ausdehnung an. Xb und yb 
  5363.                 stehen für die Ausdehnung der Bitmap-Grafik; TheID ist die 
  5364.                 ID-Nummer des UserButtons. Zusätzlich wird noch ein Hotkey 
  5365.                 und ein Zeiger auf die Bitmap-Grafik übergeben.
  5366. Draw            procedure Draw
  5367.                 Die Methode zum Zeichnen des UserButtons.
  5368. HandleEvent     procedure HandleEvent(TheEvent: EventTyp)
  5369.                 Die Botschaftenempfangsprozedur des UserButtons.
  5370.  
  5371. UserRadioButton                                                 RadioButton
  5372.  
  5373. Mehrere  Elemente  vom Typ UserRadioButton  bilden zusammen  eine 
  5374. Gruppe  vom  Typ  UserRadioButtons.    Im  Unterschied  zu  ihrem 
  5375. Vorgänger   RadioButton    sind   UserRadioButtons    rechteckige 
  5376. Schaltflächen  beliebiger  Größe,  die  mit  einer  Bitmap-Grafik 
  5377. versehen sein können. 
  5378.  
  5379. Felder
  5380. IconPtr         IconPtr: Pointer
  5381.                 Der Zeiger auf die Bitmap-Grafik
  5382. dxb, dyb        dxb, dyb: Integer
  5383.                 Die Größe der Bitmap-Grafik
  5384. Methoden
  5385. Init            constructor Init(x1, y1, dx, dy, xb, yb, TheID: Integer; 
  5386.                 TheIcon: Pointer; nextB: PUserRadioButton)
  5387.                 Anzugeben sind in x1 und y1 die Position des UserRadioButton, 
  5388.                 in dx und dy seine Größe, und in xb und yb die Größe der 
  5389.                 Bitmap-Grafik. Neben der ID-Nummer wird zusätzlich ein 
  5390.                 Zeiger auf die Bitmap-Grafik und ein Zeiger auf das nächste 
  5391.                 Element vom Typ UserRadioButton übergeben. Das letzte so 
  5392.                 definierte Element übergibt in nextB den Wert NIL.
  5393. Draw            procedure Draw
  5394.                 Die Methode zum Zeichnen des RadioButton.
  5395.  
  5396.                                - 83 -
  5397.  
  5398.  
  5399.  
  5400. UserRadioButtons                                                RadioButtons
  5401.  
  5402. UserRadioButtons  ist eine übergeordnete  Gruppe,  deren Elemente 
  5403. vom  Typ  UserRadioButton  sind.  Im  Unterschied  zum  Vorgänger 
  5404. RadioButtons  zeichnet  UserRadioButtons   selbst  keine  eigenen 
  5405. Elemente. 
  5406.  
  5407. Methoden
  5408. Init            constructor Init(x1, y1, dx, dy, TheID: Integer; 
  5409.                 nextB: PUserRadioButton)
  5410.                 Die Parameter des Konstruktors sind Position, Größe, ID und 
  5411.                 Titel der Gruppe und ein Zeiger auf das erste Element vom 
  5412.                 Typ UserRadioButton.
  5413. Draw            procedure Draw
  5414.                 Die Methode zum Zeichnen der UserRadioButtons-Gruppe.
  5415. Beispiel        Das Beispiel definiert eine Gruppe mit vier Elementen des 
  5416.                 Typs UserRadioButton und fügt sie dem Dialog MyDialog hinzu. 
  5417.                 Die Elemente tragen die ID-Nummern 412 bis 415, die Gruppe 
  5418.                 selbst hat die ID-Nummer 411. 
  5419.  
  5420.     new(MyUserRadios, Init(400,250,60,60,411,
  5421.         new(PUserRadio, Init(0,0,30,30,30,30,412,nil,
  5422.          new(PUserRadio, Init(30,0,30,30,30,30,413,nil,
  5423.           new(PUserRadio, Init(0,30,30,30,30,30,414, nil,
  5424.            new(PUserRadio, Init(30,30,30,30,30,30,415, nil,nil))))))))));
  5425.     MyDialog.AddItem(MyUserRadios);
  5426.  
  5427.  
  5428.  
  5429.  
  5430.  
  5431.  
  5432.  
  5433.  
  5434.  
  5435.  
  5436.  
  5437.  
  5438.  
  5439.  
  5440.  
  5441.  
  5442.  
  5443.  
  5444.  
  5445.  
  5446.  
  5447.  
  5448.  
  5449.  
  5450.  
  5451.  
  5452.  
  5453.  
  5454.  
  5455.  
  5456.  
  5457.  
  5458.  
  5459.  
  5460.  
  5461.                                - 84 -
  5462.  
  5463.  
  5464. Anhang A  Konfigurationsmöglichkeiten
  5465.  
  5466. Die folgende  Auflistung  beschreibt  die vom System  verwendeten 
  5467. Einträge  in der Initialisierungsdatei.   Beachten  Sie,  daß mit 
  5468. Ausnahme des Eintrages  Video im Abschnitt  Hardware alle Angaben 
  5469. fakultativ sind. Fehlen diese Angaben, verwendet deLite sinnvolle 
  5470. Vorbelegungen. Zur Deklaration eines Abschnittes ist der Name des 
  5471. Abschnittes in eckigen Klammern zu schreiben. 
  5472.  
  5473. Der Abschnitt Paths
  5474.  
  5475. Im Abschnitt Paths können Pfadangaben  auf eine Reihe von Dateien 
  5476. definiert  werden.  Fehlen die Pfadangaben,  versucht deLite, die 
  5477. jeweilige  Datei aus dem aktuell gesetzten Verzeichnis  zu lesen. 
  5478. Dieser    Abschnitt    ist    nützlich,    falls    Sie   mehrere 
  5479. deLite-Applikationen   einsetzen   und   die   Videotreiber   und 
  5480. Zeichensatzdateien  nur  ein  einziges  Mal auf Ihrer  Festplatte 
  5481. speichern möchten. 
  5482.  
  5483. VDIDir          definiert den Pfad auf die Grafiktreiber
  5484. FontDir         definiert den Pfad auf die Zeichensatzdateien
  5485. SwapDir         definiert den Pfad für die vom Speichermanager 
  5486.                 temporär erzeugten Auslagerungsdateien. Alternativ 
  5487.                 können Sie auch mit Hilfe des DOS-Befehls SET eine 
  5488.                 Environment-Variable mit dem Namen TEMP erzeugen, 
  5489.                 die den Pfad für die Auslagerungsdateien definiert. 
  5490.                 Verwenden Sie niemals ein Diskettenlaufwerk zum 
  5491.                 Auslagern!
  5492.  
  5493. Der Abschnitt Hardware
  5494.  
  5495. Im Abschnitt Hardware wird der zu verwendende  Grafiktreiber  und 
  5496. ggf.  der zu ladende skalierbare  Zeichensatz  definiert.  DeLite 
  5497. nimmt keine automatische Erkennung der installierten  Grafikkarte 
  5498. vor; diese Angabe ist also zwingend  notwendig.   Der skalierbare 
  5499. Zeichensatz   wird  nicht  benötigt,   falls   Sie  der  Prozedur 
  5500. OpenMainApplication als modus die Konstante APP_NOFONT übergeben. 
  5501. Anderenfalls ist auch diese Angabe zwingend erforderlich. 
  5502.  
  5503. Video           definiert den zu verwendenden Grafiktreiber
  5504. Font            definiert den zu verwendenden skalierbaren Zeichensatz
  5505.  
  5506. Der Abschnitt memory
  5507.  
  5508. Im  Abschnitt  memory  kann  die  Speicherverwaltung  von  deLite 
  5509. parametrisiert  werden.   Hier können Sie angeben,  unter welchen 
  5510. Bedingungen  die  Speicherverwaltung   EMS  oder  die  Festplatte 
  5511. verwenden soll, anstatt den Heap zu benutzen. 
  5512.  
  5513. HeapMin         definiert, wieviel Heap-Speicher mindestens freigelassen 
  5514.                 werden soll. Nachdem diese Grenze erreicht ist, versucht 
  5515.                 die Speicherverwaltung, EMS-Speicher zu verwenden. 
  5516.                 Als Vorbelegung verwendet deLite den Wert 262144, 
  5517.                 also 256kByte. Wenn Sie hier einen unrealistisch hohen 
  5518.                 Wert angeben, verwendet deLite niemals Heap-Speicher zum 
  5519.                 Auslagern. 
  5520. EMSPagesMin     definiert, wie viele EMS-Seiten freigelassen werden sollen. 
  5521.                 Nachdem diese Grenze erreicht ist, versucht die 
  5522.                 Speicherverwaltung, Speicher auf die Festplatte auszulagern. 
  5523.                 Als Vorbelegung verwendet deLite den Wert 4. Wenn Sie hier 
  5524.                 einen unrealistisch hohen Wert angeben, verwendet deLite 
  5525.  
  5526.                                - 85 -
  5527.  
  5528.  
  5529.                 niemals EMS-Speicher zum Auslagern. Beachten Sie, daß deLite 
  5530.                 nur dann EMS verwenden kann, wenn ein 64kByte großer 
  5531.                 Page-Frame zur Verfügung steht. Der Page-Frame gibt die Größe 
  5532.                 des Fensters im Speicher an, das zur Einblendung von 
  5533.                 EMS-Seiten zur Verfügung steht. Auf älteren EMS-Karten, 
  5534.                 wie sie in XT-Rechnern eingesetzt wurden, steht unter 
  5535.                 Umständen nur ein 16KByte großer Page-Frame zur Verfügung.
  5536. DiskMin         definiert, wieviel Festplattenplatz von deLite freigelassen 
  5537.                 werden soll. Nachdem diese Grenze erreicht ist, bricht die 
  5538.                 Speicherverwaltung von deLite das Programm mit einem 
  5539.                 Laufzeitfehler ab. Als Vorbelegung verwendet deLite den Wert 
  5540.                 262144, das sind 256KByte. 
  5541.  
  5542. Der Abschnitt colors
  5543.  
  5544. Im   Abschnitt   colors   können   die   von   deLite   für   die 
  5545. Bildschirmdarstellung  verwendeten  Farben definiert werden.  Die 
  5546. Angabe muß in numerischer Form erfolgen und den Möglichkeiten der 
  5547. von Ihnen verwendeten  Grafikkarte  entsprechen.   Für VGA-Karten 
  5548. sind bei einem 16-Farben Treiber die Werte 0 bis 15 erlaubt. 
  5549.  
  5550. ScrnBkGnd       definiert die Farbe des Bildschirmhintergrundes. 
  5551.                 Die Vorbelegung ist 0 (schwarz)
  5552. MenueBkGnd      definiert die Hintergrundfarbe der Menüs
  5553. MenueText       definiert die Farbe der Menütexte
  5554. HighBkGnd       definiert die Hintergrundfarbe markierter Menüpunkte
  5555. HighText        definiert die Farbe markierter Menüpunkte
  5556. DisableText     definiert die Farbe inaktiver Menüpunkte
  5557. MenueFrame      definiert die Farbe der Umrahmung von Menüs
  5558. DlgBkGnd        definiert die Hintergrundfarbe von Dialogfeldern
  5559. DlgFrame        definiert die Farbe der Umrahmung von Dialogfeldern
  5560. DlgMsg          definiert die Farbe von Statusmeldungen in Dialogfeldern
  5561. DlgText         definiert die Farbe von Texten in Editierfeldern
  5562. DlgEditBkGnd    definiert die Hintergrundfarbe von Editierfeldern
  5563. DlgListText     definiert die Farbe von Texten in Listenauswahlfeldern
  5564. DlgListBkGnd    definiert die Hintergrundfarbe von Listenauswahlfeldern
  5565. DlgListHiText   definiert die Farbe markierter Einträge in Listenauswahlfeldern
  5566. DlgListHiBkGnd  definiert die Hintergrundfarbe markierer Einträge in 
  5567.                 Listenauswahlfeldern
  5568. Elevator        definiert die Farbe der Positionsmarkierung in Listendialogen
  5569. ErrorText       definiert die Farbe von Texten in Fehlerfenstern
  5570. ErrorBkGnd      definiert die Hintergrundfarbe von Fehlerfenstern
  5571. SystemText      definiert die Farbe von Texten in Meldungsfenstern
  5572. WinFrame        definiert die Rahmenfarbe von Subapplikationen
  5573.  
  5574. Die Tabelle enthält die Farbnummern einer EGA/VGA-Karte mit 16 Farben:
  5575.  
  5576.         0       schwarz         8       dunkelgrau
  5577.         1       blau            9       hellblau
  5578.         2       grün            10      hellgrün
  5579.         3       türkis          11      helles türkis
  5580.         4       rot             12      hellrot
  5581.         5       fuchsin         13      helles fuchsinrot
  5582.         6       braun           14      gelb
  5583.         7       hellgrau        15      weiss
  5584.  
  5585.  
  5586.  
  5587.  
  5588.  
  5589.  
  5590.  
  5591.                                - 86 -
  5592.  
  5593.  
  5594. Anhang B  Fehlermeldungen
  5595.  
  5596. Die nachfolgende  Tabelle beschreibt  die Ursachen  der möglichen 
  5597. von deLite gemeldeten  Fehler.  Die Fehlernummern  werden an drei 
  5598. verschiedenen Stellen verwendet: Die Prozedur OpenMainApplication 
  5599. liefert als unmittelbares  Ergebnis eine Fehlernummer ungleich 0, 
  5600. falls Ihre Applikation  nicht gestartet werden konnte.  Mit Hilfe 
  5601. der  Funktion   KernelError   kann   nach   der  Ausführung   von 
  5602. Kernel-Funktionen  der Fehlerstatus erfragt werden.  Die Prozedur 
  5603. OpenMainApplication  bedient sich dieser Möglichkeit.   Sollte es 
  5604. während der Ausführung Ihrer Applikation  zu einem fatalen Fehler 
  5605. kommen,  gibt  das  deLite-Laufzeitsystem  nach  dem Abbruch  des 
  5606. Programms   und  des  Zurückschaltens   in  den  Textmodus   eine 
  5607. Fehlernummer aus. Falls Sie in Ihrer Applikation das Ergebnis von 
  5608. OpenMainApplication im Klartext ausgeben möchten, können Sie sich 
  5609. des Units  ERRORS  bedienen,  das die im folgenden  beschriebenen 
  5610. Fehlertexte zusammen mit einer Ausgabeprozedur enthält. 
  5611.  
  5612. 1       Initialisierungsdatei nicht gefunden
  5613.         Die Initialisierungsdatei existiert nicht im aktuell 
  5614.         gesetzten Verzeichnis. Falls Sie versucht haben, die 
  5615.         Applikation aus der Entwicklungsumgebung von Turbo      
  5616.         Pascal heraus zu starten, stellen Sie sicher, daß eine 
  5617.         Kopie der Initialisierungsdatei im gleichen Verzeichnis 
  5618.         existiert, in dem sich auch die Quelltexte zu Ihrer 
  5619.         Applikation befinden.
  5620.         
  5621. 2       Hardware-Block nicht gefunden
  5622.         Die Initialisierungsdatei existiert, aber der Abschnitt 
  5623.         Hardware konnte nicht gefunden werden.
  5624.         
  5625. 3       Videotreiber nicht spezifiziert
  5626.         In der Initialisierungsdatei wurden der Abschnitt Hardware 
  5627.         und das Schlüsselwort Video gefunden, nach dem Schlüsselwort 
  5628.         allerdings kein Grafiktreiber spezifiziert.
  5629.         
  5630. 4       Zeichensatz nicht spezifiziert
  5631.         In der Initialisierungsdatei wurden der Abschnitt Hardware 
  5632.         und das Schlüsselwort Font gefunden, nach dem Schlüsselwort ist 
  5633.         allerdings kein Zeichensatz spezifiziert.
  5634.         
  5635. 5       Schlüsselwort nicht gefunden, oder Parameter leer
  5636.         Bei der Suche nach einem anwenderdefinierten Eintrag wurde das 
  5637.         angegebene Schlüsselwort nicht gefunden, oder es ist kein Parameter 
  5638.         hinter dem Schlüsselwort angegeben.
  5639.         
  5640. 6       Block nicht gefunden
  5641.         Bei der Suche nach einem anwenderdefinierten Eintrag konnte der 
  5642.         angegebene Abschnitt nicht gefunden werden.
  5643.         
  5644. 10      Videotreiber nicht gefunden
  5645.         Der in der Initialisierungsdatei angegebene Videotreiber konnte 
  5646.         nicht gefunden werden. Das kann drei Gründe haben. Erstens, 
  5647.         Sie haben im Abschnitt Paths hinter dem Schlüsselwort VDIDir 
  5648.         ein falsches Verzeichnis angegeben. Zweitens, Sie haben kein 
  5649.         Verzeichnis angegeben und der Videotreiber befindet sich nicht 
  5650.         im aktuellen Verzeichnis. Oder, Sie haben einen Videotreiber 
  5651.         angegeben, der nicht existiert.
  5652.         
  5653. 11      Kein gültiger Videotreiber
  5654.         Der angegebene Videotreiber ist funktionsunfähig. Wahrscheinlich 
  5655.  
  5656.                                - 87 -
  5657.  
  5658.  
  5659.         ist die Datei zerstört worden.
  5660.         
  5661. 12      Falsche Videotreiberversion
  5662.         Die Version des angegeben Videotreibers ist veraltet. Benutzen 
  5663.         Sie bitte eine neuere Version. Mit dem Hilfsprogramm WHATDRV 
  5664.         können Sie die Versionsnummer des Treibers ermitteln.
  5665.         
  5666. 13      Zeichensatz nicht gefunden
  5667.         Der in der Initialisierungsdatei angegebene skalierbare Zeichensatz 
  5668.         konnte nicht gefunden werden. Das kann drei Gründe haben. Erstens, 
  5669.         Sie haben im Abschnitt Paths hinter dem Schlüsselwort FontDir ein 
  5670.         falsches Verzeichnis angegeben. Zweitens, Sie haben kein Verzeichnis 
  5671.         angegeben und der skalierbare Zeichensatz befindet sich nicht im 
  5672.         aktuellen Verzeichnis. Oder, Sie haben einen skalierbaren Zeichensatz 
  5673.         angegeben, der nicht existiert.
  5674.         
  5675. 14      Kein gültiger Zeichensatz
  5676.         Der angegebene skalierbare Zeichensatz ist funktionsunfähig. 
  5677.         Wahrscheinlich ist die Datei zerstört worden.
  5678.         
  5679. 15      Falsche Zeichensatzversion
  5680.         Die Version des angegebenen Zeichensatzes ist veraltet. Bitte 
  5681.         benutzen Sie eine neuere Version.
  5682.         
  5683. 20      Menü-Ressourcedatei nicht gefunden
  5684.         Die Menüressource existiert nicht oder befindet sich nicht im 
  5685.         aktuellen Verzeichnis. Unter Umständen haben Sie vergessen, die 
  5686.         Menübeschreibung zu übersetzen.
  5687.         
  5688. 21      Menü-Ressourcedatei ist ungültig
  5689.         Die Menüressource hat nicht das richtige Format. Unter Umständen ist 
  5690.         die Datei zerstört worden, oder Sie haben der Menübeschreibung im 
  5691.         Textformat die Endung '.rsc' gegeben. 
  5692.         
  5693. 22      Fehler beim Laden der Menü-Ressourcedatei
  5694.         Während des Ladevorgangs der Menüressource ist ein Fehler aufgetreten. 
  5695.         Unter Umständen reichte der Arbeitsspeicher nicht, um den Menübaum im 
  5696.         Speicher aufzubauen, oder die Menüdatei ist nicht lesbar. 
  5697.         
  5698. 30      Hauptapplikation ist bereits gestartet
  5699.         Sie haben versucht, ein zweites Mal die Prozedur OpenMainApplication 
  5700.         aufzurufen. Dies stellt einen schwerwiegenden Programmierfehler dar 
  5701.         und führt zum sofortigen Abbruch des Programms.
  5702.         
  5703. 31      Keine Applikation gestartet
  5704.         Sie haben versucht, die Dienste des API in Anspruch zu nehmen, ohne 
  5705.         zuvor mit Hilfe der Prozedur OpenMainApplication die Empfangsprozedur 
  5706.         anzumelden. Dies stellt einen Programmierfehler dar.
  5707.         
  5708. 32      Dispatcher versagt: Event kann nicht zugeordnet werden
  5709.         Der Dispatcher konnte ein Event nicht weiterleiten. Sie haben einen 
  5710.         Fehler in deLite entdeckt; bitte informieren Sie uns.
  5711.         
  5712. 33      Dispatcher versagt: Ungültige Adresse
  5713.         Die beim Anmelden eines Klienten angegebene Adresse ist ungültig. 
  5714.         Dies kann nur durch einen internen Fehler geschehen, bitte informieren
  5715.         Sie uns.
  5716.         
  5717. 40      Zu wenig Heap-Speicher
  5718.         Die Speicherverwaltung benötigt bis zu 64K Heap-Speicher, um arbeiten 
  5719.         zu können. Sie haben weniger als 64K Heap-Speicher für deLite übrig 
  5720.  
  5721.                                - 88 -
  5722.  
  5723.  
  5724.         gelassen.
  5725.         
  5726. 41      Zu wenig Speicherplatz zum Auslagern auf Festplatte
  5727.         Ihre Festplatte hat zu wenig Speicherplatz, um die Auslagerungs-
  5728.         dateien aufnehmen zu können. Unter Umständen haben Sie in der 
  5729.         Initialisierungsdatei im Abschnitt memory den Parameter DiskMin auf 
  5730.         einen zu hohen Wert gesetzt.
  5731.         
  5732. 42      Auslagern auf Festplatte nicht möglich
  5733.         Der angegebene Pfad für die Auslagerungsdateien ist ungültig. Prüfen 
  5734.         Sie die Environmentvariable TEMP und den Eintrag SwapPath im 
  5735.         Abschnitt paths in der Initialisierungsdatei.
  5736.         
  5737. 43      Fensterstack ist übergelaufen
  5738.         Sie haben versucht, mehr Fenster zu öffnen, als auf dem Fensterstack
  5739.         Platz finden. In der Standardversion hat der Fensterstack Platz für 
  5740.         16 Fenstersegmente, allerdings kann ein Fenster je nach Größe mehrere 
  5741.         Segmente benötigen. Falls Sie im Besitz der Quelltexte sind, ändern 
  5742.         Sie die Konstante NWindows im API und übersetzen Sie deLite neu.
  5743.         
  5744. 44      Speicherblock nicht wiedergefunden
  5745.         Die Speicherverwaltung kann einen Speicherblock nicht wiederfinden. 
  5746.         Unter dem angegebenen Handle existiert kein Eintrag in der Seiten-
  5747.         tabelle der Speicherverwaltung. Sie haben einen internen Fehler von 
  5748.         deLite festgestellt, bitte informieren Sie uns.
  5749.         
  5750. 45      Auslagerungsdatei nicht wiedergefunden
  5751.         Die Speicherverwaltung kann eine Auslagerungsdatei nicht wiederfinden.
  5752.         Unter Umständen hat Ihr Programm eine der Auslagerungsdateien gelöscht.
  5753.         
  5754. 46      EMS-Seite nicht wiedergefunden
  5755.         Die Speicherverwaltung kann eine Speicherseite nicht im EMS finden. 
  5756.         Falls Sie selbst EMS verwenden, haben Sie unter Umständen eine Seite 
  5757.         freigegeben, die Ihnen nicht gehörte.
  5758.         
  5759. 47      Pageframe für EMS zu klein oder nicht vorhanden
  5760.         Die Speicherverwaltung von deLite kann EMS nur verwenden, wenn ein 
  5761.         zusammenhängender Pageframe von 64k zur Verfügung steht.
  5762.         
  5763. 48      Ungültiges Speicherhandle
  5764.         Die Speicherverwaltung hat eine Inkonsistenz in der Seitentabelle 
  5765.         festgestellt. Bitte informieren Sie uns.
  5766.         
  5767. 50      Grafiktreiber nicht geladen
  5768.         Sie haben versucht, den Grafiktreiber zu benutzen, ohne daß der 
  5769.         Grafiktreiber zuvor von der Funktion OpenMainApplication geladen 
  5770.         wurde. Dies stellt einen schwerwiegenden Programierfehler dar und 
  5771.         führt zum sofortigen Abbruch des Programms.
  5772.         
  5773. 51      Zeichensatz nicht geladen
  5774.         Sie haben versucht, den skalierbaren Zeichensatz zu benutzen, obwohl 
  5775.         der Prozedur OpenMainApplication durch Angabe des Modus APP_NOFONT 
  5776.         signalisiert wurde, daß kein Zeichensatz benötigt wird. Dies stellt 
  5777.         einen schwerwiegenden Programmierfehler dar und führt zum sofortigen 
  5778.         Abbruch des Programms.
  5779.         
  5780. 52      Kein Speicher mehr zum Laden des Grafiktreibers
  5781.         Ihr DOS Speicher reicht nicht aus, um den Graphictreiber einzuladen. 
  5782.         Dieser Fehler führt zum Abbruch des Programms. Versuchen Sie, einige 
  5783.         Programme aus der Datei CONFIG.SYS oder AUTOEXEC.BAT auszutragen und 
  5784.         starten Sie das Programm erneut.
  5785.  
  5786.                                - 89 -
  5787.  
  5788.  
  5789.         
  5790. 53      Kein Speicher mehr zum Laden des Zeichensatzes
  5791.         Ihr DOS Speicher reicht nicht aus, um den skalierbaren Zeichensatz 
  5792.         einzuladen. Dieser Fehler führt zum Abbruch des Programms. Versuchen 
  5793.         Sie, einige Programme aus der Datei CONFIG.SYS oder AUTOEXEC.BAT 
  5794.         auszutragen und starten Sie das Programm erneut.
  5795.         
  5796. 54      Zeichensatz nicht vorhanden
  5797.         Sie haben der Prozedur SetTextStyle als Zeichensatz einen Wert 
  5798.         ungleich 0 übergeben. DeLite unterstützt zur Zeit nur einen einzigen 
  5799.         skalierbaren Zeichensatz - nämlich den in der Initialisierungsdatei 
  5800.         spezifizierten.
  5801.  
  5802.  
  5803.  
  5804.  
  5805.  
  5806.  
  5807.  
  5808.  
  5809.  
  5810.  
  5811.  
  5812.  
  5813.  
  5814.  
  5815.  
  5816.  
  5817.  
  5818.  
  5819.  
  5820.  
  5821.  
  5822.  
  5823.  
  5824.  
  5825.  
  5826.  
  5827.  
  5828.  
  5829.  
  5830.  
  5831.  
  5832.  
  5833.  
  5834.  
  5835.  
  5836.  
  5837.  
  5838.  
  5839.  
  5840.  
  5841.  
  5842.  
  5843.  
  5844.  
  5845.  
  5846.  
  5847.  
  5848.  
  5849.  
  5850.  
  5851.                                - 90 -
  5852.  
  5853.  
  5854. Anhang C  Kompatibilität zu deLite1.X-Applikationen
  5855.  
  5856. Beim  Übergang   von  deLite  1.X  auf  deLite  2.0  sind  einige 
  5857. wesentliche Änderungen eingetreten.  Dieser Anhang beschreibt die 
  5858. Neuerungen, die zu Problemen führen können. 
  5859.  
  5860. Neue Dialoge
  5861.  
  5862. DeLite  1.X kannte nur einige  vorgefertigte  Dialoge,  mit denen 
  5863. durch  mehrfache  Anwendung  die  Kommunikation  mit dem Anwender 
  5864. durchgeführt wurde. An die Stelle dieser Dialoge tritt ab Version 
  5865. 2.0 ein Dialogmanager.   Damit Ihre alten Applikationen weiterhin 
  5866. übersetzt  werden  können,  müssen  Sie in die Uses-Anweisung  zu 
  5867. Beginn Ihres Programmes das Unit DELITE1X aufnehmen. Dadurch wird 
  5868. Ihr Programm zusätzlich um etwa 12K länger. 
  5869.  
  5870. Neue Events
  5871.  
  5872. An Stelle des einfachen  Event-Records  von deLite  1.X verwendet 
  5873. deLite   jetzt  einen  varianten   Record  mit  wesentlich   mehr 
  5874. Elementen.   Das kann zu Konflikten  führen,  wenn  Sie mit einer 
  5875. WITH-Anweisung   den  Gültigkeitsbereich   einer   Event-Variable 
  5876. erweitern  und  im  gleichen  Gültigkeitsbereich   Variablennamen 
  5877. verwenden, die jetzt im Event-Record definiert sind. Beachten Sie 
  5878. im Zweifelsfall die Deklaration des Typs Event im Kapitel 8.  Vor 
  5879. der Einführung  des varianten  Event-Records  wurde die ID-Nummer 
  5880. von Meldungen  der Klasse  Menu im Feld X übergeben.   DeLite 2.0 
  5881. verwendet hierfür jetzt das Feld MenuItemID. 
  5882.  
  5883. Keine Ausmaskierung von Move-Events
  5884.  
  5885. DeLite      1.X      verfügte       über      die      Prozeduren 
  5886. EnableMoveDetect/DisableMoveDetect,  mit  denen  die Übermittlung 
  5887. von Mausbewegungen  verboten  werden  konnte.   Diese Möglichkeit 
  5888. besteht  nicht mehr, stattdessen  müssen  Sie selbst das Move-Bit 
  5889. ausmaskieren, falls Sie es nicht benötigen. 
  5890.  
  5891. Timer-Events
  5892.  
  5893. DeLite  2.0 kennt zusätzlich  Timer-Events.   Das sind periodisch 
  5894. auftretende   Events   der  Klasse  TimerEvent,   mit  denen  das 
  5895. Cursorblinken innerhalb von Editierfeldern oder die Wiederholrate 
  5896. von Ereignissen  gesteuert  wird.  Ältere Applikationen,  die die 
  5897. Abfrage  der Eventklasse  in ihren  Botschaftenempfangsprozeduren 
  5898. nicht  vollständig  durchführen,  können  jetzt  mit  Ereignissen 
  5899. konfrontiert werden, mit denen sie nicht rechnen. 
  5900.  
  5901. Neuer BitBlit
  5902.  
  5903. Die    deLite-Versionen     1.X    stellten    eine    allgemeine 
  5904. BitBlit-Prozedur   zur  Verfügung.    Diese  Funktion  wurde  aus 
  5905. Geschwindigkeitsgründen modifiziert und beherrscht jetzt nur noch 
  5906. die von deLite benötigten Spezialfälle. Aus diesem Grund wird die 
  5907. BitBlit-Funktion  nur  noch  für  interne  Zwecke  zur  Verfügung 
  5908. gestellt und erscheint nicht mehr in der Dokumentation.
  5909.