【正文】
Get a handle to the Editor extension pID = Set pApp = Application Set pEditor = (pID) 39。 Dim pApp As IApplication Dim pEditor As IEditor Dim pEnumFeat As IEnumFeature 39。在有些實(shí)例中,返回值的方法是一個(gè)接口。當(dāng)對(duì)一個(gè)只讀屬性賦值時(shí)也會(huì)產(chǎn)生這樣的錯(cuò)誤。所有的對(duì)象瀏覽器和ArcObjects類幫助文件(在ArcGIS開發(fā)幫助系統(tǒng)中可以找到)都提供了這些信息。Create New Layer Set = pClassv 39。對(duì)于值賦值,可以不用Set語(yǔ)句。對(duì)于其它的值,則聲明明確數(shù)據(jù)類型的一個(gè)變量或用VB的Variant數(shù)據(jù)類型,然后,用一個(gè)簡(jiǎn)單的賦值語(yǔ)句將值賦給變量。 End Sub二十三、使用屬性(Working with properties) 有些屬性引用了ESRI對(duì)象庫(kù)中一些特別的接口,還有一些屬性則是標(biāo)準(zhǔn)數(shù)據(jù)類型的值,如strings、numeric expressions、Boolean values等。注意Err對(duì)象的使用,它給用戶提供了一些對(duì)錯(cuò)誤的描述。也就是說(shuō)簡(jiǎn)單地告訴用戶,或者自動(dòng)處理錯(cuò)誤然后繼續(xù)運(yùn)行函數(shù)。 H80004001 ‘Constant that represents HRESULT ‘Added to any method not implemented On Error GoTo 0 E_NOTIMPL 此外,還要編寫處理HRESULT返回非S_OK值時(shí)的代碼。通常這個(gè)在一個(gè)方法完成之前做完。通過(guò)這種方法VB虛擬機(jī)處理了客戶返回的所有HRESULTs值。VB虛擬機(jī)接收了HRESULT值,如果結(jié)果不是S_OK,那么虛擬機(jī)就產(chǎn)生異常。在VB中,當(dāng)遇到錯(cuò)誤時(shí)也會(huì)產(chǎn)生異常。如果在接口中無(wú)法定位該方法,編譯時(shí)就會(huì)出錯(cuò)。 第二行創(chuàng)建了一個(gè)對(duì)象或可實(shí)例化類,然后對(duì)IPoint接口執(zhí)行了QI操作,并對(duì)其賦值。 Dim pPt As IPoint Set pPt = New Point 100,100 這段簡(jiǎn)短代碼的第一行顯示了如何用一個(gè)變量引用對(duì)象支持的接口,從ESRI對(duì)象庫(kù)中讀取IPoint接口的GUID值。在獨(dú)立的VB程序或組件中,則必須手工引用需要的文件庫(kù)。要在VB或VBA中使用AO對(duì)象,首先要引用包含該對(duì)象的ESRI文件庫(kù)。它貯存了虛擬機(jī)。 Set pFoo = Do While (Not pFoo Is Nothing) If ( = “Done”) Then Exit Loop Set pFoo = Loop十九、VB虛擬機(jī)(The Visual Basic Virtual Machine) VB虛擬機(jī)包括了VB內(nèi)部控制和服務(wù),如開始和終止VB程序,它是執(zhí)行所有VB開發(fā)代碼所必須的。十八、While…Wend結(jié)構(gòu)(While Wend constructs) 避免使用While…Wend語(yǔ)句。十七、內(nèi)存管理(Memory management) 要確保高效使用內(nèi)存資源,應(yīng)注意以下幾點(diǎn):正常卸載窗體。十六、事件函數(shù)(Event functions) 不要在事件函數(shù)中放置過(guò)多的代碼,以免代碼雜亂無(wú)章。錯(cuò)誤處理后(通常顯示一個(gè)消息),應(yīng)該用下表中顯示的恢復(fù)語(yǔ)句繼續(xù)處理。十四、簡(jiǎn)單圖象顯示(Simple image display) 對(duì)于簡(jiǎn)單的圖象顯示,用ImageControl控件,不要用PictureBox控件,這樣更高效。十二、變量命名方法 用下面的方法來(lái)命名變量:[libraryName][scope_]typename,name描述變量用作什么或包含什么,scope和type部分小寫,name部分應(yīng)該大小寫混合。用LBound和UBound循環(huán)矩陣中的每項(xiàng)。八、多屬性操作(Multiple property operations) 同時(shí)操作同一對(duì)象的多個(gè)不同屬性時(shí),用With…End With語(yǔ)句,這比每次指定對(duì)象更高效。也就是說(shuō)在條件句的前一部分,不能對(duì)必須具有效性的對(duì)象和接口進(jìn)行條件判斷。 盡量為變量、參數(shù)和函數(shù)設(shè)置明確的類型,否則系統(tǒng)默認(rèn)為Variant類型,這樣會(huì)降低效率。(Dim和Private同樣可以聲明模塊級(jí)別變量,但使用Private更常見)。二、變量聲明(Variable declaration) 使用“Option Explicit”(或在VB選項(xiàng)對(duì)話框中設(shè)置)強(qiáng)制需要變量聲明。在模塊中,根據(jù)控件提供的功能為其命名,不要使用系統(tǒng)默認(rèn)的名字。模塊根據(jù)其提供的功能來(lái)命名,不要使用系統(tǒng)默認(rèn)的名字(如Form1, Class 1)。VB函數(shù)有:Class_Initialize() 、Class_Terminate() 或Form_Load() 、 Form_Unload(),銷毀對(duì)象時(shí)設(shè)置所有對(duì)象變量為Nothing;確保窗體的tab順序正確,不要把滾動(dòng)條加入到tab順序中,這樣會(huì)很麻煩;對(duì)窗體上標(biāo)識(shí)特別重要的控件的標(biāo)簽(labels),設(shè)置訪問鍵;盡量使用系統(tǒng)顏色,而不要使用hardcoded顏色。二十四、COM數(shù)據(jù)類型(COM data types)二十五、使用組件目錄(Using ponent categories) 如何使用組件目錄第三節(jié) VB環(huán)境 本章適合VB6和VBA開發(fā)人員。二十三、使用類型庫(kù)(Using a type library) 由于AO未實(shí)現(xiàn)Idispatch接口,所以很重要的一點(diǎn)就是利用類型庫(kù)使編譯器早綁定一正確的數(shù)據(jù)類型,適用于所有的開發(fā)環(huán)境。如果在單個(gè)活動(dòng)的對(duì)象或要素類上使用,他們將跳過(guò)對(duì)象生成(如建立拓樸關(guān)系)和屬性或幾何更新(如其它獨(dú)立欄的自動(dòng)計(jì)算)時(shí)相關(guān)的行為。二十一、更新和插入光標(biāo)(Update and insert cursors) 絕對(duì)不要使用update cursors 或insert cursors來(lái)更新或插入對(duì)象到已載入的geodatabse的活動(dòng)對(duì)象或要素類中。十九、使用查詢過(guò)濾器獲得屬性(Fetching Properties Using Query Filters) 為了快速訪問數(shù)據(jù)庫(kù),只需從數(shù)據(jù)庫(kù)中獲取需要的對(duì)象字段。十八、可循環(huán)和不循環(huán)光標(biāo)(Recycling and Nonrecycling Cursors) 使用不可循環(huán)搜索光標(biāo)來(lái)選擇要更新的對(duì)象,可循環(huán)光標(biāo)只能用作只讀操作,如畫要素和查詢要素。 可以將所有的修改做成一個(gè)單獨(dú)的編輯操作,編輯操作可以取消,也可以重復(fù)。十六、編輯會(huì)話(Edit Sessions) 修改geodatabase應(yīng)在編輯會(huì)話中進(jìn)行,這等同于調(diào)用Workspace對(duì)象IworkspaceEdit接口的StartEditing和StopEditing方法之間的過(guò)程。下面會(huì)詳細(xì)描述。 Sink the event since listener has not been initialized with this map Set ViewEvents = End IfEnd Sub 注意上面代碼中的關(guān)鍵字Is,用來(lái)檢查對(duì)象的身份。 舉個(gè)例子,假如這樣定義了一個(gè)變量ViewEvents: Private WithEvents ViewEvents As Map 要接收這個(gè)事件處理,可以在一個(gè)Uibutton控件的OnClick事件中寫下如下代碼: Private Sub UIButtonControl1_Click() Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument 39。使用propputref方法,下面對(duì)象參數(shù)設(shè)置代碼也能通過(guò) Set Text1=Text2十四、初始化界外接口(Initializing Outbound Interfaces) 初始化一個(gè)界外接口時(shí),重要的一點(diǎn)是只初始化沒有監(jiān)聽來(lái)自服務(wù)端對(duì)象事件的變量。(DISPIDs是為屬性和方法指定的唯一值,以方便Idispatch接口使用Invoke方法調(diào)用快速調(diào)用適當(dāng)?shù)姆椒ǎ?這些情況都可行,其前提是文本框的文本屬性可操作。在VB中用propput如下: = 也可以這樣寫: =Text2或者Text1=Text2 這幾種情況都用propput方法將Text2的字符串賦給Text1。VB程序員則有些不同,因?yàn)閂B同時(shí)支持能屬性的By Reference 和 By Value操作。十三、值屬性和參數(shù)屬性(Property by Value and by Reference) 有時(shí),會(huì)出現(xiàn)用值或參數(shù)設(shè)置屬性的情況,即同時(shí)存在put_XXX 和 putref_XXX方法。正確的代碼如下: Dim pEnv As IEnvelope Set pEnv = New Envelope pEnv 那么怎樣才能知道何時(shí)需要?jiǎng)?chuàng)建,何時(shí)不需創(chuàng)建呢?通常,所有的以“Query”開頭的方法,如QueryEnvelope,都需要客戶創(chuàng)建對(duì)象。如果程序如下: Dim pEnv As Ienvelope pEnv 會(huì)出錯(cuò),因?yàn)镼ueryEnvelope方法期望客戶創(chuàng)建Envelope。這就叫做客戶存儲(chǔ),因?yàn)榭蛻粼谡{(diào)用方法以前必須為對(duì)象分部?jī)?nèi)存空間。例如,程序框架使用這些接口來(lái)決定一個(gè)菜單對(duì)象(menu object)是根級(jí)別菜單(rootlevel menu)(IRootLevelMenu)還是上下文菜單(context menu)(IShortcutMenu)。十一、Notification接口(Notification Interfaces) AO中有許多沒有方法的接口,稱之為布告接口(notification interfaces)。十、錯(cuò)誤處理(Error Handling) 接口的所有方法,即可調(diào)用的方法,應(yīng)能處理內(nèi)部錯(cuò)誤并能通過(guò)適當(dāng)?shù)腍RESULT值提示操作成功或失敗。如果對(duì)象將存在的枚舉器傳給客戶,要素的當(dāng)前指針停留在最后一個(gè)元素上。這樣可以快速遍歷整個(gè)集合九、使用枚舉器(Enumerator use) 請(qǐng)求一個(gè)對(duì)象的枚舉接口時(shí),客戶不知道對(duì)象是如何實(shí)現(xiàn)這個(gè)接口的。通常如果不知道集合的索引起點(diǎn),可以假設(shè)為0。七、集合索引(Indexing of Collecionts) AO中所有對(duì)象集合都以0為基礎(chǔ)索引的。如果鼠標(biāo)放在一個(gè)ESRI類型上,當(dāng)按下F1鍵時(shí),ArcGIS開發(fā)幫助系統(tǒng)中的ArcObjects類幫助就會(huì)以HTML頁(yè)形式顯示適當(dāng)?shù)捻?yè)面。當(dāng)熟習(xí)對(duì)象模型之后這將是使用最頻繁的幫助。四、對(duì)象瀏覽器(Object Browsers) 除了類圖PDF文檔外,還可以用一些對(duì)象瀏覽器來(lái)查看類型庫(kù)信息。二、常見代碼提示和資源三、類圖(Class Diagram) 要成功使用AO,最基本的如何是從對(duì)象模型獲得幫助。 有些例子可能不遵循代碼標(biāo)準(zhǔn)。AO中所有的對(duì)象都獨(dú)立進(jìn)程運(yùn)行的,所以自動(dòng)化不可行。 可以通過(guò)創(chuàng)建文檔對(duì)象并調(diào)用ArcMap內(nèi)部函數(shù)來(lái)實(shí)例化一個(gè)ArcMap對(duì)象。通常認(rèn)為自動(dòng)相當(dāng)于寫宏,這些宏可以訪問許多程序以完成任務(wù)。如果以后目錄中加入了一個(gè)新類,客戶程序不需更改就可以使用新類,它在下次讀取目錄時(shí)會(huì)自動(dòng)使用新類。如果不用組件目錄,程序就必須實(shí)例化每個(gè)對(duì)象并詢問其是否支持請(qǐng)求的功能,當(dāng)然這不切實(shí)際。十五、Aggregation and Containment十六、Thread, Apartments, and Marshaling十七、組件目錄(Component Category) 利用組件目錄,客戶程序可以快速查找系統(tǒng)中已經(jīng)安裝的某一特殊類型的所有COM類。十四、接口繼承(Interface Inheritance) 這里的繼承和其它語(yǔ)言(如:SmallTalk和C+|+)不同,在實(shí)現(xiàn)繼承中,一個(gè)對(duì)象繼承父類的所有代碼,但在接口繼承中,只繼承父類方法的定義。Application對(duì)象是支持Idispatch接口的。 支持Idispatch和custom vTable的對(duì)象是作為雙接口對(duì)象來(lái)引用的。 Idispatch接口支持Late和ID在綁定語(yǔ)言,Idispatch接口存在方法允許客戶向其詢問支持何種方法。編譯時(shí)存儲(chǔ)Ids方法,通過(guò)高級(jí)別的函數(shù)來(lái)調(diào)用Custom vTable (early)。十三、IDispatch接口(IDispatch Interface) COM支持三種綁定(binding)類型:Late。 ArcCatalog和ArcMap這兩個(gè)Application對(duì)象的缺省接口是Iapplication接口。十二、缺省接口(Default Interfaces) 每個(gè)COM對(duì)象都有一個(gè)缺省接口,當(dāng)對(duì)象創(chuàng)建或如果沒有指定接口就返回此接口。這些接口在VBA中處理應(yīng)用程序事件的時(shí)候使用,如裝載文檔。十一、分發(fā)事件接口(Dispatch event interface) 有些AO對(duì)象提供兩個(gè)相似的事件接口。如果用VB,就不用實(shí)現(xiàn)接口上的所有函數(shù),因?yàn)閂B為你未實(shí)現(xiàn)的方法提供了stub方法。界外接口是對(duì)象調(diào)用客戶時(shí)用到的,類似傳統(tǒng)的回調(diào)機(jī)制。十、入接口和界外接口(Inbound and Outbound Interfaces) 接口可以是入接口或界外接口。八、接口定義語(yǔ)言(Interface Definition Language) 微軟接口定義語(yǔ)言(Microsoft Interface Definition Language)用來(lái)描述COM對(duì)象及其接口,它是對(duì)分布式計(jì)算環(huán)境組織(Distributed Computing Environment)定義的接口定義語(yǔ)言(Interface Definition Language)(用來(lái)描述客戶