『壹』 C#如何執行sql語句命令將mdb文件逆序排列
執行方法:select*。
mdb屬於一種資料庫方式,accessmdb資料庫簡易編輯器是一個免費mdb文件瀏覽器和編輯器,一般用ACCESS就能直接打開。
sql:SQL屬於結構化查詢語言,是一種特殊目的的編程語言,是一種資料庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關系資料庫系統。
結構化查詢語言是高級的非過程化編程語言,允許用戶在高層數據結構上工作。它不要求用戶指定對數據的存放方法,也不需要用戶了解具體的數據存放方式,所以資料庫系統底層結構的不同,可以使用相同的結構化查詢語言作為數據輸入與管理的介面。
『貳』 c語言簡單行編輯器
/*
c語言程序設計 簡單的行編輯器
【要求】
(1) 設置一個簡單的行編輯器,每行以回車結束
(2) 數據以文件形式存儲
(3) 編輯器具有查找、替換、修改數據的功能
【備注】完全原創,編寫時間:2010-7-13。請把所有的注釋信息提取出來就可以寫程序設計報告。
*/
#include /*標准文件流操作,這里使用了fopen/fclose/fprintf/printf/scanf/gets函數*/
#include /*標准系統庫,這里使用了malloc/free/exit*/
#include /*標准字元串庫,這里使用strlen/strcpy/memcpy/memset*/
#define szLINE 252 /*定義一行字元串最長為252位元組*/
#define CMDS 12 /*定義12個標准行編輯命令*/
/*採用鏈表存儲文本*/
typedef struct LINE {
char text[szLINE]; /*文本內容*/
struct LINE * next; /*鏈表指針*/
} L;
/*簡寫無類型整數*/
typedef unsigned int U;
/*定義12個行編輯命令的標准格式*/
typedef void (*FUNC)(L **, char*);
/*定義12個標准行編輯命令的關鍵字*/
char keywords[CMDS][8]={
"quit", "help", "load", "save",
"view", "count", "append", "insert",
"erase", "edit", "lookup", "replace"
};/*end keywords*/
/*清空鏈表操作*/
void clear(L ** lines)
{
L * a = 0, * b = 0;
if(!lines) return ;
a = *lines;
while(a) {
b = a->next ;
free(a);
a = b;
}/*end while*/
*lines = 0;
}/*end clear*/
/*在鏈表中根據行號index調出指定的行*/
L * locate(L * lines, U index)
{
L * t = lines; U i = 0;
if(!t) return 0;
if(index == 0) return t;
for(i = 0; i < index; i++) {
t = t->next;
if(!t) return 0;
}/*next*/
return t;
}/*end locate*/
/*瀏覽命令,如果f存在則以帶行號格式保存文件(如果f==stdout則列印到屏幕上),
瀏覽范圍為from到to(行號)。view(lines, 0, 0, 0)表示統計已載入到內存的文本行數量*/
int view(L * lines, FILE * f, U from, U to)
{
L * t = lines; U index = 0;
while(t) {
index ++;
if(f && index >= from && index text);
t = t->next;
}/*end while*/
return index;
}/*end view*/
/*在當前文檔中根據關鍵字進行搜索,並將搜索結果列印出來*/
void lookup(L * lines, char * string)
{
L * t = 0; U index = 0;
if(!string) return ;
t = lines;
while(t) {
index ++;
if(strstr(t->text , string)) printf("%d: %s", index, t->text );
t=t->next;
}/*end while*/
}/*end lookup*/
/*在一行文本中執行替換命令,把所有關鍵字替換為新關鍵字*/
void rpc(char * string, char * key, char * replacement)
{
char fine[szLINE], * x = 0, * y = 0, * z = 0;
int la = 0, lb = 0, r = 0;
if(!string || !key || !replacement) return ;
memset(fine, 0, szLINE);
x = string; y = fine;
/*首先記錄新舊關鍵字長度*/
la = strlen(key);
lb = strlen(replacement);
do {
/*用指針逐個比較*/
r = memcmp(x, key, la);
if(r) {/*如果關鍵字不匹配則復制字元串*/
*y = *x;
x++; y++;
}else{/*如果關鍵字匹配則替換字元串*/
memcpy(y, replacement, lb);
x += la; y += lb;
}/*end if*/
}while(*x);
/*將替換完成的結果返回*/
memcpy(string, fine, szLINE);
}/*end rpc*/
/*全文替換*/
void replace(L * lines, char * string, char * replacement)
{
L * t = 0; U index = 0;
if(!string || !lines || !replacement) return ;
t = lines;
while(t) {
index ++;
if(strstr(t->text , string)) {
printf("[BEFORE] %d: %s", index, t->text );
rpc(t->text, string, replacement);
printf("[AFTER ] %d: %s", index, t->text );
}/*end if*/
t=t->next;
}/*end while*/
}/*end replace*/
/*根據行號插入一行新文本,如果行號小於零則將文本追加至鏈表尾*/
void insert(L ** lines, char * line, int index)
{
L * t = 0, * s = 0; int i = 0;
if(!lines || !line) return ;
/*首先為新文本分配一個鏈表節點*/
t = (L*)malloc(sizeof(L));
memset(t, 0, sizeof(L));
strcpy(t->text , line);
if(index == 0 || !*lines) {/*如果鏈表為空則以新節點為起點定義鏈表*/
t->next = *lines;
*lines = t;
return ;
}/*end if*/
s = *lines;
if(index > 0)/*如果行號為正整數,則將鏈表指針指向行號之前*/
for(i = 0; i < index-2; i++) {
if(!s->next ) break;
s = s->next ;
}/*next*/
else/*否則鏈表指針指向表尾*/
while(s->next ) s = s->next ;
/*end if*/
/*完成鏈表插入操作*/
if(s->next ) t->next = s->next ;
s->next = t;
}/*end insert*/
/*根據行號刪除一行文本*/
void erase(L ** lines, U index)
{
L * a = 0, * b = 0, * c = 0;
if(!lines) return ;
/*index -1 表示目標行,index -2表示目標行的前一行*/
a = locate(*lines, index-2);
b = locate(*lines, index-1);
if(!b) return ;
if(a) /*如果前一行存在則刪除目標行*/
a->next = b->next;
else/*否則表示表頭刪除*/
*lines = b->next ;
/*end if*/
/*釋放內存*/
free(b);
}/*end erase*/
/*根據行號和新錄入文本替換原有行*/
void edit(L * lines, char * line, U index)
{
L * t = locate(lines, index-1);
if(!t) return ;
if(line) strcpy(t->text , line);
}/*end edit*/
/*將文件整個裝入鏈表*/
int load(L ** lines, char * file)
{
FILE * f = 0; char line[szLINE]="";
int total = 0;
if(!lines || !file) return 0;
clear(lines);/*首先清空鏈表*/
/*打開文件*/
f = fopen(file, "r");
if(!f) {
fprintf(stderr, "%s is bad.\n", file);
return 0;
}/*end if*/
/*逐行讀入內存並插入表尾*/
while(!feof(f)) {
memset(line, 0, szLINE);
fgets(line, szLINE - 1, f);
insert(lines, line, -1);
total ++;
}/*end while*/
fclose(f);
fprintf(stderr, "[%s] %d lines loaded.\n", file, total);
/*返回總行數*/
return total;
}/*end load*/
/*將鏈表保存到指定的文本文件*/
int save(L * lines, char * file)
{
FILE * f = 0; L * t = lines;
int total = 0;
if(!lines || !file) return 0;
/*打開文件*/
f = fopen(file, "w");
if(!f) {
fprintf(stderr, "%s is bad.\n", file);
return 0;
}/*end if*/
t = lines;
while(t) {/*逐個文件寫入*/
fprintf(f, "%s", t->text );
t = t->next ;
total ++;
}/*end while*/
fclose(f);
fprintf(stderr, "[%s] %d lines saved.\n", file, total);
/*返回總行數*/
return total;
}/*save*/
/*執行載入文本文件命令*/
void exec_load(L ** lines, char * line)
{
char cmd[szLINE] = "", file[szLINE] = "";
/*分析命令行,提取文件名*/
sscanf(line, "%s %s", cmd, file);
/*執行載入命令*/
load(lines, file);
}/*end exec_load*/
/*執行文本保存命令*/
void exec_save(L ** lines, char * line)
{
char cmd[szLINE] = "", file[szLINE] = "";
/*分析命令行,提取文件名*/
sscanf(line, "%s %s", cmd, file);
/*執行保存命令*/
save(*lines, file);
}/*end exec_save*/
/*執行文本查看命令*/
void exec_view(L ** lines, char * line)
{
char cmd[szLINE] = ""; U from = 0, to = 0;
/*分析命令行,提取目標要查看的起始行號和終止行號*/
sscanf(line, "%s %u %u", cmd, &from, &to);
/*如果起始行號和終止行號大小相反,則根據起始行號顯示一頁*/
if(to < from) to = from + 24;
/*執行查看命令*/
view(*lines, stdout, from, to);
}/*end exec_view*/
/*執行行數統計命令*/
void exec_count(L ** lines, char * line)
{
fprintf(stderr, "%d lines in mem.\n", view(*lines, 0, 0, 0));
}/*end count*/
/*執行文本追加命令*/
void exec_append(L ** lines, char * line)
{
char text[szLINE] = "";
/*在命令之後另起新行用於錄入文本*/
gets(text); strcat(text, "\n");
/*執行文本追加命令*/
insert(lines, text, -1);
}/*end exec_append*/
/*執行文本插入命令*/
void exec_insert(L ** lines, char * line)
{
char cmd[szLINE] = "", text[szLINE] = ""; U index = 0;
/*從命令行提取目標插入點的行號*/
sscanf(line, "%s %d", cmd, &index);
/*在命令之後另起新行用於錄入文本*/
gets(text); strcat(text, "\n");
/*執行文本插入命令*/
insert(lines, text, index);
}/*end insert*/
/*執行文本刪除命令*/
void exec_erase(L ** lines, char * line)
{
char cmd[szLINE] = ""; U index = 0;
/*從命令行提取目標行號*/
sscanf(line, "%s %d", cmd, &index);
/*執行文本刪除命令*/
erase(lines, index);
}/*end erase*/
/*執行文本編輯命令*/
void exec_edit(L ** lines, char * line)
{
char cmd[szLINE] = "", text[szLINE] = ""; U index = 0;
/*從命令行提取目標行號*/
sscanf(line, "%s %d", cmd, &index);
/*在命令之後另起新行用於錄入文本*/
gets(text); strcat(text, "\n");
/*執行文本編輯命令*/
edit(*lines, text, index);
}/*end edit*/
/*執行文本檢索命令*/
void exec_lookup(L ** lines, char * line)
{
char cmd[szLINE] = "", text[szLINE] = "";
/*從命令行提取關鍵字*/
sscanf(line, "%s %s", cmd, text);
/*執行文本檢索命令*/
lookup(*lines, text);
}/*end lookup*/
/*執行在線幫助命令*/
void exec_help(L ** lines, char * line)
{printf("\tcommands:\n\thelp\n\tquit\n\
\tload [file.txt]\n\
\tsave [file.txt]\n\
\tview [from line] [to line]\n\
\tcount\n\
\tappend [return + text]\n\
\tinsert [line number] [return + text]\n\
\terase [line number]\n\
\tedit [line number] [return + text]\n\
\tlookup [text]\n\
\treplace [keyword] [replacement]\n");
}/*end help*/
/*執行文本替換命令*/
void exec_replace(L ** lines, char * line)
{
char cmd[szLINE] = "", text[szLINE] = "", key[szLINE]="";
/*從命令行提取新舊關鍵字*/
sscanf(line, "%s %s %s", cmd, key, text);
/*執行文本替換命令*/
replace(*lines, key, text);
}/*end replace*/
/*執行退出命令*/
void exec_quit(L ** lines, char * line){exit(0);}
/*行編輯命令執行函數,順序與關鍵字表keywords一一對應*/
FUNC functions[CMDS]={
exec_quit, exec_help, exec_load, exec_save,
exec_view, exec_count, exec_append, exec_insert,
exec_erase, exec_edit, exec_lookup, exec_replace
};/*end functions*/
/*從行輸入中識別關鍵字,相當於parse*/
int identified(char * command, char * key)
{
int ln = 0, r = 0;
if(!command || !key) return 0;
ln = strlen(key);
r = memcmp(command, key, ln);
return r==0;
}/*end identified*/
/*主函數*/
int main(int argc, char * argv[])
{
L * lines = 0; char line[szLINE]=""; int a = 0, b = 0, i = 0; FUNC fun = 0;
/*列印歡迎信息*/
printf("Welcome to LINE EDITOR V1.0\nCommand [help] is available.\n");
/*如果帶主函數帶參數,則可以用於列印幫助,或者根據該參數載入一個文本文件*/
if(argc > 1) {
a = strcmp(argv[1], "--help");
b = strcmp(argv[1], "/h");
if(a && b)
load(&lines, argv[1]);
else{
exec_help(0, 0);
return 0;
}/*end if*/
}/*end if*/
/*主命令循環*/
for(;;) {
/*命令提示符中間是表示當前載入的文檔總共有多少行的意思*/
printf("\n
『叄』 MySQL管理工具有哪些
說到資料庫管理工具,也就是大家熟識的資料庫圖形化工具。資料庫GUI工具是資料庫人員必需的工具之一,根據這種工具,可以形象化方便快捷地查詢數據信息。現階段資料庫人員比較常使用的資料庫管理工具中,主流的有Navicat,PhpMyadmin,DBeaver,Workbench,SQLyog等。
本回答來自:資料庫管理工具是什麼?五款優秀的資料庫管理工具推薦_樹懶學堂
1.資料庫管理工具 Navicat
Navicat是一套速度快、靠譜並非常劃算的資料庫管理工具,專為簡化資料庫的管理及減少系統軟體管理成本費而設。Navicat的設計模式合乎資料庫管理員、開發人員及中小型企業的需求。Navicat是以視覺化的圖形界面設計而創建的,讓你在建立、組織、瀏覽並共享內容時更加簡易、安全。
『肆』 mapinfo是什麼軟體能簡單介紹一下么
Mapinfo是美國Mapinfo公司1986年推出的桌面地圖信息系統,至今已從最初的Mapinfo for Dos 1.0 發展到了Mapinfo Professional 6.0。 Mapinfo產品定位在桌面地圖信息系統上,與Arc/Info等大型GIS系統相比,因Mapinfo圖元數據不含拓撲結構,它的制圖及空間分析能力相對較弱,但對大眾化的PC桌面數據可視及信息地圖化應用來說,Mapinfo小巧玲瓏,易學易用,價位較低,是一個優選GIS產品。Mapinfo提供了自己的二次開發平台,用戶可以在平台上開發各自的GIS應用。二次開發方法歸結起來有三種,它們是基於MapBasic的開發、基於OLE自動化的開發及利用MapX控制項的開發。從早期的MapBasic到目前的MapX4.5,Mapinfo上的GIS系統開發變得越來越高效、簡捷,下面介紹如何利用MapBasic、OLE自動化和MapX開發GIS應用系統。
一、利用MapBasic開發
MapBasic是Mapinfo自帶的二次開發語言,它是一種類似Basic的解釋性語言,利用MapBasic編程生成的*.mbx文件能在Mapinfo軟體平台上運行,早期的Mapinfo二次開發都是基於MapBasic進行的。MapBasic學起來容易,用起來卻束縛多多,無法實現較復雜的自定義功能,用它來建立用戶界面也很麻煩,從現在角度看,MapBasic比較適合用於擴展Mapinfo功能。
二、利用OLE自動化開發
1. 建立Mapinfo自動化對象
基於OLE自動化的開發就是編程人員通過標准化編程工具如VC、VB、Delphi、PB等建立自動化控制器,然後通過傳送類似MapBasic語言的宏命令對Mapinfo進行操作。實際上是將Mapinfo用作進程外伺服器,它在後台輸出OLE自動化對象,供控制器調用它的屬性和方法。
OLE自動化開發的首要一步就是建立Mapinfo自動化對象,以Delphi為例(後面都是如此),你可設定一個Variant類型的全程變數代表OLE自動化對象,假設該變數名為olemapinfo,那麼有:
oleMapinfo := CreateOleObject('Mapinfo.Application')
一旦OLE自動化對象建立,也就是後台Mapinfo成功啟動,你就可以使用該對象的Do方法向Mapinfo發送命令,如:
oleMapinfo.Do('Set Next Document Parent' + WinHand + 'Style 1')
這一命令使Mapinfo窗口成為應用程序的子窗口,WinHand是地圖窗口句柄,style 1 是沒有邊框的窗口類型。你還可以使用自動化對象的Eval方法返回MapBasic表達式的值,如下面語句返回當前所打開的表數:
TablesNum:=olemapinfo.eval('NumTables()')
你也可以直接調用Mapinfo菜單或按鈕命令對地圖窗口進行操作,如地圖放大顯示:
oleMapinfo.RunMenuCommand(1705)
2. 建立客戶自動化對象觸發CallBack
基於OLE自動化開發的難點在於所謂的CallBack,Mapinfo伺服器對客戶程序地圖窗口的反應叫CallBack,假如你在地圖窗口中移動地圖目標,Mapinfo能返回信息告訴你地圖目標當前的坐標位置,這就是CallBack功能。如果你想定製自己的地圖操作工具或菜單命令,你必須依靠CallBack。但是想捕獲CallBack信息,你的客戶程序必須具備接收CallBack信息的能力,為此需要在客戶程序中定義自己的OLE自動化對象,如:
//定義界面
IMyCallback = interface(IDispatch)
['{2F4E1FA1-6BC7-11D4-9632-913682D1E638}']
function WindowContentsChanged(var WindowID: Integer):SCODE;safecall;
function SetStatusText(var StatusText: WideString): SCODE; safecall;
//定義界面實現
TMyCallback = class(TAutoObject, IMyCallback)
function SetStatusText(var StatusText: WideString): SCODE; safecall;
function WindowContentsChanged(var WindowID: Integer): SCODE;safecall;
其中WindowContentsChanged函數用於返回變化窗口的ID號,即當地圖窗口變化時(如放大、縮小),讓Mapinfo將地圖窗口的ID號返回給客戶程序; 另一個SetStatusText函數返回Mapinfo狀態條變化信息。編程人員不能隨意定義這些函數,因為只有在三種情況下Mapinfo伺服器的CallBack才會被觸發:(1)地圖窗口發生變化,觸發函數為WindowContentsChanged;(2)Mapinfo狀態條信息改變,觸發函數為SetStatusText;(3)用戶選擇自定義工具或菜單命令在地圖窗口上操作,如用戶定製的畫線工具,當用戶在地圖窗口畫線時觸發Mapinfo的CallBack返回線的坐標位置。
建立客戶自動化對象後,調用MapInfo自動化對象的SetCallback方法將客戶自己定義的自動化對象告訴Mapinfo,只要程序一運行,客戶自動化對象就會自動在注冊表中注冊,然後就能收到CallBack信息了,如:
My:=MyCallBack.Create
oleMapInfo.SetCallBack(My)
這里打一個比方我想會有助於理解上述機制,客戶程序與Mapinfo之間的交互就像舞台指揮與木偶演員的交流,客戶程序中的地圖窗口或說Mapinfo子窗口只不過是一個牽線木偶,後台的Mapinfo才是真正操縱木偶的演員,所以客戶程序必須與後台Mapinfo建立正向、反向的聯系機制,才能操縱地圖窗口中的圖形目標。
三、利用MapX開發
1. 掌握使用MapX
MapX是Mapinfo公司最新推出的ActiveX控制項產品,目前已經發展到MapX4.5。由於MapX是基於Windows操作系統的標准控制項,因而能支持VC、VB、Delphi、PB等標准化編程工具,使用時只需將控制項裝入開發環境,裝入控制項後,開發環境ActiveX工具條上會增加一個控制項按鈕Map,把它拖放到窗體上就可建立一個TMap類型的ActiveX地圖對象Map,通過設置或訪問該Map對象的屬性、調用該Map對象的方法及事件,便能快捷地將地圖操作功能溶入到你的應用程序中。
MapX由一系列Object(對象)和Collection(對象集合)組成,Map是最基本的對象,每個Map由Layer(層)、Dataset(數據集)和Annotation(標注)這三個對象及對象集合(Layers、Datasets、Annotations)來定義, 其中Layer用於操作地圖圖層,Dataset用於訪問空間對象的屬性數據,Annotation用於在地圖上添加文本、符號等標注,掌握上述三個主要對象的特徵後,再順藤摸瓜掌握下一級對象的特徵,如每個Layer又由Feature(點、線、面、文本圖形目標)對象及對象集合(Features)定義,每個Dataset由Field(屬性數據域)對象及對象集合(Fields)定義......,這樣很快就能把MapX學到手。
2. 定義地圖坐標系
在MapX開發中需要特別注意地圖坐標系問題,MapX地圖坐標系分為地圖顯示坐標系和內部計算坐標系,兩者互為獨立,在GIS應用開發中根據應用需要設置好這兩種坐標系非常重要,因為坐標系一方面影響軟體系統的內部坐標處理,另一方面影響地圖的外觀顯示。Map對象的坐標系及投影通過CoordSys對象的Set方法定義:
Set(Type, [Datum], [Units], [OriginLongitude], [OriginLatitude],
[StandardParallelOne], [StandardParallelTwo], [Azimuth], [ScaleFactor],
[FalseEasting], [FalseNorthing], [Range], [Bounds], [AffineTransform])
其中主要參數:Type表示投影類型,Type為1時地圖坐標以經緯度表示,後面都為可選參數,其中Datum為地球基準面;Units為坐標單位,如Units為7表示以米為單位;OriginLongitude、OriginLatitude分別為起始經度和緯度;StandardParallelOne、StandardParallelTwo為第一、第二標准緯線,該參數與地圖投影相關。
通過設置Map對象的DisplayCoordSys和NumericCoordSys屬性返回的CoordSys對象,就可設定地圖顯示坐標系和內部計算坐標系。舉例如下:
procere TMain.DefineMapParam();
var
MapDatum: Variant;//地球基準面
begin
try
MapDatum := CreateOleObject('MapX.Datum.4'); //建立基準面對象
//定義北京54坐標系基準面
// (Ellipsoid, ShiftX, ShiftY, ShiftZ, RotateX, RotateY, RotateZ, ScaleAdjust, PrimeMeridian)
MapDatum.set(3, 24, -123, -94, -0.02, 0.25, 0.13, 1.1, 0);
//定義北京54坐標系經緯度作為內部計算坐標系
Map1.NumericCoordSys.Set_(1, MapDatum);
//定義北京54坐標系30度標准緯線麥卡托投影作為顯示坐標系,單位為米
Map1.DisplayCoordSys.Set_(26,MapDatum,7,0,0,30);
finally
VarClear(MapDatum);
end;
坐標系是GIS系統的基石,正確設置坐標系是系統成敗的關鍵。
3. 操縱地圖對象
你可以簡單地載入一個GeoSet文件,給Layers對象集合賦予具體的內容,隨之在Map對象中就能看到地圖顯示,GeoSet文件類似MapInfo中的工作空間,MapX中帶有Geoset文件的編輯器GeosetMangater.exe,用戶可在編輯器中組合及設置圖層,然後保存生成一個 *.gst 文件直接調入Map對象,這樣可以節省時間。你也可以通過Layers對象的Add 或 Remove 方法添加或移走地圖圖層,如:
Map.layers.Add(FileName); // 添加圖層,FileName為文件全路徑名
Map.Layers.Remove(3); // 移走地圖第三層
Layers對象由一組Layer對象組成,通過Layer對象的Features和Selection對象集合你可以操縱和選擇圖層上的圖形目標,如:
Map.Layers.Item(1).AddFeature(Newobj); //將新建對象Newobj添加到圖層一
4. 地圖數據捆綁
數據捆綁是將不同來源的數據對應到地圖層的過程,捆綁結果會產生一個Dataset對象,Dataset對象的集合組成Datasets Collection,它定義了Map對象的數據集屬性。 你可以通過Datasets將不同來源的數據捆綁到地圖上實現圖文互動,或創建專題圖,如下例ODBC Access數據的捆綁及專題分析:
procere TMapForm.ODBC1Click(Sender: TObject);
var
param: ODBCQueryInfo ;
ds: Dataset; //定義數據集
Datafields: Fields; //定義數據域
begin
param.SqlQuery := 'select * from China'; //選擇Access資料庫中的China表
param.DataSource := 'MapChina'; //ODBC 數據源名
param.ConnectString := 'ODBC;'; //或是user = ... Pwd = ... , 定義ODBC連接
Datafields.Add('GEONAME','GEONAME', miAggregationAuto,miTypeString); //添加數據域GEONAME
Datafields.Add('POPU','POPU', miAggregationAuto,miTypeNumeric); //添加數據域POPU
//將Access數據捆綁到Mapinfo China表
ds := Map.Datasets.Add(miDataSetODBC, param, unassigned, unassigned, unassigned, 'CHINA', Datafields, unassigned);
ds.Themes.Add(miThemeRanged, 'POPU', 'MyTheme'); //添加一個范圍專題圖
end;
5. 建立客戶定製工具
你還可以定製自己的地圖操作工具,下面通過定製一個名為Info的信息按鈕工具簡述方法步驟:
(1)定義客戶工具常量
Const CUSTOM_INFO_TOOL = 1
(2)利用Map對象的CreateCustomTool方法定義客戶工具,方法為:
CreateCustomTool (ToolNumber, Type, Cursor, [ShiftCursor] , [CtrlCursor], [InfoTips])
其中ToolNumber為工具號,即上面定義的常量;Type為工具類型;Cursor為游標形狀,其他參數可選。
//定義Info工具為十字游標點觸發工具
Map.CreateCustomTool(CUSTOM_INFO_TOOL, miToolTypePoint, miCrossCursor, miArrowCursor, miArrowCursor, unassigned)
(3)在Map對象事件ToolUsed中編寫工具的Handler(操作內容)
procere TMain.MapToolUsed(Sender: TObject; ToolNum: Smallint; X1, Y1, X2, Y2, Distance: Double;
Shift, Ctrl: WordBool; var EnableDefault: WordBool);
begin
Case ToolNumber of
CUSTOM_INFO_TOOL : //信息工具Info
try
……
end;
(4)定義信息按鈕的Click事件
procere TMain.InfoClick(Sender: TObject);
begin
Map.CurrentTool:=CUSTOM_INFO_TOOL;
end
四、小結
基於MapBasic的開發簡單但受限制較多,比較適合Mapinfo功能擴展編程。而基於OLE自動化的開發比較繁瑣,因為需要來迴向後台的Mapinfo發送MapBasic字元串命令,所建立的應用程序運行速度也相對較慢,但這種開發方法能隨心所欲製作出美觀友好的界面,將地理操作與非地理操作溶為一體,並且能實現幾乎100%的Mapinfo功能,這是目前的MapX4.5也不能比擬的。與傳統GIS專業性開發環境相比,像MapX這類組件式GIS系統的出現可說是一種質的飛躍,它小巧靈活,開發簡捷,價格便宜,以後會越來越大眾化。 用MapX開發的GIS系統運行速度快,因為它不需要在Mapinfo軟體平台上運行。但從目前MapX4.5看,MapX並沒能實現所有的Mapinfo功能(據稱95%以上),使用過程中發現其生成或編輯地圖能力及地理分析能力不足,而且裡面Bug也不少,當然隨著今後新版的推出,MapX會越來越穩定、完美。