Extend Statement Summary
Extend is a nonterminal, refactoring statement that occurs only in
hostid oriented
Refactor statements. Its purpose is to add properties to control classes needed to process property bag code. It can also be used to mirror coclasses in libraries.
The attributes of the Extend statement are as follows:
Attribute | Description |
Id | This attribute is the identifier of the class or coclass which is the focus of the extend operation. It is expressed relative to the Id attribute of the parent Refactor statement. It must identify a class or coclass within the hosting library. |
The substatements of the
Extend statement are as follows:
Substatement | Description |
Property | A declaration statement that declares a property to be added to the class identified by the statement. Any valid Property declaration may used. |
Coclass | A terminal substatement of the Extend statement that extends the library with a new coclass with a different Id but with the same subclasses. |
The script errors associated with the
Extend statement are as follows:
Error | Description |
1101 | Extend identifier [%1d] is not defined. |
The primary use of
Extend is to add properties to control classes to satisfy references in the form property bag specification. By default the
gmBasic VB6 property bag processor assumes that the names included with
BeginProperty statements and on the left-hand-side of
name=value are the names of properties of the containing control class. In the absence of any additional specification, when the processor encounters a name that it cannot identifier it triggers an "UndefinedProperty"condition. The
Select UndefinedProperties attribute is used to control the treatment of this condition. Consider, for example, a simple code using the unmigrated
mscomctl.ocx set of controls with
undefinedproperties="warn".
Code Block |
---|
language | none |
---|
theme | Eclipse |
---|
linenumbers | true |
---|
|
WARNING#5403: Filename <\ImageList\vb6\Form1.frm>
Property <NumButtons> not recognized
Record: NumButtons= 5
WARNING#5403: Filename <\ImageList\vb6\Form1.frm>
Property <Images> not recognized
Record: BeginProperty Images {2C247F25-8591-11D1-B16A-00C0F0283628}
|
Regardless of whether a warning is issued or ignored the statement or the property block for undefined properties is then skipped. Assuming that skipping these specifications is not desirable the simplest way to deal with them is to simply add the missing properties to the relevant control class. Since the identifiers are not defined, there will be no references to them in the real code, so no harm is done. The refactoring
Extend statement adds properties to a control. As an example
Code Block |
---|
language | none |
---|
theme | Eclipse |
---|
linenumbers | true |
---|
|
<Extend id="IImageList" >
<Property id="Images" type="ListImages" />
</Extend>
<Extend id="IToolbar" >
<Property id="NumButtons" type="integer" />
</Extend>
|
The
id attribute is the identifier of the class that is to be extended. It can be fully-qualified in the same manner as other identifiers within a refactoring specification. Even here great care must be taken. Properties are contained in classes, while controls in OCX's are usually coclasses, which contain multiple classes. The
Property statements themselves are completely standard. The properties added with the
Extend statement behave exactly like the original ones and can be referenced later by other refactoring statements and migclasses.
Coclass Extend Substatement Summary
Coclass is a terminal substatement of the
Extend statement. It can be used if and only if the
Id attribute of the parent
Extend identifies a coclass. The statement adds a second coclass to the host library with the same subclasses as the host coclass but with a different identifier.
The attributes of the Coclass substatement are as follows:
Attribute | Description |
Id | This attribute is the identifier of a new coclass to be added to the parent library that will match the host coclass. |
As an example, instances of the
Button coclass of the
MSCOMCTL.OCX can be migrated to either to .NET
ToolStripButton or
ToolStripSeparator. The actual choice depends upon the properties of the instance, but the first step is to create a second coclass
Separator that can be used to anchor the new references. Assuming that the original declaration of
Button was
Code Block |
---|
language | none |
---|
theme | Eclipse |
---|
linenumbers | true |
---|
|
<coclass id="Button" creatable="off" role="control" >
<subclass id="IButton"/>
</coclass>
|
Then this refactoring statement
Code Block |
---|
language | none |
---|
theme | Eclipse |
---|
linenumbers | true |
---|
|
<Extend id="Button" >
<Coclass id="Separator" />
</Extend>
|
does the same thing as adding this declaration to the original reference script
Code Block |
---|
language | none |
---|
theme | Eclipse |
---|
linenumbers | true |
---|
|
<coclass id="Separator" creatable="off" role="control" >
<subclass id="IButton"/>
</coclass>
|