<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>StudioTips - Hot Tips and Tricks</title> <meta name="keywords" content="omnis studio, raining data, studiotips documentation" /> <link rel="stylesheet" type="text/css" href="http://www.studiotips.net/css/codedoc.css" /> </head> <body> <div id="container"> <p><a href = ../index.html > Tips </a> &nbsp &gt; &nbsp <a href = index.html > About </a> &nbsp &gt; &nbsp Hot Tips and Tricks</p> <a name="hottipsandtricks" /> <h2>Hot Tips and Tricks</h2> This section lists my favorite tips and tricks. The tips and tricks are in alphabetic order (Not rated from best to least.) <a name="breakintookmessage" /> <h3>Break into OK Message</h3> <p>You can break into the method editor and continue stepping through the code from any <span class="code">OK, Yes/No, No/Yes, Prompt for Input</span> dialog window.</p> <p>When the prompt dialog window is open, depending on your platform press the following key(s):</p> <ul> <li>Mac platform - <kbd>Cmnd+Opt+Delete</kbd> </li> <li>Windows platform - <kbd>Break</kbd></li> </ul><div class="image_sideline"><img src="http://www.studiotips.net/css/images/tip.gif" alt="Tip" /><p>Use OK messages to assist with debugging by adding OK messages into your code which report the method being executed and the values you want to watch. Run the process you are trying to debug and at any one of the OK messages you can break into the code and continue stepping through the code in the method editor.<br /> <br /> I like to include <span class="code">@DEBUG</span> in the title of any debug OK messages so that I can easily search for <span class="code">@DEBUG</span> to find and remove them later on.</p> </div>In the <span class="nav">StudioTips Browser</span> click the <span class="nav">Run Demo</span> button and trying breaking into the demo code. <a name="changeomniscommand" /> <h3>Change Omnis Command</h3> <p>You can change some of the Omnis commands without losing the calculations or text which you've entered. You can:</p> <ul> <li>Change between <span class="code">If calculation</span> and <span class="code">Else if calculation</span>.</li> <li>Change a prompt message between <span class="code">OK message</span>, <span class="code">Yes/No message</span>, and <span class="code">No/Yes Message</span></li> <li>Change between <span class="code">Calculate</span> and <span class="code">Do</span>.</li> </ul>You simply select the line of code in the method editor and then click on the <em>other</em> Omnis command in the commands list. Omnis Studio switches the command while retaining the text you've entered. <a name="changevariablescope" /> <h3>Change Variable Scope</h3> <p>You can change the scope of any variable by dragging it from one tab pane to another tab pane of the <span class="nav">Variables</span> pane in the method editor.</p> <p>If you are decreasing the scope from a class or instance variable to a local or parameter variable you might get a message that tells you that the scope can't be changed while the class is open. If this occurs use the <span class="nav">Window</span> menu to <span class="nav">Close Others</span>, then try again.</p> <p>If you are decreasing the scope of a variable it can't be in more than one method and you must have that one method selected at the time you decrease the scope.</p> <div class="image_sideline"><img src="http://www.studiotips.net/css/images/warning.gif" alt="Warning" /><p>If you are changing the scope of a class variable or instance variable, make sure you don't have any subclasses which are using that variable! The subclass methods will not be aware of the change. The next time you look at the subclass method, those variables will be prefixed with <span class="code">$cinst.</span> and your subclass method code will be broken.</p> </div><p>A situation where this trick comes in useful, is if you have a very long method which you want to break down into several submethods in the same class, or even into a separate object class.</p> <ol> <li>Select and copy a block of the long method to the clipboard</li> <li>Create the submethod and paste in the code.</li> <li>Look at the local variables in the variable pane and decide which local variables need to become parameters to be send to the submethod. </li> <li>Add a letter <span class="code">p</span> prefix to the local variable name. (if you follow this naming convention).</li> <li>Drag the local variable to the <span class="nav">Parameter</span> variables pane.</li> <li>If you following the coding convention of always returning something from a method, a value or a true or false flag, at the end of the method add a <span class="code">Quit method Returns FlagOrValue</span>.</li> <li>Back in the long method, delete the copied code and replace it with:<br /> <br /> <span class="code">Do method newMethodName(parameters) Returns RetFlagOrValue</span></li> </ol> <a name="chromacoding" /> <h3>ChromaCoding</h3> <p>Omnis Studio notation methods displays in <em>plain brown text</em> in the method editor.</p> <p>Custom methods display in <em>bold green text</em> in the method editor.</p> <p>If you misspell an Omnis Studio notation method it displays in bold green text. Once you pick up on this you can immediately notice if you've correctly or incorrectly typed an Omnis Studio notation method.</p> <p class="code"><span class="omcomment">; $doesfileexist is displayed in plain brown text.</span><br /> Do FileOps.$doesfileexist(Path) Returns bFileExists<br /> <br /> <span class="omcomment">; Misspelled $doesfilexist (missing the double 'ee') is displayed in bold green text.</span><br /> Do FileOps.$doesfilexist(Path) Returns bFileExists</p> <a name="copyfieldproperties" /> <h3>Copy Field Properties</h3> <p>I use this trick a lot if I decide to change a <span class="code">kEntry</span> field to a <span class="code">kMaskedEntry</span> field or a <span class="code">kMultiline</span> field.</p> <ol> <li>Select the <span class="code">kEntry</span> field.</li> <li>Press <kbd>F6</kbd> to open the <span class="nav">Property Manager</span>.</li> <li>Right-click in the blank area of the <span class="nav">Property Manager</span> window below the last property and select <span class="nav">Copy Properties</span>. This copies the field's properties to the clipboard.</li> <li>Move the <span class="code">kEntry</span> field away from its current location on the window.</li> <li>Drag a <span class="code">kMaskedEntry</span> or <span class="code">kMultiline</span> entry field out of the <span class="nav">Component Store</span> anywhere onto your window class. The field will be selected.</li> <li>Right-click in the blank area of the <span class="nav">Property Manager</span> window and select <span class="nav">Paste Properties</span>. A warning message appear, click <span class="nav">Yes</span>. All of the applicable properties from the original <span class="code">kEntry</span> field will be copied to the selected field. The field will move to the exact location of the <span class="code">kEntry</span> field before you moved it. (That's why we moved the kEntry field after copying the properties.)</li> <li>If there are any methods behind the <span class="code">kEntry</span> field, you will need to copy and paste those methods to the new field.</li> <li>Delete the <span class="code">kEntry</span> field.</li> </ol> <a name="currentnotation" /> <h3>Current Notation</h3> When and wherever possible and applicable use <span class="code">$clib, $cinst, $class, $cclass. $cobj, $cfield, $cmethod, $crecipient, $ctask, $cwind, $topwind</span> in your notation. Your notation strings will be much shorter and much more flexible. See the <span class="nav">Notation</span> section under the <span class="nav">StudioTips</span> group. <a name="cyclethroughwindows" /> <h3>Cycle Through Windows</h3> <p>You can cycle through the open IDE windows using a shortcut key combination.</p> <ul> <li>Mac platform - <kbd>Cmnd+`</kbd> (backquote character)</li> <li>Windows platform - Does anyone know the key combination?</li> </ul>This is very handy when you have multiple method editor windows open and are comparing or copy and pasting code from one class to another. <a name="dragcopyfields" /> <h3>Drag Copy Fields</h3> <p>You probably already know about this trick because it is used in lots of drawing program... but in case you don't here it is.</p> <p>To copy an existing field in a window.</p> <ol> <li>Select the field(s).</li> <li>Hold down the <span class="nav">Ctrl</span> key (Windows) or the <span class="nav">Opt</span> key (Mac).</li> <li>Drag the field(s) to a new location on the window. When you release the mouse Omnis Studio <strong>copies</strong> the dragged field(s) to the new location.</li> </ol> <a name="editcodeastext" /> <h3>Edit Code as Text</h3> <p>You can comment out a line of code in the method editor, edit the code as text, and then uncomment the line of code.</p> <p>A couple of situations where I use this trick:</p> <ul> <li>Change <span class="code">Do method $MethodName</span> to <span class="code">Do $cinst.$MethodName</span></li> <li>Change <span class="code">Do List.$search(...</span> to <span class="code">If List.$search(...</span></li> </ul> <p>The steps for editing code as text are shown in the following example.</p> <ol> <li>Select the line of code you wish to edit.<br /> <br /> <p class="code">Do iList.$search($ref.ColName=Value,1,0,0,0) Returns LineNum<br /> If LineNum<br /> &nbsp;&nbsp;&nbsp;<span class="omcomment">; Do something</span><br /> End If</p> </li> <li>Press <kbd>Ctrl/Cmnd+;</kbd> to comment out the code.<br /> <br /> <p class="code"><span class="omcomment">; Do iList.$search($ref.ColName=Value,1,0,0,0) Returns LineNum</span></p> </li> <li>Change the commented out code.<br /> <br /> <p class="code"><span class="omcomment">; If iList.$search($ref.ColName=Value,1,0,0,0)</span></p> </li> <li>Press <kbd>Ctrl/Cmnd+:</kbd> to uncomment the code.<br /> <br /> <p class="code">If iList.$search($ref.ColName=Value,1,0,0,0)<br /> &nbsp;&nbsp;&nbsp;<span class="omcomment">; Do something</span><br /> End If</p> </li> </ol> <a name="f9catalog" /> <h3>F9 Catalog</h3> <p>The <span class="nav">F9 Catalog</span> is <strong>loaded</strong> with <span class="nav">Constants</span>, <span class="nav">Functions</span>, and other goodies which you need to know about when writing code. A very cool feature of the <span class="nav">Functions</span> is that you can drag any function along with its parameters directly into your code.</p> Be sure you have tooltips enabled! Hovering over a function or other item displays a tooltiip with more information. Right-click on the <span class="nav">Catalog</span> to set it and then right-click and <span class="nav">Save Window Setup</span> after you have it set. <a name="findandreplaceselectedlines" /> <h3>Find and Replace Selected Lines</h3> <p>You can use the Omnis Studio Find and Replace tool on selected lines in the method editor. As situation where I use this trick is if I copy a block of code from one method to another, but after copying the code I see that one of the variables used in the pasted in section of code needs to be change to the name of a local variable already included in the existing method. The steps for changing the variable name in pasted section of code area as follows:</p> <ol> <li>Select the pasted in lines of code in the code list of the method editor.</li> <li>Press <kbd>Ctrl/Cmnd+F</kbd> to open the <span class="nav">Find and Replace</span> window.</li> <li>Enter the old variable name in the <span class="nav">Find</span> field.</li> <li>Enter the new variable name in the <span class="nav">Replace</span> field.</li> <li>Check the following checkboxes: <span class="nav">Match whole words only, Use selected method, Select lines only</span>.</li> <li>Click the <span class="nav">Replace All</span> button.</li> </ol> <p>Find and relace selected lines... a handy feature of OMST!</p> <div class="image_sideline"><img src="http://www.studiotips.net/css/images/tip.gif" alt="Tip" /><p>You can remove selected <span class="nav">Find and Replace</span> log lines by right-clicking and selecting <span class="nav">Delete Selected Lines</span>.</p> </div> <a name="incorrectvariablecase" /> <h3>Incorrect Variable Case</h3> <p>After you enter a line of code Omnis Studio automatically corrects the case (upper or lower) of any characters in variables you type in your code to match the declared variable.</p> <p>If you have variable named <span class="code">iBooksList</span> and you enter <span class="code">ibookslist</span> in your code, Omnis Studio will change <span class="code">ibookslist</span> to <span class="code">iBooksList</span> after you press the <span class="nav">Enter</span> key or move to a different line in the code list.</p> <p>If you are editing an existing line of code, you can <em>intentionally</em> type the variable name in all lower case characters and then watch as you press the <kbd>Enter</kbd> key to make sure Omnis Studio changes the case. If the case is changed you know you've correctly entered the variable name.</p> <p class="code"><span class="omcomment">; There is no variable declared named 'iBookList' (singular)</span><br /> Do ibooklist.$search(kTrue)<br /> <br /> <span class="omcomment">; There is a variable named 'iBooksList' plural.</span><br /> <span class="omcomment">; After I change 'ibooklist' to 'ibookslist' and press the Enter key</span><br /> <span class="omcomment">; Omnis changes the case to match the declared variable.</span><br /> Do iBooksList.$search(kTrue)</p> <a name="interfacemanager" /> <h3>Interface Manager</h3> <p>If you aren't using the <span class="nav">Interface Manager</span>, then you are missing a powerful tool in Omnis Studio which can assist you greatly in writing your code.</p> <p>The <span class="nav">Interface Manager</span> lets you look at all the public methods of a class, their parameters, and description.</p> <p>You can drag methods from the <span class="nav">Interface Manager</span> directly into your code along with the list of parameters.</p> To learn more, go throught the StudioTips <span class="nav">Tutorials</span>. The time you take to go through the tutorials will pay back in the time you save over the next month of writing your own code. <a name="jumptoline" /> <h3>Jump to Line</h3> <p>Omnis Studio allows you to find and jump to lines of interest in the <span class="nav">Trace Log</span> list, <span class="nav">Find &amp; Replace</span> list, and <span class="nav">Omnis Commands</span> list:</p> <ol> <li>First, click in the list to move the focus to the list.</li> <li>Type an asterisk followed by the search criteria (Example: <kbd>*do m, *$add</kbd>). The line containing the first occurrence will immediately be selected.</li> <li>Use the plus (+) or minus signs (-) to move to the next or previous occurrence.</li> <li>A single press of the backspace key, or clicking again in the list will reset the search.</li> <li>You can use wild cards any number of times as in <kbd>*$active*kfalse</kbd></li> </ol> <a name="jumptosuperclassmethod" /> <h3>Jump to Superclass Method</h3> <p>If are in the method editor of a sublcass and want to look at the code in the superclass here are a few tricks for getting to the superclass method.</p> <ol> <li>If the subclass method is not yet overridden, simple double-click anywhere in code list of the method editor. Omnis Studio will open a new method editor window with the superclass method selected. After viewing or editing the superclass method, you can simply close the method editor window to return to the subclass method.</li> <li>If the subclass method is overridden and you have a <span class="code">Do inherited</span> Omnis command anywhere in the subclass method, select the <span class="code">Do inherited</span> line in the code list and press <kbd>F8</kbd>. Omnis Studio will open a new method editor window with the superclass method selected. After viewing or editing the superclass method, you can simply close the method editor window to return to the subclass method.<br /> <br /> <div class="image_sideline"><img src="http://www.studiotips.net/css/images/tip.gif" alt="Tip" /><p>If I don't have a <span class="code">Do inherited</span> in the overridden method code, I will often add one at the end of the method <strong>after</strong> a <span class="code">Quit method</span> command.<br /> <br /> <span class="code"><br /> ; Subclass method code of an overridden superclass method.<br /> Do iList.$definefromsqlclass('SomeTableClass')<br /> <br /> Quit method kTrue<br /> <br /> ; Include this line AFTER the Quit method.<br /> Do inherited <br /> ; Select the above line and press F8 to jump to superclass method.<br /> </span></p> </div></li> </ol> <a name="menusonthefly" /> <h3>Menus on-the-fly</h3> Instead of creating a menu class and manually adding menu lines for each and every menu in your application, create all your menus on-the-fly! See the <span class="nav">Menus</span> section in the <span class="nav">StudioTips - GUI</span> group. <a name="movingfieldstoadifferenttab" /> <h3>Moving Fields to a Different Tab</h3> <p>If you want to move some of the field from one tab to another tab of a tab pane object.</p> <ol> <li>Select the fields you want to move.</li> <li>Drag the fields so that the mouse pointer is over the tab you want to move the fields to.</li> <li>Press the Alt/Cmnd key and Omnis Studio will switch the tab pane to that tab without deselecting your fields.</li> <li>Continue dragging the fields to the location you want them on the now current tab and then release the mouse button.</li> </ol><div class="image_sideline"><img src="http://www.studiotips.net/css/images/tip.gif" alt="Tip" /><p>If you hold down the Ctrl/Opt key while dragging the fields, they will be <strong>copied</strong> to the other tab.</p> </div> <a name="notationerrorsandcando" /> <h3>Notation Errors and $cando</h3> <p>If you want to catch errors in your notation be sure to set the library preference <span class="code">$reportnotationerrors</span> to <span class="code">kTrue</span> for <strong>every</strong> one of your libraries.</p> <p>If you have calls to custom methods which may or may not exist, use <span class="code">$cando</span> to test for the existence of the method before calling it. This will avoid hitting a notation error for those optional custom method calls.</p> <p class="code"><span class="omcomment">; Optional call to a custom method which might not exist.</span><br /> If $cinst.$OptionalCustomMethod.$cando<br /> &nbsp;&nbsp;&nbsp;Do $cinst.$OptionalCustomMethod() Returns FlagOK<br /> End If</p> <a name="notationhelper" /> <h3>Notation Helper</h3> <p>Set the notation helper to respond really, really, fast so that you don't have to pause for it to help you when writing your code.</p> <ol> <li>Open Omnis Studio <span class="nav">Preferences</span></li> <li>Select the <span class="nav">General</span> tab.</li> <li>Set <span class="code">$notationhelptimer</span> to <kbd>50</kbd></li> </ol>This tip speeds up my coding, reduces typos, and saves me a <strong>lot</strong> of keystrokes! <a name="notationinspector" /> <h3>Notation Inspector</h3> <p>If you aren't using the <span class="nav">F4 Notation Inspector</span>, then you are missing one of the more powerful tools in Omnis Studio which can assist you in writing your code. Coupled with the <span class="nav">F6 Property Manager</span> they a great team. The Notation Inspector lets you brower everything in your Omnis Studio application and the <span class="nav">F6 Property Manange</span>r tells you all the methods and properties for anything you select in the <span class="nav">Notation Inspector</span>.</p> <p>You can drag properties or methods from the <span class="nav">Property Manager</span> directly into your methods.</p> To learn more, go throught the StudioTips <span class="nav">Tutorials</span>. The time you take to go through the tutorials will pay back in the time you save over the next month of writing your own code. <a name="pingmethod" /> <h3>Ping Method</h3> <p>I like to include the following <span class="code">$ping</span> method in the class methods of all my object, window, and table classes.</p> <p class="code"><span class="omcomment">; Return true. Open OK message if not(pbSilent).</span><br /> If not(pbSilent)<br /> &nbsp;&nbsp;&nbsp;OK message Ping (Icon) {$ping message received by... ////$lib: [$cclass.$lib().$name] ////$cclass: [$cclass().$name] ////$cinst: [$cinst().$name] ////$container: [$cinst.$container().$name]}<br /> End If<br /> Quit method kTrue</p> <p>If you are debugging and want to test sending a message to a class instance the <span class="code">$ping</span> method is a handy way to jump into the class instance's class methods.</p> <p class="code">Do $clib.$windows.wWinClassName.$openonce() Returns rWin<br /> If rWin<br /> &nbsp;&nbsp;&nbsp;<br /> &nbsp;&nbsp;&nbsp;<span class="omcomment">; Test sending a ping message to the window.</span><br /> &nbsp;&nbsp;&nbsp;Do rWin.$ping() Returns FlagOK<br /> &nbsp;&nbsp;&nbsp;<br /> End If</p> <p>I sometimes use the <span class="code">$ping</span> method with the <span class="code">pbSilent</span> parameter set to <span class="code">kTrue</span> in order to test for a valid instance in my runtime code as follows:</p> <p class="code"><span class="omcomment">; Dynamically point a variable to an object class instance.</span><br /> Do $clib.$objects.oObjectName.$new() Returns oObjInst<br /> <br /> <span class="omcomment">; Test for a valid instance using the $ping method.</span><br /> Do oObjInst.$ping(kTrue) Returns FlagOK<br /> If not(FlagOK)<br /> &nbsp;&nbsp;&nbsp;OK message Error (Icon) {Unable to $ping the object instance.}<br /> Else<br /> &nbsp;&nbsp;&nbsp;<span class="omcomment">; Continue</span><br /> End If<br /> Quit method Flag</p> <a name="programmertests" /> <h3>Programmer Tests</h3> <p>The StudioTips <span class="nav">Tips</span> menu has some handy menu lines which you can use for testing code.</p> <ol> <li><span class="nav">Programmer Test Method</span> - selecting this menu line takes you too a <span class="code">Breakpoint</span> in the menu's <span class="code">$event</span> method. Write any test code you below the <span class="code">Breakpoint</span> and the run the code.</li> <li><span class="nav">Programmer Test Window</span> - selecting this menu line opens the <span class="code">wProgrammerTests</span> window class where you can drag fields from the <span class="nav">Component Store</span> and test various window related objects and methods.</li> </ol>Consider both of these programmer test menu lines as your code testing scratch pad. Alway nearby and ready to use! <a name="pushbuttonshiftclickbreakpoint" /> <h3>Pushbutton Shift+Click Breakpoint</h3> <p>This trick is great a great help for developer testing and debugging! I put the following code in the <span class="code">$event</span> method of all my pushbuttons.</p> <p class="code">On evClick<br /> If #SHIFT<br /> &nbsp;&nbsp;&nbsp;Breakpoint<br /> End If</p> <p>This allows me to hold the shift key down when I click on any pushbutton or toolbar button and very easily break in and start stepping through the code.</p> <p>To save having to copy and paste the code into each pushbutton, you can add the code to the pushbutton in your <span class="nav">Component Store</span> as follows:</p> <ol> <li>Select and double-click any window class in the <span class="nav">F2 Browser</span>.</li> <li>Press <kbd>F3</kbd> to open the <span class="nav">Component Store</span>.</li> <li>Right-click anywhere on the <span class="nav">Component Store</span> window > select <span class="nav">Show Component Library in Browser</span>.</li> <li>F2 Browser > select ComponentStore library > double-click the <span class="code">_FieldComponents</span> window class.</li> <li>Double-click the <span class="nav">Push button</span> field to get to the field methods.</li> <li>Enter the following code in the <span class="code">$event</span> method of the <span class="nav">Push button</span> field.<br /> <br /> <p class="code">On evClick<br /> If #SHIFT<br /> &nbsp;&nbsp;&nbsp;Breakpoint<br /> End If</p> </li> <li>Close the <span class="nav">Method Editor</span>. </li> <li>Close the <span class="code">_FieldComponents</span> window class.</li> <li>Click the <span class="nav">Hide Component Store</span> button in the <span class="nav">F2 Browser</span>.</li> </ol> <p>The next pushbutton you drag out of the <span class="nav">Component Store</span> will include the code you just added to the <span class="code">$event</span> method.</p> <p>I also include the <span class="code">If #SHIFT Breakpoint End if</span> code in the <span class="code">$event</span> method of my tab pane objects, just after <span class="code">On evTabSelected</span>. This allows me to break into my code by shift+clicking on a tab.</p> <p>An extension of this trick is to include on all your window classes a tiny <span class="nav">Programmer Test</span> pushbutton which is only visible to developers. You add a <span class="code">$construct</span> method to the pushbutton and put the following code in the button to hide it from non-developers.</p> <p class="code"><span class="omcomment">; $construct method of Programmer Test pushbutton</span><br /> <span class="omcomment">; Hide the pushbutton from non-developers.</span><br /> If sys(2)&lt;&gt;1<br /> &nbsp;&nbsp;&nbsp;Do $cfield.$visible.$assign(kFalse)<br /> End If</p> <a name="selectingfieldsinacontainer" /> <h3>Selecting Fields in a Container</h3> <p>Trying to select a group of fields which are inside a container field (Paged Pane, Tab Pane, Group Box, Scrollbox) can be a real pain. If you try to drag a rectangle marque around the fields, the container field gets selected and you never get a chance to draw the marque rectangle around the fields inside the container.</p> Hold down the Ctrl/Cmnd key and you will be able to drag a marque around the field inside the container field without selecting the container field. <a name="topwindowmethods" /> <h3>Top Window Methods</h3> <p>Do you ever want to get to the methods of a window instance without breaking the instance?</p> <p>The StudioTips <span class="nav">Top Window Methods</span> menu line in the <span class="nav">Tips</span> menu does this for you.</p> <p>If you are reading this tip in the <span class="nav">StudioTips Browser</span>, press <kbd>Ctrl/Cmnd+Shift+T</kbd> right now. This is the shortcut key combination for the <span class="nav">Top Window Methods</span> menu line. (Think of it as an alternate to Ctrl/Cmnd+T)</p> Once you are <em>behind</em> the window instance, you can select a method, set a red breakpoint, then close the method editor and run the method from the instance. When code execution reaches the red breakpoint the method editor will open at that point and you can continue stepping through the code. <p class="footer">StudioTips Documentation - Copyright 2006 Vencor Software </p></div> </body> </html>