Office 97 Assistant Package for Delphi
by Kambiz R. Khojasteh |
Version 1.6 |
By using Microsoft® Agent, application developers can create an assistant similar to Office 97 Assistant for their applications. Unfortunately there are some limitations and difficulties for this purpose:
The application needs to check for MS Agent ActiveX installation on the local machine and if it had not installed, downloads it and at least one MS Agent Character from the Microsoft web site and installs them.
I searched the web for a component that acts like Office 97 Assistant but I didn't find any component that satisfy me. Then I decided to write my own component so those Delphi programmers can use an assistant in their applications in easier manner with the most power of it.
Office 97 Assistant Package contains two components. By these components you have an Assistant with most abilities of Microsoft Assistant and an Assistant Panel to create preview or options dialogs.
Office 97 Assistant Package is built for Borland Delphi 3.0, 4.0, and 5.0. Because of Delphi 3.0 does not support new features of Delphi 4.0 and 5.0, when using the package on this version of Delphi consider following notes:
Note: Office 97 Assistant Package needs TOffice97Button component version 1.91 or later written by Jonathan Hosking.
To install Office 97 Assistant Package follow the procedure below:
Office 97 Assistant Package contains two components:
Note: Office 97 Assistant Package needs at least one Actor Library. You can download actor libraries from my web site.
TAssistant:TAssistant is a non-visual component. By placing this component on the main form of the application and filling its properties you have a powerful assistant. Some features of this component are:
Property Name | Data Type | Description |
ActorCopyright |
Strings | Contains the actor's copyright string of the currently loaded actor library. |
ActorLibrary | String | Specifies the filename of the currently loaded actor library. |
ActorName |
Strings | Contains the actor's name of the currently loaded actor library. |
ActorVersion |
Strings | Contains the version number of the currently loaded actor library. |
Animations |
TAnimation | This property is an array of animations data that indexed from 0 to AnimationCount-1. |
AnimationCount |
Word | Contains the number of animations in the currently loaded actor library. |
AutoIdle | Boolean | Controls whether the assistant plays the idle animations automatically. |
AutoSize | Boolean | Determines whether the assistant resizes to accommodate the actor it loads. |
Balloon | TBalloonOptions | Contains the balloon properties. |
TColor | Specifies the border color of the balloon. | |
TColor | Specifies the background color of the balloon. | |
TFont | Controls the attributes of text written on the balloon. | |
Boolean | Determines if an Office 2000 look is applied to balloons. | |
BalloonAnchor | TCustomForm | Determines the form that arrow of balloon points to it. This property helps you to control position of balloon when assistant is not visible. As default when assistant is hidden and balloon is visible, balloon is centered to desktop and BalloonPos property has bpCenter value. |
BalloonPos |
TBalloonPos | Indicates the position of the balloon relative to the BalloonAnchor form. |
BgMode | TBgMode | Determines how the selected background image is displayed on the assistant window. |
BgPicture | TPicture | Determines the background image of the assistant window. |
Caption | String | Specifies the title of the assistant window. |
ClientHeight | Integer | Specifies the height of the assistant window's client area in pixels. |
ClientWidth | Integer | Specifies the width of the assistant window's client area in pixels. |
Color | TColor | Specifies the background color of the assistant window. |
Dragging |
Boolean | If Dragging is true, the user is dragging the assistant window. |
Empty |
Boolean | If Empty is true, Indicates an actor library is loaded to the component. |
FastShowHide | Boolean | If FastShowHide is true, the assistant will not play show and hide animations on show and hide events. |
FormLeft | Integer | Specifies the horizontal coordinate of the left edge of the assistant window relative to the screen. |
FormTop | Integer | Specifies the vertical coordinate of the top edge of the assistant window relative to the screen. |
GuideDlg | TGuideDlgOptions | Contains the Guide balloon options. |
Boolean | If AcceptRequest is false, the edit box and search button will not display on the Guide balloon. | |
String | Contains a short description about the found topics. | |
TIcon | Specifies an icon for the guide balloon. | |
String | Contains the requested search text entered by the user. | |
String | Specifies the title of the Guide balloon. | |
TStringList | Specifies the list of found topics according to the user search request. | |
TGuideDlgButtons | Determines which button appear on the Guide balloon. | |
Height | Integer | Specifies the vertical size of the assistant window in pixels. |
HintBulb | Boolean | Indicates whether a hint bulb appear beside the assistant. |
HintDlg | THintDlgOptions | Contains the Hint balloon options. |
String | Contains the hint itself or a short description about available hints. | |
TIcon | Specifies an icon for the Hint balloon. | |
String | Specifies the title of the Hint balloon. | |
TStringList | Specifies the list of available hint topics. | |
ModalBalloon |
Boolean | If ModalBalloon is true, the visible balloon has been shown as modal. |
MoveStep | Byte | Specifies the amount of movements, in pixels, in every step of MoveTo method. |
MsgDlg | TMsgDlgOptions | Contains the Message balloon options. |
TIcon | When Type parameter of MessageDlg method is mtCustom, the balloon uses the value of the CustomIcon. | |
String | Determines the title of the Message balloon. | |
Mute | Boolean | Controls whether the assistant makes sound. |
Name | String | Specifies the name of the assistant as referenced in code. |
PlayIdling |
Boolean | Indicates whether an idle animation is playing on the idle time. |
Playing |
Boolean | If Playing is true, indicates an animation is playing. |
PlayingID |
TRequestID | Identifies the ID of current playing animation |
PopupMenu | TPopupMenu | Identifies the pop-up menu associated with the assistant. |
Priority | TThreadPriority | Determines the priority of the thread that plays animations. |
Speed | Word | Specifies the relational speed of animations according to the original animation speed in percent. |
Stretch | Boolean | TAssistant stretch the frame's image if the animation width or height is bigger than the client size of the assistant window. By setting Stretch to true, TAssistant will stretch the image if it is less than the client size of the assistant window. TAssistant always keeps the aspect ratio of the image. |
Tag | Integer | Stores an integer value as part of the component. |
TipsDlg | TTipsDlgOptions | Contains the Tips balloon options. |
Integer | Specifies the index of the current selected tip on the Tips balloon. | |
TStringList | Contains the list of tip strings. | |
TTipsDlgButtons | Determines which button appear on the Tips balloon. | |
Transparent | Boolean | Specifies whether the assistant displays animations with a transparent background. |
Visible | Boolean | Indicates whether the assistant is visible. |
VisibleBalloon |
TBalloonKind | Indicates the kind of visible balloon. If balloon is not visible the value of this property is bkNone. |
Width | Integer | Specifies the horizontal size of the assistant window in pixels. |
Methods |
procedure AdjustClientSize; Sets the client size of the assistant window to size of the loaded actor library. |
procedure BringToFront; Assistant normally will not place on top of modal forms. When a modal form is showing, BringToFront brings the assistant on top of the modal form. |
procedure CloseBalloon; Closes the current visible balloon. |
constructor Create(AOwner: TComponent); Creates and initializes a new TAssistant. |
destructor Destroy; Destroys an instance of TAssistant. |
function GestureAt(X, Y: Integer): TRequestID; Plays the gesture animation according to the screen coordinate specified by X and Y parameters. The function returns a unique id for played animation or zero on error. |
function GlanceAt(X, Y: Integer): TRequestID; Plays the glance animation according to the screen coordinate specified by X and Y parameters. The function returns a unique id for played animation or zero on error. |
procedure Hide(Fast: Boolean); Hides the assistant. If Fast is true, the hide animation will not play. |
function IsValid(RequestID: TRequestID): Boolean; If the specified RequestID is a playing or queued animation, the function returns true. |
function LookAt(X, Y: Integer): TRequestID; Plays the look animation according to the screen coordinate specified by X and Y parameters. The function returns a unique id for played animation or zero on error. |
function MessageDlg(const Msg: String; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: LongInt): Word; This function is as same as Delphi MessageDlg function except that this method shows a balloon. |
procedure MoveTo(X, Y: Integer); Plays the move animation according to the screen coordinate specified by X and Y parameters and move the assistant to this screen coordinate. |
Delphi 4.0, 5.0: function Play(Index: Word): TRequestID; Delphi 3.0: function PlayIndex(Index: Word): TRequestID; Plays the animation specified by the animation's index. The function returns a unique id for played animation or zero on error. |
Delphi 3.0, 4.0, 5.0: function Play(Name: String): TRequestID; Delphi 3.0: function PlayName(Name: String): TRequestID; Plays the animation specified by the animation's name. The function returns a unique id for played animation or zero on error. |
Delphi 3.0, 4.0, 5.0: function Play(Action: TActorAction): TRequestID; Delphi 3.0: function PlayAction(Action: TActorAction): TRequestID; Plays randomly one of animations associated to the action. The function returns a unique id for played animation or zero on error. |
procedure Show(Fast: Boolean); Shows the assistant. If Fast is true, the show animation will not play. |
procedure ShowGuide; Shows the Guide balloon. |
procedure ShowTips; Shows the Tips balloon. |
procedure Speak(const Msg: String; Timeout: Integer = 0); Shows a balloon containing the Msg and wait for timeout to hide the balloon. The timeout is in milliseconds and if it is zero the balloon will be hide only by calling the CloseBalloon method. |
procedure Stop(RequestID: TRequestID); Stops the specified animation if it is playing or removes it from queue if it is queued. |
procedure StopAll; Stops the current playing animation and empties the animation queue. |
procedure Think(const Msg: String; Timeout: Integer = 0); Shows a think balloon containing the Msg and wait for timeout to hide the balloon. The timeout is in milliseconds and if it is zero the balloon will be hide only by calling the CloseBalloon method. |
function WaitFor(RequestID: TRequestID): Boolean; Waits for specified animation until its playing terminate. If the specified animation has an infinite loop, the function returns immediately with a false result. |
Event Name | Type | Description |
OnBalloonHide | TNotifyEvent | Occurs when the balloon hides. |
OnBalloonShow | TNotifyEvent | Occurs when the balloon shows. |
OnCanResize | TCanResizeEvent | Occurs when an attempt is made to resize the assistant window. |
OnChange | TNotifyEvent | Occurs whenever the ActorLibrary changes. |
OnClick | TNotifyEvent | Occurs when the user clicks on the assistant. |
OnCloseQuery | TCloseQueryEvent | Occurs when the user closes the assistant window from the system menu of the window. |
OnDblClick | TNotifyEvent | Occurs when the user double-clicks on the assistant. |
OnDragging | TNotifyEvent | Occurs when the user is dragging the assistant. |
OnDragStart | TNotifyEvent | Occurs when the user begins to drag the assistant. |
OnDragStop | TNotifyEvent | Occurs when the dragging of the assistant ends. |
OnGuideOptionsClick | TNotifyEvent | Occurs when the user clicks on the options button of the Guide balloon. |
OnGuideRequestChange | TNotifyEvent | Occurs when the user changes the text of the edit box on the Guide balloon. |
OnGuideSearchClick | TNotifyEvent | Occurs when the user clicks on the search button of the Guide balloon. |
OnGuideTopicClick | TTopicClickEvent | Occurs when the user clicks on the one of topics displayed on the Guide balloon. |
OnHide | TNotifyEvent | This event just triggered when the assistant goes to hide. |
OnHintBlubClick | TNotifyEvent | Occurs when the user clicks on the hint bulb. |
OnHintTopicClick | TTopicClickEvent | Occurs when the user clicks on the one of topics displayed on the Hint balloon. |
OnIdle | TIdleEvent | This event triggered when the assistant needs to play an idle animation. |
OnPlayStart | TPlayEvent | This event just triggered when an animation begins to play. |
OnPlayStop | TPlayEvent | This event triggered when an animation terminates. |
OnShow | TNotifyEvent | This event just triggered when the assistant goes to show. |
OnTipsTipChange | TNotifyEvent | This event triggered after changing the current tip of the Tips balloon. |
TAssistantPanel is a descendent of the TCustomPanel component. This component is suitable for creating preview or options dialogs. Some features of this component are:
Property Name | Data Type | Description |
ActorCopyright |
Strings | Contains the actor's copyright string of the currently loaded actor library. |
ActorLibrary | String | Specifies the filename of the currently loaded actor library. |
ActorName |
Strings | Contains the actor's name of the currently loaded actor library. |
ActorVersion |
Strings | Contains the version number of the currently loaded actor library. |
Align | TAlign | Determines how the TAssistantPanel aligns within its container. |
Anchors | TAnchors | Specifies how the TAssistantPanel anchored to its parent. |
Animations |
TAnimation | This property is an array of animations data that indexed from 0 to AnimationCount-1. |
AnimationCount |
Word | Contains the number of animations in the currently loaded actor library. |
AutoIdle | Boolean | Controls whether the control plays the idle animations automatically. |
AutoSize | Boolean | Determines whether the control resizes to accommodate the actor it loads. |
BevelInner | TPanelBevel | Determines the style of the inner bevel of the control. |
BevelOuter | TPanelBevel | Determines the style of the outer bevel of the control. |
BevelWidth | TBevelWidth | Determines the width, in pixels, of both inner an outer bevels of the control. |
BgMode | TBgMode | Determines how the selected background image is displayed. |
BgPicture | TPicture | Determines the background image of the control. |
BorderStyle | TBorderStyle | Determines the style of the line drawn around the perimeter of the control. |
Color | TColor | Specifies the background color of the control. |
Constraints | TSizeConstrains | Specifies the size constraints of the control. |
Cursor | TCursor | Specifies the image used to represent the mouse pointer when it passes into the region covered by the control. |
DragCursor | TCursor | Indicates the image used to represent the mouse pointer when the control is being dragged. |
DragKind | TDragKind | Specifies whether the control is being dragged normally or for docking. |
DragMode | TDragMode | Determines how the control initiates drag-and-drop or drag-and-dock operations. |
Empty |
Boolean | If Empty is true, Indicates an actor library is loaded to the control. |
Enabled | Boolean | Controls whether the control responds to mouse, keyboard, and timer events. |
Height | Integer | Specifies the vertical size of the control in pixels. |
HelpContext | THelpContext | Provides a context number for use in calling context-sensitive online Help. |
Hint | String | Contains the text string that can appear when the user moves the mouse over the control. |
Left | Integer | Specifies the horizontal coordinate of the left edge of the control relative to its parent. |
Mute | Boolean | Controls whether the assistant makes sound. |
Name | String | Specifies the name of the control as referenced in code. |
ParentColor | Boolean | If ParentColor is true, the control uses the Color property of its parent. |
ParentShowHint | Boolean | If ParentShowHint is True, the control uses the ShowHint property value of its parent. |
PlayIdling |
Boolean | Indicates whether an idle animation is playing on the idle time. |
Playing |
Boolean | If Playing is true, indicates an animation is playing. |
PlayingID |
TRequestID | Identifies the ID of current playing animation |
PopupMenu | TPopupMenu | Identifies the pop-up menu associated with the assistant. |
Priority | TThreadPriority | Determines the priority of the thread that plays animations. |
ShowHint | Boolean | Determines whether the control displays a Help Hint when the mouse pointer rests momentarily on the control. |
Speed | Word | Specifies the relational speed of animations according to the original animation speed in percent. |
Stretch | Boolean | TAssistantPanel stretch the frame's image if the animation width or height is bigger than the client size of the assistant window. By setting Stretch to true, TAssistantPanel will stretch the image if it is less than the client size of the assistant window. TAssistantPanel always keeps the aspect ratio of the image. |
Tag | Integer | Stores an integer value as part of the component. |
Top | Integer | Specifies the vertical coordinate of the top edge of the control relative to its parent. |
Visible | Boolean | Determines whether the control appears on the parent's client. |
Width | Integer | Specifies the horizontal size of the control in pixels. |
Methods |
procedure AdjustClientSize; Sets the client size of the control to size of the loaded actor library. |
constructor Create(AOwner: TComponent); Creates and initializes a new TAssistantPanel. |
destructor Destroy; Destroys an instance of TAssistantPanel. |
function GestureAt(X, Y: Integer): TRequestID; Plays the gesture animation according to the screen coordinate specified by X and Y parameters. The function returns a unique id for played animation or zero on error. |
function GlanceAt(X, Y: Integer): TRequestID; Plays the glance animation according to the screen coordinate specified by X and Y parameters. The function returns a unique id for played animation or zero on error. |
function IsValid(RequestID: TRequestID): Boolean; If the specified RequestID is a playing or queued animation, the function returns true. |
function LookAt(X, Y: Integer): TRequestID; Plays the look animation according to the screen coordinate specified by X and Y parameters. The function returns a unique id for played animation or zero on error. |
Delphi 4.0, 5.0: function Play(Index: Word): TRequestID; Delphi 3.0: function PlayIndex(Index: Word): TRequestID; Plays the animation specified by the animation's index. The function returns a unique id for played animation or zero on error. |
Delphi 3.0, 4.0, 5.0: function Play(Name: String): TRequestID; Delphi 3.0: function PlayName(Name: String): TRequestID; Plays the animation specified by the animation's name. The function returns a unique id for played animation or zero on error. |
Delphi 3.0, 4.0, 5.0: function Play(Action: TActorAction): TRequestID; Delphi 3.0: function PlayAction(Action: TActorAction): TRequestID; Plays randomly one of animations associated to the action. The function returns a unique id for played animation or zero on error. |
procedure Stop(RequestID: TRequestID); Stops the specified animation if it is playing or removes it from queue if it is queued. |
procedure StopAll; Stops the current playing animation and empties the animation queue. |
function WaitFor(RequestID: TRequestID): Boolean; Waits for specified animation until its playing terminate. If the specified animation has an infinite loop, the function returns immediately with a false result. |
Event Name | Type | Description |
OnCanResize | TCanResizeEvent | Occurs when an attempt is made to resize the control. |
OnChange | TNotifyEvent | Occurs whenever the ActorLibrary changes. |
OnClick | TNotifyEvent | Occurs when the user clicks on the control. |
OnConstrainedResize | TConstrainedResizeEvent | Occurs immediately after OnCanResize. |
OnDblClick | TNotifyEvent | Occurs when the user double-clicks on the control. |
OnDragDrop | TDragDropEvent | Occurs when the user drops an object being dragged. |
OnDragOver | TDragDropEvent | Occurs when the user drags an object over the control. |
OnEndDrag | TEndDragEvent | Occurs when the dragging of an object ends, either by dropping the object or by canceling the dragging. |
OnIdle | TIdleEvent | This event triggered when the control needs to play an idle animation. |
OnMouseDown | TMouseEvent | Occurs when the user presses a mouse button with the mouse pointer over the control. |
OnMouseMove | TMouseMoveEvent | Occurs when the user moves the mouse pointer while the mouse pointer is over the control. |
OnMouseUp | TMouseEvent | Occurs when the user releases a mouse button that was pressed with the mouse pointer over the control. |
OnPlayStart | TPlayEvent | This event just triggered when an animation begins to play. |
OnPlayStop | TPlayEvent | This event triggered when an animation terminates. |
OnResize | TNotifyEvent | Occurs immediately after the control is resized. |
OnStartDrag | TStartDragEvent | Occurs when the user begins to drag the control or an object it contains by left-clicking on the control and holding the mouse button down. |
Here, is a list of type definitions and constants that declared and used by Office 97 Assistant package. The multi-lingual application developers can change string constants to the appropriate language.
Type Definitions | ||||||||||||||||||
TRequestID = Cardinal; This type holds a unique id for playing or queued animations. By this id you can stop or wait for the animation. |
||||||||||||||||||
TBalloonKind = (bkNone, bkMessage, bkTips, bkGuide, bkSpeak, bkThink);
|
||||||||||||||||||
TBalloonPos = (bpCenter, bpTopLeft, bpTopRight, bpRightTop,
bpRightBottom, bpBottomRight, bpBottomLeft, bpLeftBottom, bpLeftTop);
|
||||||||||||||||||
TBgMode = (bmNone, bmTiled, bmCentered, bmStretched);
|
||||||||||||||||||
TExitType = (etNone, etAnimation, etExitBranch);
|
||||||||||||||||||
TTipsDlgBtn = (tbClose, tbNext, tbBack); TTipsDlgButtons = set of TTipsDlgBtn;
|
||||||||||||||||||
TGuideDlgBtn = (gbClose, gbOptions, gbTips, gbSearch, gbBackPage, gbNextPage); TGuideDlgCmdBtn = gbClose..gbSearch; TGuideDlgNavBtn = gbBackPage..gbNextPage; TGuideDlgButtons = set of TGuideDlgCmdBtn;
|
||||||||||||||||||
THintDlgBtn = (hbClose, hbBackPage, hbNextPage); THintDlgCmdBtn = hbClose..hbClose; THintDlgNavBtn = hbBackPage..hbNextPage; THintDlgButtons = set of THintDlgCmdBtn;
|
||||||||||||||||||
TActorAction =
(aaNone, aaAcknowledge, aaAlert, aaAnnounce, aaBlink,
aaConfused, aaCongratulate, aaDecline, aaDoMagic, aaDontRecognize,
aaExplain, aaGestureDown, aaGestureLeft, aaGestureRight, aaGestureUp,
aaGetAttention, aaGetAttentionContinued, aaGlanceDown, aaGlanceLeft,
aaGlanceRight, aaGlanceUp, aaGreet, aaHear, aaHearing, aaHide,
aaIdlingLevel1, aaIdlingLevel2, aaIdlingLevel3, aaListen, aaListening,
aaLookDown, aaLookLeft, aaLookRight, aaLookUp, aaMoveDown, aaMoveLeft,
aaMoveRight, aaMoveUp, aaPleased, aaProcess, aaProcessing, aaRead,
aaReadContinued, aaReading, aaRestPose, aaSad, aaSearch, aaSearching,
aaShow, aaSpeak, aaSpeaking, aaStartListening, aaStopListening, aaSuggest,
aaSurprised, aaThink, aaThinking, aaUncertain, aaWave, aaWrite,
aaWriteContinued, aaWriting);
TActorActions = set of TActorAction; The ActorAction is a predefined id for animations placed in an actor library. Each animation may be assigned to one or more ActorAction and vice versa. |
||||||||||||||||||
TAnimation = record Name: String[255]; Actions: TActorActions; HasSound: Boolean; case ExitType: TExitType of etNone: (); etAnimation: (ReturnName: String[255]); etExitBranch: (); end; end; This record holds specifications of the animation. |
||||||||||||||||||
TIdleEvent = procedure(Sender: TObject; Level: Integer; var Handled: Boolean) of object; This is type of OnIdle event. Level parameter Indicates the level of idling and is a value between 1 and 3. If you want the default handler ignores its behavior, set Handled parameter to true. | ||||||||||||||||||
TPlayEvent = procedure(Sender: TObject; RequestID: TRequestID) of object; This is type of OnPlayStart and OnPlayStop events. RequestID is the unique id of played or stopped animation. |
||||||||||||||||||
TTopicClickEvent = procedure(Sender: TObject; TopicIndex: Integer) of Object; This is type of OnGuideTopicClick and OnHintTopicClick events. TopicIndex is the index of clicked topic item. |
Constants |
DefMsgDlgBtns : array [TMsgDlgBtn]
of String = ('&Yes', '&No', '&OK', 'Cancel', '&Abort', '&Retry',
'&Ignore', 'All', This constant contains the caption of Message balloon buttons. |
DefTipsDlgBtns : array [TTipsDlgBtn]
of String = ('Close', '&Next', '&Back'); This constant contains the caption of Tips balloon buttons. |
DefGuideDlgBtns : array [TGuideDlgBtn]
of String = ('Close', '&Options', '&Tips', '&Search', This constant contains the caption of Guide balloon buttons. |
DefHintDlgBtns : array [THintDlgBtn]
of String = ('&OK', This constant contains the caption of Hint balloon buttons. |
The Actor Library is a DLL file with .aal extension that stores the assistant's actor definitions and animations. Each actor has a set of animations that may be assigned to one or more predefined actions and vice versa. Each animation has one or many frames and each frame may be had a sound. Some animation after stop needs to another animation so that returns the actor to its original state (RestPose). Return animations may be created as a separate animation or may be defined by exit branches in the first animation. Each actor has at least one animation assigned to its RestPose action.
Actor libraries can be used as compressed. ASPack is an exe compressor that has been
tested for compressing actor libraries and works great. You could download ASPack from
http://www.aspack.com.
Thanks to Bill Miller for giving me this information.
Note: Office 97 Assistant Package needs at least one actor library. You could download Actor libraries from my site.
On my web site there is a simple editor for creating actor libraries. Unfortunately this editor has not any help file or documentation and needs Delphi command line compiler (DCC32.EXE) to build libraries.
Office 97 Assistant Package is provided "AS IS" without any warranty of any kind, either express or implied. The entire risk as to the quality and performance of the software is with you. The author is not liable for any damages resulting from the use and misuse of the software.
Office 97 Assistant Package is freeware. You may copy it as long as you copy all of files. If you want to change the source code in order to improve the components' features, performance, etc. please send to the author the new source code so that the author can have a look at it. The changed source code should contain descriptions what you have changed, and your name. The only thing you may not change is the original copyright information.
If you have any bug reports, suggestions, comments feel free to contact me
by email address given below. You can also visit my web site to find out the
latest news about this package or download the available
actor libraries.
e-mail: khojasteh@www.dci.co.ir
web: http://www.crosswinds.net/~khojasteh/
|
|