home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / pfowl108.zip / profowl.inf (.txt) < prev    next >
OS/2 Help File  |  1996-06-10  |  168KB  |  1,634 lines

  1.  
  2. ΓòÉΓòÉΓòÉ 1. Professor Owl Version 1.08 ΓòÉΓòÉΓòÉ
  3.  
  4.  "All things bright and beautiful, 
  5.  
  6.  All creatures great and small, 
  7.  
  8.  All things wise and wonderful, 
  9.  
  10.  The Lord God made them all." 
  11.  
  12.  Cecil Alexander 
  13.  
  14.  
  15. ΓòÉΓòÉΓòÉ 2. Special Thanks ΓòÉΓòÉΓòÉ
  16.  
  17.  Much time and effort has gone into this product, we give a special thanks to 
  18.  the following people: 
  19.  
  20.  Jacque March for project coordination 
  21.  
  22.  Gene Krywicki, IBM BESTeam member support. 
  23.  
  24.  Shawn Jipp for artwork 
  25.  
  26.  Valerie Jacobsen for proofreading 
  27.  
  28.  Paul J. Hepworth for software testing 
  29.  
  30.  And Thanks to all the registered users who support Professor Owl, OS/2, and 
  31.  shareware! 
  32.  
  33.  Note: 
  34.  
  35.  Professor Owl is distributed as shareware, NOT free software. You may use it 
  36.  for up to 30 days free of charge. If you wish to continue using the program 
  37.  after your trial period is over you must register. Registration costs just 
  38.  $29.95 (US$). Credit cards are accepted through BMT Micro. 
  39.  
  40.  
  41. ΓòÉΓòÉΓòÉ 3. Copyright ΓòÉΓòÉΓòÉ
  42.  
  43. Copyright 1995, Edward J. March Jr. All Rights Reserved. 
  44.  
  45. Grant of License. 
  46.  
  47. Professor Owl is marketed and sold as shareware. The registration key is sold 
  48. for use on a single computer system only. Copies of the shareware may be 
  49. distributed freely. The Key Serial number is for one user per computer only. 
  50. For additional keys contact the author. Using a single copy of the key file on 
  51. a networked or timeshared computer running more than once at the same time is a 
  52. violation of this copyright. You may not copy, transmit, give away, 
  53. disassemble, alter, patch, modify, or change in whole or part, any software 
  54. contained on the diskettes, or quired through electronic transfer. This license 
  55. agreement shall remain in effect from the date you open the package, download 
  56. the software, or use this software until terminated. You may terminate this 
  57. agreement by destroying all copies of this software, including backups on all 
  58. types of media. 
  59.  
  60.  Legal 
  61.  
  62. This is not a sale of the software title or rights to Professor Owl and the 
  63. documentation files. Copyrights, patents, and all other intellectual property 
  64. rights are retained by Edward March. You may not sublicense, assign, or 
  65. transfer this license. If you or any organization breaches this agreement, your 
  66. license is automatically revoked upon that breach. Should a court find you in 
  67. violation of this agreement, Edward March may be awarded any attorneys' fees, 
  68. expert fees, and the cost of the legal action. This agreement is governed under 
  69. the U.S. Copyright law, and the laws of the state of Illinois. 
  70.  
  71. Warranty 
  72.  
  73. The author disclaims all warranties relating to the use of this software. The 
  74. author shall not be liable for any misfortune or damages through use,  directly 
  75. or indirectly of any software provided on the diskettes or any other media the 
  76. software was delivered in part or whole , on or through. In no event shall 
  77. Edward March or its advertisers and/or suppliers be liable for any damages. 
  78. Damages include but not are limited to loss of business, business delays, 
  79. interruptions, and loss of revenue. Information is this manual or software is 
  80. subject to change without notice. 
  81.  
  82. Code Generation 
  83.  
  84. All source code, data and binary code generated by and from Professor Owl is 
  85. freely offered to you and/or your company to be used as you see fit. Edward 
  86. March holds no rights whatsoever on any software source code or binary code 
  87. generated by this product. The author is not responsible in any way for the use 
  88. or misuse of the source code or binary code generated by this product. 
  89.  
  90.  
  91. ΓòÉΓòÉΓòÉ 4. Trademarks ΓòÉΓòÉΓòÉ
  92.  
  93. Trademarks 
  94.  
  95.  IBM and OS/2 are registered trademarks 
  96.  
  97.  of International Business Machines Corporation. 
  98.  
  99.  Object Window and ResourceWorkshop are registered trademarks 
  100.  
  101.  of Borland International, Inc.. 
  102.  
  103.  BOXER is a trademark of Boxer Software. 
  104.  
  105.  Other product names are trademarks of their respective holders. 
  106.  
  107.  
  108. ΓòÉΓòÉΓòÉ 5. Welcome ΓòÉΓòÉΓòÉ
  109.  
  110. Welcome to Professor Owl. This product is a code generator for the Borland C++ 
  111. Object Window Library. It will help you to create OS/2 applications faster and 
  112. more error free. Professor Owl reads and writes C++ code. When Borland C++ 
  113. programmers began the migration to the OS/2 operating system one of the first 
  114. obstacles they faced was the lack of a C++ Object Window Library code 
  115. generator. Edward March is proud to be a pioneer provider of these programming 
  116. tools. 
  117.  
  118. Traditionally the Borland C++ compiler has been king, it has a great IDE and a 
  119. well designed class library for graphical user interface development. Professor 
  120. Owl allows you to generate OS/2 applications in a matter of seconds. When you 
  121. create a new application, all the framework C++ code, header files, and 
  122. resources are created for you. Your application can grow to suit your needs by 
  123. using Professor Owl to add more functionality to your source code. 
  124.  
  125. Certainly, no one could remember the hundreds of functions and events that make 
  126. up the Object Window Library classes. This is where Professor Owl shines. When 
  127. you want to add an event handler it's a mouse click away. Each event handler 
  128. macro and function and header prototype will be written for you. This will save 
  129. hours of time, since you will not  need to remember what event macros go with 
  130. what functions and what parameters they all need. It allows you to concentrate 
  131. on your application and not the inner working of the class library. Professor 
  132. Owl puts what you need at your finger tips. It is easy to use and very 
  133. powerful; it will become your command center. 
  134.  
  135.  
  136. ΓòÉΓòÉΓòÉ 6. Installation ΓòÉΓòÉΓòÉ
  137.  
  138. Open a OS/2 Session (full screen or windowed). 
  139.  
  140. Change to the floppy disk drive directory (CD A: or CD B:) and type INSTALL. If 
  141. your 3.5" disk is in drive A: do the following. 
  142.  
  143. CD A:
  144.  
  145. INSTALL
  146.  
  147. A subdirectory will be created on the desktop to hold the Professor Owl files. 
  148. This directory will be referred to as Professor Owls  Home Directory. 
  149. Sometimes there are last minutes changes after this manual has been printed. 
  150. These changes or important notes will be listed in the read me file. You can 
  151. view the README.TXT file to see any changes that occurred since the manual was 
  152. printed. This is a good time to start README.CMD that will view the  README.TXT 
  153. file. To execute Professor Owl - run the PROFOWL.EXE - by double clicking on 
  154. the file, or typing it from the command line. 
  155.  
  156. With Professor Owl running you can check the home directory path by clicking on 
  157. About from the Help menu. This will verify your installation path is correct. 
  158. There are no environment variables or setting you will need. Everything is 
  159. contained in this Home Directory. If you copy PROFOWL.EXE to another directory 
  160. then that directory will be Professor Owls Home Directory. If you have two 
  161. copies of the executable file, then you have two home directories. 
  162.  
  163. Before you can generate an application you will need to set the user settings 
  164. to ensure the compiler paths and Professor paths match. 
  165.  
  166.  
  167. ΓòÉΓòÉΓòÉ 7. User Setup ΓòÉΓòÉΓòÉ
  168.  
  169. Once you start Professor Owl enter the User Setup screen by pressing the Setup 
  170. button In the settings screen there are several options that can be set. 
  171. Pressing the Default button will give you a good start, however some entries 
  172. referencing disk drives or paths may not match your computers configuration. 
  173. Later we will look at the path settings. Professor Owl's path setting should 
  174. match the Borland compiler paths. But now let take each entry of the settings 
  175. screen in a logical order. 
  176.  
  177.  
  178. ΓòÉΓòÉΓòÉ 7.1. Code Generation ΓòÉΓòÉΓòÉ
  179.  
  180. The code generation section of the setup screen allows you to define how 
  181. Professor Owl will generate the C++ code. You can use tabs or spaces for 
  182. indentation. The default is 4 spaces. This seems to be a popular format and can 
  183. be handled by all editors. Changing this parameter takes effect immediately. 
  184. However it will not change existing code already written. But the next time 
  185. your generate code, this new type of indentation will be used. If you change 
  186. from tabs, to spaces, your code may not look indented as you expect. We suggest 
  187. keeping with one style of indentation throughout a project. 
  188.  
  189.  
  190. ΓòÉΓòÉΓòÉ 7.2. Include Path ΓòÉΓòÉΓòÉ
  191.  
  192. The #include path is the include statement that the generated code will use to 
  193. find the Object Window class library. Your compiler should know where to search 
  194. for include files. Normally the compiler will search X:\BCOS2\INCLUDE. (where 
  195. X: represents the disk drive the compiler was installed on.)  This is a 
  196. Compiler setting, and not a Professor Owl Setting. Borlands OWL library is 
  197. normally in X:\BCOS2\INCLUDE\OWL. Therefore since the compiler can find files 
  198. in the parent directory, we need to only prefix the owl files with "owl\". 
  199. Using all the factory default of the Borland C++ compiler you should not have 
  200. change this from owl. You do not need the trailing backslash if you provide one 
  201. it will be stripped off.  Here is an example if the setting was set to owl, 
  202. this code would be generated. 
  203.  
  204. #include "resource.h"
  205.  
  206. #include <owl\dialog.h>
  207.  
  208. #include <owl\combobox.h>
  209.  
  210. #include <owl\edit.h>
  211.  
  212.  Notice dialog.h, combobox.h and edit.h are preceded with the path owl. 
  213.  
  214.  
  215. ΓòÉΓòÉΓòÉ 7.3. Comments ΓòÉΓòÉΓòÉ
  216.  
  217.  Your Code Comment Here is a comment that Professor Owl uses to flag places 
  218. where you may need to edit the code. If several programmers are working on the 
  219. same code, this can be used to flag the person who generated this function with 
  220. his comment. For example Bill's comment might be INSERT>> Bills code and Franks 
  221. might be INSERT>> Frank Smith. Yes, the common text string in both of their 
  222. comments, 'INSERT>>' can be searched for no matter who generated the code. You 
  223. can use C++ style // comments or C style /* */ comments. Here is an example of 
  224. the user comment inside a function: 
  225.  
  226. //----------------------------------
  227.  
  228. // Cancel Button Pressed
  229.  
  230. //----------------------------------
  231.  
  232. void MyClass::EvClickCancel(void)
  233.  
  234. {
  235.  
  236.     // INSERT>> Your Code Here
  237.  
  238.     CmCancel();
  239.  
  240. }
  241.  
  242. You will see comments like the above throughout the generated code. You can 
  243. search for these and add the functionality you need at this point in the source 
  244. code. The function delimeters are inserted before the function with a comment 
  245. between them describing the function. 
  246.  
  247. The _head_.cpp and _head_.h files are used when creating a new class. When a 
  248. new file is created to hold the class data, these special header files will be 
  249. put at the beginning of the generated class. These header file can be any name 
  250. you like, by default we use '_head_.h' and '_head_.cpp'. You can also specify a 
  251. path to them, if no path is given they are assumed to be in the current project 
  252. directory. 
  253.  
  254. There are several Macro's that are expanded. Each macro name begins with a 
  255. dollar sign. They are: 
  256.  
  257.  $time, $file, $path, $class, $base and $product. $time will expand to 
  258. time/date string like "Mon Dec 25 12:01:02 1995", $file if the file name 
  259. without the extension. $FILE is the file name in capitol letters, $path and 
  260. $PATH is the current drive and path where your new files will be created, and 
  261. $product is the current version of Professor Owl such as "Professor Owl 1.08". 
  262.  
  263. Lets assume you create a new Class call MyNewClass of TDialog type in a file 
  264. NewClass.Cpp and this is your _head_.cpp file. 
  265.  
  266. //===============================================
  267.  
  268. // $path\$file.cpp created $TIME
  269.  
  270. //
  271.  
  272. // Using $product
  273.  
  274. // Class Name $class derived from $base
  275.  
  276. // Prototypes are in $file.h
  277.  
  278. // upper case name is $FILE and lowercase is $file
  279.  
  280. //===============================================
  281.  
  282. The final code would look like this: 
  283.  
  284. //===============================================
  285.  
  286. // d:\pro-owl\newclass.cpp created MON DEC 11 12:34:56 1995
  287.  
  288. //
  289.  
  290. // Using Professor Owl 1.08
  291.  
  292. // Class Name MyNewClass derived from TDialog
  293.  
  294. // Prototypes are in newclass.h
  295.  
  296. // upper case name is newclass and lowercase is NEWCLASS
  297.  
  298. //===============================================
  299.  
  300. Notice $file and $FILE expand to the same name except for the case. This is 
  301. true for most macro names, except $product, $class and $base. 
  302.  
  303.  
  304. ΓòÉΓòÉΓòÉ 7.4. Owl Path ΓòÉΓòÉΓòÉ
  305.  
  306. You will need to include the path to the Borland C++ Owl header files. The 
  307. default path may be correct, if you installed the Borland C++ compiler in the 
  308. default directories on your C: drive. If you used another disk drive or a 
  309. different path, you will need to enter the correct drive and path. The default 
  310. is C:\BCOS2\INCLUDE\OWL. This is used to scan resources , and also to generate 
  311. the make-file when new application code is generated. 
  312.  
  313.  
  314. ΓòÉΓòÉΓòÉ 7.5. Editor Save Options ΓòÉΓòÉΓòÉ
  315.  
  316. The editor options control Professor Owl's built-in editor. As you add code, 
  317. the changes will be shown in the editor window on Professor Owl's main screen. 
  318. You can set this editor option to one of four choice. 
  319.  
  320. Read Only: This means that the source code shown in the edit window can be 
  321. viewed and not changed by you. Use this option if you do not feel comfortable 
  322. editing outside of your favorite editor. In this mode, you cannot alter the 
  323. text, and you need not worry about saving unwanted changes to your source file. 
  324.  
  325. Never Save: Allows you to make changes in the editor for your viewing purposes 
  326. only. None of the changes you make will be written to the disk. 
  327.  
  328. Prompt To Save: Professor Owl will Prompt you (Yes or No) to determine whether 
  329. you would like to save the changes in the editor to the disk file. If you say 
  330. No, your changes are lost and not saved to disk. 
  331.  
  332. Auto Save: This is the default, and the most likely choice. In this case, the 
  333. changes in the editor are always saved. You will not be prompted to save your 
  334. changes. The file will always be up to date with the code in the edit window. 
  335. More about backup files in the next section. 
  336.  
  337.  
  338. ΓòÉΓòÉΓòÉ 7.6. Editor Backups ΓòÉΓòÉΓòÉ
  339.  
  340. Enable Backups is a safety feature. Before saving the editor text to disk, it 
  341. will rename the disk file to the backup extension you provided. You may want to 
  342. choose a unique extension to distinguish these backup files from other backup 
  343. files created from different editors. It is not necessary to do this. If you do 
  344. not want the extra disk clutter, you can use the same backup extension as your 
  345. favorite editor or just turn off this feature. Turning off the Enable Backups 
  346. saves very little time. 
  347.  
  348. Professor Owl will save the edit file to disk before making any changes to the 
  349. file itself. All automatic changes  are done on a file basis. Professor Owl 
  350. does not add the text into the editor as you would. It inserts text changes 
  351. into your disk file. 
  352.  
  353. When you add a event or function to your code, the edit text may be saved to 
  354. disk. Professor Owl add its necessary code to the files. After the files are 
  355. updated, the C++ code file is loaded into the edit window. The text is 
  356. positioned to show the newly added function. 
  357.  
  358.  
  359. ΓòÉΓòÉΓòÉ 7.7. Help Tools ΓòÉΓòÉΓòÉ
  360.  
  361. You may add eight favorite or frequently used programs to the tools dialog 
  362. buttons. There are eight user defined buttons. You can name these buttons 
  363. anything you like. When pressed they run a executable file. The button names 
  364. will appear on the face of the buttons when the tools dialog is active. Each 
  365. button can have a ~ (tilde) character in front of the character on the button 
  366. you want underlined. You can access these tools with a single keystroke using 
  367. Control F1 through Control F8. 
  368.  
  369. Pressing the Default button in the dialog shows some examples. There are 
  370. several macros -- $hfile, $cfile, $home, $path and $line. These will expand to 
  371. the current header file, source file, and home directory path, current path and 
  372. line number of the built-in editor. You do not have to use these. The dollar 
  373. sign variables will be expanded in the Button Name Tool Directory and in the 
  374. Executable Path. Normally the Directory is set to the current directory '.\' 
  375. but there may be cases when you will want to run a tool from its directory so 
  376. it may find its DLL's or INI files. In that case you will need to use the 
  377. $path\$cfile to have it locate your .CPP file. 
  378.  
  379. If you were to use the Boxer text editor you might have a setting like this: 
  380.  
  381. C:\BOXER\B2.EXE  $cfile  -g$line
  382.  
  383. Notice the -g$line causes boxer to start editing at the same line number as 
  384. Professor Owl's built-in editor. The -g is a Boxer switch, the $line is a 
  385. Professor Owl variable that represents a line number from 1 through N (the 
  386. maximum number of lines in the file). 
  387.  
  388. If you are using the Mister Ed editor (it's whats the author uses) you would 
  389. have a setting like this: 
  390.  
  391. C:\MED\MED.EXE  $cfile  $line 1
  392.  
  393. Notice the $line causes Mister Ed to start editing at the same line number as 
  394. Professor Owl's built-in editor. The 1 is the column number. If you were 
  395. editing the AboutDlg.Cpp  on line 27 then Mister Ed would see these parameters. 
  396.  
  397. C:\MED\MED.EXE   aboutdlg.cpp  27 1
  398.  
  399. Boxer and Mister Ed Are OS/2 Shareware Editors 
  400.  
  401. ***** 
  402.  
  403. For furthur information on Boxer call or email 
  404.  
  405. David R. Hamel, (603)-924-6602, 70242.2126@compuserve.com 
  406.  
  407. ***** 
  408.  
  409. For further information on Mister Ed write or email 
  410.  
  411. Matt Prefsdorff, 76135 Karlsruhe, Germany. 
  412.  
  413. matz@karlsruhe.netsurf.de 
  414.  
  415. Pressing Cancel discards any changes in the user settings. Pressing Save writes 
  416. these setting to the PROFOWL.INI file in the home directory. 
  417.  
  418. When you press one of the tool buttons to start another application, Professor 
  419. Owl will leave the tool dialog active until that application finishes 
  420. executing. This is done so that you do not modify your source code with 
  421. Professor Owl and the tool application at the same time. You can override this 
  422. safety, by closing the tools dialog. By be careful about modifying the same 
  423. file by two different applications. 
  424.  
  425.  
  426. ΓòÉΓòÉΓòÉ 7.8. Home Directory ΓòÉΓòÉΓòÉ
  427.  
  428. This is a good time to mention what the home directory is used for. This 
  429. directory is what Professor Owl uses to find the PROFOWL.INF help file and 
  430. PROFOWL.INI setup file. You can tuck Professor Owl away, in some directory, but 
  431. use it in directories where your C++ source code exists, and not have your disk 
  432. cluttered with extra PROFOWL.INI files or PROFOWL.INF files. Unlike other 
  433. environments that splatter files all over your disk, The author does not do 
  434. this. All files are in the installed directory. The Home Directory can be seen 
  435. from the About dialog box under the Help menu. Making shadows of the Professor 
  436. Owl Icon does not change the home directory. It only allows you to start 
  437. Professor Owl from a more convenient location; such as a Tool Bar, Launch Pad, 
  438. or another folder. 
  439.  
  440.  
  441. ΓòÉΓòÉΓòÉ 7.9. Project Directory ΓòÉΓòÉΓòÉ
  442.  
  443. If you do not use a  project file then all C++ files must be contained in the 
  444. current project directory. To change the project Directory/Path select 
  445. Project/Path from the File menu. Professor Owl works using YOUR C++ code. There 
  446. are no databases or other saved information about your classes, functions or 
  447. events. This means that your source code will not get out of sync with any 
  448. database, that may happen with other code generators. You have freedom to 
  449. change your code, at any time and rescan it so Professor Owl will recognize 
  450. your changes. You can start using Professor Owl Now even if you are in the 
  451. middle of a project. You can also use Professor Owl with older projects. This 
  452. is because it not only writes C++ code but also knows how to read it and can 
  453. find key places to add changes. Professor Owl like to read code written with a 
  454. certain style. You can read about these under Limitations. 
  455.  
  456.  
  457. ΓòÉΓòÉΓòÉ 7.10. Project Window ΓòÉΓòÉΓòÉ
  458.  
  459. If you do not use a project file then all C++ files must be contained int the 
  460. same directory. Usinga Project file allow you to have a more flexible directory 
  461. layout. You can might have a directory layout such as this: 
  462.  
  463.  G:\MyProject\Include\ 
  464.  
  465.  G:\MyProject\Common\ 
  466.  
  467.  G:\MyProject\Res\ 
  468.  
  469.  G:\MyProject\Code\ 
  470.  
  471.  Your Project might have several header files in the Include directory, but the 
  472. classes are implemented in another directory 'Code'. The Common directory might 
  473. contain code that is used in this project and other projects. The 'Res' 
  474. directory would hold the .RC file that is for this OS/2 application. 
  475.  
  476. You must add in all files that are part of your project. 
  477.  
  478. This includes not only the .CPP files but the .H or .HPP files as well, and 
  479. also the .RC files. Don't forget the .H file that has all the constants used 
  480. for the resource ID's! 
  481.  
  482. Saving the project file save the list of file show in the project window to a 
  483. file called PROJECT.OWL. There is only one project file per directory, but that 
  484. project file can point to files anywhere on the system. 
  485.  
  486. The button Tool #1 shows the last tool number that was run. You can use the 
  487. right mouse click to select a tool to run. The selected tool will show a check 
  488. on that menu item of the right click popup menu. Once a tool is selected, you 
  489. may double click the entry of the path\file name, press the Tool # button to 
  490. run the tool again. The Tool will see the full path and file name as the $cfile 
  491. and $hfile, the line number $line will always be 1. 
  492.  
  493. You may keep the project dialog box open while working with Professor Owl. 
  494. Pressing the delete button deletes the entry into a undelete buffer that is 128 
  495. levels deep. You may undelete while the windows remains open, once the windows 
  496. is closed the undelete buffer is flushed. Changes made to the project list must 
  497. be saved to the Project.Owl file before than take effect. Adding a new class 
  498. will ask if you want the new files added to the project list if a valid 
  499. Project.Owl file is found. 
  500.  
  501. Warning:  A empty Project.Owl file is just that, you have no files in the 
  502. project and Professor Owl will NOT find any classes during its Rescan! If you 
  503. are not using a project file, delete the Project.Owl file. 
  504.  
  505.  
  506. ΓòÉΓòÉΓòÉ 7.11. Create Makefile ΓòÉΓòÉΓòÉ
  507.  
  508. Using the files in the project window you can create a makefile. The other two 
  509. parameters needed to create the makefile are: 1) The name of the makefile, and 
  510. an optional path to store the obj files. By default the object files are placed 
  511. in the same directory as the source files. you may leave this field blank or 
  512. use a period, to specify the current directory. See the macro $(OBJ_DIR) in the 
  513. .Mak file for furthur details. 
  514.  
  515. Link switch /Toe = Create /Type OS/2 .Exe File 
  516.  
  517. Link switch /Tod = Create /Type OS/2 .Dll File 
  518.  
  519. Link switch /aa =  Create Application Type API 
  520.  
  521. Link switch /v =  Create Symbolic Debug Info for Turbo Debugger 
  522.  
  523. Link switch /x =  Do Not Create MAP file 
  524.  
  525. See Borland BC.HLP or BC.INF (use HLP2INF on BC.HLP) located in the Borland bin 
  526. directory (i.e. x:\BCOS2\BIN\) for more details on TLink. 
  527.  
  528.  
  529. ΓòÉΓòÉΓòÉ 8. Create New Applications ΓòÉΓòÉΓòÉ
  530.  
  531. "Come on, then!" roared the Queen, and Alice 
  532.  
  533. joined the procession, wondering very much 
  534.  
  535. what would happen next." 
  536.  
  537. Alice in Wonderland 
  538.  
  539. If you have never created an Owl application for OS/2, now is the time to 
  540. start! Without Professor Owl, you would be typing for long time, especially if 
  541. you never created an application before. Well forget the typing for a minute 
  542. and get ready to push some buttons! Professor Owl knows how to create stock 
  543. applications that are the backbone of your final product. After Professor Owl 
  544. generates your application code it can run the make-file it generated to 
  545. compile your newly created application. 
  546.  
  547. Select the menu item Code, and then Select Create New Application. You will be 
  548. given several options. Select any options you want. The code generator will 
  549. create several files in the project directory. New applications consist of a 
  550. resource file RESOURCE.RC and a resource header file RESOURCE.H and sever C++ 
  551. file. The function OwlMain and the class TApplication are in the file 
  552. MYAPP.CPP. the other files are ABOUTDLG.CPP,  MYSDI.CPP, or MAINDLG.CPP. 
  553.  
  554. Each .CPP file has a corresponding .H file. So now that you know what the files 
  555. are, lets compile them. 
  556.  
  557.  
  558. ΓòÉΓòÉΓòÉ 8.1. Compiling ΓòÉΓòÉΓòÉ
  559.  
  560. You can build you application using the command line make -fmyapp.mak or using 
  561. the BC++ IDE compiler and adding the file to the .PRJ file. 
  562.  
  563. Start the compiler, and enter all the .CPP files into the project list. Also, 
  564. enter the RESOURCE.RC file into the project list too. Its is a common mistake 
  565. to forget to enter the resource file into the project list. 
  566.  
  567. Next you will need to select several project options from the Borland IDE. Set 
  568. the Target type to PM (Presentation Manager). In the Linker Library section 
  569. select static for all three library types. 
  570.  
  571. Your application should compile and link with out errors. If you get compiler 
  572. error most likely the paths from Professor Owl do not agree with the path 
  573. setting of the compiler. Check you compiler settings and verify them against 
  574. the Professor Owl settings. If everything compiled ok but there are linker 
  575. errors, check the Borland C++ Project Setting. Each library: Standard run-time, 
  576. Container Class, and Object Window should be set to Static or Dynamic, neither 
  577. of them should have None as a selected option. The Executable Target should be 
  578. set to  PM application and not a text mode application. 
  579.  
  580. Borlands resource linker should compiler the resource.rc file, and bind it into 
  581. the executable. Once this is done you can select Run from the IDE menu and see 
  582. it execute. As you toy with your new application you will find it is very 
  583. simple. It is a foundation on which to build upon. The important thing is what 
  584. happens next. Because this determines how you craft this simple application 
  585. into your final product. Like a master craftsmen uses his tools, you will use 
  586. Professor Owl and the Borland Class Library to create your end master piece. 
  587. Learning how Professor Owl operates is vital to achieving the end results you 
  588. desire. 
  589.  
  590.  
  591. ΓòÉΓòÉΓòÉ 9. Operation ΓòÉΓòÉΓòÉ
  592.  
  593. Professor consist of six sections as seen on the screen. The drop down list of 
  594. classes, the list of items, the list of events/functions, the edit source file; 
  595. and the controls menu and buttons. The sixth part is the menu which is accessed 
  596. by clicking the right mouse button. Lets review each of these sections for a 
  597. better understanding of what they do. 
  598.  
  599.  
  600. ΓòÉΓòÉΓòÉ 9.1. The Class List ΓòÉΓòÉΓòÉ
  601.  
  602. When you look at the list of classes in the drop down list, you will see the 
  603. four things. The class name, a colon the base class, and in parentheses two 
  604. file names. The header file and the code file. You may see an option id=ID_XXXX 
  605. if this is a class representing a resource dialog.  Here is a example of a 
  606. class called MyDialog, based on the TDialog Object Window Class. It represents 
  607. a Dialog class with a resource ID_MYCLASS, as defined in the resource.h and 
  608. resource.rc files. 
  609.  
  610. MyClass : TDIALOG ( mine.h mine.cpp ) id=ID_MYDIALOG
  611.  
  612. From this we know that MyClass has a parent class TDialog, and has the class 
  613. prototypes in the file mine.h, and the class code in mine.cpp -- also the 
  614. resource id is ID_ MYDIALOG as defined in the .RC file. 
  615.  
  616. Professor Owl puts the class declaration in the header file and the actual 
  617. class code in the source file. Classes are made up of two files. The header 
  618. file tells the outside world what members are in the class. The source file is 
  619. the actual code for these members. 
  620.  
  621. When Professor Owl is started, it looks for C++ code in the current directory. 
  622. When it finds Object Window classes it adds them to the drop down list box 
  623. labeled Classes. 
  624.  
  625. So what is the identifier for? It has nothing to do with the C++ language 
  626. itself. Classes are often made that represent the functions of a dialog box. 
  627. When you create a dialog box with Borlands ResourceWorkshop, you might write 
  628. code to give it functionality. The resource code determines what the dialog 
  629. will look like and what controls it will have. It is the class code with the 
  630. dialog resource that determines how your dialog box will appear on the screen 
  631. and function to the operator. You will learn more about creating classes after 
  632. we create an application. 
  633.  
  634. Identifiers are also used for other resources like buttons, list boxes, 
  635. bitmaps. I dialog resource can have many other type of resources drawn on it. 
  636. Each one of these resources if give a identifier. These Id's allow you to 
  637. manipulate the controls of a dialog box. 
  638.  
  639.  
  640. ΓòÉΓòÉΓòÉ 9.2. Item List ΓòÉΓòÉΓòÉ
  641.  
  642. This is a list of items for the selected class. Depending on the class type. 
  643. You may see: Virtual functions, Standard Messages, Identifiers, and Commands. 
  644. If your class has virtual functions they will be listed in the event/function 
  645. list box. The same is true for standard messages. Identifiers come from your 
  646. resource files. Standard messages are implemented with message macros that take 
  647. no parameters; Identifiers as defined in a header files such as resource.h; 
  648. Commands as defined in a header file or in one of Borlands header file. Note 
  649. the all Identifiers must start with ID_ such as (ID_FILE), and all commands 
  650. must start with CM_ as CM_EDITCOPY. This is Borlands convention, and it tends 
  651. to keep the source code well organized.  Above these identifiers and commands 
  652. and the files listed in angle brackets of where there are defined. 
  653.  
  654.  Show Constants Option 
  655.  
  656. Sometimes it is convenient to just assign a number instead of ID_'s to the 
  657. items. This is true with static text controls. Professor Owl has a option to 
  658. show controls that have ID numbers as numeric constants. But it is bad practice 
  659. to hard code these ID's in your program C++ code. So you can weed out controls 
  660. that will not be used in the program but are still needed for visual purposes. 
  661. The option is saved to disk in the Profowl.Ini file when the save button is 
  662. pressed in the setup dialog. 
  663.  
  664.  
  665. ΓòÉΓòÉΓòÉ 9.3. Event / Functions ΓòÉΓòÉΓòÉ
  666.  
  667. This is a list of functions that can be added to this class. What you see in 
  668. this list depends on what Item is selected. And what you see in the Item list 
  669. depends on what class typed is selected. This list has hundreds of functions, 
  670. depending on the combination of class and item selected. This is where 
  671. Professor Owl will save you hours of scanning through reference manuals trying 
  672. to figure out what Macro name, function name and parameter list all go 
  673. together. You simply select a function from the list, if the selected function 
  674. is already in the source code, then the source file will move to the position 
  675. of the function within the edit window, if it is not you can press the Add 
  676. Function button or select it from the menu to add this function in the source 
  677. file, prototype file, and if a macro if needed for event handling it will be 
  678. added in the source file too. 
  679.  
  680.  
  681. ΓòÉΓòÉΓòÉ 9.4. Edit Window ΓòÉΓòÉΓòÉ
  682.  
  683. This is a multi line editor control, that allows to edit and make changes to 
  684. the source code.  You will want to read the user setting to know about saving 
  685. the changes you make. Professor Owl will do its best to keep the source code 
  686. position to what functions are current being added. 
  687.  
  688.  
  689. ΓòÉΓòÉΓòÉ 9.5. Controls ΓòÉΓòÉΓòÉ
  690.  
  691. There are two way to use the controls on Professor Owls main screen. The menus 
  692. are available for traditional keyboard use along the certain letters being 
  693. underlined for quick access. If you prefer the keyboard over the mouse you 
  694. might want to add functions with ALT+C, A. however mouse lovers might prefer to 
  695. click on the add button. If you really love the mouse, in the OS/2 spirit of 
  696. things, there is a right click menu. You can right click on the Item list, on 
  697. the event/function list or on the edit window. Each right area has its own 
  698. right click menu. This menu gives you the same features of the button and pull 
  699. down menus with a little more convenience. 
  700.  
  701.  
  702. ΓòÉΓòÉΓòÉ 9.6. Title and Status Bar ΓòÉΓòÉΓòÉ
  703.  
  704. Professor Owl will show the current Project Directory path on the title bar on 
  705. the main window. You can always be sure where you are by looking at the title. 
  706. The status bar on the bottom of the main screen shows messages regarding the 
  707. operation or adding or deleting or searching for events and functions. 
  708.  
  709.  
  710. ΓòÉΓòÉΓòÉ 9.7. Short Cut Keys ΓòÉΓòÉΓòÉ
  711.  
  712. For Convenience you can use ALT+1, ALT+2, ALT+3,  to move between the class 
  713. list, item list and event list. Alt+T will bring up the  tools dialog. The 
  714. second letter is the name of the button you gave them in the setup screen. Also 
  715. Control F1 - F8 are short cuts for the tools. 
  716.  
  717. You can add events and macro by double clicking the event list box entry. In 
  718. this case no warning are issued if a function already exists in the code! 
  719. Generally during code development you will be adding events and functions. 
  720. Double clicking the functions and event names is the faster way to add them. 
  721.  
  722.  
  723. ΓòÉΓòÉΓòÉ 9.8. Searching ΓòÉΓòÉΓòÉ
  724.  
  725. Since both list boxes of items and events have so many entries starting with 
  726. the same letter a search feature is provided. You can find any string by 
  727. searching for partial phrases or key words. Also the  right click in each list 
  728. box will have a search in their menu. If you search for the paint you may find 
  729. the entry EV_WM_NCPAINT. The search is NOT case sensitive. You may hilight text 
  730. in the editor and it will be the default text to search for. Also when text is 
  731. found in the editor it is hilighted. 
  732.  
  733.  
  734. ΓòÉΓòÉΓòÉ 10. Create New Classes ΓòÉΓòÉΓòÉ
  735.  
  736. This allows you to create a new class derived from one of the popular types of 
  737. Object Window classes. When you create a new class, you must derive it from an 
  738. existing Borland Class. Since several classes don't make sense as a base class, 
  739. or are rarely used, we provided the most common classes in the list as your 
  740. choice of bases classes. If your base class is a from a TDialog you will need 
  741. to select an identifier. This is because TDialog classes are made up of 
  742. resources controls. The list of resource ID's will show what files there are 
  743. used in. A resource with a question mark in the file name is not used. By 
  744. convention classed have their 1st letter capitalized, but this is not 
  745. necessary. 
  746.  
  747. Notice the header file and code files will be the same name of the class. If 
  748. you entered 'MyClass' then the two files used to create the class will be 
  749. myfile.h and myfile.cpp.  Each class should be contained in its own .cpp file. 
  750. Once your class has been created you will get a default constructor for that 
  751. class type. Dialog classes will also get a few commonly used functions. 
  752. EvInitDialog, and cancel and Ok will be created by default. Almost always you 
  753. will need these helper functions. When you return back to the main screen, your 
  754. new class will be selected, and you can add more functions as needed. 
  755.  
  756.  
  757. ΓòÉΓòÉΓòÉ 11. Naming Conventions ΓòÉΓòÉΓòÉ
  758.  
  759. " 'Must a name mean something?' Alice asked 
  760.  
  761. doubtfully. 'Of course it must,' Humpty 
  762.  
  763. Dumpty said with a short laugh.' " 
  764.  
  765. Alice in Wonderland 
  766.  
  767. Professor Owl follows the Borland naming conventions. These are not hard and 
  768. fast rules, they are only guidelines to help you stay a bit more organized. We 
  769. strongly suggest you stay with these guidelines. 
  770.  
  771. All resource objects such as menus dialogs bitmaps and all other are normally 
  772. kept in one .RC file. Normally you can use the same file name such as 
  773. RESOURCE.H for every project. Since each project will be in its own 
  774. subdirectory. Keeping the same name make it easy to edit the file. It is not 
  775. necessary to have project one use proj_one.rc and project number two use 
  776. proj_two.rc when one name will do. All resource identifiers start with  ID_ 
  777. This is what Professor Owl scans for. It is not necessary to include several 
  778. other header file inside the resource.h file. The only exception to this may be 
  779. to include header files from third part software vendors. Resource files are 
  780. small and compile fast. Commands such as menu functions are normally named 
  781. starting with CM_ -- these should be in a header file. Professor  Owl expects 
  782. to find CM_ 
  783.  
  784. #defines in a header file. If your commands are used once in a .CPP file, 
  785. include the header. Professor Owl will not scan .CPP file for CM_ command since 
  786. this is too time consuming. 
  787.  
  788. Variables by convention of Professor Owl start with m_, for member. This is not 
  789. necessary. Professor Owl find variables by looking in the class declaration and 
  790. class constructor. No special naming is checked. We have found it helps to keep 
  791. member variables name differently than local variables just for organization. 
  792.  
  793.  
  794. ΓòÉΓòÉΓòÉ 12. Variables ΓòÉΓòÉΓòÉ
  795.  
  796. Pressing the variables button allows you to add member variables to the 
  797. currently selected class. When you add a variable it can have a public, private 
  798. or protected scope. Generally variables are private, so that only member 
  799. functions of that class can access them. There are two kinds of variables, 
  800. although we make no major distinction between them. A simple variable is an 
  801. integer, long, character or a data type known to the C++ language. The other 
  802. kind is a class or user defined type. Our user defined types are Object Window 
  803. class type of controls. Let's examine the simple types first and see how 
  804. Professor Owl handles them.  here we see a variable that is an unsigned long, 
  805. called m_MyULong and has a private scope. It looks like this in the class 
  806. declaration of the header file. 
  807.  
  808. class MyClass : public TDialog
  809.  
  810. {
  811.  
  812. private:    // Variables
  813.  
  814.     unsigned long m_MyULong;
  815.  
  816.     TListBox *m_Mylistbox;
  817.  
  818. public:    // Methods
  819.  
  820.      MyClass(TWindow *parent);
  821. ---
  822.  
  823. cut---
  824.  
  825. It is good practice to initialize all variable to some default value to prevent 
  826. unexpected surprises. Here we see the value set to zero in the constructor of 
  827. the class. 
  828.  
  829.  
  830. //----------------------------------
  831.  
  832. // Constructor
  833.  
  834. //----------------------------------
  835.  
  836. MyClass::MyClass(TWindow *parent) : TDialog(parent, ID_DLGMSG1000)
  837.  
  838. {
  839.  
  840.     // INSERT>> Your Code Here
  841.  
  842.     m_Mylistbox = new TListBox(this,ID_OBJECTS);
  843.  
  844.     m_MyULong = 0;
  845.  
  846. }
  847.  
  848. You can edit the constructor and set any other value besides zero if you need 
  849. to. Professor Owl will recognize the variable because it appears in the headers 
  850. and the source file. 
  851.  
  852. The second kind of variable is normally used in dialog boxes to gain access to 
  853. controls. This is a pointer type. Three references of code are generated to 
  854. create these kind. In the header file we see a m_Mylistbox is declared as a 
  855. TListBox pointer.  Here is the header file section showing the variable. 
  856.  
  857. class MyClass : public TDialog
  858.  
  859. {
  860.  
  861. private:    // Variables
  862.  
  863.     TListBox *m_Mylistbox;
  864.  
  865. public:    // Methods
  866.  
  867.      MyClass(TWindow *parent);
  868. ---
  869.  
  870. cut----
  871.  
  872. This is common with dialog boxes that have several types of controls on them. 
  873. If for example you want to add a list box to your dialog. You would use 
  874. ResourceWorkshop to add a the control to the dialog box. When the RESOURCE.RC 
  875. file is saved. Professor Owl will need to rescan it to know about this new 
  876. control that was just added. If you executed workshop from the tools menu then 
  877. Professor Owl will automatically rescan when the tool is done executing! In 
  878. this example you have a dialog with an Id of ID_MYDIALOG. You use 
  879. ResourceWorkshop to add a list box with an Id of ID_MYLISTBOX. You want to be 
  880. able to access the Object Window functions like AddString() and GetSelIndex(), 
  881. to make use of the listbox control. To do this you need a member variable or 
  882. control variable. Professor Owl can add one for you. Press the variables 
  883. button. A dialog will show all of the current variables in this class. Perhaps 
  884. you have none right now. Press the default button Add Variable and another 
  885. dialog will allow you to choose the type, and scope of the new variable. For 
  886. type select from the list box of types, Choose ID_MYLISTBOX, a name of 
  887. m_Mylistbox will appear. You can edit this name, and rename it. Remember the m_ 
  888. is not necessary only our convention. For our example lets use the default name 
  889. of m_Mylistbox, and leave the scope as private. Press OK to create the variable 
  890. and return to the previous variables dialog.  You will notice that your new 
  891. variable m_Mylistbox is show in the list of variables. 
  892.  
  893.  
  894. ΓòÉΓòÉΓòÉ 12.1. Variable Examples ΓòÉΓòÉΓòÉ
  895.  
  896. Here is a sample of the constructor: 
  897.  
  898.  
  899. //----------------------------------
  900.  
  901. // Constructor
  902.  
  903. //----------------------------------
  904.  
  905. MyClass::MyClass(TWindow *parent) :TDialog(...)
  906.  
  907. {
  908.  
  909.     // INSERT>> Your Code Here
  910.  
  911.     m_Mylistbox = new TListBox(this,ID_OBJECTS);
  912.  
  913. }
  914.  
  915. Here is a sample of the destructor: 
  916.  
  917. //----------------------------------
  918.  
  919. // Destructor
  920.  
  921. //----------------------------------
  922.  
  923. MyClass::~MyClass()
  924.  
  925. {
  926.  
  927.     // INSERT>> Your Code Here
  928.  
  929.     delete m_Mylistbox;
  930.  
  931. }
  932.  
  933. A lot has happened here. First we will look at the header file and later the 
  934. code file. The header file added a new variable. This variable matches the 
  935. control with the Id of ID_MYLISTBOX. This Id is defined in the resource file 
  936. when you created the listbox. When you drew the control in ResourceWorkshop, it 
  937. created an entry under ID_MYDIALOG -- a new control with the attributes set to 
  938. WC_LISTBOX. This was saved in the RESOURCE.RC file. Professor Owl scanned the 
  939. RESOURCE.R file and noticed the new control and the identifier ID_MYLISTBOX. 
  940. When you added a new variable of using ID_MYLISTBOX, Professor Owl knew to make 
  941. the variable a pointer to a TListBox class. The code file, has three changes. 
  942. First a new include header <owl/listbox.h> was added if needed. Code was added 
  943. in the constructor class to create a new TListBox on the heap. Secondly code in 
  944. the destructor of the class was written to destroy the variable. Finally the 
  945. variable names defaulted to m_ this is just a convention to let you know it is 
  946. a member of a class. You are free to name the variables anything you like. 
  947.  
  948.  
  949. ΓòÉΓòÉΓòÉ 13. Events and Functions ΓòÉΓòÉΓòÉ
  950.  
  951. Events are noteworthy happenings in the graphical user interface world, which 
  952. occur when the user clicks the left mouse button, releases the left mouse 
  953. button, or presses a key. Events are necessary to inform your program what the 
  954. user is doing. Without events your program could not communicate with he human 
  955. using the computer. The operating system has an event queue that hands off 
  956. these events to the active program. If you have ten programs running under OS/2 
  957. and you press the space bar, only the active program will get the event. The 
  958. other programs are still running, in the back ground. 
  959.  
  960. This philosophy can be taken one step further. Your program may have multiple 
  961. windows or controls, but only one of them  has input focus. Events have a 
  962. WM_XXXX type of message. WM_PAINT, and WM_LBUTTONDOWN, are examples of message 
  963. constants that correspond to a window being painted, or to the user pressing 
  964. the left mouse button down.  These events messages are sent to the parent class 
  965. and are normally handled by their default virtual functions.  Events have 
  966. message map entries in a table, so that when OS/2 sees an event, it can tell 
  967. the Object Window Library. Borland's classes look for an event handler, through 
  968. the class hierarchies. When you add an event, you will add a macro in the 
  969. message map table. Some macros take parameters and some don't. If no parameter 
  970. is needed then, the function attached to the event is a fixed constant name. 
  971. When there are parameters to the macro they are usually the function name. 
  972.  
  973. An example may help to clarify how event handler work. If you add a 
  974. WM_LBUTTONDOWN event handler. You would get a function added to you code like 
  975. this: 
  976.  
  977. EvLButtonDown(UINT modKeys, TPoint& point)
  978.  
  979. {
  980.  
  981. }
  982.  
  983. You cannot choose the function name or the parameters, this is chosen for you 
  984. by the class library designers. The point is the x and y coordinate where the 
  985. user pressed the left button down. The operating system knows about events and 
  986. calls functions or virtual functions through a message map table. 
  987.  
  988.  
  989. ΓòÉΓòÉΓòÉ 13.1. Message Maps ΓòÉΓòÉΓòÉ
  990.  
  991. Here is an example of a message map; 
  992.  
  993. //----------------------------------
  994.  
  995. // MESSAGE MAP FOR MyClass
  996.  
  997. //----------------------------------
  998.  
  999. DEFINE_RESPONSE_TABLE1(MyClass,TDialog)
  1000.  
  1001.     EV_BN_CLICKED(IDOK,EvClickOk),
  1002.  
  1003.     EV_BN_CLICKED(IDCANCEL,EvClickCancel),
  1004.  
  1005.     EV_WM_LBUTTONDOWN,
  1006.  
  1007.     EV_COMMAND(CM_ABOUT,EvCmAbout),
  1008.  
  1009. END_RESPONSE_TABLE;
  1010.  
  1011. The above function EvLButtonDown is defined by Borland, so the macro name and 
  1012. function name are predefined. But if all macro names were hard coded, there 
  1013. would be a limited number of possible macros and function name combinations. 
  1014.  
  1015. Parameters allow the same event to trigger different functions. When a button 
  1016. is pressed, the same macro handler is used, but each button may call a 
  1017. different user defined function. Notice the EV_COMMAND macro is triggered by 
  1018. the CM_ABOUT command to call the EvCmAbout functions. 
  1019.  
  1020. Here is the function definition: 
  1021.  
  1022. //----------------------------------
  1023.  
  1024. // Event EV_COMMAND for CM_ABOUT
  1025.  
  1026. //----------------------------------
  1027.  
  1028. void MyClass::EvCmAbout(void)
  1029.  
  1030. {
  1031.  
  1032.     // INSERT>> Your Code Here
  1033.  
  1034. }
  1035.  
  1036. Next let's look at virtual functions, and see how they differ from events. 
  1037.  
  1038.  
  1039. ΓòÉΓòÉΓòÉ 13.2. Virtual Functions ΓòÉΓòÉΓòÉ
  1040.  
  1041. These are functions that can be overridden by the derived class. They do not 
  1042. necessarily have events tied to them. When a class library is designed, it has 
  1043. many functions. Without functions it would be a data structure. So together 
  1044. data members and functions members, bring data and code together to make useful 
  1045. objects. The public functions allow the class to interface with the outside 
  1046. world (you the user). The private functions allow the class to work internally. 
  1047.  
  1048. You will sometime need to tap into key places, to know when something happens. 
  1049. Virtual function can be thought of like a patch panel. If there is no plug for 
  1050. what we want we can not get the signal. But if the designer has kept us in mind 
  1051. and has of provided a lot of functions or plugs we can use, then we can 
  1052. over-ride that function in our own class. Once we do we get control at some 
  1053. point and must take the same parameters as the virtual function of the original 
  1054. class. In order not to break working code, we need to pass this intercepted 
  1055. information back to the original class. So almost always, a virtual function 
  1056. should call its base class function with the same parameters it received. If 
  1057. you think of each class as a black box, you will understand this analogy. In 
  1058. effect, it is like unplugging the patch cord from a patch panel and plugging it 
  1059. into to your own device (your class). Once you get control of the information, 
  1060. you need to patch it back to the main panel again. To make matters more 
  1061. interesting, this splicing in is followed down the whole tree of classes. So 
  1062. when you derive a class Son from Father who was derived from Grandfather, you 
  1063. have access not only to your Father's virtual functions but all the way down to 
  1064. the base or root class. Fortunately for you the Object Window library is only a 
  1065. handful deep! 
  1066.  
  1067. Here is an example of a virtual function and the call to its parent class. 
  1068.  
  1069.  
  1070. //----------------------------------
  1071.  
  1072. // Virtual Function
  1073.  
  1074. //----------------------------------
  1075.  
  1076. BOOL MyClass::Create(void)
  1077.  
  1078. {
  1079.  
  1080.     BOOL RetValue =TDialog::Create();
  1081.  
  1082.     // INSERT>> Your Code Here
  1083.  
  1084.     return(RetValue);
  1085.  
  1086. }
  1087.  
  1088.  
  1089. ΓòÉΓòÉΓòÉ 13.3. Add Function ΓòÉΓòÉΓòÉ
  1090.  
  1091. The Add Function button adds the event macro handler and function to the header 
  1092. files and source files. In the case of virtual function there is no message map 
  1093. macro. Only events have message map macros. However, some events have fixed 
  1094. names and some have variable names. When a macro can accept a variable name, a 
  1095. question mark precedes the function name as in ?EvClick. You might have a 
  1096. dialog with ten buttons, and you want to know which button is pressed. Hence 
  1097. you need an event handler for that button, you select the ID_MYBUTTON1 in the 
  1098. item list, and the click event.  This name cannot be a constant since all 
  1099. buttons can be clicked on. Therefore you must supply a unique function name 
  1100. that makes the function for that particular button. You would do the same for 
  1101. button two and buttons three through ten. You could however have button 3 and 4 
  1102. use the same event handler. Why? Depending on your dialog's design, it may be 
  1103. more convenient. When the function is called you won't know which button was 
  1104. pressed. This is not a problem if your design is such that both buttons are not 
  1105. enabled at the same time! Either way the choice is yours when it comes to user 
  1106. defined function names. 
  1107.  
  1108.  
  1109. ΓòÉΓòÉΓòÉ 13.4. User Functions ΓòÉΓòÉΓòÉ
  1110.  
  1111. You can use Professor Owl to add good old everyday functions to your code that 
  1112. have nothing to do with macro, events, or parent class virtual functions. When 
  1113. you select the Virtual Function item, and select the  User Function event, you 
  1114. will be prompted to add a function. Your function can be virtual or 
  1115. non-virtual, and its scope can be private, protected or public. Just fill in 
  1116. the return type, function name and parameter list. You can use default 
  1117. parameters. Press the Example button for an idea of how this works. 
  1118.  
  1119.  
  1120. ΓòÉΓòÉΓòÉ 13.5. Delete Function ΓòÉΓòÉΓòÉ
  1121.  
  1122. Functions and events can be deleted just as easily as they are added. Once the 
  1123. event or function is created, by selecting an item and event in the two 
  1124. listboxes, you can press Delete Function. If the function is in the source 
  1125. code, it will be deleted. To prevent the loss of code, the function is 
  1126. commented out. Prototypes from the header are actually deleted. Here is an 
  1127. example of the source file after a function has been deleted. 
  1128.  
  1129. //----------------------------------
  1130.  
  1131. // Event EV_COMMAND for CM_ABOUT
  1132.  
  1133. //----------------------------------
  1134.  
  1135. #if 0 //DELETE_BEGIN
  1136.  
  1137. //DELETED void MyClass::EvCmAbout(void)
  1138.  
  1139. {
  1140.  
  1141.     // INSERT>> Your Code Here
  1142.  
  1143. }
  1144.  
  1145. #endif //DELETE_END
  1146.  
  1147. "One who fears limits his activities. Failure is the only opportunity to more 
  1148. intelligently begin again." 
  1149.  
  1150. HENRY FORD 
  1151.  
  1152.  
  1153. ΓòÉΓòÉΓòÉ 14. Browse Code Snippets ΓòÉΓòÉΓòÉ
  1154.  
  1155. This dialog box shows a name section and a list of snippets names. This 
  1156. provides two levels of catagories and make it easy to find routines. There are 
  1157. two files PROFOWL.DAT and PROFOWL.USR that are used to hold these commonly used 
  1158. snippets of code. Both files have the same format. A section name is in 
  1159. brackets, You can have as many sections as you want. In between each section is 
  1160. a code snippet. Each snippet begins with a period and a title string, after the 
  1161. title is the actual lines of code and/or comments. Each code snippet end with a 
  1162. .END marker. The begin and end staements must have the period in the first 
  1163. column. Code that is actually inserted or copy to the clipboard is shown in 
  1164. blue. 
  1165.  
  1166. [Comment Blocks]
  1167.  
  1168. .Dashed line 20 char's long
  1169. //----------------------------
  1170.  
  1171. .END
  1172.  
  1173. .Big Block Comment For Function Header
  1174. //***************************************************
  1175. // Function:
  1176. //
  1177. // Input:
  1178. //
  1179. // Returns:
  1180. //
  1181. //***************************************************
  1182.  
  1183. .END
  1184.  
  1185. [Next Section]
  1186.  
  1187. It is recomended that you leave PROFOWL.DAT alone as each new version of 
  1188. Professor Owl will include this file. All user code snippets should be aded to 
  1189. PROFOWL.USR. if you must change PROFOWL.DAT make a backup copy so when you 
  1190. upgrade Professor Owl, you will not loose the changed when the file is over 
  1191. written. Both files must reside in the home directory where Profowl.Exe is. 
  1192.  
  1193. View Clipboard starts "CLIPOS2.EXE" this file is in the X:\OS subdirectory and 
  1194. is part of the OS/2 operating system. 
  1195.  
  1196.  
  1197. ΓòÉΓòÉΓòÉ 15. OWL Help From Borlands INF Files ΓòÉΓòÉΓòÉ
  1198.  
  1199. To aid you in learning the OWL class library, Professor Owl offers you a quick 
  1200. and convenient way to search Borlands OWLPM.INF file. Under the main help menu 
  1201. is a menu item to search OWLPM.INF. This function uses the VIEW.EXE (included 
  1202. with OS/2) to execute a command line "VIEW.EXE OWLPMINF keyphrase". 
  1203.  
  1204. The keyphrase is held in a history list for your convenience. You may also 
  1205. select an item function name and right click to popup a menu, under this menu 
  1206. you will see the OWL help item, this will serach the INF file for that function 
  1207. member. 
  1208.  
  1209. If you have selected a event where the function name is user defined, you will 
  1210. be put into the "Command Message" help screen. If you select a <TWindow> or 
  1211. class identifier section, you will be put into the "TWindow Class" section. 
  1212.  
  1213. You may also hilight text in the built-in editor and right click on the editor 
  1214. text to search the OWLPM.INF file on the hilighted text. 
  1215.  
  1216. For this feature to work, both VIEW.EXE and OWLPM.EXE must be in your PATH. 
  1217. OWLPM.EXE is located in the x:\BCOS2\BIN directory and VIEW.EXE is located in 
  1218. the x:\OS directory. 
  1219.  
  1220.  
  1221. ΓòÉΓòÉΓòÉ 16. Questions and Answers ΓòÉΓòÉΓòÉ
  1222.  
  1223.      Q. Professor Owl created a New Class and when I compiler I get linker 
  1224.       errors? 
  1225.      A. You need to add the new class .CPP file to your project or make-file. 
  1226.       Professor Owl does not modify the .PRJ project file only the make-file. 
  1227.  
  1228.  
  1229.      Q. I added a variable to my dialog, and called my dialog from a menu 
  1230.       selection and I get a compile error on the variable from the calling 
  1231.       class. Why ? 
  1232.      A. When Professor Owl add a variable (a class pointer) it includes the 
  1233.       proper <owl\name.h> header file in the header file for that class. When 
  1234.       you call that class from another C++ file, the <owl\name.h> may or may 
  1235.       not be present.  You may need to include the same owl header file where 
  1236.       you are using Your Class. 
  1237.  
  1238.  
  1239.      Q. Where do all these CM_ constants come from ? They are not in my source 
  1240.       files. 
  1241.      A. Borland has many command constants defined in the owl directory, they 
  1242.       are used internally by the class library. You can use them too. Professor 
  1243.       Owl uses the Borland path to scan these symbol onstants into the item 
  1244.       list box. 
  1245.  
  1246.  
  1247.      Q. Professor Owl sees code in between preprocessor directives that is not 
  1248.       compiled. Why ? 
  1249.      A. Professor Owl is not a compiler! It parses on a line oriented bases. 
  1250.       It will not know what symbols are defined. Use C++ comments // to prevent 
  1251.       it from seeing lines code you don't want. 
  1252.  
  1253.  
  1254.      Q. I added function to my source code using Pofessor Owl. Why don't I see 
  1255.       these changes in the Borland Compiler IDE editor ? 
  1256.      A. The Borland IDE editor opens a file and holds it in memory. If the 
  1257.       file changes on the disk it does not know. It is safest to close the file 
  1258.       in the Borland IDE when transferring to other application that will cause 
  1259.       hanges to that same file. 
  1260.  
  1261.  
  1262.      Q. How can I create a modeless dialog box that is not clipped by the 
  1263.       parent but stays anywhere on the desktop? 
  1264.      A. In the Init Dialog function you need to call WinSetParent() the 
  1265.       example code fragment below will make the parent the desktop. 
  1266.  
  1267.       #define INCL_WINWINDOWMGR 
  1268.  
  1269.       #define   NULL 0 
  1270.  
  1271.       #include   <os2.h> 
  1272.  
  1273.       //---------------------------------- 
  1274.  
  1275.       // Init Dialog 
  1276.  
  1277.       //---------------------------------- 
  1278.  
  1279.       BOOL MyDialog::EvInitDialog(HWND hWndFocus) 
  1280.  
  1281.       { 
  1282.  
  1283.         BOOL RetValue = TDialog::EvInitDialog(hWndFocus); 
  1284.  
  1285.         WinSetParent(HWindow, HWND_DESKTOP,0);  // Set Parent To Be The Desktop 
  1286.  
  1287.         return(RetValue); 
  1288.  
  1289.       } 
  1290.  
  1291.  
  1292.      Q. Will Turbo Debugger run with 'mouse comet' enabled ? 
  1293.      A. No, you must turn off the 'Comet Cursor' for turbo degugger to run 
  1294.       properly. Open the OS/2 System Folder, Open the System Setup Folder, Open 
  1295.       the Mouse Setting Notebook. Make sure the comet cursor is uncheck, also 
  1296.       press the disable button. Reboot and this should fix Turbo Debugger. 
  1297.  
  1298.  
  1299. ΓòÉΓòÉΓòÉ 17. Limitations ΓòÉΓòÉΓòÉ
  1300.  
  1301.  -- Coding Styles 
  1302.  
  1303. Professor Owl like to read C++ code much like it writes it. This means 
  1304. functions should be on one line. Below are example of legal and illegal 
  1305. classes. 
  1306.  
  1307. LEGAL: 
  1308.  
  1309. MyClass::MyFunctions(int x)  // OK
  1310.  
  1311. {
  1312.  
  1313. }
  1314.  
  1315. ILLEGAL: 
  1316.  
  1317. // This will not work
  1318.  
  1319. MyClass::
  1320.  
  1321. MyFunction(
  1322.  
  1323. int x)
  1324.  
  1325. {
  1326.  
  1327. }
  1328.  
  1329. Professor Owl Scans for ClassName ::  FunctionName( 
  1330.  
  1331. to find class member functions. 
  1332.  
  1333. Spaces and tabs are ignored. 
  1334.  
  1335. Also, function closing braces Must be in column 1 as shown. 
  1336.  
  1337. void MyClass::GoodFunc(void) 
  1338.  
  1339.  
  1340.           ... // body 
  1341.  
  1342.  } 
  1343.  
  1344.  This style will also cause problems with Professor Owl. 
  1345.  
  1346.   void MyClass::BadBraces(void)
  1347.  
  1348.       {
  1349.  
  1350.           // braces are not left justified !
  1351.  
  1352.       }
  1353.  
  1354.  
  1355. ΓòÉΓòÉΓòÉ 18. Registration ΓòÉΓòÉΓòÉ
  1356.  
  1357. You can register your Professor Owl in may ways using the services provided by 
  1358. 'BMT Micro' Note: Your credit card will show BMT Micro, and not Professor Owl 
  1359. or Edward March. 
  1360.  
  1361. You may print the next two sections order forms and the appropriate one to the 
  1362. author or BMT Micro. Each registered user will receive a special serial number 
  1363. key code to be entered into Professors Owls registration dialog. 
  1364.  
  1365.  
  1366. ΓòÉΓòÉΓòÉ 19. Professor Owl Order Form (Checks / Money Orders) ΓòÉΓòÉΓòÉ
  1367.  
  1368. You may print this order form 
  1369.  
  1370.               Mail To   Edward J. March Jr. 
  1371.                    1206 South Birch Drive 
  1372.                    Mt. Prospect, IL 60056 
  1373.     
  1374.     
  1375.        The Author Accepts US (and Major Foreign Country) Personal Checks and 
  1376.       Money orders 
  1377.        made payable to 'Edward March'.  Please do not send cash 
  1378.        in the mail.  Personal checks are subject to clearance. 
  1379.        ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  1380.     
  1381.        Name ________________________________________________________________ 
  1382.     
  1383.        Address _____________________________________________________________ 
  1384.     
  1385.            _____________________________________________________________ 
  1386.     
  1387.        Phone _______________________________________________________________ 
  1388.     
  1389.        E-Mail ______________________________________________________________ 
  1390.     
  1391.        Where did you find Professor Owl ? __________________________________ 
  1392.     
  1393.        Total Enclosed:    $29.95  for 
  1394.  
  1395.  
  1396. ΓòÉΓòÉΓòÉ 20. Professor Owl Order Form (Credit Cards) ΓòÉΓòÉΓòÉ
  1397.  
  1398.               Mail Orders To  BMT Micro 
  1399.                       PO Box 15016 
  1400.                       Wilmington, NC 28408 
  1401.                       U.S.A. 
  1402.     
  1403.                Voice Orders  9:00am - 7:00pm EST (-5 GMT) 
  1404.                       (800) 414-4268 (orders only) 
  1405.                       (910) 791-7052 
  1406.     
  1407.                 Fax Orders  (800) 346-1OS2 (1672) 24 Hours / 7 Days 
  1408.                       (910) 350-2937  24 hours / 7 Days 
  1409.          Online Orders via modem  (910) 350-8061  10 lines, all 14.4K 
  1410.                       (910) 799-0923  Direct 28.8K line 
  1411.     
  1412.        Ordering and general ordering questions 
  1413.                  Via AOL  bmtmicro 
  1414.               via Compuserve  Thomas Bradford, 74031,307 
  1415.                via Internet  orders@bmtmicro.com 
  1416.                       tbrad@wilmington.net 
  1417.     
  1418.        We accept Visa, Mastercard, Discover, American Express, Money Order, 
  1419.        Cashiers Check, Personal Check.  Please do not send cash in the mail. 
  1420.        Personal checks are subject to clearance. 
  1421.        _____________________________________________________________________ 
  1422.     
  1423.        Name ________________________________________________________________ 
  1424.     
  1425.        Address _____________________________________________________________ 
  1426.     
  1427.            _____________________________________________________________ 
  1428.     
  1429.        Phone _______________________________________________________________ 
  1430.     
  1431.        E-Mail ______________________________________________________________ 
  1432.     
  1433.        Product           Quantity Price  Number of copies 
  1434.        ___Professor_Owl_______   _$29.95 Each__  ________________ 
  1435.     
  1436.                             x ____________ = + $ _______ 
  1437.     
  1438.        North Carolina add 6% Sales tax ($1.80 @ $29.95)  (6%)  + $ _______ 
  1439.     
  1440.        Total:                            $ _______ 
  1441.        ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  1442.         For credit card payment only 
  1443.     
  1444.         Circle one: VISA / Master / Discover / American Express 
  1445.     
  1446.         Credit card number: _____________________________________________ 
  1447.     
  1448.         Expiration date: ________________________________________________ 
  1449.     
  1450.         Authorization signature: ________________________________________ 
  1451.     
  1452.        ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  1453.  
  1454.  
  1455. ΓòÉΓòÉΓòÉ 21. Where To Enter Your Registration Code ΓòÉΓòÉΓòÉ
  1456.  
  1457. When you register you will be given a Serial number with your name. Select the 
  1458. Help Menu - Select About, Press OK, and you will see this dialog. Enter you 
  1459. name and serial number as given to you. This means all spaces, upper/lower case 
  1460. and punctuation are important. Professor Owl will create a PROFOWL.KEY file in 
  1461. its home directory. PLEASE DO NOT GIVE YOUR SERIAL NUMBER AWAY TO OTHERS. 
  1462. Profowl.exe and Profowl.ini are not modified, you can transfer these files to 
  1463. others to allow them to evaluate Professor Owl. Should you decide to unregister 
  1464. Professor Owl delete the Profowl.Key file. 
  1465.  
  1466.  
  1467. ΓòÉΓòÉΓòÉ 22. Technical Support ΓòÉΓòÉΓòÉ
  1468.  
  1469. There are a number of ways to get help with Professor Owl. The most obvious is 
  1470. reading the manual. Most tech support calls can be avoided by simply reading 
  1471. the book.  Also, Borland manuals are a great source of information on the 
  1472. Object Window Library classes. You can contact the author via Email, UsMail, or 
  1473. telephone. See the next sections. 
  1474.  
  1475.  
  1476. ΓòÉΓòÉΓòÉ 22.1. US Mail ΓòÉΓòÉΓòÉ
  1477.  
  1478.             Edward J. March Jr. 
  1479.  
  1480.             1206 South Birch Drive 
  1481.  
  1482.             Mt. Prospect, IL 60056 
  1483.  
  1484.  
  1485. ΓòÉΓòÉΓòÉ 22.2. Phone ΓòÉΓòÉΓòÉ
  1486.  
  1487.             (847) 228 - 1234 All messages will be answered with  24 hours of 
  1488.             the next business day. 
  1489.  
  1490.  
  1491. ΓòÉΓòÉΓòÉ 22.3. Internet ΓòÉΓòÉΓòÉ
  1492.  
  1493. Since the nature of the problems tend to be complex, we would prefer to handle 
  1494. technical assistance via E-Mail on the Internet.  Address your technical 
  1495. questions to emarch@ais.net and include any code samples or files that will 
  1496. help diagnose the problem. -- All Email will be answered within 24 hours of the 
  1497. next business day. 
  1498.  
  1499.  
  1500. ΓòÉΓòÉΓòÉ 23. Internet Information ΓòÉΓòÉΓòÉ
  1501.  
  1502.                                  Professor Owl Home Page  -- http://www.cl.ais.net/emarch
  1503.  
  1504.                                    (or try http://www.cl.ais.net/~emarch) Note ~ before emarch
  1505.  
  1506.                                  Bmt Micro Professor Owl  -- http://www.wilmington.net/bmtmicro/catalog/prof_owl.html
  1507.  
  1508.                                  Bmt Micro (general)      -- http://www.wilmington.net/bmtmicro/
  1509.  
  1510.                                  OWL general Info         -- http://keep.ioc.ee
  1511.  
  1512.                                  Borland                  -- http://www.borland.com
  1513.  
  1514.                                   Professor Owl can also be found on Compuserve's
  1515.                                   IBM OS/2 Developers Forums #1 Under Development Tools.
  1516.  
  1517.                                   Professor Owl ZIP files are named PFOWL108.ZIP for version 1.08 --
  1518.                                   Look for PFOWL###.ZIP.
  1519.  
  1520.  
  1521. ΓòÉΓòÉΓòÉ 24. What's News In This Version? ΓòÉΓòÉΓòÉ
  1522.  
  1523.             What's New In Version 1.08 
  1524.  
  1525.             Bug fix TGadgetBox is spelled correctly as TGadgetBar 
  1526.  
  1527.             Browse Menu Added For Code Snippets 
  1528.  
  1529.             Price Reduction Was $39.95 Now Only $29.95 !!! 
  1530.  
  1531.             What's New In Version 1.07 
  1532.  
  1533.              * Fixed multiple #include <owl/file.h> in code generation. 
  1534.  
  1535.              * Default window size/position is based on desktop resolution. 
  1536.  
  1537.               640x480 gives a smaller edit window, than higher 
  1538.  
  1539.               resolutions of 800x600 thru 1280x1024. But all controls should be 
  1540.             visible. 
  1541.  
  1542.              * Added browse buttons to tool setup dialog. 
  1543.  
  1544.              * Setup searches the PATH enviornment to find the BCOS2 installed 
  1545.             directory 
  1546.  
  1547.               and only defaults to C:\BCOS2\include if BCOS2 is not in the PATH 
  1548.             or 
  1549.  
  1550.               BCOS2 has been renamed. 
  1551.  
  1552.              * CD-ROM drives without a CD inserted will no longer 
  1553.  
  1554.               show the OS/2 System Retry/Fail. 
  1555.  
  1556.              * Help Button added to User Setup, User Comments, user Function, 
  1557.  
  1558.               Create New Class, and Create New Application Dialogs. 
  1559.  
  1560.              * Class Name/File Name Is Remembered For Next Session. 
  1561.  
  1562.              * Project Path will find ZIP / SYQUEST drives with removable 
  1563.             media, 
  1564.  
  1565.              * Project Path Can Be Remembered, For The Next Session. 
  1566.  
  1567.              * Added Project Window modeless dialog to support 
  1568.  
  1569.               files in multiple directories. 
  1570.  
  1571.              * Run Tools From Project Window on specific Path\File. 
  1572.  
  1573.              * Make files can be generated from the project list. 
  1574.  
  1575.              * Added date/time stamp to deleted functions. 
  1576.  
  1577.              * Resources can have BEGIN/END or open close braces { }. 
  1578.  
  1579.              * Help Menu has OwlPm.Inf Searching Also available on 
  1580.  
  1581.               right click popup menus. 
  1582.  
  1583.  
  1584. ΓòÉΓòÉΓòÉ 25. Testimonials ΓòÉΓòÉΓòÉ
  1585.  
  1586. What some people are saying about Professor Owl. 
  1587.  
  1588. ------------------------------------------------ 
  1589.  
  1590. WOW!!!! I must say Professor OWL is way cool! I have spent the last two weeks 
  1591. getting a user interface going with a toolbar, messagebar, and menu with a 
  1592. couple dialogs and I redid "almost" the whole thing in one evening with 
  1593. Professor OWL. Being a newbie OWLer converting from API, Professor OWL is just 
  1594. what I needed. 
  1595.  
  1596. Lee R. Copp, Houghton, MI 
  1597.  
  1598. ------------------------------------------------ 
  1599.  
  1600. As a novice to OWL programming, I have found Professor OWL (together with 
  1601. Borland's Resource Workshop), to be indispensable in providing a structured 
  1602. framework that facilitates the construction of PM program interfaces. Technical 
  1603. help and advice from the author via E-mail has been outstanding, and has even 
  1604. surpassed levels of assistance normally expected or recieved in commercial 
  1605. software support. The software that I use on a daily basis includes only a 
  1606. small select group of quality shareware programs;  Professor Owl definitely has 
  1607. earned its place in this exclusive group. 
  1608.  
  1609. Leslie G. Thompson 
  1610.  
  1611. Associate Professor of Petroleum Engineering 
  1612.  
  1613. University of Tulsa 
  1614.  
  1615. 600 S. College Avenue 
  1616.  
  1617. Tulsa, OK 74104 
  1618.  
  1619. ------------------------------------------------ 
  1620.  
  1621. "Sufficiently advanced technology is 
  1622.  
  1623. indistinguishable from magic." 
  1624.  
  1625. ARTHUR C. CLARKE 
  1626.  
  1627.  I hope Professor Owl is doing its magic for you! 
  1628.  
  1629. To all Professor Owl users (Registered and Unregistered). If you would like 
  1630. your testimonial added please email or write me. I look forward to hearing from 
  1631. you. 
  1632.  
  1633. Thank-You