HyperDoc is primarily a database integrator tool. It provides drawing and document management capability, integrated redlining, Object Overlay, hyper navigation and hyper linking, right into any business database environment. That’s fine but, quite immediately, a lot of questions must be answered. What database, what are documents attributes, what business objects are supported. The only answer you need here is quite simple: whatever you may need, as HyperDoc is fully configurable and customizable.

The process of developing a new HyperDoc application typically consists of the following steps:

This chapter is intended for integrators, developers and advanced users who might want to explore HyperDoc closer, customize existing applications and develop new ones. This is a typical reference manual, so most of it you will never read, but I hope that it contains the information that you may need one day.

HyperDoc requires a database to run. It also requires its configuration tables to be filled properly. This chapter provides information how to do it. HyperDoc configuration is easiest to understand by using the demo database that is installed by the SETUP program as an example.

All table names below are defaults. The actual name of HDocConfiguration table can be stored in HDoc.ini file. The names of the other tables are stored in the HDocConfiguration table itself or in other configuration tables (hierarchy definition, document types).

HDocConfiguration

Main configuration table

HDocUserConfig

Table with user-specific configuration data (optional)

HDocHierarchyDefinition

Hierarchy definition

HDocObjectFields

Form definition for objects

HDocDocumentTypes

List of document types

HDocDocumentTypeDefs

Document types definition

HDocDocumentFields

Document fields definition

HDocDocFieldWidths

Widths of document fields on grid

HDocLinkTables

Linking tables definition

The following tables are necessary for proper HyperDoc operation.

HDocAddIns

List of add-ins to be loaded when HyperDoc starts

HDocParams

User-specific parameters

HDocSecClassRights

Access rights to security classes

HDocSecurityClasses

List of security classes

HDocDocumentSets

List of document sets

HDocDocSetObjects

List of documents in document sets

HDocObjectSets

List of object sets

HDocUserRights

Global access rights

HDocSpots

Spots definitions

HDocDocuments

Document table

HDocVersionContents

Document versions contents information

HDocVersions

Document versions

HDocLogDevs

Logical devices definition

HyperDoc presents one or more hierarchies of business objects. Such hierarchy represents data taken from HyperDoc database. Each level of the hierarchy consists of one or more database tables. Each of these tables must have a single field key. This key need not be a primary key, but to achieve decent performance, this field must be the first (most significant) segment of an index. Records are linked to the upper level of the hierarchy with a linking field. The linking field must have the same type and length as the key field in the upper level table. This field should also be indexed to achieve good performance. (The upper level table is in a 1-N relationship to the lower level table). One of the fields of each table is designated to be displayed in the hierarchy tree.

The hierarchy definition is stored in HDocHierarchyDefinition table or in a table, which name is specified in HDocUserConfig table.

HDocHierarchyDefinition table structure:

Field name

Description

Sequence

Ordinal number

ObjectClass

Table name

ParentClass

Parent table name

PrimaryKeyField

Key field in this table

ForeignKeyField

Link field to parent table

LabelField

Field to be displayed

LabelText

Prefix for displayed field

DisplayName

Name used for UI

The fields contain the following information:

ObjectClass

The name of the table with actual data for this class of objects (also used to identify this class of objects in other contexts)

ParentClass

Parent object class

PrimaryKeyField

Name of the field in ObjectClass table containing the primary key of this table

ForeignKeyField

Name of the field in ObjectClass table containing link to the parent table

LabelField

Name of the field to be displayed in the hierarchy

LabelText

The actual text used as a prefix to the displayed field data

DisplayName

Name of the object class as shown to the user in various contexts

Sequence

Sequence number used to determine the order in which classes on the same hierarchy level are displayed

One record in HDocHierarchyDefinition table has a special meaning. When the ObjectClass field equals a reserved value “Root”, this record defines the root of the hierarchy. All the other fields should be empty except for the LabelText field which should contain the text to be displayed in the root node. In case of additional hierarchies LabelField should contain the text to be displayed as a hierarchy tab caption. The first level object classes should have “Root” as their parent class and an empty ForeignKeyField field. HyperDoc always displays all records from the first level tables.

Example:

Sequence

ObjectClass

ParentClass

PrimaryKeyField

ForeignKeyField

LabelField

LabelText

DisplayName

0

Root

-

Root_ID

-

-

NetMan

Root

1-1

CommLinks

Root

CommLink_ID

-

CommLink_Name

CL:

Comm Link

1-2

Regions

Root

Region_ID

-

Region_Name

-

Region

2-0

Backbones

Regions

Backbone_ID

Region_ID

Backbone_Name

-

Backbone

2-1

Buildings

Regions

Building_ID

Region_ID

Building_Name

-

Building

3-0

RentalUnits

Buildings

RentalUnit_ID

Building_ID

RentalUnit_Name

RU:

Rental Unit

3-1

Floors

Buildings

Floor_ID

Building_ID

Floor_Name

-

Floor

4-1

Rooms

Floors

Room_ID

Floor_ID

Room_Name

-

Room

4-2

Xpanels

Floors

Xpanel_ID

Floor_ID

Xpanel_Name

-

Xpanel

5-1

Equipment

Rooms

Equipment_ID

Room_ID

Equipment_Name

-

Equipment

5-2

Cables

Rooms

Cable_ID

Room_ID

Cable_Name

-

Cable

5-3

Hubs

Xpanels

Hub_ID

Xpanel_ID

Hub_Name

-

Hub

6-1

Ports

Hubs

Port_ID

Hub_ID

Port_Name

-

Port

HyperDoc allows the user to create new business objects and edit existing object's properties. The object property forms which are shown to the user are created on-the-fly according to information stored in HDocObjectFields configuration table.

HDocObjectFields table structure:

Field name

Description

ObjectClass

Object class

Sequence

Sequence number

FieldName

Field name

LabelText

Text of preceding label

DictTable

Dictionary table

DictDisplayField

Dictionary display field

DictLinkField

Dictionary ID field

The fields contain the following information:

When displaying form for a given object class HyperDoc reads all records from this table having the appropriate value in the ObjectClass field and sorts them according to the Sequence field.

Example:

ObjectClass

Sequence

FieldName

LabelText

DictTable

DictDisplayField

DictLinkField

Backbones

1

Backbone_ID

ID:

-

-

-

Backbones

2

Backbone_Name

Name:

-

-

-

Backbones

3

Backbone_Description

Description:

-

-

-

Buildings

1

Building_ID

ID:

-

-

-

Buildings

2

Building_Name

Name:

-

-

-

Buildings

3

Building_Address

Address:

-

-

-

Cables

1

Cable_ID

ID:

-

-

-

Cables

2

Cable_Name

Name:

-

-

-

Cables

3

Date_Ordered

Ordered:

-

-

-

Cables

4

Ordered_By

Who ordered:

-

-

-

CommLinks

1

CommLink_ID

ID:

-

-

-

CommLinks

2

CommLink_Name

Name:

-

-

-

CommLinks

3

CommLink_Description

Description:

-

-

-

Equipment

1

Equipment_ID

ID:

-

-

-

Equipment

2

Equipment_Name

Name:

-

-

-

Equipment

3

Date_Ordered

Ordered:

-

-

-

Equipment

4

Delivered_By

Source:

-

-

-

Floors

1

Floor_ID

ID:

-

-

-

Floors

2

Floor_Name

Name:

-

-

-

Floors

3

Floor_Description

Description:

-

-

-

Hubs

1

Hub_ID

ID:

-

-

-

Hubs

2

Hub_Name

Name:

-

-

-

Hubs

3

Hub_Description

Description:

-

-

-

Ports

1

Port_ID

ID:

-

-

-

Ports

2

Port_Name

Name:

-

-

-

Ports

3

Port_Description

Description:

-

-

-

Regions

1

Region_ID

ID:

-

-

-

Regions

2

Region_Name

Name:

-

-

-

Regions

3

Region_Description

Description:

-

-

-

RentalUnits

1

RentalUnit_ID

ID:

-

-

-

RentalUnits

2

RentalUnit_Name

Name:

-

-

-

RentalUnits

3

RentalUnit_Description

Description:

-

-

-

Rooms

1

Room_ID

ID:

-

-

-

Rooms

2

Room_Name

Name:

-

-

-

Rooms

3

Room_Description

Description:

-

-

-

Xpanels

1

Xpanel_ID

ID:

-

-

-

Xpanels

2

Xpanel_Name

Name:

-

-

-

Xpanels

3

Xpanel_Description

Description:

-

-

-

With the above example data HyperDoc displays the following form to allow the user to create a new Building object:

HyperDoc manages documents. It stores document attributes in its database. Each document has associated exactly one row in the Main Document table. This table has at least two obligatory fields: Document_ID [for example typically varchar(50) in MS SQL Server] and Document_Type_ID (integer). It can also have more fields for document attributes. Depending on the type of particular document it must also have exactly one record associated in one of additional configurable tables called Document Type tables. These tables must have a single field key (we suggest it to be primary key) of the same type and length as the key in Document table.

Each document in HyperDoc belongs to one of document types. Document type determines the way document attributes are defined, stored and displayed. Configuration information concerning document types is stored in the following tables: HDocDocumentTypeDefs, HDocDocumentFields, HDocDocFieldWidths, and HDocDocumentTypes. From this set of tables only the HDocDocFieldWidths table is filled by HyperDoc itself and needs no manual data-entering. For HyperDoc to run, other mentioned tables must be filled according to rules described later.

Each document type must have a unique ID. The document type ID (later in this paper referred to just as ‘type ID’) is used in the fields named Type_ID in the tables mentioned above. The type ID is also used in the Document_Type_ID field of the Main Document table. For each row in the Main Document table there must be corresponding row in HDocDocumentTypeDefs table with the same value of the type ID. The ‘-1’ value of the type ID in HDocDocumentTypeDefs table is an exception, because it means documents of all types.

So the first step of the process of document type configuration is to fill HDocDocumentTypeDefs table with appropriate data. Each field of this table has type ‘varchar(50)’ except for Type_ID, which has an integer type.

HDocDocumentTypeDefs table structure:

Field name

Description

Type_ID

Type ID

DTName

Type name (UI)

DTNameSingular

Type name singular (UI)

DTDocIDField

ID field

DTTypeField

Type field

DTRawTable

Table name

Sequence

Sequence number used to determine the order in which document type tabs are displayed

Example:

Type_ID

DTName

DTNameSingular

DTDocIDField

DTTypeField

DTRawTable

Sequence

-1

All

-

Document_ID

Document_Type_ID

Document

0

1

Drawings

Drawing

Document_ID

-

Drawing

1

2

Contracts

Contract

Document_ID

-

Contract

2

The primary key in the HDocDocumentTypeDefs table is the Type_ID field. It contains the type ID. The -1 value in this field is reserved for the main document type. The DTName field contains the name of document type as seen by HyperDoc users e.g. in the tab labels above of the document list. The DTNameSingular field is the singular name of document belonging to given document type. For example if the DTName field is Drawings then DTNameSingular field could be Drawing. The DTDocIDField field is the name of primary key field in table indicated by the DTRawTable field. The DTTypeField field is the name of the field in the document table that contains the type ID. This field should be filled for main type only. The DTRawTable field contains the name of database table that contains document attributes specific for the given type ID. This table (one for each document type) can be created in the process of manual HyperDoc configuration or it can be a table existing in the HyperDoc database prior to installing HyperDoc, e.g. as a heritage from the former document management system. The primary key in this table must be comprised of a single field of the same type as in the main document table.

The next step is to fill the HDocDocumentFields table. This table determines what fields are shown on various tabs of the main HyperDoc document list and what fields are shown on the form used in New Document, Edit Document and View Document HyperDoc commands. Each field of this table has type varchar 50 except for Type_ID and GridWidth fields, which have an integer type and MainTable, which has a Boolean type.

HDocDocumentFields table structure:

Field name

Description

Type_ID

Type ID

DataField

Field name in Main Document table or Document Type table

MainTable

Flag indicating DataField location:

Yes - Main Document table

No - Document Type table

DictTable

Dictionary table

DictDisplayField

Dictionary display field

DictLinkField

Dictionary ID field

FormLabel

Label of the field on the form

FormSequence

Sequence number used to determine the order in which fields are displayed on the form

GridLabel

Grid column heading in Document List Window

GridWidth

Grid column width in Document List Window

GridSequence

Sequence number used to determine the order in which fields are displayed in Document List Window

Example:

Type ID

DataField

Main Table

DictTable

Dict DisplayField

DictLinkField

Form Label

Form Sequence

Grid Label

Grid Width

Grid Sequence

-1

Document_ID

Yes

-

-

-

ID:

01

ID

1200

01

-1

Document_ Type_ID

Yes

Document_Types

Type_Name

Type_ID

Category:

02

Type

1200

02

1

Document_ID

No

-

-

-

ID:

11

ID

1200

11

1

Drawing_Info

No

-

-

-

Info:

12

Info

1200

12

1

Drawing_Date

No

-

-

-

Date:

13

-

-

-

The primary key in this table contains two fields: Type_ID and DataField.

The Type_ID field is document type ID. The DataField field contains the name of the field that contains given document attribute. The table this field comes from is determined by the MainTable field. If the MainTable field is Yes, then the respective field comes from main document table. If the MainTable field is No, then the respective field comes from the specific document table.

The next three fields: DictTable, DictDisplayField and DictLinkField determine the presentation of given document attribute. If the DictTable field is empty, then the contents of the field indicated in the DataField field is displayed on the form ‘as it is’. If the DictTable field is not empty, then it is assumed that there exists a table with a name as in the DictTable field, with unique index as in DictLinkField field and with a field as in DictDisplayField. In such a case the value of the DataField field is used to find a row in DictTable with the same value in the DictLinkField field and HyperDoc displays on the form the contents of the DictDisplayField field of the found row in the DictTable table. This method allows saving database space - longer texts do not need to be repeated in every document record - only short IDs of these texts are repeated. It also helps to maintain the consistency of attributes used to categorize the documents.

The FormLabel field contains the label, which precedes edit box for editing document attribute on the form. The FormSequence determines the sequence, in which document attributes are displayed on the document attributes form. If the FormSequence field is empty the field is not displayed on the editing form.

The GridLabel contains the label of the column in the grid where the content of the field is displayed. The GridWidth attribute is the default width of this column. Each user can enforce his own column width by resizing a column on the screen. Column widths are stored per user in the HDocDocFieldWidths table, which HyperDoc fills automatically. The GridSequence field determines the sequence, in which document attributes are displayed on the main document list. If the GridSequence field is empty the field is not displayed on the document grid.

The Main Document table is not a configuration table at all. It contains document data. It is shown here just for reference. The Document_Type_ID field of this table must contain values, which are also in the Type_ID field of one of rows in the HDocDocumentTypeDefs table. These values care inserted to the Document_Type_ID field of Document table automatically by HyperDoc during execution of New Document command.

Document table structure:

Field Name

Comment

Document_ID

Unique document ID in document table

Document_Type_ID

Document type ID

The names of linking tables are stored in the HDocLinkTables table. The suggested names follow the convention: Object1_Object2_Link.

HyperDoc supports four types of links between various entities. Types of links and associated tables are defined in HDocLinkTables table. The types of links are:

HDocLinkTables table structure:

Field Name

Description

Link_Table

Name of table defining links between various objects

Link_Type_ID

Link type

A_Table_Name

Name of table A

A_Primary_Key

Name of primary key for table A

B_Table_Name

Name of table B

B_Primary_Key

Name of primary key for table B

Example:

Link_Table

Link_Type_ID

A_Table_Name

A_Primary_Key

B_Table_Name

B_Primary_Key

CommLink_OSet_Link

OS

CommLinks

CommLink_ID

HDocObjectSets

SetID

Document_Backbone_Link

DL

Backbones

Backbone_ID

Document

Document_ID

Document_Building_Link

DL

Buildings

Building_ID

Document

Document_ID

Document_Cable_Link

DL

Cables

Cable_ID

Document

Document_ID

Document_CommLink_Link

DL

CommLinks

CommLink_ID

Document

Document_ID

Document_Equipment_Link

DL

Equipment

Equipment_ID

Document

Document_ID

Document_Floor_Link

DL

Floors

Floor_ID

Document

Document_ID

Document_Hub_Link

DL

Hubs

Hub_ID

Document

Document_ID

Document_Port_Link

DL

Ports

Port_ID

Document

Document_ID

Document_Region_Link

DL

Regions

Region_ID

Document

Document_ID

Document_RentalUnit_Link

DL

RentalUnits

RentalUnit_ID

Document

Document_ID

Document_Room_Link

DL

Rooms

Room_ID

Document

Document_ID

Document_Xpanel_Link

DL

Xpanels

Xpanel_ID

Document

Document_ID

RentalUnit_OSet_Link

OS

RentalUnits

RentalUnit_ID

HDocObjectSets

SetID

Root_Document_Link

DL

Root

Root_ID

Document

Document_ID

Spot_Backbone_Link

IS

HDocSpots

Spot_ID

Backbones

Backbone_ID

Spot_Building_Link

IS

HDocSpots

Spot_ID

Buildings

Building_ID

Spot_Cable_Link

IS

HDocSpots

Spot_ID

Cables

Cable_ID

Spot_CommLink_Link

IS

HDocSpots

Spot_ID

CommLinks

CommLink_ID

Spot_Document_Link

HN

HDocSpots

Spot_ID

Document

Document_ID

Spot_Equipment_Link

IS

HDocSpots

Spot_ID

Equipment

Equipment_ID

Spot_Floor_Link

IS

HDocSpots

Spot_ID

Floors

Floor_ID

Spot_Hub_Link

IS

HDocSpots

Spot_ID

Hubs

Hub_ID

Spot_Port_Link

IS

HDocSpots

Spot_ID

Ports

Port_ID

Spot_Region_Link

IS

HDocSpots

Spot_ID

Regions

Region_ID

Spot_RentalUnit_Link

IS

HDocSpots

Spot_ID

RentalUnits

RentalUnit_ID

Spot_Room_Link

IS

HDocSpots

Spot_ID

RentalUnits

RentalUnit_ID

Spot_Xpanel_Link

IS

HDocSpots

Spot_ID

Xpanels

Xpanel_ID

For each business object class there should be a corresponding link (DL) defined in HDocLinkTables table and the corresponding linking table (usually with XXX_Document_Link name). Each link table for DL links should have the following structure:

Field name

Description

XXX_ID

XXX object ID (same field name as key in business object table)

Document_ID

Unique document ID in Document table

Default

Flag indicating the default document

Xmin

X coordinate of left lower corner of the default view

Ymin

Y coordinate of left lower corner of the default view

Xmax

X coordinate of right upper corner of the default view

Ymax

Y coordinate of right upper corner of the default view

For hyper-navigation a single record in HDocLinkTables table is necessary - exactly as the one shown in the example. It also implies that two additional tables are needed: Spot_Document_Link and HDocSpots.

Spot_Document_Link table structure:

Field name

Description

Spot_ID

Unique Spot ID in HdocSpots table

Document_ID

Unique Document ID in Document table

Default

Flag indicating the default Document used when spot is activated

HDocSpots table structure:

Field name

Description

Spot_ID

Unique Spot ID

Document_ID

Spot owner

Entity_ID

Vector entity ID

To allow InfoScope links for each business object class there should be a corresponding IS entry in HDocLinkTables table (see example above) and a separate table - Spot_XXX_Link of the following structure.

Spot_XXX_Link table structure:

Field name

Description

Spot_ID

Unique Spot ID in HDocSpots table

XXX_ID

Unique XXX object ID (the same field name as the key in business object table)

Default

Tag indicating default XXX object used when spot is activated

To allow linking object sets to business objects of a particular class, there should be appropriate record in the HDocLinkTables table with OS text in Link_Type_ID field as shown above. Each link table for OS link (suggested name: XXX_OSet_Link where XXX is object class name) should have the following structure:

XXX_OSet_Link table structure:

Field name

Description

XXX_ID

Unique XXX object ID in appropriate object table (the same field name as the key in the business object table)

SetID

Object set ID

The following tables are optional. They can be created by a database administrator.

HDocObjectSets

List of object sets

HDocObjectSetXXX

Tables with object sets contents (one per object class)

HDocSCXXX

Tables with security class IDs for objects (one per object class)

HDocDynamicTextMacros

List of dynamic text macros

HDocPresentations

List of vector object presentations

HDocPresentationFilters

List of filters for vector object presentations

Object set data is stored on two levels. First level is HDocObjectSets table, which contains one record for each object set. Second level are HDocObjectSetXXX tables (where XXX is object class name), which store one record for each element of each object set. Star near the field name means it is a part of the primary key.

HDocObjectSets table structure:

Field name

Data type

Description

SetID *

int(4)

Unique object set ID

UserID

varchar(50)

User ID for private OSes, empty for public OSes

SetName

varchar(255)

Object set name

HDocObjectSetXXX table structure:

Field name

Data type

Description

SetID *

int(4)

Unique object set ID

XXX_ID *

Same as key in XXX

Business object ID (field name is concatenation of business object class name and an ‘_ID’ suffix)

HDocSCXXX table structure:

Field name

Data type

Description

SetID *

int(4)

Unique object set ID

XXX_ID *

Same as key in XXX

Business object ID (field name is concatenation of business object class name and an ‘_ID’ suffix)

HDocSCXXX table structure:

Field name

Data type

Description

SecurityClassID

int(4)

Unique security class ID

XXX_ID *

The same as key in XXX

Business object ID (field name is the same as the key in XXX)

Presentation data is stored on two levels. First level is HDocPresentations table which stores one record for each presentation. Second level is HDocPresentationFilters table which contains one record for each filter of each presentation.

HDocPresentations table structure:

Field name

Data type

Description

ID *

varchar(50)

Presentation ID

Name

varchar(255)

Presentation name

Descr

varchar(255)

Presentation description

Automatic

Boolean

Is it an automatic presentation?

HDocPresentationFilters table structure:

Field name

Data type

Description

Presentation_ID *

varchar(50)

Presentation ID

ObjectClass *

varchar(50)

Class of object connected to spot affected by presentation tool

Sequence *

varchar(50)

Ordinal number text

Tool_ID

varchar(50)

Presentation tool name

FromSQL

varchar(255)

Additional tables used in the WhereSQL field

WhereSQL

varchar(255)

Condition for applying presentation tool from Tool_ID field

Label

varchar(50)

Legend label

Layer

varchar(50)

Vector drawing layer name. If not empty, limits affected spots.

GroupBy

varchar(255)

SQL expression used to generate filters from the filter template (for an automatic presentation only).

HDocDynamicTextMacros table structure:

Field name

Data type

ObjectClass

The name of the object class

MacroName

The name of the macro

MacroExpansion

SQL query text to be used when resolving the macro

HyperDoc uses the following algorithm to resolve dynamic text macros:

Example:

ObjectClass

MacroName

MacroExpansion

Floors

Building name

SELECT Buildings.Building_Name FROM Buildings, Floors WHERE Buildings.Building_ID = Floors.Building_ID AND Floors.Floor_ID = '%1'

Floors

Floor description

SELECT Floor_Description FROM Floors WHERE Floor_ID = '%1'

Floors

Floor number

SELECT Floor_Name FROM Floors WHERE Floor_ID = '%1'

Rooms

Room description

SELECT Room_Description FROM Rooms WHERE Room_ID = '%1'

Rooms

Room name

SELECT '* ' + Room_Name + ' *' AS RName FROM Rooms WHERE Room_ID = '%1'

HyperDoc is an open system. It can be easily programmed via OLE Automation (later named ActiveX) interface. You can start and control HyperDoc from an external application. You can extend HyperDoc functionality adding custom developed modules called Add-Ins. The Add-In can add his own menu items to HyperDoc menu, which implement new functions specific to user requirements. The external application and Add-Ins modules can respond to HyperDoc events. The picture below presents general structure of HyperDoc programmability model.

The sample program HDocTest demonstrates HyperDoc starting and initialization, usage of documents and objects related methods and handling HyperDoc events via a notification object.

The full listing of a sample program main form (HDocTest.Frm) is the following:

Option Explicit

Public HDoc As Object
Dim NotifObj As Notif
Public RegNObj As Boolean
Public HDStart As Object

Private Sub AddObj_Click()
  Dim ObjectC As String
  Dim KeyV As Variant
  HDoc.GetCurrentObject ObjectC, KeyV
  ObjList.AddItem ObjectC & ";" & KeyV
End Sub

Private Sub Form_Load()
  Me.Move 0, 0
  Set NotifObj = New Notif
  RegNObj = False
End Sub

Private Sub Form_Unload(Cancel As Integer)

  If RegNObj Then
    HDoc.UnRegisterNotificationObject "HDocTest"
  End If

  Set HDStart = Nothing
End Sub

Private Sub ShowObj_Click()
  Dim ObjectC As String
  Dim KeyV As Variant
  Dim i As Integer
  ObjectC = ObjList.Text
  i = InStr(1, ObjectC, ";")
  KeyV = Mid(ObjectC, i + 1)
  ObjectC = Left(ObjectC, i - 1)
  HDoc.SetCurrentObject ObjectC, KeyV
  HDoc.ResetMarked
  HDoc.MarkObject ObjectC, KeyV, False
  HDoc.DocMode = 0
  HDoc.RefreshView
End Sub

Private Sub ShowUnit_Click()
  Dim lSetID As Long
  Dim ObjID As Object
  Dim ObjSet As Object
  Dim sName As String
  Dim InfoS As Object
  Dim fTmp As Boolean
  Dim FirstObj As Object

  HDoc.SetCurrentObject "Unit", UnitID
  Set ObjID = HDoc.CreateObjectID
  ObjID.m_ObjectClass = "Unit"
  ObjID.m_KeyValue = UnitID
  lSetID = HDoc.GetLinkedObjectSetID(ObjID)
  
  If lSetID <> 0 Then
    Set ObjSet = HDoc.DBOSS
    sName = HDoc.ObjectSet_GetSetName(lSetID)
    ObjSet.RemoveAll
    If ObjSet.Load(sName, "") = 0 Then
      HDoc.ShowObjectInfoscope
      Set InfoS = HDoc.InfoScope
      ObjSet.MoveFirst
      Set FirstObj = ObjSet.GetCurrent
      Set FirstObj = FirstObj.m_ObjID
      fTmp = HDoc.ObjectInfoScope_AutoShow
      HDoc.ObjectInfoScope_AutoShow = True
      If InfoS.SetCurrentObject(FirstObj) Then
      End If
      HDoc.ObjectInfoScope_AutoShow = fTmp
    End If
  End If
End Sub

Private Sub StartHDoc_Click()
  Dim UserName As String
  Dim Password As String

  UserName = LoginName.Text
  Password = LoginPassword.Text

  If HDoc Is Nothing Then
    'If no connection to HyperDoc, connect to running instance
    'or start HyperDoc if necessary

    Set HDStart = GetObject("", "HDStart.App")

    If HDStart Is Nothing Then
      MsgBox "Cannot start HDStart"
      Exit Sub
    End If

    Set HDoc = HDStart.GetHDoc()
  End If

  If Not HDoc.Initialized Then
    ' This HyperDoc instance has not been initialized
    HDoc.Init "", UserName, Password
  Else
    'This HyperDoc instance is initialized --> check
    'if proper user
    If UCase(HDoc.CurrentUser) <> UCase(UserName) Then
      ' Wrong user --> re-initialize
      HDoc.Init "", UserName, Password
    End If
  End If

  HDStart.Register

  ' Force certain screen location
  If HDoc.MainForm.WindowState <> 0 Then
    HDoc.MainForm.WindowState = 0
  End If
  HDoc.MainForm.Move Me.Width, 0, Screen.Width - Me.Width, _
                     Screen.Height * 4 / 5
  If HDoc.RegisterNotificationObject(NotifObj, "HDocTest") Then
    RegNObj = True
  End If

End Sub

Private Sub GetCurrent_Click()
  DocList.AddItem HDoc.GetCurrentDocument()
End Sub

Private Sub SetCurrent_Click()
  HDoc.SetCurrentDocument DocList.Text, True
End Sub

The full listing of a sample program notification class is the following:
Option Explicit

Public Sub CurrentObjectChanged(ObjClass As String, _
                                KeyVal As Variant)
  HDocTest.CurrObj = ObjClass & ";" & KeyVal
End Sub

Public Sub EndOfHDoc()

  HDocTest.HDoc.UnRegisterNotificationObject "HDocTest"
  HDocTest.RegNObj = False
  Set HDocTest.HDoc = Nothing
  
  If Not HDocTest.HDStart Is Nothing Then
      Set HDocTest.HDStart = Nothing
  End If

End Sub

Public Sub VectorEntityChanged(VectorDrw As Object, _
                               VectorEntityId As Long)

  ' find modified element DISPATCH interface
  Dim vdbent As Object
  Dim vdbiter As Object
  Dim Id As Long

  HDocTest.VectorEntity = ""
  Set vdbiter = VectorDrw.GetElemIter(0)
  If Not vdbiter Is Nothing Then
    Set vdbent = vdbiter.GetNext
    Do While Not (vdbent Is Nothing)
      Id = vdbent.GetLongID
      If Id = VectorEntityId Then Exit Do
      Set vdbent = vdbiter.GetNext
    Loop
    If Not vdbent Is Nothing Then
      HDocTest.VectorEntity = vdbent.GetArea
    End If
  End If
End Sub

You can use Visual Basic to create Add-In modules. Use the following procedure to create your own HyperDoc Add-In:

The full listing of a sample Add-In is presented below. This Add-In modifies print template contents. It replaces text $User with text RYR. It adds menu command Handle print events to enable/disable print events handling.

Option Explicit
  Dim HDocRef As Object
  Dim MyIndex As Integer
  Dim EventsEnabled As Boolean
Public Sub PreInitPaperSpace(DocID As Variant)
  If EventsEnabled Then
'    HDocRef.PrintTemplate = "your own print template file"
  End If
End Sub
Public Sub PostInitPaperSpace(ByVal VectorDrw As Object)
  Dim vdbobj As Object
  Dim vdbiter As Object
  Dim cont As String
  Dim typ As Integer

  If EventsEnabled Then
    ' resolve macro $User
    Set vdbiter = VectorDrw.GetElemIter(0)
    Set vdbobj = vdbiter.GetNext
    While Not (vdbobj Is Nothing)
      typ = vdbobj.GetType
      If typ = 6 Then
        ' Text
        cont = vdbobj.Contents
        If cont = "$User" Then
            vdbobj.Contents = "RYR"
        End If
      End If
      Set vdbobj = vdbiter.GetNext
    Wend
  End If
End Sub
Public Function Init(Index As Integer, HDoc As Object) As Boolean
  HDoc.AddCustomMenuItem Index, "AddInMenuItem", _
                         "Handle print events"
  MyIndex = Index
  Set HDocRef = HDoc
  Init = True
End Function
Public Sub FinalExit()
End Sub
Public Sub CustomMenuItemExpand()
  Dim MenuItem As Object
  Set MenuItem = HDocRef.CustomMenuItem(MyIndex, "AddInMenuItem")
  MenuItem.Checked = EventsEnabled
End Sub
Sub CustomMenuClick(MenuItem As String)
  If MenuItem = "AddInMenuItem" Then
    EventsEnabled = Not EventsEnabled
  End If
End Sub
Private Sub Class_Initialize()
  EventsEnabled = False
End Sub
loading table of contents...