home *** CD-ROM | disk | FTP | other *** search
/ Arawak OS/2 Shareware / PAKLED.ISO / docs / edm / edmi2-7.inf (.txt) < prev    next >
Encoding:
OS/2 Help File  |  1994-07-10  |  235.2 KB  |  1,801 lines

  1.  
  2. ΓòÉΓòÉΓòÉ 1. July 1994 Title Page ΓòÉΓòÉΓòÉ
  3.  
  4.                                       EDM/2
  5.  
  6.                   The Electronic Developer's Magazine for OS/2
  7.  
  8.                    Portions copyright (c) by Larry Salomon Jr.
  9.                                 Volume 2, issue 7
  10.  
  11. Copyright Notice and Other Stuff 
  12.  
  13. The Editor-in-Chief of this electronic magazine is Larry Salomon, Jr. 
  14.  
  15. Portions of EDM/2 are copyrighted by the editors.  This publication may be 
  16. freely distributed in electronic form provided that all parts are present in 
  17. their original unmodified form.  A reasonable fee may be charged for the 
  18. physical act of distribution; no fee may be charged for the publication itself. 
  19.  
  20. All articles are copyrighted by their authors. No part of any article may be 
  21. reproduced without permission from the original author. 
  22.  
  23. Neither this publication nor the editors are affiliated with International 
  24. Business Machines Corporation. 
  25.  
  26. OS/2 is a registered trademark of International Business Machines Corporation. 
  27. Other trademarks are property of their respective owners.  Any mention of a 
  28. product in this publication does not constitute an endorsement or affiliation 
  29. unless specifically stated in the text. 
  30.  
  31. Administrivia 
  32.  
  33. Another month gone by; this month, I decided to incorporate more changes 
  34. suggested by Carsten (of which some were forwarded from readers).  Some of them 
  35. are listed below: 
  36.  
  37. o The title page was rearranged somewhat. 
  38. o All articles and columns were moved to the top, instead of buried underneath 
  39.   another heading. 
  40. o Icons are now attached to most, if not all, pages of articles, columns, and 
  41.   other miscellaneous panels. 
  42.  
  43. There are a couple of others, but I will let you find them. 
  44.  
  45. And The Winner of the Most Forgetful Award Is... 
  46.  
  47. me, obviously.  Not surprisingly, last month I lost the rdc.cmd file which was 
  48. to be included in the article Resources and Decompiling Them; it has been 
  49. included this month. 
  50.  
  51. PC Expo Came and Went 
  52.  
  53. PC Expo was enjoyable, even though I was there for Thursday only.  After three 
  54. years, I was finally allowed to peek behind the scenes at the IBM booth with 
  55. the animated character.  You know the one; he says the funniest one-liners and 
  56. usually makes a joke about Microsoft (which invariably results in a phone call 
  57. from one of that company's lawyers about libel) before the end of the show. 
  58. I've been trying to get a peek at how it was done for three years at least. 
  59. Now, I can die a happy man.  <grin> 
  60.  
  61. Seriously, it was fun.  IBM was showing off these new 21 inch monitors (which 
  62. haven't been approved by the FCC), as well as the Power PCs running AIX and 
  63. OSF1.  I managed to hijack the IBM C-Set++ booth to give away five copies of my 
  64. book.  The Developer's Connection volume 4 is shipping as I write this and it 
  65. does contain some goodies; watch your mail!  Finally, I finagled a copy of the 
  66. OS/2-in-4M beta on CD-ROM but haven't gotten around to installing it.  The 
  67. kiosk of this at the Expo had an impressive demonstration running on a ThinkPad 
  68. with 4M and running either Word for Windows or Excel (cannot remember which), 
  69. Klondike Solitare (OS/2 version), and the Clock, and response was quite snappy. 
  70.  
  71. Next Month...? 
  72.  
  73. I will be taking a week for vacation this month and might decide to skip next 
  74. month's issue since everyone else seems to be enjoying their summer too. <grin> 
  75. There is a chance that I will still put out an August issue (flood me with 
  76. articles - hint hint - and the probably increases likewise), but I won't know 
  77. until I return. 
  78.  
  79. Coming Soon 
  80.  
  81. At work, I have had a need to develop a limited subset of the PM API for VIO 
  82. applications.  While the limitations to using it are many, the implementation 
  83. of the VIOWIN library is very interesting because it gives one an insight into 
  84. the implementation issues that the original PM developers had to face.  I 
  85. intend to discuss the library in-depth in a future issue, but cannot commit to 
  86. a specific issue.  Watch this space. 
  87.  
  88. Title Page - EDM/2 - July 1994 - Volume 2, Issue 7 
  89.  
  90.  
  91. ΓòÉΓòÉΓòÉ 2. Visual REXX Faceoff - Part 2 ΓòÉΓòÉΓòÉ
  92.  
  93.  
  94. ΓòÉΓòÉΓòÉ 2.1. Introduction ΓòÉΓòÉΓòÉ
  95.  
  96. Visual REXX Faceoff - Part 2 
  97.  
  98. Written by Gordon Zeglinski 
  99.  
  100. Introduction 
  101.  
  102. This issue sees the second part of the Visual REXX Faceoff.  We start by 
  103. looking at VisPro REXX/Bronze Edition version 2.0 by Hockware and then compare 
  104. its features to that of VX-REXX.  The Bronze Edition is an entry level low cost 
  105. visual REXX product.  It is not a full blown environment like the VisPro REXX 
  106. Gold Edition or VX-REXX. 
  107.  
  108. VisPro ships on a single floppy disk and comes with a 300+ page manual. 
  109.  
  110. Visual REXX Faceoff (Part 2) - EDM/2 - July 1994 - Volume 2, Issue 7 
  111.  
  112.  
  113. ΓòÉΓòÉΓòÉ 2.2. Installation ΓòÉΓòÉΓòÉ
  114.  
  115. Installation 
  116.  
  117. The VisPro REXX (VisPro for short) installation went smoothly.  Just pop in the 
  118. disk, set up the install path, wait a while, reboot, and it's ready to use. 
  119. Well, almost; do not try to second guess the instructions about installing the 
  120. Resource Compiler and LINK386 by using Selective Install. These two program 
  121. must be installed in the \OS2 directory on the boot drive (this was found out 
  122. the hard way). 
  123.  
  124. When done, you will see the following folder on the desktop. 
  125.  
  126. Figure 1. Installation Folder 
  127.  
  128. Visual REXX Faceoff (Part 2) - EDM/2 - July 1994 - Volume 2, Issue 7 
  129.  
  130.  
  131. ΓòÉΓòÉΓòÉ 2.3. Look and Feel ΓòÉΓòÉΓòÉ
  132.  
  133. Look and Feel 
  134.  
  135. In VisPro, the window you are working on (the form) is integrated with the 
  136. editing tools window as shown in figure 2. This is called the "layout view" in 
  137. VisPro. 
  138.  
  139. Figure 2.  User Interface 
  140.  
  141. In addition to the layout view, the forms have settings, list and event views. 
  142. The list view displays all the controls in the form, and their basic 
  143. characteristics.  The event view displays the controls and the events they 
  144. respond to.  Figure 3 shows the events view. 
  145.  
  146. Figure 3.  Events View 
  147.  
  148. VisPro uses WPS objects to represent projects.  It uses project folders and 
  149. "forms" to represent an application.  The project folder is simply a directory 
  150. where the project file are stored.  Forms represent windows in an application. 
  151. There are two types of forms:  the main form and sub forms.  Each application 
  152. must have a main form.  It can have zero, one or more sub-forms that represent 
  153. different windows.  Figure 4 shows the project folder. 
  154.  
  155. Figure 4.  Project Folder 
  156.  
  157. Like VX-REXX (see last issue for details), VisPro mimics the feel of the WPS. 
  158. Thus, getting used to the environment shouldn't take too long.  The reference 
  159. section of the manual is well-written.  You can search for a function by what 
  160. it does in addition to searching by its name.  This is really nice if you are a 
  161. fan of paper.  However, VisPro also has drag and drop coding and code insertion 
  162. abilities.  Figure 5 shows the edit window, with the code insertion menus open. 
  163.  
  164. Figure 5.  Edit Window 
  165.  
  166. Like the WPS, the settings for the forum and controls are presented in a 
  167. notebook.  Figure 6 shows the settings window for the main form.  Each control 
  168. has similar settings windows, with pages added or subtracted as needed to deal 
  169. with object specific properties. 
  170.  
  171. Figure 6.  Properties Notebook 
  172.  
  173. Visual REXX Faceoff (Part 2) - EDM/2 - July 1994 - Volume 2, Issue 7 
  174.  
  175.  
  176. ΓòÉΓòÉΓòÉ 2.4. Feature Comparison ΓòÉΓòÉΓòÉ
  177.  
  178. Feature Comparison 
  179.  
  180. The following table will compare the features in VX-REXX Gold to those in 
  181. VisPro REXX Bronze. 
  182.  
  183. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  184. ΓöéFeature                  ΓöéVX-REXX   ΓöéVisPro REXX Bronze  Γöé
  185. Γöé                         ΓöéGold      Γöé                    Γöé
  186. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  187. ΓöéControl Windows          Γöé          Γöé                    Γöé
  188. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  189. ΓöéStatic Text              ΓöéYes       ΓöéYes                 Γöé
  190. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  191. ΓöéGroup Box                ΓöéYes       ΓöéYes                 Γöé
  192. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  193. ΓöéButton                   ΓöéYes       ΓöéYes                 Γöé
  194. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  195. ΓöéRadio Button             ΓöéYes       ΓöéYes                 Γöé
  196. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  197. ΓöéCheck Box                ΓöéYes       ΓöéYes                 Γöé
  198. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  199. ΓöéPicture Button           ΓöéYes       ΓöéNo                  Γöé
  200. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  201. ΓöéPicture Radio Button     ΓöéYes       ΓöéNo                  Γöé
  202. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  203. ΓöéPicture Box              ΓöéYes       ΓöéYes                 Γöé
  204. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  205. ΓöéList Box                 ΓöéYes       ΓöéYes                 Γöé
  206. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  207. ΓöéCombination Box          ΓöéYes       ΓöéYes                 Γöé
  208. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  209. ΓöéDrop Down List           ΓöéYes       ΓöéYes                 Γöé
  210. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  211. ΓöéEntry Field              ΓöéYes       ΓöéYes                 Γöé
  212. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  213. ΓöéMulti Line Entry Field   ΓöéYes       ΓöéYes                 Γöé
  214. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  215. ΓöéValue Set                ΓöéYes       ΓöéYes                 Γöé
  216. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  217. ΓöéSlider                   ΓöéYes       ΓöéNo                  Γöé
  218. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  219. ΓöéSpin Button              ΓöéYes       ΓöéYes                 Γöé
  220. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  221. ΓöéNotebook                 ΓöéYes       ΓöéNo                  Γöé
  222. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  223. ΓöéContainer                ΓöéYes       ΓöéNo                  Γöé
  224. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  225. ΓöéFree Form                ΓöéNo        ΓöéYes                 Γöé
  226. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  227. ΓöéMenus                    ΓöéYes       ΓöéYes                 Γöé
  228. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  229. ΓöéHelp Support             ΓöéYes       ΓöéYes                 Γöé
  230. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  231. ΓöéDDE                      ΓöéYes       ΓöéNo                  Γöé
  232. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  233. ΓöéTimer                    ΓöéYes       ΓöéYes                 Γöé
  234. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  235. ΓöéThreads                  ΓöéYes       ΓöéNo (1)              Γöé
  236. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  237. ΓöéDrag and Drop            ΓöéYes (2)   ΓöéNo                  Γöé
  238. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  239. ΓöéQ+E support              ΓöéYes       ΓöéYes                 Γöé
  240. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  241. ΓöéISV extendible           ΓöéIn Beta   ΓöéYes                 Γöé
  242. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  243.  
  244. (1) Threads in REXX are not the same as threads in C. Global data is not 
  245. automatically shared in REXX.  There are several freeware and shareware REXX 
  246. libraries that will allow you to have multithreaded REXX progams. 
  247.  
  248. (2) In container controls only 
  249.  
  250. Keep in mind that when comparing these two visual REXX packages, the VisPro 
  251. package reviewed here is a low-cost, entry-level package. 
  252.  
  253. Visual REXX Faceoff (Part 2) - EDM/2 - July 1994 - Volume 2, Issue 7 
  254.  
  255.  
  256. ΓòÉΓòÉΓòÉ 2.5. Wrapping Things Up ΓòÉΓòÉΓòÉ
  257.  
  258. Wrapping Things Up 
  259.  
  260. The two visual REXX packages looked at here have much in common.  The biggest 
  261. difference between the two is the interface.  One other difference worth 
  262. mentioning is that VisPro REXX has a smaller runtime DLL (about 100 Kb) than 
  263. VX-REXX (about 740Kb).  This may be an important factor if you are thinking 
  264. about using a visual REXX to write a part of your application. 
  265.  
  266. Both products have excellent support, through Compuserve, Internet, fax and 
  267. voice calls.  If you are looking for a low-cost, easy-to-use visual REXX 
  268. package, then VisPro REXX Bronze is the package for you.  If you want a little 
  269. more power, VX-REXX or VisPro REXX Gold will fit your needs nicely. With out 
  270. actually seeing the VisPro REXX Gold Edition myself, I can't definitively say 
  271. if it's database extensions are as good as they are rumored to be.  Hopefully, 
  272. if the future, we'll be able to look at the Gold edition as well.  Until then, 
  273. if you are looking for a package to work on database front ends, you should 
  274. find some literature on VisPro REXX Gold. 
  275.  
  276. Visual REXX Faceoff (Part 2) - EDM/2 - July 1994 - Volume 2, Issue 7 
  277.  
  278.  
  279. ΓòÉΓòÉΓòÉ 3. Sprites and Animation - Part 3 ΓòÉΓòÉΓòÉ
  280.  
  281.  
  282. ΓòÉΓòÉΓòÉ 3.1. Introduction ΓòÉΓòÉΓòÉ
  283.  
  284. Sprites and Animation - Part 3 
  285.  
  286. Written by Larry Salomon, Jr. 
  287.  
  288. Introduction 
  289.  
  290. In the final part of this series, we will wrap things up by looking at how 
  291. I495.EXE was built.  This will hopefully get you on your way to using animation 
  292. within your own applications, although it should be noted that no article or 
  293. series of articles will ever be able to give an exhaustive treatment of this 
  294. topic.  And when there are applications like Autodesk and Renderman available 
  295. (albeit expensive), hard-coded animations are rare. 
  296.  
  297. Sprites and Animation (Part 3) - EDM/2 - July 1994 - Volume 2, Issue 7 
  298.  
  299.  
  300. ΓòÉΓòÉΓòÉ 3.2. Capabilities ΓòÉΓòÉΓòÉ
  301.  
  302. Capabilities 
  303.  
  304. Before we can begin designing, we have to know what it is that we are designing 
  305. - what will the application do, how much of the behavior can be controlled by 
  306. the user, etc.  Fortunately, I495.EXE allows for little control by the user, so 
  307. the majority of the application is deterministic, i.e. we can predict what will 
  308. happen with high accuracy (this statement is a bit inaccurate depending on how 
  309. it is interpreted, since we use random number generators).  Enumerated below 
  310. are the intended capabilities of the application: 
  311.  
  312. o It should have vehicles enter from the top right which proceed to the left 
  313.   and from the bottom left which proceed to the right. 
  314. o It should not allow the vehicles to have individual velocities, i.e. all 
  315.   vehicles have the same speed. 
  316. o It should allow the user to control the density of the traffic via the 
  317.   keyboard. 
  318.  
  319. Now that we have a good idea of the capabilities of the application, we can 
  320. begin the design with the goals that we have set in mind. 
  321.  
  322. Sprites and Animation (Part 3) - EDM/2 - July 1994 - Volume 2, Issue 7 
  323.  
  324.  
  325. ΓòÉΓòÉΓòÉ 3.3. Design ΓòÉΓòÉΓòÉ
  326.  
  327. Design 
  328.  
  329. Because we have an easy to use "create sprite" function, it is easier for us to 
  330. create two bitmaps for each vehicle type, one for each direction, and to create 
  331. two sprites from these bitmaps.  Although this is not a good design policy, by 
  332. knowing which bitmap id's correspond to which vehicle type and direction, we 
  333. can build a table of sprite information which contains the following 
  334. information: 
  335.  
  336. o the sprite handle 
  337. o the direction that the sprite should travel 
  338. o the vehicle type 
  339. o ...plus other information such as sprite size 
  340.  
  341. The corresponding data structure for this is 
  342.  
  343. #define SIT_CAR                  0x0001L
  344. #define SIT_TRUCK                0x0002L
  345. #define SIT_GOESLEFT             0x0004L
  346. #define SIT_GOESRIGHT            0x0008L
  347.  
  348. #define SIS_UNUSED               0L
  349. #define SIS_VISIBLE              1L
  350. #define SIS_ENTERTOP             2L
  351. #define SIS_EXITTOP              3L
  352. #define SIS_ENTERBOTTOM          4L
  353. #define SIS_EXITBOTTOM           5L
  354.  
  355. typedef struct _SPRITEINFO {
  356.    HSPRITE hsSprite;
  357.    SIZEL szlSize;
  358.    ULONG ulType;
  359.    ULONG ulState;
  360. } SPRITEINFO, *PSPRITEINFO;
  361.  
  362. The explanation of the SPRITEINFO structure follows: 
  363.  
  364. hsSprite            handle of the sprite. 
  365. szlSprite           size of the sprite.  This is used to determine the value of 
  366.                     ulState. 
  367. ulType              type of the sprite and direction it travels (SIT_* 
  368.                     constant). 
  369. ulState             state of the sprite (SIS_* constant). 
  370.  
  371.    SIS_UNUSED          not currently being used 
  372.    SIS_VISIBLE         on screen 
  373.    SIS_ENTERTOP        entering on the top half of the road 
  374.    SIS_EXITTOP         exiting on the top half of the road 
  375.    SIS_ENTERBOTTOM     entering on the bottom half of the road 
  376.    SIS_EXITBOTTOM      exiting on the bottom half of the road 
  377.  
  378. Sprites and Animation (Part 3) - EDM/2 - July 1994 - Volume 2, Issue 7 
  379.  
  380.  
  381. ΓòÉΓòÉΓòÉ 3.4. Animation ΓòÉΓòÉΓòÉ
  382.  
  383. Animation 
  384.  
  385. The animation itself is nothing more than good management of an array of 
  386. SPRITEINFO structures from within a WM_TIMER message. The pseudocode for the 
  387. logic is 
  388.  
  389.  1. If nothing is entering on top and a random number is 0, find an unused 
  390.     sprite that goes from right to left and set its state to "enter on top". 
  391.  
  392.  2. If nothing is entering on bottom and a random number is 0, find an unused 
  393.     sprite that goes from left to right and set its state to "enter on bottom". 
  394.  
  395.  3. For all sprites that are not marked as "unused", increment or decrement 
  396.     their horizontal position as appropriate, and update their status to 
  397.     reflect if they are entering, on screen, exiting, or no longer visible 
  398.     ("unused"). 
  399.  
  400. Once you understand this, you should have no trouble interpreting the 
  401. corresponding code below: 
  402.  
  403. case WM_TIMER:
  404.    switch (SHORT1FROMMP(mpParm1)) {
  405.    case TID_TRAFFIC:
  406.       {
  407.          HPS hpsWnd;
  408.          PSPRITEINFO psiSprite;
  409.          POINTL ptlPos;
  410.          ULONG ulIndex;
  411.  
  412.          hpsWnd=WinGetPS(hwndWnd);
  413.  
  414.          psiSprite=findSprite(pidData->asiSprites,SIS_ENTERTOP,0);
  415.          if ((psiSprite==NULL) && (rand()%pidData->lMod==0)) {
  416.             psiSprite=findSprite(pidData->asiSprites,
  417.                                  SIS_UNUSED,
  418.                                  SIT_GOESLEFT);
  419.             if (psiSprite!=NULL) {
  420.                psiSprite->ulState=SIS_ENTERTOP;
  421.  
  422.                ptlPos.x=pidData->szlPlay.cx;
  423.                ptlPos.y=pidData->szlPlay.cy/2+40;
  424.  
  425.                SprSetSpritePosition(hpsWnd,psiSprite->hsSprite,&ptlPos);
  426.                SprSetSpriteVisibility(hpsWnd,psiSprite->hsSprite,TRUE);
  427.             } /* endif */
  428.          } /* endif */
  429.  
  430.          psiSprite=findSprite(pidData->asiSprites,SIS_ENTERBOTTOM,0);
  431.          if ((psiSprite==NULL) && (rand()%pidData->lMod==0)) {
  432.             psiSprite=findSprite(pidData->asiSprites,
  433.                                  SIS_UNUSED,
  434.                                  SIT_GOESRIGHT);
  435.             if (psiSprite!=NULL) {
  436.                psiSprite->ulState=SIS_ENTERBOTTOM;
  437.  
  438.                ptlPos.x=(-psiSprite->szlSize.cx);
  439.                ptlPos.y=pidData->szlPlay.cy/2-60;
  440.  
  441.                SprSetSpritePosition(hpsWnd,psiSprite->hsSprite,&ptlPos);
  442.                SprSetSpriteVisibility(hpsWnd,psiSprite->hsSprite,TRUE);
  443.             } /* endif */
  444.          } /* endif */
  445.  
  446.          for (ulIndex=0; ulIndex<MAX_VEHICLES; ulIndex++) {
  447.             psiSprite=&pidData->asiSprites[ulIndex];
  448.  
  449.             if (psiSprite->ulState==SIS_UNUSED) {
  450.                continue;
  451.             } /* endif */
  452.  
  453.             SprQuerySpritePosition(psiSprite->hsSprite,&ptlPos);
  454.  
  455.             if ((psiSprite->ulType & SIT_GOESLEFT)!=0) {
  456.                ptlPos.x-=DELTA_X;
  457.  
  458.                if (ptlPos.x+psiSprite->szlSize.cx<0) {
  459.                   psiSprite->ulState=SIS_UNUSED;
  460.                } else
  461.                if (ptlPos.x<0) {
  462.                   psiSprite->ulState=SIS_EXITTOP;
  463.                } else
  464.                if (ptlPos.x+psiSprite->szlSize.cx>pidData->szlPlay.cx) {
  465.                   psiSprite->ulState=SIS_ENTERTOP;
  466.                } else {
  467.                   psiSprite->ulState=SIS_VISIBLE;
  468.                } /* endif */
  469.             } else {
  470.                ptlPos.x+=DELTA_X;
  471.  
  472.                if (ptlPos.x>pidData->szlPlay.cx) {
  473.                   psiSprite->ulState=SIS_UNUSED;
  474.                } else
  475.                if (ptlPos.x+psiSprite->szlSize.cx>pidData->szlPlay.cx) {
  476.                   psiSprite->ulState=SIS_EXITBOTTOM;
  477.                } else
  478.                if (ptlPos.x<0) {
  479.                   psiSprite->ulState=SIS_ENTERBOTTOM;
  480.                } else {
  481.                   psiSprite->ulState=SIS_VISIBLE;
  482.                } /* endif */
  483.             } /* endif */
  484.  
  485.             if (psiSprite->ulState!=SIS_UNUSED) {
  486.                SprSetSpritePosition(hpsWnd,psiSprite->hsSprite,&ptlPos);
  487.             } else {
  488.                SprSetSpriteVisibility(hpsWnd,psiSprite->hsSprite,FALSE);
  489.             } /* endif */
  490.          } /* endfor */
  491.  
  492.          WinReleasePS(hpsWnd);
  493.       }
  494.       break;
  495.    default:
  496.       return WinDefWindowProc(hwndWnd,ulMsg,mpParm1,mpParm2);
  497.    } /* endswitch */
  498.    break;
  499.  
  500. You should notice the reference to pidData->lMod in the determination of 
  501. whether a sprite is to begin entering the display area.  This is a changing 
  502. value which can be adjusted using the "+" and "-" keys; the code is trivial 
  503. WM_COMMAND processing with the two keys mapped to accelerators. 
  504.  
  505. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  506.  
  507. The rest of the code is, honestly, initialization and termination processing 
  508. (other than the "standard" PM code).  Everything you need to compile I495.EXE 
  509. is provided as I495.ZIP. 
  510.  
  511. Sprites and Animation (Part 3) - EDM/2 - July 1994 - Volume 2, Issue 7 
  512.  
  513.  
  514. ΓòÉΓòÉΓòÉ 3.5. Summary ΓòÉΓòÉΓòÉ
  515.  
  516. Summary 
  517.  
  518. This month we said our farewells to this series by examining the animation in a 
  519. simple application - I495.EXE.  And while it was said earlier that hard-coded 
  520. animations are rare, I would like to conclude that, although rare, a good 
  521. animation sequence can spruce up any "About box" (or any other part of an 
  522. application) and is well worth the effort of coding it. 
  523.  
  524. Any questions can be sent directly to me via email at the address listed at the 
  525. end of this issue. 
  526.  
  527. Sprites and Animation (Part 3) - EDM/2 - July 1994 - Volume 2, Issue 7 
  528.  
  529.  
  530. ΓòÉΓòÉΓòÉ 4. /dev/EDM/BookReview ΓòÉΓòÉΓòÉ
  531.  
  532.  
  533. ΓòÉΓòÉΓòÉ 4.1. Introduction ΓòÉΓòÉΓòÉ
  534.  
  535. /dev/EDM2/BookReview 
  536.  
  537. Written by Carsten Whimster 
  538.  
  539. Introduction 
  540.  
  541. /dev/EDM2/BookReview is a monthly column which focuses on development oriented 
  542. books and materials.  The column is from a beginning PM programmer's eyes, 
  543. because that's what I am.  Pick up whichever book strikes your fancy, and join 
  544. the growing group of people following our PM programming columns.  I will 
  545. review books aimed at beginners for a while, and then move on from there. 
  546.  
  547.  Please send me your comments and thoughts so that I can make this column as 
  548. effective as possible.  After all, the magazine will be more effective with 
  549. good reader feedback. 
  550.  
  551. The Art of OS/2 2.1 C Programming finally got here.  It turned out there was 
  552. some kind of mix-up but once they realized, it got here double-fast.  It is the 
  553. first of a care-package of three books I was sent by Wiley-QED.  I have been 
  554. anxiously awaiting this one, and I heard of it long before becoming involved 
  555. with EDM/2.  It has a good reputation as a beginner's OS/2 and PM programming 
  556. book, and also has a reputation of being hard to find. Hopefully this will 
  557. change with time (the availability, that is). 
  558.  
  559. /dev/EDM/BookReview - EDM/2 - July 1994 - Volume 2, Issue 7 
  560.  
  561.  
  562. ΓòÉΓòÉΓòÉ 4.2. Errata ΓòÉΓòÉΓòÉ
  563.  
  564. Errata 
  565.  
  566. I have been very busy this month, what with brain-storming about the layout 
  567. design of EDM/2.  Thanks go to Craig Rodrigues (did I get the spelling right? I 
  568. don't have my mail here) for suggesting flattening the index a bit.  I have 
  569. also been busy reviewing Larry's The Art of OS/2 2.1 C Programming, trying to 
  570. set up a universal table of contents for the books I review, which will 
  571. hopefully debut next month (thanks Gordon), getting a start on a VX-REXX 
  572. article, and setting up a database of ex- and current authors for EDM/2 in an 
  573. effort to ensure that the stream of articles coming is more regular.  In 
  574. addition, I've been setting and marking assignments and midterms at UW.  Whew. 
  575.  
  576. I have been working a bit on my OS/2 WWW page.  Check it out, and mail me your 
  577. thoughts, corrections, and ideas. 
  578.  
  579. On the other hand, is has been quiet with respect to mail from readers. 
  580.  
  581. Watcom C/C++ 10.0 is on its way!  I ordered it Friday June 24, and can hardly 
  582. wait.  Supposedly it is just beautiful, and has a very good IDE.  In fact, the 
  583. quality is supposedly so high that some people have been heard to complain 
  584. about the low quality of the IBM OS/2 2.1 Toolkit, and hope that Watcom makes 
  585. their own for the next release of the compiler!  I never really felt a need to 
  586. criticize the Toolkit, so 10.0 must be something!  It comes on either 61 
  587. diskettes or 1 CD-ROM.  Guess which I ordered :)  A full installation takes up 
  588. 172Mb (!), but I will only be installing the OS/2 stuff, as I have deep-sixed 
  589. both DOS and Windows a long time ago. 
  590.  
  591. I have a small confession to make here.  Ever since Larry asked if I was going 
  592. to review his book (well, their book.  Kathleen Panov wrote the largest chunk, 
  593. followed by Larry, and lastly Arthur Panov), I have been afraid of two things. 
  594. First, what if I didn't like it?  Although we have never met, I feel like I 
  595. know him well at this point, and so I wouldn't want to offend him. Secondly, if 
  596. I like it, how do I convince people that I am not just giving it a great review 
  597. because of our (Internet) connection?  I was a little relieved when Larry sent 
  598. me a letter telling me that if I didn't review it fairly, and criticize it 
  599. accordingly, then I was fired :)  But I was still nervous. 
  600.  
  601. At some point during my review I decided to be a little more critical than 
  602. normal with this book, since I am in the unique position of knowing that it is 
  603. in the process of an update, and of knowing that one of the authors is 
  604. listening.  Please don't take this extra criticism to heart, but remember why I 
  605. am doing this.  Anyhow, on to the review... 
  606.  
  607. /dev/EDM/BookReview - EDM/2 - July 1994 - Volume 2, Issue 7 
  608.  
  609.  
  610. ΓòÉΓòÉΓòÉ 4.3. The Art of OS/2 2.1 C Programming ΓòÉΓòÉΓòÉ
  611.  
  612. The Art of OS/2 2.1 C Programming 
  613.  
  614. The Art of OS/2 2.1 C Programming is an OS/2 programming book for beginners. 
  615. It has a few chapters on fundamental OS/2 programming issues such as threads 
  616. and IPC, but it is mainly intended as a PM programming book. It comes with a 
  617. 3.5" diskette, but no installation program.  You are expected to use OS/2's 
  618. unpack to copy the files over.  Here are the chapters: 
  619.  
  620.  1. Tools 
  621.  2. Memory Management 
  622.  3. File I/O and Extended Attributes 
  623.  4. Multitasking 
  624.  5. Interprocess Communication 
  625.  6. Windows and Messages 
  626.  7. Dialog Boxes 
  627.  8. Menus 
  628.  9. List Boxes 
  629. 10. Buttons 
  630. 11. Notebook 
  631. 12. Containers 
  632. 13. Value Set 
  633. 14. Spin Buttons 
  634. 15. Slider 
  635. 16. Font and File Dialogs 
  636. 17. Subclassing Windows 
  637. 18. Drag and Drop 
  638. 19. Help Manager 
  639. 20. Presentation Manager Printing 
  640. 21. Appendix A - References 
  641.  
  642. Chapter one is on C-Set++ and the OS/2 Programmer's Toolkit 2.1, and is a very 
  643. brief introduction to the usage of the various tools included.  I'll have more 
  644. to say about that in the summary. 
  645.  
  646. Chapters two through five discuss some fundamental OS/2 programming techniques, 
  647. many of which are crucial to certain types of programs.  For example, anything 
  648. network related or network aware will probably need pipes, named pipes, IPC, or 
  649. other goodies.  All programs should use good memory management and most should 
  650. probably use use threads.  Most programs use files. This early coverage of 
  651. these topics allows you to see clearly how to use the appropriate calls, 
  652. without having to sift through the guts of a PM program's code to try to 
  653. extract the necessary information.  These first few chapters are interesting, 
  654. instructive and well-written. 
  655.  
  656. The real PM programming issues start in chapter six.  This chapter is an 
  657. introduction to the basic APIs and structure used in a PM program.  First, you 
  658. must get a handle to an anchor block.  Next, you set up a message queue, and 
  659. register your program's class with OS/2.  Then you create your window with 
  660. whatever options you want.  Finally, the message loop is set up, and when the 
  661. program exits this, it cleans up and quits.  The window procedure is explained 
  662. last, which wraps up your basic PM application.  To this basic skeleton many 
  663. frills can be added, and chapter six introduces a few of them. 
  664.  
  665. There are an incredible number of messages and defined constants in OS/2 PM 
  666. programming, and this book does a good job of listing and explaining the 
  667. important ones.  Occasionally, I felt that a bit more of an explanation was in 
  668. order; an explanation by way of a sample use is the easiest to understand. 
  669. Chapter six lists a lot of these, and it is a fairly big and hairy chapter to 
  670. get through.  Since anyone reading this chapter will be a first-time PM 
  671. programmer, I feel that pulling the constants and messages into a new chapter 
  672. seven, with lots of forward references to them, would be helpful to the 
  673. organization of the book.  Either that, or split the chapter into an 
  674. introductory and an intermediate fundamental window programming chapter.  The 
  675. reason I mention this is that I practically flew through the first five 
  676. chapters, but took the longest time to get through chapter six.  The sheer 
  677. amount of material and data in this chapter hinders learning a bit, I find.  I 
  678. also find the WM message section at the end of the chapter a little lacking in 
  679. readability.  Anyhow, onwards we go... 
  680.  
  681. By the wayside, I love the little "Gotcha!"  sections that explain and warn 
  682. about certain things.  I find that they really enhance the understanding of the 
  683. material, and add a little extra interest too. 
  684.  
  685. The next two chapters on dialog boxes and menus are both short and sweet. They 
  686. present the necessary information, and not much more.  Both ways of creating 
  687. and designing dialog boxes are explained, and all basic types of menus are 
  688. demonstrated.  Again, however, I found the message sections at the end of the 
  689. chapters a little hard to read, and it is hard to find what you want there, or 
  690. even to know what you are looking for.  A slightly different layout, and a few 
  691. more explanations of intended usage would probably go a long way towards 
  692. alleviating this. 
  693.  
  694. The next two chapters on list boxes and buttons are a little sparse.  Only the 
  695. resource file creation method is demonstrated, which doesn't satisfy all uses. 
  696. The examples are a little too simplistic; perhaps another one or two should be 
  697. added to each chapter.  For example, the listbox sample doesn't demonstrate how 
  698. to add items, delete items, and so on, and the button example doesn't 
  699. demonstrate how to do anything useful with the buttons; it only shows you what 
  700. the various styles look like.  On my screen (1024x768x256 svga with a modified 
  701. ibmdev32.dll) the information icon overflows the borders of the icon button a 
  702. bit.  I suppose that may be my fault for modifying ibmdev32.dll for the smaller 
  703. 32x32 icons, but I wonder if there is some logical way of fixing it, or 
  704. programming around it? 
  705.  
  706. The notebook and container chapters are both good, and pretty thorough. The 
  707. only thing I missed was a run-down on the BKA constants for notebook.  The 
  708. other constants are listed, why not these?  They are mentioned in the text, 
  709. however. 
  710.  
  711. Another little note here:  throughout the text there are little hints on style, 
  712. mainly following the CUA guidelines.  This is a great idea, since a lot of 
  713. books skip this.  It is not always intuitive which way of doing something will 
  714. yield the best results, and the people who designed the CUA guidelines have 
  715. spent a lot of time studying interfaces and so on.  In general, your 
  716. applications should follow the CUA guidelines quite closely, unless you have a 
  717. very specific reason for deviating from them.  This will insure that most 
  718. application can be learned quickly and easily.  On the other hand, who has the 
  719. time to find, get, and read the CUA documents?  The hints in this book help you 
  720. make the right decisions. 
  721.  
  722. In the spin-button chapter, code is finally given to create a control right in 
  723. the application instead of jumping to some dialog.  Unfortunately, I didn't 
  724. have the luxury of knowing my window size ahead of time like the example code 
  725. did, so I had to resort to other methods of calculating the spin-button 
  726. position for me program.  I tried to post a user-defined message to myself from 
  727. the WM_CREATE message handling as suggested in chapter six, but could not get 
  728. this to work.  No matter what I did, the WinQuerySysValue returned a size of 
  729. zero for the window.  It would have been good to see some real code to do this. 
  730. The rest of the functionality of the spin-button is well-explained, though. 
  731. The use of accelerator keys to jump from spin-button to spin-button is neat. 
  732.  
  733. A third note:  many of the programs supplied run badly when run from another 
  734. directory.  The slides programs are one example.  When run from the parent 
  735. directory, the ribbon-strip doesn't show up.  Giving an error would have been 
  736. preferable, I think.  I am not really sure why they act like this. Because of 
  737. the numerous directories for the sample programs, I was running the programs 
  738. from the parent directory until I realized that some of them didn't work when 
  739. run like this.  (Just in case this is a bug in the OS, I am running the 2.11 
  740. CSD for OS/2 2.1 GA.) 
  741.  
  742. The slider chapter has some neat thread and object-window examples, but I 
  743. missed an example on a non-read-only slider.  Considering that there are three 
  744. (!) sample programs for this chapter, I think there should be at least one on a 
  745. regular slider.  Apart from that, it is good. 
  746.  
  747. The standard file and font dialog chapter has a standard example of each type. 
  748. Perhaps it would have been nice with another tweaked example, but this will get 
  749. most people started. 
  750.  
  751. Subclassing windows is a very important topic for anyone interested in doing 
  752. things a little differently than the designers of OS/2 had envisioned. Most of 
  753. the controls have a very tightly defined standard behaviour which doesn't 
  754. always suit your needs.  Subclassing windows gives you the opportunity to keep 
  755. what behaviour you like, and modify what you don't.  As an example, look at 
  756. EPM.  It has extra buttons on the title for rotating through the files you have 
  757. loaded.  This was most likely accomplished through subclassing the titlebar 
  758. window.  Unfortunately, IBM designed EPM with slightly different button shading 
  759. depth for these buttons, so it looks a little odd, but it works in any case. 
  760. Subclassing requires that you write an alternate window procedure for the 
  761. window in interest to handle the different behaviour, and then pass the rest of 
  762. the messages on to the original window procedure.  This chapter explains this 
  763. concept well with a nice flow-chart.  I would have liked to see another, more 
  764. complicated example, but the one supplied does demonstrate the basics. 
  765.  
  766. The drag and drop chapter introduces what is probably a fairly alien concept to 
  767. most programmers.  We have likely all used it, but few of us realize what 
  768. really goes into programming this behaviour.  It is a little weird-alice, but 
  769. there are two examples to help us along.  Unfortunately, both examples have the 
  770. minimized icon behaviour disabled, so it is impossible to tell how much of what 
  771. was programmed will work on an icon, and how much won't. It would have been 
  772. informative to have at least one of these examples demonstrate this.  The 
  773. chapter otherwise does an excellent job of explaining what is a difficult 
  774. topic. 
  775.  
  776. The subject of help is one of my favorites.  Obviously, writing for this 
  777. magazine gives me a unique depth of knowledge of IPFC and the INF format 
  778. compared to normal programmers.  In addition to this, I have always been extra 
  779. pleased when I have used a program for which the author took the time to write 
  780. a really good help interface.  There is nothing more frustrating than looking 
  781. up the help for the control that is supposed to accomplish function X, but 
  782. which you are having trouble getting to work, and reading either "This control 
  783. does X", or "This is the help file.  This program does XYZ."  but no specific 
  784. help on what you are looking for.  The help is one of the most important 
  785. details, because it tells your user what to do when your best efforts at making 
  786. your application intuitive have failed.  The help chapter is one of the best in 
  787. the book.  It is well organized, and the example covers pretty well everything 
  788. that you need to know.  It is NOT a tutorial on how to make IPF documents, but 
  789. then the Toolkit covers that pretty well.  The example goes one step further 
  790. than is common in showing how to set up a chain of help through a message box, 
  791. and into the help document, if required.  It is good to see that this important 
  792. topic has recieved the full treatment it needs.  A lot of shareware programs 
  793. out there, and even some commercial programs (even some IBM programs, but I 
  794. won't mention that) have abysmal help facilities.  When evaluating a program, 
  795. if I run into a snag and the help facility is poor, then the program usually 
  796. goes the way of the dodo bird immediately.  I don't often feel like using Zen 
  797. to try to imagine what the "right way" of doing something is.  If the help 
  798. isn't helpful, it can seriously ruin the enjoyment of an otherwise good 
  799. program.  Lecture over.  By the way, this chapter's example program is another 
  800. that doesn't run from the parent directory.  This is understandable, since it 
  801. can't find the help file, but it should really give an error message instead of 
  802. just not working.  Luckily by this time I was accustomed to jumping into the 
  803. proper directory. 
  804.  
  805. The final chapter of the book is on Presentation Manager printing.  This is a 
  806. topic which I have traditionally skipped over lightly, partly because I don't 
  807. have a printer.  I use the printers at school whenever I need to print a 
  808. resume, or whatever.  A second reason is that I don't tend to write programs 
  809. which need to print, like most of us.  BUT, since it is the last chapter of an 
  810. otherwise enjoyable book, I decided to read it anyway.  As I have come to 
  811. expect by this time, the chapter is well written, covers the basics well, and 
  812. makes sure that when you do have questions which this book can't answer, you 
  813. are ready for a more advanced book anyway.  The example doesn't do much fancy 
  814. printing, but then that should probably be covered in a different type of 
  815. chapter anyway.  It does give a proper foundation in setting it all up, and 
  816. shows you the potential pitfalls to avoid. 
  817.  
  818. Well, that's the book.  Appendix A has references to all the standard reference 
  819. books you could want. 
  820.  
  821. /dev/EDM/BookReview - EDM/2 - July 1994 - Volume 2, Issue 7 
  822.  
  823.  
  824. ΓòÉΓòÉΓòÉ 4.4. Summary ΓòÉΓòÉΓòÉ
  825.  
  826. Summary 
  827.  
  828. Ever since I opened The Art of OS/2 2.1 C Programming  and started reading 
  829. through the chapters, I realized that this would become one of my favorite OS/2 
  830. programming books.  It is an easy read, but reasonably thorough in its coverage 
  831. of the basic issues.  It has humour, which you'll realize is important to me, 
  832. if you have been following my column at all.  It doesn't assume too much 
  833. knowledge from you, but it doesn't treat you like a dolt either.  I can 
  834. recommend this book with a clear conscience to anyone starting out in GUI and 
  835. OS/2 PM programming.  It needs a few additions, but is reasonably complete in 
  836. its current state.  Including a few introductory OS/2 chapters on basic 
  837. (non-PM) matters was a stroke of brilliance.  It isn't obvious at all how 
  838. important it is to include this until you read the book, and think "why isn't 
  839. this in my other books?".  Anyhow, enough evangelizing. 
  840.  
  841. I debated with myself for a long time about whether to give this book an A- or 
  842. a B+.  I finally decided that there were too many little niggling things which 
  843. I would like to see fixed to give it an A-, so B+ is what it got.  This book 
  844. obviously has very good potential though, and could easily be improved with a 
  845. revision. 
  846.  
  847. There are a few of suggestions I would like to make: 
  848.  
  849. o  This book really should support compilers other than just C-Set++.  I 
  850.   personally own Watcom C/C++ 9.5 (and soon 10.0), and had to use the makefile 
  851.   from Real World Programming for OS/2 2.1 to get the programs to compile.  I 
  852.   imagine Borland C++ owners (of which I am one, although I don't use it) and 
  853.   owners of other compilers have similar problems.  Similarly, the tools 
  854.   chapter only describes the OS/2 2.1 Toolkit.  Watcom C/C++ uses the Toolkit, 
  855.   but Borland C++ has its own tools, so Borland C++ programmers are left out in 
  856.   the cold a bit.  And what about EMX?  Ideally, the book should support IBM 
  857.   C-Set++ (both FirstStep and the full-blown version; they should be the same), 
  858.   Watcom C/C++ 9.5 and 10.0, Borland C++ 1.0 and 1.5, EMX, and Symantec's C++ 
  859.   compiler, maybe even MetaWare's High C++ (is that the right name?)  and 
  860.   MicroWay's C++ compiler.  At the very least, C-Set++, Watcom C/C++, Borland 
  861.   C++, and GNU makefiles should be covered.  We can't all afford C-Set++ :) 
  862. o The diagrams in the book are a little cheap-looking, considering that we are 
  863.   dealing with a tour-de-force in graphical environments, OS/2 2.1.  That is 
  864.   probably the luck of the draw when you are a new author, though.  Hopefully 
  865.   this will be alleviated in the next edition. 
  866. o The sample programs really need a graphical installation program.  I was 
  867.   unlucky, and got a pseudo-bad disk, and only after much fiddling was I able 
  868.   to install and unpack all the samples.  The disk wouldn't be the authors' 
  869.   fault, but the installation procedure is. 
  870. o Chapters on SOM, WPS, GPI, interfacing with REXX, DLLs, bitmaps, colour 
  871.   palettes, and perhaps an intro to C++ should be added.  I have been 
  872.   considering recommending an introductory VIO chapter, but I am not sure 
  873.   whether that is a good idea, since VIO is old hat.  On the other hand, VIO 
  874.   programs certainly do fill a niche.  A chapter should be added with loose 
  875.   ends like WinMessageBox(). 
  876. o The index needs beefing up too, roughly doubling should do.  One can't always 
  877.   know the thing one is looking for by name, and there are very few keyword 
  878.   topics in the index. 
  879. o More depth is needed in control window creation and manipulation, like sizing 
  880.   them upon window creation when you don't know what size your window will be, 
  881.   resizing list boxes on the fly and so on.  A lot of the example code is 
  882.   dialog template based, and there aren't a lot of examples on how to create 
  883.   and manipulate the various windows right in your application.  When I had to 
  884.   do this, I found it helpful to peek in another one of my books. 
  885.  
  886. Note that I am nit-picking here.  These are more after-thoughts than things I 
  887. really missed when I went through the first time, except for the window 
  888. creation and manipulation stuff.  Consider this "polishing" what in many ways 
  889. is a great book. 
  890.  
  891. I have been told that there is a revision on the way, with more in-depth 
  892. coverage, and new chapters on key subjects, but that's all I know so far.  If 
  893. the stuff is added I mentioned above, this book should easily qualify for an A, 
  894. maybe even an A+.  Of course, if everything I mentioned was added, then the 
  895. book would probably be more of a beginning and intermediate programmer book, 
  896. and it would be much larger too :) 
  897.  
  898. /dev/EDM/BookReview - EDM/2 - July 1994 - Volume 2, Issue 7 
  899.  
  900.  
  901. ΓòÉΓòÉΓòÉ 4.5. Books Reviewed ΓòÉΓòÉΓòÉ
  902.  
  903. Books Reviewed 
  904.  
  905. This table contains all books I have reviewed, so that you can find what you 
  906. are looking for at a glance.  I will be careful to rate books fairly.  If I 
  907. feel a need to adjust ratings, I will adjust all of them at the same time, and 
  908. write a note explaining why I felt this necessary.  Please note that books 
  909. aimed at different audiences should only be compared with great care, if at 
  910. all.  I intend to concentrate on the strong points of the books I review, but I 
  911. will point out any weaknesses in a constructive manner. 
  912.  
  913. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  914. ΓöéBOOK                                ΓöéAUDIENCE    ΓöéMARKΓöéCOMMENTS                                         Γöé
  915. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  916. ΓöéReal-World Programming for OS/2 2.1,ΓöéIntermediateΓöéB+  ΓöéLots of good code examples, but sometimes it is  Γöé
  917. ΓöéBlain, Delimon, and English, SAMS   Γöéto Advanced Γöé    Γöétoo complex for novices. Accurate.  Well         Γöé
  918. ΓöéPublishing. ISBN 0-672-30300-0.     ΓöéPM C        Γöé    Γöéorganized.  The index needs a little beefing up. Γöé
  919. ΓöéUS$40, CAN$50.                      Γöéprogrammers Γöé    ΓöéGood, but not entirely complete how-to reference.Γöé
  920. Γöé                                    Γöé            Γöé    ΓöéGood purchase.                                   Γöé
  921. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  922. ΓöéLearning to Program OS/2 2.0        ΓöéBeginning PMΓöéB-  ΓöéThis book can be both frustrating and very       Γöé
  923. ΓöéPresentation Manager by Example,    ΓöéC           Γöé    Γöérewarding.  It is not very large, and a bit      Γöé
  924. ΓöéKnight, Van Nostrand Reinhold. ISBN ΓöéProgrammers Γöé    Γöépricey, but has some excellent chapters on       Γöé
  925. Γöé0-442-01292-6. US$40, CAN$50.       Γöé            Γöé    Γöécertain beginning topics, such as messages,      Γöé
  926. Γöé                                    Γöé            Γöé    Γöéresources, IPF, and dialog boxes.  Strictly for  Γöé
  927. Γöé                                    Γöé            Γöé    Γöébeginners.  This book has only one (large) sampleΓöé
  928. Γöé                                    Γöé            Γöé    Γöéprogram!                                         Γöé
  929. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  930. ΓöéWriting OS/2 2.1 Device Drivers in  ΓöéAdvanced C  ΓöéA-  ΓöéThe only thing a device driver programmer would  Γöé
  931. ΓöéC, 2nd Edition, Mastrianni, Van     ΓöéProgrammers,Γöé    Γöénot find in here is how to write SCSI, ADD, and  Γöé
  932. ΓöéNostrand Reinhold. ISBN             Γöéfamiliar    Γöé    ΓöéIFS drivers.  Most everything else is in here,   Γöé
  933. Γöé0-442-01729-4. US$35, CAN$45.       Γöéwith        Γöé    Γöéalong with skeleton examples.  An optional DevHlpΓöé
  934. Γöé                                    Γöéhardware    Γöé    Γöélibrary of C-callable functions can be purchased Γöé
  935. Γöé                                    Γöéprogramming Γöé    Γöéby those who don't have time to write their own. Γöé
  936. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  937. ΓöéOS/2 Presentation Manager GPI, Winn,ΓöéIntermediateΓöéC+  ΓöéThis book needs updating for OS/2 2.x.  It is a  Γöé
  938. ΓöéVan Nostrand Reinhold. ISBN         Γöéto advanced Γöé    Γöéwell-written in-depth coverage of the OS/2 way ofΓöé
  939. Γöé0-442-00739-6. US$35, CAN$45.       ΓöéPM C        Γöé    Γöéprogramming for graphics.  It is not an          Γöé
  940. Γöé                                    Γöéprogrammers Γöé    Γöéintroductory PM or graphics programming book.    Γöé
  941. Γöé                                    Γöé            Γöé    ΓöéYou should know the basics of PM programming     Γöé
  942. Γöé                                    Γöé            Γöé    Γöéalready.                                         Γöé
  943. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  944. ΓöéThe Art of OS/2 2.1 C Programming,  ΓöéBeginning   ΓöéB+  ΓöéThis is a great introductory PM programming book.Γöé
  945. ΓöéPanov, Salomon, and Panov,          ΓöéOS/2 and PM Γöé    ΓöéIt covers basic OS/2 issues like threads before  Γöé
  946. ΓöéWiley-QED. ISBN 0-471-58802-4.      Γöéprogrammers Γöé    Γöéit jumps into PM programming.  The coverage is   Γöé
  947. ΓöéUS$40, CAN$50.                      Γöé            Γöé    Γöéquite thourough, with just enough reference      Γöé
  948. Γöé                                    Γöé            Γöé    Γöématerial to make it useful after you read it     Γöé
  949. Γöé                                    Γöé            Γöé    Γöéthrough the first time.  The upcoming revised    Γöé
  950. Γöé                                    Γöé            Γöé    Γöéedition should be a killer.                      Γöé
  951. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  952.  
  953. LEGEND: 
  954.  
  955. BOOK:  The name of the book, author(s), publishing company, ISBN, and 
  956. approximate price. 
  957.  
  958. AUDIENCE:  This is a description of the audience I think the book targets best. 
  959. This is not intended as gospel, just a guideline for people not familiar with 
  960. the book. 
  961.  
  962. MARK:  My opinion of the success of the book's presentation, and how well it 
  963. targets its audience.  Technical content, accuracy, organization, readability, 
  964. and quality of index all weigh heavily here, but the single most important item 
  965. is how well the book covers what it says it covers. 
  966.  
  967. ΓöîΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  968. ΓöéA+ ΓöéGround-breaking, all-around outstanding book                                 Γöé
  969. Γö£ΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  970. ΓöéA  ΓöéExcellent book. This is what I want to see happen a lot                      Γöé
  971. Γö£ΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  972. ΓöéA- ΓöéExcellent book with minor flaws                                              Γöé
  973. Γö£ΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  974. ΓöéB+ ΓöéVery good book with minor flaws or omissions                                 Γöé
  975. Γö£ΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  976. ΓöéB  ΓöéGood book with some flaws and omissions                                      Γöé
  977. Γö£ΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  978. ΓöéB- ΓöéGood book, but in need of improvement                                        Γöé
  979. Γö£ΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  980. ΓöéC+ ΓöéMediocre book with some potential, but in need of some updating              Γöé
  981. Γö£ΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  982. ΓöéC  ΓöéMediocre book with some good sections, but badly in need of fixing           Γöé
  983. Γö£ΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  984. ΓöéC- ΓöéMediocre book, little good material, desperately in need of an overhaul      Γöé
  985. Γö£ΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  986. ΓöéD  ΓöéDon't buy this book unless you need it, and nothing else exists              Γöé
  987. Γö£ΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  988. ΓöéF  ΓöéDon't buy this book. Period                                                  Γöé
  989. ΓööΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  990.  
  991. COMMENTS:  This is a very brief summary of the review proper. 
  992.  
  993. /dev/EDM/BookReview - EDM/2 - July 1994 - Volume 2, Issue 7 
  994.  
  995.  
  996. ΓòÉΓòÉΓòÉ 4.6. Coming Up ΓòÉΓòÉΓòÉ
  997.  
  998. Coming Up 
  999.  
  1000. Next month I will be looking at Mastering OS/2 REXX, Gargiulo. The books I 
  1001. intend to review are (not necessarily in this order): 
  1002.  
  1003. o Mastering OS/2 REXX, Gargiulo 
  1004. o Application Development Using OS/2 REXX, Rudd 
  1005. o OS/2 Presentation Manager Programming, Petzold - 1994 - not yet published. 
  1006. o The Design of OS/2, 2nd Edititon, Kogan and Deitel - 1994 - not published yet 
  1007.  
  1008. I am considering reviewing the IBM OS/2 Redbooks, since they are readily and 
  1009. cheaply available, and look like good reference. 
  1010.  
  1011. I am also considering reviewing Designing OS/2 Applications, Reich, mostly 
  1012. because it promises to present a different angle on OS/2 programming, namely 
  1013. that of how to design OS/2 applications, rather than how to program OS/2 
  1014. applications. 
  1015.  
  1016. Finally, I am considering reviewing OS/2 Unleashed, but it is not strictly 
  1017. speaking a development book, so I'm going to wait until the list of real 
  1018. development books has diminished a bit.  By the way, does anyone know why the 
  1019. special edition of OS/2 Unleashed  has different authors? And what is different 
  1020. about the Special Edition? 
  1021.  
  1022. If anyone has a book they want to see reviewed, I will be happy to oblige as 
  1023. long as I can afford it.  Of course, requests can be satisfied quicker when 
  1024. accompanied by a book :)  Publishers can send me books at the address on my 
  1025. personal page at the end of the magazine, and I will review all OS/2 
  1026. development-related and advanced user books I receive. 
  1027.  
  1028. /dev/EDM/BookReview - EDM/2 - July 1994 - Volume 2, Issue 7 
  1029.  
  1030.  
  1031. ΓòÉΓòÉΓòÉ 5. C++ Corner ΓòÉΓòÉΓòÉ
  1032.  
  1033.  
  1034. ΓòÉΓòÉΓòÉ 5.1. Introduction ΓòÉΓòÉΓòÉ
  1035.  
  1036. C++ Corner 
  1037.  
  1038. Written by Gordon Zeglinski 
  1039.  
  1040. Introduction 
  1041.  
  1042. Profile Files (aka INI files) are used in most OS/2 applications.  In this 
  1043. issue, we will look at the profile API and then encapsulate it with in a group 
  1044. of C++ classes. 
  1045.  
  1046. C++ Corner - EDM/2 - July 1994 - Volume 2, Issue 7 
  1047.  
  1048.  
  1049. ΓòÉΓòÉΓòÉ 5.2. The Profile API ΓòÉΓòÉΓòÉ
  1050.  
  1051. The Profile API 
  1052.  
  1053. In this section, we will look at the functions in the profile API that will be 
  1054. used to create the C++ classes. 
  1055.  
  1056. Opening the File 
  1057.  
  1058. Before we can read or write to our own profile files, we must open the profile 
  1059. file.  The PrfOpenProfile() function returns a handle to the opened profile 
  1060. file, and takes an anchor block handle and file name as arguments.  The 
  1061. function prototype follows: 
  1062.  
  1063. HINI PrfOpenProfile(HAB hab,PSZ ProfileName)
  1064.  
  1065. Closing the File 
  1066.  
  1067. Of course, we should close any INI file we open.  The handle returned by 
  1068. PrfOpenProfile() is this function's only argument. 
  1069.  
  1070. BOOL PrfCloseProfile(HINI hini)
  1071.  
  1072. Profile File Structure 
  1073.  
  1074. Now that we can open and close profile files, we need to write and read from 
  1075. them.  Before we can proceed, however, we will look at how profile files are 
  1076. organized.  Data is stored by an application name and key name.  Both the 
  1077. application and key names are strings.  One can conceptually think of the file 
  1078. structure as follows: 
  1079.  
  1080. ΓòöΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòù
  1081. ΓòæApplication 1Γòæ
  1082. ΓòÜΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓò¥
  1083.    ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1084.    ΓöéKey 1Γöé
  1085.    ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1086.       Data 1
  1087.    ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1088.    Γöékey 2Γöé
  1089.    ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1090.       Data 2
  1091.  
  1092. ΓòöΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòù
  1093. ΓòæApplication 2Γòæ
  1094. ΓòÜΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓò¥
  1095.    ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1096.    ΓöéKey 1Γöé
  1097.    ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1098.       Data 1
  1099.  
  1100. Keys within a given application must be unique, but they do not have to be 
  1101. unique within the profile file.  Application strings must be unique within the 
  1102. profile file. 
  1103.  
  1104. Writing Data 
  1105.  
  1106. Data can be written to the profile file using either of the following 
  1107. functions: 
  1108.  
  1109. BOOL PrfWriteProfileData(HINI hini,
  1110.                          PSZ pszApp,
  1111.                          PSZ pszKey,
  1112.                          PVOID pData,
  1113.                          ULONG cchDataLen);
  1114. BOOL PrfWriteProfileString(HINI hini,
  1115.                            PSZ pszApp,
  1116.                            PSZ pszKey,
  1117.                            PSZ pszData);
  1118.  
  1119. The pData parameter in PrfWriteProfileData() is the address of the data to be 
  1120. written while cchDataLen is the length of the data.  This function can be used 
  1121. to write binary data to the profile file, while the PrfWriteProfileString() 
  1122. function writes a NULL terminated string only. 
  1123.  
  1124. Reading Data 
  1125.  
  1126. The profile file API provides three functions which can be used to read in data 
  1127. from the application/key pair.  Two of these functions are just the inverse of 
  1128. the two read functions, while the third function converts a number stored as a 
  1129. string into an integer.  Finally, there is a function which returns the length 
  1130. of the data stored under an application/key pair.  The prototypes for these 
  1131. functions follow: 
  1132.  
  1133. BOOL PrfQueryProfileData(HINI hini,
  1134.                          PSZ pszApp,
  1135.                          PSZ pszKey,
  1136.                          PVOID pBuffer,
  1137.                          PULONG pulBufferMax);
  1138. ULONG PrfQueryProfileString(HINI hini,
  1139.                             PSZ pszApp,
  1140.                             PSZ pszKey,
  1141.                             PSZ pszDefault,
  1142.                             PVOID pBuffer,
  1143.                             ULONG cchBufferMax);
  1144. LONG PrfQueryProfileInt(HINI hini,
  1145.                         PSZ pszApp,
  1146.                         PSZ pszKey,
  1147.                         LONG lDefault);
  1148. BOOL PrfQueryProfileSize(HINI hini,
  1149.                          PSZ pszApp,
  1150.                          PSZ pszKey,
  1151.                          PULONG pDataLen);
  1152.  
  1153. The functions PrfQueryProfileSize() and PrfQueryProfileData() can be used to 
  1154. enumerate the application and key values (see the PM Reference for details). 
  1155. The functions PrfQueryProfileString() and PrfQueryProfileInt() allow the 
  1156. programmer to specify default values.  This is very handy when the application 
  1157. is executed for the first time and its profile information may not be present. 
  1158.  
  1159. C++ Corner - EDM/2 - July 1994 - Volume 2, Issue 7 
  1160.  
  1161.  
  1162. ΓòÉΓòÉΓòÉ 5.3. Encapsulating The Profile API ΓòÉΓòÉΓòÉ
  1163.  
  1164. Encapsulating The Profile API 
  1165.  
  1166. As with all first attempts at encapsulation, we will wrap the profile API 
  1167. loosely with a C++ class.  To do this, we will have have member functions for 
  1168. reading and writing data, and data members to store the profile file's name and 
  1169. handle.  Following is the class definition for the base ProfileFile class: 
  1170.  
  1171. class ProfileFile {
  1172.    APIRET Error;
  1173.    HINI hini;
  1174.    HAB hab;
  1175.    PSZ FileName;
  1176.    char Close;
  1177.  
  1178. public:
  1179.    ProfileFile(PSZ name,HAB hb);
  1180.    ProfileFile(HINI H);
  1181.    ~ProfileFile();
  1182.  
  1183.    APIRET GetError() { return Error; }
  1184.    HINI GetHandle() { return hini; }
  1185.  
  1186.    void WriteString(PSZ App,PSZ Key,PSZ String);
  1187.    void WriteData(PSZ App,PSZ Key,void * Buff,ULONG BLen);
  1188.    ULONG GetDataSize(PSZ App,PSZ Key);
  1189.    void GetData(PSZ App,PSZ Key,void * Buff,ULONG & BufMax);
  1190.    ULONG GetString(PSZ App,PSZ Key,PSZ Buff,ULONG BufMax,PSZ DefArg=NULL);
  1191.    LONG GetInt(PSZ App,PSZ Key,LONG DefArg=0);
  1192.    void WriteInt(PSZ App,PSZ Key,LONG Num);
  1193.    PRFPROFILE Querry();
  1194. };
  1195.  
  1196. You will notice that each of the API functions we looked at has a corresponding 
  1197. member function.  In addition, we added a function to write an integer that can 
  1198. be read later by the GetInt member function. 
  1199.  
  1200. The system and user INI files, have predefined handles.  We will subclass 
  1201. ProfileFile to allow us to use the same encapsulation method on the system and 
  1202. user INI files.  Following are the definitions of these two classes: 
  1203.  
  1204. class UserProfile:public ProfileFile {
  1205. public:
  1206.    UserProfile():ProfileFile(HINI_USERPROFILE) { }
  1207. };
  1208.  
  1209. class SystemProfile:public ProfileFile{
  1210. public:
  1211.    SystemProfile():ProfileFile(HINI_SYSTEMPROFILE) { }
  1212. };
  1213.  
  1214. The use of these classes is pretty straight forward.  The following sample code 
  1215. will show some of the basics. 
  1216.  
  1217. void main() {
  1218.    ProfileFile AppINI("APP.INI");   // open an application ini file (app.ini)
  1219.    UserProfile UserINI;             // open the user ini file (os2.ini)
  1220.  
  1221.    char SomeString[30];
  1222.  
  1223.    AppINI.GetString("Application","Key",SomeString,29,"Default String");
  1224.  
  1225.    UserINI.WriteString("Application","Key",SomeString);
  1226.  
  1227. }
  1228.  
  1229. The above program opens the file "APP.INI", then attempts to read a string from 
  1230. this file.  If the application/key pair is not present, SomeString will contain 
  1231. the value "Default String" on return from GetString.  SomeString is then 
  1232. written to the user INI file under the application/key pair 
  1233. "Application"/"Key". 
  1234.  
  1235. The files INIFLOBJ.H and INIFLOBJ.CPP contain the source code necessary to 
  1236. compile the profile classes. 
  1237.  
  1238. C++ Corner - EDM/2 - July 1994 - Volume 2, Issue 7 
  1239.  
  1240.  
  1241. ΓòÉΓòÉΓòÉ 5.4. Summary ΓòÉΓòÉΓòÉ
  1242.  
  1243. Summary 
  1244.  
  1245. In this issue, we have examined the profile file API and encapsulated it. You 
  1246. should now be able to use profile files in your application. 
  1247.  
  1248. C++ Corner - EDM/2 - July 1994 - Volume 2, Issue 7 
  1249.  
  1250.  
  1251. ΓòÉΓòÉΓòÉ 6. Introduction to PM Programming ΓòÉΓòÉΓòÉ
  1252.  
  1253.  
  1254. ΓòÉΓòÉΓòÉ 6.1. Introduction ΓòÉΓòÉΓòÉ
  1255.  
  1256. Introduction to PM Programming 
  1257.  
  1258. Written by Larry Salomon, Jr. 
  1259.  
  1260. Introduction 
  1261.  
  1262. The purpose of this column is to provide the readers out there who are not 
  1263. familiar with PM application development the information necessary to satisfy 
  1264. their curiousity, educate themselves, and give them an advantage over the 
  1265. documentation supplied by IBM.  Of course, much of this stuff could probably be 
  1266. found in one of the many books out there, but the problem with books in general 
  1267. is that they don't answer the questions you have after you read the book the 
  1268. first time through. 
  1269.  
  1270. I will gladly entertain feedback from the readers about what was "glossed over" 
  1271. or what was detailed well, what tangential topics need to be covered and what 
  1272. superfluous crap should have been removed.  This feedback is essential in 
  1273. guaranteeing that you get what you pay for.  :) 
  1274.  
  1275. It should be said that you must not depend solely on this column to teach you 
  1276. how to develop PM applications; instead, this should be viewed as a supplement 
  1277. to your other information storehouses (books, the network conferences, etc.). 
  1278. Because this column must take a general approach, there will be some topics 
  1279. that you would like to see discussed that really do not belong here.  Specific 
  1280. questions can be directed to the Scratch Patch, where an attempt to answer them 
  1281. will be made. 
  1282.  
  1283. Last Month 
  1284.  
  1285. Last month, we finished the WC_ENTRYFIELD window class.  This month, we begin 
  1286. looking at the WC_LISTBOX window class, how it is used, what its limitations 
  1287. are, and some of the messages associated with it. 
  1288.  
  1289. Introduction to PM Programming - EDM/2 - July 1994 - Volume 2, Issue 7 
  1290.  
  1291.  
  1292. ΓòÉΓòÉΓòÉ 6.2. Listboxes ΓòÉΓòÉΓòÉ
  1293.  
  1294. Listboxes 
  1295.  
  1296. So what is a listbox anyway?  A listbox is, as you probably well know, a 
  1297. collection of items.  While originally intended for text only, ownerdraw 
  1298. listboxes allow you to place graphics, multicolored text, or whatever as long 
  1299. as you can code it.  When the listbox was originally introduced in OS/2 1.1, it 
  1300. allowed for single and multiple selection only; the former deselected any 
  1301. currently selected item whenever a new one was selected by the user or the 
  1302. application, while the latter allowed for one or more items to be selected at 
  1303. any one time.  When OS/2 2.0 was released, a third selection style - extended 
  1304. selection - was added which differed from multiple selection in that it was CUA 
  1305. in design (multiple selection was not). 
  1306.  
  1307. To aid in the somewhat object-oriented design, listbox items can have 
  1308. associated with them handles, which are nothing more than a ULONG that is 
  1309. unique to a particular item.  This ULONG is typically used to point to a data 
  1310. structure which contains information about the item, e.g.  printer information 
  1311. associated with a name which is displayed.  When the user selects the printer 
  1312. name, the application can get the rest of the information needed to open the 
  1313. printer device by checking the handle and following the pointer there. 
  1314.  
  1315. Unfortunately, the designers of the listbox were constrained to the heaps that 
  1316. were provided by PM for their memory allocation and heaps were limited to 64K 
  1317. in size, so the listbox must contain all of its housekeeping data in 64K.  The 
  1318. number of items that this maps to varies, based on the total length of the item 
  1319. text, but you typically cannot get more than 32K of items (and that much only 
  1320. if you are lucky) in a single listbox.  To get around this limitation, you must 
  1321. use the container control or read the article series in the OS/2 Developer 
  1322. beginning with the January/February issue which develops a replacement class 
  1323. for the listbox. 
  1324.  
  1325. Introduction to PM Programming - EDM/2 - July 1994 - Volume 2, Issue 7 
  1326.  
  1327.  
  1328. ΓòÉΓòÉΓòÉ 6.3. Messages ΓòÉΓòÉΓòÉ
  1329.  
  1330. Messages 
  1331.  
  1332. Let's take a look at the more commonly used messages. 
  1333.  
  1334. LM_INSERTITEM 
  1335.  
  1336. This message is sent to insert an item into a listbox. 
  1337.  
  1338. Parameters 
  1339.  
  1340.    param1 
  1341.  
  1342.       usIndex (USHORT) 
  1343.  
  1344.          the index where the item is to be inserted.  If LIT_END, the item is 
  1345.          inserted at the end of the list.  If LIT_SORTASCENDING or 
  1346.          LIT_SORTDESCENDING, the item is inserted in the appropriately sorted 
  1347.          order. 
  1348.  
  1349.    param2 
  1350.  
  1351.       pchText (PCHAR) 
  1352.  
  1353.          pointer to the string to be inserted. 
  1354.  
  1355. Returns 
  1356.  
  1357.    reply 
  1358.  
  1359.       lIndex (LONG) 
  1360.  
  1361.          LIT_ERROR an error occurred. 
  1362.          index     0-based index of inserted item 
  1363.  
  1364. LM_QUERYSELECTION 
  1365.  
  1366. This message is sent to query the index of the selected item. 
  1367.  
  1368. Parameters 
  1369.  
  1370.    param1 
  1371.  
  1372.       ulReserved (ULONG) 
  1373.  
  1374.          Reserved, 0. 
  1375.  
  1376.    param2 
  1377.  
  1378.       ulReserved (ULONG) 
  1379.  
  1380.          Reserved, 0. 
  1381.  
  1382. Returns 
  1383.  
  1384.    reply 
  1385.  
  1386.       lIndex (LONG) 
  1387.  
  1388.          LIT_NONE  no item is selected 
  1389.          index     0-based index of inserted item 
  1390.  
  1391. LM_SETSELECTION 
  1392.  
  1393. This message is sent to set the selected state of an item. 
  1394.  
  1395. Parameters 
  1396.  
  1397.    param1 
  1398.  
  1399.       lIndex (LONG) 
  1400.  
  1401.          0-based index of the item whose selection state is to change 
  1402.  
  1403.    param2 
  1404.  
  1405.       bSelect (BOOL) 
  1406.  
  1407.          TRUE      the item is to be selected 
  1408.          FALSE     the item is to be unselected 
  1409.  
  1410. Returns 
  1411.  
  1412.    reply 
  1413.  
  1414.       bSuccess (BOOL) 
  1415.  
  1416.          TRUE      successful completion 
  1417.          FALSE     an error occurred 
  1418.  
  1419. LM_SETITEMHANDLE 
  1420.  
  1421. This message is sent to set the handle for an item. 
  1422.  
  1423. Parameters 
  1424.  
  1425.    param1 
  1426.  
  1427.       lIndex (LONG) 
  1428.  
  1429.          0-based index of the item whose handle is to be set. 
  1430.  
  1431.    param2 
  1432.  
  1433.       ulHandle (ULONG) 
  1434.  
  1435.          handle to be associated with this item. 
  1436.  
  1437. Returns 
  1438.  
  1439.    reply 
  1440.  
  1441.       bSuccess (BOOL) 
  1442.  
  1443.          TRUE      successful completion 
  1444.          FALSE     an error occurred 
  1445.  
  1446. LM_QUERYITEMHANDLE 
  1447.  
  1448. This message is sent to return the handle associated with an item. 
  1449.  
  1450. Parameters 
  1451.  
  1452.    param1 
  1453.  
  1454.       lIndex (LONG) 
  1455.  
  1456.          0-based index of the item whose handle is to be set. 
  1457.  
  1458.    param2 
  1459.  
  1460.       ulReserved (ULONG) 
  1461.  
  1462.          Reserved, 0. 
  1463.  
  1464. Returns 
  1465.  
  1466.    reply 
  1467.  
  1468.       ulHandle (ULONG) 
  1469.  
  1470.          LIT_ERROR an error occurred 
  1471.          handle    handle of the specified item. 
  1472.  
  1473. These should be fairly trivial to use, since the concepts behind them are not 
  1474. the difficult to understand.  Next month, we'll continue with the remaining 
  1475. messages and will begin to look at the rest of nameDlgProc(). 
  1476.  
  1477. Introduction to PM Programming - EDM/2 - July 1994 - Volume 2, Issue 7 
  1478.  
  1479.  
  1480. ΓòÉΓòÉΓòÉ 7. Scratch Patch ΓòÉΓòÉΓòÉ
  1481.  
  1482.  
  1483. ΓòÉΓòÉΓòÉ 7.1. Introduction ΓòÉΓòÉΓòÉ
  1484.  
  1485. Scratch Patch 
  1486.  
  1487. Written by Larry Salomon, Jr. 
  1488.  
  1489. Introduction 
  1490.  
  1491. Welcome to this month's "Scratch Patch"!  Each month, I collect various items 
  1492. that fit into this column sent to me via email. The ones that I feel contribute 
  1493. the most to developers, whether in terms of information or as a nifty trick to 
  1494. tuck into your cap, get published in this column. 
  1495.  
  1496. To submit an item, send it via email to my address - os2man@panix.com - and be 
  1497. sure to grant permission to publish it (those that forget will not be 
  1498. considered for publication). 
  1499.  
  1500. Scratch Patch - EDM/2 - July 1994 - Volume 2, Issue 7 
  1501.  
  1502.  
  1503. ΓòÉΓòÉΓòÉ 7.2. Questions and Answers ΓòÉΓòÉΓòÉ
  1504.  
  1505. Questions and Answers 
  1506.  
  1507. Carsten Haerle (Carsten_Haerle@ms.maus.de) writes: 
  1508.  
  1509. I have a simple but interesting question concerning the help menu in PM 
  1510. applications.  I searched for hours and days but I didn't find the answer to 
  1511. it.  Even all the documentation in the toolkit, the developers connection and 
  1512. the DAP library volume didn't give me an answer, or they are even inconsistent. 
  1513. I think an answer would be of high value to all PM app developers so it would 
  1514. be a good idea to publish in EDM/2 (if someone finds an answer to it). 
  1515.  
  1516. Now for the question(s). 
  1517.  
  1518.  1. What is the correct resource definition of the 'Help' menu.  In some 
  1519.     documentation I read there should be an MIS_HELP flag, some didn't set the 
  1520.     flag.  The same with MIS_SYSCOMMAND for the help menu items (and using menu 
  1521.     id such as SC_HELPFORHELP).  I suppose that question 2) is probably solved 
  1522.     by the Help Manager if one has the correct help menu definition. 
  1523.  2. What is the definition and code for the help menu to use OS/2 standard help 
  1524.     texts for e.g.  'Using Help'.  In addition OS/2 has standard help text 
  1525.     items for the explanation of the help menu items, i.e.  if you go on the 
  1526.     'Using Help' menu and press F1.  I manually discovered that displaying 
  1527.     these help panels can be accomplished by sending the Help Manager the 
  1528.     following help panel numbers, but I wonder where they are documented: 
  1529.  
  1530.     Help for menu items: 
  1531.  
  1532.    o 'Help Index' - 64026 
  1533.    o 'General Help' - 64024 
  1534.    o 'Using Help' - 64023 
  1535.    o 'Keys Help' - 64025 
  1536.    o 'Help' menu itself - 64022 
  1537.  
  1538. To answer your first question, there is no correct way.  If you use the 
  1539. MIS_HELP flag, you have to intercept the WM_HELP message just like you would 
  1540. have to intercept the WM_COMMAND message without the MIS_HELP flag.  For 
  1541. consistency, I usually omit the flag.  What you do with the items is fairly 
  1542. standard (this answers your second question): 
  1543.  
  1544. o For "Help Index", send the Help Manager an HM_HELP_INDEX message. 
  1545.  
  1546. o For "General Help", send it an HM_EXT_HELP message. 
  1547.  
  1548. o For "Using Help", send it an HM_DISPLAY_HELP message with the two parameters 
  1549.   set to 0. 
  1550.  
  1551. o For "Keys Help", send it an HM_KEYS_HELP message, to which it will respond by 
  1552.   sending you an HM_QUERY_KEYS_HELP message.  The proper reply is to send the 
  1553.   resource id of the keys help panel. 
  1554.  
  1555. Scratch Patch - EDM/2 - July 1994 - Volume 2, Issue 7 
  1556.  
  1557.  
  1558. ΓòÉΓòÉΓòÉ 7.3. Snippet(s) of the Month ΓòÉΓòÉΓòÉ
  1559.  
  1560. Snippet(s) of the Month 
  1561.  
  1562. John Bijnens (jbijnens@kihl.be) writes: 
  1563.  
  1564. A week ago I asked you if there was an OS/2 equivalent for errno and 
  1565. sys_errlist[].  You answered me no then.  I've found now that it is possible to 
  1566. get the message string that belongs to an error number.  The file OSO001.MSG 
  1567. that can be found in the directory \OS2\SYSTEM contains all the error messages. 
  1568. By using the function DosGetMessage you can get the text string that goes with 
  1569. a certain error number.  So if you now have an error returned by DosRead() (for 
  1570. example) you can get the corresponding text string. 
  1571.  
  1572. I've included a small source listing below.  You're free to do with it what you 
  1573. like.  Perhaps it is of use for someone. 
  1574.  
  1575. [Editor's note - the source is in the file DOSERROR.C] 
  1576.  
  1577. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  1578.  
  1579. Klaus Johannes Rusch (k.rusch@ieee.org) writes: 
  1580.  
  1581. One of the deficiencies of the REXX language is the limitation to one return 
  1582. value.  While external data queues and files are possible means of 
  1583. communication, the code snippet below offers superior performance and 
  1584. usability. 
  1585.  
  1586. This also proves useful when writing structured data of arbitrary length and 
  1587. contents to a file.  (Admittedly, this was the author's first use of the 
  1588. Return() and ParseReturned() functions.) 
  1589.  
  1590. Return:
  1591.   Return '|' || C2X(ARG(1));
  1592.  
  1593. ParseReturned:
  1594.   Return X2C(SUBSTR(ARG(1), 2));
  1595.  
  1596. The following example shows how to use these functions to return multiple 
  1597. values of arbitrary length and content: 
  1598.  
  1599. /* REXX */
  1600. Parse Value MyProc(parms) With r1 r2 r3;
  1601. r1 = ParseReturned(r1);
  1602. r2 = ParseReturned(r2);
  1603. r3 = ParseReturned(r3);
  1604. /* : */
  1605. Exit 0;
  1606.  
  1607. MyProc: Procedure;
  1608.  Parse Arg parms;
  1609.  /* : */
  1610.  Return Return(r1) Return(r2) Return(r3);
  1611.  
  1612. [Editor's note - the source is in the file RETSAMP.CMD] 
  1613.  
  1614. Scratch Patch - EDM/2 - July 1994 - Volume 2, Issue 7 
  1615.  
  1616.  
  1617. ΓòÉΓòÉΓòÉ 7.4. Want Ads ΓòÉΓòÉΓòÉ
  1618.  
  1619. Want Ads 
  1620.  
  1621. Below are the hot topics as of this issue's writing.  Feel free to write on any 
  1622. of these. 
  1623.  
  1624. Workplace Shell Programming (hot) - this is still quite the "black magic" 
  1625. topic, about which we have seen only one article.  There are many out there who 
  1626. do WPS programming for a living, but they have not been sufficiently 
  1627. enlightened about our need. :) 
  1628.  
  1629. Client/Server (hot) - using either named pipes (with or without a network) or 
  1630. sockets, client/server programming is all the rage these days.  On a related 
  1631. note, some people have also expressed an interest in learning about interfacing 
  1632. with the various protocol drivers (e.g.  NDIS, IPX/SPX, etc.).  Any articles in 
  1633. this area are most welcome. 
  1634.  
  1635. Multimedia (warm) - we recently had two articles on this topic.  However, they 
  1636. both dealt with sound, which we all know is not the only alternative media 
  1637. type.  Articles on anything else - MIDI, video, etc. - are needed. 
  1638.  
  1639. Scratch Patch - EDM/2 - July 1994 - Volume 2, Issue 7 
  1640.  
  1641.  
  1642. ΓòÉΓòÉΓòÉ 8. Contributors to this Issue ΓòÉΓòÉΓòÉ
  1643.  
  1644. Are You a Potential Author? 
  1645.  
  1646. We are always looking for (new) authors.  If you have a topic about which you 
  1647. would like to write, send a brief description of the topic electronically to 
  1648. any of the editors, whose addresses are listed below, by the 15th of the month 
  1649. before the month in which your article will appear.  This alerts us that you 
  1650. will be sending an article so that we can plan the issue layout accordingly. 
  1651. After you have done this, get the latest copy of the Article Submission 
  1652. Guidelines  from ftp.cdrom.com  in the /pub/os2/2_x/program/newsltr directory. 
  1653. (the file is artsub.zip)  The completed text of your article should be sent to 
  1654. us no later than five days prior to the last day of the month; any articles 
  1655. received after that time may be pushed to the next issue. 
  1656.  
  1657. The editors can be reached at the following email addresses: 
  1658.  
  1659. o Larry Salomon - os2man@panix.com (Internet). 
  1660. o Carsten Whimster - bcrwhims@undergrad.math.uwaterloo.ca (Internet). 
  1661.  
  1662. The following people contributed to this issue in one form or another (in 
  1663. alphabetical order): 
  1664.  
  1665. o Larry Salomon, Jr. 
  1666. o Carsten Whimster 
  1667. o Gordon Zeglinski 
  1668. o Network distributors 
  1669.  
  1670. Contributors - EDM/2 - July 1994 - Volume 2, Issue 7 
  1671.  
  1672.  
  1673. ΓòÉΓòÉΓòÉ 8.1. Larry Salomon, Jr. ΓòÉΓòÉΓòÉ
  1674.  
  1675. Larry Salomon, Jr. 
  1676.  
  1677. Larry Salomon, Jr. wrote his first Presentation Manager application for OS/2 
  1678. version 1.1 in 1989.  Since that time, he has written numerous VIO and PM 
  1679. applications, including the Scramble applet included with OS/2 and the 
  1680. I-Brow/Magnify/Screen Capture trio being distributed by IBM with the 
  1681. Professional Developers Kit CD-ROM.  Currently, he works for Cheyenne Software 
  1682. in Roslyn, New York and resides in Bellerose, New York with his wife Lisa. 
  1683.  
  1684. Larry can be reached electronically via the Internet at os2man@panix.com. 
  1685.  
  1686. Contributors - EDM/2 - July 1994 - Volume 2, Issue 7 
  1687.  
  1688.  
  1689. ΓòÉΓòÉΓòÉ 8.2. Carsten Whimster ΓòÉΓòÉΓòÉ
  1690.  
  1691. Carsten Whimster 
  1692.  
  1693.  Carsten is an undergraduate Computer Science student at the University of 
  1694. Waterloo, and an huge OS/2 enthusiast as of OS/2 2.0.  He is currently in his 
  1695. third year, taking operating system, language, and compiler courses whenever 
  1696. possible.  This summer and fall he is working at the University of Waterloo as 
  1697. a tutor (course assistant) for CS241, an introductory course to compilers.  He 
  1698. is a TEAM-OS/2 member, and tries to keep up with several OS/2 groups on the 
  1699. Internet. 
  1700.  
  1701.  Carsten is a beginning OS/2 PM programmer with a few projects on the go, and 
  1702. many more in his head.  He uses Watcom C/C++ 9.5, Watcom VX-REXX 2.0b, and 
  1703. occasionally emx08h with gcc 2.5.7.  He is currently awaiting Watcom C/C++ 
  1704. 10.0's impending arrival with bated breath. 
  1705.  
  1706. You may reach Carsten... 
  1707.  
  1708. ...via email: 
  1709.  
  1710. bcrwhims@undergrad.math.uwaterloo.ca  - Internet 
  1711.  
  1712. gopher://descartes.math.uwaterloo.ca:70/h0/mathSOC/.csc/.www/.bcrwhimster/homepage.html 
  1713. - Mosaic homepage 
  1714.  
  1715. ...via snail mail: 
  1716.  
  1717. Carsten Whimster
  1718. 319 Erb Street West, 3rd floor
  1719. Waterloo, Ontario
  1720. Canada
  1721. N2L 1W4
  1722.  
  1723.  Contributors - EDM/2 - July 1994 - Volume 2, Issue 7 
  1724.  
  1725.  
  1726. ΓòÉΓòÉΓòÉ 8.3. Gordon Zeglinski ΓòÉΓòÉΓòÉ
  1727.  
  1728. Gordon Zeglinski 
  1729.  
  1730. Gordon Zeglinski is a freelance programmer/consultant who received his Master's 
  1731. degree in Mechanical Engineering with a thesis on C++ sparse matrix objects. 
  1732. He has been programming in C++ for 6 years and also has a strong background in 
  1733. FORTRAN.  He started developing OS/2 applications with version 2.0 . 
  1734.  
  1735. His current projects include a client/server communications program that 
  1736. utilitizes OS/2's features which has entered beta testing.  Additionally, he is 
  1737. involved in the development of a "real-time" automated vehicle based on OS/2 
  1738. and using C++ in which he does device driver development and designs the 
  1739. applications that comprise the control logic and user interface. 
  1740.  
  1741. He can be reached via the Internet at zeglins@cc.umanitoba.ca. 
  1742.  
  1743. Contributors - EDM/2 - July 1994 - Volume 2, Issue 7 
  1744.  
  1745.  
  1746. ΓòÉΓòÉΓòÉ 8.4. Network distributors ΓòÉΓòÉΓòÉ
  1747.  
  1748. Network Distributors 
  1749.  
  1750. These people are part of our distribution system to provide EDM/2 on networks 
  1751. other than the Internet.  Their help to provide access to this magazine for 
  1752. others is voluntary and we appreciate them a lot! 
  1753.  
  1754. o Paul Hethmon (hethmon@apac.ag.utk.edu) - Compuserve 
  1755. o Gess Shankar (gess@knex.mind.org) - Internet 
  1756. o David Singer (singer@almaden.ibm.com) - IBM Internal 
  1757. o Andre Asselin (ASSELIN AT RALVM12) - IBM Internal 
  1758.  
  1759. If you would like to become a "network distributor", be sure to contact the 
  1760. editors so that we can give you the credit you deserve! 
  1761.  
  1762. Contributors - EDM/2 - July 1994 - Volume 2, Issue 7 
  1763.  
  1764.  
  1765. ΓòÉΓòÉΓòÉ 9. How Do I Get EDM/2? ΓòÉΓòÉΓòÉ
  1766.  
  1767. How Do I Get EDM/2? 
  1768.  
  1769. EDM/2 can be obtained in any of the following ways: 
  1770.  
  1771. On the Internet 
  1772.  
  1773. o All back issues are available via anonymous FTP from the following sites: 
  1774.  
  1775.    - ftp.cdrom.com in the /pub/os2/2_x/program/newsltr directory. 
  1776.    - ftp.luth.se in the /pub/os2/programming/newsletter directory. 
  1777.    - generalhq.pc.cc.cmu.edu 
  1778.  
  1779. o The EDM/2 mailing list.  Send an empty message to edm2-info@knex.mind.org to 
  1780.   receive a file containing (among other things) instructions for subscribing 
  1781.   to EDM/2.  This is a UUCP connection, so be patient please. 
  1782. o IBM's external gopher/WWW server in Almaden. The address is 
  1783.   index.almaden.ibm.com and it is in the "Non-IBM-Originated" submenu of the 
  1784.   "OS/2 Information" menu; the URL is 
  1785.   "gopher://index.almaden.ibm.com/1nonibm/os2nonib.70". 
  1786.  
  1787. On Compuserve 
  1788.  
  1789. All back issues are available in the OS/2 Developers Forum 2. 
  1790.  
  1791. IBM Internal 
  1792.  
  1793. o IBM's internal gopher/WWW server in Almaden. The address is 
  1794.   n6tfx.almaden.ibm.com and it is in the "Non-IBM-Originated Files" menu; the 
  1795.   URL is "gopher://n6tfx.almaden.ibm.com/1!!nonibm/nonibm.70". 
  1796. o IBM's REQUEST command on all internal VM systems.  Enter the VM command 
  1797.   REQUEST LIST FROM ASSELIN AT RALVM12 and a list of the requestable packages 
  1798.   will be sent to you; in this list are the names of the packages containing 
  1799.   the EDM/2 issues. 
  1800.  
  1801. How do I Get EDM/2? - EDM/2 - July 1994 - Volume 2, Issue 7