日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用delphi操作mapinfo

發布時間:2025/3/15 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用delphi操作mapinfo 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

1.概述
MapInfo Professionnal 6.0是美國MapInfo公司開發的一種桌面地理信息系統開發平臺,因為它小巧玲瓏、易學易用,同時對空間數據具有強大的采集、存貯、分析等功能,所以成為世界上最為流行的桌面地理信息系統。目前利用MapInfo開發應用程序主要有三種方式。分別是單純利用MapBasic開發、利用可視化編程工具集成二次開發和利用MapX開發。
在這三種方法中,單純MapBasic編程由于缺乏可視化編程環境的支持,開發周期過長而較少采用,后兩種是實際應用中比較常用的方法。
利用MapX開發的應用程序因為不需要后臺MapInfo的支持,所以運行速度快,小巧靈活,是目前比較流行的開發方法,然而MapX并沒有實現所有的MapInfo功能,而且其生成和編輯地圖的能力尚有欠缺。相信隨著更高版本的MapX的推出,這種開發方法將會越來越流行。
利用可視化編程工具集成開發是在前臺利用可視化編程工具(VC、VB、Delphi等)開發與地理信息功能無關的用戶界面,在涉及到地理信息功能時在后臺調用MapInfo。實際上是將地圖窗口集成到其它編程語言開發的應用程序中,用其它編程語言通過向MapInfo傳送命令來控制MapInfo。這種方法能隨心所欲制造出美觀友好的界面并且能實現幾乎所有的MapInfo功能,尤其是需要在原有成熟的應用系統中增加地理信息管理功能時,這種方法是非常有效的。


2.OLE調用方法介紹
應用程序向MapInfo傳送命令主要通過有兩種途徑:
一種是利用DDE技術建立MapInfo和應用程序之間的通信。DDE會話是兩個Windows應用程序交換信息的過程。只有當兩個支持DDE的應用程序運行時,它們之間才可以進行DDE會話。在一個會話中,只有一個應用程序是主動的,成為客戶,被動的應用程序成為服務器。實際運行時,MapInfo充當服務器的角色,被客戶應用程序調用。
另一種向MapInfo傳送命令的方法是OLE自動化技術。MapInfo允許其他支持OLE功能的應用程序把MapInfo作為一個對象加以調用,MapInfo作為一個OLE服務器向其他應用程序提供它的對象,而客戶應用程序則使用它的對象,其他應用程序通過調用OLE自動化對象的方法、屬性來操作MapInfo。
實際應用中,利用OLE是較為常用的方法,因為它比DDE穩定可靠,同時它還能報告MapInfo的運行錯誤,而DDE不能獲取MapInfo的錯誤代碼。本文主要討論基于OLE自動化的集成開發。

以Delphi集成MapInfo為例,利用OLE自動化集成開發方法如下:
a)啟動MapInfo
在客戶程序中啟動MapInfo用如下語句來實現:
var oleMapInfo : Variant; //在Delphi應用程序中聲明OLE Variant類型的變量
oleMapInfo := CreateOLEObject('MapInfo.Application');
CreateOLEObject()函數用來創建MapInfo自動化服務器的一個實例,上述語句同時把該函數的返回值賦給Variant類型的變量oleMapInfo,通過上述語句,oleMapInfo對象被定義為MapInfo的一個實例,在以后的操作中,oleMapInfo就相當于一個MapInfo服務器,Delphi應用程序通過對oleMapInfo的調用,就相當于對MapInfo的進行管理和操作。
b)調用MapInfo實例的方法和屬性
OleMapInfo對象擁有以下方法和屬性
對象
方法
屬性
Application
Do、Eval、RunCommand、SetCallBack 、RunMenuCommand、DataObject、
Name、Application、Parent、Version、Visible、LastErrorCode等
在應用程序中調用不同的方法和屬性可以實現不同的功能,其中經常用到的有:
1)Do方法—向MapInfo傳送指令
啟動MapInfo后就可以向它傳送MapBasic指令,讓其實現相應MapBasic語句對應的功能。例如下述語句打開并調入一幅地圖:
MsgString := ‘Open Table “D:\Map\Map1.Tab” Interactive’;
oleMapInfo.Do(MsgString);
MsgString := ‘Map From Map1’;
oleMapInfo.Do(MsgString);
Do方式是集成開發用到最多的一種方法,基本上一些重要的功能都要用它來實現。下面列舉一些。
①、重生成MapInfo窗口
當啟動MapInfo之后,通常要做的第一步是重生成MapInfo窗口:
MsgString := 'Set Next Document Parent ' + sWinHand + ' Style 1';
//sWinHand是Delphi容納MapInfo窗口的控件的句柄
oleMapInfo.Do(MsgString);
當執行完上述語句后,MapInfo的對話框和錯誤信息就為客戶程序所擁有。
②、直接運行Mapbasic程序
有的時候,需要在二次開發中調用現成的MapBasic程序實現特定的功能,用Do方法實現如下:
MsgString := 'Run Application " D:\MapBasic\DrawArc.MBX"';
oleMapInfo.Do(MsgString);
③、重定義MapInfo右鍵菜單
這是一項很有實際意義的功能,開發者可以根據實際需要增加或者修改MapInfo地圖窗口的右鍵菜單,甚至完全屏蔽MapInfo的右鍵菜單:
MsgString := 'Create Menu "MapperShortcut" ID 17 As "(-"'; //屏蔽右鍵菜單
oleMapInfo.Do(MsgString);
2)Eval方法—從MapInfo獲得返回值
oleMapInfo的Eval方法可以從MapInfo中返回值給客戶程序。當客戶程序需要得到某些地圖信息時,需要應用此方法。下面的語句將地圖中心的橫、縱坐標返回給客戶程序:
MsgString := 'MapperInfo(WindowID(0), 3)';
CenterLongitude := oleMapInfo.eval_r(MsgString);
MsgString := 'MapperInfo(WindowID(0), 4)';
CenterLatitude := oleMapInfo.eval_r(MsgString);
//MapperInfo是MapInfo內部函數
3)RunMenuCommand方法—調用MapInfo菜單
利用RunMenuCommand方法可以方便的實現MapInfo的菜單功能。在MapInfo中,每一個菜單功能都對應著一個ID號,在MapBasic安裝目錄下的MENU.DEF文件中可以查詢到每個菜單對應的ID號。例如當希望客戶程序的某一個按鈕按下后彈出MapInfo的Change View對話框(對應MapInfo中Map菜單的Change View菜單項),只需要響應在這個按鈕的OnClick事件,在其中調用oleMapInfo的RunMenuCommand方法:
procedure TFormMap.cmdChangeViewClick(Sender: TObject);
begin
oleMapInfo.RunMenuCommand(805);
//805是MEMU.DEF中對應M_MAP_CHANGE_VIEW的值
end;
利用同樣的方法,MapInfo的Main工具欄中對應的按鈕同樣可以集成到應用程序中。工具欄按鈕對應的ID號同樣可以在MENU.DEF中找到。

3.利用回叫機制從MapInfo中獲取信息
在集成二次開發中,通常采用回叫機制從MapInfo中獲取信息。所謂回叫,是指當集成客戶程序的MapInfo地圖窗口中有事件發生時,MapInfo通過OLE自動化對象自動向客戶應用程序發送消息的機制。
利用回調機制,在如下情況下MapInfo可以向客戶程序發送信息:
1)apInfo中執行菜單欄或者工具按鈕的命令。
2)圖窗口發生變化。
3)MapInfo狀態條發生改變(用戶在地圖上移動鼠標)。
而客戶程序可以接收相應的信息,在自己定義的方法中進行處理。所以可以利用回叫機制在應用程序中實現下面的功能:
1)定義MapInfo右鍵菜單。
2)過用戶自定義工具同MapInfo交互。
3)控制發生變化的地圖。
4)自定義客戶程序狀態欄顯示的內容。
回叫是利用OLE自動化集成二次開發的難點所在,其核心思想是MapInfo服務器向客戶程序發送消息。以自定義客戶程序的狀態欄為例,回調機制的使用方法如下:
1)建一個類,定義SetStatusText方法。此方法帶一個WideString類型的參數StatusText。這個參數是MapInfo向客戶程序傳遞過來的。
在Delphi6.0中選擇File|New|ActiveX|Automation Object,通過啟動Automation Object向導打開“Type Library”編輯器來實現。這里假設創建的類名為TmyCallBack。
2)應用程序窗體中添加狀態欄。
3)使用第一步中定義的類創建一個對象。
varCallBack := TMyCallBack.Create;
4)調用自動OLE對象的SetCallBack方法傳遞參數。
oleMapInfo.SetCallback(varCallBack As IMyCallBack);
5)在SetStatusText方法中處理由MapInfo傳遞的StatusText參數,控制狀態欄的顯示。
procedure TMyCallBack.SetStatusText(const StatusText: WideString);
begin
MainForm.StatusBar1.Panels[0].Text := StatusText;
//MainForm是容納地圖組件的窗體
end;
4. 結束語
實踐表明,利用OLE自動化技術開發MapInfo應用程序節省了開發周期,能有靈活有效的控制MapInfo,實現MapInfo的地理信息系統功能。它的缺點是需要在后臺調用MapInfo故程序運行速度受到限制。然而在MapX控件應用成熟以前,OLE調用、回叫仍然將會是普遍應用的開發方法。

總結

以上是生活随笔為你收集整理的用delphi操作mapinfo的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。