home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / program / pascal / pdial / pdial.txt < prev   
Text File  |  1993-07-14  |  42KB  |  975 lines

  1.                   Das kleine Buch zu PDIAL
  2.  
  3.                   'Make my dial a P-dial!'
  4.  
  5.  
  6. A. Einleitung
  7. "Heute  pflastern  eine  Vielfalt  mehr  oder  weniger  gelungener
  8. Alternativdialoge   die   Landschaft.   Begonnen   beim  Klassiker
  9. 'Flydials'      über    'Keydials',  'X-GEM',  'My-Dials'  zu  den
  10. 'Spoil-Dials',  kein  Name  erscheint  zu  platt,  als daß man ihn
  11. nicht      seinen      Dialogroutinen       verleihen     könnte."
  12. (Laurenz Prüssner, "Verdeckte Ermittlungen", ST-Magazin
  13. 6/92, 90)
  14.  
  15. Schön   und   gut.  Ursprünglich  wollten  wir  ja  auch  nur  die
  16. FLYDeal-Lib  (aus  der  TOS  1/93)  in  Pure Pascal einbinden. Das
  17. Linken   von   C-Objektdateien  zu  PP-Programmen  ist  aber  eine
  18. Sache  für  sich,  wenn  die  in  C geschriebenen Routinen auf die
  19. C-Standardbibliotheken    zugreifen.    Also   sagten   wir   uns:
  20. "Schaun   mer   mal."   Daraus  ist  dann  schließlich  ein  Paket
  21. geworden,    das    fliegende    Dialoge   mit   Tastaturbedienung
  22. bereitstellt.    Leider   bietet   PP   nicht   die   Möglichkeit,
  23. Objektdateien  zu  Bibliotheken  zusammenzufassen,  so  daß  PDIAL
  24. aus mehreren Units besteht.
  25.  
  26. B. Features (oder watt et kann)
  27. - fliegende Dialoge (solide oder transparent)
  28. - springende Dialoge (Jumpin' Dials wie bei Let 'em fly)
  29. - tastaturbedienbare Buttons
  30. - erweiterte Alertboxfunktionen mit den genannten Features,
  31. längerem Text und der Möglichkeit, neue Icons einzubinden
  32. - erweiterte objc_edit-Funktion mit neuen Tastaturshortcuts,
  33. mauspositionierbarem Cursor, Sonderzeicheneingabe,
  34. Clipboard-Unterstützung, ...
  35. - erweiterte Objekttypen (MAC-Radiobuttons, ...), Codierung
  36. kompabeatel zu Flydials, Flydeals, My-Dials, Ruby,
  37. MagicDials und wie sie alle heißen.
  38. - Popupmenüs
  39. - verschachtelbare Dialogboxen ("Subdialoge")
  40. - optionale Benutzung von Let 'em Fly-Funktionen
  41. - putzt 10 Pfund junges Gemüse (ohne Vitaminverlust!) und
  42. archiviert Ihre Videokassetten automatisch.
  43.  
  44. C. Software-Voraussetzungen
  45. Zur   Verwendung  von  PDIAL  sind  Pure  Pascal  ab  Version  1.1
  46. sowie   ein    Resource-Editor,  mit  dem  erweiterte  Objekttypen
  47. eingegeben     werden     können     (z.B.    Interface,    ORCS),
  48. erforderlich.   Den   Benutzern   des  DR  RCS  2.0  wünschen  wir
  49. dabei viel Spaß.
  50.  
  51. D. Überblick über die Units von PDIAL
  52. Welche File dient nun wozu?
  53. - NEWOBS.PPU stellt die benutzerdefinierten Objekttypen
  54. (MAC-Radiobuttons, Checkboxen usf.) bereit und konvertiert
  55. dazu die Objektbäume.
  56. - PFORM.PPU enthält unsere Variante der AES-Form-Bibliothek.
  57. - ALERT.PPU  bietet die erweiterte Alarmbox-Funktion.
  58. - MEMORY.PPU beinhaltet die Speicherverwaltung von PDIAL.
  59. - TOOLS.PPU  enthält einige nützliche Funktiönchen.
  60.  
  61. Wir   empfehlen,   die   fünf   Dateien   in  den  UNIT-Ordner  zu
  62. kopieren.   Wer   mit   PDIAL   programmiert,   muß  aber  in  die
  63. USES-Anweisung   nur   NEWOBS,   PFORM  und  gegebenenfalls  ALERT
  64. aufnehmen,   nicht   notwendigerweise   aber   auch   MEMORY   und
  65. TOOLS.
  66.  
  67. E. Rechtliches
  68. Die schlechte Nachricht zuerst:
  69.  
  70. Wir  übernehmen  keinerlei  Haftung  für  direkte  oder  indirekte
  71. Schäden,   die   aus  dem  Gebrauch  unserer  Routinen  entstehen.
  72. Die   Verwendung   von   PDIAL   geschieht   auf   eigene  Gefahr.
  73. In   dieser   Anleitung  wird  auf  Warenzeichen  Bezug  genommen,
  74. die     nicht    explizit    als    solche    ausgewiesen    sind.
  75.  
  76. Und nun die gute Nachricht:
  77.  
  78. PDIAL  ist  Freeware.  Das  Paket  darf  frei  kopiert und benutzt
  79. werden.   Bei  Verwendung  von  PDIAL  im  Programm  oder  in  der
  80. Dokumentation   muß   allerdings  auf  PDIAL  hingewiesen  werden.
  81. Auch  dürfen  die  in  der  Datei  FILES.LST  aufgezählten Dateien
  82. nur zusammen weitergegeben werden.
  83.  
  84. So, das mußte einfach mal gesagt werden
  85.  
  86. F. Apell
  87. PDIAL   wurde   zwar  sorgfältig  getestet,  dürfte  aber  dennoch
  88. Bugs  enthalten.  Deshalb  folgender  Apell:  Wenn  PDIAL  etwa im
  89. Flimmermodus    der    neuen   Graphikkarte   den   Bildschirm-GAU
  90. verursacht,  dann  schiebt  es  nicht  gleich  in  den Papierkorb,
  91. sondern   schickt   uns   eine   Beschreibung  des  Fehlers  (dazu
  92. später   mehr).  Darin  sehen  wir,  da  PDIAL  ja  Freeware  ist,
  93. gewissermaßen   moralisch  die  Gegenleistung  für  die  Benutzung
  94. von PDIAL.
  95.  
  96. G. Benutzung von PDIAL im Überblick
  97. I.  Das  RSC-File  muß  für  den  Einsatz  von  PDIAL  vorbereitet
  98. werden.   PDIAL   wertet   nämlich  die  sogenannten  "erweiterten
  99. Objekttypen"   aus.  Dabei  werden  die  üblichen  Codes  benutzt.
  100. Diese   kann   man   in   neueren  RCS-Editoren  direkt  eingeben.
  101.  
  102. II.   Dann   müssen  die  Units  (ALERT,)  PFORM  und  NEWOBS  per
  103. USES-Anweisung eingebunden werden.
  104.  
  105. III.  Im  Hauptprogramm  müssen  die  Units  PFORM und NEWOBS nach
  106. Aufruf    von    appl_init    und   erfolgreichem   Öffnen   einer
  107. VDI_Workstation     mit     den    Funktionen    init_pform    und
  108. init_newobs      initialisiert     werden.     Init_pform     legt
  109. gegebenfalls  (d.  h.  sofern  nicht  die  Routinen  des  Utilitys
  110. Let  'em  fly  benutzt  werden)  einen  internen  Puffer  für  die
  111. Bildschirmrestaurierung an.
  112.  
  113. IV.  Nach  rsrc_load  können  alle  Objektbäume  der Resourcedatei
  114. mit  der  Funktion  fix_all  angepaßt  werden.  Dabei  wird intern
  115. Speicher   für   die   erweiterten   Objekttypen  alloziert.  Dies
  116. kann   auch   für   jeden   Baum  einzeln  mit  fix_tree  erledigt
  117. werden.
  118.  
  119. V. Programmierung mit den PDIAL-Funktionen.
  120.  
  121. VI.   Am   Programmende   nicht  den  Aufruf  von  exit_pform  und
  122. fix_all    bzw.   fix_tree   vergessen,   damit   der   allozierte
  123. Speicher wieder freigegeben wird.
  124.  
  125. H. Die Anpassung der Objektbäume
  126. Damit   die  von  der  Unit  NEWOBS  bereitgestellten  erweiterten
  127. Objettypen   benutzt   werden   können,  muß  der  Objektbaum  per
  128. fix_all   oder   per  fix_tree  angepaßt  werden.  Diese  Routinen
  129. reagieren   auf   Objekte,   die   gemäß  der  sogleich  folgenden
  130. Liste markiert worden sind.
  131.  
  132. I. Verschiebeobjekt (Flugobjekt)
  133. 1. erweiterter Typ: 17
  134. 2. gesetzte Flags: TOUCHEXIT
  135. 3.  Anmerkung:  Wird  mit  gedrückter  linker  Maustaste in dieses
  136. Objekt   hineingefahren,   so  wird  der  Dialog  verschoben.  Ist
  137. zusätzlich   die  rechte  Maustaste,  eine  Shifttaste,  Alternate
  138. oder    Control    gedrückt,    so    wird    der   Dialog   dabei
  139. durchgeblendet.
  140.  
  141. II. Flugecke (Eselsohr)
  142. 1. normaler Typ: IBOX
  143. 2. erweiterter Typ: 17
  144. 3. gesetzte Flags: TOUCHEXIT, OUTLINED, CROSSED
  145. 4. Anmerkung: Es handelt sich hier bloß um einen Spezialfall
  146.  eines Verschiebeobjektes.
  147.  
  148. III. Radiobutton
  149. 1. normaler Typ: BUTTON, STRING
  150. 2. erweiterter Typ: 18
  151. 3. gesetzte Flags: RBUTTON
  152.  
  153. IV. Checkbox
  154. 1. normaler Typ: BUTTON
  155. 2. erweiterter Typ: 18
  156. 3. ungesetzte Flags: RBUTTON, EXIT
  157.  
  158. V. Exitbutton
  159. 1. normaler Typ: BUTTON
  160. 2. erweiterter Typ: 18
  161. 3. gesetzte Flags: EXIT
  162. 4. ungesetzte Flags: RBUTTON
  163. 5.  Anmerkung:  Wenn  zusätzlich  noch  Bit  11  in  ob_flags oder
  164. ob_state  gesetzt  ist,  ist  der  Button  auch mit der Taste UNDO
  165. selektierbar.  Von  der  Verwendung  von  ob_flags  Bit  11  raten
  166. wir   allerdings  ab,  da  dieses  Bit  von  den  FALCON-AES  wohl
  167. anderweitig verwendet wird.
  168.  
  169. VI. Per Tastatur selektierbarer String ("tastaturbedienbarer
  170. String")
  171. 1. normaler Typ: STRING
  172. 2. erweiterter Typ: 18
  173. 3. ungesetzte Flags: RBUTTON
  174. 4. Anmerkung: Solche Strings können links neben
  175. Popup-Buttons stehen; durch ihre Selektion klappt das
  176. Popupmenü dann auf.
  177.  
  178. VII. Dialogboxüberschrift
  179. 1. normaler Typ: STRING, BUTTON
  180. 2. erweiterter Typ: 19
  181. 3. ungesetztes Flag: SELECTABLE
  182. 4. Anmerkung: Der Unterstrich kann die Länge der
  183. Objektbreite (Voreinstellung) oder die Länge der
  184. Objektzeichenkette haben. Dies kann mit der Prozedur
  185. set_shorttitle eingestellt werden.
  186.  
  187. VIII. Groupbox (Boxtitel)
  188. 1. normaler Typ: BUTTON
  189. 2. erweiterter Typ: 20
  190. 3. gesetzte States: Ist der Status CHECKED gesetzt, so wird
  191. der Boxtitel  mit dem kleinen Systemzeichensatz geschrieben.
  192. 4. Anmerkung: Die Groupbox wird zum Beispiel als Rahmen um
  193. eine Gruppe von Radiobuttons benutzt.
  194.  
  195. IX. Helpbutton
  196. 1. erweiterter Typ: 21
  197. 2. Anmerkung: Ein derart markiertes Objekt kann durch
  198. Drücken der Taste HELP selektiert werden.
  199.  
  200. X. Undobutton
  201. 1. erweiterter Typ: 31
  202. 2. Anmerkung: Ein derart markiertes Objekt kann durch
  203. Drücken der Taste UNDO selektiert werden.
  204.  
  205. XI. Circlebutton
  206. 1. normaler Typ: BOXCHAR
  207. 2. erweiterter Typ: 22
  208. 3. gesetzte Flags: TOUCHEXIT, EXIT
  209.  
  210. XII. Images und Icons
  211. Anmerkung:   Da   ohnehin   der   gesamte   Objektbaum  durchsucht
  212. wird,  werden  bei  dieser  Gelegenheit  Images  und  Icons gleich
  213. vom   Standardformat  ins  gerätespezifische  Format  konvertiert.
  214. Wer  dieses  Feature  nicht  nutzen  will,  sollte  vor  dem Fixen
  215. des   Baumes   ob_type   des   Images   oder   Icons   auf   einen
  216. Phantasiewert      setzen      und      nachher      restaurieren.
  217.  
  218. XIII. FText, FBoxtext
  219. Anmerkungen:
  220. 1.  Bekanntlich  muß  bei  F(BOX)TEXT-Objekten  im  RCS  ein  Text
  221. eingegeben   werden,   der   mindestens   so   lang  ist,  wie  in
  222. 'te_tmplt'   gültige   Stellen  vorhanden  sind.  Die  AES  werten
  223. die   Länge  dieses  Textes  zur  Reservierung  von  Speicherplatz
  224. für   die   Eingaben   aus.  Gibt  man  einen  kürzeren  Text  als
  225. Voreinstellung  ein,  so  wird  nur  für  eine Zeichenkette dieser
  226. Länge    Speicherplatz   reserviert.   Üblicherweise   setzt   man
  227. daher  im   RCS  eine  beliebige  Zeichenkette   von der Länge der
  228. Maske,   etwa   '@12345'   oder   '123456',   ein,  um  danach  im
  229. Programm   den   Inhalt  von  'te_ptext'  mit  einer  vernünftigen
  230. Voreinstellung   zu   überschreiben.  Mit  PDIAL  läßt  sich  auch
  231. ein  kürzerer  Text  bereits  im  RCS  voreinstellen. Dazu muß der
  232. Text   nur   bis   zum  Ende  mit  Klammeraffen  ('@')  aufgefüllt
  233. werden.   Diese   werden   von   den  Fixing-Routinen  aus  NEWOBS
  234. automatisch entfernt.
  235.  
  236.  
  237. 2. Die Bedeutung des te_pvalid-Feldes wurde teilweise
  238. modifiziert. Deshalb hier eine Liste der zulässigen
  239. Platzhalter.
  240.  
  241. Platzhalter      erlaubte Zeichen
  242. -----------      ----------------
  243.  
  244. 'X'              alle Zeichen
  245.  
  246. 'x'              wie 'X',  aber gegebenenfalls in
  247.                  Großbuchstaben  konvertiert
  248.                  (Anmerkung: Diese Variante ist im
  249.                  Profibuch   nicht dokumentiert, funktioniert
  250.                  aber in   allen uns bekannten
  251.                  AES-Versionen.)
  252.  
  253. '9'              nur Ziffern
  254.  
  255. 'A'              Großbuchstaben und Leerzeichen
  256.  
  257. 'a'              Buchstaben und Leerzeichen
  258.  
  259. 'N'              Großbuchstaben, Ziffern, Leerzeichen
  260.  
  261. 'n'              Buchstaben, Ziffern, Leerzeichen
  262.  
  263. 'F'              alle Zeichen, die zu einem Filenamen
  264.                  gehören dürfen sowie '|', '*', '?'
  265.  
  266. 'f'              alle Zeichen, die zu einem Filenamen
  267.                  gehören dürfen
  268.  
  269. 'P'              alle Zeichen, die zu einem Pfadnamen
  270.                  gehören dürfen
  271.  
  272. 'p'              wie 'P', aber ohne '?' und '*'
  273.  
  274. Die  Varianten  'F',  'f',  'P',  'p'  sind  etwas  problematisch,
  275. da   sich  die  von  ihnen  zugelassenen  Zeichen  nicht  mit  der
  276. GEMDOS-Definition     eines    legalen    Datei-bzw.    Pfadnamens
  277. decken.   Nach   letzter   sind  (laut  Profibuch)  in  Dateinamen
  278. erlaubte Zeichen:
  279.  A..Z, a..z, 0..9, _!@#$%^()+-=~`;"',<>|[]{}
  280. Wer  das  Utility  Let  'em  Fly  von  Oliver  Scheel  installiert
  281. hat,   das   die  objc_edit-Routine  der  AES  durch  eine  eigene
  282. ersetzt,   kann   in   die  genannten  Felder  nur  diese  Zeichen
  283. eingeben.  Sofern  PDIAL  verwendet  wird  und  Let  'em Fly nicht
  284. installiert   ist,  kann  in  die  betreffenden  Felder  aber  die
  285. Vereinigungsmenge   des   AES-   und   des   GEMDOS-Verständnisses
  286. eines   legalen   Pfad-   und   Dateinamens   eingetragen  werden.
  287. Wer   nur   die   vom  GEMDOS  erlaubten  Zeichen  zulassen  will,
  288. verwende   die   folgenden,  von  PFORM  definierten  Platzhalter:
  289.  
  290. 'Y'           statt 'F'
  291. 'y'           statt 'f'
  292. 'Z'           statt 'P'
  293. 'z'           statt 'p'.
  294.  
  295.  
  296. XIV. Menütrennstriche
  297. 1. normaler Typ: STRING
  298. 2. erweiterter Typ: keiner
  299. 3. gesetzte Flags: DISABLED
  300. 4. ungesetzte States: SELECTABLE
  301. 5.  Anmerkung:  Strings,  die  nur  aus  '-'-Zeichen  bestehen und
  302. bei  denen  das   Flag  DISABLED  gesetzt,  der  State  SELECTABLE
  303. dagegen   nicht  gesetzt  ist,  werden  in  Menütrennlinien  (auch
  304. bekannt   als   'Nicelines')   umgewandelt.  Dieses  Feature  kann
  305. mit     set_dashmode     ein-     und     ausgeschaltet    werden.
  306.  
  307. J. Die einzelnen Routinen
  308. I. Routinen aus NEWOBS
  309. 1. init_newobs
  310. procedure init_newobs(vdihandle: integer);
  311. Diese  Prozedur  initialisiert  das  Modul  NEWOBS.  Als Parameter
  312. wird   das   Handle   einer  virtuellen  VDI-Bildschirmworkstation
  313. übergeben.
  314.  
  315. 2. fix_tree
  316. procedure fix_tree(tree: AESTreePtr; initflag: boolean);
  317. Mit dieser Prozedur werden die erweiterten Objekttypen, die
  318. Textfelder,  die  Menütrennstriche  und  die  Images  und Icons in
  319. einem  Objektbaum  angepaßt,  oder  es  wird  der  dazu allozierte
  320. Speicher wieder freigegeben.
  321. 'tree'      ist      der      zu      bearbeitende     Objektbaum.
  322. 'initmode'   ist  TRUE,  wenn  die  Anpassung  vorgenommen  werden
  323. soll.    Da     die    erweiterten    Objekttypen    intern   über
  324. G_USERDEF-Objekte  realisiert  werden,  muß  NEWOBS  Speicher  für
  325. USERBLK-Strukturen  anfordern.  Dieser  muß  nach  Abarbeiten  des
  326. Dialoges   (spätestens   am   Programmende)   wieder   freigegeben
  327. werden.    Dazu    wird    fix_tree   mit   'initmode'   =   FALSE
  328. aufgerufen.
  329.  
  330. 3. fix_all
  331. procedure fix_all(initmode: boolean);
  332. fix_all  ruft  fix_tree  für  alle  Bäume  der  geladenen Resource
  333. auf.    Dazu   wird   die   Anzahl   der   Objektbäume   aus   dem
  334. Resourceheader   ausgelesen,   dessen  Adresse  von  rsrc_load  in
  335. global[7,   8]   abgelegt  wird.  Wer  Resourcen  per  BINOBJ  zum
  336. Programm  dazulinken  möchte,  muß   also  diese  Adresse  setzen,
  337. sofern   er  fix_all  verwenden  will.  Zu  'initmode'  vergleiche
  338. die Ausführungen zu 2.
  339.  
  340. 4. set_dashmode
  341. procedure set_dashmode(change2ln: boolean);
  342. Mit   set_dashmode   kann  bestimmt  werden,  ob  Menütrennstriche
  343. in  Menütrennlinien  umgewandelt  werden  sollen.  Die  Umwandlung
  344. ist voreingestellt.
  345. 'change2ln': TRUE: umwandeln; FALSE: nicht umwandeln.
  346.  
  347. 5. set_shorttitle
  348. procedure set_shorttitle(short: boolean);
  349. Hiermit  kann  eingestellt  werden,  ob  bei  Dialogboxtiteln  für
  350. die   Länge   des   Unterstrichs   die  Länge  des  Textes  (kurze
  351. Überschrift)   oder   aber   die   Breite   des   Objektes  (lange
  352. Überschrift)    maßgebend    ist.    Voreingestellt   sind   lange
  353. Überschriften.
  354.  
  355. II. Routinen aus PFORM
  356. 1. init_pform
  357. procedure init_pform(vdihandle: integer; use_ltmf: boolean);
  358. Diese  Prozedur  initialisiert  die  Unit  PFORM.  'vdihandle' ist
  359. das    Handle    einer    virtuellen    VDI-Bildschirmworkstation.
  360. 'use_ltmf'   ist   TRUE,  wenn  zum  Verschieben  der  Dialogboxen
  361. die   Flugroutinen   eines   eventuell   geladenen   Let  'em  Fly
  362. genutzt   werden   sollen.   Let   'em   Fly  ist  ein  (geniales)
  363. Freeware-Utility  von  Oliver  Scheel,  das  diverse  Routinen der
  364. AES   durch   eigene   ersetzt   und   so   u.   a.  verschiebbare
  365. Dialogboxen  in  jedem  Programm  ermöglicht.  Wenn  Let  'em  Fly
  366. nicht  geladen  oder  use_ltmf  FALSE  ist,  wird an dieser Stelle
  367. Speicherplatz   für   die  Pufferung  des  Bildschirms  alloziert.
  368. Ist   dafür   nicht  genügend  Speicherplatz  vorhanden,  ist  das
  369. auch  nicht  weiter  schlimm;  es  kann  dann  nur  eben nicht mit
  370. den Dialogen 'geflogen' werden.
  371.  
  372. 2. exit_pform
  373. procedure exit_pform;
  374. exit_pform   muß   am   Programmende  aufgerufen  werden,  um  von
  375. init_pform  allozierten  Speicher freizugeben.
  376.  
  377. 3. pform_size
  378. procedure pform_size(tree: AESTreePtr; var x, y, w, h:
  379.                      integer);
  380. pform_size   gibt   in   'x','y', 'w', 'h'  die  Außenmaße  des
  381. Dialoges 'tree' zurück.
  382.  
  383. 4. pform_dial
  384. function  pform_dial(flag, lx, ly, lw, lh, bx, by, bw, bh:
  385.                      integer): integer;
  386. pform_dial tritt an die Stelle der AES-Funktion form_dial.
  387.  
  388. 5. init_subdial
  389. procedure init_subdial(father: AESTreePtr; var sd:
  390.                        SUBPFORM);
  391. init_subdial  braucht  man,  wenn  er  verschachtelte  Dialogboxen
  392. programmieren    will.    Eine    Anwendung   für   verschachtelte
  393. Dialogboxen  sind  z.  B.  Hilfeknöpfe,  bei  deren Selektion eine
  394. Dialogbox  mit  Hilfestellungen  geöffnet  wird.  Mit  PDIAL  kann
  395. man    Dialoge    im   Prinzip    beliebig   tief   verschachteln;
  396. Verschachtelungstiefen   größer  2  sind  aber  unseres  Erachtens
  397. ein   echter   Mißbrauch.   father   ist   der   Zeiger   auf  die
  398. darunterliegende    Dialogbox.    sd   braucht   hier   nicht   zu
  399. interessieren;   darin   werden  nur  interne   Informationen  bis
  400. zum   korrespondierenden   Aufruf  von  exit_subdial  gespeichert.
  401. Die   Prozedur   muß  vor  pform_dial(FMD_START,  ...)  aufgerufen
  402. werden.
  403.  
  404. 6. exit_subdial
  405. procedure exit_subdial(var sd: SUBPFORM);
  406. Auf   jedes   init_subdial  muß  nach  Abarbeitung  des  Unterdia-
  407. loges    (und    seiner   Unterdialoge)   ein   korrespondierendes
  408. exit_subdial    folgen.    Die    Routine    muß    nach   pform_-
  409. dial(FMD_FINISH, ...) aufgerufen werden.
  410.  
  411. 7. pform_do
  412. function pform_do(tree: AESTreePtr; start_field: integer):
  413.                   integer;
  414. pform_do muß statt der AES-Funktion form_do verwandt werden.
  415.  
  416. 8. pform_thru
  417. function  pform_thru(tree: AESTreePtr; which: integer; var
  418.                      events: EVENT; var edit_object, idx:
  419.                      integer): integer;
  420. pform_thru   ist   eine   spezielle   Version   von  pform_do  zur
  421. Implementierung   nichtmodaler   Fensterdialoge.   pform_thru  muß
  422. in    die    EVENT-Schleife    des   Hauptprogrammes   eingebunden
  423. werden.
  424. 'tree'      ist      der     Zeiger     auf     die     Dialogbox.
  425. 'which'  ist  das  aufgetretene  Ereignis,  also  der Rückgabewert
  426. von EvntMulti.
  427. 'events'     ist     die     EVENT-Struktur     von     EvntMulti;
  428. 'edit_object'  ist  das  aktuelle  Editobjekt,  oder  0,  wenn ein
  429. solches  nicht  vorhanden  ist.  Wenn  der  Dialog  zum ersten Mal
  430. dargestellt   wird,  kann  man  also  nicht  wie  bei  pform_do  0
  431. übergeben,  um  den  Cursor  auf  dem  ersten  Feld einzuschalten!
  432. Dazu       muß       man      selbst      ini_field      aufrufen.
  433. 'idx'   ist   die   Position   des   Cursors   auf  dem  Editfeld.
  434. Rückgabewert:    Index   des   angewählten   Objektes   oder   -1.
  435.  
  436.  
  437. 9. pform_center
  438. function  pform_center(tree : AESTreePtr; var cx, cy, cw,
  439.                        ch: integer):   integer;
  440. pform_center     entspricht    der    AES-Funktion    form_center.
  441. pform_center    beachtet   den   VSCR-Cookie   und   positioniert,
  442. sofern    dieses    Feature    nicht    mit    set_fastmode(FALSE)
  443. ausgeschaltet   worden   ist,   den  Dialog  beim  Zentrieren  auf
  444. Bytegrenzen,  um  die  Ausgabe  der  Dialogbox  zu  beschleunigen.
  445.  
  446. 10. pop_up
  447. function  pop_up(pmenue: AESTreePtr): integer;
  448. pop_up    stellt    das    Popupmenü    'pmenue'    an    der   in
  449. pmenue^[ROOT].ob_x/ob_y      eingetragenen    Stelle    dar    und
  450. verarbeitet  die  Eingaben.  Bei  dem  Popup-Menü  muß  es sich um
  451. einen    Objektbaum    handeln.    Dieser   darf   nur   aus   dem
  452. Wurzelobjekt     und     den     Einträgen    bestehen;    weitere
  453. Verschachtelungen   werden   nicht   unterstützt.   Der  Baum  muß
  454. sortiert    sein.    Die    einzelnen    Einträge   können   jeden
  455. beliebigen   Objekttyp   haben.   Die   Popupmenüs   lassen   sich
  456. sowohl   mit   der  Maus  als  auch  mit  der  Tastatur  bedienen.
  457. Folgende Tasten werden unterstützt:
  458. Pfeil hoch/links    : vorhergehender Eintrag
  459. Pfeil runter, rechts: nächster Eintrag
  460. Home                : erster Eintrag
  461. Clr                 : letzter Eintrag
  462. Return, Enter, Space: Eintrag auswählen
  463. Undo, Esc           : Abbruch
  464.  
  465. 11. attach_popup
  466. procedure attach_popup(dial: AESTreePtr;popind, strind,
  467.                        btnind, crclind, slct: integer;
  468.                        check: boolean; var dest: POP;
  469.                        nextpop: POPPtr);
  470. attach-popup    dient    der    Verwaltung   von   Popupmenüs   in
  471. Dialogboxen.    'dial'    ist   der   Zeiger   auf   den   Dialog.
  472. 'popind'    ist    der    Index    des    Popup-Baumes   im   RCS.
  473. Zu   'stringind',   'btnind'   und   'circlind'  folgende  Skizze:
  474.  
  475.                                -------------
  476.                Popupstring:   |Popupbutton|c|
  477.                                -------------
  478.  
  479. 'stringind'   ist  der  Index  eines  tastaturbedienbaren  Strings
  480. (erw.  Typ  18,  TOUCHEXIT),  bei  dessen  Selektion das Popupmenü
  481. ausklappen  soll.  Gibt  es  einen  solchen  String  nicht, so ist
  482. -1 zu übergeben.
  483. 'btnind'   ist  der  Index  eines  Buttons  oder  eines  sonstigen
  484. Objektes,   das  den  im  Popupmenü  ausgewählten  Eintrag  zeigt.
  485. 'circlind'   ist   der   Index   des  Popupcircles,  mit  dem  die
  486. einzelnen  Einträge  des  Popups  ausgewählt  werden  können, ohne
  487. daß   es   aufklappt.   Gibt   es   keinen   Circle,   ist  -1  zu
  488. übergeben.
  489. Zum   Aufbau   eines   solchen   Gebildes   im  RCS  später  mehr.
  490. 'slct'  ist  der  Index  des  eingangs  selektierten  Objektes  im
  491. Popupmenü oder 0.
  492. 'check'   ist   TRUE,   wenn  selektierte  Einträge  im  Popupmenü
  493. abgehakt werden sollen.
  494. 'dest'  ist  ein  record  vom  Typ  POP,  der von der Funktion mit
  495. den   übergebenen  Werten  gefüllt  wird  und  an  die  Funktionen
  496. popup_dialog    und    do_popdialog    übergeben    werden    muß.
  497. 'nextpop'   ist   die   Adresse   der  POP-Struktur  der  nächsten
  498. Popup-   Konstruktion   im  Dialog  'dial',  oder  aber,  wenn  es
  499. eine solche nicht gibt, NIL;
  500. Die  Prozedur  füllt  intern  'dest'  und  setzt  den  ob_spec des
  501. Popupbuttons   auf  den  ob_spec  des  Popupmenüeintrages  'slct'.
  502. Daraus  ergibt  sich,  daßdie  ob_spec's  des  'Popupbuttons'  und
  503. der     Einträge     im     Popumenükompatibel     sein    müssen!
  504.  
  505. 12. popup_dialog
  506. function  popup_dialog(dial: AESTreePtr; startob: integer;
  507.                        firstpop: POPPtr): integer;
  508. popup_dialog   entspricht   im   Grunde   pform_do.  Es  verwaltet
  509. aber    außerdem    etwaige    Popup-Konstruktionen   im   Dialog.
  510. 'firstpop'   ist   die  Adresse  der  ersten  POP-  Struktur  oder
  511. aber,   wenn  keine  Popup-Konstuktion  vorhanden  ist,  NIL;  Der
  512. angewählte  Eintrag  in  Popumenü  steht  nach  der  Ausführung in
  513. firstpop^.select.
  514.  
  515. POPPtr   =  ^POP;
  516. POP   =  record
  517.            treeptr     :  AESTreePtr;
  518.            stringind   :  integer;     (* oder -1 *)
  519.            buttonind   :  integer;
  520.            circleind   :  integer;     (* oder -1 *)
  521.            select   :  integer;
  522.            check_it    :  boolean;
  523.            next     :  POPPtr;
  524.          end;
  525.  
  526. 13. do_dialog
  527. function  do_dialog(dial: AESTreePtr; startob:
  528.                    integer): integer;
  529. do_dialog    ist   eine   komfortable   Routine,   die   für   die
  530. Verwaltung   der  allermeisten  Dialoge  völlig  ausreicht.  Statt
  531. vieler Worte hier der Sourcecode:
  532.  
  533. function do_dialog(dial: AESTreePtr; startob: integer):
  534. integer;
  535. var
  536.    size  :  GRECT;
  537.    rc  :  integer;
  538. begin
  539.    wind_update(BEG_UPDATE);
  540.    wind_update(BEG_MCTRL);
  541.    with size do
  542.    begin
  543.       pform_center(dial, g_x, g_y, g_w, g_h);
  544.       pform_dial(FMD_START, g_x, g_y, g_w, g_h, g_x, g_y,
  545.                  g_w, g_h);
  546.       objc_draw(dial, ROOT, MAX_DEPTH, g_x, g_y, g_w, g_h);
  547.       rc := pform_do(dial, startob) and $7fff;
  548.       pform_size(dial, g_x, g_y, g_w, g_h);
  549.       pform_dial(FMD_FINISH, g_x, g_y, g_w, g_h, g_x, g_y,
  550.                 g_w, g_h);
  551.    end;
  552.    wind_update(END_MCTRL);
  553.    wind_update(END_UPDATE);
  554.    deselect(dial^[rc]);
  555.    do_dialog := rc;
  556. end (* do_dialog *);
  557.  
  558. 14. do_popdialog
  559. function  do_popdialog(dial: AESTreePtr; startob: integer;
  560.              firstpop: POPPtr): integer;
  561. do_popdialog   ist  eine  spezielle  Variante  von  do_dialog  für
  562. die      Verwaltung      von      Dialogen     mit     Popupmenüs.
  563.  
  564. 15. circle_delay
  565. procedure circle_delay(val: longint);
  566. Mit   circle_delay   kann   die   Zeitspanne   in  ms  eingestellt
  567. werden,  nach  der  in  einem  Dialog  mit  einem  Popup-Konstrukt
  568. nach   Selektierung  des  Popupcircles  der  nächste  Eintrag  des
  569. Popupmenüs dargestellt wird.
  570.  
  571. 16. set_insert
  572. procedure set_insert(ins: INSERTFunc);
  573. type
  574.   INSERTFunc  =  function: integer;
  575.  
  576. Mit   set_insert   kann  man  eine  Funktion  übergeben,  die  von
  577. PFORM   beim  Druck  der  Taste  INSERT  während  der  Bearbeitung
  578. einer   Dialogbox   aufgerufen  wird,  sofern  die  Dialogbox  ein
  579. Eingabefeld  enthält.  Diese  Funktion  sollte  einen  Dialog oder
  580. ein  Popup-Menü  darstellen  und  verarbeiten,  das  dem  Benutzer
  581. die   Auswahl   der   über   die   Tastatur   nicht   erreichbaren
  582. ASCII-Zeichen   ermöglicht.   Der   ASCII-Code   des  ausgewählten
  583. Zeichens   sollte   zurückgegeben   werden.   Wurde  kein  Zeichen
  584. ausgewählt, muß im oberen Wort des Rückgabewertes der Scancode der
  585. Taste        INSERT,        im       unteren       0       stehen.
  586.  
  587. 17. set_jumpmode
  588. procedure set_jumpmode(use_jump: boolean);
  589. Klickt  man  mit der Maus neben einen Dialog, ertönt normalerweise
  590. eine  Klingel.  Mit  PDIAL  dargestellte  Dialoge  können optional
  591. stattdessen    um   die   Maus   herum   zentriert   werden;   sie
  592. "springen"   zur   Maus.  Dieses  Feature  kann  mit  set_jumpmode
  593. ein-   ('use_jump'   =  TRUE;  Voreinstellung)  und  ausgeschaltet
  594. ('use_jump' = FALSE) werden.
  595.  
  596. 18. set_feedback
  597. procedure set_feedback(feedback: boolean);
  598. Hiermit  kann  die  Selektion von Popupcircle und Popupstring ein-
  599. (feedback  =   TRUE;  Voreinstellung)  oder  ausgeschaltet werden.
  600.  
  601. 19. set_fastcenter
  602. procedure set_fastcenter(fast: boolean);
  603. Ist   'fast'  TRUE,  so  wird  der  Dialog  bei  pform_center  und
  604. beim   Springen   in   horizontaler   Richtung   auf   Bytegrenzen
  605. positioniert,  um  die  Ausgabe  zu  beschleunigen.  Dies ist auch
  606. die  Voreinstellung.  Mit  'fast'  =  FALSE  kann  dieses  Feature
  607. mithin abgestellt werden.
  608.  
  609. 20. handle_button, handle_circle, handle_string
  610. procedure handle_button(dial: AESTreePtr; currpop: POPPtr);
  611. procedure handle_circle(dial: AESTreePtr; currpop: POPPtr);
  612. procedure handle_string(dial: AESTreePtr; currpop: POPPtr);
  613. Mit   diesen   drei   Funktionen   kann  man  sich  einen  eigenen
  614. Handler    für    Popupmenüs    in   Dialogboxen   basteln.   Eine
  615. sinnvolle  Anwendung  ergäbe  sich  etwa  bei  der Implementierung
  616. von unmodalen Fensterdialogen.
  617.  
  618. 21. objc_ed
  619. function  objc_ed(tree: AESTreePtr; obj, inchar:
  620.       integer;  var idx: integer; kind: integer): integer;
  621. Diese    Funktion   tritt   an   die   Stelle   der   AES-Funktion
  622. objc_edit.   Im   Vergleich   zu   jener  wurde  sie  um  folgende
  623. Merkmale erweitert:
  624. a)  Der  Cursor  wird  bei  'kind'  =  EDINIT  nicht  am  Ende der
  625. Zeichenkette      angestellt,    sondern    an    der   in   'idx'
  626. übergebenen Stelle.
  627. b)  Sofern  eine  solche  durch  set_insert  übergeben wurde, wird
  628. bei    Druck  der  Taste  INSERT  eine  Funktion  zur  Eingabe von
  629. Sonderzeichen   aufgerufen.
  630. c)    Control    +    Delete    löscht   den   Rest   der   Zeile.
  631. d)  Control  +  Pfeil  links  und  Control + Pfeil rechts springen
  632. zum   nächsten Wort.
  633. e)  Shift  +  Pfeil  links  sprigt  an den Anfang der Zeile, Shift
  634. + Pfeil rechts an deren Ende.
  635. f)   Control   +   C  speichert  den  Inhalt  der  Zeile  auf  dem
  636. Klemmbrett;    Control  +  X  schneidet  den  Inhalt der Zeile aus
  637. und  speichert  ihn    auf  dem  Klemmbrett;    Control  + V setzt
  638. die  erste  Zeile  der  Datei  SCRAP.TXT  aus  dem   Klemmbrett in
  639. das Eingabefeld ein.
  640.  
  641. 22. ini_field
  642. function  ini_field(tree: AESTreePtr; start_field: integer):
  643.                    integer;
  644. Diese   Funktion   berechnet   das   erste  Eingabefeld  in  einem
  645. Dialog,   wenn   'start_field'   =   0   oder  'start_field'  kein
  646. Eingabefeld  ist.  Diese  Funktion  wird  gebraucht,  wenn man ein
  647. spezielles    form_do    schreiben   will,   etwa   für   unmodale
  648. Fensterdialoge.
  649.  
  650. III. Routinen aus ALERT
  651. ALERT exportiert nur eine einzige Routine:
  652.  
  653. function do_alert(bitblock: BITBLKPtr; otext, obuttons:
  654.                   pchar;  bdefault, bundo: integer):
  655.                   integer;
  656.  
  657. 'bitblock'     ist     die     Adresse    des    Bitblockes    des
  658. darzustellenden    Images.   Vordefiniert   sind   die   Bitblöcke
  659. macnote,    macwait,    macstop,    calc,    gem2note,   gem2wait,
  660. gem2stop,   gem1note,   gem1wait,   gem1stop,  happy,  sad,  bomb,
  661. info,       inversnote,       inverswait      und      inversstop.
  662.  
  663. 'otext'  ist  der  Text  der  Alertbox.  Erlaubt  sind  bis  zu 18
  664. Zeilen   mit   bis   zu   29  Buchstaben,  jedoch  (wegen  Pascal)
  665. insgesamt   höchstens  255  Zeichen.  Der  Text  wird  automatisch
  666. umgebrochen,    sofern    er    nicht    schon   mit   '|'-Zeichen
  667. formatiert ist.
  668.  
  669. 'obuttons'   repäsentiert   die  Buttons.  Die  einzelnen  Buttons
  670. werden   durch  '|'-Zeichen  getrennt.  Für  die  Breite  ist  die
  671. Länge  des  längsten  Textes  maßgeblich.  Die  Buttons können mit
  672. dem   '['-Zeichen   markiert   werden;  sie  sind  dann  auch  per
  673. Alternate + Buchstabe anwählbar.
  674.  
  675. 'bdefault'   ist   die  Nummer  (beginnend  mit  0)  des  mit  den
  676. Tasten  Return  und  Enter  selektierbaren  Buttons  oder  kleiner
  677. als 0;
  678.  
  679. 'bundo'  ist  entsprechend  die  Nummer  des  mit  der  Taste Undo
  680. anwählbaren Knopfes.
  681.  
  682. Zurückgegeben   wird  der  Index  des  angewählten  Buttons  oder,
  683. wenn  ein  Fehler  aufgetreten  ist,  ein  negativer  Wert. Da der
  684. Objektbaum   dynamisch   aufgebaut   wird,  sind  Fehler  bei  der
  685. Speicherallozierung denkbar.
  686.  
  687. IV. Routinen aus der Unit MEMORY
  688. Die  Units  des  PDIAL-Paketes  verwenden  zur Speicherallozierung
  689. ausschließlich  die  Routinen der Unit MEMORY. Jene wiederum liegt
  690. im  Quelltext  bei,  so daß jeder, der eine Speicherverwaltung ge-
  691. schrieben  hat,  die  Speicher in größeren Blöcken als Pure Pascal
  692. vom  Betriebssystem  anfordert, MEMORY an diese anpassen kann (und
  693. sollte).       Nun       die      Routinen      im      einzelnen.
  694.  
  695. 1. mem_alloc
  696. procedure mem_alloc(var p: pointer; size: longint);
  697. mem_alloc  alloziert  'size'  Byte  Speicher  an  der Adresse 'p'.
  698. Im      Fehlerfall      enthält      'p'     den     Wert     NIL.
  699.  
  700. 2. mem_free
  701. procedure mem_free(var p: pointer; size: longint);
  702. mem_free gibt an der Adresse 'p' 'size' Byte Speicher frei.
  703.  
  704. 3. strdup
  705. function  strdup(str: pchar): pchar;
  706. strdup  alloziert  ausreichend  Speicher  und  kopiert  dann  dort
  707. den   nullterminierten   String   'str'   hinein.   Sollte   nicht
  708. genügend   Speicher   vorhanden   sein  oder  'str'  die  Länge  0
  709. haben   oder  gleich  NIL  sein,  so  ist  der  Rückgabewert  NIL.
  710. Sonst    wird   die   Adresse   des   Zielstrings   zurückgegeben.
  711. Vergleiche auch strnew.
  712.  
  713. V. Routinen und Typen aus TOOLS
  714. Die  Routinen aus TOOLS bräuchten bei der Programmierung mit PDIAL
  715. eigentlich  gar  nicht  verwendet zu werden. Da sie aber wohl ganz
  716. nützlich   sind,   werden   sie   hier   gleichwohl  dokumentiert.
  717.  
  718. 1. GRECT
  719. GRECT =  record
  720.            g_x, g_y, g_w, g_h   :  integer;
  721.          end;
  722. GRECT   dient   der  Aufnahme  der  Koordinaten  eines  Rechteckes
  723. bei der AES-Programmierung.
  724.  
  725. 2. min function min(a, b: integer): integer;
  726. Min gibt den kleineren der Werte 'a' und 'b' zurück.
  727.  
  728. 3. max
  729. function max(a, b: integer): integer;
  730. Max gibt den größeren der Werte 'a' und 'b' zurück.
  731.  
  732. 4. hiword
  733. function hiword(l: longint): word;
  734. Hiword gibt die oberen 16 Bit des Langwortes 'l' zurück.
  735.  
  736. 5. loword
  737. function loword(l: longint): word;
  738. Loword gibt die unteren 16 Bit des Langwortes 'l' zurück.
  739.  
  740. 6. function get_cookie(cookie: longint): pointer;
  741. Get_cookie   gibt   die   Adresse   des   zu  'cookie'  gehörenden
  742. Cookie-Jars    zurück.   Konnte   ein   solcher   nicht   gefunden
  743. werden, so wird NIL zurückgegeben.
  744.  
  745. 7. set_state
  746. procedure set_state(var obj: AESObject; state: integer);
  747. Set_state setzt den Status 'state' im Objekt 'obj'.
  748.  
  749. 8. unset_state
  750. procedure unset_state(var obj: AESObject; state: integer);
  751. Unset_state löscht den Status 'state' im Objekt 'obj'.
  752.  
  753. 9. is_state
  754. function  is_state(var obj: AESObject; state: integer):
  755.           boolean;
  756. Die   Funktion   gibt  TRUE  zurück,  wenn  im  Objekt  'obj'  der
  757. Status      'state'      gesetzt     ist,     ansonsten     FALSE.
  758.  
  759. 10. set_flag
  760. procedure set_flag(var obj: AESObject; flag: integer);
  761. Set_flag setzt das Flag 'flag' im Objekt 'obj'.
  762.  
  763. 11. unset_flag
  764. procedure unset_flag(var obj: AESObject; flag: integer);
  765. Unset_flag löscht das Flag 'flag' im Objekt 'obj'.
  766.  
  767. 12. is_flag
  768. function is_flag(var obj: AESObject; flag: integer):
  769.          boolean;
  770. Die  Funktion  gibt  TRUE  zurück,  wenn  im Objekt 'obj' das Flag
  771. 'flag'         gesetzt         ist,        ansonsten        FALSE.
  772.  
  773. 13. deselect
  774. procedure deselect(var obj: AESObject);
  775. Deselect löscht im Objekt 'obj' den Status SELECTED.
  776.  
  777. 14. draw_object
  778. procedure draw_object(tree: AESTreePtr; obj: integer);
  779. Draw_object   malt  das  Objekt  'tree^[obj]'  mit  den  Clipping-
  780. Koordinaten des Wurzelobjektes.
  781.  
  782. 15. is_enabled
  783. function  is_enabled(var obj: AESObject): boolean;
  784. Is_enabled  gibt  TRUE  zurück,  wenn  im  Objekt 'obj' der Status
  785. DISABLED  gelöscht und das Flag SELECTABLE gesetzt sind, ansonsten
  786. FALSE.
  787.  
  788. 16. maptree
  789. procedure maptree(tree: AESTreePtr; this, last: integer;
  790.              routine: MAPProc);
  791. type
  792.   MAPProc  =  function(tree: AESTreePtr; obj: integer):
  793.               boolean;
  794.  
  795. Maptree   durchwandert   den   Baum  'tree'  vom  Objekt  mit  der
  796. Nummer  'this'  bis  zum  Objekt  mit  der  Nummer  'last'.  Dabei
  797. wird   für   jedes   Objekt  die  Funktion  'routine'  aufgerufen.
  798. Wenn     'routine'     FALSE     zurückgibt,     werden    etwaige
  799. Kinderobjekte      des      aktuellen      Objektes     ignoriert.
  800.  
  801. 17. is_space
  802. function isspace(c: char): boolean;
  803. Is_space   entspricht   der   gleichnamigen   Funktion   aus   der
  804. Sprache   C.  Es  wird  TRUE  zurückgegeben,  wenn  der  Buchstabe
  805. 'c'   eines   der   Zeichen  <Tab>,  <Return>  oder  <Space>  ist.
  806.  
  807. K. Popupmenüs in Dialogboxen und ihr Aufbau im RCS
  808. Ein    vollständiges    Popup-Konstrukt    mit    links    daneben
  809. stehendem   String   und   Circlebutton  sollte  man  im  RCS  wie
  810. folgt  aufbauen:  Zunächst  muß  eine  IBOX  eingefügt werden. Ihr
  811. Rand  sollte  einen  Pixel  innerhalb  oder  (besser)  einen Pixel
  812. außerhalb  der  IBOX  liegen.  Die  IBOX  ist  zu schattieren. Die
  813. Flags  SELECTABLE,  EXIT,  TOUCHEXIT  sind  NICHT  zu  setzen.  In
  814. die   IBOX   sind   der   Popupbutton  und  der  Circlebutton  als
  815. Kinder  einzufügen.  Der  Circlebutton  muß  ein  BOXTEXT  mit dem
  816. erweiterten  Typ  22  sein.  Man  muß  entweder das Flag TOUCHEXIT
  817. oder  die  Flags  SELECTABLE  und  EXIT  setzen.  Der  Popupbutton
  818. muß  ebenfalls  den  erweiterten  Typ  22  haben;  für  die  Flags
  819. gilt   das   soeben   gesagte.   Es   ist  zu  beachten,  daß  der
  820. (normale)  Objekttyp  des  'Popupbuttons'  zum  Typ  der  Einträge
  821. des    korrespondierenden    Popupmenüs    paßt,   weil   ja   der
  822. ausgewählte  Eintrag  in  dem  Popupbutton  dargestellt  wird  und
  823. dies   in   popup_dialog   durch   einfaches   Überschreiben   des
  824. ob_spec   des   Popupbuttons  mit  dem  ob_spec  des  ausgewählten
  825. Eintrages   realisiert   ist.   Wenn  der  Popupbutton  also  etwa
  826. wirklich   ein  Button  ist,  können  im  Popupmenü  nur  Einträge
  827. der  Typen  BUTTON  und  STRING  stehen;  ist er aber zum Beispiel
  828. ein   TEXT,   so  müssen  die  Einträge  im  Popupmenü  (BOX)TEXTe
  829. sein.  Wenn  man  keinen  Circlebutton  verwenden  will,  kann man
  830. auf  die  zugrundeliegende  IBOX  verzichten.  In  diesem Fall ist
  831. dann   aber   der   Popupbutton   mit   dem   Status  SHADOWED  zu
  832. versehen.   Links   neben   den   Popupbutton   kann   ein  String
  833. plaziert    werden.    Dieser   sollte   ein   tastaturbedienbarer
  834. String  mit  dem  erweiterten  Typ  18  sein und Auskunft über das
  835. Popumenü   geben;   er   sollte   einen   Doppelpunkt   enthalten.
  836. Ferner  sollten  die  Flags  TOUCHEXIT  bzw.  EXIT  und SELECTABLE
  837. gesetzt   sein,  so  daß  das  Popupmenü  auch  mit  der  Tastatur
  838. aufgeklappt   werden   kann.   Stehen   mehrere  Popupbuttons  mit
  839. zugehörigem   String   in   einer   Dialogbox   untereinander,  so
  840. sollten      die      Doppelpunkte      untereinander      stehen.
  841.  
  842.  
  843. L. PDIAL und nichtmodale Fensterdialoge
  844. Nichtmodale   Dialoge  (oder  auf  gut  Deutsch  'modeless  dialog
  845. boxes')   liegen   in   einem   Fenster.  Bei  ihnen  hat  man  im
  846. Unterschied  zu  den  normalen  Dialogen  Zugriff  auf Fenster und
  847. Menüleiste.   Sie   zwingen   mit   anderen  Worten  den  Benutzer
  848. nicht   in   einen   Modus.  Dies  ist  besonders  interessant  in
  849. einer  Multitaskingumgebung,  da  damit  ein  Taskwechsel  möglich
  850. bleibt.  Daneben  gibt  es  noch  modale  Fensterdialoge,  die den
  851. Zugriff  auf  die  Fenster  und  die  Menüleiste  nur  der eigenen
  852. Applikation   verwehren,   einen   Taskwechsel  aber  ermöglichen.
  853. Wie  mit  PDIAL  unmodale  Fensterdialoge  zu  programmieren sind,
  854. kann   man   dem   Listing  MODELESS.PAS  entnehmen.  Das  Prinzip
  855. besteht   darin,  aus  der  Hauptereignisschleife  des  Programmes
  856. die     für     den    Fensterdialog    bestimmten    Maus-    und
  857. Tastaturereignisse   herauszufischen.   Dies   erledigt   in   dem
  858. Listing  die  Funktion  pform_win.  Auf  die  Programmierung einer
  859. fertigen   Unit  für  solche  Dialoge  haben  wir  verzichtet,  da
  860. dies    eine    allgemeingültig    formulierte   Fensterverwaltung
  861. vorausgesetzt      hätte.      Eine      wirklich      universelle
  862. Fensterverwaltung   -   wie   sie   etwa   in   dem  GEM-Buch  der
  863. Gebrüder   Geiß   vorgestellt   wird  -  bekommt  aber  wegen  der
  864. vielfältigen     denkbaren     Kombinationsmöglichkeiten    leicht
  865. monströse    Züge    und    ist   für   Dritte   nur   mühsam   zu
  866. durchschauen.   Schließlich   geht   es  hier  ja  auch  nicht  um
  867. Fensterverwaltung, sondern um Dialogboxen.
  868.  
  869. M. PDIAL und modale Fensterdialoge
  870. Die   Programmierung   modaler   Fensterdialoge   mit  PFORM  wird
  871. im Listing MODAL.PAS vorgeführt.
  872.  
  873. N. PDIAL und Let 'em Fly
  874. Let  'em  Fly  ist  ein  Freeware-Utility  von  Oliver Scheel, das
  875. eine  Reihe  von  AES-Routinen  durch  eigene  ersetzt.  Es dürfte
  876. in   jeder   MAUS   zu  saugen  sein.  Es  verleiht  auch  solchen
  877. Dialogboxen,   die   nicht   mit  einem  Flydial-Clone  wie  PDIAL
  878. programmiert       worden       sind,       Flugfähigkeit      und
  879. Tastaturbedienbarkeit.   Interessant  im  Zusammenhang  mit  PDIAL
  880. ist,   daß   die   Flugroutinen   von   Let  'em  Fly  durch  eine
  881. Schnittstelle   nach   außen   geführt  sind.  Wenn  Let  'em  Fly
  882. installiert  sind,  kann  PDIAL  so  konfiguriert  werden, daß auf
  883. die   Allozierung   eines  eigenen  Hintergrundpuffers  verzichtet
  884. und         stattdessen        Hintergrundrestaurierung        und
  885. Dialogverschiebung  ausschließlich  über  Let  'em  Fly  erfolgen.
  886. Vorsicht    ist    allerdings    anzuraten   bei   verschachtelten
  887. Dialogen:      Let      'em      Fly     scheint     mit     einer
  888. Verschachtelungstiefe   größer  6  nicht  fertig  zu  werden.  Wir
  889. empfehlen,     die    Verwendung    von    Let    'em    Fly    in
  890. Anwenderprogrammen   dem   User   in   einem  Konfigurationsdialog
  891. anzubieten.   Prinzipbedingt   kann   die  Einstellung  aber  erst
  892. NACH   dem   nächsten   Programmstart  ausgewertet  werden  -  die
  893. Voreinstellung    muß    also    abgespeichert    werden   können.
  894.  
  895. O. PDIAL und Interface
  896. Da   die   Codierung   der   erweiterten   Objekttypen  weitgehend
  897. kompatibel  zu  der  in  den  My-Dials  verwendeten  ist, kann zum
  898. Austesten   im   RCS   Interface   das  mit  Interface  gelieferte
  899. EXTOBFIX.PRG   verwendet   werden.   Unterschiede   ergeben   sich
  900. aber      hinsichtlich     tastaturbedienbarer     Strings     und
  901. Groupboxüberschriften    mit    dem    kleinen    AES-Zeichensatz.
  902.  
  903. P. Wenn ein Fehler auftritt,...
  904. ...dann  wendet  euch  bitte  an  uns!  Als Programmierer wißt Ihr
  905. bestimmt,  welche  Informationen  wir  brauchen.  Interessant wäre
  906. darüber  hinaus,  ob  die  Probleme  bereitende  RCS-Datei mit dem
  907. Programm        SHOWDIAL        angezeigt       werden       kann.
  908. Auch   für  Erweiterungsvorschläge  haben  wir  ein  offenes  Ohr.
  909. Wir  bitten  aber  um  Verständnis  dafür,  daß nur derjenige eine
  910. Antwort   erhält,   der   einen   selbstadressierten,  ausreichend
  911. frankierten   Briefumschlag   -   gegebenenfalls  mit  Diskette  -
  912. beifügt. Unsere Anschriften lauten:
  913.  
  914.   Jürgen Holtkamp
  915.   Jobststraße 65
  916.   44629 Herne
  917.  
  918.   Uwe Holtkamp
  919.   Altenhöfenerstraße 75
  920.   44623 Herne
  921.  
  922. Q. Literatur
  923. Nachfolgend  nun  ein  Verzeichnis  der  verwendeten  Aufsätze und
  924. Bücher.  Den  Autoren  sei  an  dieser  Stelle  herzlich  gedankt.
  925.  
  926. Hövener, Markus
  927.   Menutune
  928.   ST Computer 3/1992, 87f.
  929.  
  930. Jankowski/Rabich/Reschke
  931.   ATARI Profibuch
  932.   12. Auflage (4. überarbeitete Auflage) 1992
  933.   Düsseldorf 1991
  934.  
  935. Meisiek, Olaf
  936.   Die MyDial-Funktionsbibliothek
  937.   (Anleitung zu den MyDials im Lieferumfang von Interface)
  938.  
  939. Oren, Tim
  940.   Professional GEM
  941.   1985
  942.   (in diversen Mailboxen)
  943.  
  944. Prüssner, Laurenz
  945.   Verdeckte Ermittlungen
  946.   ST Magazin 6/1992, 91
  947.  
  948. Rabich, Dietmar
  949.   Flexible Alertbox
  950.   ST Computer 11/1992, 84ff.
  951.  
  952. derselbe
  953.   Mehr Bedienungskomfort
  954.   ST Magazin 12/1992, 106ff.
  955.  
  956. Rudolph, Ralf
  957.   Pascal für Umsteiger (Teil 6)
  958.   Atari Journal 12/92, 71ff.
  959.  
  960. Sattler, Wolfgang
  961.   form-keybd & form_button in MAXON-Pascal
  962.   ST Copmuter 2/1992, 83ff.
  963.  
  964. Scheel, Oliver
  965.   Three Flights Up
  966.   (Programmieranleitung zu Let 'em Fly)
  967.  
  968. Schlüter, Axel
  969.   Fly Deals
  970.   TOS 12/1992, 58f.; TOS 1/93
  971.  
  972. Tolksdorf, Robert
  973.   AUTOFLY, Nur Fliegen ist schöner
  974.   ST Computer 6/1991,101ff.
  975.