home *** CD-ROM | disk | FTP | other *** search
/ Chip Hitware 6 A / CHIP_HITWARE6_A.iso / internet / visIrc / INSTALL.EXE / RCDATA / CABINET / objectvs.txt < prev    next >
Text File  |  1997-09-02  |  68KB  |  1,703 lines

  1. ObjectViRCScript Documentation (for ViRC '97 1.00 and above) - Revision 7
  2. =========================================================================
  3.  
  4. Introduction
  5. ============
  6.  
  7. What is ObjectViRCScript? ObjectViRCScript is a set of object-based (and now
  8. object-oriented) extensions to the main ViRCScript language, adding a
  9. class/property/event model to ViRCScript, much as C++ adds a similar model to
  10. C.
  11.  
  12. Anyone who has programmed in Delphi before will feel instantly familiar with
  13. OVS - it uses Delphi's class library!! This was facilitated by Delphi's very
  14. comprehensive RTTI system which allows sufficient data to be extracted from
  15. classes and so forth at runtime to make programming the ObjectViRCScript
  16. interpreter relatively simple - OVS adds only about 1900 lines of code to the
  17. main ViRCScript interpreter.
  18.  
  19. What does ObjectViRCScript add?
  20. -------------------------------
  21.  
  22. OVS adds New and Destroy to create and destroy class objects, a new @p
  23. statement to set properties, and a $prop function to get properties. Also added
  24. is the ability to call object methods, either as statements or as functions to
  25. return values. New MAPOBJECT function and UNMAPOBJECT statement added to enable
  26. customization of ViRC '97's GUI (server windows, channel windows etc.). Adds
  27. WITH/ENDWITH for making setting multiple properties of an object easier.
  28. ADDTOSETPROP and REMOVEFROMSETPROP commands for dealing with objects' set
  29. properties.
  30.  
  31. In addition, 0.94pre10 and above allow you to define your own classes, which
  32. behave identically to the built-in Delphi VCL classes. Class support is
  33. currently rather primitive (although properties, methods and simple
  34. inheritance are supported), but will improve in later versions.
  35.  
  36. You can also use OVS to add tabs to the Client setup dialog and buttons to the
  37. toolbars. This is described under the MAPOBJECT function, which is central to
  38. extending V97's user interface with your own OVS code.
  39.  
  40. What's new in this release of ObjectViRCScript?
  41. -----------------------------------------------
  42.  
  43. New in 0.82: support for enumerated and set properties, many object methods,
  44. many new classes supported (including the TSockets class for writing sockets
  45. applications in ViRCScript, and TTimer for making timers), and
  46. MAPOBJECT/UNMAPOBJECT for customizing V97's built-in windows. New WITH/ENDWITH
  47. statements. ADDTOSETPROP/REMOVEFROMSETPROP statements.
  48.  
  49. New in 0.82a: a few more implemented methods documented, corrected many
  50. documentation inaccuracies (esp. in TSockets documentation).
  51.  
  52. New in 0.91: added SORT method to TListBox and TComboBox. Added GETDIRLIST and
  53. GETFILELIST methods to TStringList object. Corrected documentation
  54. inaccuracies (again). Improved TSockets a little. A few minor bug fixes.
  55.  
  56. New in 0.92: added InternalCall mechanism for chaining object events to
  57. built-in code. Improvements to TSockets for multiple simultaneous connections
  58. and other things. Added Execute method to TStringList. Added TFileListBox,
  59. TDirectoryListBox, and TDriveComboBox. Documented TShape object (added a long
  60. time ago, documented only now).
  61.  
  62. New in 0.94pre4: Added BEGINUPDATE and ENDUPDATE methods to TForm. Added new
  63. TBitmap and TOfficeButton objects.
  64.  
  65. New in 0.94pre9: Added new TIcon object.
  66.  
  67. New in 0.94pre10: Added simple class support. Added CLASSOF and PARENTCLASSOF
  68. functions.
  69.  
  70. New in 0.94pre10a: Support for TToolbarButton97, TToolbarSep97, and TEdit97
  71. objects, and the ability to add objects to the toolbars. Added new POSITION
  72. keyword to the NEW function.
  73.  
  74. New in 1.00rc3: Added new LoadFromAlias, SaveToAlias, LoadFromEvent and
  75. SaveToEvent methods to TStringList.
  76.  
  77. New in 1.00almost-final2: Extended MAPOBJECT function to support DCC/TDCC file
  78. transfer windows.
  79.  
  80. New in 1.00almost-final3: Added new MAPPEDOBJECTEXISTS function. Documentation
  81. for MAPOBJECT function substantially improved.
  82.  
  83. New in 1.00final: The ability to pass parameters to an OVS class's constructor
  84. has been added.
  85.  
  86. What's currently wrong with ObjectViRCScript?
  87. ---------------------------------------------
  88.  
  89. This is a difficult one ... not all methods of all Delphi objects are currently
  90. supported, although support will improve greatly in future versions.
  91.  
  92. A very quick introduction to ObjectViRCScript
  93. =============================================
  94.  
  95. This section has been updated slightly in 0.92.
  96.  
  97. This section is not intended to be a complete description of OVS and all its
  98. subtleties. For the complete treatment, read the rest of the file. :) This is
  99. just a quick section to get you started on the basics.
  100.  
  101. ObjectViRCScript adds objects to ViRCScript. An object can be a visual thing
  102. like a form or a button on the screen, or a more abstract thing like a list
  103. of strings (TStringList) or a socket control (TSockets) to send data over the
  104. internet.
  105.  
  106. Objects are created with the $new() function, and destroyed with the Destroy
  107. statement. Here's an example of some code which creates a form with a button
  108. on it. You'll soon see what all of this code does after you've read the rest
  109. of this section and the detailed descriptions of the $new() function later on.
  110.  
  111.         @ $form = $new(TForm)
  112.         @p $form.Left = 10
  113.         @p $form.Top = 10
  114.         @p $form.Width = 200
  115.         @p $form.Height = 200
  116.         @p $form.Caption = Test form
  117.         @p $form.Visible = True
  118.  
  119.         @ $button = $new(TButton ownedby $form)
  120.         @p $button.Left = 10
  121.         @p $button.Top = 10
  122.         @p $button.Width = 75
  123.         @p $button.Height = 25
  124.         @p $button.Caption = Click me!
  125.         @p $button.Visible = True
  126.  
  127. Anyone who has used the Borland Delphi or Borland C++Builder VCL class library
  128. will feel instantly familiar with this style of coding.
  129.  
  130. To describe just a few of the lines above:
  131.  
  132.         @ $form = $new(TForm)     This creates a new object of class TForm
  133.           ^            ^          and stores it in a variable called $form.
  134.           Variable     Class
  135.  
  136.         @p $form.Visible = True   This assigns the value True to $form's
  137.                  ^         ^      Visible property, making it appear on the
  138.                  Property  Value  screen.
  139.  
  140.  
  141.         @p $button = $new(TButton ownedby $form)  This creates a button that
  142.                                           ^       is owned by $form. This just
  143.                                           Owner   means the button sits inside
  144.                                                   $form when it's displayed.
  145.  
  146. An object property is simply a "data slot" in the object which can store a
  147. value, which can be a number, some text, or even another object. To set a
  148. property, use:
  149.  
  150.         @p $object.Property = Value
  151.  
  152. For example, to change $form's caption to "Test form", do this:
  153.  
  154.         @p $form.Caption = Test form
  155.  
  156. When you are finished with an object, destroy it with the Destroy statement.
  157. After an object has been destroyed, it disappears from the screen (if it's
  158. a visual object) and is no longer accessible. For example, to destroy $form:
  159.  
  160.         Destroy $form
  161.  
  162. Destroying an object will also automatically destroy all objects that it owns.
  163. So, in the above example, you don't need to destroy $button as well as
  164. destroying $form. Destroying $form will destroy $button too, as $button was
  165. created by the function $new(TButton ownedby $form).
  166.  
  167. Properties are read with $prop($object.Property), for example, this piece of
  168. code will display $form's caption in the server notices window:
  169.  
  170.         TextOut > . clBlack $prop($form.Caption)
  171.  
  172. A method actually executes a piece of code within the object. A method "tells"
  173. an object to do something, and may, or may not, return a value. An example of
  174. a method is the TStringList object's Add method, which adds an item to the
  175. string list, and returns the position in the list at which the item was added.
  176. If you call the method as a command, as follows, the return value is discarded:
  177.  
  178.         $list.Add Test 1
  179.  
  180. However, the method can also be called as a function, which returns the index
  181. the item has been added at, as follows:
  182.  
  183.         @ $itemindex = $list.Add(Test 1)
  184.  
  185. Notice that, when calling methods as functions, brackets are REQUIRED around
  186. the parameters, as with calling a regular ViRCScript function. When calling
  187. methods as statements (i.e. not as functions), DO NOT USE BRACKETS, just as
  188. with as regular ViRCScript statement.
  189.  
  190. To try to make this clearer, in the object documentation given later on in this
  191. file, the methods of each object are described. Some methods are given like
  192. this:
  193.  
  194.         MethodX         - Does something
  195.  
  196. Others are given like this:
  197.  
  198.         MethodY()       - Does something, and returns something
  199.  
  200. MethodX returns nothing, and so can only be called like this:
  201.  
  202.         $object.MethodX
  203.  
  204. MethodY returns a value. It can either be called like this, to obtain the
  205. value:
  206.  
  207.         @ $x = $object.MethodY()
  208.  
  209. Or it can be called like this, to discard the value:
  210.  
  211.         $object.MethodY
  212.  
  213. Remember that, although the method is documented as MethodY(), if you're
  214. calling it as a statement, rather than a function, you DO NOT USE BRACKETS,
  215. EVER. Remember this:
  216.  
  217.         Method called as a FUNCTION     - use brackets
  218.         Method called as a STATEMENT    - do not use brackets
  219.  
  220. This is really no different to the standard ViRCScript syntax.
  221.  
  222. This syntax is pretty flexible, with the exception of one advanced situation
  223. which you are probably never likely to encounter, but which I will mention
  224. anyway just in case. There is currently a parser restriction in that, when
  225. calling methods as functions, the object's name must consist of one variable
  226. only. Let me illustrate this with an example:
  227.  
  228. This code WILL work:
  229.  
  230.         @ $itemindex = $list.1.2.Add(Test 1)
  231.  
  232. This will add the item "Test 1" to the object $list.1.2. However, imagine you
  233. had 1 in $var1, and 2 in $var2, the following code WILL NOT work:
  234.  
  235.         @ $itemindex = $list.$var1.$var2.Add(Test 1)
  236.  
  237. This is because the object name is composed of more than one variable. Note
  238. that every other usage of this object will work. These will all work:
  239.  
  240.         $list.$var1.$var2.Add Test 1
  241.         @ $count = $prop($list.$var1.$var2.Count)
  242.  
  243. There is, however, a way around it. That is, assign a temporary variable
  244. with the value of the object, and then use that. So, instead of doing:
  245.  
  246.         @ $itemindex = $list.$var1.$var2.Add(Test 1)
  247.  
  248. You would actually do:
  249.  
  250.         @ $temp = $list.$var1.$var2
  251.         @ $itemindex = $temp.Add(Test 1)
  252.         -@ $temp
  253.  
  254. I hope this is clear. I will attempt to remove this limitation in a future
  255. version of OVS, although with the current state of the parser this change would
  256. break existing code, which I always endeavour to avoid. I hope this is clear.
  257.  
  258. ObjectViRCScript extension details
  259. ==================================
  260.  
  261. NEW function
  262. ------------
  263.  
  264. Usage: $new(class)
  265.        $new(class ownedby object)
  266.        $new(class ownedby object position left,top,width,height)
  267.  
  268. Creates a new object of type class, and returns an instance handle. Class can
  269. be any of the Delphi VCL classes, for example, TForm, TEdit, TButton, and so
  270. forth. If the optional ownedby object parameter is specified, the object's
  271. owner is set to that parameter. If you're creating a TForm, which has no owner
  272. (actually ViRC '97 itself is the owner), you must leave this parameter off -
  273. forms owning other forms does not make sense. Note: some objects, such as
  274. TForm, are created invisible. To show them, you need to change their Visible
  275. property (see the @P statement below). Examples:
  276.  
  277. The following code makes a new TForm object and assigns its instance handle to
  278. the $form variable. Notice that
  279.  
  280.         @ $form = $new(TForm)
  281.  
  282. Once the form has been created and assigned to $form, the following code adds a
  283. button to the form:
  284.  
  285.         @ $button = $new(TButton ownedby $form)
  286.  
  287. In addition, 0.94pre10a and above support the new position keyword. This allows
  288. an object to be positioned and sized correctly during creation, avoiding the
  289. need to set the Left, Top, Width and Height properties later on. Using the
  290. position keyword makes control creation faster and less flickery. Example:
  291.  
  292.         // This creates a button at coordinates (10,20) which is 100 pixels
  293.         // wide and 25 high. Equivalent to setting Left = 10, Top = 20,
  294.         // Width = 100, Height = 25 after the button has been created.
  295.  
  296.         @ $button = $new(TButton ownedby $form position 10,20,100,25)
  297.  
  298. DESTROY command
  299. ---------------
  300.  
  301. Usage: Destroy object
  302.  
  303. Destroys object, along with all the objects it owns, freeing all the memory
  304. associated with the objects. You should always use DESTROY to destroy any
  305. object you have created to conserve memory. Note that, if you have a TForm
  306. which owns a number of other controls, you only have to call DESTROY once for
  307. the form object, as all the controls it owns will be automatically destroyed as
  308. well. Example:
  309.  
  310. To destroy the form object $form and all controls that it owns:
  311.  
  312.         Destroy $form
  313.  
  314. DESTROY does _NOT_ deallocate the variable specified, only the object itself.
  315. Therefore, unless you're storing the object handle in a local variable, you
  316. should deallocate the variable after using the DESTROY command (e.g. -@ $form).
  317.  
  318. Note that Delete is synonymous with Destroy - you can use either.
  319.  
  320. @P command
  321. ----------
  322.  
  323. Usage: @p $object.Property = Value
  324.  
  325. Assigns Value to $object's Property property. For example, to change the TForm
  326. object $form's caption, and make it visible, you could do:
  327.  
  328.         @p $form.Caption = This is a test!!
  329.         @p $form.Visible = True
  330.  
  331. Please note that only a subset of Delphi's types are currently supported for
  332. properties. They are: integers, strings, booleans (use either 1 and 0 or True
  333. and False), enums, sets, and objects. Floats and variants are currently NOT
  334. supported, although this will probably change in future versions of OVS. For
  335. example, to set the active control on the form object $form to the button
  336. object $button, use:
  337.  
  338.         @p $form.ActiveControl = $button
  339.  
  340. You can set enum properties either by name, or by index. You will probably
  341. prefer to set them by name!! For example, the 2 lines below are equivalent,
  342. causing the $edit object to align itself with the bottom of its parent form.
  343.  
  344.         @p $edit.Align = 2
  345.         @p $edit.Align = alBottom
  346.  
  347. Of course, the latter is far more self-explanatory.
  348.  
  349. You can also retrieve set properties. Set properties are similar to enums,
  350. except that multiple elements within the set can be set at once. A very common
  351. set property (possibly the only one you will ever use) is TForm.BorderIcons.
  352. This controls what icons are present in a form's border. The BorderIcons set
  353. may contain any combination of biSystemMenu, biMinimize, and biMaximize. Set
  354. properties MUST be included in []'s (even if there is only one member (or even
  355. no members) in the set) and multiple elements must be separated by , (a comma).
  356. Examples:
  357.  
  358.         // Makes the form's border contain only a system menu icon
  359.         @p $form.BorderIcons = [biSystemMenu]
  360.  
  361.         // Show all the icons in a form's border
  362.         @p $form.BorderIcons = [biSystemMenu,biMinimize,biMaximize]
  363.  
  364.         // Show no icons in the form's border
  365.         @p $form.BorderIcons = []
  366.  
  367. You can also add or remove specific values from a set. See the ADDTOSETPROP and
  368. REMOVEFROMSETPROP commands below for more information.
  369.  
  370. In addition, OBJECT EVENTS may be set with @p. This can be illustrated with
  371. some very simple examples:
  372.  
  373.         @p $button.OnClick = MessageBox You clicked me!!
  374.  
  375.         @p $form.OnClose = Beep
  376.  
  377. If you want to execute more than one command in response to an object event,
  378. define an alias and call that, for example:
  379.  
  380.         @p $closebutton.OnClick = CLOSEBUTTON_CLICK
  381.  
  382.         Alias CLOSEBUTTON_CLICK
  383.           MessageBox I'll now close the form!!
  384.           Destroy $form
  385.         EndAlias
  386.  
  387. In addition, with some events, ViRC '97 will pass in extra information in the
  388. form of local variables. In fact, V97 always passes in $Sender, which is the
  389. object that caused the event. Thus you can create one alias which handles
  390. events from a number of objects of different types. The following events are
  391. supported:
  392.  
  393.         Mouse events
  394.         ------------
  395.  
  396.         Event names: OnMouseUp, OnMouseDown
  397.         Variables passed in: $Button - button pressed. Can be mbLeft, mbRight
  398.                                        or mbMiddle.
  399.                              $X      - X coordinate of where the mouse is.
  400.                              $Y      - Y coordinate of where the mouse is.
  401.  
  402.         Mouse move events
  403.         -----------------
  404.  
  405.         Event names: OnMouseMove
  406.         Variables passed in: $X      - X coordinate of where the mouse is.
  407.                              $Y      - Y coordinate of where the mouse is.
  408.  
  409.         Key events
  410.         ----------
  411.  
  412.         Event names: OnKeyUp, OnKeyDown
  413.         Variables passed in: $Key    - The scan code for the key pressed. You
  414.                                        can modify this value in your
  415.                                        OnKeyUp/OnKeyDown events to simulate as
  416.                                        if a different key were pressed. For
  417.                                        example, if you wish to nullify a key
  418.                                        press, set $Key to 0 in your code.
  419.  
  420.         Key press events
  421.         ----------------
  422.  
  423.         Event names: OnKeyPress
  424.         Variables passed in: $Key    - The key pressed (e.g. A, 0, & etc). You
  425.                                        can change this value in your
  426.                                        OnKeyUp/OnKeyDown events to simulate as
  427.                                        if a different key were pressed.
  428.  
  429. Drag-and-drop events are also supported, although their usage is rather
  430. complicated, and I will refrain from documenting them until they work well.
  431.  
  432. ADDTOSETPROP command
  433. --------------------
  434.  
  435. Usage: AddToSetProp object.property set
  436.  
  437. Combines set with the set property object.property. This is used to add values
  438. to a set. For example, this code will display the minimize icon on a form's
  439. border by adding the item biMinimize to the BorderIcons set:
  440.  
  441.         AddToSetProp $form.BorderIcons [biMinimize]
  442.  
  443. Note that if biMinimize is already present in the set, the second addition will
  444. have no effect, in other words, ADDTOSETPROP will only add an item to a set if
  445. it isn't already in the set. You can add multiple items to a set as well.
  446. Example:
  447.  
  448.         AddToSetProp $form.BorderIcons [biMaximize,biMinimize]
  449.  
  450. ADDTOSETPROP is an efficient wrapper around the standard VS ADDTOSET function.
  451. For example:
  452.  
  453.         AddToSetProp $form.BorderIcons [biMaximize,biMinimize]
  454.  
  455. Is equivalent to this:
  456.  
  457.         @p $form.BorderIcons = $AddToSet($prop($form.BorderIcons) [biMaximize,biMinimize])
  458.  
  459. REMOVEFROMSETPROP command
  460. -------------------------
  461.  
  462. Usage: AddToSetProp object.property set
  463.  
  464. Removes any elements from object.property that are also present in set. For
  465. example, the following code will remove the minimize icon from a form's border
  466. by removing the biMinimize element from the set:
  467.  
  468.         RemoveFromSetProp $form.BorderIcons [biMinimize]
  469.  
  470. You can remove multiple items from a set at once (see above). Attempting to
  471. remove an item from a set which isn't in the set will have no effect.
  472.  
  473. REMOVEFROMSETPROP is an efficient wrapper around the standard VS REMOVEFROMSET
  474. function. For example:
  475.  
  476.         RemoveFromSetProp $form.BorderIcons [biMaximize,biMinimize]
  477.  
  478. Is equivalent to this:
  479.  
  480.         @p $form.BorderIcons = $RemoveFromSet($prop($form.BorderIcons) [biMaximize,biMinimize])
  481.  
  482. WITH/ENDWITH statement
  483. ----------------------
  484.  
  485. (should this be in VSCRIPT.TXT instead? Or as well?)
  486.  
  487. Usage: With command
  488.          ...
  489.        EndWith
  490.  
  491. This very useful statement makes setting multiple object properties (for
  492. example) very easy. Basically, command is prepended to every line in the
  493. WITH/ENDWITH block before execution. Example (from WEBSERV.VSC):
  494.  
  495.         @ $webform = $new(TTabbedForm)
  496.         With @p $webform.
  497.              Left = 20
  498.              Top = 20
  499.              Width = 300
  500.              Height = 300
  501.              FormStyle = fsStayOnTop
  502.              Caption = ObjectViRCScript Web Server Example
  503.              TabCaption = Web server
  504.              Visible = True
  505.         EndWith
  506.  
  507. This would be equivalent to:
  508.  
  509.         @ $webform = $new(TTabbedForm)
  510.         @p $webform.Left = 20
  511.         @p $webform.Top = 20
  512.  
  513.         etc.
  514.  
  515. As can be seen, WITH makes setting multiple object properties very simple.
  516. Although this is the use WITH was designed for, it's possible to use it without
  517. objects. For example, you can use this to make outputting multiple lines of
  518. text to a query window very simple:
  519.  
  520.  
  521.         With TextOut > TextQuery clBlue $null
  522.              Hello!!
  523.              This is a very good way ...
  524.              ... to add lots of lines of text at once ...
  525.              ... to a window.
  526.         EndWith
  527.  
  528. The $null is required to ensure that the space after clBlue is not removed by
  529. the parser.
  530.  
  531. PROP function
  532. -------------
  533.  
  534. Usage: $prop($object.Property)
  535.  
  536. Returns the property Property of $object. For example, to retrieve the contents
  537. of a TEdit control, you could use:
  538.  
  539.         @ $x = $prop($edit.Text)
  540.  
  541. The PROP function can currently return integer, string, boolean, enum, object,
  542. and event properties. Other Delphi property types aren't supported yet, but
  543. they should be in future versions of OVS.
  544.  
  545. The returning of event properties is supported as follows. The simplest usage
  546. is something like as follows:
  547.  
  548.         @p $button.OnClick = BUTTON_CLICKED
  549.  
  550. Now, $prop($button.OnClick) will return the string BUTTON_CLICKED, as expected.
  551. However, a more complex usage of this also exists. PROP can also be used to
  552. return methods that are DEFINED INTERNALLY BY V97. For example, V97's main form
  553. contains a control called ExitBtn, which is the quit button. You can use
  554. the MAPOBJECT function to map this control, as follows:
  555.  
  556.         @ $exitbtn = $mapobject(!Main:ExitBtn)
  557.  
  558. The ExitBtn's OnClick event contains, of course, Delphi code to exit V97. But
  559. PROP can't return anything sensible here, as it only makes sense to return OVS
  560. code. Rather, PROP will return a string which looks something like this:
  561.  
  562.         InternalCall $004CD950 $00B11CAC $00B14D90
  563.  
  564. INTERNALCALL is a valid ViRCScript command which calls an internal section of
  565. V97 code. The parameters passed in are pointers to the code, owner data and
  566. object data required by the call. If the INTERNALCALL command returned by PROP
  567. is executed, it will call the code in the original V97 event.
  568.  
  569. You will never use INTERNALCALL directly. Rather, it is very useful for
  570. "hitching" ViRCScript code onto existing Delphi code in V97. For example, the
  571. following code will display a message box when the user clicks on ExitBtn,
  572. before actually calling the Delphi code which makes V97 quit:
  573.  
  574.         @ $exitbtn = $mapobject(!Main:ExitBtn)
  575.         @ $icall = $prop($exitbtn.OnClick)
  576.         @p $exitbtn.OnClick = HITCHED_EXIT
  577.  
  578.         Alias HITCHED_EXIT
  579.           MessageBox ViRC '97 will now exit!!
  580.           $icall
  581.         EndAlias
  582.  
  583. The value returned in the variable $icall above is an INTERNALCALL command.
  584. The command inside the variable is called with the line "$icall" in the new
  585. code you define for the event.
  586.  
  587. OVSVER variable
  588. ---------------
  589.  
  590. Usage: $ovsver
  591.  
  592. This variable contains the ObjectViRCScript version number. V97 0.94pre10a and
  593. above return an ObjectViRCScript version number of 7. The presence of this
  594. variable is useful, as it allows you to test in your script whether the user is
  595. running an ObjectViRCScript-capable version of ViRC '97 or not, for example:
  596.  
  597. if !($ovsver)
  598.    MessageBox This script requires ViRC '96 0.80 or higher with ObjectViRCScript to function.
  599.    Halt
  600. endif
  601.  
  602. MAPOBJECT function
  603. ------------------
  604.  
  605. Usage: $mapobject(window[:control])
  606.  
  607. This is possibly THE most powerful function in ObjectViRCScript. What it does
  608. is to return an ObjectViRCScript object handle for any built-in ViRC '97
  609. window. You can then add controls to it or change properties as if it were an
  610. object which you have created yourself. Note that this is a command for
  611. advanced scripters only - and a knowledge of how the Delphi object-based VCL
  612. works is highly beneficial here. If you don't understand this - don't worry.
  613. You can write some great scripts without it, but good usage of this function
  614. will allow you to integrate your scripts seamlessly into the V97 interface.
  615.  
  616. Practically any V97 window can be mapped as an OVS object with this function.
  617. You can map server, channel, query, DCC Chat, and DCC/TDCC Get/Send windows.
  618.  
  619. The current server notices window is mapped by using . (a period) as the
  620. window parameter.
  621.  
  622. A channel window is mapped by using #channel (e.g. to map #virc, use #virc as
  623. the window parameter).
  624.  
  625. A query window is mapped by using nick (e.g. to map a query window to Mr2001,
  626. use Mr2001 as the window parameter).
  627.  
  628. A DCC Chat window is mapped by using =nick (e.g. to map a DCC Chat window to
  629. Mr2001, use =Mr2001 as the window parameter).
  630.  
  631. A DCC Send window is mapped by using *SEND/nick/filename (e.g. to map a DCC
  632. Send connection to Mr2001, sending the file README.TXT, use
  633. *SEND/Mr2001/README.TXT as the window parameter).
  634.  
  635. A DCC Get window is mapped by using *GET/nick/filename (e.g. to map a DCC
  636. Get connection from Mr2001, getting the file README.TXT, use
  637. *GET/Mr2001/README.TXT as the window parameter).
  638.  
  639. A TDCC Send window is mapped by using *TSEND/nick/filename (e.g. to map a TDCC
  640. Send connection to Mr2001, sending the file README.TXT, use
  641. *TSEND/Mr2001/README.TXT as the window parameter).
  642.  
  643. A TDCC Get window is mapped by using *TGET/nick/filename (e.g. to map a TDCC
  644. Get connection from Mr2001, getting the file README.TXT, use
  645. *TGET/Mr2001/README.TXT as the window parameter).
  646.  
  647. Some specific uses of this function are detailed below.
  648.  
  649. This function is designed primarily to be used in the <OnCreateWindow> event,
  650. which is fired whenever a new channel window or server window is created. Two
  651. parameters are passed to the event: $0 is the class of the window created
  652. (TServerForm or TChannelForm), and $1 is the standard name of the window. So,
  653. server windows always have a name of . (period), channel windows have names of
  654. #channel, and so forth.
  655.  
  656. For example, this very simple example changes the colour of the text entry area
  657. of server windows to a random colour whenever a new one is opened. Note that,
  658. with server windows, $1 is always . (period), so you could replace
  659. $mapobject($1:tbServerText) with $mapobject(.:tbServerText).
  660.  
  661. Event <OnCreateWindow> "TServerForm"
  662.   @ $servertext = $mapobject($1:tbServCommand)
  663.   @p $servertext.Color = $rand($FFFFFF)
  664.   UnmapObject $servertext
  665. EndEvent
  666.  
  667. Another example: to make text entry areas in channel windows appear at the top
  668. of the window rather than the bottom, you could use:
  669.  
  670. Event <OnCreateWindow> "TChannelForm"
  671.   @ $chanentry = $mapobject($1:tbChanCommand)
  672.   @p $chanentry.Align = alTop
  673.   UnmapObject $chanentry
  674. EndEvent
  675.  
  676. Really, knowledge of all the names of the controls on server and channel
  677. windows is needed, so I might release the source .DFM files for those forms so
  678. anyone with Delphi can find the names themselves. However, this should get
  679. you started:
  680.  
  681. Server window only
  682. ------------------
  683.  
  684.         tbServCommand   - TEdit entry box where the user types commands
  685.         tbServerText    - TRichEdit where server text appears
  686.         ServerSocket    - The actual server connection TSockets object
  687.         ServerToolbar   - The toolbar containing the main server functions
  688.         ServerSelectToolbar - The toolbar containing the server selection
  689.                               combo box
  690.  
  691. Channel window only
  692. -------------------
  693.  
  694.         tbChanCommand   - TEdit entry box where the user types commands
  695.         tbChannelText   - TRichEdit where channel text appears
  696.         NamesPanel      - TPanel containing lvNames
  697.         lvNames         - TListView where the channel nick list is
  698.                           *** NOTE *** TListView is not fully supported by
  699.                           OVS yet. However, you can read/write a TListView's
  700.                           ItemText and ItemIndex properties to fetch the
  701.                           currently-selected nick in a channel nicks list, for
  702.                           example (or you could use the regular ViRCScript
  703.                           function $selectednick() for this, which is probably
  704.                           a LOT simpler!! :)
  705.         ChannelToolbar  - The toolbar containing the channel functions
  706.         AttributesToolbar - The toolbar containing the B, U, I, and colour
  707.                             selection buttons
  708.         TopicToolbar    - The toolbar containing the topic selection edit box
  709.  
  710. Query windows
  711. -------------
  712.  
  713.         tbChatCommand   - TEdit entry box where the user types commands
  714.         tbQueryText     - TRichEdit where server text appears
  715.         QueryToolbar    - The toolbar containing the query functions
  716.         AttributesToolbar - The toolbar containing the B, U, I, and colour
  717.                             selection buttons
  718.  
  719. DCC Chat windows
  720. ----------------
  721.  
  722.         DCCSocket       - The actual DCC connection TSockets object
  723.         tbChatCommand   - TEdit entry box where the user types commands
  724.         DCCChatToolbar  - The toolbar containing the query functions
  725.  
  726. Channel, server, query and DCC Chat windows
  727. -------------------------------------------
  728.  
  729.         MainPanel       - TPanel containing text output box
  730.         EntryPanel      - TPanel containing entry box
  731.         WholePanel      - TPanel containing MainPanel and EntryPanel
  732.         ToolbarPanel    - TPanel containing toolbar
  733.  
  734. DCC/TDCC transfer windows
  735. -------------------------
  736.  
  737.         DCCSocket       - The actual DCC connection TSockets object
  738.         txFrom          - TLabel corresponding to the "From:" or "To:" field
  739.         txStatus        - TLabel corresponding to the "Status:" field
  740.         txFilename      - TLabel corresponding to the "Filename:" field
  741.         txSize          - TLabel corresponding to the "Size:" field
  742.         txPercent       - TLabel corresponding to the "Progress:" field
  743.         txSpeed         - TLabel corresponding to the "Speed:" field
  744.         txTimeLeft      - TLabel corresponding to the "Time left:" field
  745.  
  746. The MAPOBJECT function can also be used to return an internal ViRC '97 form,
  747. for example, the client setup form. The list of supported forms is as follows:
  748.  
  749.         !AboutBox
  750.         !Aliases
  751.         !ChannelBox
  752.         !ChannelList
  753.         !EditXDCCPack
  754.         !EventManager
  755.         !FingerClientDialog
  756.         !TipForm
  757.         !IRCServers
  758.         !UserSetup
  759.         !ListFilter
  760.         !LoadingScript
  761.         !Main
  762.         !MenuEditor
  763.         !PortScanner
  764.         !ResumeDlg
  765.         !Links
  766.         !VSWizard
  767.         !WHOIS
  768.         !WhoList
  769.  
  770. You can thus add controls to any of these forms. For example:
  771.  
  772.         @ $aliasform = $mapobject(!Aliases)
  773.         @ $button = $new(TButton ownedby $aliasform)
  774.  
  775. In addition, the !UserSetup form's page control is called SetupPages. Thus you
  776. can add your own tab to ViRC '97's client setup dialog!! For example, this
  777. code will add a new tab sheet to the client setup dialog which contains one
  778. button:
  779.  
  780.         @ $SetupPages = $mapobject(!UserSetup:SetupPages)
  781.  
  782.         @ $NewTabSheet = $new(TTabSheet ownedby $SetupPages)
  783.         With @p $NewTabSheet.
  784.              PageControl = $SetupPages
  785.              Caption = Test tab
  786.         EndWith
  787.  
  788.         @ $NewButton = $new(TButton ownedby $NewTabSheet)
  789.         With @p $NewButton.
  790.              Left = 20
  791.              Top = 36
  792.              Width = 73
  793.              Height = 65
  794.              Caption = &Beep!!
  795.              OnClick = Beep
  796.         EndWith
  797.  
  798.         $SetupPages.RefreshTabs
  799.         UnmapObject $SetupPages
  800.  
  801. If you do add pages to V97's client setup dialog, you must call the RefreshTabs
  802. method to ensure that the pages are refreshed properly, otherwise you will
  803. experience visual problems. You only need to call RefreshTabs on V97's client
  804. setup dialog, never on your own tab controls.
  805.  
  806. Finally, how to add your own buttons to the toolbars. There are two supported
  807. OVS objects for use with toolbars - TToolbarButton97, which is a toolbar
  808. button, and TToolbarSep97, which is a button separator. These objects are
  809. described in more detail later on, but I'll just give here a simple example on
  810. how to add some buttons and a panel to the server window's toolbar.
  811.  
  812. First, you have to map the server window's toolbar using the $mapobject()
  813. function. As described in the list above, the server window's toolbar is called
  814. ServerToolbar (original, huh? :). Once it's mapped, you can add controls to it,
  815. just like anything else.
  816.  
  817. Event <OnCreateWindow> "TServerForm"
  818.   @l $toolbar = $mapobject($1:ServerToolbar)
  819.   @l $form = $mapobject($1)
  820.  
  821.   // Load some bitmaps from disk - change these filenames to bitmaps
  822.   // you actually have!!
  823.  
  824.   @l $bmp1 = $new(TBitmap)
  825.   $bmp1.LoadFromFile bitmap1.bmp
  826.  
  827.   @l $bmp2 = $new(TBitmap)
  828.   $bmp2.LoadFromFile bitmap2.bmp
  829.  
  830.   // Stop server form from updating until all the buttons have been added
  831.  
  832.   $form.BeginUpdate
  833.  
  834.   // Add a separator to the toolbar (toolbar buttons are now added to the right
  835.   // of the toolbar automatically)
  836.  
  837.   @ $sep = $new(TToolbarSep97 ownedby $toolbar)
  838.   @p $sep.Visible = True
  839.  
  840.   // Now add two buttons
  841.  
  842.   @ $button1 = $new(TToolbarButton97 ownedby $toolbar)
  843.   @p $button1.Visible = False
  844.   @p $button1.Glyph = $bmp1
  845.   @p $button1.OnClick = Beep
  846.   @p $button1.Visible = True
  847.  
  848.   @ $button2 = $new(TToolbarButton97 ownedby $toolbar)
  849.   @p $button2.Visible = False
  850.   @p $button2.Glyph = $bmp2
  851.   @p $button2.Width = 90
  852.   @p $button2.Caption = Click me!!
  853.   @p $button2.OnClick = Beep
  854.   @p $button2.Visible = True
  855.  
  856.   // Now add a panel
  857.  
  858.   @ $panel1 = $new(TPanel ownedby $toolbar)
  859.   @p $panel1.Visible = False
  860.   @p $panel1.Width = 70
  861.   @p $panel1.Height = 20
  862.   @p $panel1.Caption = Hello!!
  863.   @p $panel1.Visible = True
  864.  
  865.   // Update the server form
  866.  
  867.   $form.EndUpdate
  868.  
  869.   UnmapObject $form
  870.   UnmapObject $toolbar
  871. EndEvent
  872.  
  873. In addition, when TToolbarButton97 objects are added to V97's server toolbar,
  874. the Tag property takes on a special meaning. Setting Tag to 1 makes the button
  875. automatically disable itself when not connected to a server. Setting Tag to 2
  876. makes the button automatically disable itself when connected to a server. Note
  877. that, when creating the button, you have to set the Enabled property to what
  878. you want the initial state of the button to be. Tag only changes the state of
  879. the button when a connection to the server is established or closed.
  880.  
  881. UNMAPOBJECT command
  882. -------------------
  883.  
  884. Usage: UnmapObject object
  885.  
  886. The MAPOBJECT function creates a ViRCScript object handle representing a
  887. built-in V97 object. You must use the UNMAPOBJECT command to remove the object
  888. handle when you have finished using it, otherwise, the object handle will be
  889. left in memory (each object handle only takes 4 bytes, but these can add up).
  890. UNMAPOBJECT, unlike DESTROY, does not harm the underlying object, but merely
  891. removes its ObjectViRCScript handle.
  892.  
  893. CLASS statement
  894. ---------------
  895.  
  896. Usage: Class name
  897.          ...
  898.        EndClass
  899.  
  900.        Class name extends parentname
  901.          ...
  902.        EndClass
  903.  
  904. Defines a new OVS class, name. If the extends keyword is specifed, the new
  905. class will descend from parentname. This simply means that all properties and
  906. methods are "copied" from the parentname class into your new class
  907. automatically. Between the Class and EndClass statements are class definition
  908. statements. You may currently define properties and methods. Properties, like
  909. regular OVS object properties, are simply data holders. Methods are functions
  910. which can be called, possibly passing parameters (these are available as $1,
  911. $2 etc.). Here's a small example class:
  912.  
  913.         Class TDemoClass
  914.           Property Name
  915.           Method Hello
  916.             MessageBox Hello from TDemoClass!! My name is $prop($Self.Name).
  917.           EndMethod
  918.         EndClass
  919.  
  920. Notice that, in every class method definition, a special local variable is
  921. passed in, $Self. This is the object whose method is being called. If you're
  922. using $prop() or @p inside a method to get or set a property, the property name
  923. must be prefixed with $Self, as shown above. The above class can be used as
  924. follows, just like a regular OVS class:
  925.  
  926.         @ $test = $new(TDemoClass)
  927.         @p $test.Name = Fred
  928.         $test.Hello
  929.  
  930. This will display a message box containing "Hello from TDemoClass!! My name is
  931. Fred." on the screen. Now, I'll demonstrate inheritance. You can make a new
  932. class, TDemoClass2, which will inherit all the properties and methods from
  933. TDemoClass, and will add a new method too:
  934.  
  935.         Class TDemoClass2 extends TDemoClass
  936.           Method Goodbye
  937.             MessageBox Goodbye from TDemoClass2!! My name is $prop($Self.Name).
  938.           EndMethod
  939.         EndClass
  940.  
  941. The class can be used as follows:
  942.  
  943.         @ $test = $new(TDemoClass2)
  944.         @p $test.Name = Fred
  945.         $test.Hello
  946.         $test.Goodbye
  947.  
  948. This will display the hello and goodbye messages, as expected. Now, everything
  949. should be pretty clear.
  950.  
  951. Finally, there are a few special methods supported: <Create> and <Destroy>. The
  952. <Create> method is automatically called when the object is created. The
  953. <Destroy> method is automatically called when the object is destroyed. You can
  954. put code in these methods, for example, to set up the properties in an object
  955. to default values when it's created. Example:
  956.  
  957.         Class TDemoClass3
  958.           Method <Create>
  959.             MessageBox I'm being created!!
  960.           EndMethod
  961.           Method <Destroy>
  962.             MessageBox I'm being destroyed!!
  963.           EndMethod
  964.         EndClass
  965.  
  966. In addition, in 1.00 final and above, extra parameters may be supplied to the
  967. constructor, and these are available as $1, $2 etc. For example (thanks to
  968. Mr2001 for this idea, and the following code snippet):
  969.  
  970.         Class TMessageMaker
  971.           Method <Create>
  972.             TextOut > $1 clGreen *** Happy new year!!
  973.           EndMethod
  974.         EndClass
  975.  
  976.         @l $obj = $new(TMessageMaker #virc)
  977.  
  978. Property handlers (methods that control the setting and getting of properties)
  979. are currently not supported, but should be in a future version. Also, you
  980. cannot inherit from any built-in (VCL) objects, like TButton. You can only
  981. inherit from your own OVS objects you have defined yourself. This is because
  982. insufficient information is available for the VCL objects at run-time to
  983. inherit from them.
  984.  
  985. CLASSOF function
  986. ----------------
  987.  
  988. Usage: $classof(object)
  989.  
  990. Returns the class name of object. Returns TUnknown if object isn't valid.
  991.  
  992. PARENTCLASSOF function
  993. ----------------------
  994.  
  995. Usage: $parentclassof(object)
  996.        $parentclassof(class)
  997.  
  998. Returns the name of the parent class of object (or class). Returns TUnknown if
  999. the parent class cannot be retrieved, or if object or class isn't valid. All
  1000. objects ultimately derive from TObject. Objects created from OVS classes that
  1001. you have defined derive from TOVSObject, which, in turn, derives from TObject.
  1002.  
  1003. Special objects
  1004. ===============
  1005.  
  1006. On startup, ViRC '97 creates the special object handle 0 which represents the
  1007. main ViRC '97 window. This is useful if you wish to manipulate the main V97
  1008. window, for example, the following code will hide ViRC '97:
  1009.  
  1010.         @p 0.Visible = False
  1011.  
  1012. Or you can add your own controls to ViRC '97's main window by setting their
  1013. owner to 0, for example, the following code will add a button to the main V97
  1014. window which quits V97 when you click on it:
  1015.  
  1016.         @ $mainbtn = $new(TButton ownedby 0)
  1017.         With @p $mainbtn.
  1018.              Left = 30
  1019.              Top = 60
  1020.              Width = 150
  1021.              Height = 25
  1022.              Caption = &Exit
  1023.              OnClick = Exit
  1024.         EndWith
  1025.  
  1026. Visual controls
  1027. ===============
  1028.  
  1029. The following major visual controls are currently supported fully: TForm,
  1030. TTabbedForm, TButton, TBitBtn, TListBox, TComboBox, TFileListBox,
  1031. TDirectoryListBox, TDriveComboBox, TEdit, TMemo, TRichEdit, TCheckBox,
  1032. TRadioButton, TGroupBox, TPanel, TBevel, TShape, TTrackBar, TProgressBar,
  1033. TTabControl, TOfficeButton, TToolbarButton97, TToolbarSep97, TEdit97. Here I'll
  1034. try to document some of the features of each object.
  1035.  
  1036. All objects
  1037. -----------
  1038.  
  1039. The following properties are shared by all visual objects:
  1040.  
  1041.         Left            - X position of object
  1042.         Top             - Y position of object
  1043.         Width           - Width of object
  1044.         Height          - Height of object
  1045.         Visible         - (True or False) Controls whether object is visible
  1046.         Enabled         - (True or False) Controls whether object is enabled
  1047.         Color           - The background colour of the object
  1048.         Font.Color      - The object's font colour
  1049.         Font.Name       - The object's font name
  1050.         Font.Size       - The object's font size
  1051.         Font.Style      - (set) fsBold, fsItalic, fsUnderline, fsStrikeout
  1052.         Hint            - The tooltip that appears if the user holds the mouse over the control for a while without clicking
  1053.         ShowHint        - (True or False) Controls whether the tooltip is displayed or not
  1054.         Align           - Causes the control to "stick" to one edge of its parent, or to fill the whole client area. alNone, alTop, alBottom, alLeft, alRight, alClient
  1055.         Handle          - Returns the control's window handle (hWnd)
  1056.  
  1057. The following events are shared by all visual objects:
  1058.  
  1059.         OnClick         - Fired when object is clicked
  1060.         OnMouseMove     - Fired when mouse moved over object
  1061.         OnMouseDown     - Fired when mouse button pressed over object
  1062.         OnMouseUp       - Fired when mouse button released over object
  1063.         OnActivate      - Fired when the object gets the focus
  1064.  
  1065. Supported by most visual objects (where appropriate):
  1066.  
  1067.         OnChange        - Fired when object's selection (item, check mark, tab page, etc.) is changed
  1068.  
  1069. Methods:
  1070.  
  1071.         Repaint         - Causes the object, and all the objects it owns, to redraw themselves
  1072.         SetFocus        - Sets focus to the object
  1073.         BringToFront    - Brings the object to the front of the screen
  1074.  
  1075. Objects that introduce no additional properties or events will not be
  1076. documented further - their usage should be self-explanatory!!
  1077.  
  1078. In addition, most objects have a standard BorderStyle property (except for the
  1079. TForm), which can be bsNone for no border or bsSingle for a single black line
  1080. border.
  1081.  
  1082. TForm
  1083. -----
  1084.  
  1085. Properties:
  1086.  
  1087.         ActiveControl   - The control that has the focus when the form appears
  1088.         BorderStyle     - bsSingle, bsDialog, bsNone, bsSizeable
  1089.         FormStyle       - fsNormal, fsMDIForm, fsMDIChild, fsStayOnTop
  1090.         Position        - poDefault, poScreenCenter
  1091.         WindowState     - wsNormal, wsMaximized, wsMinimized
  1092.         Caption         - The form's caption
  1093.         BorderIcons     - (set) biSystemMenu, biMaximize, biMinimize
  1094.         Icon            - The form's icon. Normally the standard VS icon, but
  1095.                           this can be changed (TIcon - see the "Non-visual
  1096.                           objects" section below)
  1097.  
  1098.         OnClose         - Fired when the form is closed (it's a good idea to
  1099.                           DESTROY the form here, otherwise it will stay in
  1100.                           memory!!)
  1101.  
  1102. Events:
  1103.  
  1104.         OnResize        - Fired when the form's size is adjusted
  1105.  
  1106. Methods:
  1107.  
  1108.         ShowModal       - Shows the form modally. Control is not returned to
  1109.                           your program until the form is closed. If you want to
  1110.                           show the form non-modally (i.e., execution of your
  1111.                           code continues after the form has been displayed),
  1112.                           set the Visible property to True rather than calling
  1113.                           ShowModal.
  1114.         BeginUpdate     - Call this method before adding a large number of
  1115.                           controls to surpress redrawing.
  1116.         EndUpdate       - Call this method after adding a large number of
  1117.                           controls to re-enable redrawing (and also to redraw
  1118.                           the form immediately).
  1119.  
  1120. TTabbedForm
  1121. -----------
  1122.  
  1123. Exactly as above, except that a window tab (in the main V97 window) is made for
  1124. the form. Adds one new property:
  1125.  
  1126.         TabCaption      - The caption of the window's tab
  1127.  
  1128. TButton
  1129. -------
  1130.  
  1131. Properties:
  1132.  
  1133.         Caption         - The button's caption
  1134.  
  1135. Note that the Font.Style property is ignored on a TButton. Use a TBitBtn
  1136. instead if you wish to change the Font.Style property.
  1137.  
  1138. TBitBtn
  1139. -------
  1140.  
  1141. As above, only Font.Style can be set, for example:
  1142.  
  1143.         @p $bitbtn.Font.Style = [fsBold,fsUnderline]
  1144.  
  1145. Properties:
  1146.  
  1147.         Glyph           - The bitmap on the button (TBitmap - see the
  1148.                           "Non-visual objects" section below)
  1149.  
  1150. TListBox and TComboBox
  1151. ----------------------
  1152.  
  1153. Properties:
  1154.  
  1155.         Items           - A TStringList object containing all the items
  1156.         ItemText        - The text of the currently-selected item (or empty if no item selected)
  1157.         ItemIndex       - The index of the currently-selected item (or -1 if no item selected)
  1158.  
  1159. Methods:
  1160.  
  1161.         Sort            - Alphabetically sorts the items in the list box or combo box
  1162.  
  1163. See later in this file under "Non-visual controls" for information on how to
  1164. manipulate a TStringList object.
  1165.  
  1166. TFileListBox
  1167. ------------
  1168.  
  1169. This is just like a regular TListBox, although it is automatically filled with
  1170. a list of files and the list cannot be modified. It implements all the
  1171. properties of TListBox, and adds the following:
  1172.  
  1173. Properties:
  1174.  
  1175.         ShowGlyphs      - Controls whether small glyphs (icons) are displayed
  1176.                           to the left of each filename in the list box
  1177.  
  1178. TDirectoryListBox
  1179. -----------------
  1180.  
  1181. This is just like a regular TListBox, although it is automatically filled with
  1182. a list of directories and the list cannot be modified. It implements all the
  1183. properties of TListBox, and adds the following:
  1184.  
  1185.         Directory       - Returns the selected directory in complete form,
  1186.                           including the drive and full path
  1187.         FileList        - The associated TFileListBox control. If you are using
  1188.                           a TFileListBox and a TDirectoryListBox together,
  1189.                           assign the TDirectoryListBox's FileList property
  1190.                           to the TFileListBox control.
  1191.  
  1192. TDriveComboBox
  1193. --------------
  1194.  
  1195. This is just like a regular TComboBox, although it is automatically filled with
  1196. a list of drives and the list cannot be modified. It implements all the
  1197. properties of TComboBox, and adds the following:
  1198.  
  1199.         DirList         - The associated TDirectoryListBox control. If you are
  1200.                           using a TDriveComboBox and a TDirectoryListBox
  1201.                           together, assign the TDriveComboBox's DirList
  1202.                           property to the TDirectoryListBox control.
  1203.  
  1204. TEdit, TMemo, TRichEdit
  1205. -----------------------
  1206.  
  1207. Properties:
  1208.  
  1209.         Text            - Contains the text in the edit control
  1210.         SelStart        - The start of the text selection
  1211.         SelLength       - The length of the text selection (0 if nothing selected)
  1212.         SelText         - The selected text
  1213.         ReadOnly        - (True or False) Controls whether the text control is
  1214.                           read-only (not modifiable by the user)
  1215.         WordWrap        - (TMemo and TRichEdit only) Controls whether words are
  1216.                           wrapped on multiple lines
  1217.         Lines           - (TMemo and TRichEdit only) TStringList object that
  1218.                           contains the lines of text in the control (see
  1219.                           the "Non-visual controls" section below for
  1220.                           information on TStringList)
  1221.  
  1222. In general, you should use TEdit for single lines of text and TRichEdit for
  1223. multiple lines (in colour if necessary). You should never have to use TMemo,
  1224. which is the same as TRichEdit except you cannot output text with
  1225. TextOut > %$object (see VSCRIPT.TXT under TEXTOUT for more information on
  1226. this).
  1227.  
  1228. TCheckBox, TRadioButton
  1229. -----------------------
  1230.  
  1231. Properties:
  1232.  
  1233.         Checked         - Whether or not the control is checked
  1234.         Caption         - The caption on the check box or radio button
  1235.  
  1236. TGroupBox
  1237. ---------
  1238.  
  1239. Properties:
  1240.  
  1241.         Caption         - The group box's caption
  1242.  
  1243. TPanel
  1244. ------
  1245.  
  1246. Properties:
  1247.  
  1248.         Caption         - The text within the panel
  1249.         Alignment       - Text alignment. taCenter, taLeft, taRight
  1250.         BevelInner      - The inner bevel. bvNone, bvLowered, bvRaised
  1251.         BevelOuter      - The inner bevel. bvNone, bvLowered, bvRaised
  1252.         BevelWidth      - The width of the bevel
  1253.  
  1254. TBevel
  1255. ------
  1256.  
  1257. Properties:
  1258.  
  1259.         Style           - The bevel's style. bsLowered, bsRaised
  1260.         Shape           - The bevel's shape. bsBox, bsFrame, bsTopLine, bsBottomLine, bsLeftLine, bsRightLine
  1261.  
  1262. TShape
  1263. ------
  1264.  
  1265. Properties:
  1266.  
  1267.         Shape           - The shape of the shape (!). stRectangle, stSquare,
  1268.                           stRoundRect, stRoundSquare, stEllipse, stCircle
  1269.         Brush.Style     - The fill style of the shape. bsSolid, bsClear
  1270.         Brush.Color     - The fill colour of the shape
  1271.         Pen.Color       - The outline colour of the shape
  1272.         Pen.Width       - The outline width of the shape
  1273.  
  1274. TTrackBar
  1275. ---------
  1276.  
  1277. Properties:
  1278.  
  1279.         Min             - The minimum value of the track bar
  1280.         Max             - The maximum value of the track bar
  1281.         Position        - The track bar's position
  1282.         Orientation     - trHorizontal, trVertical
  1283.  
  1284. TProgressBar
  1285. ------------
  1286.  
  1287. Properties:
  1288.  
  1289.         Min             - The minimum value of the progress bar
  1290.         Max             - The maximum value of the progress bar
  1291.         Position        - The progress bar's position
  1292.  
  1293. TTabControl (tabbed notebook)
  1294. -----------------------------
  1295.  
  1296. Properties:
  1297.  
  1298.         Tabs            - TStringList containing all the tabs in the tabbed
  1299.                           notebook
  1300.         TabIndex        - The number of the currently selected tab. -1 means
  1301.                           no tab selected, 0 means the first tab is selected,
  1302.                           1 the second, etc.
  1303.  
  1304. For information on how to use the TStringList object, see the "Non-visual
  1305. controls" section.
  1306.  
  1307. TOfficeButton (Office 97-style toolbar button)
  1308. ----------------------------------------------
  1309.  
  1310. NOTE: TOFFICEBUTTON IS NOW DEFUNCT, AND SHOULD NOT BE USED. USE
  1311. TTOOLBARBUTTON97 INSTEAD.
  1312.  
  1313. Properties:
  1314.  
  1315.         Caption         - The caption on the button
  1316.         Bitmap          - The bitmap on the button (a TBitmap object)
  1317.         NoFocusBitmap   - The bitmap on the button when it is not selected
  1318.         UnselectedColor - The colour of the caption when it is not selected
  1319.         Layout          - Where the bitmap is placed, relative to the caption.
  1320.                           blBitmapLeft, blBitmapTop, blBitmapRight, or
  1321.                           blBitmapBottom
  1322.  
  1323. Events:
  1324.  
  1325.         OnClick         - Fired when the button is pressed.
  1326.  
  1327. TToolbarButton97 (Office 97-style button)
  1328. -----------------------------------------
  1329.  
  1330. The properties of TToolbarButton97 are identical to those of TBitBtn, except
  1331. that the button is displayed with a different style.
  1332.  
  1333. TToolbarSep97 (button separator)
  1334. --------------------------------
  1335.  
  1336. This control has no properties, apart from Left, Top, Width and Height. Just
  1337. create it, set its size, and that's it.
  1338.  
  1339. TEdit97 (Office 97-style edit control)
  1340. --------------------------------------
  1341.  
  1342. This control is identical to TEdit, except that the edit box is displayed with
  1343. a different style.
  1344.  
  1345. Non-visual controls
  1346. ===================
  1347.  
  1348. TStringList (string list object)
  1349. --------------------------------
  1350.  
  1351. The TStringList is a very powerful object. It can store a list of strings,
  1352. which can be saved to and from disk, sorted, and manipulated in a powerful
  1353. manner, rather like a sophisticated string array. TStringList objects are
  1354. used internally by TListBox, TComboBox, TTabControl etc. to maintain their
  1355. list of items. Strings start at index 0. TStringList objects grow and shrink
  1356. automatically to store all the strings.
  1357.  
  1358. Properties:
  1359.  
  1360.         Count                   - The number of strings in the list
  1361.  
  1362. Methods:
  1363.  
  1364.         GetString(i)            - Gets the string at index i
  1365.         SetString i text        - Sets the string at index i to text
  1366.         Add(text)               - Adds a string, returns the index
  1367.         Delete i                - Deletes the string at index i, moves the others up by one
  1368.         Clear                   - Clears the string list
  1369.         Exchange i j            - Exchanges the string at position i with the string at position j
  1370.         SaveToFile file         - Saves the string list to file
  1371.         LoadFromFile file       - Loads the string list from file
  1372.         SaveToSet()             - Converts the string list to a set (e.g. [one,two,three]) and returns the set
  1373.         LoadFromSet set         - Clears the string list and adds each element in the set to the string list
  1374.         SaveToAlias alias       - Overwrites alias's script code with the contents of the string list (alias MUST ALREADY EXIST!!)
  1375.         LoadFromAlias alias     - Clears the string list and loads the script code from alias into the list
  1376.         SaveToEvent event       - Overwrites event's script code with the contents of the string list (event MUST ALREADY EXIST!!)
  1377.         LoadFromEvent event     - Clears the string list and loads the script code from event into the list
  1378.         GetDirList mask         - Clears the string list and fills it with a list of directories whose names match mask. For example, mask could be set to c:\windows\*.* to return a list of directories in c:\windows, or it could simply be left as *.*.
  1379.         GetFileList mask        - Clears the string list and fills it with a list of files whose names match mask. See above (the GetDirList method) for more information.
  1380.         Execute                 - Executes the strings in the list as ViRCScript code
  1381.         Sort                    - Alphabetically sorts the strings in the string list
  1382.  
  1383. Note that the Sort method DOES NOT WORK for TStringList objects that are
  1384. properties of other controls (e.g. a TListBox's Items property). For these,
  1385. call the Sort method of the object (e.g. ListBox1.Sort), rather than of the
  1386. TStringList (e.g. do NOT do ListBox1.Items.Sort).
  1387.  
  1388. TBitmap (in-memory bitmap)
  1389. --------------------------
  1390.  
  1391. The TBitmap object represents a bitmap. The object has only one method.
  1392.  
  1393. Methods:
  1394.  
  1395.         LoadFromFile filename.bmp   - Reads the BMP file specified and loads it
  1396.                                       into the TBitmap object.
  1397.  
  1398. After a bitmap has been loaded into a TBitmap object, the object can be
  1399. assigned to a TBitBtn's Glyph property, or a TOfficeButton's Bitmap or
  1400. NoFocusBitmap properties.
  1401.  
  1402. TIcon (in-memory icon)
  1403. ----------------------
  1404.  
  1405. The TIcon object represents a window icon. The object has only one method.
  1406.  
  1407. Methods:
  1408.  
  1409.         LoadFromFile filename.ico   - Reads the ICO file specified and loads it
  1410.                                       into the TIcon object.
  1411.  
  1412. After an icon has been loaded into a TIcon object, the object can be
  1413. assigned to a TForm's Icon property to make that icon the form's icon.
  1414.  
  1415. TSockets (Winsock socket control)
  1416. ---------------------------------
  1417.  
  1418. ViRC '96 0.82 and above support a TSockets class, whose interface is similar
  1419. to the freeware Sockv3 Delphi control. Anyone who has used this will feel
  1420. instantly familiar!!
  1421.  
  1422. In versions before 0.91b, TSockets objects required an owner, which basically
  1423. meant that a TSockets object could only be made with a parent form. Now, this
  1424. is no longer true, and TSockets objects can be created freely without owners
  1425. (you can now do $new(TSockets), for example).
  1426.  
  1427. Properties:
  1428.  
  1429.         IPAddr          - The host name or IP address of where to connect to
  1430.         Port            - The port to connect to or listen on
  1431.         LocalHost       - The host name of the local machine
  1432.         LocalIPAddr     - The IP address of the local machine
  1433.         RemoteIPAddr    - The IP address of the remote machine the socket is
  1434.                           connected to, or about to accept an incoming
  1435.                           connection from
  1436.         SocketNumber    - Returns the socket number of the current connection.
  1437.                           If the socket is used to handle multiple incoming
  1438.                           connections, you should store the value of
  1439.                           SocketNumber for each connection in a TStringList in
  1440.                           the OnSessionAvailable event, and switch to the
  1441.                           required connection with the SetActiveConnection
  1442.                           method.
  1443.  
  1444. Methods:
  1445.  
  1446.         SConnect                - Connects to IPAddr:Port
  1447.         SListen                 - Listens for connections on Port
  1448.         SListenOnFreePort()     - Finds an unused port and listens on it.
  1449.                                   Returns the port that has been selected for
  1450.                                   listening on.
  1451.         SAccept()               - Accepts an incoming connection. Returns the
  1452.                                   unique socket number of the connection. Keep
  1453.                                   this value if you're handling multiple
  1454.                                   connections on one port, otherwise discard it
  1455.                                   by calling this method as a statement.
  1456.         SCancelListen           - Cancels a previous SListen command
  1457.         Send text               - Sends text to the remote end
  1458.         SendCRLF text           - Sends text plus a CRLF to the remote end
  1459.         SetActiveConnection(n)  - When the socket is used to handle multiple
  1460.                                   simultaneous incoming connections (for
  1461.                                   example, for a chat server to handle multiple
  1462.                                   users on the same port), this method will set
  1463.                                   the active connection to n. Any further
  1464.                                   socket operation, such as Send, will work on
  1465.                                   that connection.
  1466.  
  1467. Events:
  1468.  
  1469.         OnSessionConnected      - Called after SConnect when session connects
  1470.         OnSessionAvailable      - Called after SListen when an incoming connection arrives
  1471.         OnSessionClosed         - Called when the remote end closes the connection
  1472.         OnDataAvailable         - Called when data, sent by the remote end, is available for reception
  1473.         OnErrorOccurred         - Called when a socket error occurs
  1474.                                    $Msg = socket error message, $Error = socket
  1475.                                    error number
  1476.  
  1477. Connecting somewhere
  1478. --------------------
  1479.  
  1480. To connect somewhere, first create the socket, ownedby a form (this is VERY
  1481. important, the socket WILL NOT WORK if it is not owned by anything). Then set
  1482. the IPAddr property to the name or IP of the host you wish to connect to, and
  1483. set Port to the port. Then call the SConnect method. Example:
  1484.  
  1485.         @ $socketform = $new(TForm)
  1486.         @ $socket = $new(TSockets ownedby $socketform)
  1487.  
  1488.         @p $socket.IPAddr = post.demon.co.uk
  1489.         @p $socket.Port = 25
  1490.         $socket.SConnect
  1491.  
  1492. Listening for connections
  1493. -------------------------
  1494.  
  1495. Virtually identical to the above, except that IPAddr isn't specified and you
  1496. call SListen instead of SConnect. For example, to listen for incoming
  1497. connections on port 1234, do:
  1498.  
  1499.         @ $socketform = $new(TForm)
  1500.         @ $socket = $new(TSockets ownedby $socketform)
  1501.  
  1502.         @p $socket.Port = 1234
  1503.         $socket.SListen
  1504.  
  1505. To listen on a free port, assigning the port number selected to $sockport:
  1506.  
  1507.         @ $sockport = $socket.SListenOnFreePort()
  1508.  
  1509. If you don't care what port the socket has chosen for listening on, you can
  1510. call it, like any method, as a statement:
  1511.  
  1512.         $socket.SListenOnFreePort
  1513.  
  1514. The port chosen can then be retrieved later by reading the Port property.
  1515.  
  1516. Accepting incoming connections
  1517. ------------------------------
  1518.  
  1519. When you are listening and an incoming connection comes in, the
  1520. OnSessionAvailable event is fired. You can then use the SAccept method to
  1521. accept the connection. Example:
  1522.  
  1523.         @p $socket.OnSessionAvailable = SOCKET_INCOMING
  1524.  
  1525.         Alias SOCKET_INCOMING
  1526.           $socket.SAccept
  1527.         EndAlias
  1528.  
  1529. When the remote end connects
  1530. ----------------------------
  1531.  
  1532. After you have issued the SConnect call, V97 tries to connect with the remote
  1533. host. When a connection is established, the OnSessionConnected event is fired.
  1534. You must not send data to the socket before this event is fired!! Example:
  1535.  
  1536.         @p $socket.OnSessionConnected = SOCKET_CONNECTED
  1537.  
  1538.         Alias SOCKET_CONNECTED
  1539.           TextOut > . clBlue *** We're connected!!
  1540.         EndAlias
  1541.  
  1542. Socket errors
  1543. -------------
  1544.  
  1545. If the socket fails, either while attempting to connect or during data transfer
  1546. and so forth, the OnErrorOccurred event is fired:
  1547.  
  1548.         @p $socket.OnErrorOccurred = SOCKET_ERROR
  1549.  
  1550.         Alias SOCKET_ERROR
  1551.           TextOut > . clRed *** Error occurred while using socket!!
  1552.         EndAlias
  1553.  
  1554. In your SOCKET_ERROR handler, the local variables $Msg, containing the socket
  1555. error message, and $Error, containing the socket error number, are available.
  1556.  
  1557. Note that "Connection reset by peer" (which occurs when a client closes a
  1558. connection with a server) is treated as an error. By default, all errors will
  1559. shut V97 down (I will endeavour to change this behaviour in future releases).
  1560. Therefore it is STRONGLY recommended that, at the least (if you don't want to
  1561. do any actual error-handling), you have the following statement in:
  1562.  
  1563.         @p $socket.OnErrorOccurred = Nop
  1564.  
  1565. NOP simply does nothing - this ensures that your application will continue
  1566. whenever a socket error occurs.
  1567.  
  1568. In an OnErrorOccurred handler, you may want to call SClose to close the socket,
  1569. otherwise it will remain open, even though an error had occurred.
  1570.  
  1571. Sending data
  1572. ------------
  1573.  
  1574. Data is sent with the SEND or SENDCRLF methods, which are identical except for
  1575. that fact that SENDCRLF sends a CRLF at the end of the line, whereas SEND does
  1576. not. Usually, you will use SENDCRLF. Example, which sends the string "Hello!!"
  1577. after connecting to the host:
  1578.  
  1579.         @p $socket.OnSessionConnected = SOCKET_CONNECTED
  1580.  
  1581.         Alias SOCKET_CONNECTED
  1582.           $socket.SendCRLF Hello!!
  1583.         EndAlias
  1584.  
  1585. Receiving data
  1586. --------------
  1587.  
  1588. When data is received on the socket, the OnDataAvailable event is fired. You
  1589. can receive the data by reading the socket's Text property. Note that reading
  1590. the Text property REMOVES THE DATA FROM THE SOCKET'S QUEUE. RETRIEVING ITS
  1591. VALUE AGAIN WILL CAUSE AN ERROR!! Therefore, assign the value of the Text
  1592. property to a variable at the beginning of the event code, and only reference
  1593. that variable. Example, which sends "Good morning!!" back whenever "Hello!!"
  1594. is received:
  1595.  
  1596.         @p $socket.OnDataAvailable = SOCKET_DATA
  1597.  
  1598.         Alias SOCKET_DATA
  1599.           @ $data = $prop($socket.Text)
  1600.           if ([$data] == [Hello!!])
  1601.              $socket.SendCRLF Good morning!!
  1602.           endif
  1603.         EndAlias
  1604.  
  1605. Closing the connection
  1606. ----------------------
  1607.  
  1608. The socket connection can be closed with the SClose method, for example, this
  1609. closes the connection when QUIT is received:
  1610.  
  1611.         @p $socket.OnDataAvailable = SOCKET_DATA
  1612.  
  1613.         Alias SOCKET_DATA
  1614.           @ $data = $prop($socket.Text)
  1615.           if ([$data] == [QUIT])
  1616.              $socket.SClose
  1617.           endif
  1618.         EndAlias
  1619.  
  1620. When the REMOTE END closes the connection, the OnSessionClosed event is fired.
  1621. You must close the local end of the socket with SClose when this event is
  1622. fired. You could do something like this:
  1623.  
  1624.         @p $socket.OnSessionClosed = $socket.SClose
  1625.  
  1626. Similarly, in an OnErrorOccurred handler, you may want to call SClose to close
  1627. the socket, otherwise it will remain open, even though an error had occurred.
  1628.  
  1629. Cancelling listening
  1630. --------------------
  1631.  
  1632. If you're listening on a port and wish to cancel listening, call the
  1633. SCancelListen method. This listens on port 1234 and cancels listening when
  1634. an incoming connection appears:
  1635.  
  1636.         @p $socket.Port = 1234
  1637.         @p $socket.OnSessionAvailable = SOCKET_AVAILABLE
  1638.         $socket.SListen
  1639.  
  1640.         Alias SOCKET_AVAILABLE
  1641.           $socket.SAccept
  1642.           TextOut > . clBlue *** We're connected!!
  1643.           $socket.SCancelListen
  1644.         EndAlias
  1645.  
  1646. Handling multiple incoming connections on the same port
  1647. -------------------------------------------------------
  1648.  
  1649. In 0.91a and above, one single TSockets object can be used to handle a number
  1650. of simultaneous incoming connections on the same port. To use the TSockets
  1651. object in this way, just make it listen as normal, but in the
  1652. OnSessionAvailable event, call SAccept, but rather than calling it as a
  1653. statement, call it as a function and keep the return value somewhere (like a
  1654. TStringList). The value returned by SAccept is a socket number that's unique
  1655. to the current connection. If you later want to send data, for example, to
  1656. this connection, you should use the SetActiveConnection method to set the
  1657. active connection to an entry in your TStringList object. Example:
  1658.  
  1659.         @ $connections = $new(TStringList)
  1660.         @ $socket = $new(TSockets)
  1661.         @p $socket.OnSessionAvailable = SOCKET_AVAILABLE
  1662.  
  1663.           etc.
  1664.  
  1665.         Alias SOCKET_AVAILABLE
  1666.           $connections.Add $socket.SAccept()
  1667.           etc.
  1668.         EndAlias
  1669.  
  1670.           etc.
  1671.  
  1672.         Alias SEND_TO_FIRST_CONNECTION
  1673.           $socket.SetActiveConnection $connections.GetString(1)
  1674.           $socket.Send $1-
  1675.         EndAlias
  1676.  
  1677.  
  1678. TTimer
  1679. ------
  1680.  
  1681. Timer creation is very simple, just use a TTimer object. First create the
  1682. object, set the Interval property for the time interval, set the OnTimer event
  1683. to the code you want executed every Interval milliseconds, and set Enabled to
  1684. True to turn the timer on.
  1685.  
  1686. Properties:
  1687.  
  1688.         Enabled         - (True or False) Controls whether the timer is enabled or not
  1689.         Interval        - The interval in milliseconds between the firing of the OnTimer event
  1690.  
  1691. Events:
  1692.  
  1693.         OnTimer         - This event is fired when the timer goes off (every Interval milliseconds)
  1694.  
  1695. Example:
  1696.  
  1697.         @ $timer = $new(TTimer)
  1698.         @p $timer.Interval = 1000
  1699.         @p $timer.OnTimer = BEEP
  1700.         @p $timer.Enabled = True
  1701.  
  1702. This will beep every second. How unspeakably annoying!!
  1703.