In this topic
There are cases where you want to use an ArcObject, but it is specified as a non-creatable object in the ArcObjects namespace reference. A non-creatable object cannot be created using the "New" keyword. A reference to the non-creatable object must be obtained through other objects (that is, it must be created from the result of a property or method on a different object). This is a harder to determine than declaring an object as new (see Creating variables using the New keyword for details).
Consider the scenario to add a MapInsetWindowClass object to a map. First, examine the help document for the MapInsetWindowClass Class. See the following screen shot:
If you had not seen the portion of the document stating that the MapInsetWindow is a non-creatable object, you may have thought that you could create a MapInsetWindowClass object using the following code example, which results in a compile time error:
[VB.NET]
Public Class Class1
Public Sub Test()
' The MapInsetWindowClass is non-creatable and causes a compile time error in
' Visual Studio similar to the following:
' ESRI.ArcGIS.ArcMapUI.MapInsetWindowClass.Private Sub New()' is not accessable
' in this context because it is 'Private'.
Dim mapInsetWindow As IMapInsetWindow = New MapInsetWindowClass
End Sub
End Class
[C#]
public class Class1
{
public void test()
{
// The MapInsetWindowClass is non-creatable and causes a compile time error in
// Visual Studio similar to the following:
// The type 'ESRI.ArcGIS.ArcMapUI.MapInsetWindowClass' has no constructors defined.
IMapInsetWindow mapInsetWindow = new MapInsetWindowClass();
}
}
As previously mentioned, the MapInsetWindow object cannot be instantiated with the "New" keyword and if you try to compile this code, it will not work. Our goal will be to use some other ArcObject and obtain an interface that is supported by the MapInsetWindowClass. The following steps are recommended to use non-creatable ArcObjects:
- Locate the interfaces implemented by the specified class (MapInsetWindowClass) that do not end with "events" in the ArcObjects namespace reference help. In this example, the interfaces are IDataWindow, IDataWindow2, ILensWindow, and IMapInsetWindow (see the previous screen shot).
- Search the help using each of the interface names selected in Step 1 as keywords. Look for help documents that return one or more of these interfaces as a property or method from another object.
- The key to finding the help document or documents you want from the returned results are those in which the title does not contain Interface in the name and does end with the words Property or Method. These documents will most likely return the desired interface. See the following screen shot:
The following table summarizes the search results using the keywords listed in Step 1. The document listed in the second column meets the desired criteria.
Keyword
|
Help document title
|
IDataWindow
|
IDataWindowFactory.Create Method
|
IDataWindow2
|
None
|
ILensWindow
|
None
|
IMapInsetWindow
|
None
|
Since the IDataWindowFactory.Create Method is the only document that met the search criteria, we will investigate it's help page to see if this help's us solve our ultimate goal of obtaining an interface on MapInsetWindowClass object to program against. The following screen shot shows the IDataWindowFactory.Create Method help document:
In the preceding screen shot, under the See Also area, click IDataWindowFactory Interface and the following help document appears:
In the preceding screen shot, "Classes that implement IDataWindowFactory" indicates you can create an object from these choices. Now you can create an object and utilize one of its methods to obtain the interface for the non-creatable MapInsetWindow object. For more information, see Creating variables using the New keyword.
The following code example shows how the code can look when using the functionality on MapInsetWindowClass:
[VB.NET]
Public Class Class1
Public Sub Test(ByVal application As IApplication)
Dim dataWindowFactory As IDataWindowFactory = New MapInsetWindowFactoryClass
' IDataWindow is an interface on the non-creatable MapInsetWindowClass.
Dim dataWindow As IDataWindow = dataWindowFactory.Create(application)
' TypeOf determines if dataWindow interface implements the MapInsetWindowClass.
If TypeOf dataWindow Is MapInsetWindow Then
' Cast to different interfaces on the MapInsetWindowClass.
Dim dataWindow2 As IDataWindow2 = CType(dataWindow, IDataWindow2)
End If
End Sub
End Class
[C#]
public class Class1
{
public void test(IApplication application)
{
IDataWindowFactory dataWindowFactory = new MapInsetWindowFactoryClass();
// IDataWindow is an interface on the non-creatable MapInsetWindowClass.
IDataWindow dataWindow = dataWindowFactory.Create(application);
// TypeOf determines if dataWindow interface implements the MapInsetWindowClass.
if (dataWindow is MapInsetWindow)
{
// Cast to different interfaces on the MapInsetWindowClass.
IDataWindow2 dataWindow2 = (IDataWindow2)dataWindow;
}
}
}
See Also:
Understanding the ArcObjects namespace referenceCreating variables using the New keyword
To use the code in this topic, reference the following assemblies in your Visual Studio project. In the code files, you will need using (C#) or Imports (VB .NET) directives for the corresponding namespaces (given in parenthesis below if different from the assembly name):
ESRI.ArcGIS.ArcMapUI ESRI.ArcGIS.Carto ESRI.ArcGIS.System (ESRI.ArcGIS.esriSystem)ESRI.ArcGIS.Framework
Development licensing | Deployment licensing |
---|---|
ArcGIS for Desktop Basic | ArcGIS for Desktop Basic |
ArcGIS for Desktop Standard | ArcGIS for Desktop Standard |
ArcGIS for Desktop Advanced | ArcGIS for Desktop Advanced |
Engine Developer Kit | Engine |