330
MapBasic 11.0 ユーザーズ ガイド

MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

Embed Size (px)

Citation preview

Page 1: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

MapBasic11.0

ユーザーズ ガイド

Page 2: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、このマニュアルに記載されている事項に関して一切の責任を負いかねますのでご了承ください。このマニュアルを 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. の登録商標です。その他すべての商標および登録商標に関する権利はそれぞれの所有者に帰属します。

Pitney Bowes Software Inc. オフィスへのお問い合わせ先については、http://www.pbinsight.com/about/contact-us をご覧ください。

© 2011 Adobe Systems Incorporated. All rights reserved.Adobe、Adobe ロゴ、Acrobat、および Adobe PDF ロゴは、米国やその他の国における AdobeSystems Incorporated の登録商標または商標です。

© 2011 OpenStreetMap コントリビュータ、CC-BY-SA; 次のサイトを参照してください。OpenStreetMap http://www.openstreetmap.org および CC-BY-SAhttp://creativecommons.org/licenses/by-sa/2.0libtiff © 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 ReservedPortions 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 日

米国電話 : 518.285.6000FAX : 518.285.6070販売 : 800.327.8627政府販売 : 800.619.2333テクニカル サポート : 518.285.7283テクニカル サポート FAX : 518.285.6080pbinsight.com

カナダ電話 : 416.594.5200FAX : 416.594.5201販売 : 800.268 3282 8627テクニカル サポート : 518 285 7283テクニカル サポート FAX : 518.285.6080pbinsight.ca

欧州/英国電話 : 44.1753.848.200FAX : 44.1753.621.140 テクニカル サポート: +44.1753.848.229 pbinsight.co.uk

アジア太平洋地域/オーストラリア電話 : 61.2.9437.6255FAX : 61.2.9439.1773テクニカル サポート : 1.800 648.899 899pbinsight.com.au

Page 3: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

目次

第 1 章: はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13ハードウェアとソフトウェアの要件. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14

旧バージョンとの互換性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14MapBasic 開発環境のインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14

インストールする前に . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14インストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15MapBasic の起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15

MapBasic のファイル名およびファイル形式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15MapBasic マニュアル セット. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16このマニュアルで使用する表記上の規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16

用語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17表記規則. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17

テクニカル サポートの利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17テクニカル サポートへの連絡 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18ソフトウェアの不具合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19その他のリソース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19

第 2 章: MapBasic の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20MapBasic アプリケーションの作成と実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21

MapBasic の主要な特徴 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .22MapInfo Professional のカスタマイズ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .22MapInfo Professional の自動化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .22パワフルなデータベースアクセス ツールとしての MapBasic . . . . . . . . . . . . . . . . . . .23MapBasic による MapInfo Professional と他のアプリケーションの接続 . . . . . . . . . . .23

MapBasic の習得 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23MapInfo Professional 上の MapBasic ウィンドウ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25

トレーニングおよびオンサイト コンサルティング . . . . . . . . . . . . . . . . . . . . . . . . . . . .25

第 3 章: 開発環境の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26プログラムの編集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27

キーボードのショートカット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .28MapBasic テキスト エディタの制限事項. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30

MapBasic 11.0 3 ユーザーズ ガイド

Page 4: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

プログラムのコンパイル. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30コンパイル エラーの注意事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31コンパイル済みアプリケーションの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31別のエディタを使用した MapBasic プログラムの作成 . . . . . . . . . . . . . . . . . . . . . . . . .32

複数のモジュールを 1 つのプロジェクトにリンク. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33MapBasicプロジェクトファイルとは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33プロジェクト ファイルの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .35プロジェクトのコンパイルとリンク . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .35他のモジュールからの関数またはプロシージャの呼び出し . . . . . . . . . . . . . . . . . . . . .37

MapBasic 開発環境のメニューの概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .38[編集] メニュー. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39[検索] メニュー. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39[プロジェクト] メニュー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40[ウィンドウ] メニュー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41[ヘルプ] メニュー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .42

第 4 章: MapBasic の基本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43コメント. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44大文字/小文字の区別 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44複数行にまたがる文. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44mapbasic.def でのコード定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44MapBasic ウィンドウへの文の入力. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45固定長および可変長文字列変数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47配列変数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47カスタム データ タイプ (データ定義) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .48グローバル変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49変数の範囲 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50

式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50定数とは. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50演算子とは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51関数呼び出しとは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51定数の詳しい説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .52変数タイプの変換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .55演算子の詳しい説明. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .55MapBasic 演算子の優先順位 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .59

ループ、分岐、フロー制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .60If...Then 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .60Do Case 文. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .61GoTo 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .62For...Next 文. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .62Do...Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63

MapBasic 11.0 4 ユーザーズ ガイド

Page 5: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

While...Wend ループ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63プログラムの終了 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64プログラムと MapInfo Professional の終了 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64

プロシージャ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64Main プロシージャ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64プロシージャの呼び出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .65パラメータを持つプロシージャの呼び出し. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .65参照によるパラメータの受け渡し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .66値によるパラメータの受け渡し. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .66プロシージャの再帰呼び出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .67

システム イベント ハンドラの役割を果たすプロシージャ . . . . . . . . . . . . . . . . . . . . . . . .67システム イベントとは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .68イベント ハンドラとは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .68システム イベント ハンドラが呼び出されるタイミング. . . . . . . . . . . . . . . . . . . . . . . .70

ハンドラ プロシージャに関するヒント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .71ハンドラ プロシージャの簡略化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .71SelChangedHandler の呼び出しの停止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .71無限ループの回避 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .71カスタム関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .72関数の範囲 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .72

コンパイラ命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .73Define 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .73Include 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .73

プログラム編成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .74

第 5 章: 実行時エラーのデバッグおよびトラップ . . . . . . . . . . . . . . . . . . . . . . . . . . 76MapBasic プログラムのデバッグ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .77

デバッグ プロセスの要点. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .77Stop 文に関する制限事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .78その他のデバッギング ツール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79

エラー トラップ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79エラー トラップの例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .80

第 6 章: ユーザ インターフェイスの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81イベントドリブン プログラミング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .82

イベントについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .82ユーザによるメニュー イベントの生成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .82プログラムによるボタンパッド イベントの処理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .83プログラムによるダイアログ ボックス イベントの処理. . . . . . . . . . . . . . . . . . . . . . . .84

メニュー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84メニューの基本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84メニューへの新規項目の追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .85

MapBasic 11.0 5 ユーザーズ ガイド

Page 6: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

メニューからの項目の削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .86新規メニューの作成. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .86メニュー項目の変更. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .87メニュー バーの再定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .89言語独立メニュー参照の指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .89MapInfo Professional のショートカット メニューのカスタマイズ . . . . . . . . . . . . . . . .90複数メニュー項目への同一ハンドラ プロシージャの割り当て . . . . . . . . . . . . . . . . . . .90メニュー選択のシミュレーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91ショートカット キーとホット キーの定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91MapInfo Professional メニュー ファイルを介したメニュー操作. . . . . . . . . . . . . . . . . .92

標準ダイアログ ボックス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .94メッセージの表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .94はい/いいえの質問 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95ファイルの選択 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95処理状況の表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .96テーブルの行の表示. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .96

カスタム ダイアログ ボックス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .96コントロールのサイズおよび位置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .97コントロール タイプ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .98コントロールの初期値の指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .101コントロールの 終値の読み取り . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .101ハンドラ プロシージャ呼び出しによるユーザ操作への応答. . . . . . . . . . . . . . . . . . . .102選択可能/不可能コントロール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .103ユーザのリスト選択を可能にする . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .103MultiListBox コントロールの管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .103コントロール用ショートカット キーの指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .104ダイアログ ボックスの終了 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .105

ウィンドウ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .105ウィンドウのサイズおよび位置の指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .106マップ ウィンドウ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .107アニメーション レイヤを使用したマップ再描画の迅速化 . . . . . . . . . . . . . . . . . . . . .108ブラウザ ウィンドウ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .109グラフ ウィンドウ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .110レイアウト ウィンドウ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .110領域編成ウィンドウ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .111メッセージ ウィンドウ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .111

ボタンパッド (ツールバー) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .113ユーザがボタンを選択したときの動作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .113ボタンパッドに関連する MapBasic 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .114カスタム プッシュボタンの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .115メイン ボタンパッドへのボタンの追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .116

MapBasic 11.0 6 ユーザーズ ガイド

Page 7: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

カスタム ツールボタンの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .116カスタム ボタンのアイコンの選択 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .118ツールボタンのクリックによるオブジェクトの選択 . . . . . . . . . . . . . . . . . . . . . . . . .119カスタム ボタンパッドへの標準ボタンの追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .119ボタンへのヘルプ メッセージの割り当て . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .120画面上端へのボタンパッドのドッキング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .121その他のボタンパッド機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .121

カーソル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .122MapInfo Professional へのアプリケーションの統合 . . . . . . . . . . . . . . . . . . . . . . . . . . .122

Startup ワークスペースによるアプリケーションの読み込み . . . . . . . . . . . . . . . . . . .123MapBasic によるワークスペースの操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .124

ユーザ インターフェイスを効果的に使用するためのヒント . . . . . . . . . . . . . . . . . . . . . .124アニメーション レイヤ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .124不必要なウィンドウ再描画の回避 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .125メッセージ ウィンドウの破棄 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .125進捗バー ダイアログ ボックスの表示抑制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .125

第 7 章: テーブル操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126実行時のテーブル名の特定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .127同名の 2 つのテーブルを開く . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .127MapInfo 以外のファイルをテーブルとして開く . . . . . . . . . . . . . . . . . . . . . . . . . . . . .128

テーブルの行およびフィールド値の読み取り . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .129別名データ型によるフィールド参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .130適用範囲. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .131"RowID" フィールド名を使用した行番号 (レコード番号) の参照 . . . . . . . . . . . . . . . .132"Obj" フィールド名を使用した図形オブジェクトの参照 . . . . . . . . . . . . . . . . . . . . . . .132テーブルのマップ アドレス検索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .133ジオコード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .133SQL 検索の実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .134テーブルおよびフィールド参照のエラー チェック . . . . . . . . . . . . . . . . . . . . . . . . . . .134

テーブルへの行 (レコード) およびフィールド値の書き込み . . . . . . . . . . . . . . . . . . . . . .134テーブルの新規作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .134

テーブルの定義の変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .135インデックスの作成およびテーブルをマップ作成可能にする操作. . . . . . . . . . . . . . .136テーブルの定義情報の読み取り. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .136Selection テーブルを使った作業 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .137Selection の変更. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .138現在の選択行の更新. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .138Selection を使用したユーザ入力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .139

システム レイヤへのアクセス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .139レイアウト ウィンドウへのアクセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .140マルチユーザ編集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .140

MapBasic 11.0 7 ユーザーズ ガイド

Page 8: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

マルチユーザ編集に関する規則. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .141共有データへの書き込み時の衝突の回避 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .142書き込み可能テーブルを開く . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .144

テーブルを構成するファイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .144ラスタ イメージ テーブル. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .145メタデータの操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .146

メタデータとは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .146メタデータ キーの形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .147メタデータに関する作業の例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .148

シームレス テーブルの操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .149シームレス テーブルとは. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .149シームレス テーブルの仕組み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .150MapBasic のシームレス テーブル構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .151シームレス テーブルに関する制限事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .151

DBMS データへのアクセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .151リモート データ コマンドとデータベースの通信の仕組み . . . . . . . . . . . . . . . . . . . . .151接続および接続解除. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .152PostGIS のジオメトリ変換の動作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .153

リンク テーブルを使用したリモート データベースへのアクセスと、その更新 . . . . . . .154リモート データベースへのライブ アクセス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .155

テーブル操作をより効果的に行うためのヒント. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .155リモート テーブルのデフォルト ビューの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .155トランザクション ファイルを 小化する処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .156インデックスの適切な使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .156サブ選択の利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .156Select 文の 適化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .157Update 文の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .157

第 8 章: ファイル入出力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158シーケンシャル ファイル入出力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .160

ランダム ファイル入出力. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .162バイナリ ファイル入出力. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .162

プラットフォーム指定/国際文字セット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .163ファイル情報関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .163

第 9 章: 図形オブジェクト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164"Obj" フィールドの利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .165

Object フィールドの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .166Object フィールドに関する制限事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .166

オブジェクト属性の検索. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .167オブジェクトのスタイル (ペン、ブラシ、シンボル、フォント). . . . . . . . . . . . . . . . .168フォント スタイルについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .169

MapBasic 11.0 8 ユーザーズ ガイド

Page 9: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

積み上げスタイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .170スタイル変数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .172特定のスタイルを持つオブジェクトの選択. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .173

オブジェクトの新規作成. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .175オブジェクト作成文. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .175オブジェクト作成関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .176可変数ノードを持つオブジェクトの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .176オブジェクトのテーブルへの格納 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .177

既存オブジェクトに基づくオブジェクトの作成. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .178バッファの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .178統合、交差、併合の利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .178Isogram の作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .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 ユーザーズ ガイド

Page 10: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

配列引数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .197ユーザ定義タイプ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .197論理引数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .197ハンドル. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .198例 : KERNEL でのルーチンの呼び出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .198DLL のトラブルシューティングのヒント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .199

カスタム ボタン アイコンおよび描画カーソルの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . .200標準アイコンの再利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .200カスタム アイコン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .201Windows のカスタム描画カーソル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .202

DDE を利用したプロセス間の情報交換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .202DDE 会話の概要. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .203MapBasic の DDE クライアントとしての機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .203MapInfo Professional の DDE サーバとしての機能 . . . . . . . . . . . . . . . . . . . . . . . . . . .204MapInfo Professional による DDE 実行メッセージの処理 . . . . . . . . . . . . . . . . . . . . .207DDE を使用した Visual Basic との通信. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .207DDE 会話の例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .207DDE アドバイス リンク. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .208

アプリケーションへの Windows ヘルプの統合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .208

第 11 章: 統合マッピング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210統合マッピングの概念の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .211統合マッピングの技術概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .212

システム要件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .212その他の技術的注意点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .213

短いサンプル プログラム: "Hello, (Map of) World" . . . . . . . . . . . . . . . . . . . . . . . . . . . .213統合マッピングの詳しい説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .214

MapInfo Professional へのコマンドの送信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .215MapInfo Professional からのデータの照会 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .215MapInfo Professional のショートカット メニューのカスタマイズ . . . . . . . . . . . . . . .220Visual Basic プログラムの終了 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .222MapBasic コマンド文字列についての注意 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .222ダイアログ ボックスについての注意事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .222アクセラレータ キーについての注意事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .223

コールバックを使用した MapInfo Professional からの情報の取り出し . . . . . . . . . . . .223コールバックの技術要件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .223OLE コールバックの一般的な使用手順 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .224コールバックへの送信データの処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .225標準通知コールバックの C/C++ 構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .227

OLE を使用しないコールバック. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .227DDE コールバック . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .228MBX コールバック. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .228

MapBasic 11.0 10 ユーザーズ ガイド

Page 11: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

標準 MapInfo Professional ヘルプの表示. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .228オンライン ヘルプの無効化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .229カスタム ヘルプ ファイルの表示. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .229

関連 MapBasic 文および関数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .230OLE オートメーション オブジェクト モデル. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .232

MapInfo Professional プロセス内から OLE オブジェクト モデルを使用 . . . . . . . . . .234Application オブジェクトのプロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .234DockWindow オブジェクトのプロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .237MBApplications コレクションのプロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .240MBApplications オブジェクトのプロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .241MBGlobalsコレクションのプロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .242MBGlobals オブジェクトのプロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .242MIMapGen オブジェクトのプロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .243MIMapGen オブジェクトのメソッド. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .244MISearchInfo オブジェクトのプロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .246MIRow オブジェクトのメソッド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .246MIField オブジェクトのプロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .246MISelection オブジェクトのプロパティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .247

MapInfo Professional コマンドライン引数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .248統合マッピングおよび MFC を使用した Visual C++ の基本操作 . . . . . . . . . . . . . . . .249

ツールバー ボタンおよびハンドラの追加. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .253MapInfo Professional エラー トラップのための例外処理 . . . . . . . . . . . . . . . . . . . . . .255OLEオートメーションサーバーサポートの追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .255WindowContentsChanged コールバックの追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .256

その他 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .257

第 12 章: .Net の操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258用語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .259

はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .259.Net でのクラスの作成. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .260アセンブリ ファイルの構築とコピー. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .261MapBasic からのメソッドの宣言と呼び出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .261Alias でメソッドを呼び出す . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .263.Net に引数を渡す . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .263パフォーマンスについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .264

.Net での構造の操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .264カスタム変数タイプ (構造) を .Net に渡す . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .264構造を渡す場合の制限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .268

例外処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .268GAC ウィンドウの操作. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .269

Global Assembly Cache (GAC) からアセンブリとして読み込む . . . . . . . . . . . . . . . .269.Net メソッド内からの MapInfo Professional の制御. . . . . . . . . . . . . . . . . . . . . . . . . . .270

MapBasic 11.0 11 ユーザーズ ガイド

Page 12: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

.Net での統合マッピング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .272COM 経由での MapInfo Professional へのアクセス . . . . . . . . . . . . . . . . . . . . . . . . . .272コールバック メソッド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .273スレッド セーフティ問題. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .276

付録 A: サンプル プログラム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278Samples\DLLEXAMP ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .279Samples\DotNet ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .279Samples\MapBasic ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .279Samples\MFC ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .286Samples\PwrBldr ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .286Samples\VB4 ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .286Samples\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. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .307MapBasic v.7.0 以降 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .308

付録 G: MapBasic 用語集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309索引 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319

MapBasic 11.0 12 ユーザーズ ガイド

Page 13: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

1

はじめに

MapBasic® は、MapInfo Professional のカスタマイズと自動化を可能にするパ

ワフルでしかも使いやすいプログラミング言語です。

この章では、MapBasic ソフトウェアをインストールするうえで把握しておく

べき点を説明します。MapBasic の目的と機能の詳細については、MapBasicの概要を参照してください。

このセクションの構成

新機能. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14ハードウェアとソフトウェアの要件 . . . . . . . . . . . . . . . . . . . . . . . . .14MapBasic 開発環境のインストール . . . . . . . . . . . . . . . . . . . . . . . . .14MapBasic のファイル名およびファイル形式 . . . . . . . . . . . . . . . . . .15MapBasic マニュアル セット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16このマニュアルで使用する表記上の規則. . . . . . . . . . . . . . . . . . . . . .16

Page 14: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 1 章: はじめに

新機能

新機能

今回のリリースで追加された要素

• カーソル スタイルのサポートが追加されました。カーソル (122 ページ)を参照してください。

ハードウェアとソフトウェアの要件

MapBasic for Windows をインストールする前に、コンピュータが以下の 小要件を満たしている

ことを確認してください。

旧バージョンとの互換性

MapInfo Professional では、現バージョンまたは旧バージョンの MapBasic で作成されたアプリ

ケーションを実行することができます。

MapBasic 開発環境のインストール

インストールする前に

MapBasic のインストール手順を以下に示します。まず、次の操作を行ってください。

• MapBasic をインストールする前に、まず MapInfo Professional をインストールしてください。

MapInfo Professional のインストール手順については、『MapInfo Professional ユーザーズ ガイ

ド』を参照してください。

要件 対象

システム ソフトウェア • 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

MapBasic 11.0 14 ユーザーズ ガイド

Page 15: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 1 章: はじめに

MapBasic のファイル名およびファイル形式

インストール

MapBasic 開発環境は無料です。MapBasic をお手元にダウンロードするには、

http://www.pbinsight.com の Pitney Bowes Software Inc. ホームページから [Support] > [ProductDownloads] を選択し、[MapBasic] リンクをクリックしてください。ここでは、カスタム アプリ

ケーションの作成やアプリケーションへの MapInfo Professional の統合を MapBasic 開発環境を使用し

て行う際の情報も提供されています。http://go.pbinsight.com/mapbasicdocs を参照してください。

MapBasic の起動

MapBasic 開発環境を起動するには

• デスクトップ上の [MapBasic] アイコンをダブルクリックします。

• [スタート] メニューの [すべてのプログラム] をポイントし、[MapBasic 10.0] を選択します。

現在のバージョンに対するアップデート情報は、[ヘルプ] > [製品アップデート情報] を選択す

ると、いつでもチェックできます。

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 ユーザーズ ガイド

Page 16: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 1 章: はじめに

MapBasic マニュアル セット

MapBasic 開発環境下では、以下の拡張子を伴うファイルが作成されます。

MapBasic マニュアル セット

MapBasic のマニュアル セットには、『MapBasic ユーザーズ ガイド』の他に、『MapBasic リファ

レンス』およびオンライン ヘルプが含まれています。『MapBasic リファレンス』は、MapBasic のすべてのコマンドを記載したリファレンス ガイドです。ヘルプ システムには、『MapBasic リファ

レンス』のすべての情報の他に、ダイアログとメニューに関する解説が含まれています。

『MapBasic ユーザーズ ガイド』および『MapBasic リファレンス』には、次のようにしてアクセ

スします。

• http://go.pbinsight.com/mapbasicdocs からオンラインで参照します。

• ローカル コンピュータで参照します。これらのマニュアルは MapInfo Professional と一緒にイン

ストールされ、MapInfo\Professional\Documentation フォルダでアクセスできます (このフォ

ルダにある MapBasicUserGuide.pdf および MapBasicReference.pdf が目的のファイルです)。

このマニュアルで使用する表記上の規則

このマニュアルで使用する用語と表記について説明します。

misecutil.dll ソフトウェアの一部。共有実行可能ファイルが含まれています。

papersize.def MapBasic アプリケーション開発者用の Include ファイル。プリンタ制御

MapBasic 文で使用する定義が含まれています。

Samples ディレク

トリ

サンプル プログラムが含まれています。

usrinfmb.log インストール処理のログが書き込まれます。

ファイル名 説明

ファイル名 説明

filename.mb プログラム ファイル (ソース コード)

filename.mbx コンパイル済み (実行可能) ファイル

filename.mbp プロジェクト ファイル (プロジェクトに含まれるすべてのモジュールをリスト)

filename.mbo オブジェクト ファイル (プロジェクト内のモジュールをコンパイルした後に

作成されるファイル)

filename.err コンパイル エラーを含むプログラムをコンパイルすると発生するエラーの

リスト

MapBasic 11.0 16 ユーザーズ ガイド

Page 17: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 18: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 19: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 1 章: はじめに

テクニカル サポートの利用

ソフトウェアの不具合

問題の原因がソフトウェアのバグにあると考えられる場合は、担当者が問題を Pitney BowesSoftware Inc. のバグ データベースに記録し、バグの追跡に使用できるインシデント番号をお客様

にお知らせします。現在のバージョンに対して確認されたバグの多くは、今後のアップグレード

およびパッチで修正されます。

その他のリソース

MapInfo-L アーカイブ データベース

MapInfo-L (MapInfo List) は独立したディスカッション グループです。Pitney Bowes Software Inc.は、このサイトに投稿された質問に応答するためにこれをモニタしています。このディスカッ

ション グループに参加するには、次の URL にアクセスしてください。

http://groups.google.com/group/mapinfo-l?hl=en

次に、[このグループに参加する] をクリックします。

メーリング リストに送信したメッセージは、参加しているすべての人が読むことができます。

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 ユーザーズ ガイド

Page 20: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

2

MapBasic の概要

MapBasic は、MapInfo Professional マッピング ソフトウェアのカスタマイズ

と自動化を可能にするソフトウェア パッケージです。

このセクションの構成

はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21MapBasic の主要な特徴 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .22MapBasic の習得. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23MapInfo Professional 上の MapBasic ウィンドウ . . . . . . . . . . . . .25

Page 21: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 2 章: MapBasic の概要

はじめに

はじめに

MapBasic ソフトウェアは開発環境を提供します。この開発環境では、MapBasic プログラミング

言語でプログラムを作成することができます。

MapBasic 開発環境には、次のモジュールが含まれます。

• プログラムの入力に使用できるテキスト エディタ。MapBasic テキスト エディタの代わりに、

現在お使いの別のテキスト エディタを使用することもできます。詳細については、「開発環境

の使用 (26 ページ)」を参照してください。

• MapBasic コンパイラ。書き終えたプログラムをコンパイルし、"実行可能" アプリケーション

(MapInfo Professional 上で実行できるアプリケーションなど) を作成します。

• MapBasic リンカー。大規模で複雑なアプリケーションを作成する際には、プログラムをいくつ

かの個別モジュールに分割し、後でこれらのモジュールを 1 つのアプリケーションに "リンク"することができます。

• MapBasic 言語の個々の文および関数について説明する MapBasic オンライン ヘルプ。

• MapBasic プログラミング言語は、その名前から従来の BASIC 言語の名残りを感じさせます。

実際には、MapBasic プログラムは従来の BASIC プログラムとは大きく異なっています。ただ

し、MapBasic 言語と近年開発されたより新しいバージョンの BASIC 言語 (Microsoft VisualBasic 言語など) との間には類似点があります。

各 MapBasic プログラムは、MapInfo Professional と共に機能します。MapBasic 開発環境を使用

してプログラムを作成し、コンパイルした後は、MapInfo Professional を稼働してプログラムを実

行します。したがって、MapBasic プログラムはスタンドアロン型プログラムではありません。

MapBasic プログラムは、MapInfo Professional が稼働しているときに限り実行できます。

MapBasic プログラムは、MapInfo Professional 上で実行するプログラムと言うこともできます。

ただし、MapBasic は単なるマクロ言語ではありません。MapBasic は、300 以上の文と関数を備

えた完全なプログラミング言語です。さらに、MapBasic プログラムは MapInfo Professional 上で

実行されるため、MapInfo Professional が持つ地理データ管理機能のすべてを利用することができ

ます。

MapBasic アプリケーションの作成と実行

MapBasic アプリケーションの作成手順の詳細については、「開発環境の使用」を参照してくだ

さい。

手始めに何か試してみたいという方は、以下の手順に従って 初のプログラムを作成してみてく

ださい。

従来の BASIC コード サンプル MapBasic コード サンプル

20 GOSUB 300030 IF DONE = 1 THEN GOTO 9040 FOR X = 1 TO 1050 GOSUB 400060 NEXT X 80 GOTO 30

Call Check_Status(quit_time)Do While Not quit_time For x = 1 To 10Call Process_batch(x)NextLoop

MapBasic 11.0 21 ユーザーズ ガイド

Page 22: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 2 章: MapBasic の概要

MapBasic の主要な特徴

1. MapBasic 開発環境を起動します。

2. [ファイル] > [新規] を選択して編集ウィンドウを開きます。

3. 編集ウィンドウに MapBasic プログラムを入力します。適当なプログラムが思い浮かばない場合

は、次の 1 行から成る MapBasic プログラムを入力してみてください。

Note "Welcome to MapBasic!"

4. [ファイル] > [保存] を選択し、プログラムをファイルに保存します。このとき、welcome.mb などのファイル名を入力してください。

編集ウィンドウは閉じないでください。

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 ユーザーズ ガイド

Page 23: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 2 章: MapBasic の概要

MapBasic の習得

正確な経緯度を表していなければならないため、経緯線網を手で描くのは大変な作業です。

MapBasic アプリケーションを使用すれば、わずかな手作業で簡単に経緯線網を作成することがで

きます。手作業が完全に必要なくなる場合もあります。

パワフルなデータベースアクセス ツールとしての MapBasicMapBasic を使用すれば、複雑かつ高度なデータベース検索を 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 ユーザーズ ガイド

Page 24: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 2 章: MapBasic の概要

MapBasic の習得

MapBasic リファレンス アルファベット順のリファレンス ガイドでは、MapBasic 言語の個々の文および関数が詳しく説明

されています。特定の文や関数の詳細については、『MapBasic リファレンス ガイド』を参照して

ください。

サンプル プログラム

プログラマの多くは、あるプログラミング言語を学ぶための も有効な手段は、そのサンプル プログラムを学ぶことであると考えています。そのため、MapBasic にもさまざまなサンプル プログ

ラムが付属しています。MapBasic に用意されているサンプル プログラムについては、MapBasicCD 上またはダウンロード先の Samples ディレクトリを参照してください。

『MapBasic ユーザーズ ガイド』には、TextBox サンプル プログラム (textbox.mb) を使用

した例が頻繁に出てきます。MapBasic について学ぶ前に、このプログラムに慣れておくこ

とをお勧めします。

MapInfo ワークスペース ファイル

MapInfo Professional では、セッション情報 (開いたテーブルおよびウィンドウのリストなど) をワークスペース ファイルに保存できます。テキスト エディタを使用してワークスペース ファイル

を確認すると、そこに MapBasic の文が含まれていることがわかります。ワークスペース ファイ

ルから MapBasic 文をコピーし、作業中のプログラムに貼り付けることもできます。ある意味で

は、MapInfo のワークスペースは、いずれも MapBasic のサンプル プログラムであると言えます。

たとえば、細かいページ レイアウトの作成機能を持つ MapBasic プログラムを作成するとしま

す。その場合、MapInfo Professional を使用したインタラクティブ操作によりページ レイアウトを

作成し、そのレイアウトを MapInfo のワークスペース ファイルに保存します。すると、そのワー

クスペース ファイルにはページ レイアウトに関する一連の MapBasic 文が含まれることになりま

す。そのレイアウトに関連する文をワークスペース ファイルからコピーし、作業中の MapBasicプログラムに貼り付けることができるようになります。

オンライン ヘルプ

MapBasic 開発環境には、広範囲にわたるオンライン ヘルプが用意されています。オンライン ヘルプのほとんどは、MapBasic 言語の個々の文や関数について説明する参照情報です。また、ヘル

プ ファイルには、MapBasic 開発環境の操作方法も説明されています。

プログラムの入力時に文や関数の名前を選択して F1 キーを押すと、その文または関数を説

明したヘルプ ウィンドウが表示されます。

ヘルプ システムには、簡潔なサンプル プログラムが数多く含まれています。これらのプログラム

は、ヘルプ ウィンドウからコピーして作業中のプログラムに貼り付けることができます。ヘルプ

ウィンドウのテキストをクリックおよびドラッグしてコピーできます。

ヘルプ画面の表示中に MapBasic のメニューまたは編集ウィンドウをクリックすると、ヘルプ

ウィンドウが消えます。これは Windows ヘルプの標準動作です。ヘルプ ウィンドウは閉じたわけ

ではなく、単にバックグラウンドに移動しただけです。ヘルプ ウィンドウに戻るには、Alt キーを

押しながら Tab キーを押してください。また、ヘルプ ウィンドウの [ヘルプ] > [常に手前に表示]メニューをチェックしておけば、ヘルプ ウィンドウが消えるのを防ぐことができます。

MapBasic 11.0 24 ユーザーズ ガイド

Page 25: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 SoftwareInc. コンサルティング サービスの利用をご検討ください。MapBasic システム エンジニアのオン

サイト派遣をご依頼いただけます。詳細については、Pitney Bowes MapInfo Japan までお問い合

わせください。

MapBasic 11.0 25 ユーザーズ ガイド

Page 26: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

3

開発環境の使用

MapBasic ソフトウェアには、プログラムの入力に使用できるテキスト エディ

タが含まれています。[元に戻す]、[コピー]、[貼り付け] などの従来のメニュー

項目を使用することで、プログラムの編集を容易に行えます。その他のメ

ニュー項目では、プログラムをコンパイル (オプションでリンク) して実行可

能な形式に変換できます。MapBasic 言語に関するオンライン ヘルプも利用で

きます。

MapBasic テキスト エディタ、MapBasic コンパイラ、および MapBasic オン

ライン ヘルプを一括して、開発環境と呼びます。

このセクションの構成

MapBasic 開発環境の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27プログラムの編集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27プログラムのコンパイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30複数のモジュールを 1 つのプロジェクトにリンク . . . . . . . . . . . . . .33MapBasic 開発環境のメニューの概要 . . . . . . . . . . . . . . . . . . . . . . .38

Page 27: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 28: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 アクティブ プログラムを実行するよう求めるメッセージが MapInfoProfessional に送られます。

F1 ヘルプが表示されます。

MapBasic 11.0 28 ユーザーズ ガイド

Page 29: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 3 章: 開発環境の使用

プログラムの編集

関数名を選択してから F1 キーを押すと、ヘルプにはその関数に関するトピックが表示され

ます。

マウスのショートカット

MapBasic オンライン ヘルプには、コード サンプルが含まれています。ドラッグ & ドロッ

プすることで、ヘルプ ウィンドウのコード サンプルを編集ウィンドウにコピーすることが

できます。

ヘルプ ウィンドウのコード サンプルをドラッグ & ドロップし、編集ウィンドウにコピーするには

1. ヘルプを表示します。

2. コピーするテキストをヘルプ ウィンドウ内でクリックしてドラッグし、ハイライトさせます。

3. ハイライトしたテキストをクリックします。マウス ボタンを押したままテキストをヘルプ ウィ

ンドウの外にドラッグします。

4. マウス ポインタを編集ウィンドウ上に移動してマウス ボタンを離します。テキストがプログラ

ム内にドロップされます。

F8 [テキスト スタイル] ダイアログ ボックスが表示され、フォントを変

更できます。

Ctrl-F4 アクティブな編集ウィンドウが閉じます。

Alt-F4 MapBasic 開発環境が終了します。

Shift-F4 ウィンドウが並べて表示されます。

Shift-F5 ウィンドウが重ねて表示されます。

キーボード操作 操作の効果

マウス操作 操作の効果

ダブルクリック プログラム中のテキストをダブルクリックすると、単語を選択できます。エ

ラー メッセージのリストをダブルクリックすると、ウィンドウがスクロー

ルしてプログラム内のエラーの発生行が表示されます。

トリプルクリック テキスト行の全体がハイライトされます (32 ビット バージョンのみ)。

ドラッグ & ドロップ

テキストを別のウィンドウの中にドラッグすると、そのテキストがコピーさ

れます。テキストを同じウィンドウ内でドラッグすると、そのテキストの位

置が移動します(ただし、Ctrl キーを押しながらドラッグした場合は、テキ

ストがコピーされます)。

MapBasic 11.0 29 ユーザーズ ガイド

Page 30: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 3 章: 開発環境の使用

プログラムのコンパイル

MapBasic テキスト エディタの制限事項

MapBasic の各編集ウィンドウが収容できるテキストの量には限りがあります。テキスト挿入時に

MapBasic のテキスト エディタにビープ音が発生した場合は、既に編集ウィンドウが一杯であるこ

とを示します。

この容量の制限を回避するには、次の 3 つの方法があります。

• 他のテキスト エディタが使用できる場合は、そのエディタを使用してプログラムを編集する。

プログラムをコンパイルするには、MapBasic に切り替えて、[ファイルからコンパイル] メニュー コマンドを選択します。

• プログラム ファイル (.mb ファイル) を 2 つ以上の小さいファイルに分割し、MapBasic の Include文を使用してさまざまなファイルを 1 つのアプリケーションに統合する。Include 文の詳細につ

いては、『MapBasic リファレンス ガイド』を参照してください。

• プログラム ファイル (.mb ファイル) を 2 つ以上の小さいファイルに分割し、MapBasic プロ

ジェクト ファイルを作成してさまざまなプログラム ファイルを 1 つのアプリケーションにリ

ンクする。ある意味では、この操作は Include 文を利用したプログラム モジュールの結合に似

ていますが、 プロジェクト ファイルを使用する方がより効率的です。プロジェクトに含まれ

る各ファイルは別々にコンパイルできます。このため、複数モジュールの中の 1 つを編集する

場合、そのモジュールだけを再コンパイルすれば済みます。

プログラムのコンパイル

まだ MapBasic 編集ウィンドウにプログラムが表示されていなければ、表示します。次に、プログ

ラムをコンパイルするには、[プロジェクト] メニューから [現在のファイルのコンパイル] を選択し

ます。

複数の編集ウィンドウを同時に開くことができます。[現在のファイルのコンパイル] を選

択すると、一番手前のウィンドウの中にあるプログラムがコンパイルされます。したがっ

て、複数の編集ウィンドウが開いている場合は、コンパイル操作の前に適切なウィンドウ

をアクティブにする必要があります。

MapBasic コンパイラによって、プログラムの構文がチェックされます。プログラムに構文エラー

があった場合、エラーが見つかったことを示すダイアログ ボックスが表示され、編集ウィンドウ

の下にエラーの説明が表示されます。

各エラー メッセージは、そのエラーがプログラムのどの行に発生したかを示す行番号から始まり

ます。プログラムを正常にコンパイルするためには、まずプログラムのエラーを修正する必要が

あります。

MapBasic 11.0 30 ユーザーズ ガイド

Page 31: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 Fromtates 文を実行しようとします。そのとき、"tates" というテーブルが実際に存在しなければ、エ

ラー メッセージ ("テーブル tates は開かれていません" など) が表示されます。

コンパイル済みアプリケーションの実行

コンパイル済みアプリケーションを実行するには、MapInfo Professional の [ファイル] メニューか

ら [MapBasic プログラムを実行] を選択します。MapInfo Professional の [MapBasicプログラムの

実行] ダイアログ ボックスで、実行する MapBasic アプリケーション ファイル (.mbx ファイル) を選択するように求められます。

MapBasic 11.0 31 ユーザーズ ガイド

Page 32: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 3 章: 開発環境の使用

プログラムのコンパイル

MapBasic 開発環境では、プログラムを実行するショートカットも提供されています。プログラムを

コンパイルした後で、MapBasic の [プロジェクト] メニューの [実行] を選択します (または Ctrl キー

を押しながら U キーを押します)。MapBasic は、MapInfo Professional に対して、アプリケーション

を実行するように求めるメッセージを送信します。

MapInfo Professional を事前に起動しておく必要があります。

別のエディタを使用した MapBasic プログラムの作成

既にお気に入りのテキスト エディタがある場合は、そのエディタを使用して MapBasic プログラ

ムを編集することもできます。その場合も、MapBasic プログラムを標準のテキスト ファイルで保

存してください。

また、ワード プロセッサ ソフトウェアを使用してプログラムを編集することも可能です。ただ

し、ワード プロセッサでプログラムを編集した場合は、作業内容をテキスト ファイル形式で保存

するために特別な手順を踏まなければならない場合もあります。文書をテキスト形式で保存する

際には、[保存] ではなく [名前を付けて保存] がよく使われます。文書をテキスト形式で保存する手

順については、使用するワード プロセッサ ソフトウェアのドキュメントを参照してください。

別のエディタで作成されたプログラムのコンパイル

これまで、MapBasic の [現在のファイルのコンパイル] メニュー項目を使用してアクティブな編集

ウィンドウの画面上にあるプログラムをコンパイルする方法について説明してきました。MapBasicでは別の方法でプログラムをコンパイルすることもできます。それは、MapBasic の [ファイル] メニューの [ファイルからコンパイル] コマンドを利用する方法です。

MapBasic以外のテキストエディタを使ってプログラムを編集する場合は、[ファイルからコンパイ

ル] コマンドを使ってプログラムをコンパイルする方が便利です。[ファイルからコンパイル] は、

MapBasic 編集ウィンドウにプログラムを表示することなくプログラムをコンパイルします。

[ファイルからコンパイル] を選ぶと、コンパイルするファイルを選択するよう求められます。選択

したファイルにコンパイル エラーが含まれる場合、.err 拡張子の付いたテキスト ファイルにエラー

メッセージが書き込まれます。たとえば、プログラム dispatch.mb をコンパイルするために [ファイ

ルからコンパイル] を選択した場合には、テキスト ファイル dispatch.err にエラー メッセージが書

き込まれます。エラー ファイルの内容を表示するには、[ファイル] > [開く] を選択します。

コマンド ラインからのプログラムのコンパイルおよびリンク

MapBasic 以外のテキスト エディタを使用してプログラムを編集する場合、アプリケーションのコ

ンパイルやリンクを行うたびに MapBasic に切り替えなければなりません。ただし、このコンパイ

ルおよびリンク操作を自動的に行う方法があります。テキスト エディタをコマンド文字列が発行

できるように構成すると、現在のエディタを使用してプログラムをコンパイルすることが可能に

なります。

MapBasic 開発環境を開始するには、次のコマンドを実行します。

mapbasic

MapBasic 11.0 32 ユーザーズ ガイド

Page 33: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 34: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 3 章: 開発環境の使用

複数のモジュールを 1 つのプロジェクトにリンク

プロジェクトファイルを使うことの利点

• プロジェクトファイルは、皆さんのプログラミングのモジュラー化を可能にします。プロジェクト ファイルを設定した後は、プログラムをいくつもの小さなファイルに分割することができ

ます。一般に、長期的に見るとモジュラー プログラムの方が管理が容易です。また、モジュ

ラー プログラムを利用することで、プログラムが大きくなりすぎて MapBasic 編集ウィンドウ

に入りきらなくなるという事態も避けられます。

• プロジェクト ファイルを使用すれば、複数のプログラマが 1 つのプロジェクトに同時に取り組

むことができます。プロジェクト ファイルを設定した後で、各プログラマはそれぞれ個別のモ

ジュールで作業し、 後にプロジェクト ファイルを使用してモジュールを統合 (厳密に言えば

"リンク") します。

• プロジェクトファイルを使うことで、アプリケーションの再コンパイルに要する時間を短縮できます。複数モジュール プロジェクトの 1 つのモジュールを変更する場合は、そのモジュール

だけを再コンパイルしてプロジェクトを再度リンクさせればよいのです。これは、すべてのソースコードを再コンパイルする場合 (プロジェクト ファイルを使用しない場合はこうする必

要があります) に比べ、はるかに時間を短縮できます。

プロジェクト ファイルの例

TextBox アプリケーションには、次のようなプロジェクト ファイル (tbproj.mbp) が使用されてい

ます。

[Link]Application=textbox.mbxModule=textbox.mboModule=auto_lib.mbo

Module = auto_lib.mbo 同様に、ScaleBarアプリケーションは、次のようなプロジェクトファイル

(sbproj.mbp) を使っています。

[Link]Application=scalebar.mbxModule=scalebar.mboModule=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 ユーザーズ ガイド

Page 35: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 3 章: 開発環境の使用

複数のモジュールを 1 つのプロジェクトにリンク

プロジェクト ファイルの作成

プログラム ファイルが作成済みで、そのプログラム用のプロジェクト ファイルを作成する場合は、

次の手順に従ってください。

1. [ファイル] > [新規] を選択して、新規編集ウィンドウを開きます。

2. 編集ウィンドウに次の行を入力します。

[Link]

3. テキスト Application= appfilename (appfilename には、作成する実行可能ファイルのファ

イル名を指定します) を含む行を入力します。次に例を示します。

Application=C:\MB\CODE\CUSTOM.MBXApplication=Local:MapBasic:custom.mbxApplication=/MapBasic/mb_code/custom.mbx

4. テキスト Module=modulename (modulename は、MapBasic オブジェクト ファイル名です) を含む行を入力します。次に例を示します。

Module=C:\MB\CODE\CUSTOM.MBOModule=Local:MapBasic:custom.mboModule=/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 ユーザーズ ガイド

Page 36: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 3 章: 開発環境の使用

複数のモジュールを 1 つのプロジェクトにリンク

1. プロジェクトで使用される各モジュールをコンパイルします。

• モジュールをコンパイルするには、まず [ファイル] > [開く] を選択し、次に [プロジェクト] >[現在のファイルのコンパイル] を選択します。

• モジュールを表示せずにコンパイルするには、[ファイル] > [ファイルからコンパイル] を選択

します。

2. MapBasic にリンクするプロジェクト ファイルを指定するには、[プロジェクト] > [プロジェク

ト ファイルの選択] を選択します。[プロジェクト ファイルの選択] ダイアログ ボックスが表示

されます。

3. 使用するプロジェクト ファイル (.mbp) を選択して、[OK] をクリックします。選択したプロジェ

クト ファイルが編集ウィンドウに表示されます。このファイルは、MapBasic を終了するか、

プロジェクト ファイルの編集ウィンドウを閉じるか、または [プロジェクト] > [プロジェクト

ファイルの選択] コマンドを再度選択するまで、選択された状態のままとなります。1 度に選択

できるプロジェクト ファイルは 1 つだけです。

編集ウィンドウを一番手前に表示しても、選択されているプロジェクト ファイルを変更

することはできません。[ファイル] > [開く] を選択しても、選択されているプロジェクト

ファイルを変更することはできせん。リンクするプロジェクト ファイルを選択するに

は、[プロジェクト] > [プロジェクト ファイルの選択] を選択します。

4. アプリケーションをリンクするには、[プロジェクト] > [現在のファイルのリンク] を選択します。

MapBasic によって、プロジェクト ファイルに記載されたオブジェクト (.mbo) ファイルが読み出

されます。リンク エラーがなければ、実行可能 (.mbx) ファイルが作成されます。リンク エラー

がある場合は、エラー メッセージが表示されます。

また、プロジェクト ファイルを編集ウィンドウに表示せずに 1 回の操作でプロジェクトをリンク

するには、[ファイル] > [ファイルからリンク] を選択します。

MapBasic コンパイラで作成されたオブジェクト ファイルは、C 言語リンカーなどの他のリンカー

を使用してリンクすることはできません。MapBasic オブジェクト モジュールをリンクできるの

は、MapBasic リンカーだけです。

複数のファイルを開く

プロジェクト ファイルを使用する場合、プロジェクトに含まれるすべてのプログラム ファイルを

開かなければならない場合もあります。この作業を簡略化するため、[開く] ダイアログ ボックス

で複数のファイルを同時に開くことができます。

複数ファイルを同時に開くには

1. [ファイル] メニューの [開く] を選択します。

2. [プログラムを開く] ダイアログ ボックスでファイル名をクリックします。

3. Shift キーまたは Ctrl キーを押したまま、別のファイル名をクリックする。

Shift キーを押し続けると、隣り合う複数のファイルを一度に選択することができます。

Ctrl キーを押し続けると、ファイルを 1 つずつ選択できます。

MapBasic 11.0 36 ユーザーズ ガイド

Page 37: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 3 章: 開発環境の使用

複数のモジュールを 1 つのプロジェクトにリンク

他のモジュールからの関数またはプロシージャの呼び出し 複数モジュール プロジェクトの中に .MB ファイルが含まれている場合、そのファイルは他のモ

ジュール内にある関数およびサブ プロシージャを呼び出すことができます。たとえば、textbox.mbは、auto_lib ライブラリ内にある HandleInstallation プロシージャを呼び出します。他のモジュール

内にある関数またはサブ プロシージャの呼び出しは、外部参照と呼ばれます。

MapBasic プログラムが外部プロシージャを呼び出す場合、そのプログラム ファイルでは DeclareSub 文を使用する必要があります。同様に、プログラムが外部関数を呼び出す場合、そのプログラ

ム ファイルでは 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 ユーザーズ ガイド

Page 38: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 3 章: 開発環境の使用

MapBasic 開発環境のメニューの概要

MapBasic 開発環境のメニューの概要

[ファイル] メニュー

[ファイル] メニューには、MapBasic プログラムの作成、保存、終了、印刷、プログラムを開く/閉じる操作を行うためのコマンドがあります。

• [新規] を選択すると、プログラムを入力する新規編集ウィンドウが開きます。

• [開く] 選択すると、編集ウィンドウ内に既存のファイルが表示されます。MapBasic プログラム

ファイル (例 : dispatch.mb)、エラー メッセージのリスト (dispatch.err)、または MapInfoProfessional ワークスペース ファイルを開くことができます。各ワークスペース ファイルは、

実際には単に MapBasic 文を寄せ集めたテキスト ファイルです。

[開く] ダイアログ ボックスでは、2 つ以上のファイルを同時に開くことができます。複数のファ

イルを選択するには、Shift キーまたは Ctrl キーを押しながらファイル名をクリックします。

テキスト ファイルの中には、大きすぎて MapBasic 編集ウィンドウの中に入りきらない

ものもあります。この制限を回避する方法については、「MapBasic テキスト エディタ

の制限事項 (30 ページ)」を参照してください。

• [閉じる] を選択すると、アクティブな編集ウィンドウが閉じます。現在のウィンドウの内容を変

更した場合、ウィンドウを閉じる前に、変更内容を保存するかどうかを確認するメッセージが表示されます。[閉じる] は、編集ウィンドウが 1 つ以上開いている時に使用できます。

• [すべてを閉じる] を選択すると、開いている編集ウィンドウがすべて閉じます。[閉じる] コマン

ドと同様に、未保存の変更内容を保存するかどうかを確認するメッセージが表示されます。[すべてを閉じる] は、編集ウィンドウが 1 つ以上開いている時に使用できます。

• [保存] を選択すると、アクティブな編集ウィンドウの内容がディスクに保存されます。[保存] は、

編集ウィンドウの内容を変更したときに選択できます。

• [名前を付けて保存] を選択すると、アクティブな編集ウィンドウの内容が新しいファイル名で保

存されます。[名前を付けて保存] は、編集ウィンドウが開いているときに選択できます。

• [復帰] を選択すると、その編集ウィンドウを 後に保存した後のウィンドウの変更内容がすべて

削除されます。[復帰] は、編集ウィンドウの内容を変更したときに選択できます。

• [ファイルからコンパイル] を選択すると、編集ウィンドウにファイルの内容が表示されることな

く、ディスク ファイルの内容から既存の .mb ファイルが直接コンパイルされます。(これは、ア

クティブな編集ウィンドウ上のプログラムをすべてコンパイルする [プロジェクト] メニューの

[現在のファイルのコンパイル] コマンドとは対照的です。) 別のテキスト エディタで作成された

プログラムをコンパイルするには、[ファイルからコンパイル] を使用します。

[ファイルからコンパイル] を使用したときにコンパイル エラーが発生した場合、ファイル名.errという名前のテキスト ファイルにエラー メッセージが書き込まれます。エラー ファイルの内容

を表示するには、[ファイル] > [開く] を選択します。

• [ファイルからリンク] を選択すると、編集ウィンドウにプロジェクトファイルの内容が表示され

ることなく、既存のプロジェクトが直接リンクされます。(これは、現在のプロジェクトをリン

クする [プロジェクト] メニューの [現在のファイルのリンク] とは対照的です。) • [ページの設定] を選択すると、印刷のサイズや方向などの印刷設定を行えます。

• [印刷] を選択すると、アクティブな編集ウィンドウが印刷されます。

[印刷] は、編集ウィンドウが 1 つ以上開いているときに選択できます。

• [終了] を選択すると、MapBasic 環境が終了します。未保存の変更がある場合、それを保存す

るかどうかを確認するメッセージが表示されます。

MapBasic 11.0 38 ユーザーズ ガイド

Page 39: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 3 章: 開発環境の使用

MapBasic 開発環境のメニューの概要

[編集] メニュー

[編集] メニューには、MapBasic プログラムのドラフト作成および編集に利用できるコマンドが含

まれています。

• [元に戻す] を選択すると、アクティブな編集ウィンドウ上で 後に行った変更内容がキャンセル

されます。[元に戻す] を選択すると、 後の変更が削除され、メニュー項目が [繰り返し] に変わ

ります。[繰り返し] を選択すると、削除した変更が再度適用されます。

[元に戻す] は、編集ウィンドウが1つ以上開いており、かつそのウィンドウの中のテキスト が変更されている場合に使用できます。

• [切り取り] を選択すると、選択 (ハイライト) されたテキストがクリップボードにコピーされ、

編集ウィンドウからそのテキストが削除されます。テキストはクリップボードに保存されるので、[貼り付け] コマンド (下記参照) を使って他の場所に挿入できます。[切り取り] は、アク

ティブな編集ウィンドウでテキストが選択されている場合に選択できます。

• [コピー] を選択すると、選択したテキストがクリップボードにコピーされますが、そのテキスト

は削除されません。[コピー] は、アクティブな編集ウィンドウでテキストが選択されている場合

に選択できます。

• [貼り付け] を選択すると、クリップボードの内容が、アクティブな編集ウィンドウの現在のカー

ソル位置にコピーされます。編集ウィンドウでテキストを選択して [貼り付け] を実行すると、

クリップボード上のテキストが、選択したテキストに置き換わります。

[貼り付け] は、クリップボード上にテキストがあり、編集ウィンドウが1つ以上開いている場

合に使用できます。

• [クリア] を選択すると、選択したテキストがクリップボードにコピーされずに削除されます。[クリア] は、開かれた編集ウィンドウ上でテキストが選択されている場合に使用できます。

• [すべてを選択] を選択すると、アクティブな編集ウィンドウのすべての内容が選択されます。[すべてを選択] は、編集ウィンドウが1つ以上開いている場合に使用できます。

[検索] メニュー

[検索] メニューには、編集ウィンドウ上でのテキストの検索および置換を行うためのコマンドが用

意されています。これらのコマンドの中には、構文エラーを含む文を検索するプロセスを容易に

するものがあります。

• [検索] を選択すると、アクティブな編集ウィンドウで特定の文字列が検索されます。[検索] は、

編集ウィンドウが 1 つ以上開いている場合に選択できます。ある文字列の次の出現を検索する

には、[検索] テキスト ボックスに検索文字列を入力します。大文字と小文字を区別するには、[大文字と小文字を区別する] チェック ボックスをオンにします。

[検索] ボタンをクリックすると、現在の挿入ポイントから文末に向かって検索が実行されま

す。検索文字列を見つけると、その出現位置までウィンドウがスクロールされます。その文字

列が見つからない場合は、ビープ音が鳴ります。

• [再度検索] を使用すると、前の [検索] ダイアログ ボックスで指定された文字列の次の出現箇所

が検索されます。

[再度検索] は、編集ウィンドウが 1 つ以上開いており、なおかつ [検索] 操作が一度実行されて

いる場合に使用できます。

• [置換と再度検索] を選択すると、選択したテキストが [文字列の置換] ダイアログ ボックスで指定

したテキストに置き換えられた後、検索文字列の次の出現箇所を検索し、ハイライトします。

MapBasic 11.0 39 ユーザーズ ガイド

Page 40: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 3 章: 開発環境の使用

MapBasic 開発環境のメニューの概要

[次のエラー] は、構文エラーを修正する際に役立つコンパイラ機能です。プログラムが正しく

コンパイルされない場合、MapBasic では編集ウィンドウの下にエラーのリストが表示されま

す。[次のエラー] を選択すると、編集ウィンドウが下にスクロールし、エラーリスト上の次の

エラーを含むプログラムの行が表示されます。[次のエラー] は、アクティブな編集ウィンドウ

にエラー メッセージが表示されている場合に選択できます。

• [前のエラー] は [次のエラー] と似ていますが、 [前のエラー] の場合は編集ウィンドウが上にス

クロールし、エラーリスト上の 1 つ前のエラーが表示されます。[前のエラー]は、アクティブ

な編集ウィンドウに関するエラー メッセージがある場合に選択できます。

• [ジャンプ] を選択して行番号を入力すると、編集ウィンドウがスクロールしてプログラム内のそ

の行が表示されます。プログラムが正しくコンパイルされても、実行時にエラーが生じることがあります。このような場合は、プログラム内の特定の行でエラーが発生していることを示すダイアログ ボックスが

表示されます。ここで、通常は MapBasic 開発環境に戻ってプログラム中の該当行をチェック

します。[ジャンプ] は、編集ウィンドウが 1 つ以上開いている場合に使用できます。

該当するテキスト文字列をすべて置換するには

• 置き換え文字列を [置換後の文字列] ボックスに入力し、[すべて置換] ボタンをクリックします。

該当するすべての検索文字列が、[置換後の文字列] の文字列と置き換わります。

この置換操作は瞬時に実行され、確認のメッセージは表示されません。

1 回ごとに置換を確認するには

1. [検索] > [文字列の置換] を選択します。[文字列の置換] ダイアログ ボックスが表示されます。

2. [検索する文字列] および [置換後の文字列] のテキスト ボックスに適当なテキストを入力します。

3. [文字列の置換] ダイアログ ボックスで [検索] ボタンをクリックします。

その文字列の次の出現箇所が検索され、ハイライトされます。

現在ハイライトされている文字列を置換するには、Ctrl キーを押しながら R キーを押します ([置換と再度検索] メニュー コマンドのホット キー)。

現在ハイライトされている検索文字列を置換しない場合は、Ctrl キーを押しながら G キーを押

します ([再度検索] メニュー コマンドのホットキー)。

[プロジェクト] メニュー

[プロジェクト] メニューを使用して、MapBasic プログラムのコンパイルと実行、プログラム統計

データの表示、およびエラー ウィンドウの表示/非表示を行います。

• [プロジェクト ファイルの選択] を選択すると、既存のプロジェクト ファイルを開くためのダイ

アログ ボックスが表示されます。プロジェクト ファイルは、アプリケーションを構成するす

べてのモジュールがリストされたテキスト ファイルです。プロジェクト ファイルを選択する

と、そのファイルはアクティブなプロジェクト ファイルとなり、[現在のファイルのリンク] を選択することでそのファイルをコンパイルできます。

MapBasic 11.0 40 ユーザーズ ガイド

Page 41: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 3 章: 開発環境の使用

MapBasic 開発環境のメニューの概要

• [現在のファイルのコンパイル] を選択すると、アクティブな編集ウィンドウ上のプログラムがコ

ンパイルされます。[現在のファイルのコンパイル] は、編集ウィンドウが 1 つ以上開いている

場合に選択できます。

コンパイラがプログラム中の構文エラーを検出すると、MapBasic では編集ウィンドウの下にエ

ラーのリストが表示されます。構文エラーがない場合は、mbx ファイル (そのモジュールがスタン

ドアロン型プログラムの場合) またはオブジェクト モジュール (mbo) ファイルが作成されます。

• [現在のファイルのリンク] を選択すると、現在のプロジェクト ファイルに記載されたモジュー

ルがリンクされ、実行可能アプリケーション ファイルが作成されます (ただし、エラーがある

場合はエラー メッセージが表示されます)。[現在のファイルのリンク] は、プロジェクトファイ

ルが開いている場合に選択できます。

• [実行] を選択すると、一番手前の編集ウィンドウ上にあるアプリケーションを実行するように

求めるメッセージが MapInfo Professional ソフトウェアに送信されます。

• [情報] を選択すると、アクティブな編集ウィンドウ上のプログラムに関する統計データが表示さ

れます。[オブジェクト情報] は、編集ウィンドウが 1 つ以上開いている場合に選択できます。

• [エラーリストを表示/非表示] を選択すると、アクティブな編集ウィンドウの関連エラー リスト

機能がアクティブまたは非アクティブになります。エラーリストが現在表示されている場合、このメニュー項目は [エラーリストを非表示] となります。エラーリストが現在隠れている場合

は [エラーリストを表示] となります。[エラーリストを表示/非表示] は、関連エラーメッセー

ジが存在するような編集ウィンドウが開いている場合に使用できます。

[ウィンドウ] メニュー

編集ウィンドウが 1 つ以上開いている場合、MapBasic の [ウィンドウ] メニューを使って、ウィン

ドウの整理やアクティブ ウィンドウの切り替えを行うことができます。

このメニューのコマンドは、編集ウィンドウが 1 つ以上開いている場合に使用できます。

• [ウィンドウを並べて表示] を選択すると、編集ウィンドウが横に並んで表示されます。

• [ウィンドウを重ねて表示] を選択すると、編集ウィンドウが重なって表示されます。

• [アイコンの整列] を選択すると、 小化された編集ウィンドウに対応するアイコンが整理されま

す。編集ウィンドウの 小化ボタンをクリックすると、ウィンドウは一時的にアイコンに縮小されます。

• [テキスト スタイル] を選択すると、ウィンドウの表示に使用するフォントが選択できます。選択

されたフォントは、ウィンドウ全体に適用されます。

• ウィンドウ メニューの下には、開いている各編集ウィンドウのメニュー項目がリストされます。

編集ウィンドウの 1 つをアクティブにする (そのウィンドウを一番手前に表示する) には、ウィン

ドウ メニューの下から適切なウィンドウ名を選択します。

MapBasic 11.0 41 ユーザーズ ガイド

Page 42: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 3 章: 開発環境の使用

MapBasic 開発環境のメニューの概要

[ヘルプ] メニュー

[ヘルプ] メニューを使用すると、オンラインヘルプにアクセスすることができます。オンライン

ヘルプ ファイルでは、MapBasic 言語で使われるすべての文および関数について説明しています。

また、必要な文の名前が検索できる総合クロス リファレンス画面も含まれています。

• [目次] を選択すると、ヘルプ ウィンドウの目次画面が表示されます。ここでハイパーテキスト

ジャンプをクリックしてヘルプを参照するか、[検索] ボタンをクリックして [検索] ダイアログ

ボックスを表示します。

• [ヘルプの検索] を選択すると、[検索] ダイアログ ボックスに直接ジャンプできます。

• [ヘルプの使い方] を選択すると、オンライン ヘルプの操作方法を示したヘルプ画面が表示され

ます。

• [更新の有無をチェック] を選択すると、Pitney Bowes Software Inc. Web サイトが開き、製品

に適用できる更新をすべて示した専用ページが表示されます。

• [MapBasic について] を選択すると、著作権およびバージョン番号情報を示した [MapBasicにつ

いて] ダイアログ ボックスが表示されます。

ヘルプ画面の多くには、短いサンプル プログラムが含まれています。これらのプログラム

は、その一部をクリップボードにコピーしてプログラムに貼り付けることもできます。ヘ

ルプ画面からテキストをコピーするには、ヘルプ ウィンドウの [編集] メニューから [編集]> [コピー] を選択します。ヘルプウィンドウからテキストをドラッグして、プログラムに

ドロップすることもできます。

MapBasic 11.0 42 ユーザーズ ガイド

Page 43: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

4

MapBasic の基本

この章では、MapBasic プログラムの構文に関する多くの基本事項を説明しま

す。MapBasic プログラマの方は必ずお読みください。

このセクションの構成

MapBasic 構文の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50ループ、分岐、フロー制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .60プロシージャ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64システム イベント ハンドラの役割を果たすプロシージャ . . . . . . . .67ハンドラ プロシージャに関するヒント . . . . . . . . . . . . . . . . . . . . . . .71コンパイラ命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .73プログラム編成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .74

Page 44: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 45: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 Integercounter = 23

MapBasic 11.0 45 ユーザーズ ガイド

Page 46: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 4 章: MapBasic の基本

MapBasic 構文の概要

個々の変数名をコンマで区切ると、1 つの Dim 文を用いて複数の変数を宣言することができま

す。次の Dim 文では、3 つの浮動小数変数を宣言します。

Dim total_distance, longitude, latitude As Floatlongitude = -73.55latitude = 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 ユーザーズ ガイド

Page 47: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 4 章: MapBasic の基本

MapBasic 構文の概要

固定長および可変長文字列変数

MapBasic では、固定長と可変長の文字列変数がサポートされています。可変長文字列変数は、

大 32,767 文字の長さを持つあらゆる文字列値を格納することができます。これに対して、固定長

文字列変数には Dim 文で指定した長さの制限があります。

可変長文字列変数を宣言するには、変数タイプとして String を使用します。固定長文字列変数を

宣言するには、String キーワードとアスタリスク (*) の後に、文字列の長さを表すバイト数を挿入

します。次の例では、full_name を可変長文字列変数、employee_id を 9 文字の固定長文字列変数

として宣言します。

Dim full_name As String,employee_id As String * 9

他の 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( ) 関数を使用すると、現在の配列サイズを確認できます。

Alias テーブルのフィールド参照。詳細については、「テーブル操作」を参照してくだ

さい。

Pen ペン (ライン) スタイル設定。「図形オブジェクト」を参照してください。

Brush ブラシ (フィル) スタイル設定。「図形オブジェクト」を参照してください。

タイプ 説明

MapBasic 11.0 47 ユーザーズ ガイド

Page 48: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 employeename As Stringtitle As Stringid As Integer

End TypeDim 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 ユーザーズ ガイド

Page 49: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 SubSub 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 ユーザーズ ガイド

Page 50: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 4 章: MapBasic の基本

変数の範囲

サブ プロシージャでは、グローバル変数と同名のローカル変数を宣言できます。したがって、プ

ログラムに counter というグローバル変数が含まれているとき、そのプログラムのサブ プロシー

ジャに counter というローカル変数が含まれていることもあります。

Declare Sub MainDeclare Sub setupGlobal counter As Integer...Sub setup

Dim counter As Integercounter = 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 ユーザーズ ガイド

Page 51: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 4 章: MapBasic の基本

演算子とは

演算子とは、1 つ以上の定数、変数、またはその他の値を操作する特別な文字 (例 : +、*、>) や単

語 (例 : And、Or、Not) です。式は、演算子によって組み合わされた 2 つ以上の値で構成される場

合があります。次の例では、式 y + z の中でプラス演算子 (+) が加算に使用されています。加算の

結果 (合計) は、変数 x に割り当てられます。

Dim x, y, z As Floaty = 1.5z = 2.7x = 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 ユーザーズ ガイド

Page 52: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 4 章: MapBasic の基本

Dim x As Floatx = Sqr(2)

同様に、次のプログラムでは現在の日付を表す日付値を返す CurDate( ) 関数が使用されています。

Dim today, yesterday As Datetoday = 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 Integeri_num = &H1A

数値定数は、コンマ (1000桁セパレータ) を含むことはできません。したがって、次の文は正しく

コンパイルされません。

counter = 1,250,000 ’ This won’t work!

数値定数が小数点 (小数セパレータ) を含む場合、セパレータ文字はピリオドにする必要がありま

す。これは、ユーザのコンピュータで小数セパレータとしてこれ以外の文字が設定されていても

同じです。

文字列定数

文字列定数は二重引用符で囲みます。次に例を示します。

last_name = "Nichols"

各文字列定数には、 長 256 文字まで指定することができます。

MapBasic 11.0 52 ユーザーズ ガイド

Page 53: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 Logicaledits_pending = FALSE

日付定数

日付定数を指定するには、YYYYMMDD というフォーマットで 8 桁の整数を入力します。次の例で

は、1995 年 12 月 31 日を指定します。

Dim d_enddate As Dated_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 日を表すことになります。

ユーザのコンピュータがセパレータとして "-" を使用するように設定されていると、MapInfoProfessional は "12/31" のような文字列式を日付に変換できません。

予測可能な結果を確実に得るためには、8 桁の数値日付構文を受け取る NumberToDate( ) 関数を使

用します。(19951231 のような数値日付定数は、ユーザのコンピュータの設定に左右されることは

ありません。) テキスト ファイルから日付を読み取る場合のように、文字列を日付値として使用する

必要がある場合は、Set Format 文を使用して文字列の解釈方法を指定します。Set Format 文の詳細

については、『MapBasic リファレンス ガイド』またはオンライン ヘルプを参照してください。

Microsoft Windows で日付フォーマット化オプションを設定するには、[地域の設定] コントロール

パネルを使用します。

MapBasic 11.0 53 ユーザーズ ガイド

Page 54: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 4 章: MapBasic の基本

別名定数

別名変数については、「テーブル操作」で詳しく説明します。次に示すように、別名タイプ変数

には文字列式を割り当てることができます。次に例を示します。

Dim column_name As Aliascolumn_name = "City"

以下の表に、さまざまなタイプの定数の例を示します。

タイプ 割り当てのサンプル 備考

Integer i = 1234567

SmallInt m = 90

Float f = 4size = 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 = 19940105date_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 ユーザーズ ガイド

Page 55: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 つの数値を数値演算子を使って組み合わせると、結果と

しての数値を得ることができます。

\ および Mod 演算子は、整数除算を行います。次に例を示します。

マイナス記号 (-) 演算子は、負の数値の表示にも使用されます。

x = -23

演算子 処理 例

+ 加算 x = a + b

- 減算 x = a - b

* 乗算 x = a * b

/ 除算 x = a / b

\ 整数除算 x = a \ b

Mod 整数の余り x = a Mod b

^ 累乗 x = a ^ b

10 / 8 次の値を返します。 1.25

10 \ 8 次の値を返します。 1 (1.25 の整数部分)

10 Mod 8 次の値を返します。 2 (10 を 8 で割った余り)

MapBasic 11.0 55 ユーザーズ ガイド

Page 56: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 4 章: MapBasic の基本

文字列演算子

プラス演算子 (+) は、2 つ以上の文字列式を 1 つの長い文字列式に連結します。

Note "Employee name: " + first_name + " " + last_name

文字列の連結には、プラス演算子の代わりにアンパサンド演算子 (&) を使うこともできます。& 演算子は、両方のオペランドを強制的に文字列に変換して、それらを連結します。数字または日付

を文字列に強制変換することなく連結する + 演算子とは異なります。

& 文字は、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 ユーザーズ ガイド

Page 57: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 4 章: MapBasic の基本

これらの比較演算子は、それぞれ文字列式、数値式、または日付式の比較に使用されます。ただ

し、比較演算子はオブジェクト式、ペン式、ブラシ式、シンボル式、またはフォント式の比較に

は使用できません。

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 リファレンス ガイド』を参照してください。

固定長文字列と可変長文字列を比較する場合は、注意が必要です。MapBasic は、割り当て

られたスペースを埋めるため、必要に応じて固定長文字列に自動的にスペースを補充しま

す。一方、可変長文字列はこのようにスペースが補充されることはありません。これは、

データと変数にもよりますが、一見同じに見える 2 つの文字列が実際は等しくない場合も

あることを意味します。

演算子 TRUE が返される条件 例

= ~と等しい If a = b Then...

<> ~と等しくない 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...

MapBasic 11.0 57 ユーザーズ ガイド

Page 58: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 4 章: MapBasic の基本

RTrim$( ) 関数を使用すると、スペースを自動的に追加せずに固定長文字列を作成できます。

RTrim$( ) 関数によって返された値はそのまま可変長文字列と比較でき、追加されたスペースの影

響を考慮する必要がありません。

論理演算子

論理演算子は論理値に対して使用され、TRUE または FALSE の論理結果を生成します。

たとえば、次の If...Then 文は、変数 x が 0 より小さいかどうか、および 10 より大きいかどうか

を調べる 2 つのテストを実行します。いずれか一方のテストで条件に合致しないと、エラー メッ

セージが表示されます。

If x < 0 Or x > 10 Then Note "Number is out of range."

End If

地理演算子

地理演算子はオブジェクト式に対して使用され、TRUE または FALSE の論理結果が生成されます。

演算子 TRUE が返される条件 例

And 両方のオペランドが TRUE である

If a And b Then...

Or どちらかのオペランドが TRUEである

If a Or b Then...

Not オペランドが FALSE である。 If Not a Then...

演算子 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 ユーザーズ ガイド

Page 59: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 4 章: MapBasic の基本

図形オブジェクトの詳細については、「図形オブジェクト」を参照してください。

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の各演算子の優先順位を表したものです。

演算子が同じ行にある場合、優先順位が同等であることを意味します。優先順位の高い順に計算

されます。同じ優先順位の演算子の場合は左から順に計算されます (ただし、累乗は例外で右から

左に計算されます)。

Entirely Within 初のオブジェクト全体が 2 番目

のオブジェクトの中にある If a Entirely Within b Then...

Intersects 2 つのオブジェクトがある点で交

差する

If a Intersects b Then...

演算子 TRUE が返される条件 例

も優先順位が高いもの :

も優先順位が低いもの :

括弧

累乗

乗算、除算、Mod、整数除算

加算、減算、文字列結合 (&)

地理演算子、比較演算子、Like

Not

And

Or

MapBasic 11.0 59 ユーザーズ ガイド

Page 60: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ThenNote "Error: The counter is too low." Call reset_counter

End If

If...Then 文では、オプションの Else 句を使用できます。 初のテスト条件が FALSE だった場

合、MapBasic はキーワード Then に続く文ではなく、キーワード Else に続く文を実行します。

次の例に、オプションの Else 句を示します。

If counter < 0 ThenNote "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 ThenNote "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

ここで、ElseIf は単独のキーワードであることに注意してください。1 つの If...Then 文で

連続した 2 つ以上の ElseIf 句を使用して、条件を続けてテストすることができます。ただ

し、2 ~ 3 個以上の条件をテストする場合は、ElseIf 句を多数含む If...Then 文を作成する

よりも、Do...Case 文 (下記参照) を使用することをお勧めします。

MapBasic 11.0 60 ユーザーズ ガイド

Page 61: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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, 6report_title = "Second Quarter Results" quarter = 2

Case 7, 8, 9report_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 = 4End Case

Case Else は Do Case 文のオプションの句です。Do Case 文に Case Else 句が含まれる

場合、その前にある Case 句がすべてテスト式と一致しない場合に、MapBasic は CaseElse 句に続く文を実行します。Case Else 句は、Do Case 構造の 終句にする必要があり

ます。

MapBasic 11.0 61 ユーザーズ ガイド

Page 62: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 63: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 4 章: MapBasic の基本

ループ、分岐、フロー制御

Do...LoopDo...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 ユーザーズ ガイド

Page 64: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 4 章: MapBasic の基本

プロシージャ

プログラムの終了

End Program 文を使用すると、MapBasic アプリケーションが停止し、アプリケーションによっ

て作成されたカスタム メニュー項目がすべて削除され、さらにメモリからアプリケーションが消

去されます。また End Program は、そのアプリケーションによって (Open File 文によって) 開か

れたすべてのファイルを閉じます。ただし、開いているテーブルは閉じません。

End Program 文は必須ではありません。実際には、End Program 文を発行しないよう注意が必要

な場合もあります。たとえば、使用しているアプリケーションによって MapInfo Professional メニューに新しいメニュー項目が追加される場合、それらのカスタム メニュー項目が MapInfoProfessional セッション終了時まで利用できるように、セッションが継続している間はアプリケー

ションが実行されていることが理想的です。このような場合、End Program 文を発行するとアプ

リケーションが停止し、アプリケーションのカスタム メニュー項目がすべて削除されてしまうた

め、発行しないように注意する必要があります。カスタム メニューの詳細については、「ユーザ

インターフェイスの作成」を参照してください。

プログラムと MapInfo Professional の終了

End MapInfo 文を使用すると、(End Program 文と同様) MapBasic アプリケーションが停止さ

れ、さらに MapInfo Professional ソフトウェアも終了されます。

プロシージャ

プロシージャ (しばしばサブプロシージャと呼ばれます) は、MapBasic プログラム アーキテク

チャの重要な部分です。一般的な MapBasic プログラムは、数多くのサブプロシージャで構成され

ます。各サブプロシージャには、特定のタスクを実行する一連の文が含まれています。プログラ

ムを複数のサブプロシージャに分割することでプログラムをモジュール化すると、長期的にはプ

ログラムの開発と管理が容易になります。

Main プロシージャ

どのMapBasicプログラムも、Main プロシージャと呼ばれるプロシージャを 1 つ以上持っていま

す。MapBasic アプリケーションを実行すると、そのアプリケーションの Main プロシージャが自動

的に呼び出されます。

次のプログラムは、Main プロシージャを明示的に宣言する構文を示したものです。この例では、

Main プロシージャは単純に Note 文を発行します。

Declare Sub MainSub Main

Note "Hello from MapBasic!" End Sub

MapBasic 11.0 64 ユーザーズ ガイド

Page 65: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 Datereport_date = "01/01/94"

MapBasic 11.0 65 ユーザーズ ガイド

Page 66: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 SmallIntelapsed_days = CurDate() - last_dateIf 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...EndSub 文の中のパラメータ名の前にキーワード ByVal を挿入します。

パラメータが値により渡される場合は、次の規則が適用されます。

• Call 文では、変数名をパラメータとして指定する必要はありません。Call 文では、変数名、定

数値、またはその他の式を指定することができます。

• 呼び出されたサブプロシージャによって、値により渡されるパラメータに新しい値が割り当てられても、呼び出し側のプロシージャは影響を受けません。つまり、サブプロシージャは値により渡されるパラメータを使って呼び出し手に値を返すことは"できません"。

次の例は、値により渡される 2 つの日付パラメータを取るプロシージャ (display_date_range) を示

したものです。

MapBasic 11.0 66 ユーザーズ ガイド

Page 67: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 68: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 4 章: MapBasic の基本

システム イベント ハンドラの役割を果たすプロシージャ

システム イベントとは

グラフィカル ユーザ インターフェイス環境においては、ユーザは入力操作やマウス操作を通じて

制御を行います。専門的には、ユーザによるマウスクリックやその他の操作は "システム イベント

" を生成すると言います。イベントには多くの種類があります。たとえば、ユーザがメニュー項目

を選択した場合は、ユーザがメニュー選択イベントを生成したと言います。ユーザがウィンドウ

を閉じた場合は、ユーザがウィンドウ クローズ イベントを生成したと言います。

イベント ハンドラとは

イベント ハンドラは、MapBasic プログラムの中においてシステム イベントに反応する部分で

す。ユーザが何らかのイベントを生成すると、アプリケーションはそれに対して適切に反応しな

ければなりません。たとえば、ユーザがメニュー選択イベントを生成したときに、ソフトウェア

でダイアログを表示する必要がある場合があります。また、ユーザがウィンドウクローズ イベン

トを生成した場合、ソフトウェアはメニュー項目をグレイ表示にするか、メニュー全体を非表示

にしなければならない場合もあります。

MapBasic では、サブプロシージャはイベント ハンドラとしての役割を果たすことができます。つ

まり、特定のシステム イベントが発生した場合にだけ MapBasic が対応するサブプロシージャを

自動的に呼び出すように、プログラムを構築することができます。

メニューまたはボタンパッドの選択に反応するイベント ハンドラを構築するには、「ユーザ イン

ターフェイスの作成」を参照してください。その他の種類のシステム イベント ハンドラを構築す

るには、まず特殊な名前を持つサブプロシージャを定義する必要があります。たとえば、ユーザ

がウィンドウを閉じるたびにプログラムが自動的に反応するようにするには、アプリケーション

の中に WinClosedHandler という名前のプロシージャを含める必要があります。

次の表に、MapBasic で使用されるすべての特殊ハンドラ名を示します。これらの特殊ハンドラの詳

細については、『MapBasic リファレンス ガイド』およびオンライン ヘルプを参照してください。

特殊ハンドラ名 ハンドラ プロシージャまたは関数の特徴

EndHandlerEndHandler アプリケーションが終了するか、またはユーザが MapInfoProfessional を終了すると呼び出されます。EndHandler は、

クリーンアップ作業 (一時作業ファイルの削除など) の実行に

使用されます。

ForegroundTaskSwitchHandler MapInfo Professional がフォーカスを得る (アクティブなアプ

リケーションとなる) か、またはフォーカスを失うと呼び出さ

れます。

RemoteMapGenHandler OLE オートメーション クライアントが MapGenHandler メソッ

ドを呼び出したときに呼び出されます。主に MapInfo ProServerアプリケーションで使用されます。

RemoteMsgHandler アプリケーションがプロセス間通信 (DDE) のサーバの役割を

果たしているときに、リモート クライアントが実行リクエス

トを送信すると呼び出されます。

MapBasic 11.0 68 ユーザーズ ガイド

Page 69: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 4 章: MapBasic の基本

システム イベント ハンドラの役割を果たすプロシージャ

通常、上記の特殊プロシージャの呼び出しには Call 文を使用する必要はありません。プログラム

中にこれらの特殊名が付いたプロシージャが 1 つ以上含まれる場合、特定のシステム イベントが

発生した場合に限り、それに対応するプロシージャが "自動的に" 呼び出されます。たとえば、プ

ログラムに WinClosedHandler というプロシージャが含まれている場合、ユーザがウィンドウを

閉じる度に、自動的に WinClosedHandler プロシージャが呼び出されます。

特殊ハンドラ プロシージャはすべてオプションです。したがって、ウィンドウが閉じられるたび

にアプリケーションに通知されるようにするには、WinClosedHandler プロシージャのみをアプ

リケーションに含めます。同様に、選択内容が変更されるたびにアプリケーションに通知される

ようにするには、SelChangedHandler プロシージャのみをアプリケーションに含めます。

次のプログラムでは、ToolHandler という名前を持つ特殊イベント ハンドラ プロシージャを定義

しています。このプログラムには Call 文が含まれていないことに注意してください。このプログ

ラムが実行されると、ユーザが MapBasic ツールを選んでマップ ウィンドウ、ブラウザ ウィンド

ウ、レイアウト ウィンドウのいずれかをクリックした場合に限り、ToolHandler プロシージャが

自動的に呼び出されます。

RemoteQueryHandler プロセス間通信 (DDE) でアプリケーションがサーバの役割を

果たしているときに、リモート クライアントが peek リクエス

トを送信すると呼び出されます。

SelChangedHandler Selection テーブルが変更されるたびに呼び出されます。

Selection テーブルは頻繁に変更されるため、システムの処理

速度の低下を防ぐためにも、SelChangedHandler プロシー

ジャはできるだけ短くします。

ToolHandler ユーザがマップ ウィンドウ、ブラウザ ウィンドウ、レイアウト

ウィンドウのいずれかで MapBasic ツールを使用してクリック

すると呼び出されます。

WinChangedHandler ユーザがマップ ウィンドウに表示されたエリアを移動、スク

ロール、またはその他の操作を通じてリセットすると呼び出

されます。マップ ウィンドウは頻繁に変更されるため、シス

テムの処理速度の低下を防ぐためにも、WinChangedHandlerプロシージャはできるだけ短くします。

WinClosedHandler ユーザがマップ ウィンドウ、ブラウザ ウィンドウ、グラフ

ウィンドウ、レイアウト ウィンドウのいずれかを閉じると呼び

出されます。

WinFocusChangedHandler ウィンドウのフォーカスが変化される (例 : ユーザがアクティ

ブなウィンドウを変更する) と呼び出されます。

特殊ハンドラ名 ハンドラ プロシージャまたは関数の特徴

MapBasic 11.0 69 ユーザーズ ガイド

Page 70: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 4 章: MapBasic の基本

システム イベント ハンドラの役割を果たすプロシージャ

Include "mapbasic.def"

Declare Sub MainDeclare 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 SubSub 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 ユーザーズ ガイド

Page 71: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 4 章: MapBasic の基本

ハンドラ プロシージャに関するヒント

アプリケーション中のいずれかのプロシージャによって 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 ユーザーズ ガイド

Page 72: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 StringSub Main

Dim dollar_amount As String dollar_amount = money_format( 1234567.89 )

’ dollar_amount now contains the string: "$1,234,567.89" End SubFunction money_format(ByVal num As Float) As String

money_format = Format$(num, "$,#.##;($,#.##)") End Function

関数の範囲

プログラムでは、MapBasic の標準関数と同名のカスタム関数を定義することができます。プログ

ラムによってこの関数が呼び出されると、標準関数ではなくカスタム関数が実行されます。

MapBasic 11.0 72 ユーザーズ ガイド

Page 73: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 74: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 statementsType...End Type statementsDeclare Sub statementsDeclare Function statementsDefine statements Global statements

次に、Main プロシージャの定義が続きます。

MapBasic 11.0 74 ユーザーズ ガイド

Page 75: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 4 章: MapBasic の基本

プログラム編成

Sub Main Dim statements

...End Sub

次に、その他のサブプロシージャの定義が続きます。

Sub ...Dim statements

...End Sub

次に、カスタム関数の定義が続きます。

Function ...Dim statements ...

End Function

MapBasic 11.0 75 ユーザーズ ガイド

Page 76: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

5

実行時エラーのデバッグおよびトラップ

正しくコンパイルされたプログラムにも、実行時エラー (プログラムの実行時

に発生するエラー) が発生する可能性が残されています。たとえば、プログラ

ムで大型データベース ファイルを作成した場合、ディスクに空き容量がない

のにプログラムを実行すると、エラーが発生する可能性があります。

この章では、実行時エラーの処理方法について説明します。エラー処理は、ま

ずプログラムをデバッグしてエラーの発生箇所を検索し、次にそのエラーが繰

り返し発生しないようプログラムを修正するという 2 段階のプロセスから成り

ます。

このセクションの構成

実行時エラー動作. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .77MapBasic プログラムのデバッグ . . . . . . . . . . . . . . . . . . . . . . . . . . .77エラー トラップ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79

Page 77: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 78: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 79: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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$() のセクションを参照してください。

MapBasicは、一度に 1 つのエラーしか処理できません。エラー トラップを有効にしている

ときにエラーが発生すると、MapBasic の処理はエラー処理ルーチンにジャンプします。エ

ラー処理ルーチンの内部 (つまり Resume 文の前) で別のエラーが発生した場合、

MapBasic アプリケーションは停止します。

MapBasic 11.0 79 ユーザーズ ガイド

Page 80: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 5 章: 実行時エラーのデバッグ およびトラップ

エラー トラップ

エラー トラップの例

次のプログラムでは、orders というテーブルが開かれてマップ ウィンドウとブラウザ ウィンドウ

に表示されます。ここでは、bad_openというエラートラップルーチンによって Open Table 文に

関するエラーが処理されます。第 2 のエラー トラップ ルーチンである not_mappable では、Map文に関するエラーが処理されます。

Sub orders_setupÅf At the start, error trapping is disabledOnError 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 ユーザーズ ガイド

Page 81: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

6

ユーザ インターフェイスの作成

ユーザ インターフェイスは、どのアプリケーションにとっても重要な要素で

す。MapBasic には、MapInfo Professional ユーザ インターフェイスのカスタ

マイズに必要なあらゆるツールが用意されています。

このセクションの構成

MapBasic ユーザ インターフェイスの概要 . . . . . . . . . . . . . . . . . . .82イベントドリブン プログラミング . . . . . . . . . . . . . . . . . . . . . . . . . .82メニュー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84標準ダイアログ ボックス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .94カスタム ダイアログ ボックス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .96ウィンドウ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .105ボタンパッド ( ツールバー ). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .113カーソル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .122MapInfo Professional へのアプリケーションの統合 . . . . . . . . . . .122ユーザ インターフェイスを効果的に使用するためのヒント. . . . . .124

Page 82: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 83: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 84: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 6 章: ユーザ インターフェイスの作成

メニュー

プログラムによるダイアログ ボックス イベントの処理

カスタム MapBasic ダイアログ ボックスは、ハンドラ プロシージャを呼び出すことができます。

したがって、チェックボックスを含むカスタム ダイアログ ボックスを作成すると、MapBasic はユーザがチェックボックスをオンまたはオフにするたびにハンドラ プロシージャを呼び出すこと

ができます。ただし、アプリケーションによってはダイアログ ボックスにハンドラを作成する必

要がない場合もあります。カスタム ダイアログ ボックスの詳細については、「カスタム ダイアロ

グ ボックス (96 ページ)」を参照してください。

メニュー

メニューは、グラフィカル ユーザ インターフェイスの重要な要素です。したがって、MapBasic言語は MapInfo Professional メニュー構造のあらゆる部分の制御を可能にします。2 ~ 3 行のコー

ドによって、MapInfo Professional のメニューまたはメニュー項目のそれぞれまたはすべてをカス

タマイズすることができます。

メニューの基本

MapInfo Professional のメニュー構造は、次の要素から成っています。

メニュー バーは、MapInfo Professional の作業エリアの一番上を横切る水平バーです。MapInfoProfessional のデフォルト メニュー バーには、[ファイル]、[編集]、[オブジェクト]、[検索] などの

メニューが表示されます。

メニューは、メニュー バーをクリックするとドロップ ダウンする縦長のコマンド リストです。た

とえば、大半のアプリケーションには [ファイル] メニューと [編集] メニューが含まれています。

メニュー項目は、メニュー上にある個々のコマンドを指します。たとえば、通常 [ファイル] メニューには [開く]、[閉じる]、[保存]、[印刷] などのメニュー項目が含まれています。メニュー項目

はコマンドと呼ばれる場合もあります (例 : [ファイル] > [保存] コマンド)。

1 メニュー、 2 メニュー バー、 3 メニュー項目

1

2

3

MapBasic 11.0 84 ユーザーズ ガイド

Page 85: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 86: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 6 章: ユーザ インターフェイスの作成

メニュー

メニューからの項目の削除

アプリケーションを使用して個々のメニュー項目を削除することができます。次の文は、MapInfoProfessional の [テーブル] > [テーブル管理] メニューから [テーブルの削除] 項目を削除します。こ

こで、識別子 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 ユーザーズ ガイド

Page 87: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 88: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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] を選択すると、次の文が発行され、メニュー項目の名前が [ResumeTraking] に変更されます。

Alter Menu Item MenuToggler Text "Resume Tracking"

MapInfo Professional では、状況に応じて標準メニュー項目が自動的に選択可能または選択不可能

になります。たとえば、[ウィンドウ] > [マップ ウィンドウを表示] コマンドは、マップ作成可能な

テーブルが開いている場合に限り選択可能となります。MapInfo Professional では、その標準メ

ニュー項目は自動的に変更されるため、MapBasic アプリケーションを使用してこれらのメニュー

項目を選択可能または不可能にすることは避けてください。

MapBasic 11.0 88 ユーザーズ ガイド

Page 89: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 の項を参照してください。MapInfoProfessional の標準メニュー定義に戻すには、Create Menu Bar As Default 文を発行します。

言語独立メニュー参照の指定

前述の例の大半は、メニューを名前 (例 : "ファイル") で参照しています。これとは別の構文を使用

して MapInfo Professional の標準メニューを参照することも可能です。これは、標準メニューを

ID 番号で指定するという方法です。たとえば、[ファイル] メニューが "ファイル" と参照されてい

るメニュー関連文では、そのメニューを ID 1 と参照することができます。次の文は、[検索] メニュー (ID 番号は 3) をメニュー バーから削除します。

Alter Menu Bar Remove ID 3

MapBasic 11.0 89 ユーザーズ ガイド

Page 90: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 91: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 92: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 は、MapInfoProfessional が認識可能なホット キー コードです。/w は、そのコードが MapInfo Professional forWindows のものであることを指定し、カレット (^) はユーザが 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 文が含まれています。これらの文は、MapInfoProfessional の標準メニュー定義 ([ファイル]、[編集] など) を定義します。メニューから 1 つ以上

メニュー項目を削除する場合は、該当する Create Menu 文から適切な行を削除します。

MapBasic 11.0 92 ユーザーズ ガイド

Page 93: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 94: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 6 章: ユーザ インターフェイスの作成

標準ダイアログ ボックス

同様に、MapInfo Professional のメニュー バーからメニュー全体を削除するには、メニュー

ファイルの中にある Create Menu Bar 文を編集します。

MapInfo Professional がネットワーク上にインストールされている場合に、MapInfo Professionalがインストールされたディレクトリの中にあるメニュー ファイルを変更すると、その変更内容

はネットワーク上のすべての MapInfo Professional ユーザに影響を与えます。ときには、異なる

ネットワーク ユーザに対して異なるメニュー構造を作成したい場合もあります。たとえば、大

半のユーザが利用するようなメニューからは [テーブルの削除] コマンドを削除し、ネットワーク

システム管理者は引き続きこのコマンドが使用できるようにしたいと考えるかもしれません。

個々のユーザにカスタム メニュー構造を割り当てるには、そのユーザの "ホーム" ディレクト

リの中にメニュー ファイルのカスタム バージョンを置きます。Windows ユーザのホーム ディ

レクトリは、そのユーザのプライベート Windows ディレクトリ (WIN.INI を含むディレクトリ)として定義されています。

個々のユーザにカスタム メニュー構造を割り当てるには、そのユーザの "ホーム" ディレクト

リ/フォルダの中にメニュー ファイルのカスタム バージョンを置きます。メニュー ファイルは

System ディレクトリに直接置くことも、System ディレクトリの Preferences ディレクトリに

置くこともできます。

MapInfo Professional を実行すると、メニュー ファイルのコピーがユーザのホーム ディレクトリ

内にあるかどうかがチェックされます。ユーザのホーム ディレクトリ内にメニュー ファイルの

コピーがあれば、そのメニューが読み込まれます。メニュー ファイルがないと、MapInfoProfessional がインストールされているディレクトリからメニュー ファイルが読み込まれます。

したがって、ユーザに応じて 2 つの異なるバージョンのメニュー構造を表示する場合は、まず

メニュー ファイルの異なる 2 つのバージョンを作成します。そして、大半のユーザが使用する

バージョンを MapInfo Professional がインストールされているディレクトリに、 指定ユーザが

使用するバージョンを個々のユーザのホーム ディレクトリの中に置きます。

標準ダイアログ ボックス

ダイアログ ボックスは、ユーザ インターフェイスの重要な要素です。MapBasic には、アプリケー

ションのダイアログ ボックス作成を助けるいくつかの異なる文および関数が用意されています。

メッセージの表示メッセージと [OK] ボタンから成るシンプルなダイアログ ボックスを表示するには、Note 文を使

用します。

MapBasic 11.0 94 ユーザーズ ガイド

Page 95: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 6 章: ユーザ インターフェイスの作成

標準ダイアログ ボックス

はい/いいえの質問

プロンプトと 2 つのボタンから成るダイアログ ボックスを表示するには、Ask( ) 関数を使用しま

す。2 つのボタンには通常 [OK] および [キャンセル] と表示されますが、アプリケーションに応じ

てボタンをカスタマイズすることも可能です。ユーザが [OK] ボタンを選択すると TRUE が、それ

以外の場合は FALSE が返されます。

ファイルの選択

標準の [ファイルを開く] ダイアログ ボックスを表示するには、FileOpenDlg( ) 関数を呼び出しま

す。この関数は、ユーザがファイルを選択すると、そのファイルの名前を返します。ユーザがダ

イアログ ボックスをキャンセルすると、空の文字列を返します。

FileOpenDlg( ) 関数は次のようなダイアログ ボックスを表示します。

FileSaveAsDlg( ) 関数は、標準のファイル保存ダイアログ ボックスを表示し、ユーザが入力した

ファイルの名前を返します。

MapBasic 11.0 95 ユーザーズ ガイド

Page 96: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 97: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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_searchforControl OKButton

Title "Search" Position 30, 30

Control CancelButtonPosition 90, 30

2 つの Control 節に Position 節が含まれたため、ダイアログの表示は次のように変化します。

MapBasic 11.0 97 ユーザーズ ガイド

Page 98: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 StaticText ボックス 2 GroupBox 3 RadioGroup 4 ListBox 5 PopupMenu 6 Button 7 OKButton 8 EditText ボックス 9 Picker (SymbolPicker) 10 MultiListBox 11 Checkbox12 CancelButton

StaticText

StaticText は、ダイアログ ボックスにラベルを表示する非対話型コントロールです。次に例を示し

ます。

Control StaticTextTitle "Enter map title:" Position 5, 10

9

8

10

11

12

5

4

3

2

1

6

7

MapBasic 11.0 98 ユーザーズ ガイド

Page 99: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 RadioGroupTitle "&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 SymbolPickerPosition 95, 45 Into sym_variable ID 3

ListBox

ListBox コントロールは、ユーザが 1 つの項目を選択できるスクロール可能なリストです。項目が

多すぎて一度に表示しきれない場合、自動的に ListBox の右端に垂直のスクロール バーが追加さ

れます。次に例を示します。

Control ListBoxTitle "First Qrtr;2nd Qrtr;3rd Qrtr;4th Qrtr"Value 4Into i_quarter ID 4Position 5, 90 Width 65 Height 35

MapBasic 11.0 99 ユーザーズ ガイド

Page 100: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 6 章: ユーザ インターフェイスの作成

カスタム ダイアログ ボックス

MultiListBox

MultiListBox は ListBox に似ていますが、ユーザが Shift キーまたは Ctrl キーを押しながら複数の項

目を選択できるという点が異なります。次に例を示します。

Control MultiListBoxTitle "Streets;Highways;Towns;Counties;States" Value 3 ID 5Position 95, 90 Width 65 Height 35

PopupMenu

PopupMenu は、右端に下向きの矢印が付いたテキスト項目です。ユーザがこのコントロールをク

リックすると、メニューがポップアップ表示されて選択できるようになります。次に例を示します。

Control PopupMenuTitle "Town;County;Territory;Entire state"Value 2 Into i_scope ID 6Position 5, 140

CheckBox

CheckBox は、ボックスの付いたラベルです。ユーザはコントロールをクリックすることで、この

ボックスをオンまたはオフにすることができます。次に例を示します。

Control CheckBoxTitle "Include &Legend"Into l_showlegendID 7Position 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 ユーザーズ ガイド

Page 101: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 6 章: ユーザ インターフェイスの作成

カスタム ダイアログ ボックス

1 つのダイアログ ボックスに、OKButton コントロールまたは CancelButton コントロールを複

数含めることはできません。いずれのコントロールもオプションですが、 一般に、ユーザにダイ

アログ ボックスの消去手段を提供するため、各ダイアログ ボックスには [OK] ボタンまたは [キャ

ンセル] ボタンのいずれかまたは両方を含めることをお勧めします。一方のコントロールがハンド

ラを持っている場合、MapBasic はそのハンドラ プロシージャを実行した後、Dialog 文に続く文

から実行を再開します。

各タイプのコントロールの詳細については、『MapBasic リファレンス ガイド』およびオンライン

ヘルプを参照してください。 たとえば、ListBox コントロールについて調べる場合は、ControlListbox の項を参照してください。

コントロールの初期値の指定

ほとんどのコントロール タイプには、オプションの 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 リファレンス ガイド』を参照してください。

MapInfo Professional は、ユーザが [OK] をクリックしてダイアログを終了した場合に限り、

ダイアログ終了後に Into 変数を更新します。ダイアログ ボックス ハンドラ プロシージャの

中からコントロール値を読み取る必要がある場合は、ReadControlValue( ) 関数を呼び出し

ます。

MapBasic 11.0 101 ユーザーズ ガイド

Page 102: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 103: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 6 章: ユーザ インターフェイスの作成

カスタム ダイアログ ボックス

選択可能/不可能コントロール

コントロールは、 初に表示されたときには選択可能 (クリック可能) または選択不可能 (グレイ表

示) のいずれかの状態にあります。どのコントロールも、デフォルトでは選択可能となっています。

ダイアログ ボックス コントロールを選択不可能にするには、次の 2 とおりの方法があります。

• Dialog 文の Control 節の中に、オプション キーワードの Disable を記述する。ダイアログ ボッ

クスが表示されると、コントロールは選択不可能になります。

• ハンドラ プロシージャの中で Alter Control 文を発行してコントロールを選択不可能にする。

ダイアログ ボックスが表示されると同時にコントロールが選択不可能になるように設定するに

は、Control 節の中にない Calling 節を記述することで、ダイアログ ボックス自身にハンドラ

プロシージャを割り当てます。ダイアログ ボックスが 初に表示されると、このハンドラが 1回呼び出されます。また、このハンドラの中で、Alter Control 文を発行することができます。

この方法はより複雑ですが、より柔軟でもあります。たとえば、コントロールを指定条件下でのみ選択不可能にする場合は、If…Then 文の中で Alter Control 文を発行します。

Alter Control 文を使用してダイアログ ボックス コントロールを変更する場合は、Dialog 文の中に ID 節を含めることで、コントロールに ID 番号を割り当てる必要があります。この例

については、『MapBasic リファレンス ガイド』またはオンライン ヘルプの Alter Controlの項を参照してください。

ユーザのリスト選択を可能にする

ListBox コントロールには、選択項目のリストが表示されます。ListBox コントロールの中に表示

される項目のリストを指定するには、次の 2 とおりの方法があります。

• リストの項目をセミコロンで区切り、それらをすべて含む文字列式を作成する。次に例を示します。

Control ListBoxTitle "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 ユーザーズ ガイド

Page 104: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 6 章: ユーザ インターフェイスの作成

カスタム ダイアログ ボックス

れたリスト項目の番号を返し、次の呼び出しは次に選択されたリスト項目の番号を返します。

ReadControlValue( ) が 0 を返した場合は、選択項目がなくなったことを意味します。

ReadControlValue( ) が 初の呼び出し時に 0 を返した場合は、リスト項目がまったく選択されて

いないことを表します。

ハンドラ プロシージャの中において、Alter Control 文を発行してコントロールに 0 を割り当てる

と、MultiListBox コントロールのすべての項目の選択が解除されます。選択された項目の中にリスト

項目を追加するには、0 でない正の値を使用して Alter Control 文を発行します。たとえば、

MultiListBox コントロールの 初および 2 番目の項目を選択するには、次のような文を発行します。

Alter Control 1 Value 1Alter 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] または [キャンセル] をクリックするなどして) ダイアログ ボックスを終了しない限り、MapInfoProfessional の他の操作を行うことはできません。

MapBasic 11.0 104 ユーザーズ ガイド

Page 105: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 6 章: ユーザ インターフェイスの作成

ウィンドウ

一方、モードレス ダイアログ ボックス、つまり、画面上に表示されていてもユーザが他の操作を

行えるようなダイアログ ボックスもあります。たとえば、MapInfo Professional の [イメージ登録]ダイアログ ボックスはモードレスです。Dialog 文では、モードレス ダイアログ ボックスを作成

することはできません。モードレス ダイアログ ボックスを作成するには、Visual Basic などの別

のプログラミング環境でアプリケーションを開発し、MapBasic のプログラムの中で (RunProgram 文を使用して) そのアプリケーションを呼び出す必要があります。

ダイアログ ボックスの終了

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 ユーザーズ ガイド

Page 106: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 が参

照されます。

ウィンドウ 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 worldPosition (2,1) Units "in"Height 3 Units "in"Width 4 Units "in"

• Set Window 文を発行して、開かれたウィンドウのサイズおよび位置を操作する。Set Window文には整数のウィンドウ ID が必要であることに注意してください。

MapBasic 11.0 106 ユーザーズ ガイド

Page 107: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ポイント テーブルは逆距離加重補間法 (InverseDistance Weighting - IDW) により連続面データへと変換されます。この強力な主題図は、通信、販

売分析、保険、伝統的な GIS などの幅広い分野で有効に利用できます。この新しく追加された主

題図とグリッド形式は、新たなグリッド形式や補間法を可能にするオープン API によってサポー

トされており、開発者環境でカスタマイズすることができます。『MapBasic リファレンス ガイ

ド』の Create Grid 文の項を参照してください。グリッド主題図を変更するには Set Map 文の

Inflect 節を使用します。

マップ ウィンドウの投影法を変更するには、CoordSys 節を含む Set Map 文を発行します。ま

た、(Commit Table…As 文を使用して) テーブルを特定の投影法で保存すると、マップを特定の投

影法で表示することができます。

マップ ウィンドウ上のスクロール バーの表示と非表示を操作するには、Set Window 文を発行し

ます。

MapBasic 11.0 107 ユーザーズ ガイド

Page 108: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 109: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 6 章: ユーザ インターフェイスの作成

ウィンドウ

Add Map Layer Trucks Animate

しかし、ここで問題が発生します。Trucks レイヤは、一度は通常のマップ レイヤとして、一度は

アニメーション レイヤとして、合計 2 度マップ ウィンドウに現われることになります。Trucks レイヤは依然として通常のレイヤとして表示されているため、画面更新を迅速に実行できません。

つまり、マップ ウィンドウの更新データは以前と同じ速度で再描画されるため、アニメーション

レイヤを使用するメリットがなくなります。

次の例は、この場合の対策を示したものです。ここでは、Trucks レイヤをアニメーション レイヤ

として追加する前に、"通常の" Trucks レイヤ表示がオフにされています。

’temporarily prevent screen updatesSet 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 layerAdd 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 ユーザーズ ガイド

Page 110: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 111: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 レコードの内容が表示されます。ユーザは、情報ウィンドウ

でレコードを編集することができます。情報ウィンドウの操作とカスタマイズを行うには、SetWindow 文を使用します。次の図に、カスタム情報ウィンドウを示します。

次のプログラムでは、上記のカスタム情報ウィンドウを作成できます。

Include "mapbasic.def" Open Table "World" Interactive Select

Country, Capital, Inflat_Rate + 0 "Inflation" From WorldInto World_Query

MapBasic 11.0 111 ユーザーズ ガイド

Page 112: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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

結合テーブル (例 : StreetInfo テーブル) または Group By 節を使って集合値を計算する検索

テーブルを表示すると、情報ウィンドウのすべてのフィールドは書き込み禁止となります。

MapBasic 11.0 112 ユーザーズ ガイド

Page 113: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 6 章: ユーザ インターフェイスの作成

ボタンパッド (ツールバー)

ボタンパッド (ツールバー)

ボタンパッドは、1 つ以上のボタンを含む、サイズ変更と移動表示が可能なウィンドウです。ユー

ザは、ボタンパッドからボタンを選択することで、さまざまな操作を行うことができます。

"ボタンパッド" と "ツールバー" は、まったく同じものを意味します。MapInfo Professional のユー

ザ インターフェイスでは、"ツールバー" と呼ばれます。たとえば、MapInfo Professional の [オプ

ション] メニューには、MapInfo Professional ユーザがツールバーの表示/非表示を操作できる [ツー

ルバー] コマンドがあります。一方、MapBasic 言語の構文では、ツールバーは "ボタンパッド" と呼

ばれます。たとえば、ツールバーの表示/非表示の操作には、Alter ButtonPad 文が使用されます。

MapInfo Professional には、メイン ボタンパッドのようないくつかの標準ボタンパッドがありま

す。MapBasic プログラムでは、既存ボタンパッドにカスタム ボタンを追加したり、まったく新し

いボタンパッドを作成したりできます。

ユーザがボタンを選択したときの動作

メニュー項目と同様に、カスタム ボタンにもハンドラ プロシージャが割り当てられています。

ユーザがカスタム ボタンを操作すると、MapBasic は自動的にそのボタンのハンドラ プロシー

ジャを呼び出します。したがって、ユーザがボタンをクリックするたびにカスタム ダイアログ

ボックスが表示されるようにするには、ダイアログ ボックスを表示するサブ プロシージャを作成

し、そのプロシージャをカスタム ボタンのハンドラにします。

MapBasic プログラムでは、ツールボタン、トグルボタン、プッシュボタンの 3 種類のボタンが作

成できます。ボタン タイプによって、MapBasic がそのボタンのハンドラを呼び出す条件が異なり

ます。

• プッシュボタン : ユーザがプッシュボタンをクリックすると、ボタンが上に戻り、そのプッシュ

ボタンのハンドラ プロシージャが呼び出されます。

[レイヤ管理] ボタンは、プッシュボタンの一種です。[レイヤ管理] ボタンをクリックすると、す

ぐにダイアログ ボックスが表示されますが、ボタンの状態には持続的な変化は起こりません。

• トグルボタン : ユーザがトグルボタンをクリックすると、ボタンがチェックされている (押され

た) 状態とチェックされていない (押されていない) 状態の間で切り替わります。ユーザがトグ

ルボタンをクリックするたびに、そのボタンのハンドラ プロシージャが呼び出されます。

[凡例ウィンドウを表示 (凡例ウィンドウを非表示)] ボタンは、トグルボタンの一種です。この

ボタンをクリックすると、凡例ウィンドウの表示と非表示が瞬時に切り替わります。さらに、

ボタンは押されたままの状態、または押されていない状態で保持されます。

• ツールボタン : ユーザがツールボタンをクリックすると、そのボタンはアクティブ ツールとな

り、ユーザが別のツールを選択するまでアクティブの状態であり続けます。カスタム ボタンが

ツールとして選択されている時にマップ、ブラウザ、またはレイアウトのいずれかのウィンドウをクリックすると、そのボタンのハンドラ プロシージャが呼び出されます。

拡大ツールは、ツールボタンの一種です。このツールを選択しても、マップはすぐには拡大され

ませんが、ツールを選択してからマップ ウィンドウをクリックすると、マップが拡大されます。

MapBasic 11.0 113 ユーザーズ ガイド

Page 114: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 115: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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

PushButtonIcon MI_ICON_ZOOM_QUESTION Calling button_promptHelpMsg "Displays the query dialog\nQuery"

Show End SubSub 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 ユーザーズ ガイド

Page 116: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 6 章: ユーザ インターフェイスの作成

ボタンパッド (ツールバー)

Calling 節で、ユーザがこのカスタム ボタンをクリックするたびに button_prompt プロシージャを

呼び出すよう MapBasic に指示します。

HelpMsg 節で、このボタンに対するステータス バーのヘルプ メッセージとツールチップのヘルプ

メッセージの両方を定義します。ヘルプ メッセージについては、「ボタンへのヘルプ メッセージ

の割り当て (120 ページ)」を参照してください。

イメージ サイズに関する注意事項については、『MapBasic リファレンス』の「Create ButtonPad文」 を参照してください。

メイン ボタンパッドへのボタンの追加

上記の例は、Create ButtonPad 文を使用してまったく新しいボタンパッドを作成するものでし

た。この他にも、MapBasic ではメイン ボタンパッドなどの MapInfo Professional のデフォルト ボタンパッドにカスタム ボタンを追加することができます。既存のボタンパッドにボタンを追加す

るには、次の例に示すように、Create ButtonPad 文ではなく Alter ButtonPad 文を使用します。

Alter ButtonPad "Main"Add SeparatorAdd PushButton

Icon MI_ICON_ZOOM_QUESTIONCalling button_promptHelpMsg "Displays the query dialog\nQuery"

Show

Add PushButton 節は、メイン ボタンパッドにカスタム ボタンを追加します。Add Separator 節は、新規ボタンと既存ボタンの間にスペースを挿入します。Add Separator 節はオプションで、

ボタンを異なるグループに分けるときに利用します。

MapInfo Professional には、MapBasic ユーティリティ プログラムでカスタム ボタンを追加できる

ツールと呼ばれる特殊なボタンパッドがあります。たとえば、ScaleBar ユーティリティは、その

ボタンをツール ボタンパッドに追加します。

カスタム ツールボタンの作成

上記の例は、カスタム プッシュボタンを作成するものでした。この他にも、MapBasic では拡大

ツールやライン ツールなど、MapInfo Professional ツールとして機能するカスタム ツールボタン

を作成することができます。プログラムでカスタム ツールボタンを作成すると、ユーザはその

ツールを選択して使用し、マップ、ブラウザ、レイアウトの各ウィンドウ上でクリックしたり、

場合によってはドラッグしたりできるようになります。

次の例では、カスタム ツールボタンを作成します。このツールを選択すると、ユーザはマップ

ウィンドウ上でクリックまたはドラッグが行えます。マウスをドラッグすると、現在のカーソル位

置とユーザがクリックした場所をつなぐラインが表示されます。このラインは動的に変化します。

Include "icons.def"Include "mapbasic.def"Declare Sub Main Declare Sub draw_via_button

MapBasic 11.0 116 ユーザーズ ガイド

Page 117: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 6 章: ユーザ インターフェイスの作成

ボタンパッド (ツールバー)

Sub MainCreate ButtonPad "Custom" As

ToolButtonIcon MI_ICON_LINE DrawMode DM_CUSTOM_LINE Cursor MI_CURSOR_CROSSHAIR Calling draw_via_buttonHelpMsg "Draws a line on a Map window\nDraw Line"

ShowEnd SubSub draw_via_button

Dim x1, y1,x2, y2 As FloatIf 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( ) が呼び出され、クリックした場所が確認されます。

ユーザが Esc キーを押して操作をキャンセルした場合、ハンドラ プロシージャは呼び出さ

れません。

MapBasic 11.0 117 ユーザーズ ガイド

Page 118: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 6 章: ユーザ インターフェイスの作成

ボタンパッド (ツールバー)

カスタム ボタンのアイコンの選択

カスタム ボタンを定義する際には、そのボタン上に表示されるアイコンを設定します。使用する

アイコンの指定には、Icon 節を使用します。

キーワード Icon の後には、ICONS.DEF からのコードが続きます。たとえば、次の文では、

MapInfo Professional の [情報] ボタンのアイコンを使用するカスタム ボタンを定義します。コード

MI_ICON_INFO は、ICONS.DEF に定義されています。

Alter ButtonPad "Main"Add SeparatorAdd PushButton

Icon MI_ICON_INFO Calling procedure_name

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 ユーザーズ ガイド

Page 119: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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

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 ユーザーズ ガイド

Page 120: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 の [選択] ボタンを表します。各標準 MapInfoProfessional ボタンは、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 文が含まれています。

MAPINFOW.MNU のボタン定義をコピーして、プログラムの中に貼り付けることもできます。

ボタンへのヘルプ メッセージの割り当て

ユーザは、アイコンを見ただけではそのツールバー ボタンの機能を理解できないことがあります。

そのため、MapBasic では、ユーザを助ける 2 種類のヘルプ メッセージを画面上に作成できます。

• ステータス バー ヘルプ :ボタンの簡単な説明を表示します。このタイプのヘルプ メッセージ

は、MapInfo Professional のステータス バーに表示されます (ステータス バーが表示されてい

る場合)。• ツールチップ ヘルプ :ボタンの名前を表示します。このタイプのヘルプ メッセージは、マウス

カーソルの隣に表示されます。

以前のバージョンの MapInfo Professional では、ユーザがボタンをクリックしたときにしかステー

タス バー ヘルプが表示されませんでした。バージョン 4.0 以降では、ステータス バー ヘルプおよ

びツールチップ ヘルプは、ユーザがマウス カーソルをツールバー ボタンに合わせると表示される

ようになっています。

MapBasic 11.0 120 ユーザーズ ガイド

Page 121: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 6 章: ユーザ インターフェイスの作成

ボタンパッド (ツールバー)

どちらのヘルプ メッセージも、Create ButtonPad 文および Alter ButtonPad 文の中にある

HelpMsg 節によって定義されます。HelpMsg 節では、まずステータス バー ヘルプ メッセージを

含む 1 つの文字列を指定して、その後に \n とツールチップ メッセージをこの順番で続けます。

次に例を示します。

Create ButtonPad "Custom" AsPushButton

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 ユーザーズ ガイド

Page 122: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 6 章: ユーザ インターフェイスの作成

カーソル

カーソル

MapInfo Professional ユーザは、X キーを押すことによって十字型カーソル スタイルを変更できま

す。MapInfo Professional アプリケーションのカーソルと MapBasic アプリケーションのカーソルは

別々に管理されているので、MapInfo Professional のカーソル スタイルを変更しても、MapBasic のカーソル スタイルは変更されません。その逆も同じです。

MapBasic では、MapInfo Professional のツールの十字型カーソル スタイルの変更をサポートして

いません。また、MapBasic アプリケーション内で X キーを押すことによるカーソル スタイルの

変更もサポートしていません。ただし、MapBasic アプリケーション内で使用する十字型カーソル

スタイルにアクセスすることはできます。icons.def ファイルには、以下の十字型カーソルが定義

されています。

カーソル スタイルを設定する例を以下に示します。

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 では、ショートカット アイコンのコマンド ラインを変更することができます。ショート

カット アイコンを右クリックして [プロパティ] を選択し、[ショートカット] タブをクリックします。

MI_CURSOR_CROSSHAIR 138 小さな青い十字型カーソルを表示します。

MI_CURSOR_LRG_CROSSHAIR 164 大きな青い十字型カーソルを表示します。

MI_CURSOR_TINY_CROSSHAIR 165 小さな XOR 十字型カーソルを表示します。

MapBasic 11.0 122 ユーザーズ ガイド

Page 123: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 という名前が付いており、MapInfoProfessional がインストールされているディレクトリまたはユーザのプライベート Windows ディ

レクトリ (WIN.INI が格納されているディレクトリ) の中に存在します。STARTUP.WOR が両方の

ディレクトリ内に存在する場合は、ユーザが MapInfo Professional を起動すると、両方のワークス

ペースが実行されます。

ネットワーク環境において、ある Startup ワークスペースをネットワーク上のすべての MapInfoProfessional ユーザに適用するには、その Startup ワークスペース ファイルを MapInfo Professionalがインストールされているディレクトリに格納する必要があります。すべてのネットワーク ユーザ

に同じ Startup ワークスペース ファイルを実行させたくない場合は、Startup ワークスペースを別の

場所に置きます (Windows では、ワークスペースをユーザのプライベート Windows ディレクトリの

中に置きます)。

MapBasic 11.0 123 ユーザーズ ガイド

Page 124: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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] を選択して [AboutTextBox] ダイアログ ボックスを閉じます。

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 ユーザーズ ガイド

Page 125: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 6 章: ユーザ インターフェイスの作成

ユーザ インターフェイスを効果的に使用するためのヒント

不必要なウィンドウ再描画の回避

アプリケーションによってマップ ウィンドウ (またはマップ ウィンドウ上のオブジェクト) が変更

されると、MapInfo Professional はその都度ウィンドウの再描画を行います。アプリケーションに

よって何回か変更操作が行われると、マップ ウィンドウも同じ回数再描画されます。これは、

ユーザをイライラさせかねません。

不必要なウィンドウの再描画を抑えるには、次の 2 とおりの方法があります。

• 特定のマップ ウィンドウの不必要な再描画を抑えるには、Set Map…Redraw Off 文を使用し

ます。その後で、そのマップ ウィンドウに影響を与えるあらゆる文を発行します。マップの更

新を終了した後は、Set Map…Redraw On 文を使用してウィンドウの再描画を許可します。こ

うすることで、1 回の再描画ですべての変更箇所をウィンドウに表示できます。

• すべての MapInfo Professional ウィンドウの不必要な再描画を抑えるには、Set Event ProcessingOff 文を使用します。さまざまなウィンドウの更新を終了してから、Set Event Processing On 文を発行します。こうすることで、画面は 1 回だけ再描画されます。

メッセージ ウィンドウの破棄

Print 文を使用すると、メッセージ ウィンドウにテキストを出力できます。

ただし、メッセージ ウィンドウに大量のテキストを出力すると、それ以降の Print 文の処理

が大幅に遅くなります。

プログラムでメッセージ ウィンドウに大量のテキストを出力する場合は、Print Chr$(12) 文を

発行してメッセージ ウィンドウを定期的にクリアします。

進捗バー ダイアログ ボックスの表示抑制

アプリケーションで MapInfo Professional の 小化を行う場合は、Set ProgressBars Off 文を使

用して進捗バーが表示されないようにすることをお勧めします。

MapInfo Professional の 小化処理中に進捗バーが表示されると、進捗バーは 小化処理が完了す

るまでフリーズします。進捗バーの表示を抑えると、MapInfo Professional を 小化処理中も操作

を継続することができます。

MapBasic 11.0 125 ユーザーズ ガイド

Page 126: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

7

テーブル操作

MapBasic には、テーブルを使った作業に必要なあらゆる文および関数が用意

されています。たとえば、Alter Table 文ではテーブル定義の変更を、Fetchではテーブルのレコードの検索を行えます。また、Import 文はテキスト ファ

イルからの MapInfo テーブルの作成、Export 文は異なる形式へのテーブルの

エキスポートを可能にします。

この章は、MapInfo テーブルの管理に使用できる MapBasic の文および関数に

ついて説明します。各文および詳細については、『MapBasic リファレンス』

を参照してください。

このセクションの構成

MapBasic からテーブルを開く. . . . . . . . . . . . . . . 127テーブルの新規作成. . . . . . . . . . . . . . . . . . . . 134システム レイヤへのアクセス . . . . . . . . . . . . . . . 139レイアウト ウィンドウへのアクセス . . . . . . . . . . . . 140マルチユーザ編集. . . . . . . . . . . . . . . . . . . . . 140テーブルを構成するファイル. . . . . . . . . . . . . . . . 144ラスタ イメージ テーブル . . . . . . . . . . . . . . . . . 145メタデータの操作. . . . . . . . . . . . . . . . . . . . . 146シームレス テーブルの操作 . . . . . . . . . . . . . . . . 149DBMS データへのアクセス . . . . . . . . . . . . . . . . 151リンク テーブルを使用したリモート データベースへのアクセスと、

その更新 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .154テーブル操作をより効果的に行うためのヒント. . . . . . . . 155

Page 127: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 StatesBrowse * From Pipelinei = NumCols(Parcels)

プログラムが扱うテーブルの名前を限定したい場合もあれば、限定したくない場合もあります。た

とえば、ユーザに開いたテーブルのリストからテーブルを選ばせたい場合は、 選択されるテーブル

の名前を予め予想することはできないため、それをプログラムの中に記述することはできません。

テーブル名を格納するには、文字列変数を使用します。Zoning という名前のテーブルが開いてい

る場合は、次のような文を発行することができます。

Dim work_table As Stringwork_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 ユーザーズ ガイド

Page 128: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 7 章: テーブル操作

MapBasic からテーブルを開く

この動作によって、テーブルがどの別名で開かれたかが推測できなくなる場合もあります。

しかし、次の例に示すように、TableInfo( ) 関数を使うとテーブルが開かれた別名を決定すること

ができます。

Include "mapbasic.def"Dim s_filename As StringOpen Table "states" Interactives_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 で変更できない場合は、そのテーブルのコピーを (CommitTable...As 文を使用して) 作成し、そのコピーを変更します。

開いた MapInfo テーブルからレポート ファイルを作成

MapInfo Professional 付属の Seagate Crystal Reports が提供する業界標準の Report writer により MapInfoProfessional から高品質表形式レポートの作成が可能になります。Crystal Reports のわかりやすい環境

でプロ仕様のレポートを作成してください。『MapBasic リファレンス ガイド』の Create ReportFrom Table 文および Open Report 文の項を参照してください。

MapBasic 11.0 128 ユーザーズ ガイド

Page 129: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 7 章: テーブル操作

テーブルの行およびフィールド値の読み取り

テーブルの行およびフィールド値の読み取り

MapBasic プログラムは、次の手順に従って、テーブルの指定行の指定フィールドの値にアクセス

することができます。

1. Fetch 文を使用し、検索するテーブルの行を指定します。この操作によって、現在行が設定さ

れます。

2. テーブル参照式 (例:tablename.columnname) を使い、現在行の指定フィールドにアクセス

する。

たとえば、次のプログラムは、World テーブルの 1 行目の Coutnry フィールドの内容を読み取り

ます。

Dim s_name As String Open Table "world" Interactive Fetch First From worlds_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 ユーザーズ ガイド

Page 130: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 7 章: テーブル操作

テーブルの行およびフィールド値の読み取り

この構文を使用すると、実行時に参照するフィールドを決定する MapBasic プログラムを作成でき

ます。

テーブル参照におけるテーブル名は、既にテーブル名が含まれている文ではオプションとなりま

す。たとえば、Browse 文では、フィールド名を指定してからテーブル名を指定することが必要に

なります。しかし、ここではテーブル名が既に文 (From 節) の中で明示指定されているため、行の

冒頭のフィールド参照には、tablename を含む必要はありません。

Select Country, Population/1000000 From WorldBrowse Country, Col2 From Selection

Select 文も、検索するテーブルの名前を指定する From 節があります。Select 文の中のフィールド

名には、tablename. 接頭辞を必要としません (Select 文で 1 つのテーブルだけを検索する場合)。ただし、Select 文の From 節が複数のテーブルを含む場合は、フィールド参照に tablename. 接頭辞が含まれなければなりません。SQL Select 文操作の一般的な説明については、『MapInfoProfessional ユーザーズ ガイド』か、『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 Aliasval_col = "Inflat_Rate"Select * From world Where val_col > 4

MapBasic は、val_col (別名 Inflat_Rate) の内容を Select 文に代入し、インフレ率が 4% を超える国をすべて選択します。

別名の長さは 32 文字までです。

MapBasic 11.0 130 ユーザーズ ガイド

Page 131: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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_nameOpen 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 AliasOpen Table "world"Fetch First From worldtab_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 ユーザーズ ガイド

Page 132: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 7 章: テーブル操作

テーブルの行およびフィールド値の読み取り

"RowID" フィールド名を使用した行番号 (レコード番号) の参照

RowID は、テーブルの行の行番号を表す特殊なフィールドの名前です。RowID はフィールドとし

て解釈できますが、実際にテーブルの中には格納されません。RowID は、使用できても目には見

えない "仮想フィールド" であると考えてください。テーブルの行の RowID 値は、1 行目が 1、2行目が 2 ... というようになっています。

次の例では、World テーブルの 初の行を選択します。

Select * from world Where RowID = 1

次の例は、RowID を使い、1990 年の人口が中間値を超える州を Select を通じてすべて選択します。

Dim median_row As IntegerSelect * From states Order By pop_1990 Into bypopmedian_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 ユーザーズ ガイド

Page 133: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 134: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 135: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 プログラムでは、AlterTable や Create Index などの文の発行によってテーブル定義を変更することができます。

原則として、テーブル上に未保存の編集内容が存在する間は、そのテーブルの定義は変更できま

せん。テーブルに行を追加した後でまだテーブルを保存していない場合は、テーブル上に未保存

の編集内容が存在することになります。テーブル上に未保存の編集内容が存在する場合は、テー

ブルの定義を変更する前に、まずその編集内容を保存する (Commit 文を発行する) か、廃棄する

(Rollback 文を発行する) 必要があります。

Alter Table 文は、テーブルの定義を変更します。次の例では、Address フィールドの名前を ShipAddressに変更する、Name フィールドの長さを 25 文字にする、Amount フィールドを削除する、Zipcodeフィールドおよび Discount フィールドを新たに追加する、フィールドの順序を並び替えるなどの操作を

行います。

Alter Table CUST (Rename Address ShipAddress,Modify Name Char(25),Drop AmountAdd Zipcode Char(10),

Discount Decimal(4,2) Order Name, Address, City, Zipcode,

OrderDate, CustID, Discount)

スプレッドシートまたはデリミタ付き ASCII ファイルに基づいて作成されたテーブルの定義は変

更できません。また、Selection テーブルの定義も変更できません。

Add Column 文は、テーブルに一時フィールドを追加します。Add Column 文を使用すると、別

のテーブルの値に基づいて計算されるダイナミック フィールドが作成されます。また、AddColumn を使用して、あるテーブルのオブジェクトと別のテーブルのオブジェクトの重なり方に基

づく比率データ併合を行う、高度なポリゴン追加操作を実行することもできます。たとえば、町

MapBasic 11.0 135 ユーザーズ ガイド

Page 136: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 IntegerDim 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 ユーザーズ ガイド

Page 137: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 windowPrint 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 ユーザーズ ガイド

Page 138: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 7 章: テーブル操作

テーブルの新規作成

’ Access the Selection table as necessary. For example:Fetch First From Selectionobj_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 employeesWhere department = "marketing" and salary < 20000

Update SelectionSet salary = salary * 1.15

この Selection は employees テーブルから抽出されているため、Update 文は employees テーブル

の行の値を変更します。

MapBasic 11.0 138 ユーザーズ ガイド

Page 139: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 7 章: テーブル操作

システム レイヤへのアクセス

Selection を使用したユーザ入力

Selection プロセスは、ユーザ インターフェイスの一部です。アプリケーションの中には、ユーザ

が 1 つ以上の行を選択した後で、適切なメニュー項目を選択するような構成になっているものも

あります。ユーザが選択を行うと、オブジェクト (名詞) が指定されます。同様に、ユーザがメ

ニュー項目を選択すると、そのオブジェクトに適用される操作 (動詞) が指定されます。

サンプル プログラム TextBox は、この名詞/動詞モデルに基づいています。ユーザは、1 つ以上のテ

キスト オブジェクトを選択した後、[ツール] > [TextBox] > [Create Text Boxes] コマンドを選択しま

す。続いて、TextBox アプリケーションは Selection テーブルを検索し、ユーザが選択したテキスト

オブジェクトを囲むボックスを描きます。

現在の選択内容を検索するには、SelectionInfo( ) 関数を使います。SelectionInfo() 関数を呼び出

すと、現在選択されている行 (行が選択されている場合) の数を特定することができます。行が現

在選択されている場合は、SelectionInfo( ) 関数を呼び出すと、その行が選択された元のテーブル

の名前を特定することができます。続いて、TableInfo( ) を呼び出して、そのテーブルに関する別

の情報を検索します。

アプリケーションに SelChangedHandler というサブプロシージャが含まれる場合、MapInfoProfessional は選択内容が変更されるたびにそのプロシージャを呼び出します。たとえば、アプリ

ケーションのカスタム メニュー項目のいくつかを、行が選択されているときにだけ選択可能にな

るよう設定するとします。このような選択指定型メニュー管理を行うには、SelChangedHandlerプロシージャを作成します。このプロシージャの中で SelectionInfo(SEL_INFO_NROWS) を呼

び出し、行が選択されているかどうかを特定します。選択行のあるなしに応じて、Alter MenuItem 文を発行して適当なメニュー項目を選択可能または選択不能にします。メニュー管理の詳細

については、ユーザ インターフェイスの作成を参照してください。

システム レイヤへのアクセス

各マップ ウィンドウには、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 ユーザーズ ガイド

Page 140: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 7 章: テーブル操作

レイアウト ウィンドウへのアクセス

レイアウト ウィンドウへのアクセス

MapBasic のオブジェクト操作文は、レイアウト ウィンドウ上のオブジェクトにも適用できます。

レイアウト ウィンドウを操作するには、LayoutN というテーブル名 (N は 1 以上の整数) を使用し

た文を発行します。

たとえば、Layout1 というテーブル名は、 初に開かれたレイアウト ウィンドウに対応します。

次の文は、このレイアウト ウィンドウ上のすべてのオブジェクトを選択します。

Select * From Layout1

レイアウト ウィンドウの正確なテーブル名を特定するには、WIN_INFO_TABLE コードを使用し

て WindowInfo( ) 関数を呼び出します。

レイアウト ウィンドウに格納されたオブジェクトは、"用紙" 単位 (ページ レイアウトの左

上隅から測定される) を使用する特殊な座標系に基づいています。レイアウト オブジェク

トを作成するか、レイアウト オブジェクトからオブジェクト座標を検索するための

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 ユーザーズ ガイド

Page 141: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 7 章: テーブル操作

マルチユーザ編集

マルチユーザ編集に関する規則

MapInfo Professional のマルチユーザによるテーブル編集には、次のような 3 つの制限があります。

規則 1テーブルは、一度に 1 人のユーザしか編集できません。

ユーザ A とユーザ B の 2 人のユーザがいると仮定します。ここで、両方のユーザがネットワーク

上にある同じテーブルを使用しようとするとします。

ユーザ A がテーブルの編集を開始します (例 : ユーザ A がテーブルに新しい行を追加する)。その直

後にユーザ B が同じテーブルを編集しようとしても、 ユーザ B によるテーブルの編集は許可され

ず、"編集できません。このテーブルは他のプロセスによって編集中です。" というメッセージが表

示されます。ユーザ B が MapBasic アプリケーションを通じてテーブルを編集しようとすると、ア

プリケーション上で実行時エラーが発生します。

ユーザ A が編集を続ける限り、そのテーブルをユーザ B が編集することはできません。この状態

は、ユーザ A が [テーブルの保存]、[テーブルの復帰] (編集内容の破棄) または [テーブルを閉じる]を実行するまで継続します。

ユーザ B は、ユーザ A が編集中のテーブルを参照することはできます。たとえば、ユーザ Bはそのテーブルをマップ ウィンドウ上に表示することができます。ただし、ユーザ A が編集した内容については、それをユーザ A が保存するまでユーザ B は "参照"できません。

規則 2ユーザは、保存中のテーブルからの読み取りはできません。

ユーザ A が、テーブルの編集後に [ファイル] > [テーブルの保存] コマンドを選択するとします。こ

のとき、保存操作が完了しないうちにユーザ B がそのテーブルからデータを読み取ろうとした場

合、 保存処理が行われている間はユーザ B によるそのテーブルへのアクセスは許可されません。

ユーザ B のコンピュータには、"ファイル <tablename>.DAT を読み込めません" というメッセージ

が表示されます。 このダイアログ ボックスの [再試行] と [キャンセル] の各ボタンは、次のような

意味を持っています。

再試行

ユーザ B が [再試行] をクリックすると、そのファイルからの読み取りを再度試みます。まだ [保存]操作が完了していないと、[再試行] は失敗します。[再試行] ボタンは繰り返しクリックすることが

できます。保存操作が終了すると、テーブルからのデータの読み取りが成功します。

キャンセル

ユーザ B が [キャンセル] をクリックすると、[再試行/キャンセル] ダイアログ ボックスが閉じます。

ユーザ B がワークスペースを読み込んでいるときに共有エラーが発生すると、[キャンセル]をクリックすることで、残りのワークスペースの読み込みが中断されるおそれがあります。たとえば、Open Table 文を含むワークスペースがあるとします。この Open Table 文が原因で共有衝突が発生した場合、ユーザが [再試行/キャンセル] ダイアログ ボックスで [キャンセル] をクリックしても、そのテーブルは開きません。テーブルが開かれなかったことにより、ワークスペース中のそれ以降の文は正しく実行されない可能性があります。

MapBasic 11.0 141 ユーザーズ ガイド

Page 142: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 143: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 7 章: テーブル操作

マルチユーザ編集

警告 : Set File Timeout 文と OnError 文は同時に使用できません。エラー ハンドラが可能になっている場合、ファイルのタイムアウト値は 0 でなければなりません。ファイルのタイムアウト値が 0 以外の場合は、エラー処理は使用不可能のはずです。次の例は、このロジックを示したものです。

Function MakeNewRow(ByVal new_name As String) As Logical

’turn off automatic retriesSet 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 = FALSEResume exit_ramp

End If End Function

この場合、次の点に注意してください。

• 共有テーブルを変更する場合は、テーブル上に未保存の編集内容が存在する時間をできるだけ短くします。上の例では、Commit 文が Insert 文の直後に現われています。これによって、

テーブル上に未保存の編集内容が存在する時間が非常に短くなります。

MapBasic 11.0 143 ユーザーズ ガイド

Page 144: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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) ファイル形式など、MapInfoProfessional がサポートするあらゆる形式を適用できます。

• filename.tab : テーブルの定義が記述されています。

• filename.dat、filename.dbf、または filename.wks : 表 (行と列) データが含まれます。

• filename.map : テーブルの図形オブジェクトが含まれます。

• filename.id : 地理的インデックスが含まれます。

• filename.ind : テーブルのフィールドのインデックスが含まれます。

各テーブルはいくつかのファイルで構成されているため、テーブルの名前を変更する場合は注意が

必要です。テーブルの名前を変更するには、MapInfo Professional で [テーブル] > [テーブル管理] > [テーブル名の変更] コマンドを選択するか、MapBasic の Rename Table 文を発行します。

MapBasic 11.0 144 ユーザーズ ガイド

Page 145: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 imagetname = PathToDirectory$(fname)

+ PathToTableName$(fname) + ".tab" ’name of table to create

MapBasic 11.0 145 ユーザーズ ガイド

Page 146: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 = FALSEOnError 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 valuelast_exit:

Exit Function handler:

Close File #1 Resume last_exit

End Function

メタデータの操作

メタデータとは

メタデータは、フィールドや行として格納されずに、テーブルの .TAB ファイルに格納されるデー

タです。たとえば、誰がいつテーブルを編集したかについての概要情報を記録したい場合は、そ

の情報をメタデータとして格納することができます。

MapBasic 11.0 146 ユーザーズ ガイド

Page 147: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 7 章: テーブル操作

メタデータの操作

メタデータは、MapInfo Professional の標準ユーザ インターフェイスには表示されません。つま

り、ユーザはテーブルのメタデータを見ることはできません (テキスト エディタで .TAB ファイル

を表示する場合や、TableMgr サンプル MBX を実行する場合は例外です)。ただし、MapBasic アプ

リケーションではメタデータ値の読み取り/書き込みが行えます。

どのテーブルにも、0 個以上のメタデータ キーがあります。それぞれのキーは、著者名や著作権

通告などの情報カテゴリを表します。たとえば、"\Copyright" という名前のキーは、"Copyright2005 Acme Corp" という値を持つ可能性があります。

メタデータ キーの形式

各メタデータ キーは、必ず "\" (円) 記号で始まる名前を持っています。キー名が \ 記号で終わるこ

とはありません。また、キー名では大文字と小文字は区別されません。

キーの値は、常に 高 239 文字から成る文字列で表されます。

次の表に、メタデータ キーとキー値のサンプルを示します。

この場合、次の点に注意してください。

• キーの名前および値には、スペースを使用できます。

• 2 つ以上の \ 文字を持つキー名を使用すると、キーの階層が定義できます。上のいくつかのキー

は、"\Info" で始まる階層に属しています。キーを階層状に整理すると、ある階層全体を一度に

操作することが可能になります (例 : 1 つの文で階層全体を削除することができる)。• "\IsReadOnly" キーは、MapInfo Professional の内部で使用される予約済みの特殊キーです。

テーブルにメタデータを追加すると、\IsReadOnly キーが自動的に作成されます。この

\IsReadOnly キーを変更してはいけません。

• 上の表では、それが文字列値であることを強調するために、各文字列は引用符で囲まれています。しかし、テーブルからキーを取り出す場合、MapBasic が実際に取り出す文字列は引用符

に囲まれていません。

サンプル キーの名前 サンプル キーの値

"\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"

MapBasic 11.0 147 ユーザーズ ガイド

Page 148: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 7 章: テーブル操作

メタデータの操作

メタデータに関する作業の例

GetMetadata$( ) 関数ではテーブルのメタデータの検索を行えますが、メタデータ キーの正確な名

前を把握している場合に限ります。あるテーブルが "\Copyright" という名前のキーを持つことを把

握している場合、次の関数呼び出しによってそのキーの値が返されます。

s_variable = GetMetadata$(table_name, "\Copyright")

Metadata 文を使うと、キーの名前がわからない場合でも、テーブルのメタデータの作成、変更、検

索が可能になります。次の例は、Metadata 文を使用して行えるさまざまな操作を示したものです。

各例の table_name は、開いたテーブルの名前を含む文字列変数を表しています。

次の例では、テーブルにキー値を格納します。指定したキーが既に存在する場合、そのキーの値

は変更されます。指定したキーが存在しない場合は、テーブルのメタデータにそのキーが追加さ

れます。

Metadata Table table_nameSetKey "\Info\Author" To "Laura Smith"

次の文は、テーブルから "\Info\Author" キーを削除します。

Metadata Table table_nameDropkey "\Info\Author"

次の文は、ある階層に属するすべてのキーを一度に削除します。ここでは、"\Info" で始まる名前を

持つすべてのキーが削除されます。

Metadata Table table_nameDropkey "\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 ユーザーズ ガイド

Page 149: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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

’ 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.Do 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 ユーザーズ ガイド

Page 150: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 7 章: テーブル操作

シームレス テーブルの操作

シームレス テーブルの仕組み

MapInfo Professional には、シームレス テーブルの作成と操作が行える MapBasic プログラムであ

るシームレス テーブル管理機能 (seammgr.mbx) が含まれています。シームレス テーブルがどのよ

うに構成されているかを確認するには、次のようにしてそのテーブルの "シームレス動作" をオフ

にする必要があります。

1. シームレス テーブル (例 : USRaster) を開きます。

2. シームレス テーブル管理機能アプリケーションを実行します。

3. [ツール] > [シームレス テーブル管理機能] > [シームレス レイヤのオフ] を選択し、DCMetroAテーブルのシームレス属性をオフにします。

4. [ウィンドウ] > [ブラウザ ウィンドウを表示] を選択し、そのテーブルをブラウザ ウィンドウに

表示します。

通常のテーブルと同様に、シームレス テーブルにも行とフィールドがあります。各行は、そのシー

ムレス テーブルに含まれる個々の基本テーブルに対応します。

シームレス テーブルの 初のフィールドには、テーブル名が含まれます。2 列目のフィールドに

は、ユーザ インターフェイスに表示される内容が入っています。 初のフィールドのテーブル名

には、ディレクトリ パスが含まれている場合があります。基本テーブルがシームレス テーブルと

同じディレクトリ内にある場合、または基本テーブルが検索ディレクトリ パス ([ディレクトリの

設定] ダイアログ ボックスの [環境設定] で指定される) によって検索可能な場合は、ディレクトリ

パスは省略できます。

シームレス テーブルの各行には、それぞれ 1 つのマップ オブジェクトが添付されています。これ

は、通常のテーブルの行にオブジェクトが添付されているのと同じです。ただし、シームレス

テーブルのオブジェクトは表示を目的とするものではありません。シームレス テーブルの各行

は、 初のフィールドに示されるテーブルの 小外接四角形 (MBR) を定義する長方形オブジェク

トを持ちます。ユーザがマップ ウィンドウにシームレス テーブルを表示すると、MapInfoProfessional はマップ ウィンドウの現在の範囲をテーブルに格納された MBR と比較します。

MapInfo Professional は、必要な場合 (マップ ウィンドウ上の現在の表示エリアがテーブルの MBRと交差している場合) に限り、基本テーブルを開きます。

... ユーザがシームレス テーブルを参照する

と、このリストに表示されます。

2 列目のフィールドの説明が ...

MapBasic 11.0 150 ユーザーズ ガイド

Page 151: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 152: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 7 章: テーブル操作

DBMS データへのアクセス

接続ハンドル (または番号) は、特定の接続に関する情報を識別します。MapBasic では、接続ハン

ドルを整数タイプの変数 (接続番号) として定義します。アプリケーションは、あるデータ ソース

に接続すると、1 つの接続ハンドルを受け取ります。この接続ハンドルは、続く文を特定の接続に

関連付けるために使用されます。

文ハンドル (または番号) は、SQL 文に関する情報を識別します。MapBasic では、文ハンドルを整

数タイプの変数 (文番号) として定義します。アプリケーションは、Server_Execute( ) 関数を呼び

出してある SQL リクエストを出すと、必ず 1 つの文ハンドルを受け取ります。この文ハンドルを

使用して、Fetch や Close 操作など以降の SQL リクエストを特定の Select 文に関連付けます。

接続および接続解除

MapBasic アプリケーションでは、リモート データベースに対して SQL 文を実行する前に、まず

Server_Connect 関数を使用して接続リクエストを出さなければなりません。適切な接続が得られ

ると、この関数は続く SQL データリンク呼び出しに使われる接続ハンドル (hdbc) を戻します。

Dim hdbc As Integerhdbc = Server_Connect("ODBC", "DLG=1")

ドライバがコミットまたはロールバックを実行すると、その接続に関するすべての文リクエスト

がリセットされます。Driver Manager は、現在の接続上でトランザクションが進行中である場合

に、接続の切り替えを操作します。

接続を解除するには、次の文を使用します。

Server hdbc Disconnect

この文は、接続を閉じると共に、その接続に関するすべてのリソースを解放します。

次の図は、SQL MapBasic Server 文を発行できるシーケンスを示しています。文の中には、接続

情報を必要としないもの (例 : Server_NumDrivers( ))、接続ハンドルだけを要求するもの (例 :Server Commit)、または文ハンドルを要求するもの (例 : Server Fetch) があります。

MapBasic 11.0 152 ユーザーズ ガイド

Page 153: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 7 章: テーブル操作

DBMS データへのアクセス

MapBasic の Server Fetch 文の Into 機能を利用すると、ODBC データソースから、テーブル全

体、指定した行/フィールド、または結果セットをダウンロードすることができます。ただし、ダ

ウンロードされたテーブルに適用された更新内容は、元のサーバ データベース上のテーブルには

適用されません。リモート データベースを更新するには、Save File 文を使用します。

PostGIS のジオメトリ変換の動作

サポートされていない空間ジオメトリが含まれるマップを PostGIS で保存するためのオプション

を以下に示します。

• サポートされていないオブジェクトのみで構成される空間ジオメトリの場合: 作成したマップに、

サポートされていないオブジェクトのみが含まれる可能性がある場合、そのマップを PostGIS に保存しようとすると、以下のメッセージが表示されます。

MapBasic 11.0 153 ユーザーズ ガイド

Page 154: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 155: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 DefaultView を呼び出します。MapCatalog 内で新しい境界が更新され、次にテーブルを開いたときにこ

の境界が使用されます。

[名前を付けて保存] コマンドを使ってテーブルをリモート データベース データソースにアップロー

ドすると、元のテーブルのデフォルト ビューは新しく作成されるテーブルにも適用されます。

リモート テーブルの MAPINFO_MAPCATALOG にデフォルト ビューのエントリがない場合、リ

モート データベース ユーザ (データベース接続により識別される) は、デフォルト ビューを元の設

定から変更するために MapCatalog の ALTER 権限を持つ必要があります。この権限がないと、警

告メッセージが表示され、デフォルト ビューの変更が失敗します。

MapBasic 11.0 155 ユーザーズ ガイド

Page 156: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 157: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 7 章: テーブル操作

テーブル操作をより効果的に行うためのヒント

Select 文の 適化

いくつかの Select 検索操作では、処理速度の向上を目的とした 適化が図られます。『MapBasicリファレンス ガイド』またはオンライン ヘルプの Select の項を参照してください。

Update 文の使用

MapBasic では、Alter Object 文を実行することによりマップ オブジェクトを一度に 1 つ更新する

ことができます。Update 文は通常はループを使用して 1 レコードずつ処理しますが、 この方法で

テーブルを操作した場合、変更するレコードごとにいくつかの文を実行するため、遅くなります。

状況によっては、レコードを 1 つずつ更新する代わりに Update 文を 1 回実行するだけでテーブル

全体を更新し、迅速に処理することが可能です。

MapBasic 11.0 157 ユーザーズ ガイド

Page 158: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

8

ファイル入出力

MapBasic では、ファイルの管理と MapInfo テーブルの管理には重要な違いが

あります。前章では、MapBasic におけるテーブルの管理について説明しまし

た。本章では、"テーブルではない" ファイルの管理について説明します。

このセクションの構成

ファイルの入出力の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .159シーケンシャル ファイル入出力 . . . . . . . . . . . . . . . . . . . . . . . . . . .160プラットフォーム指定 / 国際文字セット . . . . . . . . . . . . . . . . . . . . .163

Page 159: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 160: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 8 章: ファイル入出力

シーケンシャル ファイル入出力

また、Open File 文の中で For Append を指定することもできます。Append モードでは、ファイ

ルが存在しない場合は新しく作成され、ファイルが既に存在する場合はそのファイルにデータが

追加されます。ファイルの読み取りまたは書き込み操作の終了後に、Close File 文を発行します。

次に例を示します。

Close File #1

この番号パラメータは、Open File 文でそのファイルに割り当てられた識別番号と同じです。シャー

プ記号 (#) はオプションとなっています。ファイル入出力操作によって作成または変更されたファイ

ルを保存するために "保存" コマンドを実行する必要はありません。Close File 文を発行すると、

ファイルの変更操作は完了します。(MapBasic には Save File 文が用意されていますが、この文は

ファイルの変更内容を保存するためのものではなく、ファイルをコピーするためのものです。)

ファイル I/O 操作中に、さまざまな原因で実行時エラーが発生することがあります。実行時エラー

は、Open File 文で間違ったファイル名を指定したり、読み取り専用ファイルを出力用に開こうと

したりすると発生します。また、ファイルにデータが書き込まれている間にディスク容量が一杯

になった場合や、 別のネットワーク ユーザが編集しているファイルを出力用に開こうした場合に

も、実行時エラーが発生します。ファイル入出力操作を行うアプリケーションを開発する場合

は、エラー条件を検出および修正するためのエラー処理ルーチンをプログラムに組み込むととも

に、予想されるエラー条件 (例 : ディスク容量不足) の下でアプリケーションをテストする必要があ

ります。エラー ハンドラの作成方法については、「実行時エラーのデバッグ およびトラップ」を

参照してください。

適切な関数を呼び出すことによってエラーの発生を回避できる場合もあります。たとえば、OpenFile 文を発行する前に FileExists( ) 関数を呼び出すことで、そのファイルが実際に存在するかど

うかを確認できます。また、プログラムで一時作業ファイルを作成する必要があるときに、ユー

ザのディレクトリ名がわからないためにファイルに割り当てる名前やディレクトリ パスがわから

ない場合は、TempFileName$( ) 関数を呼び出します。ファイル I/O に関する文には、これ以外に

も次のようなものがあります。

• Kill 文は、ファイルを削除します。

• Save File 文は、ファイルのコピーを保存します。

• Rename File 文は、ファイルの名前を変更します。

• ProgramDirectory$( )、HomeDirectory$( )、ApplicationDirectory$( ) などの関数を使用する

ことで、実行時にさまざまなディレクトリ パスを調べることができます。たとえば、MapInfoProfessional ディレクトリ (Startup ワークスペースなど) に存在するファイルの名前を表す文字

列を作成する場合、そのディレクトリの名前がわからない場合には、ProgramDirectory$( ) を呼び出すことで MapInfo Professional のインストール先ディレクトリを調べることができます。

シーケンシャル ファイル入出力

シーケンシャル ファイル I/O (可変長テキスト ファイルの読み取り/書き込み) を行う場合は、

Open File文の For 句で、Input、Output、Append のいずれかのオプションを指定できます。

For Input 句は、既存のファイルからの読み取りに使用します。たとえば、ビュー名管理サンプル プロ

グラム (nviews.mb) は、入力用に既存のテキスト ファイルを開くため、次のような文を発行します。

MapBasic 11.0 160 ユーザーズ ガイド

Page 161: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 値を返した場合、ファイル末に達しています。

ファイルの 終行の読み取り中は、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 ユーザーズ ガイド

Page 162: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 163: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 164: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

9

図形オブジェクト

MapBasic のパワーの大半は、弧、楕円、枠、ライン、ポイント、折れ線、長

方形、リージョン、面取り長方形、テキストなどのさまざまなマップ オブ

ジェクトの検索および操作機能にあります。この章では、MapBasic プログラ

ムを使用した、マップを構成するオブジェクトの検索、作成、変更方法につい

て説明します。ただし、MapBasic によるテーブルへのオブジェクトの格納方

法を理解するには、まず MapInfo テーブルの原則について理解する必要があ

ります。まだ第 8 章をお読みでない方は、この章を読む前に「テーブル操作」

に目を通してください。

このセクションの構成

オブジェクト変数の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .165"Obj" フィールドの利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .165オブジェクト属性の検索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .167オブジェクトの新規作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .175既存オブジェクトに基づくオブジェクトの作成 . . . . . . . . . . . . . . .178オブジェクトの変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .180マップ ラベルを使った作業 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .182座標および測定単位 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .186高度な地理検索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .188

Page 165: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ObjectOpen Table "states"Fetch First From statescurrent_state = states.obj

Object フィールドに対しても、通常のフィールドと同様の操作を行うことができます。Objectフィールドを参照する SQL 検索、フィールドの値 (オブジェクト) に対する更新操作、およびその

内容の変数への読み取りなどを行えます。

MapBasic 11.0 165 ユーザーズ ガイド

Page 166: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 sitesWhere 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 ユーザーズ ガイド

Page 167: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 9 章: 図形オブジェクト

オブジェクト属性の検索

次の例では、states テーブルと、小売店を表すポイント オブジェクトを含む outlets テーブルとい

う 2 つのマップ作成可能テーブルに対して検索を実行します。Select 文の From 節には、両方の

テーブルが含まれています。ただし、states テーブルが 初に現われるため、結果テーブルには

states テーブルのオブジェクトが含まれることになります。

Select * From states, outletsWhere 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 ユーザーズ ガイド

Page 168: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 9 章: 図形オブジェクト

オブジェクト属性の検索

オブジェクトの図心を決定するには、Centroid( ) 関数か、CentroidX( ) 関数と CentroidY( ) 関数

を利用します。オブジェクトの 小外接四角形 (オブジェクト全体を囲む 小の長方形) を決定す

るには、MBR( ) 関数を呼び出します。

オブジェクトのその他のタイプの属性を決定するには、ObjectInfo( ) 関数を呼び出します。たと

えば、オブジェクト式をテーブルから Object 変数にコピーした後は、ObjectInfo( ) を呼び出して

そのオブジェクトの種類 (ライン、リージョンなど) やスタイル (ペン、ブラシ、シンボル、フォン

トなど) を決定できます。そのオブジェクトがテキスト オブジェクトである場合は、ObjectInfo( )を使用すると、そのテキスト オブジェクトを構成する文字列を読み取ることができます。

MapBasic の標準関数の多くは、オブジェクトを引数に取り、そのオブジェクトに関する 1 つの情

報を戻り値として返します。たとえば、Area( )、Perimeter( )、ObjectLen( ) などの関数は、オブ

ジェクト パラメータを取ります。次の例では、洪水地域の面積を計算します。

Dim floodarea As Float Open Table "floodmap"Fetch First From floodmapfloodarea = Area(floodmap.obj, "sq km")

ラベルはテキスト オブジェクトではありませんので注意してください。テキスト オブジェクトの

検索には、ObjectInfo( ) などの関数を呼び出します。ラベルの検索には、Labelinfo( ) などの関数

を呼び出します。ラベルの詳細については、マップ ラベルを使った作業 (182 ページ)を参照して

ください。

オブジェクトのスタイル (ペン、ブラシ、シンボル、フォント)どのオブジェクトにも、1 つ以上のスタイル設定が含まれます。たとえば、各ライン オブジェク

トはラインの色、太さ、およびパターン (実線、点線など) を定義するペン スタイルを、 各ポイン

ト オブジェクトはポイントの形、色、およびサイズを定義するシンボル スタイルを持っていま

す。リージョンなどの囲まれたオブジェクトは、ペン スタイルとブラシ (フィル) スタイルの両方

を持ちます。

次の表に、4 つのオブジェクト スタイルの概略を示します。

Object オブジェクトのスタイル

Pen ラインの幅、パターン、色

Brush フィル エリアのパターン、前景カラー、背景カラー

Font フォント名、スタイル、サイズ、テキスト カラー、背景カラー。テキスト オブジェ

クトのみに適用。

Symbol MapInfo Professional のシンボル : 形、色、サイズ属性。

TrueType フォントのシンボル : 形、色、サイズ、フォント名、フォント スタイル (太字、斜体など)、回転の属性。

ビットマップ ファイルによるカスタム シンボル : ファイル名、色、サイズ、スタイ

ル属性。

MapBasic 11.0 168 ユーザーズ ガイド

Page 169: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 9 章: 図形オブジェクト

オブジェクト属性の検索

上記の 4 つのスタイルの詳細については、『MapBasic リファレンス ガイド』およびオンライン

ヘルプの Brush 節、Font 節、Pen 節、および Symbol 節の項を参照してください。

MapBasic 言語には、さまざまな文や関数 (例 : Create Text 文、CreateLine( ) 関数) が用意されて

おり、これらを使用してオブジェクトを作成することができます。各オブジェクト作成文には、

オブジェクトのスタイルを指定するオプション節があります。たとえば、Create Line 文には、ラ

インのスタイルを指定できるオプションの Pen 節が含まれます。スタイル設定を指定しないオブ

ジェクト作成文を発行すると、オブジェクトには現在のスタイルが割り当てられます。

= 演算子を使用して 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 ユーザーズ ガイド

Page 170: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 9 章: 図形オブジェクト

オブジェクト属性の検索

• CreateText( ) 関数を使用してマップ作成可能なテーブルにテキスト オブジェクトを作成する

と、設定されているフォントのポイント数でテキストのサイズが決まりますが、 マップを拡大

すると、テキストも大きくなります。

• マップ ウィンドウの中でラベルを作成すると、フォントのポイント サイズによってテキスト

の高さが制御されます。テキストは、フォント スタイルで指定した高さで表示および印刷され

ます。ラベルの動作はテーブルに格納されたテキスト オブジェクトの動作とは異なることに注

意してください。ラベルの詳細については、マップ ラベルを使った作業 (182 ページ)を参照し

てください。

フォント スタイルには、"Courier" や "Helvetica" などのフォント名が含まれます。フォント名は、

それぞれのハードウェア プラットフォームによって異なる場合があります。Microsoft Windows 環境の Helv および TmsRmn (または Times New Roman) は、Sun のプラットフォームではそれぞれ

Helvetica および Times と呼ばれています。MapBasic の Font 節では、Helvetica、Times、Courierは実行時に使用しているプラットフォームに関係なく認識されます。

積み上げスタイル

レイヤのスタイルを積み上げて、互いの上に重ねて描画されるスタイルのリストにすることで、

より複雑でおもしろいマップ表現を作成できます。ポイント、折れ線、およびポリゴンに対して

スタイルを積み上げることができます。特に折れ線のスタイルとして便利です。

図 1 は、MapInfo の交差ライン スタイルの 1 つを用いたラインの例です。図 2 は、同じラインに

対し、積み上げライン スタイルを適用したものです。

積み上げスタイルは、マップに複数のレイヤとしてデータを追加する必要なく、用途に応じたよ

り意味のある表示スタイルを作成します。好きなだけ多くのスタイルを、積み上げスタイルとし

て定義できます。ただし、多くのスタイルを定義するほど、マップのレンダリングのパフォーマ

ンスに影響が生じます。ほとんどの地図において通常、オブジェクトの描画に 2 つか 3 つの積み

上げスタイルを使用します。

図 : 1: 図 : 2:

MapBasic 11.0 170 ユーザーズ ガイド

Page 171: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 172: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 9 章: 図形オブジェクト

オブジェクト属性の検索

ポリゴン (リージョン) での例

積み上げリージョン スタイルを使用すると、2 つの色と 2 つの異なるライン パターンによるフィ

ルを作成できます。

スタイル変数

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 Penp_var = MakePen(1, 10, RGB(128, 128, 128))

MakePen( ) 関数の引数は、ペン スタイルを定義します。1 はスタイルの幅が 1 ピクセルであるこ

とを示し、10 はパターン (ドット) を示します。また、RGB( ) 関数呼び出しは色を指定します。ペ

ン スタイルを構成するこれらの 3 つのパラメータ (および使用可能なすべてのライン パターンを

示したリスト) については、『MapBasic リファレンス ガイド』またはオンライン ヘルプの Pen節の項を参照してください。 同様に、ブラシ オプション、フォント オプション、シンボル オプ

ションの詳細については、Brush 節、Font 節、Symbol 節の各項を参照してください。

次の例は、既存オブジェクトのペン スタイルを Pen 変数の中に読み取る方法を示しています。

Set Map Layer 1 Display Global Global Brush (4,0,16777215), Brush (5,16711680)

MapBasic 11.0 172 ユーザーズ ガイド

Page 173: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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( ) 関数を呼び出して、特定の属性

を持つオブジェクト (例 : 特定の色を持ったオブジェクト) だけを選択するよう MapInfoProfessional に指示することができます。

次の例では、[ツール] ツールバーに 1 つのカスタム ボタンを追加します。あるポイント オブジェ

クトを選択してそのカスタム ボタンをクリックすると、このプログラムによって、それと同じ色

を持つ同じテーブル上のポイント オブジェクトがすべて選択されます。

Include "mapbasic.def" Declare Sub Main Declare Sub SelectPointsByColor()

Sub Main

’ Add a custom button to the Tools toolbar.Alter ButtonPad "Tools" AddPushButton

Calling SelectPointsByColor

MapBasic 11.0 173 ユーザーズ ガイド

Page 174: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 9 章: 図形オブジェクト

オブジェクト属性の検索

HelpMsg "Select points of same color\nSelect By Color"End Sub

Sub SelectPointsByColorDim i_color, i_open As IntegerDim symbol_style As SymbolDim 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 Selectionobject_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

WhereStyleAttr(ObjectInfo(obj,OBJ_INFO_SYMBOL),SYMBOL_COLOR)

MapBasic 11.0 174 ユーザーズ ガイド

Page 175: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 9 章: 図形オブジェクト

オブジェクトの新規作成

= i_colorInto 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 ユーザーズ ガイド

Page 176: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 Pointx As Floaty As Float

End Type

Dim objcoord(5) As PointDim numnodes, i As Integer, myobj As Objectnumnodes = 3set CoordSys Earth

MapBasic 11.0 176 ユーザーズ ガイド

Page 177: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 9 章: 図形オブジェクト

オブジェクトの新規作成

objcoord(1).x = -89.213 objcoord(1).y = 32.017objcoord(2).x = -89.204 objcoord(2).y = 32.112objcoord(3).x = -89.187 objcoord(3).y = 32.096

Create Pline Into Variable myobj 0

For i = 1 to numnodesAlter 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 ユーザーズ ガイド

Page 178: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 179: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 180: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 MatchBox Color] チェック ボックスをチェックすると、TextBox プログラムは Alter Object 文を使用し

て選択されたオブジェクトの色を変更した後、Update 文を使用して変更されたテキスト オブジェ

クトを元のテーブルに格納します。

オブジェクトの位置の変更

Objects Move 文を使用すると、指定した距離に従って正の X 軸沿いにオブジェクトを移動できま

す。Distance Units (距離の単位) と Distance Type (距離のタイプ) も指定できます。ObjectsOffset 文を使用すると、指定した距離に従って正の X 軸沿いにオブジェクトをオフセットした新

しいコピーを作成できます。この文の場合も Distance Units (距離の単位) と Distance Type (距離の

タイプ) を指定でき、さらにコピーしたオブジェクトをソース オブジェクトと同じテーブルに格納

するか、別のテーブルに格納するかを指定できます。

オブジェクトとオブジェクト ノードの移動

オブジェクトの座標を変更するには、Geography 節を含む Alter Object 文を発行します。1 つ以

上の Alter Object 文 (オブジェクトの x 座標のリセットと y 座標のリセットにそれぞれ 1 つずつ)を発行しなければならない場合もあります。

MapBasic 11.0 180 ユーザーズ ガイド

Page 181: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 9 章: 図形オブジェクト

オブジェクトの変更

オブジェクトのペン、ブラシ、フォント、またはシンボル スタイルの変更

Alter Object を使用すると、オブジェクトのスタイルが変更できます。次の例では、Alter Objectコマンドを使用して、テーブル上で選択されたオブジェクトを変更します。

Include "mapbasic.def"Dim myobj As Object, mysymbol As Symbolmysymbol = CurrentSymbol()Fetch First From selectionmyobj = selection.objIf ObjectInfo(myobj, OBJ_INFO_TYPE) = OBJ_POINT Then

Alter Object myobjInfo OBJ_INFO_SYMBOL, mysymbol

Update selection Set obj = myobj Where RowID = 1Else

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 ユーザーズ ガイド

Page 182: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 9 章: 図形オブジェクト

マップ ラベルを使った作業

交差点

既に説明したように、Alter Object 文を発行すると、リージョン オブジェクトまたは折れ線オブ

ジェクトにノードを追加することができます。ただし、Alter Object 文を使用する場合は、追加す

るノードを明示指定しなければなりません。2 つのオブジェクトが交差する場所にノードを追加す

る場合は、Objects Overlay 文または OverlayNodes( ) 関数を使用します。

2 つのオブジェクトの交差点の座標を決定するには、IntersectNodes( ) 関数を呼び出します。

IntersectNodes( ) は、各交差点にあるノードを含む折れ線オブジェクトを返します。その折れ線

に含めるノードの数を決定するには、ObjectInfo( ) を呼び出します。交差点の座標を決定するに

は、ObjectNodeX( ) および ObjectNodeY( ) を呼び出します。

マップ ラベルを使った作業

マップ ラベルは、マップ オブジェクトの表示属性の 1 つとして扱われます。しかし、MapInfoProfessional では、ラベルをシステム レイヤ内のテキスト オブジェクトとして扱っていた旧バー

ジョンとの互換性を維持するために、引き続き 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

Set Map…Auto Off 文を使用すると、デフォルト (自動追加) ラベルは非表示なりますが、

カスタム ラベル (ユーザが追加または変更したラベル) は非表示になりません。次の文は、

あるレイヤのデフォルト ラベルおよびカスタム ラベルの両方を一時的に非表示にします。

Set Map Layer 1 Label Visibility Off

MapInfo Professional ユーザは、[マップ] > [カスタム ラベルの削除] を選ぶことで、そのレイヤの

ラベルをデフォルト状態にリセットすることができます。次の MapBasic 文は、これと同じ効果を

持ちます。

Set Map Layer 1 Label Default

MapBasic 11.0 182 ユーザーズ ガイド

Page 183: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 184: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 9 章: 図形オブジェクト

マップ ラベルを使った作業

MapInfo Professional は、変更内容を適用して MapBasic ウィンドウ上に Set Map 文を表示しま

す。MapBasic ウィンドウからテキストをコピーして、プログラムに貼り付けることもできます。

個々のラベルの編集操作に対応する MapBasic の構文を確認するには、次の操作を行います。

1. マップ ウィンドウ上でラベルを変更する。(たとえば、ラベルの移動、削除、フォント変更を行

います。)

2. ワークスペース ファイルを保存する。

3. MapBasic エディタなどのテキスト エディタを使用してワークスペース ファイルを表示する。

個々のラベルの編集内容は、ワークスペースの中に Set Map... Layer... Label... Object 文の形

で表示されます。

ラベルとテキスト オブジェクトの違い

次の表に、テキスト オブジェクトとラベルの違いをまとめます。

テキスト オブジェクト ラベル

テキスト作成に使用される

MapBasic 文AutoLabel、Create Text、CreateText( )

Set Map

テキスト変更に使用される

MapBasic 文Alter Object Set Map

テキスト検索 (例 : 色の決定) に使用される MapBasic 関数

ObjectInfo( )、 ObjectGeography( )

LabelFindByID( )、 LabelFindFirst( )、 LabelFindNext( )、 Labelinfo( )

テキスト選択に使用される

MapBasic 文Select MapBasic プログラムでは、

ラベルの選択はできない。

マップでのテキスト保存 テキスト オブジェクトはマッ

プ作成可能テーブルに格納で

きる。

ラベルはワークスペースにし

か格納できない。

レイアウトでのテキスト保存 レイアウトで作成されたテキ

スト オブジェクトは、ワーク

スペースに保存できる。

不可。ラベルはレイアウトに

は表示できない (ただし、

マップがレイアウト上にある

場合を除く)。

MapBasic 11.0 184 ユーザーズ ガイド

Page 185: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 9 章: 図形オブジェクト

マップ ラベルを使った作業

ラベルを作成するとき、長方形エリアを定義する必要はありません。その代わり、ラベルのアン

カー ポイント (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 関数は用意さ

れていない。

Labelinfo( ) 関数によりラベ

ルは近似のテキスト オブジェ

クトに変換可能。例について

は、LABELER.MBX を参照。

テキスト オブジェクト ラベル

MapBasic 11.0 185 ユーザーズ ガイド

Page 186: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 9 章: 図形オブジェクト

座標および測定単位

1. Create Table 文を使用して、文字フィールドを含むテーブルを作成する。その文字フィールド

が、マップ上に表示するテキストを格納できるだけの十分な幅を持つようにし、 そのテーブル

をマップ作成可能にします (Create Map 文を使用)。

2. テーブルをマップ ウィンドウに追加する (Add Map 文を使用)。Set Map 文を使用して、テー

ブルのラベル操作オプション (例 : Auto On) を設定します。

3. マップにテキストを追加する際に、目に見えないシンボル スタイル (shape 31) またはペン スタイル (pattern 1) を使用して、テーブルにポイント オブジェクトまたはライン オブジェクト

を挿入する。オブジェクト自体は見えませんが、そのラベルは表示されます。(テキストを回転

する場合には、ライン オブジェクトを使用します。)

サンプル プログラム COGOLine.mb には、特定の角度を持ったライン オブジェクトの

作成方法が示されています。

この方法を用いると、Set Map…Object 文を使用して各ラベルの位置を設定する必要はあ

りません。ラベルをデフォルトの位置に表示できます。その後でラベルを移動させるに

は、そのラベルに対応するオブジェクトを動かします。

座標および測定単位

MapBasic アプリケーションは、一度に 1 種類の座標系にしか対応できません。MapBasic では、

地球座標系座標、一般座標系座標、およびレイアウト座標が使用できます。以下のプログラミン

グのガイドラインは、MapBasic が一度に 1 種類の座標系にしか対応できないという原則に基づい

ています。

• 地球座標系マップからオブジェクトを作成、変更、検索するときは、まず MapBasic で地球座標

系が使用されていることを確認する。デフォルトでは地球座標系が使用されます。多くの

MapBasic アプリケーションでは、座標系を考慮する必要はありません。

• 一般座標系マップからオブジェクトを作成、変更、検索するときは、まず MapBasic で一般座標

系が使用されていることを確認する。一般座標系に設定するには、Set CoordSys Nonearth 文を

発行します。

• レイアウト ウィンドウからオブジェクトを作成、変更、検索するときは、まず MapBasic でレ

イアウト座標系が使用されていることを確認する。レイアウト座標系に設定するには、SetcoordSys Layout 文を発行します。

各 MapBasic アプリケーションには、現在アプリケーションで使用されている座標系を表す

CoordSys 設定があります。デフォルトの座標系は、地球 (経緯度) 座標系です。デフォルトでは、

どの MapBasic アプリケーションでも地球座標系マップのオブジェクトを操作することができま

す。MapInfo テーブルの大半はこれに分類されます。MapBasic アプリケーションでレイアウト

ウィンドウ上のオブジェクトを操作する必要がある場合は、まず次のような Set CoordSysLayout 文を発行しなければなりません。

Set CoordSys Layout Units "in"

MapBasic 11.0 186 ユーザーズ ガイド

Page 187: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 9 章: 図形オブジェクト

座標および測定単位

Set CoordSys Layout 文では、"in" (インチ) などの用紙単位名を指定します。これによって、

MapBasic はレイアウト ウィンドウの座標情報を解釈することができるようになります。センチや

ミリを使用する場合は、単位名をそれぞれ cm、mm と指定します。次のプログラムは、レイアウ

ト ウィンドウを開いた後、テキスト オブジェクトを作成してレイアウト上にタイトルを追加しま

す。このオブジェクトはレイアウト ウィンドウ上で作成されるため、Create Text 文の前に SetCoordSys 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, 0Select state, CentroidX(obj), CentroidY(obj)

From states Where state = "WY"

MapBasic の座標系をデフォルトにリセットするには、次の文を発行します。

Set CoordSys Earth

MapBasic 11.0 187 ユーザーズ ガイド

Page 188: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 文または SetPaper Units 文を使います。

高度な地理検索

MapBasic プログラムでは、表データと図形データを用いた複雑なデータ検索を行うことができま

す。たとえば、Add Column 文を使用すると、あるリージョン オブジェクトが別のマップ レイヤ

のオブジェクトとどのように重なるか、または交差するかに基づいて、そのリージョン内のデー

タ値の合計および平均データ値を計算することができます。

MapBasic および MapInfo Professional によるデータ型地理分析の実行方法を理解するには、まず

MapBasic プログラムによるテーブルの管理方法および検索方法を理解する必要があります。まだ

第 8 章をお読みでない方は、この章を読む前に「テーブル操作」に目を通してください。

MapBasic 11.0 188 ユーザーズ ガイド

Page 189: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 9 章: 図形オブジェクト

高度な地理検索

地理比較演算子の使用

MapBasic では、等号 (=) を使ったオブジェクトの論理比較 (If object_a = object_b) はでき

ません。ただし、MapBasic にはオブジェクトを比較してその位置関係を把握するために使用でき

るいくつかの地理演算子が用意されています。MapBasic の Contains、Within、Intersects の各

比較演算子、およびオプションの修飾子である Part と Entire を使用すると、数値に関係演算子を

用いる場合とほぼ同様にオブジェクトを比較することができます。

次の例では、If…Then 文を使用した地理比較を行います。

If Parcel_Object Within Residential_Zone_Obj ThenNote "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 を使用する。

ポイントとリージョンを比較すると、次のことが言えます。

次の文を使用すると、配送センター オブジェクトを含む州を選択できます。

Select * From states Where obj Contains distribution_ctr

次の文は、郡内にある埋立地をすべて選択します。

Select * From landfillWhere obj Within county_obj

Within 演算子および Contains 演算子では、あるオブジェクトの "図心" が別のオブジェクトの中

にあるかどうかをテストできます。あるオブジェクトの全体が別のオブジェクトの中にあるかど

うかをテストするには、Entire(ly) を使用します。あるオブジェクトの一部が別のオブジェクトの

中にあるかどうかをテストするには、Part(ly) を使用します。

ポイントはリージョンの内部にある

(Within)。

リージョンはポイントを含む

(Contain)。

MapBasic 11.0 189 ユーザーズ ガイド

Page 190: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 9 章: 図形オブジェクト

高度な地理検索

次の文を使用すると、その一部が郡内を通る高速道路をすべて選択できます。

Select * From highway Where obj Partly Within countyobj

Partly Within 演算子は、 初のオブジェクトの一部がもう一方のオブジェクトの中にあるかまたは

そのオブジェクトのどこかに接触しているかをテストします。Entirely Within 演算子では、あるオ

ブジェクトの全体がもう一方のオブジェクトの中に含まれるかどうかをテストできます。オブジェ

クトのすべてのセグメントをチェックするには、図心だけをチェックする場合に比べてより多くの

計算が必要になるため、Partly または Entirely を含む条件は評価の時間が長くなります。

Intersects 演算子は、あらゆるタイプのオブジェクトに使用することができます。あるオブジェク

トの一部が別のオブジェクトと交わるか、接触するか、その中にある時は、2 つのオブジェクトは

交差しています。いずれかの隅で接触する 2 つのリージョンは交差しています。折れ線のノード

上にあるポイントは、その折れ線と交差しています。交わるラインも互いに交差しています。

リージョンの中にあるポイントも、そのリージョンと交差しています。

次の表は、MapBasic の地理演算子をまとめたものです。

テーブル中のオブジェクトの検索

MapBasic の関数または地理比較演算子を使用すると、テーブルの Object フィールドを用いた検

索文を作成することができます。これらの検索文の作成手順は通常のフィールドの検索文の作成

手順とほぼ同じですが、オブジェクト リテラルが使われない点が異なります。オブジェクトを

使った検索文は、一般に関数または比較オペレータ (Entirely Within など) を使ってオブジェクト

を分析します。

演算子 用法 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 11.0 190 ユーザーズ ガイド

Page 191: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ObjectSelect *

From counties Where name="Marion" and state="IN"

Fetch First From selectionmycounty = selection.objSelect *

From doctors Where obj Within mycounty

ここで、変数 mycounty の代わりに Where 節でサブ選択を使うと、より少ない文で同じ結果を得

ることができます。

MapBasic 11.0 191 ユーザーズ ガイド

Page 192: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 9 章: 図形オブジェクト

高度な地理検索

Select * From doctors Where obj Within

(Select obj From counties Where name="Marion" And state="IN")

このサブ選択 (括弧にくくられている後者の選択) は、フィールドと行をそれぞれ 1 つずつしか持

たないテーブルを戻します。オブジェクトはインディアナ州マリオン郡を表します。MapInfoProfessional は、医者のテーブルの各行を調べてその行がマリオン郡の中にあるかどうかを特定し

ます。サブ選択は、適切なオブジェクトを式に返すため、前の例における変数 (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 ユーザーズ ガイド

Page 193: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 文を使用して、あるテーブルのオブジェクトと別のテーブルのオブジェクトの重な

り方に基づく比率データ併合を行う、高度なポリゴン オーバーレイ操作を実行することができま

す。たとえば、町の領域を示すテーブルと洪水危険地域を示すテーブルがあるとします。その全

体または一部が洪水危険エリアに入る町もあれば、危険エリアの外にある町もあります。AddColumn 文を使用して、町の領域テーブルから人口統計情報を抽出し、その情報に基づいて洪水危

険エリア内の統計データを計算します。Add Column 文の詳細については、『MapBasic リファレ

ンス ガイド』を参照してください。

MapBasic 11.0 193 ユーザーズ ガイド

Page 194: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

10

Microsoft Windows の高度な機能

この章は、MapBasic アプリケーションで Windows 特有の技術をどのように

活用できるかについて説明します。

このセクションの構成

ダイナミック リンク ライブラリ (DLL) の宣言と呼び出し. . . . . . .195カスタム ボタン アイコンおよび描画カーソルの作成. . . . . . . . . . .200DDE を利用したプロセス間の情報交換. . . . . . . . . . . . . . . . . . . . . .202アプリケーションへの Windows ヘルプの統合 . . . . . . . . . . . . . . .208

Page 195: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 10 章: Microsoft Windows の 高度な機能

ダイナミック リンク ライブラリ (DLL) の宣言と呼び出し

ダイナミック リンク ライブラリ (DLL) の宣言と呼び出し

ダイナミック リンク ライブラリ (DLL) は、実行可能ルーチンやその他のリソース (ツールバー ボタンのカスタム アイコンなど) を含むファイルです。DLL は外部ルーチンのライブラリとして使用

でき、これらのルーチンは MapBasic プログラムから呼び出すことができます。MapBasic プロ

シージャの呼び出しに Call 文を使用するように、DLL ルーチンの呼び出しにも Call 文を発行でき

ます。現在は多くの DLL が市販されています。各 DLL のドキュメントには、その中に含まれる

ルーチン、固有の名前、および必要なパラメータが説明されています。

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 ユーザーズ ガイド

Page 196: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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)

ここでは、ルーチンの呼び出しに使う名前 (この例では "Beeper") はキーワード Sub の後で

指定されています。ルーチンの元の名前は、キーワード Alias の後で指定しています。

MapBasic 11.0 196 ユーザーズ ガイド

Page 197: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 198: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 MainDim sSection, sEntry, sDefault, sReturn As StringDim 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 ユーザーズ ガイド

Page 199: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 200: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 201: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 (ピクセル単位) とします。

ここで、作成するのはアイコン リソースではなくビットマップ リソースである点に注

意してください。

• 2 つのビットマップ リソースに連続する ID 番号を割り当てる。たとえば、18 × 16 のビットマッ

プに 100 という ID を割り当てるとすると、26 × 24 のビットマップには 101 という ID を割り当

てます。

1 組のビットマップ リソースを作成した後、それらのカスタム ビットマップを CreateButtonPad 文または Alter ButtonPad 文を使用して MapBasic アプリケーションに組み込みま

す。プログラムの中では、小さい方 (18 × 16) のビットマップ リソースの ID を参照します。

たとえば、次の文の例に示すように、2 つのビットマップリソースにそれぞれ 100 および 101の ID を割り当てた場合は、100 の ID を参照します。

MapBasic 11.0 201 ユーザーズ ガイド

Page 202: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 203: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 10 章: Microsoft Windows の 高度な機能

DDE を利用したプロセス間の情報交換

DDE 会話の概要

DDE 会話は、2 つの Windows アプリケーション間で発生するプロセスです。両方のアプリケー

ションが実行されていると同時に、どちらのアプリケーションでも DDE 会話がサポートされてい

る必要があります。1 つの DDE会話に 2 つ以上のアプリケーションが関わることはできません。

ただし、MapInfo Professional では同時に複数の会話を実行できます。

ある会話では、一方のアプリケーションがアクティブであり、会話を開始します。このアプリケー

ションはクライアントと呼ばれます。もう一方のパッシブなアプリケーションは、サーバと呼ばれ

ます。クライアント アプリケーションは、命令やクエリをサーバ アプリケーションに送信するな

ど、会話に必要なすべての操作を実行します。サーバは、クライアントの命令に応答します。

MapBasic の DDE クライアントとしての機能

MapBasic 言語では、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 の文または関数 処理

DDEInitiate( ) 会話を開きます。

DDERequest$( ) サーバ アプリケーションからの情報を要求します。

DDEPoke サーバ アプリケーションに情報を送信します。

DDEExecute サーバ アプリケーションにアクションを実行するように

指示します。

DDETerminate DDE 通信をクローズします。

DDETerminateAll 同じ MapBasic プログラムがオープンしたすべての DDE通信をクローズします。

MapBasic 11.0 203 ユーザーズ ガイド

Page 204: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 レジストリに保存します。MapInfoProfessional におけるレジストリへの設定の保存の詳細については、MapInfo オンライン ヘルプ

で "レジストリ" を検索してください。

MapInfo Professional の DDE サーバとしての機能

MapInfo Professional は、別の Windows アプリケーションが DDE 会話を開始したときにはサーバ

として機能します。これにより、クライアント アプリケーションは MapBasic グローバル変数を

読み取ったり、そのグローバル変数に値を書き込んだりできるようになります。DDE クライアン

トは、実行操作によって MapBasic 文を実行することもできます。たとえば、クライアントは

DDE 実行機能を利用して MapBasic の Map 文を発行できます。(ただし、クライアントは

MapBasic のフローコントロール文を発行することはできません)。

MapBasic 11.0 204 ユーザーズ ガイド

Page 205: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 206: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 会話でサポートされる動作と項目を示します。

たとえば、次の MapBasic プログラム (MapBasic ウィンドウで直接入力できます) は、トピック名

を "SCALEBAR.MBX" とするシンプルな DDE 会話を実行します。この会話は、"SCALEBAR.MBX"が使用するグローバル変数のリストを出力します。

この会話は、SCALEBAR.MBX アプリケーションが実行中である場合に限り成立します。

DDE の動作 DDE 項目名 効果

ピーク リクエ

スト

“{items}” 実行中のアプリケーションによって定義された

グローバル変数をタブ区切りのリストとして返

します。下の例を参照してください。

ピーク リクエ

スト

グローバル変数名 変数の値を表す文字列が返されます。

ピーク リクエ

スト

グローバル変数の名前ではな

い文字列

MapBasic アプリケーションに RemoteQueryHandler( ) という関数が含まれ

ている場合、この関数が呼び出されます。この

関数は、CommandInfo(CMD_INFO_MSG) を呼

び出すことで項目名を判断できます。

Poke グローバル変数名 変数に新しい値を格納します。

実行 テキスト メッセージ MapBasic アプリケーションに RemoteMsgHandler というプロシージャが含

まれる場合、このプロシージャが呼び出されま

す。このプロシージャは、

CommandInfo(CMD_INFO_MSG) を呼び出すこ

とでテキスト メッセージを判断できます。

MapBasic 11.0 206 ユーザーズ ガイド

Page 207: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 208: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 10 章: Microsoft Windows の 高度な機能

アプリケーションへの Windows ヘルプの統合

DDE アドバイス リンク

MapInfo Professional が DDE 会話のサーバとして動作する場合、その会話ではウォーム アドバイス

リンクとホット アドバイス リンクの両方がサポートされます。つまり Windows アプリケーション

が、MapBasic グローバル変数の値を監視する DDE 会話を開くと、Windows は MapBasic グローバ

ル変数の値が変化した場合に限り、それを DDE クライアントに通知することができます。

MapBasic アプリケーションが DDE 会話のクライアントとして機能する場合、アドバイス リンク

の作成機能はサポートされません。

アプリケーションへの Windows ヘルプの統合

複雑なアプリケーションを開発する場合、そのアプリケーションについて説明したオンライン ヘルプ ファイルの作成を考える場合もあります。ヘルプ ファイルの作成には、ヘルプ コンパイラが

必要です。MapBasic 開発環境には、ヘルプ コンパイラは含まれていません。しかし、既に

Windows ヘルプ コンパイラを所有している場合、そのコンパイラを使用して Windows ヘルプ

ファイルを作成すると、MapBasic アプリケーションを通じてそのヘルプ ファイルを制御すること

ができます。

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 ユーザーズ ガイド

Page 209: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 10 章: Microsoft Windows の 高度な機能

アプリケーションへの Windows ヘルプの統合

アプリケーションの特定のダイアログ ボックスに対するヘルプ画面を用意するには、そのダイアロ

グ ボックスにボタン コントロールを追加して、そのボタンに "Help" という名前を割り当てます。

Control Button Title "Help" Calling show_help_sub

Help ボタン コントロールにハンドラ プロシージャを割り当て、そのハンドラ プロシージャによっ

て Set Window 文を発行します。ユーザが [ヘルプ] ボタンをクリックすると、そのダイアログボッ

クスに関するヘルプが表示されます。ダイアログ ボックス コントロールに対するハンドラ プロ

シージャの割り当てについては、「ユーザ インターフェイスの作成」を参照してください。

MapBasic 11.0 209 ユーザーズ ガイド

Page 210: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

11

統合マッピング

MapInfo Professional は、MapBasic 以外のプログラミング言語を使用して操

作することができます。たとえば、Visual Basic を使ったプログラミングに詳

しい皆さんは、MapInfo Professional のマップ ウィンドウを Visual Basic アプ

リケーションに統合して、プログラミングの大半 (あるいはすべて) を VisualBasic で行うことができます。MapInfo Professional の要素を別のアプリケー

ションに統合することから、このようなアプリケーション開発は統合マッピン

グと呼ばれています。

C や Visual Basic などの他のプログラミング言語に詳しい皆さんは、統合

マッピングを利用することで、MapInfo Professional のウィンドウを非

MapBasic アプリケーションに簡単に統合することができます。

.Net を使用して統合マッピング アプリケーションを作成する方法

については、「.Net での統合マッピング (272 ページ)」を参照し

てください。

このセクションの構成

統合マッピング アプリケーションの表示 . . . . . . . . . . 211統合マッピングの概念の概要. . . . . . . . . . . . . . . . 211統合マッピングの技術概要. . . . . . . . . . . . . . . . . 212短いサンプル プログラム : "Hello, (Map of) World" . . . . . . . . . . .213統合マッピングの詳しい説明. . . . . . . . . . . . . . . . 214コールバックを使用した MapInfo Professional からの情報の取り出

し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .223OLE を使用しないコールバック . . . . . . . . . . . . . . 227関連 MapBasic 文および関数 . . . . . . . . . . . . . . . 230OLE オートメーション オブジェクト モデル. . . . . . . . . 232MapInfo Professional コマンドライン引数 . . . . . . . . . 248ツールバー ボタンおよびハンドラの追加 . . . . . . . . . . 253その他. . . . . . . . . . . . . . . . . . . . . . . . . . 257

Page 211: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

統合マッピング アプリケーションの表示

統合マッピング アプリケーションの表示

統合マッピング アプリケーションの表示を操作することができます。必要であれば、MapInfoProfessional のユーザ インターフェイスとは大きく異なるユーザ インターフェイスを作成すること

も可能です。たとえば、下の画面は FindZip アプリケーション (MapInfo Professional のマップ ウィ

ンドウを Visual Basic のウィンドウに統合する Visual Basic アプリケーション) を示しています。

マップをプログラムに統合すると、ユーザはビットマップ、メタファイル、またはその他のスナップショットではなく、正真正銘の MapInfo Professional のマップ ウィンドウを見ることがで

きます。ユーザがそのマップで操作 (例 : [ズーム] ツールを使用したマップの拡大) できるようにす

ることも可能です。統合マップ ウィンドウは、MapInfo Professional の中でのマップ ウィンドウ

の機能をすべて備えています。

ユーザが統合マッピング アプリケーションを起動したときは、MapInfo Professional のス

プラッシュ画面 (MapInfo スタート時に表示されるイメージ) は表示されません。

統合マッピングの概念の概要

統合マッピング アプリケーションを作成するには、MapBasic プログラム以外のプログラムを記述

します。統合マッピング アプリケーションは、いくつかの言語で作成することができます。 も

一般的に使われる言語は、C および Visual Basic です。この章のコード サンプルでは、VisualBasic を使用します。

プログラムの中で、MapInfo Professional をバックグラウンドで起動させる文を発行します。たと

えば、Visual Basic を使用している場合は、Visual Basic の CreateObject( ) 関数を呼び出して

MapInfo Professional を起動させることができます。MapInfo Professional は、スプラッシュ画面

を表示することなくバックグラウンドで静かに起動します。

MapBasic 11.0 211 ユーザーズ ガイド

Page 212: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

統合マッピングの技術概要

プログラムによる MapInfo Professional の操作は、MapBasic 文を表す文字列を作成し、OLE オー

トメーション (または DDE) を使用して MapInfo Professional にその文字列を送るという形で行わ

れます。MapInfo Professional は、まるでそれらが MapBasic ウィンドウの中に入力されたかのよ

うに、これらの文を実行します。

マップ ウィンドウを開く場合は、通常の MapBasic プログラムと同じように MapBasic の Map From文を使用します。しかし、統合マッピング アプリケーションでは、さらに別の文 (例 : Set NextDocument Parent) を発行して、そのマップ ウィンドウをアプリケーションの子ウィンドウにする

必要があります。このプロセスは、ウィンドウの "再親化" (Reparenting) と呼ばれます。再親化は、

マップ、ブラウザ、グラフ、レイアウト、凡例の各ウィンドウに対して行えます。

MapInfo Professional のウィンドウを別のアプリケーションの中に再親化しても、MapInfoProfessional にそのアプリケーションのデータへのアクセスを与えることにはなりません。

MapInfo Professional ウィンドウにデータを表示するためには、まずそのデータを MapInfoテーブルに格納する必要があります。

次の図に、統合マッピング アプリケーションの主な要素を示します。

コンパイル済み MapBasic プログラム (.MBX) がオプション要素となっていることに注意してくだ

さい。アプリケーションによっては、コンパイル済み MapBasic プログラムを作成する必要がない

場合もあります。ただし、既に MapBasic プログラムを作成し終えている場合は、統合マッピング

ソリューションの一部として、既存の MapBasic コードを引き続き使用することができます。

統合マッピングの技術概要

システム要件

• 統合マッピングには、MapInfo Professional 4.0 以降が要求されます。ランタイムの使用も可能

です。

MapBasic 11.0 212 ユーザーズ ガイド

Page 213: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 コントロールも使用しません。MapInfoProfessional ソフトウェアにはいくつかの 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 ユーザーズ ガイド

Page 214: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

統合マッピングの詳しい説明

mi.do "Set Application Window " & Form1.hWndmi.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 オブジェクト関数に割り当てます

(オブジェクト変数はグローバルにすることができます。そうしなかった場合、ローカル プロシージャが終了すると MapInfo オブジェクトも解放されます)。

たとえば、オブジェクト変数に "mapinfo" という名前を与えた場合、次の文によって MapInfoProfessional が起動します。

Set mapinfo = CreateObject("MapInfo.Application")

Visual Basic の CreateObject( ) 呼び出し以外の方法で起動された MapInfo Professional の過去の実

行インスタンスに追加するには、Visual Basic の GetObject( ) 関数を使用します。

Set mapinfo = GetObject( , "MapInfo.Application")

通常の MapInfo Professional ではなく MapInfo ランタイムを使う場合は、"MapInfo.Application"ではなく "MapInfo.Runtime" と指定します。MapInfo ランタイムと MapInfo Professional のフル

コピーは、同時に実行することができます。

MapBasic 11.0 214 ユーザーズ ガイド

Page 215: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

統合マッピングの詳しい説明

Visual Basic の CreateObject( ) 関数および GetObject( ) 関数は、OLE オートメーションにより

MapInfo Professional に接続します。OLE ではなく DDE を使用する必要がある場合は、VisualBasic の 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 式として解釈し、式の値

を決定してその値を文字列として返します。

式に論理値が含まれる場合、MapInfo Professional は 1 文字から成る文字列、つまり "T" または "F" を返します。

DDE を使用して MapInfo Professional に接続した場合は、DDE LinkRequest メソッドを使用して

値を照会します。

MapBasic 11.0 215 ユーザーズ ガイド

Page 216: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

統合マッピングの詳しい説明

MapInfo Professional ウィンドウの再親化

MapInfo Professional を起動した後は、MapBasic の Set Appliation Window 文を使用して、MapInfoProfessional のダイアログ ボックスおよびエラー メッセージがクライアント プログラムに制御され

るようにします (次の文では、"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 NextDoument 文の中で、Visual Basic プログラムにおけるコントロールの HWND (ハンドル) を指定し

ます。次に (Map、Graph、Browse、Layout、Create Legend などの文を使用して) MapInfoProfessional ウィンドウを作成すると、新しく作成されたウィンドウは再親化されて、そのクライ

アント プログラムを親に持つようになります。

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 ユーザーズ ガイド

Page 217: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 の SetWindow Legend Parent 文を使用します。

カスタム凡例ウィンドウを作成してその再親化を行うには、MapBasic の Set Next Document 文に続けて MapBasic の Create Legend 文を使用します。この場合は、特定のマップ ウィンドウま

たはグラフ ウィンドウと連結した凡例ウィンドウが作成されることになります。MapInfoProfessional のデフォルト凡例ウィンドウとは異なり、このようなカスタム凡例ウィンドウは、ア

クティブなウィンドウが変わっても変化しません。

マップ ウィンドウの中で凡例を移動させることもできます。Set Next Document 文の中で、マップ

ウィンドウの HWND を親として指定します。こうすると、凡例はマップ ウィンドウの中に "捕われ

た" 枠となります。FindZip サンプル プログラムには、この手法を使用した例が紹介されています。

ユーザによるマップ ウィンドウのサイズ変更の許可

ユーザがマップ ウィンドウのサイズを変更できるかどうかは、アプリケーションの設定によって

決まります。FindZip サンプル プログラムでは、マップ ウィンドウは Visual Basic の PictureBoxコントロールの中に置かれるため、そのサイズを変更することはできません。ただし、MDI イン

ターフェイスを使用してマップ ウィンドウの再親化を行うと、ユーザはウィンドウ サイズを変更

できるようになります。

MapInfo Professional では、ユーザがマップ ウィンドウのサイズを変更しても、マップの内

容が新しいウィンドウ サイズに収まるようにマップの内容を自動的にリセットしません。

したがって、アプリケーションでユーザ によるマップ ウィンドウのサイズ変更が可能な場

合は、Windows API 関数の MoveWindow を 呼び出し、マップ ウィンドウを新しいサイズに

適合させなければなりません。

たとえば、次のような Visual Basic の Declare 文を使用して MoveWindow API 関数にアクセスす

ることができます。

MapBasic 11.0 217 ユーザーズ ガイド

Page 218: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 を呼び出します。VisualBasic では、サイズ変更イベントによって 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 フォームの標準プロパティで、それぞれフォー

ムの現在の幅と高さを表します。

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 ユーザーズ ガイド

Page 219: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 220: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

統合マッピングの詳しい説明

また、使用後にプログラムの呼び出しを行うカスタム描画ツール ボタンを作成することもできま

す。カスタム ツール ボタンの機能に関する一般的な説明については、「ユーザ インターフェイス

の作成」を参照してください。カスタム ツール ボタンを統合マッピング アプリケーションの中で

使用する場合の詳細については、「コールバックを使用した MapInfo Professional からの情報の

取り出し」を参照してください。

MapInfo Professional のショートカット メニューのカスタマイズ

MapInfo Professional では、ユーザが MapInfo Professional ウィンドウを右クリックするとショー

トカット メニューが表示されます。これらのショートカット メニューは、統合マッピング アプリ

ケーションでも表示されます。アプリケーションの性格によっては、MapInfo Professional のショートカット メニューを変更、あるいは削除したい場合もあります。たとえば、統合マッピン

グ アプリケーションではマップ ウィンドウの複製を作成できない場合もあるので、マップ ウィン

ドウ ショートカット メニューの [ビューの複製] メニューを削除した方がよい場合もあります。

MapInfo Professional のショートカット メニューから 1 つ以上のメニュー項目を削除するには、

MapBasic の Alter Menu…Remove 文を使用するか、Create Menu 文を使用してメニュー全体を

再定義します。この構文の詳細については、『MapBasic リファレンス ガイド』またはオンライン

ヘルプを参照してください。

MapInfo Professional のショートカット メニューにカスタム項目を追加するには、MapBasic の AlterMenu...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

テキスト 1709 M_TOOLS_TEXT

枠 1719 M_TOOLS_FRAME

ノード追加 1723 M_TOOLS_ADD_NODE

メイン ツールバー ボタン 数 識別子コード

MapBasic 11.0 220 ユーザーズ ガイド

Page 221: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 を参照してください。

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 メソッドを使用して "EndMapInfo" コマンド文字列を送信すると、MapInfo Professional を終了することができます。

MapBasic 11.0 221 ユーザーズ ガイド

Page 222: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 構文では無効

のサブ文字列が含まれることになります。各コマンド文字列がスペースで終わることで、MapInfoProfessional は Interactive と Set が別々のキーワードであることを検出できます。

複数の MapBasic 文を 1 つのコマンド文字列に統合する場合は、MapInfo Professional が文字列に

含まれる個々の文を検出できるように、各文の後に必ずスペースを入れてください。

ダイアログ ボックスについての注意事項

統合マッピング アプリケーションでは、ダイアログを閉じる際の [OK] ボタンは有効ではありませ

ん。通常のコントロール ボタンを使用し、変数を設定してユーザがそのボタンをクリックしたか

どうかを判断するようにします。

MapBasic 11.0 222 ユーザーズ ガイド

Page 223: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

コールバックを使用した MapInfo Professional からの情報の取り出し

アクセラレータ キーについての注意事項

統合マッピング アプリケーションでは、MapInfo Professional のアクセラレータ キー (例 : コピー

する際に使用する Ctrl-C) は無視されます。アプリケーションでアクセラレータ キーを使用できる

ようにするには、クライアント プログラム (例 : Visual Basic アプリケーション) の中でこれらのア

クセラレータ キーを定義する必要があります。

ただし、統合マッピング アプリケーションでは、"S" キーの押下によるスナップ モードのオン/オフの切り替えはサポートします。

コールバックを使用した MapInfo Professional からの情報の取り出し

MapInfo Professional がクライアント プログラムに自動的に情報を送るように統合マッピング アプリケーションを設定することができます。たとえば、マップ ウィンドウが変更されるたびに

MapInfo Professional がクライアント プログラムを呼び出して、変更されたウィンドウの整数ウィ

ンドウ ID を伝えるようにプログラムを設定することも可能です。あるイベントが MapInfoProfessional にクライアント プログラムを呼び出させるこのタイプの通知は、"コールバック" と呼

ばれています。

• コールバックでは、MapInfo Professional は次のような状況においてクライアント プログラム

に情報を送ることができます。

• ユーザがカスタム ツールを使用して MapInfo Professional ウィンドウの操作を行った場合 : たとえば、ユーザがマップ ウィンドウ上でクリック/ドラッグしてラインを描くと、MapInfoProfessional はクライアント プログラムを呼び出して、ユーザが選択した X 座標および Y 座標

を伝えることができます。

• ユーザがメニュー コマンドを選択した場合 : たとえば、アプリケーションで MapInfo Professionalのショートカット メニュー (ユーザが右クリックすると表示されるメニュー) をカスタマイズする

とします。ユーザがショートカット メニューからカスタム コマンドを選ぶと、MapInfoProfessional はクライアント プログラムを呼び出して、そのメニュー イベントをプログラムに通

知することができます。

• マップ ウィンドウが変更された場合 : ユーザがマップ ウィンドウの内容を変更した (例 : マップ

レイヤを追加または消去する、あるいはマップを移動する) 場合に、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 ユーザーズ ガイド

Page 224: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 がクライアント

プログラムに通知するようにしたい場合は、カスタム メニュー コマンドを定義して (例 : AlterMenu...Add 文を使用して MapInfo Professional のショートカット メニューの 1 つに項目を追

加する)、 そのカスタム メニュー コマンドが Calling OLE methodname (methodname はス

テップ 4 で指定したメソッド名) の構文を使用するように定義する。

8. 定義したメソッドの中で、MapInfo Professional から送られた引数の処理に必要な文を発行する。

9. SetStatusText メソッドを作成した場合、MapInfo Professional はそのメソッドに対し、MapInfoProfessional のステータス バーに表示されるテキストを表すシンプルなテキスト文字列を送信

する。MapInfo Professional のステータス バーをエミュレートする場合は、このメソッドにコー

ドを追加して、そのテキストがユーザ インターフェイスのどこかに表示されるようにします。

MapBasic 11.0 224 ユーザーズ ガイド

Page 225: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 226: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

コールバックを使用した MapInfo Professional からの情報の取り出し

各コードの説明については、『MapBasic リファレンス ガイド』またはオンライン ヘルプの

CommandInfo( ) の項を参照してください。

Calling OLE methodname の構文を使用するカスタム メニュー コマンドまたはボタンを作成す

ると、MapInfo Professional は CommandInfo( ) による 8 つの戻り値のすべてをコンマで区切って

含んだ文字列を作成します。この文字列は接頭辞 "MI:" で始まるため、OLE サーバはこのメソッド

が MapInfo Professional によって呼び出されたことを判断できます。

MapInfo Professional からメソッドに送られる文字列の構成は、次のようになります。

"MI:" + CommandInfo(1) + "," + CommandInfo(2) + "," + CommandInfo(3) + "," + CommandInfo(4) + "," + CommandInfo(5) + "," + CommandInfo(6) + "," + CommandInfo(7) + "," + CommandInfo(8)

カスタムボタンのそれぞれにユニークな ID 番号を割り当てると、全てのボタンに同じメソッドを

呼び出させることができます。そのメソッドは、コンマで区切られた文字列の 7 つの引数を評価

して、どのボタンによって呼び出されたかを特定します。

MapBasic がコンマで区切られた文字列をメソッドに送信した後は、必要に応じてその文字列を解

読するコードをメソッドに追加することができます。

統合マッピング アプリケーションで MapInfo Professional のショートカット メニューにカスタム

メニュー コマンドを追加する場合、 ユーザがそのカスタム メニュー コマンドを選択するたび

に、MapInfo Professional は OLE メソッドにコンマで区切られた文字列を送信します。このカス

タム メニュー コマンドの ID 番号が 101 である場合、文字列は次のような形になります。

"MI:,,,,,,,101"

この場合、コンマで区切られた文字列の要素のほとんどは空になっています。これは、

CommandInfo( ) 関数はメニュー イベントに関する 1 つの情報しか返すことができないからです (上の表を参照)。上の文字列の 8 つの "スロット" の中では、8 番目のスロットのみがメニュー イベント

に関連しています。

次に、ユーザがマップ上でクリック/ドラッグしてラインを描けるようにするカスタム MapInfoProfessional ツールバー ボタンを作成するとします。ユーザがそのカスタム描画ツールを使用するた

びに、MapInfo Professional は次のようなコンマで区切られた文字列を OLE メソッドに送信します。

"MI:-73.5548,42.122,F,F,-72.867702,43.025,202,"

6 CMD_INFO_Y2

7 CMD_INFO_TOOLBTN

8 CMD_INFO_MENUITEM

メニュー イベント後に意味を持つ

コード

ボタン イベント後に意味を持つ

コード

MapBasic 11.0 226 ユーザーズ ガイド

Page 227: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 228: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

OLE を使用しないコールバック

DDE コールバック

カスタム ツールバー ボタンまたはメニュー コマンドを作成する場合は Calling 句を指定します。

DDE を通じてコールバックを処理するには、 Calling DDE server, topic 構文を使用します。

ユーザがカスタム ボタンまたはメニュー コマンドを使用すると、MapInfo Professional はそのた

びに指定された DDE サーバへの DDE 接続を開き、指定された DDE トピックに文字列を送信しま

す。この文字列は、「コールバックへの送信データの処理 (225 ページ)」で説明した形式に基づい

ています (例 : “MI:……101”)。

DDE コールバックの例については、サンプル プログラム FindZip を参照してください。FormLoad プロシージャは、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 アプリケーションによる MapInfoProfessional の起動後、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 ユーザーズ ガイド

Page 229: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

OLE を使用しないコールバック

ボタンをクリックしてヘルプ ファイルの他の内容を参照することができます。しかし、

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 ユーザーズ ガイド

Page 230: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

関連 MapBasic 文および関数

• MapBasic には、HTML ヘルプ コンパイラは付属していません。Microsoft から無料で提供され

ています 。http://www.microsoft.com/downloads/details.aspx?FamilyID=00535334-C8A6-452F-9AA0-D597D16580CC&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 ダイアログ ボックス ウィンドウの再親化を行う。MapInfoProfessional への接続後または MapInfo Professional の起動後、

クライアント プログラムの中でこの文を一度だけ発行する。

Set Map マップ ウィンドウのさまざまな機能を制御する。

MapBasic 11.0 230 ユーザーズ ガイド

Page 231: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

関連 MapBasic 文および関数

Set Next Document マップ ウィンドウなどのドキュメント ウィンドウの再親化を

行い、そのウィンドウをクライアント プログラムの子ウィン

ドウにする。

Set Windowsetwindow MapInfo Professional ウィンドウのさまざまな機能を制御する。

Shade, Set Shade 主題図レイヤの作成または変更を行う。

SystemInfo( ) SystemInfo( ) が返す値の中には、統合マッピング特有のもの

もある。

たとえば、SYS_INFO_APPLICATIONWND と指定すると、ア

プリケーションの HWND が取り出せます。

WindowID( ), WindowInfo( ) 再親化されたウィンドウを含む MapInfo Professional ウィン

ドウに関する情報を返す。

文 / 関数名 説明

MapBasic 11.0 231 ユーザーズ ガイド

Page 232: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

OLE オートメーション オブジェクト モデル

OLE オートメーション オブジェクト モデル

次の図に、MapInfo Professional OLE オートメーション タイプ ライブラリの概要を示します。メソッ

ドとプロパティの詳細については、以降のページで説明します。

Application オブジェクトは、MapInfo Professional のインスタンスを表します。

MBApplications コレクションの各オブジェクトは、現在実行中の MapBasic アプリケーションを表

します。

MBGlobals コレクションの各オブジェクトは、実行中の MapBasic アプリケーションのいずれかに

よって定義されたグローバル変数を表します。

MapBasic 11.0 232 ユーザーズ ガイド

Page 233: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

OLE オートメーション オブジェクト モデル

次の図に、MapInfo Professional の OLE オートメーション タイプ ライブラリに用意されているそ

の他のオブジェクトを示します。メソッドとプロパティの詳細については、以降のページで説明

します。

MapBasic 11.0 233 ユーザーズ ガイド

Page 234: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

OLE オートメーション オブジェクト モデル

MapInfo Professional プロセス内から OLE オブジェクト モデルを使用

OLE オートメーション オブジェクト モデルは、 初、別のプロセスのクライアント アプリケー

ション (統合マッピング アプリケーションなど) から使用するために設計されました。このオブジェ

クト モデルは、実行中の MapBasic プログラムで呼び出された DLL からコマンドを実行するために

使用することもできます。このアプローチの場合は、次の 2 つの点に注意が必要です。

• DLL が読み込まれる MapInfo Professional プロセスに対してコマンドを実行する。これにより

MapInfo Professional の 2 つ目のインスタンスが作成されるので、"CreateObject" 関数呼び出

しを実行して OLE オブジェクトを取得することはありません。代わりに、現在の MapInfoProfessional プロセスを表す 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 ユーザーズ ガイド

Page 235: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

OLE オートメーション オブジェクト モデル

ProductLevel 実行中の MapInfo 製品を示す整数を返す。MapInfo Professionalの場合は、200 を返す。

Visible アプリケーション ウィンドウが可視状態であるかどうかを示す

ブール値を返す。読み取り/書き込み可能なプロパティです。

ウィンドウの可視性を特定するにはこのプロパティの読み取り

を、ウィンドウの可視性を設定するには書き込みを行います。

LastErrorCode Do、Eval、または Runommand のメソッド呼び出しの 中に発

生した 後の MapBasic エラーのコード番号を示す 2 バイト整

数値を返す。

ここで返されるコード番号は、対応する 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 CommandID 文を発行します。

Application オブジェクトのプロパティ (続き)

プロパティ名 機能

MapBasic 11.0 235 ユーザーズ ガイド

Page 236: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

OLE オートメーション オブジェクト モデル

DataObject( windowID ) 特定の整数 windowID が与えられると、そのウィンドウを表す

IUnknown インターフェイスを返す。ウィンドウのメタファイ

ル表示を得るには、IDataObject インターフェイスに対して

QueryInteface を使用します。

このオブジェクトに対して定義されるインターフェイスは、

IDataObject および IUnknown の 2 つだけです。

これは、C プログラマ用の高度機能です。

SetCallback( IDispatch ) その OLE オートメーション オブジェクトを MapInfo Professional作成通知の "シンク" として登録する。コールバック関数は一度

に 1 つしか登録できません。

このメソッドは非推奨になりました。新しいメソッドの

RegisterCallback および UnregisterCallback を使用する

方が実用的です。

RegisterCallback(IDispatch)

その OLE オートメーション オブジェクトを MapInfoProfessional 作成通知の "シンク" として登録する。

MapInfo Professional プロセス内 (たとえば、MapBasic 経由で呼び出される DLL ) からコールバックを登録する場合

に、このメソッドを使用します。このメソッドを使用す

ると、コールバック オブジェクトが、MapInfo Professionalプロセス内で実行される可能性のある他のアプリケーショ

ンと並列で動作します。

UnregisterCallback(IDispatch)

RegisterCallback メソッド経由で登録された OLE オートメーショ

ン オブジェクトを登録解除する。RegisterCallback の呼び出

しで使用されたものと同じ引数を渡す必要があります。

SetCallbackEvents(IDispatch, eventFlags)

MapInfo Professional ではデフォルトで有効な通知メソッドがすべ

て呼び出されるが、このメソッドを使用すると、どのコールバッ

ク通知がコールバック オブジェクトに送信されるかを制御でき

る。たとえば、コールバック オブジェクトが WinContentsChangedおよび SetStatusText メソッドを実装している場合に、特定の状況

で SetStatusText 通知を受け取るには、SetCallbackEvents( <dispatch id>, CallbackEvents.WindowChanged ) を呼び出すこ

とで、ウィンドウ変更通知のみが送信されるように MapInfoProfessional に指示することができます。詳細については、次の

CallbackEvents を参照してください。

Application オブジェクトのメソッド (続き)

メソッド名 機能

MapBasic 11.0 236 ユーザーズ ガイド

Page 237: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

OLE オートメーション オブジェクト モデル

たとえば、次の文では 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 オブジェクトに適用されるすべてのプロパティを示します。

IDispatch* RegisterDockWindow(HWNDhwnd, long domainId)

指定されたウィンドウを MapInfo Professional に登録し、ドッ

キングされたウィンドウを表すオブジェクトを返す。このメ

ソッドの呼び出し中に、ドック ウィンドウが作成され、デフォ

ルト位置にドッキングされます。Dock メソッドと Float メソッ

ドの呼び出しを使って、ウィンドウのカスタム ドッキング状態

を設定できます。

domainId 引数は、.Net コードから直接 COM API を使用してい

る場合にのみ有効です。その場合、現在の AppDomain の ID を渡す必要があります。

void UnregisterDockWindow(IDispatch* dockWindow)

dockWindow 引数で指定されたドック ウィンドウを登録解除す

る。ドック ウィンドウが登録解除された後に DockWindow オブジェクトの操作を試みると、エラーが発生します。

Application オブジェクトのメソッド (続き)

メソッド名 機能

MapBasic 11.0 237 ユーザーズ ガイド

Page 238: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 239: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

OLE オートメーション オブジェクト モデル

LastErrorCode Do、Eval、または Runommand のメソッド呼び出しの 中に発

生した 後の MapBasic エラーのコード番号を示す 2 バイト整数

値を返す。

ここで返されるコード番号は、対応する 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() ドック ウィンドウをアプリケーション ウィンドウの側面にピン

止めする。

DockWindow オブジェクトのプロパティ

プロパティ 説明

MapBasic 11.0 239 ユーザーズ ガイド

Page 240: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 241: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

OLE オートメーション オブジェクト モデル

MBApplications オブジェクトのプロパティ

MBApplicatios コレクション内の各オブジェクトは、実行中の MapBasic アプリケーションです。

次の表に示すプロパティは、すべて読み取り専用です。

たとえば、次の文は実行中の MapBasic アプリケーションの名前を特定します。

Dim appsList As ObjectDim firstname As String

Set appsList = mapinfo.MBApplicationsIf appsList.Count > 0 Then

firstname = appsList(1).Name End If

MBApplications オブジェクトのプロパティ

プロパティ名 機能

Name アプリケーション名 (例 : "FOO.MBX") を返す。OLD 標準プロパティ。これは、

MBApplication オブジェクトのデフォルト プロパティです。

FullName MapBasic アプリケーションの .MBA ファイルの完全パスを返す。OLD 標準プ

ロパティ。

Application アプリケーションの IDispatch を返す。OLD 標準プロパティ。

Parent その親オブジェクトの IDispatch を返す。programobject に対しては、これは

MapInfo Professional アプリケーション オブジェクトのことです。OLD 標準

プロパティ。

MBApplication オブジェクトのメソッド

メソッド名 機能

Do( string ) 指定された文字列が MapBasic アプリケーションの RemoteMsgHandlerプロシージャに送信される。

Eval( string ) 指定された文字列が MapBasic アプリケーションの RemoteQueryHandler( )関数に送信され、RemoteQueryHandler による戻り値が返される。

RemoteQueryHandler( ) は、文字列を返す関数として定義されなければ

なりません。式に論理値が含まれる場合、MapInfo Professional は 1 文字から成る文字列、つまり "T" または "F" を返します。

MapBasic 11.0 241 ユーザーズ ガイド

Page 242: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

OLE オートメーション オブジェクト モデル

MBGlobalsコレクションのプロパティ

MBGlobals は、実行中の特定の MapBasic アプリケーションによって宣言されたすべての MapBasicグローバル変数の総称です。次の表に示すプロパティは、すべて読み取り専用です。

MBGlobals オブジェクトのプロパティ MBGlobals コレクション内の各オブジェクトは、MapBasic のグローバル変数です。次の表に示す

プロパティは、Value プロパティを除き、すべて読み取り専用です。

MBGlobals コレクションのプロパティ

プロパティ名 機能

Item 特定の mbglobal オブジェクトの IDispatch を返す。引数は、整数インデックス

(1...Count) を評価できる VARIANT タイプ、または文字列値 (グローバル変数名)です。これは、MBGlobals コレクションのデフォルト プロパティです。

Count コレクション内のオブジェクト数を長い整数値として返す (グローバル変数

の数)。

Application MapInfo Professional アプリケーション オブジェクトの IDispatch を返す。

OLD 標準プロパティ。

Parent その親オブジェクトの IDispatch を返す。このコレクションに対しては、

programobject オブジェクトのことです。OLD 標準プロパティ。

MBGlobals オブジェクトのプロパティ

プロパティ名 機能

Value 読み取り/書き込み。MapBasic グローバル変数の値を表す文字列を取り出す

にはこのプロパティの読み取りを、変数値を変更するには書き込みを行いま

す。これは、MBGlobal オブジェクトのデフォルト プロパティです。

Name 変数の名前を返す。OLD 標準プロパティ。

Type MapInfo Professional の標準タイプ (例 : 整数、日付) としての変数タイプを

示すテキスト文字列を返す。

Application アプリケーションの IDispatch を返す。OLD 標準プロパティ。

Parent その親オブジェクトの IDispatch を返す。MBGlobal オブジェクトに対して

は、そのグローバル変数を宣言した programobject のことです。OLD 標準

プロパティ。

MapBasic 11.0 242 ユーザーズ ガイド

Page 243: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

OLE オートメーション オブジェクト モデル

次の Visual Basic の例では、MapBasic アプリケーション内にあるグローバル変数 (g_status) の値

を評価して、その変更を行います。

Dim globinfo As ObjectDim 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 ユーザーズ ガイド

Page 244: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

OLE オートメーション オブジェクト モデル

ワークスペースに関するプロパティは MIMapGen オブジェクトを使用する前に設定してくださ

い。MIMapGen は、マップ ウィンドウが 1 つしかない場合 (例 : ブラウザに 1 つのマップが表示さ

れている場合) 専用に設計されています。MIMapGen を使用する前にワークスペースのプロパティ

を設定し、MapInfo Professional がワークスペースを読み込めるようにします (1 つだけマップ

ウィンドウが表示されているワークスペース)。その後で、マップ ウィンドウを操作するその他の

メソッドとプロパティを使用できます。

MIMapGen オブジェクトのメソッド

次の表に、MIMapGen オブジェクトに適用されるメソッドを示します。

ImageHeight イメージの高さをピクセルで指定する。

CenterX マップの中心の X 座標 (経度)。

CenterY マップの中心の Y 座標 (緯度)。

Zoom マップ横方向の距離 (例 : マイル数)。ここで指定した数値はマップ ウィンド

ウで使用されます (例 : マイル数、キロメートル数)。

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 ユーザーズ ガイド

Page 245: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

OLE オートメーション オブジェクト モデル

検索に使用されるメソッドは、レイヤの 上位にある選択可能なレイヤのみを検索しま

す。検索結果へのアクセス方法については、MISearchInfo オブジェクトの項を参照してく

ださい。

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 の SaveWindow 文の項を参照してください。

ExportMapEx(string ImageType, string FileSpec,string CopyrightInfo )

マップ ウィンドウのイメージ ファイル (例 : JPEG、TIFF、PNG、

PSD、BMP、WMF、GIF ファイル) を生成する。MapBasic の SaveWindow 文の項を参照してください。

RefreshProperties( ) CenterX、CenterY、Zoom、ImageHeight、ImageWidth を更新する。

ScreenToMap(long ScreenX, long ScreenY, double MapX, double MapY )

スクリーン座標 (ピクセル) をマップ座標 (緯度/経度など) に変換する。

MapGenHandler(string Message )

MBApp プロパティを使用して実行する MBX アプリケーションの

MapBasic サブ プロシージャ RemoteMapGenHandler を呼び出す。

このメソッドを使用すると MBX ファイルの MapBasic 文を実行でき

ます。

MIMapGen オブジェクトのメソッド (続き)

メソッド 機能

MapBasic 11.0 245 ユーザーズ ガイド

Page 246: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

OLE オートメーション オブジェクト モデル

MISearchInfo オブジェクトのプロパティ 次の表に、MISearchInfo オブジェクトに適用されるプロパティを示します。

MISearchInfo オブジェクトを取得するには、MIMapGen オブジェクトの search メソッド

(SearchRadius、SearchRadiusExt、SearchPoint、SearchRect) のいずれかを使用します。

MIRow オブジェクトのメソッド 次の表に、MIRow オブジェクトに適用されるメソッドを示します。各 MIRow オブジェクトは

search メソッドによって返された 1 レコード、または GetTable メソッドを呼び出して取得した

テーブルの 1 レコードを表します。

MIRow オブジェクトを取得するには、MISearchInfo オブジェクトまたは MISelection オブ

ジェクトの Row プロパティを参照します。

MIField オブジェクトのプロパティ 次の表に、MIField オブジェクトに適用されるプロパティを示します。各 MIField オブジェクト

は、 後に実行した検索結果に含まれるデータ フィールド、または GetTable メソッドを呼び出し

て取得したテーブルの 1 フィールド データを表します。

MISearchInfo オブジェクトのプロパティ

プロパティ 機能

Rows MIRows コレクション (MIRow オブジェクトのコレクション) を返す。このコ

レクションは検索結果を表します。

Fields MIFields コレクション (MIFields オブジェクトのコレクション) を返す。このコ

レクションは検索結果を示すフィールド定義 (フィールド名など) を表します。

TableName String : 検索結果を含むテーブルの名前。

MIRow オブジェクトのメソッド

メソッド 機能

値 variant 型引数で指定したフィールドのデータ値へのポインタを返す。variant 型引数

は VT_12、VT_14 および VT_BSTR (VT_BSTR はフィールド名) です。

MapBasic 11.0 246 ユーザーズ ガイド

Page 247: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

OLE オートメーション オブジェクト モデル

MIField オブジェクトのコレクションを取得するには、MISearchInfo オブジェクトまた

は MISelection オブジェクトの Fields プロパティを参照します。

MISelection オブジェクトのプロパティ 次の表に、MISelection オブジェクトに適用されるプロパティを示します。

MISelection オブジェクトにアクセスするには、MIMapGen オブジェクトの GetTable メソッドを

使用します。

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 フィールドでの小数点以下の桁数。

MISelection オブジェクトのプロパティ

プロパティ 機能

Rows MIRows コレクション (MIRow オブジェクトのコレクション) を返す。このコ

レクションは、テーブルにあるすべてのレコードを表します。

Fields MIFields コレクション (MIFields オブジェクトのコレクション) を返す。このコレ

クションは、GetTable メソッドで指定したテーブルのフィールド定義 (フィール

ド名など) を表します。

TableName String : GetTable メソッドで指定したテーブルの名前。

MapBasic 11.0 247 ユーザーズ ガイド

Page 248: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

MapInfo Professional コマンドライン引数

MapInfo Professional コマンドライン引数

DDE を使用して MapInfo Professional と通信する場合は、DDE 接続を確立する前に、まず MapInfoProfessional を手動で (例 : 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 ページ)」を参照してください。

MapBasic 11.0 248 ユーザーズ ガイド

Page 249: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 250: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

MapInfo Professional コマンドライン引数

MapInfo Professional サポート クラスおよびそのインスタンスの作成

[プロジェクト] > [クラスウィザード] で、[OLE オート メーション] タブを選択し、[Read TypeLibrary] ボタンをクリックします。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 applicationmapinfo.Do("Set Window Help Off");// Reprogram the mapper shortcut menumapinfo.Do("Create Menu \"MapperShortcut\" ID 17 as \"(-\"");

また、今後必要となるテーブルを開くといった別の初期化も、ここで行うことをお勧めします。

MapBasic 11.0 250 ユーザーズ ガイド

Page 251: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 252: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 11 章: 統合マッピング

MapInfo Professional コマンドライン引数

m_windowid = 0;m_windowhwnd = 0;

• OnCreate メソッドの中で、CView::OnCreate の呼び出しの後に次のコードを追加します。

//must have ClipChildren style for integratable maps to workSetWindowLong(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 ユーザーズ ガイド

Page 253: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 lessarea, more detail\nZoom-in"、ID_TOOLS_ZOOMOUT" は Zoom-Out to show morearea, less detail\nZoom-Out" にします。

4. MAINFRM.CPP の中で、静止 UNIT BASED_CODE ボタン [ ] 配列を探し、ID 定数を配列の中

のビットマップ リソースと同じ位置に挿入する。

5. ユーザ インターフェイスが正常に機能するためには、現在選択されているツールを把握できな

ければならない。そのためには、CprojectnameView ヘッダ ファイルの中に 1 つの整数変数を

追加します。

int m_eMouseMode;

6. クラスコンストラクタの中でこの変数を初期化し、マップの初期状況を表すようにする。ここで

は、さまざまなツールのうち、選択されているツールを把握するために MapInfo Professional 定数を使用します。

MapBasic 11.0 253 ユーザーズ ガイド

Page 254: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 255: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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_MAPEND_DISPATCH_MAP()

MapBasic 11.0 255 ユーザーズ ガイド

Page 256: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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_DISPATCHDECLARE_DISPATCH_MAP()

上記のコード (抜粋) は、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 ユーザーズ ガイド

Page 257: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 258: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

12

.Net の操作

MapBasic プログラムは、Microsoft .Net 開発プラットフォームを使用して記述

された関数およびサブルーチンを呼び出すことができます。Microsoft の VisualStudio 開発環境を使用し、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例外処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .268GAC ウィンドウの操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .269.Net メソッド内からの MapInfo Professional の制御 . . . . . . . . . .270.Net での統合マッピング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .272

Page 259: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 12 章: .Net の操作

.Net プログラムの概要と要件

.Net プログラムの概要と要件

この章では、読者がある程度 .Net でのコードの記述方法を理解していることを前提としています。

特に、.Net でクラスを定義する方法、クラスにコンストラクタを与える方法、および MicrosoftVisual Studio 開発環境を使用して .Net 用のプロジェクトを構築する方法を理解している必要があり

ます。

MapInfo Professional および MapBasic バージョン 10 を使用し、MapBasic から .Net ルーチンを呼

び出す必要があります。

MapBasic アプリケーション (.mbx) ファイルを実行するコンピュータに、.Net Framework バー

ジョン 3.5 がインストールされている必要があります。ただし、MapInfo Professional 10 が実行さ

れるシステムでは、MapInfo Professional インストーラにより .Net Framework が (ない場合には)インストールされるため、既に存在していると考えられます。

この章では、VB.Net および C# のコード サンプルが提供されています。この章の例は、VisualStudio 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 ユーザーズ ガイド

Page 260: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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

この VB の例では、名前空間がソース コードで明示的に宣言されています。VB プロジェク

トのプロパティでルート名前空間を設定している場合、VB プロジェクトによっては、ソー

ス コードに名前空間の宣言が存在しない場合があります。

MapBasic 11.0 260 ユーザーズ ガイド

Page 261: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 に関するドキュメントを参照してください。

MapInfo Professional では、UNC パスなどのネットワーク ロケーションから .MBX アプリ

ケーションを実行できます。ただし、.Net Framework のデフォルトのセキュリティ設定で

は、.Net アセンブリをネットワークから読み込むことは許可されていません。固有の .Netアセンブリを MapBasic アプリケーションから呼び出す場合は、クライアント マシンから

のネットワーク経由によるアクセスではなく、クライアント マシンにアプリケーション

ファイルをインストールすることを検討してください。そうでない場合は、.NetFramework 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 ユーザーズ ガイド

Page 262: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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" と指定します。アセンブリ名は VisualStudio でのプロジェクト設定に応じて異なります。

引数リストは、.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 functionDeclare 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 ユーザーズ ガイド

Page 263: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 データ型とどのように対応しているかを示しています。

引数は配列タイプにすることができます。たとえば、.Net メソッドが整数値の配列である引数を

受け取る場合、Declare Method 文は次のようになります。

Declare Method ProcessIntegerArray Class "MyProduct.MyWrapper" Lib "MyAssemblyName" (idNumbers() As Integer)

引数は、参照渡しまたは値渡しで渡すことができます。参照渡しの構文と 値渡しの構文は、言語に

よって異なります。次の表では、String 引数を値渡しまたは参照渡しで 渡す方法を示しています。

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 タイプ

利用不能 利用不能 利用不能

MapBasic 11.0 263 ユーザーズ ガイド

Page 264: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 12 章: .Net の操作

.Net での構造の操作

.Net メソッド内で MapBasic の配列変数のサイズを変更することはできません。

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 str As String ByVal str As String

VB.Net ByRef str As String ByVal str As String

C# ref String str String str

MapBasic 11.0 264 ユーザーズ ガイド

Page 265: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 12 章: .Net の操作

.Net での構造の操作

次の MapBasic コードは、3 つのフィールドを含む構造タイプを定義し、その構造タイプを .Netメソッドに渡しています。

タイプ名 (この例では ParcelInfo) が Declare Method 文で使用されるため、Type 文は

Declare Method 文の前に配置する必要があります。

Type ParcelInfoidnum As Integer descript As Stringarea As Float

End Type

Declare Method ShowParcelDialogClass "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 ユーザーズ ガイド

Page 266: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 267: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 = 23loc.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 IfEnd Sub

この例では、ColorDialog のようなオブジェクトをインスタンス化し、そのオブジェクトで非静的

メソッドを呼び出します。前述のとおり、MapBasic プログラム (.MB ソース コード) は、静的メ

ソッドのみ呼び出すことができますが、静的メソッド内で記述した .Net コードにはそういった制

限はありません。静的メソッド内部で、.Net コードによりオブジェクトをインスタンス化し、そ

のオブジェクトを使用して非静的メソッド (インスタンス メソッド) を呼び出すことができます。

MapBasic 11.0 267 ユーザーズ ガイド

Page 268: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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() ' Call a .Net method g_status = 0 ' set result code; 0 = successExit Sub

caughtit:

' 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 exceptiong_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 ユーザーズ ガイド

Page 269: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 270: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 プログラマは、MapInfoProfessional の メソッドと 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 ユーザーズ ガイド

Page 271: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 インストー

ル ディレクトリにあります。

ビュー名管理機能サンプル プロジェクトを構築しているときにエラーが発生した場合は、

アセンブリの現在の場所が指定されるようにするために、Visual Studio プロジェクトの

miadm.dll 参照の再作成が必要になることがあります。

MapInfoApplication クラスはラッパー クラスです。このクラスにより、.Net プログラマは MapInfoProfessional の COM インターフェイスに簡単にアクセスできます。このクラスは、COM イン

ターフェイスを直接操作するのではなく、標準 .Net クラスを経由してメソッド、プロパティ、お

よびイベントにアクセスするための便利な機能として提供されています。前述の Do メソッドと

Eval メソッドの提供以外に、MapInfoApplication クラスは次に示すプロパティやイベントも提供し

ています。

MapInfoApplication メンバ メソッド

DoMapBasic ウィンドウで入力した場合と同様に MapBasic 文を実行します。

EvalMapBasic 式を評価し、結果を文字列として返します。

プロパティ

FullNameアプリケーション実行可能ファイルへの完全パスを取得します。

LastErrorCodeDo メソッドまたは Eval メソッドの呼び出しで発生した 後の MapBasic エラーを表す整

数を取得します。

LastErrorMessageLastErrorCode に関連付けられたエラー メッセージを取得します。

Nameアプリケーション名を取得します。

Versionバージョン番号を 100 倍した値であるバージョン番号文字列を取得します。

MapBasic 11.0 271 ユーザーズ ガイド

Page 272: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 12 章: .Net の操作

.Net での統合マッピング

イベント

MenuItemClickCalling OLE "MenuItemHandler" という構文でユーザがカスタム メニュー項目を選択した場

合に発生します。

StatusBarTextChangedMapInfo 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 ユーザーズ ガイド

Page 273: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 文にも表示されます (CreateMenu 文または Alter Menu...Add 文)。

サンプル アプリケーションでは、このようなコールバックは IMapInfoCallback インターフェイスで

表されます。C# バージョンのインターフェイス (MapInfoCallback.cs) は、次のようになります。

public interface IMapInfoCallback{

// Method called by MapInfo Professional when window changesint WindowContentsChanged(UInt32 windowID);

// Method called by MapInfo Professional when the status bar text changes

int SetStatusText(string message);

MapBasic 11.0 273 ユーザーズ ガイド

Page 274: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 changesFunction 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 ユーザーズ ガイド

Page 275: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 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 ユーザーズ ガイド

Page 276: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 12 章: .Net の操作

.Net での統合マッピング

private void Form1_FormClosed(object sender, FormClosedEventArgs e){

// Unregister the callback objectMapInfoApp.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 ユーザーズ ガイド

Page 277: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

第 12 章: .Net の操作

.Net での統合マッピング

InvokeRequired プロパティおよび Invoke メソッドにアクセスするために、_callbackClient オブ

ジェクト (ICallbackNotify を実装するオブジェクト) を使用していることに注意してください。サ

ンプル アプリケーションでは、Form クラスが ICallbackNotify オブジェクトの役割を果たします。

public partial class MapForm : Form, ICallbackNotify

サンプル アプリケーションでは、_callbackClient メンバは MapForm への参照です。Form クラス

は Control から派生しているため、_callbackClient.Invoke を呼び出すことができます。

不適切なスレッドから呼び出される可能性があるので、デストラクタ メソッドでコールバッ

ク登録解除の操作を行わないでください。

MapBasic 11.0 277 ユーザーズ ガイド

Page 278: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

A

サンプル プログラム

MapBasic ソフトウェアには、次のサンプル プログラム ファイルが含まれて

います。

このマニュアルの作成時以降に新しいサンプルが追加されている

可能性もあります。

この付録の構成

Samples\Delphi ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . .279Samples\DLLEXAMP ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . .279Samples\DotNet ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . .279Samples\MapBasic ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . .279Samples\MFC ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .286Samples\PwrBldr ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . .286Samples\VB4 ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .286Samples\VB6 ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .286

Page 279: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 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 ユーザーズ ガイド

Page 280: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 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 ユーザーズ ガイド

Page 281: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 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 ユーザーズ ガイド

Page 282: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 A: サンプル プログラム

Samples\MapBasic ディレクトリ

Samples\MapBasic\GridMakr ディレクトリ

GridMakr.mb : 経線/緯線のグリッド (経緯線網) を作成します。

Samples\MapBasic\HTMLImageMap ディレクトリ

HTMLImageMap.mb : Web ブラウザで使用するクリック可能 HTML イメージ マップを MapInfoProfessional マップ ウィンドウから作成します。

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 ユーザーズ ガイド

Page 283: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 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 ユーザーズ ガイド

Page 284: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 A: サンプル プログラム

Samples\MapBasic ディレクトリ

Samples\MapBasic\Send2mxm ディレクトリ

send2mxm.mb : カスタムな MapX Geoset とその .tab ファイルを作成して、モバイル デバイスに

表示するマップ ウィンドウの背景データのユーザ定義サブセットを作成できます。

Samples\MapBasic\Shields ディレクトリ

Shields.mb : テキスト オブジェクトの周囲に装飾的な枠を描画します。このアプリケーションは、

マップ ラベルではなく、テキスト オブジェクトに対してのみ機能することに注意してください。

Samples\MapBasic\Snippets ディレクトリ

MapInfo カスタム アプリケーションに統合できるサンプル プログラムやコード スニペットが含ま

れます。

このディレクトリには、サンプル コード スニペットだけでなく、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 ユーザーズ ガイド

Page 285: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 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 シンボルの作成、編集、削除を行えます。このエディタを使用して、MapInfo3.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 ユーザーズ ガイド

Page 286: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 A: サンプル プログラム

Samples\MFC ディレクトリ

Samples\MFC ディレクトリ

FindZip : 統合マッピングを使用して MapInfo Professional の要素を Microsoft Foundation Class(MFC) で作成された C++ プログラムに統合する例を示します。

mdimfc : C++ を使用した統合マッピング アプリケーション。

Samples\PwrBldr ディレクトリ

Capitals : PowerBuilder を使用した統合マッピング アプリケーション。

PowerBuilder ランタイム ライブラリは付属しません。このアプリケーションを実行するに

は、PowerBuilder ライブラリがインストールされている必要があります。

Samples\VB4 ディレクトリ

Callback : OLE オートメーション コールバック。

FindZip : 統合マッピングを使用してマップ ウィンドウなどの MapInfo Professional 要素を VisualBasic プログラムに統合する例を示します。Visual Basic 3.0 以降が必要です。

VMapTool : コールバックなどの高度な統合マッピング操作の例を示します。Visual Basic 4.0Professional Edition 以降が必要です。

Samples\VB6 ディレクトリ

Callback : OLE オートメーション コールバック。

FindZip : 統合マッピングを使用してマップ ウィンドウなどの MapInfo Professional 要素を VisualBasic プログラムに統合する例を示します。Visual Basic 3.0 以降が必要です。

VMapTool : コールバックなどの高度な統合マッピング操作の例を示します。Visual Basic 4.0Professional Edition 以降が必要です。

MapBasic 11.0 286 ユーザーズ ガイド

Page 287: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

B

演算子の要約

演算子は特定の値からある結果を得るために使用します。演算子は、使用する

データのタイプおよび生じる結果のタイプによって分類することができます。

この付録の構成

数値演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .288比較演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .288論理演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .289地理演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .289タイプの自動変換. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .291

Page 288: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 B: 演算子の要約

数値演算子

数値演算子

以下の数値演算子は 2 つの数値を受け取り、数値の結果を返します。

これらの演算子のうち次の 2 つは別の用途でも用います。プラス記号を 2 つの文字列に使用すると

文字列が連結され、1 つの新しい文字列が生成されます。単一の数値にマイナス記号 (-) をつけると

否定演算子となり、数値の結果が生成されます。アンパサンド記号も文字列の連結を行います。

比較演算子

比較演算子は、同じ一般タイプの 2 つの値を比較し、TRUE または FALSE の論理値を返します。

数値データと非数値データ (例 : 文字列式など) を直接比較することはできませんが、整数、2 バイ

ト整数、浮動小数などのデータ型は比較することができます。比較演算子は条件式でしばしば使

用されます (例 : If...Then)。

演算子 処理 例

+ 加算 a + b

– 減算 a - b

* 乗算 a * b

/ 除算 a / b

\ 整数除算 (余りをカット) a \ b

Mod 整数除算の余り a Mod b

^ 累乗 a ^ b

演算子 処理 例

– 負の数 - a

+ 文字列結合 a + b

& 文字列結合 a & b

演算子 TRUE が返される条件 例

= a と b が等しい a = b

<> a と b が等しくない a <> b

MapBasic 11.0 288 ユーザーズ ガイド

Page 289: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 B: 演算子の要約

論理演算子

論理演算子

"論理演算子" は、TRUE または FALSE の論理結果を生成します。

地理演算子

地理演算子はオブジェクトに対して使用され、TRUE または FALSE の論理結果を生成します。

< a が b より小さい a < b

> a が b より大きい a > b

<= a が b より小さいか等しい a <= b

>= a が b より大きいか等しい a >= b

演算子 TRUE が返される条件 例

演算子 TRUE が返される条件 例

And 両方のオペランドが TRUE である a And b

Or どちらかのオペランドが TRUEである

a Or b

Not オペランドが FALSE である Not a

演算子 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 ユーザーズ ガイド

Page 290: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 B: 演算子の要約

地理演算子

優先順位

かっこは式内に別の式を含むときに使用する特別な演算子です。かっこを使用することにより、

計算式の優先順位を変更することができます。次の表は MapBasic で使用する演算子の優先順位を

示します。同じ行の演算子は同等の優先順位を意味します。優先順位の高い順に計算されます。

同じ優先順位の演算子の場合は左から順に計算されます (ただし、累乗は例外で右から左に計算さ

れます)。

たとえば、3 + 4 * 2 という式の結果は 11 となります (加算より先に乗算が行われます)。式が (3 +4) * 2 なら、結果は 14 になります (括弧があるので加算が先に行われます)。優先順位について不

確かな場合はかっこを使用してください。

Entirely Within 第 1 オブジェクト全体が第 2 オブジェクト

の中にある

objectA Entirely Within objectB

Intersects 2 つのオブジェクトがある点で交差する objectA Intersects objectB

演算子 TRUE が返される条件 例

優先順位 MapBasic 演算子

( も高い優先順位) かっこ

累乗

乗算、除算、Mod、整数除算

加算、減算

地理演算子

比較演算子、Like 演算子

Not

And

( も低い優先順位) Or

MapBasic 11.0 290 ユーザーズ ガイド

Page 291: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 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 ユーザーズ ガイド

Page 292: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

C

サポートされている 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

Page 293: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

D

リモートテーブルをマップ作成可能にする

この付録の構成

空間データの格納および取得の必要条件. . . . . . . . . . . . . . . . . . . . .294

Page 294: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 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 ユーザーズ ガイド

Page 295: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

E

MapInfo_MapCatalog の手動での作成

ここには、MapInfo マップ カタログを手動で作成する方法と、リモート テーブ

ルをマップ作成可能にする方法という、リモート テーブルのジオコード化に必

要な 2 つの処理の手順が記載されています。この情報は、MapInfo Professionalにアクセスできないユーザを対象としたものです。

MapInfo Professional ユーザは、MapInfo マップ カタログを自動的に作成する

ことができます。

• リモートテーブルをマップ作成可能にする

ユーザまたはユーザのデータベース管理者は、MapBasicでアクセスする各

データベースに対し、1 つの MapInfo マップ カタログを作成する必要があり

ます。

Page 296: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 E: MapInfo_MapCatalog の手動での作成

MAPINFO_MAPCATALOG を手動で作成するには:

1. RDBMS に所有者とユーザが必要な場合は、マップ作成可能なテーブルが格納されている特定

のデータベースに、MAPINFO という名前のユーザを作成し、パスワードを MAPINFO に設定

します。

2. このデータベースに、MAPINFO_MAPCATALOG というテーブルを作成します。

Create Table 文は、次の SQL Create Table 文と同じである必要があります。

テーブルの定義は、この文とまったく同じでなければなりません。唯一の例外は、varcharデータ型または text データ型をサポートするデータベースの場合で、Char データ型の代わり

にこれらのデータ型を使用することが可能です。

3. TABLENAME と OWNERNAME に対して一意のインデックスを作成します。これにより、1 人の所有者につき 1 つのテーブルだけがマップ作成可能になります。

4. MAPINFO_MAPCATALOG のすべてのユーザに選択権限を付与します。この設定により、ユー

ザはテーブルをマップ作成可能にすることができます。更新、挿入、および削除の各権限は、

データベース管理者の判断に基づいて付与する必要があります。

Create Table MAPINFO_MAPCATALOG(

SPATIALTYPETABLENAMEOWNERNAMESPATIALCOLUMNDB_X_LLDB_Y_LLDB_X_URDB_Y_URVIEW_X_LLVIEW_Y_LLVIEW_X_URVIEW_Y_URCOORDINATESYSTEMSYMBOLXCOLUMNNAMEYCOLUMNNAMERENDITIONTYPERENDITIONCOLUMNRENDITIONTABLENUMBER_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

)

MapBasic 11.0 296 ユーザーズ ガイド

Page 297: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 E: MapInfo_MapCatalog の手動での作成

空間インデックスの種類

サポートされている空間インデックスの種類を以下の表に示します。

手動でリモート テーブルをマップ作成可能にする

MapBasic でアクセスするリモート データベース内の各空間テーブルについて、

MAPINFO_MAPCATALOG テーブルに行を追加する必要があります。これを行うには、MapInfoProfessional 上で [テーブル] > [テーブル管理] > [ODBC テーブルをマップ作成可能にする] を選択

します。

MapInfo Professional を使用してマップ カタログを管理していない場合は、データベースの中のジ

オコード化する各空間テーブルについて、手動で 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

フィールド名 割り当てる値 例

SPATIALTYPE X,Y の空間インデックス テーブルの場合、4.0

(その他の空間サーバのサポートは開発中)

4.0

TABLENAME テーブルの名前。 Drainage

OWNERNAME 所有者名。 Georgetown

MapBasic 11.0 297 ユーザーズ ガイド

Page 298: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 E: MapInfo_MapCatalog の手動での作成

SPATIALCOLUMN 空間機能を含む列の名前。名前は次のように

します。

• NO_COLUMN(X,Y を使用するマップ作成可

能なテーブルの場合)

NO_COLUMN

DB_X_LL レイヤの外接長方形の左下角の X 座標を、

MapInfo Professional に定義された COORDINATESYSTEM で示される単位で指

定します。

-360

DB_Y_LL 左下の境界の Y 値。 -90

DB_X_UR 右上の境界の X 値。 360

DB_Y_UR 右上の境界の Y 値。 90

VIEW_X_LL ビューの外接長方形の左下角の X 座標を、

MapInfo Professional に定義された COORDINATESYSTEM で示される単位で指

定します。

-360

VIEW_Y_LL 左下の境界の Y 値。 -90

VIEW_X_UR 右上の境界の X 値。 360

VIEW_Y_UR 右上の境界の Y 値。 90

COORDINATESYSTEM MapInfo でサポートされる座標系を表す文字

列であり、マップ投影法、座標単位などを指

定します。値は次のいずれかになります。

• Earth Projection 1,0 (NAD27 の場合)

• Earth Projection 1,62 (NAD27 の

場合)

• Earth Projection 1,33 (NAD 83 の

場合)

• Earth Projection 1,74 (NAD 83 の

場合)

Earth Projection 1,0

SYMBOL MapInfo Symbol 句 (ポイントを含むレイヤの

場合)Symbol (35,0,12)

XCOLUMNNAME X 座標を含む列の名前を指定します。 NO_COLUMN

YCOLUMNNAME Y 座標を含む列の名前を指定します。 NO_COLUMN

フィールド名 割り当てる値 例

MapBasic 11.0 298 ユーザーズ ガイド

Page 299: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 E: MapInfo_MapCatalog の手動での作成

RENDITIONTYPE オンの場合は 1、オフの場合は 0 を指定し

ます。

1

RENDITIONCOLUMN rendition フィールドの名前を指定します。 MI_SYMBOLOGY

RENDITIONTABLE rendition テーブルの名前を指定します。

このフィールドは使用されません。

空のまま

NUMBER_ROWS テーブルの行数を指定します。 11

フィールド名 割り当てる値 例

MapBasic 11.0 299 ユーザーズ ガイド

Page 300: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

F

データの設定と管理

この付録の構成

6.5 より前のバージョンからのアプリケーションのアップグレード. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .301アプリケーション データ ファイルとディレクトリ . . . . . . . . . . . .304デフォルトの環境設定パス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .306レジストリの変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .307インストーラの必要条件とグループの方針 . . . . . . . . . . . . . . . . . .307

Page 301: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 F: データの設定と管理

6.5 より前のバージョンからのアプリケーションのアップグレード

6.5 より前のバージョンからのアプリケーションのアップグレード

Application Data (appdata) ファイルは、MapInfo Professional が実行中に使用する、非実行型で特

定ユーザに所有されないデータ ファイルです。以下のファイルやディレクトリは、バージョン 6.5以降の appdata と見なされます。

従来、これらのファイルは Windows ディレクトリまたは Program ディレクトリに格納されていま

した。Mapinfo Professional バージョン 6.5 以降の方針により、アプリケーション データ ファイル

はユーザ別の位置に格納され、他の領域にあるそれらのファイルを検索でき、さらに MapInfo の他のバージョンや製品との間でアプリケーション データ ファイルを共有することができるように

なりました。mapinfow.prj を移動させることで、ユーザは Mapinfo Professional の異なるバージョ

ン間で 1 つのカスタム投影法ファイルを共有できます。

以下のファイルは Program ディレクトリに残ります。

重要事項 :• インストーラは、ユーザに対して、アプリケーション データ ファイルの格納場所の指定を求

めません。

• Mapinfo Professional のインストールの有無に関わらず、インストーラは常に同じように動作

します。

ファイル名 説明

mapinfow.prf 環境設定ファイル

mapinfow.wor デフォルトのワークスペース

startup.wor Startup ワークスペース

mapinfow.clr 色ファイル

mapinfow.pen ペン ファイル

mapinfow.fnt シンボル ファイル

custsymb カスタム シンボル ディレクトリ

thmtmplt 主題図テンプレート ディレクトリ

graphsupport グラフ サポート ディレクトリ

ファイル名 説明

mapinfow.abb 略語ファイル

mapinfow.prj 投影法ファイル

mapinfow.mnu メニュー ファイル

MapBasic 11.0 301 ユーザーズ ガイド

Page 302: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 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_dirMapinfo 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 ユーザーズ ガイド

Page 303: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 F: データの設定と管理

6.5 より前のバージョンからのアプリケーションのアップグレード

• Versions 6.5 以降 : user profile root\Application Data\MapInfo\MapInfo\Professional\nnn。ここで、nnn は MapInfo Professional のバージョン番号を表す 3 桁の数値です (たとえば 850など)。

起動時にこのディレクトリが存在しない場合でも、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など)。

起動時にこのディレクトリが存在しない場合でも、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 ユーザーズ ガイド

Page 304: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 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 ユーザーズ ガイド

Page 305: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 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 の中にないものと見なされ、グラフを作成

しようとするとエラーメッセージが表示されます。

バージョン 7.0 以降では、search_for_file ルーチンに common_appdata_dir が含まれ

ます。

MapBasic 11.0 305 ユーザーズ ガイド

Page 306: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 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 が存在する

場合はこれを使用し、存在しな

い場合は program_dir\thmtmpltを使用します

まず search_for_file を使用

し、それが失敗した場合は

program_dir を使用します

保存されたクエリ mydocs_dir mydocs_dir

新規グリッド mydocs_dir mydocs_dir

Crystal Report ファイル mydocs_dir mydocs_dir

グラフ サポート ファイル local_appdata_dir が存在する場

合はこれを使用し、存在しない

場合は program_dir を使用します

まず search_for_file を使用

し、それが失敗した場合は

program_dir を使用します

テーブルの検索ディレクトリ mydocs_dir mydocs_dir

MapBasic 11.0 306 ユーザーズ ガイド

Page 307: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 F: データの設定と管理

レジストリの変更

レジストリの変更

MapInfo Professional によるレジストリの使用法は、各ユーザが固有のデータを使用して作業でき

るように構成される必要があります。この構成をサポートするため、以下の変更が加えられてい

ます。

• ツール マネージャのエントリが HKEY_CURRENT_USER 下にインストールされるようになり

ました。

• グラフ エンジンでは、カスタム色と数字の書式が HKEY_CURRENT_USER 下に格納されるよ

うになりました。

インストーラの必要条件とグループの方針

MapBasic v.6.5 および 6.0MapBasic バージョン 6.5 および 6.0 のアプリケーション データ ファイルは、以下の表で指定され

たディレクトリにインストールする必要があります。

ファイル名 バージョン 6.5 または 6.0 ワークステーション*

* nnn は MapInfo Professional のバージョン番号を表す 3 桁の数値です (たとえば 850 など)。

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 307 ユーザーズ ガイド

Page 308: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 F: データの設定と管理

インストーラの必要条件とグループの方針

MapBasic v.7.0 以降

MapBasic v.7.0 以降のアプリケーション データ ファイルは、以下の表で指定されたディレクトリ

にインストールする必要があります。

バージョン 9.5 では、MapInfo Professional への Workgroup インストールが導入されました。

これにより、システム管理者はユーザがアプリケーション データ ファイルにアクセスするた

めの共有場所を設定できるようになります。この変更は、これらのファイルのデフォルト

ディレクトリ設定に影響を与える場合があります。

次の MapBasic 関数はファイルの場所を調べるために役立ちます。

• GetFolderPath$( ) 関数 - 特別な MapInfo Professional ディレクトリまたは Windows ディレク

トリのパスを返します。

• LocateFile$( ) 関数 - MapInfo Professional のアプリケーション データ ファイルのパスを返し

ます。

ファイル名 バージョン 7.0 以降のワークステーション*

* nnn は MapInfo Professional のバージョン番号を表す 3 桁の数値です (たとえば 850 など)。

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

MapBasic 11.0 308 ユーザーズ ガイド

Page 309: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

G

MapBasic 用語集

目的の用語がこの用語集にない場合は、MapInfo Professional DVD に収録されて

いる『MapInfo Professional ユーザーズ ガイド』の用語集を参照してください。

Page 310: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 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 ユーザ インターフェイスのウィンドウ。MapInfoProfessional の [オプション] メニューから [MapBasic ウィンドウを表

示] を選ぶと表示されます。MapBasic ウィンドウに MapBasic 文を入

力すると、プログラムをコンパイルする必要はありません。

アニメーション レイヤ マップに追加される特殊な "移動表示" レイヤで、そのレイヤ上のオブ

ジェクトだけを再描画することが可能になります。アニメーション レイヤ上でオブジェクトを変更しても、他のレイヤの再描画は行われま

せん。

アプリケーション デー

タ ファイル

マップの基本的な設定とカスタマイズに影響を与える、構成、テンプ

レート、およびカスタム シンボル ファイルならびにディレクトリの

セットです。これらのファイルはローカルに格納されていますが、

ユーザはファイルをリモートで共有してマップの外観の整合性を維持

することができます。

緯度 赤道に対する南北位置を示す度数を単位とする座標タイプ。赤道の南

にある位置は、負の緯度を持ちます。

MapBasic 11.0 310 ユーザーズ ガイド

Page 311: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 G: MapBasic 用語集

用語

円グラフ 互いの相対関係をパーセント値で表す、いくつかのセクターに分割さ

れた円。MapInfo Professional では、円グラフをグラフ ウィンドウまた

は主題図の中に表示できます。

演算子 1 つ以上の定数、変数、その他の値に作用する特殊なキャラクタまた

は単語。たとえば、マイナス演算子 (-) はある数字を別の数字から減じ

ます。

オートメーション、

OLE オートメーション OLE オートメーションは、ある Windows アプリケーションによって別

の Windows アプリケーションの操作を可能にするテクノロジです。たと

えば、Visual Basic アプリケーションは、MapInfo Professional のオート

メーション メソッドおよびプロパティを使用して MapInfo Professionalを操作することができます。統合マッピングを参照してください。

オブジェクト 図形オブジェクトは、マップ ウィンドウまたはレイアウト ウィンドウ

上に表示されるエンティティ (ライン、点、円など) です。MapBasic のオブジェクト変数は、図形オブジェクトを含むことができる変数で

す。オブジェクト フィールドの名前は、テーブルに格納された一組の

オブジェクトを示します。OLEオブジェクトは、Windows特有のエン

ティティ (たとえば、ドラッグアンドドロップ操作を通じて作成され

たエンティティ) を意味します。

オブジェクトのリンク

および埋め込み (OLE)あるアプリケーションで作成されたオブジェクトを別のアプリケー

ションで使用できるようにする技術。この場合のオブジェクトは、

マップ、グラフ、スプレッドシート、音声、テキストなどのあらゆる

情報を指します。埋め込みとは、サーバーのオブジェクトをコンテナ

アプリケーションに挿入するプロセスのことです。

カーソル、マウス カー

ソル、行カーソル マウス カーソルは、ユーザがマウスを動かすにつれて移動する小さな

イメージです。行カーソルは、テーブルの現在行を示す値です。行

カーソルの位置決めには、Fetch 文を使います。

キーワード プログラミング言語の一部として認識される単語。たとえば、文また

は関数名など。MapBasic言語では、キーワードは太字で表されます。

行 "レコード" の別名。

クライアント 別のプログラムの情報を使用するか、別のプログラムから情報を受け

取るアプリケーション。データベース接続または DDE 接続でよく使わ

れます。

グローバル変数 プログラムの冒頭で定義され、あらゆるプロシージャまたは関数で使

うことができる変数。Global 文により作成されます。

経度 子午線に対する東西位置を示す度数を単位とする座標タイプ。子午線

の西にある場所は、負の経度を持ちます。

用語 定義

MapBasic 11.0 311 ユーザーズ ガイド

Page 312: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 G: MapBasic 用語集

用語

コメント プログラムに含まれるプログラマの記述。この記述は、プログラムの

コンパイルに必要な構文中では何の役割も持ちません。MapBasic 言語

では、コメントはアポストロフィ (一重引用符) で開始されます。文内

にアポストロフィが現われると、そのラインの残りの部分が無視され

ます (ただし、アポストロフィがリテラル文字列式の中に現われる場合

は例外です)。

コントロール ボタンやチェック ボックスなどのダイアログ ボックスの構成要素。

コンパイラ プログラムのテキストを読み、構文エラーをチェックし、コードを実

行可能な形式に変換するプログラム。

サーバ 別のアプリケーション (クライアント) の代わりに操作を行ったり、別

のアプリケーション (クライアント) にデータを送ったりするアプリ

ケーション。データベース接続または DDE 接続でよく使われます。

再帰 関数またはプロシージャが自分自身を呼び出すような状況。再帰が必

要な場合もありますが、プログラマは再帰を誤って発生させないよう

に注意する必要があります。特に、SelChangedHandler などの特殊イ

ベント ハンドラを使用する場合は注意してください。

サブルーチン 一組の文。MapBasic の構文では、サブルーチンはプロシージャまたは

サブ プロシージャと呼ばれます。

参照による、値による 関数またはプロシージャにパラメータを渡す 2 つの異なる方法。引数を

参照により渡す (デフォルト) 場合は、関数の呼び出し時に変数名を指定

しなければなりません。呼び出された関数は、指定した変数を変更する

ことができます。引数を値により渡す (ByVal キーワードを使う) 場合

は、変数名を指定する必要はありません。

座標系 オブジェクトの位置座標をどのように解釈するかを指定する 1 組のパラ

メータ。座標系には、地球座標系 (例 : 経/緯度座標)、一般座標系 (例 :フィートによる座標) があります。地球座標系マップは、地球上の位置

を示します。

シームレス テーブル 複数のテーブルをまとめたテーブル。複数のテーブルを同時に開いた

り、複数のテーブルのマップ作成を同時に行ったりする場合に便利で

す。テーブル操作を参照してください。

システム レイヤ どのマップ ウィンドウ上にも存在する一時レイヤ。このレイヤは、レ

イヤ管理において常に 上位にあります。MapInfo Professional の [検索] コマンドは、見つかった位置を示すシンボルをシステムレイヤに追

加します。

用語 定義

MapBasic 11.0 312 ユーザーズ ガイド

Page 313: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 G: MapBasic 用語集

用語

集合関数 Sum( ) や Count( ) のような、テーブルの行 (レコード) のグループに関

する要約情報を計算する関数。『MapBasic リファレンス ガイド』ま

たはオンライン ヘルプの Select の項を参照してください。

使用可能 使用不可能の反意語です。メニュー コマンド、ダイアログ ボックス コントロール、またはツールバー ボタンが使用できる状態を指します。

使用不可能 ユーザがユーザ インターフェイスの一部 (メニュー コマンド、ダイア

ログ ボックス コントロール、またはツールバー ボタン) を使えない状

態。使用不可能な項目は、使用できないことを示すために一般に "グレー表示" となります。「使用可能」も参照してください。

ショートカット メニュー

ユーザがマウスの右ボタンをクリックすると表示されるメニュー。

進捗バー 完了率を示す水平バーを表示する標準ダイアログ ボックス。

実行時 プログラムが実行されている時間。実行時エラーは、アプリケーション

(MBX ファイル) が実行されているときに発生するエラーのことです。

条件式 1 つ以上の変数、定数値、関数呼び出し、テーブル参照、および演算子

の集まり。

ステータス バー MapInfo Professional プログラム ウィンドウの下に表示され、ヘルプ

メッセージや編集可能レイヤの名前などが表示されるバー。

ソース コード プログラムの未コンパイル テキスト。MapBasic では .mb ファイルを

指します。

ステータス バー ヘルプ

ユーザがメニュー コマンドを強調表示させるか、マウス カーソルを

ツールバー ボタンに重ねたとき、ステータス バーに表示されるヘルプ

メッセージ。

ダイナミック データ交

換 (DDE)異なるアプリケーション間における命令およびデータの交換を可能に

する Microsoft Windows 専用プロトコル。適切に交換を行うには、両方

のアプリケーションが DDE に準拠している必要があります。

ダイナミック リンク

ライブラリ (DLL)共有実行可能ルーチンおよびその他のリソースを含む Microsoft Windowsファイル。DLL は、一般にプログラムがある操作を処理するために呼び

出すもので、多くの場合は元のプログラムに値を戻します。

地球投影位置決定シス

テム (GPS)衛星信号を受け取り、その信号を基に受信者の地球上の位置を決定す

るハードウェア/ソフトウェア システム。

用語 定義

MapBasic 11.0 313 ユーザーズ ガイド

Page 314: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 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 ユーザーズ ガイド

Page 315: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 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 ユーザーズ ガイド

Page 316: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 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 ユーザーズ ガイド

Page 317: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 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 ユーザーズ ガイド

Page 318: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

付録 G: MapBasic 用語集

用語

ルーチン 指定の操作を実行する一群の文。たとえば、OnError 文を使うと、エ

ラー処理ルーチンとして機能する一連の文を指定することができます。

ループ 一群の文を繰り返し実行するプログラム操作構造。ループのコード化を

誤ると、無限ループ (ループが永遠に継続するような状態) が生じます。

レコード テーブルまたはデータベースのエントリ。各レコードは、ブラウザ

ウィンドウでは行として表示されます。

ローカル変数 特定の関数またはプロシージャの中で定義/使用される変数。ローカ

ル変数は、同名のグローバル変数よりも優先されます。ローカル変数

の作成には、Dim 文を使います。

用語 定義

MapBasic 11.0 318 ユーザーズ ガイド

Page 319: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

索引

< (~ より小さい) 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

数字

1000 桁セパレータ、数値定数 5216 進数 310

&H 構文 52

AAdd Column 文 193Add Map Layer 文 107Alter ButtonPad 文 114, 201Alter Button 文 114Alter Control 文 102

Alter Menu Bar 文 86Alter Menu Item 文 87Alter Menu 文 85Alter Object 文 176, 180Alter Table 文 135And 演算子 58Any( ) 演算子 192Area( ) 関数 191Area( ) 関数 168Ask( ) 関数 95AutoLabel 文 175auto_lib.mb (サンプル プログラム) 124

BBetween 演算子 57BIL (SPOT イメージ) ファイル 145BrushPicker コントロール 99

CCancelButton コントロール 100CheckBox コントロール 100Close Window 文 106, 208CommandInfo( ) 関数

DDE 207検索結果の判別 133選択されたメニュー項目の ID 90ボタンパッド 114ユーザがダイアログ ボックス内で OK をク

リックしたかどうかを検出 96リスト内のダブルクリックの検出 102

Commit Table 文 107Commit 文 111, 134Contains 演算子 59, 190Continue 文 77Create ButtonPad 文 114, 116, 201CreateCircle( ) 関数 176Create Frame 文 110, 175Create Index 文 134Create Map 文 134, 166Create Menu Bar 文 89Create Menu 文 86Create Table 文 296

MapBasic 11.0 319 ユーザーズ ガイド

Page 320: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

Create Text 文 110, 169Crystal Report writer 128CurDate( ) 関数 52, 56C 言語サンプル プログラム 257

DDBF (dBASE) ファイル 128DBMS テーブル

mapinfo_mapcatalog 296DDE

クライアントとして動作 203, 207サーバとして動作 207

Declare Function 文 72, 195Declare Sub 文 64, 195Define 文 73Delphi サンプル プログラム 257Dim 文 45DLL

カーネル ライブラリ 198検索パス 195宣言 195定義 195パラメータの受け渡し 196ボタンパッド アイコンの格納 201文字列パラメータ 197ユーザ ライブラリ 196

DLL の検索パス 195Do Case 文 61Do...Loop 文 63Drop Map 文 166

EEditText コントロール 99EndHandler プロシージャ 68End Program 文 64EOF( ) 関数 (ファイルの終わり) 161EOT( ) 関数 (テーブルの終わり) 129Err( ) 関数 79Error$( ) 関数 79ERRORS.DOC 221Excel ファイル 128

FFetch 文 129, 180FileExists( ) 関数 160FileOpenDlg( ) 関数 95FileSaveAsDlg( ) 関数 95FontPicker コントロール 99ForegroundTaskSwitchHandler プロシージャ 68Format$( ) 関数 109For...Next 文 62FoxBase ファイル 128

FrontWindow( ) 関数 106Function...End Function 文 72

GGetMetaData$( ) 関数 148GetSeamlessSheet( ) 関数 151Get 文 (ファイル入出力) 162GIF ファイル 145GoTo 文 62GPS 313GPS アプリケーション 108GroupBox コントロール 99

IIf...Then 文 60Include 文 73Input # 文 161Insert 文 110, 134, 177IntersectNodes( ) 関数 182Intersects 演算子 59, 190

JJPG ファイル 145

KKill 文 160

LLabelFindByID( ) 関数 183LabelFindFirst( ) 関数 183LabelFindNext( ) 関数 183Labelinfo( ) 関数 183Like 演算子 56Line Input # 文 161ListBox コントロール 99, 103Lotus ファイル 128

MMain プロシージャ 64MakePen( ) 関数 172Map!nfo_Mapcatalog

作成 296MapBasic ウィンドウ 45MapBasic からのメソッドの宣言 261MapBasic からのメソッドの呼び出し 261MapBasic の概要 20MapInfo-L アーカイブ 19MapInfo Professional

テクニカル サポート 18MAPINFOW.MNU ファイル 92MapInfo マニュアル セット 16

MapBasic 11.0 320 ユーザーズ ガイド

Page 321: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

MapInfo メニュー ファイル 92MapInfo ランタイム

OLE を通じた起動 214MapMarker 製品 133MBX ファイル

定義 310MFC

基本操作 249サンプル プログラム 257

Microsoft ExcelDDE 会話 203ワークシート ファイル 128

Mod 演算子 288Mod (整数演算) 55MultiListBox コントロール 100, 103

N.Net プログラム

.Net への引数の受け渡し 263MapBasic からのメソッドの宣言と呼び出し

261.Net へのカスタム変数タイプの受け渡し 264.Net への定義の受け渡しの制限事項 268アセンブリ ファイルの作成とコピー 261概要 259クラスの作成 260はじめに 259パフォーマンス上の注意事項 264別名によるメソッドの呼び出し 263用語 259例外処理 268

.Net への定義の受け渡し、制限事項 268NoSelect キーワード 71Note 文 94Not 演算子 58NumberToDate( ) 関数 53

OObjectGeography( ) 関数 168ObjectInfo( ) 関数 167, 173ObjectLen( ) 関数 168, 191ODBC 接続、サポートされているデータ型 292OKButton コントロール 100OLE 埋め込み 213OLE オートメーション 232

定義 311OnError 文 79Open File 文 159Open Window 文 106, 208Or 演算子 58

PPack Table 文 132PCX ファイル 145PenPicker コントロール 99Perimeter( ) 関数 168PopupMenu コントロール 100, 103PowerBuilder、サンプル プログラム 257Print # 文 161Print 文 111ProgressBar 文 96Put 文 (ファイル入出力) 162

QQueryN テーブル

閉じる 137開く 137

RRadioGroup コントロール 99RDBMS テーブル上でのポイントの格納 294ReadControlValue( ) 関数 101, 103ReDim 文 47RemoteMsgHandler プロシージャ、DDE 207RemoteQueryHandler( ) 関数 206Remove Map Layer 文 107Rename File 文 160Report writer 128Resume 文 79RGB 色値 173Rollback 文 134RowID 132RTrim$( ) 関数 58Run Application 文 123Run Menu Command 文 91, 111

SSave File 文 160Seagate Crystal Report writer 128SearchInfo( ) 関数 119SelChangedHandler プロシージャ 68, 119Select Case (Do Case) 61SelectionInfo( ) 関数 137Select 文 166–167, 174, 189–191Set CoordSys 文 140, 186Set Event Processing 文 109Set File Timeout 文 142Set Format 文 53Set Map 文 107, 109, 175Set Redistricter 文 111Set Shade 文 107Set Table 文 151

MapBasic 11.0 321 ユーザーズ ガイド

Page 322: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

Set Target 文 181Set Window 文 106, 208Shade 文 107SPOT イメージ ファイル 145SQL Select 検索 134Startup ワークスペース 123StaticText コントロール 98Stop 文 77StringCompare( ) 関数 57StyleAttr( ) 関数 169, 173SymbolPicker コントロール 99

TTableInfo( ) 関数 132, 151, 166Targa ファイル 145TempFileName$( ) 関数 160TIFF ファイル 145ToolHandler プロシージャ 68, 115TriggerControl( ) 関数 102Type...End Type 文 48

UUBound( ) 関数 47Update 文 134, 176–177, 180

VVisual Basic サンプル プログラム 213, 257Visual C++

基本操作 249サンプル プログラム 257

WWhile...Wend 文 63WinChangedHandler プロシージャ 68WinClosedHandler プロシージャ 68WindowID( ) 関数 106WindowInfo( ) 関数 106, 140WinFocusChangedHandler プロシージャ 68WIN.INI ファイル、設定の検索 198Within 演算子 59, 190WKS ファイル、開く 128Write # 文 161

XXLS ファイル、開く 128

アクセラレータ キーダイアログ ボックス内 104統合マッピング 223メニュー内 91

アセンブリ ファイル、作成とコピー 261アドバイス ループ

DDE サーバとしての MapInfo 208アニメーション レイヤ 108

意志決定Do Case 文 61If…Then 文 60

緯度 310イベント、処理

選択の変更 119定義 68特殊なプロシージャ 68ユーザ インターフェイス イベント 82

イベントへの応答、イベントを参照、処理イメージ (ラスタ) 145色値

RGB( ) 関数 173オブジェクトを色で選択 173

インストール手順 14インデックス、作成 134, 136

ウィンドウ、カスタマイズグラフ 110サイズと位置 106情報ウィンドウ 111ブラウザ 109マップ 107メッセージ 111領域編成 111レイアウト 110

ウィンドウ識別子 106ウィンドウの制限超過によるビープ 30ウィンドウ メニュー 41ウォーム リンク 208埋め込み 213

エラーコンパイル時 31実行時 77, 134トラップ 79

円、オブジェクトを参照 13円グラフ

グラフ ウィンドウ 110主題図 107

演算子数値 55地理 59, 189定義 51

MapBasic 11.0 322 ユーザーズ ガイド

Page 323: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

比較 56日付 56文字列 56優先順位 59論理 58

演算子の優先順位 59, 290

オートメーション 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 オブジェクトあたりのノード 1761 行あたりのオブジェクト 167

1 領域あたりのポリゴン 167折れ線 1 本あたりのセクション 167選択した行 137開いているウィンドウ 106

可変長文字列変数 47関数

Area( ) 168CreateCircle( ) 176CurDate( ) 52EOF( ) 161EOT( ) 129Err( ) 79Error$( ) 79FileExists( ) 160FileOpenDlg( ) 95FileSaveAsDlg( ) 95Format$( ) 109FrontWindow( ) 106GetMetaData$( ) 148GetSeamlessSheet( ) 151IntersectNodes( ) 182LabelFindByID( ) 183LabelFindFirst( ) 183LabelFindNext( ) 183LabelInfo( ) 183MakePen( ) 172NumberToDate( ) 53ObjectGeography( ) 168ObjectInfo( ) 167, 173ObjectLen( ) 168, 191Perimeter( ) 168ReadControlsValue( ) 101ReadControlValue( ) 103RemoteQueryHandler( ) 206RTrim$( ) 58SearchInfo( ) 119SelectionInfo( ) 137StyleAttr( ) 169, 173TableInfo( ) 132, 151, 166TempFileName$( ) 160TriggerControl( ) 102UBound( ) 47WindowID( ) 106WindowInfo( ) 106, 140範囲 72ユーザ定義 72

関数の範囲 72外国の文字セット 163外部参照

Windows DLL 195他のモジュール内のルーチン 37

外部ルーチンの呼び出し 37, 196

MapBasic 11.0 323 ユーザーズ ガイド

Page 324: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

キーボードのショートカット 28規則 16共有衝突 140距離単位 188キロメートル 186行カーソル、位置決め 129

クイック スタート ダイアログ ボックス 123クライアント/サーバ

DDE プロトコル 203データベース アクセス 151

クラス.Net での作成 260

クラス名MapInfo.Application 214MapInfo.Runtime 214

クリックとドラッグ 116グラフ ウィンドウ 110グリッド主題図のサポート 107グローバル アセンブリ キャッシュ (GAC)、読み込み 269グローバル変数 49

経度 311検索と置換

MapBasic エディタ 39検索メニュー 39

交差2 つの道路 133Intersects 演算子 59オブジェクトが重なる領域 178ラインの交差点 182

交差点 182構造 48コールバック 223国際文字セット 163固定長文字列変数 47コマンド ライン引数 32, 248コメント 44コントロール

EditText 99GroupBox 99StaticText 98

コントロール パネル、日付フォーマットへの影響54コンパイラ 312

コンパイラ命令 73合計、計算 134

再帰 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

シーケンシャル ファイル入出力 159–160シームレス テーブル 149識別子、定義 73システム レイヤ

オブジェクトを削除 139オブジェクトを選択 139定義 312

集合関数 313『MapBasic リファレンス ガイド』を参照

主題図 107主題図の連続色分けのサポート 107小合計、計算 134ショートカット キー

ダイアログ ボックス内 104メニュー内 91

ショートカット メニュー破棄 90変更 90

使用可能 313使用不可能、定義 313

MapBasic 11.0 324 ユーザーズ ガイド

Page 325: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

進捗状況 (パーセント) を示すダイアログ ボックス96進捗バー

定義 313非表示 125

シンボル スタイル 168ジオコード

MapMarker 133自動 133対話 133

ジオコード解除 166実行時エラー 77実行時エラーのトラップ 79実行速度、向上

テーブルの操作 155ハンドラ プロシージャ 71ユーザ インターフェイス 124

住所、検索 133住所検索 133住所の検索 133情報ウィンドウ

カスタマイズ 111読み取り専用に設定 112

数値演算子 55数値定数 52数値定数の小数点セパレータ 52スクロール バー、表示/非表示 107スタイル、比較 169スタイル (ペン、ブラシ、シンボル、フォント) 168ステータス バー ヘルプ メッセージ 120

統合マッピング 223スナップ モード 223スプレッドシート ファイル、開く 128

整数演算 55整数除算 288製品トレーニング 25接続ハンドル 151接続番号 151選択

オブジェクトのクリック 119検索 139変更 138

相関的結合 167, 192挿入

行をテーブルに 134テーブルにフィールドを 135

ノードをオブジェクトに 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

チェック可能なメニュー項目 87注釈 44頂点、ノードを参照地理演算子 59, 189地理的オブジェクト、オブジェクトを参照

ツールチップ 120ツールバー、ボタンパッドを参照ツールボタンの定義 113

MapBasic 11.0 325 ユーザーズ ガイド

Page 326: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

定義の受け渡し.Net へのカスタム変数タイプ 264

定数数値 52定義 50日付 53文字列 52論理 53

テーブルObj (object) フィールド 132, 165QueryN テーブルを閉じる 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

テキストのサイズ 169テキストの高さ 169テクニカル サポート

サービス 17–19提供 18利用 18

ディレクトリ名 160データ構造 48データベースへのライブ アクセス 155

投影法、変更 107統合マッピング

MapInfo の起動 214MapInfo の終了 221MFC 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

MapBasic 11.0 326 ユーザーズ ガイド

Page 327: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

パターン マッチ 56パフォーマンス向上のヒント

テーブルの操作 155ハンドラ プロシージャ 71ユーザ インターフェイス 124

パフォーマンス 適化テーブルの操作 155ハンドラ プロシージャ 71ユーザ インターフェイス 124

パラメータ値渡し 66参照渡し 66

パラメータの値渡し 66パラメータの参照渡し 66

比較演算子 56引数

.Net への受け渡し 263値渡し 66参照渡し 66

日付演算子 56日付定数 53< > (等しくない) 57評価順序 59表記規則 16比率データ併合 193ビットマップ イメージ ファイル 145描画モード 116. (ピリオド) 文字

小数点セパレータ 52

ファイル拡張子 15ファイル、外部

BIL (SPOT イメージ) 145DBF (dBASE) 128GIF 145JPG 145PCX 145Targa 145TIFF 145WKS (Lotus) 128XLS (Excel) 128

ファイル入出力シーケンシャル ファイル入出力 160定義 159バイナリ ファイル入出力 162ファイルのコピー 160ファイルの削除 160ファイルの名前変更 160文字セット 163

ランダム ファイル入出力 162ファイルの消去 160ファイル メニュー 38フィールド

Obj (object) フィールド 132, 165RowID フィールド 132別名式 130読み取りの構文 129

フィル スタイル (ブラシ) 168フォーカス

ダイアログ ボックス内 102定義 315

フォント スタイル 168–169複数のファイルを開く 36フレーム オブジェクト 175ブラウザ ウィンドウ 109ブラシ スタイル 168ブレークポイント (デバッグ) 78文 315

Add Column 193Add Map Layer 107Alter Button 114Alter ButtonPad 114, 201Alter Control 102Alter Menu Bar 86Alter Menu Item 87Alter Object 176, 180Alter Table 135AutoLabel 175Close Window 106, 208Commit 111, 134Continue 77Create ButtonPad 114, 116, 201Create Frame 110, 175Create Index 134Create Map 134, 166Create Menu 86Create Menu Bar 89Create Text 110, 169Declare Function 72, 195Declare Sub 64, 195Define 73Dim 45Do Case 61Do…Loop 63Drop Map 166End Program 64Fetch 129, 180For…Next 62Function...End Function 72GoTo 62If…Then 60Include 73

MapBasic 11.0 327 ユーザーズ ガイド

Page 328: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

Input # 161Insert 110, 134, 177Kill 160Line Input # 161Note 94OnError 79Open File 159Open Window 106, 208Pack Table 132Print 111Print # 161ProgressBar 96ReDim 47Remove Map Layer 107Rename File 160RollBack 134Run Application 123Run Menu Command 91, 111Save File 160Select 166–167, 174, 189, 191Set CoordSys 140, 186Set Event Processing 109Set File Timeout 142Set Format 53Set Map 107, 109, 175Set Redistricter 111Set Shade 107Set Table 151Set Target 181Set Window 106, 208Shade 107Stop 77Type...End Type 48Update 134, 176, 180While…Wend 63Write # 161

分岐 62文ハンドル 151文番号 151プッシュボタン 113プログラム内の行番号 40プログラムのコンパイル

アクティブ ウィンドウ 21, 30コマンド ライン 32ファイルを開かずに 38

プログラムの終了 64プログラムの実行

MapInfo 21, 31開発環境 41

プログラムの停止 64プログラムのデバッグ 77プログラムの実行

Startup ワークスペースから 123

プログラム編成 74プロシージャ

Main 64イベント処理 67再帰 67定義 64パラメータの受け渡し 66呼び出し 65

プロシージャの呼び出し 65プロジェクトのリンク

現在のプロジェクトの選択後 35コマンド ライン 32ファイルを開かずに 38

プロジェクト ファイル作成 35定義 33利点 34リンク 35例 34

プロジェクト メニュー 40プロパティ

Application オブジェクト 234MBApplications コレクション 240MBApplication オブジェクト 241MBGlobals コレクション 242MBGlobal オブジェクト 242MIMapGen オブジェクト 243定義 316

ヘッダ ファイル 15ヘルプからプログラムをコピー 24ヘルプ ファイル

作成 208使用 24

ヘルプ メニュー 42編集ターゲット 181編集メニュー 39変数

オブジェクト変数 165グローバル 49スタイル変数 172宣言 45定義 45データ型のリスト 46名前の制約 46範囲 50他のアプリケーションのグローバル変数の読み

込み 206変数の範囲 50変数への値の割り当て 45別名 316

MapBasic 11.0 328 ユーザーズ ガイド

Page 329: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

フィールド参照 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

- (マイナス) 288? (マイナス)

減算 55日付減算 56

マウス イベントクリックとドラッグ 116メニュー項目の選択 84リストのダブルクリック 102

マウスのショートカット 29マップ ウィンドウ 107

ラベル 182レイヤを参照

マップ オブジェクト、オブジェクトを参照マップ オブジェクトの作成 175マップ投影法 107マルチユーザ編集 140

右クリック メニュー破棄 90変更 90

無限ループ、回避 71

メソッドApplication オブジェクト 235MapBasic からの宣言と呼び出し 261MBApplication オブジェクト 241MIMapGen オブジェクト 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

MapBasic 11.0 329 ユーザーズ ガイド

Page 330: MapBasic User Guide - MapInfo Japanjapan.mapinfo.com/location/appdl/mapbasic/MapBasic... · このマニュアルに記載されている事項は、予告なしに変更されることがあります。また、販売店もしくは代理店は、この

ユーザ (Windows DLL) 196ユーザ インターフェイス

ウィンドウ 105カーソル 122概要 82ダイアログ ボックス、カスタム 96ダイアログ ボックス、標準 94ボタンパッド 113メニュー 84

ユーザ定義関数 72ユーザ定義タイプ 48

用紙単位 188

ライブ リモート データベース アクセス 155ライン オブジェクト、オブジェクトを参照ライン スタイル (ペン) 168ラスタ アンダーレイ テーブル 145, 317ラベル

テキストに変換 185プログラム内 62マップ 175, 182

ランタイム実行可能ファイルOLE を通じた起動 214

ランダム ファイル入出力 159, 162

リアルタイム アプリケーション 108リージョン オブジェクト、オブジェクトを参照リテラル値 317リモート データ、定義 317リモート データベース アクセス 151リモート データベース テーブル

mapinfo_mapcatalog 296リモート データベースの更新 154リモート データベースへのアクセス 151リモート データベースへの接続 151リモート データベースへのポイントの格納 154リモート データベースへのライブ アクセス 155領域編成ウィンドウ 111リンカー 317リンク テーブル 154

定義 317

ループDo...Loop 文 63

For...Next 文 62While...Wend 文 63

レイアウト ウィンドウオブジェクト座標 187テーブルとして処理 140開く 110

レイヤシステム レイヤ 139主題図レイヤ 107レイヤの追加/削除 107

レコード、行を参照

ローカル変数 45論理演算子 58

ワークスペースStartup 123サンプル プログラムとして使用 24

ワイルドカード (文字列比較) 56

MapBasic 11.0 330 ユーザーズ ガイド