MapBasic - MapInfo Japan

MapBasic
11.0
ユーザーズ ガイド
このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、このマニュアルに記載されている事項
に関して一切の責任を負いかねますのでご了承ください。このマニュアルを Pitney Bowes Software Inc., One Global View, Troy, New York 12180-8399 の書
面による許諾なしに複製することは禁じられています。
© 2011 Pitney Bowes Software Inc. All rights reserved. MapInfo、Group 1 Software、および MapBasic は Pitney Bowes Software Inc. の登録商標です。その
他すべての商標および登録商標に関する権利はそれぞれの所有者に帰属します。
米国
電話 : 518.285.6000
FAX : 518.285.6070
販売 : 800.327.8627
政府販売 : 800.619.2333
テクニカル サポート : 518.285.7283
テクニカル サポート FAX : 518.285.6080
pbinsight.com
カナダ
電話 : 416.594.5200
FAX : 416.594.5201
販売 : 800.268 3282 8627
テクニカル サポート : 518 285 7283
テクニカル サポート FAX :
518.285.6080
pbinsight.ca
欧州/英国
電話 : 44.1753.848.200
FAX : 44.1753.621.140
テクニカル サポート: +44.1753.848.229
pbinsight.co.uk
アジア太平洋地域/オーストラリア
電話 : 61.2.9437.6255
FAX : 61.2.9439.1773
テクニカル サポート : 1.800 648.899 899
pbinsight.com.au
Pitney Bowes Software Inc. オフィスへのお問い合わせ先については、http://www.pbinsight.com/about/contact-us をご覧ください。
© 2011 Adobe Systems Incorporated. All rights reserved.Adobe、Adobe ロ ゴ、Acrobat、お よ び Adobe PDF ロ ゴ は、米 国 や そ の 他 の 国 に お け る Adobe
Systems Incorporated の登録商標または商標です。
© 2011 OpenStreetMap コントリビュータ、CC-BY-SA; 次のサイトを参照してください。OpenStreetMap http://www.openstreetmap.org および CC-BY-SA
http://creativecommons.org/licenses/by-sa/2.0
libtiff © 1988-1995 Sam Leffler, © 2011 Silicon Graphics International.All Rights Reserved.
libgeotiff © 2011 Niles D.Ritter.
Amigo, Portions © 1999 3D Graphics, Inc. All Rights Reserved.
Halo Image Library © 1993 Media Cybernetics Inc. All Rights Reserved
Portions thereof LEAD Technologies, Inc. © 1991-2011.All Rights Reserved.
Portions © 1993-2011 Ken Martin, Will Schroeder, Bill Lorensen.All Rights Reserved.
ECW by ERDAS © 1993-2011 ERDAS Inc. および同社の供給元。All rights reserved.
Portions © 2011 ERDAS Inc. All Rights Reserved.
MrSID、MrSID Decompressor、および MrSID ロゴは、LizardTech, A Celartem Company の商標で、 ライセンスを受けて使用しています。このコンピュー
タ プログラムの一部の著作権は、© 1995-1998 LizardTech, A Celartem Company およびカリフォルニア大学にあり、米国における特許番号 5,710,835 また
は 5,467,110 で保護されており、使用にはライセンス契約が必要です。All rights reserved.MrSID は、米国、国際特許・著作権条約、諸外国で特許申請中で
す。無許可での使用や複製を禁止します。
Contains FME® Objects © 2005-2011 Safe Software Inc., All Rights Reserved.
© 2011 SAP AG, All Rights Reserved. Crystal Reports® および Business Objects™ は、ドイツおよびその他の国における SAP AG の商標または登録商標です。
Amyuni PDF Converter © 2000-2011, AMYUNI Consultants – AMYUNI Technologies.All rights reserved.
Civic England - Public Sector Symbols Copyright © 2011 West London Alliance。同社の記号は無償で使用できます。この記号を他のアプリケーションで使用
するために入手する方法など、詳細については、West London Alliance Web サイト http://www.westlondonalliance.org/ を参照してください。
© 2006-2011 Tele Atlas.All Rights Reserved.同社のサイトの内容は、Tele Atlas が独占するものであり、Tele Atlas が所有またはライセンス契約する著作権保
護権およびその他の知的所有権の対象となります。この内容の使用は、使用許諾契約の条項の対象となります。この内容を無断でコピーまたは開示するこ
とを禁じます。
Microsoft Bing: Bing サービスのすべてのコンテンツの著作権は、© 2011Microsoft Corporation (One Microsoft Way, Redmond, WA 98052, USA) および同社
の供給元にあります。All rights reserved. Microsoft または同社の供給元は、Bing サービスとそのコンテンツに関してタイトル、著作権、およびその他の知
的所有権を保有しています。Microsoft、Windows、Windows Live、Windows ロゴ、MSN、MSN ロゴ (チョウ)、Bing、およびその他の Microsoft 製品およ
びサービスの中には、米国およびその他の国における Microsoft の商標または登録商標になっているものがあります。
この製品に付属している 7-Zip は GNU Lesser General Public License Version 3 (2007 年 6 月 29 日) および unRAR Restriction に基づきライセンスされてい
ます。ライセンスは http://www.7-zip.org/license.txt からダウンロードできます。ソース コードは http://www.7-zip.org から入手可能です。
ここに記載されている製品は、それぞれその製造元の登録商標です。登録商標名は編集の目的でのみ使用されるもので、この使用によって所有者の法律上
の権利を侵害するものではありません。
2011 年 6 月 27 日
目次
第 1 章: はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
ハードウェアとソフトウェアの要件. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14
旧バージョンとの互換性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14
MapBasic 開発環境のインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14
インストールする前に . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14
インストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15
MapBasic の起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15
MapBasic のファイル名およびファイル形式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15
MapBasic マニュアル セット. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16
このマニュアルで使用する表記上の規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16
用語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17
表記規則. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17
テクニカル サポートの利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17
テクニカル サポートへの連絡 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18
ソフトウェアの不具合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19
その他のリソース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19
第 2 章: MapBasic の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
MapBasic アプリケーションの作成と実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21
MapBasic の主要な特徴 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .22
MapInfo Professional のカスタマイズ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .22
MapInfo Professional の自動化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .22
パワフルなデータベースアクセス ツールとしての MapBasic . . . . . . . . . . . . . . . . . . .23
MapBasic による MapInfo Professional と他のアプリケーションの接続 . . . . . . . . . . .23
MapBasic の習得 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23
MapInfo Professional 上の MapBasic ウィンドウ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25
トレーニングおよびオンサイト コンサルティング . . . . . . . . . . . . . . . . . . . . . . . . . . . .25
第 3 章: 開発環境の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
プログラムの編集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27
キーボードのショートカット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .28
MapBasic テキスト エディタの制限事項. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30
MapBasic 11.0
3
ユーザーズ ガイド
プログラムのコンパイル. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30
コンパイル エラーの注意事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31
コンパイル済みアプリケーションの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31
別のエディタを使用した MapBasic プログラムの作成 . . . . . . . . . . . . . . . . . . . . . . . . .32
複数のモジュールを 1 つのプロジェクトにリンク. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33
MapBasicプロジェクトファイルとは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33
プロジェクト ファイルの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .35
プロジェクトのコンパイルとリンク . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .35
他のモジュールからの関数またはプロシージャの呼び出し . . . . . . . . . . . . . . . . . . . . .37
MapBasic 開発環境のメニューの概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .38
[編集] メニュー. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39
[検索] メニュー. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39
[プロジェクト] メニュー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40
[ウィンドウ] メニュー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41
[ヘルプ] メニュー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .42
第 4 章: MapBasic の基本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
コメント. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44
大文字/小文字の区別 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44
複数行にまたがる文. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44
mapbasic.def でのコード定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44
MapBasic ウィンドウへの文の入力. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45
変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45
固定長および可変長文字列変数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47
配列変数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47
カスタム データ タイプ (データ定義) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .48
グローバル変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49
変数の範囲 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50
式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50
定数とは. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50
演算子とは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51
関数呼び出しとは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51
定数の詳しい説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .52
変数タイプの変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .55
演算子の詳しい説明. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .55
MapBasic 演算子の優先順位 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .59
ループ、分岐、フロー制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .60
If...Then 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .60
Do Case 文. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .61
GoTo 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .62
For...Next 文. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .62
Do...Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63
MapBasic 11.0
4
ユーザーズ ガイド
While...Wend ループ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63
プログラムの終了 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64
プログラムと MapInfo Professional の終了 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64
プロシージャ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64
Main プロシージャ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64
プロシージャの呼び出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .65
パラメータを持つプロシージャの呼び出し. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .65
参照によるパラメータの受け渡し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .66
値によるパラメータの受け渡し. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .66
プロシージャの再帰呼び出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .67
システム イベント ハンドラの役割を果たすプロシージャ . . . . . . . . . . . . . . . . . . . . . . . .67
システム イベントとは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .68
イベント ハンドラとは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .68
システム イベント ハンドラが呼び出されるタイミング. . . . . . . . . . . . . . . . . . . . . . . .70
ハンドラ プロシージャに関するヒント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .71
ハンドラ プロシージャの簡略化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .71
SelChangedHandler の呼び出しの停止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .71
無限ループの回避 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .71
カスタム関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .72
関数の範囲 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .72
コンパイラ命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .73
Define 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .73
Include 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .73
プログラム編成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .74
第 5 章: 実行時エラーのデバッグおよびトラップ . . . . . . . . . . . . . . . . . . . . . . . . . . 76
MapBasic プログラムのデバッグ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .77
デバッグ プロセスの要点. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .77
Stop 文に関する制限事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .78
その他のデバッギング ツール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79
エラー トラップ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79
エラー トラップの例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .80
第 6 章: ユーザ インターフェイスの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
イベントドリブン プログラミング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .82
イベントについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .82
ユーザによるメニュー イベントの生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .82
プログラムによるボタンパッド イベントの処理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .83
プログラムによるダイアログ ボックス イベントの処理. . . . . . . . . . . . . . . . . . . . . . . .84
メニュー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84
メニューの基本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84
メニューへの新規項目の追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .85
MapBasic 11.0
5
ユーザーズ ガイド
メニューからの項目の削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .86
新規メニューの作成. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .86
メニュー項目の変更. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .87
メニュー バーの再定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .89
言語独立メニュー参照の指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .89
MapInfo Professional のショートカット メニューのカスタマイズ . . . . . . . . . . . . . . . .90
複数メニュー項目への同一ハンドラ プロシージャの割り当て . . . . . . . . . . . . . . . . . . .90
メニュー選択のシミュレーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91
ショートカット キーとホット キーの定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91
MapInfo Professional メニュー ファイルを介したメニュー操作. . . . . . . . . . . . . . . . . .92
標準ダイアログ ボックス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .94
メッセージの表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .94
はい/いいえの質問 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95
ファイルの選択 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95
処理状況の表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .96
テーブルの行の表示. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .96
カスタム ダイアログ ボックス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .96
コントロールのサイズおよび位置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .97
コントロール タイプ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .98
コントロールの初期値の指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .101
コントロールの最終値の読み取り . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .101
ハンドラ プロシージャ呼び出しによるユーザ操作への応答. . . . . . . . . . . . . . . . . . . .102
選択可能/不可能コントロール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .103
ユーザのリスト選択を可能にする . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .103
MultiListBox コントロールの管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .103
コントロール用ショートカット キーの指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .104
ダイアログ ボックスの終了 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .105
ウィンドウ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .105
ウィンドウのサイズおよび位置の指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .106
マップ ウィンドウ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .107
アニメーション レイヤを使用したマップ再描画の迅速化 . . . . . . . . . . . . . . . . . . . . .108
ブラウザ ウィンドウ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .109
グラフ ウィンドウ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .110
レイアウト ウィンドウ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .110
領域編成ウィンドウ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .111
メッセージ ウィンドウ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .111
ボタンパッド (ツールバー) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .113
ユーザがボタンを選択したときの動作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .113
ボタンパッドに関連する MapBasic 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .114
カスタム プッシュボタンの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .115
メイン ボタンパッドへのボタンの追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .116
MapBasic 11.0
6
ユーザーズ ガイド
カスタム ツールボタンの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .116
カスタム ボタンのアイコンの選択 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .118
ツールボタンのクリックによるオブジェクトの選択 . . . . . . . . . . . . . . . . . . . . . . . . .119
カスタム ボタンパッドへの標準ボタンの追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .119
ボタンへのヘルプ メッセージの割り当て . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .120
画面上端へのボタンパッドのドッキング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .121
その他のボタンパッド機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .121
カーソル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .122
MapInfo Professional へのアプリケーションの統合 . . . . . . . . . . . . . . . . . . . . . . . . . . .122
Startup ワークスペースによるアプリケーションの読み込み . . . . . . . . . . . . . . . . . . .123
MapBasic によるワークスペースの操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .124
ユーザ インターフェイスを効果的に使用するためのヒント . . . . . . . . . . . . . . . . . . . . . .124
アニメーション レイヤ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .124
不必要なウィンドウ再描画の回避 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .125
メッセージ ウィンドウの破棄 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .125
進捗バー ダイアログ ボックスの表示抑制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .125
第 7 章: テーブル操作. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
実行時のテーブル名の特定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .127
同名の 2 つのテーブルを開く . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .127
MapInfo 以外のファイルをテーブルとして開く . . . . . . . . . . . . . . . . . . . . . . . . . . . . .128
テーブルの行およびフィールド値の読み取り . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .129
別名データ型によるフィールド参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .130
適用範囲. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .131
"RowID" フィールド名を使用した行番号 (レコード番号) の参照 . . . . . . . . . . . . . . . .132
"Obj" フィールド名を使用した図形オブジェクトの参照. . . . . . . . . . . . . . . . . . . . . . .132
テーブルのマップ アドレス検索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .133
ジオコード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .133
SQL 検索の実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .134
テーブルおよびフィールド参照のエラー チェック . . . . . . . . . . . . . . . . . . . . . . . . . . .134
テーブルへの行 (レコード) およびフィールド値の書き込み . . . . . . . . . . . . . . . . . . . . . .134
テーブルの新規作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .134
テーブルの定義の変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .135
インデックスの作成およびテーブルをマップ作成可能にする操作. . . . . . . . . . . . . . .136
テーブルの定義情報の読み取り. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .136
Selection テーブルを使った作業 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .137
Selection の変更. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .138
現在の選択行の更新. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .138
Selection を使用したユーザ入力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .139
システム レイヤへのアクセス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .139
レイアウト ウィンドウへのアクセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .140
マルチユーザ編集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .140
MapBasic 11.0
7
ユーザーズ ガイド
マルチユーザ編集に関する規則. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .141
共有データへの書き込み時の衝突の回避 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .142
書き込み可能テーブルを開く . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .144
テーブルを構成するファイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .144
ラスタ イメージ テーブル. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .145
メタデータの操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .146
メタデータとは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .146
メタデータ キーの形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .147
メタデータに関する作業の例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .148
シームレス テーブルの操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .149
シームレス テーブルとは. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .149
シームレス テーブルの仕組み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .150
MapBasic のシームレス テーブル構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .151
シームレス テーブルに関する制限事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .151
DBMS データへのアクセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .151
リモート データ コマンドとデータベースの通信の仕組み . . . . . . . . . . . . . . . . . . . . .151
接続および接続解除. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .152
PostGIS のジオメトリ変換の動作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .153
リンク テーブルを使用したリモート データベースへのアクセスと、その更新 . . . . . . .154
リモート データベースへのライブ アクセス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .155
テーブル操作をより効果的に行うためのヒント. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .155
リモート テーブルのデフォルト ビューの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .155
トランザクション ファイルを最小化する処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .156
インデックスの適切な使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .156
サブ選択の利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .156
Select 文の最適化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .157
Update 文の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .157
第 8 章: ファイル入出力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
シーケンシャル ファイル入出力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .160
ランダム ファイル入出力. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .162
バイナリ ファイル入出力. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .162
プラットフォーム指定/国際文字セット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .163
ファイル情報関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .163
第 9 章: 図形オブジェクト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
"Obj" フィールドの利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .165
Object フィールドの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .166
Object フィールドに関する制限事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .166
オブジェクト属性の検索. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .167
オブジェクトのスタイル (ペン、ブラシ、シンボル、フォント). . . . . . . . . . . . . . . . .168
フォント スタイルについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .169
MapBasic 11.0
8
ユーザーズ ガイド
積み上げスタイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .170
スタイル変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .172
特定のスタイルを持つオブジェクトの選択. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .173
オブジェクトの新規作成. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .175
オブジェクト作成文. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .175
オブジェクト作成関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .176
可変数ノードを持つオブジェクトの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .176
オブジェクトのテーブルへの格納 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .177
既存オブジェクトに基づくオブジェクトの作成. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .178
バッファの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .178
統合、交差、併合の利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .178
Isogram の作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .179
オフセット コピーの作成. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .179
オブジェクトの変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .180
オブジェクト変更の一般手順 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .180
オブジェクトの位置の変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .180
オブジェクトとオブジェクト ノードの移動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .180
オブジェクトのペン、ブラシ、フォント、またはシンボル スタイルの変更 . . . . . . .181
リージョンまたは折れ線オブジェクトへの変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .181
オブジェクトの一部の消去 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .181
交差点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .182
マップ ラベルを使った作業 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .182
ラベルの表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .182
ラベルの消去 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .182
個々のラベルの編集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .183
ラベルの検索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .183
その他の Set Map 文の例. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .183
ラベルとテキスト オブジェクトの違い . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .184
座標および測定単位 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .186
測定単位. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .188
高度な地理検索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .188
地理比較演算子の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .189
テーブル中のオブジェクトの検索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .190
サブ選択を使用した地理 SQL 検索の利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .191
地理結合の利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .192
比率データ併合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .193
第 10 章: Microsoft Windows の高度な機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
ライブラリの指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .195
パラメータの受け渡し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .196
標準ライブラリの呼び出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .196
別名による DLL ルーチンの呼び出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .196
MapBasic 11.0
9
ユーザーズ ガイド
配列引数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .197
ユーザ定義タイプ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .197
論理引数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .197
ハンドル. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .198
例 : KERNEL でのルーチンの呼び出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .198
DLL のトラブルシューティングのヒント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .199
カスタム ボタン アイコンおよび描画カーソルの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . .200
標準アイコンの再利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .200
カスタム アイコン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .201
Windows のカスタム描画カーソル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .202
DDE を利用したプロセス間の情報交換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .202
DDE 会話の概要. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .203
MapBasic の DDE クライアントとしての機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .203
MapInfo Professional の DDE サーバとしての機能. . . . . . . . . . . . . . . . . . . . . . . . . . .204
MapInfo Professional による DDE 実行メッセージの処理 . . . . . . . . . . . . . . . . . . . . .207
DDE を使用した Visual Basic との通信. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .207
DDE 会話の例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .207
DDE アドバイス リンク. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .208
アプリケーションへの Windows ヘルプの統合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .208
第 11 章: 統合マッピング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
統合マッピングの概念の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .211
統合マッピングの技術概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .212
システム要件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .212
その他の技術的注意点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .213
短いサンプル プログラム: "Hello, (Map of) World" . . . . . . . . . . . . . . . . . . . . . . . . . . . .213
統合マッピングの詳しい説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .214
MapInfo Professional へのコマンドの送信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .215
MapInfo Professional からのデータの照会 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .215
MapInfo Professional のショートカット メニューのカスタマイズ . . . . . . . . . . . . . . .220
Visual Basic プログラムの終了 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .222
MapBasic コマンド文字列についての注意 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .222
ダイアログ ボックスについての注意事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .222
アクセラレータ キーについての注意事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .223
コールバックを使用した MapInfo Professional からの情報の取り出し . . . . . . . . . . . .223
コールバックの技術要件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .223
OLE コールバックの一般的な使用手順 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .224
コールバックへの送信データの処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .225
標準通知コールバックの C/C++ 構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .227
OLE を使用しないコールバック. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .227
DDE コールバック . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .228
MBX コールバック. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .228
MapBasic 11.0
10
ユーザーズ ガイド
標準 MapInfo Professional ヘルプの表示. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .228
オンライン ヘルプの無効化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .229
カスタム ヘルプ ファイルの表示. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .229
関連 MapBasic 文および関数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .230
OLE オートメーション オブジェクト モデル. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .232
MapInfo Professional プロセス内から OLE オブジェクト モデルを使用 . . . . . . . . . .234
Application オブジェクトのプロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .234
DockWindow オブジェクトのプロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .237
MBApplications コレクションのプロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .240
MBApplications オブジェクトのプロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .241
MBGlobalsコレクションのプロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .242
MBGlobals オブジェクトのプロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .242
MIMapGen オブジェクトのプロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .243
MIMapGen オブジェクトのメソッド. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .244
MISearchInfo オブジェクトのプロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .246
MIRow オブジェクトのメソッド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .246
MIField オブジェクトのプロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .246
MISelection オブジェクトのプロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .247
MapInfo Professional コマンドライン引数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .248
統合マッピングおよび MFC を使用した Visual C++ の基本操作 . . . . . . . . . . . . . . . .249
ツールバー ボタンおよびハンドラの追加. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .253
MapInfo Professional エラー トラップのための例外処理 . . . . . . . . . . . . . . . . . . . . . .255
OLEオートメーションサーバーサポートの追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .255
WindowContentsChanged コールバックの追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .256
その他 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .257
第 12 章: .Net の操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
用語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .259
はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .259
.Net でのクラスの作成. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .260
アセンブリ ファイルの構築とコピー. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .261
MapBasic からのメソッドの宣言と呼び出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .261
Alias でメソッドを呼び出す . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .263
.Net に引数を渡す . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .263
パフォーマンスについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .264
.Net での構造の操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .264
カスタム変数タイプ (構造) を .Net に渡す . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .264
構造を渡す場合の制限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .268
例外処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .268
GAC ウィンドウの操作. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .269
Global Assembly Cache (GAC) からアセンブリとして読み込む . . . . . . . . . . . . . . . .269
.Net メソッド内からの MapInfo Professional の制御. . . . . . . . . . . . . . . . . . . . . . . . . . .270
MapBasic 11.0
11
ユーザーズ ガイド
.Net での統合マッピング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .272
COM 経由での MapInfo Professional へのアクセス . . . . . . . . . . . . . . . . . . . . . . . . . .272
コールバック メソッド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .273
スレッド セーフティ問題. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .276
付録 A: サンプル プログラム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Samples\DLLEXAMP ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .279
Samples\DotNet ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .279
Samples\MapBasic ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .279
Samples\MFC ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .286
Samples\PwrBldr ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .286
Samples\VB4 ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .286
Samples\VB6 ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .286
付録 B: 演算子の要約 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
比較演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .288
論理演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .289
地理演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .289
優先順位. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .290
タイプの自動変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .291
付録 C: サポートされている ODBC テーブルのタイプ . . . . . . . . . . . . . . . . . . . . . 292
付録 D: リモートテーブルをマップ作成可能にする . . . . . . . . . . . . . . . . . . . . . . . 293
付録 E: MapInfo_MapCatalog の手動での作成. . . . . . . . . . . . . . . . . . . . . . . . . . . 295
手動でリモート テーブルをマップ作成可能にする . . . . . . . . . . . . . . . . . . . . . . . . . . .297
付録 F: データの設定と管理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
アプリケーションのアップグレードに関する用語集 . . . . . . . . . . . . . . . . . . . . . . . . .302
アプリケーション データ ファイルとディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . .304
デフォルトの環境設定パス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .306
レジストリの変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .307
インストーラの必要条件とグループの方針 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .307
MapBasic v.6.5 および 6.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .307
MapBasic v.7.0 以降 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .308
付録 G: MapBasic 用語集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
索引 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
MapBasic 11.0
12
ユーザーズ ガイド
はじめに
MapBasic® は、MapInfo Professional のカスタマイズと自動化を可能にするパ
ワフルでしかも使いやすいプログラミング言語です。
この章では、MapBasic ソフトウェアをインストールするうえで把握しておく
べき点を説明します。MapBasic の目的と機能の詳細については、MapBasic
の概要を参照してください。
このセクションの構成
Š
Š
Š
Š
Š
Š
新機能. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14
ハードウェアとソフトウェアの要件 . . . . . . . . . . . . . . . . . . . . . . . . .14
MapBasic 開発環境のインストール . . . . . . . . . . . . . . . . . . . . . . . . .14
MapBasic のファイル名およびファイル形式 . . . . . . . . . . . . . . . . . .15
MapBasic マニュアル セット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16
このマニュアルで使用する表記上の規則. . . . . . . . . . . . . . . . . . . . . .16
1
第 1 章: はじめに
新機能
新機能
今回のリリースで追加された要素
•
カーソル スタイルのサポートが追加されました。カーソル (122 ページ)を参照してください。
ハードウェアとソフトウェアの要件
MapBasic for Windows をインストールする前に、コンピュータが以下の最小要件を満たしている
ことを確認してください。
要件
システム ソフトウェア
対象
•
Windows XP Professional 32 ビット Service Pack 3 (SP3)
•
Windows 7 Ultimate 32 ビット SP1
•
Windows 7 Ultimate 64 ビット SP1 (32 ビット互換モード)
•
Windows 2008 Server 32 ビットSP2
•
Windows 2008 Server 32 ビット SP2 および XenServer
•
Windows 2008 Server R2 64 ビット SP1
ディスプレイ
Windows でサポートされているディスプレイ アダプタ
マウス
Windows でサポートされるマウスまたはポインタ デバイス
ハードディスクの空き容量
10 MB
旧バージョンとの互換性
MapInfo Professional では、現バージョンまたは旧バージョンの MapBasic で作成されたアプリ
ケーションを実行することができます。
MapBasic 開発環境のインストール
インストールする前に
MapBasic のインストール手順を以下に示します。まず、次の操作を行ってください。
•
MapBasic をインストールする前に、まず MapInfo Professional をインストールしてください。
MapInfo Professional のインストール手順については、『MapInfo Professional ユーザーズ ガイ
ド』を参照してください。
MapBasic 11.0
14
ユーザーズ ガイド
第 1 章: はじめに
MapBasic のファイル名およびファイル形式
インストール
MapBasic 開発環境は無料です。MapBasic をお手元にダウンロードするには、
http://www.pbinsight.com の Pitney Bowes Software Inc. ホームページから [Support] > [Product
Downloads] を選択し、[MapBasic] リンクをクリックしてください。ここでは、カスタム アプリ
ケーションの作成やアプリケーションへの MapInfo Professional の統合を MapBasic 開発環境を使用し
て行う際の情報も提供されています。http://go.pbinsight.com/mapbasicdocs を参照してください。
MapBasic の起動
MapBasic 開発環境を起動するには
•
デスクトップ上の [MapBasic] アイコンをダブルクリックします。
•
[スタート] メニューの [すべてのプログラム] をポイントし、[MapBasic 10.0] を選択します。
L
現在のバージョンに対するアップデート情報は、[ヘルプ] > [製品アップデート情報] を選択す
ると、いつでもチェックできます。
MapBasic のファイル名およびファイル形式
MapBasic をインストールすると、次のファイルがコンピュータに読み込まれます。
ファイル名
説明
errors.doc
MapBasic のエラー コードをリストしたテキスト ファイル。
icons.def
ボタンパッドおよびカーソルに関する定義コードを含む Include ファイル。
mapbasic.bas
Visual Basic プログラマ用のヘッダ ファイル。内容は mapbasic.def と似て
いますが、Visual Basic の構文を使用したものです。
mapbasic.chm
MapBasic オンライン ヘルプ ファイル。
mapbasic.def
標準定義コードを含む Include ファイル。
mapbasic.exe
MapBasic 開発環境を実行する実行可能ファイル。
mapbasic.h
C/C++ プログラマ用のヘッダ ファイル。内容は mapbasic.def と似ています
が、C/C++ の構文を使用したものです。
mblib.dll
ソフトウェアの一部。共有ライブラリが含まれています。
mbres.dll
ソフトウェアの一部。文字列やダイアログ ボックスなどのリソースが含ま
れています。
menu.def
メニューに関する定義コードを含む Include ファイル。
MapBasic 11.0
15
ユーザーズ ガイド
第 1 章: はじめに
MapBasic マニュアル セット
ファイル名
説明
misecutil.dll
ソフトウェアの一部。共有実行可能ファイルが含まれています。
papersize.def
MapBasic アプリケーション開発者用の Include ファイル。プリンタ制御
MapBasic 文で使用する定義が含まれています。
Samples ディレク サンプル プログラムが含まれています。
トリ
usrinfmb.log
インストール処理のログが書き込まれます。
MapBasic 開発環境下では、以下の拡張子を伴うファイルが作成されます。
ファイル名
説明
filename.mb
プログラム ファイル (ソース コード)
filename.mbx
コンパイル済み (実行可能) ファイル
filename.mbp
プロジェクト ファイル (プロジェクトに含まれるすべてのモジュールをリスト)
filename.mbo
オブジェクト ファイル (プロジェクト内のモジュールをコンパイルした後に
作成されるファイル)
filename.err
コンパイル エラーを含むプログラムをコンパイルすると発生するエラーの
リスト
MapBasic マニュアル セット
MapBasic のマニュアル セットには、『MapBasic ユーザーズ ガイド』の他に、『MapBasic リファ
レンス』およびオンライン ヘルプが含まれています。『MapBasic リファレンス』は、MapBasic の
すべてのコマンドを記載したリファレンス ガイドです。ヘルプ システムには、『MapBasic リファ
レンス』のすべての情報の他に、ダイアログとメニューに関する解説が含まれています。
『MapBasic ユーザーズ ガイド』および『MapBasic リファレンス』には、次のようにしてアクセ
スします。
•
http://go.pbinsight.com/mapbasicdocs からオンラインで参照します。
•
ローカル コンピュータで参照します。これらのマニュアルは MapInfo Professional と一緒にイン
ストールされ、MapInfo\Professional\Documentation フォルダでアクセスできます (このフォ
ルダにある MapBasicUserGuide.pdf および MapBasicReference.pdf が目的のファイルです)。
このマニュアルで使用する表記上の規則
このマニュアルで使用する用語と表記について説明します。
MapBasic 11.0
16
ユーザーズ ガイド
第 1 章: はじめに
テクニカル サポートの利用
用語
このマニュアルでは、アプリケーション開発者は二人称で、またアプリケーションの使用者は "
ユーザ" と表現されます。次に例を示します。
("皆さん" は) MapBasic の Note 文を使用すると、"ユーザ" にメッセージを伝えることができます。
"プログラム" および "アプリケーション" という用語は、以下のように使用されます。
•
"プログラム" は、プログラマである皆さんが入力するテキスト ファイルです。通常、MapBasic
プログラム ファイルの拡張子は、.MB です。
•
"アプリケーション" ファイルは、MapInfo で実行可能なバイナリ ファイルです。ユーザがアプリ
ケーションを実行するときには、アプリケーション ファイルが必ず必要となります。MapBasic
では、皆さんがプログラムをコンパイルすると、アプリケーション ファイルが作成されます。
MapBasic のアプリケーション ファイルの拡張子は、通常 .MBX (MapBasic eXecutable) です。
•
"コマンド "は、メニューから選択する項目を指します。たとえば、ファイルを開くには、[ ファ
イル] メニューから [開く] コマンドを選択します。
•
"文" は、皆さんが MapBasic プログラムから発行できる命令を指します。たとえば、MapBasic
プログラムから Select 文を発行すると、テーブルの行を 1 つ以上選択することができます。
表記規則
MapBasic プログラムのサンプル文は、次のように Courier (クーリエ) フォントで表記されます。
Note "hello, world!"
次のように頭文字が大文字の表記は、MapBasic のキーワードを意味します。
Stop 文は、デバッグの目的で使用されます。
このマニュアルのサンプルでは、MapBasic 言語の各キーワードの頭文字は大文字で表記されます。
しかし、皆さんがプログラムを入力する際は、キーワードの頭文字を大文字にする必要はありませ
ん。プログラムは、大文字、小文字、または両者を組み合わせて入力することができます。
MapBasic 開発環境のメニュー コマンドは、">" (大なり記号) を用いて次のように表記されます。
•
[ファイル] > [新規] コマンドを選択して、新規編集ウィンドウを開きます。
"[ファイル] > [新規]" は、[ファイル] メニュー上の [新規] コマンドを指します。
テクニカル サポートの利用
Pitney Bowes Software Inc. では、新たにソフトウェアを購入された場合およびアップグレードさ
れた場合のすべてに対して無料のサポート期間を設けているため、使用開始時から生産性を上げ
ることができます。Pitney Bowes Software Inc. では、無料サポート期間の終了後も、個人ユー
ザ、ビジネス ユーザ、および企業ユーザ向けに、各種拡張サポート サービスを提供しています。
技術サポートでは、お客様からのお問い合わせにお答えいたします。ここでは、最寄のサポート
センターにお問い合わせいただくときに必要な情報のリストを示します。また、実際に発生した
問題がどのように処理、解決されるかをある程度予想できるように、技術サポートの手順につい
ても簡単に説明します。
MapBasic 11.0
17
ユーザーズ ガイド
第 1 章: はじめに
テクニカル サポートの利用
テクニカル サポートにお問い合わせの際は、シリアル番号、パートナー番号、契約番号を必ずご
用意ください。
テクニカル サポートへの連絡
MapBasic のテクニカル サポートは、現在リリースされているバージョンおよびそれ以前の 2 バー
ジョンにのみ対応しています。
テクニカル サポートの連絡先
延長サポートのお申し込みも、米国、ヨーロッパ/中東/アフリカ、アジア太平洋の各地域のテクニ
カル サポートで承っております。最寄のオフィスへのお問い合わせ方法については、当社の Web
サイトの [Support] > [Contact Support] セクションを参照してください。
http://www.pbinsight.com/support/contact-support/
テクニカル サポート オンライン案件管理システム
テクニカル サポート オンライン案件管理システムは、テクニカル サポート センターの案件を記
録し、管理するもう 1 つの方法です。まだユーザ ID をお持ちでない場合は、最初にこのサイトに
アクセスしたときにユーザ登録する必要があります。
http://go.pbinsight.com/online-case-management
お問い合わせ前に
サポートに連絡をする際には、次の情報をご用意ください。
1. シリアル番号。技術サポートを受けるには、登録済みのシリアル番号が必要です。
2. お名前と組織名。お問い合わせをいただく方のお名前は、サポート契約に記載されているお客
様側連絡先に一致している必要があります。
3. サポートが必要な製品のバージョン。
4. オペレーティング システム名とバージョン。
5. 問題の簡潔な説明。このとき以下のような情報があると、処理を円滑に進めることができます。
•
エラー メッセージ
•
•
問題が発生したコンテキスト
問題が再発しているか、不規則に発生しているか
予想される応答時間
ほとんどの問題はお客様の最初のお問い合わせで解決できます。その場で解決できない場合は、
テクニカル サポートは営業日が終了するまでに対応を行います。その後、問題が解決されるま
で、担当者が毎日進捗状況を報告いたします。
電子メールまたはオンライン追跡システムでお寄せいただいたサポート要請は、電話サポートの
場合と同様のガイドラインで処理しますが、メッセージの転送と検知に数時間以内の遅れが生じ
る可能性があることをご了承ください。
MapBasic 11.0
18
ユーザーズ ガイド
第 1 章: はじめに
テクニカル サポートの利用
ソフトウェアの不具合
問題の原因がソフトウェアのバグにあると考えられる場合は、担当者が問題を Pitney Bowes
Software Inc. のバグ データベースに記録し、バグの追跡に使用できるインシデント番号をお客様
にお知らせします。現在のバージョンに対して確認されたバグの多くは、今後のアップグレード
およびパッチで修正されます。
その他のリソース
MapInfo-L アーカイブ データベース
MapInfo-L (MapInfo List) は独立したディスカッション グループです。Pitney Bowes Software Inc.
は、このサイトに投稿された質問に応答するためにこれをモニタしています。このディスカッ
ション グループに参加するには、次の URL にアクセスしてください。
http://groups.google.com/group/mapinfo-l?hl=en
次に、[このグループに参加する] をクリックします。
L
メーリング リストに送信したメッセージは、参加しているすべての人が読むことができます。
MapInfo ユーザの役に立つその他のサイト
MapInfo Tools は、ソフトウェア ツールのリポジトリおよびファイルを自由に交換する場として
Barbara Carroll が組織している Web サイトです。
http://mapinfotools.com
GISnet は、MapInfo 社のパートナーである Bill Thoen が管理している Web サイトです。一般的な
GIS に関する情報や MapInfo に関する資料へのリンクが多数掲載されています。
http://www.gisnet.com/catalog/software/tools/index.php
MapBasic 11.0
19
ユーザーズ ガイド
MapBasic の概要
MapBasic は、MapInfo Professional マッピング ソフトウェアのカスタマイズ
と自動化を可能にするソフトウェア パッケージです。
このセクションの構成
Š
Š
Š
Š
はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21
MapBasic の主要な特徴 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .22
MapBasic の習得. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23
MapInfo Professional 上の MapBasic ウィンドウ . . . . . . . . . . . . .25
2
第 2 章: MapBasic の概要
はじめに
はじめに
MapBasic ソフトウェアは開発環境を提供します。この開発環境では、MapBasic プログラミング
言語でプログラムを作成することができます。
MapBasic 開発環境には、次のモジュールが含まれます。
•
プログラムの入力に使用できるテキスト エディタ。MapBasic テキスト エディタの代わりに、
現在お使いの別のテキスト エディタを使用することもできます。詳細については、「開発環境
の使用 (26 ページ)」を参照してください。
•
MapBasic コンパイラ。書き終えたプログラムをコンパイルし、"実行可能" アプリケーション
(MapInfo Professional 上で実行できるアプリケーションなど) を作成します。
•
MapBasic リンカー。大規模で複雑なアプリケーションを作成する際には、プログラムをいくつ
かの個別モジュールに分割し、後でこれらのモジュールを 1 つのアプリケーションに "リンク"
することができます。
MapBasic 言語の個々の文および関数について説明する MapBasic オンライン ヘルプ。
•
•
MapBasic プログラミング言語は、その名前から従来の BASIC 言語の名残りを感じさせます。
実際には、MapBasic プログラムは従来の BASIC プログラムとは大きく異なっています。ただ
し、MapBasic 言語と近年開発されたより新しいバージョンの BASIC 言語 (Microsoft Visual
Basic 言語など) との間には類似点があります。
従来の BASIC コード サンプル
20
30
40
50
60
80
MapBasic コード サンプル
Call Check_Status(quit_time)
Do While Not quit_time
For x = 1 To 10
Call Process_batch(x)
Next
Loop
GOSUB 3000
IF DONE = 1 THEN GOTO 90
FOR X = 1 TO 10
GOSUB 4000
NEXT X
GOTO 30
各 MapBasic プログラムは、MapInfo Professional と共に機能します。MapBasic 開発環境を使用
してプログラムを作成し、コンパイルした後は、MapInfo Professional を稼働してプログラムを実
行します。したがって、MapBasic プログラムはスタンドアロン型プログラムではありません。
MapBasic プ ロ グ ラ ム は、MapInfo Professional が稼働しているときに限り実行できます。
MapBasic プログラムは、MapInfo Professional 上で実行するプログラムと言うこともできます。
ただし、MapBasic は単なるマクロ言語ではありません。MapBasic は、300 以上の文と関数を備
えた完全なプログラミング言語です。さらに、MapBasic プログラムは MapInfo Professional 上で
実行されるため、MapInfo Professional が持つ地理データ管理機能のすべてを利用することができ
ます。
MapBasic アプリケーションの作成と実行
MapBasic アプリケーションの作成手順の詳細については、「開発環境の使用」を参照してくだ
さい。
手始めに何か試してみたいという方は、以下の手順に従って最初のプログラムを作成してみてく
ださい。
MapBasic 11.0
21
ユーザーズ ガイド
第 2 章: MapBasic の概要
MapBasic の主要な特徴
1. MapBasic 開発環境を起動します。
2. [ファイル] > [新規] を選択して編集ウィンドウを開きます。
3. 編集ウィンドウに MapBasic プログラムを入力します。適当なプログラムが思い浮かばない場合
は、次の 1 行から成る MapBasic プログラムを入力してみてください。
Note "Welcome to MapBasic!"
4. [ファイル] > [保存] を選択し、プログラムをファイルに保存します。このとき、welcome.mb な
どのファイル名を入力してください。
L
編集ウィンドウは閉じないでください。
5. [プロジェクト] > [現在のファイルのコンパイル] を選択します。プログラム (welcome.mb) がコ
ンパイルされ、それに対応する実行可能アプリケーション ファイル (welcome.mbx) が作成さ
れます。
6. MapInfo Pfofessional を実行します。
7. [ツール] > [MapBasic プログラムの実行] を選択します。実行するプログラムを選択するよう求
められます。
8. welcome.mbx を選択してプログラムを実行すると、"Welcome to MapBasic!" というメッセージ
がダイアログ ボックスの中に表示されます。
これが、MapBasic アプリケーションの作成、コンパイル、実行に関する主な手順です。もちろ
ん、実際のプロセスはこれよりも複雑です。たとえば、上記の手順では、コンパイル エラーが発
生した場合に生じる事態については説明されていません。MapBasic プログラムの作成およびコン
パイルの詳細については、「開発環境の使用」を参照してください。
MapBasic の主要な特徴
MapInfo Professional のカスタマイズ
MapBasic を使用すれば、MapInfo Professional のユーザ インターフェイスのカスタマイズが行え
ます。MapBasic アプリケーションでは、MapInfo Professional の標準メニューの変更または置き
換え、MapInfo メニュー バーへのまったく新しいメニューの追加、作業内容に合わせてカスタマ
イズしたダイアログ ボックスの表示を行うことができます。
このように MapBasic を使用すれば、ユーザが最小限のトレーニングを受けるだけで迅速かつ簡単
に操作できるような、カスタマイズされた総合システムを開発することができます。
MapInfo Professional の自動化
MapBasic アプリケーションは、エンドユーザの煩雑で時間のかかる手作業を軽減する目的で大い
に活用できます。たとえば、MapInfo Professional のユーザは、マップを作成するにあたって経緯
線網 (経線と緯線を示す縦横の格子) を引かなければなりません。経緯線網の縦横の線はそれぞれ
MapBasic 11.0
22
ユーザーズ ガイド
第 2 章: MapBasic の概要
MapBasic の習得
正確な経緯度を表していなければならないため、経緯線網を手で描くのは大変な作業です。
MapBasic アプリケーションを使用すれば、わずかな手作業で簡単に経緯線網を作成することがで
きます。手作業が完全に必要なくなる場合もあります。
パワフルなデータベースアクセス ツールとしての MapBasic
MapBasic を使用すれば、複雑かつ高度なデータベース検索を 1 つの文で行うことができます。た
とえば、MapBasic の Select 文 (SQL 照会言語の Select 文をモデルにしたもの) を発行することに
より、データベースの検索、フィルタの適用による不要なレコードの排除、検索結果の並べ替え
および小合計の計算などが可能になります。これらすべてが、たった 1 つの MapBasic 文で実行で
きるのです。
Select や Update などのパワフルな MapBasic 文を利用すれば、他のプログラミング言語では何十
または何百というコード行を必要とするような作業も、わずか数行のコードで実現できます。
MapBasic による MapInfo Professional と他のアプリケーションの接続
MapBasic プログラミング言語に組み込まれていない文や関数も使用することができます。
MapBasic のオープン アーキテクチャを利用すれば、プログラムから外部ライブラリのルーチンの
呼び出しも可能です。MapBasic の標準コマンド セットにない機能を必要とする作業も、MapBasic
のオープン アーキテクチャを使用すれば簡単に実行できます。
MapBasic プログラムでは、ダイナミック データ交換 (Dynamic Data Exchange、DDE) を使用し
て、Visual Basic アプリケーションを含む他のソフトウェア パッケージと通信することができま
す。また MapBasic プログラムでは、Windows のダイナミック リンク ライブラリ (DLL) ファイル
からのルーチン呼び出しも行えます。市販の DLL ファイルを購入することもできますし、C など
のプログラミング言語を使用して独自の DLL ファイルを作成することもできます。MapBasic は、
「統合マッピング」を提供します。「統合マッピング」を使えば、Visual Basic などの別の開発環
境下で書かれたアプリケーションに MapInfo Professional の機能を統合することができます。詳細
については、「統合マッピング」を参照してください。
MapBasic の習得
MapBasic を使用した作業を始める前に、まず MapInfo Professional の使用方法を学ぶ必要があり
ます。このマニュアルは、既に皆さんがテーブル、マップ ウィンドウ、ワークスペースといった
MapInfo Professional の概念や用語に精通していることを前提としています。
MapInfo Professional が問題なく扱えるようになったら、以下のマニュアルまたはオンライン操作
ガイドを使用して MapBasic について学んでください。
MapBasic ユーザーズ ガイド
ユーザーズ ガイドには、MapBasic を使用したプログラミングの概念が説明されています。MapBasic
を使用したプログラムの作成方法を学ぶ場合にお読みください。各章で、プログラミングの異なる部
分について説明しています。たとえば、MapBasic プログラマの方は必ず「MapBasic の基本」をお
読みください。「 ユーザ インターフェイスの作成」ではカスタム メニューとダイアログ ボックス
の作成方法について、「ファイル入出力」ではファイルの入出力方法について説明します。
MapBasic 11.0
23
ユーザーズ ガイド
第 2 章: MapBasic の概要
MapBasic の習得
MapBasic リファレンス
アルファベット順のリファレンス ガイドでは、MapBasic 言語の個々の文および関数が詳しく説明
されています。特定の文や関数の詳細については、『MapBasic リファレンス ガイド』を参照して
ください。
サンプル プログラム
プログラマの多くは、あるプログラミング言語を学ぶための最も有効な手段は、そのサンプル プ
ログラムを学ぶことであると考えています。そのため、MapBasic にもさまざまなサンプル プログ
ラムが付属しています。MapBasic に用意されているサンプル プログラムについては、MapBasic
CD 上またはダウンロード先の Samples ディレクトリを参照してください。
L
『MapBasic ユーザーズ ガイド』には、TextBox サンプル プログラム (textbox.mb) を使用
した例が頻繁に出てきます。MapBasic について学ぶ前に、このプログラムに慣れておくこ
とをお勧めします。
MapInfo ワークスペース ファイル
MapInfo Professional では、セッション情報 (開いたテーブルおよびウィンドウのリストなど) を
ワークスペース ファイルに保存できます。テキスト エディタを使用してワークスペース ファイル
を確認すると、そこに MapBasic の文が含まれていることがわかります。ワークスペース ファイ
ルから MapBasic 文をコピーし、作業中のプログラムに貼り付けることもできます。ある意味で
は、MapInfo のワークスペースは、いずれも MapBasic のサンプル プログラムであると言えます。
たとえば、細かいページ レイアウトの作成機能を持つ MapBasic プログラムを作成するとしま
す。その場合、MapInfo Professional を使用したインタラクティブ操作によりページ レイアウトを
作成し、そのレイアウトを MapInfo のワークスペース ファイルに保存します。すると、そのワー
クスペース ファイルにはページ レイアウトに関する一連の MapBasic 文が含まれることになりま
す。そのレイアウトに関連する文をワークスペース ファイルからコピーし、作業中の MapBasic
プログラムに貼り付けることができるようになります。
オンライン ヘルプ
MapBasic 開発環境には、広範囲にわたるオンライン ヘルプが用意されています。オンライン ヘ
ルプのほとんどは、MapBasic 言語の個々の文や関数について説明する参照情報です。また、ヘル
プ ファイルには、MapBasic 開発環境の操作方法も説明されています。
L
プログラムの入力時に文や関数の名前を選択して F1 キーを押すと、その文または関数を説
明したヘルプ ウィンドウが表示されます。
ヘルプ システムには、簡潔なサンプル プログラムが数多く含まれています。これらのプログラム
は、ヘルプ ウィンドウからコピーして作業中のプログラムに貼り付けることができます。ヘルプ
ウィンドウのテキストをクリックおよびドラッグしてコピーできます。
ヘルプ画面の表示中に MapBasic のメニューまたは編集ウィンドウをクリックすると、ヘルプ
ウィンドウが消えます。これは Windows ヘルプの標準動作です。ヘルプ ウィンドウは閉じたわけ
ではなく、単にバックグラウンドに移動しただけです。ヘルプ ウィンドウに戻るには、Alt キーを
押しながら Tab キーを押してください。また、ヘルプ ウィンドウの [ヘルプ] > [常に手前に表示]
メニューをチェックしておけば、ヘルプ ウィンドウが消えるのを防ぐことができます。
MapBasic 11.0
24
ユーザーズ ガイド
第 2 章: MapBasic の概要
MapInfo Professional 上の MapBasic ウィンドウ
MapInfo Professional 上の MapBasic ウィンドウ
MapInfo Professional ソフトウェアには、MapBasic 言語の文の構文を学ぶことができる MapBasic
ウィンドウが用意されています。
MapBasic ウィンドウを開くには
1. MapInfo Pfofessional を実行します。
2. [オプション] > [MapBasic ウィンドウを表示] を選択します。
画面に MapBasic ウィンドウが表示されます。この後は、MapInfo Professional のメニューやダイア
ログ ボックスの操作に伴って、対応する MapBasic 文が MapBasic ウィンドウに表示されます。
たとえば、MapInfo Professional の [条件検索] ダイアログ ボックスを使用した検索を行うと、同じ
操作を MapBasic 言語を使用して行う方法が、自動的に MapBasic ウィンドウに表示されます。
また、文を MapBasic ウィンドウに直接入力することもできます。ただし、ウィンドウに直接入力
できない MapBasic 文もあります。特定の文を MapBasic ウィンドウから発行できるかどうかを確
認するには、『MapBasic リファレンス ガイド』およびオンライン ヘルプ システムを参照してく
ださい。MapBasic ウィンドウでサポートされていない文に対しては、「制限事項」の見出しの下
に注記が示されています。一般に、フロー制御文 (For...Next ループなど) は、MapBasic ウィンド
ウに入力することはできません。
また、MapBasic ウィンドウはデバッグ ツールとしても利用できます。詳細については、「実行時
エラーのデバッグ およびトラップ」を参照してください。
トレーニングおよびオンサイト コンサルティング
Pitney Bowes Software Inc. 社では、MapBasic のトレーニング講座を実施しています。MapBasic
をできるだけ短期間で習得したい場合は、MapBasic トレーニングの受講をお勧めします。理想的
なトレーニング環境となるように、トレーニングは 1 クラス 10 名までに制限されています。予定
されているトレーニング講座については、Pitney Bowes Software Inc. トレーニング部門にお問い
合わせください。
MapBasic アプリケーションの開発に関して強力な支援が必要な場合は、Pitney Bowes Software
Inc. コンサルティング サービスの利用をご検討ください。MapBasic システム エンジニアのオン
サイト派遣をご依頼いただけます。詳細については、Pitney Bowes MapInfo Japan までお問い合
わせください。
MapBasic 11.0
25
ユーザーズ ガイド
開発環境の使用
MapBasic ソフトウェアには、プログラムの入力に使用できるテキスト エディ
タが含まれています。[元に戻す]、[コピー]、[貼り付け] などの従来のメニュー
項目を使用することで、プログラムの編集を容易に行えます。その他のメ
ニュー項目では、プログラムをコンパイル (オプションでリンク) して実行可
能な形式に変換できます。MapBasic 言語に関するオンライン ヘルプも利用で
きます。
MapBasic テキスト エディタ、MapBasic コンパイラ、および MapBasic オン
ライン ヘルプを一括して、開発環境と呼びます。
このセクションの構成
Š
Š
Š
Š
Š
MapBasic 開発環境の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27
プログラムの編集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27
プログラムのコンパイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30
複数のモジュールを 1 つのプロジェクトにリンク . . . . . . . . . . . . . .33
MapBasic 開発環境のメニューの概要 . . . . . . . . . . . . . . . . . . . . . . .38
3
第 3 章: 開発環境の使用
MapBasic 開発環境の概要
MapBasic 開発環境の概要
MapBasic 開発環境には、MapBasic プログラムの作成および編集に使用できるテキスト エディタ
が用意されています。プルダウン メニュー ([ファイル]、[編集]、[検索]、[プロジェクト]、[ウィン
ド ウ]、[ヘ ル プ]) を 使 用 す る こ と で、プログラムの作成と編集、プログラムのコンパイル、
MapBasic コンパイラで検出された構文エラーの処理に必要なすべてのコマンドを実行できます。
他のテキスト エディタの使用経験があれば、MapBasic のテキスト エディタも簡単に使いこなせ
るでしょう。MapBasic メニューのほとんどは一般的なアプリケーションと同じで、[ファイル] メ
ニューには [開く]、[閉じる]、[印刷]、[保存] の各コマンドが、[編集] メニューには [元に戻す]、[切
り取り]、[コピー]、[貼り付け] の各コマンドが含まれています。その一方で、MapBasic は従来の
テキスト エディタにはない機能 (コンパイラおよびリンカー) も備えています。
プログラムの編集
まず最初に、MapBasic を実行してください。次に、[ファイル] メニューから [開く] (既存プログラ
ムを表示)、または [新規] (空の編集ウィンドウを開く) を選択します。
編集ウィンドウにプログラムを入力します。入力できるプログラムがない場合は、次の 1 行のサ
ンプル MapBasic プログラムを実行してもかまいません。
Note "Welcome to MapBasic!"
プログラムを入力したら、[ファイル] メニューから [保存] を選択し、プログラムをディスクに保存
して下さい。プログラムには、welcome.mb などの名前を付けてください。
プログラム ファイルには自動的にファイル拡張子 .mb が付けられます。つまり、プログラムに
welcome という名前を付けると、実際のファイル名は welcome.mb となります。
プログラムは通常のテキスト ファイルで保存されるため、必要であれば、他のテキスト編集ソフ
トウェアを使用してプログラムを編集することも可能です。
MapBasic 11.0
27
ユーザーズ ガイド
第 3 章: 開発環境の使用
プログラムの編集
キーボードのショートカット
次の表は、MapBasic の編集ウィンドウで利用できるキーボードのショートカットを示したものです。
キーボード操作
操作の効果
Home/End
挿入ポイントが行頭/行末へ移動します。
Ctrl-Home/ Ctrl-End
挿入ポイントがドキュメントの冒頭/末尾へ移動します。
Ctrl-Tab/
Ctrl-Shift-Tab
挿入ポイントが 1 つ後/前の単語へ移動します。
Ctrl-T
[行指定] ダイアログ ボックスが表示されます。
Ctrl-O
[開く] ダイアログ ボックスが表示されます。
Ctrl-N
新しい空の編集ウィンドウが開きます。
Ctrl-S
アクティブな編集ウィンドウが保存されます。
Ctrl-P
アクティブな編集ウィンドウが印刷されます。
Ctrl-A
編集ウィンドウ内の全テキストが選択されます。
Ctrl-C
選択テキストがクリップボードにコピーされます。
Ctrl-X
選択テキストが切り取られてクリップボードにコピーされます。
Ctrl-V
クリップボードから編集ウィンドウにテキストを貼り付けます。
Ctrl-Del
挿入ポイント以降の単語が削除されます。
Del
選択テキストが削除されます。クリップボードにコピーされません。
Ctrl-F
[検索/置換] ダイアログ ボックスが表示されます。
Ctrl-G
直前の [検索] コマンドが繰り返されます。
Ctrl-R
選択テキストが置換され ([検索/置換] ダイアログ ボックスの置換テキ
ストを使用)、さらに検索が実行されます。
Ctrl-J
[プロジェクト ファイルの選択] ダイアログ ボックスが表示されます。
Ctrl-K
アクティブ ウィンドウ内のプログラムがコンパイルされます。
Ctrl-E
[次のエラー] コマンドです。編集ウィンドウがスクロールし、コンパ
イル エラーの発生行が表示されます。
Ctrl-L
アクティブ プロジェクトがリンクされます。
Ctrl-U
アクティブ プログラムを実行するよう求めるメッセージが MapInfo
Professional に送られます。
F1
ヘルプが表示されます。
MapBasic 11.0
28
ユーザーズ ガイド
第 3 章: 開発環境の使用
プログラムの編集
キーボード操作
操作の効果
F8
[テキスト スタイル] ダイアログ ボックスが表示され、フォントを変
更できます。
Ctrl-F4
アクティブな編集ウィンドウが閉じます。
Alt-F4
MapBasic 開発環境が終了します。
Shift-F4
ウィンドウが並べて表示されます。
Shift-F5
ウィンドウが重ねて表示されます。
L
関数名を選択してから F1 キーを押すと、ヘルプにはその関数に関するトピックが表示され
ます。
マウスのショートカット
マウス操作
ダブルクリック
操作の効果
プログラム中のテキストをダブルクリックすると、単語を選択できます。エ
ラー メッセージのリストをダブルクリックすると、ウィンドウがスクロー
ルしてプログラム内のエラーの発生行が表示されます。
トリプルクリック テキスト行の全体がハイライトされます (32 ビット バージョンのみ)。
ドラッグ & ド
ロップ
L
テキストを別のウィンドウの中にドラッグすると、そのテキストがコピーさ
れます。テキストを同じウィンドウ内でドラッグすると、そのテキストの位
置が移動します(ただし、Ctrl キーを押しながらドラッグした場合は、テキ
ストがコピーされます)。
MapBasic オンライン ヘルプには、コード サンプルが含まれています。ドラッグ & ドロッ
プすることで、ヘルプ ウィンドウのコード サンプルを編集ウィンドウにコピーすることが
できます。
ヘルプ ウィンドウのコード サンプルをドラッグ & ドロップし、編集ウィンドウにコピーするには
1. ヘルプを表示します。
2. コピーするテキストをヘルプ ウィンドウ内でクリックしてドラッグし、ハイライトさせます。
3. ハイライトしたテキストをクリックします。マウス ボタンを押したままテキストをヘルプ ウィ
ンドウの外にドラッグします。
4. マウス ポインタを編集ウィンドウ上に移動してマウス ボタンを離します。テキストがプログラ
ム内にドロップされます。
MapBasic 11.0
29
ユーザーズ ガイド
第 3 章: 開発環境の使用
プログラムのコンパイル
MapBasic テキスト エディタの制限事項
MapBasic の各編集ウィンドウが収容できるテキストの量には限りがあります。テキスト挿入時に
MapBasic のテキスト エディタにビープ音が発生した場合は、既に編集ウィンドウが一杯であるこ
とを示します。
この容量の制限を回避するには、次の 3 つの方法があります。
•
他のテキスト エディタが使用できる場合は、そのエディタを使用してプログラムを編集する。
プログラムをコンパイルするには、MapBasic に切り替えて、[ファイルからコンパイル] メ
ニュー コマンドを選択します。
•
プログラム ファイル (.mb ファイル) を 2 つ以上の小さいファイルに分割し、MapBasic の Include
文を使用してさまざまなファイルを 1 つのアプリケーションに統合する。Include 文の詳細につ
いては、『MapBasic リファレンス ガイド』を参照してください。
•
プログラム ファイル (.mb ファイル) を 2 つ以上の小さいファイルに分割し、MapBasic プロ
ジェクト ファイルを作成してさまざまなプログラム ファイルを 1 つのアプリケーションにリ
ンクする。ある意味では、この操作は Include 文を利用したプログラム モジュールの結合に似
ていますが、 プロジェクト ファイルを使用する方がより効率的です。プロジェクトに含まれ
る各ファイルは別々にコンパイルできます。このため、複数モジュールの中の 1 つを編集する
場合、そのモジュールだけを再コンパイルすれば済みます。
プログラムのコンパイル
まだ MapBasic 編集ウィンドウにプログラムが表示されていなければ、表示します。次に、プログ
ラムをコンパイルするには、[プロジェクト] メニューから [現在のファイルのコンパイル] を選択し
ます。
L
複数の編集ウィンドウを同時に開くことができます。[現在のファイルのコンパイル] を選
択すると、一番手前のウィンドウの中にあるプログラムがコンパイルされます。したがっ
て、複数の編集ウィンドウが開いている場合は、コンパイル操作の前に適切なウィンドウ
をアクティブにする必要があります。
MapBasic コンパイラによって、プログラムの構文がチェックされます。プログラムに構文エラー
があった場合、エラーが見つかったことを示すダイアログ ボックスが表示され、編集ウィンドウ
の下にエラーの説明が表示されます。
各エラー メッセージは、そのエラーがプログラムのどの行に発生したかを示す行番号から始まり
ます。プログラムを正常にコンパイルするためには、まずプログラムのエラーを修正する必要が
あります。
MapBasic 11.0
30
ユーザーズ ガイド
第 3 章: 開発環境の使用
プログラムのコンパイル
図 : First.mb
編集ウィンドウの下に表示されるエラー メッセージをダブルクリックすると、ウィンドウがスク
ロールして、そのエラーが発生したプログラムの行が表示されます。
プログラムのエラーを修正した後で、もう一度 [現在のファイルのコンパイル] を選択して再コン
パイルを試みます。プログラムが正常にコンパイルされると、コンパイルが完了したことを示す
ダイアログ ボックスが表示されます。
コンパイルが完了すると、.mbx (MapBasic eXecutable) ファイルが作成されます。この .mbx ファ
イルは、完成したアプリケーションを実行するために必ず必要です。したがって、ユーザに完成し
た MapBasic アプリケーションを提供する場合に、ソース コード全体を渡さないときは、ユーザに
.mb ファイルではなく .mbx ファイルを提供します。
コンパイル エラーの注意事項
スペルミスに関するエラーの中には、MapBasic コンパイラで検出できないものがあります。たと
えば、2 行目にタイプミス (STATES を TATES と誤入力) があっても、次のプログラムはコンパイ
ルされてしまいます。
Open Table "states"
Map From tates
MapBasicコンパイラは、2 行目のスペルミスを検出できません。これはコンパイラの欠陥ではな
く、変数やテーブルの参照の一部は実行時まで (ユーザがプログラムを実行する瞬間まで) 評価さ
れないためです。ユーザが上記のプログラムを実行すると、MapInfo Professional は Map From
tates 文を実行しようとします。そのとき、"tates" というテーブルが実際に存在しなければ、エ
ラー メッセージ ("テーブル tates は開かれていません" など) が表示されます。
コンパイル済みアプリケーションの実行
コンパイル済みアプリケーションを実行するには、MapInfo Professional の [ファイル] メニューか
ら [MapBasic プログラムを実行] を選択します。MapInfo Professional の [MapBasicプログラムの
実行] ダイアログ ボックスで、実行する MapBasic アプリケーション ファイル (.mbx ファイル) を
選択するように求められます。
MapBasic 11.0
31
ユーザーズ ガイド
第 3 章: 開発環境の使用
プログラムのコンパイル
MapBasic 開発環境では、プログラムを実行するショートカットも提供されています。プログラムを
コンパイルした後で、MapBasic の [プロジェクト] メニューの [実行] を選択します (または Ctrl キー
を押しながら U キーを押します)。MapBasic は、MapInfo Professional に対して、アプリケーション
を実行するように求めるメッセージを送信します。
L
MapInfo Professional を事前に起動しておく必要があります。
別のエディタを使用した MapBasic プログラムの作成
既にお気に入りのテキスト エディタがある場合は、そのエディタを使用して MapBasic プログラ
ムを編集することもできます。その場合も、MapBasic プログラムを標準のテキスト ファイルで保
存してください。
また、ワード プロセッサ ソフトウェアを使用してプログラムを編集することも可能です。ただ
し、ワード プロセッサでプログラムを編集した場合は、作業内容をテキスト ファイル形式で保存
するために特別な手順を踏まなければならない場合もあります。文書をテキスト形式で保存する
際には、[保存] ではなく [名前を付けて保存] がよく使われます。文書をテキスト形式で保存する手
順については、使用するワード プロセッサ ソフトウェアのドキュメントを参照してください。
別のエディタで作成されたプログラムのコンパイル
これまで、MapBasic の [現在のファイルのコンパイル] メニュー項目を使用してアクティブな編集
ウィンドウの画面上にあるプログラムをコンパイルする方法について説明してきました。MapBasic
では別の方法でプログラムをコンパイルすることもできます。それは、MapBasic の [ファイル] メ
ニューの [ファイルからコンパイル] コマンドを利用する方法です。
MapBasic以外のテキストエディタを使ってプログラムを編集する場合は、[ファイルからコンパイ
ル] コマンドを使ってプログラムをコンパイルする方が便利です。[ファイルからコンパイル] は、
MapBasic 編集ウィンドウにプログラムを表示することなくプログラムをコンパイルします。
[ファイルからコンパイル] を選ぶと、コンパイルするファイルを選択するよう求められます。選択
したファイルにコンパイル エラーが含まれる場合、.err 拡張子の付いたテキスト ファイルにエラー
メッセージが書き込まれます。たとえば、プログラム dispatch.mb をコンパイルするために [ファイ
ルからコンパイル] を選択した場合には、テキスト ファイル dispatch.err にエラー メッセージが書
き込まれます。エラー ファイルの内容を表示するには、[ファイル] > [開く] を選択します。
コマンド ラインからのプログラムのコンパイルおよびリンク
MapBasic 以外のテキスト エディタを使用してプログラムを編集する場合、アプリケーションのコ
ンパイルやリンクを行うたびに MapBasic に切り替えなければなりません。ただし、このコンパイ
ルおよびリンク操作を自動的に行う方法があります。テキスト エディタをコマンド文字列が発行
できるように構成すると、現在のエディタを使用してプログラムをコンパイルすることが可能に
なります。
MapBasic 開発環境を開始するには、次のコマンドを実行します。
mapbasic
MapBasic 11.0
32
ユーザーズ ガイド
第 3 章: 開発環境の使用
複数のモジュールを 1 つのプロジェクトにリンク
コマンド ラインでパラメータ -D の後に 1 つ以上のプログラム名を指定すると、そのプログラム
フ ァ イ ル が 自 動 的 に コ ン パ イ ル さ れます。たとえば、次のコマンド ラインを実行すると、
MapBasic が起動して、2 つのプログラム ファイル (main と sub1) がコンパイルされます。
mapbasic -D main.mb sub1.mb
コマンド ラインでパラメータ -L の後に 1 つ以上のプロジェクト ファイル名を指定すると、その
プロジェクトがリンクされます。(リンクとプロジェクト ファイルの詳細については、「プロジェ
クトのコンパイルとリンク (35 ページ)」を参照してください。) たとえば、次のコマンド ライン
を実行すると、TextBox アプリケーションがリンクされます。
mapbasic -L tbproj.mbp
コマンド ラインでは、次のように -D と -L の両方のパラメータを使用することもできます。
mapbasic -D textbox.mb -L tbproj.mbp
-D または -L のどちらかのパラメータを含むコマンド ラインを使用して MapBasic を起動する
と、該当ファイルがコンパイルまたはリンクされた後で MapBasic が自動的に終了します。
スプラッシュ画面を表示せずに MapBasic を起動するには、-Nosplash パラメータを使用します。
mapbasic -Nosplash
複数のモジュールを 1 つのプロジェクトにリンク
MapBasicプロジェクトファイルとは
プロジェクト ファイルとは、個別プログラム ファイルを 1 つのアプリケーションにリンクするた
めに MapBasic によって使用されるテキスト ファイルです。規模が大きく、複雑なアプリケー
ションを開発している場合、プログラムには最終的に何千ものコード行が含まれることになりま
す。プログラム全体を 1 つのプログラム ファイルに入力することもできますが、 ほとんどのプロ
グラマは大きなプログラム ファイルの維持を避けます。プログラム ファイルが 1000 行を越える
と、プログラム内で特定の部分を探すことが難しくなります。そこで、多くのプログラマは、大
きなアプリケーションを 2 つ以上の小さなファイルに分割します。一般に、大きなプログラムを
より小さく管理しやすいいくつかのファイルに分割する操作は、モジュラー プログラミングと呼
ばれています。
プログラムを 2 つ以上のモジュールに分割する場合は、プロジェクト ファイルを作成する必要が
あります。プロジェクト ファイルは、個々のモジュールを組み合わせて 1 つの実行可能アプリ
ケーションに統合する方法を、MapBasic リンカーに指示します。
プロジェクト ファイルは、MapBasic プログラミングのオプション部分です。プロジェクト ファ
イルをまったく使わずに、アプリケーションを作成、コンパイル、実行することも可能です。し
かし、大規模な MapBasic アプリケーションを開発する場合は、MapBasic のプロジェクト ファイ
ル機能を利用する価値があります。
MapBasic 11.0
33
ユーザーズ ガイド
第 3 章: 開発環境の使用
複数のモジュールを 1 つのプロジェクトにリンク
プロジェクトファイルを使うことの利点
•
•
•
プロジェクトファイルは、皆さんのプログラミングのモジュラー化を可能にします。プロジェ
クト ファイルを設定した後は、プログラムをいくつもの小さなファイルに分割することができ
ます。一般に、長期的に見るとモジュラー プログラムの方が管理が容易です。また、モジュ
ラー プログラムを利用することで、プログラムが大きくなりすぎて MapBasic 編集ウィンドウ
に入りきらなくなるという事態も避けられます。
プロジェクト ファイルを使用すれば、複数のプログラマが 1 つのプロジェクトに同時に取り組
むことができます。プロジェクト ファイルを設定した後で、各プログラマはそれぞれ個別のモ
ジュールで作業し、最後にプロジェクト ファイルを使用してモジュールを統合 (厳密に言えば
"リンク") します。
プロジェクトファイルを使うことで、アプリケーションの再コンパイルに要する時間を短縮で
きます。複数モジュール プロジェクトの 1 つのモジュールを変更する場合は、そのモジュール
だけを再コンパイルしてプロジェクトを再度リンクさせればよいのです。これは、すべての
ソースコードを再コンパイルする場合 (プロジェクト ファイルを使用しない場合はこうする必
要があります) に比べ、はるかに時間を短縮できます。
プロジェクト ファイルの例
TextBox アプリケーションには、次のようなプロジェクト ファイル (tbproj.mbp) が使用されてい
ます。
[Link]
Application=textbox.mbx
Module=textbox.mbo
Module=auto_lib.mbo
Module = auto_lib.mbo 同様に、ScaleBarアプリケーションは、次のようなプロジェクトファイル
(sbproj.mbp) を使っています。
[Link]
Application=scalebar.mbx
Module=scalebar.mbo
Module=auto_lib.mbo
どちらの例でも、プロジェクトファイルの最終行は、プロジェクトの中に auto_lib モジュールを
構築するよう MapBasic に指示しています。auto_lib モジュールは、MapBasic ソフトウェアに含
まれるサンプル プログラムの 1 つです。
MapBasic プログラムに auto_lib モジュールが含まれていれば、そのプログラムの [情報] ダイアロ
グ ボックスに特殊な [自動読み込み...] ボタンを表示できます。[自動読み込み] ボタンを選択する
と、ユーザが MapInfo Professional を実行するたびにアプリケーションが自動的に読み込まれるよ
う設定できます。自動読み込み機能をオフにすると、MapBasic アプリケーションは、ユーザが
MapInfo Professional を終了した時点で停止します。
MapBasic プログラムに自動読み込み機能を組み込むには、auto_lib.mb ファイルに示される手順を
参照してください。
MapBasic 11.0
34
ユーザーズ ガイド
第 3 章: 開発環境の使用
複数のモジュールを 1 つのプロジェクトにリンク
プロジェクト ファイルの作成
プログラム ファイルが作成済みで、そのプログラム用のプロジェクト ファイルを作成する場合は、
次の手順に従ってください。
1. [ファイル] > [新規] を選択して、新規編集ウィンドウを開きます。
2. 編集ウィンドウに次の行を入力します。
[Link]
3. テキスト Application= appfilename (appfilename には、作成する実行可能ファイルのファ
イル名を指定します) を含む行を入力します。次に例を示します。
Application=C:\MB\CODE\CUSTOM.MBX
Application=Local:MapBasic:custom.mbx
Application=/MapBasic/mb_code/custom.mbx
4. テキスト Module=modulename (modulename は、MapBasic オブジェクト ファイル名です) を
含む行を入力します。次に例を示します。
Module=C:\MB\CODE\CUSTOM.MBO
Module=Local:MapBasic:custom.mbo
Module=/MapBasic/mb_code/custom.mbo
ファイル名の拡張子に注意して下さい。 MapBasic のオブジェクト ファイルには、拡張子
.mbo が付きます。複数モジュール プロジェクトの一部である 1 つのモジュールをコンパイル
すると、オブジェクト ファイルが作成されます。
[プロジェクト] > [現在のファイルのコンパイル] を選択すると、MapBasic は常に現在のファイ
ルをコンパイルして実行可能なアプリケーション ファイル (拡張子は .mbx) にしようとしま
す。ただし、プログラム ファイル内にない関数またはプロシージャがファイル内で呼び出され
ている場合、MapBasic は .mbx ファイルを作成できません。このような場合、MapBasic はそ
のプログラムがより大きなプロジェクトの一部であると仮定し、 実行可能ファイル (.mbx) の
代わりにオブジェクト ファイル (.mbo) を作成します。また、コンパイルするモジュールにメ
イン プロシージャがない場合にも、オブジェクト ファイルが作成されます。
5. アプリケーションに含めるすべてのファイルに対してステップ 2を実行します。
6. [ファイル] > [名前を付けて保存] を選択し、プロジェクト ファイルを保存します。
[名前を付けて保存] ダイアログ ボックスで、左下隅にあるファイルの種類のリストから "プロ
ジェクトファイル" を選択します。これにより、ファイルの拡張子は .mbp (MapBasic Project)
になります。
7. [ファイル] > [閉じる] を選択するか、ウィンドウのクローズ ボックスをクリックして、編集ウィ
ンドウを閉じます。
後でそのプロジェクトにモジュールを追加する場合は、プロジェクト ファイルに適切な Module=
行を追加することを忘れないでください。
プロジェクトのコンパイルとリンク
プロジェクト ファイルを作成した後は、以下の手順に従ってプロジェクトをコンパイルおよびリ
ンクすることができます。
MapBasic 11.0
35
ユーザーズ ガイド
第 3 章: 開発環境の使用
複数のモジュールを 1 つのプロジェクトにリンク
1. プロジェクトで使用される各モジュールをコンパイルします。
•
モジュールをコンパイルするには、まず [ファイル] > [開く] を選択し、次に [プロジェクト] >
[現在のファイルのコンパイル] を選択します。
•
モジュールを表示せずにコンパイルするには、[ファイル] > [ファイルからコンパイル] を選択
します。
2. MapBasic にリンクするプロジェクト ファイルを指定するには、[プロジェクト] > [プロジェク
ト ファイルの選択] を選択します。[プロジェクト ファイルの選択] ダイアログ ボックスが表示
されます。
3. 使用するプロジェクト ファイル (.mbp) を選択して、[OK] をクリックします。選択したプロジェ
クト ファイルが編集ウィンドウに表示されます。このファイルは、MapBasic を終了するか、
プロジェクト ファイルの編集ウィンドウを閉じるか、または [プロジェクト] > [プロジェクト
ファイルの選択] コマンドを再度選択するまで、選択された状態のままとなります。1 度に選択
できるプロジェクト ファイルは 1 つだけです。
L
編集ウィンドウを一番手前に表示しても、選択されているプロジェクト ファイルを変更
することはできません。[ファイル] > [開く] を選択しても、選択されているプロジェクト
ファイルを変更することはできせん。リンクするプロジェクト ファイルを選択するに
は、[プロジェクト] > [プロジェクト ファイルの選択] を選択します。
4. アプリケーションをリンクするには、[プロジェクト] > [現在のファイルのリンク] を選択します。
MapBasic によって、プロジェクト ファイルに記載されたオブジェクト (.mbo) ファイルが読み出
されます。リンク エラーがなければ、実行可能 (.mbx) ファイルが作成されます。リンク エラー
がある場合は、エラー メッセージが表示されます。
また、プロジェクト ファイルを編集ウィンドウに表示せずに 1 回の操作でプロジェクトをリンク
するには、[ファイル] > [ファイルからリンク] を選択します。
MapBasic コンパイラで作成されたオブジェクト ファイルは、C 言語リンカーなどの他のリンカー
を使用してリンクすることはできません。MapBasic オブジェクト モジュールをリンクできるの
は、MapBasic リンカーだけです。
複数のファイルを開く
プロジェクト ファイルを使用する場合、プロジェクトに含まれるすべてのプログラム ファイルを
開かなければならない場合もあります。この作業を簡略化するため、[開く] ダイアログ ボックス
で複数のファイルを同時に開くことができます。
複数ファイルを同時に開くには
1. [ファイル] メニューの [開く] を選択します。
2. [プログラムを開く] ダイアログ ボックスでファイル名をクリックします。
3. Shift キーまたは Ctrl キーを押したまま、別のファイル名をクリックする。
Shift キーを押し続けると、隣り合う複数のファイルを一度に選択することができます。
Ctrl キーを押し続けると、ファイルを 1 つずつ選択できます。
MapBasic 11.0
36
ユーザーズ ガイド
第 3 章: 開発環境の使用
複数のモジュールを 1 つのプロジェクトにリンク
他のモジュールからの関数またはプロシージャの呼び出し
複数モジュール プロジェクトの中に .MB ファイルが含まれている場合、そのファイルは他のモ
ジュール内にある関数およびサブ プロシージャを呼び出すことができます。たとえば、textbox.mb
は、auto_lib ライブラリ内にある HandleInstallation プロシージャを呼び出します。他のモジュール
内にある関数またはサブ プロシージャの呼び出しは、外部参照と呼ばれます。
MapBasic プログラムが外部プロシージャを呼び出す場合、そのプログラム ファイルでは Declare
Sub 文を使用する必要があります。同様に、プログラムが外部関数を呼び出す場合、そのプログラ
ム ファイルでは Declare Function 文を使用する必要があります。これらの Declare 文により、プロ
シージャまたは関数でどのようなパラメータを使用するかを MapBasic コンパイラに指定します。
サンプル プログラム textbox.mb には、Include "auto_lib.def" 文が含まれています。auto_lib.def
定義ファイルには、auto_lib モジュールに対応する Declare Sub 文および Declare Function 文が含ま
れています。textbox.mb に auto_lib.def 定義ファイルが含まれていない場合、HandleInstallation プロ
シージャへの呼び出しは構文エラー ("無効なサブ プロシージャ名") と見なされます。
他のモジュールとの変数の共有
あるプロジェクト内の複数のモジュールで使用できるグローバル変数を宣言するには
1. 定義ファイルに Global 文を挿入します (例 : "global.def.")。
2. Include 文を使用して、グローバル変数を使用する必要のある各モジュールに定義ファイルを組
み込みます。
たとえば、auto_lib.def 定義ファイルは、gsAppFilename および gsAppDescription という 2 つのグ
ローバル文字列変数を宣言します。auto_lib.mb プログラム ファイルおよび textbox.mb プログラ
ム ファイルは、どちらも次の文を発行します。
Include "auto_lib.def"
従って、これらの 2 つのモジュールは、同じグローバル変数を共有できることになります。
textbox.mb プログラムがグローバル変数に値を格納すると、auto_lib.mb ライブラリもその新しい値
を読み出すことができます。
また、グローバル変数は、実行中の他のアプリケーションとの情報の共有も可能にします。
他のモジュールと共有できない変数の宣言
プログラム ファイルには、関数またはサブ プロシージャ定義の外にある Dim 文を含めることがで
きます。このような Dim 文を、モジュールレベルの Dim 文と呼びます。モジュール レベルの
Dim 文によって変数が宣言される場合、そのモジュール (つまり、.mb ファイル) 内のすべての関
数およびプロシージャからこの変数を利用することができます。ただし、MapBasic ファイルから
は他のファイルのモジュールレベル Dim を参照することはできません。
あるファイル内の全プロシージャで共有できる変数を宣言する場合、既に他のモジュールで使用さ
れている変数名を誤って使用しないようにするために、モジュールレベルの Dim 文を利用します。
MapBasic 11.0
37
ユーザーズ ガイド
第 3 章: 開発環境の使用
MapBasic 開発環境のメニューの概要
MapBasic 開発環境のメニューの概要
[ファイル] メニュー
[ファイル] メニューには、MapBasic プログラムの作成、保存、終了、印刷、プログラムを開く/閉
じる操作を行うためのコマンドがあります。
•
[新規] を選択すると、プログラムを入力する新規編集ウィンドウが開きます。
•
[開く] 選択すると、編集ウィンドウ内に既存のファイルが表示されます。MapBasic プログラム
ファイル (例 : dispatch.mb)、エラー メッセージのリスト (dispatch.err)、または MapInfo
Professional ワークスペース ファイルを開くことができます。各ワークスペース ファイルは、
実際には単に MapBasic 文を寄せ集めたテキスト ファイルです。
[開く] ダイアログ ボックスでは、2 つ以上のファイルを同時に開くことができます。複数のファ
イルを選択するには、Shift キーまたは Ctrl キーを押しながらファイル名をクリックします。
L
テキスト ファイルの中には、大きすぎて MapBasic 編集ウィンドウの中に入りきらない
ものもあります。この制限を回避する方法については、「MapBasic テキスト エディタ
の制限事項 (30 ページ)」を参照してください。
•
[閉じる] を選択すると、アクティブな編集ウィンドウが閉じます。現在のウィンドウの内容を変
更した場合、ウィンドウを閉じる前に、変更内容を保存するかどうかを確認するメッセージが
表示されます。[閉じる] は、編集ウィンドウが 1 つ以上開いている時に使用できます。
•
[すべてを閉じる] を選択すると、開いている編集ウィンドウがすべて閉じます。[閉じる] コマン
ドと同様に、未保存の変更内容を保存するかどうかを確認するメッセージが表示されます。[す
べてを閉じる] は、編集ウィンドウが 1 つ以上開いている時に使用できます。
•
[保存] を選択すると、アクティブな編集ウィンドウの内容がディスクに保存されます。[保存] は、
編集ウィンドウの内容を変更したときに選択できます。
[名前を付けて保存] を選択すると、アクティブな編集ウィンドウの内容が新しいファイル名で保
存されます。[名前を付けて保存] は、編集ウィンドウが開いているときに選択できます。
•
•
[復帰] を選択すると、その編集ウィンドウを最後に保存した後のウィンドウの変更内容がすべて
削除されます。[復帰] は、編集ウィンドウの内容を変更したときに選択できます。
•
[ファイルからコンパイル] を選択すると、編集ウィンドウにファイルの内容が表示されることな
く、ディスク ファイルの内容から既存の .mb ファイルが直接コンパイルされます。(これは、ア
クティブな編集ウィンドウ上のプログラムをすべてコンパイルする [プロジェクト] メニューの
[現在のファイルのコンパイル] コマンドとは対照的です。) 別のテキスト エディタで作成された
プログラムをコンパイルするには、[ファイルからコンパイル] を使用します。
[ファイルからコンパイル] を使用したときにコンパイル エラーが発生した場合、ファイル名.err
という名前のテキスト ファイルにエラー メッセージが書き込まれます。エラー ファイルの内容
を表示するには、[ファイル] > [開く] を選択します。
•
[ファイルからリンク] を選択すると、編集ウィンドウにプロジェクトファイルの内容が表示され
ることなく、既存のプロジェクトが直接リンクされます。(これは、現在のプロジェクトをリン
クする [プロジェクト] メニューの [現在のファイルのリンク] とは対照的です。)
•
[ページの設定] を選択すると、印刷のサイズや方向などの印刷設定を行えます。
•
[印刷] を選択すると、アクティブな編集ウィンドウが印刷されます。
[印刷] は、編集ウィンドウが 1 つ以上開いているときに選択できます。
•
[終了] を選択すると、MapBasic 環境が終了します。未保存の変更がある場合、それを保存す
るかどうかを確認するメッセージが表示されます。
MapBasic 11.0
38
ユーザーズ ガイド
第 3 章: 開発環境の使用
MapBasic 開発環境のメニューの概要
[編集] メニュー
[編集] メニューには、MapBasic プログラムのドラフト作成および編集に利用できるコマンドが含
まれています。
•
[元に戻す] を選択すると、アクティブな編集ウィンドウ上で最後に行った変更内容がキャンセル
されます。[元に戻す] を選択すると、最後の変更が削除され、メニュー項目が [繰り返し] に変わ
ります。[繰り返し] を選択すると、削除した変更が再度適用されます。
[元に戻す] は、編集ウィンドウが1つ以上開いており、かつそのウィンドウの中のテキスト が
変更されている場合に使用できます。
•
•
•
[切り取り] を選択すると、選択 (ハイライト) されたテキストがクリップボードにコピーされ、
編集ウィンドウからそのテキストが削除されます。テキストはクリップボードに保存されるの
で、[貼り付け] コマンド (下記参照) を使って他の場所に挿入できます。[切り取り] は、アク
ティブな編集ウィンドウでテキストが選択されている場合に選択できます。
[コピー] を選択すると、選択したテキストがクリップボードにコピーされますが、そのテキスト
は削除されません。[コピー] は、アクティブな編集ウィンドウでテキストが選択されている場合
に選択できます。
[貼り付け] を選択すると、クリップボードの内容が、アクティブな編集ウィンドウの現在のカー
ソル位置にコピーされます。編集ウィンドウでテキストを選択して [貼り付け] を実行すると、
クリップボード上のテキストが、選択したテキストに置き換わります。
[貼り付け] は、クリップボード上にテキストがあり、編集ウィンドウが1つ以上開いている場
合に使用できます。
•
[クリア] を選択すると、選択したテキストがクリップボードにコピーされずに削除されます。[ク
リア] は、開かれた編集ウィンドウ上でテキストが選択されている場合に使用できます。
•
[すべてを選択] を選択すると、アクティブな編集ウィンドウのすべての内容が選択されます。[す
べてを選択] は、編集ウィンドウが1つ以上開いている場合に使用できます。
[検索] メニュー
[検索] メニューには、編集ウィンドウ上でのテキストの検索および置換を行うためのコマンドが用
意されています。これらのコマンドの中には、構文エラーを含む文を検索するプロセスを容易に
するものがあります。
•
[検索] を選択すると、アクティブな編集ウィンドウで特定の文字列が検索されます。[検索] は、
編集ウィンドウが 1 つ以上開いている場合に選択できます。ある文字列の次の出現を検索する
には、[検索] テキスト ボックスに検索文字列を入力します。大文字と小文字を区別するには、[
大文字と小文字を区別する] チェック ボックスをオンにします。
[検索] ボタンをクリックすると、現在の挿入ポイントから文末に向かって検索が実行されま
す。検索文字列を見つけると、その出現位置までウィンドウがスクロールされます。その文字
列が見つからない場合は、ビープ音が鳴ります。
•
[再度検索] を使用すると、前の [検索] ダイアログ ボックスで指定された文字列の次の出現箇所
が検索されます。
[再度検索] は、編集ウィンドウが 1 つ以上開いており、なおかつ [検索] 操作が一度実行されて
いる場合に使用できます。
•
[置換と再度検索] を選択すると、選択したテキストが [文字列の置換] ダイアログ ボックスで指定
したテキストに置き換えられた後、検索文字列の次の出現箇所を検索し、ハイライトします。
MapBasic 11.0
39
ユーザーズ ガイド
第 3 章: 開発環境の使用
MapBasic 開発環境のメニューの概要
[次のエラー] は、構文エラーを修正する際に役立つコンパイラ機能です。プログラムが正しく
コンパイルされない場合、MapBasic では編集ウィンドウの下にエラーのリストが表示されま
す。[次のエラー] を選択すると、編集ウィンドウが下にスクロールし、エラーリスト上の次の
エラーを含むプログラムの行が表示されます。[次のエラー] は、アクティブな編集ウィンドウ
にエラー メッセージが表示されている場合に選択できます。
•
[前のエラー] は [次のエラー] と似ていますが、 [前のエラー] の場合は編集ウィンドウが上にス
クロールし、エラーリスト上の 1 つ前のエラーが表示されます。[前のエラー]は、アクティブ
な編集ウィンドウに関するエラー メッセージがある場合に選択できます。
•
[ジャンプ] を選択して行番号を入力すると、編集ウィンドウがスクロールしてプログラム内のそ
の行が表示されます。
プログラムが正しくコンパイルされても、実行時にエラーが生じることがあります。このよう
な場合は、プログラム内の特定の行でエラーが発生していることを示すダイアログ ボックスが
表示されます。ここで、通常は MapBasic 開発環境に戻ってプログラム中の該当行をチェック
します。[ジャンプ] は、編集ウィンドウが 1 つ以上開いている場合に使用できます。
該当するテキスト文字列をすべて置換するには
•
置き換え文字列を [置換後の文字列] ボックスに入力し、[すべて置換] ボタンをクリックします。
該当するすべての検索文字列が、[置換後の文字列] の文字列と置き換わります。
L
この置換操作は瞬時に実行され、確認のメッセージは表示されません。
1 回ごとに置換を確認するには
1. [検索] > [文字列の置換] を選択します。[文字列の置換] ダイアログ ボックスが表示されます。
2. [検索する文字列] および [置換後の文字列] のテキスト ボックスに適当なテキストを入力します。
3. [文字列の置換] ダイアログ ボックスで [検索] ボタンをクリックします。
その文字列の次の出現箇所が検索され、ハイライトされます。
現在ハイライトされている文字列を置換するには、Ctrl キーを押しながら R キーを押します ([置
換と再度検索] メニュー コマンドのホット キー)。
現在ハイライトされている検索文字列を置換しない場合は、Ctrl キーを押しながら G キーを押
します ([再度検索] メニュー コマンドのホットキー)。
[プロジェクト] メニュー
[プロジェクト] メニューを使用して、MapBasic プログラムのコンパイルと実行、プログラム統計
データの表示、およびエラー ウィンドウの表示/非表示を行います。
•
[プロジェクト ファイルの選択] を選択すると、既存のプロジェクト ファイルを開くためのダイ
アログ ボックスが表示されます。プロジェクト ファイルは、アプリケーションを構成するす
べてのモジュールがリストされたテキスト ファイルです。プロジェクト ファイルを選択する
と、そのファイルはアクティブなプロジェクト ファイルとなり、[現在のファイルのリンク] を
選択することでそのファイルをコンパイルできます。
MapBasic 11.0
40
ユーザーズ ガイド
第 3 章: 開発環境の使用
MapBasic 開発環境のメニューの概要
•
[現在のファイルのコンパイル] を選択すると、アクティブな編集ウィンドウ上のプログラムがコ
ンパイルされます。[現在のファイルのコンパイル] は、編集ウィンドウが 1 つ以上開いている
場合に選択できます。
コンパイラがプログラム中の構文エラーを検出すると、MapBasic では編集ウィンドウの下にエ
ラーのリストが表示されます。構文エラーがない場合は、mbx ファイル (そのモジュールがスタン
ドアロン型プログラムの場合) またはオブジェクト モジュール (mbo) ファイルが作成されます。
•
[現在のファイルのリンク] を選択すると、現在のプロジェクト ファイルに記載されたモジュー
ルがリンクされ、実行可能アプリケーション ファイルが作成されます (ただし、エラーがある
場合はエラー メッセージが表示されます)。[現在のファイルのリンク] は、プロジェクトファイ
ルが開いている場合に選択できます。
[実行] を選択すると、一番手前の編集ウィンドウ上にあるアプリケーションを実行するように
求めるメッセージが MapInfo Professional ソフトウェアに送信されます。
•
•
[情報] を選択すると、アクティブな編集ウィンドウ上のプログラムに関する統計データが表示さ
れます。[オブジェクト情報] は、編集ウィンドウが 1 つ以上開いている場合に選択できます。
•
[エラーリストを表示/非表示] を選択すると、アクティブな編集ウィンドウの関連エラー リスト
機能がアクティブまたは非アクティブになります。エラーリストが現在表示されている場合、
このメニュー項目は [エラーリストを非表示] となります。エラーリストが現在隠れている場合
は [エラーリストを表示] となります。[エラーリストを表示/非表示] は、関連エラーメッセー
ジが存在するような編集ウィンドウが開いている場合に使用できます。
[ウィンドウ] メニュー
編集ウィンドウが 1 つ以上開いている場合、MapBasic の [ウィンドウ] メニューを使って、ウィン
ドウの整理やアクティブ ウィンドウの切り替えを行うことができます。
このメニューのコマンドは、編集ウィンドウが 1 つ以上開いている場合に使用できます。
•
[ウィンドウを並べて表示] を選択すると、編集ウィンドウが横に並んで表示されます。
•
[ウィンドウを重ねて表示] を選択すると、編集ウィンドウが重なって表示されます。
•
[アイコンの整列] を選択すると、最小化された編集ウィンドウに対応するアイコンが整理されま
す。編集ウィンドウの最小化ボタンをクリックすると、ウィンドウは一時的にアイコンに縮小
されます。
[テキスト スタイル] を選択すると、ウィンドウの表示に使用するフォントが選択できます。選択
されたフォントは、ウィンドウ全体に適用されます。
ウィンドウ メニューの下には、開いている各編集ウィンドウのメニュー項目がリストされます。
編集ウィンドウの 1 つをアクティブにする (そのウィンドウを一番手前に表示する) には、ウィン
ドウ メニューの下から適切なウィンドウ名を選択します。
•
•
MapBasic 11.0
41
ユーザーズ ガイド
第 3 章: 開発環境の使用
MapBasic 開発環境のメニューの概要
[ヘルプ] メニュー
[ヘルプ] メニューを使用すると、オンラインヘルプにアクセスすることができます。オンライン
ヘルプ ファイルでは、MapBasic 言語で使われるすべての文および関数について説明しています。
また、必要な文の名前が検索できる総合クロス リファレンス画面も含まれています。
•
•
•
•
•
[目次] を選択すると、ヘルプ ウィンドウの目次画面が表示されます。ここでハイパーテキスト
ジャンプをクリックしてヘルプを参照するか、[検索] ボタンをクリックして [検索] ダイアログ
ボックスを表示します。
[ヘルプの検索] を選択すると、[検索] ダイアログ ボックスに直接ジャンプできます。
[ヘルプの使い方] を選択すると、オンライン ヘルプの操作方法を示したヘルプ画面が表示され
ます。
[更新の有無をチェック] を選択すると、Pitney Bowes Software Inc. Web サイトが開き、製品
に適用できる更新をすべて示した専用ページが表示されます。
[MapBasic について] を選択すると、著作権およびバージョン番号情報を示した [MapBasicにつ
いて] ダイアログ ボックスが表示されます。
L
MapBasic 11.0
ヘルプ画面の多くには、短いサンプル プログラムが含まれています。これらのプログラム
は、その一部をクリップボードにコピーしてプログラムに貼り付けることもできます。ヘ
ルプ画面からテキストをコピーするには、ヘルプ ウィンドウの [編集] メニューから [編集]
> [コピー] を選択します。ヘルプウィンドウからテキストをドラッグして、プログラムに
ドロップすることもできます。
42
ユーザーズ ガイド
MapBasic の基本
この章では、MapBasic プログラムの構文に関する多くの基本事項を説明しま
す。MapBasic プログラマの方は必ずお読みください。
このセクションの構成
Š
Š
Š
Š
Š
Š
Š
Š
MapBasic 構文の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44
式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50
ループ、分岐、フロー制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .60
プロシージャ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64
システム イベント ハンドラの役割を果たすプロシージャ . . . . . . . .67
ハンドラ プロシージャに関するヒント . . . . . . . . . . . . . . . . . . . . . . .71
コンパイラ命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .73
プログラム編成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .74
4
第 4 章: MapBasic の基本
MapBasic 構文の概要
MapBasic 構文の概要
特定の MapBasic 文を説明する前に、MapBasic プログラムの構文一般について説明します。
コメント
他の BASIC 言語と同様に、MapBasic でもコメントはアポストロフィ (’) で開始します。プログ
ラム中にアポストロフィが出現した場合、そのアポストロフィが引用符で囲まれた文字列定数の
中にない限り、その行のアポストロフィ以降はすべてコメントと見なされます。
大文字/小文字の区別
MapBasic コンパイラでは、大文字と小文字が区別されます。プログラムの記述には、大文字また
は小文字だけを使用することもできますし、両者を組み合わせて使用することもできます。
わかりやすいように、本マニュアルでは MapBasic 言語のキーワードの最初の文字は大文字で表記
されます。一方、プログラム変数は小文字で表記されます。たとえば、下記のサンプル プログラ
ムでは、If と Then は MapBasic のキーワードであるため大文字で開始されていますが、counter
は変数名なので小文字となっています。
If counter > 5 Then
Note "Count is too high"
End If
複数行にまたがる文
MapBasic プログラムを作成するとき、複数行にまたがる長い文を作成することも可能です。たと
えば、次のコード サンプルでは、If...Then 文が複数行にまたがっています。
If counter = 55
Or counter = 34 Then
Note "Counter is invalid"
End If
mapbasic.def でのコード定義
MapBasic の文および関数呼び出しの多くは、次の Include 文がプログラムの先頭または先頭の近
くにないと、正しく機能しません。
Include "mapbasic.def"
mapbasic.def ファイルは、多くの MapBasic 標準コードの定義が含まれるテキスト ファイルです。
原則として、mapbasic.def に定義されたコードは、すべて大文字で表記されています (例 : TRUE、
FALSE、BLACK、WHITE、CMD_INFO_X、OBJ_INFO_TYPE)。MapBasic のマニュアルに記載さ
れているサンプル プログラムには、そのようなコードが数多く出現します。次に例を示します。
If CommandInfo( CMD_INFO_DLG_OK ) Then
標準コード(上記の例では CMD_INFO_DLG_OK) を参照するプログラムは、Include 文を発行
して mapbasic.def を含める必要があります。Include 文を使用しないと、実行時エラー (例 : "変数
またはフィールド CMD_INFO_DLG_OK が定義されていません") が発生します。
MapBasic 11.0
44
ユーザーズ ガイド
第 4 章: MapBasic の基本
MapBasic 構文の概要
MapBasic ウィンドウへの文の入力
MapInfo Professional ソ フ ト ウ ェ アには、MapBasic ウィンドウと呼ばれる機能があります。
MapBasic ウィンドウに文を直接入力すれば、MapBasic の構文の学習に役立ちます。ただし、
MapBasic ウィンドウにはいくつかの制限があります。
•
MapBasic 文の中には、コンパイル済みの MapBasic プログラムの中では使用できても、
MapBasic ウ ィ ン ド ウ で は 入 力 できない ものがあ ります。通常、フ ローコン トロール 文
(If...Then、For...Next、GoTo など) は MapBasic ウィンドウでは無効です。
•
特定の文を MapBasic ウィンドウに入力できるかどうかについては、『MapBasic リファレン
ス ガイド』またはオンライン ヘルプを参照してください。MapBasic ウィンドウで使用できな
い文については、『MapBasic リファレンス ガイド』の説明にその制限が示されています。
•
MapInfo Professional の MapBasic ウィンドウで複数行にまたがる文を直接入力する場合は、
特別な手順を踏まなければなりません。まず、各部分行の最後で Enter キーを押すのではな
く、Ctrl キーを押しながら Enter キーを押します。文全体を入力した後は、その文を構成する
すべての行をハイライトし、Enter キーを押します。
•
mapbasic.def に定義されたコード (例 : BLACK、WHITE) は、MapBasic ウィンドウには入力で
きません。ただし、各コードには特別な値が含まれています (mapbasic.def で確認できます)。
たとえば、BLACK というコードには 0 の数値が含まれています。MapBasic ウィンドウにコマ
ンドを入力する際には、コードの名前ではなく実際の値を使用する必要があります (たとえ
ば、"BLACK" の代わりに 0 を使用してください)。
•
MapBasic ウィンドウに入力する文の長さは、それぞれ 256 文字に制限されています。
変数
MapBasic における変数の宣言や変数への値の割り当ての構文は、他のモダン BASIC 言語によく
似ています。ただし、MapBasic は他の言語では使用できない変数タイプ (オブジェクト変数など)
をサポートしています。MapBasic 変数タイプのリストについては、『MapBasic リファレンス ガ
イド』の Dim 文の説明を参照してください。
変数とは
変数は、コンピュータのメモリの非常に小さな断片と考えることができます。プログラムを作成
するとき、さまざまな種類の情報をメモリに一時的に記憶させる必要が出てきます。これを行う
ためには、1 つまたはそれ以上の変数を宣言します。各変数には、一意の名前 (例 : counter、x、
y2、customer_name) があります。新しい変数を宣言すると、MapBasic はその変数に小さなメモ
リの断片を割り当てます。これにより、各変数は少量の情報を格納できるようになります。
変数の宣言と変数への値の割り当て
変数は Dim 文によって定義されます。変数を使用するには、事前にその変数を宣言しておく必要
があります。
変数に値を割り当てるには、等価演算子 "=" を使用します。
次の例では、1 つの整数変数を宣言して、その変数に 23 という値を割り当てます。
Dim counter As Integer
counter = 23
MapBasic 11.0
45
ユーザーズ ガイド
第 4 章: MapBasic の基本
MapBasic 構文の概要
個々の変数名をコンマで区切ると、1 つの Dim 文を用いて複数の変数を宣言することができま
す。次の Dim 文では、3 つの浮動小数変数を宣言します。
Dim total_distance, longitude, latitude As Float
longitude = -73.55
latitude = 42.917
1 つの Dim 文で異なるタイプの変数を宣言することができます。次の文では、2 つの日付変数と 2
つの文字列変数を宣言します。
Dim start_date, end_date As Date,
first_name, last_name As String
変数名
変数名は、次の規則に従う必要があります。
•
各変数名には最大で 31 文字まで使用できます。
•
•
変数名にはスペースを含めることができません。
各変数名は、文字、下線 (_)、または波形記号 (~) で始まる必要があります。
•
各変数名は、文字、数字、番号記号 (#)、または下線文字 (_) で構成される必要があります。
•
変数名の末尾には、$、%、&、!、@ のいずれの文字を使用してもかまいません。BASIC 言語
によっては、これらの文字が変数タイプを示す場合があります。しかし、MapBasic ではこれ
らの文字は特別な意味を持ちません。
変数名として MapBasic キーワードを使用することはできません。したがって、If、Then、
Select、Open、Close、Count などの名前を持つ変数を宣言することはできません。予約済
みキーワードのリストについては、『MapBasic リファレンス ガイド』の Dim 文の説明を参
照してください。
•
データ型
MapBasic では次のタイプの変数がサポートされています。
タイプ
説明
SmallInt
-32767 から 32767 までの整数値。2 バイトで格納されます。
Integer
-20 億から 20 億までの整数値。4 バイトで格納されます。
Float
浮動小数点値。8 バイトの IEEE 形式で格納されます。
String
最大 32,767 文字長の可変長文字列。
String * n
n 文字長 (最大 32,767 文字) の固定長文字列。
Logical
True または False。
Date
日付。
Object
ライン、円などの地理オブジェクト。詳細については、「図形オブジェクト」を
参照してください。
MapBasic 11.0
46
ユーザーズ ガイド
第 4 章: MapBasic の基本
MapBasic 構文の概要
タイプ
説明
Alias
テーブルのフィールド参照。詳細については、「テーブル操作」を参照してくだ
さい。
Pen
ペン (ライン) スタイル設定。「図形オブジェクト」を参照してください。
Brush
ブラシ (フィル) スタイル設定。「図形オブジェクト」を参照してください。
固定長および可変長文字列変数
MapBasic では、固定長と可変長の文字列変数がサポートされています。可変長文字列変数は、最
大 32,767 文字の長さを持つあらゆる文字列値を格納することができます。これに対して、固定長
文字列変数には Dim 文で指定した長さの制限があります。
可変長文字列変数を宣言するには、変数タイプとして String を使用します。固定長文字列変数を
宣言するには、String キーワードとアスタリスク (*) の後に、文字列の長さを表すバイト数を挿入
します。次の例では、full_name を可変長文字列変数、employee_id を 9 文字の固定長文字列変数
として宣言します。
Dim full_name As String,
employee_id As String * 9
L
他の BASIC 言語と同様に、MapBasic では固定長文字列変数に自動的に空白スペースを割
り当てて、各変数が常に規定のスペースを満たしているように調節します。つまり、5 文
字の固定長文字列変数を宣言し、"ABC" という文字列を割り当てた場合、その変数には
“ABC ” ("ABC" の後に 2 つのスペースが続く) という文字列が含まれます。この機能
は、出力がフォーマット化されるようなアプリケーションを作成する場合に役立ちます。
配列変数
配列変数を宣言するには、変数名の後に配列サイズを括弧で囲んで追加します。配列サイズは、
正の整数定数式でなければなりません。次の Dim 文では、10 個の日付変数からなる配列を宣言し
ます。
Dim start_date(10) As Date
配列の個々の要素を参照するには、次の構文を使用します。
array_name(element-number)
したがって、次の文は start_date 配列の最初の要素に値を割り当てます。
start_date(1) = "6/11/93"
配列のサイズは、ReDim 文を使用して変更することができます。したがって、プログラムで管理
する必要のあるデータ量が、ユーザがどれだけのデータを入力するかわからないなどの理由で事
前に把握できない場合は、ReDim 文を使用し、必要に応じて配列を拡大することができます。
UBound( ) 関数を使用すると、現在の配列サイズを確認できます。
MapBasic 11.0
47
ユーザーズ ガイド
第 4 章: MapBasic の基本
MapBasic 構文の概要
次の例では、name_list という文字列変数の配列を宣言しています。プログラムの後半で配列サイ
ズを 10 要素分拡大しています。
Dim counter As Integer, name_list(5) As String
...
counter = UBound(names) ’ Determine current array size
ReDim names(counter + 10)’ Increase array size by 10
MapBasic 配列には、以下の規則が適用されます。
•
MapBasic では一次元配列のみサポートされています。
•
MapBasic では、配列の最初の要素は常に 1 のインデックスを持ちます。つまり、上記の例で
は、names 配列の最初の要素は names(1) となります。
配列のサイズを超えるデータを格納する必要がある場合は、テーブルにデータを格納します。
テーブルの使用方法の詳細については、「テーブル操作」を参照してください。
数値配列および数値変数が定義されると、MapBasic によって初期値 0 がセットされます。文字列
配列および文字列変数の場合は、初期値ヌルがセットされます。
カスタム データ タイプ (データ定義)
Type...End Type 文を使用して、カスタム データ タイプを定義します。カスタム データ タイプと
は、1 つ以上の変数タイプをグループ化したものです。カスタム データ タイプを定義しておく
と、そのタイプの変数を Dim 文を使用して宣言することができます。
次のプログラムでは、カスタム データ タイプ emloyee を定義した後、employee タイプの変数を
宣言します。
Type employee
name As String
title As String
id As Integer
End Type
Dim manager, staff(10) As employee
カスタム データ タイプの各構成要素は、要素 (エレメント) と呼ばれます。したがって、上記の例
における employee データ タイプには、name、title、id の 3 つの要素 (エレメント) があります。
配列の個々の要素 (エレメント) を参照するには、次の一般構文を使用します。
variable_name.element_name
次の文は、manager 変数の各要素 (エレメント) に値を割り当てます。
manager.name = "Joe"
manager.title = "Director of Publications"
manager.id = 111223333
カスタムタイプの変数の配列を宣言することもできます。次の文では、employee 配列の最初の項
目の要素 (エレメント) の一部に値を割り当てます。
staff(1).name = "Ed"
staff(1).title = "Programmer"
MapBasic 11.0
48
ユーザーズ ガイド
第 4 章: MapBasic の基本
MapBasic 構文の概要
Type...End Type 文は、サブ プロシージャ定義の外で使用する必要があります。サブ プロシー
ジャについては、この章の後半で説明します。一般に、Type...End Type 文は、プログラムの先頭
またはその近くで使用します。Type 定義では、事前に定義されたカスタム データ タイプなど、
他のタイプの要素 (エレメント) を定義することができます。また、カスタム データ タイプのグ
ローバル変数および配列を宣言することもできます。
グローバル変数
Dim 文で宣言された変数はローカル変数です。ローカル変数は、それが定義されたプロシージャ
の中でしか使用できません。MapBasic では、プログラム全体のどのプロシージャの中でも参照で
きるグローバル変数を宣言することができます。
グローバル変数を宣言するには、Global 文を使用します。Global 文の構文は、キーワードが Dim
ではなく Global であることを除いては、Dim 文の構文とまったく同じです。したがって、次の
Global 文では 2 つのグローバル整数変数を宣言しています。
Global first_row, last_row As Integer
Global 文は、サブ プロシージャ定義の外で使用する必要があります。サブ プロシージャについて
は、この章の後半で説明します。通常、Global 文はプログラムの先頭またはその近くで使用します。
次のプログラムでは、いくつかのグローバル変数を宣言した後、サブ プロシージャの中でそれら
のグローバル変数を参照しています。
Declare Sub Main
Declare Sub initialize_globals
Global gx, gy As Float ’ Declare global Float variables
Global start_date As Date ’ Declare global Date variable
Sub Main
Dim x, y, z As Float ’ Declare Main proc’s local vars
Call initialize_globals
...
End Sub
Sub initialize_globals
gx = -1 ’ Assign global var: GX
gy = -1 ’ Assign global var: GY
start_date = CurDate() ’ Assign global var: START_DATE
End Sub
可能な限り、グローバル変数ではなくローカル変数を使用することをお勧めします。グローバル
変数は、プログラムが実行されている間は常にメモリを占有するためです。これとは対照的に、
ローカル変数は、そのローカル変数が定義されたサブ プロシージャが実行されている間だけメモ
リを占有します。
MapBasic のグローバル変数は、他のソフトウェア パッケージとのデータ交換にも使用できます。ア
プリケーションを Windows 上で実行している場合、他のアプリケーションはダイナミック データ交
換を利用して MapBasic グローバル変数の値を読み取ったり、変更したりすることができます。
MapBasic 11.0
49
ユーザーズ ガイド
第 4 章: MapBasic の基本
式
変数の範囲
サブ プロシージャでは、グローバル変数と同名のローカル変数を宣言できます。したがって、プ
ログラムに counter というグローバル変数が含まれているとき、そのプログラムのサブ プロシー
ジャに counter というローカル変数が含まれていることもあります。
Declare Sub Main
Declare Sub setup
Global counter As Integer
...
Sub setup
Dim counter As Integer
counter = 0
...
End Sub
ローカル変数がグローバル変数と同じ名前を持つ場合、そのサブプロシージャは同名のグローバ
ル変数の読み取りや変更を行うことはできません。サブ プロシージャ内での変数の参照は、すべ
てローカル変数のみに適用されます。したがって上記の例では、counter = 0 という文を使用し
ても、グローバル変数 counter には適用されません。
MapBasic では、変数名への参照が見つかると、まずローカル変数名として解釈しようとします。
その名前のローカル変数がない場合、その参照をグローバル変数名として解釈しようとします。
さらにその名前のグローバル変数がない場合には、開いているテーブルへの参照として解釈しよ
うとします。最終的に、実行時にテーブル参照として解釈できない場合は、エラー メッセージが
生成されます。
式
このセクションでは、式について詳しく説明します。式とは、1 つ以上の変数、定数値、関数呼び
出し、テーブルの参照、および演算子をグループにしたものです。
定数とは
非常に単純な式もあります。たとえば、counter = 23 という文では、単純な整数式を割り当て
ます。つまり、値 23 を変数 counter に割り当てます。式 23 は、数値定数と呼ばれます。定数
は、変数に割り当てられた特定値と考えることもできるでしょう。
次のプログラムでは、文字列定数を宣言した後、文字列定数 ("Fred Mertz" という名前) をその変数
に割り当てます。
Dim name As String
name = "Fred Mertz"
数値式の構文は文字列式の構文と異なります。文字列定数は二重引用符で囲む必要がありますが
(例 : "Fred Mertz")、数値定数はそうではありません (例 : 23)。"Fred Mertz" のような文字列式を数値
変数に割り当てることはできません。定数式の詳細については、「定数の詳しい説明 (52 ページ)」
を参照してください。
MapBasic 11.0
50
ユーザーズ ガイド
第 4 章: MapBasic の基本
式
演算子とは
演算子とは、1 つ以上の定数、変数、またはその他の値を操作する特別な文字 (例 : +、*、>) や単
語 (例 : And、Or、Not) です。式は、演算子によって組み合わされた 2 つ以上の値で構成される場
合があります。次の例では、式 y + z の中でプラス演算子 (+) が加算に使用されています。加算の
結果 (合計) は、変数 x に割り当てられます。
Dim
y =
z =
x =
x, y, z As Float
1.5
2.7
y + z
この例では、プラス記号 (+) は演算子 (厳密には数値演算子) の役割を果たしています。この他の数
値演算子には、減算に使用されるマイナス演算子 (-)、乗算に使用されるアスタリスク (*)、および累
乗に使用されるカレット (^) などがあります。この章の後半に、数値演算子のリストを掲載します。
プラス演算子は、文字列式の中で、個別の文字列を 1 つの文字列に連結するために使用すること
もできます。次のプログラムでは、3 つの部分で構成される文字列式を作成し、その文字列を変数
ful_name の中に格納しています。
Dim first_name, last_name, middle_init, full_name As String
first_name = "Fred "
middle_init = "R."
last_name = "Mertz"
full_name = first_name + middle_init + last_name
’ At this point, the variable full_name contains:
’ Fred R.Mertz
関数呼び出しとは
MapBasic 言語では、多数のさまざまな関数呼び出しがサポートされています。各関数は異なる目
的で使用されます。たとえば、Sqr( ) 関数は平方根を計算し、UCase$( ) 関数はテキスト文字列を
大文字に変換します。プログラムに関数名を入力すると、プログラムは指定された関数を呼び出
し、呼び出された関数が値を返します。
関数呼び出しは、式そのものとして、または式の一部として使用することができます。たとえ
ば、次の文では Minimum( ) 関数によって返された値を基に、変数 x に値を割り当てています。
x = Minimum( y, z )
MapBasic の関数呼び出し構文は、他のモダン BASIC 言語の構文と類似しています。関数名 (上記
の例では "Minimum") の後には、一組の括弧が続きます。関数がパラメータを取る場合、そのパラ
メータは括弧の中に入れます。関数が複数のパラメータを取る場合、個々のパラメータはコンマ
で区切られます (Minimum( ) 関数は 2 つのパラメータを取ります)。
関数呼び出しは、値を返すことができるという点で一般の文とは異なります。また、関数呼び出
しは単独の文として機能することはできず、関数によって返された値は文を構成する要素でなけ
ればなりません。たとえば、次のプログラムは、変数 x を宣言する Dim 文と、その変数に値を割
り当てる割り当て文の 2 つの文で構成されています。割り当て文では数値の平方根を計算するた
めに Sqr( ) 関数を呼び出しています。
MapBasic 11.0
51
ユーザーズ ガイド
第 4 章: MapBasic の基本
式
Dim x As Float
x = Sqr(2)
同様に、次のプログラムでは現在の日付を表す日付値を返す CurDate( ) 関数が使用されています。
Dim today, yesterday As Date
today = CurDate( )
yesterday = today - 1
CurDate( ) 関数はパラメータを取りません。上記の例に示すように、MapBasic で関数を呼び出す
場合は、パラメータを取らない関数であっても、関数名の後には必ず一組の括弧を付ける必要が
あります。
MapBasic では、Area( ) や Perimeter( ) などの特殊な地理関数だけでなく、Chr$( ) や Sqr( ) などの
多くの標準 BASIC 関数がサポートされています。
定数の詳しい説明
定数は、プログラムの実行中は変化しない特殊な値です。プログラマの間では、定数は "ハード
コード" 式または "リテラル" と呼ばれることもあります。
数値定数
数値変数の種類によって、必要となる定数の種類は異なります。たとえば、定数値 36 は一般数値
定数です。この 36 という値は、整数、2 バイト整数、浮動小数など、あらゆる数値変数に割り当
てることができます。86.4 は、浮動小数点数値定数です。
16 進数値定数
MapBasic 4.0 以降では、Visual Basic 構文の &Hnumber (number は 16 進数) を使用した 16 進数
値定数がサポートされています。次の例では、16 進数値 1A (10 進数の 26 に相当) を変数に割り当
てます。
Dim i_num As Integer
i_num = &H1A
数値定数は、コンマ (1000桁セパレータ) を含むことはできません。したがって、次の文は正しく
コンパイルされません。
counter = 1,250,000 ’ This won’t work!
数値定数が小数点 (小数セパレータ) を含む場合、セパレータ文字はピリオドにする必要がありま
す。これは、ユーザのコンピュータで小数セパレータとしてこれ以外の文字が設定されていても
同じです。
文字列定数
文字列定数は二重引用符で囲みます。次に例を示します。
last_name = "Nichols"
各文字列定数には、最長 256 文字まで指定することができます。
MapBasic 11.0
52
ユーザーズ ガイド
第 4 章: MapBasic の基本
式
二重引用符は、実際には文字列定数の一部ではなく、単に文字列定数の始まりと終わりを示して
います。二重引用符文字を文字列定数に含める必要がある場合は、連続する 2 つの二重引用符を
文字列に挿入します。以下のプログラムは、文字列に引用符を含めた例です。
Note "The table ""World"" is already open."
論理定数
論理定数は、TRUE を示す 1 か FALSE を示す 0 のどちらかとなります。MapBasic プログラムの多
くは、これらの TRUE 値および FALSE 値を参照します。TRUE と FALSE は、実際に MapBasic の
標準定義ファイル mapbasic.def の中で定義されていることに注意してください。TRUE や FALSE
などの標準定義を参照するには、プログラムで次のように Include 文を発行して mapbasic.def を含
める必要があります。次に例を示します。
Include "mapbasic.def"
Dim edits_pending As Logical
edits_pending = FALSE
日付定数
日付定数を指定するには、YYYYMMDD というフォーマットで 8 桁の整数を入力します。次の例で
は、1995 年 12 月 31 日を指定します。
Dim d_enddate As Date
d_enddate = 19951231
これとは別に、日付定数の役割を果たす文字列式を指定することもできます。
d_enddate = "12/31/1995"
文字列を日付定数として指定する場合、年は 4 桁または 2 桁のどちらでも構いません。
d_enddate = "95/12/31"
年を省略することもできます。この場合は、現在の年が使用されます。
d_enddate = "12/31"
警告 :
日付定数の代わりに文字列を使うと、ユーザのコンピュータがどのように構成され
ているかによって結果が変わるため、信頼性に劣る場合もあります。ユーザのコン
ピ ュ ー タ が 月 / 日 / 年のフォーマットを使用するように設定されている場合、
"06/11/95" は 6 月 11 日を表しますが、コンピュータが日/月/年のフォーマットを使
用する場合、"06/11/95" は 11 月 6 日を表すことになります。
ユーザのコンピュータがセパレータとして "-" を使用するように設定されていると、MapInfo
Professional は "12/31" のような文字列式を日付に変換できません。
予測可能な結果を確実に得るためには、8 桁の数値日付構文を受け取る NumberToDate( ) 関数を使
用します。(19951231 のような数値日付定数は、ユーザのコンピュータの設定に左右されることは
ありません。) テキスト ファイルから日付を読み取る場合のように、文字列を日付値として使用する
必要がある場合は、Set Format 文を使用して文字列の解釈方法を指定します。Set Format 文の詳細
については、『MapBasic リファレンス ガイド』またはオンライン ヘルプを参照してください。
Microsoft Windows で日付フォーマット化オプションを設定するには、[地域の設定] コントロール
パネルを使用します。
MapBasic 11.0
53
ユーザーズ ガイド
第 4 章: MapBasic の基本
式
別名定数
別名変数については、「テーブル操作」で詳しく説明します。次に示すように、別名タイプ変数
には文字列式を割り当てることができます。次に例を示します。
Dim column_name As Alias
column_name = "City"
以下の表に、さまざまなタイプの定数の例を示します。
タイプ
割り当てのサンプル
備考
Integer
i = 1234567
SmallInt
m = 90
Float
f = 4
size = 3.31
debt = 3.4e9
String
s_mesg = "Fred Mertz"
二重引用符で囲みます。引用符を文字
列の中で使用するには、引用符を 2 つ
入力します。特殊文字を含めるには、
Chr$( ) 関数を使用します。
Logical
edits_pending = 1
edits_pending = TRUE
1 は true を、0 は false を表します。
TRUE および FALSE は、
MapBasic の定義ファイルに定義さ
れています。
Date
d_starting = 19940105
date_done = "88/03/23"
paiddate = "12-24-1993"
yesterday = CurDate( ) - 1
Alias
col_name = "Pop_1990"
col_name = "COL1"
別名は、文字列と同様に割り当てる
ことができます。別名変数の詳細に
ついては、「テーブル操作」を参照
してください。
Pen
hwypen = MakePen(1, 3, BLACK)
ペン式の定数構文はありません。
Brush
zbrush = MakeBrush(5, BLUE, WHITE)
ブラシの定数構文はありません。
Font
lbl_font = MakeFont("Helv", 1, 20,
BLACK, WHITE)
フォントの定数構文はありません。
Symbol
loc sym = MakeSymbol(44,RED,16)
シンボルの定数構文はありません。
Object
path = CreteLine(73.2,40,73.6,40.4) オブジェクトの定数構文はありま
せん。
MapBasic 11.0
54
ユーザーズ ガイド
第 4 章: MapBasic の基本
式
変数タイプの変換
MapBasic には、データのタイプを変換するための関数が用意されています。たとえば、ある数字
に対して関数 Str$( ) を呼び出すと、その数字を表す文字列を作成することができます。
Dim q1, q2, q3, q4, total As Float, s_message As String
...
total = q1 + q2 + q3 + q4
s_message = "Grand total: " + Str$(total)
演算子の詳しい説明
演算子は特定の値からある結果を得るために使用します。演算子は、使用するデータのタイプお
よび生じる結果のタイプによって分類することができます。
数値演算子
次の表に示す演算子は数値演算子です。2 つの数値を数値演算子を使って組み合わせると、結果と
しての数値を得ることができます。
演算子
処理
例
+
加算
x = a + b
-
減算
x = a - b
*
乗算
x = a * b
/
除算
x = a / b
\
整数除算
x = a \ b
Mod
整数の余り
x = a Mod b
^
累乗
x = a ^ b
\ および Mod 演算子は、整数除算を行います。次に例を示します。
10 / 8
次の値を返します。
1.25
10 \ 8
次の値を返します。
1 (1.25 の整数部分)
10 Mod 8
次の値を返します。
2 (10 を 8 で割った余り)
マイナス記号 (-) 演算子は、負の数値の表示にも使用されます。
x = -23
MapBasic 11.0
55
ユーザーズ ガイド
第 4 章: MapBasic の基本
式
文字列演算子
プラス演算子 (+) は、2 つ以上の文字列式を 1 つの長い文字列式に連結します。
Note "Employee name: " + first_name + " " + last_name
文字列の連結には、プラス演算子の代わりにアンパサンド演算子 (&) を使うこともできます。& 演
算子は、両方のオペランドを強制的に文字列に変換して、それらを連結します。数字または日付
を文字列に強制変換することなく連結する + 演算子とは異なります。
L
& 文字は、16 進数 (&Hnumber) の指定にも使用されます。& を文字列の連結に使用すると
きは、& の前後に必ずスペースを入れて、MapBasic コンパイラが 16 進数の接頭辞と間違
えることのないようにしてください。
Like 演算子は、ワイルドカード一致を含む文字列比較を実行します。次の例では、文字列変数が
"North" という文字列で始まるかどうかをテストします。
If s_state_name Like "North%" Then ...
Like 演算子は、Like( ) 関数と同様の働きをします。Like( ) 関数の説明については、『MapBasic
リファレンス ガイド』またはオンライン ヘルプを参照してください。
日付演算子
次の一覧に示すように、日付式ではプラス演算子とマイナス演算子のどちらも使用できます。
条件式
戻り値
日付 + 整数
今日よりも後の日付
日付 - 整数
今日よりも前の日付
日付 - 日付
経過した日数を表す整数値
次の例では、CurDate( ) 関数を使用して現在の日付を調べた後、明日および 1 週間前の日付を表
す別の日付式を計算します。
Dim today, one_week_ago, tomorrow As Date,
days_elapsed As Integer
today = CurDate( )
tomorrow = today + 1
one_week_ago = today - 7
’ calculate days elapsed since January 1:
days_elapsed = today - StringToDate("1/1")
比較演算子
比較演算子は、同じ一般タイプの 2 つの値を比較し、TRUE または FALSE の論理値を返します。
比較演算子は条件式でよく使用されます (If...Then 文など)。
MapBasic 11.0
56
ユーザーズ ガイド
第 4 章: MapBasic の基本
式
TRUE が返される条件
演算子
例
=
~と等しい
If
<>
~と等しくない
If a <> b Then ...
<
より小さい
If a < b Then ...
>
より大きい
If a > b Then ...
<=
以下
If a <= b Then ...
>=
以上
If a >= b Then ...
Between…And…value
範囲内である
If x Between f_low
And f_high Then...
a
=
b
Then...
これらの比較演算子は、それぞれ文字列式、数値式、または日付式の比較に使用されます。ただ
し、比較演算子はオブジェクト式、ペン式、ブラシ式、シンボル式、またはフォント式の比較に
は使用できません。
Between...And... 比較演算子を利用して、日付の値がある範囲内にあるかどうかを調べることがで
きます。次の If...Then 文では Between...And... 比較を使用しています。
If x Between 0 And 100 Then
Note "Data within range."
Else
Note "Data out of range."
End If
また、同じプログラムを別の形で書くこともできます。
If x >= 0 And x <= 100 Then
Note "Data within range."
Else
Note "Data out of range."
End If
= 演算子を使用して 2 つの文字列を比較する場合、両方の文字列全体の長さが調べられ、文字列の
長さが同じであれば TRUE が返されます。文字列の比較では大文字と小文字が区別されません。
次の If...Then 文では 2 つの名前 ("Albany" と "ALBANY") が等しいと見なされます。
Dim city_name As String
city_name = "ALBANY"
If city_name = "Albany" Then
Note "City names match."
End If
大文字と小文字を区別する文字列比較を行う場合は、StringCompare( ) 関数を利用します。この
関数の詳細については、『MapBasic リファレンス ガイド』を参照してください。
L
MapBasic 11.0
固定長文字列と可変長文字列を比較する場合は、注意が必要です。MapBasic は、割り当て
られたスペースを埋めるため、必要に応じて固定長文字列に自動的にスペースを補充しま
す。一方、可変長文字列はこのようにスペースが補充されることはありません。これは、
データと変数にもよりますが、一見同じに見える 2 つの文字列が実際は等しくない場合も
あることを意味します。
57
ユーザーズ ガイド
第 4 章: MapBasic の基本
式
RTrim$( ) 関数を使用すると、スペースを自動的に追加せずに固定長文字列を作成できます。
RTrim$( ) 関数によって返された値はそのまま可変長文字列と比較でき、追加されたスペースの影
響を考慮する必要がありません。
論理演算子
論理演算子は論理値に対して使用され、TRUE または FALSE の論理結果を生成します。
演算子
TRUE が返される条件
例
And
両方のオペランドが TRUE で If a And b Then...
ある
Or
どちらかのオペランドが TRUE If a Or b Then...
である
Not
オペランドが FALSE である。
If Not a Then...
たとえば、次の If...Then 文は、変数 x が 0 より小さいかどうか、および 10 より大きいかどうか
を調べる 2 つのテストを実行します。いずれか一方のテストで条件に合致しないと、エラー メッ
セージが表示されます。
If x < 0 Or x > 10 Then
Note "Number is out of range."
End If
地理演算子
地理演算子はオブジェクト式に対して使用され、TRUE または FALSE の論理結果が生成されます。
演算子
TRUE が返される条件
例
Contains
最初のオブジェクトが 2 番目のオ If a Contains b Then...
ブジェクトの図心を含む
Contains Part
最初のオブジェクトが 2 番目のオ If a Contains Part b Then...
ブジェクトの一部を含む
Contains Entire
最初のオブジェクトが 2 番目のオ If a Contains Entire b Then...
ブジェクト全体を含む
Within
最初のオブジェクトの図心が 2 番 If a Within b Then...
目のオブジェクトの中にある
Partly Within
最初のオブジェクトの一部が 2 番 If a Partly Within b Then...
目のオブジェクトの中にある
MapBasic 11.0
58
ユーザーズ ガイド
第 4 章: MapBasic の基本
式
TRUE が返される条件
演算子
例
Entirely Within
最初のオブジェクト全体が 2 番目 If a Entirely Within b Then...
のオブジェクトの中にある
Intersects
2 つのオブジェクトがある点で交 If a Intersects b Then...
差する
図形オブジェクトの詳細については、「図形オブジェクト」を参照してください。
MapBasic 演算子の優先順位
演算子の中には、他の演算子よりも高い優先順位を持つものがあります。つまり、複数の演算子を
含む複雑な式では、MapBasic はある規則に従って、どの操作を最初に実行するかを決定します。
MapBasic が複雑な式をどのように処理するかを理解するためには、まずそれぞれの MapBasic 演算
子の優先順位について知る必要があります。
次の数学式を考えてみてください。
x = 2 + 3 * 4
この式には、加算と乗算という 2 つの数学的操作が関係しています。最後に得られる結果は、ど
ちらの操作が最初に実行されるかで異なります。最初に加算 (2+3=5) を行ってから乗算 (5*4) を行
うと、結果は 20 になります。しかし実際には、乗算の方が加算よりも優先順位が高くなります。
つまり、MapBasic では乗算を最初に行い (3*4=12)、その後で加算を行います (2+12=14)。
MapBasic のデフォルト優先順位を無視するには、括弧を使用します。次の式では、括弧を使用し
て乗算の前に加算が行われるようにしています。
x = (2 + 3) * 4
次の表は、MapBasicの各演算子の優先順位を表したものです。
最も優先順位が高いもの :
括弧
累乗
負
乗算、除算、Mod、整数除算
加算、減算、文字列結合 (&)
地理演算子、比較演算子、Like
Not
And
最も優先順位が低いもの :
Or
演算子が同じ行にある場合、優先順位が同等であることを意味します。優先順位の高い順に計算
されます。同じ優先順位の演算子の場合は左から順に計算されます (ただし、累乗は例外で右から
左に計算されます)。
MapBasic 11.0
59
ユーザーズ ガイド
第 4 章: MapBasic の基本
ループ、分岐、フロー制御
ループ、分岐、フロー制御
フロー制御文は、他の文が実行される順序を左右します。MapBasic には、大きく分けて 3 種類の
フロー制御文があります。
•
分岐文を使用して、プログラム内の特定の文をスキップできます (If...Then、GoTo など)。
•
ループ文を使用して、プログラム内の 1 つまたはそれ以上の指定文を反復実行できます (For...Next、
Do...While など)。
•
特殊なフロー制御を行える文もあります (End Program など)。
If...Then 文
MapBasic の If...Then 文の機能は、他の言語における If...then 文に相当する機能とほぼ同じです。
If...Then 文は、ある条件をテストします。その条件が TRUE であれば、MapBasic はキーワード
Then に続く文を実行します。次の例では、counter 変数が小さすぎる場合に、エラー メッセージ
を表示してサブプロシージャを呼び出します。
If counter < 0 Then
Note "Error: The counter is too low."
Call reset_counter
End If
If...Then 文では、オプションの Else 句を使用できます。最初のテスト条件が FALSE だった場
合、MapBasic はキーワード Then に続く文ではなく、キーワード Else に続く文を実行します。
次の例に、オプションの Else 句を示します。
If counter < 0 Then
Note "Error: The counter is too low."
Call reset_counter
Else
Note "The counter is OK."
End If
If...Then 文には、オプションの ElseIf 句を 1 つ以上含めることもできます。ElseIf 句では、追加
条件のテストを行います。文に ElseIf 句が含まれており、なおかつ最初の条件が FALSE だった場
合、MapBasic は次の例に示すように ElseIf 句をテストします。
If counter < 0 Then
Note "Error: The counter is too low."
Call reset_counter
ElseIf counter > 100 Then
counter = 100
Note "Error: The counter is too high; resetting to 100."
Else
Note "The counter is OK."
End If
L
MapBasic 11.0
ここで、ElseIf は単独のキーワードであることに注意してください。1 つの If...Then 文で
連続した 2 つ以上の ElseIf 句を使用して、条件を続けてテストすることができます。ただ
し、2 ~ 3 個以上の条件をテストする場合は、ElseIf 句を多数含む If...Then 文を作成する
よりも、Do...Case 文 (下記参照) を使用することをお勧めします。
60
ユーザーズ ガイド
第 4 章: MapBasic の基本
ループ、分岐、フロー制御
Do Case 文
Do Case 文は、ある式が値のリスト中のいずれかの値と一致するかどうかをテストする、一連の
条件テストを実行します。式と一致する値 (存在する場合) に応じて、MapBasic は異なる一連の命
令を実行します。
次の例は、現在の月が会計年度の第 1 四半期、第 2 四半期、第 3 四半期、第 4 四半期のいずれに
含まれるかをテストします。現在の月が第 1 四半期 (1 月 - 2 月 - 3 月) に含まれる場合、プログラ
ムはテキスト文字列に適当なタイトル ("First Quarter Results") を割り当てます。同様に、現在の
月が第 2 四半期に含まれる場合、プログラムは別のタイトル ("Second Quarter Results") を割り当
てます。
Dim current_month, quarter As SmallInt,
report_title As String
current_month = Month( CurDate() )
’ At this point, current_month is 1 if current date
’ is in January, 2 if current date is in February, etc.
Do Case current_month
Case 1, 2, 3
’ If current month is 1 (Jan), 2 (Feb) or 3 (Mar),
’ we’re in the First fiscal quarter.
’ Assign an appropriate title.
report_title = "First Quarter Results"
quarter = 1
Case 4, 5, 6
report_title = "Second Quarter Results"
quarter = 2
Case 7, 8, 9
report_title = "Third Quarter Results"
quarter = 3
Case Else
’
’ If current month wasn’t between 1 and 9, then
’ current date must be in the Fourth Quarter.
’
report_title = "Fourth Quarter Results"
quarter = 4
End Case
L
MapBasic 11.0
Case Else は Do Case 文のオプションの句です。Do Case 文に Case Else 句が含まれる
場合、その前にある Case 句がすべてテスト式と一致しない場合に、MapBasic は Case
Else 句に続く文を実行します。Case Else 句は、Do Case 構造の最終句にする必要があり
ます。
61
ユーザーズ ガイド
第 4 章: MapBasic の基本
ループ、分岐、フロー制御
GoTo 文
GoTo 文は、プログラムの別の部分に移動し、その場所からプログラム実行を再開するように
MapBasic に指示します。GoTo 文ではラベルを指定します。つまり、GoTo 文が機能するために
は、同じプロシージャ内にラベルが存在している必要があります。ラベルとは行の始めにある名
前のことで、 各ラベルは必ずコロンで終わります (ただし、GoTo 文にはコロンは含まれません)。
下記の例を参照してください。
If counter < 0 Then
GoTo get_out
End If
...
get_out:
End Programendprogram
一般的に、GoTo 文の使用はあまり推奨されません。If..Then などの他のフロー制御文を注意して
使用すれば、GoTo 文を使用する必要はなくなります。そのため、GoTo 文の使用を避けてもかま
いません。
For...Next 文
For...Next 文を使用して、指定回数実行されるループを設定できます。ループが反復されるたび
に、MapBasic は For 句と Next 句の間にあるすべての文が実行されます。For...Next ループを作
成するには、まずカウンタとして使用する数値変数の名前を指定する必要があります。さらに、
そのカウンタ変数の開始値と終了値も指定する必要があります。ループの反復ごとに、MapBasic
はカウンタ変数値をあるステップ値ずつ増加させます。デフォルトのステップ値は 1 となってい
ます。別の増分値を使用するには、オプションの Step 句を挿入します。
次の例では、For...Next ループを使用して数字の配列から値を追加します。
Dim monthly_sales(12), grand_total As Float,
next_one As SmallInt
...
For next_one = 1 To 12
grand_total = grand_total + monthly_sales(next_one)
Next
MapBasic は、For...Next 文の開始時にカウンタ変数に開始値を割り当てます。上記の例では、
MapBasicは 1 という値を変数 next_one に割り当てます。続いて、MapBasic はキーワード Next
までの間にある文を実行します。ループの反復ごとに、MapBasic はカウンタ変数値を増加させま
す。カウンタ変数が最終値と同じか、それ以下 (例 : next_oneが 12 またはそれ以下) である場合、
MapBasic はもう一度ループ反復を実行します。
For...Next ループは、Exit For 文が出現するとその時点で停止します。これによって、ループを条
件的に中断することができます。
For...Next ループの詳細については、『MapBasic リファレンス ガイド』を参照してください。
MapBasic 11.0
62
ユーザーズ ガイド
第 4 章: MapBasic の基本
ループ、分岐、フロー制御
Do...Loop
Do...Loop 文は、テスト条件が TRUE である限り、またはオプションとして条件が FALSE である
限り、一連の文を実行し続けます。
ループ条件を実行対象の文の前でテストするか、後でテストするかに応じて、Do...Loop 文の形が
変わります。次のプログラムでは、ループの最後にループ条件をテストします。
Dim sales_total, new_accounts(10) As Float,
next_one As SmallInt
next_one = 1
Do
sales_total = sales_total + new_accounts(next_one)
next_one = next_one + 1
Loop While next_one <= UBound(new_accounts)
このループは、少なくとも 1 回は必ず実行されることに注意してください。これは、ループ条件
がループの最後までテストされないからです。
次のループでは、ループの最初にループ条件をテストします。条件がループの最初にテストされ
るため、ループの中の文は永久に実行されない可能性もあります。テスト条件が最初から FALSE
であれば、次の Do...Loop の中にある文は永久に実行されません。
Dim sales_total, new_accounts(10) As Float,
next_one As SmallInt
next_one = 1
Do While next_one <= UBound(new_accounts)
sales_total = sales_total + new_accounts(next_one)
next_one = next_one + 1
Loop
上の 2 つの例では、どちらの Do...Loop 文にもキーワード While が含まれています。したがっ
て、2 つのループはテスト条件が TRUE である限り継続します。Do...Loop では、キーワードとし
て While ではなく Until も使用できます。Do...Loop 文で Until を指定する場合、そのループはテ
スト条件が FALSE である限り継続します。
Do...Loop 文は、Exit Do 文が出現するとその時点で停止します。Exit Do 文を使用すると、ループ
を条件的に中断することができます。
While...Wend ループ
MapBasic では、従来の BASIC の While...Wend ループ構文がサポートされています。While...Wend
文は Do While...Loop 文と非常によく似ています。
以前からの BASIC プログラマで、While...Wend 文の方が使い慣れているという場合は、MapBasic で
も引き続き While...Wend 文を使用することができます。ただし、Do...Loop 構文には While...Wend
構文よりも優れた点があります。たとえば、Do...Loop 文は Exit Do 文を使用して途中で終了できま
すが、While...Wend ループを終了させる文はありません。
While...Wend ループの詳細については、『MapBasic リファレンス ガイド』を参照してください。
MapBasic 11.0
63
ユーザーズ ガイド
第 4 章: MapBasic の基本
プロシージャ
プログラムの終了
End Program 文を使用すると、MapBasic アプリケーションが停止し、アプリケーションによっ
て作成されたカスタム メニュー項目がすべて削除され、さらにメモリからアプリケーションが消
去されます。また End Program は、そのアプリケーションによって (Open File 文によって) 開か
れたすべてのファイルを閉じます。ただし、開いているテーブルは閉じません。
End Program 文は必須ではありません。実際には、End Program 文を発行しないよう注意が必要
な場合もあります。たとえば、使用しているアプリケーションによって MapInfo Professional メ
ニューに新しいメニュー項目が追加される場合、それらのカスタム メニュー項目が MapInfo
Professional セッション終了時まで利用できるように、セッションが継続している間はアプリケー
ションが実行されていることが理想的です。このような場合、End Program 文を発行するとアプ
リケーションが停止し、アプリケーションのカスタム メニュー項目がすべて削除されてしまうた
め、発行しないように注意する必要があります。カスタム メニューの詳細については、「ユーザ
インターフェイスの作成」を参照してください。
プログラムと MapInfo Professional の終了
End MapInfo 文を使用すると、(End Program 文と同様) MapBasic アプリケーションが停止さ
れ、さらに MapInfo Professional ソフトウェアも終了されます。
プロシージャ
プロシージャ (しばしばサブプロシージャと呼ばれます) は、MapBasic プログラム アーキテク
チャの重要な部分です。一般的な MapBasic プログラムは、数多くのサブプロシージャで構成され
ます。各サブプロシージャには、特定のタスクを実行する一連の文が含まれています。プログラ
ムを複数のサブプロシージャに分割することでプログラムをモジュール化すると、長期的にはプ
ログラムの開発と管理が容易になります。
Main プロシージャ
どのMapBasicプログラムも、Main プロシージャと呼ばれるプロシージャを 1 つ以上持っていま
す。MapBasic アプリケーションを実行すると、そのアプリケーションの Main プロシージャが自動
的に呼び出されます。
次のプログラムは、Main プロシージャを明示的に宣言する構文を示したものです。この例では、
Main プロシージャは単純に Note 文を発行します。
Declare Sub Main
Sub Main
Note "Hello from MapBasic!"
End Sub
MapBasic 11.0
64
ユーザーズ ガイド
第 4 章: MapBasic の基本
プロシージャ
Declare Sub 文により、後でサブプロシージャ定義が出現することを MapBasic に通知します。プ
ログラム内の各サブプロシージャについて、対応する Declare Sub 文が 1 つずつ必要です。
Declare Sub 文は、実際のサブプロシージャ定義よりも前に記述する必要があります。通常、
Declare Sub 文はプログラムの先頭またはその近くで使用します。
「開発環境の使用」では、わずか 1 行でも MapBasic プログラムになることを説明しました。たと
えば、次の文を見てください。
Note "Hello from MapBasic!"
この文はコンパイルして実行できる完全な MapBasic プログラムです。シンプルな 1 行のプログラ
ムにも Main プロシージャがあることに注意してください。ただし、この場合、Main プロシージャ
は明示ではなく内示されていると言います。
プロシージャの呼び出し
コンパイル済みのアプリケーションを実行すると、MapInfo は自動的に Main プロシージャを呼び
出します (その Main プロシージャが明示的に定義されているかどうかは関係ありません)。続い
て、この Main プロシージャは Call 文を利用して他のサブプロシージャを呼び出します。
次のプログラムは、Main プロシージャと announce_date というプロシージャの 2 つのプロシー
ジャを含んでいます。
Declare Sub Main
Declare Sub announce_date
Sub Main
Call announce_date( )
End Sub
Sub announce_date
Note "Today’s date is " + Str$( CurDate() )
End Sub
パラメータを持つプロシージャの呼び出し
他のモダン BASIC 言語と同様に、MapBasic でもパラメータを取るサブプロシージャの作成が可
能です。サブプロシージャがパラメータを取る場合、パラメータは Sub...End Sub 文の中のプロ
シージャ名に続く括弧の中で宣言されます。
次の例は、1 つのパラメータ (日付値) を取る check_date というサブプロシージャを示したもので
す。このサブプロシージャは、日付パラメータの値が古すぎる (180 日以上古い) かどうかを
チェックします。日付パラメータ値が古すぎる場合、このプロシージャによって日付パラメータ
の値が現在の日付に設定されます。
Declare Sub Main
Declare Sub check_date(last_date As Date)
Sub Main
Dim report_date As Date
report_date = "01/01/94"
MapBasic 11.0
65
ユーザーズ ガイド
第 4 章: MapBasic の基本
プロシージャ
Call check_date( report_date )
’ At this point, the variable: report_date
’ may contain the current date (depending on
’ what happened in the check_date procedure).
End Sub
Sub check_date(last_date As Date)
Dim elapsed_days As SmallInt
elapsed_days = CurDate() - last_date
If elapsed_days > 180 Then
last_date = CurDate()
End If
End Sub
参照によるパラメータの受け渡し
デフォルトでは、MapBasic の各プロシージャパラメータは "参照により" 渡されます。パラメータ
が参照により渡される場合は、次の規則が適用されます。
•
Call 文では、参照により渡される各パラメータの変数名を指定する必要があります。
•
呼び出されたサブプロシージャによって、参照により渡されるパラメータに新しく値が割り当て
られると、その新しい値は自動的に呼び出し側の変数に格納されます。つまり、サブプロシー
ジャでは参照により渡されるパラメータを使用して、呼び出し元に値を返すことができます。
このように、上記の例では、Call 文を使用して日付変数名 report_date を指定しています。
Call check_date( report_date )
check_date プロシージャの中では、このパラメータは last_date という名前で認識されます。
check_date プロシージャが last_date=CurDate( ) という式を実行すると、MapBasic は自動的に
Main プロシージャの report_date 変数を更新します。
値によるパラメータの受け渡し
パラメータの参照による受け渡しが面倒な場合もあります。参照により渡されるパラメータに対
しては、Call 文の中でそれぞれの変数名を指定する必要があります。しかし、このプロセスが面
倒な場合もあります (適当なタイプの変数がない場合など)。
他の BASIC 言語と同様に、MapBasic でもプロシージャ パラメータが参照ではなく値により渡さ
れるよう指定することができます。パラメータが値により渡されるよう指定するには、Sub...End
Sub 文の中のパラメータ名の前にキーワード ByVal を挿入します。
パラメータが値により渡される場合は、次の規則が適用されます。
•
•
Call 文では、変数名をパラメータとして指定する必要はありません。Call 文では、変数名、定
数値、またはその他の式を指定することができます。
呼び出されたサブプロシージャによって、値により渡されるパラメータに新しい値が割り当て
られても、呼び出し側のプロシージャは影響を受けません。つまり、サブプロシージャは値に
より渡されるパラメータを使って呼び出し手に値を返すことは"できません"。
次の例は、値により渡される 2 つの日付パラメータを取るプロシージャ (display_date_range) を示
したものです。
MapBasic 11.0
66
ユーザーズ ガイド
第 4 章: MapBasic の基本
システム イベント ハンドラの役割を果たすプロシージャ
Declare Sub Main
Declare Sub display_date_range(ByVal start_date As Date,
ByVal end_date As Date )
Sub Main
Call display_date_range( "1/1", CurDate() )
End Sub
Sub display_date_range(ByVal start_date As Date,
ByVal end_date As Date )
Note "The report date range will be: " + Str$(start_date)
+ " through " + Str$(end_date) + "."
End Sub
この例では、display_date_range プロシージャの 2 つのパラメータは、いずれも値により渡され
る日付パラメータです。したがって、Main プロシージャで次のような display_date_range を呼び
出すことができます。
Call display_date_range( "1/1", CurDate() )
ここでは、いずれのパラメータも日付変数である必要はありません。最初のパラメータ ("1/1") は
定数日付式、2 番目のパラメータは CurDate( ) 関数を呼び出すことで取得される日付式です。
プロシージャの再帰呼び出し
MapBasic 言語では、関数およびプロシージャの再帰呼び出しがサポートされています。つまり、
MapBasic プロシージャはそのプロシージャ自身を呼び出すことができます。
再帰プロシージャまたは関数呼び出しを発行するプログラムでは、メモリに制限が課されます。
プログラムが再帰呼び出しを行うたびに、MapInfo Professional はそのデータをスタック上に格納
しなければなりません。ネストされた再帰呼び出しがあまりにも多く実行されると、プログラム
にメモリ不足エラーが発生する可能性があります。再帰呼び出しが占有するメモリ容量は、プロ
シージャまたは関数に関連するパラメータおよびローカル変数の数によって異なります。
システム イベント ハンドラの役割を果たすプロシージャ
MapBasic には、特別な意味を持つプロシージャ名があります。たとえば、既に説明したように、
Main という名前のサブプロシージャは、アプリケーションを実行する度に MapBasic によって
Main プロシージャが自動的に呼び出されるという点で、特別です。
MapBasic には Main の他にも、EndHandler、ForegroundTaskSwitchHandler、
RemoteMapGenHandler、RemoteMsgHandler、RemoteQueryHandler、SelChangedHandler、
ToolHandler、WinChangedHandler、WinClosedHandler、WinFocusChangedHandler など、特
殊な名前を持つプロシージャがあります。これらの予約済みプロシージャ名は、どれも MapBasic の
プログラミングにおいて特殊な役割を果たします。各プロシージャの働きを十分に理解するには、
まず MapBasic におけるシステム イベントおよびイベント処理の手法を理解する必要があります。
MapBasic 11.0
67
ユーザーズ ガイド
第 4 章: MapBasic の基本
システム イベント ハンドラの役割を果たすプロシージャ
システム イベントとは
グラフィカル ユーザ インターフェイス環境においては、ユーザは入力操作やマウス操作を通じて
制御を行います。専門的には、ユーザによるマウスクリックやその他の操作は "システム イベント
" を生成すると言います。イベントには多くの種類があります。たとえば、ユーザがメニュー項目
を選択した場合は、ユーザがメニュー選択イベントを生成したと言います。ユーザがウィンドウ
を閉じた場合は、ユーザがウィンドウ クローズ イベントを生成したと言います。
イベント ハンドラとは
イベント ハンドラは、MapBasic プログラムの中においてシステム イベントに反応する部分で
す。ユーザが何らかのイベントを生成すると、アプリケーションはそれに対して適切に反応しな
ければなりません。たとえば、ユーザがメニュー選択イベントを生成したときに、ソフトウェア
でダイアログを表示する必要がある場合があります。また、ユーザがウィンドウクローズ イベン
トを生成した場合、ソフトウェアはメニュー項目をグレイ表示にするか、メニュー全体を非表示
にしなければならない場合もあります。
MapBasic では、サブプロシージャはイベント ハンドラとしての役割を果たすことができます。つ
まり、特定のシステム イベントが発生した場合にだけ MapBasic が対応するサブプロシージャを
自動的に呼び出すように、プログラムを構築することができます。
メニューまたはボタンパッドの選択に反応するイベント ハンドラを構築するには、「ユーザ イン
ターフェイスの作成」を参照してください。その他の種類のシステム イベント ハンドラを構築す
るには、まず特殊な名前を持つサブプロシージャを定義する必要があります。たとえば、ユーザ
がウィンドウを閉じるたびにプログラムが自動的に反応するようにするには、アプリケーション
の中に WinClosedHandler という名前のプロシージャを含める必要があります。
次の表に、MapBasic で使用されるすべての特殊ハンドラ名を示します。これらの特殊ハンドラの詳
細については、『MapBasic リファレンス ガイド』およびオンライン ヘルプを参照してください。
特殊ハンドラ名
ハンドラ プロシージャまたは関数の特徴
EndHandlerEndHandler
アプリケーションが終了するか、またはユーザが MapInfo
Professional を終了すると呼び出されます。EndHandler は、
クリーンアップ作業 (一時作業ファイルの削除など) の実行に
使用されます。
ForegroundTaskSwitchHandler
MapInfo Professional がフォーカスを得る (アクティブなアプ
リケーションとなる) か、またはフォーカスを失うと呼び出さ
れます。
RemoteMapGenHandler
OLE オートメーション クライアントが MapGenHandler メソッ
ドを呼び出したときに呼び出されます。主に MapInfo ProServer
アプリケーションで使用されます。
RemoteMsgHandler
アプリケーションがプロセス間通信 (DDE) のサーバの役割を
果たしているときに、リモート クライアントが実行リクエス
トを送信すると呼び出されます。
MapBasic 11.0
68
ユーザーズ ガイド
第 4 章: MapBasic の基本
システム イベント ハンドラの役割を果たすプロシージャ
特殊ハンドラ名
ハンドラ プロシージャまたは関数の特徴
RemoteQueryHandler
プロセス間通信 (DDE) でアプリケーションがサーバの役割を
果たしているときに、リモート クライアントが peek リクエス
トを送信すると呼び出されます。
SelChangedHandler
Selection テ ー ブ ル が 変 更 さ れ る た び に 呼 び 出 さ れ ま す。
Selection テーブルは頻繁に変更されるため、システムの処理
速度の低下を防ぐためにも、SelChangedHandler プロシー
ジャはできるだけ短くします。
ToolHandler
ユーザがマップ ウィンドウ、ブラウザ ウィンドウ、レイアウト
ウィンドウのいずれかで MapBasic ツールを使用してクリック
すると呼び出されます。
WinChangedHandler
ユーザがマップ ウィンドウに表示されたエリアを移動、スク
ロール、またはその他の操作を通じてリセットすると呼び出
されます。マップ ウィンドウは頻繁に変更されるため、シス
テムの処理速度の低下を防ぐためにも、WinChangedHandler
プロシージャはできるだけ短くします。
WinClosedHandler
ユーザがマップ ウィンドウ、ブラウザ ウィンドウ、グラフ
ウィンドウ、レイアウト ウィンドウのいずれかを閉じると呼び
出されます。
WinFocusChangedHandler
ウィンドウのフォーカスが変化される (例 : ユーザがアクティ
ブなウィンドウを変更する) と呼び出されます。
通常、上記の特殊プロシージャの呼び出しには Call 文を使用する必要はありません。プログラム
中にこれらの特殊名が付いたプロシージャが 1 つ以上含まれる場合、特定のシステム イベントが
発生した場合に限り、それに対応するプロシージャが "自動的に" 呼び出されます。たとえば、プ
ログラムに WinClosedHandler というプロシージャが含まれている場合、ユーザがウィンドウを
閉じる度に、自動的に WinClosedHandler プロシージャが呼び出されます。
特殊ハンドラ プロシージャはすべてオプションです。したがって、ウィンドウが閉じられるたび
にアプリケーションに通知されるようにするには、WinClosedHandler プロシージャのみをアプ
リケーションに含めます。同様に、選択内容が変更されるたびにアプリケーションに通知される
ようにするには、SelChangedHandler プロシージャのみをアプリケーションに含めます。
次のプログラムでは、ToolHandler という名前を持つ特殊イベント ハンドラ プロシージャを定義
しています。このプログラムには Call 文が含まれていないことに注意してください。このプログ
ラムが実行されると、ユーザが MapBasic ツールを選んでマップ ウィンドウ、ブラウザ ウィンド
ウ、レイアウト ウィンドウのいずれかをクリックした場合に限り、ToolHandler プロシージャが
自動的に呼び出されます。
MapBasic 11.0
69
ユーザーズ ガイド
第 4 章: MapBasic の基本
システム イベント ハンドラの役割を果たすプロシージャ
Include "mapbasic.def"
Declare Sub Main
Declare Sub ToolHandler
Sub Main
Note "The ToolHandler demonstration is now in place."
+ "Select the MapBasic tool (+) and click on a Map "
+ "to see a printout of map coordinates."
End Sub
Sub ToolHandler
If WindowInfo( FrontWindow(), WIN_INFO_TYPE ) = WIN_MAPPER Then
Print "X: " + Str$( CommandInfo(CMD_INFO_X) )
Print "Y: " + Str$( CommandInfo(CMD_INFO_Y) )
Print " "
End If
End Sub
システム イベント ハンドラ プロシージャの中で CommandInfo( ) 関数を呼び出すと、そのハンド
ラの呼び出し元のイベントについての詳細情報が得られます。上の例では、ToolHandler プロシー
ジャは CommandInfo( ) を呼び出して、ユーザがクリックした位置のマップ座標を判別します。
次のサンプル SelChangedHandler プロシージャは、TextBox (textbox.mb) サンプル プログラムで
使用されているものです。このプロシージャは、ユーザがすべての行の選択を解除すると自動的
にメニュー項目を選択不能 (グレイ表示) にし、ユーザが新しく行を選択するとメニュー項目を再
び選択可能にします。
詳細については、textbox.mb を参照してください。
Sub SelChangedHandler
If SelectionInfo(SEL_INFO_NROWS) < 1 Then
Alter Menu Item create_sub Disable
Else
Alter Menu Item create_sub Enable
End If
End Sub
システム イベント ハンドラが呼び出されるタイミング
デフォルトでは、Main プロシージャに含まれるすべての文が実行されると、MapBasic アプリケー
ションは終了します。ただし、アプリケーションに上記の特殊ハンドラ プロシージャが 1 つ以上含
まれる場合 (アプリケーションに ToolHandler プロシージャが含まれる場合など) 、そのアプリケー
ションは Main プロシージャの終了後も、引き続きメモリ内に留まります。このような状態のアプ
リケーションは、スリープ状態にあると言います。スリープ状態にあるアプリケーションは、該当
するイベントが発生する (例 : ユーザが MapBasic ツールを用いてクリックする) まで、メモリの中
で非アクティブな状態にあります。該当するイベントが発生すると、スリープ状態にあるアプリ
ケーションのハンドラ プロシージャが自動的に呼び出されます。
MapBasic 11.0
70
ユーザーズ ガイド
第 4 章: MapBasic の基本
ハンドラ プロシージャに関するヒント
L
アプリケーション中のいずれかのプロシージャによって End Program 文が発行されると、
そのアプリケーションに特殊ハンドラ プロシージャが含まれているかどうかに関係なく、
アプリケーション全体がメモリから削除されます。プログラムを使用可能にしておく間
は、End Program 文を使用しないよう注意する必要があります。
MapBasic のカスタム メニューも同様に動作します。MapBasic アプリケーションで MapInfo メ
ニュー定義に独自のメニュー項目を追加した場合、ユーザがいずれかのカスタム メニュー項目を選
択するまで、そのアプリケーションはスリープ状態となります。MapInfo Professional メニューの
カスタマイズ方法の詳細については、「ユーザ インターフェイスの作成」を参照してください。
ハンドラ プロシージャに関するヒント
ハンドラ プロシージャの簡略化
システム イベント ハンドラ プロシージャの中には、頻繁に呼び出されるものがあることに注意し
てください。たとえば、SelChangedHandler プロシージャを作成した場合、Selection テーブル
が変更されるたびにそのプロシージャが呼び出されます。一般的な MapInfo Professional セッショ
ンでは、Selection テーブルは頻繁に変更されるため、SelChangedHandler などのイベント ハン
ドラ プロシージャはできるだけ短くする必要があります。
SelChangedHandler の呼び出しの停止
Select 文を使用するときに SelChangedHandler プロシージャの呼び出しを行わない場合は、
キーワード NoSelect を含めます。次に例を示します。
Select * From World Into EarthQuery NoSelect
無限ループの回避
システム ハンドラ プロシージャの中で、無限ループが生じる場合があります。たとえば、
SelChangedHandler プロシージャを宣言すると、MapInfo Professional は選択内容が変更されるた
びにそのプロシージャを呼び出します。SelChangedHandler プロシージャの中で Select 文を発行
すると、その Select 文によって、再帰呼び出しの中でそのプロシージャが再び呼び出されます。こ
の結果、プログラムのメモリがなくなるまで呼び出しが継続するという無限ループが生じます。
Set Hanlder 文を使用すれば、この無限ループの発生を回避することができます。ハンドラ プロ
シージャの先頭で Set Hanlder...Off 文を発行すると、ハンドラの再帰呼び出しを回避できます。
プロシージャの最後に Set Hanlder...On 文を発行すると、ハンドラが回復されます。
Sub SelChangedHandler
Set Handler SelChangedHandler Off
’ Issuing a Select statement here
MapBasic 11.0
71
ユーザーズ ガイド
第 4 章: MapBasic の基本
ハンドラ プロシージャに関するヒント
’ will not cause an infinite loop.
Set Handler SelChangedHandler On
End Sub
カスタム関数
MapBasic 言語では、多種多様な関数がサポートされています。この中には標準 BASIC 関数 (例 :
Asc( )、Format$( )、Val( )) もあれば、MapInfo Professional および MapBasic に固有の関数 (例 :
Distance( )、ObjectGeography( )) もあります。また、MapBasic ではカスタム関数の定義も可能
です。カスタム関数を定義した後で、MapBasic の標準関数と同じようにその関数を呼び出すこと
ができます。
カスタム関数の本体は、Sub...End Sub 構造と非常によく似た構文を持つ Function...End Function
構造の中で定義します。Function...End Function 構造の一般構文は、次のとおりです。
Function function_name( parameters, if any ) As data_type
statement list
End Function
関数自体にもデータ タイプがあります。これによって、呼び出された関数が返す値のタイプ (例 :
整数、日付、文字列) が決定されます。
Function...End Function 構造の本体の中では、関数名は参照により渡されるパラメータの役割を
果たします。Function...End Function 構造に含まれる文では、関数名に値を割り当てることがで
きます。この値は、後に関数の呼び出し元に返されます。
次の例では、money_format( ) というカスタム関数を定義しています。この money_format( ) 関数
は、1 つの数値パラメータ (おそらく金額) を受け取り、コンマを使用してフォーマット化されたド
ル金額を表す文字列 (Format$( ) 関数の呼び出しによって取得) を返します。
Declare Sub Main
Declare Function money_format(ByVal num As Float) As String
Sub Main
Dim dollar_amount As String
dollar_amount = money_format( 1234567.89 )
’ dollar_amount now contains the string: "$1,234,567.89"
End Sub
Function money_format(ByVal num As Float) As String
money_format = Format$(num, "$,#.##;($,#.##)")
End Function
関数の範囲
プログラムでは、MapBasic の標準関数と同名のカスタム関数を定義することができます。プログ
ラムによってこの関数が呼び出されると、標準関数ではなくカスタム関数が実行されます。
MapBasic 11.0
72
ユーザーズ ガイド
第 4 章: MapBasic の基本
コンパイラ命令
コンパイラ命令
MapBasic には、大規模なアプリケーション開発の管理を容易にする 2 つの特殊な文が用意されて
います。
•
•
Define 文を使用すると、一定の定義を持つ略記識別子を定義できます。この定義は、コンパイ
ル時に識別子の代わりに使用されます。
Include 文を使用すると、2 つ以上のプログラム ファイルを 1 つのコンパイル可能なプログラ
ムに統合できます。
Define 文
Define 文を使用することで、略記識別子の役割を果たす識別子を定義し、特定の値を表すことが
できます。
Define 文は、覚えにくい式や入力しにくい式を頻繁に使用する場合に利用します。
たとえば、プログラムでさまざまなオブジェクトやオブジェクト色を扱う場合は、赤色を表す数
値コードである 16711680 という値を頻繁に入力しなければならない場合も考えられます。このよ
うな長い数字をすばやく入力するのは困難です。16711680 と入力する手間を省くには、次のよう
な Define 文をプログラムに追加します。
Define MY_COLOR 16711680
Define 文によって、16711680 という数字を表す覚えやすいキーワード (MY_COLOR) が作成され
ます。この Define 文を入力した後、本来は 16711680 と入力する箇所に MY_COLOR と入力するこ
とができます。プログラムをコンパイルすると、MY_COLOR が使用されている箇所に 16711680
という値が割り当てられます。
定 義 キ ー ワ ー ド を 使 っ た 方 が、長 期 的 に は 有 益 で あ る 場 合 が あ り ま す。た と え ば、識 別 子
MY_COLOR を頻繁に参照する大規模なアプリケーションを開発するとします。赤は適切な色では
ないと判断し、代わりに緑 (65280) を使用することにした場合は、 Define 文を以下のように変更す
るだけで、簡単に赤を緑に変更することができます。
Define MY_COLOR 65280
MapBasic 標準定義ファイルの mapbasic.def には、いくつかの一般色 (BLACK、WHITE、RED、
GREEN、BLUE、CYAN、MAGENTA、YELLOW) を表す文を含む多くの Define 文が含まれてい
ます。mapbasic.def をプログラムに統合するには、Include 文を使用します。
Include 文
Include 文を使用することで、2 つ以上のプログラム ファイルを 1 つの MapBasic アプリケーショ
ンに統合することができます。Include 文は、次のような構文を持っています。
Include "filename"
ここで、filename は MapBasic 文を含むテキスト ファイルの名前です。Include 文を含むプログ
ラムをコンパイルする際、統合されるテキストはコンパイルされるプログラムの一部と見なされ
ます。
MapBasic 11.0
73
ユーザーズ ガイド
第 4 章: MapBasic の基本
プログラム編成
多くの MapBasic アプリケーションでは、Include 文を使用して MapBasic 標準定義ファイルの
mapbasic.def が統合されます。
Include "mapbasic.def"
mapbasic.def に は、多 く の MapBasic 標 準 識 別 子 (TRUE、FALSE、RED、GREEN、BLUE、
TAB_INFO_NAME など) に対応する Define 文が用意されています。
指定するファイル名には、ディレクトリ パスを含めることができます。指定したファイル名にディ
レクトリ パスが含まれない場合は、MapBasic コンパイラによって現在の作業ディレクトリ内で
ファイルが検索されます。そのディレクトリ内でファイルが見つからない場合は、MapBasic がイ
ンストールされているディレクトリ内で検索されます。
MapBasic プログラムの開発を進めるにつれて、コードの特定のセクションを何度も使用している
ことに気が付くこともあるでしょう。1 つ以上のカスタム関数から成るライブラリを作成した場
合、開発する MapBasic プログラムすべてでこれらのカスタム関数を使用することを考える場合も
あります。このような場合は、それらのカスタム関数を個別のテキスト ファイルに分け、そのテ
キスト ファイルに functs.mb などの名前を付けます。そして次のような文を発行して、その関数
ライブラリを別のプログラムに統合します。
Include "functs.mb"
また Include 文を利用すれば、MapBasic テキスト エディタの持つメモリの制限を克服することも
できます。既に「開発環境の使用」で説明したように、各 MapBasic 編集ウィンドウにはメモリの
制限があり、プログラム ファイルが大きくなりすぎると、MapBasic 編集ウィンドウを使用して
ファイルに新しい文を追加することができなくなります。このような場合は、プログラムを 2 つ以
上の個別のプログラム ファイルに分割し、それらのファイルを Include 文を使用して統合します。
また、プロジェクト ファイルを使用して個別のモジュールを統合することもできます。詳細につい
ては、「開発環境の使用」を参照してください。
プログラム編成
MapBasic アプリケーションには、この章で説明したさまざまな種類の文のうち、1 つまたはすべ
て含めることができます。ただし、MapBasic プログラムの各部分は、一定の規則に従って配置す
る必要があります。たとえば、Global 文を Sub...End Sub 定義の中に置くことはできません。
以下に、さまざまなプログラム構成要素の一般的な配置を示します。
Global レベルの文はプログラムの先頭で使用します。
Include "mapbasic.def"
other Include statements
Type...End Type statements
Declare Sub statements
Declare Function statements
Define statements
Global statements
次に、Main プロシージャの定義が続きます。
MapBasic 11.0
74
ユーザーズ ガイド
第 4 章: MapBasic の基本
プログラム編成
Sub Main
Dim statements
...
End Sub
次に、その他のサブプロシージャの定義が続きます。
Sub ...
Dim statements
...
End Sub
次に、カスタム関数の定義が続きます。
Function ...
Dim statements
...
End Function
MapBasic 11.0
75
ユーザーズ ガイド
実行時エラーのデバッグ
およびトラップ
正しくコンパイルされたプログラムにも、実行時エラー (プログラムの実行時
に発生するエラー) が発生する可能性が残されています。たとえば、プログラ
ムで大型データベース ファイルを作成した場合、ディスクに空き容量がない
のにプログラムを実行すると、エラーが発生する可能性があります。
この章では、実行時エラーの処理方法について説明します。エラー処理は、ま
ずプログラムをデバッグしてエラーの発生箇所を検索し、次にそのエラーが繰
り返し発生しないようプログラムを修正するという 2 段階のプロセスから成り
ます。
このセクションの構成
Š
Š
Š
実行時エラー動作. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .77
MapBasic プログラムのデバッグ . . . . . . . . . . . . . . . . . . . . . . . . . . .77
エラー トラップ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79
5
第 5 章: 実行時エラーのデバッグ およびトラップ
実行時エラー動作
実行時エラー動作
プログラミング エラーには、大きく分けてコンパイル エラーと実行時エラーの 2 種類がありま
す。コンパイル エラーは、「開発環境の使用」で説明したように、プログラムを正常にコンパイ
ルするうえで妨げとなる構文エラーやタイプミスのことです。
実行時エラーは、ユーザが実際にアプリケーションを実行する際に発生します。実行時エラーが
発生する原因はさまざまですが、多くの場合は実行時の状況に関係しています。たとえば、次の
文は、正常にコンパイルされます。
Map From stats
しかし、"stats" という名前のテーブルがない場合、このプログラムでは実行時エラーが発生しま
す。実行時エラーが発生すると、MapInfo Professional によって MapBasic アプリケーションが停
止し、そのエラーを説明するダイアログ ボックスが表示されます。
エラー メッセージは、エラーが発生したプログラム ファイルの名前と、エラーを含む行の番号を
示します。上記の例では、プログラムの名前が map_it で、エラーを含む行番号は 16 です。行番
号により、プログラムのどの部分が実行時エラーの原因となったかを示しています。行番号を特
定できたら MapBasic 開発環境に戻り、[ジャンプ] コマンド ([検索] メニュー) を使用して、問題の
原因となった文を探します。
MapBasic プログラムのデバッグ
一部の実行時エラーは簡単に修正できます。たとえば、実行時エラーの原因が単純なタイプミス
である場合がそうです (上の例では、プログラマはおそらく STATS ではなく STATES というテー
ブル名を入力したかったものと思われます)。しかし一方で、特定が難しいエラーもあります。プ
ログラムのバグの検出と修正の作業を容易にするために、MapInfo Professional の MapBasic ウィ
ンドウから操作できるデバッグ ツール (Stop 文と Continue 文) が用意されています。
デバッグ プロセスの要点
プログラムの一部が正しく機能していない場合は、以下の手順に従って問題の発生箇所を特定で
きます。
1. MapBasic 開発環境でプログラムを編集し、プログラム内で正しく機能していないと思われる
箇所の直前に Stop 文を挿入する。
MapBasic 11.0
77
ユーザーズ ガイド
第 5 章: 実行時エラーのデバッグ およびトラップ
MapBasic プログラムのデバッグ
2. プログラムを再度コンパイルして実行する。
プログラムが Stop 文に達すると、プログラムの実行が一時的に停止し、MapBasic ウィンドウに
デバッグ メッセージが表示されます (例 : "ブレークポイント C:\Mapinfo\textbox.mb ライン 23")。
3. MapBasicウィンドウで、次の操作を行います。
「?Dim」と入力し、使用されているローカル変数をすべて表示します。
「?Global」と入力し、使用されているグローバル変数をすべて表示します。
「?variable_name 」を入力し、変数の現在の内容を表示します。
「?variable_name = new_value」を入力し、その変数の内容を変更します。
4. 変数の内容を確認および修正した後は、MapBasic ウィンドウに Continue と入力してプログラム
の実行を再開します。また、MapInfo Professional の [ファイル] メニューから [プログラムの続行]
コマンドを選択することもできます。プログラムが中断されている間は、[ファイル] メニューに
は [プログラムの実行」 コマンドではなく [プログラムの続行] コマンドが表示されます。
Stop 文に関する制限事項
次のような場合には、Stop 文によるプログラムの中断を実行できません。
•
カスタムの Function...End Function 構造の中で Stop 文を使用することはできません。
•
ダイアログ ボックス コントロール ハンドラがアクティブである間、画面上にダイアログ ボッ
クスが表示されるため、このハンドラの中では Stop 文を使用できません。
•
Stop 文は、ProgressBar ハンドラの中では使用できません。
•
•
あるプログラムが実行されている間は、別のプログラムをデバッグすることはできません。
Run Application 文を使用すると、MapBasic アプリケーションから別のアプリケーションを "
起動" できます。ただし、こうして起動されたアプリケーションは Stop 文を使用して実行を中
断することはできません。
MapBasic 11.0
78
ユーザーズ ガイド
第 5 章: 実行時エラーのデバッグ およびトラップ
エラー トラップ
Run Application 文を使用しなくても、別々の MapBasic プログラムを同時に実行することが
できます。たとえば、TextBox アプリケーションを実行すると、Text Box は独自のカスタム メ
ニューを作成した後、そのメニュー上の項目が選択されるまでスリープ状態となります。その
ため、TextBoxを読み込んだ後でも、別の MapBasic アプリケーションを実行することができ
ます。ただし、複数のアプリケーションが同時に実行されている間は、Stop 文を使用するこ
とはできません。
その他のデバッギング ツール
MapBasic の Note 文と Print 文も、プログラムのデバッグに役立ちます。たとえば、ある変数の
内容の変化を確認するには、プログラムに単純に Print 文を追加します。
Print "Current value of counter: " + counter
こうすることで、MapBasic のメッセージ ウィンドウにメッセージが出力されます。AppInfo.mbx
サンプル プログラムを使用すると、実行中のあらゆる MapBasic アプリケーションで使用されて
いるグローバル変数の値を確認することができます。
エラー トラップ
綿密に設計されたプログラムには、実行時エラーの発生を想定して可能な限りの予備対策が含ま
れています。実行時エラーを捕捉して処理する作業は、エラー トラップと呼ばれます。MapBasic
では、エラー トラップに OnError 文が使用されます。
経験豊富な BASIC プログラマも、MapBasic ではOnError が 1 つのキーワードとなっていること
に注意してください。
実行中、エラー トラップは有効と無効のいずれかの状態にあります。デフォルトでは、どのプロ
シージャと関数もトラップが無効な状態で開始されます。OnError 文により、エラー トラップを
有効にします。
通常、OnError では、同じプロシージャ内または関数内の別の場所に存在するラベルを指定しま
す。ラベルの後に続く文は、エラー トラップ ルーチンと呼ばれます。エラー トラップ ルーチン
が有効なときにエラーが発生すると、指定されたラベルにジャンプし、アプリケーションを停止
させる代わりにエラー トラップ ルーチンを実行します。
エラートラップルーチンの中では、Err( ) 関数を呼び出すことで発生エラーを示す整数コードを得
る こ と が で き ま す。同 様 に、Error$( ) はエラーメッセージを説明した文字列を返します。
MapBasic のエラー コードと各エラーの説明については、MapBasic に付属する erros.doc テキス
ト ファイルを参照してください。エラー トラップ ルーチンは、Resume 文で終了します。
Resume 文により、エラー トラップ ルーチン終了後にどの行へ移動するかを指定します。
エラー トラップの詳細については、『MapBasic リファレンス ガイド』の OnError、Resume、
Err()、および Error$() のセクションを参照してください。
L
MapBasic 11.0
MapBasicは、一度に 1 つのエラーしか処理できません。エラー トラップを有効にしている
ときにエラーが発生すると、MapBasic の処理はエラー処理ルーチンにジャンプします。エ
ラ ー 処 理 ル ー チ ン の 内 部 ( つまり Resume 文の前) で別のエラーが発生した場合、
MapBasic アプリケーションは停止します。
79
ユーザーズ ガイド
第 5 章: 実行時エラーのデバッグ およびトラップ
エラー トラップ
エラー トラップの例
次のプログラムでは、orders というテーブルが開かれてマップ ウィンドウとブラウザ ウィンドウ
に表示されます。ここでは、bad_openというエラートラップルーチンによって Open Table 文に
関するエラーが処理されます。第 2 のエラー トラップ ルーチンである not_mappable では、Map
文に関するエラーが処理されます。
Sub orders_setup
Åf At the start, error trapping is disabled
OnError Goto bad_open
Åf At this point, error trapping is enabled, with
Åf bad_open as the error-handling routine.
Open Table "orders.tab"
OnError Goto not_mappable
Åf At this point, error trapping is enabled, with
Åf not_mappable as the new error-handling routine.
Map From orders
OnError Goto 0
Browse * From orders
last_exit:
Exit Sub
Åf The Exit Sub prevents the program from
Åf unintentionally executing the error handlers.
bad_open:
Åf This routine called if Open statement had an error.
Note "CouldnÅft open the table Orders... Halting."
Resume last_exit
not_mappable:
Åf This routine called if the Map statement had an error
Note "No map data; data will only appear in Browser."
Resume Next
End Sub
OnError Goto bad_open 文により、エラー トラップを有効にします。Open Table 文が原因で
エラーが発生すると、bad-open ラベルで指定された場所にあるエラー トラップ ルーチンにジャン
プします。エラー トラップ ルーチンは、エラー メッセージを表示した後、last_exit ラベルで指定
される場所からの実行再開を指示する Resume 文を発行します。
Open Table 文に問題がなかった場合、このプログラムによって OnError Goto not_mappable
文が発行されます。この行では、Map 文でエラーが発生した場合に not_mappable にジャンプす
るように、エラー トラップをリセットします。not_mappable エラー トラップ ルーチンは、マッ
プ ウィンドウが表示されない理由をユーザに通知するメッセージを表示した後、Resume Next 文
を実行します。Resume Next 文では、エラーが発生した行をスキップして次の文から実行を再開
するよう指定しています。
OnError GoTo 0 文により、エラー トラップを無効にします。そのため、Browse 文が原因でエラー
が発生した場合には、そのエラーはトラップされず、プログラムによって実行が停止されます。
MapBasic 11.0
80
ユーザーズ ガイド
ユーザ インターフェイス
の作成
ユーザ インターフェイスは、どのアプリケーションにとっても重要な要素で
す。MapBasic には、MapInfo Professional ユーザ インターフェイスのカスタ
マイズに必要なあらゆるツールが用意されています。
このセクションの構成
Š
Š
Š
Š
Š
Š
Š
Š
Š
Š
MapBasic ユーザ インターフェイスの概要 . . . . . . . . . . . . . . . . . . .82
イベントドリブン プログラミング . . . . . . . . . . . . . . . . . . . . . . . . . .82
メニュー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84
標準ダイアログ ボックス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .94
カスタム ダイアログ ボックス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .96
ウィンドウ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .105
ボタンパッド ( ツールバー ). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .113
カーソル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .122
MapInfo Professional へのアプリケーションの統合 . . . . . . . . . . .122
ユーザ インターフェイスを効果的に使用するためのヒント. . . . . .124
6
第 6 章: ユーザ インターフェイスの作成
MapBasic ユーザ インターフェイスの概要
MapBasic ユーザ インターフェイスの概要
MapBasic プログラムを記述することで、MapInfo Professional のカスタム ユーザ インターフェイ
スを作成することができます。MapBasic プログラムでは、ユーザ インターフェイスの以下の要素
を操作できます。
•
•
メニュー : 既存メニューへのカスタム メニュー項目の追加、メニュー バーからのメニューの消
去、まったく新しいメニューの作成などを行えます。
ダイアログ ボックス : ユーザのニーズに応じたカスタム ダイアログ ボックスを表示できます。
•
ウィンドウ : MapInfo Professional の標準タイプのウィンドウ (例 : マップ ウィンドウ、ブラウ
ザ ウィンドウ) を表示したり、それらのウィンドウの内容をカスタマイズしたりできます。ま
た、MapBasic を使用して特殊なウィンドウ (メッセージ ウィンドウ) や MapInfo Professional
のステータス バーにメッセージを表示することもできます。
•
ボタンパッド (ツールバー) : 既存のボタンパッドにカスタム ボタンを追加したり、まったく新
しいボタンパッドを作成したりできます。MapInfo Professional には、MapBasic ユーティリ
ティを使用してカスタム ボタンを追加できる特殊なボタンパッドやツールが含まれています。
たとえば、ScaleBar アプリケーションでそのカスタム ボタンをツール パッドに追加できます。
サンプル アプリケーション OverView を通じて、MapBasic で作成されるカスタム インターフェイ
スに関する多くの側面を知ることができます。OverView を実行すると、[ツール] メニューにカス
タム項目が追加されます。ユーザが [Setup Overview] カスタム メニュー項目を選択すると、カス
タム ダイアログ ボックスが表示されます。このダイアログ ボックスからテーブルを選択すると、
新規マップ ウィンドウが開かれてそのテーブルが表示されます。
イベントドリブン プログラミング
MapBasic は、イベントドリブン プログラミングと呼ばれるプログラミング モデルに基づいてい
ます。MapBasic プログラムによるカスタム ユーザ インターフェイスの作成方法を理解するに
は、まずイベントドリブン プログラミングの基本原則を理解する必要があります。
イベントについて
グラフィカル ユーザ インターフェイス環境においては、ユーザは入力操作やマウス操作を通じて
制御を行います。専門的には、ユーザによるマウス クリックやその他の操作はイベントを生成す
ると言います。イベントには多くの種類があります。たとえば、ユーザがメニュー項目を選択し
た場合は、ユーザがメニュー選択イベントを生成したと言います。ユーザがウィンドウを閉じた
場合は、ユーザがウィンドウ クローズ イベントを生成したと言います。
ユーザによるメニュー イベントの生成
ユーザが何らかのイベントを生成すると、ソフトウェアはそれに対して適切に反応しなければな
りません。たとえば、ユーザがメニュー項目を選択すると、ソフトウェアはダイアログ ボックス
を表示したり、ユーザが選んだメニュー項目に応じてテーブルまたはウィンドウを開閉するな
ど、その他の操作を行う必要があります。一般に、ユーザがイベントを生成した場合は、ソフト
ウェアがそのイベントを処理すると言います。
MapBasic 11.0
82
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
イベントドリブン プログラミング
MapBasic アプリケーションでカスタム メニューを作成し、ユーザがそのメニューの項目を選ぶ
と、アプリケーションによってそのメニュー選択イベントの処理が実行されます。通常は、プロ
シージャの呼び出しによってイベントが処理されます。このような場合、そのプロシージャはイ
ベント ハンドラ (略してハンドラ) の役割を果たすと言います。
カスタム メニュー項目は、一般に次の 2 つのプロセスで作成します。
1. Create Menu または Alter Menu を使用して MapInfo Professional のメニュー構造をカスタマ
イズする。
2. 各カスタム メニュー項目のハンドラを指定する。ハンドラは、プログラムの別の場所に現われ
るサブプロシージャの場合もあります。まず、対応するメニュー項目 (複数の場合もある) に応
じて適切なタスクを実行するように、各ハンドラ プロシージャを設定します。あるいは、メ
ニュー項目のハンドラとしてプロシージャを指定するのではなく、そのメニュー項目が標準
MapInfo Professional コ マ ン ドを呼び出すように指定することもできます。したがって、
(MapInfo Professional の [マップ] メニューから) [主題図の作成] コマンドを呼び出すようなカス
タム メニュー項目を作成することができます。
開発環境の使用で説明したように、Call 文でサブプロシージャを呼び出すことができます。ただ
し、サブプロシージャがイベント ハンドラの役割を果たす場合、Call 文を発行してはいけません。
このような場合は、Call 文を発行する代わりに、Create Menu 文の中に Calling 節を記述します。
たとえば、TextBox アプリケーションでは、次のような Create Menu 文を発行します。
Create Menu "TextBox" As
"&Create Text Boxes..." Calling create_sub,
"Close TextBox" Calling Bye,
"About TextBox..." Calling About
この文は、それぞれ 1 つの Calling 節 (例 : Calling create_sub) を含むいくつかのメニュー項
目を持ったカスタム メニューを作成します。各 Calling 節は、TextBox.mb プログラムの他の場所
に現われるプロシージャの名前を指定します。したがって、create_sub、Bye、About は、いずれ
もサブプロシージャ名を表します。
[TextBox] メニューから [Create Text Boxes] を選択すると、create_sub プロシージャが自動的に呼
び出されます。このように、create_sub プロシージャはそのメニュー項目のハンドラとして機能
します。
プログラムによるボタンパッド イベントの処理
MapBasic のカスタム ボタンパッド上にある各ボタンは、それぞれ 1 つのハンドラ プロシージャ
を持っています。Create Menu 文と同様に、Create ButtonPad 文にはハンドラ プロシージャを
指定する Calling 節が含まれています。カスタム ボタンを使用すると、Create ButtonPad 文に指
定されたサブプロシージャが呼び出されます。
MapBasic では、さまざまなタイプのカスタム ボタンを作成できます。カスタム プッシュボタン
を使用すると、ユーザがボタンを選択した瞬間にそのボタンのハンドラが呼び出されます。カス
タム ツールボタンを使用すると、ユーザがツールを選択してウィンドウをクリックしない限り、
ボタンのハンドラは呼び出されません。詳細については、「ボタンパッド (ツールバー) (113 ペー
ジ)」を参照してください。
MapBasic 11.0
83
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
メニュー
プログラムによるダイアログ ボックス イベントの処理
カスタム MapBasic ダイアログ ボックスは、ハンドラ プロシージャを呼び出すことができます。
したがって、チェックボックスを含むカスタム ダイアログ ボックスを作成すると、MapBasic は
ユーザがチェックボックスをオンまたはオフにするたびにハンドラ プロシージャを呼び出すこと
ができます。ただし、アプリケーションによってはダイアログ ボックスにハンドラを作成する必
要がない場合もあります。カスタム ダイアログ ボックスの詳細については、「カスタム ダイアロ
グ ボックス (96 ページ)」を参照してください。
メニュー
メニューは、グラフィカル ユーザ インターフェイスの重要な要素です。したがって、MapBasic
言語は MapInfo Professional メニュー構造のあらゆる部分の制御を可能にします。2 ~ 3 行のコー
ドによって、MapInfo Professional のメニューまたはメニュー項目のそれぞれまたはすべてをカス
タマイズすることができます。
メニューの基本
MapInfo Professional のメニュー構造は、次の要素から成っています。
メニュー バーは、MapInfo Professional の作業エリアの一番上を横切る水平バーです。MapInfo
Professional のデフォルト メニュー バーには、[ファイル]、[編集]、[オブジェクト]、[検索] などの
メニューが表示されます。
メニューは、メニュー バーをクリックするとドロップ ダウンする縦長のコマンド リストです。た
とえば、大半のアプリケーションには [ファイル] メニューと [編集] メニューが含まれています。
メニュー項目は、メニュー上にある個々のコマンドを指します。たとえば、通常 [ファイル] メ
ニューには [開く]、[閉じる]、[保存]、[印刷] などのメニュー項目が含まれています。メニュー項目
はコマンドと呼ばれる場合もあります (例 : [ファイル] > [保存] コマンド)。
1
2
3
1 メニュー、 2 メニュー バー、 3 メニュー項目
MapBasic 11.0
84
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
メニュー
メニュー、メニュー バー、メニュー項目の概念は、相互に関連があります。各メニューは、一連
のメニュー項目から成ります。たとえば、[ファイル] メニューには [開く]、[閉じる]、[保存] などの
項目が含まれています。メニュー バーは、一連のメニューから成ります。
ユーザがメニュー項目を選択すると、何らかの操作が開始されます。メニュー項目ごとに、開始
される操作は異なります。ダイアログ ボックスを表示するメニュー項目もあれば、何らかの処理
が即座に実行されるメニュー項目もあります。
メニュー項目に関連した操作は、そのメニュー項目のハンドラと呼ばれます。メニュー項目ハン
ドラは、標準 MapInfo Professional コマンド コードまたはカスタム MapBasic サブプロシージャ名
のいずれかです。つまり、ユーザがあるメニュー項目を選択すると、MapInfo Professional によっ
て標準コマンド コードが実行されるか、アプリケーションからサブプロシージャを呼び出され
て、そのメニュー選択イベントが "処理" されます。
メニューへの新規項目の追加
1 つ以上のカスタム項目を既存メニューに追加するには、Alter Menu 文を使用します。
たとえば、次の文では、2 つのカスタム メニュー項目 (通年レポートと四半期レポート) を [検索]
メニューに追加します。
Alter Menu " 検索 " Add
" 通年レポート " Calling report_sub,
" 四半期レポート " Calling report_sub_q
Alter Menu 文は、各カスタム メニュー項目に対して Calling 節を指定します。この節は、ユーザ
がそのメニュー項目を選択すると実行される操作を指定します。ユーザが通年レポート項目を選
択すると、サブプロシージャ report_sub が呼び出されます。
ユーザが四半期レポート項目を選択すると、サブプロシージャ report_sub_q が呼び出されます。
これらのサブプロシージャ (report_sub と report_sub_q) は、同じ MapBasic アプリケーション内
で記述されなければなりません。
また、MapBasic サブプロシージャではなく、標準 MapInfo Professional コマンドを呼び出すよう
なカスタム メニュー項目を作成することもできます。定義ファイル menu.def には、メニュー
コードの定義の一覧 (例 : M_FILE_NEW、M_EDIT_UNDO) が含まれています。このファイルの各
定 義 は、標 準 MapInfo Professional メニュー コマンドのい ずれかに対応しています ( 例 :
M_EDIT_UNDO は、[編集] メニューの [元に戻す] コマンドに対応します)。あるメニュー項目の
Calling 節が menu.def のメニュー コードのいずれかを指定する場合、ユーザがそのメニュー項目
を選択すると、対応する MapInfo Professional コマンドが呼び出されます。
たとえば、次の文は "色分けされた地図" メニュー項目を定義します。ユーザが [色分けされた地図
] を選択すると、M_MAP_THEMATIC というコマンド コードが実行されます。つまり、ユーザが
そのメニュー項目を選択すると、[マップ] > [主題図の作成] コマンドを選択したときと同様に、[主
題図の作成] ダイアログ ボックスが表示されます。
Alter Menu " 検索 " Add
" 色分けされた地図 " Calling M_MAP_THEMATIC
MapBasic 11.0
85
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
メニュー
メニューからの項目の削除
アプリケーションを使用して個々のメニュー項目を削除することができます。次の文は、MapInfo
Professional の [テーブル] > [テーブル管理] メニューから [テーブルの削除] 項目を削除します。こ
こで、識別子 M_TABLE_DELETE がメニュー定義ファイル menu.def で定義されたコードである
点に注意してください。
Alter Menu " テーブル管理 " Remove M_TABLE_DELETE
メニューからいくつかの項目を削除するには、2 つの方法があります。1 つは削除したい項目をす
べてリストする Alter Menu…Remove 文を利用する方法、もう 1 つは希望する項目だけを含んだ
まったく新しいメニューを再定義する Create Menu… 文を利用する方法です。
たとえば、次の文は、3 項目だけ ([レイヤ管理]、[前回のビューを表示]、[オプション]) を含む [マッ
プ] メニューの簡略バージョンを作成します。
Create Menu " マップ " As
" レイヤ管理 " Calling M_MAP_LAYER_CONTROL,
" 前回のビューを表示 " Calling M_MAP_PREVIOUS,
" オプション " Calling M_MAP_OPTIONS
新規メニューの作成
まったく新しいメニューを作成するには、Create Menu 文を使用します。たとえば、サンプル ア
プリケーションの TextBox では、次のような Create Menu 文を発行します。
Create Menu "TextBox" As
"&Create Text Boxes..." Calling create_sub,
"(-",
"&About TextBox..." Calling About,
"E&xit TextBox" Calling Bye
Create Menu 文は、新しい "TextBox" メニューを作成します。ただし、作成されたメニューは自動
的には表示されません。新しいメニューを表示するには、別の操作が必要です。
TextBox メニューを表示するには、Alter Menu Bar 文を使用してそのメニューをメニュー バーに
追加します。
Alter Menu Bar Add "TextBox"
Alter Menu Bar Add 文を使用すると、メニューがメニュー バーの右端に追加されます。作成され
たメニューは、次のようになります。
実際には、メニューをメニュー バーに追加すると問題が発生する場合があります。メニュー バー
上のスペースには限りがあり、メニュー バーにメニューを追加するたびに、残りのスペースは少
なくなります。したがって、メニュー バー上のスペースを節約するため、TextBox アプリケー
MapBasic 11.0
86
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
メニュー
ションでは別の方法を用いてメニューを表示します。TextBox アプリケーションでは、メニューは
直接メニュー バーに追加されず、Alter Menu 文を通じて [ツール] メニュー上の階層サブメニュー
として追加されます。
Alter Menu " ツール " Add
"(-",
"TextBox" As "TextBox"
この文によって、TextBox メニューは [ツール] メニュー上の階層メニューとして表示されます。こ
の結果、[ツール] メニューは次のようになります。
MapInfo Professional に含まれる ScaleBar や OverView などのサンプル プログラムも、同様の規
則に基づいています (メニュー項目は [ツール] メニューの階層メニューとして表示されます)。その
ため、TextBox、ScaleBar、OverView の各アプリケーションを実行した場合、3 つのいずれのアプ
リケーションでも、コマンドは [ツール] メニューに追加されます。
各サンプル プログラム (ScaleBar など) でメニュー バーに直接メニューを追加すると、メニュー
バーはすぐに一杯になってしまいます。[ツール] メニュー (またはその他のメニュー) に階層メ
ニューを積み重ねると、メニュー バー上のスペースが節約できます。ただし、階層メニューを非
常に使いにくいと考えるユーザもいるので、注意してください。
メニューの設計および整理方法は、アプリケーションの性質によって変わります。アプリケー
ションに応じて、メニュー バーに 1 ~ 2 個、または数個のメニューを追加する必要があります。
メニューの追加先がメニュー バーと別のメニューのどちらであろうと、MapInfo Professional では
最 大 で 96 個 ま で し かメ ニ ュ ーを 定 義できません。つまり、MapInfo Professional では標準メ
ニューを含め、一度に 96 個を超えるメニューを定義することはできません。この制限は、表示し
ないメニューがある場合にも適用されます。
メニュー項目の変更
MapBasic 言語では、個々のメニュー項目に対する次の操作を行えます。
•
•
•
メニュー項目を選択不可能 (グレイ表示) にして、ユーザがそのメニュー項目を選択できないよ
うにする。
一度選択不可能にしたメニューを選択可能にする。
メニュー項目をチェックする (メニュー項目にチェックマークを追加する)。ただし、そのメニュー
項目は作成時に "チェック可能" として定義されていなければなりません。メニュー項目をチェック
可能として定義するには、メニュー項目名の最初の文字として、感嘆符を挿入します。詳細につい
ては、『MapBasic リファレンス ガイド』の Create Menu の項を参照してください。
MapBasic 11.0
87
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
メニュー
•
メニュー項目のチェックを解除する (チェックマークを消去する)。
•
メニュー項目名を変更し、メニュー上に表示されるテキストを変更する。
メニュー項目を変更するには、Alter Menu Item 文を使用します。Alter Menu Item 文には、いくつ
かのオプション節 (Enable、Disable、Check、UnCheck など) が含まれています。希望する変更内
容に応じて、適当な節を使用します。
サンプル プログラム OverView には、カスタム メニューを作成後に変更するプロセスが示されて
います。OverView アプリケーションでは、次のようなカスタム メニューを作成します。
Create Menu "OverView" As
"&Setup OverView" Calling OverView,
"(Suspend Tracking" Calling MenuToggler,
"(Pick Frame Style" Calling PickFrame,
"(-",
"Close Overview" Calling Bye,
"(-",
"About Overview..." Calling About
[Pick Frame Style] メニュー項目は、当初は選択不可能となっています (メニュー項目が "(" で始ま
る場合、そのメニュー項目は最初に表示されるときには自動的に選択不可能になっています。)
ユーザが OverView ウィンドウを設定すると、OverView アプリケーションは次の文を使用して
[Pick Frame Style] メニュー項目を選択可能にします。
Alter Menu Item PickFrame Enable
ユーザが OverView ウィンドウを閉じると、アプリケーションは次の文を使って再び [Pick Frame]
メニュー項目を選択不可能にします。
Alter Menu Item PickFrame Disable
PickFrame は、overview.mb の中にあるサブプロシージャの名前です。ここで、PickFrame は
Create Menu 文 (Calling 節の中) と Alter Menu Item 文の両方に含まれていることに注意してくだ
さい。Alter Menu Item 文を発行するときは、必ず変更するメニュー項目を指定しなければなりま
せん。プロシージャ名 (例 : PickFrame) が指定されると、MapInfo Professional はそのプロシー
ジャを呼び出すあらゆるメニュー項目を変更します。
同様に、[Suspend Tracking] メニュー項目を選択可能にするには、次の文を発行します。
Alter Menu Item MenuToggler Enable
また、Alter Menu Item を使ってメニュー項目の名前を変更することもできます。たとえば、
OverView アプリケーションには、当初は [Susend Tracking] と呼ばれるメニュー項目が含まれて
います。[Suspend Tracking] を選択すると、次の文が発行され、メニュー項目の名前が [Resume
Traking] に変更されます。
Alter Menu Item MenuToggler Text "Resume Tracking"
MapInfo Professional では、状況に応じて標準メニュー項目が自動的に選択可能または選択不可能
になります。たとえば、[ウィンドウ] > [マップ ウィンドウを表示] コマンドは、マップ作成可能な
テーブルが開いている場合に限り選択可能となります。MapInfo Professional では、その標準メ
ニュー項目は自動的に変更されるため、MapBasic アプリケーションを使用してこれらのメニュー
項目を選択可能または不可能にすることは避けてください。
MapBasic 11.0
88
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
メニュー
メニュー バーの再定義
メニュー バーからメニュー全体を削除するには、Alter Menu Bar 文を使用します。たとえば、次
の文を使用すると [検索] メニューが消去されます。
Alter Menu Bar Remove " 検索 "
また、Alter Menu Bar を使ってメニュー バーにメニューを追加することもできます。たとえば、
次の文は [マップ] メニューと [ブラウザ] メニューの "両方を" メニュー バーに追加します (デフォ
ルトでは、これらのメニューは絶対にメニュー バー上に同時に表示されないようになっていま
す。通常、[マップ] メニューはマップ ウィンドウがアクティブな場合に限り、[ブラウザ] メニュー
はブラウザ ウィンドウがアクティブな場合に限り表示されます)。
Alter Menu Bar Add " マップ ", " ブラウザ "
Alter Menu Bar Add 文を使用すると、メニューは常にメニュー バーの右端に追加されます。この
動作の欠点は、メニューが [ヘルプ] メニューの右隣りに追加される可能性があるということで
す。ソフトウェア パッケージの大半は、最後の 2 つのメニュー名が [ウィンドウ] と [ヘルプ] であ
るような構成になっています。したがって、カスタム メニューを [ウィンドウ] メニューの左に挿
入したいと考える場合もあるでしょう。次の文は、メニューを [ウィンドウ] メニューの左に挿入
します。
Alter Menu Bar Remove ID 6, ID 7
Alter Menu Bar Add " ツール ", ID 6, ID 7
最初の文は、[ウィンドウ] メニュー (ID 6) および [ヘルプ] メニュー (ID 7) をメニュー バーから削
除します。次の文は、[ツール]、[ウィンドウ]、[ヘルプ] の各メニューをメニュー バーに追加しま
す。これにより、[ツール] メニューは [ウィンドウ] メニューの左側に置かれます。
メニューの順序を自由に操作する場合は、Create Menu Bar 文を使用します。たとえば、次の文
はメニュー バーを再定義して、[ファイル]、[編集]、[マップ]、[検索]、[ヘルプ] の各メニューを (こ
の順序で) 含めます。
Create Menu Bar As " ファイル ", " 編集 ", " マップ ", " 検索 ", " ヘルプ "
MapInfo Professional の標準メニュー名 ([ファイル]、[検索] など) のリストについては、『MapBasic
リファレンス ガイド』またはオンライン ヘルプの Alter Menu の項を参照してください。MapInfo
Professional の標準メニュー定義に戻すには、Create Menu Bar As Default 文を発行します。
言語独立メニュー参照の指定
前述の例の大半は、メニューを名前 (例 : "ファイル") で参照しています。これとは別の構文を使用
して MapInfo Professional の標準メニューを参照することも可能です。これは、標準メニューを
ID 番号で指定するという方法です。たとえば、[ファイル] メニューが "ファイル" と参照されてい
るメニュー関連文では、そのメニューを ID 1 と参照することができます。次の文は、[検索] メ
ニュー (ID 番号は 3) をメニュー バーから削除します。
Alter Menu Bar Remove ID 3
MapBasic 11.0
89
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
メニュー
皆さんのアプリケーションが 2 ケ国以上で使用される場合は、メニューを名前ではなく ID 番号で
指定するべきでしょう。MapInfo Professional ソフトウェアが日本以外の国で翻訳されると、メ
ニューの名前は変更されます。アプリケーションで "ファイル" メニューを変更しようとしても、
そのアプリケーションが非日本語バージョンの MapInfo Professional で実行されている場合、エ
ラーが生じる可能性があります (非日本語バージョンの MapInfo Professional では、"ファイル" が
メニュー名と一致するとは限りません)。MapInfo Professional の標準メニューに対応する ID 番号
のリストについては、『MapBasic リファレンス ガイド』またはオンライン ヘルプの Alter Menu
の項を参照してください。
MapInfo Professional のショートカット メニューのカスタマイズ
MapInfo Professional にはショートカット メニューが用意されています。ユーザが右マウス ボタ
ンをクリックすると、これらのメニューが表示されます。ショートカット メニューを操作するに
は、通常のメニューの操作と同じ文、つまり Alter Menu、Alter Menu Item、Create Menu を使
用します。
各ショートカット メニューには一意の名前と ID 番号があります。たとえば、マップ ウィンドウ
を右クリックすると現われるショートカット メニューは "マップショートカット" と呼ばれ、ID 番
号は 17 です。ショートカット メニューの名前および ID 番号のリストについては、『MapBasic リ
ファレンス ガイド』またはオンライン ヘルプの Alter Menu の項を参照してください。
ショートカット メニューを削除するには、Create Menu 文を使用してメニューを再定義し、新し
いメニュー定義として "(-" の制御コードを指定します。次に例を示します。
Create Menu "MapperShortcut" ID 17 As "(-"
複数メニュー項目への同一ハンドラ プロシージャの割り当て
Create Menu 文と Alter Menu 文では、作成した個々のカスタム メニューに固有の ID 番号を割り
当てるオプション ID 節を指定できます。メニュー項目 ID はオプションです。ただし、同じハン
ドラ プロシージャを呼び出す複数のメニュー項目を作成する場合は、それぞれのカスタム メ
ニュー項目に一意の ID 番号を割り当てることをお勧めします。
複数のメニュー項目が同一ハンドラ プロシージャを呼び出す場合、一般にそのハンドラ プロシー
ジャはユーザの選択した項目を特定する CommandInfo( ) を呼び出します。たとえば、次の文は、
同一ハンドラを呼び出す 2 つのカスタム メニュー項目を作成します。
Alter Menu " 検索 " Add
" 通年レポート " ID 201 Calling report_sub,
" 四半期レポート " ID 202 Calling report_sub
ここでは、どちらのメニュー項目も report_sub プロシージャを呼び出します。しかし、各メ
ニュー項目が固有の ID 番号を持っているため、ハンドラ プロシージャは CommandInfo( ) を呼び
出してユーザがどちらのメニュー項目を選んだかを決定し、適切な対応を行います。
Sub report_sub
If CommandInfo(CMD_INFO_MENUITEM) = 201 Then
’
MapBasic 11.0
90
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
メニュー
’ ... then the user chose Annual Report...
’
ElseIf CommandInfo(CMD_INFO_MENUITEM) = 202 Then
’
’ ... then the user chose Quarterly Report...
’
End If
End Sub
また、メニュー項目 ID はメニュー項目の変更操作の幅も広げます。Alter Menu Item 文がハンド
ラ プロシージャの名前によってメニューを指定すると、そのプロシージャを呼び出す "すべて" の
メニューが変更されます。このため、次の文は上で定義されたカスタム メニュー項目の両方を (実
際の意図にかかわらず) 選択不可能にします。
Alter Menu Item report_sub Disable
アプリケーションの性質にもよりますが、メニュー項目の 1 つだけを変更したい場合もありま
す。次の文は、[通年レポート] メニュー項目のみを選択不可能にし、他のメニュー項目には何の影
響も与えません。
Alter Menu Item ID 201 Disable
メニュー項目 ID 番号には、任意の正の整数値を使用できます。
メニュー選択のシミュレーション
ユーザがそのメニュー項目を選択したときと同じように MapInfo Professional コマンドを動作させ
るには、Run Menu Command 文を使用します。たとえば、次の文はユーザが [ファイル] > [テーブ
ルを開く] を選択したときと同じように、MapInfo Professional の [テーブルを開く] ダイアログ ボッ
クスを表示します。
Run Menu Command M_FILE_OPEN
M_FILE_OPEN コードは、menu.def に定義されています。
ショートカット キーとホット キーの定義
ショートカット キーは、ユーザがメニューまたはメニュー項目にマウスを使用せずにキーボード
から直接アクセスできるようにする、いくつかのキー操作の組み合わせです。通常、ショート
カット キーは、Alt キーを押したときに、メニューまたはメニュー項目の名前の中の下線文字に
よって表されます。たとえば、Windows では、MapInfo Professional の [ファイル] メニューを表示
するショートカット キー操作は、Alt-F となります (Alt キーを押したときに下線文字付きで F と表
示される)。メニュー項目にショートカット キーを割り当てるには、ショートカット キーとして定
義する文字の直前にアンパサンド (&) を挿入します。
次のプログラム例では、MapBasic for Windows プログラムで ([Create Text Box] の中の) "C" キーを
ショートカット キーとして定義する方法を示します。
Create Menu "TextBox" As
"&Create Text Boxes..." Calling create_sub,
...
MapBasic 11.0
91
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
メニュー
ホット キーは、ユーザがメニューを稼働させることなくメニュー コマンドを実行できるようにす
るキー操作の組み合わせです。キーボードを使用してメニュー構造上を移動するショートカット
キーとは異なり、ホット キーを使用すればメニュー操作を完全に省くことができます。次のプロ
グラム例では、ホット キーの組み合わせ Ctrl-Z をカスタム メニュー項目に追加します。
Alter Menu " 検索 " Add
"New Report" + Chr$(9) + "CTRL-Z/W^%122" Calling new_sub
+ Chr$(9) という命令は、タブ キャラクタを挿入するよう MapBasic に指示します。タブ文字は、
そのメニューのホット キーをすべて揃えて表示するためのフォーマット化に使われます。
メニュー上に CTRL-Z というテキストが表示されるため、ユーザはそのメニュー項目がホット
キーを持つことがわかります。
/w^%122 という 命令は、ホッ ト キーを Ctrl-Z と定義します。コード /w^%122 は、MapInfo
Professional が認識可能なホット キー コードです。/w は、そのコードが MapInfo Professional for
Windows のものであることを指定し、カレット (^) はユーザが Ctrl キーを押し続ける必要があること
を指定します。さらに、%122 は "z" という文字を指定します (122 は、z を表す ASCII 文字コード)。
Alter Menu " 検索 " Add
"New Report /Mz" Calling new_sub
/Mz は、ホット キーを Command-Z として定義する命令です。
メニューのホット キー操作に使用されるコードのリストについては、『MapBasic リファレンス ガ
イド』またはオンライン ヘルプの Create Menu の項を参照してください。
MapInfo Professional メニュー ファイルを介したメニュー操作
MapInfo Professional のデフォルト メニュー構造は、MapInfo Professional メニュー ファイルに
よって制御されます。メニュー ファイルを変更すると、MapInfo Professional のメニュー構造をカ
スタマイズすることができます。
MapInfo Professional では、このメニュー ファイルの名前は MAPINFOW.MNU となります。
これらのメニュー ファイルはテキスト ファイルであるため、あらゆるテキスト エディタを使用し
て表示することができます。メニュー ファイルの内容は、MapBasic プログラムに非常によく似て
います。メニュー ファイルのメニュー定義を変更すると、次に MapInfo Professional を実行した
ときにはメニュー表示が変化しています。つまり、メニュー ファイルを変更することで、コンパ
イル済み MapBasic アプリケーションを使用することなく Mapinfo のメニュー構造をカスタマイズ
できるのです。
警告 :
メニュー ファイルを変更するときは、必ずあらかじめファイルのバックアップを作
成してください。メニュー ファイルが破損したり、破棄されたりすると、(バック
アップ ファイルからメニュー ファイルを復元できない限り) MapInfo Professional
を実行できなくなります。メニュー ファイルが破損した場合、バックアップ ファイ
ルからファイルを復元できなければ、MapInfo Professional を再度インストールし
なければなりません。
メニュー ファイルには、いくつかの Create Menu 文が含まれています。これらの文は、MapInfo
Professional の標準メニュー定義 ([ファイル]、[編集] など) を定義します。メニューから 1 つ以上
メニュー項目を削除する場合は、該当する Create Menu 文から適切な行を削除します。
MapBasic 11.0
92
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
メニュー
たとえば、次に示すように、MapInfo Professional の [テーブル] > [テーブル管理] メニューには、
通常 [テーブルの削除] コマンドが含まれています。
メニュー ファイルを確認すると、[テーブル管理] メニューは次のような Create Menu 文によって
定義されていることがわかります。
Create Menu " テーブル管理 \(&M\)" As
" テーブル定義 \(&T\)..."
HelpMsg "Modify the table structure."
calling 404,
" テーブルの削除 \(&D\)..."
HelpMsg "Delete a table and its component files."
calling 409,
" テーブル名の変更 \(&R\)..."
HelpMsg "Rename a table and its component files."
calling 410,
" テーブルの圧縮 \(&P\)..."
HelpMsg "Compress tables to conserve space
and eliminate deleted records."
calling 403,
...
「テーブルの削除」コマンドの使用には潜在的に危険が伴うため、「テーブル管理」メニューを
再定義して「テーブルの削除」を削除したい場合もあります。[テーブルの削除] コマンドをメ
ニューから削除するには、適切な行 ("テーブルの削除\(&D\)..." から Calling 409 まで) をメ
ニュー ファイルから削除します。変更後の Create Menu 文は、次のようになります。
Create Menu " テーブル管理 \(&M\)" As
" テーブル定義 \(&T\)..."
HelpMsg "Modify the table structure."
calling 404,
" テーブル名の変更 \(&R\)..."
HelpMsg "Rename a table and its component files."
calling 410,
" テーブルの圧縮 \(&P\)..."
HelpMsg "Compress tables to conserve space
and eliminate deleted records."
calling 403,
...
次に MapInfo Professional を実行すると、[テーブル] > [テーブル管理] メニューからは [テーブルの
削除] が消えています。
MapBasic 11.0
93
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
標準ダイアログ ボックス
同様に、MapInfo Professional のメニュー バーからメニュー全体を削除するには、メニュー
ファイルの中にある Create Menu Bar 文を編集します。
MapInfo Professional がネットワーク上にインストールされている場合に、MapInfo Professional
がインストールされたディレクトリの中にあるメニュー ファイルを変更すると、その変更内容
はネットワーク上のすべての MapInfo Professional ユーザに影響を与えます。ときには、異なる
ネットワーク ユーザに対して異なるメニュー構造を作成したい場合もあります。たとえば、大
半のユーザが利用するようなメニューからは [テーブルの削除] コマンドを削除し、ネットワーク
システム管理者は引き続きこのコマンドが使用できるようにしたいと考えるかもしれません。
個々のユーザにカスタム メニュー構造を割り当てるには、そのユーザの "ホーム" ディレクト
リの中にメニュー ファイルのカスタム バージョンを置きます。Windows ユーザのホーム ディ
レクトリは、そのユーザのプライベート Windows ディレクトリ (WIN.INI を含むディレクトリ)
として定義されています。
個々のユーザにカスタム メニュー構造を割り当てるには、そのユーザの "ホーム" ディレクト
リ/フォルダの中にメニュー ファイルのカスタム バージョンを置きます。メニュー ファイルは
System ディレクトリに直接置くことも、System ディレクトリの Preferences ディレクトリに
置くこともできます。
MapInfo Professional を実行すると、メニュー ファイルのコピーがユーザのホーム ディレクトリ
内にあるかどうかがチェックされます。ユーザのホーム ディレクトリ内にメニュー ファイルの
コピーがあれば、そのメニューが読み込まれます。メニュー ファイルがないと、MapInfo
Professional がインストールされているディレクトリからメニュー ファイルが読み込まれます。
したがって、ユーザに応じて 2 つの異なるバージョンのメニュー構造を表示する場合は、まず
メニュー ファイルの異なる 2 つのバージョンを作成します。そして、大半のユーザが使用する
バージョンを MapInfo Professional がインストールされているディレクトリに、 指定ユーザが
使用するバージョンを個々のユーザのホーム ディレクトリの中に置きます。
標準ダイアログ ボックス
ダイアログ ボックスは、ユーザ インターフェイスの重要な要素です。MapBasic には、アプリケー
ションのダイアログ ボックス作成を助けるいくつかの異なる文および関数が用意されています。
メッセージの表示
メッセージと [OK] ボタンから成るシンプルなダイアログ ボックスを表示するには、Note 文を使
用します。
MapBasic 11.0
94
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
標準ダイアログ ボックス
はい/いいえの質問
プロンプトと 2 つのボタンから成るダイアログ ボックスを表示するには、Ask( ) 関数を使用しま
す。2 つのボタンには通常 [OK] および [キャンセル] と表示されますが、アプリケーションに応じ
てボタンをカスタマイズすることも可能です。ユーザが [OK] ボタンを選択すると TRUE が、それ
以外の場合は FALSE が返されます。
ファイルの選択
標準の [ファイルを開く] ダイアログ ボックスを表示するには、FileOpenDlg( ) 関数を呼び出しま
す。この関数は、ユーザがファイルを選択すると、そのファイルの名前を返します。ユーザがダ
イアログ ボックスをキャンセルすると、空の文字列を返します。
FileOpenDlg( ) 関数は次のようなダイアログ ボックスを表示します。
FileSaveAsDlg( ) 関数は、標準のファイル保存ダイアログ ボックスを表示し、ユーザが入力した
ファイルの名前を返します。
MapBasic 11.0
95
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
カスタム ダイアログ ボックス
処理状況の表示
進捗バーと [キャンセル] ボタンから成る処理状況ダイアログ ボックスを表示するには、ProgressBar
文を使用します。
テーブルの行の表示
MapInfo Professional には、テーブルの行を表示する標準ダイアログ ボックスは用意されていませ
ん。ただし、MapInfo Professional の情報ウィンドウを使用すれば行を表示することができます。
情報ウィンドウの操作方法については、「情報ウィンドウのカスタマイズ (111 ページ)」を参照し
てください。
前述の文および関数の詳細については、『MapBasic リファレンス ガイド』を参照してください。
前述のいずれの文を使用しても目的が果たせない場合は、次のセクションで説明するように、
Dialog 文を使用してカスタム ダイアログ ボックスを作成してください。
カスタム ダイアログ ボックス
Dialog 文を使用して、カスタム ダイアログ ボックスを作成することができます。Dialog 文を発
行すると、ダイアログ ボックスが表示され、ユーザがダイアログ操作できるようになります。
ユーザがダイアログ ボックスを消去する (例 : [OK] ボタンまたは [キャンセル] ボタンをクリックす
る) と、Dialog 文に続く文が実行されます。Dialog 文の後に、CommandInfo( ) 関数を呼び出す
ことにより、ユーザが [OK] と [キャンセル] のどちらを選んだのかを調べることができます。
ダイアログ ボックス上に表示されるものは、すべて "コントロール" と呼ばれます。たとえば、[OK]
ボタンもコントロールであれば、[キャンセル] ボタンもまたコントロールです。ダイアログ ボック
スにコントロールを追加するには、Dialog 文の中に Control 節を挿入します。たとえば、次の文
は、ラベル (StaticText コントロールと呼ばれます)、ユーザが入力できるボックス (EditText コント
ロール)、[OK] プッシュボタン (OKButton コントロール)、および [キャンセル] プッシュボタン
(CancelButton コントロール) の 4 つのコントロールから成るダイアログ ボックスを作成します。
Dim s_searchfor As String
Dialog
Title "Search"
MapBasic 11.0
96
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
カスタム ダイアログ ボックス
Control StaticText
Title "Enter string to find:"
Control EditText
Into s_searchfor
Control OKButton
Control CancelButton
If CommandInfo(CMD_INFO_DLG_OK) Then
’
’ ... then the user clicked OK -- in which case,
’ the String variable: s_searchfor will contain
’ the value entered by the user.
’
End If
この Dialog 文は、次のようなダイアログ ボックスを作成します。
コントロールのサイズおよび位置
ダイアログ ボックス コントロールのサイズを変更する場合は、オプションの Width 節と Height
節を Control 節の中に含めます。ダイアログ ボックス コントロールの位置を変更する場合は、オ
プションの Position 節を含めます。
たとえば、上記のダイアログ ボックスのデフォルトのボタン位置が気に入らないこともあります。
ボタン位置を操作するには、次に示すように Position 節を追加します。
Dialog
Title "Search"
Control StaticText
Title "Enter string to find:"
Control EditText
Into s_searchfor
Control OKButton
Title "Search"
Position 30, 30
Control CancelButton
Position 90, 30
2 つの Control 節に Position 節が含まれたため、ダイアログの表示は次のように変化します。
MapBasic 11.0
97
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
カスタム ダイアログ ボックス
コントロールの位置とサイズは、"ダイアログ ボックス単位" で表されます。1 ダイアログ単位
は、文字の幅の 4 分の 1、または高さの 8 分の 1 に相当します。ダイアログ ボックスの左上隅の
位置が 0, 0 となります。次の Position 節は、ダイアログ ボックスの左端から 5 文字、上端から 2
文字の位置を指定します。
Position 20, 16
1 ダイアログ ボックス単位はキャラクタの幅の 4 分の 1 の長さを示すため、水平位置を示す 20 は、
右へ 5 キャラクタ入った位置を示します。同様に、1 ダイアログ ボックス単位は文字の高さの 8 分
の 1 の長さに相当するため、垂直位置を示す 16 は、2 文字分下がった位置を示します。
Position 節は、ダイアログ ボックス中のすべてのコントロールに含めることができます。また、
Width 節および Height 節を指定してコントロールのサイズをカスタマイズすることもできます。
コントロール タイプ
前のセクションの例には、4 種類のコントロール (StaticText、EditText、OKButton、CancelButton)
が含まれていました。次の図は、MapBasic のダイアログ ボックス コントロールのタイプを示し
たものです。
1
8
2
3
9
10
4
5
11
6
12
7
1 StaticText ボックス 2 GroupBox 3 RadioGroup 4 ListBox 5 PopupMenu 6 Button
7 OKButton 8 EditText ボックス 9 Picker (SymbolPicker) 10 MultiListBox 11 Checkbox
12 CancelButton
StaticText
StaticText は、ダイアログ ボックスにラベルを表示する非対話型コントロールです。次に例を示し
ます。
Control StaticText
Title "Enter map title:"
Position 5, 10
MapBasic 11.0
98
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
カスタム ダイアログ ボックス
EditText
EditText コントロールは、ユーザが入力できるボックス エリアです。次に例を示します。
Control EditText
Value "New Franchises, FY 95"
Into s_title
ID 1
Position 65, 8 Width 90
GroupBox
GroupBox コントロールは、左上隅にラベルが付いた長方形のエリアです。GroupBox は、他のダ
イアログ ボックス コントロールが関連していることを示す視覚的な効果を与えるために使用しま
す。次に例を示します。
Control GroupBox
Title "Level of Detail"
Position 5, 30 Width 70 Height 40
RadioGroup
RadioGroup コントロールは、一組の "ラジオ ボタン" (MapBasic がユーザに一度に 1 つだけ選択
することを許可するボタンのリスト) です。次に例を示します。
Control RadioGroup
Title "&Full Details;&Partial Details"
Value 2
Into i_details
ID 2
Position 12, 42 Width 60
Picker
Picker コントロールには、PenPicker、BrushPicker、FontPicker、SymbolPicker の 4 つのタイプ
があります。それぞれの Picker コントロールは、ユーザによる図形スタイル (ライン、フィル、
フ ォ ン ト、ま た は シ ン ボ ル) の 選 択を可能にします。上記の図には、菱形のシンボルを示す
SymbolPicker コントロールが含まれています。次に例を示します。
Control SymbolPicker
Position 95, 45
Into sym_variable ID 3
ListBox
ListBox コントロールは、ユーザが 1 つの項目を選択できるスクロール可能なリストです。項目が
多すぎて一度に表示しきれない場合、自動的に ListBox の右端に垂直のスクロール バーが追加さ
れます。次に例を示します。
Control ListBox
Title "First Qrtr;2nd Qrtr;3rd Qrtr;4th Qrtr"
Value 4
Into i_quarter
ID 4
Position 5, 90 Width 65 Height 35
MapBasic 11.0
99
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
カスタム ダイアログ ボックス
MultiListBox
MultiListBox は ListBox に似ていますが、ユーザが Shift キーまたは Ctrl キーを押しながら複数の項
目を選択できるという点が異なります。次に例を示します。
Control MultiListBox
Title "Streets;Highways;Towns;Counties;States"
Value 3
ID 5
Position 95, 90 Width 65 Height 35
PopupMenu
PopupMenu は、右端に下向きの矢印が付いたテキスト項目です。ユーザがこのコントロールをク
リックすると、メニューがポップアップ表示されて選択できるようになります。次に例を示します。
Control PopupMenu
Title "Town;County;Territory;Entire state"
Value 2
Into i_scope
ID 6
Position 5, 140
CheckBox
CheckBox は、ボックスの付いたラベルです。ユーザはコントロールをクリックすることで、この
ボックスをオンまたはオフにすることができます。次に例を示します。
Control CheckBox
Title "Include &Legend"
Into l_showlegend
ID 7
Position 95, 140
Buttons
Button コントロールは最も一般的に使用されるコントロールで、ほとんどのダイアログ ボックス
には 1 つ以上のボタンが含まれています。MapBasic には、[OK] ボタンと [キャンセル] ボタンをそ
れぞれ作成する OKButton と CancelButton という特殊なタイプのコントロールがあります。
Control Button
Title "&Reset"
Calling reset_sub
Position 10, 165
Control OKButton
Position 65, 165
Calling ok_sub
Control CancelButton
Position 120, 165
MapBasic 11.0
100
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
カスタム ダイアログ ボックス
1 つのダイアログ ボックスに、OKButton コントロールまたは CancelButton コントロールを複
数含めることはできません。いずれのコントロールもオプションですが、 一般に、ユーザにダイ
アログ ボックスの消去手段を提供するため、各ダイアログ ボックスには [OK] ボタンまたは [キャ
ンセル] ボタンのいずれかまたは両方を含めることをお勧めします。一方のコントロールがハンド
ラを持っている場合、MapBasic はそのハンドラ プロシージャを実行した後、Dialog 文に続く文
から実行を再開します。
各タイプのコントロールの詳細については、『MapBasic リファレンス ガイド』およびオンライン
ヘルプを参照してください。 たとえば、ListBox コントロールについて調べる場合は、Control
Listbox の項を参照してください。
コントロールの初期値の指定
ほとんどのコントロール タイプには、オプションの Value 節が含まれています。この節は、ダイ
アログ ボックスが最初に表示されたときのコントロールの設定に使用されます。たとえば、ダイ
アログ ボックスが最初に表示されたときに ListBox コントロール上の 4 番目の項目が選択されて
いるようにするには、ListBox 節に Value 節を追加します。
Value 4
Value 節を省略した場合は、デフォルト値が使用されます。たとえば、CheckBox コントロール
はデフォルトではオンになります。Value 節の設定の詳細については、『MapBasic リファレンス
ガイド』の適切な Control (例 : Control CheckBox) の説明を参照してください。
コントロールの最終値の読み取り
ほとんどのコントロール タイプでは、オプションの Into 節が使用できます。この節は、プログラ
ム変数をコントロールに関連付けることによって、MapInfo Professional がダイアログ ボックス
データをその変数に格納できるようにします。Into 節を使用してコントロールを作成した場合、
ユーザが [OK] ボタンをクリックしてダイアログ ボックスを閉じると、MapInfo Professional はコ
ントロールの最終値を変数に格納します。
Into 節には、プログラムの中にあるローカル変数またはグローバル変数の名前を指定しなければ
なりません。また、指定した変数はそのコントロール タイプに対して適当なものでなければなり
ません。たとえば、CheckBox コントロールの変数は、論理変数でなければなりません (TRUE は
チェックされていること、FALSE はクリアされていることを示します)。各コントロールに対応す
る変数タイプの詳細については、『MapBasic リファレンス ガイド』を参照してください。
L
MapBasic 11.0
MapInfo Professional は、ユーザが [OK] をクリックしてダイアログを終了した場合に限り、
ダイアログ終了後に Into 変数を更新します。ダイアログ ボックス ハンドラ プロシージャの
中からコントロール値を読み取る必要がある場合は、ReadControlValue( ) 関数を呼び出し
ます。
101
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
カスタム ダイアログ ボックス
ハンドラ プロシージャ呼び出しによるユーザ操作への応答
ほとんどのコントロール タイプは、ハンドラを持つことができます。ハンドラは、ユーザがその
コントロールをクリックした場合に限り MapBasic が自動的に呼び出すサブプロシージャです。オ
プションの Calling handler 節では、コントロールのハンドラを指定します。ここで、handler はパ
ラメータを取らないサブプロシージャの名前でなければなりません。ハンドラ プロシージャを持
つコントロールをクリックすると、そのプロシージャが呼び出されます。プロシージャの実行が
完了すると、ユーザは再びダイアログ ボックス操作を続行することができます (ダイアログ ボッ
クスを自動的に閉じる OKButton コントロールと CancelButton コントロールを除く)。
ハンドラ プロシージャは、画面上にダイアログ ボックスが表示されている間にプログラムが文を
発行することを可能にします。たとえば、ダイアログ ボックスに [リセット] ボタンを含めたい場
合があります。ユーザが [リセット] ボタンをクリックすると、ダイアログ ボックス内のすべての
コントロールがリセットされ、デフォルト値に戻ります。このようなダイアログ ボックスを作成
するには、[リセット] ボタンのコントロールにハンドラ プロシージャを割り当てる必要がありま
す。ダイアログ ボックスのコントロールをリセットするには、そのハンドラ プロシージャの中で
Alter Control 文を発行します。
ListBox コントロールと MultiListBox コントロールのハンドラは、シングルクリック イベントと
ダブルクリック イベントにそれぞれ別の対応を行うよう設定することができます。このようなハ
ンドラ プロシージャは、CommandInfo(CMD_INFO_DLG_DBL) 関数を呼び出して、そのイベン
トがシングルクリックであったか、ダブルクリックであったかを特定します。この機能の例につ
いては、Named Views サンプル プログラム (nviews.mb) を参照してください。Named Views ダイ
アログ ボックスには、名前のリストが表示されます。ユーザがリスト上の名前をダブルクリック
すると、ハンドラ プロシージャによってダブルクリック イベントが検出され、ダイアログ ボック
スが終了します。つまり、ユーザはリストをシングルクリックしてから [OK] ボタンをクリックす
る代わりに、リストをダブルクリックすることができるのです。
複数のコントロールが Calling 節にある同一のプロシージャ名を指定する場合、指定されたプロ
シージャは両方のコントロールのハンドラとして機能します。ハンドラ プロシージャの中で
TriggerControl( ) 関数を呼び出して、使用されたコントロールの ID を特定します。
ほとんどのダイアログ ボックス コントロールは、ハンドラ プロシージャを持つことができます
(GroupBox、StaticText、EditText の 3 つのコントロールを除く)。また、ダイアログ ボックスが
最初に表示されたときに 1 度だけ呼び出される特殊なハンドラ プロシージャを指定することもで
きます。Dialog 文に Control 節の一部でない Calling 節が含まれていると、その Calling 節はダ
イアログ ボックス自身にハンドラ プロシージャを割り当てます。
Alter Control 文は、ハンドラ プロシージャの中でのみ発行することができます。Alter Control
は、コントロールの現在の設定を disable (選択不可能)、enable (選択可能)、show (表示)、hide (非
表示)、rename (名称変更)、または reset (再設定) する場合に使用します。また、Alter Control 文
はどの EditText コントロールがフォーカスを持つか (どのコントロールがアクティブか) を設定す
ることもできます。詳細については、『MapBasic リファレンス ガイド』またはオンライン ヘル
プの Alter Control の項を参照してください。
MapBasic 11.0
102
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
カスタム ダイアログ ボックス
選択可能/不可能コントロール
コントロールは、最初に表示されたときには選択可能 (クリック可能) または選択不可能 (グレイ表
示) のいずれかの状態にあります。どのコントロールも、デフォルトでは選択可能となっています。
ダイアログ ボックス コントロールを選択不可能にするには、次の 2 とおりの方法があります。
•
•
Dialog 文の Control 節の中に、オプション キーワードの Disable を記述する。ダイアログ ボッ
クスが表示されると、コントロールは選択不可能になります。
ハンドラ プロシージャの中で Alter Control 文を発行してコントロールを選択不可能にする。
ダイアログ ボックスが表示されると同時にコントロールが選択不可能になるように設定するに
は、Control 節の中にない Calling 節を記述することで、ダイアログ ボックス自身にハンドラ
プロシージャを割り当てます。ダイアログ ボックスが最初に表示されると、このハンドラが 1
回呼び出されます。また、このハンドラの中で、Alter Control 文を発行することができます。
この方法はより複雑ですが、より柔軟でもあります。たとえば、コントロールを指定条件下で
のみ選択不可能にする場合は、If…Then 文の中で Alter Control 文を発行します。
L
Alter Control 文を使用してダイアログ ボックス コントロールを変更する場合は、Dialog 文
の中に ID 節を含めることで、コントロールに ID 番号を割り当てる必要があります。この例
については、『MapBasic リファレンス ガイド』またはオンライン ヘルプの Alter Control
の項を参照してください。
ユーザのリスト選択を可能にする
ListBox コントロールには、選択項目のリストが表示されます。ListBox コントロールの中に表示
される項目のリストを指定するには、次の 2 とおりの方法があります。
•
リストの項目をセミコロンで区切り、それらをすべて含む文字列式を作成する。次に例を示し
ます。
Control ListBox
Title "First Qrtr;2nd Qrtr;3rd Qrtr;4th Qrtr;Year in Review"
•
文字列変数の配列を宣言して個々のリスト項目を配列の各要素に格納し、 Control 節において
From Variable キーワードを指定する。たとえば s_list と呼ばれる文字列配列を作成した場合
は、次の構文を使用して ListBox コントロール内にその配列を表示することができます。
Control ListBox
Title From Variable s_list
From Variable 構 文 は、MapBasic の 3 つ の リ ス ト コ ン ト ロ ー ル (ListBox、MultiListBox、
PopupMenu) のすべてに適用できます。
MultiListBox コントロールの管理
ダイアログ ボックスに MultiListBox コントロールが含まれている場合は、ハンドラ プロシージャ
を使用して、ユーザがリストから選択した項目を特定する必要があります。ほとんどの場合、
MultiListBox コントロールを表示するダイアログ ボックスには、ハンドラ プロシージャを持つ
OKButton コントロールが含まれます。OKButton のハンドラ プロシージャは、ループの中で
ReadControlValue( ) 関数を呼び出します。最初の ReadControlValue( ) 呼び出しは最初に選択さ
MapBasic 11.0
103
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
カスタム ダイアログ ボックス
れたリスト項目の番号を返し、次の呼び出しは次に選択されたリスト項目の番号を返します。
ReadControlValue( ) が 0 を 返した場合は、選択項目がなくなったことを意味します。
ReadControlValue( ) が最初の呼び出し時に 0 を返した場合は、リスト項目がまったく選択されて
いないことを表します。
ハンドラ プロシージャの中において、Alter Control 文を発行してコントロールに 0 を割り当てる
と、MultiListBox コントロールのすべての項目の選択が解除されます。選択された項目の中にリスト
項目を追加するには、0 でない正の値を使用して Alter Control 文を発行します。たとえば、
MultiListBox コントロールの最初および 2 番目の項目を選択するには、次のような文を発行します。
Alter Control 1 Value 1
Alter Control 1 Value 2
ReadControlValue( ) 関数と Alter Control 文のどちらにもコントロール ID が必要であることに注
意してください。MultiListBox コントロールに ID を割り当てるには、Control MultiListBox 節に
オプションの ID 節を含めます。
コントロール用ショートカット キーの指定
MapBasic アプリケーションを MapInfo Professional で実行する場合、そのアプリケーション ダイ
アログ ボックスではさまざまなコントロールにショートカット キーを割り当てることができま
す。ショートカット キーは、ユーザがマウスではなくキーボードを使用してダイアログ ボックス
コントロールを操作できる便利な機能です。
あるコントロールのショートカット キーを指定するには、コントロールのタイトルの中で、ショー
トカット キーとして使用する文字の直前にアンパサンド文字 (&) を挿入します。たとえば、次の
Control 節は、R をショートカット キーとするようなボタン コントロールを作成します。
Control Button
Title "&Reset"
Calling reset_sub
ボタン コントロールのタイトルの中にアンパサンドが現われるため、ユーザは Alt-R を押すことで
[Reset] ボタンをアクティブにすることができます。アンパサンド キャラクタをコントロールの中
に表示したい場合は、アンパサンド キャラクタを 2 つ並べます (&&)。
EditText コントロールのショートカット キーを指定することはできません。ただし、StaticText
ラベルを EditText コントロールの左に置いて、その StaticText ラベルのショートカット キーを指
定すると、ユーザは StaticText ラベルのショートカット キーを押すことで、EditText にフォーカ
スを与えることができます。
モーダルとモードレス ダイアログ ボックスの比較
Dialog 文を使用して、モーダル ダイアログ ボックスを作成できます。つまり、ユーザは ([OK] ま
たは [キャンセル] をクリックするなどして) ダイアログ ボックスを終了しない限り、MapInfo
Professional の他の操作を行うことはできません。
MapBasic 11.0
104
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
ウィンドウ
一方、モードレス ダイアログ ボックス、つまり、画面上に表示されていてもユーザが他の操作を
行えるようなダイアログ ボックスもあります。たとえば、MapInfo Professional の [イメージ登録]
ダイアログ ボックスはモードレスです。Dialog 文では、モードレス ダイアログ ボックスを作成
することはできません。モードレス ダイアログ ボックスを作成するには、Visual Basic などの別
の プ ロ グ ラ ミ ン グ 環 境 で ア プ リ ケーションを開発し、MapBasic のプログラムの中で (Run
Program 文を使用して) そのアプリケーションを呼び出す必要があります。
ダイアログ ボックスの終了
MapBasic プログラムは、Dialog 文を発行した後、次の 4 つのイベントのいずれかが起きるまでダ
イアログ ボックスを表示し続けます。
•
ユーザがダイアログ ボックスの OKButton コントロールをクリックする (ダイアログ ボックス
にこのコントロールがある場合)。
•
ユーザがダイアログ ボックスの CancelButton コントロールをクリックする (ダイアログ ボッ
クスにこのコントロールがある場合)。
•
ユーザが別の方法 (Esc キーを押すなど) でダイアログ ボックスをキャンセルする。
•
Dialog Remove 文を発行するハンドラ プロシージャを持つコントロールをユーザがクリック
する。
通常、ダイアログ ボックスは、ユーザが OKButton コントロールまたは CancelButton コント
ロールをクリックすると終了します。しかし、[OK] または [キャンセル] を押した後も、ユーザが
続けてダイアログ ボックスを使用する必要がある場合もあります。たとえば、ダイアログ ボック
スによっては、[キャンセル] を押すとキャンセル操作の確認が求められる場合があります ("変更内
容を消去してもよろしいですか?" など)。ユーザがいいえと回答すると、再び元のダイアログ ボッ
クスが表示されます。
Dialog Preserve 文は、ユーザが [OK] または [キャンセル] をクリックした後も、続けてダイアログ
ボックスを使用できるようにします。Dialog Preserve 文は、OKButton コントロールまたは
CancelButton コントロールのいずれかのハンドラ サブプロシージャの中からしか発行できません。
Dialog Remove 文を使用すると、ダイアログ ボックスは途中で終了します。コントロールのハン
ドラ プロシージャが Dialog Remove 文を発行すると、ダイアログ ボックスは即座に終了します。
Dialog Remove は、ダイアログ ボックス コントロールのハンドラ プロシージャの中でのみ有効で
す。たとえば、Dialog Remove を使用すると、ユーザが ListBox コントロールをダブルクリック
するとダイアログ ボックスが終了するような設定が行えます。Named Views サンプル プログラム
(NVIEWS.MB) には、ユーザがリストをダブルクリックできるようにする例が含まれています。
ウィンドウ
MapBasic アプリケーションでは、MapInfo Professional のあらゆる標準ウィンドウ (マップ ウィ
ンドウ、ブラウザ ウィンドウなど) を開いたり操作したりできます。
新しいドキュメント ウィンドウを開くには、Map、Browse、Graph、Layout、Create Redistricter
のいずれかの文を発行します。どのドキュメント ウィンドウにもテーブルのデータが表示されるた
め、ウィンドウを開く前に適切なテーブルを開く必要があります。
MapBasic 11.0
105
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
ウィンドウ
これ以外の MapInfo Professional のウィンドウ (ヘルプ ウィンドウ、統計ウィンドウなど) を開く
には、Open Window 文を使用します。
ウィンドウ設定の多くは、Set Window 文により操作できます。たとえば、Set Window 文を使用
してウィンドウのサイズや位置を設定することができます。この他にも、特定タイプのウィンド
ウの属性を構成できる文があります。たとえば、マップ ウィンドウのレイヤの順序を操作するに
は、Set Map 文を発行します。ブラウザ ウィンドウのグリッド表示を操作するには、Set Browse
文を発行します。
各ドキュメント ウィンドウ (マップ、ブラウザ、レイアウト、グラフ、領域編成) は、1 つの整数
識別子またはウィンドウ ID を持ちます。さまざまな文や関数には、パラメータとしてウィンドウ
ID が必要になります。たとえば、複数のマップ ウィンドウが開いている時に Set Map 文を発行し
てウィンドウを変更する場合は、どのウィンドウを変更するかを MapInfo Professional に知らせる
ために、ウィンドウ ID を指定する必要があります。
アクティブなウィンドウのウィンドウ ID を取得するには、FrontWindow( ) 関数を呼び出しま
す。ただし、(Map 文を発行するなどして) 新しいウィンドウを開くと、その新規ウィンドウがア
クティブなウィンドウとなります。たとえば、OverView サンプル プログラムは、Map 文を発行
してマップ ウィンドウを開いた後、即座に FrontWindow( ) 関数を呼び出して新しいマップ ウィ
ンドウの ID を記録します。OverView アプリケーションによるそれ以降の操作では、この ID が参
照されます。
L
ウィンドウ ID は 1 や 2 などの単純な序数ではありません。数字の 1 は、有効なウィンドウ
ID ではありません。ウィンドウ ID を取得するためには、FrontWindow( ) や WindowID( )
などの関数を呼び出す必要があります。たとえば、一番手前の開いたウィンドウのウィン
ドウ ID を取得するには、WindowID(1) を呼び出します。開いているウィンドウの数を特
定するには、NumWindows( ) を呼び出します。
WindowInfo( ) 関数は、開いているウィンドウに関する情報を返します。たとえば、アクティブ
ウィンドウがマップ ウィンドウであるかどうかを特定する場合は、まず FrontWindow( ) を呼び出
してアクティブ ウィンドウの ID を特定した後、WindowInfo( ) を呼び出してアクティブ ウィンド
ウのウィンドウ タイプを特定します。
ウィンドウを閉じるには、Close Window 文を発行します。
ウィンドウのサイズおよび位置の指定
ウィンドウのサイズおよび位置を操作するには、次の 2 とおりの方法があります。
•
Position、Width、Height などのオプション節を、ウィンドウを開く文に記述する。たとえば、
次の Map 文は、マップ ウィンドウを開くと共に、そのウィンドウの初期サイズおよび位置を指
定します。
Map From world
Position (2,1) Units "in"
Height 3 Units "in"
Width 4 Units "in"
•
Set Window 文を発行して、開かれたウィンドウのサイズおよび位置を操作する。Set Window
文には整数のウィンドウ ID が必要であることに注意してください。
MapBasic 11.0
106
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
ウィンドウ
マップ ウィンドウ
マップ ウィンドウには、1 つ以上のテーブルのマップ作成可能なオブジェクトが表示されます。
マップ ウィンドウを開く場合は、まず表示するテーブルを指定する必要があります。指定するテー
ブルは、事前に開かれていなければなりません。
次の文でマップ ウィンドウを開きます。
Map From world, worldcap, grid30
この例は、World、Worldcap、Grid30 の各テーブルからオブジェクトをマップします。
マップ ウィンドウにレイヤを追加するには、Add Map Layer 文を発行します。マップ ウィンドウ
からマップ レイヤを削除するには、Remove Map Layer 文を発行します。マップ レイヤを一時的
に非表示にするのであれば、レイヤをマップから削除する必要はありません。Set Map 文を使用
すれば、レイヤの表示属性をオフにすることができます。
Set Map 文は、マップ ウィンドウの多くの側面をコントロールできる非常にパワフルな文です。
Set Map 文を発行すると、ユーザが [マップ] > [レイヤ管理] コマンドおよび [マップ] > [オプション]
コ マ ン ド を 通 じ て 操 作 す る マ ッ プ 属 性 を プ ロ グ ラ ム か ら 操 作 で き ま す。詳 細 に つ い て は、
『MapBasic リファレンス ガイド』の Set Map の項を参照してください。
Shade 文を使用すると、主題図 (色分けやその他の図形デバイスを用いて添付データの情報を表示
するマップ) を作成できます。Shade 文を使用すれば、レンジ、棒グラフ、円グラフ、サイズ可変
シンボル、ドット密度、個別値など、MapInfo Professional で可能なあらゆるスタイルの主題図を
作成することができます。主題図を作成すると、影響を受けるウィンドウに主題図レイヤが追加
されます。主題図を変更するには、Set Shade 文を使用します。
Create Grid 文を使用して、既存の境界線にとらわれない分析を可能にする主題図を作成できま
す。従来、ポイントまたはサイズ可変主題図として表示していたデータを連続した色の変化とし
て表現することが可能です。MapInfo Professional ポイント テーブルは逆距離加重補間法 (Inverse
Distance Weighting - IDW) により連続面データへと変換されます。この強力な主題図は、通信、販
売分析、保険、伝統的な GIS などの幅広い分野で有効に利用できます。この新しく追加された主
題図とグリッド形式は、新たなグリッド形式や補間法を可能にするオープン API によってサポー
トされており、開発者環境でカスタマイズすることができます。『MapBasic リファレンス ガイ
ド』の Create Grid 文の項を参照してください。グリッド主題図を変更するには Set Map 文の
Inflect 節を使用します。
マップ ウィンドウの投影法を変更するには、CoordSys 節を含む Set Map 文を発行します。ま
た、(Commit Table…As 文を使用して) テーブルを特定の投影法で保存すると、マップを特定の投
影法で表示することができます。
マップ ウィンドウ上のスクロール バーの表示と非表示を操作するには、Set Window 文を発行し
ます。
MapBasic 11.0
107
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
ウィンドウ
アニメーション レイヤを使用したマップ再描画の迅速化
Add Map Layer 文にキーワード Animate を記述すると、そのレイヤはアニメーション レイヤと
呼ばれる特殊レイヤになります。アニメーション レイヤの中にあるオブジェクトが移動すると、
マップが非常に複雑であっても、マップ ウィンドウは極めて迅速に再描画されます。
アニメーション レイヤは、オブジェクトが頻繁に更新されるようなリアルタイム アプリケーショ
ンにおいて効果的です。たとえば、それぞれの媒体がポイント オブジェクトとして表現されるフ
リートマネージメント アプリケーションを実行することが可能です。GPS (グローバル ポジショ
ニング サテライト) の技術を駆使することにより、現在の媒体座標の受け入れが可能となり、その
後現在の媒体の位置をマップ上に表示するためにポイント オブジェクトを更新します。マップ オ
ブジェクトが常に変化しているようなこのタイプのアプリケーションにおいては、更新された
マップが従来のレイヤではなくアニメーション レイヤに蓄積された場合、マップは格段に早く再
描画を行います。
次の例では、テーブルを開いて、そのテーブルをアニメーション レイヤにします。
Open Table "vehicles" Interactive
Add Map Layer vehicles Animate
アニメーション レイヤには、次のような制限があります。
•
アニメーション レイヤとして追加されたレイヤは、[レイヤ管理] ウィンドウに表示されない。
•
•
ユーザは、マップ ウィンドウをクリックしてアニメーション レイヤを操作することができな
い。たとえば、ユーザは [情報] ツールを使用してアニメーション レイヤ上のポイントをクリッ
クすることはできません。
各マップ ウィンドウには 1 つのアニメーション レイヤしか含めることができない。アニメーショ
ン レイヤは自動的にそのマップの一番上のレイヤとなります。既にアニメーション レイヤの含ま
れるマップ ウィンドウに別のアニメーション レイヤを追加すると、新しいアニメーション レイ
ヤが元のレイヤと置き換わります。
ワークスペース ファイルには、アニメーション レイヤに関する情報を保存できない。
•
アニメーション レイヤ処理を終了するには、Remove Map Layer...Animate 文を発行する。
•
ANIMATOR.MBX サンプル プログラムを実行すると、アニメーション レイヤの例を確認できます。
アニメーション レイヤをより効果的に使用するためのヒント
アニメーション レイヤの目的は、マップ ウィンドウの小さなセクションの更新を迅速化すること
です。再描画速度を最大にするため、次の点に注意します。
•
•
マップ ウィンドウをレイアウト ウィンドウ上で表示しないようにする。アニメーション レイ
ヤの含まれるマップ ウィンドウをレイアウト ウィンドウ上で表示すると、画面の更新が遅く
なる場合があります。
アニメーション レイヤとして使用するレイヤが、マップ ウィンドウ上で一度だけしか表示さ
れないようにする。
たとえば、Roads (道路マップを含むテーブル) と Trucks (それぞれ 1 台の集配トラックを表すポイ
ント オブジェクトを含むテーブル) の 2 つのテーブルを使用して作業をしているとします。マップ
ウィンドウに両方のレイヤが既に含まれているとすると、 Trucks レイヤをアニメーション レイヤ
にするには、次の文を発行しなければなりません。
MapBasic 11.0
108
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
ウィンドウ
Add Map Layer Trucks Animate
しかし、ここで問題が発生します。Trucks レイヤは、一度は通常のマップ レイヤとして、一度は
アニメーション レイヤとして、合計 2 度マップ ウィンドウに現われることになります。Trucks レ
イヤは依然として通常のレイヤとして表示されているため、画面更新を迅速に実行できません。
つまり、マップ ウィンドウの更新データは以前と同じ速度で再描画されるため、アニメーション
レイヤを使用するメリットがなくなります。
次の例は、この場合の対策を示したものです。ここでは、Trucks レイヤをアニメーション レイヤ
として追加する前に、"通常の" Trucks レイヤ表示がオフにされています。
’temporarily prevent screen updates
Set Event Processing Off
’set the original Trucks layer so it won’t display
Set Map Layer "Trucks" Display Off
’add the Trucks layer to the map, as an animation layer
Add Map Layer Trucks Animate
’allow screen updates again
Set Event Processing On
'
'
'
'
At this point, there are two Trucks layers in the
Map window.However, the "conventional" Trucks layer
is not displayed, so it will not slow down the display
of the "animated" Trucks layer.
ブラウザ ウィンドウ
ブラウザ ウィンドウには、テーブル データのフィールド情報が表示されます。次の文は、World
テーブルのすべてのフィールドを表示するシンプルなブラウザ ウィンドウを開きます。
Browse * From world
アスタリスクは、そのテーブルにあるすべてのフィールドをブラウザに表示するように指定しま
す。一部のフィールドだけを表示するブラウザ ウィンドウを開くには、アスタリスクの代わりに
フィールド式を記述します。たとえば、次の文は 2 つのフィールドだけを表示するブラウザ ウィ
ンドウを開きます。
Browse country, capital From world
Browse 文 は、テ ーブ ル の値 を計 算するフィールド式を指定できます。たとえば、次の文は
Format$( ) 関数を使用し、World テーブルの Population フィールドのフォーマット バージョンを
作成します。この結果、ブラウザの 2 番目のフィールドには、人口統計値を読みやすくするため
のコンマが挿入されます。
Browse country, Format$(Population, ",#") From world
Browse 文で単純なフィールド名 (例 : country) を指定すると、ユーザはこのブラウザ ウィンドウ
でフィールドの値を編集することができます (テーブルが読み取り専用ではない場合)。ただし、
Browse 文で単純なフィールド名ではなくより複雑な式を指定する場合、ブラウザ ウィンドウ上
の対応するフィールドは読み取り専用となります。したがって、ブラウザ ウィンドウ上に読み取
り専用フィールドを作成する場合は、単純なフィールド名ではなく式を指定します。
MapBasic 11.0
109
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
ウィンドウ
Browse 文に指定された式は、フィールド ヘッダとして、ブラウザ ウィンドウの最上部に横方向
で表示されます。次の文は、デフォルトのフィールド式を別名のフィールド ヘッダで上書きする
方法を示しています。
Browse country, Format$(Population, ",#") "Pop" From world
フィールド式の後に文字列式 "Pop" があるため、この "Pop" がブラウザ ウィンドウ上に表示される
フィールド名となります。
また、ブラウザ ウィンドウの初期デフォルト位置を設定することもできます。次の例では、5 行
目の 2 番目のフィールドがブラウザ表示の左上に表示されるように初期表示位置を設定します。
Browse * From world Row 5 Column 2
グラフ ウィンドウ
グラフ ウィンドウには、テーブルから計算された値とラベルの含まれるグラフが表示されます。
次の例では、あるフィールドをラベルに、もう一方のフィールドをデータに使用するグラフを表
示します。
Graph country, population From world
キーワード Graph に続く最初の項目は、データのラベルを提供するフィールドの名前です。その
後に続く各項目は、グラフにデータを提供する式です。上記の例は、データがテーブルの 1 つの
フィールドである単純な式を表します。有効でさえあれば、あらゆる数値式を使用することがで
きます。
レイアウト ウィンドウ
レイアウト ウィンドウでは、ページ レイアウトを確認できます。レイアウト ウィンドウを開くには、
Layout 文を使用します。
ほとんどのレイアウト ウィンドウには、1 つ以上の枠オブジェクトが含まれます。枠オブジェクト
を作成するには、Create Frame 文を発行します。この他にも、レイアウト ウィンドウにはあらゆ
る種類のマップ オブジェクトを含めることができます。たとえば、ページ レイアウトにタイトル
を付けるには、Create Text 文を発行してテキスト オブジェクトを作成します。
レイアウト ウィンドウは、テーブルとして扱うこともできます。たとえば、"Layout1" などのテー
ブル名を参照する Insert 文を発行すると、レイアウトにオブジェクトを追加することができます。
ただし厳密には、レイアウト上のオブジェクトはワークスペース ファイルには保存されますが、
テーブル形式では保存されません。テーブルとして扱われるレイアウト ウィンドウへのアクセスの
詳細については、「テーブル操作」を参照してください。
レイアウト ウィンドウに格納されるオブジェクトには、オブジェクト座標をインチやミリメート
ルなどの "用紙" 単位で定義するレイアウト座標系を使用しなければなりません。レイアウト座標
の詳細については、「図形オブジェクト」を参照してください。
MapBasic 11.0
110
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
ウィンドウ
領域編成ウィンドウ
領域編成セッションを開始するには、Create Redistricter 文を使用します。Create Redistricter
文を使用すると、ユーザが [ウィンドウ] > [領域編成ウィンドウの表示] ダイアログ ボックスで構成
するすべての領域編成オプションを操作することができます。
領域編成セッションが開始されると、Set Redistricter 文を発行して領域ブラウザを操作できるように
なります。[領域編成] メニューからの操作を実行するには、Run Menu Command 文を使用します。
たとえば、(ユーザが [領域編成] > [選択したオブジェクトを領域へ追加] を選択したときと同様に)
領域にオブジェクトを割り当てるには、次の文を発行します。
Run Menu Command M_REDISTRICT_ASSIGN
領域編成セッションを終了するには、Close Window 文を発行して領域ブラウザを閉じます。基
本テーブルの値は、領域間でのオブジェクトの割り当てが変更されるにつれて変化することに注
意してください。領域編成セッション終了後にマップ オブジェクトの最終領域割り当てを維持す
るには、基本テーブルを保存しなければなりません。テーブルを保存するには、Commit 文を発行
します。
領域編成の詳細については、MapInfo Professional のドキュメントを参照してください。
メッセージ ウィンドウ
MapBasic の Print 文を使用すると、テキストをメッセージ ウィンドウに出力することができま
す。たとえば、次の文はメッセージ ウィンドウにメッセージを出力します。
Print "Dispatcher is now on line."
情報ウィンドウのカスタマイズ
情報ウィンドウには、テーブルの 1 レコードの内容が表示されます。ユーザは、情報ウィンドウ
でレコードを編集することができます。情報ウィンドウの操作とカスタマイズを行うには、Set
Window 文を使用します。次の図に、カスタム情報ウィンドウを示します。
次のプログラムでは、上記のカスタム情報ウィンドウを作成できます。
Include "mapbasic.def"
Open Table "World" Interactive
Select
Country, Capital, Inflat_Rate + 0 "Inflation"
From World
Into World_Query
MapBasic 11.0
111
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
ウィンドウ
Set Window Info
Title "Country Data"
Table World_Query Rec 1
Font MakeFont("Arial", 1, 10, BLACK, WHITE)
Width 3 Units "in" Height 1.2 Units "in"
Position (2.5, 1.5) Units "in"
Front
この例に関する注意点を以下に示します。
•
通常、情報ウィンドウのタイトル バーには "情報ツール (Info Tool)" と表示されます。このプロ
グラムでは、Title 節を使用してタイトル バーを "Country Data" に変更しています。
•
ウィンドウに表示されるデータ行を指定するには、Set Window 文の Table…Rec 節を使用し
ます。上記の例では、World_Query テーブルの 1 番のレコードを表示します (World_Query
は、Select 文によって生成される一時テーブルです)。
•
情報ウィンドウには、レコードの各フィールドに対して 1 つのボックスが表示されます。ユー
ザは、ウィンドウの右端にあるスクロール バーを使用して、フィールド リストをスクロールす
ることができます。表示フィールド数を制限するため、上の例では Select 文を使用し、一時検
索テーブルである World_Query を作成しています。World_Query テーブルには 3 つのフィール
ドしかありません。そのため、情報ウィンドウにも 3 つのフィールドだけが表示されます。
情報ウィンドウのフィールドの一部 (すべてではない) を読み取り専用にするには
1. Select 文を使用し、一時検索テーブルを作成します。
2. Select 文を、単純なフィールド値ではなく式を計算するように設定します。上記の Select 文
で、3 番目のフィールド値として "Inflat_Rate+0" という式を指定します (式に続く "Inflation" 文
字列は、その式の別名です)。
Select
Country, Capital, Inflat_Rate + 0 "Inflation"
3. Set Window Info 文の中で、Table… Rec 節を使って表示されるレコードを指定します。上記
の例のように、検索テーブルからレコードを指定します。検索テーブルのフィールドが式に
よって定義されると、情報ウィンドウの中の対応するボックスが読み取り専用になります。(上
記の例では、Inflation フィールドが読み取り専用となります。)
4. 情報ウィンドウに新しい値を入力すると、その値は一時検索テーブルと検索のベースとなる基
本テーブルの両方に自動的に格納されます。編集内容をテーブルに適用するために新しい文を
発行する必要はありません (ただし、ユーザの編集内容を保存するには、Commit 文を発行す
る必要があります)。
情報ウィンドウのすべてのフィールドを読み取り専用にするには、次の文を発行します。
Set Window Info ReadOnly
L
MapBasic 11.0
結合テーブル (例 : StreetInfo テーブル) または Group By 節を使って集合値を計算する検索
テーブルを表示すると、情報ウィンドウのすべてのフィールドは書き込み禁止となります。
112
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
ボタンパッド (ツールバー)
ボタンパッド (ツールバー)
ボタンパッドは、1 つ以上のボタンを含む、サイズ変更と移動表示が可能なウィンドウです。ユー
ザは、ボタンパッドからボタンを選択することで、さまざまな操作を行うことができます。
"ボタンパッド" と "ツールバー" は、まったく同じものを意味します。MapInfo Professional のユー
ザ インターフェイスでは、"ツールバー" と呼ばれます。たとえば、MapInfo Professional の [オプ
ション] メニューには、MapInfo Professional ユーザがツールバーの表示/非表示を操作できる [ツー
ルバー] コマンドがあります。一方、MapBasic 言語の構文では、ツールバーは "ボタンパッド" と呼
ばれます。たとえば、ツールバーの表示/非表示の操作には、Alter ButtonPad 文が使用されます。
MapInfo Professional には、メイン ボタンパッドのようないくつかの標準ボタンパッドがありま
す。MapBasic プログラムでは、既存ボタンパッドにカスタム ボタンを追加したり、まったく新し
いボタンパッドを作成したりできます。
ユーザがボタンを選択したときの動作
メニュー項目と同様に、カスタム ボタンにもハンドラ プロシージャが割り当てられています。
ユーザがカスタム ボタンを操作すると、MapBasic は自動的にそのボタンのハンドラ プロシー
ジャを呼び出します。したがって、ユーザがボタンをクリックするたびにカスタム ダイアログ
ボックスが表示されるようにするには、ダイアログ ボックスを表示するサブ プロシージャを作成
し、そのプロシージャをカスタム ボタンのハンドラにします。
MapBasic プログラムでは、ツールボタン、トグルボタン、プッシュボタンの 3 種類のボタンが作
成できます。ボタン タイプによって、MapBasic がそのボタンのハンドラを呼び出す条件が異なり
ます。
•
プッシュボタン : ユーザがプッシュボタンをクリックすると、ボタンが上に戻り、そのプッシュ
ボタンのハンドラ プロシージャが呼び出されます。
[レイヤ管理] ボタンは、プッシュボタンの一種です。[レイヤ管理] ボタンをクリックすると、す
ぐにダイアログ ボックスが表示されますが、ボタンの状態には持続的な変化は起こりません。
•
トグルボタン : ユーザがトグルボタンをクリックすると、ボタンがチェックされている (押され
た) 状態とチェックされていない (押されていない) 状態の間で切り替わります。ユーザがトグ
ルボタンをクリックするたびに、そのボタンのハンドラ プロシージャが呼び出されます。
•
[凡例ウィンドウを表示 (凡例ウィンドウを非表示)] ボタンは、トグルボタンの一種です。この
ボタンをクリックすると、凡例ウィンドウの表示と非表示が瞬時に切り替わります。さらに、
ボタンは押されたままの状態、または押されていない状態で保持されます。
ツールボタン : ユーザがツールボタンをクリックすると、そのボタンはアクティブ ツールとな
り、ユーザが別のツールを選択するまでアクティブの状態であり続けます。カスタム ボタンが
ツールとして選択されている時にマップ、ブラウザ、またはレイアウトのいずれかのウィンド
ウをクリックすると、そのボタンのハンドラ プロシージャが呼び出されます。
拡大ツールは、ツールボタンの一種です。このツールを選択しても、マップはすぐには拡大され
ませんが、ツールを選択してからマップ ウィンドウをクリックすると、マップが拡大されます。
MapBasic 11.0
113
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
ボタンパッド (ツールバー)
ボタンパッドに関連する MapBasic 文
下記の文と関数は、カスタム ボタンおよびボタンパッドの作成と操作に使用されます。
Create ButtonPad
この文を使用して、新しいボタンパッドを使用し、ボタンにカスタム アイコンを割り当てること
ができます。サイズの小さいボタンとサイズの大きいボタンの両方を定義する必要があります。
それぞれにリソース ファイルの ID を割り当て、大きい方のボタンには、小さい方のボタンよりも
1 大きい ID を割り当てます。
Alter ButtonPad
カスタム ボタンパッドを作成した後、プログラムを使用してボタンパッドのさまざまな属性を変
更することができます。Alter ButtonPad 文では、ボタンパッドの位置変更、表示、非表示、ボタ
ンパッドへのボタンの追加、またはボタンパッドからのボタンの削除を行えます。
Alter ButtonPad 文では、メイン パッドなどの標準パッドを含むあらゆるボタンパッドを変更でき
ます。アプリケーションに必要なカスタム ボタンが 1 ~ 2 個である場合は、新規ボタンパッドを作
成するのではなく、それらのボタンを標準メイン ボタンパッドに追加することをお勧めします。
Alter Button
この文を使用すると、1 つのボタンのステータスを変更できます。Alter Button 文を使用すると、
ボタンを選択不可能 (非稼働状態) または選択可能 (稼働する) な状態にしたり、現在選択されてい
るボタンを変更したりできます。
CommandInfo( )
ボタンのハンドラ プロシージャの中で CommandInfo( ) 関数を使用すると、ユーザがそのカスタ
ム ボタンをどのように使用したかという情報を照会することができます。たとえば、ユーザが
ツールボタンを選択してマップ ウィンドウをクリックすると、CommandInfo( ) 関数は、ユーザ
がクリックした場所の x 座標と y 座標を読み取ります。
同じハンドラ プロシージャを呼び出すボタンを複数作成した場合、そのプロシージャは
CommandInfo(CMD_INFO_TOOLBTN) を呼び出して、どちらのボタンが使用されているかを特定
します。
したがって、ボタンのハンドラ プロシージャの中で CommandInfo( ) が数回呼び出される場合も
あります。たとえば、ユーザが選択したボタンの特定、ユーザがクリックした場所の x 座標の特
定、同 y 座標の特定、ユーザがクリック時に Shift キーを押していたかどうかの特定に、それぞれ
一度ずつ呼び出される場合があります。
MapBasic 11.0
114
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
ボタンパッド (ツールバー)
ToolHandler
ToolHandler は、メイン ボタン パッドにボタンを 1 個追加する作業をより簡単にする特殊なプロ
シージャ名です。MapBasic プログラムに ToolHandler という名前のプロシージャが含まれる場
合、1 個のツールボタンがメイン ボタンパッドに自動的に追加されます。ユーザがツールボタン
を選択すると、マップ、ブラウザ、レイアウトのいずれかのウィンドウがクリックされるたびに
ToolHandler プロシージャが呼び出されます。
MapBasic プログラムでは、ToolHandler プロシージャに関連したボタン アイコンまたは描画モー
ドをカスタマイズすることはできません。アイコンとカーソルは、常にシンプルな + の形となり
ます。カスタム アイコンまたはカスタム カーソルを指定する必要がある場合は、ToolHandler プ
ロシージャの代わりに Create ButtonPad または Alter ButtonPad 文を使用します。
複数の MapBasic アプリケーションを同時に実行する場合、個々のアプリケーションがそれぞれ独
自の ToolHandler を持っていると、各アプリケーションでそれぞれのボタンがメイン ボタンパッ
ドに追加されます。
カスタム プッシュボタンの作成
次のプログラムを使用すると、1 個のプッシュボタンを含むカスタム ボタンパッドを作成できま
す。button_prompt プロシージャは、このボタンのハンドラです。したがって、このカスタム プッ
シュボタンをクリックすると、button_prompt プロシージャが自動的に呼び出されます。
Include "icons.def"
Declare Sub Main
Declare Sub button_prompt
Sub Main
Create ButtonPad "Custom" As
PushButton
Icon MI_ICON_ZOOM_QUESTION
Calling button_prompt
HelpMsg "Displays the query dialog\nQuery"
Show
End Sub
Sub button_prompt
’ This procedure called automatically when
’ the user chooses the button.
’ ...
End Sub
Main プロシージャは、Create ButtonPad という一文だけを含みます。この文を使用すると、
"Custom" という名前のカスタム ボタンパッドを作成し、そのボタンパッド上に 1 個のカスタム ボ
タンを作成できます。
キーワード PushButton で、そのカスタム ボタンをプッシュボタンにするよう指定します。
Icon 節で、カスタム ボタン上に表示するアイコンを指定します。識別子 MI_ICON_ZOOM_QUESTION
は、icons.def ファイルに定義されています。MapInfo Professional の標準アイコン識別子のリストにつ
いては、icons.def を参照してください。
MapBasic 11.0
115
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
ボタンパッド (ツールバー)
Calling 節で、ユーザがこのカスタム ボタンをクリックするたびに button_prompt プロシージャを
呼び出すよう MapBasic に指示します。
HelpMsg 節で、このボタンに対するステータス バーのヘルプ メッセージとツールチップのヘルプ
メッセージの両方を定義します。ヘルプ メッセージについては、「ボタンへのヘルプ メッセージ
の割り当て (120 ページ)」を参照してください。
イメージ サイズに関する注意事項については、『MapBasic リファレンス』の「Create ButtonPad
文」 を参照してください。
メイン ボタンパッドへのボタンの追加
上記の例は、Create ButtonPad 文を使用してまったく新しいボタンパッドを作成するものでし
た。この他にも、MapBasic ではメイン ボタンパッドなどの MapInfo Professional のデフォルト ボ
タンパッドにカスタム ボタンを追加することができます。既存のボタンパッドにボタンを追加す
るには、次の例に示すように、Create ButtonPad 文ではなく Alter ButtonPad 文を使用します。
Alter ButtonPad "Main"
Add Separator
Add PushButton
Icon MI_ICON_ZOOM_QUESTION
Calling button_prompt
HelpMsg "Displays the query dialog\nQuery"
Show
Add PushButton 節は、メイン ボタンパッドにカスタム ボタンを追加します。Add Separator 節
は、新規ボタンと既存ボタンの間にスペースを挿入します。Add Separator 節はオプションで、
ボタンを異なるグループに分けるときに利用します。
MapInfo Professional には、MapBasic ユーティリティ プログラムでカスタム ボタンを追加できる
ツールと呼ばれる特殊なボタンパッドがあります。たとえば、ScaleBar ユーティリティは、その
ボタンをツール ボタンパッドに追加します。
カスタム ツールボタンの作成
上記の例は、カスタム プッシュボタンを作成するものでした。この他にも、MapBasic では拡大
ツールやライン ツールなど、MapInfo Professional ツールとして機能するカスタム ツールボタン
を作成することができます。プログラムでカスタム ツールボタンを作成すると、ユーザはその
ツールを選択して使用し、マップ、ブラウザ、レイアウトの各ウィンドウ上でクリックしたり、
場合によってはドラッグしたりできるようになります。
次の例では、カスタム ツールボタンを作成します。このツールを選択すると、ユーザはマップ
ウィンドウ上でクリックまたはドラッグが行えます。マウスをドラッグすると、現在のカーソル位
置とユーザがクリックした場所をつなぐラインが表示されます。このラインは動的に変化します。
Include
Include
Declare
Declare
MapBasic 11.0
"icons.def"
"mapbasic.def"
Sub Main
Sub draw_via_button
116
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
ボタンパッド (ツールバー)
Sub Main
Create ButtonPad "Custom" As
ToolButton
Icon MI_ICON_LINE
DrawMode DM_CUSTOM_LINE
Cursor MI_CURSOR_CROSSHAIR
Calling draw_via_button
HelpMsg "Draws a line on a Map window\nDraw Line"
Show
End Sub
Sub draw_via_button
Dim x1, y1,x2, y2 As Float
If WindowInfo(FrontWindow(),WIN_INFO_TYPE) <> WIN_MAPPER Then
Note "This tool may only be used on a Map window.Sorry!"
Exit Sub
End If
’ Determine map location where user clicked:
x1 = CommandInfo(CMD_INFO_X)
y1 = CommandInfo(CMD_INFO_Y)
x2 = CommandInfo(CMD_INFO_X2)
y2 = CommandInfo(CMD_INFO_Y2)
’ Here, you could create objects based on x1, y1, x2, and y2.
End Sub
この例では、Create ButtonPad 文に含まれるキーワードは、PushButton ではなく ToolButton
となっています。これによって、描画ツールの役割を果たすカスタム ボタンを作成するよう指定
します。
ボタンの定義には、ユーザがツールでクリックした後にドラッグできるかどうかを指定する
DrawMode 節が含まれています。上記の例では、DM_CUSTOM_LINE 描画モードが使用されてい
ます。したがって、ユーザは MapInfo Professional の標準 [ライン] ツールと同様に、このカスタム
ツールでもクリックとドラッグの両方が行えます。ツールに DM_CUSTOM_POINT モードが使用
される場合、ユーザはクリック後にドラッグすることはできません。使用可能な描画モードのリ
ストについては、『MapBasic リファレンス ガイド』またはオンライン ヘルプの Alter ButtonPad
の項を参照してください。
また、DrawMode 節ではドラッグ中にユーザに表示されるものを操作することもできます。
DM_CUSTOM_LINE モードの場合は、カーソル位置とユーザが最初にクリックした場所を結ぶラ
インが描画されます。DM_CUSTOM_RECT モードでは、マウスのドラッグに従って長方形が描画
されます。使用する DrawMode に関係なく、ユーザがマウス ボタンをクリック/リリースするたび
に、ツールボタンのハンドラ プロシージャが呼び出されます。このハンドラ プロシージャによ
り、CommandInfo( ) が呼び出され、クリックした場所が確認されます。
L
MapBasic 11.0
ユーザが Esc キーを押して操作をキャンセルした場合、ハンドラ プロシージャは呼び出さ
れません。
117
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
ボタンパッド (ツールバー)
カスタム ボタンのアイコンの選択
カスタム ボタンを定義する際には、そのボタン上に表示されるアイコンを設定します。使用する
アイコンの指定には、Icon 節を使用します。
キ ー ワ ー ド Icon の 後 に は、ICONS.DEF からのコードが続きます。たとえば、次の文では、
MapInfo Professional の [情報] ボタンのアイコンを使用するカスタム ボタンを定義します。コード
MI_ICON_INFO は、ICONS.DEF に定義されています。
Alter ButtonPad "Main"
Add Separator
Add PushButton
Icon MI_ICON_INFO
Calling procedure_name
L
MapInfo 4.0 には多くのボタンが搭載されていますが、その大半は MapInfo Professional の標
準ユーザ インターフェイスでは使用されません。搭載アイコンの例を確認するには、サンプ
ル プログラム Icon Sampler (ICONDEMO.MBX) を実行し、Icon Sampler メニューの項目を選
択します。特定アイコンのコードを表示するには、マウスをそのアイコンに合わせます。
ボタンのツールチップにはアイコン コードが表示されます。このアイコン コードをクリップボード
にコピーすることもできます。
1. Icon Sampler アプリケーション (ICONDEMO.MBX) を実行します。
2. Icon Samler メニューの項目を選択します。カスタム ボタンパッドが表示されます。
3. 利用するアイコンの表示されているボタンをクリックします。ダイアログ ボックスが表示され
ます。
4. Ctrl キーを押しながら C キーを押します (Windows の [コピー] コマンドのショートカット キー)。
5. [OK] をクリックしてダイアログ ボックスを終了します。
6. MapBasic に切り替えます。Ctrl キーを押しながら V キーを押して (貼り付けのショートカット
キー)、コードをプログラムに貼り付けます。
MapBasic 11.0
118
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
ボタンパッド (ツールバー)
ツールボタンのクリックによるオブジェクトの選択
ユーザがカスタム ツールボタンを選択してマップ オブジェクトをクリックしても、そのオブジェ
クトは選択されません。その代わり、MapInfo Professional はそのカスタム ツールボタンのハンド
ラ プロシージャを呼び出します。ユーザがクリックしたオブジェクトが選択されるようにするた
めには、ハンドラ プロシージャの中で Select 文を発行します。
次のハンドラ プロシージャを使用すると、ユーザがクリックした町の領域リージョンを選択でき
ます。ユーザがクリックした場所の座標を特定するには、CommandInfo( ) を呼び出します。その
位置にあるオブジェクトを選択するには、Where 節を含む Select 文を発行し、Contains などの
地理オペレータを指定します。次の例では、ユーザがクリックした位置を含む町のリージョンを
すべて選択します。
Sub t_click_handle
Dim fx, fy As Float
fx = CommandInfo(CMD_INFO_X)
fy = CommandInfo(CMD_INFO_Y)
Select * From towns
Where obj Contains CreatePoint(fx, fy)
End Sub
L
Select 文を使う代わりに、SearchPoint( ) 関数または SearchRect( ) 関数を呼び出して検
索を行った後、SearchInfo( ) を呼び出して検索結果を処理することができます。この手法
の 詳 細 に つ い て は、『MapBasic リファレンス ガイド』またはオンライン ヘルプの
SearchInfo( ) の項を参照してください。
もう一つのアプローチとして、SelChangedHandler と呼ばれるプロシージャを定義する方法があり
ます。ユーザが SelChangedHandler プロシージャを含むアプリケーションを実行している場合、選
択内容が変化するたびに自動的にこのプロシージャが呼び出されます。ユーザが MapInfo Professional
の標準 [選択] ツール (MapInfo Professional のメイン ボタンパッドの左上隅にある矢印アイコン) を使
用してオブジェクトをクリックして選択すると、アプリケーションは SelChangedHandler プロシー
ジャの中で対応する文を発行することができます。
カスタム ボタンパッドへの標準ボタンの追加
カスタム ボタンパッドには、MapInfo Professional のあらゆる標準ボタン ([選択] ボタンなど) を含
めることができます。たとえば、次の文を使用すると、MapInfo Professional の標準 [選択] ボタン
とカスタム ボタンの合計 2 個のボタンを含むカスタム ボタンパッドを作成できます。
Create ButtonPad "ToolBox" As
’ Here is the standard Select button...
ToolButton
Icon MI_ICON_ARROW
Calling M_TOOLS_SELECTOR
HelpMsg "Select objects for editing\nSelect"
MapBasic 11.0
119
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
ボタンパッド (ツールバー)
’ Here is a custom ToolButton...
ToolButton
Icon MI_ICON_LINE
DrawMode DM_CUSTOM_LINE
Calling sub_procedure_name
HelpMsg "Draw New Delivery Route\nNew Route"
最初のボタンの Calling 節で指定される M_TOOLS_SELECTOR は、MENU.DEF に定義される数
値コードです。このコードは、MapInfo Professional の [選択] ボタンを表します。各標準 MapInfo
Professional ボタンは、MENU.DEF の中に対応するコードを持っています。2 番目のボタンはカ
スタム ボタンであるため、Calling 節に数値コードではなくプロシージャ名を指定します。
ここで、カスタム ボタンは DrawMode 節を含むのに対し、[選択] ボタンは同節を含まない点に注
意してください。カスタム パッド上に標準ボタンを追加するときは、DrawMode 節を省略する必
要があります。これは、MapInfo Professional の各標準ボタンには、あらかじめ定義された描画
モードが既に含まれているからです。DrawMode 節は、カスタム ツールボタンを作成する場合に
だけ指定します。
警告 :
ツールボタンとトグルボタンは互換性を持ちません。キーワードを ToolButton から
ToggleButton に (またはその逆に) 変更することで、2 つのボタン タイプを切り替え
ることはできません。ToolButtons は、ユーザによるウィンドウのクリックに反応
して x/y 座標を返します。一方、ToggleButtons は座標を返さず、ユーザがボタン
をクリックすると即座に反応します。
カスタム ボタンパッドに標準 MapInfo Professional ボタンを追加する場合は、ツールボタンを
誤ってトグルボタンに変更してしまわないよう注意してください。MapInfo Professional の標準ボ
タンがどのように定義されているかを確認するには、MapInfo Professional のメニュー ファイル
MAPINFOW.MNU を参照してください。このメニュー ファイルには、MapInfo Professional のボ
タンパッドを定義する Create ButtonPad 文が含まれています。
L
MAPINFOW.MNU のボタン定義をコピーして、プログラムの中に貼り付けることもできます。
ボタンへのヘルプ メッセージの割り当て
ユーザは、アイコンを見ただけではそのツールバー ボタンの機能を理解できないことがあります。
そのため、MapBasic では、ユーザを助ける 2 種類のヘルプ メッセージを画面上に作成できます。
•
ステータス バー ヘルプ :ボタンの簡単な説明を表示します。このタイプのヘルプ メッセージ
は、MapInfo Professional のステータス バーに表示されます (ステータス バーが表示されてい
る場合)。
•
ツールチップ ヘルプ :ボタンの名前を表示します。このタイプのヘルプ メッセージは、マウス
カーソルの隣に表示されます。
以前のバージョンの MapInfo Professional では、ユーザがボタンをクリックしたときにしかステー
タス バー ヘルプが表示されませんでした。バージョン 4.0 以降では、ステータス バー ヘルプおよ
びツールチップ ヘルプは、ユーザがマウス カーソルをツールバー ボタンに合わせると表示される
ようになっています。
MapBasic 11.0
120
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
ボタンパッド (ツールバー)
ど ち ら の ヘ ル プ メ ッ セ ー ジ も、Create ButtonPad 文および Alter ButtonPad 文の中にある
HelpMsg 節によって定義されます。HelpMsg 節では、まずステータス バー ヘルプ メッセージを
含む 1 つの文字列を指定して、その後に \n とツールチップ メッセージをこの順番で続けます。
次に例を示します。
Create ButtonPad "Custom" As
PushButton
Icon MI_ICON_ZOOM_QUESTION
Calling generate_report
HelpMsg " このボタンはレポートを作成します \n レポート作成 "
Show
この例では、カスタム ボタンの状況バー ヘルプ メッセージは "このボタンはレポートを作成します"
です。また、ツールチップ メッセージは "レポート作成" です。ステータス バーの表示/非表示に
は、StatusBar 文を使用します。
画面上端へのボタンパッドのドッキング
Alter ButtonPad を使用すると、ツールバーを画面の上端に連結できます。(この操作は、ツール
バーの "ドッキング" と呼ばれることがあります。) たとえば、次の文でメイン ツールバーをドッ
キングします。
Alter ButtonPad "Main" Fixed
キーワード Fixed は、パッドが画面上端にドッキングされることを指定します。ドッキングされ
たツールバーを移動表示可能なツールバーにするには、Fixed の代わりに Float と指定します。
Fixed と Float の各キーワードは Create ButtonPad 文の中でも使用できるため、ツールバーの作
成と同時にそのドッキング ステータスを設定することもできます。
ツールバーが現在ドッキングされているかどうかを特定するには、ButtonPadInfo( ) 関数を使用
します。
その他のボタンパッド機能
MapBasic は、さらに次のようなボタンパッド関連機能を提供します。
•
選択可能/不可能ボタン :MapBasic プログラムでは、必要に応じてカスタム ボタンを選択可能
または選択不可能にすることができます。詳細については、『MapBasic リファレンス ガイ
ド』の Alter ButtonPad の項を参照してください。
•
カスタム ボタン アイコン :リソース エディタを使用してカスタム アイコンを作成し、それら
のカスタム アイコンを MapBasic のボタンパッド上で使用することができます。
•
カスタム描画カーソル :このカーソルは、マウスを動かすにつれて移動する形状のことです。デ
フォルトでは、どの MapBasic のカスタム ボタンにもポインタの形をしたシンプルなカーソル
が使用されます。ただし、リソース エディタを使用してカスタム カーソルを作成することも可
能です。
MapBasic 開発環境には、リソース エディタは含まれていません。ただし、MapBasic プログ
ラムでは他のリソース エディタで作成したビットマップやカーソルを統合することができま
す。カスタム アイコンおよびカスタム カーソルの作成の詳細については、「統合マッピン
グ」を参照してください。
MapBasic 11.0
121
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
カーソル
カーソル
MapInfo Professional ユーザは、X キーを押すことによって十字型カーソル スタイルを変更できま
す。MapInfo Professional アプリケーションのカーソルと MapBasic アプリケーションのカーソルは
別々に管理されているので、MapInfo Professional のカーソル スタイルを変更しても、MapBasic の
カーソル スタイルは変更されません。その逆も同じです。
MapBasic では、MapInfo Professional のツールの十字型カーソル スタイルの変更をサポートして
いません。また、MapBasic アプリケーション内で X キーを押すことによるカーソル スタイルの
変更もサポートしていません。ただし、MapBasic アプリケーション内で使用する十字型カーソル
スタイルにアクセスすることはできます。icons.def ファイルには、以下の十字型カーソルが定義
されています。
MI_CURSOR_CROSSHAIR
138
小さな青い十字型カーソルを表示します。
MI_CURSOR_LRG_CROSSHAIR
164
大きな青い十字型カーソルを表示します。
MI_CURSOR_TINY_CROSSHAIR
165
小さな XOR 十字型カーソルを表示します。
カーソル スタイルを設定する例を以下に示します。
Create ButtonPad "TestCursor" as ToolButton
calling my_handler cursor MI_CURSOR_TINY_CROSSHAIR
MapInfo Professional へのアプリケーションの統合
前の各セクションでは、カスタム メニュー、カスタム ダイアログ ボックス、カスタム ウィンド
ウ、およびカスタム ボタンパッドの作成を通じた MapBasic アプリケーション上でのユーザ イン
ターフェイスのカスタマイズについて説明しました。しかし、アプリケーションの開発完了後に
問題となるのが、「カスタム ユーザ インターフェイスが効果を発揮するようにアプリケーション
を実行するには、ユーザはどのようなステップを踏めばよいか?」という点です。
MapInfo Professional ユ ーザ は、[ ツ ー ル] > [MapBasic プ ロ グ ラ ム の 実 行] を 選 択 す る こ と で
MapBasic アプリケーションを実行できます。しかし、ユーザがわざわざ [ファイル] > [MapBasic
プログラムの実行] を選択しなくても、MapInfo Professional を実行するとアプリケーションが自
動的に実行されるように設定したい場合もあります。いわゆる "総合システム" を開発する場合
は、ユーザが MapInfo Professional を起動すると同時にアプリケーションも自動的に実行される
ような設定が理想的です。
Windows では、ショートカット アイコンのコマンド ラインを変更することができます。ショート
カット アイコンを右クリックして [プロパティ] を選択し、[ショートカット] タブをクリックします。
MapBasic 11.0
122
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
MapInfo Professional へのアプリケーションの統合
通常、MapInfo Professional では、実行と同時に [クイック スタート] ダイアログ ボックスが表示
されます ([スタートアップの設定] ダイアログ ボックスで、[クイック スタート] ダイアログ ボック
スを表示するためのチェックボックスがオンになっている場合)。しかし、MapInfo Professional の
起動コマンドに MapBasic アプリケーション名を追加すると、[クイック スタート] ダイアログ
ボックスは表示されません。アプリケーションの性質によって、この動作は都合の良い場合と悪
い場合があります。[クイック スタート] ダイアログ ボックスを非表示にせずにアプリケーション
を自動的に実行するには、別の方法を使用してアプリケーションを読み込む必要があります。こ
のような場合は、MapInfo Professional のコマンド ラインを変更する代わりに、スタートアップ
ワークスペースと呼ばれる特殊なワークスペースを作成することをお勧めします。
Startup ワークスペースによるアプリケーションの読み込み
"Startup" は、特殊なワークスペースの名前です。ユーザのシステム上に Startup ワークスペースが
存在する場合、MapInfo Professional は自動的にそのワークスペースを読み込みます。Startup
ワークスペースの中に Run Application 文が含まれる場合、指定されたアプリケーションが実行
されます。
たとえば、ScaleBar アプリケーションを実行する場合は、次のような Startup ワークスペースを作
成します。
!Workspace
!Version 600
!Charset Neutral
Run Application "scalebar.mbx"
最初の 3 行は、MapInfo Professional にそのファイルをワークスペースとして認識させます。4 行
目で、Run Application 文を実行して MapBasic アプリケーションを起動します。
Startup ワークスペースの存在は、[クイック スタート] ダイアログ ボックスの表示には何の影響も
与えません。MapInfo Professional は、Startup ワークスペース (存在する場合) を読み込んだ後
で、[クイック スタート] ダイアログ ボックスを表示します ([クイック スタート] ダイアログ ボッ
クスが表示されないよう設定されている場合は除く)。
Windows では、Startup ワークスペースには STARTUP.WOR という名前が付いており、MapInfo
Professional がインストールされているディレクトリまたはユーザのプライベート Windows ディ
レクトリ (WIN.INI が格納されているディレクトリ) の中に存在します。STARTUP.WOR が両方の
ディレクトリ内に存在する場合は、ユーザが MapInfo Professional を起動すると、両方のワークス
ペースが実行されます。
ネットワーク環境において、ある Startup ワークスペースをネットワーク上のすべての MapInfo
Professional ユーザに適用するには、その Startup ワークスペース ファイルを MapInfo Professional
がインストールされているディレクトリに格納する必要があります。すべてのネットワーク ユーザ
に同じ Startup ワークスペース ファイルを実行させたくない場合は、Startup ワークスペースを別の
場所に置きます (Windows では、ワークスペースをユーザのプライベート Windows ディレクトリの
中に置きます)。
MapBasic 11.0
123
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
ユーザ インターフェイスを効果的に使用するためのヒント
MapBasic によるワークスペースの操作
ワークスペースはテキスト ファイルであるため、Startup ワークスペースの作成および編集には任意
のテキスト エディタを使用できます。さらに、MapBasic プログラムではファイルの入出力が行える
ため、MapBasic プログラムにより Startup ワークスペースの管理を自動化することも可能です。
MapBasic プログラムによってワークスペース ファイルがどのように操作されるかを確認するに
は、次の操作を行います。
1. MapInfo Professional の [ツール] > [MapBasic プログラムの実行] コマンドを選択して TextBox
アプリケーションを実行します。
2. [Tools] > [TextBox] > [About TextBox] を選択して [About TextBox] ダイアログ ボックスを表示し
ます。
3. [About TextBox] ダイアログ ボックスで [Auto-Load] ボタンをクリックします。TextBox アプリ
ケーションの自動ロードをアクティブにするためのダイアログ ボックスが表示されます。
4. [Enable Automatic Loading] ダイアログ ボックスで [OK] を選択します。TextBox アプリケーショ
ンの自動実行が設定されたことを示すメッセージが表示されます。[OK] を選択して [About
TextBox] ダイアログ ボックスを閉じます。
5. MapInfo Professional を終了して再起動します。今回の MapInfo Professional セッションでは、
TextBox アプリケーションが自動的に実行されています。[ツール] > [MapBasic プログラムの実
行] を選択する必要はありません。
手順 4 で [OK] を選択した場合は、TextBox アプリケーションによって Startup ワークスペース
ファイルに Run Application 文が追加されます。Startup ワークスペース ファイルが存在しな
い場合、TextBox アプリケーションによって新しいワークスペース ファイルが作成されます。
Startup ワークスペースの管理は、auto_lib.mb というプログラム モジュールの中にある関数とプ
ロシージャを通じて行われます。MapInfo Professional に付属のサンプル プログラムの多くは、こ
れと同じ機能を備えています。たとえば、ScaleBar アプリケーションを自動的に実行するように
設定するには、[About ScaleBar] ダイアログ ボックスの [Auto-Load] ボタンを選択します。
auto_lib.mb プログラム モジュールは、MapBasic に含まれるサンプル プログラムの一つです。こ
のアプリケーションに自動読み込み機能を追加するには、auto_lib.mb の冒頭に現われるコメント
の指示に従ってください。
ユーザ インターフェイスを効果的に使用するためのヒント
アニメーション レイヤ
マップ ウィンドウ上のオブジェクトを頻繁に更新する場合は、アニメーション レイヤを利用する
とウィンドウの再描画がより速くなります。アニメーション レイヤの詳細については、「アニ
メーション レイヤを使用したマップ再描画の迅速化 (108 ページ)」を参照してください。
MapBasic 11.0
124
ユーザーズ ガイド
第 6 章: ユーザ インターフェイスの作成
ユーザ インターフェイスを効果的に使用するためのヒント
不必要なウィンドウ再描画の回避
アプリケーションによってマップ ウィンドウ (またはマップ ウィンドウ上のオブジェクト) が変更
されると、MapInfo Professional はその都度ウィンドウの再描画を行います。アプリケーションに
よって何回か変更操作が行われると、マップ ウィンドウも同じ回数再描画されます。これは、
ユーザをイライラさせかねません。
不必要なウィンドウの再描画を抑えるには、次の 2 とおりの方法があります。
•
特定のマップ ウィンドウの不必要な再描画を抑えるには、Set Map…Redraw Off 文を使用し
ます。その後で、そのマップ ウィンドウに影響を与えるあらゆる文を発行します。マップの更
新を終了した後は、Set Map…Redraw On 文を使用してウィンドウの再描画を許可します。こ
うすることで、1 回の再描画ですべての変更箇所をウィンドウに表示できます。
•
すべての MapInfo Professional ウィンドウの不必要な再描画を抑えるには、Set Event Processing
Off 文を使用します。さまざまなウィンドウの更新を終了してから、Set Event Processing On 文
を発行します。こうすることで、画面は 1 回だけ再描画されます。
メッセージ ウィンドウの破棄
Print 文を使用すると、メッセージ ウィンドウにテキストを出力できます。
L
ただし、メッセージ ウィンドウに大量のテキストを出力すると、それ以降の Print 文の処理
が大幅に遅くなります。
プログラムでメッセージ ウィンドウに大量のテキストを出力する場合は、Print Chr$(12) 文を
発行してメッセージ ウィンドウを定期的にクリアします。
進捗バー ダイアログ ボックスの表示抑制
アプリケーションで MapInfo Professional の最小化を行う場合は、Set ProgressBars Off 文を使
用して進捗バーが表示されないようにすることをお勧めします。
MapInfo Professional の最小化処理中に進捗バーが表示されると、進捗バーは最小化処理が完了す
るまでフリーズします。進捗バーの表示を抑えると、MapInfo Professional を最小化処理中も操作
を継続することができます。
MapBasic 11.0
125
ユーザーズ ガイド
テーブル操作
MapBasic には、テーブルを使った作業に必要なあらゆる文および関数が用意
されています。たとえば、Alter Table 文ではテーブル定義の変更を、Fetch
ではテーブルのレコードの検索を行えます。また、Import 文はテキスト ファ
イルからの MapInfo テーブルの作成、Export 文は異なる形式へのテーブルの
エキスポートを可能にします。
この章は、MapInfo テーブルの管理に使用できる MapBasic の文および関数に
ついて説明します。各文および詳細については、『MapBasic リファレンス』
を参照してください。
このセクションの構成
Š
Š
Š
Š
Š
Š
Š
Š
Š
Š
Š
Š
MapBasic からテーブルを開く . . . . . . . . . . . . . . . 127
テーブルの新規作成. . . . . . . . . . . . . . . . . . . . 134
システム レイヤへのアクセス . . . . . . . . . . . . . . . 139
レイアウト ウィンドウへのアクセス . . . . . . . . . . . . 140
マルチユーザ編集. . . . . . . . . . . . . . . . . . . . . 140
テーブルを構成するファイル. . . . . . . . . . . . . . . . 144
ラスタ イメージ テーブル . . . . . . . . . . . . . . . . . 145
メタデータの操作. . . . . . . . . . . . . . . . . . . . . 146
シームレス テーブルの操作 . . . . . . . . . . . . . . . . 149
DBMS データへのアクセス . . . . . . . . . . . . . . . . 151
リンク テーブルを使用したリモート データベースへのアクセスと、
その更新 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .154
テーブル操作をより効果的に行うためのヒント. . . . . . . . 155
7
第 7 章: テーブル操作
MapBasic からテーブルを開く
MapBasic からテーブルを開く
MapBasic アプリケーションがテーブルにアクセスするには、まずそのテーブルが開かれていなけ
ればなりません。テーブルを開くには、Open Table 文を使用します。たとえば、次の文で World
テーブルを開きます。
Open Table "C:\mapinfo\data\world"
Browse 文は、テーブルをその別名 (Earth) で識別します。テーブルの別名はそのテーブルが開い
ている間だけ有効で、 テーブルの名前が永久的に変更されたわけはありません。テーブルの名前
を完全に変更するには、Rename Table 文を使用します。
Open Table 文にオプションの Interactive 節を含めたときに、指定したテーブルが指定のディレク
トリ内に見つからない場合、MapInfo Professional はダイアログを表示してユーザにそのテーブル
を探すよう求めます。キーワード Interactive を省略したときにテーブルが見つからない場合は、
Open Table 文によってエラーが生成されます。
実行時のテーブル名の特定
MapBasic でテーブルを参照するときは、文字列式を使用するか、プログラムにテーブル名を記述
します。たとえば、プログラムが実行されるとき、States、Pipeline、Parcels というテーブルが既
に開かれている場合は、それぞれの名前をプログラムで明示的に指定することができます。
Select * From States
Browse * From Pipeline
i = NumCols(Parcels)
プログラムが扱うテーブルの名前を限定したい場合もあれば、限定したくない場合もあります。た
とえば、ユーザに開いたテーブルのリストからテーブルを選ばせたい場合は、 選択されるテーブル
の名前を予め予想することはできないため、それをプログラムの中に記述することはできません。
テーブル名を格納するには、文字列変数を使用します。Zoning という名前のテーブルが開いてい
る場合は、次のような文を発行することができます。
Dim work_table As String
work_table = "Zoning"
Browse * From work_table
同名の 2 つのテーブルを開く
同じ別名を持った 2 つのテーブルを開こうとすると、MapInfo Professional によってデフォルト以
外のテーブルの別名が割り当てられます。たとえば、"C:\data1994\sites" というテーブルを開く
と、MapInfo Professional によってそのテーブルにデフォルトの別名 ("sites") が割り当てられま
す。しかし、続いてそれと同じデフォルトの別名を持ったテーブル (例 : "C\backup\sites") を開こ
うとすると、MapInfo Professional は 2 つのテーブルを区別するために、2 番目のテーブルにはデ
フォルト以外の別名を割り当てる必要があります。この例では、MapInfo Professional は 2 番目の
テーブルに "sites_2" というような別名を割り当てる可能性があります。
Open Table 文にキーワード Interactive を含めると、MapInfo Professional はダイアログ ボックス
を表示して、テーブルにデフォルト以外の別名を割り当てるようユーザに求める場合がありま
す。キーワード Interactive を含めない場合は、自動的にテーブルの別名が割り当てられます。
MapBasic 11.0
127
ユーザーズ ガイド
第 7 章: テーブル操作
MapBasic からテーブルを開く
この動作によって、テーブルがどの別名で開かれたかが推測できなくなる場合もあります。
しかし、次の例に示すように、TableInfo( ) 関数を使うとテーブルが開かれた別名を決定すること
ができます。
Include "mapbasic.def"
Dim s_filename As String
Open Table "states" Interactive
s_filename = TableInfo(0, TAB_INFO_NAME)
Browse * from s_filename
TableInfo(0, TAB_INFO_NAME) 関数は、一番最後に開かれたテーブルの別名を返します。
MapInfo 以外のファイルをテーブルとして開く
MapInfo テーブル形式で格納されていないファイル (dBASE、Lotus、Excel、またはテキスト ファイ
ルなど) に、テーブルとしてアクセスすることもできます。ただし、MapBasic からこれらのファイ
ルにアクセスするためには、まずそのファイルを登録する必要があります。ファイルを登録する
と、MapInfo Professional はそのファイルに伴うテーブル (.tab) ファイルを作成します。各ファイル
は一度登録するだけでかまいません。登録したファイルは、テーブルとして扱うことができます。
次の文は、dBASE ファイルを登録します。
Register Table "income.dbf" Type DBF
登録されたファイルはテーブルと見なされ、他の MapInfo テーブル と同様に開くことができるよ
うになります。テーブルを開くには、Open Table 文を発行します。
Open Table "income" Interactive
MapInfo Professional のテーブル検索機能は、テーブルのソース (MapInfo 以外のファイルかどう
か) に影響されることはありません。たとえば、SQL Select 文を発行すると、そのテーブルがスプ
レッドシートに基づいているかまたはデータベース ファイルに基づいているかに関係なく、テー
ブルからデータを抽出することができます。
ただし、MapInfo Professional のテーブル変更機能は、一部分テーブルのソースに依存します。
テーブルが .dbf ファイルに基づいている場合、MapInfo Professional でそのテーブルを変更するこ
とができます。このようなテーブルを MapInfo Professional で更新すると、実際には元の .dbf
ファイルが変更されることになります。ただし、MapInfo Professional ではスプレッドシートまた
は ASCII (テキスト) ファイルに基づくテーブルを変更することはできません。あるテーブルを変
更しなければならないときに、そのテーブルがスプレッドシートまたは ASCII ファイルに基づい
て い る た め MapInfo Professional で変更できない場合は、そのテーブルのコピーを (Commit
Table...As 文を使用して) 作成し、そのコピーを変更します。
開いた MapInfo テーブルからレポート ファイルを作成
MapInfo Professional 付属の Seagate Crystal Reports が提供する業界標準の Report writer により MapInfo
Professional から高品質表形式レポートの作成が可能になります。Crystal Reports のわかりやすい環境
でプロ仕様のレポートを作成してください。『MapBasic リファレンス ガイド』の Create Report
From Table 文および Open Report 文の項を参照してください。
MapBasic 11.0
128
ユーザーズ ガイド
第 7 章: テーブル操作
テーブルの行およびフィールド値の読み取り
テーブルの行およびフィールド値の読み取り
MapBasic プログラムは、次の手順に従って、テーブルの指定行の指定フィールドの値にアクセス
することができます。
1. Fetch 文を使用し、検索するテーブルの行を指定します。この操作によって、現在行が設定さ
れます。
2. テーブル参照式 (例:tablename.columnname) を使い、現在行の指定フィールドにアクセス
する。
たとえば、次のプログラムは、World テーブルの 1 行目の Coutnry フィールドの内容を読み取り
ます。
Dim s_name As String
Open Table "world" Interactive
Fetch First From world
s_name = world.Country
開いたテーブルは、いずれも現在行設定を持っています。この設定は行カーソルと呼ばれます (マ
ウスを動かすと画面上を移動する形状を指すマウス カーソルとは違います)。Fetch 文を発行する
と、行カーソルはテーブル上の指定の行に移動します。この後、テーブル参照 (例 : world.country)
によって、カーソルで指定された行からデータが抽出されます。
Fetch 文では、いくつかの方法を使用してカーソルの位置決めを行えます。たとえば、カーソルを
1 行ずつ前後に移動させたり、特定の番号の行に置いたり、テーブルの最初または最後の行に設定
したりできます。Fetch 文がテーブルの最終行を過ぎて読み取りを行おうとしたかを判断するに
は、EOT( ) 関数を呼び出します。Fetch 文または EOT( ) 関数の詳細については、『MapBasic リ
ファレンス ガイド』を参照してください。
MapBasic 言語では、特定フィールドの値を参照する次の 3 つのタイプの式が用意されています。
上の例では、tablename.columnname 構文 (例 : world.country) が使用されています。
別のフィールド参照として、tablename.col# があります。このタイプの式では、フィールドは名前
ではなく数値で指定されます (col1 がテーブルの最初のフィールドを表します)。Country は World
テーブルの最初のフィールドなので、上の割り当て文は次のように書き換えることができます。
s_name = world.col1
3 番目のフィールド参照は、tablename.COL (数値式) の形を取ります。このタイプの参照では、
フィールド番号は括弧の中の数値式として指定されます。したがって、上の割り当て文は次のよ
うに書き換えることができます。
Dim i As Integer
i = 1
s_name = world.col(i)
フィールド参照構文
例
tablename.columnname
world.country
tablename.COLn
world.COL1
tablename.COL(n)
world.COL(i)
MapBasic 11.0
129
ユーザーズ ガイド
第 7 章: テーブル操作
テーブルの行およびフィールド値の読み取り
この構文を使用すると、実行時に参照するフィールドを決定する MapBasic プログラムを作成でき
ます。
テーブル参照におけるテーブル名は、既にテーブル名が含まれている文ではオプションとなりま
す。たとえば、Browse 文では、フィールド名を指定してからテーブル名を指定することが必要に
なります。しかし、ここではテーブル名が既に文 (From 節) の中で明示指定されているため、行の
冒頭のフィールド参照には、tablename を含む必要はありません。
Select Country, Population/1000000 From World
Browse Country, Col2 From Selection
Select 文も、検索するテーブルの名前を指定する From 節があります。Select 文の中のフィールド
名には、tablename. 接頭辞を必要としません (Select 文で 1 つのテーブルだけを検索する場合)。
ただし、Select 文の From 節が複数のテーブルを含む場合は、フィールド参照に tablename. 接
頭辞が含まれなければなりません。SQL Select 文操作の一般的な説明については、『MapInfo
Professional ユーザーズ ガイド』か、『MapBasic リファレンス ガイド』の Select の項を参照して
ください。
場合によっては、COLn または COL(n) のフィールド参照法を使わなければならないこともありま
す。上の例では、Select 文は 2 つのフィールドを識別します。 この 2 番目のフィールドは、その
値が等式 (Population/1000000) から派生しているところから "派生" フィールドと呼ばれてい
ます。続く Browse 文は、この派生フィールドを COL2 または COL(2) と参照することしかでき
ません。これは、派生した Population/1000000 式が有効なフィールド名ではないからです。
別名データ型によるフィールド参照
上の例では、明示的に "ハードコード" フィールド名を使用しました。たとえば、次の文は、
Country フィールドと Population フィールドを明示的に識別します。
Select Country, Population/1000000 From World
場合によっては、アプリケーションの実行時まで検索するフィールドの名前を知ることができな
いため、フィールド参照を明示的に指定できないこともあります。たとえば、ユーザがフィール
ド名のリストからフィールドを選択できるようなアプリケーションでは、ユーザがどのフィール
ドを選択するかは実行時までわかりません。
MapBasic は、実行時に評価されるフィールド式の格納に使う Alias (別名) 変数タイプを提供しま
す。文字列変数と同様に、Alias 変数にもテキスト文字列を割り当てることができます。MapBasic
は、フィールドに関連した文の中に Alias 変数が現われると、常にその Alias 変数の内容をフィー
ルド名として解釈します。
次に例を示します。
Dim val_col As Alias
val_col = "Inflat_Rate"
Select * From world Where val_col > 4
MapBasic は、val_col (別名 Inflat_Rate) の内容を Select 文に代入し、インフレ率が 4% を
超える国をすべて選択します。
L
MapBasic 11.0
別名の長さは 32 文字までです。
130
ユーザーズ ガイド
第 7 章: テーブル操作
テーブルの行およびフィールド値の読み取り
下の例では、サブプロシージャ MapIt でテーブルを開いてマップを作成し、特定の値と同じかそ
れ以上の値を持つ特定のフィールドからすべてのレコードを選択します。MapIt は、実行時に評価
されるフィールド参照を Alias 変数を使用して作成します。
Include "mapbasic.def"
Declare Sub Main
Declare Sub MapIt( ByVal filespec As String,
ByVal col_name As String,
ByVal min_value As Float )
Sub Main
Call MapIt("C:\MAPINFOW\MAPS\WORLD.TAB", "population", 15000000)
End Sub
Sub MapIt( ByVal filespec As String,
ByVal col_name As String,
ByVal min_value As Float )
Dim a_name As Alias
a_name = col_name
Open Table filespec
Map From TableInfo(0, TAB_INFO_NAME)
Select * From TableInfo(0, TAB_INFO_NAME)
Where a_name >= min_value
End Sub
この MapIt プロシージャでは、Select 文は明示フィールド名ではなく Alias 変数 (a_name) を指定
します。ここで、col_name パラメータは Alias パラメータではないことに注意してください。こ
れは、MapBasic が値により渡される Alias パラメータを許可しないからです。この制限を克服す
るため、フィールド名は値により渡される文字列パラメータによって渡され、この文字列パラ
メータの内容がローカル Alias 変数 (a_name) にコピーされています。
上の例では、Alias 変数がフィールド名 ("population") を表す文字列を含んでいます。また、Alias
変数は tablename.columnname という形の完全なフィールド参照を含むこともできます。次の例
は、この場合の構文を示したものです。
Dim tab_expr As Alias
Open Table "world"
Fetch First From world
tab_expr = "world.COL1"
Note tab_expr
上の Note 文は、次の文と同じ効果を持っています。
Note world.COL1
適用範囲
tablename.columnname 構文 (例 : world.population) は、カスタム Type の要素の参照に使
用される構文に似ています。MapBasic は、あらゆる name.name 式を Type 変数の要素の参照と
して解釈しようとします。式がタイプ要素として解釈できない場合、MapBasic は開いたテーブル
にあるフィールドの参照としてその式を解釈しようとします。これにも失敗すると、MapBasic に
よって実行時エラーが生成されます。
MapBasic 11.0
131
ユーザーズ ガイド
第 7 章: テーブル操作
テーブルの行およびフィールド値の読み取り
"RowID" フィールド名を使用した行番号 (レコード番号) の参照
RowID は、テーブルの行の行番号を表す特殊なフィールドの名前です。RowID はフィールドとし
て解釈できますが、実際にテーブルの中には格納されません。RowID は、使用できても目には見
えない "仮想フィールド" であると考えてください。テーブルの行の RowID 値は、1 行目が 1、2
行目が 2 ... というようになっています。
次の例では、World テーブルの最初の行を選択します。
Select * from world Where RowID = 1
次の例は、RowID を使い、1990 年の人口が中間値を超える州を Select を通じてすべて選択します。
Dim median_row As Integer
Select * From states Order By pop_1990 Into bypop
median_row = Int(TableInfo(bypop,TAB_INFO_NROWS)/2)
Select * From bypop Where RowID > median_row
TableInfo() 関数は、仮想テーブル bypop の行の合計数を返すため、変数 median_row には中間値
人口を持つ州のレコード番号が含まれることになります。最後の Select 文は、並べ替えられた
テーブル bypop で中間値の後に現われるすべての州を選択します。
テーブルから行を削除しても、その行は実際にはテーブルの圧縮処理を実行するまで削除されませ
ん (削除された行はブラウザ ウィンドウでグレイ表示されます)。削除された行も、依然として
RowID 値を持ちます。したがって、テーブルから行を削除しても、テーブルの RowID 値には影響は
およびません。ただし、行を削除した後でその変更を保存してテーブルを圧縮すると、そのテーブ
ルの RowID 値 は変化します。テーブルを圧縮するには、MapInfo Professional の [テーブル] > [テー
ブル管理] > [テーブルの圧縮] コマンドを選択するか、MapBasic の Pack Table 文を発行します。
"Obj" フィールド名を使用した図形オブジェクトの参照
Obj フィールドは、テーブルの図形オブジェクトを参照する特殊なフィールドの名前です。図形オ
ブジェクトを持つすべてのテーブルに 1 つの Obj フィールドがあります。ただし、この Obj フィー
ルドは、通常、ブラウザ ウィンドウには表示されません。関連する図形オブジェクトを持たない行
は、空の Obj 値を持ちます。
次の例では、図形オブジェクトを持たない行をすべて選択します。
Select * From sites Where Not Obj
これは、テーブルのジオコード操作ですべてのレコードが一致しなかった時に、一致しなかった
レコードをすべて選択したい場合などには便利です。
次の例では、テーブルの図形オブジェクトをオブジェクト変数の中にコピーします。
Dim o_var As Object
Fetch First From sites
o_var = sites.obj
図形オブジェクトの詳細については、図形オブジェクトを参照してください。
MapBasic 11.0
132
ユーザーズ ガイド
第 7 章: テーブル操作
テーブルの行およびフィールド値の読み取り
テーブルのマップ アドレス検索
MapInfo Professional ではマップの住所を [検索] > [キー指定検索] から検索できますが、 MapBasic
プログラムでも同様に Find 文と Find Using 文により住所を検索できます。Find Using 文では検
索するテーブルを指定し、Find 文により住所の地理座標 (例 : "23 Main St") を調べます。また、
Find 文ではアンパサンド (&) を 2 つ並べて道路名をつなげることにより (例 : "Pawling Ave &&
Spring Ave")、その道路の交差点を検索することも可能です。
Find 文を発行した後、CommandInfo( ) を呼び出し、住所が見つかったかどうかを調べます。次
に CommandInfo( ) をもう一度呼び出すことにより、その住所の地理座標を特定することができ
ます。MapInfo Professional の [検索] > [キー指定検索] と違い、MapBasic の Find 文は自動的には
マップ ウィンドウの中心の再設定を行いません。見つかった場所がマップ ウィンドウの中心に表
示されるようにするには、Center 節を含む Set Map 文を発行します。また、Find 文は、その住
所が見つかった場所を示す印をマップに自動的には追加しません。シンボルを追加したい場合
は、CreatePoint( ) 関数または Create Point 文を使用します。コード例については、『MapBasic
リファレンス ガイド』またはオンライン ヘルプの Find の項を参照してください。
ジオコード
自動モードでジオコード化を行うには
1. Fetch 文によりテーブルから住所を取り出します。
2. Find Using 文と Find 文を使用して住所を検索します。
3. Find 文で住所が見つかったかどうかを CommandInfo( ) を呼び出して調べます。CommandInfo( )
をもう一度呼び出し、見つかった住所の x 座標と y 座標を調べます。
4. CreatePoint( ) 関数または Create Point 文を使用してポイント オブジェクトを作成します。
5. Update 文を使用して、作成したポイント オブジェクトをテーブルに保存します。
対話モードでジオコード化を行うには、次の文を発行します。
Run Menu Command M_TABLE_GEOCODE
大量のデータをジオコード化する必要がある場合は、MapMarker (英語版のみ) をご購入くださ
い。MapMarker のジオコード処理は MapInfo Professional よりも高速であり、全米をワンパスで
ジオコード化することができます。MapBasic アプリケーションでは、この MapMarker をプログ
ラミング インターフェイスから呼び出して制御することができます。MapMarker の詳細について
は、Pitney Bowes Software Inc. 販売代理店にお問い合わせください。電話番号は、このマニュア
ルやその他の MapInfo 製品マニュアルの巻頭に記されています。
MapBasic 11.0
133
ユーザーズ ガイド
第 7 章: テーブル操作
テーブルへの行 (レコード) およびフィールド値の書き込み
SQL 検索の実行
MapInfo Professional には、[検索] > [SQL 検索] を選択するだけで実行できる優れた検索機能があり
ます。MapBasic プログラマは、MapBasic の Select 文を使用することで、[SQL 検索] ダイアログ
ボックスの機能をフルに活用することができます。MapBasic の Select 文を使用すれば、テーブル
のフィルタ、並べ替え、小合計、または関係結合が行えます。詳細については、『MapBasic リ
ファレンス ガイド』の Select 文の項を参照してください。
テーブルおよびフィールド参照のエラー チェック
MapBasic は、テーブルおよびフィールドの参照をコンパイル時に解決することはできません。た
とえば、プログラムが states.pop というフィールドを参照する場合、MapBasic のコンパイラは、
states テーブルの中に実際に pop というフィールドがあるかどうかを検証することはできませ
ん。つまり、フィールド参照の中にタイプミスがあっても、コンパイル時にエラーが生じること
はありません。ただし、フィールド参照 (例 : states.pop) にタイプミスがあると、プログラム実行
時にエラーが生じます。
次の方法で、実行時エラーが起きる可能性を最小限に抑えます。適宜 Open Table 文で Interactive
節を使用するようにします。こうすると、テーブルが見つからない場合は、ユーザにテーブルを探
すよう求めるダイアログ ボックスが表示されます。テーブルは、デフォルトの別名で開かれている
とは限りません。Open Table 文を発行した後、TableInfo(0, TAB_INFO_NAME) 関数を呼び出
して、テーブルに割り当てられた別名を特定します。テーブルを開く操作の詳細については、
『MapBasic リファレンス ガイド』の Open Table の項を参照してください。
テーブルへの行 (レコード) およびフィールド値の書き込み
テーブルに新しい行を追加するには、Insert 文を使用します。既存の行のフィールドに格納された
値を変更するには、Update 文を使用します。これらの文の詳細については、『MapBasic リファ
レンス ガイド』またはオンライン ヘルプの該当する項を参照してください。
テーブルに新しい行を追加する場合や、テーブルの既存の行を変更する場合は、Commit 文を発行
して変更内容を保存する必要があります。また、未保存の編集内容を破棄するには、RollBack 文
を発行します。
テーブルの新規作成
空のテーブルを新規作成するには、Create Table 文を使用します。また、テーブルにインデック
スを追加するには Create Index 文を、テーブルをマップ作成可能にするには Create Map 文を使
用します。
次の例では、名前、住所、都市、金額、注文日、顧客 ID の各フィールドを持つマップ作成可能
テーブルを作成します。名前フィールドと顧客 ID フィールドにはインデックスが付きます。
MapBasic 11.0
134
ユーザーズ ガイド
第 7 章: テーブル操作
テーブルの新規作成
Create Table CUST
(Name Char(20),
Address Char(30),
City Char(30),
Amount Decimal(5,2),
OrderDate Date,
CustID Integer)
File "C:\customer\Cust.tab"
Create Map For CUST CoordSys Earth
Create Index On CUST (CustID)
Create Index On CUST(Name)
また、既存のテーブル (例 : Selection) を Commit 文を使って新しいテーブルとして保存したり、
Import 文を使ってテーブルをインポートしたりすることで、テーブルを作成することも可能です。
テーブルの定義の変更
どのテーブルにもテーブル定義があります。テーブル定義は、そのテーブルにいくつのフィールド
があるのか、またどのフィールドにインデックスが付いているのか、などを定義するものです。
MapInfo Professional ユーザは、MapInfo Professional の [テーブル] > [テーブル管理] > [テーブル構
造] コマンドを選択してテーブル定義を変更することができます。MapBasic プログラムでは、Alter
Table や Create Index などの文の発行によってテーブル定義を変更することができます。
原則として、テーブル上に未保存の編集内容が存在する間は、そのテーブルの定義は変更できま
せん。テーブルに行を追加した後でまだテーブルを保存していない場合は、テーブル上に未保存
の編集内容が存在することになります。テーブル上に未保存の編集内容が存在する場合は、テー
ブルの定義を変更する前に、まずその編集内容を保存する (Commit 文を発行する) か、廃棄する
(Rollback 文を発行する) 必要があります。
Alter Table 文は、テーブルの定義を変更します。次の例では、Address フィールドの名前を ShipAddress
に変更する、Name フィールドの長さを 25 文字にする、Amount フィールドを削除する、Zipcode
フィールドおよび Discount フィールドを新たに追加する、フィールドの順序を並び替えるなどの操作を
行います。
Alter Table CUST (Rename Address ShipAddress,
Modify Name Char(25),
Drop Amount
Add Zipcode Char(10),
Discount Decimal(4,2)
Order Name, Address, City, Zipcode,
OrderDate, CustID, Discount)
スプレッドシートまたはデリミタ付き ASCII ファイルに基づいて作成されたテーブルの定義は変
更できません。また、Selection テーブルの定義も変更できません。
Add Column 文は、テーブルに一時フィールドを追加します。Add Column 文を使用すると、別
のテーブルの値に基づいて計算されるダイナミック フィールドが作成されます。また、Add
Column を使用して、あるテーブルのオブジェクトと別のテーブルのオブジェクトの重なり方に基
づく比率データ併合を行う、高度なポリゴン追加操作を実行することもできます。たとえば、町
MapBasic 11.0
135
ユーザーズ ガイド
第 7 章: テーブル操作
テーブルの新規作成
の領域を示すテーブルと洪水危険地域を示すテーブルがあるとします。その全体または一部が洪
水危険エリアに入る町もあれば、危険エリアの外にある町もあります。Add Column 文を使用し
て、町の領域テーブルから人口統計情報を抽出し、その情報に基づいて洪水危険エリア内の統計
データを計算します。Add Column 文の詳細については、『MapBasic リファレンス ガイド』を
参照してください。
インデックスの作成およびテーブルをマップ作成可能にする操作
テーブルにインデックスがあると、MapInfo Professional は検索を最適 (速) に行うことができま
す。操作の中には、MapInfo Professional の [キー指定検索] や [ジオコード] など、フィールドにイ
ンデックスが付いている必要があるものもあります。たとえば、[キー指定検索] コマンドを使用し
てデータベース上の顧客を名前で検索するには、まず名前のフィールドにインデックスを付けな
ければなりません。検索操作の多くでは、フィールドにインデックスが付いていると、Select 文
はより速く実行されます。SQL 結合は、Where 節に指定されたフィールドにインデックスが付い
ていない場合、一時インデックスを作成します。インデックスを付けられるフィールドの数に制
限はありません。Obj フィールドには常にインデックスが付いています。
MapBasic でインデックスを作成するには、Create Index 文を使用します。インデックスを削除す
るには、Drop Index 文を使用します。MapBasic では、別のソフトウェア パッケージで作成された
インデックスは使用できません。また、式にインデックスを付けることもできません。インデック
スを付けても、ブラウザ ウィンドウ上に表示される行の順番は変わりません。ブラウザ ウィンド
ウの行の順番を操作するには、Order By 節を含む Select 文を発行して選択内容を参照します。
テーブルの定義情報の読み取り
TableInfo( )、ColumnInfo( )、NumTables( ) の各関数は、現在開いているテーブルについての情
報を決定します。
•
•
•
TableInfo( ) は、テーブルの行数、フィールド数、及びそのテーブルがマップ作成可能であるか
を戻します。
ColumnInfo( ) は、フィールド名、フィールドのデータ型、フィールドにインデックスが付い
ているかどうかなど、テーブルのフィールドに関する情報を返します。
NumTables( ) は、現在開いているテーブル (Query1 などの一時テーブルを含む) の数を返し
ます。
次のプログラムは、開いているテーブルを特定し、それらのテーブルの名前を配列の中にコピーし
ます。
Include "mapbasic.def"
Dim i, table_count As Integer
Dim tablenames() As String
’ determine the number of open tables
table_count = NumTables()
’ Resize the array so that it can hold
’ all of the table names.
ReDim tablenames(table_count)
MapBasic 11.0
136
ユーザーズ ガイド
第 7 章: テーブル操作
テーブルの新規作成
’ Loop through the tables
For i = 1 To table_count
’ read the name of table # i
tablenames(i) = TableInfo(i, TAB_INFO_NAME)
’display the table name in the message window
Print tablenames(i)
Next
Selection テーブルを使った作業
Selection は、現在選択されている一組の行を表す特殊なテーブルの名前です。MapBasic プログラム
(またはエンドユーザ) は、Selection テーブルを他のテーブルと同じように扱うことができます。
たとえば、現在選択されている一組の行を参照するには、次の文を発行します。
Browse * From Selection
このようにして Selection テーブルにアクセスすると、MapInfo Professional はテーブルのスナップ
ショットを取り、そのスナップショットに QueryN という名前を付けます。ここで、N は 1 以上の
整数値を示します。Selection テーブルと同様に、QueryN も一時テーブルです。SelectionInfo( ) 関
数を使用すると、MapInfo Professional によって現在の Selection テーブルに割り当てられる別名を
特定できます (つまり、現在の Selection テーブルの別名が Query1 になるか、Query2 になるかを知
ることができます)。また SelectionInfo( ) では、選択した行の数など、選択内容に関するその他の
情報の特定も行えます。
"QueryN" テーブルのクリーン アップ
MapInfo Professional の作業を進めるにつれて、多くの "QueryN" テーブル (例 : Query1、Query2)
が開かれていることに気付く場合があります。たとえば、マップ オブジェクトをクリックして選
択内容を参照すると、ウィンドウのタイトルに "Query1 Browser" と表示される場合があります。
各 QueryN は、前の選択内容のスナップショットです。
MapBasic プログラムを通じて QueryN テーブルが開かれる場合もあります。たとえば、Selection.Obj
などのフィールド式の参照を行うと、MapInfo Professional は QueryN テーブルを開きます。MapBasic
プログラムで QueryN テーブルを閉じるには、次のようにします。
•
Select 文の使用時には、オプションの Into 節を使用し、 テーブル名 "Selection" にアクセスせ
ずに Into 節で指定したテーブルにアクセスします。Into 節を使用すると、検索結果にアクセ
スしても、MapInfo Professional では QueryN テーブルが開きません。検索結果テーブルを使
用した作業の終了後は、Close Table 文を発行してテーブルを閉じます。
•
ユーザが選択 (例 : マップ オブジェクトのクリック) を行い、プログラムがその選択内容の操作
を行うと、QueryN テーブルが開きます。次の例は、QueryN テーブルを閉じる方法 を示して
います。
’ Note how many tables are currently open.
i_open = NumTables()
MapBasic 11.0
137
ユーザーズ ガイド
第 7 章: テーブル操作
テーブルの新規作成
’ Access the Selection table as necessary. For example:
Fetch First From Selection
obj_copy = Selection.obj
’If we just generated a QueryN table, close it now.
If NumTables() > i_open Then
Close Table TableInfo(0, TAB_INFO_NAME)
End If
Selection の変更
Select 文を使用すると、選択した行を変更することができます。Select 文は、さまざまな機能を
持った非常にパワフルな文です。Select 文を使用すると、データのフィルタ、並べ替え、小合計
の計算または 2 つ以上のテーブルの関係結合が行えます。MapBasic プログラマの皆さんは、
Select 文を使用することで、MapInfo Professional の [検索] > [SQL 検索] コマンドの機能をフルに
活用することができます。
Select 文を発行するときに、結果テーブルに Query1 などの名前を付けたくない場合は、結果テー
ブルに別の名前を付けることもできます。Select 文はオプションの Into 節を持っており、この節
を使用すると結果テーブルの名前が指定できます。たとえば、次の文は条件検索を行って、結果
テーブルに "Active" と名付けます。
Select * From sites
Where growth > 15
Into Active
SQL Select を使った検索操作については、『MapInfo Professional ユーザガイド』を参照してくだ
さい。Select 文の詳細については、『MapBasic リファレンス ガイド』を参照してください。
現在の選択行の更新
Update 文を使用すると、Selection テーブルを変更することができます。Selection テーブルを変
更すると、変更内容はその Selection テーブルが抽出された基本テーブルに反映されます。
たとえば、次の Select 文は、employees テーブルからいくつかの行を選択します。Select 文に続
く Update 文は、選択された行のデータ値を変更します。
Select * from employees
Where department = "marketing" and salary < 20000
Update Selection
Set salary = salary * 1.15
この Selection は employees テーブルから抽出されているため、Update 文は employees テーブル
の行の値を変更します。
MapBasic 11.0
138
ユーザーズ ガイド
第 7 章: テーブル操作
システム レイヤへのアクセス
Selection を使用したユーザ入力
Selection プロセスは、ユーザ インターフェイスの一部です。アプリケーションの中には、ユーザ
が 1 つ以上の行を選択した後で、適切なメニュー項目を選択するような構成になっているものも
あります。ユーザが選択を行うと、オブジェクト (名詞) が指定されます。同様に、ユーザがメ
ニュー項目を選択すると、そのオブジェクトに適用される操作 (動詞) が指定されます。
サンプル プログラム TextBox は、この名詞/動詞モデルに基づいています。ユーザは、1 つ以上のテ
キスト オブジェクトを選択した後、[ツール] > [TextBox] > [Create Text Boxes] コマンドを選択しま
す。続いて、TextBox アプリケーションは Selection テーブルを検索し、ユーザが選択したテキスト
オブジェクトを囲むボックスを描きます。
現在の選択内容を検索するには、SelectionInfo( ) 関数を使います。SelectionInfo() 関数を呼び出
すと、現在選択されている行 (行が選択されている場合) の数を特定することができます。行が現
在選択されている場合は、SelectionInfo( ) 関数を呼び出すと、その行が選択された元のテーブル
の名前を特定することができます。続いて、TableInfo( ) を呼び出して、そのテーブルに関する別
の情報を検索します。
アプリケーションに SelChangedHandler というサブプロシージャが含まれる場合、MapInfo
Professional は選択内容が変更されるたびにそのプロシージャを呼び出します。たとえば、アプリ
ケーションのカスタム メニュー項目のいくつかを、行が選択されているときにだけ選択可能にな
るよう設定するとします。このような選択指定型メニュー管理を行うには、SelChangedHandler
プロシージャを作成します。このプロシージャの中で SelectionInfo(SEL_INFO_NROWS) を呼
び出し、行が選択されているかどうかを特定します。選択行のあるなしに応じて、Alter Menu
Item 文を発行して適当なメニュー項目を選択可能または選択不能にします。メニュー管理の詳細
については、ユーザ インターフェイスの作成を参照してください。
システム レイヤへのアクセス
各マップ ウィンドウには、1 つのシステム レイヤがあります。システム レイヤは、マップの一番上
にある特殊な機能を持ったレイヤです。ユーザがキー指定検索操作を行うと、MapInfo Professional
は "見つかった" 場所にシンボルを追加します。このようなシンボルは、システム レイヤに格納され
ます。ラベルの詳細については、図形オブジェクトを参照してください。
MapBasic を 通 じ て シ ス テ ム レ イ ヤを操作するには、テーブル操作文 ( 例 : Select、Insert、
Update、Delete など) を発行し、CosmeticN などのテーブル名 (N は 1 以上の整数) を指定しま
す。たとえば、Cosmetic1 というテーブル名は、画面上の最初のマップ ウィンドウのシステム レ
イヤに対応します。次の文は、このマップ ウィンドウのシステム レイヤにあるすべてのオブジェ
クトを選択します。
Select * From Cosmetic1
シ ス テ ム レ イ ヤ の 正 確 な テ ー ブ ル 名 を 決 定 す る に は、WIN_INFO_TABLE コ ー ド を 使 っ て
WindowInfo( ) を呼び出します。たとえば、次の文は、アクティブなマップ ウィンドウ (アクティ
ブ ウィンドウがマップ ウィンドウである場合) のシステム レイヤからすべてのオブジェクトを削
除します。
Delete From WindowInfo(FrontWindow(), WIN_INFO_TABLE)
MapBasic 11.0
139
ユーザーズ ガイド
第 7 章: テーブル操作
レイアウト ウィンドウへのアクセス
レイアウト ウィンドウへのアクセス
MapBasic のオブジェクト操作文は、レイアウト ウィンドウ上のオブジェクトにも適用できます。
レイアウト ウィンドウを操作するには、LayoutN というテーブル名 (N は 1 以上の整数) を使用し
た文を発行します。
たとえば、Layout1 というテーブル名は、最初に開かれたレイアウト ウィンドウに対応します。
次の文は、このレイアウト ウィンドウ上のすべてのオブジェクトを選択します。
Select * From Layout1
レイアウト ウィンドウの正確なテーブル名を特定するには、WIN_INFO_TABLE コードを使用し
て WindowInfo( ) 関数を呼び出します。
L
レイアウト ウィンドウに格納されたオブジェクトは、"用紙" 単位 (ページ レイアウトの左
上隅から測定される) を使用する特殊な座標系に基づいています。レイアウト オブジェク
ト を 作 成 す る か、レ イ ア ウ ト オブジェクトからオブジェクト座標を検索するための
MapBasic プログラムでは、まず最初にレイアウト座標系を指定する Set CoordSys 文を発
行しなければなりません。
たとえば、TextBox サンプル プログラムは、現在選択されているテキスト オブジェクトがマップ
ウィンドウにあろうと、あるいはレイアウト ウィンドウにあろうと、そのオブジェクトの周りに
ボックス (長方形オブジェクト) を描きます。選択されたオブジェクトがレイアウト オブジェクト
である場合、TextBox は Set CoordSys Layout 文を発行します。
MapInfo Professional をインタラクティブに使用する場合は、MapInfo Professional の統計ウィン
ドウを利用すると、レイアウト ウィンドウまたはマップ ウィンドウのシステム レイヤに対応する
テーブル名を簡単に決定することができます。マップのシステム レイヤ上で 1 つのオブジェクト
を選択して統計ウィンドウを選択する ([オプション] > [統計ウィンドウを表示] を選ぶ) と、"テーブ
ル Cosmetic1 に 1 つのレコードが選択されています。" などのメッセージが表示されます。同様
に、レイアウト ウィンドウ上で 1 つのオブジェクトを選ぶと、"テーブル Layout1 に 1 つのレコー
ドが選択されています。" というメッセージが表示されます。
マルチユーザ編集
マルチユーザ環境でのテーブル操作が可能な MapBasic プログラムでは、ファイル共有衝突が発生
する可能性があります。共有衝突は、MapInfo Professional ではどのテーブルも一度に 1 人のユー
ザによってしか変更できないために発生します。
このセクションでは、MapInfo Professional のマルチユーザ編集動作を左右する規則について説明
します。複数のユーザが同じテーブルを一度に変更できるようにする MapBasic プログラムを作成
する場合には、このセクションを参照してください。
MapBasic 11.0
140
ユーザーズ ガイド
第 7 章: テーブル操作
マルチユーザ編集
マルチユーザ編集に関する規則
MapInfo Professional のマルチユーザによるテーブル編集には、次のような 3 つの制限があります。
規則 1
テーブルは、一度に 1 人のユーザしか編集できません。
ユーザ A とユーザ B の 2 人のユーザがいると仮定します。ここで、両方のユーザがネットワーク
上にある同じテーブルを使用しようとするとします。
ユーザ A がテーブルの編集を開始します (例 : ユーザ A がテーブルに新しい行を追加する)。その直
後にユーザ B が同じテーブルを編集しようとしても、 ユーザ B によるテーブルの編集は許可され
ず、"編集できません。このテーブルは他のプロセスによって編集中です。" というメッセージが表
示されます。ユーザ B が MapBasic アプリケーションを通じてテーブルを編集しようとすると、ア
プリケーション上で実行時エラーが発生します。
ユーザ A が編集を続ける限り、そのテーブルをユーザ B が編集することはできません。この状態
は、ユーザ A が [テーブルの保存]、[テーブルの復帰] (編集内容の破棄) または [テーブルを閉じる]
を実行するまで継続します。
L
ユーザ B は、ユーザ A が編集中のテーブルを参照することはできます。たとえば、ユーザ B
はそのテーブルをマップ ウィンドウ上に表示することができます。ただし、ユーザ A が編集
した内容については、それをユーザ A が保存するまでユーザ B は "参照"できません。
規則 2
ユーザは、保存中のテーブルからの読み取りはできません。
ユーザ A が、テーブルの編集後に [ファイル] > [テーブルの保存] コマンドを選択するとします。こ
のとき、保存操作が完了しないうちにユーザ B がそのテーブルからデータを読み取ろうとした場
合、 保存処理が行われている間はユーザ B によるそのテーブルへのアクセスは許可されません。
ユーザ B のコンピュータには、"ファイル <tablename>.DAT を読み込めません" というメッセージ
が表示されます。 このダイアログ ボックスの [再試行] と [キャンセル] の各ボタンは、次のような
意味を持っています。
再試行
ユーザ B が [再試行] をクリックすると、そのファイルからの読み取りを再度試みます。まだ [保存]
操作が完了していないと、[再試行] は失敗します。[再試行] ボタンは繰り返しクリックすることが
できます。保存操作が終了すると、テーブルからのデータの読み取りが成功します。
キャンセル
ユーザ B が [キャンセル] をクリックすると、[再試行/キャンセル] ダイアログ ボックスが閉じます。
L
MapBasic 11.0
ユーザ B がワークスペースを読み込んでいるときに共有エラーが発生すると、[キャンセル]
をクリックすることで、残りのワークスペースの読み込みが中断されるおそれがありま
す。たとえば、Open Table 文を含むワークスペースがあるとします。この Open Table 文
が原因で共有衝突が発生した場合、ユーザが [再試行/キャンセル] ダイアログ ボックスで [
キャンセル] をクリックしても、そのテーブルは開きません。テーブルが開かれなかったこ
とにより、ワークスペース中のそれ以降の文は正しく実行されない可能性があります。
141
ユーザーズ ガイド
第 7 章: テーブル操作
マルチユーザ編集
規則 3
別のユーザがテーブルを読み取っている間は、そのテーブルの保存が開始されません。
ユーザ A が [ファイル] > [テーブルの保存] を選択したときに、別のユーザがそのテーブルからの読
み取りを行っている場合、[テーブルの保存] コマンドは実行されず、 "ファイル <tablename>.DAT
に書き込めません" というメッセージが表示されます。 このダイアログ ボックスの [再試行] と [キャ
ンセル] の各ボタンは、次のような意味を持っています。
再試行
ユーザ A が [再試行] をクリックすると、テーブルの保存を再度試みます。[再試行] ボタンは繰り
返しクリックすることができます。[再試行] ボタンのクリックによる操作は、他のユーザがテーブ
ルからの読み出しを終了した時点で初めて成功します。
キャンセル
ユーザ A が [キャンセル] をクリックすると、保存動作がキャンセルされ、[再試行/キャンセル] ダ
イアログ ボックスが閉じます。この時点でテーブルはまだ保存されておらず、編集内容はユーザ
A が [ファイル] > [テーブルの保存] を再び選択するまで保存されません。
共有データ読み取り時の衝突の回避
前のセクションで説明したように、共有衝突が発生すると、[再試行/キャンセル] ダイアログ ボッ
クスが表示されることがあります。通常、[再試行/キャンセル] ダイアログ ボックスは、共有衝突
の発生と同時に表示されます。ただし、MapBasic の Set File Timeout 文を使用して、このダイア
ログ ボックスが表示されないようにすることができます。
プログラム中の、共有テーブルを開く処理、または共有テーブルからの読み取り処理を行う部分
に、0 より大きな値を記述した Set File Timeout 文を追加します。たとえば、いくつかのテーブル
を開くプロシージャがあるとすると、そのプロシージャの最初に次のような文を追加します。
Set File Timeout 100
Set File Timeout 文は、制限時間を設定します。上の例では、制限時間は 100 秒になります。つ
まり、MapInfo Professional は共有衝突が発生したテーブル操作の実行を 100 秒間繰り返し再試行
します。MapInfo Professional がテーブル操作の再試行を行う間、[再試行/キャンセル] ダイアログ
ボックスは表示されません。100 秒間再試行を続けた後もまだ共有衝突が発生する場合は、自動再
試行が停止し、[再試行/キャンセル] ダイアログ ボックスを表示します。
共有データへの書き込み時の衝突の回避
MapBasic 文の中には、テーブルの内容を変更できるものがあります。たとえば、Insert 文を使用
すると、テーブルに新しい行を追加できます。プログラムがテーブル内容の変更を試みたときに
共有衝突が発生すると、実行時エラーが発生します。このエラーをトラップするには、OnError
文を利用します。たとえば、テーブルに新しい行を挿入するプロシージャ (下記参照) がある場合
は、エラー処理ルーチンを作成し、OnError 文をそのプロシージャの冒頭に追加してエラー ト
ラップを可能にします (エラー処理の詳細については、実行時エラーのデバッグ およびトラップを
参照してください)。
MapBasic 11.0
142
ユーザーズ ガイド
第 7 章: テーブル操作
マルチユーザ編集
警告 :
Set File Timeout 文と OnError 文は同時に使用できません。エラー ハンドラが可能
になっている場合、ファイルのタイムアウト値は 0 でなければなりません。ファイ
ルのタイムアウト値が 0 以外の場合は、エラー処理は使用不可能のはずです。次の
例は、このロジックを示したものです。
Function MakeNewRow(ByVal new_name As String) As Logical
’turn off automatic retries
Set File Timeout 0
’turn off window redraws
Set Event Processing Off
’enable error-trapping
OnError Goto trap_the_error
’Add a new row, and save the new row immediately.
Insert Into Sitelist ("Name") Values ( new_name )
Commit Table Sitelist
’Set return value to indicate success.
MakeNewRow = TRUE
exit_ramp:
Set Event Processing On
Exit Function
trap_the_error:
’ The program jumps here if the Insert or Commit
’ statements cause runtime errors (which will happen
’ if another user is already editing the table).
If Ask("Edit failed; try again?", "Yes", "No") Then
’ ... then the user wants to try again.
Resume 0
Else
’ the user does not want to retry the operation.
’ If the Insert succeeded, and we’re getting an error
’ during Commit, we should discard our edits.
Rollback Table Sitelist
’ set function’s return value to indicate failure:
MakeNewRow = FALSE
Resume exit_ramp
End If
End Function
この場合、次の点に注意してください。
•
共有テーブルを変更する場合は、テーブル上に未保存の編集内容が存在する時間をできるだけ
短くします。上の例では、Commit 文が Insert 文の直後に現われています。これによって、
テーブル上に未保存の編集内容が存在する時間が非常に短くなります。
MapBasic 11.0
143
ユーザーズ ガイド
第 7 章: テーブル操作
テーブルを構成するファイル
•
この例では、イベント処理を中断する Set Event Processing Off 文が使用されています。これ
により、編集中はウィンドウの再描画が行われません。イベント処理を中断しないと、Insert
文によって MapInfo Professional が 1 つ以上のウィンドウを再描画する可能性があります。そ
れによって、共有衝突が発生する可能性があります (例 : 同じマップ ウィンドウ上の別のテー
ブルに共有衝突が存在する可能性があるため)。
•
この関数は、ファイルタイムアウト値を 0 に設定します。この関数を呼び出すプロシージャは、
ファイルタイムアウト値を元の値にリセットしなければならない場合があります。
書き込み可能テーブルを開く
マルチユーザ環境でテーブルを開くと、そのテーブルを含むファイルが取り専用でない場合で
も、読み取り専用で開かれる可能性があります。他のユーザがテーブルにアクセスしているとき
に MapBasic プログラムがそのテーブルに対して Open Table 文を発行すると、そのテーブルは読
み取り専用で開かれる可能性があります。読み取り専用のテーブルは、それ以降に文を発行して
も、変更することができません。
次の例では、共有テーブルが読み取り専用で開かれないようにしています。単に Open Table 文を
発行するのではなく、ファイルが読み取り/書き込み可能な状態で開かれるまで続行するような
ループの中でこの文を発行します。
Retry_point:
Open Table "G:\MapInfo\World"
If TableInfo("World", TAB_INFO_READONLY) Then
Close Table World
Goto Retry_point
End If
テーブルを構成するファイル
あるファイルにはテーブルの定義 (例 : フィールドの名前) に関する情報が、別のファイルにはレ
コードおよびフィールド値が含まれます。また、テーブルの図形オブジェクトを格納するファイ
ルもあります (図形オブジェクトがある場合)。最後のファイルには、インデックスが含まれます。
レコードおよびフィールド データを含むファイルには、.dbf、Lotus (.wks または .wk1) 形式、デ
リミタ付き ASCII ファイル形式、または Excel (.XLS または .XLSX) ファイル形式など、MapInfo
Professional がサポートするあらゆる形式を適用できます。
•
filename.tab : テーブルの定義が記述されています。
•
filename.dat、filename.dbf、または filename.wks : 表 (行と列) データが含まれます。
•
filename.map : テーブルの図形オブジェクトが含まれます。
•
filename.id : 地理的インデックスが含まれます。
•
filename.ind : テーブルのフィールドのインデックスが含まれます。
各テーブルはいくつかのファイルで構成されているため、テーブルの名前を変更する場合は注意が
必要です。テーブルの名前を変更するには、MapInfo Professional で [テーブル] > [テーブル管理] > [
テーブル名の変更] コマンドを選択するか、MapBasic の Rename Table 文を発行します。
MapBasic 11.0
144
ユーザーズ ガイド
第 7 章: テーブル操作
ラスタ イメージ テーブル
ラスタ イメージ テーブル
ラスタ イメージ テーブル (ベクトル データではなくラスタ イメージ データのみを表示するテーブ
ル) は、上記のすべてのコンポーネント ファイルを持つわけではありません。これは、ラスタ イ
メージ テーブルには表データが含まれないからです。各ラスタ イメージは、1 つの .tab ファイル
(イメージの基準点が格納されている) およびラスタ イメージを格納する 1 つ以上のファイルの、
最低 2 種類のファイルから成ります。たとえば、あるラスタ イメージ テーブルが photo.tif ファイ
ルに基づいている場合、そのテーブルは photo.tif と photo.tab の 2 つのファイルから構成されてい
ると考えられます。
多くの点で、ラスタ イメージ テーブルは他のあらゆるテーブルと同じといえます。ラスタ イ
メージ ファイルを開くには、Open Table 文を使用します。ラスタ イメージ テーブルをマップ
ウィンドウに表示するには、Map 文を使用します。また、ラスタ イメージ テーブルを既存マッ
プに追加するには、Add Map Layer 文を使用します。ただし、ラスタ イメージ テーブルを使っ
た Select 操作はできません。そのテーブルがラスタ テーブルであるかどうかを特定するには、
TAB_INFO_TYPE コードを使用して TableInfo( ) 関数を呼び出します。そのテーブルがラスタ
テ ー ブ ル で あ れ ば、TableInfo( ) は コ ー ド TAB_TYPE_IMAGE を 返 し ま す。原 則 と し て、
MapInfo Professional はラスタ テーブルの基になるイメージ ファイルは変更しません。したがっ
て、以下のようになります。
•
Drop Table 文を使用してラスタ テーブルを削除すると、テーブル ファイルは削除されますが、
そのテーブルの基になるイメージ ファイルは削除されません。
•
ラスタ テーブルに対して Rename Table 文を発行すると、テーブル ファイルの名前は変更さ
れますが、そのテーブルの基になるイメージ ファイルの名前は変更されません。
•
Commit 文を使用してラスタ テーブルをコピーすると、テーブル ファイルはコピーされます
が、そのテーブルの基になるイメージ ファイルはコピーされません。
ユーザが MapInfo Professional の [イメージ登録] ダイアログ ボックスでの操作を完了すると、ラ
スタ イメージ テーブルの .tab ファイルが作成されます。MapBasic プログラムを使用してラスタ
イメージの .tab ファイルを作成する必要がある場合は、標準ファイル入出力文を使用してその
ファイルを作成します。つまり、Open File 文を使用してファイルを作成し、Print # 文を使用し
てそのファイルにテキストを書き込みます。下の例を参考にしてください。
次のプログラムでは、ラスタ イメージ ファイルからテーブルを作成します。このプログラムは、真
の地理座標ではなく、"ダミー" 座標を割り当てます。したがって、作成されたテーブルは、ベクトル
マップ レイヤを重ねる操作には適しません。ただし、ラスタ イメージがマップ以外のイメージ (例 :
企業ロゴのグラフィック) を表す場合は、このような非地理座標を使用しても問題はありません。
Include "mapbasic.def"
Declare Sub Main
Declare Function register_nonmap_image(ByVal filename As String,
ByVal tablename As String) As Logical
Sub Main
Dim fname, tname As String
fname = "c:\data\raster\photo.gif" ’name of an existing image
tname = PathToDirectory$(fname)
+ PathToTableName$(fname) + ".tab" ’name of table to create
MapBasic 11.0
145
ユーザーズ ガイド
第 7 章: テーブル操作
メタデータの操作
If FileExists(tname) Then
Note "The image file is already registered; stopping."
Else
If register_nonmap_image(fname, tname) Then
Note "Table file created for the image file: "
+ fname + "."
Else
Note "Could not create table file."
End If
End If
End Sub
Function register_nonmap_image( ByVal filename As String,
ByVal tablename As String) As Logical
register_nonmap_image = FALSE
OnError GoTo handler
Open File tablename For Output As #1 FileType "MIta"
Print #1, "!Table"
Print #1, "!Version 300"
Print #1, "!charset Neutral"
Print #1
Print #1, "Definition Table"
Print #1, " File """ + filename + """"
Print #1, " Type ""RASTER"" "
Print #1, " (1,1) (1,1) Label ""Pt 1"", "
Print #1, " (5,1) (5,1) Label ""Pt 2"", "
Print #1, " (5,5) (5,5) Label ""Pt 3"" "
Print #1, " CoordSys NonEarth Units ""mm"" "
Print #1, " Units ""mm"" "
Print #1, " RasterStyle 1 45" ’ Brightness; default is 50
Print #1, " RasterStyle 2 60" ’ Contrast; default is 50
Close File #1
register_nonmap_image = TRUE ’ set function return value
last_exit:
Exit Function
handler:
Close File #1
Resume last_exit
End Function
メタデータの操作
メタデータとは
メタデータは、フィールドや行として格納されずに、テーブルの .TAB ファイルに格納されるデー
タです。たとえば、誰がいつテーブルを編集したかについての概要情報を記録したい場合は、そ
の情報をメタデータとして格納することができます。
MapBasic 11.0
146
ユーザーズ ガイド
第 7 章: テーブル操作
メタデータの操作
メタデータは、MapInfo Professional の標準ユーザ インターフェイスには表示されません。つま
り、ユーザはテーブルのメタデータを見ることはできません (テキスト エディタで .TAB ファイル
を表示する場合や、TableMgr サンプル MBX を実行する場合は例外です)。ただし、MapBasic アプ
リケーションではメタデータ値の読み取り/書き込みが行えます。
どのテーブルにも、0 個以上のメタデータ キーがあります。それぞれのキーは、著者名や著作権
通告などの情報カテゴリを表します。たとえば、"\Copyright" という名前のキーは、"Copyright
2005 Acme Corp" という値を持つ可能性があります。
メタデータ キーの形式
各メタデータ キーは、必ず "\" (円) 記号で始まる名前を持っています。キー名が \ 記号で終わるこ
とはありません。また、キー名では大文字と小文字は区別されません。
キーの値は、常に最高 239 文字から成る文字列で表されます。
次の表に、メタデータ キーとキー値のサンプルを示します。
サンプル キーの名前
サンプル キーの値
"\Copyright Notice"
Copyright 2008 Pitney Bowes Mapinfo Corp."
"Info"
"Tax Parcels Map"
"Info Author"
"Meghan Marie"
"Info\Date\Start"
"12/14/01"
"Info\Date\End"
"12/31/01"
"IsReadOnly"
"FALSE"
この場合、次の点に注意してください。
•
•
キーの名前および値には、スペースを使用できます。
2 つ以上の \ 文字を持つキー名を使用すると、キーの階層が定義できます。上のいくつかのキー
は、"\Info" で始まる階層に属しています。キーを階層状に整理すると、ある階層全体を一度に
操作することが可能になります (例 : 1 つの文で階層全体を削除することができる)。
•
"\IsReadOnly" キーは、MapInfo Professional の内部で使用される予約済みの特殊キーです。
テ ー ブ ル に メ タ デ ー タ を 追 加 すると、\IsReadOnly キーが自動的に作成されます。この
\IsReadOnly キーを変更してはいけません。
•
上の表では、それが文字列値であることを強調するために、各文字列は引用符で囲まれていま
す。しかし、テーブルからキーを取り出す場合、MapBasic が実際に取り出す文字列は引用符
に囲まれていません。
MapBasic 11.0
147
ユーザーズ ガイド
第 7 章: テーブル操作
メタデータの操作
メタデータに関する作業の例
GetMetadata$( ) 関数ではテーブルのメタデータの検索を行えますが、メタデータ キーの正確な名
前を把握している場合に限ります。あるテーブルが "\Copyright" という名前のキーを持つことを把
握している場合、次の関数呼び出しによってそのキーの値が返されます。
s_variable = GetMetadata$(table_name, "\Copyright")
Metadata 文を使うと、キーの名前がわからない場合でも、テーブルのメタデータの作成、変更、検
索が可能になります。次の例は、Metadata 文を使用して行えるさまざまな操作を示したものです。
L
各例の table_name は、開いたテーブルの名前を含む文字列変数を表しています。
次の例では、テーブルにキー値を格納します。指定したキーが既に存在する場合、そのキーの値
は変更されます。指定したキーが存在しない場合は、テーブルのメタデータにそのキーが追加さ
れます。
Metadata Table table_name
SetKey "\Info\Author" To "Laura Smith"
次の文は、テーブルから "\Info\Author" キーを削除します。
Metadata Table table_name
Dropkey "\Info\Author"
次の文は、ある階層に属するすべてのキーを一度に削除します。ここでは、"\Info" で始まる名前を
持つすべてのキーが削除されます。
Metadata Table table_name
Dropkey "\Info" Hierarchical
Metadata 文を使ってメタデータの書き込みまたは削除を行うと、その変更は直ちに適用されま
す。保存操作を行う必要はありません。
また、Metadata 文を使用すると、キーの名前がわからなくてもテーブルからメタデータを読み取
ることができます。テーブルのメタデータを読み取るには
1. Metadata Table...SetTraverse 文を発行してトラバーサルの初期化を行います。
2. Metadata Traverse...Next 文を発行してキーを取得します。この文によって、そのキーの名前が
ある文字列変数の中に取り出され、そのキーの値が別の文字列変数の中に取り出されます。
3. Metadata Traverse...Next 文の発行を続けてその他のキーを取得します。通常、この文はルー
プの中で発行されます。すべてのキーが取り出されると、Metadata Traverse...Next はキー名
として空の文字列を返します。
4. Metadata Traverse...Destroy 文を発行してトラバーサルを終了します。この操作により、トラ
バーサルに使用されていたメモリが解放されます。
次の例は、テーブルのメタデータをトラバースする方法を示したものです。
Sub Print_Metadata(ByVal table_name As String)
Dim i_traversal As Integer
MapBasic 11.0
148
ユーザーズ ガイド
第 7 章: テーブル操作
シームレス テーブルの操作
Dim s_keyname, s_keyvalue As String
’ Initialize the traversal.Specify "\" as the
’ starting key, so that the traversal will start
’ with the very first key.
Metadata Table table_name
SetTraverse "\" Hierarchical Into ID i_traversal
’ Attempt to fetch the first key:
Metadata Traverse i_traversal
Next Into Key s_keyname Into Value s_keyvalue
’
’
’
Do
Now loop for as long as there are key values;
with each iteration of the loop, retrieve
one key, and print it to the Message window.
While s_keyname <> ""
Print " "
Print "Key name: " & s_keyname
Print "Key value: " & s_keyvalue
Metadata Traverse i_traversal
Next Into Key s_keyname Into Value s_keyvalue
Loop
’ Release this traversal to free memory:
MetaData Traverse i_traversal Destroy
End Sub
Metadata 文の構文の詳細については、『MapBasic リファレンス ガイド』またはオンライン ヘル
プを参照してください。
シームレス テーブルの操作
シームレス テーブルとは
シームレス テーブルを使用すると、複数のテーブルをグループにまとめて、それを 1 つのテーブ
ルとして扱うことができます。複数のテーブルを 1 つのシームレス テーブルにまとめた後は、そ
のシームレス テーブルを([レイヤ管理] ウィンドウを使って)マップ ウィンドウに追加するだけ
で、すべてのテーブルがマップ ウィンドウに追加されます。シームレス テーブルの操作の基本に
ついては、『MapInfo Professional ユーザーズ ガイド』を参照してください。
MapBasic 11.0
149
ユーザーズ ガイド
第 7 章: テーブル操作
シームレス テーブルの操作
シームレス テーブルの仕組み
MapInfo Professional には、シームレス テーブルの作成と操作が行える MapBasic プログラムであ
るシームレス テーブル管理機能 (seammgr.mbx) が含まれています。シームレス テーブルがどのよ
うに構成されているかを確認するには、次のようにしてそのテーブルの "シームレス動作" をオフ
にする必要があります。
1. シームレス テーブル (例 : USRaster) を開きます。
2. シームレス テーブル管理機能アプリケーションを実行します。
3. [ツール] > [シームレス テーブル管理機能] > [シームレス レイヤのオフ] を選択し、DCMetroA
テーブルのシームレス属性をオフにします。
4. [ウィンドウ] > [ブラウザ ウィンドウを表示] を選択し、そのテーブルをブラウザ ウィンドウに
表示します。
通常のテーブルと同様に、シームレス テーブルにも行とフィールドがあります。各行は、そのシー
ムレス テーブルに含まれる個々の基本テーブルに対応します。
2 列目のフィールドの説明が ...
... ユーザがシームレス テーブルを参照する
と、このリストに表示されます。
シームレス テーブルの最初のフィールドには、テーブル名が含まれます。2 列目のフィールドに
は、ユーザ インターフェイスに表示される内容が入っています。最初のフィールドのテーブル名
には、ディレクトリ パスが含まれている場合があります。基本テーブルがシームレス テーブルと
同じディレクトリ内にある場合、または基本テーブルが検索ディレクトリ パス ([ディレクトリの
設定] ダイアログ ボックスの [環境設定] で指定される) によって検索可能な場合は、ディレクトリ
パスは省略できます。
シームレス テーブルの各行には、それぞれ 1 つのマップ オブジェクトが添付されています。これ
は、通常のテーブルの行にオブジェクトが添付されているのと同じです。ただし、シームレス
テーブルのオブジェクトは表示を目的とするものではありません。シームレス テーブルの各行
は、最初のフィールドに示されるテーブルの最小外接四角形 (MBR) を定義する長方形オブジェク
ト を 持 ち ま す。ユ ー ザ が マ ッ プ ウィンドウにシームレス テーブルを表示すると、MapInfo
Professional はマップ ウィンドウの現在の範囲をテーブルに格納された MBR と比較します。
MapInfo Professional は、必要な場合 (マップ ウィンドウ上の現在の表示エリアがテーブルの MBR
と交差している場合) に限り、基本テーブルを開きます。
MapBasic 11.0
150
ユーザーズ ガイド
第 7 章: テーブル操作
DBMS データへのアクセス
MapBasic のシームレス テーブル構文
Set Table 文を使用すると、シームレス テーブルを通常のテーブルに変換できます。たとえば、
シームレス テーブルの内容を編集する場合は、まず次の文を発行します。
Set Table USRaster Seamless Off
続いて、テーブルの内容をブラウザ ウィンドウ上で編集します。
あるテーブルがシームレス テーブルであるかどうかを確認するには、
TableInfo( , TAB_INFO_SEAMLESS ) 関数を呼び出します。
ユーザに対してシームレス テーブルからの 1 つの基本テーブルの選択を求めるダイアログ ボック
スを表示するには、GetSeamlessSheet( ) を呼び出します。
シームレス テーブルに関する制限事項
シームレス テーブルに含まれる基本テーブルは、すべて同じ定義 (同じフィールド数、同じフィー
ルド名など) を持たなければなりません。
MapInfo Professional 操作の中にはシームレス テーブルに対して実行できないものもあることに注
意してください。次に例を示します。
•
•
シームレス テーブルの複数の基本テーブルから同時にオブジェクトを選択することはできま
せん。
MapBasic の Find 文では、シームレス テーブル全体を検索することはできません。Find 文は、
一度に 1 つの基本テーブルしか検索できません。
•
シームレス テーブルをマップ ウィンドウ上で編集可能にすることはできません。
•
シームレス テーブルの主題図を作成することはできません。
DBMS データへのアクセス
これまで、皆さんのハード ディスクまたはネットワーク ファイル サーバ上にある MapInfo のローカ
ル テーブルを使用した操作について説明しました。このセクションでは、MapBasic を使用して
Oracle や SQL Server データベースなどの DBMS テーブルにアクセスする方法について説明します。
MapBasic のリモート データ文および関数は、すべてキーワード Server で始まっています。ただ
し、Unlink 文は例外です。この構文の詳細については、『MapBasic リファレンス ガイド』また
はオンライン ヘルプを参照してください。
リモート データ コマンドとデータベースの通信の仕組み
MapInfo Professional は、MapBasic アプリケーションが複数データベースに同時に接続して複数
の混在 SQL 文を発行することを許可します。これは、接続ハンドルおよび文ハンドルにより行わ
れます。
MapBasic 11.0
151
ユーザーズ ガイド
第 7 章: テーブル操作
DBMS データへのアクセス
接続ハンドル (または番号) は、特定の接続に関する情報を識別します。MapBasic では、接続ハン
ドルを整数タイプの変数 (接続番号) として定義します。アプリケーションは、あるデータ ソース
に接続すると、1 つの接続ハンドルを受け取ります。この接続ハンドルは、続く文を特定の接続に
関連付けるために使用されます。
文ハンドル (または番号) は、SQL 文に関する情報を識別します。MapBasic では、文ハンドルを整
数タイプの変数 (文番号) として定義します。アプリケーションは、Server_Execute( ) 関数を呼び
出してある SQL リクエストを出すと、必ず 1 つの文ハンドルを受け取ります。この文ハンドルを
使用して、Fetch や Close 操作など以降の SQL リクエストを特定の Select 文に関連付けます。
接続および接続解除
MapBasic アプリケーションでは、リモート データベースに対して SQL 文を実行する前に、まず
Server_Connect 関数を使用して接続リクエストを出さなければなりません。適切な接続が得られ
ると、この関数は続く SQL データリンク呼び出しに使われる接続ハンドル (hdbc) を戻します。
Dim hdbc As Integer
hdbc = Server_Connect("ODBC", "DLG=1")
ドライバがコミットまたはロールバックを実行すると、その接続に関するすべての文リクエスト
がリセットされます。Driver Manager は、現在の接続上でトランザクションが進行中である場合
に、接続の切り替えを操作します。
接続を解除するには、次の文を使用します。
Server hdbc Disconnect
この文は、接続を閉じると共に、その接続に関するすべてのリソースを解放します。
次の図は、SQL MapBasic Server 文を発行できるシーケンスを示しています。文の中には、接続
情報を必要としないもの (例 : Server_NumDrivers( ))、接続ハンドルだけを要求するもの (例 :
Server Commit)、または文ハンドルを要求するもの (例 : Server Fetch) があります。
MapBasic 11.0
152
ユーザーズ ガイド
第 7 章: テーブル操作
DBMS データへのアクセス
MapBasic の Server Fetch 文の Into 機能を利用すると、ODBC データソースから、テーブル全
体、指定した行/フィールド、または結果セットをダウンロードすることができます。ただし、ダ
ウンロードされたテーブルに適用された更新内容は、元のサーバ データベース上のテーブルには
適用されません。リモート データベースを更新するには、Save File 文を使用します。
PostGIS のジオメトリ変換の動作
サポートされていない空間ジオメトリが含まれるマップを PostGIS で保存するためのオプション
を以下に示します。
•
サポートされていないオブジェクトのみで構成される空間ジオメトリの場合: 作成したマップに、
サポートされていないオブジェクトのみが含まれる可能性がある場合、そのマップを PostGIS に
保存しようとすると、以下のメッセージが表示されます。
MapBasic 11.0
153
ユーザーズ ガイド
第 7 章: テーブル操作
リンク テーブルを使用したリモート データベースへのアクセスと、その更新
サポートされていないオブジェクト (角の丸い長方形、楕円、または弧)
がテーブルに含まれています。リージョンまたは折れ線に変換しますか?
[はい] をクリックすると、サポートされていないオブジェクトがリージョンまたは折れ線に変
換されます。[いいえ] をクリックすると、オブジェクトは変換されません。[いいえ] をクリッ
クした場合、作成したマップは PostGIS データベースに保存されません。
•
空間ジオメトリがリージョン オブジェクトのみの場合: 作成したマップにリージョン オブジェ
クトのみが含まれる場合、そのマップを PostGIS に保存しようとすると、以下のメッセージが
表示されます。
サポートされていないオブジェクト (角の丸い長方形または楕円) がテーブルに含まれて
います。リージョンに変換しますか?
[はい] をクリックすると、サポートされていないオブジェクトがリージョンに変換されます。[い
いえ] をクリックすると、オブジェクトは変換されません。[いいえ] をクリックした場合、作成
したマップは PostGIS データベースに保存されません。
•
空間ジオメトリがライン オブジェクトのみの場合: 作成したマップにライン オブジェクトのみ
が含まれる場合、そのマップを PostGIS に保存しようとすると、以下のメッセージが表示され
ます。
弧オブジェクトはサポートされていません。折れ線に変換しますか?
[はい] をクリックすると、サポートされていないオブジェクトが折れ線に変換されます。[いい
え] をクリックすると、オブジェクトは変換されません。[いいえ] をクリックした場合、作成し
たマップは SQL Server Spatial データベースに保存されません。
•
空間ジオメトリが長方形オブジェクトのみの場合: 作成したマップに長方形オブジェクトのみが含
まれる場合、そのマップを PostGIS に保存しようとすると、以下のメッセージが表示されます。
オブジェクトをアップロードできません。このテーブルは長方形オブジェクト型をサポー
トしていません。操作はキャンセルされました。
[OK] をクリックします。作成したマップは PostGIS データベースに保存されません。
リンク テーブルを使用したリモート データベースへのアクセスと、
その更新
リンク テーブルは、リモート データベースへのリンクを維持する特殊な MapInfo テーブルです。
編集作業は、複数の MapInfo Professional セッションを通じて行うことができます。リンク テー
ブルの更新は RDBMS トランザクションの外で行われるため、他の RDBMS ユーザも同じテーブ
ルの同じ行を更新することができます。また、データの破損を防ぐために、同時制御メカニズム
を利用します。同時制御は、Commit Table 文の Automatic/Interactive 句で実行されます。デー
タが保存されると、リモート データベースとの接続が再確立し、データ不整合が回避されて、変
更されたデータが RDBMS に書き込まれます。リンク テーブルを作成するには、MapBasic の
Server Link Table 文を使用します。
リンク テーブルには、接続を再確立したり、更新するリモート データを識別したりするために使
用される情報が含まれます。この情報は、メタデータとして tab ファイルに格納されます。
MapBasic 11.0
154
ユーザーズ ガイド
第 7 章: テーブル操作
テーブル操作をより効果的に行うためのヒント
未編集のリンク テーブルは、リモート データベースの現在のデータを使用して更新することがで
きます。接続データ、クエリ、テーブルを再度指定する必要はありません。リンク テーブルの更新
には、MapBasic の Server Refresh 文を使用します。
MapBasic の Unlink 文を使用すると、リンク テーブルのリンク解除が行えます。テーブルのリン
ク解除を行うと、リモート データベースへのリンクが削除されます。この操作の結果、通常の
MapInfo 基本テーブルが得られます。
MapInfo Professional の空間インデックス機能を使用すると、ユーザはあらゆるデータベースにお
けるポイントの格納および取り出しが行えます (サポートされている空間オブジェクト内の空間オ
ブジェクト)。リモートテーブルをマップ作成可能にするを参照してください。
リモート データベースへのライブ アクセス
Register Table 文によりリモート データベースへのライブ アクセスが可能になります。Type と
して ODBC を指定すると、Register Table 文は ODBC テーブルを調べ、必要なテーブル ファイ
ル (filename.TAB) を作成します。
テーブル操作をより効果的に行うためのヒント
リモート テーブルのデフォルト ビューの設定
リモート データベース テーブルにデフォルト ビューを設定すると、必要なデータのみをマップま
たはブラウザに表示できます。これにより、大規模なテーブルを使う際のデータ アクセス速度が
向上します。
デフォルト ビューは、MAPINFO_MAPCATALOG 内で境界を保持する 4 つの新しい列 (VIEW_X_LL、
VIEW_Y_LL、VIEW_X_UR、および VIEW_Y_UR) に保存されます。MapCatalog は、リモート テーブ
ルに関するメタデータを格納するレジストリ テーブルです。MapCatalog にテーブルのエントリがな
い場合、MapBasic は境界全体を取得します。
新しいデフォルト ビューを設定するには、リモート テーブルを開き (境界全体が表示される)、
ビューを適切に調整してから MapBasic ツールのウィンドウ マネージャを実行して Set Default
View を呼び出します。MapCatalog 内で新しい境界が更新され、次にテーブルを開いたときにこ
の境界が使用されます。
[名前を付けて保存] コマンドを使ってテーブルをリモート データベース データソースにアップロー
ドすると、元のテーブルのデフォルト ビューは新しく作成されるテーブルにも適用されます。
リモート テーブルの MAPINFO_MAPCATALOG にデフォルト ビューのエントリがない場合、リ
モート データベース ユーザ (データベース接続により識別される) は、デフォルト ビューを元の設
定から変更するために MapCatalog の ALTER 権限を持つ必要があります。この権限がないと、警
告メッセージが表示され、デフォルト ビューの変更が失敗します。
MapBasic 11.0
155
ユーザーズ ガイド
第 7 章: テーブル操作
テーブル操作をより効果的に行うためのヒント
トランザクション ファイルを最小化する処理
通常、ユーザが MapInfo テーブルを編集すると、その編集内容はトランザクション ファイルと呼ば
れる一時ファイルに格納されます。ユーザが続けて編集を行うと、トランザクション ファイルも大
きくなります。トランザクション ファイルが大きくなると、いくつかの処理の速度が低下します。
そのため、MapBasic プログラムでテーブル編集を行う場合は、次のいずれかの方法でトランザク
ション ファイルが大きくなりすぎるのを防いでください。
•
編集内容を (Commit 文を実行する) 定期的に保存します。たとえば、100 回編集が行われるた
びにコミットが実行されるようにプログラムを設定することもできます。編集内容を保存する
と、トランザクション ファイルは空になります。
•
Set Table...FastEdit 文を使用して、FastEdit モードをオンにします。FastEdit モードでは、編
集内容はトランザクション ファイルに格納されず、即座にテーブルに保存されます。この構文
の詳細については、『MapBasic リファレンス ガイド』またはオンライン ヘルプを参照してく
ださい。また、Set Table...Undo Off の説明も参考にしてください。
インデックスの適切な使用
テーブルの 1 つ以上のフィールドにインデックスを付けると、いくつかの検索操作が速くなりま
す。たとえば、Where 節、Order By 節、または Group By 節で使用されるフィールドにインデッ
クスを付けると、Select 文をより速く実行できます。ただし、テーブルのすべてのフィールドに
インデックスを付けるのは避けてください。テーブルのすべてのフィールドにインデックスを付
けると、MapInfo Professional はインデックスの管理により多くの時間を費やさなければならなく
なるため、処理が遅くなる場合があります。
アプリケーションで、検索操作を行わずに大量のデータを扱うテーブル操作を実行する場合は、
次の方法で処理スピードの向上を図ることができます。
1. (Drop Index 文を使用して) テーブルからインデックスを削除します。
2. 必要に応じてテーブルを編集します。
3. 編集内容を保存します。
4. Create Index 文を使用して再度インデックスを作成します。
こうすることで、編集中に MapInfo Professional によるインデックス管理が不要になるため、大量
のデータを扱うテーブル操作を高速化できます。
サブ選択の利用
『MapBasic リファレ ンス ガイド』に説明されているように、Select 文にはサブ選択を行う
Where 節を含めることができます。ただし、ネストされた 1 つの Select...Where (Select...) 文の
代わりにネストされない 2 つの Select 文を発行した方が、処理がより速くなります。
次のようなサブ選択を実行するとします。
... Where x = Any( Select ...) ...
この場合、MapInfo Professional はフィールド x にインデックスが付いている場合に限り、検索操
作の最適化を行います。
MapBasic 11.0
156
ユーザーズ ガイド
第 7 章: テーブル操作
テーブル操作をより効果的に行うためのヒント
Select 文の最適化
いくつかの Select 検索操作では、処理速度の向上を目的とした最適化が図られます。『MapBasic
リファレンス ガイド』またはオンライン ヘルプの Select の項を参照してください。
Update 文の使用
MapBasic では、Alter Object 文を実行することによりマップ オブジェクトを一度に 1 つ更新する
ことができます。Update 文は通常はループを使用して 1 レコードずつ処理しますが、 この方法で
テーブルを操作した場合、変更するレコードごとにいくつかの文を実行するため、遅くなります。
状況によっては、レコードを 1 つずつ更新する代わりに Update 文を 1 回実行するだけでテーブル
全体を更新し、迅速に処理することが可能です。
MapBasic 11.0
157
ユーザーズ ガイド
ファイル入出力
MapBasic では、ファイルの管理と MapInfo テーブルの管理には重要な違いが
あります。前章では、MapBasic におけるテーブルの管理について説明しまし
た。本章では、"テーブルではない" ファイルの管理について説明します。
このセクションの構成
Š
Š
Š
ファイルの入出力の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .159
シーケンシャル ファイル入出力 . . . . . . . . . . . . . . . . . . . . . . . . . . .160
プラットフォーム指定 / 国際文字セット . . . . . . . . . . . . . . . . . . . . .163
8
第 8 章: ファイル入出力
ファイルの入出力の概要
ファイルの入出力の概要
ファイル入出力 (ファイル I/O) は、ファイルからの情報の読み取り (入力) およびファイルへの情報
の書き込み (出力) を行うプロセスのことです。MapBasic 言語は、テキスト ファイルまたはバイ
ナリ ファイルの読み取りおよび書き込みを行うための一連の標準 BASIC 入出力文および関数を備
えています。また、MapInfo Professional と MapBasic はさまざまなハードウェア プラットフォー
ムをサポートするよう設計されているため、MapBasic のファイル I/O 文を利用してデータをス
ムーズに共有できます。
ファイル アクセスには、"シーケンシャル"、"ランダム"、"バイナリ" の 3 つのタイプがあります。
使用する必要のあるモードは、アクセスするファイルの中にあるデータの性質によって異なりま
す。3 つのモードの概略を以下に示します。
•
シーケンシャル ファイル I/O は、可変長テキスト ファイルからのテキストの読み取りに使用し
ます。たとえば、テキスト ファイルのある行が 50 文字の長さを持ち、続く行が 50 文字より
も短いか、長い場合、そのファイルは可変長であると言えます。このようなファイルにアクセ
スするには、シーケンシャル ファイル I/O を使用します。
•
ランダム ファイル I/O は、固定長テキスト ファイルからの読み取りに使用します。ファイルの
各行がどれも 80 文字の長さを持つ場合、そのファイルは固定長であるため、ランダム ファイ
ル I/O を使用してアクセスします。
•
バイナリ ファイル I/O は、バイナリ (非テキスト) ファイル データへのアクセスに使用します。
バイナリ ファイル I/O を使用してファイルにデータを格納すると、効率の良い格納形式で数値
データが保存されます。数値データを含むバイナリ ファイルは、テキスト エディタでは表示も
編集もできません。しかし、数値データの格納という点では、バイナリ ファイルはテキスト
ファイルよりも効率的です。
どのファイル I/O タイプを実行する場合も、ファイル I/O 操作の最初のステップとして、まず使用
するファイルを開かなければなりません。MapBasic では、Open File 文を使用してファイルを開き
ます。この文には、いくつかのオプションの句があります。使用する必要のある句は、状況に応じ
て異なります。次の文を使用すると、シーケンシャル入力を行うテキスト ファイルが開きます。
Open File "settings.txt" For Input As #1
ファイルを開く際に、ファイル番号を指定します。上の例では、この番号は 1 です。これ以降、
プログラム内の文では、この Open File 文で指定した同じ番号を参照します。たとえば、その
ファイルから文字列変数にテキストを読み込むには、Line Input 文を発行します。この Line Input
文では、Open File 文と同じファイル番号 (#1) を参照します。
Line Input #1, s_nextline
複数のファイルを同時に開く必要がある場合は、個々のファイルがそれぞれ異なる番号で開かれ
るようにします。
データを格納するための新しいファイルを作成しなければならない場合もあります。新規ファイ
ルを作成するには、For Output 句を含む Open File 文を発行します。
Open File "workfile.txt" For Output As #2
MapBasic 11.0
159
ユーザーズ ガイド
第 8 章: ファイル入出力
シーケンシャル ファイル入出力
また、Open File 文の中で For Append を指定することもできます。Append モードでは、ファイ
ルが存在しない場合は新しく作成され、ファイルが既に存在する場合はそのファイルにデータが
追加されます。ファイルの読み取りまたは書き込み操作の終了後に、Close File 文を発行します。
次に例を示します。
Close File #1
この番号パラメータは、Open File 文でそのファイルに割り当てられた識別番号と同じです。シャー
プ記号 (#) はオプションとなっています。ファイル入出力操作によって作成または変更されたファイ
ルを保存するために "保存" コマンドを実行する必要はありません。Close File 文を発行すると、
ファイルの変更操作は完了します。(MapBasic には Save File 文が用意されていますが、この文は
ファイルの変更内容を保存するためのものではなく、ファイルをコピーするためのものです。)
ファイル I/O 操作中に、さまざまな原因で実行時エラーが発生することがあります。実行時エラー
は、Open File 文で間違ったファイル名を指定したり、読み取り専用ファイルを出力用に開こうと
したりすると発生します。また、ファイルにデータが書き込まれている間にディスク容量が一杯
になった場合や、 別のネットワーク ユーザが編集しているファイルを出力用に開こうした場合に
も、実行時エラーが発生します。ファイル入出力操作を行うアプリケーションを開発する場合
は、エラー条件を検出および修正するためのエラー処理ルーチンをプログラムに組み込むととも
に、予想されるエラー条件 (例 : ディスク容量不足) の下でアプリケーションをテストする必要があ
ります。エラー ハンドラの作成方法については、「実行時エラーのデバッグ およびトラップ」を
参照してください。
適切な関数を呼び出すことによってエラーの発生を回避できる場合もあります。たとえば、Open
File 文を発行する前に FileExists( ) 関数を呼び出すことで、そのファイルが実際に存在するかど
うかを確認できます。また、プログラムで一時作業ファイルを作成する必要があるときに、ユー
ザのディレクトリ名がわからないためにファイルに割り当てる名前やディレクトリ パスがわから
ない場合は、TempFileName$( ) 関数を呼び出します。ファイル I/O に関する文には、これ以外に
も次のようなものがあります。
•
Kill 文は、ファイルを削除します。
•
Save File 文は、ファイルのコピーを保存します。
•
Rename File 文は、ファイルの名前を変更します。
•
ProgramDirectory$( )、HomeDirectory$( )、ApplicationDirectory$( ) などの関数を使用する
ことで、実行時にさまざまなディレクトリ パスを調べることができます。たとえば、MapInfo
Professional ディレクトリ (Startup ワークスペースなど) に存在するファイルの名前を表す文字
列を作成する場合、そのディレクトリの名前がわからない場合には、ProgramDirectory$( ) を
呼び出すことで MapInfo Professional のインストール先ディレクトリを調べることができます。
シーケンシャル ファイル入出力
シーケンシャル ファイル I/O (可変長テキスト ファイルの読み取り/書き込み) を行う場合は、
Open File文の For 句で、Input、Output、Append のいずれかのオプションを指定できます。
For Input 句は、既存のファイルからの読み取りに使用します。たとえば、ビュー名管理サンプル プロ
グラム (nviews.mb) は、入力用に既存のテキスト ファイルを開くため、次のような文を発行します。
MapBasic 11.0
160
ユーザーズ ガイド
第 8 章: ファイル入出力
シーケンシャル ファイル入出力
Open File view_file For Input As #1
文字列変数の view_file には、テキスト ファイルの名前が含まれます。
入力用のファイルを開いた後で、Input # 文または Line Input # 文を使用してファイルを読み取る
ことができます。Line Input # 文は、ファイルの行全体を文字列変数に読み込みます。Input # 文
では、テキストの各行をコンマで区切られた値のリストとして扱い、個々の値をそれぞれ別の変
数に読み込みます。
たとえば、ビュー名管理プログラムは、次のようにフォーマット化されたデータを読み取ります。
"New York", -75.75, 42.83, 557.5
"Texas", -100.2, 31.29, 1200
テキストファイルの各行には、名前、x 座標、y 座標、およびズーム距離の 4 つの値が含まれてい
ます。ビュー名管理プログラムでは、次の Input # 文を使用して各行を 4 つの異なる変数に読み込
みます。
Input #1, vlist(tot).descript,
vlist(tot).x,
vlist(tot).y,
vlist(tot).zoom
変数 vlist は、カスタムタイプ変数の配列です。
データを順番に読み取る場合は、個々の読み取り操作が正常に完了したかどうかをテストする必要
があります。プログラムがファイルの内容をすべて読み取った後に、さらに続けて読み取りを試行
しても、その読み取り操作は実行されません。読み取り操作が正常に完了したかどうかをテストす
るには、各入力操作の後で EOF( ) 関数 (EOF はファイル末の意味) を呼び出します。EOF( ) 関数が
FALSE 値を返した場合、ファイルの中にまだ読み取られていない部分があります (つまり、読み取
りが完了していません)。EOF( ) 関数が TRUE 値を返した場合、ファイル末に達しています。
L
ファイルの最終行の読み取り中は、TRUE は返されません。EOF( ) 関数は、ファイルの最
終行を越えて読み取ろうとした場合にのみ TRUE を返します。
コンマで区切られた式のリストを含むファイルを作成するには、For Output 句または For Append
句を使用した Open File 文を発行します。ファイルを開いた後で、Write # 文を使用してファイルに
データを書き込みます。Write # 文の中で、ファイルの各行に書き込むコンマで区切られた式のリス
トを指定します。たとえば、ビュー名管理プログラムでは、次の Write # 文を (ループ内で) 発行し、
上記の 4 つの値 (名前、x、y、ズーム) を含むファイルを作成します。
Write #1, vlist(i).descript, vlist(i).x, vlist(i).y, vlist(i).zoom
上の例に示すように ("New York"....)、Write # 文ではファイル内の各文字列式を二重引用符で囲ん
で表示します。しかし、テキストを引用符に入れたくない場合など、Write # 文を使うと不都合な
こともあります。引用符を付けずにテキストをファイルを書き込むには、Write # の代わりに
Print # を使用します。
1 行全体を文字列変数の中に読み取りたい場合は、Line Input # 文を使用します。Print # 文を使
用すると、後に Line Input # 文を使用して読み取りが行えるファイルを作成することができま
す。Print # と Line Input # を使用して行全体の読み取りまたは書き込みを一度に行う操作の例に
MapBasic 11.0
161
ユーザーズ ガイド
第 8 章: ファイル入出力
シーケンシャル ファイル入出力
ついては、サンプル プログラムの auto_lib.mb を参照してください。auto_lib プログラムでは、
MapInfo のワークスペース ファイル (特に Startup ワークスペース ファイル) の読み取りと書き込
みを行います。
入力用に開かれたシーケンシャル ファイルに書き込んだり、出力用に開かれたシーケンシャル
ファイルから読み込んだりすることはできません。
ランダム ファイル入出力
ランダム アクセス ファイル I/O を実行するには、Open File 文の中で For Random 句を指定します。
Open File "datafile.dat" For Random As #1 Len = 80
Random モードでファイルを開く場合は、ファイルの各行のバイト数を示す Len 句を含めます。
どのテキスト ファイルにも、各行の行末を示す不可視の文字である行末ターミネータが埋め込ま
れていることに注意してください。Len 句で指定する行の長さ (上の例では 80) には、各レコード
の行末ターミネータ (改行/行送り文字など) を含む正確な文字数を指定します。
ランダム アクセス ファイルを開いた後で、Get 文または Put 文を使用してそのファイルの読み取
りまたは書き込みを行うことができます。これらの文の詳細については、『MapBasic リファレン
ス ガイド』を参照してください。
バイナリ ファイル入出力
バイナリ ファイルは、バイナリ形式で格納された数値を含むファイルです。次の文は、バイナリ
アクセス ファイルを開く方法を示しています。
Open File "settings.dat" For Binary As #1
バイナリ アクセス ファイルを開いた後で、Get 文または Put 文を使用してそのファイルの読み取り
または書き込みを行うことができます。『MapBasic リファレンス ガイド』を参照してください。
バイナリ形式を使用すると、数値を非常に効率よく格納することができます。たとえば、ファイル
の中の各整数値は、その整数値の大きさとは無関係に常に 4 バイトで格納されます。これに対し、
9 桁の整数 (例 : 111、222、333) をテキスト ファイルに格納すると、その値はファイルの中で 9 バ
イトのスペースを占領します。つまり、バイナリによる格納は非テキスト データを格納する場合に
はより効率的といえます。ただし、テキスト エディタを使用してファイルを表示する必要がある場
合には、データをバイナリ ファイルではなくテキスト ファイルに格納する必要があります。
バイナリ ファイルのレコードには文字列を含めることができますが、これらの文字列は固定長で
なければなりません。
MapBasic 11.0
162
ユーザーズ ガイド
第 8 章: ファイル入出力
プラットフォーム指定/国際文字セット
プラットフォーム指定/国際文字セット
別のハードウェア プラットフォームや別の国で作成されたテキスト ファイルを読み取る際に問題
が発生する場合は、Open File 文でオプションの CharSet 句を使用しなければならないこともあ
ります。コンピューターのキーボードのすべての文字は数値コードに対応します。たとえば、文
字 "A" は文字コード 65 に相当します。文字セットとはコンピュータに現れる文字のセットで、文
字に対応する数値コード セットのことです。
国によって異なる文字セットが使用されます。たとえば、Windows の北米および西欧バージョン
では、文字コード 176 は角度記号を表します。しかし、その他の国での使用を想定して構成され
た Windows バージョンでは、文字コード 176 が別の文字を表す可能性があります。国によって使
用する文字コードが異なるため、別の国で作成されたファイルを読み取る場合に問題が発生する
可能性があります。
このような文字セットの解釈の問題を回避するために、Open File 文に CharSet 句を含めます。
CharSet 句を使用して、ファイルの作成時に使用された文字セットを明示的に指定します。ファ
イルの作成時の文字セットを正しく指定した CharSet 句を含めると、そのファイルからの読み取
り (またはそのファイルへの書き込み) を行う際に、データが正しく解釈されます。CharSet 句で
使用できる文字セット名のリストについては、『MapBasic リファレンス ガイド』の CharSet に
関するセクションを参照してください。
ファイル情報関数
次の関数は、開いたファイルに関する情報を返します。
•
FileAttr( ) は、そのファイルが開かれたモード (INPUT、OUTPUT、APPEND、RANDOM、ま
たは BINARY) を返します。
•
EOF( )は、ファイル末を過ぎて読み取りを行おうとした場合、またはファイル ポインタの位置
がファイル末を超えた場所にある場合に、論理値 TRUE を返します。
•
Seek( ) は、ファイル内の位置をオフセット バイトで返します。RANDOM ファイルでは、この
値は最後に使用されたレコードの番号だけではなく、その番号とレコードの長さを掛け合わせ
た数値となります。
LOF( ) は、ファイル全体の長さをバイト数で返します。
•
これらの関数は、いずれも Open File 文で引数として割り当てられたファイル番号を使用しま
す。詳細については、『MapBasic リファレンス ガイド』またはオンライン ヘルプを参照してく
ださい。
MapBasic 11.0
163
ユーザーズ ガイド
図形オブジェクト
MapBasic のパワーの大半は、弧、楕円、枠、ライン、ポイント、折れ線、長
方形、リージョン、面取り長方形、テキストなどのさまざまなマップ オブ
ジェクトの検索および操作機能にあります。この章では、MapBasic プログラ
ムを使用した、マップを構成するオブジェクトの検索、作成、変更方法につい
て説明します。ただし、MapBasic によるテーブルへのオブジェクトの格納方
法を理解するには、まず MapInfo テーブルの原則について理解する必要があ
ります。まだ第 8 章をお読みでない方は、この章を読む前に「テーブル操作」
に目を通してください。
このセクションの構成
Š
Š
Š
Š
Š
Š
Š
Š
Š
オブジェクト変数の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .165
"Obj" フィールドの利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .165
オブジェクト属性の検索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .167
オブジェクトの新規作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .175
既存オブジェクトに基づくオブジェクトの作成 . . . . . . . . . . . . . . .178
オブジェクトの変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .180
マップ ラベルを使った作業 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .182
座標および測定単位 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .186
高度な地理検索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .188
9
第 9 章: 図形オブジェクト
オブジェクト変数の使用
オブジェクト変数の使用
MapBasic の Object 変数は、ラインなどのシンプルなオブジェクトやリージョンなどの複雑なオ
ブジェクトの両方を使用する作業を可能にします。(Visual Basic のプログラマの皆さんは、
MapBasic の Object 型は OLE オブジェクトではなく図形を表している点に注意してください。)
MapBasic の Object 変数は、ほとんどの点で他の変数と同じように扱うことができます。オブ
ジェクト変数に値を割り当てる、オブジェクト変数を引数として関数やプロシージャに渡す、オ
ブジェクト変数の値を MapInfo テーブルに格納するなどの操作が可能です。
オブジェクト変数を定義するには、Dim 文を使用します。
Dim Myobj, Office As Object
変数に含みたいオブジェクトのタイプを指定する必要はありません。Object 変数には、あらゆる
種類の図形オブジェクトまたはレイアウト オブジェクトを含めることができます。
Object 変数に値を割り当てるには、次のように等号 (=) を使います。
Office = CreatePoint(73.45, 42.1)
Myobj = Office
別の Object 変数、オブジェクトを戻す関数、またはテーブル名.Obj の形式を持つテーブル式か
らオブジェクトを割り当てることも可能です。ただし、リテラル (ハードコード) オブジェクト式
を指定するための構文は存在しません。
オブジェクト変数には、1 つのマップ オブジェクトに関するあらゆる情報が含まれます。たとえ
ば、Object 変数にライン オブジェクトを格納すると、その変数には、格納されたラインに関する
地理情報 (ラインの始点および終点の座標など) と表示情報 (ラインの色、太さ、スタイルなど) が
含まれます。また MapBasic には、オブジェクトの座標を格納することなくそのスタイルを格納で
きる 4 つの変数タイプ (ペン、ブラシ、シンボル、フォント) も用意されています。
"Obj" フィールドの利用
Obj と呼ばれるフィールドは、テーブルの図形オブジェクトを参照する特殊なフィールドです。図
形オブジェクトの含まれるすべてのテーブルに 1 つの Obj フィールドがあります。ただし、この
Obj フィールドは、通常、ブラウザ ウィンドウには表示されません。
Object フィールドの内容にアクセスするには、"テーブル名.obj" (または "テーブル名.object")
形式の式を使用します。次の例では、Object 変数 (current_state) を宣言し、states テーブルから
その変数にオブジェクトをコピーします。
Dim current_state As Object
Open Table "states"
Fetch First From states
current_state = states.obj
Object フィールドに対しても、通常のフィールドと同様の操作を行うことができます。Object
フィールドを参照する SQL 検索、フィールドの値 (オブジェクト) に対する更新操作、およびその
内容の変数への読み取りなどを行えます。
MapBasic 11.0
165
ユーザーズ ガイド
第 9 章: 図形オブジェクト
"Obj" フィールドの利用
次の文を使用すると、州の省略記号と各州の面積を示す検索テーブルが作成されます。ここで
は、Obj フィールドは Area( ) 関数のパラメータの 1 つとして使われています。
Select state, Area(obj, "sq mi")
From states
次の例は、カリフォルニア州の高速道路の全長マイル数を示す 1 つの行から成るテーブルを作成
します。
Select Sum(ObjectLen(obj, "mi"))
From highways
Where obj Within (Select obj From states Where state = "CA")
行の中には、マップ オブジェクトを含まないものもあります。たとえば、データベース ファイル
を MapInfo テーブルとして開いてそのテーブルをジオコード化すると、ジオコード プロセスに
よってテーブルの各行にポイント オブジェクトが添付されます。ただし、ジオコード化されな
かった行にはマップ オブジェクトは添付されません。オブジェクトを持たない行をすべて選択す
るには、Select 文の Where 節に Not obj という条件を追加します。次の文を使用すると、マップ
オブジェクトを持たない行をすべて選択できます。
Select *
From sites
Where Not obj
Object フィールドの作成
すべてのテーブルが "マップ作成可能" というわけではありません。たとえば、スプレッドシート
またはデータベース ファイルに基づいてテーブルを作成すると、そのファイルは当初はマップに
表示することができません。このようなテーブルをマップ作成可能にするには、まず Create Map
文を発行し、テーブルに Object フィールドを追加する必要があります。
Object フィールドをテーブルから削除するには、Drop Map 文を使用します。Drop Map を使用す
ると、Object フィールドが完全に削除されます。しかし、Object フィールド全体を削除するので
はなく、テーブルから個々のオブジェクトだけを削除したい場合もあります。これは、テーブル
の "ジオコード解除" と呼ばれることもあります。Object フィールドを削除せずに個々のオブジェ
クト値を削除するには、Delete Object 文を使用します。
テーブルに Object フィールドがあるかどうかを確認するには、TAB_INFO_MAPPABLE コードを
使用して TableInfo( ) 関数を呼び出します。
Object フィールドに関する制限事項
Object フィールドには、他のタイプのフィールドには適用されない制限が存在します。たとえ
ば、各テーブルは 1 つの Object フィールドしか持つことができません。2 つのテーブルを結合す
る検索操作を実行したときに両方のテーブルが Object フィールドを持っていると、結果テーブル
には片方のテーブルのオブジェクト (Select 文の From 節の中で最初に現われるテーブルのオブ
ジェクト) しか含まれません。
MapBasic 11.0
166
ユーザーズ ガイド
第 9 章: 図形オブジェクト
オブジェクト属性の検索
次の例では、states テーブルと、小売店を表すポイント オブジェクトを含む outlets テーブルとい
う 2 つのマップ作成可能テーブルに対して検索を実行します。Select 文の From 節には、両方の
テーブルが含まれています。ただし、states テーブルが最初に現われるため、結果テーブルには
states テーブルのオブジェクトが含まれることになります。
Select *
From states, outlets
Where states.state = outlets.state
Map From selection
次のように、From 節で outlets テーブルを最初に持ってくると、この Select 文の結果テーブルに
は、州のリージョン オブジェクトではなくポイント オブジェクト (小売店) が含まれます。
Select *
From outlets, states
Where outlets.state = states.state
Map From selection
テーブルの各行は、それぞれ 1 つのオブジェクトしか含むことができません。ただし、各オブ
ジェクトは複数の部分から構成することができます。たとえば、リージョン オブジェクトには複
数のポリゴンを含めることができるため、一群の島を 1 つのリージョン オブジェクトで表すこと
ができます。同様に、折れ線オブジェクトも多数のセクションを含むことができます。あるリー
ジョン オブジェクトに含まれるポリゴンの数や、ある折れ線オブジェクトに含まれるセクション
の数を決定するには、まずそのオブジェクトを選択し、MapInfo Professional の [編集] > [オブジェ
クト情報] コマンドを選択します。プログラムを通じてセクションまたはポリゴンの数を決定する
には、OBJ_INFO_NPOLYGONS コードを使用して ObjectInfo( ) 関数を呼び出します。
オブジェクト属性の検索
MapInfo テーブルには、異なるタイプのオブジェクトを含めることができます。たとえば、道路マップ
にはラインと折れ線が両方含まれる場合もあります。オブジェクトの種類を決定するには、
OBJ_INFO_TYPE コードを使用して ObjectInfo( ) 関数を呼び出します。詳細については、『MapBasic
リファレンス ガイド』またはオンライン ヘルプの ObjectInfo( ) の項を参照してください。
MapBasic ウィンドウをインタラクティブに使用する場合は、これ以外にもさまざまな方法でオブ
ジェクトの種類を表示することができます。たとえば、MapBasic ウィンドウから次のような文を
発行すると、オブジェクトの種類を示すメッセージが表示されます。
Fetch First From world
Note world.obj
次の文は、レイアウト ウィンドウからすべてのテキスト オブジェクトを選択します。
Select *
From Layout1
Where Str$(obj) = "Text"
オブジェクトの地理座標に関する情報を決定するには、ObjectGeography( ) 関数を呼び出しま
す。たとえば、ObjectGeography( ) を呼び出すと、ライン オブジェクトの両端の x 座標および y
座標を決定できます。折れ線やリージョンには可変数のノードが含まれるため、これらのオブ
ジェクトのノード座標を決定する操作はより複雑です。折れ線またはリージョンのノードの座標
を決定するには、ObjectNodeX( ) および ObjectNodeY( ) を呼び出します。
MapBasic 11.0
167
ユーザーズ ガイド
第 9 章: 図形オブジェクト
オブジェクト属性の検索
オブジェクトの図心を決定するには、Centroid( ) 関数か、CentroidX( ) 関数と CentroidY( ) 関数
を利用します。オブジェクトの最小外接四角形 (オブジェクト全体を囲む最小の長方形) を決定す
るには、MBR( ) 関数を呼び出します。
オブジェクトのその他のタイプの属性を決定するには、ObjectInfo( ) 関数を呼び出します。たと
えば、オブジェクト式をテーブルから Object 変数にコピーした後は、ObjectInfo( ) を呼び出して
そのオブジェクトの種類 (ライン、リージョンなど) やスタイル (ペン、ブラシ、シンボル、フォン
トなど) を決定できます。そのオブジェクトがテキスト オブジェクトである場合は、ObjectInfo( )
を使用すると、そのテキスト オブジェクトを構成する文字列を読み取ることができます。
MapBasic の標準関数の多くは、オブジェクトを引数に取り、そのオブジェクトに関する 1 つの情
報を戻り値として返します。たとえば、Area( )、Perimeter( )、ObjectLen( ) などの関数は、オブ
ジェクト パラメータを取ります。次の例では、洪水地域の面積を計算します。
Dim floodarea As Float
Open Table "floodmap"
Fetch First From floodmap
floodarea = Area(floodmap.obj, "sq km")
ラベルはテキスト オブジェクトではありませんので注意してください。テキスト オブジェクトの
検索には、ObjectInfo( ) などの関数を呼び出します。ラベルの検索には、Labelinfo( ) などの関数
を呼び出します。ラベルの詳細については、マップ ラベルを使った作業 (182 ページ)を参照して
ください。
オブジェクトのスタイル (ペン、ブラシ、シンボル、フォント)
どのオブジェクトにも、1 つ以上のスタイル設定が含まれます。たとえば、各ライン オブジェク
トはラインの色、太さ、およびパターン (実線、点線など) を定義するペン スタイルを、 各ポイン
ト オブジェクトはポイントの形、色、およびサイズを定義するシンボル スタイルを持っていま
す。リージョンなどの囲まれたオブジェクトは、ペン スタイルとブラシ (フィル) スタイルの両方
を持ちます。
次の表に、4 つのオブジェクト スタイルの概略を示します。
Object
オブジェクトのスタイル
Pen
ラインの幅、パターン、色
Brush
フィル エリアのパターン、前景カラー、背景カラー
Font
フォント名、スタイル、サイズ、テキスト カラー、背景カラー。テキスト オブジェ
クトのみに適用。
Symbol
MapInfo Professional のシンボル : 形、色、サイズ属性。
TrueType フォントのシンボル : 形、色、サイズ、フォント名、フォント スタイル (太
字、斜体など)、回転の属性。
ビットマップ ファイルによるカスタム シンボル : ファイル名、色、サイズ、スタイ
ル属性。
MapBasic 11.0
168
ユーザーズ ガイド
第 9 章: 図形オブジェクト
オブジェクト属性の検索
上記の 4 つのスタイルの詳細については、『MapBasic リファレンス ガイド』およびオンライン
ヘルプの Brush 節、Font 節、Pen 節、および Symbol 節の項を参照してください。
MapBasic 言語には、さまざまな文や関数 (例 : Create Text 文、CreateLine( ) 関数) が用意されて
おり、これらを使用してオブジェクトを作成することができます。各オブジェクト作成文には、
オブジェクトのスタイルを指定するオプション節があります。たとえば、Create Line 文には、ラ
インのスタイルを指定できるオプションの Pen 節が含まれます。スタイル設定を指定しないオブ
ジェクト作成文を発行すると、オブジェクトには現在のスタイルが割り当てられます。
L
= 演算子を使用して 2 つのスタイルの値を比較することはできません。たとえば、2 つのブ
ラシ変数を比較する次のプログラムでは、実行時エラーが発生します。
Dim b1, b2 As Brush
b1 = MakeBrush(2, 255, 0)
b2 = CurrentBrush()
If b1 = b2 Then
Note "The two brush styles are equal."
End If
2 つのスタイルを比較するには、Str$( ) 関数を使用して各スタイルを文字列式に変換します。たと
えば、2 つのブラシ値を比較するには次の文を使用します。
If Str$(b1) = Str$(b2) Then ...
2 つのブラシ スタイル (または 2 つのペン スタイルなど) を比較する必要がある場合は、まず
StyleAttr( ) 関数を使って個々のスタイル要素 (色など) を抽出し、これらの個々の要素を比較します。
フォント スタイルについて
各テキスト オブジェクトにはフォント スタイルを設定できます。フォント スタイルで定義するの
は、フォント名 (Times Roman、 Helvetica など)、テキスト スタイル (太字、斜体など)、およびテ
キストの色です。また、フォント スタイルでは、ポイント サイズによってテキストのサイズを指
定することもできます。ただし、ポイント サイズが無視される場合もあります。以下に、フォン
トのポイント サイズが異なるタイプのテキストに与える影響をまとめます。
•
レイアウト ウィンドウの中でテキスト オブジェクトを作成すると、フォントのポイント サイ
ズによってテキストの高さが制御されます。フォント スタイルが 10 ポイントのテキストを指
定すると、その テキスト オブジェクトは 10 ポイントのテキストとして定義されます。拡大ま
たは縮小操作によってはテキストが 10 ポイントで "表示" されない場合もありますが、このレ
イアウトを "印刷" すると、テキストの高さは 10 ポイントとなっています。
•
マップ作成可能なテーブルの中で Create Text 文を使用してテキストを作成すると、現在のフォ
ントのポイント サイズは無視されます。この場合、テキストの高さは Create Text 文で指定す
るマップ座標によって制御されます。Create Text 文を発行するときには、マップ上の長方形の
エリアを定義する 2 組の x 座標と y 座標を指定します。テキスト オブジェクトは、この長方形
のエリアを埋めるサイズとなります。このため、マップ作成可能テーブルの中に格納されたテ
キスト オブジェクトは、拡大操作を行うと大きくなり、縮小操作を行うと小さくなります。
MapBasic 11.0
169
ユーザーズ ガイド
第 9 章: 図形オブジェクト
オブジェクト属性の検索
•
•
CreateText( ) 関数を使用してマップ作成可能なテーブルにテキスト オブジェクトを作成する
と、設定されているフォントのポイント数でテキストのサイズが決まりますが、 マップを拡大
すると、テキストも大きくなります。
マップ ウィンドウの中でラベルを作成すると、フォントのポイント サイズによってテキスト
の高さが制御されます。テキストは、フォント スタイルで指定した高さで表示および印刷され
ます。ラベルの動作はテーブルに格納されたテキスト オブジェクトの動作とは異なることに注
意してください。ラベルの詳細については、マップ ラベルを使った作業 (182 ページ)を参照し
てください。
フォント スタイルには、"Courier" や "Helvetica" などのフォント名が含まれます。フォント名は、
それぞれのハードウェア プラットフォームによって異なる場合があります。Microsoft Windows 環
境の Helv および TmsRmn (または Times New Roman) は、Sun のプラットフォームではそれぞれ
Helvetica および Times と呼ばれています。MapBasic の Font 節では、Helvetica、Times、Courier
は実行時に使用しているプラットフォームに関係なく認識されます。
積み上げスタイル
レイヤのスタイルを積み上げて、互いの上に重ねて描画されるスタイルのリストにすることで、
より複雑でおもしろいマップ表現を作成できます。ポイント、折れ線、およびポリゴンに対して
スタイルを積み上げることができます。特に折れ線のスタイルとして便利です。
図 1 は、MapInfo の交差ライン スタイルの 1 つを用いたラインの例です。図 2 は、同じラインに
対し、積み上げライン スタイルを適用したものです。
図 : 1:
図 : 2:
積み上げスタイルは、マップに複数のレイヤとしてデータを追加する必要なく、用途に応じたよ
り意味のある表示スタイルを作成します。好きなだけ多くのスタイルを、積み上げスタイルとし
て定義できます。ただし、多くのスタイルを定義するほど、マップのレンダリングのパフォーマ
ンスに影響が生じます。ほとんどの地図において通常、オブジェクトの描画に 2 つか 3 つの積み
上げスタイルを使用します。
MapBasic 11.0
170
ユーザーズ ガイド
第 9 章: 図形オブジェクト
オブジェクト属性の検索
積み上げスタイルは、上書きレイヤ スタイルの一部です。
積み上げスタイルをセットアップするには、まずレイヤの [上書きスタイル] チェック ボックスを
オンにする必要があります。このチェック ボックスには、[レイヤ管理] の [レイヤ属性] ダイアロ
グ ボックスから (または、同様に [ズーム範囲表示の上書き] ダイアログ ボックスから) アクセスし
ます。 積み上げスタイルは、レイヤの表示設定の一部となり、レイヤ内のすべてのオブジェクト
に適用されます。積み上げスタイルは TAB ファイルの一部としては保存されません。レイヤの表
示設定の一部となるため、 TAB ファイルではなくワークスペースに保存されます。つまり、現在
作業中の TAB ファイルが読み取り専用の場合でも、積み上げスタイルを適用できます。
積み上げスタイルの MapBasic
積み上げスタイルは MapBasic で完全にサポートされています。積み上げスタイルは、類似するス
タイル句のカンマ区切りのリストとして定義されます。たとえば、積み上げライン スタイルを事
前に定義する場合、次のコードを使用します。
Line (7,2,8388608), Line (2,9,16744703)
これをマップ レイヤのグローバル上書きスタイルとして使用するには、Set Map 文の Global 句に
これを追加します。
Set Map Layer 1 Display Global Global Line (7,2,8388608), Line
(2,9,16744703)
MapBasic で最初に出現した Line 句が最初に描画され、カンマがある場合は続いて次の Line 句が
描画され、以下同様に続きます。
MapBasic を使用して上書きレイヤ表示の積み上げスタイルを作成する方法については、Set Map 文
の MapBasic リファレンスを参照してください。積み上げスタイル属性を検索する方法については、
MapBasic リファレンスの「新機能」セクションに記載されている新機能を参照してください。
その他の積み上げスタイルの例
積み上げポイント スタイルを使用すると、シンボルを一層目立たせることができます。積み上げ
ポイント スタイルの外観と、それをレイヤのグローバル スタイルの一部にする MapBasic 文の例
を次に示します。
ポイント オブジェクト (シンボル) での例
積み上げスタイルのポイントを使用すると、ポイント シンボルを一層目立たせることができます。
Set Map Layer 1 display Global Global
Symbol (32,16777136,24),
Symbol (36,255,14)
MapBasic 11.0
171
ユーザーズ ガイド
第 9 章: 図形オブジェクト
オブジェクト属性の検索
ポリゴン (リージョン) での例
積み上げリージョン スタイルを使用すると、2 つの色と 2 つの異なるライン パターンによるフィ
ルを作成できます。
Set Map Layer 1 Display Global Global
Brush (4,0,16777215),
Brush (5,16711680)
スタイル変数
MapBasic には、ペン、ブラシ、シンボル、フォントなどの、オブジェクトのスタイル属性に対応
するスタイル変数が用意されています。スタイル変数にスタイルを割り当てる方法はいくつかあ
ります。
•
MakePen( )、MakeBrush( )、MakeFont( )、MakeSymbol( )、MakeCustomSymbol( )、
MakeFontSymbol( ) のいずれかを呼び出してスタイル式を作成し、そのスタイル変数に値を
割り当てる。これらの関数では、希望するスタイルを明示的に指定できます。たとえば、
ScaleBar サンプル プログラムでは MakeBrush( ) を呼び出して白黒のブラシ式を作成し、ス
ケール バーに白黒の格子スタイルを与えることができます。
•
CurrentPen( )、CurrentBrush( )、CurrentFont( )、CurrentSymbol( ) のいずれかを呼び出し
て、スタイル変数にその戻り値を割り当てる。これらの関数は、現在のスタイル (オブジェク
トがまったく選択されていないときに MapInfo の [オプション] > [ライン スタイル]、[リージョ
ン スタイル]、[シンボル スタイル]、または [テキスト スタイル] の各コマンドを選択すると表
示されるスタイル) を読み取ります。
•
ObjectInfo( ) を呼び出して既存オブジェクトのスタイルを決定し、その戻り値をスタイル変数に
割り当てる。
ユーザにダイアログ ボックスからスタイルを選ばせる。ダイアログ ボックスに PenPicker、
BrushPicker、SymbolPicker、FontPicker などのコントロールが含まれる場合、ユーザはコン
トロールをクリックすることでスタイルを選択することができます。ダイアログ ボックスの詳
細については、ユーザ インターフェイスの作成を参照してください。
•
次の例は、MakePen( ) 関数の呼び出しを通じてペン スタイルを構成する方法を示しています。ペ
ン スタイル値は、Pen 変数に割り当てられます。
Dim p_var as Pen
p_var = MakePen(1, 10, RGB(128, 128, 128))
MakePen( ) 関数の引数は、ペン スタイルを定義します。1 はスタイルの幅が 1 ピクセルであるこ
とを示し、10 はパターン (ドット) を示します。また、RGB( ) 関数呼び出しは色を指定します。ペ
ン スタイルを構成するこれらの 3 つのパラメータ (および使用可能なすべてのライン パターンを
示したリスト) については、『MapBasic リファレンス ガイド』またはオンライン ヘルプの Pen
節の項を参照してください。 同様に、ブラシ オプション、フォント オプション、シンボル オプ
ションの詳細については、Brush 節、Font 節、Symbol 節の各項を参照してください。
次の例は、既存オブジェクトのペン スタイルを Pen 変数の中に読み取る方法を示しています。
MapBasic 11.0
172
ユーザーズ ガイド
第 9 章: 図形オブジェクト
オブジェクト属性の検索
p_var = ObjectInfo(obj_var, OBJ_INFO_PEN)
Pen 変数にペン式を格納すると、オブジェクト作成文の中でその Pen 変数を使うことができるよ
うになります。
Create Line Into Variable obj_var
(-73, 42) (-74, 43)
Pen p_var
StyleAttr( ) 関数は、特定スタイルの 1 つの構成要素を戻します。たとえば、TextBox サンプル プ
ログラムはユーザにペン スタイルを選ばせるダイアログ ボックスを表示します。選択されたスタ
イルは、Pen 変数である pstyle に格納されます。続いて、TextBox は次のような文を発行し、その
ペン スタイルの色の構成要素を整数変数 (line_color) の中に読み取ります。
line_color = StyleAttr(pstyle, PEN_COLOR)
プログラム上では、色は整数値として格納されます。たとえば、黒は 0、青は 255 という値で格納
されます。RGB( ) 関数は、指定した赤、緑、青の 量に基づく色値を計算します。たとえば、
RGB(0、255、0) という関数呼び出しは、緑の色値を返します。
色を呼び出すには RGB( ) 関数を使用します。次に例を示します。
highway_style = MakePen(2, 2, RGB(0, 0, 255))
また、RGB( ) を呼び出す代わりに、mapbasic.def に定義された標準色定義コード (BLACK、
WHITE、RED、GREEN、BLUE、YELLOW、CYAN、MAGENTA) のいずれかを使用することもで
きます。
特定のスタイルを持つオブジェクトの選択
ObjectInfo( ) 関数は、あるオブジェクトからペン値、ブラシ値、シンボル値、またはフォント値
を抽出します。ペン、ブラシ、シンボル、またはフォントが得られた後は、StyleAttr( ) 関数を呼
び出して個々の要素を確認する (例 : シンボル スタイルの色を決定する) ことができます。
Select 文を使用すると、スタイルに基づくオブジェクトの選択が行えます。次の例で示すよう
に、Select 文の Where 節は ObjectInfo( ) 関数および StyleAttr( ) 関数を呼び出して、特定の属性
を 持 つ オ ブ ジ ェ ク ト ( 例 : 特 定 の色を持ったオブジェクト) だけを選択するよう MapInfo
Professional に指示することができます。
次の例では、[ツール] ツールバーに 1 つのカスタム ボタンを追加します。あるポイント オブジェ
クトを選択してそのカスタム ボタンをクリックすると、このプログラムによって、それと同じ色
を持つ同じテーブル上のポイント オブジェクトがすべて選択されます。
Include "mapbasic.def"
Declare Sub Main
Declare Sub SelectPointsByColor()
Sub Main
’ Add a custom button to the Tools toolbar.
Alter ButtonPad "Tools" Add
PushButton
Calling SelectPointsByColor
MapBasic 11.0
173
ユーザーズ ガイド
第 9 章: 図形オブジェクト
オブジェクト属性の検索
HelpMsg "Select points of same color\nSelect By Color"
End Sub
Sub SelectPointsByColor
Dim i_color, i_open As Integer
Dim symbol_style As Symbol
Dim object_name, table_name As String
’ Note how many tables are currently open.
i_open = NumTables()
’ Determine the name of the table in use.
table_name = SelectionInfo(SEL_INFO_TABLENAME)
If table_name = "" Then
’ ... then nothing is selected; just exit.
Exit Sub
End If
’ Exit if the selection is in a non-mappable table.
If Not TableInfo(table_name, TAB_INFO_MAPPABLE) Then
Exit Sub
End If
’ See whether the selected object is a Point.
’ If it is a Point, determine its Symbol and Color.
Fetch First From Selection
object_name = Str$(Selection.obj)
If object_name = "Point" Then
symbol_style = ObjectInfo(Selection.obj,OBJ_INFO_SYMBOL)
i_color = StyleAttr(symbol_style, SYMBOL_COLOR)
End If
’ Accessing "Selection.obj" may have caused MapInfo Professional to
’ open a temporary table called Query1 (or Query2...).
’ Let’s close that table, just to be tidy.
If NumTables() > i_open Then
Close Table TableInfo(0, TAB_INFO_NAME)
End If
If object_name <> "Point" Then
’...the selected object isn’t a point; just exit.
Exit Sub
End If
’ Select all the rows that contain point objects.
Select * From table_name
Where Str$(Obj) = "Point"
Into Color_Query_Prep NoSelect
’ Select those point objects that have the same
’ color as the original object selected.
Select * From Color_Query_Prep
Where
StyleAttr(ObjectInfo(obj,OBJ_INFO_SYMBOL),SYMBOL_COLOR)
MapBasic 11.0
174
ユーザーズ ガイド
第 9 章: 図形オブジェクト
オブジェクトの新規作成
= i_color
Into Color_Query
Close Table Color_Query_Prep
End Sub
この例はポイント オブジェクトを対象にしたものですが、他のオブジェクト タイプに対しても同
じ手法を使うことができます。たとえば、ポイント オブジェクトではなくリージョン オブジェク
ト を 対象 に す る 場 合 は、オ ブ ジ ェ クト名を "Point" では なく "Region" としてテストし、
OBJ_INFO_SYMBOL ではなく OBJ_INFO_BRUSH を使用して ObjectInfo( ) を呼び出すように
します。
オブジェクトの新規作成
MapBasic には、図形オブジェクトを作成するための一連の文および関数が用意されています。こ
こでは、オブジェクト作成文および関数について説明します。詳細については、『MapBasic リ
ファレンス ガイド』を参照してください。
オブジェクト作成文
次に示すのは、オブジェクトの新規作成に使用される文です。これらすべての文をレイアウト
ウィンドウ上でのオブジェクトの作成に使用できます。また、Create Frame を除くすべての文
は、マップ ウィンドウ上でのオブジェクトの作成に使用できます。
•
Create Arc 文 : 弧を作成します。
•
Create Ellipse 文 : 楕円または円を作成します。(円は、幅と高さが同じであるような特殊な弧
と言えます。)
•
Create Frame 文 : 枠を作成します。枠は、レイアウト ウィンドウ上のみに表示される特殊な
オブジェクトです。それぞれの枠では、1 つの開いたウィンドウの内容が表示できます。した
がって、ページ レイアウト上に 2 つのマップを表示する場合は、2 つの枠を作成します。
•
Create Line 文 : ラインを作成します。
•
Create Point 文 : ポイントを作成します。
•
Create Pline 文 : 折れ線を作成します。
•
Create Rect 文 : 長方形を作成します。
•
Create Region 文 : リージョンを作成します。
•
Create RoundRect 文 : 面取り長方形を作成します。
•
Create Text 文 : テキスト オブジェクトを作成します。
•
Auto Label 文 : システム レイヤにテキスト オブジェクトを添付することによって、マップ
ウィンドウに "ラベル" を作成します。この文は、ラベルではなくテキスト オブジェクトを生
成するために使用します。ラベルを作成するには、Set Map 文を使用します。
MapBasic 11.0
175
ユーザーズ ガイド
第 9 章: 図形オブジェクト
オブジェクトの新規作成
オブジェクト作成関数
次の MapBasic 関数は、オブジェクト値を戻します。
•
CreateCircle( ) 関数 : 円オブジェクトを返します。
•
CreateLine( ) 関数 : ライン オブジェクトを返します。
•
CreatePoint( ) 関数 : ポイント オブジェクトを返します。
•
Create Text ( ) 関数 : テキスト オブジェクトを返します。
オブジェクト作成関数の方が対応するオブジェクト作成文よりも効果的である場合もあります。これ
は、関数の呼び出しはより大きい文の中に埋め込むことができるからです。たとえば、次の Update
文では、CreateCircle() 関数を使用してテーブルの各行に 1 つの円オブジェクトを作成します。
Update sites
Set obj = CreateCircle(lon, lat, 0.1)
この例は、sites テーブルの lon フィールドが経度値 (x 座標)、lat フィールドが緯度値 (y 座標) を
持つと仮定しています。
可変数ノードを持つオブジェクトの作成
折れ線オブジェクトとリージョン オブジェクトは、どちらも可変数ノード (1 つのオブジェクトの
最大ノード数は 32,763 個) を持つため、他のオブジェクトよりも複雑な構造を持っています。
リージョン オブジェクトを作成するには、Create Region 文を使用します。Create Region 文で
は、そのオブジェクトに含めるノード数を明示的に指定できます。しかし、オブジェクトに含め
る必要のあるノード数が事前にわからない場合もあります。たとえば、プログラムがテキスト
ファイルからオブジェクト座標を読み取り、ファイルから読み取られた各 xy 座標に対応するノー
ドを持つようなリージョン オブジェクトを作成する場合です。このような場合は、ノード数はそ
のファイルによって提供される情報量に依存するため、プログラムはそのオブジェクトがいくつ
のノードを含むことになるかを予想することはできません。
プログラムでリージョン オブジェクトまたは折れ線オブジェクトを作成する場合は、次の 2 つの
手順を踏んでオブジェクトを作成するようにします。
1. Create Region 文または Create Pline 文を発行して、空のオブジェクト (ノードを持たないオ
ブジェクト) を作成する。
2. Alter Object 文を発行して空のオブジェクトにノードを追加する。通常、Alter Object 文はルー
プ内に置かれるため、ループの反復ごとにオブジェクトに 1 個のノードが追加されます。
次の例は、このプロセスを示したものです。
Include "mapbasic.def"
Type Point
x As Float
y As Float
End Type
Dim objcoord(5) As Point
Dim numnodes, i As Integer, myobj As Object
numnodes = 3
set CoordSys Earth
MapBasic 11.0
176
ユーザーズ ガイド
第 9 章: 図形オブジェクト
オブジェクトの新規作成
objcoord(1).x = -89.213 objcoord(1).y = 32.017
objcoord(2).x = -89.204 objcoord(2).y = 32.112
objcoord(3).x = -89.187 objcoord(3).y = 32.096
Create Pline Into Variable myobj 0
For i = 1 to numnodes
Alter Object myobj Node Add (objcoord(i).x,objcoord(i).y)
Next
Insert Into cables (obj) Values (myobj)
オブジェクトのテーブルへの格納
オブジェクトを作成してオブジェクト変数に格納した後は、通常、その新しいオブジェクトを
テーブルに格納します。オブジェクトをテーブルに格納するまで、ユーザはそのオブジェクトを
確認することはできません。
オブジェクト値をテーブルに格納するには、Insert 文または Update 文を使用します。どちらの文
が適当かは、オブジェクトを既存行に追加するか、またはオブジェクトを格納する行を新たに作
成するかによって異なります。
テーブルに既に存在する行にオブジェクトを追加する場合は、Update 文を使用します。その行に
オブジェクトが既に含まれている場合は、新しいオブジェクトが古いオブジェクトに置き換わり
ます。Update 文を使用すると、テーブルのあらゆるフィールドを更新することができます。行の
図形オブジェクトを更新するには、Obj という名前の特殊フィールドを参照します。
たとえば、次の文を使用すると、Sites テーブルの 1 行目の Obj フィールドにポイント オブジェク
トが格納されます。
Update sites
Set Obj = CreatePoint(x, y)
Where RowID = 1
テーブルに新しい行を追加するには、Insert 文を使います。Insert 文を使用すると、テーブルに 1
度に 1 行だけ追加したり、別のテーブルから 1 組の行を挿入したりできます。次の文を使用する
と、Sites テーブルに新しい行を 1 行挿入し、その新規行の Obj フィールドにライン オブジェクト
を格納できます。
Insert Into sites (Obj)
Values (CreateLine(x1, y1, x2, y2))
TextBox サンプル プログラムには、Insert 文および Update 文を使用したサンプルが含まれていま
す。TextBox アプリケーションでは、選択された各テキスト オブジェクトを囲むボックス (長方形
オブジェクト) を描きます。そして Insert 文を使用して各ボックスを格納します。さらに、ユーザ
が [Change Text Color to Match Box Color] チェック ボックスをオンにすると、プログラムは選択
されたテキスト オブジェクトの色を変更した後、Update 文を使用して、変更されたテキスト オ
ブジェクトを再びテーブルに格納します。
Insert 文と Update 文は、いずれも強力かつ柔軟なテーブル操作文です。上記の例では、いずれも
1 つのフィールド (Obj という図形オブジェクト フィールド) だけを対象にしていますが、Insert
と Update はテーブル上のあらゆるフィールドの操作に使用することができます。
MapBasic 11.0
177
ユーザーズ ガイド
第 9 章: 図形オブジェクト
既存オブジェクトに基づくオブジェクトの作成
既存オブジェクトに基づくオブジェクトの作成
MapBasic プログラムでは、既存オブジェクトをベースにオブジェクトを新規作成することができ
ます。このセクションでは、さまざまな MapBasic 文および関数の基本について説明します。特定
の文または関数の詳細については、『MapBasic リファレンス ガイド』またはオンライン ヘルプ
を参照してください。
バッファの作成
バッファ リージョンとは、別の 1 つまたは複数のオブジェクトから一定の距離内にある地域を表
すリージョンのことです。バッファは、他のオブジェクトから一定の距離内にあるオブジェクト
を検索する場合に有効です。たとえば、光ファイバ ケーブルの周囲にバッファを作成すること
で、ケーブルから 300 メートル以内にある採掘現場をすべて検索することができます。バッファ
リージョンの作成には、Create Object 文を使用します。
次の例は、ケーブルの選択セグメントの周りに 300 メートル四方のバッファ リージョンを作成
し、そのバッファ内にある採掘現場を検索します。
Dim danger_zone As Object
Create Object As Buffer
From selection
Into Variable danger_zone
Width 300 Units "m"
Select * From dig_sites Where dig_site.obj Within danger_zone
また、MapBasic にはバッファ リージョンを表すオブジェクト値を返す Buffer( ) 関数も用意され
ています。
統合、交差、併合の利用
Create Object 文では、リージョンの統合および交差も計算できます。Create Object As Merge
と指定すると、MapInfo Professional によって 2 つ以上の隣接リージョンに共通するセグメントが
消去され、1 つの併合リージョンが作成されます。共通する境界線を持つ 2 つのリージョン (例 :
ネバダ州とカリフォルニア州) を併合すると、両リージョンの合計エリアをカバーするリージョン
が作成されます。隣接するリージョンの間の境界線は消去されます。
次の例では、states テーブルからの 2 つのリージョンの併合操作を示します。
Select *
From states
Where state ="CA" Or state = "NV"
Create Object As Merge
From selection
Into Table territory
Merge (併合) 操作は、排他的論理和 (XOR) プロセスです。2 つのリージョン オブジェクトを併合す
る場合に、一方のオブジェクトがもう一方のオブジェクトの中に完全に含まれていると、併合操作
によって小さいオブジェクトのエリアが大きいオブジェクトから消去され、後には穴が開きます。
MapBasic 11.0
178
ユーザーズ ガイド
第 9 章: 図形オブジェクト
既存オブジェクトに基づくオブジェクトの作成
Merge を使用すると新しいオブジェクトが作成されます。しかし、ソース テーブル上には併合さ
れた 2 つのリージョンが依然として存在します。次のようにすると、これらの元のリージョンを
削除することができます。
Select * From Territory Where TerrName = "Western Territory" or TerrName = "NV"
Delete From selection
Create Object As Union および Create Object as Intersection と指定すると、2 つ以上のリー
ジョンの論理的併合を表すリージョンを作成できます。これらの文は、ソース リージョンの共通
セグメントだけではなくすべてのセグメントに適用されるという点で、Merge とは異なります。
Union (統合) はすべてのポリゴンの合計エリア、 Intersection (交差) は重複エリアを表します。統
合または交差によって作成されたオブジェクトには、元のリージョンにはない新しいノードが含
まれる場合があります。MapBasic には、2 つの異なるオブジェクトの併合を通じて作成されたオ
ブジェクトを返す Combine( ) 関数も用意されています。
Isogram の作成
Isogram は、距離または時間の条件を満たすポイントのセットを表示するマップです。Isogram
は、IsoChrone または IsoDistance です。IsoChrone は、指定の道路網に沿って、一定の期間、開
始点からトラバースできる領域を表すポリゴンまたはポイントのセットです。IsoDistance は、指
定の道路網に沿って、一定の距離を、開始点からトラバースできる領域を表すポリゴンまたはポ
イントのセットです。
これらのリージョンは、Create Object As Isogram 文を使用して作成できます。複数のリージョ
ンを作成することもでき、その場合は、それぞれ異なるブラシとペン スタイルを使用すれば、
マップ上で各リージョンを区別しやすくなります。Isogram を作成するには、Envinsa などの外部
のサービスを使用する必要があります。
Isogram を作成するには
1. Open Connection 文を使用して、Envinsa との接続を開きます。
この文では、接続に対するハンドルが、渡された変数に戻されます。
2. Set Connection Isogram 文を使用して、Isogram 接続を構成します。
3. Create Object As Isogram 文を使用して、目的のリージョンを作成します。
オフセット コピーの作成
元のオブジェクトから指定単位のオフセットを持つオブジェクトを新規作成するための、オフ
セット関数およびオフセット文が用意されています。
次の文を使用すると、既存のオブジェクトのオフセット コピーを作成できます。
•
•
Offset( ) 関数 : 指定された距離と角度に従って元のオブジェクトをオフセットしたコピーを返
します。
OffsetXY( ) 関数 : X 軸および Y 軸沿いに指定された距離に従って元のオブジェクトをオフセッ
トしたコピーを返します。
MapBasic 11.0
179
ユーザーズ ガイド
第 9 章: 図形オブジェクト
オブジェクトの変更
•
SphericalOffset( ) 関数 : 指定された距離と角度に従って元のオブジェクトをオフセットしたコ
ピーを返します。Distance Type は Spherical にする必要があります。
•
SphericalOffsetXY( ) 関数 : 指定された距離と角度に従って元のオブジェクトをオフセットし
たコピーを返します。Distance Type は Spherical にする必要があります。
•
CartesianOffset( ) 関数 : 指定された距離と角度に従って元のオブジェクトをオフセットした
コピーを返します。Distance Type は Cartesian にする必要があります。
•
CartesianOffsetXY( ) 関数 : 指定された距離と角度に従って元のオブジェクトをオフセットし
たコピーを返します。Distance Type は Cartesian にする必要があります。
オブジェクトの変更
オブジェクト変更の一般手順
MapBasic には、既存のマップ オブジェクトを変更する際に使用できる多数の文が用意されていま
す。オブジェクトを変更する場合は、使用する文に関係なく次のようなプロセスとなります。
1. 元のオブジェクトのコピーを作成する。(これには、まずオブジェクト変数を宣言し、Fetch 文
を発行して行カーソルの位置を決定した後、variable_name = tablename.obj 形式の代
入文を発行する作業が伴うことがあります。)
2. 文または関数を発行してオブジェクトを変更する。(これには、1 つ以上の Alter Object 文を発
行する作業が伴うことがあります。)
3. Update 文を発行して変更後のオブジェクトを元のテーブルに格納する。
TextBox プログラムには、このプロセスが示されています。ユーザが [Change Text Color to Match
Box Color] チェック ボックスをチェックすると、TextBox プログラムは Alter Object 文を使用し
て選択されたオブジェクトの色を変更した後、Update 文を使用して変更されたテキスト オブジェ
クトを元のテーブルに格納します。
オブジェクトの位置の変更
Objects Move 文を使用すると、指定した距離に従って正の X 軸沿いにオブジェクトを移動できま
す。Distance Units ( 距 離 の 単 位) と Distance Type (距離のタイプ) も指定できます。Objects
Offset 文を使用すると、指定した距離に従って正の X 軸沿いにオブジェクトをオフセットした新
しいコピーを作成できます。この文の場合も Distance Units (距離の単位) と Distance Type (距離の
タイプ) を指定でき、さらにコピーしたオブジェクトをソース オブジェクトと同じテーブルに格納
するか、別のテーブルに格納するかを指定できます。
オブジェクトとオブジェクト ノードの移動
オブジェクトの座標を変更するには、Geography 節を含む Alter Object 文を発行します。1 つ以
上の Alter Object 文 (オブジェクトの x 座標のリセットと y 座標のリセットにそれぞれ 1 つずつ)
を発行しなければならない場合もあります。
MapBasic 11.0
180
ユーザーズ ガイド
第 9 章: 図形オブジェクト
オブジェクトの変更
オブジェクトのペン、ブラシ、フォント、またはシンボル スタイルの変更
Alter Object を使用すると、オブジェクトのスタイルが変更できます。次の例では、Alter Object
コマンドを使用して、テーブル上で選択されたオブジェクトを変更します。
Include "mapbasic.def"
Dim myobj As Object, mysymbol As Symbol
mysymbol = CurrentSymbol()
Fetch First From selection
myobj = selection.obj
If ObjectInfo(myobj, OBJ_INFO_TYPE) = OBJ_POINT Then
Alter Object myobj
Info OBJ_INFO_SYMBOL, mysymbol
Update selection Set obj = myobj Where RowID = 1
Else
Note "The selected object is not a point."
End If
•
レイアウト ウィンドウ上のテキスト オブジェクトの高さを変更するには、そのオブジェクトの
フォント スタイルを変更します (Info 節を含む Alter Object 文を発行)。
•
マップ ウィンドウ上のテキスト オブジェクトの高さを変更するには、そのオブジェクトの x 座
標および y 座標を変更します (これには、Geography 節を含む Alter Object 文を発行します)。
•
マップ ラベルの高さを変更するには、Set Map 文を発行します。
リージョンまたは折れ線オブジェクトへの変換
あるオブジェクトをリージョン オブジェクトに変換するには、ConvertToRegion( ) 関数を呼び出
します。折れ線オブジェクトに変換するには、ConvertToPline( ) 関数を呼び出します。これらの
関数の詳細については、『MapBasic リファレンス ガイド』またはオンライン ヘルプを参照して
ください。
オブジェクトの一部の消去
次の文および関数を使用すると、オブジェクトの一部を消去できます。
•
•
•
•
Overlap( ) 関数は、2 つのオブジェクト パラメータから 1 つのオブジェクト値を返します。で
きあがったオブジェクトは、2 つのオブジェクトが重なるエリア (2 つのオブジェクトの交差エ
リア) を示します。
Erase( ) 関数は、2 つのオブジェクト パラメータから 1 つのオブジェクト値を返します。最初
のオブジェクトから 2 番目のオブジェクトのエリアが消去され、その結果が返されます。
Objects Intersect 文は、現在のターゲット オブジェクトの現在選択されているオブジェクト
と "重ならない" 部分を消去します。
Objects Erase 文は、現在選択されているオブジェクトを消しゴムに使い、現在のターゲット
オブジェクトの一部を消去します。
Objects Erase 文は MapInfo Professional の [オブジェクト] > [オーバーラップ内消去] コマンドに
相当し、Objects Intersect 文は MapInfo Professional の [オブジェクト] > [オーバーラップ外消去]
コマンドに相当します。どちらの操作も、"編集ターゲット" と指定されたオブジェクトに対して適
用されます。編集ターゲットは、ユーザが [オブジェクト] > [編集ターゲットの設定] を選択する
か、MapBasic の Set Target 文を発行することによって設定できます。編集ターゲットの指定に関
する基本概念については、『MapInfo Professional ユーザーズ ガイド』を参照してください。
MapBasic 11.0
181
ユーザーズ ガイド
第 9 章: 図形オブジェクト
マップ ラベルを使った作業
交差点
既に説明したように、Alter Object 文を発行すると、リージョン オブジェクトまたは折れ線オブ
ジェクトにノードを追加することができます。ただし、Alter Object 文を使用する場合は、追加す
るノードを明示指定しなければなりません。2 つのオブジェクトが交差する場所にノードを追加す
る場合は、Objects Overlay 文または OverlayNodes( ) 関数を使用します。
2 つのオブジェクトの交差点の座標を決定するには、IntersectNodes( ) 関数を呼び出します。
IntersectNodes( ) は、各交差点にあるノードを含む折れ線オブジェクトを返します。その折れ線
に含めるノードの数を決定するには、ObjectInfo( ) を呼び出します。交差点の座標を決定するに
は、ObjectNodeX( ) および ObjectNodeY( ) を呼び出します。
マップ ラベルを使った作業
マップ ラベルは、マップ オブジェクトの表示属性の 1 つとして扱われます。しかし、MapInfo
Professional では、ラベルをシステム レイヤ内のテキスト オブジェクトとして扱っていた旧バー
ジョンとの互換性を維持するために、引き続き AutoLabel 文がサポートされています。
ラベルの表示
MapInfo Professional ユーザは、[レイヤ管理] ウィンドウを通じてラベル操作オプションを構成す
ることができます。これと同じ効果を得るには、MapBasic プログラムでは Set Map...Label 文を
発行します。たとえば、次の文を使用すると Layer 1 のラベルが表示されます。
Set Map Layer 1 Label Auto On Visibility On
ラベルの消去
[レイヤ管理] ウィンドウで [自動ラベル オフ/オン] ボタン (レイヤのリストの中にある) をオフにす
ると、そのレイヤのデフォルト ラベルが非表示になります。次の MapBasic 文は、これと同じ効
果を持ちます。
Set Map Layer 1 Label Auto Off
L
Set Map…Auto Off 文を使用すると、デフォルト (自動追加) ラベルは非表示なりますが、
カスタム ラベル (ユーザが追加または変更したラベル) は非表示になりません。次の文は、
あるレイヤのデフォルト ラベルおよびカスタム ラベルの両方を一時的に非表示にします。
Set Map Layer 1 Label Visibility Off
MapInfo Professional ユーザは、[マップ] > [カスタム ラベルの削除] を選ぶことで、そのレイヤの
ラベルをデフォルト状態にリセットすることができます。次の MapBasic 文は、これと同じ効果を
持ちます。
Set Map Layer 1 Label Default
MapBasic 11.0
182
ユーザーズ ガイド
第 9 章: 図形オブジェクト
マップ ラベルを使った作業
個々のラベルの編集
MapInfo Professional ユーザは、ラベルを対話方式で編集をすることができます。たとえば、ラベ
ルを非表示にするには、ラベルをクリックして選択してから [削除] を押します。ラベルを移動す
るには、ラベルをクリックしてドラッグします。
MapBasic で個々のラベルを変更するには、1 つ以上の Object 節を持つ Set Map…Label 文を利用
します。たとえば、次の文はマップ ウィンドウ上の 2 つのラベルを非表示にします。
Set Map Layer 1 Label
Object 1 Visibility Off
Object 3 Visibility Off
カスタム設定する個々のラベルに対してそれぞれ 1 つの Object 節を追加します。この例では、
Object 1 はテーブルの 1 行目のラベル、Object 3 は 3 行目のラベルを示します。カスタム ラベル
を保存するには、ワークスペース ファイルを保存します。MapBasic の Save Workspace 文の項
を参照してください。
警告 :
テーブルを圧縮すると、既にワークスペースに格納されているカスタム (編集済み) ラ
ベルが無効になる可能性があります。ワークスペースを保存することで編集ラベルを
格納すると、そのラベルは Set Map...Object... 文で表されます。各 Object 節は、
テーブルの行番号に対応します。操作テーブル上に削除済みとマークされた行 (ブラ
ウザ ウィンドウ上でグレイ表示されている行) があると、そのテーブルを圧縮するこ
とで削除行が消去され、残りの行の行番号が変化します。
つまり、テーブルを圧縮してから前に保存されたワークスペースを読み込むと、そのワークス
ペースに含まれる編集済みラベルが正しく機能しない可能性があります。したがって、テーブル
を圧縮する場合は、カスタム ラベルを作成する前に行う必要があります。
削除行がテーブルの最後 (ブラウザ ウィンドウの一番下) にだけ存在する場合は、テーブルを圧縮
してもワークスペース内のラベルは無効になりません。
ラベルの検索
マップ ウィンドウでラベルを検索するには 2 つの手順に従います。
1. LabelFindFirst( )、LabelFindByID( )、または LabelFindNext( ) を呼び出し、MapBasic のラベ
ル内部ポインタを初期化します。
2. Labelinfo( ) を呼び出し、現在のラベルを検索します。例については MapBasic ヘルプの Labelinfo( )
とサンプル プログラム LABELER.MB を参照してください。
その他の Set Map 文の例
「レイヤ管理」ウィンドウに対応するMapBasicの構文を確認するには、次の操作を行います。
1. MapBasic ウィンドウを開く。
2. マップ ウィンドウをアクティブ ウィンドウにする。
3. [マップ] > [レイヤ管理] を選択して [レイヤ管理] ウィンドウを表示する。
4. 必要なオプションを選択します。
MapBasic 11.0
183
ユーザーズ ガイド
第 9 章: 図形オブジェクト
マップ ラベルを使った作業
MapInfo Professional は、変更内容を適用して MapBasic ウィンドウ上に Set Map 文を表示しま
す。MapBasic ウィンドウからテキストをコピーして、プログラムに貼り付けることもできます。
個々のラベルの編集操作に対応する MapBasic の構文を確認するには、次の操作を行います。
1. マップ ウィンドウ上でラベルを変更する。(たとえば、ラベルの移動、削除、フォント変更を行
います。)
2. ワークスペース ファイルを保存する。
3. MapBasic エディタなどのテキスト エディタを使用してワークスペース ファイルを表示する。
個々のラベルの編集内容は、ワークスペースの中に Set Map... Layer... Label... Object 文の形
で表示されます。
ラベルとテキスト オブジェクトの違い
次の表に、テキスト オブジェクトとラベルの違いをまとめます。
テキスト オブジェクト
ラベル
テ キ ス ト 作 成 に 使 用 さ れ る AutoLabel、Create Text、
CreateText( )
MapBasic 文
Set Map
テ キ ス ト 変 更 に 使 用 さ れ る Alter Object
MapBasic 文
Set Map
テキスト検索 (例 : 色の決定) に ObjectInfo( )、
ObjectGeography( )
使用される MapBasic 関数
LabelFindByID( )、
LabelFindFirst( )、
LabelFindNext( )、
Labelinfo( )
テ キ ス ト 選 択 に 使 用 さ れ る Select
MapBasic 文
MapBasic プログラムでは、
ラベルの選択はできない。
マップでのテキスト保存
テキスト オブジェクトはマッ ラベルはワークスペースにし
プ作成可能テーブルに格納で か格納できない。
きる。
レイアウトでのテキスト保存
レイアウトで作成されたテキ 不可。ラベルはレイアウトに
スト オブジェクトは、ワーク は表示できない ( ただし、
スペースに保存できる。
マップがレイアウト上にある
場合を除く)。
MapBasic 11.0
184
ユーザーズ ガイド
第 9 章: 図形オブジェクト
マップ ラベルを使った作業
テキスト オブジェクト
ラベル
テキストの高さの制御
テキストの高さは現在のマッ
プのズームによる。テキスト
の高さは、拡大操作や縮小操
作によって変化する。
ラベルのテキストの高さは、
フォントによって制御され
る。拡 大 操 作 や 縮 小 操 作 を
行っても、ラベルのテキスト
の高さは変化しない。
テキストとラベルの変換
不可。テキスト オブジェクト
を与えられた場合にラベルを
返す MapBasic 関数は用意さ
れていない。
Labelinfo( ) 関数によりラベ
ルは近似のテキスト オブジェ
クトに変換可能。例について
は、LABELER.MBX を参照。
ラベルを作成するとき、長方形エリアを定義する必要はありません。その代わり、ラベルのアン
カー ポイント (xy 座標による) を指定します。たとえば、World テーブルのマップが表示されてい
る場合、次の文はそのタイトルとなるラベルを作成します。
Set Map Layer 1 Label Object 1
Visibility On
’show this record’s label
Anchor (0, 85)
’anchor the label at this (x,y)
Text "Map of World"’set label’s text
Position Center
’set position relative to anchor
Font("Arial",289,20,0)’set font style (20-point, etc.)
この結果、マップのタイトルとなるラベルが作成されます。
マップ上にテキストを追加する必要がある場合は、テキスト オブジェクトを作成するよりもラベ
ルを作成した方が簡単です。ラベル操作だけに使用するテーブルを作成するには、次の操作を行
います。
MapBasic 11.0
185
ユーザーズ ガイド
第 9 章: 図形オブジェクト
座標および測定単位
1. Create Table 文を使用して、文字フィールドを含むテーブルを作成する。その文字フィールド
が、マップ上に表示するテキストを格納できるだけの十分な幅を持つようにし、 そのテーブル
をマップ作成可能にします (Create Map 文を使用)。
2. テーブルをマップ ウィンドウに追加する (Add Map 文を使用)。Set Map 文を使用して、テー
ブルのラベル操作オプション (例 : Auto On) を設定します。
3. マップにテキストを追加する際に、目に見えないシンボル スタイル (shape 31) またはペン ス
タイル (pattern 1) を使用して、テーブルにポイント オブジェクトまたはライン オブジェクト
を挿入する。オブジェクト自体は見えませんが、そのラベルは表示されます。(テキストを回転
する場合には、ライン オブジェクトを使用します。)
L
L
サンプル プログラム COGOLine.mb には、特定の角度を持ったライン オブジェクトの
作成方法が示されています。
この方法を用いると、Set Map…Object 文を使用して各ラベルの位置を設定する必要はあ
りません。ラベルをデフォルトの位置に表示できます。その後でラベルを移動させるに
は、そのラベルに対応するオブジェクトを動かします。
座標および測定単位
MapBasic アプリケーションは、一度に 1 種類の座標系にしか対応できません。MapBasic では、
地球座標系座標、一般座標系座標、およびレイアウト座標が使用できます。以下のプログラミン
グのガイドラインは、MapBasic が一度に 1 種類の座標系にしか対応できないという原則に基づい
ています。
•
地球座標系マップからオブジェクトを作成、変更、検索するときは、まず MapBasic で地球座標
系が使用されていることを確認する。デフォルトでは地球座標系が使用されます。多くの
MapBasic アプリケーションでは、座標系を考慮する必要はありません。
•
一般座標系マップからオブジェクトを作成、変更、検索するときは、まず MapBasic で一般座標
系が使用されていることを確認する。一般座標系に設定するには、Set CoordSys Nonearth 文を
発行します。
レイアウト ウィンドウからオブジェクトを作成、変更、検索するときは、まず MapBasic でレ
イアウト座標系が使用されていることを確認する。レイアウト座標系に設定するには、Set
coordSys Layout 文を発行します。
•
各 MapBasic アプリケーションには、現在アプリケーションで使用されている座標系を表す
CoordSys 設定があります。デフォルトの座標系は、地球 (経緯度) 座標系です。デフォルトでは、
どの MapBasic アプリケーションでも地球座標系マップのオブジェクトを操作することができま
す。MapInfo テーブルの大半はこれに分類されます。MapBasic アプリケーションでレイアウト
ウ ィ ン ド ウ 上 の オ ブ ジ ェ ク ト を 操作する必要がある場合は、まず次のような Set CoordSys
Layout 文を発行しなければなりません。
Set CoordSys Layout Units "in"
MapBasic 11.0
186
ユーザーズ ガイド
第 9 章: 図形オブジェクト
座標および測定単位
Set CoordSys Layout 文では、"in" (インチ) などの用紙単位名を指定します。これによって、
MapBasic はレイアウト ウィンドウの座標情報を解釈することができるようになります。センチや
ミリを使用する場合は、単位名をそれぞれ cm、mm と指定します。次のプログラムは、レイアウ
ト ウィンドウを開いた後、テキスト オブジェクトを作成してレイアウト上にタイトルを追加しま
す。このオブジェクトはレイアウト ウィンドウ上で作成されるため、Create Text 文の前に Set
CoordSys Layout 文が置かれています。
Include "mapbasic.def"
Dim win_num As Integer
Layout
win_num = FrontWindow()
Set CoordSys Layout Units "in"
Create Text
Into Window win_num
"Title Goes Here"
(3.0, 0.5) (5.4, 1.0)
Font MakeFont("Helvetica", 1, 24, BLUE, WHITE)
上の例では、レイアウト座標系は測定単位としてインチを使用しています。Create Text 文で指定
される座標は、すべてインチで表されます。Set CoordSys 文を使用して座標系を変更すると、新
しい座標系は明示的に元の設定に戻すまで有効となります。各 MapBasic アプリケーションには、
それぞれ独自の座標系設定があります。このため、どのアプリケーションも、実行中の他のアプ
リケーションに影響を与えることなく Set CoordSys 文を発行することができます。
MapBasic の座標系は、MapInfo Professional のマップ ウィンドウで使用される座標系とは独立し
ています。デフォルト座標系は、経緯度 (NAD 1927) (度/分/秒ではなく十進度数で表される) と
なっています。
MapBasic の文または関数で指定される座標は、Set CoordSys 文を使用して MapBasic の座標系
を変更しない限り、経緯度で表されます。たとえば、Centroidx() 関数は、そのオブジェクトが別
の座標系を割り当てられたテーブルまたはウィンドウに格納されていても、デフォルトではオブ
ジェクトの図心の経度を十進度数で戻します。たとえば、次の文で選択されるオブジェクトは、
WY -107.554 43、つまりワイオミング州の図心の経緯度値を持っています。
Select state, CentroidX(obj), CentroidY(obj)
From states
Where state = "WY"
次の文が実行されると、選択されるオブジェクトは WY -934612.97 2279518.38 という値を持ちま
す。これらの座標は、Albers 投影法に基づいています。
Set CoordSys Earth Projection 9, 62, "m", -96, 23, 29.5, 45.5, 0, 0
Select state, CentroidX(obj), CentroidY(obj)
From states
Where state = "WY"
MapBasic の座標系をデフォルトにリセットするには、次の文を発行します。
Set CoordSys Earth
MapBasic 11.0
187
ユーザーズ ガイド
第 9 章: 図形オブジェクト
高度な地理検索
測定単位
MapBasic プログラムでは、次の測定単位を使用できます。
•
•
•
面積単位 : 地理的面積を表す平方マイルやエーカーなどの単位。MapBasic がサポートする面
積単位のリストについては、『MapBasic リファレンス ガイド』の Set Area Units の項を参照
してください。さまざまな面積単位がサポートされているため、Area( ) などの関数は、アプ
リケーションにふさわしい単位に基づいた値を返すことができます。
距離単位 : 地理的距離を表すキロメートルやマイルなどの単位。MapBasic がサポートする距
離単位のリストについては、『MapBasic リファレンス ガイド』の Set Distance Units の項を
参照してください。
用紙単位 : 非地理的距離を表すインチやセンチメートルなどの単位。たとえば、Set Window
文を発行してマップ ウィンドウの幅または高さをリセットするときは、新しいウィンドウ サ
イズをインチなどの (画面上の) 用紙単位で指定します。
MapInfo Professional セッション中の任意の時点においては、必ずある距離単位、ある面積単位、
ある用紙単位が使用されています。デフォルト単位は、それぞれマイル、平方マイル、インチと
なっています。デフォルト単位の効果は、例を用いるとより簡単に理解できます。次の文は、円
オブジェクトを作成します。
obj_var = CreateCircle(x, y, 5)
MapBasic のデフォルト距離単位はマイルなので、この円オブジェクトは 5 マイルの半径を持つこと
になります。ただし、Set Distance Units 文を発行して距離単位をリセットすると、半径パラメー
タ (5) の示すものも変化します。例として、半径 5 キロメートルの円オブジェクトを作成します。
Set Distance Units "km"
obj_var = CreateCircle(x, y, 5)
現在の面積単位または用紙単位をリセットするには、それぞれ Set Area Units 文または Set
Paper Units 文を使います。
高度な地理検索
MapBasic プログラムでは、表データと図形データを用いた複雑なデータ検索を行うことができま
す。たとえば、Add Column 文を使用すると、あるリージョン オブジェクトが別のマップ レイヤ
のオブジェクトとどのように重なるか、または交差するかに基づいて、そのリージョン内のデー
タ値の合計および平均データ値を計算することができます。
MapBasic および MapInfo Professional によるデータ型地理分析の実行方法を理解するには、まず
MapBasic プログラムによるテーブルの管理方法および検索方法を理解する必要があります。まだ
第 8 章をお読みでない方は、この章を読む前に「テーブル操作」に目を通してください。
MapBasic 11.0
188
ユーザーズ ガイド
第 9 章: 図形オブジェクト
高度な地理検索
地理比較演算子の使用
MapBasic では、等号 (=) を使ったオブジェクトの論理比較 (If object_a = object_b) はでき
ません。ただし、MapBasic にはオブジェクトを比較してその位置関係を把握するために使用でき
るいくつかの地理演算子が用意されています。MapBasic の Contains、Within、Intersects の各
比較演算子、およびオプションの修飾子である Part と Entire を使用すると、数値に関係演算子を
用いる場合とほぼ同様にオブジェクトを比較することができます。
次の例では、If…Then 文を使用した地理比較を行います。
If Parcel_Object Within Residential_Zone_Obj Then
Note "Your Property is zoned residential."
End If
次の例では、Select 文による地理比較を行います。
Select * From wetlands
Where obj Contains Part myproject
Within および Contains の条件で使うオブジェクトのうち最低 1 つは、リージョン、楕円、長方
形、面取り長方形などの囲まれたエリアを表していなければなりません。
Within と Contains のどちらを使うかは、式の中のオブジェクトの順序に左右されます。次のよ
うな規則が適用されます。
•
•
最初のオブジェクトが 2 番目のオブジェクトの中にあるかをテストするには、Within を使用
する。
最初のオブジェクトが 2 番目のオブジェクトを含むかをテストするには、Contains を使用する。
ポイントとリージョンを比較すると、次のことが言えます。
ポイントはリージョンの内部にある
(Within)。
リージョンはポイントを含む
(Contain)。
次の文を使用すると、配送センター オブジェクトを含む州を選択できます。
Select * From states
Where obj Contains distribution_ctr
次の文は、郡内にある埋立地をすべて選択します。
Select * From landfill
Where obj Within county_obj
Within 演算子および Contains 演算子では、あるオブジェクトの "図心" が別のオブジェクトの中
にあるかどうかをテストできます。あるオブジェクトの全体が別のオブジェクトの中にあるかど
うかをテストするには、Entire(ly) を使用します。あるオブジェクトの一部が別のオブジェクトの
中にあるかどうかをテストするには、Part(ly) を使用します。
MapBasic 11.0
189
ユーザーズ ガイド
第 9 章: 図形オブジェクト
高度な地理検索
次の文を使用すると、その一部が郡内を通る高速道路をすべて選択できます。
Select * From highway
Where obj Partly Within countyobj
Partly Within 演算子は、最初のオブジェクトの一部がもう一方のオブジェクトの中にあるかまたは
そのオブジェクトのどこかに接触しているかをテストします。Entirely Within 演算子では、あるオ
ブジェクトの全体がもう一方のオブジェクトの中に含まれるかどうかをテストできます。オブジェ
クトのすべてのセグメントをチェックするには、図心だけをチェックする場合に比べてより多くの
計算が必要になるため、Partly または Entirely を含む条件は評価の時間が長くなります。
Intersects 演算子は、あらゆるタイプのオブジェクトに使用することができます。あるオブジェク
トの一部が別のオブジェクトと交わるか、接触するか、その中にある時は、2 つのオブジェクトは
交差しています。いずれかの隅で接触する 2 つのリージョンは交差しています。折れ線のノード
上にあるポイントは、その折れ線と交差しています。交わるラインも互いに交差しています。
リージョンの中にあるポイントも、そのリージョンと交差しています。
次の表は、MapBasic の地理演算子をまとめたものです。
演算子
True と評価する場合
用法
Contains
objectA Contains objectB
最初のオブジェクトが 2 番目のオブ
ジェクトの中心点を含む
Contains Part
objectA Contains Part
objectB
第 1 オブジェクトが第 2 オブジェクト
の一部を含む
Contains Entire
objectA Contains Entire
objectB
第 1 オブジェクトが第 2 オブジェクト
の全体を含む
Within
objectA Within objectB
第 1 オブジェクトの図心が第 2 オブ
ジェクトの中にある
Partly Within
objectA Partly Within
objectB
第 1 オブジェクトの一部が第 2 オブ
ジェクトの中にある
Entirely Within
objectA Entirely Within
objectB
第 1 オブジェクトの全体が第 2 オブ
ジェクトの中にある
Intersects
objectA Intersects objectB
2 つのオブジェクトがある点で交差する
テーブル中のオブジェクトの検索
MapBasic の関数または地理比較演算子を使用すると、テーブルの Object フィールドを用いた検
索文を作成することができます。これらの検索文の作成手順は通常のフィールドの検索文の作成
手順とほぼ同じですが、オブジェクト リテラルが使われない点が異なります。オブジェクトを
使った検索文は、一般に関数または比較オペレータ (Entirely Within など) を使ってオブジェクト
を分析します。
MapBasic 11.0
190
ユーザーズ ガイド
第 9 章: 図形オブジェクト
高度な地理検索
次の文は、ObjectLen( ) 関数を使ってケーブルの長さ 300 メートル以上のセクションをすべて選
択します。
Select *
From cable
Where ObjectLen(obj, "m") > 300
次の例は、インディアナ州の湿地帯の全面積を計算します。
Select Sum(Area(obj,"sq mi"))
From wetlands
Where obj Within (Select obj From states Where state = "IN")
次の文は、経度 lon/緯度 lat で示される地点にある井戸から 1 キロメートル以内にある貯蔵タンク
をすべて選択します。
Set Distance Units "km"
Select * From tanks Where obj Within
CreateCircle(lon,lat, 1)
次の文は、従業員と各人の家からオフィスまでの距離 (遠いものから近いものへ) を含むセレク
ションを作成します。
Select
Name, Distance(Centroidx(obj), Centroidy(obj),
office_lon, office_lat, "km")
From employee
Order By 2 Desc
サブ選択を使用した地理 SQL 検索の利用
MapBasic では、あるテーブルのオブジェクトを別のテーブルのオブジェクトとの関係に基づいて
検索することができます。たとえば、医者のリストを検索して、インディアナ州マリオン郡にい
る医者を調べる場合を考えます。一方のテーブルには医者の名前、もう一方のテーブルには郡の
名前が含まれます。
一つのアプローチとして、郡テーブルから 1 つの郡を選択し、そのオブジェクトを変数の中にコ
ピーして、医者のテーブルをそのオブジェクト変数に基づいて検索するという方法があります。
次の例は、この方法を示したものです。
Dim mycounty As Object
Select *
From counties
Where name="Marion" and state="IN"
Fetch First From selection
mycounty = selection.obj
Select *
From doctors
Where obj Within mycounty
ここで、変数 mycounty の代わりに Where 節でサブ選択を使うと、より少ない文で同じ結果を得
ることができます。
MapBasic 11.0
191
ユーザーズ ガイド
第 9 章: 図形オブジェクト
高度な地理検索
Select *
From doctors
Where obj Within
(Select obj From counties Where name="Marion" And state="IN")
このサブ選択 (括弧にくくられている後者の選択) は、フィールドと行をそれぞれ 1 つずつしか持
たないテーブルを戻します。オブジェクトはインディアナ州マリオン郡を表します。MapInfo
Professional は、医者のテーブルの各行を調べてその行がマリオン郡の中にあるかどうかを特定し
ます。サブ選択は、適切なオブジェクトを式に返すため、前の例における変数 (mycounty) と同じ
ように機能します。
サブ選択によって Object フィールドだけが返されるようにするため、このサブ選択の Select 節に
は obj というフィールドだけしかリストされていません。サブ選択に複数のフィールドが含まれて
いるか、フィールドが object フィールドでない場合は、この文では正しく評価を行えません。
サブ選択が複数行を返す場合は、Any( ) を使用します。次の例に、Any( ) を使用して一組の行を
処理するサブ選択を示します。この文で、1 人当たりの所得が $15,000 以下である郡における、す
べての医者を検索します。サブ選択の中の各郡について、医者の場所を比較してください。
Select *
From doctors
Where obj Within
Any (Select obj From counties Where inc_pcap < 15000)
Select 文の中の順序を変更して、医者の代わりに郡を選択します。次の文で、神経科医のいる郡
をすべて検索します。
Select *
From counties
Where obj Contains
(Select obj From doctors Where specialty = "Neurology")
次の例では、ネブラスカ州に隣接する州をすべて検索します。
Select *
From states
Where obj Intersects (Select obj From states Where state = "NE")
地理結合の利用
結合を行うと、2 つのテーブルの指定フィールドのエントリを行ごとに比較することによって、こ
れらのテーブルがリンクされます。この結果、両方のテーブルのフィールドが組み合わされた 1
つのテーブルができあがります。また、一致した行が含まれます。MapBasic では、結合における
関係の概念を拡大し、地理結合を可能にします。たとえば、人口統計データと州マップを結合す
ることで、州マップのすべての情報と各州の人口統計データを持つテーブルを作成することがで
きます。
MapInfo Professional は、結合の地理的条件をサポートします。たとえば、2 つのテーブルを数値
ID に基づいて比較するのではなく、一方のテーブルのオブジェクトがもう一方のテーブルのオブ
ジェクトを含むかどうかに基づいてテーブルを結合することができます。これは、一致する
フィールドがない場合に特に有効です。住宅プロジェクトのテーブルに議員選挙区の情報が含ま
れていなくても、テーブル内のすべての住宅プロジェクトをそれに対応する議員選挙区と結合す
MapBasic 11.0
192
ユーザーズ ガイド
第 9 章: 図形オブジェクト
高度な地理検索
ることが可能です。このような結合の目的は、プロジェクトの対応選挙区を特定することです。
つまり、どのプロジェクトがどの議員選挙区に含まれているのかを把握することです。この操作
における SQL Select 文は、次のようになります。
Select *
From projects, congdist
Where projects.obj Within congdist.obj
2 つのテーブルを地理的に結合した後は、次のように、Update 文を使って議員選挙区名 (name
フィールドから) をプロジェクト テーブル (cd フィールド) に入力します。
Update Selection Set cd = name
この結果、プロジェクト テーブルには各プロジェクトに対応する議員選挙区の名前が含まれるこ
とになります。次の例では、各議員選挙区における対プロジェクト支出の合計額を計算します。
Select congdist.name, sum(project.amt)
From congdist, project
Where congdist.obj Contains project.obj
Group By 1
Where 節のテーブルの順序が変更されたため、条件には Within の代わりに Contains が使われて
います。
比率データ併合
Add Column 文を使用して、あるテーブルのオブジェクトと別のテーブルのオブジェクトの重な
り方に基づく比率データ併合を行う、高度なポリゴン オーバーレイ操作を実行することができま
す。たとえば、町の領域を示すテーブルと洪水危険地域を示すテーブルがあるとします。その全
体または一部が洪水危険エリアに入る町もあれば、危険エリアの外にある町もあります。Add
Column 文を使用して、町の領域テーブルから人口統計情報を抽出し、その情報に基づいて洪水危
険エリア内の統計データを計算します。Add Column 文の詳細については、『MapBasic リファレ
ンス ガイド』を参照してください。
MapBasic 11.0
193
ユーザーズ ガイド
Microsoft Windows の
高度な機能
この章は、MapBasic アプリケーションで Windows 特有の技術をどのように
活用できるかについて説明します。
このセクションの構成
Š
Š
Š
Š
ダイナミック リンク ライブラリ (DLL) の宣言と呼び出し. . . . . . .195
カスタム ボタン アイコンおよび描画カーソルの作成. . . . . . . . . . .200
DDE を利用したプロセス間の情報交換. . . . . . . . . . . . . . . . . . . . . .202
アプリケーションへの Windows ヘルプの統合 . . . . . . . . . . . . . . .208
10
第 10 章: Microsoft Windows の 高度な機能
ダイナミック リンク ライブラリ (DLL) の宣言と呼び出し
ダイナミック リンク ライブラリ (DLL) の宣言と呼び出し
ダイナミック リンク ライブラリ (DLL) は、実行可能ルーチンやその他のリソース (ツールバー ボ
タンのカスタム アイコンなど) を含むファイルです。DLL は外部ルーチンのライブラリとして使用
でき、これらのルーチンは MapBasic プログラムから呼び出すことができます。MapBasic プロ
シージャの呼び出しに Call 文を使用するように、DLL ルーチンの呼び出しにも Call 文を発行でき
ます。現在は多くの DLL が市販されています。各 DLL のドキュメントには、その中に含まれる
ルーチン、固有の名前、および必要なパラメータが説明されています。
L
MapBasic プログラムが DLL を呼び出す場合、その DLL は実行時に存在しなければなりま
せん。つまり、ユーザにコンパイル済みアプリケーション (MBX ファイル) を提供する場合
は、その MBX によって呼び出される DLL もすべて提供する必要があります。
Windows の DLL については、Windows ソフトウェア開発キット (SDK) に説明されています。ま
た、標準的な Windows ファイルを説明したサードパーティの書籍を入手することもできます。
ライブラリの指定
MapBasic プログラムで DLL ルーチンを呼び出す前に、まず Declare 文により DLL を宣言する必
要があります (これは、MapBasic ソース コードの中で Declare 文を使ってサブプロシージャを宣
言する場合と同じです)。Declare 文では、DLL ファイル名とライブラリの中のルーチン名を指定
します。
Declare Sub my_routine Lib "C:\lib\mylib.dll"
(ByVal x As Integer, ByVal y As Integer)
Declare 文でパスを明示的に指定すると (例 : "C:\lib\mylib.dll")、MapInfo Professional はその場所
から DLL を読み込もうとします。DLL ファイルがその場所にない場合、DLL は読み込まれません
(実行時エラーが発生することがあります)。Declare 文で DLL 名をパスなしで (例 : "mylib.dll") 指
定すると、予想できる様々な場所から、次の順序で DLL が検索されます。
1. DLL が .MBX ファイルと同じディレクトリにある場合、その DLL が読み込まれます。そこにな
い場合は、手順 2 に進みます。
2. DLL が MapInfo Professional のインストール先ディレクトリにある場合、その DLL が読み込ま
れます。そこにない場合は、手順 3 に進みます。
3. DLL が Windows\System ディレクトリにある場合、その DLL が読み込まれます。そこにない
場合は、手順 4 に進みます。
4. DLL が Windows ディレクトリにある場合、その DLL が読み込まれます。そこにない場合は、
手順 5 に進みます。
5. MapInfo Professional では、ユーザのシステム検索パスに従って DLL を検索します。
MapInfo Professional は、DLL からビットマップ アイコンおよびカーソルのリソースを読み込む際
にも、これと同じ検索アルゴリズムに従います。
MapBasic 11.0
195
ユーザーズ ガイド
第 10 章: Microsoft Windows の 高度な機能
ダイナミック リンク ライブラリ (DLL) の宣言と呼び出し
パラメータの受け渡し
DLL の多くはパラメータを受け取ります。たとえば、前出の例では 2 つのパラメータを受け取る
DLL ルーチンの Declare 文を示しています。
MapBasic では 2 つの方法でパラメータを渡すことができます。1 つは値を使用する方法 (この場
合、引 数 が ス タ ッ ク に コ ピ ー さ れ ます)、もう 1 つは参照を使用する方法です ( この場合、
MapBasic 変数のアドレスがスタックに置かれることで、DLL が MapBasic 変数を変更できます)。
参照と値によるパラメータの受け渡しが概念的にどのように異なるかについては、 「MapBasic
の基本」に説明されています。
値によってパラメータを渡すには、Declare 文の中にキーワード ByVal を含めます (前出の例を参
照)。ByVal キーワードを省略すると、引数は参照によって渡されます。
配列、カスタム データ タイプ (定義)、別名などの MapBasic データ タイプは、値により渡すこと
はできません。固定長文字列変数は値により渡すことができますが、DLL によってそのパラメー
タが定義として扱われる場合に限ります。下記の「文字列引数」を参照してください。
標準ライブラリの呼び出し
次の例では、MapBasic プログラムが user という標準 Windows ライブラリの中にある MessageBeep
ルーチンを参照する方法を示します。
Declare Sub MessageBeep Lib "user"
(ByVal x As SmallInt)
ここで、Declare 文が参照するライブラリ名は "user" であり、"user.dll" ではない点に注意して下
さ い。User は Windows の 一 部 と して含まれる標準ライブラリの名前です。その他の標準
Windows ライブラリ名としては、GDI や Kernel があります。
Declare Sub 文を使用して DLL ルーチンを宣言した後は、任意のサブプロシージャを呼び出す場
合と同じように、Call 文を使用してそのルーチンを呼び出すことができます。
Call MessageBeep(1)
別名による DLL ルーチンの呼び出し
DLL ルーチンの中には、正規の MapBasic 識別子として使用できない名前を持つものもあります。
たとえば、DLL ルーチン名が MapBasic の標準キーワードと同じ場合があります。このような場合
には、キーワード Alias を使用してその DLL ルーチンを別の名前で呼び出します。
次の例では、User ライブラリの中にある MessageBeep ルーチンに Beeper という別名を割り当て
る方法を示します。
Declare Sub Beeper Lib "user" Alias "MessageBeep"
(ByVal x As SmallInt)
Call Beeper(1)
L
MapBasic 11.0
ここでは、ルーチンの呼び出しに使う名前 (この例では "Beeper") はキーワード Sub の後で
指定されています。ルーチンの元の名前は、キーワード Alias の後で指定しています。
196
ユーザーズ ガイド
第 10 章: Microsoft Windows の 高度な機能
ダイナミック リンク ライブラリ (DLL) の宣言と呼び出し
文字列引数
DLL ルーチンを呼び出すとき、MapBasic プログラムは参照によって可変長文字列変数を渡すこと
ができます。C を使用して独自の DLL ルーチンを記述する場合、MapBasic が参照で文字列を渡す
ようにするには、その引数を C プログラムで char * と定義します。
警告 :
MapBasic が参照によって文字列引数を渡す場合、DLL ルーチンはその文字列変数の
内容を変更することができます。ただし、MapBasic において文字列が可変長として
宣言されている場合も、DLL ルーチンでその MapBasic 文字列のサイズを拡大するべ
きではありません。
MapBasic プログラムは、固定長文字列変数を参照または値によって渡すことができます。ただ
し、引数を値で渡すと、その引数は DLL ルーチンによって C 定義として解釈されます。たとえ
ば、MapBasic プログラムによって 20 文字の文字列が値によって渡されると、DLL はその引数を
5 つの 4 バイト整数値から成る定義として受け取ります。
MapBasic プログラムが DLL に文字列引数を渡す際、自動的にその文字列の末尾にヌル キャラク
タ (ANSI ゼロ) が追加されます。MapInfo Professional では、MapBasic 文字列変数が固定長である
か可変長であるかに関係なく、常にヌル キャラクタが追加されます。
DLL ルーチンで文字列引数を変更する場合は、その文字列が十分な長さを持つことを確認してく
ださい。つまり、MapBasic プログラムを使用して、渡す文字列変数が十分な長さを持つ文字列を
含むように設定します。
たとえば、100 文字の文字列が必要であるとすると、DLL ルーチンを呼び出す前に、MapBasic プロ
グラムによってその変数に 100 文字の文字列を割り当てることができます。MapBasicの String$( )
関数を使うと、特定の長さを持つ文字列を簡単に作成することができます。または、MapBasic の文
字列変数を固定長文字列として宣言することもできます (たとえば、Dim stringvar As String
* 100 は 100 バイト長の文字列を定義します)。MapBasic は、固定長文字列変数に対して必要に応
じて自動的にスペースを追加し、文字列が一定の長さになるようにします。
配列引数
MapBasic では、MapBasic のサブプロシージャに配列全体を渡す場合と同じように、DLL ルーチ
ンにも渡すことができます。その DLL が配列を引数として受け取る場合は、空の括弧を使用して
配列名を指定することで、MapBasic の配列を渡すことができます。
ユーザ定義タイプ
DLL の中には、カスタム データ タイプをパラメータとして受け取るものもあります (カスタム変
数タイプを作成するには、Type 文を使用します)。MapBasic が 最初の要素のアドレスを渡すと、
ユーザ定義タイプの残りの要素は最初の要素に続いてメモリの中で圧縮されます。
警告 :
DLL がカスタム変数タイプを扱えるようにするには、DLL のコンパイル時に、圧縮
率を最も高く設定した (1 バイト境界) "構造体圧縮" を使用して圧縮する必要があり
ます。たとえば Microsoft C コンパイラでは、/Zp1 オプションを使用して最も高い
圧縮率を指定することができます。
論理引数
MapBasic の論理変数を DLL に渡すことはできません。
MapBasic 11.0
197
ユーザーズ ガイド
第 10 章: Microsoft Windows の 高度な機能
ダイナミック リンク ライブラリ (DLL) の宣言と呼び出し
ハンドル
ハンドルは操作環境により定義される一意の整数値で、フォームやコントロールなどのオブジェ
クトの参照に使用されます。操作環境 DLL は、Windows (HWND) や Device Contexts (hDC) など
へのハンドルを使用します。ハンドルは ID 番号にすぎないので、ハンドルを使用して数値関数を
実行しないようにしてください。
DLL ルーチンが引数としてハンドルを取る場合、MapBasic プログラムはその引数を ByVal Integer
と宣言する必要があります。
DLL 関数が戻り値としてハンドルを返す場合、MapBasic プログラムではその関数の戻り値タイプ
を Integer として宣言する必要があります。
例 : KERNEL でのルーチンの呼び出し
以下に示すのは、DLL 呼び出しの例です。この例で使用している DLL "kernel" は、標準 Windows
ライブラリの 1 つです。このプログラムは、kernel ライブラリの中にあるルーチンを使用し、
Windows 構成ファイル WIN.INI から設定を読み取ります。
Declare Sub Main
’ Use a Declare Function statement to reference the Windows
’ "kernel" library.
Declare Function GetProfileString Lib "kernel"(
lpszSection As String,
lpszEntry As String,
lpszDefault As String,
lpszReturnBuffer As String,
ByVal cbReturnBuffer As Smallint)
As Smallint
Sub Main
Dim sSection, sEntry, sDefault, sReturn As String
Dim iReturn As Smallint
’ read the "sCountry" setting
’ from the "[intl]" section of WIN.INI.
sReturn = String$(256," ")
sSection = "intl"
sEntry = "sCountry"
sDefault = "Not Found"
iReturn = GetProfileString(sSection, sEntry,
sDefault, sReturn, 256)
’ at this point, sReturn contains a country setting
’ (for example, "United States")
Note "[" + sSection + "]" + chr$(10) + sEntry + "=" + sReturn
End Sub
MapBasic 11.0
198
ユーザーズ ガイド
第 10 章: Microsoft Windows の 高度な機能
ダイナミック リンク ライブラリ (DLL) の宣言と呼び出し
Declare Function 文は、kernel ライブラリへの参照を確立します。このライブラリは "kernel" と
して参照されていますが、その実際のファイル名は krnl386.exe である点に注意してください。プ
ログラムで "kernel" として参照すれば、Windows で正しいライブラリが使用されます。kernel ラ
イブラリは Windows API の標準的な構成の一部であるため、特別な扱いを受けます。ただし、独
自のライブラリを作成する場合は、Declare Function 文ではその DLL ファイルの実際の名前を参
照する必要があります。
DLL を使用してカスタム ボタンパッド アイコンやカスタム描画カーソルを格納する場合も、この
基本テクニック、つまり SystemInfo(SYS_INFO_MIPLATFORM) を呼び出すという方法を使用
して、使用する DLL を指定できます。ただし、MapBasic 構文には一般的な構文と異なる点があり
ます。次の例に示すように、Declare 文を使用するのではなく、Create ButtonPad 文に File 句を
含めることで DLL リソース (ビットマップ アイコンおよびカーソル) を参照します。
Declare Sub Main
Declare Function getDLLname() As String
Declare Sub DoIt
Sub Main
Dim s_dllname As String
s_dllname = getDLLname()
Create ButtonPad "Custom" As
ToolButton Calling doit
Icon 134 File s_dllname
Cursor 136 File s_dllname
End Sub
Function getDLLname() As String
If SystemInfo(SYS_INFO_MIPLATFORM) = MIPLATFORM_WIN32 Then
getDLLname = "..\icons\Test32.DLL"
Else
getDLLname = "..\icons\Test16.DLL"
End If
End Function
Sub DoIt
’this procedure called if the user
’uses the custom button...
End Sub
カスタム ボタンパッド アイコンの作成については、「カスタム ボタン アイコンおよび描画カー
ソルの作成 (200 ページ)」を参照してください。
DLL のトラブルシューティングのヒント
独自の DLL を作成する場合にトラブルが発生した場合には、次のヒントを参考にしてください。
•
C++ を使って独自の DLL を作成する場合は、C++ のコンパイラによって関数名の最後に余分
な文字が追加される場合があります。使用する C++ コンパイラで関数を "straight C" としてコ
ンパイルするよう指示し、関数名が変更されるのを回避します。
MapBasic 11.0
199
ユーザーズ ガイド
第 10 章: Microsoft Windows の 高度な機能
カスタム ボタン アイコンおよび描画カーソルの作成
•
Microsoft の 32 ビット C コンパイラには、標準 (キーワード "_stdcall")、C (キーワード"_cdecl")、
およびファスト コール (キーワード "_fastcall") の 3 つの呼び出し規則があります。MapBasic か
ら呼び出す DLL を作成する場合は、ファスト コールの規則を使用しないでください。
•
MapBasic のカスタム データ タイプ (定義) を DLL に渡す際に問題が生じる場合は、上記で説
明したように、C データ定義が 1 バイト境界で "圧縮" されていることを確認してください。
•
MapBasic は、引数を参照 (デフォルト) または値によって渡すことができます。ただし、値に
よる引数の受け渡しは、コンパイラの標準ではありません。たとえば、C 言語のダブル引数を
値で処理する動作はコンパイラによって異なります。そのため、参照により引数を渡す方が、
結果が予測しやすくなります。引数を参照で渡すということは、アドレスを渡すということに
なります。主要な市販コンパイラは、アドレスの処理という点では同様に動作します。
DLL は "自己完結型" でプログラムすることをお勧めします。つまり、各 DLL ルーチンが、使
用するメモリの割り当ておよび割り当てたメモリの解放を、自ら行うようにすることをお勧め
します。
MapBasic の Declare 文を正しく設定することで、DLL が受け取る引数のみを宣言することが
重要です。DLL ルーチンが値によって引数が渡されると想定しているときに、プログラムが引
数を参照で渡そうとすると、ルーチンにエラーが発生するか、不正なデータが戻されます。
•
•
カスタム ボタン アイコンおよび描画カーソルの作成
MapBasic 言語を使用して、MapInfo Professional ユーザ インターフェイスの重要な要素である
MapInfo Professional のボタンパッドの制御とカスタマイズを実行できます。MapBasic によるボ
タンパッドの制御については、「ユーザ インターフェイスの作成」を参照してください。
各ボタン上には、小さな絵 (アイコン) が表示されます。ときには、作成するカスタム ボタンに合
わせて、独自のカスタム アイコンの作成を考えることもあることと思われます。カスタム アイコ
ンの作成手順は、プラットフォームによって異なります。Windows では、カスタム ボタンパッド
アイコンは BMP リソースとして DLL ファイルに格納されます。
また、MapBasic プログラムでは、カスタム カーソル (マップ ウィンドウまたはレイアウト ウィン
ドウ上でマウスをクリックおよびドラッグすると移動するカーソル) を作成することもできます。
このセクションでは、Windows のカスタム カーソルの作成手順について説明します。
標準アイコンの再利用
カスタム ボタン アイコンの作成について説明する前に、MapInfo Professional で用意されている
アイコンについて簡単に説明します。バージョン 4.0 以降、MapInfo Professional では様々なカス
タム アイコンが用意されるようになりました。これらのアイコンにより、MapBasic 開発技術者に
よるカスタム ボタンの作成がいっそう簡単になります。
MapInfo に含まれているアイコンを確認するには、サンプル プログラム Icon Sampler (ICONDEMO.MBX)
を実行します。次のイメージは、Icon Sampler で作成されたボタンパッドの一例です。
MapBasic 11.0
200
ユーザーズ ガイド
第 10 章: Microsoft Windows の 高度な機能
カスタム ボタン アイコンおよび描画カーソルの作成
MapInfo Professional で用意されている各アイコンには数値コードがあります。これらのコードの
リストについては、ICONS.DEF を参照してください。個々のボタンのコードを確認するには、
ICONDEMO.MBX を実行し、マウス カーソルをボタンの上に重ねます。そうすると、ボタンの
ツール チップにボタンのコードが表示されます。
MapInfo Professional で用意されているアイコンの中にアプリケーションに適したものがない場合
は、以降のページを参考にしてカスタム アイコンを作成できます。
カスタム アイコン
MapInfo Professional の カスタ ム アイコンを作成するには、リソース エディタが必要です。
MapBasic 開発環境には、専用のリソース エディタは含まれていません。ただし、MapBasic プロ
グラムではサードパーティのリソース エディタで作成したリソースの使用が可能です。たとえ
ば、AppStudio (Microsoft Visual C によって提供されるリソース エディタ) を利用してカスタム ア
イコンを作成することができます。
Windows では、カスタム アイコンは DLL ファイルに格納されます。カスタム アイコンを作成す
る前に、まずアイコンを格納する DLL ファイルを作成または取得する必要があります。この DLL
ファイルは、"Stub" ファイル (有効なルーチンがまだ含まれていないファイル) でも構いません。
各カスタム アイコンには、それぞれ 2 つのビットマップ リソースを作成しなければなりません。
最初のビットマップ リソースは、幅 18 ピクセル、高さ 16 ピクセルにする必要があります。これ
は、ユーザが MapInfo の [ツールバー オプション] ダイアログ ボックスの [ラージ ボタン] チェック
ボックスをオンにしない場合に表示されるアイコンです。2 つ目のビットマップ リソースは、幅 26
ピクセル、高さ 24 ピクセルにする必要があります。これは、ユーザが [ラージ ボタン] チェック
ボックスをオンにした場合に表示されるアイコンです。この 2 つのリソースを必ず作成します。
カスタム ビットマップの作成は、次の手順で行います°
•
カスタム アイコンを格納する DLL ファイルを取得または作成する。
•
AppStudio などのリソース エディタを使用して DLL を編集する。
•
作成する各アイコンについて、それぞれ 2 つのビットマップ (BMP) リソースを追加する。ビット
マップのサイズは、1 つは幅 18 ×高さ 16、もう 1 つは幅 26 ×高さ 24 (ピクセル単位) とします。
L
•
ここで、作成するのはアイコン リソースではなくビットマップ リソースである点に注
意してください。
2 つのビットマップ リソースに連続する ID 番号を割り当てる。たとえば、18 × 16 のビットマッ
プに 100 という ID を割り当てるとすると、26 × 24 のビットマップには 101 という ID を割り当
てます。
1 組 の ビ ッ ト マ ッ プ リ ソ ー ス を作成した後、それらのカスタム ビットマップを Create
ButtonPad 文または Alter ButtonPad 文を使用して MapBasic アプリケーションに組み込みま
す。プログラムの中では、小さい方 (18 × 16) のビットマップ リソースの ID を参照します。
たとえば、次の文の例に示すように、2 つのビットマップリソースにそれぞれ 100 および 101
の ID を割り当てた場合は、100 の ID を参照します。
MapBasic 11.0
201
ユーザーズ ガイド
第 10 章: Microsoft Windows の 高度な機能
DDE を利用したプロセス間の情報交換
Alter ButtonPad "Tools"
Add PushButton
Icon 100 File "MBICONS1.DLL"
HelpMsg "Add new record"
Calling new_route
Show
カスタム アイコンを格納する DLL ファイル (この例では MBICONS1.DLL) は、.MBX ファイルと
共にユーザのシステムにインストールしておく必要があります。DLL ファイルは、次のいずれか
の場所にインストールできます。
•
.MBX ファイルが置かれているディレクトリ
•
MapInfo Professional ソフトウェアのインストール先ディレクトリ
•
ユーザの Windows ディレクトリ
•
Windows ディレクトリ内のシステム ディレクトリ
•
ユーザの検索パス上にある任意の場所
DLL をこれ以外の場所に置く場合には、MapBasic プログラムでそのディレクトリ パスを明示的に指
定する必要があります (例 : Icon 100 File "C:\GIS\MBICONS1.DLL")。MapInfo Professional
ディレクトリまたは MBX がインストールされているディレクトリ パスを基準としたディレクトリ
パスの作成には、ProgramDirectory$( ) 関数と ApplicationDirectory$( ) 関数を使用します。
Windows のカスタム描画カーソル
カスタム描画カーソルの作成手順は、カスタム アイコンの作成手順と同様です。ただし、描画
カーソルはアイコンには適用されない属性を持ちます (たとえば、各描画カーソルは "ホット ス
ポット" を持ちます)。
カスタム描画カーソルを作成するには、リソース エディタを使用して CURSOR リソースを DLL に
格納します。CURSOR リソースと BMP リソースを同じ DLL ファイルに格納することもできます。
DDE を利用したプロセス間の情報交換
プロセス間通信 (IPC) は、異なるソフトウェア パッケージ間での情報交換を表す一般用語です。
Windows は、一般に DDE と呼ばれるダイナミック データ交換プロトコルを通じて IPC をサポー
トします。
2 つのWindows アプリケーションがどちらも DDE をサポートしている場合は、それらのアプリ
ケーション間で命令やデータを交換することができます。たとえば、Microsoft Excel などの DDE
対応 Windows パッケージでは、MapInfo Professional にタスク (例 : Map From world) の実行を命
令できます。
MapBasic 11.0
202
ユーザーズ ガイド
第 10 章: Microsoft Windows の 高度な機能
DDE を利用したプロセス間の情報交換
DDE 会話の概要
DDE 会話は、2 つの Windows アプリケーション間で発生するプロセスです。両方のアプリケー
ションが実行されていると同時に、どちらのアプリケーションでも DDE 会話がサポートされてい
る必要があります。1 つの DDE会話に 2 つ以上のアプリケーションが関わることはできません。
ただし、MapInfo Professional では同時に複数の会話を実行できます。
ある会話では、一方のアプリケーションがアクティブであり、会話を開始します。このアプリケー
ションはクライアントと呼ばれます。もう一方のパッシブなアプリケーションは、サーバと呼ばれ
ます。クライアント アプリケーションは、命令やクエリをサーバ アプリケーションに送信するな
ど、会話に必要なすべての操作を実行します。サーバは、クライアントの命令に応答します。
MapBasic の DDE クライアントとしての機能
MapBasic 言語では、MapBasic アプリケーションが DDE 会話におけるクライアントとして機能す
るために必要な、次のような文および関数がサポートされています。
MapBasic の文または関数
処理
DDEInitiate( )
会話を開きます。
DDERequest$( )
サーバ アプリケーションからの情報を要求します。
DDEPoke
サーバ アプリケーションに情報を送信します。
DDEExecute
サーバ アプリケーションにアクションを実行するように
指示します。
DDETerminate
DDE 通信をクローズします。
DDETerminateAll
同じ MapBasic プログラムがオープンしたすべての DDE
通信をクローズします。
これらの文および関数の詳細については、『MapBasic リファレンス ガイド』 またはオンライン
ヘルプを参照してください。
DDE会話を開始するには、DDEInitiate( ) 関数を呼び出します。DDEInitiate( ) は、アプリケー
ション名及びトピック名という 2 つのパラメータを取ります。
通常、アプリケーション パラメータは、サーバとなるアプリケーションの名前です。たとえば、
Microsoft Excel の DDE アプリケーション名は Excel です。有効なトピック パラメータのリスト
は、アプリケーションによって異なります。トピック パラメータは、サーバ アプリケーションで
現在使用されているファイルまたはドキュメントの名前になる場合もあります。
た と え ば、現 在 Excel で TRIAL.XLS というワークシート ファイルが編集されている場合、
MapBasic アプリケーションは、次の文により会話を開始することができます。
Dim channelnum As Integer
channelnum = DDEInitiate("Excel", "TRIAL.XLS")
MapBasic 11.0
203
ユーザーズ ガイド
第 10 章: Microsoft Windows の 高度な機能
DDE を利用したプロセス間の情報交換
この例では、Excel がアプリケーション名、TRIAL.XLS がトピック名となります。
MapInfo Professional をはじめ多くの DDE アプリケーションでは、System という特別なトピック
名がサポートされます。System というトピック名を使用して会話を開始した後は、その会話を利
用して使用可能なトピックのリストを取得することができます。
各 DDE 会話は、それぞれ個別の "チャネル" を通じて実行されます。DDEInitiate( ) 関数は、整数
のチャンネル番号を返します。このチャネル番号は、その後の DDE 関連の文で使用されます。
会話が開始された後、MapBasic アプリケーションでは DDEExecute 文を発行することでサーバ
アプリケーションにコマンドを送信できます。たとえば、MapBasic アプリケーションではサーバ
アプリケーションにファイルを開閉を命令することができます。
MapBasic アプリケーションでは、DDERequest$() 関数を呼び出すことでサーバ アプリケーショ
ンの情報を要求できます。DDERequest$( ) を呼び出す際には、まず項目名を指定します。DDE
項目名を指定することで、戻す対象の情報をサーバ アプリケーションに伝えます。サーバ アプリ
ケーションがスプレッドシートの場合は、項目名がセル名である可能性があります。
DDEPoke 文は、サーバに情報を送る際に使用します。一般には、MapBasic アプリケーションで
サーバ アプリケーションに値を送信すると、その値はあたかもユーザ自身が入力したように、該当
のドキュメントに格納されます。次の MapBasic プログラムの例では、DDE サーバのワークシート
内のセルに、"NorthEast Territory" というテキストを格納します。
DDEPoke channelnum, "R1C2", "NorthEast Territory"
DDE 会話の処理が完了すると、MapBasic (クライアント) アプリケーションは DDETerminate 文ま
たは DDETerminateAll 文を発行して会話を終了させます。DDETerminate は、特定の 1 つの DDE
会話を閉じます。DDETerminateAll は、同じアプリケーションによって開かれたすべての DDE 会
話を閉じます。ある時点で、それぞれ独自の DDE 会話を実行している、複数の MapBasic アプリ
ケーションが使用されている場合もあります。
MapBasic アプリケーションが DDE クライアントとして機能する場合、サーバ アプリケーション
が "タイムアウト" (一定時間内にクライアントの操作に反応しない) すると、MapBasic アプリケー
ションが実行時エラーを生成することがあります。
MapInfo Professional で は タ イ ム ア ウ ト 設 定 を Windows レ ジ ス ト リ に 保 存 し ま す。MapInfo
Professional におけるレジストリへの設定の保存の詳細については、MapInfo オンライン ヘルプ
で "レジストリ" を検索してください。
MapInfo Professional の DDE サーバとしての機能
MapInfo Professional は、別の Windows アプリケーションが DDE 会話を開始したときにはサーバ
として機能します。これにより、クライアント アプリケーションは MapBasic グローバル変数を
読み取ったり、そのグローバル変数に値を書き込んだりできるようになります。DDE クライアン
トは、実行操作によって MapBasic 文を実行することもできます。たとえば、クライアントは
DDE 実 行 機 能 を 利 用 し て MapBasic の Map 文を発行できます。( ただし、クライアントは
MapBasic のフローコントロール文を発行することはできません)。
MapBasic 11.0
204
ユーザーズ ガイド
第 10 章: Microsoft Windows の 高度な機能
DDE を利用したプロセス間の情報交換
他のソフトウェア パッケージには、MapBasic と同じ一連の DDE 文が用意されているとは限りま
せん。MapBasic の DDEPoke 文の機能は、他のパッケージでは別の名前で提供されている場合も
あります。特定の Windows アプリケーションに用意されている DDE 文について把握するには、
そのアプリケーションのドキュメントを参照してください。
DDE クライアントとして機能するアプリケーションでは、アプリケーション、トピック、項目と
いう 3 つの基本 DDE パラメータを指定する必要があります。
アプリケーション名 : MapInfoProfessional をサーバとして DDE 会話を開始する場合、アプリケー
ション名を MapInfo に指定します。
ト ピ ッ ク 名 : System と 指 定 す る か、現在実行中の MapBasic アプリケーションの名前 ( 例 :
SCALEBAR.MBX) を指定します。
項目名 : 使用するトピックによって、指定する項目名も異なります。アプリケーション名に
"MapInfo Professional" を、そしてトピック名に "System" を使用する場合は、下記の表に示す任意
の項目名を使用できます。
次の表に、アプリケーション名に MapInfo を指定し、トピック名に System を指定したときに
DDE 会話でサポートされる動作と項目を示します。
DDE の動作
DDE 項目名
効果
ピーク リクエ “SysItems”
スト
System トピックの下で使用できる項目名を示すタブ
区切りのリストが返されます。
例 : Topics SysItems Formats Version
ピーク リクエ “Topics”
スト
現在使用可能なトピック (System および現在実行中
の全 MapBasic アプリケーションの名前) を示すタブ
区切りのリストが返されます。
ピーク リクエ “Formats”
スト
MapInfo Professional (TEXT) がサポートする全クリッ
プボード フォーマットのリストが返されます。
ピーク リクエ “Version”
スト
MapInfo Professional は、MapInfo Professional バー
ジョン番号を 100 倍した値のテキスト文字列を返し
ます。たとえば、MapInfo Professional 9.5.0 の場合は
“950" が返されます。下の例を参照してください。
ピーク リクエ MapBasic 式
スト
文字列が MapBasic 式として解釈され、文字列の値が
返されます。式が有効でない場合、エラーが返されま
す。この機能は MapInfo Professional 4.0 以降のみに
適用されます。
実行
ユーザが文を MapBasic ウィンドウに入力したかのよ
うに、メッセージを MapBasic 文として実行しようと
します。この文では標準関数の呼び出しを使用できま
すが、ユーザ定義関数の呼び出しを使用することはで
きません。この文では、コンパイル済みアプリケー
ション (.MBX ファイル) で定義されている変数を参照
できません。ただし、MapBasic ウィンドウで Dim 文
を実行することで定義された変数は参照できます。
MapBasic 11.0
テキスト メッセージ
205
ユーザーズ ガイド
第 10 章: Microsoft Windows の 高度な機能
DDE を利用したプロセス間の情報交換
たとえば、次の MapBasic プログラム (MapBasic ウィンドウで直接入力できます) は、アプリケー
ション名を "MapInfo"、トピック名を "System" とするシンプルな DDE 会話を実行します。
Dim i_channel As Integer
i_channel = DDEInitiate("MapInfo", "System")
Print DDERequest$(i_channel, "Version")
DDETerminate i_channel
DDEInitiate( ) 関数を呼び出すことで DDE 会話が開始されます。その後、DDERequest$( ) 関数に
よって "Version" を項目名に使ったピーク リクエストが実行されます。
DDE トピック名として現在実行中の MapBasic アプリケーションの名前 (例 :
"C:\MB\SCALEBAR.MBX"、"SCALEBAR.MBX"、"SCALEBAR" など) を使用する場合は、下記の表
に示す任意の項目名を使用できます。
次の表に、アプリケーション名に MapInfo を指定し、トピック名に実行中の MapBasic アプリケー
ションの名前を指定した場合に DDE 会話でサポートされる動作と項目を示します。
DDE の動作
DDE 項目名
効果
ピーク リクエ “{items}”
スト
実行中のアプリケーションによって定義された
グローバル変数をタブ区切りのリストとして返
します。下の例を参照してください。
ピーク リクエ グローバル変数名
スト
変数の値を表す文字列が返されます。
ピーク リクエ グローバル変数の名前ではな MapBasic アプリケーションに
い文字列
スト
RemoteQueryHandler( ) という関数が含まれ
ている場合、この関数が呼び出されます。この
関数は、CommandInfo(CMD_INFO_MSG) を呼
び出すことで項目名を判断できます。
Poke
グローバル変数名
変数に新しい値を格納します。
実行
テキスト メッセージ
MapBasic アプリケーションに
RemoteMsgHandler というプロシージャが含
まれる場合、このプロシージャが呼び出されま
す。このプロシージャは、
CommandInfo(CMD_INFO_MSG) を呼び出すこ
とでテキスト メッセージを判断できます。
たとえば、次の MapBasic プログラム (MapBasic ウィンドウで直接入力できます) は、トピック名
を "SCALEBAR.MBX" とするシンプルな DDE 会話を実行します。この会話は、"SCALEBAR.MBX"
が使用するグローバル変数のリストを出力します。
L
MapBasic 11.0
この会話は、SCALEBAR.MBX アプリケーションが実行中である場合に限り成立します。
206
ユーザーズ ガイド
第 10 章: Microsoft Windows の 高度な機能
DDE を利用したプロセス間の情報交換
Dim i_channel As Integer
i_channel = DDEInitiate("MapInfo", "SCALEBAR.MBX")
Print DDERequest$(i_channel, "{items}" )
DDETerminate i_channel
MapInfo Professional による DDE 実行メッセージの処理
クライアント アプリケーションが MapInfo Professional に実行メッセージを送信する方法は、次
の 2 つです。
•
会話のトピックが "System" の場合、クライアント アプリケーションが実行メッセージを送信
すると、MapInfo Professional は指定されたメッセージを MapBasic 文として実行します。
•
会話のトピックが MapBasic アプリケーション名の場合、クライアントが実行メッセージを送
信すると、MapInfo Professional はそのアプリケーションの RemoteMsgHandler プロシー
ジャを呼び出します。続いて、このプロシージャがCommandInfo( ) を呼び出して、実行メッ
セージのテキストを決定します。
MapBasic アプリケーションは、ある DDE 会話のサーバとして動作する一方で、別の DDE 会話の
クライアントとして動作することもできます。MapBasic アプリケーションは、他の MapBasic ア
プリケーションまたは MapInfo Professional 自体との会話を開始することができます。
DDE を使用した Visual Basic との通信
多くの MapBasic プログラマは、Microsoft Visual Basic 言語を使用して MapBasic アプリケーショ
ンを拡張します。Visual Basic を使用すると、MapBasic の Dialog 文だけでは作成が困難であるよ
う な複雑 なダ イ アロ グ ボッ ク スを作成できます。たとえば、Visual Basic プログラムでは、
MapBasic の Dialog 文では使用できないカスタム コントロールを作成できます。
MapBasic アプリケーションは、DDE (または OLE オートメーション) を通じて Visual Basic と通
信することができます。Visual Basic との通信の詳細については、「統合マッピング」を参照して
ください。
DDE 会話の例
DDE を使用して Microsoft Excel ワークシートのセル値の読み取り/書き込みを行う例については、
『MapBasic リファレンス ガイド』 またはオンライン ヘルプの DEInitiate( ) のセクションを参照
してください。
サンプル プログラム AppInfo (APPINFO.MBX) には、より複雑な DDE 会話の例が用意されていま
す。AppInfo プログラムはデバッギング ツールです。MapBasic アプリケーションを実行してから
AppInfo を実行すると、AppInfo を使用して MapBasic プログラム内のグローバル変数を監視する
ことができます。WhatApps( ) プロシージャは、"Topics" という DDE 項目名をクエリして、実行
中の MBX ファイルのリストを取得します。WhatGlobals( ) プロシージャは "{Items}" を項目名とす
る別の DDE 会話を開始し、グローバル変数名のリストを取得します。
MapBasic 11.0
207
ユーザーズ ガイド
第 10 章: Microsoft Windows の 高度な機能
アプリケーションへの Windows ヘルプの統合
DDE アドバイス リンク
MapInfo Professional が DDE 会話のサーバとして動作する場合、その会話ではウォーム アドバイス
リンクとホット アドバイス リンクの両方がサポートされます。つまり Windows アプリケーション
が、MapBasic グローバル変数の値を監視する DDE 会話を開くと、Windows は MapBasic グローバ
ル変数の値が変化した場合に限り、それを DDE クライアントに通知することができます。
MapBasic アプリケーションが DDE 会話のクライアントとして機能する場合、アドバイス リンク
の作成機能はサポートされません。
アプリケーションへの Windows ヘルプの統合
複雑なアプリケーションを開発する場合、そのアプリケーションについて説明したオンライン ヘ
ルプ ファイルの作成を考える場合もあります。ヘルプ ファイルの作成には、ヘルプ コンパイラが
必 要 で す。MapBasic 開 発 環 境 に は、ヘルプ コンパイラは含まれていません。しかし、既に
Windows ヘルプ コンパイラを所有している場合、そのコンパイラを使用して Windows ヘルプ
ファイルを作成すると、MapBasic アプリケーションを通じてそのヘルプ ファイルを制御すること
ができます。
L
Pitney Bowes Software Inc. の技術サポート スタッフは、オンライン ヘルプ ファイルの作成
に関するサポートは行いません。
プログ ラムの中では、Open Window、CloseWindow、Set Window などの文を使ってヘルプ
ウィンドウを操作することができます。次の文を使用すると、ヘルプ ウィンドウが開かれ、
MapInfo Professional ヘルプ ファイルの目次画面が表示されます。
Set Window Help Contents
Set Window 文はさまざまな目的で使用できます。詳細については、『MapBasic リファレンス ガ
イド』を参照してください。ほとんどの Set Window 文では、整数ウィンドウ識別子を指定する
必要があります。しかし、キーワード Help を指定する場合、整数識別子を省略する必要がありま
す。これは、ヘルプ ウィンドウが 1 つしかないためです。
カスタム ヘルプ ファイルを作成して Dispatch.hlp を呼び出すと、次の文でそのヘルプ ファイルを
ヘルプ ウィンドウに表示できます。
Set Window Help File "C:\MAPINFO\DISPATCH.HLP"
次の文は、コンテキストID番号が500であるヘルプ画面を表示するように、ヘルプウィンドウを設
定します。
Set Window Help ID 500
コ ン テ キ ス ト ID 番 号 ( 上 の 例 で は 500) は、ヘ ルプ フ ァ イ ル の プ ロ ジ ェ ク ト フ ァ イ ル ( 例 :
filename.hpj) の [MAP] セクションで定義されます。Windows ヘルプ ファイルのアーキテク
チャの詳細については、Windows ソフトウェア開発キット (SDK) のドキュメントを参照してくだ
さい。
MapBasic 11.0
208
ユーザーズ ガイド
第 10 章: Microsoft Windows の 高度な機能
アプリケーションへの Windows ヘルプの統合
アプリケーションの特定のダイアログ ボックスに対するヘルプ画面を用意するには、そのダイアロ
グ ボックスにボタン コントロールを追加して、そのボタンに "Help" という名前を割り当てます。
Control Button
Title "Help"
Calling show_help_sub
Help ボタン コントロールにハンドラ プロシージャを割り当て、そのハンドラ プロシージャによっ
て Set Window 文を発行します。ユーザが [ヘルプ] ボタンをクリックすると、そのダイアログボッ
クスに関するヘルプが表示されます。ダイアログ ボックス コントロールに対するハンドラ プロ
シージャの割り当てについては、「ユーザ インターフェイスの作成」を参照してください。
MapBasic 11.0
209
ユーザーズ ガイド
統合マッピング
MapInfo Professional は、MapBasic 以外のプログラミング言語を使用して操
作することができます。たとえば、Visual Basic を使ったプログラミングに詳
しい皆さんは、MapInfo Professional のマップ ウィンドウを Visual Basic アプ
リケーションに統合して、プログラミングの大半 (あるいはすべて) を Visual
Basic で行うことができます。MapInfo Professional の要素を別のアプリケー
ションに統合することから、このようなアプリケーション開発は統合マッピン
グと呼ばれています。
C や Visual Basic などの他のプログラミング言語に詳しい皆さんは、統合
マ ッ ピ ン グ を利 用 す る こ と で、MapInfo Professional のウィンドウを非
MapBasic アプリケーションに簡単に統合することができます。
L
.Net を使用して統合マッピング アプリケーションを作成する方法
については、「.Net での統合マッピング (272 ページ)」を参照し
てください。
このセクションの構成
Š
Š
Š
Š
Š
Š
Š
Š
Š
Š
Š
Š
統合マッピング アプリケーションの表示 . . . . . . . . . . 211
統合マッピングの概念の概要. . . . . . . . . . . . . . . . 211
統合マッピングの技術概要. . . . . . . . . . . . . . . . . 212
短いサンプル プログラム : "Hello, (Map of) World" . . . . . . . . . . .213
統合マッピングの詳しい説明. . . . . . . . . . . . . . . . 214
コールバックを使用した MapInfo Professional からの情報の取り出
し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .223
OLE を使用しないコールバック . . . . . . . . . . . . . . 227
関連 MapBasic 文および関数 . . . . . . . . . . . . . . . 230
OLE オートメーション オブジェクト モデル . . . . . . . . . 232
MapInfo Professional コマンドライン引数 . . . . . . . . . 248
ツールバー ボタンおよびハンドラの追加 . . . . . . . . . . 253
その他. . . . . . . . . . . . . . . . . . . . . . . . . . 257
11
第 11 章: 統合マッピング
統合マッピング アプリケーションの表示
統合マッピング アプリケーションの表示
統合マッピング アプリケーションの表示を操作することができます。必要であれば、MapInfo
Professional のユーザ インターフェイスとは大きく異なるユーザ インターフェイスを作成すること
も可能です。たとえば、下の画面は FindZip アプリケーション (MapInfo Professional のマップ ウィ
ンドウを Visual Basic のウィンドウに統合する Visual Basic アプリケーション) を示しています。
マップをプログラムに統合すると、ユーザはビットマップ、メタファイル、またはその他のス
ナップショットではなく、正真正銘の MapInfo Professional のマップ ウィンドウを見ることがで
きます。ユーザがそのマップで操作 (例 : [ズーム] ツールを使用したマップの拡大) できるようにす
ることも可能です。統合マップ ウィンドウは、MapInfo Professional の中でのマップ ウィンドウ
の機能をすべて備えています。
L
ユーザが統合マッピング アプリケーションを起動したときは、MapInfo Professional のス
プラッシュ画面 (MapInfo スタート時に表示されるイメージ) は表示されません。
統合マッピングの概念の概要
統合マッピング アプリケーションを作成するには、MapBasic プログラム以外のプログラムを記述
します。統合マッピング アプリケーションは、いくつかの言語で作成することができます。最も
一般的に使われる言語は、C および Visual Basic です。この章のコード サンプルでは、Visual
Basic を使用します。
プログラムの中で、MapInfo Professional をバックグラウンドで起動させる文を発行します。たと
え ば、Visual Basic を 使 用 し て い る場合は、Visual Basic の CreateObject( ) 関数を呼び出して
MapInfo Professional を起動させることができます。MapInfo Professional は、スプラッシュ画面
を表示することなくバックグラウンドで静かに起動します。
MapBasic 11.0
211
ユーザーズ ガイド
第 11 章: 統合マッピング
統合マッピングの技術概要
プログラムによる MapInfo Professional の操作は、MapBasic 文を表す文字列を作成し、OLE オー
トメーション (または DDE) を使用して MapInfo Professional にその文字列を送るという形で行わ
れます。MapInfo Professional は、まるでそれらが MapBasic ウィンドウの中に入力されたかのよ
うに、これらの文を実行します。
マップ ウィンドウを開く場合は、通常の MapBasic プログラムと同じように MapBasic の Map From
文を使用します。しかし、統合マッピング アプリケーションでは、さらに別の文 (例 : Set Next
Document Parent) を発行して、そのマップ ウィンドウをアプリケーションの子ウィンドウにする
必要があります。このプロセスは、ウィンドウの "再親化" (Reparenting) と呼ばれます。再親化は、
マップ、ブラウザ、グラフ、レイアウト、凡例の各ウィンドウに対して行えます。
L
MapInfo Professional のウィンドウを別のアプリケーションの中に再親化しても、MapInfo
Professional にそのアプリケーションのデータへのアクセスを与えることにはなりません。
MapInfo Professional ウィンドウにデータを表示するためには、まずそのデータを MapInfo
テーブルに格納する必要があります。
次の図に、統合マッピング アプリケーションの主な要素を示します。
コンパイル済み MapBasic プログラム (.MBX) がオプション要素となっていることに注意してくだ
さい。アプリケーションによっては、コンパイル済み MapBasic プログラムを作成する必要がない
場合もあります。ただし、既に MapBasic プログラムを作成し終えている場合は、統合マッピング
ソリューションの一部として、既存の MapBasic コードを引き続き使用することができます。
統合マッピングの技術概要
システム要件
•
統合マッピングには、MapInfo Professional 4.0 以降が要求されます。ランタイムの使用も可能
です。
MapBasic 11.0
212
ユーザーズ ガイド
第 11 章: 統合マッピング
短いサンプル プログラム: "Hello, (Map of) World"
•
ユーザのコンピュータには、クライアント プログラムと MapInfo Professional を同時に実行す
るために必要な、十分な空きメモリおよびシステム リソースがなければなりません。
•
クライアント プログラム (例 : Visual Basic プログラム) は、OLE オートメーション コントロー
ラまたは DDE クライアントとして機能できなければなりません。OLE オートメーションは処
理速度と信頼性の点で DDE に大きく勝ることから、OLE を使用することを強くお勧めしま
す。また、OLE オートメーションは DDE に比べてエラー報告機能の点でも優れています。
MapInfo Professional は、実行時エラー コードの報告に OLE プロパティを使用します。OLE
ではなく DDE を使用する場合は、実行時エラー コードの取り出しはできません。
•
クライアント プログラムでは、マップの移動先のプレースホルダとしてのユーザ インターフェ
イス要素 (例 : ウィンドウ、フォーム、コントロール) を作成できなければなりません。また、
クライアント プログラムではそのユーザ インターフェイス要素の Windows HWND 値を決定で
きなければなりません。
たとえば、Visual Basic ではフォームに PictureBox コントロールを追加することができます。
MapInfo Professional にコマンドを送信して PictureBox の中でマップを作成するよう指示する
ときは、PictureBox の HWND を指定する必要があります。
その他の技術的注意点
•
•
•
統合マッピング アプリケーションを開発するには、MapBasic 以外の言語でプログラムを作成す
る必要があります (このプログラムはクライアント プログラムと呼ばれます)。クライアント プ
ログラムは、C/C++、Visual Basic (バージョン 3.0 以降)、PowerBuilder、Delphi などのさまざま
な一般開発言語を使用して作成することができます。
統合マッピングでは OLE オートメーションを使用しますが、OLE 埋め込みは使用しません。
MapInfo Professional のマップ ウィンドウをアプリケーションに追加するには、それを埋め込
むのではなく、MapInfo Professional に一連のコマンド文字列を送ることでそのウィンドウの "
再親化" を行います。これによって、その MapInfo Professional ウィンドウはアプリケーショ
ンの子ウィンドウとしてユーザに表示されます。
統合マッピングでは、VBX コントロールも OCX コントロールも使用しません。MapInfo
Professional ソフトウェアにはいくつかの DLL が含まれていますが、これらの DLL は直接呼び
出してはなりません。これらの DLL は、MapInfo Professional プログラム内部で使用されます。
短いサンプル プログラム: "Hello, (Map of) World"
次の Visual Basic の例は、MapInfo Professional ウィンドウを別のアプリケーションに統合するこ
とがいかに簡単かを示しています。
まず、新しい Visual Basic プロジェクトを作成します。そのプロジェクトの一般宣言プロシージャ
の中で、1 つのオブジェクト変数を宣言します (この例では変数は mi と名付けられていますが、ど
のような名前を使用しても構いません)。
Dim mi As Object
次に、Form_Loadプロシージャに文を追加して、次のようなプロシージャを作成します。
Sub Form_Load()
Set mi = CreateObject("MapInfo.application")
MapBasic 11.0
213
ユーザーズ ガイド
第 11 章: 統合マッピング
統合マッピングの詳しい説明
mi.do "Set Application Window " & Form1.hWnd
mi.do "Set Next Document Parent " & Form1.hWnd & " Style 1"
mi.do "Open Table ""World"" Interactive Map From World"
mi.RunMenuCommand 1702
mi.do "Create Menu ""MapperShortcut"" ID 17 As ""(-"" "
End Sub
この Visual Basic プログラムを実行すると、MapInfo Professional がバックグラウンドで起動し、
マップ ウィンドウが作成されます。そのマップ ウィンドウは、この Visual Basic プログラムの子
ウィンドウとして動作します。次のセクションでは、統合マッピング プロセスの各ステップにつ
いて詳しく説明します。
統合マッピングの詳しい説明
以下のセクションでは、MapInfo Professional の要素を Visual Basic アプリケーションに統合する
方法について説明します。ここでの説明は、次の 2 つの前提に基づいています。
•
•
皆さんが Windows プログラミングの基礎用語および概念を理解していること。たとえば、"子
ウィンドウ" が何を意味するかを知っていなければなりません。Windows プログラミングの概
念に関する背景知識については、使用するプログラミング言語のドキュメントを参照してくだ
さい。
このセクションの説明で使用されるコード例は、すべて Visual Basic 構文に基づいています。
したがって、皆さんは Visual Basic によるプログラミング方法を把握している必要がありま
す。ただし、このセクションで説明する基本概念およびプロシージャは他のプログラミング言
語にも適用されるため、 Visual Basic 開発技術者以外の皆さんもこのセクションに目を通す必
要があります。
MapInfo Professional の起動
MapInfo Professional の一意のインスタンスを開始するには、Visual Basic の CreateObject( ) 関数
を呼び出して、その戻り値を Visual Basic オブジェクト関数に割り当てます
L
(オブジェクト変数はグローバルにすることができます。そうしなかった場合、ローカル プ
ロシージャが終了すると MapInfo オブジェクトも解放されます)。
たとえば、オブジェクト変数に "mapinfo" という名前を与えた場合、次の文によって MapInfo
Professional が起動します。
Set mapinfo = CreateObject("MapInfo.Application")
Visual Basic の CreateObject( ) 呼び出し以外の方法で起動された MapInfo Professional の過去の実
行インスタンスに追加するには、Visual Basic の GetObject( ) 関数を使用します。
Set mapinfo = GetObject( , "MapInfo.Application")
L
MapBasic 11.0
通常の MapInfo Professional ではなく MapInfo ランタイムを使う場合は、"MapInfo.Application"
ではなく "MapInfo.Runtime" と指定します。MapInfo ランタイムと MapInfo Professional のフル
コピーは、同時に実行することができます。
214
ユーザーズ ガイド
第 11 章: 統合マッピング
統合マッピングの詳しい説明
Visual Basic の CreateObject( ) 関数および GetObject( ) 関数は、OLE オートメーションにより
MapInfo Professional に接続します。OLE ではなく DDE を使用する必要がある場合は、Visual
Basic の Shell( ) 関数を使用して MapInfo Professional を起動した後、LinkeMode プロパティを使
用して DDE 接続を確立します。
Windows では、MapInfo Professional の複数のインスタンスを同時に実行することができます。
MapInfo Professional を起動してから Visual Basic の CreateObject( ) 関数を呼び出す統合マッピン
グ アプリケーションを起動すると、2 つの異なる MapInfo Professional のインスタンスが同時に実
行されることになります。
MapInfo Professional へのコマンドの送信
MapInfo Professional を起動した後は、MapBasic の文を表すテキスト文字列を作成します。たと
えば、MapInfo Professional に MapBasic の Open Table 文を実行させる場合は、次のような文字
列を (Visual Basic の中で) 作成することができます。
msg = "Open Table ""STATES.TAB"" Interactive "
OLE オートメーションを使って MapInfo Professional に接続した時は、次のように Do メソッドを
使って MapInfo Professional にコマンド文字列を送ります。次に例を示します。
mapinfo.Do msg
Do メソッドを使うと、MapInfo Professional はそのコマンドが MapBasic ウィンドウに入力され
たかのようにコマンド文字列を実行します。
DDE を使用して MapInfo Professional に接続した場合は、DDE LinkExecute メソッドを使用して
MapInfo Professional にコマンド文字列を送信します。
MapInfo Professional からのデータの照会
MapBasic 式の値を照会するには、その式を表す文字列を作成します。たとえば、MapBasic 関数
WindowID(0) の呼び出しによる戻り値を決定するには、次のような文字列を (Visual Basic の中で)
作成します。
msg = "WindowID(0)"
OLE オートメーションを使って MapInfo に接続した時は、次のように Eval OLE メソッドを使っ
て MapInfo に式文字列を送ります。次に例を示します。
Dim result As String
result = mapinfo.Eval "WindowID(0)"
Eval メソッドを使うと、MapInfo Professional はその文字列を MapBasic 式として解釈し、式の値
を決定してその値を文字列として返します。
L
式に論理値が含まれる場合、MapInfo Professional は 1 文字から成る文字列、つまり "T" ま
たは "F" を返します。
DDE を使用して MapInfo Professional に接続した場合は、DDE LinkRequest メソッドを使用して
値を照会します。
MapBasic 11.0
215
ユーザーズ ガイド
第 11 章: 統合マッピング
統合マッピングの詳しい説明
MapInfo Professional ウィンドウの再親化
MapInfo Professional を起動した後は、MapBasic の Set Appliation Window 文を使用して、MapInfo
Professional のダイアログ ボックスおよびエラー メッセージがクライアント プログラムに制御され
るようにします (次の文では、"FormName" は Visual Basic におけるフォームの名前です)。
msg = "Set Application Window " & FormName.hWnd
mapinfo.Do msg
続いて、MapInfo Professional ウィンドウを Visual Basic アプリケーションに統合する場合は、常
に Set Next Document 文の後に MapBasic のウィンドウ作成文をつなげて MapInfo Professional
に送信します。
たとえば、次のコマンドでは Visual Basic プログラムの子ウィンドウとなる MapInfo Professional
のマップ ウィンドウを作成します ("MapFrame" は、Visual Basic における PictureBox コントロー
ルの名前です)。
msg = "Set Next Document Parent " & MapFrame.hWnd & " Style 1"
mapinfo.Do msg
msg = "Map From States"
mapinfo.Do msg
Set Next Document 文を使用すると、ドキュメント ウィンドウの "再親化" を行えます。Set Next
Doument 文の中で、Visual Basic プログラムにおけるコントロールの HWND (ハンドル) を指定し
ま す。次 に (Map、Graph、Browse、Layout、Create Legend などの文を使用して) MapInfo
Professional ウィンドウを作成すると、新しく作成されたウィンドウは再親化されて、そのクライ
アント プログラムを親に持つようになります。
Set Next Document 文には、作成するウィンドウのタイプを制御する Style 句が含まれます。上
の例で指定される Style 1 は、境界を持たない子ウィンドウを作成します。Style 2 を指定すると、
(MapInfo Professional の凡例ウィンドウのような) 高さが半分のタイトル バーを持ったポップアッ
プ ウィンドウが作成されます。Style 3 は、通常の高さのタイトル バーを持ったポップアップ ウィ
ンドウを作成します。
再親化する各ウィンドウに対して、Set Next Document Parent 文の後にウィンドウ作成文をつな
げた一組の文を発行します。ウィンドウを作成した後は、"WindowID(0)" 値を照会すると、その新
規ウィンドウに対する MapInfo Professional の整数ウィンドウ ID を得ることができます (多くの
MapBasic 文では、ウィンドウ ID を事前に把握しておく必要があります)。
mapid = Val(mapinfo.eval("WindowID(0)"))
マップ ウィンドウの再親化を行った後も、MapInfo Professional はそのウィンドウの管理を続けま
す。ウィンドウの一部を塗り替えなければならない場合は、自動的に塗り替えが行われます。し
たがって、クライアント プログラムでは、再親化されたウィンドウに関する消去メッセージや塗
り替えメッセージは無視することができます。
C で作業を行う場合は、消去メッセージを無視できない場合もあります。このような場合は、親
ウィンドウのスタイル設定に WS_CLIPCHILDREN というウィンドウ スタイルを含める必要があ
ります。
MapBasic 11.0
216
ユーザーズ ガイド
第 11 章: 統合マッピング
統合マッピングの詳しい説明
凡例やラスタのダイアログ ボックス、およびその他の特殊ウィンドウの再親化
MapInfo Professional には、情報ウィンドウ、ルーラー ウィンドウ、メッセージ ウィンドウ、ラ
スタ関連のダイアログ ボックス、統計ウィンドウなど、いくつかのモードレス ウィンドウがあり
ます。これらの特殊な "移動表示" ウィンドウの再親化を行うには、MapBasic の Set Window…
Parent 文を使用します。たとえば、FindZip サンプル プログラムでは、次の文を使用して情報
ウィンドウの再親化を行います。
mapinfo.do "Set Window Info Parent " & FindZipForm.hWnd
ここで、情報ウィンドウの再親化プロセスは、マップウィンドウの再親化プロセスとは異なる点
に注意してください。情報ウィンドウの再親化を行うときは、Set Next Document 文は使用しま
せん。プロセスが異なるのは、マップ ウィンドウは複数存在する場合があるのに対し、情報ウィ
ンドウは 1 つしか存在しないからです。
凡例ウィンドウは、特殊なケースです。通常、MapInfo Professional ユーザ インターフェイスに
は、情報ウィンドウと同様に凡例ウィンドウも 1 つしかありません。ただし、MapBasic 言語で
は、Create Legend 文を含めることで新しい凡例ウィンドウを作成することができます。
MapInfo Professional の " 唯 一 の" 標 準凡例ウィンドウの再親化を行うには、MapBasic の Set
Window Legend Parent 文を使用します。
カスタム凡例ウィンドウを作成してその再親化を行うには、MapBasic の Set Next Document 文
に続けて MapBasic の Create Legend 文を使用します。この場合は、特定のマップ ウィンドウま
た は グ ラ フ ウ ィ ン ド ウ と 連 結 し た 凡例ウィンドウが作成されることになります。MapInfo
Professional のデフォルト凡例ウィンドウとは異なり、このようなカスタム凡例ウィンドウは、ア
クティブなウィンドウが変わっても変化しません。
マップ ウィンドウの中で凡例を移動させることもできます。Set Next Document 文の中で、マップ
ウィンドウの HWND を親として指定します。こうすると、凡例はマップ ウィンドウの中に "捕われ
た" 枠となります。FindZip サンプル プログラムには、この手法を使用した例が紹介されています。
ユーザによるマップ ウィンドウのサイズ変更の許可
ユーザがマップ ウィンドウのサイズを変更できるかどうかは、アプリケーションの設定によって
決まります。FindZip サンプル プログラムでは、マップ ウィンドウは Visual Basic の PictureBox
コントロールの中に置かれるため、そのサイズを変更することはできません。ただし、MDI イン
ターフェイスを使用してマップ ウィンドウの再親化を行うと、ユーザはウィンドウ サイズを変更
できるようになります。
L
MapInfo Professional では、ユーザがマップ ウィンドウのサイズを変更しても、マップの内
容が新しいウィンドウ サイズに収まるようにマップの内容を自動的にリセットしません。
したがって、アプリケーションでユーザ によるマップ ウィンドウのサイズ変更が可能な場
合は、Windows API 関数の MoveWindow を 呼び出し、マップ ウィンドウを新しいサイズに
適合させなければなりません。
たとえば、次のような Visual Basic の Declare 文を使用して MoveWindow API 関数にアクセスす
ることができます。
MapBasic 11.0
217
ユーザーズ ガイド
第 11 章: 統合マッピング
統合マッピングの詳しい説明
Declare Function MoveWindow Lib "user32" _
(ByVal hWnd As Long, _
ByVal x As Long, ByVal y As Long, _
ByVal nWidth As Long, ByVal nHeight As Long, _
ByVal bRepaint As Long) As Long
ユーザがマップ ウィンドウのサイズを変更するときに、MoveWindow を呼び出します。Visual
Basic では、サイズ変更イベントによって Form_Resize( ) プロシージャが誘発されます。次の例
に示すように、そのプロシージャの中から MoveWindow を呼び出すことができます。
Dim mHwnd As Long
mHwnd = Val(mapinfo.Eval("WindowInfo(FrontWindow(),12)"))
MoveWindow mHwnd, 0, 0, ScaleWidth, ScaleHeight, 0
数字の12は、MapBasic の識別子 WIN_INFO_WND に対応します。
ここで、ScaleWidth と ScaleHeight は Visual Basic フォームの標準プロパティで、それぞれフォー
ムの現在の幅と高さを表します。
L
ScaleWidth と ScaleHeight がピクセル値を表すように ScaleMode プロパティを Pixels に設定
する必要があります。
MapInfo Professional のツールバー ボタンの統合
MapInfo Professional のボタンパッド (ツールバー) の再親化はできません。クライアント プログ
ラムにツールバー ボタンを表示するには、現在使用している言語でボタンを作成する必要があり
ます。たとえば、Visual Basic を使用している場合は、Visual Basic を使ってツールバーを作成し
なければなりません。
Visual Basic ツールバー ボタンに標準 MapInfo Professional ボタンをエミュレートさせる場合は、
MapInfo Professional の RunMenuCommand メソッドを使用します (このメソッドは、MapBasic
における Run Menu Command 文と同じ効果を持ちます)。たとえば、FindZip サンプル プログラ
ムには、次のような文を発行する InfoTool_Click プロシージャが含まれています。
mapinfo.RunMenuCommand 1707
ユーザが Visual Basic コントロールをクリックすると、FindZip プログラムは MapInfo Professional の
RunMenuCommand メソッドを呼び出し、これによってツール番号 1707 (MapInfo Professional の
情報ツール) が呼び出されます。このメソッド呼び出しの結果、MapInfo Professional の情報ツール
がアクティブ ツールとなります。
ここで、"マジック ナンバー" の 1707 は MapInfo Professional の情報ツールを示します。マジック
ナンバーを使用する代わりに、よりわかりやすい識別子を使用することもできます。MapBasic で
は、標準識別子である 1707 の値を持つ M_TOOLS_PNT_QUERY を定義します。したがって、次
の RunMenuCommand の例は、上の例と同じ効果を持つことになります。
mapinfo.RunMenuCommand M_TOOLS_PNT_QUERY
MapBasic 11.0
218
ユーザーズ ガイド
第 11 章: 統合マッピング
統合マッピングの詳しい説明
識別子 (例 : M_TOOLS_PNT_QUERY) を使用すると、プログラムが読みやすくなります。ただし、
コードの中で識別子を使用するには、まずプログラムに適切な MapBasic のヘッダ ファイルが含ま
れるようにする必要があります。Visual Basic を使用している場合は MAPBASIC.BAS というヘッ
ダ ファイル、 C を使用している場合は MAPBASIC.H というヘッダ ファイルを使用します。
次の表は、各 MapInfo Professional 標準ツール ボタンの ID 番号の一覧です。3 列目のコードは、
MAPBASIC.BAS (Visual Basic)、MAPBASIC.H (C)、および MENUS.DEF (MapBasic) に含まれて
います。
メイン ツールバー ボタン
数
識別子コード
選択
1701
M_TOOLS_SELECTOR
長方形選択
1722
M_TOOLS_SEARCH_RECT
半径選択
1703
M_TOOLS_SEARCH_RADIUS
境界選択
1704
M_TOOLS_SEARCH_BOUNDARY
拡大
1705
M_TOOLS_EXPAND
縮小
1706
M_TOOLS_SHRINK
移動
1702
M_TOOLS_RECENTER
情報
1707
M_TOOLS_PNT_QUERY
ホット リンク
1736
M_TOOLS_HOTLINK
ラベル
1708
M_TOOLS_LABELER
ルーラー
1710
M_TOOLS_RULER
ウィンドウをドラッグ
1734
M_TOOLS_DRAGWINDOW
シンボル
1711
M_TOOLS_POINT
ライン
1712
M_TOOLS_LINE
折れ線
1713
M_TOOLS_POLYLINE
弧
1716
M_TOOLS_ARC
ポリゴン
1714
M_TOOLS_POLYGON
楕円
1715
M_TOOLS_ELLIPSE
長方形
1717
M_TOOLS_RECTANGLE
面取り長方形
1718
M_TOOLS_ROUNDEDRECT
MapBasic 11.0
219
ユーザーズ ガイド
第 11 章: 統合マッピング
統合マッピングの詳しい説明
メイン ツールバー ボタン
数
識別子コード
テキスト
1709
M_TOOLS_TEXT
枠
1719
M_TOOLS_FRAME
ノード追加
1723
M_TOOLS_ADD_NODE
また、使用後にプログラムの呼び出しを行うカスタム描画ツール ボタンを作成することもできま
す。カスタム ツール ボタンの機能に関する一般的な説明については、「ユーザ インターフェイス
の作成」を参照してください。カスタム ツール ボタンを統合マッピング アプリケーションの中で
使用する場合の詳細については、「コールバックを使用した MapInfo Professional からの情報の
取り出し」を参照してください。
MapInfo Professional のショートカット メニューのカスタマイズ
MapInfo Professional では、ユーザが MapInfo Professional ウィンドウを右クリックするとショー
トカット メニューが表示されます。これらのショートカット メニューは、統合マッピング アプリ
ケーションでも表示されます。アプリケーションの性格によっては、MapInfo Professional の
ショートカット メニューを変更、あるいは削除したい場合もあります。たとえば、統合マッピン
グ アプリケーションではマップ ウィンドウの複製を作成できない場合もあるので、マップ ウィン
ドウ ショートカット メニューの [ビューの複製] メニューを削除した方がよい場合もあります。
MapInfo Professional のショートカット メニューから 1 つ以上のメニュー項目を削除するには、
MapBasic の Alter Menu…Remove 文を使用するか、Create Menu 文を使用してメニュー全体を
再定義します。この構文の詳細については、『MapBasic リファレンス ガイド』またはオンライン
ヘルプを参照してください。
MapInfo Professional のショートカット メニューにカスタム項目を追加するには、MapBasic の Alter
Menu...Add 文を使用し、Calling OLE または Calling DDE 構文を指定します。詳細については、
「コールバックを使用した MapInfo Professional からの情報の取り出し」を参照してください。
あるショートカット メニュー全体を削除するには、MapBasic の Create Menu 文を使用してそのメ
ニューを再定義し、新しいメニュー定義に制御コード "(-" を使用します。たとえば、次の文は
MapInfo Professional のマップ ウィンドウに対するショートカット メニューを完全に削除します。
mapinfo.do "Create Menu ""MapperShortcut"" ID 17 As ""(-"" "
統合 MapInfo Professional ウィンドウの印刷
MapBasic の PrintWin 文を使用すると、再親化後のウィンドウを含む MapInfo Professional ウィ
ンドウを印刷することができます。この例については、FindZip サンプル プログラムを参照してく
ださい。FindZip サンプル プログラムの [File] メニューには、[Print Map] コマンドが含まれていま
す。ユーザが [Print Map] を選択すると、プログラムによって次のプロシージャが実行されます。
Private Sub Menu_PrintMap_Click()
mapinfo.do "PrintWin"
End Sub
MapBasic 11.0
220
ユーザーズ ガイド
第 11 章: 統合マッピング
統合マッピングの詳しい説明
MapBasic の PrintWin 文を使用すると、1 ページにマップだけが印刷されます。それ以外のもの
は印刷されません。
ま た、MapBasic の Save Window 文を使用してマップ ウィンドウの Windows メタファイル
(WMF ファイル) 表示を印刷することもできます。たとえば、ユーザが [Print Form] を選ぶと、同
プログラムはそのマップのメタファイルを作成し、そのメタファイルをフォームに添付した後、
Visual Basic の PrintForm メソッドを使います。これにより、マップのメタファイルを含むフォー
ムが印刷されます。
実行時エラーの検出
クライアント プログラムが MapInfo Professional にコマンド文字列を送った場合に、そのコマン
ドが失敗することがあります。たとえば、"Map From World" コマンドは、World テーブルが開い
ていなければ失敗します。MapInfo Professional は、コマンドが失敗するとエラー コードを生成し
ます。
MapInfo Professional のエラーをトラップするには、他のあらゆる OLE オートメーション プロセ
スと同様に、エラー トラップを設定します。たとえば、Visual Basic では、On Error 文を使用して
エラー トラップを可能にします。
MapInfo Professional で発生したエラーを特定するには、MapInfo Professional の OLE オートメー
ション プロパティである LastErrorCode および LastErrorMessage を読み取ります。これらのプロ
パティの詳細については、「OLE オートメーション オブジェクト モデル (232 ページ)」を参照し
てください。MapBasic のエラー コードのリストについては、テキスト ファイル ERRORS.DOC を
参照してください。
L
LastErrorCode プロパティは、ERRORS.DOC に示すエラー番号よりも 1000 大きい値を返
します。つまり、コンパイル済み MapBasic アプリケーションに発生したエラーによって
実行時エラー 311 が生成された場合、統合マッピング アプリケーションで同じエラーが発
生すると、LastErrorCode プロパティ は 1311 となります。
オートメーションを通じて MapBasic アプリケーション (MBX ファイル) を実行した場合、MBX は
MBX 自身の実行時エラーのトラップを行いません。Do メソッドから MapBasic の Run Application
文を発行して MBX を実行することができますが、 MBX 内部で MapBasic 実行時エラーが発生する
と、MBX が MapBasic OnError 文を使用していても MBX は停止してしまいます。オートメーション
を通じて呼び出す MBX を作成する場合は、できるだけシンプルにしてください。MBX の中では
MapBasic OnError の使用を避け、代わりに MBX を実行する前にプログラム自体の十分なチェック
を行ってください。
MapInfo Professional の終了
Visual Basic の CreateObject( ) 関数を呼び出して MapInfo Professional の新しいインスタンスを開
始した場合、そのインスタンスはオブジェクト変数を解放すると自動的に終了します。オブジェ
クト変数がローカルである場合、その変数はローカル プロシージャが終了すると自動的に解放さ
れます。グローバル オブジェクト変数を解放するには、Nothing という値を割り当てます。
Set mapinfo = Nothing
DDE を使用して MapInfo Professional と通信する場合、LinkExecute メソッドを使用して "End
MapInfo" コマンド文字列を送信すると、MapInfo Professional を終了することができます。
MapBasic 11.0
221
ユーザーズ ガイド
第 11 章: 統合マッピング
統合マッピングの詳しい説明
Visual Basic プログラムの終了
DDE を使用して MapInfo Professional と通信する 16 ビット Visual Basic プログラムを作成する場
合は、Visual Basic プログラムを終了させる前に必ず DDE リンクを終了させてください。DDE リ
ンクがアクティブである間に Visual Basic プログラムを終了させると、実行時エラー メッセージ
が生成されるなど、望ましくない動作につながる可能性があります。この問題は、16 ビット
Visual Basic プログラムを 32 ビット バージョンの Windows ( Windows XP) で実行する場合に生じ
ます。この問題を回避するには、Visual Basic プログラムの設定を通じて、プログラムが終了する
前に自動的に DDE リンクが終了するようにします。
MapBasic コマンド文字列についての注意
これまでに説明したように、MapBasic 文を表す文字列を作成して、その文字列を Do OLE メソッ
ドを使用して MapInfo Professional に送信することができます。この場合、次の Visual Basic の例
に示すように、2 つ以上の文を 1 つのコマンド文字列に統合することができます (Visual Basic で
は、& 文字は文字列の連結に使用します)。
Dim msg As String
msg="Open Table ""States"" Interactive "
msg=msg & "Set Next Document Parent " & Frm.hWnd & " Style 1 "
msg=msg & "Map From States "
mapinfo.do msg
実行時にこのコマンド文字列を解読すると、MapInfo Professional はその文字列が 3 つの異なる
MapBasic 文、つまり Open Table 文、Set Next Document 文、および Map From 文を含んでい
ることを自動的に検出します。MapInfo Professional がこれらの異なる文を検出できるのは、
Open、Set、および Map が、MapBasic 言語の予約済みキーワードだからです。
キーワード Interactive の後にスペースが入っていることに注目してください。このスペースは不
可欠で、スペースがないと、コマンド文字列には "InteractiveSet" という MapBasic 構文では無効
のサブ文字列が含まれることになります。各コマンド文字列がスペースで終わることで、MapInfo
Professional は Interactive と Set が別々のキーワードであることを検出できます。
複数の MapBasic 文を 1 つのコマンド文字列に統合する場合は、MapInfo Professional が文字列に
含まれる個々の文を検出できるように、各文の後に必ずスペースを入れてください。
ダイアログ ボックスについての注意事項
統合マッピング アプリケーションでは、ダイアログを閉じる際の [OK] ボタンは有効ではありませ
ん。通常のコントロール ボタンを使用し、変数を設定してユーザがそのボタンをクリックしたか
どうかを判断するようにします。
MapBasic 11.0
222
ユーザーズ ガイド
第 11 章: 統合マッピング
コールバックを使用した MapInfo Professional からの情報の取り出し
アクセラレータ キーについての注意事項
統合マッピング アプリケーションでは、MapInfo Professional のアクセラレータ キー (例 : コピー
する際に使用する Ctrl-C) は無視されます。アプリケーションでアクセラレータ キーを使用できる
ようにするには、クライアント プログラム (例 : Visual Basic アプリケーション) の中でこれらのア
クセラレータ キーを定義する必要があります。
ただし、統合マッピング アプリケーションでは、"S" キーの押下によるスナップ モードのオン/オ
フの切り替えはサポートします。
コールバックを使用した MapInfo Professional からの情報の取り出し
MapInfo Professional がクライアント プログラムに自動的に情報を送るように統合マッピング ア
プリケーションを設定することができます。たとえば、マップ ウィンドウが変更されるたびに
MapInfo Professional がクライアント プログラムを呼び出して、変更されたウィンドウの整数ウィ
ン ド ウ ID を 伝 え る よ う に プ ロ グ ラムを設定する ことも可能です。あるイベントが MapInfo
Professional にクライアント プログラムを呼び出させるこのタイプの通知は、"コールバック" と呼
ばれています。
•
•
•
•
•
コールバックでは、MapInfo Professional は次のような状況においてクライアント プログラム
に情報を送ることができます。
ユーザがカスタム ツールを使用して MapInfo Professional ウィンドウの操作を行った場合 : た
とえば、ユーザがマップ ウィンドウ上でクリック/ドラッグしてラインを描くと、MapInfo
Professional はクライアント プログラムを呼び出して、ユーザが選択した X 座標および Y 座標
を伝えることができます。
ユーザがメニュー コマンドを選択した場合 : たとえば、アプリケーションで MapInfo Professional
のショートカット メニュー (ユーザが右クリックすると表示されるメニュー) をカスタマイズする
とします。ユーザがショートカット メニューからカスタム コマンドを選ぶと、MapInfo
Professional はクライアント プログラムを呼び出して、そのメニュー イベントをプログラムに通
知することができます。
マップ ウィンドウが変更された場合 : ユーザがマップ ウィンドウの内容を変更した (例 : マップ
レイヤを追加または消去する、あるいはマップを移動する) 場合に、MapInfo Professional はクラ
イアント プログラムに変更されたウィンドウの整数ウィンドウ ID を送信することができます (こ
れは、MapBasic の特殊ハンドラ プロシージャである WinChangedHandler に似ています)。
ステータス バーのテキストが MapInfo Professional で変更された場合 : MapInfo Professional
のステータス バーは、統合マッピングアプリケーションには自動的に表示されません。クライ
アント プログラムに MapInfo Professional のステータス バーをエミュレートさせる場合は、ス
テータス バーのテキストが変更されるたびに MapInfo Professional がクライアント プログラム
に通知するようアプリケーションを設定する必要があります。
コールバックの技術要件
コールバックを使用する場合のクライアント プログラムは、DDE サーバまたは OLE オートメー
ション サーバとして機能できなければなりません。Visual Basic 4.0 Professional Edition 以降と
C++ では、オートメーション サーバの役割を果たすアプリケーションの作成が可能です。ただし、
Visual Basic3.0 で作成されたアプリケーションはオートメーション サーバとして機能できないた
め、コールバックの処理には DDE を使用する必要があります。
MapBasic 11.0
223
ユーザーズ ガイド
第 11 章: 統合マッピング
コールバックを使用した MapInfo Professional からの情報の取り出し
OLE コールバックの一般的な使用手順
次の手順は、OLE を通じたコールバックの実行プロセスの概要を示したものです。
1. Visual Basic 4.0 以降、C++、または OLE サーバとして機能するアプリケーションを作成でき
るその他の言語を使い、1 つ以上の OLE メソッドを定義するクラス定義を作成する。クラス定
義の作成方法については、使用するプログラミング言語のドキュメントを参照してください。
2. MapInfo Professional のステータス バーをエミュレートする場合には、SetStatusText というメ
ソッドを作成し、 このメソッドが 1 つの文字列引数を取るように定義する。
3. マップ ウィンドウが変更されるたびに MapInfo Professional がプログラムに通知するようにし
たい場合は、WindowContentsChanged というメソッドを作成し、 このメソッドが 1 つの文字
列引数を取るように定義する。
4. カスタム メニュー コマンドまたはカスタム ボタンが使用されるたびに MapInfo Professional
がクライアント プログラムに通知するようにしたい場合は、任意メソッド名を使って 1 つまた
はそれ以上の追加メソッドを作成し、 各メソッドが 1 つの文字列引数を取るようにする。
5. カスタム クラスを使用してオブジェクトを作成する。たとえば、"CMyClass" というクラスを呼
び出した場合は、次の Visual Basic 文でそのクラスのオブジェクトを作成します。
Public myObject As New CMyClass
6. プログラムによる MapInfo Professional の起動後、MapInfo Professional の RegisterCallback
メソッドを呼び出して、そのオブジェクトの名前を指定する。
mapinfo.RegisterCallback myObject
ユーザがカスタム ツールバー ボタンを使用するたびに MapInfo Professional がクライアント プ
ログラムに通知するようにしたい場合は、カスタム ボタンを定義して (例 : MapInfo Professional
に Alter ButtonPad…Add 文を送る)、 そのカスタム ボタンが Calling OLE methodname
(methodname はステップ 4 で作成したメソッド名) の構文を使用するように定義する。
MapInfo Professional のツールバーは、MapInfo Professional のその他のユーザ インターフェイ
スと同じく非表示となっています。このため、ユーザは新しく作成されたカスタム ボタンを確
認できません。したがって、クライアント プログラムのユーザ インターフェイスにはアイコ
ン、ボタン、またはその他の可視コントロールを追加するべきです。ユーザが Visual Basic のア
イコンまたはボタンをクリックするときに、MapInfo Professional に Run Menu Command ID
文を送信してカスタム ツール ボタンが "アクティブ" な MapInfo Professional ツールになるよう
にします。
7. ユーザがカスタム メニュー コマンドを使用するたびに MapInfo Professional がクライアント
プログラムに通知するようにしたい場合は、カスタム メニュー コマンドを定義して (例 : Alter
Menu...Add 文を使用して MapInfo Professional のショートカット メニューの 1 つに項目を追
加する)、 そのカスタム メニュー コマンドが Calling OLE methodname (methodname はス
テップ 4 で指定したメソッド名) の構文を使用するように定義する。
8. 定義したメソッドの中で、MapInfo Professional から送られた引数の処理に必要な文を発行する。
9. SetStatusText メソッドを作成した場合、MapInfo Professional はそのメソッドに対し、MapInfo
Professional のステータス バーに表示されるテキストを表すシンプルなテキスト文字列を送信
する。MapInfo Professional のステータス バーをエミュレートする場合は、このメソッドにコー
ドを追加して、そのテキストがユーザ インターフェイスのどこかに表示されるようにします。
MapBasic 11.0
224
ユーザーズ ガイド
第 11 章: 統合マッピング
コールバックを使用した MapInfo Professional からの情報の取り出し
10. WindowContentsChanged メソッドを作成した場合、MapInfo Professional はどのマップ ウィ
ンドウが変更されたかを示す 4 バイト整数 (MapBasic ウィンドウの ID 番号) を送信する。ウィ
ンドウの変更内容に応じた必要な処理を行うコードをメソッドに追加します。たとえば、マッ
プ ウィンドウの現在の拡大/縮小レベルの変化を追いかけている場合は、MapInfo Professional
の MapperInfo( ) 関数を呼び出してマップ ウィンドウの最新の拡大/縮小レベルを決定します。
11. カスタム ボタンまたはメニュー コマンドを処理するメソッドを使用する場合、MapInfo Professional
はカスタム メソッドにコンマで区切られた文字列を送信する。メソッドの中で、その文字列を解読
します。文字列の具体的なフォーマットは、ユーザが使用したのがメニュー コマンドか、"ポイン
トモード" 描画ツールか、または "ラインモード" 描画ツールかなどによって異なります。「コール
バックへの送信データの処理」では、コンマで区切られた文字列の構文について説明します。
コールバックへの送信データの処理
統合マッピング アプリケーションでは、カスタム MapInfo Professional メニュー コマンドおよび
カスタム MapInfo Professional ツールバー ボタンを作成することができます。ユーザがカスタム
コマンドまたはボタンを使用すると、MapInfo Professional はコンマで区切られた 8 つの要素を含
む文字列を OLE メソッドに送信します。たとえば、MapInfo Professional から送信される文字列
は次のような形になります。
MI:-73.5548,42.122,F,F,-72.867702,43.025,202,
MapBasic の CommandInfo( ) 関数を使い慣れていれば、このようなコンマで区切られた文字列の
内容をより簡単に理解できます。MBX アプリケーション (MapBasic 言語で作成され、MapBasic コ
ンパイラでコンパイルされたプログラム) を作成するときは、カスタム メニュー コマンドおよびカ
スタム ボタンが OLE メソッドの代わりに MapBasic のハンドラ プロシージャを呼び出すように設
定できます。ハンドラ プロシージャの中で CommandInfo( ) を呼び出すと、最近のイベントに関す
るさまざまな情報を特定することができます。たとえば、ある MapBasic プロシージャがカスタム
描画ツール ボタンのハンドラとして機能する場合、次の関数呼び出しにより、ユーザがその描画
ツールを使用している間に Shift キーを押していたかどうかを特定できます。
log_variable = CommandInfo(CMD_INFO_SHIFT)
CMD_INFO_SHIFT コードは、MapBasic のヘッダ ファイル MAPBASIC.DEF の中で定義されてい
ます。次の表に、CommandInfo 関連の定義をそれぞれの数値の順に並べて示します。
値
メニュー イベント後に意味を持つ
コード
ボタン イベント後に意味を持つ
コード
1
CMD_INFO_X
2
CMD_INFO_Y
3
CMD_INFO_SHIFT
4
CMD_INFO_CTRL
5
CMD_INFO_X2
MapBasic 11.0
225
ユーザーズ ガイド
第 11 章: 統合マッピング
コールバックを使用した MapInfo Professional からの情報の取り出し
メニュー イベント後に意味を持つ
コード
値
ボタン イベント後に意味を持つ
コード
6
CMD_INFO_Y2
7
CMD_INFO_TOOLBTN
8
CMD_INFO_MENUITEM
各コードの説明については、『MapBasic リファレンス ガイド』またはオンライン ヘルプの
CommandInfo( ) の項を参照してください。
Calling OLE methodname の構文を使用するカスタム メニュー コマンドまたはボタンを作成す
ると、MapInfo Professional は CommandInfo( ) による 8 つの戻り値のすべてをコンマで区切って
含んだ文字列を作成します。この文字列は接頭辞 "MI:" で始まるため、OLE サーバはこのメソッド
が MapInfo Professional によって呼び出されたことを判断できます。
MapInfo Professional からメソッドに送られる文字列の構成は、次のようになります。
"MI:" +
CommandInfo(1)
CommandInfo(3)
CommandInfo(5)
CommandInfo(7)
+
+
+
+
","
","
","
","
+
+
+
+
CommandInfo(2) + "," +
CommandInfo(4) + "," +
CommandInfo(6) + "," +
CommandInfo(8)
カスタムボタンのそれぞれにユニークな ID 番号を割り当てると、全てのボタンに同じメソッドを
呼び出させることができます。そのメソッドは、コンマで区切られた文字列の 7 つの引数を評価
して、どのボタンによって呼び出されたかを特定します。
MapBasic がコンマで区切られた文字列をメソッドに送信した後は、必要に応じてその文字列を解
読するコードをメソッドに追加することができます。
統合マッピング アプリケーションで MapInfo Professional のショートカット メニューにカスタム
メニュー コマンドを追加する場合、 ユーザがそのカスタム メニュー コマンドを選択するたび
に、MapInfo Professional は OLE メソッドにコンマで区切られた文字列を送信します。このカス
タム メニュー コマンドの ID 番号が 101 である場合、文字列は次のような形になります。
"MI:,,,,,,,101"
こ の 場 合、コ ン マ で 区 切 ら れ た 文 字 列 の 要 素 の ほ と ん ど は 空 に な っ て い ま す。こ れ は、
CommandInfo( ) 関数はメニュー イベントに関する 1 つの情報しか返すことができないからです (上
の表を参照)。上の文字列の 8 つの "スロット" の中では、8 番目のスロットのみがメニュー イベント
に関連しています。
次に、ユーザがマップ上でクリック/ドラッグしてラインを描けるようにするカスタム MapInfo
Professional ツールバー ボタンを作成するとします。ユーザがそのカスタム描画ツールを使用するた
びに、MapInfo Professional は次のようなコンマで区切られた文字列を OLE メソッドに送信します。
"MI:-73.5548,42.122,F,F,-72.867702,43.025,202,"
MapBasic 11.0
226
ユーザーズ ガイド
第 11 章: 統合マッピング
OLE を使用しないコールバック
この場合、コンマで区切られた文字列はいくつかの値を含んでいます。これは、CommandInfo( )
はツール ボタン イベントに関する複数の情報を返すことができるからです。最初の 2 つの要素
は、ユーザがクリックした場所の x 座標および y 座標を示します。次の 2 つの要素は、ユーザが
クリックした時に Shift キーおよび Ctrl キーを押していたかどうかを示します。次の 2 つの要素
は、ユーザがマウス ボタンをリリースした場所の座標を示します。最後の要素は、ボタンの ID 番
号を示します。この文字列の最終 "スロット" は空ですが、これはその 8 番目のスロットが、ボタ
ン イベントではなくメニュー イベントに関連しているからです。
標準通知コールバックの C/C++ 構文
前のセクションでは、Visual Basic におけるコールバックについて説明しました。このセクションで
は、MapInfo Professional の標準コールバックである SetStatusText および WindowContentsChanged
についての、特定の C 言語構文について説明します。
MapInfo Professional の SetCallback メソッドを使用すると、IDispatch オブジェクトへの通知
コールバックが自動的に生成されます。MapInfo Professional の標準コールバックは、次のような
C 構文を持っています。
SCODE SetStatusText(LPCTSTR lpszMessage)
MapInfo Professional でステータス バーのテキストが変更されるたびに、MapInfo Professional は
SetStatusText メソッドを呼び出します。唯一の引数は、新しいステータス バー テキストの文字
列値です。
SCODE WindowContentsChanged(Unsigned Long windowID)
再親化されたマップ ウィンドウの内容が変更されるたびに、MapInfo Professional は
WindowContentsChanged メソッドを呼び出します。唯一の引数は、変更されたウィンドウを識
別するための MapInfo Professional の整数ウィンドウ ID です。このコールバックは、MapBasic の
WinChangedHandler プロシージャと似ています。
OLE を使用しないコールバック
既に説明したように、MapInfo Professional のコールバックでは OLE を使用してクライアント プ
ログラムに情報を送信することができます。しかし、OLE を使用しないコールバックの設定が必
要になる場合もあります。たとえば、Visual Basic 3.0 でプログラムを開発する場合、コールバッ
クに OLE を使用することはできません。これは、Visual Basic 3.0 では独自の OLE オートメー
ション サーバを作成できないからです。
MapInfo Professional は、DDE を用いたコールバックと、コンパイル済み MapBasic アプリケー
ション (MBX ファイル) を用いたコールバックという、OLE に依存しない 2 種類のコールバックを
サポートします。
MapBasic 11.0
227
ユーザーズ ガイド
第 11 章: 統合マッピング
OLE を使用しないコールバック
DDE コールバック
カスタム ツールバー ボタンまたはメニュー コマンドを作成する場合は Calling 句を指定します。
DDE を通じてコールバックを処理するには、 Calling DDE server, topic 構文を使用します。
ユーザがカスタム ボタンまたはメニュー コマンドを使用すると、MapInfo Professional はそのた
びに指定された DDE サーバへの DDE 接続を開き、指定された DDE トピックに文字列を送信しま
す。この文字列は、「コールバックへの送信データの処理 (225 ページ)」で説明した形式に基づい
ています (例 : “MI:……101”)。
DDE コールバックの例については、サンプル プログラム FindZip を参照してください。Form
Load プロシージャは、MapInfo Professional に Alter ButtonPad・dd 文を送信してカスタム ツー
ルバー ボタンを作成します。
新しいツールボタンの定義には、次のような呼び出し句が含まれます。
Calling DDE "FindZip", "MainForm"
ユーザがこのカスタム ツールを使ってマップ上をクリックすると、MapInfo Professional はその度
に FindZip アプリケーションへの DDE 接続を開き、"MainForm" トピックに文字列を送ります
("MainForm" は、そのフォームの LinkTopic プロパティの値です)。DDE の概要については、「開
発環境の使用」を参照してください。
MBX コールバック
コンパイル済み MapBasic アプリケーション (MBX ファイル) を作成する場合は、MBX ファイルの
中で MapBasic プロシージャを呼び出すようにカスタム ボタンおよびメニュー コマンドを設定す
ることができます。Calling 句では、Calling procedure (procedure は MapBasic プログラムに
おけるプロシージャの名前) 構文を使用します。Visual Basic アプリケーションによる MapInfo
Professional の起動後、MapInfo Professional に Run Application 文を送信して MBX を実行しま
す。次に例を示します。
mapinfo.do "Run Application ""C:\MB\MYAPP.MBX"" "
カスタム ボタンおよびメニュー コマンド作成の基本については、「ユーザ インターフェイスの作
成」を参照してください。
オンライン ヘルプ
統合マッピング アプリケーションでは、MapInfo Professional の RunMenuCommand OLE メソッ
ドを使用して MapInfo Professional ダイアログ ボックスを表示することができます。アプリケー
ションで MapInfo Professional ダイアログ ボックスを表示する場合、ダイアログ ボックスでのオン
ライン ヘルプの使用を有効または無効にすることができます。
標準 MapInfo Professional ヘルプの表示
ユーザがダイアログ ボックス上で標準 MapInfo Professional ヘルプを見られるようにすることがで
きます。これは、デフォルト動作となっています。MapInfo Professional ダイアログ ボックスが表
示されている時にユーザが F1 キーを押すと、Windows ヘルプが MAPINFOW.HLP または
MAPINFOW.CHM (標準 MapInfo Professional ヘルプ ファイル) から適切なトピックを表示します。
MapBasic 11.0
228
ユーザーズ ガイド
第 11 章: 統合マッピング
OLE を使用しないコールバック
L
ボタンをクリックしてヘルプ ファイルの他の内容を参照することができます。しかし、
MapInfo Professional ヘ ル プ ファイルは統合マッピング アプリケーションではなく
MapInfo Professional のユーザ インターフェイスについて説明しているため、ユーザが困
惑する可能性もあります。
オンライン ヘルプの無効化
次の MapBasic 文を発行すると、MapInfo Professional ダイアログ ボックスに対するすべてのオン
ライン ヘルプを無効にすることができます。
Set Window Help Off
Set Window Help Off 文を発行した後は、MapInfo Professional ダイアログ ボックスの表示中に
F1 キーを押しても何も起こりません。
カスタム ヘルプ ファイルの表示
MapInfo Professional がカスタム ヘルプ ファイルを使用するような設定も可能です。たとえば、
次の MapBasic 文では、MAPINFOW.CHM ではなく CUSTOM.CHM のヘルプ ファイルを使用する
ように MapInfo Professional に指示します。
Set Window Help File "CUSTOM.CHM" Permanent
Set Window Help File... Permanent 文を発行した後は、F1 キーを押すと MapInfo Professional は
オンライン ヘルプを表示します。ただし、MapInfo Professional は MAPINFOW.HLP ではなく指
定されたヘルプ ファイルを表示します。この方法は、1 つ以上の MapInfo Professional ダイアログ
ボックスに対するオンライン ヘルプを提供したいものの、ユーザに標準 MapInfo Professional ヘ
ルプ ファイルのすべてにはアクセスさせたくない場合に使います。
MapInfo Professional ダイアログ ボックスに対するカスタム ヘルプを提供したい場合は、ファイ
ルのコンテキスト ID 番号が MapInfo Professional のダイアログ ボックス ID と一致するようにカ
スタム ヘルプ ファイルを設定します。
MapInfo Professional ダイアログ ボックスの ID 番号を調べるには、以下の手順に従います。
1. -helpdiag コマンドライン引数を使用して MapInfo Professional を実行する。
2. ヘルプを作成する MapInfo Professional ダイアログ ボックスを表示する。
3. F1 キーを押す。-helpdiag オプションを使用したため、MapInfo Professional はヘルプでは
なく、そのダイアログ ボックスの ID 番号を表示します。表示されたダイアログ ボックスの ID
番号をメモします。
4. Windows ヘルプ作成ソフトを使ってカスタム ヘルプ ファイルを編集し、カスタム ヘルプ トピッ
クに MapInfo Professional ダイアログ ボックスと同じ ID 番号が割り当てられるようにする。
たとえば、MapInfo Professional の [キー指定検索] ダイアログ ボックスの ID 番号は 2202 となってい
ます。[キー指定検索] ダイアログ ボックスに対する独自のオンライン ヘルプを提供するには、カス
タム ヘルプ トピックのコンテキスト ID 番号が 2202 になるようにヘルプ ファイルを設定します。
この場合、次の点に注意してください。
MapBasic 11.0
229
ユーザーズ ガイド
第 11 章: 統合マッピング
関連 MapBasic 文および関数
•
MapBasic には、HTML ヘルプ コンパイラは付属していません。Microsoft から無料で提供され
ています 。
http://www.microsoft.com/downloads/details.aspx?FamilyID=00535334-C8A6-452F-9AA0D597D16580CC&displaylang=en
•
MapInfo Professional のダイアログ ボックス ID 番号は、将来のバージョンで変更される可能性
があります。
関連 MapBasic 文および関数
このセクションでは、統合マッピング アプリケーションで特に役立つ MapBasic の文および関数
を紹介します。これらの文および関数の詳細については、『MapBasic リファレンス ガイド』また
はオンライン ヘルプを参照してください。
文 / 関数名
説明
Create Legend
新しい凡例ウィンドウを作成する。
Map
新しいマップ ウィンドウを作成する。
MenuitemInfoByID( )
MenuitemInfoByHandler( )
MapInfo Professional メニュー コマンドの状態 (チェックされ
ているかどうか) を判別する。
Open Table
MapInfo Professional テーブルを開く。
RemoteQueryHandler( )
MapBasic プログラムによる DDE クライアントからのピーク
リクエストの処理を許可する。
Run Menu Command
ユーザによる MapInfo Professional メニュー コマンドまたは
ボタンパッド ボタンの選択をシミュレートする。
SearchPoint( ), SearchRect( )
指定された x/y 座標または長方形エリアの中にあるオブジェ
クトを、マップ ウィンドウの選択可能レイヤ上で検索する。
MapInfo Professional の情報ツールまたはラベル ツールのエ
ミュレートを可能にする。
SearchInfo( )
SearchPoint( ) および SearchRect( ) から得られた結果に関
する情報を返す。
Set Application Window
ダイアログ ボックス ウィンドウの再親化を行う。MapInfo
Professional への接続後または MapInfo Professional の起動後、
クライアント プログラムの中でこの文を一度だけ発行する。
Set Map
マップ ウィンドウのさまざまな機能を制御する。
MapBasic 11.0
230
ユーザーズ ガイド
第 11 章: 統合マッピング
関連 MapBasic 文および関数
文 / 関数名
説明
Set Next Document
マップ ウィンドウなどのドキュメント ウィンドウの再親化を
行い、そのウィンドウをクライアント プログラムの子ウィン
ドウにする。
Set Windowsetwindow
MapInfo Professional ウィンドウのさまざまな機能を制御する。
Shade, Set Shade
主題図レイヤの作成または変更を行う。
SystemInfo( )
SystemInfo( ) が返す値の中には、統合マッピング特有のもの
もある。
たとえば、SYS_INFO_APPLICATIONWND と指定すると、ア
プリケーションの HWND が取り出せます。
WindowID( ), WindowInfo( )
MapBasic 11.0
再親化されたウィンドウを含む MapInfo Professional ウィン
ドウに関する情報を返す。
231
ユーザーズ ガイド
第 11 章: 統合マッピング
OLE オートメーション オブジェクト モデル
OLE オートメーション オブジェクト モデル
次の図に、MapInfo Professional OLE オートメーション タイプ ライブラリの概要を示します。メソッ
ドとプロパティの詳細については、以降のページで説明します。
Application オブジェクトは、MapInfo Professional のインスタンスを表します。
MBApplications コレクションの各オブジェクトは、現在実行中の MapBasic アプリケーションを表
します。
MBGlobals コレクションの各オブジェクトは、実行中の MapBasic アプリケーションのいずれかに
よって定義されたグローバル変数を表します。
MapBasic 11.0
232
ユーザーズ ガイド
第 11 章: 統合マッピング
OLE オートメーション オブジェクト モデル
次の図に、MapInfo Professional の OLE オートメーション タイプ ライブラリに用意されているそ
の他のオブジェクトを示します。メソッドとプロパティの詳細については、以降のページで説明
します。
MapBasic 11.0
233
ユーザーズ ガイド
第 11 章: 統合マッピング
OLE オートメーション オブジェクト モデル
MapInfo Professional プロセス内から OLE オブジェクト モデルを使用
OLE オートメーション オブジェクト モデルは、最初、別のプロセスのクライアント アプリケー
ション (統合マッピング アプリケーションなど) から使用するために設計されました。このオブジェ
クト モデルは、実行中の MapBasic プログラムで呼び出された DLL からコマンドを実行するために
使用することもできます。このアプローチの場合は、次の 2 つの点に注意が必要です。
•
DLL が読み込まれる MapInfo Professional プロセスに対してコマンドを実行する。これにより
MapInfo Professional の 2 つ目のインスタンスが作成されるので、"CreateObject" 関数呼び出
しを実行して OLE オブジェクトを取得することはありません。代わりに、現在の MapInfo
Professional プ ロ セ ス を 表 す OLE オブジェクトを使用します。この値を呼び出すには、
SYS_INFO_APPIDISPATCH 属性を指定して MapBasic 関数の SystemInfo を呼び出します。こ
の関数は、プライマリ OLE オブジェクトの IDispatch ポインタを表す整数値を返します。
MapBasic コードから DLL コードにこの値を渡し、Do メソッドや Eval メソッドの呼び出しに
使用できる OLE 変数に変換します (ポインタを OLE オブジェクトに変換するメカニズムは、
DLL を実装するために使用するプログラム言語によって異なります)。
•
コールバック通知を使用する場合は、古い SetCallback ではなく、新しい RegisterCallback メ
ソッドを使用してコールバック オブジェクトを登録する。SetCallback を使用した場合は、
MapInfo Professional 内で実行中の他のアプリケーションによって、そのメソッドに関連付け
られたコールバック スロットが "盗まれる" おそれがあります。RegisterCallback はこのリスク
を低減します。
Application オブジェクトのプロパティ
次の表に、Application オブジェクトに適用されるすべてのプロパティを示します。この表のプロ
パティは、Visible および LastErrorCode を除き、すべて読み取り専用です。
Application オブジェクトのプロパティ
プロパティ名
機能
Name
アプリケーション名 (例 : "MapInfo Professional") を返す。OLD 標準
プロパティ。Application オブジェクトのデフォルト プロパティ。
FullName
実行可能なアプリケーション ファイルの完全パスを返す。OLD
標準プロパティ。
Application
Application オブジェクトを返す。OLD 標準プロパティ。
Parent
その親オブジェクトの Application オブジェクトを返す。Application
オブジェクトに対しては、それ自身を返します。OLD 標準プロパ
ティ。
Version
現在のバージョン番号のテキストに 100 を掛けた数字を返す
(例 : MapInfo Professional 9.0.0 の場合は "900" を返す)。
MapBasic 11.0
234
ユーザーズ ガイド
第 11 章: 統合マッピング
OLE オートメーション オブジェクト モデル
Application オブジェクトのプロパティ (続き)
プロパティ名
機能
ProductLevel
実行中の MapInfo 製品を示す整数を返す。MapInfo Professional
の場合は、200 を返す。
Visible
アプリケーション ウィンドウが可視状態であるかどうかを示す
ブール値を返す。読み取り/書き込み可能なプロパティです。
ウィンドウの可視性を特定するにはこのプロパティの読み取り
を、ウィンドウの可視性を設定するには書き込みを行います。
LastErrorCode
Do、Eval、または Runommand のメソッド呼び出しの最中に発
生した最後の MapBasic エラーのコード番号を示す 2 バイト整
数値を返す。
L
ここで返されるコード番号は、対応する MapBasic エラー
コード番号に 1000 を足した数となります。
エラー コードは、決して自動的に 0 に戻ることはありません。
エラーが発生すると、そのエラーは別のエラーが発生する (ま
たはこのプロパティに新規値を書き込む) まで変化しません。
読み取り/書き込み可能なプロパティです。
LastErrorMessage
LastErrorCode に対応するエラー メッセージの文字列を返す。
Application オブジェクトのメソッド
機能
メソッド名
Do( string )
文字列を MapBasic 文と解釈し、その文を実行する。
Eval( string )
文字列を MapBasic 式と解釈し、その式の値 (文字列) を返す。
式に論理値が含まれる場合、MapInfo Professional は 1 文字か
ら成る文字列、つまり "T" または "F" を返します。
RunCommand( string )
文字列を MapBasic 文と解釈する。"Do" と同義。
RunMenuCommand( menuid )
整数の menuid 引数で指定されたメニュー コマンドを実行す
る。下の例を参照してください。
このメソッドを使用すると、標準メニュー コマンドまたはボタ
ンが有効になります。カスタム メニュー コマンドまたはボタン
を有効にするには、Do メソッドを使用して RunMenu Command
ID 文を発行します。
MapBasic 11.0
235
ユーザーズ ガイド
第 11 章: 統合マッピング
OLE オートメーション オブジェクト モデル
Application オブジェクトのメソッド (続き)
機能
メソッド名
DataObject( windowID )
特定の整数 windowID が与えられると、そのウィンドウを表す
IUnknown インターフェイスを返す。ウィンドウのメタファイ
ル 表示を得るには、IDataObject インターフェイスに対して
QueryInteface を使用します。
このオブジェクトに対して定義されるインターフェイスは、
IDataObject および IUnknown の 2 つだけです。
L
SetCallback( IDispatch )
これは、C プログラマ用の高度機能です。
その OLE オートメーション オブジェクトを MapInfo Professional
作成通知の "シンク" として登録する。コールバック関数は一度
に 1 つしか登録できません。
こ の メ ソ ッ ド は 非 推 奨 に な り ま し た。新 し い メ ソ ッ ド の
RegisterCallback お よ び UnregisterCallback を 使 用 す る
方が実用的です。
RegisterCallback
(IDispatch)
その OLE オートメーション オブジェクトを MapInfo
Professional 作 成 通 知 の " シ ン ク" と し て 登 録 す る。
MapInfo Professional プロセス内 (たとえば、MapBasic 経
由で呼び出される DLL ) からコールバックを登録する場合
に、このメソッドを使用します。このメソッドを使用す
ると、コールバック オブジェクトが、MapInfo Professional
プロセス内で実行される可能性のある他のアプリケーショ
ンと並列で動作します。
UnregisterCallback
(IDispatch)
RegisterCallback メソッド経由で登録された OLE オートメーショ
SetCallbackEvents
(IDispatch, eventFlags)
MapBasic 11.0
ン オブジェクトを登録解除する。RegisterCallback の呼び出
しで使用されたものと同じ引数を渡す必要があります。
MapInfo Professional ではデフォルトで有効な通知メソッドがすべ
て呼び出されるが、このメソッドを使用すると、どのコールバッ
ク通知がコールバック オブジェクトに送信されるかを制御でき
る。たとえば、コールバック オブジェクトが WinContentsChanged
および SetStatusText メソッドを実装している場合に、特定の状況
で SetStatusText 通知を受け取るには、SetCallbackEvents
( <dispatch id>, CallbackEvents.WindowChanged ) を呼び出すこ
とで、ウィンドウ変更通知のみが送信されるように MapInfo
Professional に指示することができます。詳細については、次の
CallbackEvents を参照してください。
236
ユーザーズ ガイド
第 11 章: 統合マッピング
OLE オートメーション オブジェクト モデル
Application オブジェクトのメソッド (続き)
機能
メソッド名
IDispatch*
指定されたウィンドウを MapInfo Professional に登録し、ドッ
RegisterDockWindow(HWND キングされたウィンドウを表すオブジェクトを返す。このメ
hwnd, long domainId)
ソッドの呼び出し中に、ドック ウィンドウが作成され、デフォ
ルト位置にドッキングされます。Dock メソッドと Float メソッ
ドの呼び出しを使って、ウィンドウのカスタム ドッキング状態
を設定できます。
domainId 引数は、.Net コードから直接 COM API を使用してい
る場合にのみ有効です。その場合、現在の AppDomain の ID を
渡す必要があります。
void
dockWindow 引数で指定されたドック ウィンドウを登録解除す
UnregisterDockWindow(IDispat る。ドック ウィンドウが登録解除された後に DockWindow オ
ch* dockWindow)
ブジェクトの操作を試みると、エラーが発生します。
たとえば、次の文では Do メソッドを使用して MapInfo Professional に Map 文を送信します。
mapinfo.Do "Map From World"
次の文は、RunMenuCommand メソッドを使い、MapInfo Professional のグラバー ツールの選択
を行う MapInfo Professional メニュー コマンド コード 1702 を実行します (あるメニュー コードを
示す特定の数値を特定するには、MENU.DEF または「MapInfo Professional のツールバー ボタ
ンの統合 (218 ページ)」を参照してください)。
mapinfo.RunMenuCommand 1702
CallbackEvents 列挙は、次のメンバで定義されます。
•
None
•
MenuItem
•
WindowChanged
•
SetStatusTest
これらのフラグの 1 つまたは複数を SetCallbackEvents に使用できます。複数の列挙値を使用する
に は、"bitwise or" 演 算 を 行 う 必 要 が あ り ま す。た と え ば、WindowContentsChanges お よ び
SetStatusText 通 知 を オ ン に す る C++ 呼 び 出 し は、SetCallbackEvents( <dispatch id>, (int )
(WindowChanged | SetStatusText) ) です。
DockWindow オブジェクトのプロパティ
DockWindow はドック ウィンドウを表す COM インターフェイスです。次の表に、Application オ
ブジェクトに適用されるすべてのプロパティを示します。
MapBasic 11.0
237
ユーザーズ ガイド
第 11 章: 統合マッピング
OLE オートメーション オブジェクト モデル
DockWindow オブジェクトのプロパティ
プロパティ
説明
BOOL Active
ドック ウィンドウが現在表示されているかどうかを示す値を取
得する。
long id
ドック ウィンドウの数値識別子を取得する。
BOOL Closed
ドック ウィンドウが閉じられているかどうかを示す値を取得する。
DockPosition DockPosition
ドック ウィンドウの状態を示す値を取得する。この値は、フ
ローティング状態を表すか、ウィンドウがアプリケーションのど
ちら側にドッキングされているかを示す場合があります。ウィン
ドウがドッキング状態でない場合は、最後にドッキングされた位
置の値が返されます。
DockPosition の説明については、DockPosition 列挙 (240 ペー
ジ)を参照してください。
int DockSizeCX
アプリケーションの左側または右側に固定されているウィンドウ
の幅を取得する。ウィンドウがドッキング状態でない場合は、最
後にドッキングされたとき幅の値が返されます。
int DockSizeCY
アプリケーションの上または下にドッキングされているウィンド
ウの高さを取得する。ウィンドウがドッキング状態でない場合
は、最後にドッキングされたときの高さが返されます。
BOOL Floating
ウィンドウがフローティング状態かどうかを示す値を取得する。
BOOL Pinned
ドック ウィンドウがピン止めされているどうかを示す値を取得
する。ウィンドウがピン止めされている場合、そのウィンドウが
ドッキングされたアプリケーション ウィンドウのドック領域
に、ウィンドウ タイトルを示す小さなタブが表示されます。そ
のタブの上でマウスを動かすと、ドック ウィンドウがスクロー
ルして画面に表示されます。ウィンドウでの作業が終了すると、
ウィンドウが再度スクロールして画面の外に出ます。
BSTR Title
ドック ウィンドウのキャプション バーに使用される値を取得ま
たは設定する。
MapBasic 11.0
238
ユーザーズ ガイド
第 11 章: 統合マッピング
OLE オートメーション オブジェクト モデル
DockWindow オブジェクトのプロパティ
プロパティ
LastErrorCode
説明
Do、Eval、または Runommand のメソッド呼び出しの最中に発
生した最後の MapBasic エラーのコード番号を示す 2 バイト整数
値を返す。
L
ここで返されるコード番号は、対応する MapBasic エラー
コード番号に 1000 を足した数となります。
エラー コードは、決して自動的に 0 に戻ることはありません。
エラーが発生すると、そのエラーは別のエラーが発生する (また
はこのプロパティに新規値を書き込む) まで変化しません。読み
取り/書き込み可能なプロパティです。
LastErrorMessage
LastErrorCode に対応するエラー メッセージの文字列を返す。
DockWindow オブジェクトのメソッド
メソッド
説明
void Activate()
ウィンドウが表示され、フォーカスが置かれるようにする。
void Close()
ウィンドウを閉じる。Activate() を呼び出すと、ウィンドウを再
表示できます。ウィンドウを削除するには、
IMapInfo.UnregisterDockWindow を呼び出します。
void Dock(DockPosition,
cx, cy)
ウィンドウをアプリケーション ウィンドウの側面にドッキングし
ます。
DockPosition の説明については、DockPosition 列挙 (240 ペー
ジ)を参照してください。
void Float
(left, top, right, bottom)
ウィンドウのサイズと位置を決定するパラメータ値を使用して、
ウィンドウをフローティング状態にする。
void FloatSize
(*left, *top, *right, *bottom)
ウィンドウのフローティングのサイズと位置を取得する。ウィン
ドウが現在フローティング状態でない場合は、最後のフローティ
ング状態での値が返されます。
void Pin()
ドック ウィンドウをアプリケーション ウィンドウの側面にピン
止めする。
MapBasic 11.0
239
ユーザーズ ガイド
第 11 章: 統合マッピング
OLE オートメーション オブジェクト モデル
DockPosition 列挙
DockPosition 列挙は、次のメンバで定義されます。
•
PositionFloat
•
PositionLeft
•
PositionTop
•
PositionRight
•
PositionBottom
これらの列挙値は、DockWindow オブジェクトのプロパティおよびメソッドで使用できます。
MBApplications コレクションのプロパティ
MB アプリケーションは、現在 MapInfo Professional が実行中のすべての MapBasic アプリケー
ションの総称です。次の表に示すプロパティは、すべて読み取り専用です。
MBApplications コレクションのプロパティ
機能
プロパティ名
Item
特定の programobject オブジェクトの IDispatch を返す。引数は、整数イン
デックス (1...Count) を評価できる VARIANT タイプ、または文字列値 (プロ
グラム名) です。これは、MBApplications コレクションのデフォルト プロパ
ティです。
Count
コレクション内のオブジェクトに関する長い整数値を返す (例 : 実行中アプ
リケーションの数)。
Application
MapInfo Professional Application オブジェクトの IDispatch を返す。OLD 標
準プロパティ。
Parent
その親オブジェクトの IDispatch を返す。このコレクションに対しては、
MapInfo Professional Application オブジェクトのことです。OLD 標準プロパ
ティ。
MapBasic 11.0
240
ユーザーズ ガイド
第 11 章: 統合マッピング
OLE オートメーション オブジェクト モデル
MBApplications オブジェクトのプロパティ
MBApplicatios コレクション内の各オブジェクトは、実行中の MapBasic アプリケーションです。
次の表に示すプロパティは、すべて読み取り専用です。
MBApplications オブジェクトのプロパティ
機能
プロパティ名
Name
アプリケーション名 (例 : "FOO.MBX") を返す。OLD 標準プロパティ。これは、
MBApplication オブジェクトのデフォルト プロパティです。
FullName
MapBasic アプリケーションの .MBA ファイルの完全パスを返す。OLD 標準プ
ロパティ。
Application
アプリケーションの IDispatch を返す。OLD 標準プロパティ。
Parent
その親オブジェクトの IDispatch を返す。programobject に対しては、これは
MapInfo Professional アプリケーション オブジェクトのことです。OLD 標準
プロパティ。
たとえば、次の文は実行中の MapBasic アプリケーションの名前を特定します。
Dim appsList As Object
Dim firstname As String
Set appsList = mapinfo.MBApplications
If appsList.Count > 0 Then
firstname = appsList(1).Name
End If
MBApplication オブジェクトのメソッド
機能
メソッド名
Do( string )
指定された文字列が MapBasic アプリケーションの RemoteMsgHandler
プロシージャに送信される。
Eval( string )
指定された文字列が MapBasic アプリケーションの RemoteQueryHandler( )
関数に送信され、RemoteQueryHandler による戻り値が返される。
RemoteQueryHandler( ) は、文字列を返す関数として定義されなければ
なりません。式に論理値が含まれる場合、MapInfo Professional は 1 文
字から成る文字列、つまり "T" または "F" を返します。
MapBasic 11.0
241
ユーザーズ ガイド
第 11 章: 統合マッピング
OLE オートメーション オブジェクト モデル
MBGlobalsコレクションのプロパティ
MBGlobals は、実行中の特定の MapBasic アプリケーションによって宣言されたすべての MapBasic
グローバル変数の総称です。次の表に示すプロパティは、すべて読み取り専用です。
MBGlobals コレクションのプロパティ
プロパティ名
機能
Item
特定の mbglobal オブジェクトの IDispatch を返す。引数は、整数インデックス
(1...Count) を評価できる VARIANT タイプ、または文字列値 (グローバル変数名)
です。これは、MBGlobals コレクションのデフォルト プロパティです。
Count
コレクション内のオブジェクト数を長い整数値として返す (グローバル変数
の数)。
Application
MapInfo Professional アプリケーション オブジェクトの IDispatch を返す。
OLD 標準プロパティ。
Parent
その親オブジェクトの IDispatch を返す。このコレクションに対しては、
programobject オブジェクトのことです。OLD 標準プロパティ。
MBGlobals オブジェクトのプロパティ
MBGlobals コレクション内の各オブジェクトは、MapBasic のグローバル変数です。次の表に示す
プロパティは、Value プロパティを除き、すべて読み取り専用です。
MBGlobals オブジェクトのプロパティ
機能
プロパティ名
Value
読み取り/書き込み。MapBasic グローバル変数の値を表す文字列を取り出す
にはこのプロパティの読み取りを、変数値を変更するには書き込みを行いま
す。これは、MBGlobal オブジェクトのデフォルト プロパティです。
Name
変数の名前を返す。OLD 標準プロパティ。
Type
MapInfo Professional の標準タイプ (例 : 整数、日付) としての変数タイプを
示すテキスト文字列を返す。
Application
アプリケーションの IDispatch を返す。OLD 標準プロパティ。
Parent
その親オブジェクトの IDispatch を返す。MBGlobal オブジェクトに対して
は、そのグローバル変数を宣言した programobject のことです。OLD 標準
プロパティ。
MapBasic 11.0
242
ユーザーズ ガイド
第 11 章: 統合マッピング
OLE オートメーション オブジェクト モデル
次の Visual Basic の例では、MapBasic アプリケーション内にあるグローバル変数 (g_status) の値
を評価して、その変更を行います。
Dim globinfo As Object
Dim old_value As Integer
’ Look at the globals used by the first
’ running MapBasic app:
Set globinfo = mapinfo.MBApplications(1).MBGlobals
’ Look at a global’s current value by reading
’ its "Value" property:
old_value = globinfo("g_status").Value
’ Assign a new value to the global:
globinfo("g_status") = old_value + 1
Value はデフォルト プロパティであるため、globinfo("g_status") 式は
globinfo("g_status").Value と同じものを指します。
MIMapGen オブジェクトのプロパティ
次の表に、MIMapGen オブジェクトに適用されるプロパティを示します。MIMapGen オブジェク
トは主に MapInfo ProServer アプリケーションで使用されますが、MapInfo Professional アプリ
ケーションでも同様に使用できます。MIMapGen オブジェクト モデルの使用例については、
MapInfo ProServer のマニュアルを参照してください。
MIMapGen オブジェクトのプロパティ
機能
プロパティ名
Workspace
MapInfo ワークスペース ファイルへのパスを設定する。このプロパティにパ
スを設定すると MapInfo Professional はワークスペースを読み込みます。
MBApp
MapBasic アプリケーション (MBX ファイル) へのパスを設定する。このプロ
パティにパスを設定すると MapInfo Professional は MapBasic アプリケーショ
ンを実行します。
LongLat
Boolean : インターフェイスの座標系を指定する。TRUE であれば CenterX お
よび CenterY を使用して緯度/経度データとして読み込み、保存を行い、
FALSE であれば、マップ ウィンドウ座標系を使用します。
SuppressDlgs
Boolean : TRUE であれば、ダイアログを呼び出す命令がエラーになる。これ
には、Run Menu Command 文によるダイアログ ボックスの呼び出しも含ま
れます。
ImageWidth
イメージの幅をピクセルで指定する。
MapBasic 11.0
243
ユーザーズ ガイド
第 11 章: 統合マッピング
OLE オートメーション オブジェクト モデル
MIMapGen オブジェクトのプロパティ (続き)
機能
プロパティ名
ImageHeight
イメージの高さをピクセルで指定する。
CenterX
マップの中心の X 座標 (経度)。
CenterY
マップの中心の Y 座標 (緯度)。
Zoom
マップ横方向の距離 (例 : マイル数)。ここで指定した数値はマップ ウィンド
ウで使用されます (例 : マイル数、キロメートル数)。
ワークスペースに関するプロパティは MIMapGen オブジェクトを使用する前に設定してくださ
い。MIMapGen は、マップ ウィンドウが 1 つしかない場合 (例 : ブラウザに 1 つのマップが表示さ
れている場合) 専用に設計されています。MIMapGen を使用する前にワークスペースのプロパティ
を設定し、MapInfo Professional がワークスペースを読み込めるようにします (1 つだけマップ
ウィンドウが表示されているワークスペース)。その後で、マップ ウィンドウを操作するその他の
メソッドとプロパティを使用できます。
MIMapGen オブジェクトのメソッド
次の表に、MIMapGen オブジェクトに適用されるメソッドを示します。
MIMapGen オブジェクトのメソッド
機能
メソッド
ZoomCenterMap( )
現在の CenterX、CenterY、Zoom プロパティに従ってマップを描画
する。前回の描画以降に中心とズーム値が変更された場合にのみマッ
プの再描画が行われます。
RenderMap( )
ZoomCenterMap と同様だが、条件に関係なくマップを再描画する。
ZoomMap
(double ZoomFactor)
zoomFactor で指定した値にしたがってマップを拡大/縮小する。
zoomFactor が正の数であれば拡大し、負の数であれば縮小します。
ClickCenterMap
(long MouseX,
long MouseY)
マウス ボタンをクリックした位置にマップの中心を変更する。マッ
プ上の位置のピクセルは MouseX および MouseY です。
ClickCenterZoomMap
(long MouseX,
long MouseY,
double ZoomFactor)
マウス ボタンをクリックした位置にマップの中心を変更し、zoomFactor
で指定した値にしたがってマップを拡大/縮小する。zoomFactor が正の
数であれば拡大し、負の数であれば縮小します。
ClearCosmeticLayer( )
マップ メニューの [オブジェクトの削除] と同様に、システム レイヤか
らすべてのオブジェクトを削除する。
SQLUnselectAll( )
[検索] メニューと同様に、すべてのレコードの選択を解除する。
MapBasic 11.0
244
ユーザーズ ガイド
第 11 章: 統合マッピング
OLE オートメーション オブジェクト モデル
MIMapGen オブジェクトのメソッド (続き)
機能
メソッド
SearchRadius
(double CenterPointX,
double CenterPointY,
double Radius)
[半径選択] を行う。
SearchRadiusExt
(double CenterPointX,
double CenterPointY,
double OuterPointX,
double OuterPointY)
[半径選択] を行う。選択する半径を定義するには、中心点と選択する
円の半径にあたる点を指定します。
SearchPoint
(double CenterPointX,
double CenterPointY)
指定した位置の周辺を検索する。
SearchRect
(double x1, double y1,
double x2, double y2)
指定した位置の周りの長方形内を検索する。
GetTable
(string Tablename )
MISelection オブジェクト (Idispatch) を返して、テーブルの内容にア
クセスする。
ExportMap
(string ImageType,
string FileSpec)
マップ ウィンドウのイメージ ファイル (例 : JPEG、TIFF、PNG、
PSD、BMP、WMF、GIF ファイル) を生成する。MapBasic の Save
Window 文の項を参照してください。
ExportMapEx
(string ImageType,
string FileSpec,
string CopyrightInfo )
マップ ウィンドウのイメージ ファイル (例 : JPEG、TIFF、PNG、
PSD、BMP、WMF、GIF ファイル) を生成する。MapBasic の Save
Window 文の項を参照してください。
RefreshProperties( )
CenterX、CenterY、Zoom、ImageHeight、ImageWidth を更新する。
ScreenToMap
(long ScreenX,
long ScreenY,
double MapX,
double MapY )
スクリーン座標 (ピクセル) をマップ座標 (緯度/経度など) に変換する。
MapGenHandler
(string Message )
MBApp プロパティを使用して実行する MBX アプリケーションの
MapBasic サブ プロシージャ RemoteMapGenHandler を呼び出す。
このメソッドを使用すると MBX ファイルの MapBasic 文を実行でき
ます。
L
MapBasic 11.0
検索に使用されるメソッドは、レイヤの最上位にある選択可能なレイヤのみを検索しま
す。検索結果へのアクセス方法については、MISearchInfo オブジェクトの項を参照してく
ださい。
245
ユーザーズ ガイド
第 11 章: 統合マッピング
OLE オートメーション オブジェクト モデル
MISearchInfo オブジェクトのプロパティ
次の表に、MISearchInfo オブジェクトに適用されるプロパティを示します。
MISearchInfo オブジェクトのプロパティ
機能
プロパティ
Rows
MIRows コレクション (MIRow オブジェクトのコレクション) を返す。このコ
レクションは検索結果を表します。
Fields
MIFields コレクション (MIFields オブジェクトのコレクション) を返す。このコ
レクションは検索結果を示すフィールド定義 (フィールド名など) を表します。
TableName
String : 検索結果を含むテーブルの名前。
MISearchInfo オ ブ ジ ェ ク ト を 取 得 す る に は、MIMapGen オ ブ ジ ェ ク ト の search メ ソ ッ ド
(SearchRadius、SearchRadiusExt、SearchPoint、SearchRect) のいずれかを使用します。
MIRow オブジェクトのメソッド
次の表に、MIRow オブジェクトに適用されるメソッドを示します。各 MIRow オブジェクトは
search メソッドによって返された 1 レコード、または GetTable メソッドを呼び出して取得した
テーブルの 1 レコードを表します。
MIRow オブジェクトのメソッド
機能
メソッド
値
L
variant 型引数で指定したフィールドのデータ値へのポインタを返す。variant 型引数
は VT_12、VT_14 および VT_BSTR (VT_BSTR はフィールド名) です。
MIRow オブジェクトを取得するには、MISearchInfo オブジェクトまたは MISelection オブ
ジェクトの Row プロパティを参照します。
MIField オブジェクトのプロパティ
次の表に、MIField オブジェクトに適用されるプロパティを示します。各 MIField オブジェクト
は、最後に実行した検索結果に含まれるデータ フィールド、または GetTable メソッドを呼び出し
て取得したテーブルの 1 フィールド データを表します。
MapBasic 11.0
246
ユーザーズ ガイド
第 11 章: 統合マッピング
OLE オートメーション オブジェクト モデル
MIField オブジェクトのプロパティ
機能
プロパティ
Name
String : フィールド名。
Type
Short : フィールドのデータ型。以下の型が有効です。
•
(1) DT_CHAR
•
(2) DT_DECIMAL
•
(3) DT_INTEGER,
•
(4) DT_SMALLINT
•
(5) DT_TIME
•
(6) DT_LOGICAL
•
(8) DT_FLOAT.
Width
Short : フィールドの幅。DT_CHAR および DT_DECIMAL フィールドにだ
け使用できます。
DecimalPlaces
Short : DT_DECIMAL フィールドでの小数点以下の桁数。
L
MIField オブジェクトのコレクションを取得するには、MISearchInfo オブジェクトまた
は MISelection オブジェクトの Fields プロパティを参照します。
MISelection オブジェクトのプロパティ
次の表に、MISelection オブジェクトに適用されるプロパティを示します。
MISelection オブジェクトのプロパティ
機能
プロパティ
Rows
MIRows コレクション (MIRow オブジェクトのコレクション) を返す。このコ
レクションは、テーブルにあるすべてのレコードを表します。
Fields
MIFields コレクション (MIFields オブジェクトのコレクション) を返す。このコレ
クションは、GetTable メソッドで指定したテーブルのフィールド定義 (フィール
ド名など) を表します。
TableName
String : GetTable メソッドで指定したテーブルの名前。
MISelection オブジェクトにアクセスするには、MIMapGen オブジェクトの GetTable メソッドを
使用します。
MapBasic 11.0
247
ユーザーズ ガイド
第 11 章: 統合マッピング
MapInfo Professional コマンドライン引数
MapInfo Professional コマンドライン引数
DDE を使用して MapInfo Professional と通信する場合は、DDE 接続を確立する前に、まず MapInfo
Professional を手動で (例 : Visual Basic の Shell( ) 関数の呼び出しを通じて) 起動する必要がありま
す。MapInfo Professional を起動する場合は、下記のコマンドライン引数を使用できます。ユーザに
MapInfo Professional の実行を気付かれないようにするには、下記の引数のいずれかを指定します。
コマンドライン引数
効果
-nosplash
実行時にメイン ウィンドウは表示されるが、スプラッシュ
画面は表示されない。
-server
実行時にスプラッシュ画面もメイン ウィンドウも表示され
ない。MapInfo Professional を別のアプリケーションの背景
サーバ (DDE を使用) として機能させる場合は、この引数を
使用します。
-automation または embedding
実行時にスプラッシュ画面もメイン ウィンドウも表示され
ない。また、自らの OLE クラス ファクトリが OLE サブシ
ステムに登録されます。これにより、別のアプリケーショ
ンの背景 OLE サーバとして機能できるようになります。
-regserver
MapInfo Professional は、自らの OLE 機能を登録データ
ベースに登録してから終了する。MapInfo Professional をイ
ン ス ト ー ル す る と き に、こ の 引 数 を 一 度 だ け 使 用 し て
MapInfo Professional を実行します。通常どおりに実行する
と、自動的に自らの登録が行われます。ただし、これに
よってその MapInfo 製品に関するあらゆる情報 (例 : OLE
オートメーション、OLE 埋め込み) が登録される点に特に
注意してください。
-unregserver
MapInfo Professional は、登録データベース内から自らに関
する参照をすべて消去してから終了する。アンインストー
ル時にシステム レジストリから MapInfo Professional を消
去するには、このオプションを使用します。この引数を使
用すると、-regserver オプションによって登録されたす
べての情報の登録が解除されます。
-helpdiag
この引数は、ユーザがオンライン ヘルプを表示するために
F1 キーを押すたびに診断ダイアログ ボックスが表示される
ように、MapInfo の中にフラグを設定する。ヘルプの問題
の詳細については、「標準 MapInfo Professional ヘルプの
表示 (228 ページ)」を参照してください。
L
MapBasic 11.0
マイナス記号の代わりにスラッシュ ("/") を使用することもできます。
248
ユーザーズ ガイド
第 11 章: 統合マッピング
MapInfo Professional コマンドライン引数
統合マッピングおよび MFC を使用した Visual C++ の基本操作
この章の残りの部分では、MFC を使用した Microsoft Visual C++ による統合マッピング アプリケー
ションの作成について詳しく説明します。これらの説明は、主に 32 ビット Visual C++ (バージョン
2.0 以上) のユーザを対象としていますが、Visual C++ の 16 ビット バージョン (バージョン 1.52) で
もテストされています。該当箇所には、両バージョンの相違点についての記述があります。
新規プロジェクトの作成
1. Visual C++2.x (32 ビット) または 1.5x (16 ビット) を実行します。
2. [ファイル] > [新規] を選択し、新規プロジェクトを作成します。
3. そのプロジェクトを MFC AppWizard アプリケーションにして、希望のオプションを選択しま
す。初回は、複数ドキュメントをサポートするアプリケーション (SDI) ではなく、シングル ド
キュメント アプリケーション (SDI) にした方が簡単です。ここで、いずれかの標準 OLE サ
ポートを有効にする必要はありません。MapInfo Professional からアプリケーションへのコー
ルバックを使用する場合は、MFC AppWizard の 6 つのステップのうちのステップ 3 で、OLE
オートメーション サポートを有効にする必要があります。
4. アプリケーションを構築して、すべて正常に起動することを確認します。
OLE オートメーション クライアント サポートの追加
AppWizard の段階でいずれの OLE サポートも選択しなかった場合は、ここで OLE オートメーショ
ン クライアント サポートを追加する必要があります。
1. STDAFX.H を開いて次の行を追加します。
#include <afxole.h>
#include <afxdisp.h>
2. メイン プログラム ソース ファイル (projectname.CPP) を開き、次の行を
CprojectnameApp::InitInstance の最初に追加します。
if (!AfxOleInit()) {
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
3. リソース ファイル (projectname.RC) を開いてメッセージ文字列を追加し、"String Table" リソー
スを開いて [リソース] > [新しい文字列] を選択します。表示されるプロパティ ダイアログ ボッ
クスで、[ID:] を "IDP_OLE_INIT_FAILED" に設定し、[キャプション] を "OLE initialization failed.
Make sure that the OLE libraries are the correct version" に設定します。クローズ ボックスをク
リックして、プロパティ ダイアログ ボックスを閉じます。次に、リソース ウィンドウを閉じ、
プロンプトに従って変更内容を保存します。
MapBasic 11.0
249
ユーザーズ ガイド
第 11 章: 統合マッピング
MapInfo Professional コマンドライン引数
MapInfo Professional サポート クラスおよびそのインスタンスの作成
[プロジェクト] > [クラスウィザード] で、[OLE オート メーション] タブを選択し、[Read Type
Library] ボタンをクリックします。MapInfo Professional プログラム ディレクトリに移動し、
MAPINFOW.TLB ファイルを選択します。作成するクラスを確認して [OK] をクリックします。こ
れによって、OLE オートメーション インターフェイスを通じた MapInfo Professional へのアクセ
スを可能にするクラスが作成されます。
メイン プログラム ソース ファイル (projetname.CPP) を開き、次のコード行を追加します。
•
他のすべての #include の後に、次の行を追加します。
#include "MapInfow.h"
•
"CprojectnameAPP theAPP" 宣言のすぐ下に、次の変数宣言を追加します。
DMapInfo mapinfo;
•
CprojectnameAPP::InitInstance の末尾近くの OnFileNew( ) 呼び出しの前に、次の行を追加し
ます。
mapinfo.CreateDispatch("MapInfo.Application");
MAPINOW.H ファイルを開き、ファイルの末尾に次の行を追加します。
extern DMapInfo mapinfo;
#include "path-to-mapbasic-directory\mapbasic.h"
プログラムのテスト
CprojectnameApp::InitInstance 関数の末尾の、上で追加した CreateDispatch 呼び出しの直後に、
さらにもう 1 行コードを追加します。
::MessageBox(0, mapinfo.GetFullName(), mapinfo.GetName(), MB_OK);
プログラムを再構築します。プログラムを実行すると、起動時に "MapInfo Professional" のタイトル
と実行可能 MapInfo Professional ファイルへの完全パスを示したメッセージ ボックスがメッセージ エ
リアに表示されます。これは、MapInfo Professional が正常に起動されていると同時に、OLE オート
メーションを通じてアクセスされていることを表します。この操作を続けるうえで、::MessageBox
呼び出しはコメント行にするか、消去することをお勧めします。
ショートカット メニューの再定義
アプリケーションにマップを統合すると、MapInfo Professional がそのマップに提供するすべての
機能も自動的に統合されます。ただし、この機能が不都合な場合もあります。多くの場合、問題
が発生するのはデフォルトのショートカット メニュー (マップ上で右クリックしてアクセスする)
で、ここに少なくとも 1 つの不適切なコマンド (つまり [マップの複製] コマンド) が含まれること
になります。この不適切なコマンドを削除するには、ショートカット メニューを再定義します。
CprojectnameApp::InitInstance の末尾近くの、追加した CreateDispath 呼び出しの直後で、さらに
別の初期化を行います。
// disable the help subsystem: not used in this application
mapinfo.Do("Set Window Help Off");
// Reprogram the mapper shortcut menu
mapinfo.Do("Create Menu \"MapperShortcut\" ID 17 as \"(-\"");
また、今後必要となるテーブルを開くといった別の初期化も、ここで行うことをお勧めします。
MapBasic 11.0
250
ユーザーズ ガイド
第 11 章: 統合マッピング
MapInfo Professional コマンドライン引数
MapInfo Professional ダイアログ ボックスの再親化
MapInfo Professional でユーザの対応が必要となる場合に備えて、アプリケーション ウィンドウに
対する MapInfo Professional ダイアログ ボックスの再親化を行うことが重要です。これを行うこ
とで、ダイアログ ボックスがアプリケーションの前面に表示され、ユーザが MapInfo Professional
ダイアログ ボックスの操作を行っている間はアプリケーション ウィンドウが使用できなくなりま
す。1 つの文で、MapInfo Professional に表示させるダイアログ ボックス (例 : 事前定義された項
目番号を伴う RunMenuCommand を使用する) と、異常なイベントに対して MapInfo Professional
の表示するエラーおよび警告メッセージの両方の再親化が行えます。
MainFrm.CPP の CMainFrame::OnCreate 関数に対して、次の操作を行う必要があります。
•
他のすべての #include の後に、次の行を追加します。
#include "MapInfow.h"
•
CMainFrame::OnCreateの最後に、次を追加します。
char str[256];
sprintf(str, "Set Application Window %lu", (long)(UINT)m_hWnd);
mapinfo.Do(str);
正常に機能することを確認するため、CprojectnameApp::InitInstance 関数の OnFileNew( ) 呼び出
しの直後に次の文を追加します。これにより、MapInfo Professional はアプリケーションの状況に
合わせて自らの標準ダイアログ ボックスの 1 つを表示するようになります。
mapinfo.Do("Note \"Hello from MapInfo\"");
ここで、アプリケーションをテストして正しく機能するかどうかを確認してください。
ビューへのマップの追加
OLE オートメーションを通じて MapInfo Professional に接続する MFC アプリケーションが正常に
機能していることを確認した後は、MapInfo Professional の諸機能を活用することができます。具
体的に、ここではアプリケーションにマップを追加してみます。
[ プ ロジ ェ ク ト] > [ク ラ ス ウ ィ ザ ー ド] ダイアログ ボックスを表示します。ビュー クラス
(CprojectnameView) を選択し、[メッセージ マップ] タブを選択します。一番左のリストボックス
で、"CprojectnameView" オブジェクトを選択します。
[メッセージ] リストボックスの中で、"WM_CREATE" を選択して [関数の追加] をクリックしま
す。"WN_DESTROY" を選択して [関数の追加] をクリックし、"WM_SIZE" を選択して [関数の追
加] をクリックします。
ビュー ヘッダ ファイル (projectnameVW.H) の中で、ビュー クラスに次のメンバー変数を追加します。
unsigned long m_windowid;
HWND m_windowhwnd;
ビュー ソース ファイル (projectnameVW.CPP) の中に以下の行を追加します。
•
他のすべての #include の後に、次の行を追加します。
#include "MapInfow.h"
•
コンストラクタ (CprojectnameView::CprojectnameView) の中で、変数を初期化します。
MapBasic 11.0
251
ユーザーズ ガイド
第 11 章: 統合マッピング
MapInfo Professional コマンドライン引数
m_windowid = 0;
m_windowhwnd = 0;
•
OnCreate メソッドの中で、CView::OnCreate の呼び出しの後に次のコードを追加します。
//must have ClipChildren style for integratable maps to work
SetWindowLong(m_hWnd, GWL_STYLE,
GetWindowLong(m_hWnd, GWL_STYLE)
|WS_CLIPCHILDREN);
char str[256];
mapinfo.Do("Open Table \"States\" Interactive");
sprintf(str,
"Set Next Document Parent %lu Style 1 Map From States",
(long)(UINT)m_hWnd);
mapinfo.Do(str);
m_windowid = atol(mapinfo.Eval("WindowID(0)"));
sprintf(str, "WindowInfo(0, %u)", WIN_INFO_WND);
m_windowhwnd = (HWND)atol(mapinfo.Eval(str));
OnDestroy メソッドの中で、CView::OnDestroy の呼び出しの "前に" 次のコードを追加します。
if (m_windowhwnd) {
::DestroyWindow(m_windowhwnd);
m_windowhwnd = NULL;
m_windowid = 0L;
}
•
OnSizeメソッドの中で、CView::OnSizeの呼び出しの後に次のコードを追加します。
if (m_windowhwnd && cx > 0 && cy > 0) {
::MoveWindow(m_windowhwnd, 0, 0, cx, cy, TRUE);
}
マップメニューコマンドの追加
次に示すサンプル手順を実行して、あらゆるメニュー項目を追加することができます。このサン
プルでは、[マップ] > [レイヤ管理] のメニュー項目を追加する方法を示します。
1. リソース ファイル (projectname.RC) を開き、"Menu" リソースを開いて IDR_MAINFRAME を選
択します。
2. "Map" という新しいメイン メニュー項目を追加します。"Map" の下で "Layer Control" を追加し、
変更内容を RC ファイルに保存します。
3. [プロジェクト] > [クラスウィザード] で、[メッセージ マップ] タブを選択し、[クラス名] リストか
ら CprojectnameView を選択します。オブジェクト ID のリストから、作成したメニュー項目に関
連付けられた ID を選択します。この ID は、デフォルトでは ID_MAP_LAYERCONTROL となっ
ています。これを選択した後では、COMMAND メッセージおよび UPDATE_COMMAND_UI メッ
セージがメッセージ ウィンドウに表示されるようになります。それぞれのメッセージを選択して
[関数の追加] をクリックし、作成されるデフォルト名をそのまま使用して、各メッセージに対す
る関数プロトタイプを追加します。
4. CprojectnameView クラスに 2 つの関数が追加されます。関数本体に、次のコード行を追加し
ます。
MapBasic 11.0
252
ユーザーズ ガイド
第 11 章: 統合マッピング
ツールバー ボタンおよびハンドラの追加
void CprojectnameView::OnMapLayercontrol()
{
mapinfo.RunMenuCommand(M_MAP_LAYER_CONTROL);
}
void CprojectnameView::OnUpdateMapLayercontrol(CCmdUI* pCmdUI)
{
CmdUI->Enable(m_windowid);
}
ツールバー ボタンおよびハンドラの追加
下記のサンプル手順を実行して、あらゆるツールバー ボタンを追加することができます。この例
では、MapInfo Professional の選択、移動、拡大、縮小の各ツールをツールバーに追加する方法を
示します。便宜上、これらは新しく作成された [Tools] というメニューに追加されます。こうする
ことで、ClassWizard を使用したツールバーへの追加操作が若干簡単になります。
1. まず、上で説明した操作 (マップメニューコマンドの追加 (252 ページ)) に従って、4 つの新規項
目 (Selector、Grabber、Zoom-In、Zoom-Out) を持つ [Tools] という新しいメニューを作成する。
各ツールに対し、MAPBASIC.H ファイルの適切なコードを使用して UPDATE_COMMAND_UI 関
数および COMMAND 関数を前と同様に定義します (それぞれ、M_TOOLS_SELECTOR、
M_TOOLS_RECENTER、M_TOOLS_EXPAND、M_TOOLS_SHRINK)。終了後、アプリケーショ
ンをコンパイルしてテストします。
2. プロジェクト RC ファイルを開き、ビットマップ リソース IDR_MAINFRAME を選択して、そ
のビットマップの幅を 64 ピクセル (16 ピクセルのボタン 4 つ分) 大きくする。最後のいくつか
のボタンのイメージを右に寄せ、"paste" ボタンの後ろにスペースを作ります。4 つの新しい
ツールに対してそれぞれ適切なイメージを描きます。たとえば、矢印 (セレクタ)、手 (グラバ)、
虫眼鏡 (拡大)、マイナス記号の付いた虫眼鏡 (縮小) などです。
3. String リソースを開き、各新規ツールに新しい文字列を追加する。上のメニュー作成時と同様の
ID を使用します。文字列は "\n" とツールチップ テキストの続く記述文字列とします。たとえ
ば、ID_TOOLS_SELECTOR は "Select map objects\nSelector"、ID_TOOLS_GRABBER
は "Recenter the map \nGrabbber"、ID_TOOLS_ZOOMIN は "Zoom-In to show less
area, more detail\nZoom-in"、ID_TOOLS_ZOOMOUT" は Zoom-Out to show more
area, less detail\nZoom-Out" にします。
4. MAINFRM.CPP の中で、静止 UNIT BASED_CODE ボタン [ ] 配列を探し、ID 定数を配列の中
のビットマップ リソースと同じ位置に挿入する。
5. ユーザ インターフェイスが正常に機能するためには、現在選択されているツールを把握できな
ければならない。そのためには、CprojectnameView ヘッダ ファイルの中に 1 つの整数変数を
追加します。
int m_eMouseMode;
6. クラスコンストラクタの中でこの変数を初期化し、マップの初期状況を表すようにする。ここで
は、さまざまなツールのうち、選択されているツールを把握するために MapInfo Professional 定
数を使用します。
MapBasic 11.0
253
ユーザーズ ガイド
第 11 章: 統合マッピング
ツールバー ボタンおよびハンドラの追加
m_eMouseMode = M_TOOLS_SELECTOR;
7. 先にメニュー項目を作成している場合は、メッセージマップの中に COMMAND および
UPDATE_COMMAND_UI があるが、そうでない場合はここで追加する。
8. 各 OnUpdate ルーチンの中で CCmdUI::SetRadio を呼び出してユーザ インターフェイスを更新
し、それに応じて各 OnToolsToolname ハンドラの中で m_eMouseMode 変数を設定する。こ
れにより、ルーチンは次のようになります。
void CprojectnameView::OnToolsSelector()
{
m_eMouseMode = M_TOOLS_SELECTOR;
mapinfo.RunMenuCommand(M_TOOLS_SELECTOR);
}
void CprojectnameView::OnToolsGrabber()
{
m_eMouseMode = M_TOOLS_RECENTER;
mapinfo.RunMenuCommand(M_TOOLS_RECENTER);
}
void CprojectnameView::OnToolsZoomin()
{
m_eMouseMode = M_TOOLS_EXPAND;
mapinfo.RunMenuCommand(M_TOOLS_EXPAND);
}
void CprojectnameView::OnToolsZoomout()
{
m_eMouseMode = M_TOOLS_SHRINK;
mapinfo.RunMenuCommand(M_TOOLS_SHRINK);
}
void CprojectnameView::OnUpdateToolsSelector(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(m_eMouseMode == M_TOOLS_SELECTOR);
pCmdUI->Enable(m_windowid);
}
void CprojectnameView::OnUpdateToolsGrabber(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(m_eMouseMode == M_TOOLS_RECENTER);
pCmdUI->Enable(m_windowid);
}
void CprojectnameView::OnUpdateToolsZoomin(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(m_eMouseMode == M_TOOLS_EXPAND);
pCmdUI->Enable(m_windowid);
}
void CprojectnameView::OnUpdateToolsZoomout(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(m_eMouseMode == M_TOOLS_SHRINK);
pCmdUI->Enable(m_windowid);
}
MapBasic 11.0
254
ユーザーズ ガイド
第 11 章: 統合マッピング
ツールバー ボタンおよびハンドラの追加
MapInfo Professional エラー トラップのための例外処理
MapInfo Professional は、MFC COleDispatchException クラスを使用して統合マッピング アプリケー
ションにエラー条件を伝えます。MapInfo Professional は、エラー コードを COleDispatchException メ
ンバー変数 m_wCode の中で、記述文字列を COleDispatchException メンバー変数 m_strDescription の
中で返します。これ以外の OLE の一般例外は、COleException クラスを通じて渡されます。これらの
例外は、アプリケーションの中で処理する必要があります。アプリケーションの中で処理されない
と、トップレベルの MFC 例外ハンドラが呼び出され、"Command failed" というメッセージが表示さ
れます。各 DMapInfo メソッドのそれぞれの例外タイプにハンドラを追加することができます。次
に、DMapInfo::Do メソッドへの追加方法の例を示します。
ClassWizard で生成される当初の DMapInfo::Do メソッドは、次のような形になります。
void DMapInfo::Do(LPCTSTR command)
{
static BYTE BASED_CODE parms[] = VTS_BSTR;
InvokeHelper(0x6001000b, DISPATCH_METHOD, VT_EMPTY,
NULL, parms, command);
}
例外処理機能を搭載した改善版 DMapInfo::Do は、次のような形をしています。
void DMapInfo::Do(LPCTSTR command)
{
static BYTE BASED_CODE parms[] = VTS_BSTR;
try {
InvokeHelper(0x6001000b, DISPATCH_METHOD, VT_EMPTY,
NULL, parms, command);
}
catch(COleDispatchException *e) {
// Handle the exception in a manner appropriate to your
// application.The error code is in e->m_wCode.
AfxMessageBox(e->m_strDescription);
e->Delete();
}
catch(COleException *e) {
AfxMessageBox("Fatal OLE Exception!");
e->Delete();
}
}
OLEオートメーションサーバーサポートの追加
CprojectnameDoc.cpp ファイルの中で、Message マップの後に Dispatch マップを追加します。
BEGIN_DISPATCH_MAP(CprojectnameDoc, CDocument)
//{{AFX_DISPATCH_MAP(CprojectnameDoc)
//NOTE:The ClassWizard will add and remove mapping macros here
//DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_DISPATCH_MAP
END_DISPATCH_MAP()
MapBasic 11.0
255
ユーザーズ ガイド
第 11 章: 統合マッピング
ツールバー ボタンおよびハンドラの追加
CprojectnameDoc.cpp ファイルの中で、CprojectnameDoc
コンストラクタを追加します。
EnableAutomation();
AfxOleLockApp();
CprojectnameDoc.cpp ファイルの中で、CprojectnameDoc デストラクタを追加します。
AfxOleUnlockApp();
CprojectnameDoc.h ヘッダ ファイルの中で、Message マップの後に Dispatch セク
ションを追加します。
// Generated OLE dispatch map functions
//{{AFX_DISPATCH(CprojectnameDoc)
//NOTE:The ClassWizard will add and remove member functions here.
//DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_DISPATCH
DECLARE_DISPATCH_MAP()
L
上記のコード (抜粋) は、CDocument 派生クラスへのオートメーション サポートの追加を
示しています。MFC を使用すると、CCmdTarget から派生したあらゆるクラスにも、オー
トメーション サポートを同様に簡単に追加することができます。したがって、MDI アプリ
ケ ー シ ョ ン で は、い ず れ も CCmdTarget 派生クラスである CWinApp 派生クラスと
CMDIFrameWnd 派生クラスのいずれかにオートメーション インターフェイスを追加しま
す。これは、MapInfo Professional コールバック用の IDispatch ポインタを一度だけ設定す
るためです。MDI アプリケーションでは、ドキュメントが閉じるとドキュメントとその
ビューが破棄されます。ドキュメントに IDispatch ポインタを設定した場合、ドキュメント
が閉じるとポインタも無効になります。
WindowContentsChanged コールバックの追加
SDI ア プ リ ケ ー シ ョ ン の 作 成 に お い て オ ー ト メ ー シ ョ ン DISPATCH メ ッ セ ー ジ マ ッ プ を
CprojectnameDoc クラスに追加した場合は、コールバック ポインタを CprojectnameDoc コンスト
ラクタの中か、それが一度だけ呼び出されるその他のあらゆる場所で設定することができます。
mapinfo.SetCallback(this->GetIDispatch(FALSE));
[Project] > [Class Wizard] において [OLE Automation] タブを選び、OLE オートメーションが使用
可能なクラスを [Class Name] リストから選択します (この例では、皆さんの CprojectnameDoc ク
ラスです)。[Add Method] を選択し、メソッド名を "WindowContentsChanged"、戻り値タイプを
"SCODE"、引数リストを "long lWindowID" と指定します。[OK] を選択してダイアログ ボックスを
閉じると、Class Wizard によって CprojectnameDoc cpp およびヘッダ ファイルが自動的に更新さ
れます。cpp ファイルの中で、WindowContentsChanged の関数本体に適切な項目を追加し、必要
な後処理を行います。たとえば、凡例の管理はここで行うことをお勧めします。
MapBasic 11.0
256
ユーザーズ ガイド
第 11 章: 統合マッピング
その他
その他
統合マッピングの詳細については、MapBasic 開発環境に含まれるサンプル プログラムを参照して
ください。MapBasic 開発環境には、次のようなサンプル プログラムが含まれています。
•
Samples\VB\FindZip : この章で例として使用される Visual Basic プログラム。
•
Samples\VB\VMapTool : コールバックなどの高度な操作の例を示す Visual Basic プログラム。
Visual Basic4.0 Professional Edition 以降が必要です。
•
Samples\MFC\FindZip : サンプル MFC アプリケーション。
•
Samples\PwrBldr\Capitals : サンプルの 16 ビット PowerBuilder アプリケーション。実行するに
は、PowerBuilder のランタイム環境がシステムにインストールされている必要があります。
•
Samples\Delphi\TabEdMap : サンプル Delphi アプリケーション。
新しいサンプルが追加されている可能性もあるため、Samples ディレクトリ (MapBasic ディレク
トリの中にある) を確認してください。
MapBasic 11.0
257
ユーザーズ ガイド
.Net の操作
MapBasic プログラムは、Microsoft .Net 開発プラットフォームを使用して記述
された関数およびサブルーチンを呼び出すことができます。Microsoft の Visual
Studio 開発環境を使用し、C# (C-sharp) や VB.Net (Visual Basic for .Net) などの
言語でコードを記述できます。これらの .Net ルーチンを MapBasic プログラム
から呼び出すことができます。
MapBasic 言語では実行が困難なタスク、またはサポートされていないタスク
で あ っ て も、.Net で は 比 較 的 簡 単 に 行 え ることがあります。たとえば、
MapBasic の Dialog 文では、Tab コントロールや TreeView コントロールを含
んだダイアログ ボックスを作成できませんが、.Net ではそのようなダイアロ
グを簡単に作成できます。
.Net を使用してア プリケー ション の一部を記述し、記述したルーチンを
MapBasic アプリケーションから呼び出すという方法が便利な場合もあり
ます。
このセクションの構成
Š
Š
Š
Š
Š
Š
Š
.Net プログラムの概要と要件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .259
はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .259
.Net での構造の操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .264
例外処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .268
GAC ウィンドウの操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .269
.Net メソッド内からの MapInfo Professional の制御 . . . . . . . . . .270
.Net での統合マッピング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .272
12
第 12 章: .Net の操作
.Net プログラムの概要と要件
.Net プログラムの概要と要件
この章では、読者がある程度 .Net でのコードの記述方法を理解していることを前提としています。
特に、.Net でクラスを定義する方法、クラスにコンストラクタを与える方法、および Microsoft
Visual Studio 開発環境を使用して .Net 用のプロジェクトを構築する方法を理解している必要があり
ます。
MapInfo Professional および MapBasic バージョン 10 を使用し、MapBasic から .Net ルーチンを呼
び出す必要があります。
MapBasic アプリケーション (.mbx) ファイルを実行するコンピュータに、.Net Framework バー
ジョン 3.5 がインストールされている必要があります。ただし、MapInfo Professional 10 が実行さ
れるシステムでは、MapInfo Professional インストーラにより .Net Framework が (ない場合には)
インストールされるため、既に存在していると考えられます。
この章では、VB.Net および C# のコード サンプルが提供されています。この章の例は、Visual
Studio 2005 を使用して記述されました。Visual Studio 2003 以降を使用し、MapBasic で利用可能
なアセンブリを作成できます。
用語
この章では、メソッドという語は .Net で記述されたサブ ルーチンまたは関数ルーチンを示してい
ます。たとえば、VB で記述されたサブ ルーチンはメソッドの 1 つのタイプであり、VB で記述さ
れた関数は別のタイプのメソッドです。MapBasic から両方のタイプのメソッドを呼び出すことが
できます。
一部のメソッドは、最初にクラスのインスタンスを作成しなくても呼び出すことができます。こ
のようなメソッドは、C# では静的メソッドと呼ばれますが、VB.Net 構文では共有関数と呼ばれま
す。この章では、静的メソッドという用語は、最初にクラスのインスタンスを作成しなくても呼
び出すことのできるメソッドを示しています。
はじめに
このセクションでは、.Net でクラスを作成して MapBasic から使用する方法の簡単な例を示してい
ます。
.Net メソッドを MapBasic から呼び出す場合は 6 つの手順を実行します。
1. 1 つ以上の静的メソッドを含むクラスを .Net で作成します。
2. .Net クラスをアセンブリに構築します。
3. アセンブリを MapBasic アプリケーションで使用できるようにします。
4. Declare Method 文を .MB プログラムに追加します。
5. Declare Method 文で宣言したメソッドを呼び出します。
6. MapBasic アプリケーションをコンパイルして実行します。
MapBasic 11.0
259
ユーザーズ ガイド
第 12 章: .Net の操作
はじめに
.Net でのクラスの作成
まず、.Net でクラスを定義することから始めます。非常に単純なクラスで構いません。クラスに 1
つ以上の静的メソッドを含めることが主要な要件です。MapBasic プログラムは、静的な .Net メ
ソッドを 1 つのみ呼び出すことができます。
次の例は、ダイアログ ボックスに挨拶を表示する静的メソッドが 1 つ含まれている、単純なクラ
スを示しています。このメソッドは、String 引数を受け取り、整数値 (文字列内の文字数を示す) を
返します 。
このクラスを C# で記述した場合、コードは次のようになります。
using System;
using System.Windows.Forms;
namespace MapBasicMethods
{
public class Demo
{
public static int SayHello(String strName)
{
MessageBox.Show("Hello, " + strName);
return strName.Length;
}
}
}
この例のコードの大半は Visual Studio により生成されたものであり、手動で入力が必要なコード
はほとんどありません。Visual Studio で新規プロジェクトを作成する場合は、新しいクラス ライ
ブラリを定義できるプロジェクト テンプレートを選択することにより、必要なコードの大部分が
Visual Studio により生成されます。
同じクラスを VB で記述すると次のようになります。
Namespace MapBasicMethods
Public Class Demo
Public Shared Function SayHello(ByVal s As String) As Integer
System.Windows.Forms.MessageBox.Show("Hello, " + s)
Return s.Length
End Function
End Class
End Namespace
L
MapBasic 11.0
この VB の例では、名前空間がソース コードで明示的に宣言されています。VB プロジェク
トのプロパティでルート名前空間を設定している場合、VB プロジェクトによっては、ソー
ス コードに名前空間の宣言が存在しない場合があります。
260
ユーザーズ ガイド
第 12 章: .Net の操作
はじめに
SayHello メソッドは、.Net MessageBox クラスを使用して次のようなダイアログ ボックスを表示
します。
この例では、MessageBox クラスを使用しているため、プロジェクトが標準アセンブリの
System.Windows.Forms に依存しています。この例を自分で入力するときに、System.Windows.Forms
アセンブリへの参照を Visual Studio プロジェクトに追加することが必要になる場合があります。
アセンブリ ファイルの構築とコピー
クラスを記述した後で、Visual Studio を使用して .exe または .dll ファイルにクラスを構築します。
アセンブリを MapBasic アプリケーションで使用できるようにする必要があります。最も簡単な方
法は、.MBX を実行するディレクトリ、つまり、.MBX ファイルがあるディレクトリにアセンブリ
(.dll) ファイルをコピーすることです。また、.MBX ディレクトリにアセンブリをコピーする代わり
に、.Net Global Assembly Cache (GAC) にアセンブリを登録する方法もあります。アセンブリを
登録するには、Microsoft により提供されている gacutil ユーティリティを使用します。詳細につい
ては、Microsoft の .Net に関するドキュメントを参照してください。
L
MapInfo Professional では、UNC パスなどのネットワーク ロケーションから .MBX アプリ
ケーションを実行できます。ただし、.Net Framework のデフォルトのセキュリティ設定で
は、.Net アセンブリをネットワークから読み込むことは許可されていません。固有の .Net
アセンブリを MapBasic アプリケーションから呼び出す場合は、クライアント マシンから
のネットワーク経由によるアクセスではなく、クライアント マシンにアプリケーション
フ ァ イ ル を イ ン ス ト ー ル す る こ と を 検 討 し て く だ さ い。そ う で な い 場 合 は、.Net
Framework 2.0 構成ユーティリティ ([コントロール パネル] > [管理ツール]) を使用してセ
キュリティ設定を変更する必要があります。セキュリティ設定を変更する詳細な手順につ
いては、このドキュメントでは説明しません。
静的メソッドをクラス内、.Net アセンブリ内に準備できると、MapBasic から呼び出すことができ
ます。
MapBasic からのメソッドの宣言と呼び出し
.Net メソッドを MapBasic から呼び出す前に、Declare Method 文を .MB プログラムに追加する必要
があります。Declare Method 文は Declare Function 文と非常に似ていますが、Declare Method 文に
は、.Net クラスのアセンブリおよびクラス名を指定するための追加の構文が含まれています。
Declare Method 文の詳細については、MapBasic オンライン ヘルプを参照してください。次の例
では、前の例の SayHello メソッドをどのように宣言するかを示しています。
' MapBasic syntax for declaring a .Net method as a function
Declare Method SayHello
MapBasic 11.0
261
ユーザーズ ガイド
第 12 章: .Net の操作
はじめに
Class "MapBasicMethods.Demo" Lib "MBMethods.dll"
(ByVal strName As String) As Integer
この例では、メソッドを実際の名前である "SayHello" で呼び出しています。(Alias 句を使用してエ
イリアスでメソッドを参照することができますが、この例では、Alias を使用する必要はありませ
ん。Alias 句を使用するのは、同じ名前を持つ複数の関数を区別する必要がある場合です。)
ソース コードでは名前空間が "MapBasicMethods"、クラス名が "Demo" と指定されているため、
Class 句はクラス名を "MapBasicMethods.Demo" と指定します。
Lib 句は、アセンブリ ファイルの名前を "MBMethods.dll" と指定します。アセンブリ名は Visual
Studio でのプロジェクト設定に応じて異なります。
引数リストは、.Net メソッドの引数リストと一致します (1 つの値渡しの文字列引数)。
戻り値タイプは、.Net メソッドの戻り値タイプと一致します。MapBasic の "Integer" タイプは 4
バイトの整数であり、C# の "int" タイプ (System.Int32 とも呼ばれる) に相当します。
Declare Method 文を配置すると、他の MapBasic 関数と同じように .Net メソッドを呼び出すこと
ができます。次に例を示します。
' MapBasic syntax for calling a .Net method
Dim i As Integer
i = SayHello("Fred")
.Net メソッドに戻り値タイプがない場合 (関数ではなくサブである、または C# の void メソッドで
ある、など)、または単純に戻り値タイプを無視する場合は、Declare Method 文で最後の "As" 句を
省略します。次に例を示します。
' MapBasic syntax for declaring a .Net method as a function
Declare Method SayHello
Class "MapBasicMethods.Demo" Lib "MBMethods.dll"
(ByVal strName As String)
Declare Sub Main
Sub Main
Call SayHello("Fred")
End Sub
MapBasic プログラムをコンパイルして実行します。.MBX が SayHello メソッドを呼び出すと、
.Net アセンブリが読み込まれ、静的メソッドが呼び出されます。
Declare Method 文にエラー (クラス名のスペルミスなど) が含まれていると、MapBasic プログラ
ムをコンパイルすることはできますが、.MBX を実行しようとしたときにメソッド呼び出しが失敗
する可能性があります。アセンブリ名、クラス名、メソッド名、およびメソッドの引数リスト
は、実行時にメソッドを実際に呼び出すまでは検証されません。
MapBasic 11.0
262
ユーザーズ ガイド
第 12 章: .Net の操作
はじめに
Alias でメソッドを呼び出す
MapBasic プログラムでは複数のルーチンで同じ名前を使用できないため、Declare Method 文で指
定したメソッド名が MapBasic プログラムの既存の関数ルーチンまたはサブ ルーチンと同じであ
る場合、作成したプログラムはコンパイルされません。このエラーを修正するには、Alias 句を
Declare Method 文に追加します。Alias 句で、.Net メソッドの元の名前を指定し、Method キー
ワードの後ろにある fname 引数を一意の名前 (まだ使用されていない関数名など) に変更します。
次の例では、“ShowDialog” という名前で定義されている .Net メソッドを呼び出しますが、.MB
ソース コードでは “ShowPointDialog” という名前でこのメソッドを呼び出します。
Declare Method ShowPointDialog
Class "MyProduct.MyWrapper"
Lib "MyAssembly.DLL" Alias ShowDialog
() As Integer
Dim i As Integer
i = ShowPointDialog()
.Net に引数を渡す
一部の MapBasic 変数タイプ (Pen や Brush など) は、.Net メソッドに渡すことができません。次
の表は、MapBasic 変数タイプが .Net データ型とどのように対応しているかを示しています。
MapBasic タイプ
.Net タイプ
VB.NET タイプ
C# タイプ
SmallInt
System.Int16
Short
short
Integer
System.Int32
Integer
int
Float
System.Double
Double
Double
String (可変長および固定長)
System.String
String
String
Logical
System.Boolean
Boolean
bool
タイプ
(構造とも呼ばれます)
場合により異なる
(下記参照)
その他のすべての
MapBasic タイプ
利用不能
利用不能
利用不能
引数は配列タイプにすることができます。たとえば、.Net メソッドが整数値の配列である引数を
受け取る場合、Declare Method 文は次のようになります。
Declare Method ProcessIntegerArray
Class "MyProduct.MyWrapper" Lib "MyAssemblyName"
(idNumbers() As Integer)
引数は、参照渡しまたは値渡しで渡すことができます。参照渡しの構文と 値渡しの構文は、言語に
よって異なります。次の表では、String 引数を値渡しまたは参照渡しで 渡す方法を示しています。
MapBasic 11.0
263
ユーザーズ ガイド
第 12 章: .Net の操作
.Net での構造の操作
L
.Net メソッド内で MapBasic の配列変数のサイズを変更することはできません。
言語
値渡しの構文
参照渡しの構文
MapBasic
str As String
ByVal str As String
VB.Net
ByRef str As String
ByVal str As String
C#
ref String str
String str
L
MapBasic は、配列引数および構造引数の ByRef のみを渡すことができます。
パフォーマンスについて
.Net メソッドの呼び出しの速度は、引数リストを経由して渡すデータの量によって異なります。
引数として渡すデータの量が多いほど、呼び出しにかかる時間が長くなります。
.Net メソッドの実行速度が遅い場合は、引数リストで渡すデータの量を最小限に抑えてください。
.Net での構造の操作
カスタム変数タイプ (構造) を .Net に渡す
MapBasic プログラムは、構造 (Type 文を使用して作成されたカスタム変数タイプ) を .Net に渡す
ことができますが、いくつか制限があり、.Net での追加の作業が必要です。つまり、構造を表す
適切な Class 定義を .Net で作成する必要があります。
MapBasic 構造を .Net メソッドに渡す場合は、.MB コードで次の操作を行う必要があります。
1. MapBasic の Type 文を使用して MapBasic 構造を定義します (構造を .Net に渡す場合は、既に
定義されているはずです)。
2. Declare Method 文を使用して .Net メソッドを表し、MapBasic の Type をメソッド引数リスト
に含めます。
3. 構造タイプの変数を宣言し、そのフィールド値を割り当てます。
4. メソッドを呼び出し、構造変数をメソッド呼び出しに渡します。
MapBasic 11.0
264
ユーザーズ ガイド
第 12 章: .Net の操作
.Net での構造の操作
次の MapBasic コードは、3 つのフィールドを含む構造タイプを定義し、その構造タイプを .Net
メソッドに渡しています。
L
タイプ名 (この例では ParcelInfo) が Declare Method 文で使用されるため、Type 文は
Declare Method 文の前に配置する必要があります。
Type ParcelInfo
idnum
As Integer
descript As String
area
As Float
End Type
Declare Method ShowParcelDialog
Class "MapBasicMethods.Demo" Lib "MBMethods.dll"
(p As ParcelInfo)
Declare Sub Main
Sub Main
Dim p As ParcelInfo
p.idnum = 23
p.descript = "Sample parcel"
p.area = 123.45
Call ShowParcelDialog( p )
End Sub
この例では、ParcelInfo データ構造を .Net メソッドに渡します。次の疑問は、MapBasic から送ら
れるデータを受け取ることができるようにするには、.Net メソッドをどのように記述するかとい
うことです。
.Net メソッドで MapBasic から送られる構造情報を受け取る必要がある場合は、次の操作が必要
です。
1. .Net でクラスを定義します。
2. クラスにパブリック コンストラクタを与え、このコンストラクタに、MapBasic 構造内のフィー
ルドに一致する引数リストを提供します。たとえば、MapBasic 構造に整数、文字列、および浮
動小数が含まれている場合、コンストラクタの引数リストにも整数、文字列、および浮動少数を
含める必要があります (クラスには他のコンストラクタを含めることもできますが、そのような
コンストラクタは MapInfo Professional/MapBasic では無視されます)。
3. いずれかの .Net クラスの中に、パブリックな静的メソッド (MapBasic から呼び出すメソッド)
を記述します。引数をこのメソッドに追加し、引数タイプをステップ 1 で作成した Class とし
ます。
次の C# コード サンプルは、前記の ParcelInfo 構造に対応する Parcel クラスを作成する方法を示
しています。
public class Parcel
{
private int m_ID;
MapBasic 11.0
265
ユーザーズ ガイド
第 12 章: .Net の操作
.Net での構造の操作
private string m_Description;
private double m_Area;
public Parcel(int idnum, string description, double area)
{
m_ID = idnum;
m_Description = description;
m_Area = area;
}
// TODO: You will probably find it useful to create a Property
// for the ID, and for the Description, and for the Area.
// MapInfo/MapBasic do not require that Properties exist.
}
Parcel クラスの定義が完了すると、Parcel タイプの引数を受け取るパブリックな静的メソッドを
定義できます。
public static int ShowParcelDialog(Parcel parc)
{
// Here you would write code to display the
// parcel information in a dialog box...
MessageBox.Show("Hello, world");
return 0;
}
これで、MapBasic プログラムにより、ShowParcelDialog メソッドに ParcelInfo 構造を渡すことがで
きるようになりました。MapBasic プログラムが構造をメソッド呼び出しに送り、ShowParcelDialog
メソッドが適切なタイプのオブジェクトを受け取ります。MapInfo Professional では、メソッド呼び
出しを実行できるように、その構造を適切な .Net タイプに変換します (そのために、パブリック コ
ンストラクタを .Net クラスに配置する必要があります。MapInfo Professional では、MapBasic デー
タ構造を適切なタイプの .Net オブジェクトに変換するために、パブリック コンストラクタを必要と
します)。
MapBasic 構造を .Net メソッドに渡したときに呼び出しが成功するのは、引数の .Net クラスに、
MapBasic 構造内のフィールドに一致する引数を含むパブリック コンストラクタが含まれている場
合のみです。そのようなコンストラクタが存在しない場合は、メソッドを呼び出そうとすると、
MapBasic プログラムにより実行時エラーが生成されます。これが実行時エラー条件であることに
注意してください。MapBasic コンパイラでのコンパイル時に、このような種類の問題を検出する
ことはできません。
場合によっては、指定どおりに既存の MapBasic の Type 構造で開始するのではなく、既存の .Net
メソッド シグネチャで開始することもできます。既に記述されている .Net メソッドを呼び出す場
合に、この既存のメソッドで受け取る引数が System.Drawing.Point オブジェクトであるとします。
public static void ShowPointDialog(System.Drawing.Point p)
{
MessageBox.Show("p.x is: " + p.X + ", p.y is: " + p.Y);
}
このメソッドの引数は、Integer や String などの標準 MapBasic 変数タイプに一致しません。したがっ
て、このメソッドを MapBasic から呼び出す場合、.Net 引数タイプ (この場合は System.Drawing.Point)
を模倣する MapBasic 構造を定義する必要があります。次の MapBasic の例に適切な構文を示します。
MapBasic 11.0
266
ユーザーズ ガイド
第 12 章: .Net の操作
.Net での構造の操作
Type Location
ix as Integer
iy as Integer
End Type
Declare Method ShowPointDialog
Class "MyProduct.MyWrapper"
Lib "MyAssembly.DLL" (pnt As Location)
...
Dim loc As Location
loc.ix = 23
loc.iy = 42
Call ShowPointDialog(loc)
この例では、MapInfo Professional が、Point クラスでパブリック コンストラクタを呼び出すこと
により、MapBasic 構造を .Net の System.Drawing.Point オブジェクトに変換しようとしていま
す。この変換プロセスは、前の例の場合と似ていますが、重要な違いが 1 つあります。この例で
は、.Net の既存の Point クラス (Microsoft により提供されている) があるため、そのクラスを記述
する必要がありませんでした。
MapBasic Location 構造には 2 つの Integer フィールドがあるため、MapInfo Professional では、2
つの整数を受け取るパブリック コンストラクタを Point クラスで見つけようとします。MapBasic
構造のフィールドが .Net コンストラクタに渡され、.Net Point オブジェクトが作成されます。
Point オブジェクトがメソッドに渡され、呼び出しが完了します。
一部の .Net クラスにはパブリック コンストラクタがありません。たとえば、System.Drawing.Color
構造にはパブリック コンストラクタが含まれていません。したがって、System.Drawing.Color オブ
ジェクトを模倣する MapBasic 構造を定義することはできません。色情報を .Net メソッドに渡す必
要がある場合は、個別の赤、緑、および青の引数を使用します。次に、.Net メソッド内部で、これ
らの値を組み合わせて .Net の色 を形成することができます。
Public Shared Sub ShowColorDialog(ByRef r As Integer, ByRef g As Integer,
ByRef b As Integer)
Dim c As Color
Dim dlg As ColorDialog
dlg = New ColorDialog
dlg.Color = Color.FromArgb(r, g, b)
If (dlg.ShowDialog = DialogResult.OK) Then
c = dlg.Color
r = c.R
g = c.G
b = c.B
End If
End Sub
この例では、ColorDialog のようなオブジェクトをインスタンス化し、そのオブジェクトで非静的
メソッドを呼び出します。前述のとおり、MapBasic プログラム (.MB ソース コード) は、静的メ
ソッドのみ呼び出すことができますが、静的メソッド内で記述した .Net コードにはそういった制
限はありません。静的メソッド内部で、.Net コードによりオブジェクトをインスタンス化し、そ
のオブジェクトを使用して非静的メソッド (インスタンス メソッド) を呼び出すことができます。
MapBasic 11.0
267
ユーザーズ ガイド
第 12 章: .Net の操作
例外処理
構造を渡す場合の制限
MapBasic 構造を .Net に渡す場合、.Net メソッドに一意の名前を指定する必要があります。.Net
では (引数リストが異なる場合に限り) 1 つのクラスで同じ名前の複数のメソッドを持つことができ
ますが、MapBasic では制限があります。MapBasic 構造を .Net に渡す場合、名前が同じで引数の
数も同じである複数のメソッドが .Net クラスに存在していると、MapBasic ではどのメソッドを呼
び出すのかを判断できません。この状況で、.Net メソッドを呼び出そうとすると、MapBasic プロ
グラムにより実行時エラーが生成されます。このような不明瞭な状況を回避するための最も簡単
な解決方法は、構造に渡す .Net メソッドにはすべて一意のメソッド名を使用することです。
構造を .Net メソッドに渡した場合に、.Net メソッドが渡されたオブジェクトを変更しても、対応
する MapBasic 構造は変更されません。.Net メソッドによって MapBasic 引数の変数を更新できる
ようにするには、構造の代わりに “ix As Integer” などの ByRef スカラ変数を使用します。
例外処理
.Net 内 の 未 処 理 の 例 外 に よ り、MapBasic ア プ リ ケ ー シ ョ ン で 実 行 時 エ ラ ー が 発 生 し ま す
(MapBasic エラー コード 1666)。MapBasic アプリケーション内の未処理の実行時エラーがある
と .MBX が中断されます。このようなエラーはすべて処理する必要があります。.Net コードまた
は .MB コードのどちらでエラー条件を トラップするかを選択できます。
.Net エラー処理メカニズム (try-catch-finally ブロック) は、MapBasic で提供されるエラー処理より
も堅牢です。したがって、通常は、.MB プログラムに例外を伝播するのではなく、.Net コードで
例外をキャッチします。ただし、その方法を選択したくない場合、または何かの理由で .Net メ
ソッド内の例外をキャッチできない場合は、.MB プログラムで MapBasic's OnError 文を使用して
結果の実行時エラーを処理できます。
次のコードは、MapBasic のエラー トラップ構文を示しています。
Sub MakeExternalCall
OnError Goto caughtit
Call DoSomething()
g_status = 0
Exit Sub
caughtit:
' Call a .Net method
' set result code; 0 = success
' Code only comes here if method call caused an error.
if Err() = 1666 Then
' Code comes here if we called the .net method,
' but the .net method threw an unhandled exception.
' TODO: Look at Error$() to determine exact exception
g_status = -1
else
' Other Err codes might indicate that the method was
' not called, possibly due to a typo in Declare Method
Note "Check Declare Method statement.Error: " + Error$()
g_status = -2
end if
End Sub
MapBasic 11.0
268
ユーザーズ ガイド
第 12 章: .Net の操作
GAC ウィンドウの操作
GAC ウィンドウの操作
Global Assembly Cache (GAC) からアセンブリとして読み込む
Declare Method 文の Lib 句は、.Net アセンブリを識別します。アセンブリ ファイルが .MBX ファ
イルと同じディレクトリにある場合、Lib 句は単純にファイル名で ("mbtools.dll" と "mbtools" など)
アセンブリを識別します。
GAC に登録済みのアセンブリを使用する場合は、.DLL ファイルを .MBX ファイルと同じディレク
トリにコピーする必要はありません。ただし、GAC からアセンブリを参照するには、Lib 句でさら
に情報を提供する必要があります。GAC には複数のバージョンのアセンブリが含まれている可能性
があるからです。このような場合、Lib 句はアセンブリの完全修飾名を指定する必要があります。
次の例では、Microsoft の mscorlib アセンブリ内の System.IO.File.Delete メソッドを参照する方法
を示しています。
Declare Method Delete
Class "System.IO.File"
Lib "mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089"
(ByVal path as string)
GAC へのアセンブリの登録または完全修飾名の詳細については、Microsoft の .Net ドキュメント
を参照してください。
次の例は、GAC に登録されているアセンブリ内のメソッドを宣言する方法を示しています。アセ
ンブリが GAC から読み込まれる場合、Lib 句では完全修飾アセンブリ名を指定する必要がありま
す。アセンブリの完全修飾名を識別するために使用できる、さまざまなユーティリティがありま
す (Microsoft から Visual Studio の一部として提供されている gacutil ユーティリティなど)。
' Declare a method from the System.Windows.Forms.dll assembly:
Declare Method Show
Class "System.Windows.Forms.MessageBox"
Lib "System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089"
(ByVal str As String, ByVal caption As String)
' Declare a method from the mscorlib.dll assembly:
Declare Method Move
Class "System.IO.File"
Lib "mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089"
(ByVal sourceFileName As String, ByVal destFileName As String)
' Display a .Net MessageBox dialog box with both a message and a caption:
Call Show("Table update is complete.", "Tool name")
' Call the .Net Move method to move a file
Call Move("C:\work\pending\entries.txt", "C:\work\finished\entries.txt")
MapBasic 11.0
269
ユーザーズ ガイド
第 12 章: .Net の操作
.Net メソッド内からの MapInfo Professional の制御
.Net メソッド内からの MapInfo Professional の制御
MapInfo Professional インストールには、MapBasic と .Net の相互運用性をサポートする、.Net ア
センブリの miadm.dll が含まれています。このような "interop" メソッドは、.Net メソッド内から
MapBasic 文を実行するために使用できるので便利です。
たとえば、各種マップ オプションと [OK]、[キャンセル]、および [適用] の各ボタンを含む .Net の
"マップ プロパティ" ダイアログ ボックスを記述したとします。ダイアログ ボックスを次のように
使用できるとします。
1. MapBasic プログラムが .Net メソッドを呼び出して .Net ダイアログ ボックスを表示します。
2. ユーザはダイアログ ボックス内でさまざまなオプションを選択し、[適用] ボタンをクリックし
て変更を適用します。
3. MapInfo Professional のマップ ウィンドウは即座に更新されますが、ユーザが [OK] ではなく
[適用] をクリックしたため、ダイアログ ボックスは画面に表示されたままです。
4. 後で、ユーザが最終的にダイアログ ボックスを終了すると、.Net メソッドが戻ります。
マップ ウィンドウを更新するには、Set Map などの MapBasic 文を使用します。ただし、この例
では、.Net メソッドが戻る前にマップを更新するので、Set Map 文を.Net コードから実行する必
要があります。
MapInfo Professional の COM インターフェイスにより提供されるメソッドは、MapBasic 文を実
行する Do メソッドと、MapInfo Professional の状態に関する情報を取得するための Eval メソッド
です。統合マッピング アプリケーションを記述したことがあれば、Do メソッドおよび Eval メ
ソッドについて理解されていることでしょう。詳細については、「統合マッピング (210 ページ)」
を参照してください。
MapInfo.MiPro.Interop.InteropServices クラスを使用することにより、.Net プログラマは、MapInfo
Professional の メソッドと Eval メソッドに簡単にアクセスできます。InteropServices クラスには、
MapInfoApplication オブジェクトへの参照を提供する MapInfoApplication プロパティがあります。
MapInfoApplication クラスは、Do メソッドと Eval メソッドを提供します。
Do および Eval を使用する例については、MapBasic と共にインストールされるビュー名管理機能
サンプル アプリケーションを参照してください (Samples\DotNet\NamedViews を参照)。ビュー名
管理機能アプリケーションは、Eval メソッドを呼び出して、アクティブなマップ ウィンドウの
ウィンドウ ID を判断します。
private static int GetFrontWindow()
{
string evalResult =
InteropServices.MapInfoApplication.Eval("FrontWindow()");
return Int32.Parse(evalResult);
}
同様に、ビュー名管理機能アプリケーションは Do メソッドを使用して .Net コード内に Set Map
文を発行します。
MapBasic 11.0
270
ユーザーズ ガイド
第 12 章: .Net の操作
.Net メソッド内からの MapInfo Professional の制御
InteropServices.MapInfoApplication.Do(string.Format(
"Set Map Window {0} Center ( {1}, {2} ) Zoom {3}",
windowId, centerX, centerY, mapperZoom));
MapInfo.MiPro.Interop.InteropServices クラスを使用する前に、.Net プロジェクトに miadm.dll ア
センブリへの参照を含める必要があります。このアセンブリは、MapInfo Professional インストー
ル ディレクトリにあります。
L
ビュー名管理機能サンプル プロジェクトを構築しているときにエラーが発生した場合は、
アセンブリの現在の場所が指定されるようにするために、Visual Studio プロジェクトの
miadm.dll 参照の再作成が必要になることがあります。
MapInfoApplication クラスはラッパー クラスです。このクラスにより、.Net プログラマは MapInfo
Professional の COM インターフェイスに簡単にアクセスできます。このクラスは、COM イン
ターフェイスを直接操作するのではなく、標準 .Net クラスを経由してメソッド、プロパティ、お
よびイベントにアクセスするための便利な機能として提供されています。前述の Do メソッドと
Eval メソッドの提供以外に、MapInfoApplication クラスは次に示すプロパティやイベントも提供し
ています。
MapInfoApplication メンバ
メソッド
Do
MapBasic ウィンドウで入力した場合と同様に MapBasic 文を実行します。
Eval
MapBasic 式を評価し、結果を文字列として返します。
プロパティ
FullName
アプリケーション実行可能ファイルへの完全パスを取得します。
LastErrorCode
Do メソッドまたは Eval メソッドの呼び出しで発生した最後の MapBasic エラーを表す整
数を取得します。
LastErrorMessage
LastErrorCode に関連付けられたエラー メッセージを取得します。
Name
アプリケーション名を取得します。
Version
バージョン番号を 100 倍した値であるバージョン番号文字列を取得します。
MapBasic 11.0
271
ユーザーズ ガイド
第 12 章: .Net の操作
.Net での統合マッピング
イベント
MenuItemClick
Calling OLE "MenuItemHandler" という構文でユーザがカスタム メニュー項目を選択した場
合に発生します。
StatusBarTextChanged
MapInfo Professional のステータス バーのテキストが変更された場合に発生します。
WindowContentsChanged
マップ ウィンドウの内容が変更された場合 (マップが拡大縮小された場合など) に発生し
ます。
.Net での統合マッピング
統合マッピングは、MapInfo Professional の代わりに起動できる固有のアプリケーション ("クライ
アント" アプリケーション) を記述するためのアプリケーション アーキテクチャです。記述した固
有のアプリケーションは、MapInfo Professional をバックグラウンドで静かに起動し、そのアプリ
ケーションのユーザー インターフェイス内に MapInfo マップを表示できます。
次のセクションでは、.Net を使用して統合マッピング アプリケーションを記述する方法について
説明します。統合マッピングの概念および規則の全般的な解説については、「統合マッピング」
の章を参照してください。
MapBasic インストールには、サンプルの .Net 統合マッピング アプリケーションが含まれていま
す (samples\DotNet\IntegratedMapping を参照)。このセクションの内容については、このサンプル
アプリケーションが参考になります。
COM 経由での MapInfo Professional へのアクセス
統合マッピング アプリケーションでは、MapInfo Professional の COM インターフェイスを使用し
ます。使用する前には、参照を Visual Studio プロジェクトに追加する必要があります。
1. Visual Studio プロジェクトを作成します。
2. ソリューション エクスプローラ ウィンドウで、参照フォルダを右クリックし、[参照の追加] を
選択します。
3. [参照の追加] ダイアログ ボックスで、[COM] タブをクリックします。
4. [MapInfo 10.0 OLE Automation Type Library] をクリックし、[OK] をクリックします。
Visual Studio により、MapInfo Professional の COM インターフェイスにアクセスするための .Net
ラッパー クラスを提供する mapinfo.interop.dll が生成されます。これで、アプリケーションは
MapInfoApplication クラスを参照できるようになりました。サンプル アプリケーションでは、この
クラスは MapForm.InitializeComObject メソッドの冒頭で初期化されます。
_mapInfoApp = new MapInfoApplication();
MapBasic 11.0
272
ユーザーズ ガイド
第 12 章: .Net の操作
.Net での統合マッピング
_mapInfoApp オブジェクトが初期化されると、その Do メソッドを使用して MapBasic 文を実行す
るか (MapInfo Professional の MapBasic ウィンドウで文を入力することと同じ)、または Eval メ
ソッドを使用して MapInfo Professional から情報を取得することができます。
特に、Do メソッドを使用して次の MapBasic 文を実行します。
1. Set Application Window -- MapInfo ダイアログをクライアント アプリケーションで使用でき
るようにします。
2. Open Table -- この文により MapInfo テーブルが開かれます。
3. Set Next Document Parent -- MapInfo Professional で、次に開かれる Map ウィンドウが "再親
化" される (クライアント アプリケーションに表示される) ようにします。
4. Map From -- この文により Map ウィンドウが作成されます。
サンプル アプリケーションは、このような文を使用する例を示しています。たとえば、MapForm ク
ラスで Do メソッドの呼び出しを検索します。
コールバック メソッド
場合によっては、統合マッピング アプリケーションでコールバック メソッドを提供する必要があ
ります。アプリケーションで特定のイベントが発生するたびにコードを実行する必要がある場
合、たとえば、ユーザによってマップが変更されるたびにコードを実行する必要がある場合は、
イベントが発生するたびに MapInfo Professional でコールバック メソッドが呼び出されるよう
に、コールバック メソッドを設定する必要があります。
MapInfo Professional により、次のコールバック メソッドが呼び出されます。
•
WindowContentsChanged メソッドは、マップ ウィンドウの内容が変更されるたびに
MapInfo Professional に呼び出されます (レイヤが追加または削除された場合など)。
•
SetStatusText メソッドは、MapInfo Professional ステータス バーのテキストが変更されるよ
うな処理が発生するたびに、MapInfo Professional に呼び出されます。
•
カスタム OLE メニュー項目にはハンドラ メソッドがあります。このハンドラ メソッドの名前
は、クライアント アプリケーションで指定されます。サンプル アプリケーションは、1 つのカ
スタム OLE メニュー項目を定義し、MenuItemHandler をハンドラ名として指定します。この
メソッド名は、カスタム メニュー項目を定義する MapBasic 文にも表示されます (Create
Menu 文または Alter Menu...Add 文)。
サンプル アプリケーションでは、このようなコールバックは IMapInfoCallback インターフェイスで
表されます。C# バージョンのインターフェイス (MapInfoCallback.cs) は、次のようになります。
public interface IMapInfoCallback
{
// Method called by MapInfo Professional when window changes
int WindowContentsChanged(UInt32 windowID);
// Method called by MapInfo Professional when the status bar text
changes
int SetStatusText(string message);
MapBasic 11.0
273
ユーザーズ ガイド
第 12 章: .Net の操作
.Net での統合マッピング
// Method called by MapInfo Professional when user chooses custom OLE
menuitem
void MenuItemHandler(string commandInfo);
}
Visual Basic バージョンのインターフェイス (MapInfoCallback.vb) は、次のようになります。
Public Interface IMapInfoCallback
' Method called by MapInfo Professional when window changes
Function WindowContentsChanged(ByVal windowID As UInt32) As Integer
' Method called by MapInfo Professional when the status bar text
changes
Function SetStatusText(ByVal message As String) As Integer
' Method called by MapInfo Professional when user chooses custom OLE
menuitem
Sub MenuItemHandler(ByVal commandInfo As String)
End Interface
同じソース コード モジュールには MapInfoCallback クラスが含まれています。このクラスは、
IMapInfoCallback インターフェイスを実装する方法を示します。MapInfoCallback クラスには、
COM 可視としてクラスをマークする属性があるので、MapInfo Professional はメソッドを呼び出
すことができます。クラス属性の C# 構文は次のようになります。
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class MapInfoCallBack : IMapInfoCallback
クラス属性の VB バージョンは次のようになります。
<ClassInterface(ClassInterfaceType.None)> _
<ComVisible(True)> _
Public Class MapInfoCallBack
Implements IMapInfoCallback
IMapInfoCallback インターフェイスが定義されているのと同じファイルに、ICallbackNotify とい
う 2 つ目のインターフェイスがあります。このインターフェイスを Windows Forms アプリケー
ションに実装します。サンプル アプリケーションでは、このインターフェイスは MapForm.cs ま
たは MapForm.vb に実装されます。
イベントにより、MapInfo Professional でコールバック (IMapInfoCallback) クラスを呼び出すこと
ができます。呼び出されたクラスは、クライアント (ICallbackNotify) クラスに通知します。さまざ
まなインターフェイス メソッドを呼び出す方法とタイミングを詳しく理解するには、次の一連の
イベントについて考慮してください。
1. ユーザが統合マッピング クライアント アプリケーションを実行し、そのアプリケーションによ
り MapInfo Professional が静かに起動されます。サンプル アプリケーションでは、この操作が
MapForm.InitializeComObject により実行されます。このメソッドにより、MapInfo Professional
が起動され、コールバック オブジェクトがインスタンス化され、コールバック オブジェクトが
MapInfo Professional に登録されます。
private void InitializeComObject()
MapBasic 11.0
274
ユーザーズ ガイド
第 12 章: .Net の操作
.Net での統合マッピング
{
// Create the MapInfo Professional object
_mapInfoApp = new MapInfoApplication();
// Set parent window for MapInfo Professional dialogs
_mapInfoApp.Do("Set Application Window " + this.Handle);
// Create the callback object
_callbackObject = new MapInfoCallBack(this);
// Register the callback object with Professional
_mapInfoApp.RegisterCallback(_callbackObject);
}
2. クライアント アプリケーションは、MapInfoApplication.Do メソッドを呼び出して、テーブルおよび
マップ ウィンドウを開きます。サンプル アプリケーションでは、この操作は MapForm.NewMap
メソッドで実行されます。このメソッドは、ユーザが [ファイル] > [開く] をクリックして 1 つ以上
のタブ ファイルを開いたときに呼び出されます。
3. ユーザがマップを変更します。サンプル アプリケーションでは、ユーザはマップ ウィンドウの
右クリック メニューで [レイヤ管理] を選択し、次にダイアログ ボックスを使用してマップを変
更することができます。MapInfo Professional は、[レイヤ管理] ウィンドウ を管理します。
4. マップが変更されているため、MapInfo Professional は MapInfoCallback.WindowContentsChanged
メソッドを呼び出すことによりクライアント アプリケーションに通知します。
5. WindowContentsChanged メソッドは MapForm.OnWindowContentsChanged メソッドを呼
び出します。このメソッドに含まれるコードは、アプリケーションの目的に応じて異なりま
す。たとえば、アプリケーションのステータス バーやその他のフォーム内にマップに関する情
報を表示する場合は、フォームを OnWindowContentsChanged メソッドで更新する必要があ
ります。
6. アプリケーションにカスタム OLE メニュー項目が含まれている場合、MapInfo Professional で
は、ユーザがそのメニュー項目を選択するたびにメニュー項目のハンドラ メソッドを呼び出し
ます。サンプル アプリケーションでは、Alter Menu 文により項目がマップのコンテキスト メ
ニューに追加され、ハンドラ名として "MenuItemHandler" が指定されます。したがって、ユー
ザがカスタム メニュー項目を選択すると、MapInfo Professional では MenuItemHandler メ
ソッドを呼び出します。このメソッドは、MapForm.OnMenuItemClick メソッドを呼び出し
ます。OnMenuItemClick メソッドに含まれるコードは、カスタム メニュー項目の目的に応じ
て異なります。
7. MapInfo Professional のステータスのテキストが変更されるような操作をユーザが実行するた
びに (たとえば、選択を行うためにマップをクリックした場合など)、MapInfo Professional は
MapInfoCallback.SetStatusText メソッドを呼び出します。このメソッドは、
MapForm.OnStatusBarTextChanged メソッドを呼び出します。クライアント アプリケー
シ ョ ン の ス テ ー タ ス バ ー を MapInfo Professional のステータス バーのようにするには、
OnStatusBarTextChanged メソッドにコードを追加してステータス バーを更新することができ
ます。
8. 終了時に、コールバック オブジェクトを登録解除します。サンプル アプリケーションでは、
この操作が FormClosed により実行されます。
MapBasic 11.0
275
ユーザーズ ガイド
第 12 章: .Net の操作
.Net での統合マッピング
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
// Unregister the callback object
MapInfoApp.UnregisterCallback(_callbackObject);
}
サンプル アプリケーションは、1 つのカスタム OLE メニュー項目を定義します。アプリケーション
で複数の OLE メニュー項目を定義する場合は、メニュー項目がそれぞれ指定のハンドラ メソッドを
呼び出すように設定できます。または、すべての OLE メニュー項目が同じハンドラ メソッドを呼び
出すようにすることもできます。ただし、そのように設定した場合は、カスタム メニュー項目に ID
番号を付ける必要があります (Create Menu 文または Alter Menu...Add 文に ID 句を含める)。これに
より、ハンドラ メソッドは、ユーザがどのメニュー項目を選択したのかを判断できます。
MapInfoCallback クラスは再利用できます。異なる統合マッピング アプリケーションをいくつか記
述し、それぞれのアプリケーションで同じ MapInfoCallback クラスを使用することができます。
スレッド セーフティ問題
サンプルの MapInfoCallback クラスを理解するには、最初に、マルチスレッドが Windows Forms
ユーザ インターフェイスに与える影響について理解する必要があります。Windows Forms ユーザ
インターフェイスを操作するコードを実行する場合、たとえば、フォームのステータス バーに表
示されるテキストを変更する場合は、ユーザ インターフェイスの作成に使用されたものと同じス
レッドでコードが実行されることを確認する必要があります。
コールバック メソッドが、ユーザ インターフェイスの作成に使用されたものとは別のスレッドで
実行されることがよくあります。したがって、コールバック メソッドは、ユーザ インターフェイ
スに影響を与えるコードを実行する前に、必ず、スレッド セーフティ問題を検出して修正する必
要があります。
Windows Forms Control クラスは、InvokeRequired プロパティを提供します。InvokeRequired が
true である場合は、現在のスレッドが Control を更新するための正しいスレッドではないことを示
します。この場合は、Control.Invoke メソッドを使用して変更を Control に適用する必要がありま
す。Invoke メソッドにより、変更を適切なスレッドに確実に適用することができます。
たとえば、サンプルの MapInfoCallback.SetStatusText メソッドには次のコードが含まれていま
す。このコードにより、ステータス バーに加えられる変更がすべて適切なスレッドで発生するこ
とを保障できます。
if (_callbackClient.InvokeRequired)
{
_callbackClient.Invoke(this._onStatusBarTextChangedDelegate, new
Object[] { text });
}
else
{
_callbackClient.OnStatusBarTextChanged(text);
}
MapBasic 11.0
276
ユーザーズ ガイド
第 12 章: .Net の操作
.Net での統合マッピング
InvokeRequired プロパティおよび Invoke メソッドにアクセスするために、_callbackClient オブ
ジェクト (ICallbackNotify を実装するオブジェクト) を使用していることに注意してください。サ
ンプル アプリケーションでは、Form クラスが ICallbackNotify オブジェクトの役割を果たします。
public partial class MapForm : Form, ICallbackNotify
サンプル アプリケーションでは、_callbackClient メンバは MapForm への参照です。Form クラス
は Control から派生しているため、_callbackClient.Invoke を呼び出すことができます。
L
MapBasic 11.0
不適切なスレッドから呼び出される可能性があるので、デストラクタ メソッドでコールバッ
ク登録解除の操作を行わないでください。
277
ユーザーズ ガイド
サンプル プログラム
MapBasic ソフトウェアには、次のサンプル プログラム ファイルが含まれて
います。
L
このマニュアルの作成時以降に新しいサンプルが追加されている
可能性もあります。
この付録の構成
Š
Š
Š
Š
Š
Š
Š
Š
Samples\Delphi ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . .279
Samples\DLLEXAMP ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . .279
Samples\DotNet ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . .279
Samples\MapBasic ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . .279
Samples\MFC ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .286
Samples\PwrBldr ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . .286
Samples\VB4 ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .286
Samples\VB6 ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .286
A
付録 A: サンプル プログラム
Samples\Delphi ディレクトリ
Samples\Delphi ディレクトリ
tabmap : Delphi を使用して MapInfo Professional を OLE サーバとして実行します。
Samples\DLLEXAMP ディレクトリ
Samples\DLLEXAMP\Loadlib ディレクトリ
loadlib : Win16 または Win32 用にコンパイルできる C 言語 DLL のソース コードと、DLL 内の関数
を実行する MapBasic で作成されたテスト プログラムが入っています。
Samples\DLLEXAMP\ResDLL ディレクトリ
Win16 と Win32 の互換性を確保するための手法を示すサンプル プログラムが入っています。
Samples\DotNet ディレクトリ
Samples\DotNet\HelloWorld ディレクトリ
.Net メソッドを MapBasic から呼び出す単純な例 (C# バージョンと VB.Net バージョン)
Samples\DotNet\IntegratedMapping ディレクトリ
.Net で記述された統合マッピング クライアント アプリケーション (C# バージョンと VB.Net バー
ジョン)
Samples\DotNet\NamedViews ディレクトリ
ビュー名管理機能 MapBasic ツール。XML ファイルおよびダイアログ ボックスのマッピングのた
めに .Net を使用します (C# バージョンと VB.Net バージョン)。ビュー名管理機能アプリケーショ
ンにより、後でマップ ビューに戻るためのブックマークとして機能する名前付きビューを定義で
きます。
Samples\MapBasic ディレクトリ
Samples\MapBasic\ ディレクトリには、サンプル プログラム ファイルを含むサブディレクトリが
含まれます。各サブディレクトリの内容について、以降のセクションで説明します。
Samples\MapBasic\Animator ディレクトリ
Animator.mb : アニメーション レイヤによってマップ ウィンドウの再描画を高速化する例を示します。
MapBasic 11.0
279
ユーザーズ ガイド
付録 A: サンプル プログラム
Samples\MapBasic ディレクトリ
Samples\MapBasic\Appinfo ディレクトリ
AppInfo.mb : 実行中の MapBasic アプリケーションに関する情報を取得します。
Samples\MapBasic\Autolbl ディレクトリ
AutoLbl.mb : システム レイヤ内にテキスト オブジェクトを配置することでマップの "ラベル" を作成
します (以前のバージョンの MapInfo Professional によるラベル作成をエミュレートしたものです)。
Samples\MapBasic\Cogoline ディレクトリ
COGOLine.mb : 特定の長さおよび角度でラインを描画します。
Samples\MapBasic\Coordinateextractor ディレクトリ
Coordinateextractor.mb : テーブル内の各オブジェクトについて、テーブルの本来の投影法または
ユーザが選択した投影法の x 座標と y 座標で 2 つのフィールドを更新します。
Samples\MapBasic\Csb ディレクトリ
CoordSysBounds.mb : マップ作成可能な任意の MapInfo 基本テーブルの座標系の境界をチェック
および設定できます。
Samples\MapBasic\Database ディレクトリ
Autoref.mb : リンク テーブルを (Interval) 秒ごとにリフレッシュします。
BuildSQL.mb : DBMS データベースへの接続、クエリの作成、保存、読み込み、クエリとプレ
ビューの実行、および結果のダウンロードを実行できます。
Connect.mb : MapInfo DBMS 接続の [接続マネージャ] ダイアログ ボックスおよびその関連機能を
提供します。接続マネージャを使用すると、使用する既存接続の選択、既存接続の解除、および
新規接続の取得を行うことができます。
DescTab.mb : テーブルを指定すると、そのテーブルに関する説明のダイアログ ボックスを表示す
るデータリンク ユーティリティ関数を提供します。
DLSUtil.mb : ダイアログ ボックス リスト コントロール処理用の選択インデックスのリスト値を返し
ます。
GetMITab.mb : MapInfo Professional テーブル選択ダイアログ ボックス。
MIODbCat.mb : MapInfo Professional ツール マネージャから読み込まれる DBMS カタログ機能ツー
ル。このツールを使用すると、データベース管理者は MAPINFO_MAPCATALOG テーブルによって
MapInfo Professional ユーザを作成できます。カタログからテーブルを削除することもできます。
MIRowCnt.mb : MapInfo Professional ツール マネージャから読み込まれる DBMS テーブル内行数
カウント機能ツール。このツールを使用すると、DBMS データベースに接続してテーブルに
count(*) を実行し、その結果を基に mapcatalog を更新することができます。
MapBasic 11.0
280
ユーザーズ ガイド
付録 A: サンプル プログラム
Samples\MapBasic ディレクトリ
mbMISetMBR.mb : MapInfo Professional ツール マネージャから読み込まれる CoordSysBounds
ツール。データベース管理者はこのツールを使用して、MapInfo_MAPCATALOG テーブル内の
テーブルの境界を変更できます。
MIUpldDB.mb : デ ー タ ベ ー ス 固 有 の SQL 文を生成する機能を提供します。これによって、
MapInfo テーブルをアップロードできます。
MIUpLoad.mb : MapInfo Professional ツール マネージャから読み込まれる SQL Server テーブルの
空間化ツール。このツールは、MapInfo テーブルを空間フィールド情報とともにリモート データ
ベースにアップロードする機能を提供します。空間フィールドは DBMS リンク テーブルで使用さ
れます。これによって、リモート データベース テーブルが MapInfo Professional でマップ作成可
能になります。
PickCol.mb : サーバ テーブル フィールドの選択ダイアログ ボックスを提供します。
PickSel.mb : BuildSQL.mbx の一部として選択ダイアログ ボックスを提供します。
PickTab.mb : サーバのデータベース テーブルおよびテーブルの所有者 (スキーマ) のリストを取得
する関数を提供します。テーブル選択ダイアログ ボックスを提供する一般関数も含まれます。
PrepSQL.mb : クエリ パラメータを処理する SQL Query の prepare 関数を提供します。パラメー
タはここでバインドされます。つまり、解決された値に置き換えられます。
SQLPVW.mb : 特定の形式を持つ埋め込みパラメータを使って SQL クエリ文字列を指定すると、
各パラメータが値に解決され、解決された SQL クエリ文字列が返されます。
SQLUtil.mb : Mapinfo から ODBC データにアクセスするための数多くのユーティリティ関数を提
供します。
SQLView.mb : VALUE を除くすべてのオプションについて SERVER_COLUMNINFO 関数をテス
トするための SQL データリンク アプリケーションを提供します。
Samples\MapBasic\Disperse ディレクトリ
disperse.mb : 指定された座標のポイントを取得し、ランダムに、または体系的に分散させます。
Samples\MapBasic\DistanceCalc
距離計算ツール (DistanceCalc.MBX) では、選択したオブジェクト (またはオブジェクトのグルー
プ) から最も近い (または遠い) オブジェクトまでの距離を計算することができます。条件を指定し
て、出力結果を絞り込むこともできます。
Samples\MapBasic\DMSCnvrt ディレクトリ
DMSCnvrt.mb : 度/分/秒の座標フィールドと小数度座標フィールドの変換を行います。
Samples\MapBasic\Geoset ディレクトリ
Geoset.mb : MapInfo Professional のマップ ウィンドウのレイヤおよび設定から MapX Geoset ま
たは MapXtreme Geoset を作成したり、MapX Geoset ファイルまたは MapXtreme Geoset ファイ
ルを読み取って対応するテーブルおよびレイヤ設定を MapInfo Professional のマップ ウィンドウ
に読み込んだりできます。
MapBasic 11.0
281
ユーザーズ ガイド
付録 A: サンプル プログラム
Samples\MapBasic ディレクトリ
Samples\MapBasic\GridMakr ディレクトリ
GridMakr.mb : 経線/緯線のグリッド (経緯線網) を作成します。
Samples\MapBasic\HTMLImageMap ディレクトリ
HTMLImageMap.mb : Web ブラウザで使用するクリック可能 HTML イメージ マップを MapInfo
Professional マップ ウィンドウから作成します。
Samples\MapBasic\IconDemo ディレクトリ
IconDemo.mb : MapInfo Professional であらかじめ用意されているボタンパッド アイコンの動作を
示します。
Samples\MapBasic\Inc ディレクトリ
inc : MapBasic 環境でプログラミングする際に便利な Include ファイルが含まれます。
以下のようなファイルがあります。
•
MapInfo Professional とともにインストールされるさまざまな MapBasic ツールによって使用され
る定義 (.DEF) ファイル。AUTO_LIB.DEF はツール マネージャ登録システムで、RESSTRNG.DEF
はツールの文字列翻訳モジュールで、それぞれ必要になります (どちらも \LIB ディレクトリに格
納されています)。
•
MAPBASIC.DEF には、汎用マクロ、論理定数、角度変換、色、および文字列長の定義が含まれ
ます。これらの定義は、様々な MapBasic 関数の入力として使用されます。
•
•
MENU.DEF には、MapInfo Professional のダイアログ ボックス、ツールバー、およびメニュー
項目へのアクセスや変更に必要な定義が含まれます。
MAPBASIC.H は、MAPBASIC.DEF および MENU.DEF の C++ バージョンです。
•
MAPBASIC.BAS は、MAPBASIC.DEF および MENU.DEF の Visual Basic 6.0 バージョンです。
Samples\MapBasic\Labeler ディレクトリ
labeler.mb : レイヤ ラベルのテキスト オブジェクトへの変換や現在の選択のラベル作成を行えるほ
か、ラベル ツールを使用して個々のオブジェクトをテキスト オブジェクトに変換できます。
Samples\MapBasic\Legends ディレクトリ
Legends.mb : MapInfo Professional で 2 つ以上の凡例ウィンドウを管理できるようにします。
(MapInfo Professional の標準ユーザ インターフェイスでは、凡例ウィンドウを 1 つしか使用でき
ません。)
Samples\MapBasic\Lib ディレクトリ
lib : MapBasic 環境でプログラミングする際に便利な関数とサブルーチンのライブラリが含まれ
ます。
これらのファイルのうち、特に次の 2 つは、MapInfo Professional とともにインストールされる数
多くの MapBasic ツールによって使用されます。
MapBasic 11.0
282
ユーザーズ ガイド
付録 A: サンプル プログラム
Samples\MapBasic ディレクトリ
•
•
AUTO_LIB.MB は、ほぼすべてのツールが Tools ディレクトリに登録されるときに、そのツー
ルによって使用されます。
RESSTRNG.MB は、翻訳されたツールがツールの .STR ファイルで適切な言語文字列を検索す
るときに使用されます。
Samples\MapBasic\Linesnap ディレクトリ
linesnap.mb : 単一セグメントのラインを、選択した別のラインとの交差点でカットしたり、交差
点まで拡張したりできます。
Samples\MapBasic\Mapwiz ディレクトリ
mapwiz.mb : ツール マネージャ アプリケーションの作成で使用するテンプレートを提供します。
Samples\MapBasic\NorthArrow ディレクトリ
northarrow.mb : 方位記号を作成する MapBasic プログラムです。
Samples\MapBasic\Packager ディレクトリ
packager.mb : ワークスペースのコピーを 1 つのディレクトリにパッケージ化します。これによっ
て、バックアップ、圧縮、およびコンピュータ間での転送が簡単になります。
Samples\MapBasic\Regvector ディレクトリ
regvector.mb : ベクトル オブジェクト (リージョン、折れ線、ポイントなど) のテーブルをある場所
から別の場所にコピーできます。この操作は、元のテーブルの 3 つのポイントをコピー先に指定
することによって行います。
Samples\MapBasic\RingBuffer ディレクトリ
ringbuf.mb : 複数の "ドーナツ" リング バッファを作成できます。また、各リング内の基本データの
合計と平均を計算します。
Samples\MapBasic\RMW ディレクトリ
rotatemapwindow.mb : 現在のマップ ウィンドウの内容を指定した角度で回転できます。
Samples\MapBasic\RotateLabels ディレクトリ
rotatelabels.mb : ラベルを回転できます。
Samples\MapBasic\RotateSymbols ディレクトリ
rotatesymbols.mb : テーブル内のシンボルを回転できます。
Samples\MapBasic\SeamMgr ディレクトリ
seammgr.mb : シームレス マップ テーブルの作成と管理を行います。
MapBasic 11.0
283
ユーザーズ ガイド
付録 A: サンプル プログラム
Samples\MapBasic ディレクトリ
Samples\MapBasic\Send2mxm ディレクトリ
send2mxm.mb : カスタムな MapX Geoset とその .tab ファイルを作成して、モバイル デバイスに
表示するマップ ウィンドウの背景データのユーザ定義サブセットを作成できます。
Samples\MapBasic\Shields ディレクトリ
Shields.mb : テキスト オブジェクトの周囲に装飾的な枠を描画します。このアプリケーションは、
マップ ラベルではなく、テキスト オブジェクトに対してのみ機能することに注意してください。
Samples\MapBasic\Snippets ディレクトリ
MapInfo カスタム アプリケーションに統合できるサンプル プログラムやコード スニペットが含ま
れます。
L
このディレクトリには、サンプル コード スニペットだけでなく、MapInfo Professional ツー
ル マネージャとともにインストールされる 3 つのツールも含まれます。そのツールとは、
ビュー名管理ツール (NVIEWS.MBX)、マップ概要表示機能ツール (OVERVIEW.MBX)、およ
びスケール バー作成機能ツール (SCALEBAR.MBX) です。
acad.mb : DDE を使用して Windows 版 AutoCAD と通信します。
addnodes.mb : オブジェクトにノードを追加します。このツールはマップを投影する場合に便利で
す。大きなリージョンの端が長い直線の場合、追加したノードによって、リージョンとリージョ
ンの間にスライバが表示されるのを防ぎます。
geocode.mb : MapBasic を使用してジオコード化を行う方法を示します。
geoscan.mb : テーブルを走査してジオコード化のヒット率を予測します。
get_tab.mb : これは完全なアプリケーションではなく、モジュールです。get_tab には、開いてい
るテーブルのリストをユーザに示すためのダイアログ ボックスを表示するルーチンが含まれてい
ます。get_tab ルーチンの使用例については、OverView プログラムを参照してください。
nviews.mb : 現在のマップの "ビュー" (現在の中心点およびズーム距離) を表す名前を入力できる、
ビュー名管理機能アプリケーションを作成します。ビューが定義された後は、[ビュー名管理機能]
ダイアログ ボックス内の名前をダブルクリックすると、そのビューに戻れます。このアプリケー
ションをリンクするには、プロジェクト ファイル nvprof.mbp を利用します。
objinfo.mb : オブジェクトに関する情報を表示します。
overview.mb : 既存のマップ ウィンドウ内のエリアの概略を表示する第 2 のマップ ウィンドウを開
きます。元のマップで拡大、縮小、その他のビューの変更を行うと、Overview ウィンドウも自動
的に調整されます。このアプリケーションをリンクするには、プロジェクト ファイル obproj.mbp
を利用します。
scalebar.mb : マップ ウィンドウ上に距離縮尺バーを描画します。このアプリケーションをリンク
するには、プロジェクト ファイル sbproj.mbp を利用します。
MapBasic 11.0
284
ユーザーズ ガイド
付録 A: サンプル プログラム
Samples\MapBasic ディレクトリ
textbox.mb : このマニュアルで用例として使用されるサンプル プログラム。このアプリケーション
をリンクするには、プロジェクト ファイル tbproj.mbp を利用します。
watcher.mb : DDE を使用して Microsoft Excel と通信します。また、Excel ワークシートを設定し
て、MapBasic アプリケーション内のグローバル変数を監視します。
Samples\MapBasic\Spider Graph ディレクトリ
Spider Graph : 同じテーブル内にあるオブジェクト間や、結合された 2 つのテーブルのオブジェク
ト間でラインを描画します。さらに、一致するフィールド値に基づいて、始点テーブルのオブ
ジェクトと終点テーブルのオブジェクトをつなぐ新しいラインのテーブルを作成します。
Samples\MapBasic\Srchrepl ディレクトリ
Srchrepl : 1 つのテーブル内での検索および置換操作を行います。
Samples\MapBasic\SWSpatialize ディレクトリ
sw_spatialize : 空間データ用に設定されていない既存の SQL Server テーブルを空間化できます。
SQL Server テーブルを空間化したら、そのテーブルに対して空間データの挿入および抽出の操作
を行うことができます。
Samples\MapBasic\Symbol ディレクトリ
symbol : MapInfo シンボルの作成、編集、削除を行えます。このエディタを使用して、MapInfo
3.0 シンボル セットをカスタマイズできます。
Samples\MapBasic\SyncWindows ディレクトリ
syncwindows : マップ ウィンドウの同期、全マップ ウィンドウでのオブジェクトの作成、ウィン
ドウの並列表示、全マップ ウィンドウ内のシステム レイヤの削除を実行できます。
Samples\MapBasic\Tablemgr ディレクトリ
tablemgr : 開いているすべてのテーブルをリスト ボックスに表示します。ユーザがテーブルをク
リックすると、そのテーブルに関する詳細情報を表示します。テーブルのプロパティの設定と
テーブルのメタデータの表示も可能です。
Samples\MapBasic\Template ディレクトリ
toolapp.mb : MapInfo Professional ツール アプリケーション用のテンプレートです。このアプリ
ケーションをリンクするには、プロジェクト ファイル toolapp.mbp を利用します。
Samples\MapBasic\Winmgr ディレクトリ
winmgr : ドキュメント ウィンドウのタイトルと、テーブルのデフォルト ビューを設定できます。
MapBasic 11.0
285
ユーザーズ ガイド
付録 A: サンプル プログラム
Samples\MFC ディレクトリ
Samples\MFC ディレクトリ
FindZip : 統合マッピングを使用して MapInfo Professional の要素を Microsoft Foundation Class
(MFC) で作成された C++ プログラムに統合する例を示します。
mdimfc : C++ を使用した統合マッピング アプリケーション。
Samples\PwrBldr ディレクトリ
Capitals : PowerBuilder を使用した統合マッピング アプリケーション。
L
PowerBuilder ランタイム ライブラリは付属しません。このアプリケーションを実行するに
は、PowerBuilder ライブラリがインストールされている必要があります。
Samples\VB4 ディレクトリ
Callback : OLE オートメーション コールバック。
FindZip : 統合マッピングを使用してマップ ウィンドウなどの MapInfo Professional 要素を Visual
Basic プログラムに統合する例を示します。Visual Basic 3.0 以降が必要です。
VMapTool : コールバックなどの高度な統合マッピング操作の例を示します。Visual Basic 4.0
Professional Edition 以降が必要です。
Samples\VB6 ディレクトリ
Callback : OLE オートメーション コールバック。
FindZip : 統合マッピングを使用してマップ ウィンドウなどの MapInfo Professional 要素を Visual
Basic プログラムに統合する例を示します。Visual Basic 3.0 以降が必要です。
VMapTool : コールバックなどの高度な統合マッピング操作の例を示します。Visual Basic 4.0
Professional Edition 以降が必要です。
MapBasic 11.0
286
ユーザーズ ガイド
演算子の要約
演算子は特定の値からある結果を得るために使用します。演算子は、使用する
データのタイプおよび生じる結果のタイプによって分類することができます。
この付録の構成
Š
Š
Š
Š
Š
数値演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .288
比較演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .288
論理演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .289
地理演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .289
タイプの自動変換. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .291
B
付録 B: 演算子の要約
数値演算子
数値演算子
以下の数値演算子は 2 つの数値を受け取り、数値の結果を返します。
演算子
処理
例
+
加算
a + b
–
減算
a - b
*
乗算
a * b
/
除算
a / b
\
整数除算 (余りをカット)
a \ b
Mod
整数除算の余り
a Mod b
^
累乗
a ^ b
これらの演算子のうち次の 2 つは別の用途でも用います。プラス記号を 2 つの文字列に使用すると
文字列が連結され、1 つの新しい文字列が生成されます。単一の数値にマイナス記号 (-) をつけると
否定演算子となり、数値の結果が生成されます。アンパサンド記号も文字列の連結を行います。
演算子
処理
例
–
負の数
- a
+
文字列結合
a + b
&
文字列結合
a & b
比較演算子
比較演算子は、同じ一般タイプの 2 つの値を比較し、TRUE または FALSE の論理値を返します。
数値データと非数値データ (例 : 文字列式など) を直接比較することはできませんが、整数、2 バイ
ト整数、浮動小数などのデータ型は比較することができます。比較演算子は条件式でしばしば使
用されます (例 : If...Then)。
演算子
TRUE が返される条件
例
=
a と b が等しい
a
<>
a と b が等しくない
a <> b
MapBasic 11.0
288
=
b
ユーザーズ ガイド
付録 B: 演算子の要約
論理演算子
演算子
TRUE が返される条件
例
<
a が b より小さい
a < b
>
a が b より大きい
a > b
<=
a が b より小さいか等しい
a <= b
>=
a が b より大きいか等しい
a >= b
論理演算子
"論理演算子" は、TRUE または FALSE の論理結果を生成します。
演算子
TRUE が返される条件
例
And
両方のオペランドが TRUE である a And b
Or
どちらかのオペランドが TRUE a Or b
である
Not
オペランドが FALSE である
Not a
地理演算子
地理演算子はオブジェクトに対して使用され、TRUE または FALSE の論理結果を生成します。
演算子
TRUE が返される条件
例
Contains
第 1 オブジェクトが第 2 オブジェクトの図 objectA Contains
objectB
心を含む
Contains Part
第 1 オブジェクトが第 2 オブジェクトの一 objectA Contains Part
objectB
部を含む
Contains Entire
第 1 オブジェクトが第 2 オブジェクトの全 objectA Contains Entire
objectB
体を含む
Within
第 1 オブジェクトの図心が第 2 オブジェク objectA Within objectB
トの中にある
Partly Within
最初のオブジェクトの一部が 2 番目のオブ objectA Partly Within
objectB
ジェクトの中にある
MapBasic 11.0
289
ユーザーズ ガイド
付録 B: 演算子の要約
地理演算子
TRUE が返される条件
演算子
例
Entirely Within
第 1 オブジェクト全体が第 2 オブジェクト objectA Entirely Within
objectB
の中にある
Intersects
2 つのオブジェクトがある点で交差する
objectA Intersects
objectB
優先順位
かっこは式内に別の式を含むときに使用する特別な演算子です。かっこを使用することにより、
計算式の優先順位を変更することができます。次の表は MapBasic で使用する演算子の優先順位を
示します。同じ行の演算子は同等の優先順位を意味します。優先順位の高い順に計算されます。
同じ優先順位の演算子の場合は左から順に計算されます (ただし、累乗は例外で右から左に計算さ
れます)。
MapBasic 演算子
優先順位
(最も高い優先順位)
かっこ
累乗
負
乗算、除算、Mod、整数除算
加算、減算
地理演算子
比較演算子、Like 演算子
Not
And
(最も低い優先順位)
Or
たとえば、3 + 4 * 2 という式の結果は 11 となります (加算より先に乗算が行われます)。式が (3 +
4) * 2 なら、結果は 14 になります (括弧があるので加算が先に行われます)。優先順位について不
確かな場合はかっこを使用してください。
MapBasic 11.0
290
ユーザーズ ガイド
付録 B: 演算子の要約
タイプの自動変換
タイプの自動変換
さまざまなタイプのデータを含む式を作成した場合、MapInfo Professional は意味のある結果を生
成するためにタイプの自動変換を実行します。たとえば、日付から日付を減算する場合、結果は
日数を表す整数になります (2 つの日付の日数の差を表す数となります)。次の表に、MapBasic の
自動タイプ変換の規則をまとめます。この表で「整数」とあるのは、Integer 変数、SmallInt 変
数、または Integer 定数です。「数値」は数値式を表しますが、これは必ずしも整数である必要は
ありません。
演算子
+
オペランドの組み合わせ
結果
日付 + 数値
Date
数値 + 日付
Date
整数 + 整数
Integer
数値 + 数値
Float
その他 + その他
String
日付 - 数値
Date
日付 - 日付
Integer
整数 - 整数
Integer
数値 - 数値
Float
整数 * 整数
Integer
数値 * 数値
Float
/
数値 / 数値
Float
\
数値 \ 数値
Integer
MOD
数値 MOD 数値
Integer
^
数値 ^ 数値
Float
–
*
MapBasic 11.0
291
ユーザーズ ガイド
サポートされている ODBC
テーブルのタイプ
MapInfo Professional は次の ODBC データ型をサポートします。
•
SQL_BIT
•
SQL_TINYINT
•
SQL_SMALLINT
•
SQL_INTEGER:
•
SQL_REAL
•
SQL_BIGINT
•
SQL_DECIMAL
•
SQL_DOUBLE
•
SQL_FLOAT
•
SQL_NUMERIC
•
SQL_BINARY
•
SQL_LONGVARBINARY
•
SQL_VARBINARY
•
SQL_LONGVARCHAR
•
SQL_DATE
•
SQL_TYPE_DATE
•
SQL_TIMESTAMP
•
SQL_TYPE_TIMESTAMP
•
SQL_TIME
•
SQL_TYPE_TIME
•
SQL_CHAR
•
SQL_VARCHAR
C
リモートテーブルをマップ
作成可能にする
この付録の構成
Š
空間データの格納および取得の必要条件. . . . . . . . . . . . . . . . . . . . .294
D
付録 D: リモートテーブルをマップ作成可能にする
空間データの格納および取得の必要条件
空間データの格納および取得の必要条件
RDBMS テーブル上でポイントの格納/取得を行う場合、4 つの必要条件があります。
1. 空間データの座標値は、テーブルのフィールドに数字またはサポートされている空間データ型
として保存する必要があります。
これを行うには、いくつかの方法が考えられます。以下にその一部を紹介します。
•
•
データを閉じます。
Easyloader を使ってデータベースにアップロードします。このアプリケーションは、サポー
トされているすべてのデータベースで使用できます。
これは、データを作成する作業であり、いつでも実行できます。
2. 座標のクエリ性能を向上するために、空間インデックス フィールドを追加することができます。
この作業は、必要に応じて、サンプル アップロード アプリケーションの一環として行えます。
これは、データを作成する作業であり、いつでも実行できます。
3. MapInfo Professional では、座標を示すフィールドに関する情報を RDBMS システム上にある
特殊テーブルに保存します。このテーブルは MapInfo マップ カタログと呼ばれます。各データ
ベースごとに 1 つのカタログが必要です。マップ カタログを作成するには、Easyloader また
は MIODBCAT.MBX を使用します。また、「MapInfo_MapCatalog の手動での作成 (付録 E、
295 ページ)」の手順に従って手動でマップ カタログを作成することもできます。これは 1 回
限りの操作です。MapInfo Professional でデータベース上のテーブルをマッピングする前に、
この操作を必ず実行します。
4. MapInfo Professional では、マップ作成可能なテーブルに関するカタログ情報を MapBasic の
Server Create Map 文を使って取得します。これは、各テーブルにつき 1 回だけ行われる操作
です。MapInfo Professional でその特定のテーブルをマッピングする前に実行する必要があり
ます。
MapBasic 11.0
294
ユーザーズ ガイド
MapInfo_MapCatalog の手
動での作成
ここには、MapInfo マップ カタログを手動で作成する方法と、リモート テーブ
ルをマップ作成可能にする方法という、リモート テーブルのジオコード化に必
要な 2 つの処理の手順が記載されています。この情報は、MapInfo Professional
にアクセスできないユーザを対象としたものです。
MapInfo Professional ユーザは、MapInfo マップ カタログを自動的に作成する
ことができます。
• リモートテーブルをマップ作成可能にする
ユーザまたはユーザのデータベース管理者は、MapBasicでアクセスする各
データベースに対し、1 つの MapInfo マップ カタログを作成する必要があり
ます。
E
付録 E: MapInfo_MapCatalog の手動での作成
MAPINFO_MAPCATALOG を手動で作成するには:
1. RDBMS に所有者とユーザが必要な場合は、マップ作成可能なテーブルが格納されている特定
のデータベースに、MAPINFO という名前のユーザを作成し、パスワードを MAPINFO に設定
します。
2. このデータベースに、MAPINFO_MAPCATALOG というテーブルを作成します。
Create Table 文は、次の SQL Create Table 文と同じである必要があります。
Create Table MAPINFO_MAPCATALOG(
SPATIALTYPE
TABLENAME
OWNERNAME
SPATIALCOLUMN
DB_X_LL
DB_Y_LL
DB_X_UR
DB_Y_UR
VIEW_X_LL
VIEW_Y_LL
VIEW_X_UR
VIEW_Y_UR
COORDINATESYSTEM
SYMBOL
XCOLUMNNAME
YCOLUMNNAME
RENDITIONTYPE
RENDITIONCOLUMN
RENDITIONTABLE
NUMBER_ROWS
Float,
Char(32),
Char(32),
Char(32),
Float,
Float,
Float,
Float,
Float,
Float,
Float,
Float,
Char(254),
Char(254),
Char(32),
Char(32),
Integer,
VarChar(32),
VarChar(32),
Integer
)
テーブルの定義は、この文とまったく同じでなければなりません。唯一の例外は、varchar
データ型または text データ型をサポートするデータベースの場合で、Char データ型の代わり
にこれらのデータ型を使用することが可能です。
3. TABLENAME と OWNERNAME に対して一意のインデックスを作成します。これにより、1 人
の所有者につき 1 つのテーブルだけがマップ作成可能になります。
4. MAPINFO_MAPCATALOG のすべてのユーザに選択権限を付与します。この設定により、ユー
ザはテーブルをマップ作成可能にすることができます。更新、挿入、および削除の各権限は、
データベース管理者の判断に基づいて付与する必要があります。
MapBasic 11.0
296
ユーザーズ ガイド
付録 E: MapInfo_MapCatalog の手動での作成
空間インデックスの種類
サポートされている空間インデックスの種類を以下の表に示します。
空間インデックスの種類
種別番号
MapInfo MICODE スキーマ (すべてのデータベース)
1
XY スキーマ (すべてのデータベース)
4
Oracle Spatial Geometry
13
SpatialWare for SQL Server
14
Oracle Spatial 注釈テキスト
16
SQL Server Spatial (Geometry 用)
17
SQL Server Spatial (Geography 用)
18
PostgreSQL の PostGIS
19
SQL Server Spatial (M 値および Z 値あり/Geometry 用)
20
SQL Server Spatial (M 値および Z 値あり/Geography 用)
21
手動でリモート テーブルをマップ作成可能にする
MapBasic でアクセスするリモート データベース内の各空間テーブルについて、
MAPINFO_MAPCATALOG テーブルに行を追加する必要があります。これを行うには、MapInfo
Professional 上で [テーブル] > [テーブル管理] > [ODBC テーブルをマップ作成可能にする] を選択
します。
MapInfo Professional を使用してマップ カタログを管理していない場合は、データベースの中のジ
オコード化する各空間テーブルについて、手動で MAPINFO_MAPCATALOG テーブルに行を追加す
る必要があります。各エントリにはテーブルに関する次の情報が含まれている必要があります。
フィールド名
SPATIALTYPE
割り当てる値
X,Y の空間インデックス テーブルの場合、4.0
例
4.0
(その他の空間サーバのサポートは開発中)
TABLENAME
テーブルの名前。
Drainage
OWNERNAME
所有者名。
Georgetown
MapBasic 11.0
297
ユーザーズ ガイド
付録 E: MapInfo_MapCatalog の手動での作成
フィールド名
SPATIALCOLUMN
割り当てる値
例
空間機能を含む列の名前。名前は次のように NO_COLUMN
します。
•
NO_COLUMN(X,Y を使用するマップ作成可
能なテーブルの場合)
DB_X_LL
レイヤの外接長方形の左下角の X 座標を、 -360
MapInfo Professional に定義された
COORDINATESYSTEM で示される単位で指
定します。
DB_Y_LL
左下の境界の Y 値。
-90
DB_X_UR
右上の境界の X 値。
360
DB_Y_UR
右上の境界の Y 値。
90
VIEW_X_LL
ビューの外接長方形の左下角の X 座標を、 -360
MapInfo Professional に定義された
COORDINATESYSTEM で示される単位で指
定します。
VIEW_Y_LL
左下の境界の Y 値。
-90
VIEW_X_UR
右上の境界の X 値。
360
VIEW_Y_UR
右上の境界の Y 値。
90
COORDINATESYSTEM
MapInfo でサポートされる座標系を表す文字 Earth
列であり、マップ投影法、座標単位などを指 Projection 1,0
定します。値は次のいずれかになります。
•
Earth Projection 1,0 (NAD27 の場合)
•
Earth Projection 1,62 (NAD27 の
場合)
• Earth Projection 1,33 (NAD 83 の
場合)
•
Earth Projection 1,74 (NAD 83 の
場合)
SYMBOL
MapInfo Symbol 句 (ポイントを含むレイヤの Symbol
(35,0,12)
場合)
XCOLUMNNAME
X 座標を含む列の名前を指定します。
NO_COLUMN
YCOLUMNNAME
Y 座標を含む列の名前を指定します。
NO_COLUMN
MapBasic 11.0
298
ユーザーズ ガイド
付録 E: MapInfo_MapCatalog の手動での作成
フィールド名
割り当てる値
例
RENDITIONTYPE
オンの場合は 1、オフの場合は 0 を指定し 1
ます。
RENDITIONCOLUMN
rendition フィールドの名前を指定します。
MI_SYMBOLOGY
RENDITIONTABLE
rendition テーブルの名前を指定します。
空のまま
このフィールドは使用されません。
NUMBER_ROWS
MapBasic 11.0
テーブルの行数を指定します。
299
11
ユーザーズ ガイド
データの設定と管理
この付録の構成
Š
Š
Š
Š
Š
6.5 より前のバージョンからのアプリケーションのアップグレード. . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .301
アプリケーション データ ファイルとディレクトリ . . . . . . . . . . . .304
デフォルトの環境設定パス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .306
レジストリの変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .307
インストーラの必要条件とグループの方針 . . . . . . . . . . . . . . . . . .307
F
付録 F: データの設定と管理
6.5 より前のバージョンからのアプリケーションのアップグレード
6.5 より前のバージョンからのアプリケーションのアップグレード
Application Data (appdata) ファイルは、MapInfo Professional が実行中に使用する、非実行型で特
定ユーザに所有されないデータ ファイルです。以下のファイルやディレクトリは、バージョン 6.5
以降の appdata と見なされます。
ファイル名
説明
mapinfow.prf
環境設定ファイル
mapinfow.wor
デフォルトのワークスペース
startup.wor
Startup ワークスペース
mapinfow.clr
色ファイル
mapinfow.pen
ペン ファイル
mapinfow.fnt
シンボル ファイル
custsymb
カスタム シンボル ディレクトリ
thmtmplt
主題図テンプレート ディレクトリ
graphsupport
グラフ サポート ディレクトリ
従来、これらのファイルは Windows ディレクトリまたは Program ディレクトリに格納されていま
した。Mapinfo Professional バージョン 6.5 以降の方針により、アプリケーション データ ファイル
はユーザ別の位置に格納され、他の領域にあるそれらのファイルを検索でき、さらに MapInfo の
他のバージョンや製品との間でアプリケーション データ ファイルを共有することができるように
なりました。mapinfow.prj を移動させることで、ユーザは Mapinfo Professional の異なるバージョ
ン間で 1 つのカスタム投影法ファイルを共有できます。
以下のファイルは Program ディレクトリに残ります。
ファイル名
説明
mapinfow.abb
略語ファイル
mapinfow.prj
投影法ファイル
mapinfow.mnu
メニュー ファイル
重要事項 :
•
•
インストーラは、ユーザに対して、アプリケーション データ ファイルの格納場所の指定を求
めません。
Mapinfo Professional のインストールの有無に関わらず、インストーラは常に同じように動作
します。
MapBasic 11.0
301
ユーザーズ ガイド
付録 F: データの設定と管理
6.5 より前のバージョンからのアプリケーションのアップグレード
•
バージョン 6.5 以降では、"アップグレード" インストールは実行できません (たとえば、
Mapinfo Professional 9.5 と同じディレクトリに Mapinfo Professional 10.0 をインストールする
ことはできず、インストールしようとするとエラーがスローされます)。
•
アプリケーション開発者は任意の場所にファイルを移動またはコピーできますが、Mapinfo
Professional は移動またはコピーしたファイルを、以下の場所でこの順序でしか検索しません。
•
appdata_dir
•
local_appdata_dir
•
pref_dir
•
program_dir
アプリケーションのアップグレードに関する用語集
以下の定義に目を通しておくと役に立ちます。
user profile root
ユーザのディレクトリ構造のルートです。各ユーザには、この領域のサブディレクトリに対す
る書き込み権限があります。この場所は Windows のバージョンによって以下のように異なり
ます。
Windows XP : c:\Documents and Settings\username
My Documents
Windows XP : c:\Documents and Settings\username\My Documents
Pref_dir
Mapinfo Professional はデフォルトで mapinfow.prf と mapinfow.wor に書き出します。
•
バージョン 6.0 : Windows ディレクトリ
•
Versions 6.5 以降 : user profile root\Application Data\MapInfo\MapInfo。起動時にこのディレク
トリが存在しない場合は Mapinfo Professional によって作成されます。
home_dir
•
Windows ディレクトリ
program_dir
バージョン 6.0 では、多くの appdata ファイルがここに収められます
バージョン 6.0 : mapinfow.exe が置かれる場所
バージョン 6.5 以降 : mapinfow.exe が置かれる場所
appdata_dir
これは、バージョン 6.5 で導入されたユーザごとのディレクトリです。appdata ファイルの多くが
この場所にインストールされます。
•
バージョン 6.0 : 利用不能
MapBasic 11.0
302
ユーザーズ ガイド
付録 F: データの設定と管理
6.5 より前のバージョンからのアプリケーションのアップグレード
•
Versions 6.5 以降 : user profile root\Application Data\MapInfo\MapInfo\Professional\nnn。
ここで、nnn は MapInfo Professional のバージョン番号を表す 3 桁の数値です (たとえば 850
など)。
L
起動時にこのディレクトリが存在しない場合でも、MapInfo Professional による作成は行わ
れません。開発者は、これが有効なパスであることを前提にしないでください。
local_appdata_dir
これも appdata_dir と同様なユーザごとのディレクトリですが、ファイルが移動しない点が異なり
ます。
•
バージョン 6.0 : 利用不能
•
Versions 6.5 以降 :
user profile root\Local Settings\Application Data\MapInfo\MapInfo\Professional\nnn。
ここで、nnn は MapInfo Professional のバージョン番号を表す 3 桁の数値です (たとえば 850
など)。
L
起動時にこのディレクトリが存在しない場合でも、MapInfo Professional による作成は行わ
れません。開発者は、これが有効なパスであることを前提にしないでください。
common_appdata_dir
このディレクトリは、マシン上のすべてのユーザによって共有されます。ユーザはデフォルト
で、すべてのファイルに対する読み取り権限、ファイルの作成権限、作成したファイルに対する
書き込み権限を持ちます。このディレクトリ内のファイルは移動しません。このディレクトリの
サポートは、バージョン 7.0 で追加されました。
•
バージョン 6.5 および 6.0 : 利用不能
•
Versions 7.0 以降 :
user profile root\All Users\Application Data\MapInfo\MapInfo\Professional\nnn。
ここで、nnn は MapInfo Professional のバージョン番号を表す 3 桁の数値です (たとえば 850
など)。
mydocs_dir
現在のユーザの My Documents ディレクトリを参照します。
•
バージョン 6.0 : 利用不能
•
バージョン 6.5 以降 : My Documents
search_for_file
この関数は appdata ファイルを検索します。あらかじめ定義された以下の順序でディレクトリ内
を検索します。
•
バージョン 6.0 : pref_dir、home_dir、program_dir
•
バージョン 6.5 : appdata_dir、local_appdata_dir、pref_dir、program_dir
•
バージョン 7.0 以降 : appdata_dir、local_appdata_dir、pref_dir、common_appdata_dir、
program_dir
MapBasic 11.0
303
ユーザーズ ガイド
付録 F: データの設定と管理
アプリケーション データ ファイルとディレクトリ
アプリケーション データ ファイルとディレクトリ
次に、MapInfo Professional のバージョン 6.0 および 6.5 以降で appdata ファイルおよびディレク
トリがどのように検索されるかを説明します。バージョン 9.5 では、MapInfo Professional への
Workgroup インストールが導入されました。これにより、システム管理者はユーザがアプリケー
ション データ ファイルにアクセスするための共有場所を設定できるようになります。この変更
は、これらのファイルのデフォルト ディレクトリ設定に影響を与える場合があります。
mapinfow.prf
•
バージョン 6.0 : search_for_file を使用します。ファイルが読み取られた位置に関わらず、常に
pref_dir に書き出されます。
•
バージョン 6.5 以降 : search_for_file を使用します。ファイルを検出するとそれを読み取り、
ファイルの位置を記憶します。
ファイルが起動時に検出されており、ユーザがそのファイルへの書き込み権限を持つ場合は、
終了の際、ファイルはその位置へ書き出されます。それ以外の場合は、ファイルは pref_dir へ
書き出されます。
mapinfow.wor
•
•
バージョン 6.0 : pref_dir で検索し、次に home_dir で検索します。最初に検出したファイルを
読み込みます。
バージョン 6.5 以降 : search_for_file を使用します。ファイルを検出するとそれを読み取り、
ファイルの位置を記憶します。
ファイルが起動時に検出されており、ユーザがそのファイルへの書き込み権限を持つ場合は、
終了の際、ファイルはその位置へ書き出されます。それ以外の場合は、ファイルは pref_dir へ
書き出されます。
startup.wor
•
バージョン 6.0 : program_dir、pref_dir のディレクトリの順序で読み込まれます。
•
バージョン 6.5 以降 : pref_dir、appdata_dir、local_appdata_dir、pref_dir、program_dir の順序
で読み込まれます。他の appdata ファイルとは異なり、検出された startup.wor はそれぞれ処
理されます。
mapinfow.clr
•
バージョン 6.0 : search_for_file を使用します。検出されない場合は、検索用のダイアログ ボッ
クスが表示されます。
カスタム定義色の保存を選択した場合、新しい色ファイルが pref_dir へ書き出されるか、既存
のものを上書きします。
•
バージョン 6.5 以降 : search_for_file を使用します。検出されない場合は、検索用のダイアロ
グ ボックスが表示されます。
カスタム定義色の保存を選択したとき、そのファイルがユーザごとのディレクトリに存在する
場合は、既存のファイルが更新されます。色ファイルがプログラム ディレクトリから読み取ら
れた場合、またはそのファイルに対する書き込み権限がユーザにない場合は、そのファイルは
pref_dir に書き込まれます。
MapBasic 11.0
304
ユーザーズ ガイド
付録 F: データの設定と管理
アプリケーション データ ファイルとディレクトリ
mapinfow.pen
•
•
バージョン 6.0 : search_for_file を使用します。検出されない場合は、検索用のダイアログ ボッ
クスが表示されます。
バージョン 6.5 以降 : search_for_file を使用します。検出されない場合は、検索用のダイアログ
ボックスが表示されます。
mapinfow.fnt
•
•
バージョン 6.0 : search_for_file を使用します。検出されない場合は、検索用のダイアログ ボッ
クスが表示されます。
バージョン 6.5 以降 : search_for_file を使用します。検出されない場合は、検索用のダイアログ
ボックスが表示されます。
custsymb ディレクトリ
•
バージョン 6.0 : program_dir にあると見なします。
•
バージョン 6.5 以降 : search_for_file を使用してシンボル ディレクトリを検索します。検出さ
れない場合は、program_dir にあると見なします。
thmtmplt ディレクトリ
•
バージョン 6.0 : 環境設定ファイルで指定されたテンプレート ディレクトリが存在する場合は、そ
のディレクトリを使用します。存在しない場合は、program_dir. にテンプレート ディレクトリを
作成します。program_dir に作成できない場合、テンプレート ディレクトリは設定されません。
作成できない場合も含めてどの場合でも、環境設定ファイル パスが更新されます。
•
バージョン 6.5 以降 : 環境設定ファイルで指定されたテンプレート ディレクトリが存在する場
合は、そのディレクトリを使用します。存在しない場合は、search_for_file を使用してテンプ
レート ディレクトリを検索します。検出された場合はそのディレクトリを使用します。存在し
ない場合は、appdata_dir 以外の位置、次に program_dir にテンプレート ディレクトリを作成
しようとします。作成できない場合、テンプレート ディレクトリは設定されません。どの場合
でも、MapInfo Professional は環境設定ファイル パスを設定しません。
graphsupport ディレクトリ
•
バージョン 6.0 : 存在するかどうかに関わらず、環境設定ファイルで指定されたディレクトリを
使用します。指定されたディレクトリが無効な場合は、新しいグラフを作成しようとするとエ
ラー メッセージが表示されます。
•
バージョン 6.5 以降 : 環境設定ファイルで指定されたテンプレート ディレクトリが存在する場
合は、そのディレクトリを使用します。存在しない場合は、search_for_file を使用してグラフ
サポート ディレクトリを検索します。検出された場合はそのディレクトリを使用します。検出
されない場合は、そのディレクトリが program_dir の中にないものと見なされ、グラフを作成
しようとするとエラーメッセージが表示されます。
L
MapBasic 11.0
バージョン 7.0 以降では、search_for_file ルーチンに common_appdata_dir が含まれ
ます。
305
ユーザーズ ガイド
付録 F: データの設定と管理
デフォルトの環境設定パス
デフォルトの環境設定パス
バージョン 9.5 では、MapInfo Professional への Workgroup インストールが導入されました。これ
により、システム管理者はユーザがアプリケーション データ ファイルにアクセスするための共有
場所を設定できるようになります。この変更は、これらのファイルのデフォルト ディレクトリ設
定に影響を与える場合があります。
次に、環境設定パスとバージョン別のデフォルト パスを示します。
パス
バージョン 6.5 および 6.0
バージョン 7.0 以降の
デフォルト設定
テーブル
mydocs_dir
mydocs_dir
ワークスペース
mydocs_dir
mydocs_dir
MapBasic プログラム
program_dir\Tools
program_dir\Tools
インポート ファイル
mydocs_dir
mydocs_dir
SQL 検索
mydocs_dir
mydocs_dir
主題図テンプレート
appdata_dir\thmtmplt が存在する まず search_for_file を使用
場合はこれを使用し、存在しな し、そ れ が 失 敗 し た 場 合 は
い 場合は program_dir\thmtmplt program_dir を使用します
を使用します
保存されたクエリ
mydocs_dir
mydocs_dir
新規グリッド
mydocs_dir
mydocs_dir
Crystal Report ファイル
mydocs_dir
mydocs_dir
グラフ サポート ファイル
local_appdata_dir が存在する場 まず search_for_file を使用
合はこれを使用し、存在しない し、そ れ が 失 敗 し た 場 合 は
場合は program_dir を使用します program_dir を使用します
テーブルの検索ディレクトリ
mydocs_dir
MapBasic 11.0
306
mydocs_dir
ユーザーズ ガイド
付録 F: データの設定と管理
レジストリの変更
レジストリの変更
MapInfo Professional によるレジストリの使用法は、各ユーザが固有のデータを使用して作業でき
るように構成される必要があります。この構成をサポートするため、以下の変更が加えられてい
ます。
•
•
ツール マネージャのエントリが HKEY_CURRENT_USER 下にインストールされるようになり
ました。
グラフ エンジンでは、カスタム色と数字の書式が HKEY_CURRENT_USER 下に格納されるよ
うになりました。
インストーラの必要条件とグループの方針
MapBasic v.6.5 および 6.0
MapBasic バージョン 6.5 および 6.0 のアプリケーション データ ファイルは、以下の表で指定され
たディレクトリにインストールする必要があります。
ファイル名
バージョン 6.5 または 6.0 ワークステーション*
mapinfow.clr
Application Data\MapInfo\MapInfo\Professional\nnn
mapinfow.pen
Application Data\MapInfo\MapInfo\Professional\nnn
mapinfow.fnt
Application Data\MapInfo\MapInfo\Professional\nnn
mapinfow.abb
プログラム ディレクトリ
mapinfow.prj
プログラム ディレクトリ
mapinfow.mnu
プログラム ディレクトリ
custsymb
Application Data\MapInfo\MapInfo\Professional\nnn
thmtmplt
Application Data\MapInfo\MapInfo\Professional\nnn
graphsupport
Local Settings\Application Data\MapInfo\MapInfo\Professional\nnn
*
MapBasic 11.0
nnn は MapInfo Professional のバージョン番号を表す 3 桁の数値です (たとえば 850 など)。
307
ユーザーズ ガイド
付録 F: データの設定と管理
インストーラの必要条件とグループの方針
MapBasic v.7.0 以降
MapBasic v.7.0 以降のアプリケーション データ ファイルは、以下の表で指定されたディレクトリ
にインストールする必要があります。
ファイル名
バージョン 7.0 以降のワークステーション*
mapinfow.clr
Application Data\MapInfo\MapInfo\Professional\nnn
mapinfow.pen
Application Data\MapInfo\MapInfo\Professional\nnn
mapinfow.fnt
Application Data\MapInfo\MapInfo\Professional\nnn
mapinfow.abb
プログラム ディレクトリ
mapinfow.prj
プログラム ディレクトリ
mapinfow.mnu
プログラム ディレクトリ
custsymb
Application Data\MapInfo\MapInfo\Professional\nnn
thmtmplt
Application Data\MapInfo\MapInfo\Professional\nnn
graphsupport
All Users Application Data\MapInfo\MapInfo\Professional\nnn
*
L
nnn は MapInfo Professional のバージョン番号を表す 3 桁の数値です (たとえば 850 など)。
バージョン 9.5 では、MapInfo Professional への Workgroup インストールが導入されました。
これにより、システム管理者はユーザがアプリケーション データ ファイルにアクセスするた
めの共有場所を設定できるようになります。この変更は、これらのファイルのデフォルト
ディレクトリ設定に影響を与える場合があります。
次の MapBasic 関数はファイルの場所を調べるために役立ちます。
•
•
GetFolderPath$( ) 関数 - 特別な MapInfo Professional ディレクトリまたは Windows ディレク
トリのパスを返します。
LocateFile$( ) 関数 - MapInfo Professional のアプリケーション データ ファイルのパスを返し
ます。
MapBasic 11.0
308
ユーザーズ ガイド
MapBasic 用語集
目的の用語がこの用語集にない場合は、MapInfo Professional DVD に収録されて
いる『MapInfo Professional ユーザーズ ガイド』の用語集を参照してください。
G
付録 G: MapBasic 用語集
用語
用語
用語
定義
16 進数
コンピュータ プログラミングでよく使用される 16 を基本とした数の
表現法。16 進数値で使用される文字は 0 ~ 9 または A ~ F です。
MapBasic では、&H プレフィックスで 16 進数値を開始する必要があ
ります (たとえば、&H1A は 10 進数値の 26 に相当する 16 進数値)。
DDE
ダイナミック データ交換 (DDE)を参照してください。
IsoChrone
IsoChrone は、指定の道路網に沿って、一定の期間、開始点からトラ
バースできる領域を表すポリゴンまたはポイントのセットです。
IsoDistance
IsoDistance は、指定の道路網に沿って、一定の距離を、開始点からト
ラバースできる領域を表すポリゴンまたはポイントのセットです。
Isogram
Isogram は、距離または時間の条件を満たすポイントのセットを表示
するマップです。Isogram は、IsoChrone または IsoDistance です。
MBX
MapBasic の実行可能ファイルで、ユーザが MapInfo Professional の
[ツール] > [MapBasic プログラムを実行] コマンドを選ぶと実行されま
す。MapInfo Professional のどのユーザも MBX ファイルを実行するこ
とができます。MBX ファイルを作成するには、MapBasic の開発環境
を使用する必要があります。
MapBasic ウィンドウ
MapInfo Professional ユーザ インターフェイスのウィンドウ。MapInfo
Professional の [オプション] メニューから [MapBasic ウィンドウを表
示] を選ぶと表示されます。MapBasic ウィンドウに MapBasic 文を入
力すると、プログラムをコンパイルする必要はありません。
アニメーション レイヤ マップに追加される特殊な "移動表示" レイヤで、そのレイヤ上のオブ
ジェクトだけを再描画することが可能になります。アニメーション レ
イヤ上でオブジェクトを変更しても、他のレイヤの再描画は行われま
せん。
アプリケーション デー マップの基本的な設定とカスタマイズに影響を与える、構成、テンプ
レート、およびカスタム シンボル ファイルならびにディレクトリの
タ ファイル
セットです。これらのファイルはローカルに格納されていますが、
ユーザはファイルをリモートで共有してマップの外観の整合性を維持
することができます。
緯度
MapBasic 11.0
赤道に対する南北位置を示す度数を単位とする座標タイプ。赤道の南
にある位置は、負の緯度を持ちます。
310
ユーザーズ ガイド
付録 G: MapBasic 用語集
用語
用語
定義
円グラフ
互いの相対関係をパーセント値で表す、いくつかのセクターに分割さ
れた円。MapInfo Professional では、円グラフをグラフ ウィンドウまた
は主題図の中に表示できます。
演算子
1 つ以上の定数、変数、その他の値に作用する特殊なキャラクタまた
は単語。たとえば、マイナス演算子 (-) はある数字を別の数字から減じ
ます。
オ ー ト メ ー シ ョ ン、 OLE オートメーションは、ある Windows アプリケーションによって別
OLE オートメーション の Windows アプリケーションの操作を可能にするテクノロジです。たと
えば、Visual Basic アプリケーションは、MapInfo Professional のオート
メーション メソッドおよびプロパティを使用して MapInfo Professional
を操作することができます。統合マッピングを参照してください。
オブジェクト
図形オブジェクトは、マップ ウィンドウまたはレイアウト ウィンドウ
上に表示されるエンティティ (ライン、点、円など) です。MapBasic の
オブジェクト変数は、図形オブジェクトを含むことができる変数で
す。オブジェクト フィールドの名前は、テーブルに格納された一組の
オブジェクトを示します。OLEオブジェクトは、Windows特有のエン
ティティ (たとえば、ドラッグアンドドロップ操作を通じて作成され
たエンティティ) を意味します。
オブジェクトのリンク あるアプリケーションで作成されたオブジェクトを別のアプリケー
および埋め込み (OLE) ションで使用できるようにする技術。この場合のオブジェクトは、
マップ、グラフ、スプレッドシート、音声、テキストなどのあらゆる
情報を指します。埋め込みとは、サーバーのオブジェクトをコンテナ
アプリケーションに挿入するプロセスのことです。
カーソル、マウス カー マウス カーソルは、ユーザがマウスを動かすにつれて移動する小さな
ソル、行カーソル
イメージです。行カーソルは、テーブルの現在行を示す値です。行
カーソルの位置決めには、Fetch 文を使います。
キーワード
プログラミング言語の一部として認識される単語。たとえば、文また
は関数名など。MapBasic言語では、キーワードは太字で表されます。
行
"レコード" の別名。
クライアント
別のプログラムの情報を使用するか、別のプログラムから情報を受け
取るアプリケーション。データベース接続または DDE 接続でよく使わ
れます。
グローバル変数
プログラムの冒頭で定義され、あらゆるプロシージャまたは関数で使
うことができる変数。Global 文により作成されます。
経度
子午線に対する東西位置を示す度数を単位とする座標タイプ。子午線
の西にある場所は、負の経度を持ちます。
MapBasic 11.0
311
ユーザーズ ガイド
付録 G: MapBasic 用語集
用語
用語
定義
コメント
プログラムに含まれるプログラマの記述。この記述は、プログラムの
コンパイルに必要な構文中では何の役割も持ちません。MapBasic 言語
では、コメントはアポストロフィ (一重引用符) で開始されます。文内
にアポストロフィが現われると、そのラインの残りの部分が無視され
ます (ただし、アポストロフィがリテラル文字列式の中に現われる場合
は例外です)。
コントロール
ボタンやチェック ボックスなどのダイアログ ボックスの構成要素。
コンパイラ
プログラムのテキストを読み、構文エラーをチェックし、コードを実
行可能な形式に変換するプログラム。
サーバ
別のアプリケーション (クライアント) の代わりに操作を行ったり、別
のアプリケーション (クライアント) にデータを送ったりするアプリ
ケーション。データベース接続または DDE 接続でよく使われます。
再帰
関数またはプロシージャが自分自身を呼び出すような状況。再帰が必
要な場合もありますが、プログラマは再帰を誤って発生させないよう
に注意する必要があります。特に、SelChangedHandler などの特殊イ
ベント ハンドラを使用する場合は注意してください。
サブルーチン
一組の文。MapBasic の構文では、サブルーチンはプロシージャまたは
サブ プロシージャと呼ばれます。
参照による、値による
関数またはプロシージャにパラメータを渡す 2 つの異なる方法。引数を
参照により渡す (デフォルト) 場合は、関数の呼び出し時に変数名を指定
しなければなりません。呼び出された関数は、指定した変数を変更する
ことができます。引数を値により渡す (ByVal キーワードを使う) 場合
は、変数名を指定する必要はありません。
座標系
オブジェクトの位置座標をどのように解釈するかを指定する 1 組のパラ
メータ。座標系には、地球座標系 (例 : 経/緯度座標)、一般座標系 (例 :
フィートによる座標) があります。地球座標系マップは、地球上の位置
を示します。
シームレス テーブル
複数のテーブルをまとめたテーブル。複数のテーブルを同時に開いた
り、複数のテーブルのマップ作成を同時に行ったりする場合に便利で
す。テーブル操作を参照してください。
システム レイヤ
どのマップ ウィンドウ上にも存在する一時レイヤ。このレイヤは、レ
イヤ管理において常に最上位にあります。MapInfo Professional の [検
索] コマンドは、見つかった位置を示すシンボルをシステムレイヤに追
加します。
MapBasic 11.0
312
ユーザーズ ガイド
付録 G: MapBasic 用語集
用語
用語
定義
集合関数
Sum( ) や Count( ) のような、テーブルの行 (レコード) のグループに関
する要約情報を計算する関数。『MapBasic リファレンス ガイド』ま
たはオンライン ヘルプの Select の項を参照してください。
使用可能
使用不可能の反意語です。メニュー コマンド、ダイアログ ボックス コ
ントロール、またはツールバー ボタンが使用できる状態を指します。
使用不可能
ユーザがユーザ インターフェイスの一部 (メニュー コマンド、ダイア
ログ ボックス コントロール、またはツールバー ボタン) を使えない状
態。使用不可能な項目は、使用できないことを示すために一般に "グ
レー表示" となります。「使用可能」も参照してください。
ショートカット
メニュー
ユーザがマウスの右ボタンをクリックすると表示されるメニュー。
進捗バー
完了率を示す水平バーを表示する標準ダイアログ ボックス。
実行時
プログラムが実行されている時間。実行時エラーは、アプリケーション
(MBX ファイル) が実行されているときに発生するエラーのことです。
条件式
1 つ以上の変数、定数値、関数呼び出し、テーブル参照、および演算子
の集まり。
ステータス バー
MapInfo Professional プログラム ウィンドウの下に表示され、ヘルプ
メッセージや編集可能レイヤの名前などが表示されるバー。
ソース コード
プログラムの未コンパイル テキスト。MapBasic では .mb ファイルを
指します。
ステータス バー
ヘルプ
ユーザがメニュー コマンドを強調表示させるか、マウス カーソルを
ツールバー ボタンに重ねたとき、ステータス バーに表示されるヘルプ
メッセージ。
ダイナミック データ交 異なるアプリケーション間における命令およびデータの交換を可能に
する Microsoft Windows 専用プロトコル。適切に交換を行うには、両方
換 (DDE)
のアプリケーションが DDE に準拠している必要があります。
ダ イ ナ ミ ッ ク リ ン ク 共有実行可能ルーチンおよびその他のリソースを含む Microsoft Windows
ライブラリ (DLL)
ファイル。DLL は、一般にプログラムがある操作を処理するために呼び
出すもので、多くの場合は元のプログラムに値を戻します。
地球投影位置決定シス 衛星信号を受け取り、その信号を基に受信者の地球上の位置を決定す
テム (GPS)
るハードウェア/ソフトウェア システム。
MapBasic 11.0
313
ユーザーズ ガイド
付録 G: MapBasic 用語集
用語
用語
定義
地理結合
地形データに基づく 2 つのマップ作成可能なテーブル間のリレーショ
ナル リンク (つまり、あるテーブルのどのポイント オブジェクトが別
のテーブルのリージョンの中にあるかを特定)。
ツールチップ
ツールバー ボタンの簡単な説明。ユーザがマウス カーソルをボタンの
上に合わせると、マウス カーソルの横に表示されます。
ツールバー
一組のボタン。ユーザは、ツールバーを MapInfo Professional の作業エ
リアの上の端にドラッグすることで、そのツールバーを "ドッキング" さ
せることができます。MapBasic マニュアルでは、ツールバーの代わり
に "ボタンパッド" という用語がよく使用されます。これは、ツールバー
の変更に用いる MapBasic 言語のキーワードが ButtonPad だからです。
統合マッピング
マップ ウィンドウなどの MapInfo Professional 機能を別のアプリケー
ション (例 : Visual Basic プログラム) に統合する技術。統合マッピング
を参照してください。
透明フィル
縦縞パターンや平行線パターンなどのフィル パターンの 1 つで、完全
に不透明ではなく、ユーザはフィル エリアの "後ろ" にあるものを見る
ことができます。
度
マップ座標系の測定単位。紙のマップの中には、座標を度、分、秒で
表すものがあります (例 :42 度 30 分)。これに対し、MapBasic 文では
小数度 (例 : 42.5 度) を使います。また、「緯度」、「経度」も参照し
てください。
ネイティブ
標準ファイル形式。MapInfo Professional の [ファイル] > [新規作成] コ
マンドを選択すると、ネイティブ MapInfo テーブルが作成されます。
ただし、スプレッドシートまたはテキスト ファイルに基づくテーブル
は、MapInfo のネイティブ ファイル形式ではありません。
派生フィールド
基本テーブル上の既存値に式を適用することで得られるクエリ テーブ
ル上のフィールド。Add Column 文の項を参照してください。
配列
同類の要素をまとめるために使われる、同一タイプの変数のグループ。
ハンドラ
プログラム中のプロシージャ。特定のイベントが発生する (ユーザがメ
ニュー コマンドを選択した場合など) と、そのハンドラが発生イベント
に対して必要な操作を実行します。
パラメータ
"引数" の別名。
MapBasic 11.0
314
ユーザーズ ガイド
付録 G: MapBasic 用語集
用語
用語
定義
引数
パラメータとも呼ばれる。文または関数呼び出しの一部。ある文また
は関数で 1 つ以上の引数が必要な場合は、必要となる各引数について
適切な式を指定する必要があります。指定された引数は、その文また
は関数に渡されます。『MapBasicリファレンス ガイド』およびオンラ
インヘルプの構文図では、引数は"イタリック体"で表記されています。
標準
標準メニュー コマンドおよび標準ツールバー ボタンは、デフォルトの
MapInfo Professional ユーザ インターフェイスの一部として表示されま
す (た とえ ば、[ファイル] > [ 新規作成] は標準メニュー コマンドで
す)。標準ダイアログ ボックスは、あらかじめ定義された 1 組のコン
トロールを備えたダイアログです (たとえば、Note 文では静的テキス
ト コントロールと [OK] ボタンを 1 つずつ備えたダイアログ ボックス
が生成されます)。MapBasic プログラムによって独自のユーザ イン
ターフェイス要素 (ダイアログ ボックス、ツールバー ボタンなど) が作
成される場合、その要素はカスタム ダイアログ ボックス、カスタム ボ
タンなどと呼ばれます。
ファイル入出力、ファ ファイルからの情報の読み取りまたはファイルへの情報の書き込みを
イル i/o
行うプロセス。MapBasic 言語では、ファイル入出力とテーブル操作に
はそれぞれ異なる文が使われます。
フィールド
テーブルまたはデータベースの一部。各テーブルは 1 つ以上のフィー
ルドを持っており、各カラムは 1 つの情報カテゴリ (名前、住所、電話
番号など) を表します。カラムは “フィールド” とも呼ばれます。ラ
スタ イメージに基づいたテーブルにはカラムはありません。
フォーカス
ダイアログ ボックスの中でアクティブなコントロール (ユーザが現在操
作中のコントロール) が、フォーカスされていると言えます。Tab キーを
押すと、次のコントロールがフォーカスされます。また、フォーカスは
実行中のアクティブなアプリケーションを指すこともあります。別のア
プリケーションに切り替える (例 : Windows では Alt キーを押しながら
Tab キーを押す) と、そのアプリケーションにフォーカスが移ります。
フォルダ
ファイル格納エリア。ディレクトリとも呼ばれます。
ブラシ スタイル
オブジェクトのフィル パターン。このスタイルは、パターン、前景
色、および背景色から成ります。
ブレークポイント
デバッグの便宜を図るためのもの。特定のラインでプログラムを停止
さ せ る に は、そ の ラ イ ン の 前 に ブ レ ー ク ポ イ ン ト を 置 き ま す。
MapBasic プログラムの中にブレークポイントを置くには、Stop 文を
挿入して再度コンパイルします。
文
MapBasic プログラムにおける命令。コンパイル済みの MapBasic プロ
グラムでは、文は複数行に分割される場合があります。
MapBasic 11.0
315
ユーザーズ ガイド
付録 G: MapBasic 用語集
用語
用語
プラットフォーム
定義
コンピュータ ソフトウェアの操作環境 (Windows、Linux など)。
プロシージャ、サブ プ Sub...End Sub 構造の中に含まれる文のグループ。ルーチンまたはサ
ロシージャ
ブルーチンと呼ばれることもあります。
プ ロ ジ ェ ク ト、プ ロ プロジェクトは、モジュールの集まりです。プロジェクト ファイル
ジェクト ファイル
(.MBP ファイル) は、モジュールのリストを定義するテキスト ファイ
ルです。プロジェクト内のすべてのモジュールをコンパイルしてから
プロジェクトをリンクさせると、アプリケーション (MBX) ファイルが
作成されます。
プロパティ、OLE プロ OLE オートメーションの一部。プロパティは、OLE オブジェクトの名
パティ
前付き属性です。オブジェクトのステータスを決定するには、そのプ
ロパティを読み取ります。プロパティが書き込み禁止でない場合は、
そのプロパティに新しい値を割り当てることによって、オブジェクト
のステータスを変更することができます。統合マッピングを参照して
ください。
変数
値を格納するために割り当てられたメモリの小さなエリア。
変数の範囲
変数がプログラム内のあらゆる場所からアクセス可能である (グローバ
ル変数) か、あるいは特定の関数またはプロシージャの中でのみアクセ
ス可能である (ローカル変数) かを示します。あるプロシージャがグ
ローバル変数と同名のローカル変数を持つ場合、ローカル変数の方が
優先されます。つまり、その変数名がプロシージャの中で参照される
と、ローカル変数の方が使用されます。
ペン スタイル
オブジェクトのライン スタイル セット。このスタイルは、幅、パター
ン、色から成ります。
別名
MapInfo Professional ユーザ (または MapBasic プログラム) が開いた
テーブルの参照に使う名前。たとえば、"C:\MapInfo\Parcels.Tab" とい
う名前のテーブルの別名は Parcels になります。テーブルの別名にス
ペースを含めることはできません。テーブル名の中にあるスペース
は、テーブルの別名では下線文字になります。また、別名は MapBasic
のデータ タイプでもあります。別名変数は、フィールド名を表す文字
列式 ("World.Population" など) を格納することができます。別名の長さ
は 32 文字までです。
棒グラフ
ユーザのテーブルの値を示すグラフ。棒グラフは、グラフ ウィンドウ
上で使うことも、マップ上に主題として表示することもできます。
ボタンパッド
"ツールバー" の別名。
MapBasic 11.0
316
ユーザーズ ガイド
付録 G: MapBasic 用語集
用語
用語
定義
メソッド、OLE
メソッド
OLE オートメーションの一部。アプリケーションのメソッドの呼び出
しは、アプリケーションに影響を及ぼすプロシージャの呼び出しに似
ています。統合マッピングを参照してください。
メタデータ
テーブルに関する情報 (作成日、著作権通告など) で、行やフィールド
ではなく、.TAB ファイルに格納されたもの。テーブル操作を参照して
ください。
モジュール
プロジェクトの一部を構成するプログラム ファイル (.MB ファイル)。
モジュール レベル変数
ある MB プログラム ファイル内のあらゆる関数またはプロシージャか
らアクセスできる変数。ただし、同じプロジェクト内の別の MB プロ
グラム ファイルからはアクセスできません。関数またはプロシージャ
の外で Dim 文を使用して作成します。
ラスタ
小さなドット (ピクセル) の行から成る図形イメージの形式。
ラ ス タ ア ン ダ ー レ イ ラスタ イメージで構成されるテーブル。このテーブルは、行やフィー
テーブル
ルドを持ちません。そのため、テーブルに関する MapBasic 文の中に
は、ラスタ アンダーレイ テーブルに使用できないものもあります。
ランタイム
MapInfo Professional の特別バージョンで、通常のバージョンが持つ地
理機能およびデータベース機能をすべて備えているものの、標準パッ
ケージに含まれる特定のメニューやツールバー オプションが含まれて
いません。MapInfo Professional のカスタマイズ バージョンを作成する
ために使用されます。
リテラル値
指定の明示値を定義する式。たとえば、23.45 はリテラル数、"Hello,
World" はリテラル文字列です。ハードコードされた値と呼ばれること
もあります。
リモート データ
Oracle または SYBASE サーバなどのリモート データベースに格納さ
れたデータ。
リンカー
プロジェクト ファイルの個々のモジュールを組み合わせて 1 つの MBX
アプリケーション ファイルにするプログラム。
リンク テーブル
リモート データベースからダウンロードされた MapInfo テーブル タイ
プの 1 つ。リモート データベースのデータがローカルに伝送されま
す。次にそのテーブルが再び元のリモート データベースにリンクされ
ると、MapInfo Professional はタイム スタンプをチェックして、2 つの
テーブルの違いを確認します。違いがある場合は、新しいデータに基
づいてテーブルが更新されます。
MapBasic 11.0
317
ユーザーズ ガイド
付録 G: MapBasic 用語集
用語
用語
定義
ルーチン
指定の操作を実行する一群の文。たとえば、OnError 文を使うと、エ
ラー処理ルーチンとして機能する一連の文を指定することができます。
ループ
一群の文を繰り返し実行するプログラム操作構造。ループのコード化を
誤ると、無限ループ (ループが永遠に継続するような状態) が生じます。
レコード
テーブルまたはデータベースのエントリ。各レコードは、ブラウザ
ウィンドウでは行として表示されます。
ローカル変数
特定の関数またはプロシージャの中で定義/使用される変数。ローカ
ル変数は、同名のグローバル変数よりも優先されます。ローカル変数
の作成には、Dim 文を使います。
MapBasic 11.0
318
ユーザーズ ガイド
索引
Alter Menu Bar 文 86
Alter Menu Item 文 87
Alter Menu 文 85
Alter Object 文 176, 180
Alter Table 文 135
And 演算子 58
Any( ) 演算子 192
Area( ) 関数 191
Area( ) 関数 168
Ask( ) 関数 95
AutoLabel 文 175
auto_lib.mb (サンプル プログラム) 124
< (~ より小さい) 57
<= (~ より小さいまたは等しい) 57
Symbols
& (アンパサンド)
16 進数 52
交差点検索 133
ダイアログ ボックス内のショートカット キー
104
メニュー内のショートカット キー 91
文字列連結 56, 288
' (アポストロフィ) 44
* (アスタリスク)
固定長文字列 46
乗算 55, 288
+ (プラス) 288
加算 55
日付加算 56
文字列連結 56
, (コンマ) 文字
1000 桁セパレータ 52
/ (スラッシュ)
除算 55, 288
日付文字列フォーマット 53
= (等号) 57
>= (~ より大きいまたは等しい) 57
> (~ より大きい) 57
^ (カレット) 55
累乗 288
B
Between 演算子 57
BIL (SPOT イメージ) ファイル 145
BrushPicker コントロール 99
C
CancelButton コントロール 100
CheckBox コントロール 100
Close Window 文 106, 208
CommandInfo( ) 関数
DDE 207
検索結果の判別 133
選択されたメニュー項目の ID 90
ボタンパッド 114
ユーザがダイアログ ボックス内で OK をク
リックしたかどうかを検出 96
リスト内のダブルクリックの検出 102
Commit Table 文 107
Commit 文 111, 134
Contains 演算子 59, 190
Continue 文 77
Create ButtonPad 文 114, 116, 201
CreateCircle( ) 関数 176
Create Frame 文 110, 175
Create Index 文 134
Create Map 文 134, 166
Create Menu Bar 文 89
Create Menu 文 86
Create Table 文 296
数字
1000 桁セパレータ、数値定数 52
16 進数 310
&H 構文 52
A
Add Column 文 193
Add Map Layer 文 107
Alter ButtonPad 文 114, 201
Alter Button 文 114
Alter Control 文 102
MapBasic 11.0
319
ユーザーズ ガイド
Create Text 文 110, 169
Crystal Report writer 128
CurDate( ) 関数 52, 56
C 言語サンプル プログラム 257
FrontWindow( ) 関数 106
Function...End Function 文 72
D
GetMetaData$( ) 関数 148
GetSeamlessSheet( ) 関数 151
Get 文 (ファイル入出力) 162
GIF ファイル 145
GoTo 文 62
GPS 313
GPS アプリケーション 108
GroupBox コントロール 99
G
DBF (dBASE) ファイル 128
DBMS テーブル
mapinfo_mapcatalog 296
DDE
クライアントとして動作 203, 207
サーバとして動作 207
Declare Function 文 72, 195
Declare Sub 文 64, 195
Define 文 73
Delphi サンプル プログラム 257
Dim 文 45
DLL
カーネル ライブラリ 198
検索パス 195
宣言 195
定義 195
パラメータの受け渡し 196
ボタンパッド アイコンの格納 201
文字列パラメータ 197
ユーザ ライブラリ 196
DLL の検索パス 195
Do Case 文 61
Do...Loop 文 63
Drop Map 文 166
I
If...Then 文 60
Include 文 73
Input # 文 161
Insert 文 110, 134, 177
IntersectNodes( ) 関数 182
Intersects 演算子 59, 190
J
JPG ファイル 145
K
Kill 文 160
L
LabelFindByID( ) 関数 183
LabelFindFirst( ) 関数 183
LabelFindNext( ) 関数 183
Labelinfo( ) 関数 183
Like 演算子 56
Line Input # 文 161
ListBox コントロール 99, 103
Lotus ファイル 128
E
EditText コントロール 99
EndHandler プロシージャ 68
End Program 文 64
EOF( ) 関数 (ファイルの終わり) 161
EOT( ) 関数 (テーブルの終わり) 129
Err( ) 関数 79
Error$( ) 関数 79
ERRORS.DOC 221
Excel ファイル 128
M
Main プロシージャ 64
MakePen( ) 関数 172
Map!nfo_Mapcatalog
作成 296
MapBasic ウィンドウ 45
MapBasic からのメソッドの宣言 261
MapBasic からのメソッドの呼び出し 261
MapBasic の概要 20
MapInfo-L アーカイブ 19
MapInfo Professional
テクニカル サポート 18
MAPINFOW.MNU ファイル 92
MapInfo マニュアル セット 16
F
Fetch 文 129, 180
FileExists( ) 関数 160
FileOpenDlg( ) 関数 95
FileSaveAsDlg( ) 関数 95
FontPicker コントロール 99
ForegroundTaskSwitchHandler プロシージャ 68
Format$( ) 関数 109
For...Next 文 62
FoxBase ファイル 128
MapBasic 11.0
320
ユーザーズ ガイド
P
MapInfo メニュー ファイル 92
MapInfo ランタイム
OLE を通じた起動 214
MapMarker 製品 133
MBX ファイル
定義 310
MFC
基本操作 249
サンプル プログラム 257
Microsoft Excel
DDE 会話 203
ワークシート ファイル 128
Mod 演算子 288
Mod (整数演算) 55
MultiListBox コントロール 100, 103
Pack Table 文 132
PCX ファイル 145
PenPicker コントロール 99
Perimeter( ) 関数 168
PopupMenu コントロール 100, 103
PowerBuilder、サンプル プログラム 257
Print # 文 161
Print 文 111
ProgressBar 文 96
Put 文 (ファイル入出力) 162
Q
QueryN テーブル
閉じる 137
開く 137
N
.Net プログラム
.Net への引数の受け渡し 263
MapBasic からのメソッドの宣言と呼び出し
261
.Net へのカスタム変数タイプの受け渡し 264
.Net への定義の受け渡しの制限事項 268
アセンブリ ファイルの作成とコピー 261
概要 259
クラスの作成 260
はじめに 259
パフォーマンス上の注意事項 264
別名によるメソッドの呼び出し 263
用語 259
例外処理 268
.Net への定義の受け渡し、制限事項 268
NoSelect キーワード 71
Note 文 94
Not 演算子 58
NumberToDate( ) 関数 53
R
RadioGroup コントロール 99
RDBMS テーブル上でのポイントの格納 294
ReadControlValue( ) 関数 101, 103
ReDim 文 47
RemoteMsgHandler プロシージャ、DDE 207
RemoteQueryHandler( ) 関数 206
Remove Map Layer 文 107
Rename File 文 160
Report writer 128
Resume 文 79
RGB 色値 173
Rollback 文 134
RowID 132
RTrim$( ) 関数 58
Run Application 文 123
Run Menu Command 文 91, 111
S
O
Save File 文 160
Seagate Crystal Report writer 128
SearchInfo( ) 関数 119
SelChangedHandler プロシージャ 68, 119
Select Case (Do Case) 61
SelectionInfo( ) 関数 137
Select 文 166–167, 174, 189–191
Set CoordSys 文 140, 186
Set Event Processing 文 109
Set File Timeout 文 142
Set Format 文 53
Set Map 文 107, 109, 175
Set Redistricter 文 111
Set Shade 文 107
Set Table 文 151
ObjectGeography( ) 関数 168
ObjectInfo( ) 関数 167, 173
ObjectLen( ) 関数 168, 191
ODBC 接続、サポートされているデータ型 292
OKButton コントロール 100
OLE 埋め込み 213
OLE オートメーション 232
定義 311
OnError 文 79
Open File 文 159
Open Window 文 106, 208
Or 演算子 58
MapBasic 11.0
321
ユーザーズ ガイド
Set Target 文 181
Set Window 文 106, 208
Shade 文 107
SPOT イメージ ファイル 145
SQL Select 検索 134
Startup ワークスペース 123
StaticText コントロール 98
Stop 文 77
StringCompare( ) 関数 57
StyleAttr( ) 関数 169, 173
SymbolPicker コントロール 99
アセンブリ ファイル、作成とコピー 261
アドバイス ループ
DDE サーバとしての MapInfo 208
アニメーション レイヤ 108
い
意志決定
Do Case 文 61
If…Then 文 60
緯度 310
イベント、処理
選択の変更 119
定義 68
特殊なプロシージャ 68
ユーザ インターフェイス イベント 82
イベントへの応答、イベントを参照、処理
イメージ (ラスタ) 145
色値
RGB( ) 関数 173
オブジェクトを色で選択 173
インストール手順 14
インデックス、作成 134, 136
T
TableInfo( ) 関数 132, 151, 166
Targa ファイル 145
TempFileName$( ) 関数 160
TIFF ファイル 145
ToolHandler プロシージャ 68, 115
TriggerControl( ) 関数 102
Type...End Type 文 48
U
UBound( ) 関数 47
Update 文 134, 176–177, 180
う
V
ウィンドウ、カスタマイズ
グラフ 110
サイズと位置 106
情報ウィンドウ 111
ブラウザ 109
マップ 107
メッセージ 111
領域編成 111
レイアウト 110
ウィンドウ識別子 106
ウィンドウの制限超過によるビープ 30
ウィンドウ メニュー 41
ウォーム リンク 208
埋め込み 213
Visual Basic サンプル プログラム 213, 257
Visual C++
基本操作 249
サンプル プログラム 257
W
While...Wend 文 63
WinChangedHandler プロシージャ 68
WinClosedHandler プロシージャ 68
WindowID( ) 関数 106
WindowInfo( ) 関数 106, 140
WinFocusChangedHandler プロシージャ 68
WIN.INI ファイル、設定の検索 198
Within 演算子 59, 190
WKS ファイル、開く 128
Write # 文 161
え
エラー
コンパイル時 31
実行時 77, 134
トラップ 79
円、オブジェクトを参照 13
円グラフ
グラフ ウィンドウ 110
主題図 107
演算子
数値 55
地理 59, 189
定義 51
X
XLS ファイル、開く 128
あ
アクセラレータ キー
ダイアログ ボックス内 104
統合マッピング 223
メニュー内 91
MapBasic 11.0
322
ユーザーズ ガイド
比較 56
日付 56
文字列 56
優先順位 59
論理 58
演算子の優先順位 59, 290
1 領域あたりのポリゴン 167
折れ線 1 本あたりのセクション 167
選択した行 137
開いているウィンドウ 106
可変長文字列変数 47
関数
Area( ) 168
CreateCircle( ) 176
CurDate( ) 52
EOF( ) 161
EOT( ) 129
Err( ) 79
Error$( ) 79
FileExists( ) 160
FileOpenDlg( ) 95
FileSaveAsDlg( ) 95
Format$( ) 109
FrontWindow( ) 106
GetMetaData$( ) 148
GetSeamlessSheet( ) 151
IntersectNodes( ) 182
LabelFindByID( ) 183
LabelFindFirst( ) 183
LabelFindNext( ) 183
LabelInfo( ) 183
MakePen( ) 172
NumberToDate( ) 53
ObjectGeography( ) 168
ObjectInfo( ) 167, 173
ObjectLen( ) 168, 191
Perimeter( ) 168
ReadControlsValue( ) 101
ReadControlValue( ) 103
RemoteQueryHandler( ) 206
RTrim$( ) 58
SearchInfo( ) 119
SelectionInfo( ) 137
StyleAttr( ) 169, 173
TableInfo( ) 132, 151, 166
TempFileName$( ) 160
TriggerControl( ) 102
UBound( ) 47
WindowID( ) 106
WindowInfo( ) 106, 140
範囲 72
ユーザ定義 72
関数の範囲 72
外国の文字セット 163
外部参照
Windows DLL 195
他のモジュール内のルーチン 37
外部ルーチンの呼び出し 37, 196
お
オートメーション 311
オブジェクト モデル 232
大文字と小文字の区別 44
オブジェクト、検索
座標 167
スタイル 168
タイプ 167
オブジェクト、削除 166
オブジェクト、作成
既存のオブジェクトに基づく 178
作成関数 176
作成文 175
テーブルに格納 177
バッファ 178
オブジェクトの一部の消去 181
オブジェクトの移動 180
オブジェクトの長さ 191
オブジェクトの併合 178
オブジェクトへのノードの追加 176
オブジェクト、変更
位置 180
オブジェクトの一部の消去 181
オブジェクトのタイプ 181
スタイル 181
テーブルに格納 177
ノードの追加 176, 182
併合 178
オブジェクト変数 165
オブジェクト モデル 232
折れ線オブジェクト、オブジェクトを参照
オンライン ヘルプ
作成 208
使用 24
か
カーソル スタイル、変更 122
カーソル (テーブル内の位置) 129
カーソル (描画ツール アイコン) 121
カーネル (Windows DLL) 198
確認メッセージ 95
カスタム変数タイプ、.Net への受け渡し 264
数
1 オブジェクトあたりのノード 176
1 行あたりのオブジェクト 167
MapBasic 11.0
323
ユーザーズ ガイド
コンパイラ命令 73
合計、計算 134
き
キーボードのショートカット 28
規則 16
共有衝突 140
距離単位 188
キロメートル 186
行カーソル、位置決め 129
さ
再帰 67
定義 312
再試行/キャンセル ダイアログ ボックス 140
サイズ可変シンボル主題図 107
サイズの制限事項 30
削除
インデックス 136
オブジェクトの一部 181
テーブルからフィールドを 135
ファイル 160
メニュー 89, 92
メニュー項目 86, 92
作成
MapInfo_MapCatalog 296
.Net のクラス 260
サブ選択 191
サブ プロシージャ、プロシージャを参照
サポート
Web サイト 19
テクニカル サポート 18
算術演算子 55
サンプル プログラム、統合マッピング 257
座標系
一般座標 186
地球座標 186
レイアウト座標 140, 186
く
クイック スタート ダイアログ ボックス 123
クライアント/サーバ
DDE プロトコル 203
データベース アクセス 151
クラス
.Net での作成 260
クラス名
MapInfo.Application 214
MapInfo.Runtime 214
クリックとドラッグ 116
グラフ ウィンドウ 110
グリッド主題図のサポート 107
グローバル アセンブリ キャッシュ (GAC)、読み込
み 269
グローバル変数 49
け
経度 311
検索と置換
MapBasic エディタ 39
検索メニュー 39
し
こ
シーケンシャル ファイル入出力 159–160
シームレス テーブル 149
識別子、定義 73
システム レイヤ
オブジェクトを削除 139
オブジェクトを選択 139
定義 312
集合関数 313
『MapBasic リファレンス ガイド』を参照
主題図 107
主題図の連続色分けのサポート 107
小合計、計算 134
ショートカット キー
ダイアログ ボックス内 104
メニュー内 91
ショートカット メニュー
破棄 90
変更 90
使用可能 313
使用不可能、定義 313
交差
2 つの道路 133
Intersects 演算子 59
オブジェクトが重なる領域 178
ラインの交差点 182
交差点 182
構造 48
コールバック 223
国際文字セット 163
固定長文字列変数 47
コマンド ライン引数 32, 248
コメント 44
コントロール
EditText 99
GroupBox 99
StaticText 98
コントロール パネル、日付フォーマットへの影響
54
コンパイラ 312
MapBasic 11.0
324
ユーザーズ ガイド
進捗状況 (パーセント) を示すダイアログ ボックス
96
進捗バー
定義 313
非表示 125
シンボル スタイル 168
ジオコード
MapMarker 133
自動 133
対話 133
ジオコード解除 166
実行時エラー 77
実行時エラーのトラップ 79
実行速度、向上
テーブルの操作 155
ハンドラ プロシージャ 71
ユーザ インターフェイス 124
住所、検索 133
住所検索 133
住所の検索 133
情報ウィンドウ
カスタマイズ 111
読み取り専用に設定 112
ノードをオブジェクトに 176
ソース コード 313
測定単位 186
距離単位 188
面積単位 188
用紙単位 188
速度、向上
ハンドラ プロシージャ 71
ユーザ インターフェイス 124
テーブルの操作 155
た
ターゲット オブジェクト 181
タイプ変換 55
ダイアログ ボックス、カスタム
コントロール タイプ 98
コントロールの位置 97
コントロールのサイズ 97
最終値の読み取り 101
終了 105
ショートカット キー 104
初期値の設定 101
選択不可能コントロール 103
配列に基づくリスト 103
モーダルとモードレス 104
文字列に基づくリスト 103
ユーザ操作への応答 102
例 96–97
ダイアログ ボックス内のコントロール 98
ダイアログ ボックス、標準
OK かキャンセルかの確認 95
簡単なメッセージ 94
進捗状況 96
進捗バーの非表示 125
ファイルの保存 95
ファイルを開く 95
す
数値演算子 55
数値定数 52
数値定数の小数点セパレータ 52
スクロール バー、表示/非表示 107
スタイル、比較 169
スタイル (ペン、ブラシ、シンボル、フォント) 168
ステータス バー ヘルプ メッセージ 120
統合マッピング 223
スナップ モード 223
スプレッドシート ファイル、開く 128
せ
ち
整数演算 55
整数除算 288
製品トレーニング 25
接続ハンドル 151
接続番号 151
選択
オブジェクトのクリック 119
検索 139
変更 138
チェック可能なメニュー項目 87
注釈 44
頂点、ノードを参照
地理演算子 59, 189
地理的オブジェクト、オブジェクトを参照
つ
ツールチップ 120
ツールバー、ボタンパッドを参照
ツールボタンの定義 113
そ
相関的結合 167, 192
挿入
行をテーブルに 134
テーブルにフィールドを 135
MapBasic 11.0
325
ユーザーズ ガイド
テキストのサイズ 169
テキストの高さ 169
テクニカル サポート
サービス 17–19
提供 18
利用 18
ディレクトリ名 160
データ構造 48
データベースへのライブ アクセス 155
て
定義の受け渡し
.Net へのカスタム変数タイプ 264
定数
数値 52
定義 50
日付 53
文字列 52
論理 53
テーブル
Obj (object) フィールド 132, 165
QueryN テーブルを閉じる 137
値の書き込み 134
値の読み取り 129
一時フィールドの追加 136
永続フィールドの追加 135
行番号 132
結合 192
コンポーネント ファイル 144
作成 134
システム 139
スプレッドシートおよびデータベース ファイ
ルに基づく 128
選択 137
ダイナミック フィールドの追加 136
定義、検索 136
定義、変更 135
開いているテーブルの数 136
開く 127
フィールド式 129
マップ作成可能にする 134
メタデータ 146
ラスタ イメージ テーブル 145
レイアウト 140
テーブルにフィールドを追加 135
テーブルの行
新しい行の挿入 134
既存の行の更新 134
行番号 (RowID) 132
現在行の設定 129
情報ウィンドウでの表示 111
並べ替え 134
テーブルの行の並べ替え 134
テーブルの結合 192
テーブル、リモート データベース
mapinfo_mapcatalog 296
テーブルを開く 127
テキスト エディタ 32
テキスト オブジェクト 168, 181
テキスト オブジェクト、オブジェクトを参照
テキスト スタイル (フォント) 168
テキスト高さ 169
MapBasic 11.0
と
投影法、変更 107
統合マッピング
MapInfo の起動 214
MapInfo の終了 221
MFC 249
ウィンドウのサイズ変更 217
エラー トラップ 221
オブジェクト モデル 232
オンライン ヘルプ 228
概要 211
コールバックの使用 223
サンプル プログラム 213, 257
システム要件 212
出力 220
ツールバー ボタン 218
定義 314
ドキュメント ウィンドウの再親化 216
凡例ウィンドウの再親化 217
透明フィル 314
トグルボタンの定義 113
度 314
ドック可能ボタンパッド 121
に
入出力、ファイル入出力を参照
の
ノード
最大数 176
座標の決定 182
追加 176, 182, 284
は
配列変数
サイズ変更 47
宣言 47
バイナリ ファイル入出力 159, 162
\ (バックスラッシュ)
整数除算 55, 288
バッファ、作成 178
326
ユーザーズ ガイド
パターン マッチ 56
パフォーマンス向上のヒント
テーブルの操作 155
ハンドラ プロシージャ 71
ユーザ インターフェイス 124
パフォーマンス最適化
テーブルの操作 155
ハンドラ プロシージャ 71
ユーザ インターフェイス 124
パラメータ
値渡し 66
参照渡し 66
パラメータの値渡し 66
パラメータの参照渡し 66
ランダム ファイル入出力 162
ファイルの消去 160
ファイル メニュー 38
フィールド
Obj (object) フィールド 132, 165
RowID フィールド 132
別名式 130
読み取りの構文 129
フィル スタイル (ブラシ) 168
フォーカス
ダイアログ ボックス内 102
定義 315
フォント スタイル 168–169
複数のファイルを開く 36
フレーム オブジェクト 175
ブラウザ ウィンドウ 109
ブラシ スタイル 168
ブレークポイント (デバッグ) 78
文 315
Add Column 193
Add Map Layer 107
Alter Button 114
Alter ButtonPad 114, 201
Alter Control 102
Alter Menu Bar 86
Alter Menu Item 87
Alter Object 176, 180
Alter Table 135
AutoLabel 175
Close Window 106, 208
Commit 111, 134
Continue 77
Create ButtonPad 114, 116, 201
Create Frame 110, 175
Create Index 134
Create Map 134, 166
Create Menu 86
Create Menu Bar 89
Create Text 110, 169
Declare Function 72, 195
Declare Sub 64, 195
Define 73
Dim 45
Do Case 61
Do…Loop 63
Drop Map 166
End Program 64
Fetch 129, 180
For…Next 62
Function...End Function 72
GoTo 62
If…Then 60
Include 73
ひ
比較演算子 56
引数
.Net への受け渡し 263
値渡し 66
参照渡し 66
日付演算子 56
日付定数 53
< > (等しくない) 57
評価順序 59
表記規則 16
比率データ併合 193
ビットマップ イメージ ファイル 145
描画モード 116
. (ピリオド) 文字
小数点セパレータ 52
ふ
ファイル拡張子 15
ファイル、外部
BIL (SPOT イメージ) 145
DBF (dBASE) 128
GIF 145
JPG 145
PCX 145
Targa 145
TIFF 145
WKS (Lotus) 128
XLS (Excel) 128
ファイル入出力
シーケンシャル ファイル入出力 160
定義 159
バイナリ ファイル入出力 162
ファイルのコピー 160
ファイルの削除 160
ファイルの名前変更 160
文字セット 163
MapBasic 11.0
327
ユーザーズ ガイド
Input # 161
Insert 110, 134, 177
Kill 160
Line Input # 161
Note 94
OnError 79
Open File 159
Open Window 106, 208
Pack Table 132
Print 111
Print # 161
ProgressBar 96
ReDim 47
Remove Map Layer 107
Rename File 160
RollBack 134
Run Application 123
Run Menu Command 91, 111
Save File 160
Select 166–167, 174, 189, 191
Set CoordSys 140, 186
Set Event Processing 109
Set File Timeout 142
Set Format 53
Set Map 107, 109, 175
Set Redistricter 111
Set Shade 107
Set Table 151
Set Target 181
Set Window 106, 208
Shade 107
Stop 77
Type...End Type 48
Update 134, 176, 180
While…Wend 63
Write # 161
分岐 62
文ハンドル 151
文番号 151
プッシュボタン 113
プログラム内の行番号 40
プログラムのコンパイル
アクティブ ウィンドウ 21, 30
コマンド ライン 32
ファイルを開かずに 38
プログラムの終了 64
プログラムの実行
MapInfo 21, 31
開発環境 41
プログラムの停止 64
プログラムのデバッグ 77
プログラムの実行
Startup ワークスペースから 123
MapBasic 11.0
プログラム編成 74
プロシージャ
Main 64
イベント処理 67
再帰 67
定義 64
パラメータの受け渡し 66
呼び出し 65
プロシージャの呼び出し 65
プロジェクトのリンク
現在のプロジェクトの選択後 35
コマンド ライン 32
ファイルを開かずに 38
プロジェクト ファイル
作成 35
定義 33
利点 34
リンク 35
例 34
プロジェクト メニュー 40
プロパティ
Application オブジェクト 234
MBApplications コレクション 240
MBApplication オブジェクト 241
MBGlobals コレクション 242
MBGlobal オブジェクト 242
MIMapGen オブジェクト 243
定義 316
へ
ヘッダ ファイル 15
ヘルプからプログラムをコピー 24
ヘルプ ファイル
作成 208
使用 24
ヘルプ メニュー 42
編集ターゲット 181
編集メニュー 39
変数
オブジェクト変数 165
グローバル 49
スタイル変数 172
宣言 45
定義 45
データ型のリスト 46
名前の制約 46
範囲 50
他のアプリケーションのグローバル変数の読み
込み 206
変数の範囲 50
変数への値の割り当て 45
別名 316
328
ユーザーズ ガイド
フィールド参照 130
変数 130
別名、メソッドの呼び出し 263
ページ レイアウト 110
ペン スタイル 168
み
ほ
む
他のアプリケーションの変数の読み込み 206
ホット キー
ダイアログ ボックス内 104
メニュー内 91
ホット リンク 208
棒グラフ
グラフ ウィンドウ 110
主題図 107
ボタン コントロール (ダイアログ ボックス内) 100
ボタンのヘルプ メッセージ 120
ボタンパッド
ICONDEMO.MBX 118
新しいパッドの作成 115
新しいボタンの追加 116
カスタム Windows アイコン 201
ツールボタン 113
定義 316
トグルボタン 113
ドッキング 121
プッシュボタン 113
ボタンのヘルプ メッセージ 120
ボタンパッドのアイコン 115, 200
ポイント オブジェクト、オブジェクトを参照
ポイント スタイル (シンボル) 168
ポイント、リモート データベースへの格納 154
ポリゴン オーバーレイ 193
無限ループ、回避 71
右クリック メニュー
破棄 90
変更 90
め
メソッド
Application オブジェクト 235
MapBasic からの宣言と呼び出し 261
MBApplication オブジェクト 241
MIMapGen オブジェクト 244
定義 317
別名による呼び出し 263
メタデータ 146
メッセージ URL http
//www.pbinsight.com 15
メッセージ ウィンドウ 111
メニュー、カスタマイズ
MAPINFOW.MNU ファイル 92
新しいメニューの作成 86
ショートカット キー 91
メニュー項目の削除 86
メニュー項目の追加 85
メニュー項目の変更 87
メニュー バーの変更 89
メニュー選択のシミュレーション 91
メモリの制限事項 30
面積単位 188
も
ま
モーダル ダイアログ ボックス 104
文字セット 163
モジュール 317
関数またはプロシージャの呼び出し 37
変数の共有 37
他のモジュールと共有できない変数の宣言 37
文字列演算子 56
文字列検索置換機能
MapBasic エディタ 39
文字列定数 52
文字列の連結
& 演算子 288
+ 演算子 288
文字列変数、固定長と可変長 47
文字列連結
& 演算子 288
+ 演算子 288
- (マイナス) 288
? (マイナス)
減算 55
日付減算 56
マウス イベント
クリックとドラッグ 116
メニュー項目の選択 84
リストのダブルクリック 102
マウスのショートカット 29
マップ ウィンドウ 107
ラベル 182
レイヤを参照
マップ オブジェクト、オブジェクトを参照
マップ オブジェクトの作成 175
マップ投影法 107
マルチユーザ編集 140
MapBasic 11.0
329
ユーザーズ ガイド
For...Next 文 62
While...Wend 文 63
ゆ
ユーザ (Windows DLL) 196
ユーザ インターフェイス
ウィンドウ 105
カーソル 122
概要 82
ダイアログ ボックス、カスタム 96
ダイアログ ボックス、標準 94
ボタンパッド 113
メニュー 84
ユーザ定義関数 72
ユーザ定義タイプ 48
れ
レイアウト ウィンドウ
オブジェクト座標 187
テーブルとして処理 140
開く 110
レイヤ
システム レイヤ 139
主題図レイヤ 107
レイヤの追加/削除 107
レコード、行を参照
よ
ろ
用紙単位 188
ローカル変数 45
論理演算子 58
ら
わ
ライブ リモート データベース アクセス 155
ライン オブジェクト、オブジェクトを参照
ライン スタイル (ペン) 168
ラスタ アンダーレイ テーブル 145, 317
ラベル
テキストに変換 185
プログラム内 62
マップ 175, 182
ランタイム実行可能ファイル
OLE を通じた起動 214
ランダム ファイル入出力 159, 162
ワークスペース
Startup 123
サンプル プログラムとして使用 24
ワイルドカード (文字列比較) 56
り
リアルタイム アプリケーション 108
リージョン オブジェクト、オブジェクトを参照
リテラル値 317
リモート データ、定義 317
リモート データベース アクセス 151
リモート データベース テーブル
mapinfo_mapcatalog 296
リモート データベースの更新 154
リモート データベースへのアクセス 151
リモート データベースへの接続 151
リモート データベースへのポイントの格納 154
リモート データベースへのライブ アクセス 155
領域編成ウィンドウ 111
リンカー 317
リンク テーブル 154
定義 317
る
ループ
Do...Loop 文 63
MapBasic 11.0
330
ユーザーズ ガイド