Comments
Description
Transcript
アプリケーション テクニック
ア プ リ ケーシ ョ ン テ ク ニ ッ ク PowerBuilder® 9.0.2 DOCUMENT ID: 37774-01-0902-01 LAST REVISED: September 2004 Copyright © 1989-2004 by Sybase, Inc. All rights reserved. 本書に記載 さ れてい る ソ フ ト ウ ェ アは、 Sybase ラ イ セ ン ス契約に基づいて Sybase, Inc. が提供 し 、 かか る 契約の条項に従 う 場合にのみ使用が許諾 さ れ ます。 本書に記載 さ れてい る 内容は、 Sybase, Inc. お よ びその関連会社の書面に よ る 許可な く 、 いかな る 形態、 ま たは手段、 電子 的、 機械的、 手作業、 光学的お よ びその他にかかわ ら ず、 複製、 転載お よ び翻訳を禁 じ ます。 Sybase, Sybase ( ロ ゴ) , AccelaTrade, ADA Workbench, Adaptable Windowing Environment, Adaptive Component Architecture, Adaptive Server, Adaptive Server Anywhere, Adaptive Server Enterprise, Adaptive Server Enterprise Monitor, Adaptive Server Enterprise Replication, Adaptive Server Everywhere, Adaptive Server IQ, Adaptive Warehouse, Anywhere Studio, Application Manager, AppModeler, APT Workbench, APT-Build, APT-Edit, APT-Execute, APT-FORMS, APT-Translator, APT-Library, Backup Server, BizTracker, ClearConnect, Client-Library, Client Services, Convoy/DM, Copernicus, Data Pipeline, Data Workbench, DataArchitect, Database Analyzer, DataExpress, DataServer, DataWindow, DB-Library, dbQueue, Developers Workbench, Direct Connect Anywhere, DirectConnect, Distribution Director, e-ADK, E-Anywhere, e-Biz Integrator, E-Whatever, EC Gateway, ECMAP, ECRTP, eFulfillment Accelerator, Embedded SQL, EMS, Enterprise Application Studio, Enterprise Client/Server, Enterprise Connect, Enterprise Data Studio, Enterprise Manager, Enterprise SQL Server Manager, Enterprise Work Architecture, Enterprise Work Designer, Enterprise Work Modeler, eProcurement Accelerator, EWA, Financial Fusion, Financial Fusion Server, Gateway Manager, GlobalFIX, ImpactNow, Industry Warehouse Studio, InfoMaker, Information Anywhere, Information Everywhere, InformationConnect, InternetBuilder, iScript, Jaguar CTS, jConnect for JDBC, MainframeConnect, Maintenance Express, MDI Access Server, MDI Database Gateway, media.splash, MetaWorks, MySupport, Net-Gateway, Net-Library, New Era of Networks, ObjectConnect, ObjectCycle, OmniConnect, OmniSQL Access Module, OmniSQL Toolkit, Open Biz, Open Client, Open ClientConnect, Open Client/Server, Open Client/Server Interfaces, Open Gateway, Open Server, Open ServerConnect, Open Solutions, Optima++, PB-Gen, PC APT Execute, PC Net Library, Power++, power.stop, PowerAMC, PowerBuilder, PowerBuilder Foundation Class Library, PowerDesigner, PowerDimensions, PowerDynamo, PowerJ, PowerScript, PowerSite, PowerSocket, Powersoft, PowerStage, PowerStudio, PowerTips, Powersoft Portfolio, Powersoft Professional, PowerWare Desktop, PowerWare Enterprise, ProcessAnalyst, Rapport, Report Workbench, Report-Execute, Replication Agent, Replication Driver, Replication Server, Replication Server Manager, Replication Toolkit, Resource Manager, RW-DisplayLib, S-Designor, SDF, Secure SQL Server, Secure SQL Toolset, Security Guardian, SKILS, smart.partners, smart.parts, smart.script, SQL Advantage, SQL Anywhere, SQL Anywhere Studio, SQL Code Checker, SQL Debug, SQL Edit, SQL Edit/TPU, SQL Everywhere, SQL Modeler, SQL Remote, SQL Server, SQL Server Manager, SQL SMART, SQL Toolset, SQL Server/CFT, SQL Server/DBM, SQL Server SNMP SubAgent, SQL Station, SQLJ, STEP, SupportNow, S.W.I.F.T. Message Format Libraries, Sybase Central, Sybase Client/Server Interfaces, Sybase Financial Server, Sybase Gateways, Sybase MPP, Sybase SQL Desktop, Sybase SQL Lifecycle, Sybase SQL Workgroup, Sybase User Workbench, SybaseWare, Syber Financial, SyberAssist, SyBooks, System 10, System 11, System XI( ロ ゴ), SystemTools, Tabular Data Stream, TradeForce, Transact-SQL, Translation Toolkit, UltraLite.NET, UNIBOM, Unilib, Uninull, Unisep, Unistring, URK Runtime Kit for UniCode, Viewer, Visual Components, VisualSpeller, VisualWriter, VQL, WarehouseArchitect, Warehouse Control Center, Warehouse Studio, Warehouse WORKS, Watcom, Watcom SQL, Watcom SQL Server, Web Deployment Kit, Web.PB, Web.SQL, WebSights, WebViewer, WorkGroup SQL Server, XALibrary, XA-Server お よ び XP Server は Sybase, Inc. の登録商標です。 Unicode お よ び Unicode の ロ ゴは Unicode, Inc. の登録商標です。 本書で使用 さ れ る 会社名お よ び製品名はそれぞれの会社の商標お よ び登録商標です。 本書に記載 さ れてい る 内容は、 将来予告な し に変更す る こ と があ り ます。 ま た、 本 ソ フ ト ウ ェ アお よ び説明書を使用 し た こ と に よ る 損害、 ま たは第三者か ら のいかな る 請求について も 、 サ イ ベース株式会社、 その親会社であ る 米国法人 Sybase, Inc. ま たはその関連会社は、 一切の責任を負わない も の と し ます。 目次 本書について ................................................................................................................................ xix 第1部 ア プ リ ケーシ ョ ン テ ク ニ ッ ク の学習 第1章 サン プル ア プ リ ケーシ ョ ンの使い方 ................................................................. サン プル ア プ リ ケーシ ョ ン について............................................... Web サイ ト のサン プル ............................................................. CD 内のサン プル....................................................................... サン プル ア プ リ ケーシ ョ ンのイ ン ス ト ール .................................... サン プル ア プ リ ケーシ ョ ン を開 く .................................................. Code Examples ア プ リ ケーシ ョ ンの使い方.................................... サン プルの参照 ......................................................................... サン プルの検索 ......................................................................... サン プルの実行 と 調査 .............................................................. 3 3 3 4 5 5 5 6 7 8 第2部 言語テ ク ニ ッ ク 第2章 オブ ジ ェ ク ト 指向プ ロ グ ラ ミ ン グ ..................................................................... 13 用語の確認 ..................................................................................... 13 PowerBuilder のテ ク ニ ッ ク ........................................................... 15 そのほかのテ ク ニ ッ ク ................................................................... 19 第3章 PowerScript についての特別な ト ピ ッ ク ...................................................... 25 ド ッ ト 表記 ..................................................................................... 25 定数の宣言 ..................................................................................... 30 イ ン ス タ ン ス変数のア ク セスの制御.............................................. 30 名前の重複の解決 .......................................................................... 31 先祖ス ク リ プ ト か ら の戻 り 値 ........................................................ 33 関数 と イ ベン ト の引数の型 ............................................................ 34 先祖変数 と 子孫変数 ....................................................................... 35 デー タ ウ ィ ン ド ウ と 外部オブ ジ ェ ク ト における式の最適化.......... 38 ア プ リ ケーシ ョ ン テ ク ニ ッ ク iii 目次 PowerBuilder での例外処理 ........................................................... 例外処理の基本 ....................................................................... 例外処理用のオブ ジ ェ ク ト ..................................................... 例外の処理 .............................................................................. ユーザ定義の例外型の作成 ..................................................... 柔軟性の向上 と オブ ジ ェ ク ト の再利用の促進 ........................ SystemError イ ベン ト と Error イ ベン ト の使い方................... ガベージ コ レ ク シ ョ ン と メ モ リ 管理............................................. メ モ リ 管理の設定.................................................................... 効率的な コ ンパイル と パ フ ォ ーマ ン ス .......................................... テキス ト フ ァ イル と バイ ナ リ フ ァ イルの読み書き ...................... 39 40 40 42 44 47 48 49 51 53 53 第4章 PowerBuilder の ク ラ ス定義に関する情報の取得 .................................... 55 ク ラ ス定義情報の概要 ................................................................... 55 用語 ......................................................................................... 56 PowerBuilder ク ラ ス定義の使用について ............................... 58 ク ラ ス定義の調査 .......................................................................... 59 ク ラ ス定義オブ ジ ェ ク ト の取得 .............................................. 59 ク ラ スに関する詳細情報の取得 .............................................. 60 ク ラ スのス ク リ プ ト に関する情報の取得................................ 62 変数に関する情報の取得......................................................... 65 第3部 ユーザ イ ン タ フ ェ ース テ ク ニ ッ ク 第5章 MDI ア プ リ ケーシ ョ ンの構築............................................................................... 69 MDI について ................................................................................. 69 MDI フ レーム ウ ィ ン ド ウの作成 ................................................... 72 シー ト の使い方 .............................................................................. 73 マ イ ク ロヘルプの使い方................................................................ 75 ツールバーの使い方....................................................................... 76 メ ニ ュ ー ペ イ ン タ でのツールバー プ ロパテ ィ の設定............ 79 ウ ィ ン ド ウ ペ イ ン タ における ツールバー プ ロパテ ィ の設定. 81 ア プ リ ケーシ ョ ン ペ イ ン タ における ツールバー プ ロパテ ィ の設 定 ...................................................................................... 82 MDI ア プ リ ケーシ ョ ンにおける ツールバーの使い方 ............. 83 ツールバー設定の保存 と 復元.................................................. 85 ク ラ イ ア ン ト 領域のサイ ズ設定..................................................... 89 MDI ア プ リ ケーシ ョ ンにおけるキーボー ド 操作について ............. 92 第6章 ウ ィ ン ド ウ イ ン ス タ ン スの管理 ......................................................................... 95 ウ ィ ン ド ウ イ ン ス タ ン スについて ................................................ 95 ウ ィ ン ド ウ イ ン ス タ ン スの宣言.................................................... 96 iv PowerBuilder 目次 ウ ィ ン ド ウ配列の使い方................................................................ 98 子孫オブ ジ ェ ク ト のエ ン テ ィ テ ィ の参照 .................................... 101 第7章 ウ ィ ン ド ウにおけ る タ ブ コ ン ト ロールの使い方 ................................... タ ブ コ ン ト ロールについて ......................................................... タ ブ ページの定義 と 管理............................................................. タ ブ コ ン ト ロールのカ ス タ マ イ ズ .............................................. ス ク リ プ ト における タ ブ コ ン ト ロールの使い方......................... ス ク リ プ ト での タ ブ ページの参照 ....................................... タ ブ ページにあ る コ ン ト ロールの参照 ................................ タ ブ ページ を開 く 、 閉 じ る、 非表示にする ......................... タ ブ ページの履歴................................................................. 必要な と き だけ タ ブ ページ を生成 ....................................... タ ブ コ ン ト ロールの各部分における イ ベン ト ..................... 103 103 104 108 111 111 114 115 115 116 118 第8章 ウ ィ ン ド ウでの リ ス ト の使い方....................................................................... リ ス ト の提示について ................................................................. リ ス ト の使い方 ............................................................................ ド ロ ッ プ ダウ ン リ ス ト の使い方 .................................................. リ ス ト ビ ュ ー コ ン ト ロールの使い方........................................... 詳細表示の使い方.................................................................. 121 121 122 127 130 136 第9章 ツ リ ービ ュ ー コ ン ト ロールの使い方............................................................ ツ リ ービ ュ ー コ ン ト ロールについて........................................... ツ リ ービ ュ ーの表示 ..................................................................... 項目挿入関数......................................................................... ルー ト レ ベルへの項目の挿入............................................... ルー ト レ ベルの下への項目の挿入 ....................................... ツ リ ービ ュ ーの項目の管理 .......................................................... 項目の削除 ............................................................................ 項目の名前の変更.................................................................. ド ラ ッ グ ア ン ド ド ロ ッ プによ る項目の移動 ........................ 項目の ソ ー ト ......................................................................... ツ リ ービ ュ ー ピ ク チ ャの管理 ..................................................... 項目のピ ク チ ャ ..................................................................... ピ ク チ ャ リ ス ト の設定 ......................................................... オーバーレ イ ピ ク チ ャ の使い方 ........................................... デー タ ウ ィ ン ド ウのデー タ のツ リ ービ ュ ーへの表示 .................. 139 139 143 144 145 146 149 150 151 152 156 158 158 159 161 161 第 10 章 ド ラ ッ グ ア ン ド ド ロ ッ プ機能の使い方 ..................................................... 165 ド ラ ッ グ ア ン ド ド ロ ッ プ機能について ...................................... 165 ド ラ ッ グ ア ン ド ド ロ ッ プのプ ロパテ ィ 、 イ ベン ト 、 および関数 166 ア プ リ ケーシ ョ ン テ ク ニ ッ ク v 目次 ド ラ ッ グ さ れた コ ン ト ロールの識別............................................ 168 第 11 章 オ ン ラ イ ン ヘルプの提供..................................................................................... ヘルプ フ ァ イルの作成 ................................................................ 開発者に対するオ ン ラ イ ン ヘルプの提供 ................................... エ ン ド ユーザに対するオ ン ラ イ ン ヘルプの提供........................ 第4部 デー タ ア ク セス テ ク ニ ッ ク 第 12 章 ト ラ ンザク シ ョ ン オブ ジ ェ ク ト の使い方 .................................................. 177 ト ラ ンザク シ ョ ン オブ ジ ェ ク ト について ................................... 177 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト のプ ロパテ ィ ..................... 178 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト のプ ロパテ ィ と PowerBuilder デー タ ベース イ ン タ フ ェ ースのサポー ト ...................... 181 ト ラ ンザク シ ョ ン オブ ジ ェ ク ト の使い方 ................................... 182 ト ラ ンザ ク シ ョ ンの基礎....................................................... 183 デ フ ォル ト ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト ........................ 184 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト のプ ロパテ ィ 値の設定 ....... 185 外部 フ ァ イルか ら の値の読み込み ........................................ 186 デー タ ベースへの接続 .......................................................... 187 PowerBuilder ア プ リ ケーシ ョ ン で接続する ための [プ レ ビ ュ ー] タ ブの使い方 .................................................................. 187 デー タ ベース と の接続の解除................................................ 188 複数のデー タ ベース接続における ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の定義 ......................................................................... 189 SQL 文実行後のエ ラ ー処理 .................................................. 192 デー タ ベース ト ラ ンザ ク シ ョ ンのプール............................. 193 ス ト ア ド プ ロ シージ ャ を呼び出すための ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 .................................................................. 194 ス テ ッ プ 1: 標準ク ラ ス ユーザ オブ ジ ェ ク ト の定義............ 196 ス テ ッ プ 2: 外部関数 と し てのス ト ア ド プ ロ シージ ャの宣言 197 ス テ ッ プ 3: ユーザ オブ ジ ェ ク ト の保存............................... 199 ス テ ッ プ 4: SQLCA に対するデ フ ォル ト のグローバル変数の型の 指定 ................................................................................ 199 ス テ ッ プ 5: ア プ リ ケーシ ョ ン でユーザ オブ ジ ェ ク ト を使用する 201 ス ト ア ド プ ロ シージ ャ を呼び出す と きサポー ト さ れている DBMS の 機能 ................................................................................ 203 第 13 章 PowerBuilder XML サービ スの使い方 ........................................................ 207 XML と PowerBuilder について ................................................... 207 PBDOM について......................................................................... 208 vi 169 169 171 173 PowerBuilder PBDOM オブ ジ ェ ク ト 階層........................................................... 209 PBDOM ノ ー ド オブ ジ ェ ク ト ...................................................... 210 PBDOM_OBJECT ................................................................. 211 PBDOM_DOCUMENT........................................................... 213 PBDOM_DOCTYPE .............................................................. 214 PBDOM_ELEMENT............................................................... 214 PBDOM_ATTRIBUTE............................................................ 217 PBDOM_ENTITYREFERENCE............................................. 220 PBDOM_CHARACTERDATA................................................ 220 PBDOM_TEXT ...................................................................... 221 PBDOM_CDATA ................................................................... 224 PBDOM_COMMENT ............................................................. 224 PBDOM_PROCESSINGINSTRUCTION ............................... 225 ラ イ ブ ラ リ 探索パスへの pbdom90J.pbd の追加 ......................... 226 PBDOM の使い方 ......................................................................... 227 XML の検証............................................................................ 228 XML か ら の XML ド キ ュ メ ン ト の作成.................................. 228 最初から の XML ド キ ュ メ ン ト の作成 ................................... 230 ノ ー ド デー タ へのア ク セス................................................... 231 ノ ー ド ツ リ ー階層の操作 ...................................................... 233 PBDOM 例外の処理 ..................................................................... 233 XML 名前空間............................................................................... 235 PBDOM_ATTRIBUTE の名前および名前空間の設定............ 236 第 14 章 グ ラ フの操作.............................................................................................................. 241 グ ラ フの使い方 ............................................................................ 241 コ ー ド におけるグ ラ フ コ ン ト ロールの操作 ......................... 242 グ ラ フへのデー タ 表示.................................................................. 243 グ ラ フのプ ロパテ ィ の修正 .......................................................... 245 グ ラ フ 要素の表示 .................................................................. 246 グ ラ フ 要素の参照 .................................................................. 246 デー タ のプ ロパテ ィ へのア ク セス................................................ 247 デー タ の情報の取得 .............................................................. 248 グ ラ フ のデー タ の保存........................................................... 248 色や模様、 そのほかのデー タ の修正 ..................................... 249 ポ イ ン ト ア ン ド ク リ ッ ク の使い方.............................................. 249 第 15 章 リ ッ チ テキス ト の作成方法................................................................................. 253 ア プ リ ケーシ ョ ンにおける リ ッ チ テキス ト の使い方................... 253 リ ッ チ テキス ト の作成........................................................... 254 リ ッ チ テキス ト デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト の使い方.......... 254 リ ッ チ テキス ト エデ ィ ッ ト コ ン ト ロールの使い方 .................... 257 エ ン ド ユーザに制御権を与え る ........................................... 257 ア プ リ ケーシ ョ ン テ ク ニ ッ ク vii リ ッ チ テキス ト エデ ィ ッ ト コ ン ト ロールのためのテキス ト 259 リ ッ チ テキス ト の書式設定.................................................... 267 入力 フ ィ ール ド ...................................................................... 268 デー タ ベースのデー タ の使い方 ............................................ 269 リ ッ チ テキス ト エデ ィ ッ ト コ ン ト ロールにおける カ ー ソ ル位置 271 プ レ ビ ュ ー と 印刷 .................................................................. 272 リ ッ チ テキス ト と エ ン ド ユーザ .................................................. 275 第 16 章 デー タ ソ ース間のデー タ 転送 .......................................................................... 279 デー タ パイ プ ラ イ ンについて ...................................................... 279 必要なオブ ジ ェ ク ト の作成 .......................................................... 281 パイ プ ラ イ ン オブ ジ ェ ク ト の作成........................................ 281 ユーザ オブ ジ ェ ク ト の作成................................................... 284 ウ ィ ン ド ウの作成 .................................................................. 285 パイ プ ラ イ ン処理の前準備 .......................................................... 288 パイ プ ラ イ ン処理の開始 .............................................................. 291 パイ プ ラ イ ン処理のモニ タ .................................................... 293 パイ プ ラ イ ン処理のキ ャ ン セル ............................................ 295 更新処理の コ ミ ッ ト .............................................................. 297 エ ラ ー行の処理 ............................................................................ 298 エ ラ ー行の修復...................................................................... 299 エ ラ ー行の破棄...................................................................... 301 パイ プ ラ イ ンの後処理.................................................................. 302 第5部 プ ロ グ ラ ム ア ク セス テ ク ニ ッ ク 第 17 章 DDE の使い方 ............................................................................................................ 307 DDE について............................................................................... 307 DDE 関数 と イ ベン ト .................................................................... 308 第 18 章 ア プ リ ケーシ ョ ン におけ る OLE の使い方 ................................................ 311 PowerBuilder における OLE のサポー ト ...................................... 311 ウ ィ ン ド ウにおける OLE コ ン ト ロール ...................................... 313 OLE コ ン ト ロール と 挿入可能なオブ ジ ェ ク ト ............................. 315 OLE コ ン ト ロールの設定 ...................................................... 316 リ ン ク と 埋め込み .................................................................. 320 オ フサイ ト ア ク テ ィ ブ化 と イ ン プ レース ア ク テ ィ ブ化 ...... 322 イ ン プ レース ア ク テ ィ ブ化に対する メ ニ ュ ー...................... 323 OLE コ ン ト ロール上でのオブ ジ ェ ク ト の修正...................... 325 OLE カ ス タ ム コ ン ト ロール ........................................................ 330 OLE カ ス タ ム コ ン ト ロールの設定....................................... 330 viii PowerBuilder ActiveX コ ン ト ロールのプ ログ ラ ミ ング ............................... 332 プ ログ ラ ム可能な OLE オブ ジ ェ ク ト .......................................... 334 OLEObject オブ ジ ェ ク ト 型 ................................................... 334 OLEControl、 OLECustomControl、 OLEObject デー タ 型の代入. 338 オー ト メ ーシ ョ ン .................................................................. 339 ス ク リ プ ト における OLE オブ ジ ェ ク ト ...................................... 344 オー ト メ ーシ ョ ンのイ ン タ フ ェ ース ..................................... 345 オー ト メ ーシ ョ ン と Any 型................................................... 352 効率的な OLEObjects 変数の使い方 ..................................... 353 エ ラ ー処理............................................................................. 354 ホ ッ ト リ ン ク の作成 ............................................................. 357 OLE サーバで使用で き る言語 ............................................... 359 OLE オブ ジ ェ ク ト への低レ ベル ア ク セス ............................ 360 デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト における OLE オブ ジ ェ ク ト 360 オブ ジ ェ ク ト ブ ラ ウザでの OLE 情報 ......................................... 364 OLE オブ ジ ェ ク ト の高度な操作 .................................................. 366 OLE ス ト レージの構造.......................................................... 367 ス ト レージ と ス ト リ ームに対するオブ ジ ェ ク ト デー タ 型.... 368 ス ト レージ を開 く 、 保存する ................................................ 369 ス ト リ ームを開 く .................................................................. 376 ス ト レージ を使用する際のス ト ラ テ ジ.................................. 380 第 19 章 PowerBuilder の ラ ン タ イ ム オー ト メ ーシ ョ ン サーバ .................... 381 ラ ン タ イ ム オー ト メ ーシ ョ ン サーバの使い方............................ 381 ラ ン タ イム オー ト メ ーシ ョ ンの用途 .................................... 383 3 つのア ク セス方法 ............................................................... 383 ユーザ オブ ジ ェ ク ト を オー ト メ ーシ ョ ン サーバ と し て使用する方法 387 サーバ と な る ク ラ ス ユーザ オブ ジ ェ ク ト の作成 ................. 387 ユーザ オブ ジ ェ ク ト のラ ン タ イ ム ラ イ ブ ラ リ の構築 .......... 388 ク ラ ス ユーザ オブ ジ ェ ク ト の登録....................................... 388 ユーザ オブ ジ ェ ク ト にア ク セスする ク ラ イ ア ン ト ア プ リ ケー シ ョ ンの コ ー ド の記述 .................................................... 390 PowerBuilder を オー ト メ ーシ ョ ン サーバ と し て使用する方法... 392 ア ク セスする ク ラ ス ユーザ オブ ジ ェ ク ト の作成 ................. 392 ラ ン タ イム ラ イ ブ ラ リ の構築 ............................................... 393 PowerBuilder と ユーザ オブ ジ ェ ク ト にア ク セスする ク ラ イ ア ン ト ア プ リ ケーシ ョ ンの コ ー ド の記述 ............................. 394 名前付き PowerBuilder オー ト メ ーシ ョ ン サーバの作成 と 使用.. 397 ユーザ オブ ジ ェ ク ト と レ ジ ス ト リ についての詳細 ..................... 399 識別子について...................................................................... 399 オブ ジ ェ ク ト に関する情報の登録場所.................................. 400 レ ジ ス ト リ 情報の作成........................................................... 403 ア プ リ ケーシ ョ ン テ ク ニ ッ ク ix オー ト メ ーシ ョ ン サーバを使用する ア プ リ ケーシ ョ ンの配布 ... 407 複数のバージ ョ ン と ア ッ プデー ト ......................................... 408 オー ト メ ーシ ョ ン サーバ リ フ ァ レ ン ス ...................................... 408 PowerBuilder.Application サーバ オブ ジ ェ ク ト ........................... 409 CreateObject 関数 ........................................................................ 412 GenerateGUID 関数 ..................................................................... 415 GenerateRegFile 関数 .................................................................. 418 GenerateTypeLib 関数.................................................................. 421 例外 コ ー ド .................................................................................... 426 レ ジ ス ト リ フ ァ イルのサン プル .................................................. 427 第 20 章 MAPI の使い方 .......................................................................................................... 429 MAPI について ............................................................................. 429 MAPI の使い方 ............................................................................. 430 第 21 章 外部関数 と そのほかの拡張処理機能の使い方 ......................................... 433 外部関数の使い方......................................................................... 433 外部関数の宣言...................................................................... 434 外部関数の宣言例 .................................................................. 435 引数の受け渡 し ...................................................................... 436 UNIX での外部関数 と プ ログ ラ ムの呼び出 し ........................ 439 ユーテ ィ リ テ ィ 関数の使い方....................................................... 440 Windows メ ッ セージの送信 ......................................................... 441 メ ッ セージ オブ ジ ェ ク ト ............................................................. 443 メ ッ セージ オブ ジ ェ ク ト のプ ロパテ ィ ................................. 443 コ ン テキス ト 情報......................................................................... 445 コ ン テキス ト 情報サービ ス.................................................... 447 コ ン テキス ト キーワー ド サービ ス ....................................... 451 CORBACurrent サービ ス....................................................... 452 エ ラ ー ロギング サービ ス ..................................................... 452 イ ン タ ーネ ッ ト サービ ス ...................................................... 453 Secure Sockets Layer サービ ス ............................................ 456 ト ラ ンザ ク シ ョ ン サーバ サービ ス ....................................... 456 第6部 分散ア プ リ ケーシ ョ ンの開発 第 22 章 PowerBuilder を使 っ た分散ア プ リ ケーシ ョ ン開発 ............................ 459 分散ア プ リ ケーシ ョ ンのアーキテ ク チ ャ ..................................... 459 サーバのサポー ト ......................................................................... 460 第 23 章 EAServer コ ン ポーネ ン ト の構築 ................................................................... 465 x PowerBuilder EAServer コ ンポーネ ン ト の構築について ................................... 465 ウ ィ ザー ド の使い方について ................................................ 466 開発プ ロ セスについて ........................................................... 466 EAServer プ ロ フ ァ イルの作成 .............................................. 467 共有 コ ンポーネ ン ト およびサービ ス コ ンポーネ ン ト の操作 ....... 469 共有 コ ンポーネ ン ト について ................................................ 469 サービ ス コ ンポーネ ン ト について ........................................ 470 ス レ ッ ド 実行の問題 と コ ンポーネ ン ト の種類....................... 471 EAServer Thread Manager の使い方 .................................... 474 イ ン ス タ ン ス プー リ ングのサポー ト ........................................... 475 ト ラ ンザ ク シ ョ ンのサポー ト ....................................................... 480 EAServer コ ンポーネ ン ト から デー タ ベースへのア ク セス.......... 486 接続キ ャ ッ シ ュの使い方 ....................................................... 487 検索操作の実行...................................................................... 490 更新の実行............................................................................. 492 結果集合の受け渡 し .............................................................. 498 コ ンポーネ ン ト イ ン タ フ ェ ースの定義 ....................................... 500 既存イ ン タ フ ェ ースの実装 .......................................................... 504 別のサーバ コ ンポーネ ン ト の メ ソ ッ ド の呼び出 し ..................... 506 コ ンポーネ ン ト プ ロパテ ィ へのア ク セス .................................... 509 コ ンポーネ ン ト のテ ス ト と デバ ッ グ ............................................ 514 ラ イ ブ編集............................................................................. 514 リ モー ト デバ ッ グ ................................................................. 517 EAServer ログへの メ ッ セージ出力....................................... 519 デー タ の印刷 ................................................................................ 519 Solaris オペ レーテ ィ ング シ ス テムでの印刷 ........................ 520 PDF への印刷 ........................................................................ 524 EAServer への コ ンポーネ ン ト の配布 .......................................... 525 第 24 章 EAServer ク ラ イ ア ン ト の構築........................................................................ 529 EAServer ク ラ イ ア ン ト の構築について ...................................... 529 ウ ィ ザー ド の使い方について ................................................ 530 開発プ ロ セスについて ........................................................... 530 EAServer への接続....................................................................... 531 コ ー ド を手書きする方法 ....................................................... 531 ウ ィ ザー ド を使用 し た接続オブ ジ ェ ク ト の作成 ................... 534 EAServer プ ロキシ オブ ジ ェ ク ト の生成 ..................................... 535 コ ンポーネ ン ト メ ソ ッ ド の呼び出 し ........................................... 536 コ ンポーネ ン ト メ ソ ッ ド の呼び出 し .................................... 537 EJB コ ンポーネ ン ト メ ソ ッ ド の呼び出 し ............................. 538 イ ン ス タ ン スの破棄 .............................................................. 542 JaguarORB オブ ジ ェ ク ト の使い方.............................................. 543 String_To_Object を使用 し た イ ン ス タ ン ス化....................... 544 ネー ミ ング サービ ス API によ る イ ン ス タ ン ス化.................. 547 ア プ リ ケーシ ョ ン テ ク ニ ッ ク xi ク ラ イ ア ン ト と コ ンポーネ ン ト を区別する ト ラ ンザク シ ョ ン .... 548 サーバ メ ッ セージ返送の要求...................................................... 552 例 ........................................................................................... 553 エ ラ ー処理.................................................................................... 556 CORBA 例外の処理 ............................................................... 558 Error イ ベン ト のス ク リ プ ト 作成........................................... 560 SystemError イ ベン ト のス ク リ プ ト 作成............................... 561 ク ラ イ ア ン ト ア プ リ ケーシ ョ ンの配布 ....................................... 562 第 25 章 PowerBuilder ク ラ イ ア ン ト での SSL の使い方 ................................... 563 EAServer と のセキ ュ ア な接続..................................................... 563 PowerBuilder での SSL 接続 ........................................................ 565 SSL プ ロパテ ィ ..................................................................... 565 ORB プ ロパテ ィ .................................................................... 568 セキ ュ ア な接続の確立.................................................................. 569 SSL コ ールバ ッ ク の使い方.......................................................... 572 セ ッ シ ョ ン情報の取得........................................................... 572 SSLCallback オブ ジ ェ ク ト の実装......................................... 573 SSLCallback オブ ジ ェ ク ト の指定......................................... 575 セ ッ シ ョ ン セキ ュ リ テ ィ 情報の取得 ........................................... 576 第 26 章 COM/MTS/COM+ コ ン ポーネ ン ト の構築 .................................................. 579 COM/MTS/COM+ コ ンポーネ ン ト の構築について ...................... 579 ウ ィ ザー ド の使い方について ................................................ 580 開発プ ロ セスについて ........................................................... 581 コ ンポーネ ン ト オブ ジ ェ ク ト モデルについて............................ 582 PowerBuilder COM サーバについて ...................................... 583 オー ト メ ーシ ョ ン サーバ と PowerBuilder COM サーバの比較 ... 583 コ ンポーネ ン ト イ ン タ フ ェ ースの定義 ....................................... 586 メ ソ ッ ド と デー タ 型 .............................................................. 586 コ ーデ ィ ング上の制約........................................................... 588 ログ フ ァ イルへのエ ラ ー記録 ............................................... 590 COM コ ンポーネ ン ト から デー タ ベースへのア ク セス................. 590 結果集合の受け渡 し .............................................................. 591 ト ラ ンザ ク シ ョ ンのサポー ト ....................................................... 594 MTS でのオブ ジ ェ ク ト 有効期間 コ ン ト ロールのサポー ト .......... 598 別のサーバ コ ンポーネ ン ト の メ ソ ッ ド の呼び出 し ..................... 598 セキ ュ リ テ ィ 問題......................................................................... 599 プ ロ ジ ェ ク ト ペ イ ン タ での COM/MTS/COM+ コ ンポーネ ン ト の構築 600 コ ンポーネ ン ト の自動登録.................................................... 602 MTS に コ ンポーネ ン ト を配布............................................... 603 xii PowerBuilder COM+ に コ ンポーネ ン ト を配布............................................ 603 カ ス タ ム イ ン タ フ ェ ース と デ ュ アル イ ン タ フ ェ ースの選択 604 埋め込み PBD の設定 ............................................................ 604 PowerBuilder COM オブ ジ ェ ク ト の実行 ..................................... 605 メ モ リ の割 り 当て .................................................................. 605 PowerBuilder COM サーバの配布 ................................................ 606 COM 対応のア プ リ ケーシ ョ ンに よ る PowerBuilder COM サーバ の使い方.......................................................................... 606 MTS に対する PowerBuilder COM オブ ジ ェ ク ト の配布....... 607 ク ラ イ ア ン ト か ら PowerBuilder COM サーバへのア ク セス........ 611 ク ラ イ ア ン ト と し ての Visual Basic ...................................... 611 ク ラ イ ア ン ト と し ての C++ ................................................... 612 DCOM での PowerBuilder COM サーバ と オブ ジ ェ ク ト の使い方 615 第 27 章 COM/MTS/COM+ ク ラ イ ア ン ト の構築 ....................................................... 619 COM/MTS/COM+ ク ラ イ ア ン ト の構築について ......................... 619 COM サーバへの接続 ................................................................... 620 COM コ ンポーネ ン ト と のや り 取 り ............................................. 621 ク ラ イ ア ン ト か ら の ト ラ ンザ ク シ ョ ン制御 ................................. 622 第 28 章 EJB ク ラ イ ア ン ト の構築 .................................................................................... 625 EJB ク ラ イ ア ン ト の構築について ............................................... 625 ラ イ ブ ラ リ 探索パスへの pbejbclient90J.pbd の追加 ................... 627 EJB プ ロキシ オブ ジ ェ ク ト の生成 .............................................. 628 EJB プ ロキシ プ ロ ジ ェ ク ト の使い方.................................... 629 ejb2pb90J ツールの使い方 .................................................... 632 生成 さ れた プ ロキシの表示方法 ............................................ 634 デー タ 型マ ッ ピ ング .............................................................. 635 Java VM の作成............................................................................ 636 サーバへの接続 ............................................................................ 639 コ ンポーネ ン ト メ ソ ッ ド の呼び出 し ........................................... 641 例外処理 ....................................................................................... 646 ク ラ イ ア ン ト 管理の ト ラ ンザ ク シ ョ ン ........................................ 647 ク ラ イ ア ン ト のデバ ッ グ .............................................................. 648 第7部 WEB ア プ リ ケーシ ョ ンの開発 第 29 章 PowerBuilder での Web ア プ リ ケーシ ョ ン開発................................... 653 Web ア プ リ ケーシ ョ ンの作成...................................................... 653 Web サービ ス ........................................................................ 654 Web タ ーゲ ッ ト .................................................................... 654 ア プ リ ケーシ ョ ン テ ク ニ ッ ク xiii JSP タ ーゲ ッ ト ..................................................................... Web デー タ ウ ィ ン ド ウ.......................................................... デー タ ウ ィ ン ド ウ Web コ ン ト ロール ActiveX...................... デー タ ウ ィ ン ド ウ プ ラ グ イ ン ............................................... PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン ................................... PowerBuilder ウ ィ ン ド ウ ActiveX ......................................... 655 655 657 657 658 659 第 30 章 Web サービ ス ク ラ イ ア ン ト の構築............................................................... 661 Web サービ スについて ................................................................ 661 Web サービ ス ク ラ イ ア ン ト の構築について ........................ 663 PBSoapClient90J.pbd を ラ イ ブ ラ リ 探索パスに追加する ........... 663 Web サービ ス プ ロキシ オブ ジ ェ ク ト の生成 .............................. 664 SOAP サーバへの接続 ................................................................. 666 Web サービ ス メ ソ ッ ド の起動..................................................... 668 Web サービ スの作成 .................................................................... 668 例外処理 ....................................................................................... 669 第 31 章 デー タ ウ ィ ン ド ウ プ ラ グ イ ンの使い方....................................................... 671 デー タ ウ ィ ン ド ウ プ ラ グ イ ンについて ....................................... 671 デー タ ウ ィ ン ド ウ プ ラ グ イ ンの機能 .................................... 672 デー タ ウ ィ ン ド ウ プ ラ グ イ ンのイ ン ス ト ール と 設定 ........... 674 デー タ ウ ィ ン ド ウ プ ラ グ イ ンの開発 と 配布 ......................... 674 Powersoft レ ポー ト (PSR) の保存............................................. 675 HTML ページの作成 ..................................................................... 676 サン プル ページ..................................................................... 677 Web サーバの設定........................................................................ 677 ユーザのワー ク ス テーシ ョ ンの設定 ............................................ 679 第 32 章 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの使い方 .................................... 681 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンについて ............................ 681 プ ラ グ イ ン と な る ア プ リ ケーシ ョ ンの種類 .......................... 684 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの機能......................... 685 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンのイ ン ス ト ール と 設定 ...... 688 セキ ュ リ テ ィ PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの使い方 ..... 689 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン ア プ リ ケーシ ョ ンの開発 と 配布 690 PowerBuilder ア プ リ ケーシ ョ ンの作成........................................ 691 プ ラ グ イ ン ア プ リ ケーシ ョ ンの設計の選択 ......................... 691 ウ ィ ン ド ウ ペ イ ン タ での開始ウ ィ ン ド ウの定義 .................. 694 PowerBuilder でのア プ リ ーシ ョ ンのテ ス ト .......................... 696 動的 ラ イ ブ ラ リ の構築........................................................... 696 HTML ページの作成 ..................................................................... 699 Embed 要素の属性 ................................................................ 699 xiv PowerBuilder サン プル ページ..................................................................... 700 追加属性を持つ Embed 要素 ................................................. 701 サーバの設定 ................................................................................ 702 ユーザのワー ク ス テーシ ョ ンの設定 ............................................ 703 必要な コ ンポーネ ン ト ........................................................... 704 Web ページ と プ ラ グ イ ン ア プ リ ケーシ ョ ンの表示 ............. 705 第 33 章 PowerBuilder ウ ィ ン ド ウ ActiveX の使い方.......................................... 707 PowerBuilder ウ ィ ン ド ウ ActiveX について................................. 707 PowerBuilder ウ ィ ン ド ウ ActiveX で動作する ア プ リ ケーシ ョ ンの 種類................................................................................. 708 PowerBuilder ウ ィ ン ド ウ ActiveX の機能 ............................. 709 PowerBuilder ウ ィ ン ド ウ ActiveX のイ ン ス ト ール と 設定 .... 710 PowerBuilder ウ ィ ン ド ウ ActiveX ア プ リ ケーシ ョ ンの開発 と 配布 711 PowerBuilder ア プ リ ケーシ ョ ンの作成........................................ 712 ア プ リ ケーシ ョ ンのデザイ ン ................................................ 712 ウ ィ ン ド ウ ペ イ ン タ での開始ウ ィ ン ド ウの定義 .................. 716 PowerBuilder でのア プ リ ーシ ョ ンのテ ス ト .......................... 717 HTML ページの作成 ..................................................................... 719 Object 要素の属性 ................................................................. 720 基本ページ ............................................................................. 722 ク ラ イ ア ン ト 側のス ク リ プ ト ................................................ 723 PowerBuilder ウ ィ ン ド ウ ActiveX のイ ベン ト ............................. 732 サーバの設定 ................................................................................ 733 ユーザのワー ク ス テーシ ョ ンの設定 ............................................ 734 Web ページ と PowerBuilder ウ ィ ン ド ウ ActiveX ア プ リ ケーシ ョ ンの表示.......................................................................... 735 第8部 全般的な テ ク ニ ッ ク 第 34 章 PowerBuilder の日本語仕様 ............................................................................. 739 日本語仕様の PowerScript 関数 と デー タ ウ ィ ン ド ウ ペ イ ン タ 関数 ... 739 IMEMode プ ロパテ ィ ................................................................... 740 第 35 章 印刷.................................................................................................................................. 743 印刷関数 ....................................................................................... 743 印刷の基礎.................................................................................... 745 ジ ョ ブの印刷 ................................................................................ 745 タ ブの使い方 ................................................................................ 746 印刷ジ ョ ブの停止......................................................................... 747 ア プ リ ケーシ ョ ン テ ク ニ ッ ク xv 高度な印刷技法 ............................................................................ 748 第 36 章 初期設定 フ ァ イル と Windows レ ジ ス ト リ の管理................................ 751 環境設定 と デ フ ォル ト 設定について ............................................ 751 初期設定 フ ァ イルでの情報の管理................................................ 752 Windows レ ジ ス ト リ での情報の管理........................................... 753 第 37 章 InfoMaker の様式 と ア ク シ ョ ンの作成 ........................................................ 755 フ ォ ーム様式について.................................................................. 755 フ ォ ーム様式内でのデー タ ウ ィ ン ド ウ コ ン ト ロールの命名 ....... 759 フ ォ ーム様式の作成および使用 ................................................... 760 既存の様式の修正......................................................................... 760 様式の基礎 と し てのウ ィ ン ド ウの識別.................................. 762 最初か ら の様式の作成.................................................................. 762 様式の完成.................................................................................... 763 セ ン ト ラル デー タ ウ ィ ン ド ウ コ ン ト ロールに対する作業... 764 コ ン ト ロールの追加 .............................................................. 765 ア ク シ ョ ンの定義 .................................................................. 765 メ ニ ュ ーの使い方 .................................................................. 766 ス ク リ プ ト の記述 .................................................................. 767 そのほかの機能の追加........................................................... 767 様式の使い方 ................................................................................ 768 カ ス タ ム フ ォ ーム様式を使用 し た フ ォ ームの作成............... 768 フ ォ ーム様式の使用の管理.................................................... 769 第9部 配布のテ ク ニ ッ ク 第 38 章 配布用ア プ リ ケーシ ョ ンのパ ッ ケージ化 ................................................... 775 ア プ リ ケーシ ョ ンの配布について................................................ 775 実行可能な ア プ リ ケーシ ョ ンの作成 ............................................ 776 コ ンパイ ラの基本事項........................................................... 776 パ ッ ケージに含まれる要素.................................................... 777 PowerBuilder リ ソ ース フ ァ イルの作成................................ 784 パ ッ ケージ化モデルの選択.................................................... 786 パ ッ ケージ化モデルの実装.................................................... 789 実行ア プ リ ケーシ ョ ンのテ ス ト ............................................ 790 エ ン ド ユーザへのア プ リ ケーシ ョ ンの配布 ................................ 791 イ ン ス ト ール チ ェ ッ ク リ ス ト ............................................... 791 配布済みア プ リ ケーシ ョ ンの起動......................................... 795 第 39 章 ア プ リ ケーシ ョ ン と コ ンポーネ ン ト の配布 .............................................. 797 xvi PowerBuilder ア プ リ ケーシ ョ ン、 コ ンポーネ ン ト 、 およびサポー ト フ ァ イルの配 布 .................................................................................... 798 PowerBuilder ラ ン タ イム パ ッ ケージ ャ ....................................... 802 PowerBuilder ラ ン タ イム フ ァ イル.............................................. 805 デー タ ベース接続......................................................................... 806 ネ イ テ ィ ブ デー タ ベース ド ラ イバ....................................... 807 ODBC デー タ ベース ド ラ イバ と サポー ト フ ァ イル ............. 808 OLE DB デー タ ベース プ ロバイ ダ ........................................ 820 JDBC デー タ ベース イ ン タ フ ェ ース..................................... 822 Java サポー ト ............................................................................... 823 PowerBuilder エ ク ス テ ン シ ョ ン .................................................. 825 PDF と XSL-FO のエ ク スポー ト .................................................. 827 GNU Ghostscript distiller の使い方 ........................................ 827 Apache FO プ ロ セ ッ サの使い方 ........................................... 828 デー タ ウ ィ ン ド ウ Web コ ン ト ロール ActiveX............................. 830 プ ラ グ イ ン と PowerBuilder ウ ィ ン ド ウ ActiveX コ ン ト ロール... 831 EAServer 上の PowerBuilder コ ンポーネ ン ト ............................. 832 PowerBuilder COM サーバ ........................................................... 834 PowerBuilder オー ト メ ーシ ョ ン サーバ....................................... 836 OLE オー ト メ ーシ ョ ン オブ ジ ェ ク ト のレ ジ ス ト リ 情報の作成... 836 EAServer 上の Web デー タ ウ ィ ン ド ウ ........................................ 837 COM+/MTS または IIS 上の Web デー タ ウ ィ ン ド ウ ................... 838 Index............................................................................................................................................ 843 ア プ リ ケーシ ョ ン テ ク ニ ッ ク xvii xviii PowerBuilder 本書について 対象 と する読者 こ のマニ ュ アルは、PowerBuilder® に よ る ク ラ イ ア ン ト / サーバ ア プ リ ケーシ ョ ン、 分散アプ リ ケーシ ョ ン、 ま たは Web アプ リ ケー シ ョ ン開発に従事 し てい る 開発者を対象 と し てい ます。 こ のマニ ュ アルの使い方 こ のマ ニ ュ アルでは、 PowerBuilder ア プ リ ケーシ ョ ン と コ ン ポー ネ ン ト を 作成お よ び配布す る 際に使用す る プ ロ グ ラ ミ ン グ テ ク ニ ッ ク を紹介 し ま す。 こ こ では、 要件に最 も 適 し た方法を選択す る ためのア ド バ イ ス と と も に、 様々な一般的な アプ リ ケーシ ョ ン 機能を実装す る ための技術を紹介 し てい ます。 PowerBuilder には、 こ のマ ニ ュ アルで紹介す る 問題、 機能、 お よ びテ ク ニ ッ ク を具体例で示すサン プル アプ リ ケーシ ョ ン が付属 し てい ます。 PowerBuilder でサ ン プル アプ リ ケーシ ョ ン の コ ン ポー ネ ン ト を調べて、 コ ー ド の コ メ ン ト を読み、 実践的な作業例を通 じ て学習 し た内容を実際に試 し て く だ さ い。 サン プル アプ リ ケーシ ョ ン の使い方については、 第 1 章 「サン プ ル アプ リ ケーシ ョ ン の使い方」 を参照 し て く だ さ い。 関連マニ ュ アル PowerBuilder のすべてのマニュ ア ル一覧については、『PowerBuilder 入門』 マニ ュ アルを参照 し て く だ さ い。 そのほかの参考資料 製品に関す る そのほかの詳細情報については、 Sybase の テ ク ニ カ ル ラ イ ブ ラ リ CD、 お よ びテ ク ニ カル ラ イ ブ ラ リ 製品マニ ュ アル Web サ イ ト (英語) を参照 し て く だ さ い。 • ソ フ ト ウ ェ ア付属の テ ク ニ カル ラ イ ブ ラ リ CD には、 製品マ ニ ュ アルが含 ま れてい ま す。 製品マ ニ ュ アルは、 PDF 形式に て提供 し てい ます。 テ ク ニ カル ラ イ ブ ラ リ CD の使い方については、 テ ク ニ カル ラ イ ブ ラ リ CD 内の Readme.txt フ ァ イ ルを参照 し て く だ さ い。 • 表記規則 ア プ リ ケーシ ョ ン テ ク ニ ッ ク テ ク ニ カル ラ イ ブ ラ リ 製品マニ ュ アルの Web サ イ ト (英語) には、Product Manuals http://www.sybase.com/support/manuals/ か ら ア ク セ ス で き ます。 こ のマニ ュ アルでは、 以下の表記規則を使用 し ます。 xix 例 Retrieve と Update 説明 左記の フ ォ ン ト が説明文で使用 さ れて い る 場合、 以下を表す • コ マ ン ド 名、 関数名、 メ ソ ッ ド 名 • キーワー ド (true、 false、 null な ど) • デー タ 型 (integer、 char な ど) • データ ベース カ ラ ム名(emp_id、f_name な ど) 変数 (variable) ま たは フ ァ イ ル名 (filename) • ユーザ定義オブジ ェ ク ト (dw_emp、 w_main な ど) 説明文 と 構文説明で使用 さ れた場合、 斜体フ ォ ン ト は次のいずれか を表す • 変数 (myCounter な ど) • 代入が必要な入力テ キ ス ト 部分 (pblname.pbd な ど) [フ ァ イ ル|上書き 保存] dw_1.Update() • フ ァ イ ル名 と パ ス名 メ ニ ュ ー名 と メ ニ ュ ー項目は単純な テ キ ス ト で 表示 さ れ る 。「|」は、選択の移動の仕方 メ ニ ュ ー を示す。 た と えば、 [フ ァ イ ル|上書き 保存] は、 「 [フ ァ イ ル] メ ニ ュ ーか ら [上書 き 保存] を選 択す る 」 と 同義 左記の フ ォ ン ト は以下のいずれか を示す • ダ イ ア ロ グボ ッ ク ス ま たは コ マン ド ラ イ ンに 入力す る 情報 • サンプル ス ク リ プ ト の一部 • サンプル出力の一部 サポー ト について xx 製品に同梱 し てい る 「サポー ト ハン ド ブ ッ ク 」 を参照 し て く だ さ い。 PowerBuilder 第 1 部 ア プ リ ケーシ ョ ン テ ク ニ ッ ク の学習 PowerBuilder に 添 付 さ れ て い る サ ン プ ル ア プ リ ケ ー シ ョ ンの概要 と 、 こ れ ら のサン プルを使 っ て プ ロ グ ラ ミ ン グ テ ク ニ ッ ク を学習する方法について説明 し ます。 第 1 章 サン プ ル アプ リ ケーショ ン の使い方 こ の章について こ の章では、 PowerBuilder サ ン プル アプ リ ケーシ ョ ン の使い方に ついて説明 し ます。 内容 項目 サンプル アプ リ ケーシ ョ ンについて サンプル アプ リ ケーシ ョ ンの イ ン ス ト ール サンプル アプ リ ケーシ ョ ン を開 く Code Examples アプ リ ケーシ ョ ンの使い方 ページ 3 3 3 5 サン プル ア プ リ ケーシ ョ ンについて PowerBuilder には、 サ ン プルで使用 さ れてい る テ ク ニ ッ ク を学ん で活用で き る よ う に、 ソ ー ス コ ー ド 付 き のサ ン プル ア プ リ ケー シ ョ ン が用意 さ れてい ます。 サ ン プルには、 以下の 2 種類があ り ます。 • Web サ イ ト か ら ダ ウ ン ロ ー ド で き る サン プル • CD か ら イ ン ス ト ールで き る サン プル Web サイ ト のサン プル 最新の PowerBuilder サン プル アプ リ ケーシ ョ ン と ユーテ ィ リ テ ィ は、 PowerBuilder Samples and Utilities project http://powerbuilder.codeXchange.sybase.com/ の Sybase CodeXchange Web サ イ ト にあ り ます。 そのサ イ ト への リ ン ク は、 Windows の ス タ ー ト メ ニ ュ ー [プ ロ グ ラ ム| Sybase | PowerBuilder 9.0 | PB 9 コ ー ド サ ン プル] にあ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 3 サン プル ア プ リ ケーシ ョ ンについて MySybase に ロ グ イ ン し ていない場合には、 CodeXchange にア ク セ スす る ために Sybase Universal ロ グ イ ン ページの ロ グ イ ンす る 必要があ り ます。 MySybase ア カ ウ ン ト を持っ ていない場合には、 そのページか ら リ ン ク し てサ イ ン ア ッ プす る こ と がで き ま す。 MySybase は、 Sybase Web サ イ ト の個人ポー タ ルを無料で提供す る サービ ス です。 こ れ ら のサ ン プルは、 Sybase の社員やユーザに よ り 提供 さ れてお り 、 頻繁に更新 さ れ ま す。 PowerBuilder の特定の機能を使 う ス タ ン ド ア ロ ン アプ リ ケーシ ョ ン です。 PowerBuilder ネ イ テ ィ ブ イ ン タ フ ェース を 使っ た Web サービ ス の使用、 EJB ク ラ イ ア ン ト の作成、 ビ ジ ュ アルお よ び非ビ ジ ュ アル エ ク ス テ ン シ ョ ンの記述な ど、 現行の リ リ ース で導 入 さ れた新機能を含みます。 多 く のサ ン プルには、 そ こ で使われ る 機 能 と そのダ ウ ン ロ ー ド 方法お よ び使い方につい て説明 し た readme 文 書があ り ます。 CD 内のサン プル CD には 2 つのサン プルがあ り 、PowerBuilder の イ ン ス ト ール時に イ ン ス ト ールで き ます。 Code Examples PowerBuilder Code Examples アプ リ ケーシ ョ ンには、コ ーデ ィ ン グ テ ク ニ ッ ク の学習に活用で き る 多 く のサ ン プルが含ま れてい ます。 こ れ ら の サ ン プルは、 PowerBuilder の新旧機能 を 駆使 し た さ ま ざ ま な コ ー テ ィ ン グ テ ク ニ ッ ク の使い方を示す目的で特別に作成 さ れてい ます。 Web データ ウィ ンド ウ Web デー タ ウ ィ ン ド ウ テ ク ノ ロ ジ を 使用す る ア プ リ ケーシ ョ ン を 開 発す る には、EAServer にプ リ イ ン ス ト ール さ れてい る 汎用サーバ コ ン ポ ー ネ ン ト を 使 用 で き ま す。 こ の コ ン ポ ー ネ ン ト は、 Microsoft Component Object Model (COM) で使用す る DLL と し て提供 さ れ ます。 ま た、 サン プルの Web デー タ ウ ィ ン ド ウ PBL を モデル と し て、 独自の HTML ジ ェ ネ レー タ コ ン ポーネ ン ト を作成す る こ と も で き ます。 Web デー タ ウ ィ ン ド ウ につい て の詳細は、 『デー タ ウ ィ ン ド ウ プ ロ グ ラ マーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 4 PowerBuilder 第 1 章 サン プル ア プ リ ケーシ ョ ンの使い方 サン プル ア プ リ ケーシ ョ ンのイ ン ス ト ール CD か ら サン プルを イ ン ス ト ールす る には、PowerBuilder イ ン ス ト ール プ ロ グ ラ ム でセ ッ ト ア ッ プの種類 と し て [カ ス タ ム / フル] を選択 し 、 コ ン ポーネ ン ト の リ ス ト か ら 「Code Examples」 を 選択 し ま す。 Code Examples アプ リ ケーシ ョ ン を イ ン ス ト ールす る には、「Example アプ リ ケーシ ョ ン」 を選択 し ます。 Web デー タ ウ ィ ン ド ウ PBL を イ ン ス ト ー ルす る には、 「Web デー タ ウ ィ ン ド ウ 」 を選択 し ます。 ど ち ら のサ ン プル も 、 PowerBuilder 9.0 デ ィ レ ク ト リ の Code Examples サブデ ィ レ ク ト リ に イ ン ス ト ール さ れます。Code Examples アプ リ ケー シ ョ ン で は EAS Demo DB と い う サ ン プ ル Adaptive Server Anywhere デ ー タ ベ ー ス を 使 用 し ま す。 こ の デ ー タ ベ ー ス は、 Sybase¥Shared¥PowerBuilder デ ィ レ ク ト リ に イ ン ス ト ール さ れて い ま す。 Code Examples デ ィ レ ク ト リ ま たは EASDEMO9.DB フ ァ イ ルが見 つか ら ない場合、 サン プル アプ リ ケーシ ョ ンお よ びデー タ ベース が イ ン ス ト ール さ れていない こ と があ り ます。 サン プル ア プ リ ケーシ ョ ン を開 く サン プル アプ リ ケーシ ョ ン を開 く には、 アプ リ ケーシ ョ ン用の ワー ク ス ペー ス を 作成 し 、 そ の ア プ リ ケ ーシ ョ ン の タ ーゲ ッ ト を ワ ー ク ス ペース に追加す る 必要があ り ます。 アプ リ ケーシ ョ ンの タ ーゲ ッ ト フ ァ イ ルがない場合は、 ワー ク スペー ス に追加す る こ と がで き ます。 新規作成 ダ イ ア ロ グボ ッ ク ス の [ タ ー ゲ ッ ト ] タ ブか ら [既存のアプ リ ケーシ ョ ン] を選択 し ま す。 起動 さ れた ウ ィ ザー ド で PowerBuilder 9.0¥Code Examples フ ォ ルダに移動 し 、 学習 し たい ア プ リ ケーシ ョ ン が含 ま れて い る フ ォ ルダ と PBL を 拡張 表示 し て、 アプ リ ケーシ ョ ン を選択 し ます。 次節では、Code Examples アプ リ ケーシ ョ ン の開 き 方 と 実行方法を段階 を追っ て説明 し ます。 Code Examples ア プ リ ケーシ ョ ンの使い方 Code Examples アプ リ ケーシ ョ ンは開発環境か ら 実行 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 5 Code Examples ア プ リ ケーシ ョ ンの使い方 ❖ Code Example ア プ リ ケーシ ョ ン を実行するには 1 メ ニ ュ ー バーか ら [フ ァ イ ル|新規作成] を 選択 し 、 [ ワ ー ク ス ペース] タ ブか ら [ ワー ク スペース] を選択 し て、 [OK] を ク リ ッ ク し ます。 2 PowerBuilder 9.0¥Code Examples¥Example App フ ォ ルダに移動 し 、 ワー ク スペース の名前を入力 し て、 [保存] を ク リ ッ ク し ます。 3 作成 し た ワ ー ク スペース のポ ッ プア ッ プ メ ニ ュ ーか ら [ タ ーゲ ッ ト の追加] を選択 し 、PowerBuilder 9.0¥Code Examples¥Example App フ ォ ルダに移動 し 、 タ ーゲ ッ ト フ ァ イ ル 「PB Examples」 を選択 し て [開 く ] を ク リ ッ ク し ます。 タ ーゲ ッ ト を拡張表示す る と 、 PBL にアプ リ ケーシ ョ ン が含ま れ、 アプ リ ケーシ ョ ンがサポー ト す る PBL が ワ ー ク スペース に追加 さ れてい る こ と がわか り ます。 4 パ ワ ーバーの [実行] ボ タ ン を ク リ ッ ク し ます。 サン プルの参照 Code Examples アプ リ ケーシ ョ ン を開 く と 、 左側のペ イ ン に、 使用可能 なサ ン プル項目の ツ リ ー ビ ュ ーが表示 さ れ ま す。 こ の ツ リ ー ビ ュ ー は、 さ ら に展開す る こ と も で き ます。 中には、 複数の項目に表示 さ れ る サン プル も あ り ます。 た と えばビ ジネ ス ク ラ ス サ ンプルは、 継承 と ユーザ オブジ ェ ク ト の両方の項目に リ ス ト 表示 さ れ ます。 デー タ ス ト アやデー タ ウ ィ ン ド ウ な ど、 特定の機能の使い方 を 知 り たい場合は、 その項目を展開 し てサ ンプル名を調べて く だ さ い。 6 PowerBuilder 第 1 章 サン プル ア プ リ ケーシ ョ ンの使い方 左側のペ イ ン でサ ン プルを選択す る と 、 そのサ ン プルの説明 と 使い方 が右側に表示 さ れ ます。 サン プルの検索 PowerBuilder の特定のオブジ ェ ク ト ク ラ ス ま たは機能の使い方を知 り たい場合は、 [サ ン プル プ ロ グ ラ ム] ペ イ ン の項目 と その説明に よ っ てサ ン プルを検索で き ます。 特定の イ ベン ト 、 関数、 ま たはユーザ定 義オブジ ェ ク ト を使用す る サン プルを検索す る には、 [検索] ペ イ ン を 使用 し ます。 ❖ 関数、 イ ベン ト 、 またはオブ ジ ェ ク ト を検索するには 1 コ ー ド サン プルの メ イ ン ウ ィ ン ド ウ にあ る [検索] タ ブ を ク リ ッ ク し ます。 2 [検索対象] グループボ ッ ク ス の ラ ジオボ タ ン を選択 し ます。 3 ド ロ ッ プダ ウ ン リ ス ト ボ ッ ク ス で目的の項目 を選択 し 、 [検索開 始] ボ タ ン を ク リ ッ ク し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 7 Code Examples ア プ リ ケーシ ョ ンの使い方 検索対象の関数、 イ ベン ト 、 ま たはオブジ ェ ク ト を使用 し てい る サ ンプルの名前がすべて表示 さ れ ます。 サン プルの実行 と 調査 学習 し たい処理を実行す る サ ン プルが見つか っ た ら 、 そのサ ン プルを 実行 し て動作内容を調べ、 コ ー ド を参照 (必要であれば コ ピー も ) で き ます。 サン プルの実行 8 ハ イ ラ イ ト 表示 さ れたサ ン プルを実行す る には、 サ ン プルを ダブル ク リ ッ ク す る か ま たは [実行] を ク リ ッ ク し ます。サン プルの メ イ ン ウ ィ ン ド ウ にあ る [ヘルプ|現在のサ ン プルのヘルプ] ボ タ ン を ク リ ッ ク す る と 、 そのサ ン プルの使い方 と 動作内容に関す る ヘルプが表示 さ れ ます。 PowerBuilder 第 1 章 サン プル ア プ リ ケーシ ョ ンの使い方 コ ー ド の調査 サ ン プルに使用 さ れてい る すべてのオブジ ェ ク ト を参照す る には、 右 側のペ イ ン にあ る [関連オブジ ェ ク ト ] タ ブ を ク リ ッ ク し 、 プ ラ ス 記 号を ク リ ッ ク し て さ ら に詳 し い項目を表示 し ます。 ス ク リ プ ト ま たは関数のア イ コ ン を ダブル ク リ ッ ク し て、 コ ー ド を参 照 し ます。 開発環境でのサン プル の利用 Code Examples ア プ リ ケーシ ョ ン を実行 し た り サ ン プルの コ ー ド を参 照す る こ と に よ っ て、 多 く の情報を得 る こ と がで き ますが、 開発環境 でサ ン プル内のオブジ ェ ク ト を開けば、 さ ら に詳 し い情報を得 る こ と がで き ます。 た と えば、 ペ イ ン タ でオブジ ェ ク ト を開 く 、 ブ ラ ウ ザで継承階層を調 べ る 、 デバ ッ ガでサ ン プルを ワ ン ス テ ッ プずつ実行す る こ と な ど がで き ます。 さ ら に、 ラ イ ブ ラ リ ペ イ ン タ 内の自分のアプ リ ケーシ ョ ンに オブジ ェ ク ト を コ ピー し た り 、ス ク リ プ ト ビ ュ ーに コ ー ド フ ラ グ メ ン ト を コ ピーす る こ と も で き ます。 Code Examples アプリ ケーショ ンのラ イ ブラ リ は、 オブジェ ク ト 型を基準 にし て編成さ れていま す。 たと えば、 pbexamd1.pbl およ び pbexamd2.pbl はデー タ ウ ィ ン ド ウ オブジ ェ ク ト を含みます。 こ れに よ っ て、 こ のマ ニ ュ アルの後半でサ ン プル と し て紹介 さ れてい る オブジ ェ ク ト を容易 に見つけ る こ と がで き ます。 ラ イ ブ ラ リ ペ イ ン タ の リ ス ト ビ ュ ーのサ ン プル ラ イ ブ ラ リ を拡張表示す る と 、 各オブジ ェ ク ト の用途が表示 さ れ ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 9 Code Examples ア プ リ ケーシ ョ ンの使い方 10 PowerBuilder 第 2 部 言語テ ク ニ ッ ク PowerBuilder に よ る ア プ リ ケーシ ョ ン開発でのオブ ジ ェ ク ト 指向プ ロ グ ラ ミ ン グのテ ク ニ ッ ク と 、 PowerScript® 言語の使用方法について説明 し ます。 ClassDefinition オ ブ ジ ェ ク ト について も 説明 し ます。 第 2 章 オブ ジ ェ ク ト 指向プ ロ グラ ミ ン グ こ の章について こ の章では、 PowerBuilder におけ る オブジ ェ ク ト 指向プ ロ グ ラ ミ ン グのテ ク ニ ッ ク について説明 し ます。 内容 項目 用語の確認 PowerBuilder のテ ク ニ ッ ク そのほかのテ ク ニ ッ ク ページ 13 15 19 用語の確認 ク ラ ス、 プ ロパテ ィ 、 メ ソッド オブジ ェ ク ト 指向プ ロ グ ラ ミ ン グでは、 アプ リ ケーシ ョ ン処理を 実行す る ための再利用可能な ク ラ ス を作成 し ます。ク ラ ス には、ク ラ ス の動作を定義す る プ ロ パテ ィ と メ ソ ッ ド があ り ます。 アプ リ ケーシ ョ ン処理を実行す る ためには、 ク ラ ス の イ ン ス タ ン ス を作 成 し ま す。 PowerBuilder では、 以下の よ う な コ ン セプ ト を実装 し てい ます。 • PowerBuilder オブ ジ ェ ク ト (ウ ィ ン ド ウ オ ブ ジ ェ ク ト 、 メ ニ ュ ー オブ ジ ェ ク ト 、 ウ ィ ン ド ウ コ ン ト ロ ール オブ ジ ェ ク ト 、 ユーザ オブジ ェ ク ト な ど) • プ ロパテ ィ • メソッド ク ラス オブジ ェ ク ト 変数 と イ ン ス タ ン ス変数 イ ベン ト と 関数 こ の章の後半で、 こ れ ら の PowerBuilder の用語を使用 し ます。 基本原則 オブジ ェ ク ト 指向のプ ロ グ ラ ミ ン グ ツールは、 オブジ ェ ク ト 指向 の 3 つの基本原則であ る 、 継承、 カプセル化、 多相性 (ポ リ モ フ ィ ズ ム) を サポー ト し ます。 継承 と は、 オブ ジ ェ ク ト を 既存のオブ ジ ェ ク ト か ら 派生 さ せ、既存オブジ ェ ク ト の ビ ジ ュ アル コ ン ポーネ ン ト 、デー タ 、 コ ー ド にア ク セ ス す る こ と です。 継承を使用す る と 、 コ ーデ ィ ン グ時 間を短縮 し 、 コ ー ド の再利用性や一貫性を向上す る こ と がで き ま す。 子孫オブジ ェ ク ト は、 サブ ク ラ ス と も 呼ばれます。 継承 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 13 用語の確認 カ プ セル化 カ プ セル化は、 オブ ジ ェ ク ト にデー タ と コ ー ド を 格納 し て、 外部か ら の ア ク セ ス を 必要で あれば制限 し ま す。 カ プセル化は、 情報の隠蔽 と も 呼ばれ ます。PowerBuilder は、ア ク セ ス レベルやス コ ー プな ど で、 カ プセル化を可能に し てい ま す。 ただ し 、 PowerBuilder 自 身はカプセル化を要求 し た り 、 自動的に強い る こ と は し ません。 多相性 (ポ リ モ フ ィ ズム) 同 じ 名前の関数は、 その関数が定義 さ れてい る オブジ ェ ク ト に よ っ て、異な る 動 き を し ます。多相性は、 アプ リ ケー シ ョ ン全体にわた っ て、 ま たすべてのオブジ ェ ク ト 内において、 一貫 性のあ る イ ン タ フ ェ ース の提供を可能に し ます。 ビ ジ ュ アル オブ ジ ェ クト 現在の多 く のアプ リ ケーシ ョ ンは、 ウ ィ ン ド ウ 、 メ ニ ュ ー、 ビ ジ ュ ア ル ユーザ オブジ ェ ク ト な ど の ビ ジ ュ アル オブジ ェ ク ト のオブジ ェ ク ト 指向の機能を頻繁に使用 し てい ます。 こ れに よ り 、 アプ リ ケーシ ョ ンは一貫性があ り 、 統一感のあ る ル ッ ク ア ン ド フ ィ ール と な り ます。 非ビ ジ ュ アル オブ ジェク ト PowerBuilder のオブジ ェ ク ト 指向を十分に活用す る ためには、 アプ リ ケーシ ョ ンに ク ラ ス ユーザ オブジ ェ ク ト (非ビ ジ ュ アル ユーザ オブ ジ ェ ク ト ) を実装 し ます。 PowerBuilder の組み込みシ ス テ ム オブ ジ ェ ク ト (Transaction オブジ ェ ク ト 、 Message オブジ ェ ク ト 、 Error オ ブジ ェ ク ト な ど) か ら 、 その定義を継承 し ます。 Code Examples のサン プル ア プ リ ケーシ ョ ン での nvo_transaction の ト ラ ン ザ ク シ ョ ン オブ ジ ェ ク ト は、サブ ク ラ ス化 さ れた標準 ク ラ ス ユーザ オブジ ェ ク ト の例 です。カ ス タ マ イ ズ さ れた標準 ク ラ ス ユーザ オブジ ェ ク ト を作成すれ ば、 PowerBuilder の組み込みシ ス テ ム オブジ ェ ク ト を拡張で き ます。 標準 ク ラ ス ユーザ オブ ジ ェ ク ト PowerBuilder の NonVisualObject ク ラ ス か ら 定義を継承 し たオブジ ェ ク ト です。カ ス タ ム ク ラ ス ユーザ オ ブジ ェ ク ト は、 デー タ と コ ー ド がカプセル化 さ れてい ます。 こ の タ イ プの ク ラ ス ユーザ オブジ ェ ク ト は、何 も 定義 さ れていない状態か ら オ ブジ ェ ク ト ク ラ ス を定義す る こ と がで き ます。 Code Examples のサ ン プル アプ リ ケーシ ョ ン でのユーザ オブジ ェ ク ト u_business_object は、 カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト の一例です。PowerBuilder のオブ ジ ェ ク ト 指向を最大限に活用す る ためには、カ ス タ ム ク ラ ス ユーザ オ ブジ ェ ク ト を使用 し な ければな り ません。 典型的な用途 と し ては、 以 下の よ う な も のがあ り ます。 カ ス タ ム ク ラ ス ユーザ オブ ジ ェ ク ト • 14 グローバル変数コ ン テナ カ ス タ ム ク ラ ス ユーザ オ ブ ジ ェ ク ト に は、 アプ リ ケーシ ョ ン のすべてのオブジ ェ ク ト で使用で き る 変数 と 関数が あ り ま す。 ア プ リ ケーシ ョ ン で適切な場合に、 直接 ま た はオブジ ェ ク ト 関数に よ っ て ア ク セ ス で き る よ う に、 こ れ ら の変 数を カプセル化 し ます。 PowerBuilder 第 2 章 オブ ジ ェ ク ト 指向プ ロ グ ラ ミ ング カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト には、 特定の コ ン テ キ ス ト (デー タ ウ ィ ン ド ウ オブジ ェ ク ト な ど) やグ ロ ーバルな コ ン テ キ ス ト (文字列操作を行 う 関数の コ レ ク シ ョ ン な ど) に役立つ関数や変数があ り ます。 • サービ ス オブ ジ ェ ク ト • ビ ジネス ルール カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト には、 ビ ジ ネ ス ルールを実装す る 関数や変数があ り ます。 すべての ビ ジネ ス ルールに対応 し た 1 つの オ ブ ジ ェ ク ト を 作成す る こ と が で き ま す。 ま たは、 ビ ジネ ス ルールの関連す る グループに対応 し た複数 のオブジ ェ ク ト を作成す る こ と も で き ます。 • カ ス タ ム ク ラ ス ユーザ オブ ジ ェ ク ト に は、 サーバ上 ま たはサーバの ク ラ ス タ 上で実行す る 関数が あ り ま す。 分散 コ ン ピ ュ ーテ ィ ング 詳細については、 第 6 部 「分散処理アプ リ ケーシ ョ ン の開発」 を 参照 し て く だ さ い。 PowerBuilder のテ ク ニ ッ ク PowerBuilder は、 ビ ジ ュ アル オブジ ェ ク ト と ク ラ ス オブジ ェ ク ト の継 承、 カプセル化、 多相性を全面的にサポー ト し てい ます。 再利用可能なオブ ジ ェ ク ト の作成 ほ と ん ど の場合、 再利用可能なオブジ ェ ク ト を開発す る 人 と 、 アプ リ ケーシ ョ ン で再利用可能なオブジ ェ ク ト を使用す る 人は、 同 じ 人では あ り ません。 こ こ では、 再利用可能なオブジ ェ ク ト の定義 と 作成の仕 方について説明 し ます。 使用法については説明 し ません。 継承の実装 PowerBuilder では、 子孫オブジ ェ ク ト を容易に作成す る こ と がで き ま す。 指定す る 先祖オブジ ェ ク ト か ら 継承す る ために、 ウ ィ ン ド ウ ペ イ ン タ 、 ユーザ オブジ ェ ク ト ペ イ ン タ 、 メ ニ ュ ー ペ イ ン タ を使用 し て、 PowerBuilder は継承を実装 し ます。 ビ ジュ アル オブジェ ク ト の継承の例については、 Code Examples サ ンプ ル ア プ リ ケーシ ョ ン での w_employee ウ ィ ン ド ウ と u_employee_object を参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 15 PowerBuilder のテ ク ニ ッ ク カ ス タ ム ク ラ ス ユーザ オブ ジ ェ ク ト の継承 を 使用す る 1 つの例 と し て は、 基本サー ビ ス を 実行す る 先祖 サービ ス オブジ ェ ク ト と 、い く つかの子孫サービ ス オブジ ェ ク ト を作 成す る ケー ス が挙げ ら れ ます。 子孫オブジ ェ ク ト は、 先祖のサービ ス にア ク セ ス を持つ と と も に、 子孫特有のサービ ス も 実行 し ます。 先祖サービ ス オブ ジ ェ ク ト の例 図 2-1: 先祖サービ ス オブ ジ ェ ク ト カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト の継承を使用す る 別の例 と し ては、 すべてのプ ラ ッ ト フ ォ ーム用の関 数を持つ ク ラ ス を先祖オブジ ェ ク ト と し て作成 し 、 プ ラ ッ ト フ ォ ーム 特定の関数を実行す る ク ラ ス を子孫オブジ ェ ク ト と し て作成す る こ と です。 こ の場合、 先祖オブジ ェ ク ト をデー タ 型 と し て子孫オブジ ェ ク ト の イ ン ス タ ン ス を作成で き る よ う に、 先祖オブジ ェ ク ト は仮想関数 (例では uf_change_dir) を持ち ます。 先祖オブ ジ ェ ク ト の仮想関数の例 図 2-2: 先祖オブ ジ ェ ク ト の仮想関数 仮想関数の詳細については、 19 ページの 「そのほかのテ ク ニ ッ ク 」 を 参照 し て く だ さ い。 カ プ セル化の実装 16 カプセル化は、 プ ラ イ ベー ト (Private) ま たはプ ロ テ ク ト (Protected) と し て イ ン ス タ ン ス変数を宣言す る こ と に よ っ て、 外部か ら のア ク セ ス を制限 し 、 オブジ ェ ク ト のデー タ を外部か ら 隔離す る こ と がで き ま す。 次に、 イ ン ス タ ン ス 変数への選択的な ア ク セ ス を 提供す る ため、 オブジ ェ ク ト 関数を記述 し ます。 PowerBuilder 第 2 章 オブ ジ ェ ク ト 指向プ ロ グ ラ ミ ング 処理 と デー タ を カ プ セ ル化す る 1 つの ア プ ロ ーチ は、 以下の と お り です。 1 つのア プ ローチ • 外部への ア ク セ ス 程度に よ り 、パブ リ ッ ク (Public)、プ ラ イ ベー ト (Private)、ま たはプ ロ テ ク ト (Protected) と し て イ ン ス タ ン ス 変数を 定義 し ま す。完全に カ プセル化す る には、プ ラ イ ベー ト (Private)ま たはプ ロ テ ク ト (Protected) と し て イ ン ス タ ン ス変数を定義 し ます。 • 処理の実行や、 オブジ ェ ク ト のデー タ へのア ク セ ス を提供す る に は、 オブジ ェ ク ト 関数を定義 し ます。 表 2-1: オブ ジ ェ ク ト 関数の定義 処理内容 処理の実行 関数 uf_do_operation イ ン ス タ ン ス変数 の変更 uf_set_variablename イ ン ス タ ン ス変数 の読み込み (オプシ ョ ン) Boolean 型の イ ン ス タ ン ス変数の読 み込み uf_get_variablename uf_is_variablename 例 デー タ ベース か ら 行を検索す る uf_do_retrieve 関数 String 型の変数 is_style の値を 変更する uf_set_style 関数 String 型の変数 is_style の値を 返す uf_get_style 関数 Boolean 型の変数 ib_protected の値を返す uf_is_protected 関数 処理 と デー タ を カ プ セル化す る た めの別の ア プ ロ ー チは、 実行す る ア ク シ ョ ン を開発者が指定す る ための、 単一のエ ン ト リ ポ イ ン ト を用意す る こ と です。 別のア プ ローチ • 外部へのア ク セ ス程度に よ り 、プ ラ イ ベー ト (Private)ま たはプ ロ テ ク ト (Protected) と し て イ ン ス タ ン ス変数を定義 し ます。 • 処理 を 実行す る た め の、プ ラ イ ベー ト (Private)ま た はプ ロ テ ク ト (Protected)のオブジ ェ ク ト 関数を定義 し ます。 • 実行す る 処理の種類を示す引数を持つ、1 つのパブ リ ッ ク 関数を定 義 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 17 PowerBuilder のテ ク ニ ッ ク 図 2-3: カ プ セル化のためのパブ リ ッ ク関数の定義 例については、 Code Examples サン プル アプ リ ケーシ ョ ン のユーザ オ ブジ ェ ク ト u_sales_order を参照 し て く だ さ い。 分散 コ ンポーネ ン ト プロ ジェ ク ト ペイ ンタ で EAServer コ ンポーネント または COM/MTS/COM+ コ ン ポーネ ン ト を 生成す る と 、 生成 さ れた コ ン ポーネ ン ト の イ ン タ フ ェ ース でパブ リ ッ ク 関数を使用で き る よ う にな り 、 パブ リ ッ ク イ ン ス タ ン ス 変数を使用可能にす る よ う 選択で き ます。 プ ラ イ ベー ト と プ ロ テ ク ト の関数 と 変数は、 生成 さ れた コ ン ポーネ ン ト の イ ン タ フ ェ ー ス にはエ ク ス ポーズ さ れ ません。 詳細については、 第 6 部 「分散処理アプ リ ケーシ ョ ン の開発」 を参照 し て く だ さ い。 多相性の実装 多相性はプ ロ グ ラ ミ ン グ言語の機能です。こ の機能を使用す る と 、デー タ 型や ク ラ ス に応 じ てオブジ ェ ク ト を処理で き ます。 多相性 と は、 同 じ 名前の関数が、 参照 さ れてい る オブジ ェ ク ト に よ り 、 異な る 動作を す る こ と を意味 し ます。 多相性の正確な定義にはい ろ い ろ な議論があ り ますが、 以下の よ う に考え る と わか り やすいで し ょ う 。 独立 し たオブジ ェ ク ト 間の多相性 (Operational polymorphism) 関連のな い別々のオブジ ェ ク ト に、 同 じ 名前の関数が定義 さ れ る こ と があ り ま す。 それぞれの関数は、 そのオブジ ェ ク ト の種類に よ り 適切な処理を 実行 し ます。 18 PowerBuilder 第 2 章 オブ ジ ェ ク ト 指向プ ロ グ ラ ミ ング 図 2-4: 独立 し たオブ ジ ェ ク ト 間の多相性 (Operational polymorphism) 例については、 Code Example サ ン プル アプ リ ケーシ ョ ン のユーザ オ ブジ ェ ク ト u_external_functions と その子孫を参照 し て く だ さ い。 継承チェ ー ン内の個々のオブジ ェ ク ト は、 同 じ 名前で関数を定義で き ます。 継承 し たオブジェ ク ト 間の多相性(Inclusional polymorphism) 継承 し たオブジ ェ ク ト 間の多相性に よ っ て、 現行のオブジ ェ ク ト が継 承階層の ど こ に適合す る かに基づいて、 ど の継承チ ェ ーン内の関数を 実行す る かが決定 さ れます。子孫オブジ ェ ク ト の関数は、先祖オブジ ェ ク ト の関数を上書 き し て実行 し ます。 図 2-5: 継承 し たオブ ジ ェ ク ト 間の多相性 (Inclusional polymorphism) 例については、 Code Examples サ ンプル アプ リ ケーシ ョ ンのユーザ オ ブジ ェ ク ト u_employee_object を参照 し て く だ さ い。 そのほかのテ ク ニ ッ ク PowerBuilder では、 さ ま ざ ま なオブジ ェ ク ト 指向のテ ク ニ ッ ク を実装 で き ま す。 こ の節では、 PowerBuilder に関連す る い く つかのテ ク ニ ッ ク について説明 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 19 そのほかのテ ク ニ ッ ク 関数の多重定義の使い 方 関数の多重定義では、 子孫関数 (ま たは同一オブジ ェ ク ト 内の同 じ 名 前の関数) に、 引数の数や引数のデー タ 型が異な る も のが あ り ま す。 PowerBuilder は、 関数の呼び出 し で指定 さ れた引数の数 と 引数のデー タ 型を基に、 ど の子孫関数を実行す る か を決定 し ます。 図 2-6: 関数の多重定義 グローバル関数 グ ロ ーバル関数は多重定義で き ません。 関数の動的呼び出 し と 静的呼び出 し アプ リ ケーシ ョ ン か ら 、 ク ロ ス プ ラ ッ ト フ ォ ーム に依存す る 部分 を 取 り 除いた場合、 特定のプ ラ ッ ト フ ォ ーム ご と に、 別々の子孫オブジ ェ ク ト を作成 し ます。 アプ リ ケーシ ョ ンは、 動的に プ ラ ッ ト フ ォームに依存す る 子孫関数を呼び出 し ます。 関数の動的呼び出 し 図 2-7: 関数の動的呼び出 し 20 PowerBuilder 第 2 章 オブ ジ ェ ク ト 指向プ ロ グ ラ ミ ング 以下の例で示す よ う に、 実行時に適切なオブジ ェ ク ト の イ ン ス タ ン ス を作成 し ます。 // 以下のス ク リ プ ト は、 動的 と 静的な両方の // 関数の呼び出 し に使用で き ます。 // 変数は、 イ ン ス タ ン ス変数 と し ます。 u_platform iuo_platform Environment ienv_env ... GetEnvironment(ienv_env) choose case ienv_env.ostype case windows! iuo_platform = CREATE u_platform_win case windowsnt! iuo_platform = CREATE u_platform_win case else iuo_platform = CREATE u_platform_unix end choose 関数の動的呼び出 し は柔軟性があ り ますが、 パ フ ォ ーマ ン ス を悪 く し ます。 関数の静的呼び出 し パ フ ォ ーマ ン ス を良 く す る ためには、 関数の静的 呼び出 し を用い る こ と をお勧め し ます。 ただ し 、 CREATE 文で指定 し た オブジ ェ ク ト デー タ 型 と 異な る デー タ 型の参照変数を使用 し て、 オブ ジ ェ ク ト にア ク セ スす る こ と も で き ます。 図 2-8: 関数の静的呼び出 し 関数の静的呼び出 し を使用す る と き は、 先祖関数のデフ ォ ル ト の処理 内容を定義 し なければな り ません。 先祖関数は、 エ ラ ー値 (た と えば、 -1) を返 し て、 少な く と も 1 つの子孫関数に上書 き さ れ ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 21 そのほかのテ ク ニ ッ ク 図 2-9: 子孫関数で上書き さ れる先祖関数 先祖オブジ ェ ク ト の関数にデフ ォ ル ト の処理を定義すれば、 関数の静 的呼び出 し のパ フ ォ ーマ ン ス が得 ら れ る と と も に、 プ ラ ッ ト フ ォ ーム に依存 し ないですむ よ う にな り ます。 処理の代行は、 オブジ ェ ク ト がほかのオブジ ェ ク ト のために処理を代 行す る と き に、 発生 し ます。 処理の代行 (delegation) の使い 方 従属関係 (aggregate relationship) 従属関係 (一体関係 と 呼ばれ る こ と も あ る ) では、 (オーナ オブジ ェ ク ト と 呼ばれ る ) オブジ ェ ク ト は、 そ のオブ ジ ェ ク ト の種類の た めにデザ イ ン さ れた サー ビ ス オブ ジ ェ ク ト に関連付け ら れます。 た と えば、 デー タ ウ ィ ン ド ウ オブジ ェ ク ト で行の選択を行 う サービ ス オブジ ェ ク ト を作成で き ます。 こ の場合、 デー タ ウ ィ ン ド ウ オブジ ェ ク ト の Clicked イ ベン ト に、行選択オブジ ェ ク ト を呼び出すス ク リ プ ト を記述 し ます。 ❖ オブ ジ ェ ク ト を従属関係で使用するには 1 サービ ス オブジ ェ ク ト を作成 し ます ( こ の例では u_sort_dw)。 2 オーナ ( こ の例ではデー タ ウ ィ ン ド ウ コ ン ト ロ ール) に イ ン ス タ ン ス変数 (参照変数 と も 呼ばれ る ) を宣言 し ます。 u_sort_dw iuo_sort 3 サービ ス オブジ ェ ク ト の イ ン ス タ ン ス を作成す る ため、 オーナ オ ブジ ェ ク ト に ス ク リ プ ト を記述 し ます。 iuo_sort = CREATE u_sort_dw 22 PowerBuilder 第 2 章 オブ ジ ェ ク ト 指向プ ロ グ ラ ミ ング 4 サービ ス オブジ ェ ク ト の イ ベン ト や関数を呼び出すために、 オー ナの シ ス テ ム イ ベ ン ト ま たはユーザ イ ベン ト に ス ク リ プ ト を 記 述 し ます。 次の例は、 デー タ ウ ィ ン ド ウ コ ン ト ロ ールのユーザ イ ベン ト ue_sort に記述す る ス ク リ プ ト を示 し ます。 IF IsValid(iuo_sort) THEN Return iuo_sort.uf_sort() ELSE Return -1 END IF 5 オーナ オブ ジ ェ ク ト のユーザ イ ベ ン ト を 呼び出す ス ク リ プ ト を 記述 し ます。 た と えば、 デー タ ウ ィ ン ド ウ コ ン ト ロ ールのユーザ イ ベン ト ue_sort を呼び出す、 コ マ ン ド ボ タ ン ま たは [編集| ソ ー ト ] な ど の メ ニ ュ ー項目を作成で き ます。 6 サービ ス オブジ ェ ク ト の イ ン ス タ ン ス を破棄す る ための ス ク リ プ ト を オーナ オブジ ェ ク ト の Destructor イ ベン ト に記述 し ます。 IF IsValid(iuo_sort) THEN DESTROY iuo_sort END IF 独立関係 (associative relationship) 独立関係で は、 オ ブ ジ ェ ク ト は、 特定の種類の処理 を 実行す る ためのサー ビ ス オブ ジ ェ ク ト を 関連付 け ます。 た と えば、 ど のアプ リ ケーシ ョ ン のオブジ ェ ク ト か ら で も 使用で き る よ う な、 文字列操作を行 う サービ ス オブジ ェ ク ト を作成で き ます。 独立関係のオブジ ェ ク ト を実装す る 操作手順は、従属関係 と 同 じ です。 ユーザ オブ ジ ェ ク ト の構造体 と し ての使い 方 ユーザ オブ ジ ェ ク ト の AutoInstantiate プ ロ パテ ィ を 有効に し た場合、 ユーザ オブジ ェ ク ト の イ ン ス タ ン ス のほかに、ユーザ オブジ ェ ク ト が 宣言 さ れてい る オブジ ェ ク ト 、 イ ベン ト 、 ま たは関数の イ ン ス タ ン ス が生成 さ れ ます。 ま た、 ユーザ オブジ ェ ク ト の イ ン ス タ ン ス変数を宣 言す る こ と も で き ます。 こ れ ら の 2 つの機能を利用 し て、 構造体 と し て機能す る ユーザ オブジ ェ ク ト を作成で き ます。 こ の よ う なユーザ オ ブジ ェ ク ト を構造体 と し て使用す る 利点 と し ては、 以下の も のがあ り ます。 • 子孫オブジ ェ ク ト を作成 し て拡張で き る • 一度にすべての構造体にア ク セ スす る 関数を作成で き る • 特定の イ ン ス タ ン ス 変数へのア ク セ ス を制限す る ためにア ク セ ス 指定子を使用で き る ア プ リ ケーシ ョ ン テ ク ニ ッ ク 23 そのほかのテ ク ニ ッ ク ❖ 構造体 と し て使用 さ れる カ ス タ ム ク ラ ス ユーザ オブ ジ ェ ク ト を作成するには 1 イ ン ス タ ン ス変数だけ を定義 し たユーザ オブジ ェ ク ト を作成 し ま す。 2 [全般] プ ロ パテ ィ ページの [ イ ン ス タ ン ス の自動生成] を オ ン に し て、 ユーザ オブジ ェ ク ト の AutoInstantiate プ ロ パテ ィ を有効に し ます。 3 オブジ ェ ク ト 、 関数、 ま たは イ ベン ト で、 ユーザ オブジ ェ ク ト を 宣言 し ます。 PowerBuilder は、 オブジ ェ ク ト 、 イ ベン ト 、 ま たは関数が作成 さ れ た と き に、 ユーザ オブジ ェ ク ト を生成 し ます。 ま た、 オブジ ェ ク ト が破棄 さ れ る か、イ ベン ト や関数が終了す る と 、ユーザ オブジ ェ ク ト を破棄 し ます。 デー タ ス ト ア オブ ジ ェ ク ト のサブ ク ラ ス 化 多 く のアプ リ ケーシ ョ ン では、標準のデー タ ウ ィ ン ド ウ ウ ィ ン ド ウ コ ン ト ロ ールではな く 、デー タ ウ ィ ン ド ウ のビ ジ ュ アル ユーザ オブジ ェ ク ト を使用 し ます。 こ れを使用す る と 、 エ ラ ー チ ェ ッ ク やアプ リ ケー シ ョ ン固有のデー タ ウ ィ ン ド ウ の動作を標準化で き ます。 チ ュ ー ト リ アル ラ イ ブ ラ リ TUTOR_PB.PBL にあ る デー タ ウ ィ ン ド ウ 型の ビ ジ ュ アル ユーザ オブジ ェ ク ト u_dwstandard は、その よ う なオブジ ェ ク ト の 一例です。 デー タ ス ト ア は、非表示のデー タ ウ ィ ン ド ウ コ ン ト ロ ール と し て機能 し ま す。 同 じ ア プ リ ケーシ ョ ン や一貫性 を 必要 と す る 多 く の も のは、 デー タ ウ ィ ン ド ウ コ ン ト ロ ール と 同様に デー タ ス ト ア に も 適用 さ れ ます。デー タ ス ト ア に対す る エ ラ ー チ ェ ッ ク やアプ リ ケーシ ョ ン特有 の動作形態を実装す る と き は、 デー タ ス ト ア の標準 ク ラ ス ユーザ オ ブジ ェ ク ト を作成す る こ と を考慮 し ます。 24 PowerBuilder 第 3 章 PowerScript について の特別な ト ピッ ク こ の章について こ の章では、 PowerScript 言語要素のアプ リ ケーシ ョ ン での使い方 について説明 し ます。 内容 項目 ド ッ ト 表記 定数の宣言 イ ン ス タ ン ス変数のア ク セ ス の制御 名前の重複の解決 先祖ス ク リ プ ト か ら の戻 り 値 関数 と イ ベン ト の引数の型 先祖変数 と 子孫変数 デー タ ウ ィ ン ド ウ と 外部オブジ ェ ク ト におけ る 式の最適化 PowerBuilder での例外処理 ガベージ コ レ ク シ ョ ン と メ モ リ 管理 効率的な コ ンパ イ ル と パフ ォーマ ン ス テ キ ス ト フ ァ イ ル と バ イ ナ リ フ ァ イ ルの読み書 き ページ 25 30 30 31 33 34 35 38 39 49 53 53 ド ッ ト 表記 ド ッ ト 表記 (.) を使用す る と 、 参照先の項目 ( イ ン ス タ ン ス変数、 プ ロ パテ ィ 、 イ ベン ト 、 関数) を、 その項目を所有す る オブジ ェ ク ト で修飾で き ます。 ド ッ ト 表記はオブジ ェ ク ト に使用 し ま す。 グ ロ ーバル変数や関数 はオブジ ェ ク ト と は独立 し て存在す る ため、 ド ッ ト 表記を使用 し ません。共有変数に も ド ッ ト 表記を使用す る こ と はあ り ません。共 有変数は、 オブジ ェ ク ト イ ン ス タ ン ス ではな く オブジ ェ ク ト ク ラ ス に属す る か ら です。 参照の修飾 ア プ リ ケーシ ョ ン テ ク ニ ッ ク ド ッ ト 表記では、 使用す る 項目を オブジ ェ ク ト 変数名で修飾 し ま す。 25 ド ッ ト 表記 objectvariable.item オブジ ェ ク ト 変数名は、 プ ロ パテ ィ ま たはそのほかの項目の所有者を 識別す る 修飾子です。 親修飾子を追加する オブジ ェ ク ト を完全に識別す る には、 ド ッ ト 修飾 子を追加 し て、 オブジ ェ ク ト の親、 その ま た親 と い う 具合に指定 し て い き ます。 parent.objectvariable.item 親 オブジ ェ ク ト は子オブジ ェ ク ト を包含 し ます。 こ れは祖先 と 子孫の 関係ではあ り ません。 た と えば、 ウ ィ ン ド ウ は コ ン ト ロ ールの親です。 タ ブ コ ン ト ロ ールは、その中にあ る タ ブ ページの親です。 メ ニ ュ ー オ ブジ ェ ク ト は、 その メ ニ ュ ーの項目 と な っ てい る メ ニ ュ ー オブジ ェ ク ト の親です。 複数の親レ ベル 親修飾子は ア プ リ ケーシ ョ ン レ ベル ま で指定で き ま す。 ただ し 、 通常は ウ ィ ン ド ウ レベルま で指定すれば十分です。 た と えば、 あ る タ ブ ページに あ る デー タ ウ ィ ン ド ウ コ ン ト ロ ールの Retrieve 関数を呼び出すには、 次の よ う に関数名を修飾 し ます。 w_choice.tab_alpha.tabpage_a.dw_names.Retrieve() メ ニ ュ ー オブ ジ ェ ク ト には複数の修飾子が必要に な る こ と が よ く あ り ま す。 た と え ば、 w_main ウ ィ ン ド ウ に メ ニ ュ ー オ ブ ジ ェ ク ト m_mymenu が含ま れてお り 、 その中の [フ ァ イ ル] メ ニ ュ ーに [開 く ] と い う 項目があ る と し ます。 こ の [開 く ] 項目の Selected イ ベン ト を 起動す る には、 次の よ う に指定 し ます。 w_main.m_mymenu.m_file.m_open.EVENT Selected() こ の よ う に、 名前 の 修飾は、 特 に タ ブ コ ン ト ロ ール に 含 ま れ る メ ニ ュ ーや タ ブ ページでは、 複雑にな り ます。 オブジ ェ ク ト 、 関数、 イ ベン ト 、 ま たはプ ロ パテ ィ を識別 す る のに必要なだけの修飾子を指定す る 必要があ り ます。 修飾子の数 親オブジ ェ ク ト は、 自分に含ま れてい る オブジ ェ ク ト を認識 し てい ま す。 ウ ィ ン ド ウ の ス ク リ プ ト 内では、 その ウ ィ ン ド ウ に含ま れ る コ ン ト ロ ールの名前を修飾す る 必要はあ り ません。 ま た、 各 コ ン ト ロ ール の ス ク リ プ ト では、 その ウ ィ ン ド ウ 内のほかの コ ン ト ロ ールを修飾子 な し で参照で き ます。 た と え ば、 w_main ウ ィ ン ド ウ に、 デー タ ウ ィ ン ド ウ コ ン ト ロ ール dw_data と コ マ ン ド ボ タ ン コ ン ト ロ ール cb_close が含まれてい る 場合、 こ の コ マ ン ド ボ タ ン コ ン ト ロ ールの ス ク リ プ ト は、 デー タ ウ ィ ン ド ウ コ ン ト ロ ールを次の よ う に修飾子な し で参照で き ます。 26 PowerBuilder 第 3 章 PowerScript についての特別な ト ピ ッ ク dw_data.AcceptText() dw_data.Update() こ の デー タ ウ ィ ン ド ウ コ ン ト ロ ールを別の ウ ィ ン ド ウ ま たはユーザ オ ブジ ェ ク ト 内の ス ク リ プ ト で参照す る 場合は、 次の よ う に ウ ィ ン ド ウ 名で修飾す る 必要があ り ます。 w_main.dw_data.AcceptText() オブ ジ ェ ク ト の参照 オブジ ェ ク ト 自身の ス ク リ プ ト 内でそのオブジ ェ ク ト の要素を修飾す る には、 次の 3 つの方法があ り ます。 • 修飾 し ない li_index = SelectItem(5) 未修飾の名前は明確でないため、 同名の ロ ーカル ま たはグ ロ ーバ ルの変数や関数が存在す る と 名前を一意に特定で き ない こ と が あ り ます。 • オブジ ェ ク ト 名で修飾す る li_index = lb_choices.SelectItem(5) オブジ ェ ク ト 自身の ス ク リ プ ト 内でそのオブジ ェ ク ト の名前を指 定す る のは不必要な指定です。 • オブジ ェ ク ト への汎用的な参照で修飾す る li_index = This.SelectItem(5) 代名詞 This は、 その項目を所有す る オブジ ェ ク ト に属す る こ と を 示 し ます。 This 代名詞 オブジ ェ ク ト の ス ク リ プ ト では、This を所有オブジ ェ ク ト への汎用的な参照 と し て使用で き ます。 This. プ ロパテ ィ This. 関数 プ ロ パテ ィ や関数は ス ク リ プ ト 内で何の修飾子 も 付けずに使用で き ま すが、 そ う す る と 読む人に よ っ ては、 そのプ ロ パテ ィ ま たは関数が特 定のオブジ ェ ク ト に属 し てい る こ と に気づかない こ と があ り ます。This を使用 し た ス ク リ プ ト は、 オブジ ェ ク ト の名前を変更 し て も その ま ま 使え ます。 し たが っ て、 ス ク リ プ ト を少ない編集作業で再利用で き ま す。 This を単独で使用す る と 、現在のオブジ ェ ク ト への参照にな り ます。た と えば、別のユーザ オブジ ェ ク ト 内の関数にデー タ ウ ィ ン ド ウ コ ン ト ロ ールを渡 し たい場合は、 次の よ う に指定 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 27 ド ッ ト 表記 uo_data.uf_retrieve(This) デー タ ウ ィ ン ド ウ コ ン ト ロ ールの ス ク リ プ ト 内でデー タ ウ ィ ン ド ウ 型の イ ン ス タ ン ス 変数を設定 し て、 一番最近使用 さ れたデー タ ウ ィ ン ド ウ コ ン ト ロ ールがほかの関数に分か る よ う にす る には、 次の よ う に 指定 し ます。 idw_currentdw = This Parent 代名詞 Parent 代名詞は、オブジ ェ ク ト の親を参照 し ます。Parent を使用 し た ス ク リ プ ト は、 親オブジ ェ ク ト の名前を変更 し て も その ま ま使え ます。 ま た、 ほかの コ ン テ キ ス ト で も 再利用で き ます。 た と えば、 デー タ ウ ィ ン ド ウ コ ン ト ロ ールの ス ク リ プ ト で、 その ウ ィ ン ド ウ の Resize 関数を呼び出す と し ます。 こ の場合、 デー タ ウ ィ ン ド ウ コ ン ト ロ ール自体に も Resize 関数が定義 さ れてい る ため、次の よ う に修飾す る 必要があ り ます。 // ウ ィ ン ド ウ関数を呼び出す 2 つの方法 w_main.Resize(400, 400) Parent.Resize(400, 400) // コ ン ト ロールの関数を呼び出す 3 つの方法 Resize(400, 400) dw_data.Resize(400, 400) This.Resize(400, 400) GetParent 関数 Parent 代名詞が使え る のは ド ッ ト 表記内だけです。 親 オブジ ェ ク ト への参照を取得 し たい場合は、 GetParent 関数を使用 し ま す。 こ れは、 ス ク リ プ ト の所有オブジ ェ ク ト 以外のオブジ ェ ク ト の親 を参照 し た り 、 次の よ う に親オブジ ェ ク ト への参照を変数に保存す る 場合に使用 し ます。 window w_save w_save = dw_data.GetParent() た と えば、 別の コ マ ン ド ボ タ ン コ ン ト ロ ールの Clicked イ ベン ト ス ク リ プ ト で、 その コ マ ン ド ボ タ ン コ ン ト ロ ールの親 ウ ィ ン ド ウ への参照 を、 あ る ユーザ オブジ ェ ク ト に定義 さ れてい る 関数に渡 し たい と し ま す。 こ の場合は、 次の よ う に、 関数呼び出 し の中で GetParent を使用 し ます。 uo_winmgmt.uf_resize(This.GetParent(), 400, 600) ParentWindow プ ロパテ ィ と ParentWindow 関数 オブジェ ク ト の親を 取 得す る 関数やプ ロ パテ ィ はほかに も あ り ます。 • 28 ParentWindow プ ロ パテ ィ – メ ニ ュ ー ス ク リ プ ト 内で、 その メ ニ ュ ーの親 ウ ィ ン ド ウ を参照す る ために使用 し ます。 PowerBuilder 第 3 章 PowerScript についての特別な ト ピ ッ ク • ParentWindow 関数 – 任意の ス ク リ プ ト 内で、特定の ウ ィ ン ド ウ の 親 ウ ィ ン ド ウ への参照を取得す る ために使用 し ます。 こ れ ら の代名詞お よ び関数の詳細については、 『PowerScript リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 コ ン テナ オブ ジ ェ ク ト 内のオブ ジ ェ ク ト ド ッ ト 表記を使用す る と 、 オブジ ェ ク ト の中のオブジ ェ ク ト を参照す る こ と も で き ます。 こ う し た コ ン テナ内のオブジ ェ ク ト を参照す る に は、 ド ッ ト 表記内で Object プ ロ パテ ィ を使用 し ます。 コ ン テナ内オブ ジ ェ ク ト の構造に よ っ て ア ク セ ス可能な レベル数が決ま り ます。 control.Object.objectname.property control.Object.objectname.Object.qualifier.qualifier.property Object プ ロ パテ ィ に よ っ て ア ク セ ス 可能なオブジ ェ ク ト は次の と お り です。 • デー タ ウ ィ ン ド ウ コ ン ト ロ ール内のデー タ ウ ィ ン ド ウ オブジ ェ クト • OLE コ ン ト ロ ール内の外部 OLE オブジ ェ ク ト 次の式は、デー タ ウ ィ ン ド ウ コ ン ト ロ ール内のデー タ ウ ィ ン ド ウ オブ ジ ェ ク ト のプ ロ パテ ィ を参照 し てい ます。 dw_data.Object.emp_lname.Border dw_data.Object.nestedrpt[1].Object.salary.Border コ ン テ ナ内 オ ブ ジ ェ ク ト を 含む ド ッ ト 表記が正 し いか ど う かは、 コ ンパ イ ラ には判断で き ません。 た と えば、 デー タ ウ ィ ン ド ウ オブジ ェ ク ト は特定の コ ン ト ロ ールにバ イ ン ド さ れてお ら ず、 いつで も 変更で き ます。 こ のため、 Object プ ロ パ テ ィ の 後 の 名前 と プ ロ パ テ ィ が 有効 か ど う か は、 実行時 に 初 め て チ ェ ッ ク さ れ ます。参照名が間違っ てい る と 実行時エ ラ ーにな り ます。 コ ンパイ ラ によ る チ ェ ッ ク は行わない 実行時エ ラ ー チ ェ ッ ク の詳細については、38 ページの 「デー タ ウ ィ ン ド ウ と 外部オブジ ェ ク ト におけ る 式の最適化」 を参照 し て く だ さ い。 詳細情報 デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト のプ ロ パテ ィ と デー タ の ド ッ ト 表記 お よ びエ ラ ー処理についての詳細は、 『デー タ ウ ィ ン ド ウ リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 OLE オブジ ェ ク ト お よ び OLE オー ト メ ーシ ョ ン の ド ッ ト 表記の詳細 については、 第 18 章 「アプ リ ケーシ ョ ンにおけ る OLE の使い方」 を 参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 29 定数の宣言 定数の宣言 定数を宣言す る には、 標準の変数宣言に CONSTANT キー ワー ド を追加 し ます。 CONSTANT { access } datatype constname = value 定数 と し て宣言で き る のは、 宣言内に代入文を使用で き る デー タ 型だ けです。 こ のため、 Blob 型は定数 と し て宣言で き ません。 PowerScript の識別子は大文字 と 小文字を区別 し ませんが、 こ こ では命 名規約に従っ て定数名に大文字を使用 し ます。 CONSTANT integer GI_CENTURY_YEARS = 100 CONSTANT string IS_ASCENDING = "a" 定数の利点 宣言文以外の箇所で定数に値 を 代入す る 文 を 書 く と 、 コ ン パ イ ル エ ラ ーにな り ます。 定数を宣言す る と 、 宣言文で指定 し た と お り に定数 が使われ る よ う にな り ます。 ま た、 定数を宣言す る こ と で効率 も 向上 し ます。 定数値は コ ンパ イ ル 時に確定す る ため、 マシ ン コ ー ド では、 その定数値を保持 し てい る 変 数を参照す る のではな く 、 定数値が直接使用 さ れ ます。 イ ン ス タ ン ス変数のア ク セスの制御 イ ン ス タ ン ス 変数には、 ア ク セ ス 制御のための設定を行え ます。 こ の 設定に よ り 、 ほかのオブジ ェ ク ト の ス ク リ プ ト がその変数にア ク セ ス す る 方法を制御で き ます。 イ ン ス タ ン ス変数のア ク セ ス制御には次の 3 種類があ り ます。 • パブ リ ッ ク • プロテク ト • ほかのすべてのオブジ ェ ク ト か ら ア ク セ ス可能です。 そ のオ ブ ジ ェ ク ト お よ びそ の子孫オ ブ ジ ェ ク ト の ス ク リ プ ト 内でのみア ク セ ス可能です。 プ ラ イ ベー ト そのオブジ ェ ク ト の ス ク リ プ ト 内だけでア ク セ ス 可 能です。 例 public integer ii_currentvalue CONSTANT public integer WARPFACTOR = 1.2 protected string is_starship // 内部計算に使用する プ ラ イ ベー ト 値 30 PowerBuilder 第 3 章 PowerScript についての特別な ト ピ ッ ク private integer ii_maxrpm private integer ii_minrpm パブリ ッ ク 変数と プロ テク ト 変数へのアク セス は、修飾子 PRIVATEREAD、 PRIVATEWRITE、 PROTECTEDREAD、 PROTECTEDWRITE を使っ て さ ら に 制限で き ます。 public privatewrite ii_averagerpm カ プ セル化のためのプ ラ イ ベー ト 変数 ア ク セ ス制御は、 ほかの ス ク リ プ ト に よ る 変数の変更を禁止す る と き に よ く 使用 し ます。 PRIVATE ま たは PUBLIC PRIVATEWRITE ア ク セ ス を 設定す る と 、 ほかの ス ク リ プ ト がその変数を直接変更で き な く な り ま す。 こ れ ら の変数には、 検証を行っ てか ら 変数の変更を許可す る パブ リ ッ ク 関数を用意 し ます。 プ ラ イ ベー ト 変数を使用す る と 、 オブジ ェ ク ト の機能を カプセル化で き ます。 カプセル化 と は、 オブジ ェ ク ト のデー タ と コ ー ド を そのオブ ジ ェ ク ト の内部に隠ぺい し 、 外部に提供す る イ ン タ フ ェ ー ス を オ ブ ジ ェ ク ト が決定す る 手法の こ と です。 た と えば、カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト か ら EAServer や COM と い っ た コ ン ポーネ ン ト を生成す る 場合、 その コ ン ポーネ ン ト の イ ン タ フ ェ ー ス に よ っ て イ ン ス タ ン ス変数を エ ク ス ポーズす る こ と はで き ますが、 プ ラ イ ベー ト 型ま たはプ ロ テ ク ト 型の イ ン ス タ ン ス変数がエ ク ス ポーズ さ れ る こ と は決 し て あ り ません。 詳細情報 ア ク セ ス 制御についての詳細は、 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ アルの 「宣言」 の章を参照 し て く だ さ い。 カプセル化についての詳細は、 第 2 章 「オブジ ェ ク ト 指向プ ロ グ ラ ミ ン グ」 を参照 し て く だ さ い。 名前の重複の解決 名前の重複が発生す る ケース と し て次の 2 つがあ り ます。 • 異な る ス コ ープ内に定義 さ れた変数が同 じ 名前を持つ場合。 た と えば、 グ ロ ーバル変数は、 ロ ーカル変数 ま たは イ ン ス タ ン ス 変数 と 同 じ 名前を持つ こ と があ り ま す。 コ ン パ イ ラ は こ う し た重複す る 名前があ る と 警告を出 し ま すが、 変数名を変更す る 必要はあ り ません。 • 子孫オブジ ェ ク ト が先祖オブジ ェ ク ト か ら 関数や イ ベン ト を同 じ 名前で継承 し てい る 場合 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 31 名前の重複の解決 隠 さ れた変数 ま たは先祖の イ ベン ト や関数を参照す る 必要があ る 場合 は、 ド ッ ト 表記修飾子ま たは ス コ ープ演算子を使用 し ます。 隠 さ れた イ ン ス タ ン ス 変数 イ ン ス タ ン ス 変数が、 ロ ーカル変数、 共有変数、 ま たはグ ロ ーバル変 数 と 同 じ 名前を持つ場合は、 その イ ン ス タ ン ス 変数を オブジ ェ ク ト 名 で修飾 し ます。 objectname.instancevariable あ る ウ ィ ン ド ウ に birthdate と い う 名前の ロ ーカル変数 と イ ン ス タ ン ス 変数が存在す る 場合は、 イ ン ス タ ン ス変数を次の よ う に修飾 し ます。 w_main.birthdate ウ ィ ン ド ウ ス ク リ プ ト に ロ ーカ ル変数 x が定義 さ れて い る と 、 同 じ ウ ィ ン ド ウ の X プ ロ パテ ィ と 名前が重複 し ます。 その場合は、 X プ ロ パテ ィ に修飾子を付け ます。 次の文では、 両者を比較 し てい ます。 IF x > w_main.X THEN 隠 さ れたグローバル変 数 グ ロ ーバル変数が ロ ーカル変数ま たは共有変数 と 同 じ 名前を持つ場合 は、 そのグ ロ ーバル変数の前に ス コ ープ演算子 (::) を付け ます。 ::globalvariable 次の式は、 total と い う 同 じ 名前を持つ ロ ーカル変数 と グ ロ ーバル変数 を比較 し てい ます。 IF total < ::total THEN ... 接頭辞を使用 し て名前の重複を避ける 接頭辞を付けて変数の ス コ ープ を識別す る と い う 命名規則に従っ てい る 場合は、 ス コ ープの異な る 変数は必ず名前 も 異な る ため、 変数名が 重複す る こ と はあ り ません。 名前の重複を解決す る 方法を決定す る 検索順序についての詳細につい ては、 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ アルの 「宣言」 お よ び 「関 数 と イ ベン ト の呼び出 し 」 の章を参照 し て く だ さ い。 上書き さ れた関数 と イ ベン ト 継承 し た関数の ス ク リ プ ト を変更す る 場合は、 先祖オブジ ェ ク ト の関 数を上書 き し ます。 イ ベン ト の場合は、 ペ イ ン タ 内で先祖オブジ ェ ク ト の イ ベン ト ス ク リ プ ト を上書 き ま たは拡張 し ます。 ス コ ープ演算子を使用すれば、 上書 き し た関数 ま たは イ ベン ト の先祖 オブジ ェ ク ト を呼び出す こ と がで き ます。それには次の よ う に、ス コ ー プ演算子を表す二重 コ ロ ン の前に先祖 ク ラ ス 名 (変数名ではない) を 指定 し ます。 result = w_ancestor::FUNCTION of_func(arg1, arg2) 32 PowerBuilder 第 3 章 PowerScript についての特別な ト ピ ッ ク 先祖 ク ラ ス の名前を指定す る かわ り に、Super 代名詞を使用す る こ と も で き ます。 Super は、 す ぐ上の先祖オブジ ェ ク ト を参照 し ます。 result = Super::EVENT ue_process() 優れたオブジ ェ ク ト 指向設計では、 ほかのオブジ ェ ク ト の先祖 ス ク リ プ ト を呼び出す よ う な こ と は し ません。 こ う し た呼び出 し 方をす る の は、Super を使っ て現在のオブジ ェ ク ト のす ぐ上の先祖を呼び出す場合 だけに し て く だ さ い。 先祖 ス ク リ プ ト の戻 り 値を取得す る 方法についての詳細は、 次の 「先 祖ス ク リ プ ト か ら の戻 り 値」 を参照 し て く だ さ い。 関数の多重定義 同 じ オブジ ェ ク ト に同 じ 名前の関数を複数定義す る と 、 関数名がオー バー ロ ー ド さ れた も の と みな さ れ ま す。 PowerBuilder は、 関数定義の シ グ ネチ ャ と 関数呼び出 し のシ グネチ ャ (形式) を比較す る こ と に よ っ て、 ど の関数 を 呼び出すか を 決定 し ま す。 シ グ ネチ ャ には、 関数名、 引数 リ ス ト 、 戻 り 値が含まれます。 先祖ス ク リ プ ト か ら の戻 り 値 子孫オブジ ェ ク ト の イ ベン ト ス ク リ プ ト 内で、先祖 イ ベン ト ス ク リ プ ト の 戻 り 値 に 依 存 し た 処 理 を 実 行 す る 場 合 は、 ロ ー カ ル 変 数 AncestorReturnValue を使用 し ま す。 こ の ロ ーカル変数は自動的に宣言 さ れ、 先祖 イ ベン ト の戻 り 値が代入 さ れます。 コ ン パ イ ラ は、 ス ク リ プ ト 内で先祖 イ ベン ト を呼び出す CALL 文に出 会 う と 、 AncestorReturnValue 変数を宣言 し 、 それに先祖 イ ベン ト の戻 り 値を代入す る コ ー ド を暗黙に生成 し ます。 AncestorReturnValue 変数のデー タ 型は常に、 その先祖 イ ベン ト の戻 り 値に定義 さ れてい る デー タ 型 と 同 じ です。 先祖 イ ベン ト の呼び出 し 時 には、 子孫オブジ ェ ク ト の イ ベン ト に渡 さ れた引数がその ま ま渡 さ れ ます。 イ ベン ト ス ク リ プ ト の拡張 AncestorReturnValue 変数は拡張 イ ベン ト ス ク リ プ ト 内では常に使用で き ます。 イ ベン ト ス ク リ プ ト を拡張す る と 、 次の構文が生成 さ れ、 ス ク リ プ ト の先頭に挿入 さ れ ます。 CALL SUPER::event_name こ の文が表示 さ れ る のは、 オブジ ェ ク ト の構文を公開 し てい る 場合だ けです。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 33 関数 と イ ベン ト の引数の型 イ ベン ト ス ク リ プ ト の上書き イ ベン ト ス ク リ プ ト を上書 き し た場合に AncestorReturnValue 変数が使 用可能にな る のは、 次の よ う に CALL 構文を明示的に使用 し て先祖 イ ベン ト を呼び出 し た と き だけです。 CALL SUPER::event_name ま たは CALL ancestor_name::event_name コ ン パ イ ラ は、 SUPER キ ー ワ ー ド と 先祖名 を 区別 し ま せん。 SUPER キー ワ ー ド は、 ス ク リ プ ト が コ ンパ イ ル さ れ る 前に先祖名で置 き 換え ら れます。 AncestorReturnValue 変数が宣言 さ れ戻 り 値が代入 さ れ る のは、 CALL イ ベン ト 構文を使用 し た場合だけです。 次の よ う に新規 イ ベン ト 構文を 使用 し た場合、 AncestorReturnValue 変数は宣言 さ れません。 ancestor_name::EVENT event_name ( ) 例 拡張 イ ベ ン ト ス ク リ プ ト には次の よ う な コ ー ド を 書 く こ と がで き ま す。 IF AncestorReturnValue = 1 THEN // 処理を実行する ELSE // 別の処理を実行する END IF 先祖 イ ベン ト ス ク リ プ ト を上書 き す る ス ク リ プ ト に も 上記の拡張 イ ベン ト ス ク リ プ ト と 同 じ コ ー ド を書 く こ と がで き ますが、 AncestorReturnValue 変数を使用す る 前に CALL 文を挿入 し なければな り ません。 // 前処理を実行する コ ー ド CALL SUPER::ue_myevent IF AncestorReturnValue = 1 THEN … 関数 と イ ベン ト の引数の型 関数ま たはユーザ イ ベン ト を定義す る と き は、引数、引数のデー タ 型、 お よ び引数の渡 し 方を指定 し ます。 引数の渡 し 方には、 次の 3 つがあ り ます。 • 34 値渡 し デフ ォ ル ト の引数の渡 し 方です。 PowerBuilder 第 3 章 PowerScript についての特別な ト ピ ッ ク 引数値の コ ピーを渡 し ま す。 呼び出 し 先で引数値を変更す る と こ の コ ピーが変更 さ れます。 呼び出 し 元の引数値は変更 さ れません。 • 参照渡 し 引数が格納 さ れた変数へのポ イ ン タ を渡 し ます。 参照渡 し の引数は呼び出 し 元の変数へのポ イ ン タ なので、 呼び出 し 先の関数 ス ク リ プ ト か ら その値を変更で き ま す。 参照渡 し の引 数には、値を変更で き る よ う に変数を指定す る 必要があ り ます。 リ テ ラ ルや定数を指定す る こ と はで き ません。 • 読み込み専用渡 し 引数を値渡 し で渡 し ま すが、 デー タ の コ ピーを 作成 し ません。 読み込み専用渡 し では値渡 し の よ う にデー タ の コ ピーを作成 し な いため、 デー タ 型に よ っ てはパフ ォーマ ン ス が向上 し ます。 String、 Blob、 Date、 Time、 DateTime の各デー タ 型は、 読み込み専用渡 し に す る と パフ ォ ーマ ン ス が向上 し ます。 上記以外のデー タ 型の場合で も 、 読み込み専用渡 し にす る こ と で、 その引数の用途 (読み込み専用で あ る こ と ) を ほかの開発者に伝 え る こ と がで き ます。 関数を上書き する と き の引数型の照合 先祖関数を上書 き す る 関数を子孫オブジ ェ ク ト に定義す る 場合は、 関 数のシ グ ネチ ャ 、 すなわち関数名、 戻 り 値、 引数のデー タ 型、 引数の 渡 し 方がすべて一致 し ていなければな り ません。 た と えば、 次の関数宣言では、 3 つの Long 型引数の う ち、 2 つを値渡 し で、 1 つを参照渡 し で渡 し てい ます。 uf_calc(long a_1, long a_2, ref long a_3) & returns integer 先祖関数を上書 き し た子孫関数のシ グ ネチ ャ が先祖関数の も の と 一致 し ない場合は、 関数が呼び出 さ れた と き に PowerBuilder は も っ と も 類 似 し てい る 関数を捜 し 出 し て呼び出 し ます。 こ のため、 予期せぬ結果 にな る こ と があ り ます。 先祖変数 と 子孫変数 PowerBuilder のすべてのオブジ ェ ク ト は、 PowerBuilder シ ス テ ム オブ ジ ェ ク ト (ブ ラ ウ ザの [シ ス テ ム] ページに一覧表示 さ れ る オブジ ェ ク ト ) の子孫です。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 35 先祖変数 と 子孫変数 し たが っ て、 オブジ ェ ク ト イ ン ス タ ン ス を宣言す る と き はいつ も 、 子 孫オブジ ェ ク ト を宣言 し てい る こ と にな り ます。 ど の程度具体的な宣 言にす る かは、 開発者が決定 し ます。 で き る だけ具体的な宣 言にする場合 た と えば、uo_empdata と い う 名前のユーザ オブジ ェ ク ト ク ラ ス を定義 す る 場合に、 uo_empdata と い う 型の変数を宣言 し て、 uo_empdata ユー ザ オブジ ェ ク ト への参照を格納す る こ と がで き ます。 uo_empdata uo_emp1 uo_emp1 = CREATE uo_empdata uo_emp1 の型は uo_empdata なので、 uo_empdata の定義に含まれ る 変数 や関数を参照す る こ と がで き ます。 ア プ リ ケーシ ョ ンに柔 軟性が要求 さ れる場合 作成す る ユーザ オブ ジ ェ ク ト がユーザの選択に よ っ て決 ま る と し ま す。 UserObject と い う 型のユーザ オブジ ェ ク ト 変数を宣言す る か、 そ のユーザ オブジ ェ ク ト の先祖 ク ラ ス を宣言 し ます。 そ し て、 イ ン ス タ ン ス 化す る オ ブ ジ ェ ク ト ク ラ ス を 文字列変数に格納 し、 そ れ を CREATE の引数に指定 し て ク ラ ス を イ ン ス タ ン ス化 し ます。 uo_empdata uo_emp1 string ls_objname ls_objname = ...// 開 く ユーザ オブ ジ ェ ク ト を確定する uo_emp1 = CREATE USING ls_objname こ の方法は汎用的ですが、 オブジ ェ ク ト の変数や関数へのア ク セ ス が 制限 さ れ ます。 コ ンパ イ ラ は先祖 ク ラ ス uo_empdata の (シ ス テ ム ク ラ ス UserObject を宣言 し た場合はその) プ ロ パテ ィ や関数 し か知 り ませ ん。 実際に作成さ れる オブジェ ク ト については知ら ないため、 その未知 のオブジェ ク ト に定義さ れたプロ パティ への参照を許可で き ません。 イ ン ス タ ン ス 化す る 子孫オブジ ェ ク ト のプ ロ パ テ ィ や関数を特定す る ためには、 子孫オブジ ェ ク ト で実装す る プ ロ パ テ ィ や関数を含む先祖オブジ ェ ク ト を定義 し ます。 こ の先祖オブジ ェ ク ト の関数に戻 り 値以外の コ ー ド は不要です。 こ の関数を定義す る 目 的は、 コ ン パ イ ラ が関数名を 認識で き る よ う にす る こ と だか ら です。 こ の先祖 ク ラ ス の変数を宣言す る と 、 関数を参照で き る よ う にな り ま す。 実行時に、 特定の子孫で変数を イ ン ス タ ン ス化 し ます。 こ の子孫 が必要な関数を実装 し てい ます。 抽象先祖オブ ジ ェ ク ト uo_empdata uo_emp1 string ls_objname // 開 く uo_empdata の子孫を確定する ls_objname = ... uo_emp1 = CREATE USING ls_objname // 先祖 ク ラ スで関数を宣言する result = uo_emp1.uf_special() 36 PowerBuilder 第 3 章 PowerScript についての特別な ト ピ ッ ク こ の手法についての詳細は、 20 ページの 「関数の動的呼び出 し と 静的 呼び出 し 」 に記載 さ れてい ます。 宣言 し た ク ラ ス に定義 さ れ て い な い関数 を 扱 う も う 1 つの方法 と し て、 動的関数呼び出 し があ り ます。 動的関数の呼び出 し 関数呼び出し に DYNAMIC キーワ ード を 指定する と 、コ ン パイ ラ はその関 数が有効かど う かを チェ ッ ク し な く な り ま す。こ のチェ ッ ク は、実行時 に、変数が適切なオブジェ ク ト でイ ン ス タ ン ス 化さ れたと き 行われま す。 // 子孫ク ラ ス内で宣言 さ れていない関数 result = uo_emp1.DYNAMIC uf_special() パフ ォ ーマ ン ス と エ ラ ー 動的関数呼び出 し 機能は、 アプ リ ケーシ ョ ン の設計に よ っ て要求 さ れ る と き 以外は使用 し ないで く だ さ い。 実行時評価では、 通常は コ ンパ イ ラ が行 う 作業を実行時に行 う 必要があ り ます。 こ のため、 動的呼び 出 し を頻繁に、 ま たは大 き なループ内で使用す る と 、 アプ リ ケーシ ョ ン のパ フ ォ ーマ ン ス が低下 し ます。 ま た、 コ ンパ イ ラ に よ る チ ェ ッ ク が省略 さ れ る ため、 本来な ら コ ンパ イ ラ が検出 し ていたエ ラ ーが実行 時ま で検出 さ れ ません。 ウ ィ ン ド ウと ビジュア ル ユーザ オブ ジ ェ ク ト の動的オブ ジ ェ ク ト 選択 ウ ィ ン ド ウ と ビ ジ ュ アル ユーザ オブジ ェ ク ト を開 く には、 CREATE 文 ではな く 関数呼び出 し を使用 し ます。 Open お よ び OpenUserObject 関数 を使用す る と 、 開 く ウ ィ ン ド ウ ま たはオブジ ェ ク ト の ク ラ ス を指定で き る ため、宣言のオブジ ェ ク ト 型 と は異な る 型の子孫を開け ら れます。 次の例では、s_u_name 文字列に指定 さ れた型を持つユーザ オブジ ェ ク ト を表示 し 、 そのユーザ オブジ ェ ク ト への参照を u_to_open 変数に格 納 し てい ます。 u_to_open 変数は DragObject 型、 つま り すべてのユーザ オブジ ェ ク ト の先祖です。 こ の イ ン ス タ ン ス 変数は、 すべてのユーザ オブジ ェ ク ト への参照を保持で き ます。 DragObject u_to_open string s_u_name s_u_name = sle_user.Text w_info.OpenUserObject(u_to_open, s_u_name, 100, 200) ウ ィ ン ド ウ について も 同様の コ ー ド を書 く と 次の よ う にな り ます。 実 際に開かれ る ウ ィ ン ド ウ の型は、 w_data_entry ク ラ ス、 ま たはその子孫 ク ラ ス にな り ます。 w_data_entry w_data string s_window_name s_window_name = sle_win.Text Open(w_data, s_window_name) ア プ リ ケーシ ョ ン テ ク ニ ッ ク 37 デー タ ウ ィ ン ド ウ と 外部オブ ジ ェ ク ト における式の最適化 デー タ ウ ィ ン ド ウ と 外部オブ ジ ェ ク ト における式の最適化 コ ン テナ オブ ジ ェ ク ト に対する コ ンパイ ラ の妥当性チ ェ ッ クは行 われない ド ッ ト 表記 を 使用 し て、 デー タ ウ ィ ン ド ウ コ ン ト ロ ール内のデー タ ウ ィ ン ド ウ オブジ ェ ク ト ま たはデー タ ス ト ア を参照す る と 、 コ ンパ イ ラ は次の式の妥当性チ ェ ッ ク を行い ません。 dw_data.Object.column.property Object プ ロ パテ ィ 以降の部分は コ ン パ イ ラ に よ る チ ェ ッ ク を受けず、 実行時にチ ェ ッ ク さ れ ます。 こ れは、 外部 OLE オブ ジ ェ ク ト につい て も 同 じ です。 つ ま り 、 外部 OLE オブジ ェ ク ト のチ ェ ッ ク も 実行時に行われ ます。 ole_1.Object.qualifier.qualifier.property.Value 部分参照の確定 多 く の式を使用す る と 、 実行時の構文チ ェ ッ ク に時間がかか る ためパ フ ォ ーマ ン ス が低下 し ます。同 じ デー タ ウ ィ ン ド ウ コ ン ポーネ ン ト オ ブジ ェ ク ト ま たは外部オブジ ェ ク ト を繰 り 返 し 参照す る 場合に効率性 を高め る には、 適切な型の変数を定義 し て、 その変数に参照の一部を 割 り 当て ます。 こ れに よ り 、 参照の大部分を 1 回だけ評価 し 、 以降は その評価結果を再利用で き ます。 データ ウ ィ ン ド ウ コ ン ポーネン ト オブジェ ク ト のデータ 型は DWObject です。 DWObject dwo_column dwo_column = dw_data.Object.column dwo_column.SlideLeft = ... dwo_column.SlideUp = ... 部分的に解決 さ れたオー ト メ ーシ ョ ン式のデー タ 型は OLEObject です。 OLEObject ole_wordbasic ole_wordbasic = ole_1.Object.application.wordbasic ole_wordbasic.propertyname1 = value ole_wordbasic.propertyname2 = value エ ラ ー処理 38 Error イ ベン ト と (オー ト メ ーシ ョ ン用の) ExternalException イ ベン ト は、 デー タ ウ ィ ン ド ウ お よ び OLE 式を評価す る と き に発生 し ます。 こ れ ら の イ ベン ト を処理す る ス ク リ プ ト を書けば、 SystemError イ ベン ト が起動 さ れ る 前にエ ラ ーを捕捉す る こ と がで き ます。 こ れ ら の イ ベン ト を使用す る と 、 エ ラ ーを無視 し た り 、 適切な値で置換 し た り で き ま す。 ただ し 、 それに よ っ て別のエ ラ ーを引 き 起 こ す条件を設定 し て し ま わない よ う に注意す る 必要が あ り ま す。 次の 「PowerBuilder での例 外処理」 で説明す る よ う に、try-catch ブ ロ ッ ク を使用 し て例外を処理す る こ と も で き ます。 PowerBuilder 第 3 章 PowerScript についての特別な ト ピ ッ ク 詳細情報 デー タ ウ ィ ン ド ウ のデー タ 式 と プ ロ パテ ィ 式、お よ び DWObject 変数に ついての詳細は、 『デー タ ウ ィ ン ド ウ リ フ ァ レ ン ス』 マニ ュ アル を参 照 し て く だ さ い。 オー ト メ ーシ ョ ン の OLEObject 変数の使い方につい ての詳細は、 第 18 章 「アプ リ ケーシ ョ ンにおけ る OLE の使い方」 を 参照 し て く だ さ い。 PowerBuilder での例外処理 PowerBuilder ア プ リ ケーシ ョ ン で実行時エ ラ ーが発生 し た場合に、 そ のエ ラ ーを ト ラ ッ プ し ない と 、 アプ リ ケーシ ョ ン内でのエ ラ ー発生の 場所に関係な く 、 単一のアプ リ ケーシ ョ ン イ ベン ト (SystemError) が 発生 し エ ラ ーが処理 さ れます。シ ス テ ム エ ラ ー イ ベン ト で処理で き る エ ラ ー も あ り ますが、発生箇所に近い位置でエ ラ ーを捕捉 し たほ う が、 エ ラ ー状態か ら 回復で き る 可能性が高 く な り ます。 例外処理用の ク ラ ス 構文を使用すれば、 PowerBuilder アプ リ ケーシ ョ ン の状況依存エ ラ ーを処理で き ます。 つま り 、 エ ラ ー処理用の コ ー ド を アプ リ ケーシ ョ ン内に埋め込む こ と に よ っ て、 エ ラ ー発生箇所に近 い位置でエ ラ ーを処理で き ます。 エ ラ ー処理 コ ー ド を う ま く 設計すれ ば、ユーザはエ ラ ー状態か ら 回復で き る 可能性が高 く な り 、アプ リ ケー シ ョ ン に よ る 作業を中断せずに済みます。 例外処理を行 う こ と に よ り 、 例外状態か ら 回復 し 処理を続行で き る ア プ リ ケーシ ョ ン を設計で き ます。 アプ リ ケーシ ョ ン が捕捉 し ない例外 はすべて ラ ン タ イ ム シ ス テ ムに よ っ て処理 さ れます。 その場合は、 ア プ リ ケーシ ョ ン が異常終了す る こ と があ り ます。 マシ ン コ ー ド マシ ン コ ー ド DLL を構築す る 必要があ る 場合には、 例外処理は使用 で き ません。 こ れは、 マシ ン コ ー ド を構築す る プ ロ セ ス で例外処理 メ カ ニ ズ ム がサポー ト さ れていないためです。 例外処理を使用す る コ ー ド か ら マ シ ン コ ー ド DLL を コ ンパ イ ル し よ う と す る と 、 失敗 し 、 エ ラ ー メ ッ セージが表示 さ れます。 Pcode(PBD) と マシ ン コ ー ド (DLL) の ど ち ら を選択す る かについての詳細は、 776 ページの 「 コ ン パ イ ラ の基本事項」 を参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 39 PowerBuilder での例外処理 PowerBuilder ク ラ イ ア ン ト は、 EAServer コ ン ポーネ ン ト で発生 し た例 外を捕捉 し 、 例外状態か ら 回復す る こ と がで き ま す。 PowerBuilder で 開発 し た コ ン ポーネ ン ト は、独自の例外の種類を定義 し 送出で き ます。 こ れに よ り 、Java な ど ほかの EAServer コ ン ポーネ ン ト と の一貫性を高 め る こ と がで き ます。 例外処理は、 Java や C++ と い っ たオブジ ェ ク ト 指向言語で も 使われ ま す。 PowerBuilder の例外処理の実装は、 Java の例外処理の実装に似て い ます。PowerBuilder の例外処理では、 TRY、CATCH、FINALLY、THROW、 THROWS と い っ た予約語を使用 し ま す。 Throwable オブジ ェ ク ト か ら 派生 し た PowerBuilder オブジ ェ ク ト も い く つかあ り ます。 例外処理の基本 例外 と は、 何 ら かの例外的な (予想外の) 状態やエ ラ ーの イ ベン ト で 送出 さ れ る オブジ ェ ク ト で あ り 、 発生 し た条件やエ ラ ーを記述す る も のです。 Null オブジ ェ ク ト 参照やゼ ロ に よ る 除算 と い っ た標準エ ラ ー は通常、 ラ ン タ イ ム シ ス テ ム に よ っ て送出 さ れ ます。 こ の種のエ ラ ー はアプ リ ケーシ ョ ン内の ど こ で も 発生す る 可能性があ り 、 任意の実行 ス ク リ プ ト には こ れ ら のエ ラ ーか ら 回復す る ための catch 句を指定で き ます。 ユーザ定義の例外 即座に実行時エ ラ ー と はな ら ない例外条件 も あ り ます。 こ れ ら の例外 は通常、 関数 ま たはユーザ イ ベン ト ス ク リ プ ト の実行中に発生 し ま す。 こ れ ら の例外を伝え る には、 PowerScript の Exception ク ラ ス か ら 継承 し たユーザ オブジ ェ ク ト を作成 し ます。 ユーザ定義の例外は、 関 数、ま たは メ ソ ッ ド プ ロ ト タ イ プ内のユーザ イ ベン ト に関連付け る こ と がで き ます。 た と えば、 特定の フ ァ イ ルが見つか ら ない こ と を知 ら せ る ためにユー ザ定義の例外を作成 さ せ る と し ます。 こ の例外は、 その フ ァ イ ルを開 く 関数のプ ロ ト タ イ プ内で宣言す る と よ いで し ょ う 。 こ の例外を捕捉 す る には、 ユーザ定義の例外オブジ ェ ク ト を イ ン ス タ ン ス 化 し て、 そ の メ ソ ッ ド ス ク リ プ ト 内で例外 イ ン ス タ ン ス を 送出す る 必要が あ り ます。 例外処理用のオブ ジ ェ ク ト PowerBuilder には、 例外処理用のシ ス テ ム オブジ ェ ク ト がい く つかあ り ます。 40 PowerBuilder 第 3 章 PowerScript についての特別な ト ピ ッ ク Throwable オブ ジ ェ ク ト型 Throwable オブジ ェ ク ト 型は、 すべてのユーザ定義の例外お よ びシ ス テ ム エ ラ ー型の基本 と な る デー タ 型です。 2 つのシ ス テ ム オブジ ェ ク ト 型 RuntimeError と Exception は、 Throwable か ら 派生 し たデー タ 型で す。 RuntimeError と その 子孫 PowerBuilder の実行時エ ラ ーは、 RuntimeError オブジ ェ ク ト 型で表 さ れ ま す。 よ り 堅牢な エ ラ ー処理機能 を 実現す る ために、 RuntimeError 型には独自のシ ス テ ム定義の子孫が定義 さ れてい ますが、PowerBuilder の実行時エ ラ ーを処理す る ために必要な情報はすべて RuntimeError 型 に含まれてい ます。 RuntimeError の 子 孫 型 の 1 つ に NullObjectError 型 が あ り ま す。 NullObjectError 型の例外は、 Null オブジ ェ ク ト 参照を検出す る たびに シ ス テ ム に よ っ て送出 さ れます。 こ れに よ り 、 Null オブジ ェ ク ト 参照 エ ラ ーを、 発生す る 可能性のあ る ほかの実行時エ ラ ー と 区別せずに明 示的に処理で き ます。 RuntimeError か ら 派生 し たエ ラ ー型は、 通常、 実行時エ ラ ーを知 ら せ る ためにシ ス テ ムに よ っ て使用 さ れます。 RuntimeErrors は try-catch ブ ロ ッ ク で捕捉で き ますが、 こ の よ う なエ ラ ー条件が発生す る 場所を宣 言す る 必要はあ り ません。 こ れは PowerBuilder がかわ り に行っ て く れ ます。 と い う のは、 シ ス テ ム エ ラ ーはアプ リ ケーシ ョ ン実行時にいつ で も ど こ で も 発生す る 可能性があ る か ら です。 ま た、 RuntimeErrors 型 のエ ラ ーを捕捉す る こ と は必須ではあ り ません。 Exception オブ ジ ェ ク ト型 Exception シ ス テ ム オブジ ェ ク ト も 、 Throwable か ら 派生 し たオブジ ェ ク ト で、 通常、 ユーザ定義の例外型の先祖オブジ ェ ク ト と し て使用 さ れ ます。 例外の ク ラ ス は、 すべての検査例外の基本 と な る ク ラ ス です。 検査例外 はユーザ定義の例外で、 送出 さ れた ら 必ず try-catch ブ ロ ッ ク 内で捕捉 し な ければな り ま せん。 ま た、 try-catch ブ ロ ッ ク の外で送出 さ れ る 場合は、メ ソ ッ ド のプ ロ ト タ イ プ内で宣言す る 必要があ り ます。 PowerScript コ ン パ イ ラ は検査例外 が 送出 さ れ る ロ ー カ ル の 構文 を チ ェ ッ ク し て、 検査例外が必ず宣言 ま たは捕捉 さ れ る よ う に し ま す。 RuntimeError の子孫は、 それがユーザ定義で あ っ て も 、 ま た ラ ン タ イ ム シ ス テ ム に よ っ て ではな く ス ク リ プ ト 内で送出 さ れ る も ので あ っ て も 、 コ ンパ イ ラ に よ っ てチ ェ ッ ク さ れ る こ と はあ り ません。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 41 PowerBuilder での例外処理 例外の処理 例外は、 ラ ン タ イ ム シ ス テ ム に よ っ て送出 さ れ る 場合で も 、 ア プ リ ケーシ ョ ン ス ク リ プ ト 内の THROW 文に よ っ て送出 さ れ る 場合で も 、 例外を捕捉す る こ と に よ っ て処理 し ます。 例外を捕捉す る には、 例外 を送出 さ せ る 一連のアプ リ ケーシ ョ ン ロ ジ ッ ク を、 その例外の処理方 法を示す コ ー ド で囲みます。 TRY-CATCH-FINALLY ブロ ッ ク PowerScript で例外を処理す る には、 アプ リ ケーシ ョ ン ロ ジ ッ ク の一部 を try-catch ブ ロ ッ ク で囲む必要があ り ます。 try-catch ブ ロ ッ ク は、 TRY 句で始ま り 、 END TRY 文で終わ り ます。 ま た、 ブ ロ ッ ク 内には、 CATCH 句 ま たは FINALLY 句を含め る 必要が あ り ま す。 FINALLY 句は通常、 エ ラ ー条件の後処理を記述す る と き に指定 し ます。 TRY 句 と FINALLY 句 の間には、 CATCH 句をい く つで も 追加で き ます。 CATCH 句は必須ではあ り ませんが、指定す る 場合は各 CATCH 文の後に 変数を宣言 し なければな り ません。こ の変数は、ス ク リ プ ト 内での ロ ー カ ル変数宣言に関す る すべ て の規則に従 っ て い る だ け で な く、 Throwable か ら 派生 し た型を持っ ていなければな り ません。 TRY-CATCH-FINALLY、 TRY-CATCH、 TRY-FINALLY の各ブ ロ ッ ク は、 ス ク リ プ ト ビ ュ ーで PowerScript 文の形式を指定 し て貼 り 付け機能を使用 し て追加で き ます。 デザ イ ン オプシ ョ ン ダ イ ア ロ グ ボ ッ ク ス の [オー ト ス ク リ プ ト ] タ ブにあ る [ス テー ト メ ン ト テ ン プ レー ト ] チ ェ ッ ク ボ ッ ク ス を オ ン にす る と 、 オー ト ス ク リ プ ト 機能を使用 し て上記の各 ブ ロ ッ ク 構文を挿入で き ます。 例 次 の 例は、 ア プ リ ケ ー シ ョ ン ユーザ に よ っ て (シ ン グル ラ イ ン エデ ィ ッ ト に) に入力 さ れた arccosine 引数の 値が、 要求範囲外で あ る こ と を示すシ ス テ ム エ ラ ー を捕捉す る TRYCATCH-FINALLY ブ ロ ッ ク です。 こ のエ ラ ーを捕捉 し ない と 、 シ ス テ ム エ ラ ー イ ベン ト が発生 し 、 アプ リ ケーシ ョ ンは最終的に異常終了 し ま す。 シ ス テム エ ラ ーを捕捉する例 Double ld_num ld_num = Double (sle_1.text) TRY sle_2.text = string (acos (ld_num)) CATCH (runtimeerror er) MessageBox(" 実行時エ ラ ー ", er.GetMessage()) FINALLY // ク リ ーン ア ッ プ コ ー ド を こ こ に追加 of_cleanup() Return END TRY MessageBox(" 完了 ", " 完了 し ま し た。 ") 42 PowerBuilder 第 3 章 PowerScript についての特別な ト ピ ッ ク シ ス テ ム実行時のエ ラ ー メ ッ セージはエ ン ド ユーザには分か り に く いので、 本稼働シ ス テ ム では、 ユーザ定義の例外を捕捉 し て (44 ペー ジの 「ユーザ定義の例外型の作成」 の例を参照) 、 分か り やすい メ ッ セージ を設定す る と よ いで し ょ う 。 予約語 TRY は、実行 さ れ る ブ ロ ッ ク の先頭を表 し ます。ブ ロ ッ ク には、 1 つま たは複数の CATCH 句を含め る こ と がで き ます。 TRY ブ ロ ッ ク 内 の コ ー ド を実行中に例外が送出 さ れ る と 、最初の CATCH 句に よ っ て処 理 さ れます。 こ の と き 、 CATCH 句の変数に、 送出 さ れた例外の値が代 入 さ れます。 CATCH 文の後の変数宣言は、 処理 さ れ る 例外の型 ( こ の 例ではシ ス テ ム実行時エ ラ ー) を表 し ます。 CATCH 句の順序 1 つの CATCH 句がほかの CATCH 句を隠 さ ない よ う に CATCH 句を配置 す る こ と が必要です。 先頭 の CATCH 句 で Exception 型 の 例外 を 捕捉 し 、 次 の CATCH 句 で Exception の子孫を捕捉す る と い う よ う な場合に、 こ の問題が発生 し ま す。 指定 し た順に処理 さ れ る ので、 Exception の子孫の例外は最初の CATCH 句で処理 さ れて、 2 番目の CATCH 句で処理 さ れ る こ と はあ り ま せん。 PowerScript コ ンパ イ ラ は、 こ う し た状況を検出す る と 、 コ ンパ イ ル エ ラ ーを発生 さ せます。 ど の CATCH 句に よ っ て も 処理 さ れなか っ た例外は、 コ ール ス タ ッ ク の上位に送出 さ れ、 別の例外ハン ド ラ (try-catch ブ ロ ッ ク の入れ子) 、 ま たはシ ス テ ム エ ラ ー イ ベン ト に よ っ て処理 さ れます。例外が コ ール ス タ ッ ク の上位に送出 さ れ る 前に、 FINALLY 句が実行 さ れ ます。 FINALLY 句 FINALLY 句では、 一般的に、 TRY 句ま たは CATCH 句の実行後の後処理 を行い ます。 FINALLY 句に指定 さ れた コ ー ド は、 try-catch ブ ロ ッ ク 内の いずれかの部分が実行 さ れ る と 、 try-catch ブ ロ ッ ク の終了状態に関係 な く 必ず実行 さ れ ます。 例外が発生 し ない と 、 TRY 句が終了 し た後、 FINALLY 句に指定 さ れた文 が実行 さ れ ます。 そ し て、 END TRY 文の次の行か ら 処理が続行 さ れ ま す。 CATCH 句が 1 つ も な く 、 FINALLY 句だけが存在す る 場合は、 FINALLY 句 に指定 さ れた コ ー ド が実行 さ れ ます。 戻 り 値が検出 さ れた場合や TRY 句内で例外が送出 さ れた場合で も 、 FINALLY 句は必ず実行 さ れ ます。 TRY 句の コ ン テ キ ス ト で例外が発生 し た場合、 その例外を処理で き る 適切な CATCH 句があればその CATCH 句が実行 さ れ、 その後、 FINALLY 句が実行 さ れます。送出 さ れた例外を処理で き る 適切な CATCH 句が存 在 し ない場合で も 、 FINALLY 句は必ず実行 さ れ、 その後、 コ ール ス タ ッ ク の上位に (未処理の) 例外が送出 さ れ ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 43 PowerBuilder での例外処理 CATCH 句内で例外が発生す る か戻 り 値が検出 さ れた場合は、 FINALLY 句が実行 さ れてか ら 、プ ロ グ ラ ム内の次の実行場所に制御が移 り ます。 ユーザ定義の例外型の作成 Exception ま たは RuntimeError、 あ る いは Exception ま たは RuntimeError か ら 派生 し た既存のユーザ オブジ ェ ク ト を継承す る 標準 ク ラ ス ユー ザ オブジ ェ ク ト か ら 、 ユーザ定義の固有の例外型を作成す る こ と がで き ます。 Exception オブ ジ ェ ク ト 型か らの継承 通常、 ユーザ定義の例外型は、 Exception 型ま たはその子孫を継承す る 必要があ り ます。 RuntimeError 型はシ ス テ ム エ ラ ーを表すために使用 し ます。 ユーザ定義のオブジ ェ ク ト には、 シ ス テ ム内のそのほかの非 ビ ジ ュ アル ユーザ オブジ ェ ク ト と 同様、 イ ベン ト 、 関数、 イ ン ス タ ン ス変数を定義で き ます。 ユーザ定義の例外型は、 た と えば、 ビ ジネ ス ルール違反 と い っ た特定 の条件に よ っ て ア プ リ ケーシ ョ ン ロ ジ ッ ク が異常終了す る 場合の処 理に使 う と 便利です。 こ う し た条件を記述す る ユーザ定義の例外型を 作成 し 、 例外を正 し く 捕捉 し て処理すれば、 実行時エ ラ ーを回避で き ます。 例外の送出 例外は、 エ ラ ー条件を示すために、 ラ ン タ イ ム エ ン ジ ン に よ っ て送出 さ れ ます。 潜在的な例外条件を手動で送出す る 場合は、 THROW 文を使 用す る 必要があ り ます。 THROW 文は通常、 ユーザ定義の例外型 と 組み合わせて使用 し ます。 以 下に、 THROW 文の使い方を簡単な例を用いて示 し ます。 Exception le_ex le_ex = create Exception Throw le_ex MessageBox (" 注意 ", " 例外変数が " & + " イ ン ス タ ン ス化 さ れていな く てはな り ません ") こ の 例 で は、 le_ex 例外 の イ ン ス タ ン ス を 送出 し て い ま す。 予約語 THROW の後に続 く 変数は、 Throwable か ら 派生 し た型を持つ例外オブ ジ ェ ク ト の有効な イ ン ス タ ン ス へのポ イ ン タ で な ければな り ま せん。 イ ン ス タ ン ス 化さ れていない Exception 変数を 送出し よ う と する と 、ルー チン 内に Null オブジ ェ ク ト 参照が存在する こ と を 示す NullObjectError が発生 し ます。 こ れは、 アプ リ ケーシ ョ ン のエ ラ ー処理を複雑にす る だけです。 44 PowerBuilder 第 3 章 PowerScript についての特別な ト ピ ッ ク 関数から 送出 さ れる例 外の宣言 メ ソ ッ ド ス ク リ プ ト 内で THROW 文 を 使用 し て例外 を 送出す る 場合 に、 その例外型を処理す る try-catch ブ ロ ッ ク で THROW 文を囲ま ない と き は、 その例外を その メ ソ ッ ド が送出可能な例外型 (ま たはその子 孫) と し て宣言す る 必要があ り ます。 ただ し 、 実行時エ ラ ーが送出可 能であ る こ と は PowerBuilder がかわ り に宣言 し て く れ る ので、 メ ソ ッ ド で宣言す る 必要はあ り ません。 ほ と ん ど の PowerBuilder ペ イ ン タ の ス ク リ プ ト ビ ュ ーにあ る プ ロ ト タ イ プ ウ ィ ン ド ウ を使用すれば、 関数ま たはユーザ定義の イ ベン ト が送 出可能なユーザ定義の例外を宣言で き ます。 シ ス テ ム ツ リ ーま たは ラ イ ブ ラ リ ペ イ ン タ ビ ュ ーか ら プ ロ ト タ イ プ ウ ィ ン ド ウ 内の [Throws] ボ ッ ク ス に例外型を ド ラ ッ グ ア ン ド ド ロ ッ プす る か、 メ ソ ッ ド が送出 可能な例外型を コ ン マで区切 ら れた リ ス ト と し て入力 し ます。 例 ユーザ定義の例外を捕捉する例 次 の コ ー ド で は、 ア プ リ ケ ー シ ョ ン ユーザが入力 し た arccosine 引数が指定範囲外であ る 場合にユーザ定義 のエ ラ ーを表示 し ます。try-catch ブ ロ ッ ク 内で wf_acos メ ソ ッ ド を呼び 出 し ます。 こ の メ ソ ッ ド は、 シ ス テ ム エ ラ ーを捕捉 し 、 ユーザ定義の エ ラ ーを設定お よ び送出 し ます。 TRY wf_acos() CATCH (uo_exception u_ex) MessageBox(" 範囲外 ", u_ex.GetMessage()) END TRY wf_acos メ ソ ッ ド の中身は次の と お り です。 uo_exception lu_error Double ld_num ld_num = Double (sle_1.text) TRY sle_2.text = string (acos (ld_num)) CATCH (runtimeerror er) lu_error = Create uo_exception lu_error.SetMessage(" 値は -1 ~ " & + "1 の範囲になければな り ません ") Throw lu_error END TRY EAServer と の統合 ユーザ オブジ ェ ク ト の メ ソ ッ ド で例外を宣言 し 、そのユーザ オブジ ェ ク ト を EAServer の コ ン ポーネ ン ト と し て配布す る と 、 メ ソ ッ ド プ ロ ト タ イ プの一部 と し て例外が IDL (CORBA) に変換 さ れます。 つま り 、 EAServer 内 の PowerBuilder コ ン ポ ー ネ ン ト を、 任 意 の タ イ プ の EAServer ク ラ イ ア ン ト ア プ リ ケーシ ョ ン で処理可能な例外を 送出す る よ う に定義で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 45 PowerBuilder での例外処理 コ ン ポ ーネ ン ト 開発の別 の利点は、 コ ン ポーネ ン ト 内で実行時エ ラ ー を処理で き る こ と です。 未処理のエ ラ ーは自動的に例外に変換 さ れ、 コ ン ポーネ ン ト は実行を 中止 し ます。 EAServer ア プ リ ケーシ ョ ンのそのほかの利点 EAServer コ ン ポーネ ン ト を使用 し た PowerBuilder ク ラ イ ア ン ト ア プ リ ケーシ ョ ンは、 ど の タ イ プの EAServer コ ン ポーネ ン ト か ら 送出 さ れ た例外 も 処理で き ます。 例外を送出す る よ う に定義 さ れた メ ソ ッ ド を 持つ Java EAServer コ ン ポーネ ン ト があ り 、その コ ン ポーネ ン ト を使用 し て PowerBuilder プ ロ キ シ を作成す る と 、 PowerBuilder プ ロ キ シ上の メ ソ ッ ド も ユーザ定義の例外を送出す る よ う に宣言 さ れ ます。 ユーザ 定義の例外に関す る 定義は、 PowerBuilder プ ロ キ シの作成時に自動的 に作成 さ れます。 EAServer のエ ラ ー処理についての詳細は、 556 ページの 「エ ラ ー処理」 を参照 し て く だ さ い。 IDL の制限 EAServer のコ ン ポーネン ト を 配布する 場合は、PowerBuilder 内での例外処理の使い方に制限が課 さ れます。IDL に変換 さ れ る のは、 該当す る 例外型に定義 さ れた パブ リ ッ ク な イ ン ス タ ン ス 変数だ け で す。 こ れは、 IDL 例外を送出す る よ う に メ ソ ッ ド を宣言す る こ と はで き ないためです。 し たが っ て、 特定の例外型が送出 さ れ る よ う に定義 さ れた メ ソ ッ ド があ る 場合、 それ ら の メ ソ ッ ド を コ ン ポーネ ン ト の実 行中に呼び出す こ と はで き ますが、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン か ら それ ら の メ ソ ッ ド を呼び出 し て送出 さ れた例外を捕捉す る こ と はで き ません。 分散アプ リ ケーシ ョ ン での例外オブジ ェ ク ト を設計す る と き には、 こ の制限を忘れない よ う に し な ければな り ません。 すなわち、 分散アプ リ ケーシ ョ ン では、 すべての例外情報を、 例外オブジ ェ ク ト のア ク セ サ メ ソ ッ ド を介 し てではな く 、 パブ リ ッ ク な イ ン ス タ ン ス変数 と し て 公開す る 必要があ り ます。 EAServer コ ン ポーネ ン ト と し て配布 さ れ る ユーザ オブ ジ ェ ク ト の例 外型に適用 さ れ る イ ン タ フ ェース上の制限があ と 2 つあ り ます。 ユー ザ オブジ ェ ク ト メ ソ ッ ド の例外を表す イ ン ス タ ン ス変数は、オブジ ェ ク ト デー タ 型を持つ こ と がで き ません。 ま た、 Null デー タ は、 単純な デー タ 型を 持つ イ ン ス タ ン ス 変数の場合だけサポー ト さ れてい ま す。 イ ン ス タ ン ス変数が構造体ま たは配列の場合、 各要素の Null 値は維持 さ れ ません。 46 PowerBuilder 第 3 章 PowerScript についての特別な ト ピ ッ ク 柔軟性の向上 と オブ ジ ェ ク ト の再利用の促進 例外処理を使用す る と 、 PowerBuilder アプ リ ケーシ ョ ン の柔軟性を高 め、ビ ジネ ス ルールを プ レ ゼン テーシ ョ ン ロ ジ ッ ク か ら 切 り 離す こ と がで き ます。 た と えば、 ビ ジネ ス ルールを、 以下の非ビ ジ ュ アル オブ ジ ェ ク ト (nvo) に格納で き ます。 • プ レ ゼン テーシ ョ ン オブジ ェ ク ト への参照を保持す る イ ン ス タ ン ス変数 powerobject my_presenter • プ レ ゼン テーシ ョ ン オブジ ェ ク ト を登録す る 関数 登録用関数には次の構文を使用 し ます。 SetObject (string my_purpose, powerobject myobject) • プ レ ゼン テーシ ョ ン オブジ ェ ク ト に よ っ て実装 さ れた動的関数を 呼び出す コ ー ド (デー タ の表示方法については最小限の機能のみ をサポー ト ) 動的関数呼び出 し は、 次の よ う に try-catch ブ ロ ッ ク で囲む必要が あ り ます。 TRY my_presenter.Dynamic nf_displayScreen(" ") CATCH (Throwable lth_exception) Throw lth_exception END TRY こ の try-catch ブ ロ ッ ク は、 プ レ ゼン テーシ ョ ン オブジ ェ ク ト で発 生す る シ ス テ ム エ ラ ー と ユーザ定義のエ ラ ーをすべて捕捉 し 、 呼 び出 し 元 ( こ の nvo を呼び出 し たオブジ ェ ク ト ) に送出 し ます。 上 の例では、CATCH 文で送出 さ れ る オブジ ェ ク ト の型が Throwable に な っ てい ま すが、 次の よ う にユーザ定義の例外オブジ ェ ク ト を イ ン ス タ ン ス化お よ び送出す る こ と も で き ます。 uo_exception luo_exception TRY my_presenter.Dynamic nf_displayScreen(" ") CATCH (Throwable lth_exception) luo_exception = Create uo_exception luo_exception.SetMessage & + (lth_exception.GetMessage()) Throw luo_exception END TRY ア プ リ ケーシ ョ ン テ ク ニ ッ ク 47 PowerBuilder での例外処理 デー タ 処理用の コ ー ド は、 プ レ ゼン テーシ ョ ン オブジ ェ ク ト 、 ビ ジネ ス ルール nvo、 ま た は nvo に よ っ て呼び出 さ れ る デー タ 処理用オ ブ ジ ェ ク ト に追加で き ます。 具体的に ど の よ う な設計にす る かは ビ ジネ ス の目的に よ っ て 異 な り ま すが、 こ のデー タ 処理用の コ ー ド も trycatch ブ ロ ッ ク で囲む必要があ り ます。 実行す る ア ク シ ョ ン と (処理失 敗時に) 報告す る エ ラ ー メ ッ セージは、 処理用 コ ー ド を囲む try-catch ブ ロ ッ ク 内でで き る かぎ り 具体的に指定 し ます。 こ の手法には大 き な利点がい く つかあ り ます。 まず、 ビ ジネ ス nvo を 非常に簡単に再利用で き る よ う にな り ます。 こ れに よ り 、 同 じ ビ ジネ ス デー タ を さ ま ざ ま な方法で表示す る オブジ ェ ク ト か ら ビ ジネ ス nvo を使用で き ます。 ま た、 例外処理を追加 し た こ と に よ り 堅牢性が大幅 に向上 し 、 アプ リ ケーシ ョ ン ユーザがエ ラ ー条件か ら 回復で き る 可能 性が高 く な り ます。 SystemError イ ベ ン ト と Error イ ベ ン ト の使い方 Error イ ベン ト 実行時エ ラ ーが発生す る と 、 そのエ ラ ーを記述す る エ ラ ー構造体が作 成 さ れ ます。 リ モー ト サーバ (EAServer な ど) と の接続の コ ン テ キ ス ト でエ ラ ーが発生す る と 、 接続、 JaguarORB、 デー タ ウ ィ ン ド ウ 、 OLE な ど の コ ン ト ロ ール オブ ジ ェ ク ト の Error イ ベン ト が起動 さ れ ま す。 こ の と き 、 エ ラ ー構造体の情報が引数 と し て渡 さ れます。 こ の Error イ ベン ト 内でエ ラ ーを処理す る には、特殊な参照引数を使用 し てエ ラ ーを無視で き る よ う に し ます。 上記の コ ン テ キ ス ト でエ ラ ー が発生 し ないか、 ま たは上記の コ ン テ キ ス ト で発生 し たエ ラ ーが処理 さ れない と 、 エ ラ ー構造体情報がグ ロ ーバル エ ラ ー変数に格納 さ れ、 アプリ ケーショ ン オブジェ ク ト の SystemError イ ベン ト が起動さ れま す。 SystemError イ ベン ト SystemError イ ベン ト では、 予期せぬエ ラ ー条件を制限 さ れた方法で処 理で き ます。 一般に、 SystemError イ ベン ト が起動 さ れた後 も 処理を継 続す る のは よ く あ り ません。 し か し 、 SystemError イ ベン ト にはエ ラ ー 処理用の コ ー ド を追加で き る よ う にな っ てお り 、 ま た追加す る べ き で す。 SystemError イ ベ ン ト は通常、 ア プ リ ケ ーシ ョ ン を 終了す る 前に デー タ を保存 し た り 、 (フ ァ イ ルやデー タ ベー ス 接続 を 閉 じ る と い っ た) 最後の後処理を実行す る ために使用 し ます。 例外ハン ド ラ および イ ベン ト の優先順位 Error イ ベン ト 内に コ ー ド を書 く と 、 例外発生時に まずその コ ー ド が実 行 さ れ ます。 48 PowerBuilder 第 3 章 PowerScript についての特別な ト ピ ッ ク 上記の ど の コ ン テ キ ス ト で も 例外を送出 し ない と 、 ま たはオブジ ェ ク ト の Error イ ベ ン ト に よ っ て例外が処理 さ れな いか Error イ ベ ン ト を コ ーデ ィ ン グ し ない と 、 その例外型を処理で き る 任意のア ク テ ィ ブな 例外ハン ド ラ (CATCH 句) に よ っ て例外が処理 さ れ ます。 例外を処理 す る 例外ハン ド ラ が存在 し ない場合にかぎ っ て、 例外 ク ラ ス の情報が グ ロ ーバルなエ ラ ー変数に コ ピー さ れ、 アプ リ ケーシ ョ ン オブジ ェ ク ト の SystemError イ ベン ト が起動 さ れます。 新規ア プ リ ケーシ ョ ン のエ ラ ー処理 新規の PowerBuilder アプ リ ケーシ ョ ン では、 接続、 デー タ ウ ィ ン ド ウ 、 OLE な ど の コ ン ト ロ ール オブジ ェ ク ト の Error イ ベン ト を コ ーデ ィ ン グす る のではな く 、 try-catch ブ ロ ッ ク を使用 し てエ ラ ーを処理す る こ と をお勧め し ます。 ただ し 、 捕捉 さ れない例外を処理す る ために、 ア プ リ ケーシ ョ ン オブジ ェ ク ト には SystemError イ ベン ト を設定 し てお く 必要があ り ます。 SystemError イ ベン ト は本質的に、 PowerBuilder ア プ リ ケーシ ョ ン のグ ロ ーバルな例外ハン ド ラ にな り ます。 ガベージ コ レ ク シ ョ ン と メ モ リ 管理 PowerBuilder のガベージ コ レ ク シ ョ ン機能は、 未参照の孤立 し たオブ ジ ェ ク ト がないか ど う か メ モ リ を自動的にチ ェ ッ ク し 、 も し あればそ れを削除 し ます。 こ れに よ り 、 大半の メ モ リ リ ー ク を防 ぐ こ と がで き ます。 ガベージ コ レ ク シ ョ ン を使用す る と 、 DESTROY 文で明示的に指 示す る こ と な く オブジ ェ ク ト を破壊で き ます。 こ れに よ り 、 ほかのプ ロ セ ス で使用中のオブジ ェ ク ト やポ ス ト さ れた イ ベン ト や関数に参照 渡 し さ れたオブジ ェ ク ト を間違っ て破壊 し て し ま う こ と に よ っ て起 こ る 実行時エ ラ ーを防 ぐ こ と がで き ます。 ガベージ コ レ ク シ ョ ンが発生する状況 ガベージ コ レ ク シ ョ ンが発生す る のは、 次の よ う な場合です。 • ア プ リ ケーシ ョ ン テ ク ニ ッ ク オブ ジ ェ ク ト から 参照が削除 さ れた と き オブジェ ク ト への参照と は、 値が object 型のすべての変数の こ と です。 こ れ ら の変数が ス コ ー プの外に出 る か ま たは object 型以外の値が代入 さ れ る かす る と 、 PowerBuilder は、 そのオブジ ェ ク ト への参照を 1 つ削除 し 、 残 り の 参照数を数え て、 参照数がゼ ロ な ら そのオブジ ェ ク ト を破棄 し ま す。 49 ガベージ コ レ ク シ ョ ン と メ モ リ 管理 イ ベン ト と 関数のポス ト イ ベ ン ト ま た は関数 を ポ ス ト し て オ ブ ジ ェ ク ト への参照 を 渡す と 、 PowerBuilder はそのオブジ ェ ク ト への内部参照を追加 し ます。 こ れに よ り 、 ポ ス ト し てか ら その イ ベン ト ま たは関数が終了す る ま での間に、 そのオブジ ェ ク ト が占有 し てい る メ モ リ がガベージ コ レ ク シ ョ ン に よ っ て収集 さ れな く な り ます。 追加 さ れた参照は、 その イ ベン ト ま たは関数の実行が終了す る と 削除 さ れ ます。 • ガベージ コ レ ク シ ョ ンの対象にな ら ないオ ブジ ェ ク ト ガベージ コ レ ク シ ョ ンの発生の制御 PowerBuilder はシ ス テ ム に よ っ て起動 さ れた イ ベン ト の処理を終え た と き 、 前回の ガベージ コ レ ク シ ョ ン か ら の経過時間が所定の実行間隔を超え て いれば、 ガベージ コ レ ク シ ョ ン操作を実行 し ます。 デフ ォ ル ト の 実行間隔は 0.5 秒です。 ガベージ コ レ ク シ ョ ン操作では、 参照で き ないオブジ ェ ク ト と ク ラ ス がすべて削除 さ れ ま す。 こ れには循 環参照 (相互に参照 し 合っ てい る が、 ほかか ら は一切参照 さ れて いないオブジ ェ ク ト ) も 含ま れ ます。 所定のガベージ コ レ ク ショ ン 実行間隔を超えた と き 次のオブジ ェ ク ト はガベージ コ レ ク シ ョ ンの対象か ら 除外 さ れ ます。 • ビ ジ ュ アル オブ ジ ェ ク ト 画面に表示 さ れ る オブ ジ ェ ク ト は、 画面 で作成 さ れ表示 さ れ る と き に内部参照が追加 さ れ る ため、 ガベー ジ コ レ ク シ ョ ンは行われ ません。 ビ ジ ュ アル オブジ ェ ク ト は、 閉 じ る と き に明示的に破棄 し ます。 • タ イ ミ ング オブ ジ ェ ク ト タ イ ミ ン グ オ ブ ジ ェ ク ト の Start 関数は そのオブジ ェ ク ト の内部参照を追加す る ため、 現在実行中の タ イ ミ ン グ オブジ ェ ク ト にはガベージ コ レ ク シ ョ ンは行われ ません。 Stop 関数を呼び出す と 追加 さ れた参照が削除 さ れ ます。 • SharedObjectRegister 関数は内部参照 を 追加す る ため、 登録 さ れた共有オブジ ェ ク ト にはガベージ コ レ ク シ ョ ンは 行われ ません。 SharedObjectUnregister 関数を呼び出す と 、 追加 さ れ た内部参照が削除 さ れます。 共有オブ ジ ェ ク ト ガベージ コ レ ク シ ョ ンは PowerBuilder 内で自動的に行われ ま すが、関 数を呼び出 し て、ガベージ コ レ ク シ ョ ン を強制実行 し た り 、参照カウ ン ト を チェ ッ ク する 間隔を 変更する こ と も でき ま す。ガベージ コ レ ク ショ ン 発生を 制御する 関数と し て、GarbageCollect、GarbageCollectGetTimeLimit、 お よ び GarbageCollectSetTimeLimit の 3 つが用意 さ れてい ます。 こ れ ら の関数についての詳細は、 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ アルを参照 し て く だ さ い。 こ れ ら の関数を使用例については、 第 1 章 「サ ン プル アプ リ ケーシ ョ ン の使い方」 の Code Examples サ ン プル ア プ リ ケーシ ョ ン を参照 し て く だ さ い。 50 PowerBuilder 第 3 章 PowerScript についての特別な ト ピ ッ ク パフ ォ ーマ ン スに関す る考慮点 ト レース と プ ロ フ ァ イ ルを使用す る と 、 ガベージ コ レ ク シ ョ ン の実行 間隔を変更す る こ と に よ る パ フ ォ ーマ ン スへの影響を調べ る こ と がで き ます。 ト レース と プ ロ フ ァ イ ルの詳細については、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 メ モ リ 管理の設定 PowerBuilder メ モ リ マネージ ャ が別の メ モ リ 割 り 当て方法に切 り 替え る と き の閾値を指定す る には、 PB_POOL_THRESHOLD 環境変数を設 定 し ます。 ほ と ん ど の ウ ィ ン ド ウ 、 デー タ ウ ィ ン ド ウ 、 デー タ ス ト ア、 ま たはそ のほかの PowerBuilder オブジ ェ ク ト がガベージ コ レ ク タ に よ っ て破棄 ま たは解放 さ れ る と 、PowerBuilder ヒ ープ マネージ ャ は、そのオブジ ェ ク ト に割 り 当て ら れていた メ モ リ を グ ロ ーバル メ モ リ プールに戻 し 、 それ を利用可能な メ モ リ と し て グ ロ ーバル フ リ ー リ ス ト に記録 し ま す。 解放 さ れた メ モ リ は、 オペレーテ ィ ン グ シ ス テ ムには戻 さ れませ ん。 新規オブジ ェ ク ト が作成 さ れ る と き に、 PowerBuilder は、 グ ロ ー バル フ リ ー リ ス ト に十分な利用可能 メ モ リ が あ る 場合はグ ロ ーバル メ モ リ プールの メ モ リ ブ ロ ッ ク 、 ない場合はオペレーテ ィ ン グ シ ス テ ム の メ モ リ ブ ロ ッ ク を オブ ジ ェ ク ト の メ モ リ プールに割 り 当て ま す。 オブジ ェ ク ト に必要な メ モ リ が 256 KB を超え る 場合、PowerBuilder は 別の方法で メ モ リ を 割 り 当て ま す。 メ モ リ が要求 さ れ る と オペ レ ー テ ィ ン グ シ ス テ ム か ら 大 き いブ ロ ッ ク で以降の メ モ リ を割 り 当て、 オ ブ ジ ェ ク ト が破棄 さ れ る と 物理 メ モ リ を オペ レ ーテ ィ ン グ シ ス テ ム に戻 し ます。 ま た、 仮想ア ド レ ス 空間の フ ラ グ メ ン テーシ ョ ン を抑え る ために仮想 メ モ リ を保持 し ます。 ほ と ん ど のアプ リ ケーシ ョ ン と コ ン ポーネ ン ト では、 必要な メ モ リ が 256 KB の閾値に達 し た と き に、 PowerBuilder は 「大 き いブ ロ ッ ク 」 の 方法に切 り 替え ます。 こ れに よ り 、 メ モ リ は適切に割 り 当て ら れ、 ア プ リ ケーシ ョ ン が ピー ク 時に必要 と す る メ モ リ も 少な く な り ます。 た だ し 、 アプ リ ケーシ ョ ン が使用す る 全体の物理 メ モ リ を で き る だけ少 な く す る 必要があ る 場合は、 こ の閾値を も っ と 低 く 設定で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 51 ガベージ コ レ ク シ ョ ン と メ モ リ 管理 低い閾値を設定す る と 、グ ロ ーバル メ モ リ プールのサ イ ズが縮小 さ れ る と い う 利点があ り ます。 アプ リ ケーシ ョ ンは、 動作 し ていない と き は メ モ リ の大部分を保持 し ません。 ただ し 、 欠点 と し て、 設定 し た閾 値 よ り 多 く の メ モ リ を 必要 と す る オ ブ ジ ェ ク ト に大 き い メ モ リ ブ ロ ッ ク が割 り 当て ら れた場合、 アプ リ ケーシ ョ ン が ピー ク 時に使用す る 仮想 メ モ リ 量がデフ ォ ル ト の閾値の場合 よ り も 多 く な る 可能性があ り ます。 低い閾値 を 設定す る のは、 長時間動作す る ク ラ イ ア ン ト ア プ リ ケー シ ョ ン が動作時間の短いオブジ ェ ク ト を多数使用す る 場合に適 し てい ます。 こ の よ う な アプ リ ケーシ ョ ン では、 メ モ リ 使用量が少な く な っ た り (ア イ ド ル時) 多 く な っ た り (動作時) す る か ら です。 サーバな ど のマルチ ス レ ッ ド アプ リ ケーシ ョ ン の場合は、 高い閾値を設定す る と 、 通常は仮想 メ モ リ の使用量が少な く な り ます。 ヒ ープ マネージ ャ出 力のログへの記録 PowerBuilder ヒ ープ マネージャ の診断出力を フ ァ イ ルに記録でき ま す。 こ の情報は、 アプリ ケーショ ン における メ モリ 割り 当ての問題を 解決す る 際に役立ちま す。フ ァ イ ルの名前と 場所は PB_HEAP_LOGFILENAME 環境変数で設定 し ます。 ディ レ ク ト リ ではなく フ ァ イ ル名を 指定する と 、フ ァ イ ルは PowerBuilder の実行フ ァ イ ル と 同 じ デ ィ レ ク ト リ に保存 さ れ ます。ま たは、EAServer で動作 し てい る PowerBuilder コ ン ポーネ ン ト の場合は、EAServer の bin デ ィ レ ク ト リ に保存 さ れ ます。 存在 し ないデ ィ レ ク ト リ を指定 し た場合、フ ァ イ ルは作成 さ れ ません。 ま たは、 EAServer で動作 し てい る PowerBuilder コ ン ポーネ ン ト の場合 は、 EAServer の ロ グ フ ァ イ ル (Jaguar.log) に出力が書 き 込まれます。 デフ ォ ル ト では、 ロ グ フ ァ イ ルは、 PowerBuilder ま たは EAserver を再 起動す る たびに上書 き さ れ ます。 診断出力を フ ァ イ ルの最後に追加す る には、 PB_HEAP_LOGFILE_OVERWRITE に false を設定 し ます。 環境変数は、 アプ リ ケーシ ョ ン を起動す る バ ッ チ フ ァ イ ルで設定す る か、 アプ リ ケーシ ョ ン ま たは コ ン ポーネ ン ト を実行す る コ ン ピ ュ ー タ やサーバ上でシ ス テ ム環境変数ま たはユーザ環境変数 と し て設定で き ます。 PowerBuilder お よ び EAserver で メ モ リ 管理をチ ュ ーニ ン グす る 方法に ついては、テ ク ニ カル ド キ ュ メ ン ト EAServer/PowerBuilder Memory Tuning and Troubleshooting http://www.sybase.com/detail?id=1027319 を参照 し て く だ さ い。 52 PowerBuilder 第 3 章 PowerScript についての特別な ト ピ ッ ク 効率的な コ ンパイル と パ フ ォ ーマ ン ス 関数の記述の仕方や変数の定義の仕方は、 開発の生産性 と アプ リ ケー シ ョ ン のパフ ォーマ ン ス に影響を与え ます。 ス ク リ プ ト を短 く し て コ ンパイル時間を短縮 する 配布アプ リ ケーシ ョ ン用の動的 ラ イ ブ ラ リ を構築す る 場合は、 関数 と イ ベン ト の ス ク リ プ ト を短 く す る よ う に し て く だ さ い。 ス ク リ プ ト が 長い と コ ンパ イ ルに時間がかか り ま す。 1 つの長い ス ク リ プ ト を書 く かわ り に、 ほかの複数の関数を呼び出すス ク リ プ ト を作成で き る よ う に、 ス ク リ プ ト を分割 し て く だ さ い。ユーザ オブジ ェ ク ト 内の関数を、 ほかのオブジ ェ ク ト か ら も 呼び出せ る よ う に定義す る こ と を考え て く だ さ い。 ロー カル変数を使用 し てパフ ォ ーマ ン ス を向 上 変数の ス コ ープはパフ ォ ーマ ン ス に影響を与え ます。 で き る だけ ロ ー カル変数を使 う よ う に し て く だ さ い。 そ う すれば、 パ フ ォ ーマ ン ス が 向上 し ます。 グ ロ ーバル変数を使 う と 、 パ フ ォ ーマ ン ス が大幅に低下 し ます。 テキス ト フ ァ イル と バイ ナ リ フ ァ イルの読み書き ラ イ ン モー ド ま たは ス ト リ ーム モー ド で ASCII テ キ ス ト を読み書 き し た り 、 ス ト リ ーム モー ド でバ イ ナ リ フ ァ イ ルを読み書 き す る には、 PowerScript のテ キ ス ト フ ァ イ ル関数を使用 し ます。 • ラ イ ン モー ド では、 キ ャ リ ッ ジ リ タ ーン か改行 (CR/LF) ま たは フ ァ イ ルの終わ り (EOF) が現れ る ま で、 一度に 1 行ずつ フ ァ イ ル を読み込み ま す。 フ ァ イ ルに書 き 込む と き は、 指定 さ れた文字 列を書 き 込んだ後、 CR/LF を追加 し ます。 • ス ト リ ーム モー ド では、 フ ァ イ ルの中身を、 CR/LF も 含めてすべ て読み込む こ と がで き ま す。 フ ァ イ ルに書 き 込む と き は、 指定 さ れた文字列を書 き 込みます (ただ し 、 CR/LF は追加 し ません)。 マルチ ラ イ ン エデ ィ ッ ト に フ ァ イルを読み込む ス ト リ ー ム モ ー ド を 使用す る と 、 フ ァ イ ル全体 を マ ル チ ラ イ ン エ デ ィ ッ ト に読み込み、 修正 し た後に書 き 出す こ と がで き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 53 テキス ト フ ァ イル と バイ ナ リ フ ァ イルの読み書き 位置ポ イ ン タ PowerBuilder は、 フ ァ イ ル を開 く と 、 その フ ァ イ ルに一意な整数を割 り 当て、 フ ァ イ ルの位置ポ イ ン タ を指定 さ れた位置 (フ ァ イ ルの先頭 ま たは末尾) に設定 し ます。 フ ァ イ ルを読み書 き し た り 閉 じ た り す る と き に、 こ の一意な整数を使用 し て フ ァ イ ルを特定 し ます。 位置ポ イ ン タ は、 次の読み書 き の開始位置を指 し ます。 読み書 き を実行す る た びに、 位置ポ イ ン タ が自動的に進め ら れ ます。 位置ポ イ ン タ は、 FileSeek 関数を使用 し て設定す る こ と も で き ます。 フ ァ イル操作関数 PowerScript には、 次の フ ァ イ ル操作用組み込み関数が用意 さ れてい ま す。 表 3-1: PowerScript のフ ァ イル操作用関数 54 関数 戻 り デー タ 型 動作内容 FileClose Integer FileDelete Boolean FileExists Boolean FileLength Long FileOpen Integer FileRead Integer FileSeek Long FileWrite Integer 指定 さ れた フ ァ イ ルを閉 じ る 指定 さ れた フ ァ イ ルを削除する 指定 さ れた フ ァ イ ルが存在す る か ど う か を 判定す る 指定 さ れた フ ァ イ ルの長 さ を取得する 指定 さ れた フ ァ イ ルを開 く 指定 さ れた フ ァ イ ルを読み込む 指定 さ れた フ ァ イ ル内の特定位置に位置ポ イ ン タ を設定す る 指定 さ れた フ ァ イ ルに書 き 込む PowerBuilder 第 4 章 PowerBuilder のク ラ ス 定義に関す る 情報の取得 こ の章について こ の章では、 ク ラ ス 定義情報の概要、 その使い方、 お よ びサ ン プ ル コ ー ド につい て説明 し ま す。 ツ ール と オブ ジ ェ ク ト フ レ ーム ワ ー ク の開発者は、 似た よ う な特性を持つオブジ ェ ク ト の定義や レ ポー ト の作成な ど の作業に関 し て、 ク ラ ス 定義情報を使用で き ま す。 一般的な ビ ジ ネ ス ア プ リ ケーシ ョ ン を構築す る 場合には、 ク ラ ス定義情報を使用す る 必要はあ り ません。 内容 項目 ク ラ ス定義情報の概要 ク ラ ス定義の調査 ページ 55 59 ク ラ ス定義情報の概要 ClassDefinition オブジ ェ ク ト は、 PowerBuilder オブジ ェ ク ト の 1 つ であ り 、 別の PowerBuilder オブジ ェ ク ト の ク ラ ス に関す る 情報を 提供 し ま す。 PowerBuilder ラ イ ブ ラ リ 内の ク ラ ス、 ま たは イ ン ス タ ン ス 化 さ れた オブ ジ ェ ク ト の ク ラ ス を 調べ る こ と がで き ま す。 ク ラ ス の ClassDefinition オブジ ェ ク ト のプ ロ パテ ィ を調べ る こ と に よ っ て、 その ク ラ ス が PowerBuilder のオブジ ェ ク ト 階層構造に ど う 収ま る か を詳細に知 る こ と がで き ます。 ClassDefinition オブジ ェ ク ト か ら は、以下の項目を知 る こ と がで き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク • その ク ラ ス に定義 さ れた変数、 関数、 お よ び イ ベン ト • その ク ラ ス の先祖 • その ク ラ ス の親 • その ク ラ ス の子 (ネ ス テ ィ ッ ド ク ラ ス) 55 ク ラ ス定義情報の概要 関連する オブ ジ ェ ク ト ClassDefinition オブジ ェ ク ト は、 デー タ 型に関す る 情報を提供 し た り 、 ク ラ ス 定義に関連付け ら れた変数、 プ ロ パテ ィ 、 関数、 お よ び イ ベン ト ス ク リ プ ト に関す る 情報 を 提供 し た り す る オブ ジ ェ ク ト (TypeDefinition、 VariableDefinition、 お よ び ScriptDefinition な ど のオブ ジ ェ ク ト ) の階層構造の メ ンバです。 詳細については、 ブ ラ ウ ザ ま たは 『オブジ ェ ク ト と コ ン ト ロ ール』 マ ニ ュ アルを参照 し て く だ さ い。 イ ン ス タ ン ス化 さ れたオブ ジ ェ ク ト の定義 ClassDefinition プ ロ パ テ ィ を 使 う と 、 ClassDefinition オブジ ェ ク ト を使っ て、 各オブジ ェ ク ト の イ ン ス タ ン ス か ら 、 オブジ ェ ク ト の記述を取得で き ます。 ClassDefinition オ ブジ ェ ク ト は、 変数の値な ど のオブジ ェ ク ト イ ン ス タ ン ス に関す る 情 報を提供 し ません。 こ の よ う な情報は、 イ ン ス タ ン ス か ら 直接取得す る 必要があ り ます。 ク ラ ス情報を取得す る には、 必ず し も オ ブ ジ ェ ク ト が イ ン ス タ ン ス 化 さ れ て い る 必 要 は あ り ま せ ん。 PowerBuilder ラ イ ブラ リ 内のオブジェ ク ト の場合には、FindClassDefinition 関数を呼び出 し て、 その ClassDefinition オブジ ェ ク ト を取得で き ます。 ラ イ ブ ラ リ でのオブ ジ ェ ク ト の定義 ク ラ ス 定義オ ブ ジ ェ ク ト を 使用す る と オーバーヘ ッ ド が大 き く な る よ う に思われ ま すが、 オーバーヘ ッ ド が生 じ る のは ClassDefinition オブ ジ ェ ク ト を参照す る と き だけです。 ClassDefinition オブ ジ ェ ク ト が イ ン ス タ ン ス 化 さ れ る のは、 FindClassDefinition を呼び 出す と き 、 お よ び PowerBuilder オブジ ェ ク ト の ClassDefinition プ ロ パ テ ィ に ア ク セ ス す る と き に限 ら れ ま す。 同様に、 ClassDefinition オブ ジ ェ ク ト のプ ロ パテ ィ 自身が ClassDefinition ま たは VariableDefinition オブジ ェ ク ト で あ る 場合には、 オブジ ェ ク ト が イ ン ス タ ン ス 化 さ れ る のは、 それ ら のプ ロ パテ ィ を参照す る と き だけです。 パ フ ォ ーマ ン ス 用語 ク ラ ス情報には、オブジ ェ ク ト 間の関係についての情報が含まれ ます。 こ れ ら の定義は、 情報の意味を理解す る と き に役立ち ます。 オブ ジ ェ ク ト イ ン ス タ ンス 56 オブジ ェ ク ト を具現化 し た も のです。 イ ン ス タ ン ス は メ モ リ 内に存在 し 、 そのプ ロ パテ ィ と 変数には値が割 り 当て ら れてい ます。 オブジ ェ ク ト イ ン ス タ ン ス が存在す る のは、 アプ リ ケーシ ョ ン を実行す る と き だけです。 PowerBuilder 第 4 章 PowerBuilder の ク ラ ス定義に関する情報の取得 ク ラス オブジ ェ ク ト の定義であ り 、 オブジ ェ ク ト イ ン ス タ ン ス を作成す る た めの ソ ース コ ー ド を含んでい ます。PowerBuilder ペ イ ン タ を使用 し て、 オブジ ェ ク ト を PBL に保存す る と き には、 オブジ ェ ク ト の ク ラ ス定義 を作成 し てい る こ と にな り ます。 アプ リ ケーシ ョ ン を実行す る 場合に は、 ク ラ ス は、 その ク ラ ス に基づ く オブジ ェ ク ト イ ン ス タ ン ス のデー タ 型 と な り ます。 PowerBuilder では、 「オブジ ェ ク ト 」 と い う 用語は一 般にオブジ ェ ク ト の イ ン ス タ ン ス を表 し ます。 場合に よ っ ては、 オブ ジ ェ ク ト の ク ラ ス を表す こ と も あ り ます。 シ ス テム ク ラ ス PowerBuilder に よ っ て定義 さ れ る ク ラ ス です。 ペ イ ン タ で定義す る オ ブジ ェ ク ト は、 た と え定義す る オブジ ェ ク ト の継承を使用す る よ う 明 示的に選択 し ない場合で も 、 シ ス テ ム ク ラ ス の子孫 と な り ます。 親 現行のオブジ ェ ク ト を含むオブジ ェ ク ト 、 ま たは継承以外の方法でオ ブジ ェ ク ト に接続 さ れてい る オブジ ェ ク ト です。 次の表に、 ク ラ ス と 、 その親になれ る ク ラ ス を示 し ます。 表 4-1: ク ラ ス と 親 オブ ジ ェ ク ト ウィンドウ 親 その ウ ィ ン ド ウ を開いた ウ ィ ン ド ウ メ ニ ュ ー項目 ウ ィ ン ド ウ は親を持た ない こ と も あ る 。 親は実行 時に決定 さ れ、 ク ラ ス定義の一部ではない メ ニ ュ ーにおけ る 前の レベルの メ ニ ュ ー項目 ウ ィ ン ド ウ上の コ ン ト ロ ール ユーザ オブジ ェ ク ト 上 の コ ン ト ロ ール タ ブ ページ リ ス ト ビ ュ ー項目ま た はツ リ ービ ュ ー項目 ビ ジ ュ アル ユーザ オブ ジェ ク ト メ ニ ュ ー バー上の項目は、 関連す る ド ロ ッ プダ ウ ン メ ニ ュ ー上のすべての項目の親 と な る ウィンドウ ユーザ オブジ ェ ク ト こ のオブジ ェ ク ト が定義 さ れてい る か、 ま たは開 かれた タ ブ コ ン ト ロ ール リ ス ト ビ ュ ーま たはツ リ ービ ュ ー コ ン ト ロ ール ユーザ オブジ ェ ク ト が置かれてい る ウ ィ ン ド ウ ま たはユーザ オブジ ェ ク ト 子 別の親 ク ラ ス に含まれてい る ク ラ ス です。 ネ ス テ ィ ッ ド ク ラ ス と も 呼 ばれ ます。親 と 子の関係を持つオブジ ェ ク ト の タ イ プに関 し ては、「親」 を参照 し て く だ さ い。 先祖 その定義か ら 別のオブジ ェ ク ト が継承 さ れ る ク ラ ス です。 「子孫」 も 参 照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 57 ク ラ ス定義情報の概要 子孫 別の オ ブ ジ ェ ク ト か ら 継承 さ れ、 そ の オ ブ ジ ェ ク ト の特質 (プ ロ パ テ ィ 、 関数、 イ ベ ン ト 、 お よ び変数) を 内蔵す る オブ ジ ェ ク ト です。 子孫は、 こ れ ら の値を使用 し た り 、 新 し い定義で こ れ ら の値に上書 き す る こ と がで き ます。 ペ イ ン タ で定義 し て ラ イ ブ ラ リ に格納す る オブ ジ ェ ク ト は、 すべて PowerBuilder シ ス テ ム ク ラ ス の子孫です。 継承階層 オブジ ェ ク ト お よ びそのすべての先祖です。 折 り たたまれた階層 オブジ ェ ク ト ク ラ ス定義の ビ ュ ーであ り 、 現行レベルの継承で定義 さ れてい る 項目に加え て、 オブジ ェ ク ト の継承ツ リ ー内のすべての先祖 か ら の情報 も 含んでい ます。 スカ ラ オブジェ ク ト でも 配列でも ない、単純なデータ 型です。たと えば、Integer、 Boolean、 Date、 Any、 お よ び String です。 イ ン ス タ ン ス変数 と プ ロパテ ィ PowerBuilder シ ス テ ム オブジ ェ ク ト に組み込まれた属性はプ ロ パテ ィ と 呼ばれ ますが、 ク ラ ス 定義情報では イ ン ス タ ン ス変数 と し て扱われ ます。 PowerBuilder ク ラ ス定義の使用について 多 く の ビ ジネ ス アプ リ ケーシ ョ ン では、 ク ラ ス定義情報を使用す る 必 要はあ り ません。 ク ラ ス定義情報を使用す る コ ー ド は、 ク ラ ス ラ イ ブ ラ リ 、 アプ リ ケーシ ョ ン フ レーム ワ ー ク 、 お よ び開発支援ツールを記 述す る グループに よ っ て記述 さ れ ます。 アプ リ ケーシ ョ ン には ク ラ ス 定義情報を使用す る コ ー ド が含 ま れてい ないか も し れ ませんが、 デザ イ ン、 ド キ ュ メ ン テーシ ョ ン、 お よ び ク ラ ス ラ イ ブ ラ リ に使用す る ツ ールには含 ま れて い る 可能性が あ り ま す。 こ れ ら の ツールは、 アプ リ ケーシ ョ ン の解析 と フ ィ ー ド バ ッ ク の 提供がで き る よ う 、 オブジ ェ ク ト の ク ラ ス定義を調べます。 シナ リ オ 以下の開発を行 う 場合には、 ク ラ ス情報を使用す る こ と があ り ます。 • カ ス タ ム オブジ ェ ク ト ブ ラ ウ ザ • アプ リ ケーシ ョ ン のオブジ ェ ク ト と それ ら の関係を知 る 必要のあ る ツール 目的 と し ては、 ア プ リ ケーシ ョ ン を文書化 し た り 、 オブジ ェ ク ト を選択お よ び操作す る ための論理的な方法を提供 し た り す る こ と が挙げ ら れ ます。 • 58 PowerBuilder オブジ ェ ク ト を分解 し 、ユーザに よ る デザ イ ン変更 と 再構築を可能にす る CASE ツール PowerBuilder 第 4 章 PowerBuilder の ク ラ ス定義に関する情報の取得 再構築を行 う ために、 CASE ツールは、 PowerBuilder オブジ ェ ク ト の ソ ース コ ー ド 構文の知識 と ク ラ ス定義情報を必要 と し ます。 • オブジ ェ ク ト で、 イ ン ス タ ン ス 化 さ れたオブジ ェ ク ト に関連付け ら れた ク ラ ス を決定す る 必要が あ る ク ラ ス ラ イ ブ ラ リ 。 ま たは、 ス ク リ プ ト で、 使用可能な メ ソ ッ ド と 変数を想定す る ためにオブ ジ ェ ク ト の先祖を知 る 必要があ る ク ラ ス ラ イ ブ ラ リ ク ラ ス定義の調査 こ の節では、 ク ラ ス定義オブジ ェ ク ト へのア ク セ ス方法を説明 し ます。 さ ら に、 ク ラ ス 定義オブジ ェ ク ト のプ ロ パテ ィ を調べて、 ク ラ ス、 そ の ス ク リ プ ト 、 お よ びその変数に関す る 情報を取得す る 方法について も 説明 し ます。 ク ラ ス定義オブ ジ ェ ク ト の取得 ク ラ ス 情報を取 り 扱 う には、 ク ラ ス 定義オブジ ェ ク ト が必要 と な り ま す。 ク ラ ス 定義情報を含む ClassDefinition オブジ ェ ク ト を取得す る に は、 2 つの方法があ り ます。 ア プ リ ケーシ ョ ン内で イ ン ス タ ン ス化 さ れた オブ ジ ェ ク ト の場合 オブジ ェ ク ト の ClassDefinition プ ロ パテ ィ を使用 し ます。 た と えば、 ボ タ ン用の ス ク リ プ ト では、 次の コ ー ド は、 親 ウ ィ ン ド ウ の ク ラ ス定義を取得 し ます。 ClassDefinition cd_windef cd_windef = Parent.ClassDefinition PBL に格納 さ れたオ ブ ジ ェ ク ト の場合 FindClassDefinition を呼び出 し ます。 た と えば、 ボ タ ン用の ス ク リ プ ト では、次の コ ー ド は、 アプ リ ケーシ ョ ン の ラ イ ブ ラ リ リ ス ト 上の ラ イ ブ ラ リ か ら w_genapp_frame ウ ィ ン ド ウ の ク ラ ス定義を取得 し ます。 ClassDefinition cd_windef cd_windef = FindClassDefinition("w_genapp_frame") ア プ リ ケーシ ョ ン テ ク ニ ッ ク 59 ク ラ ス定義の調査 ク ラ スに関する詳細情報の取得 こ の節に含まれ る コ ー ド フ ラ グ メ ン ト では、 cd_windef と い う ClassDefinition オブジ ェ ク ト か ら 情報を取得す る 方法を説明 し ます。 cd_windef に値を割 り 当て る 例については、 「 ク ラ ス 定義オブ ジ ェ ク ト の取得」 を参照 し て く だ さ い。 ライブラ リ LibraryName プ ロ パテ ィ は、ク ラ ス の ロ ー ド 元 と な っ た ラ イ ブ ラ リ の名 前を レ ポー ト し ます。 s = cd_windef.LibraryName 先祖 Ancestor プ ロ パテ ィ は、 こ の ク ラ ス の継承元 と な っ た ク ラ ス の名前を レ ポー ト し ます。 すべてのオブジ ェ ク ト は PowerBuilder シ ス テ ム オブ ジ ェ ク ト か ら 継承 さ れ る ので、 Ancestor プ ロ パテ ィ は、PowerBuilder ク ラ ス の ClassDefinition オブジ ェ ク ト を保持で き ます。 ClassDefinition が (継承階層の最上位に あ る ) PowerObject 用で あ る 場合には、 Ancestor プ ロ パテ ィ には NULL オブジ ェ ク ト 参照があ り ます。 次の例では、cd_windef に よ っ て表 さ れ る ク ラ ス の先祖の ClassDefinition オブジ ェ ク ト を取得 し ます。 ClassDefinition cd_ancestorwindef cd_ancestorwindef = cd_windef.Ancestor 次の例では先祖の名前 を 取得 し ま す。 なお、 cd_windef に PowerObject の定義が含まれてい る 場合には、 Ancestor プ ロ パテ ィ が NULL と な る ため、 こ の コ ー ド を実行す る と エ ラ ーにな り ます。 ls_name = cd_windef.Ancestor.Name オブジ ェ ク ト が NULL でない こ と を テ ス ト す る には、 IsValid 関数を使 用 し ます。 次の例では、 w_genapp_frame ウ ィ ン ド ウ の継承階層を逆向 き にた ど っ て、 その先祖の リ ス ト を マルチ ラ イ ン エデ ィ ッ ト に表示 し ます。 string s, lineend ClassDefinition cd lineend = "~r~n" cd = cd_windef s = "Ancestor tree:"+ lineend DO WHILE IsValid(cd) s = s + cd.Name + lineend cd = cd.Ancestor LOOP 60 PowerBuilder 第 4 章 PowerBuilder の ク ラ ス定義に関する情報の取得 mle_1.Text = s 次の よ う な リ ス ト にな り ます。 Ancestor tree: w_genapp_frame window graphicobject powerobject 親 ClassDefinition オブジ ェ ク ト の ParentClass プ ロ パテ ィ は、 オブジ ェ ク ト の定義に指定 さ れた親 ( コ ン テナ) を レ ポー ト し ます。 ClassDefinition cd_parentwindef cd_parentwindef = cd_windef.ParentClass ク ラ ス に親がない場合には、 ParentClass は NULL オブジ ェ ク ト 参照 と な り ます。 次の例では、 ParentClass が有効なオブジ ェ ク ト で あ る こ と を テ ス ト し てか ら 、 その Name プ ロ パテ ィ をチ ェ ッ ク し ます。 IF IsValid(cd_windef.ParentClass) THEN ls_name = cd_windef.ParentClass.Name END IF ネス テ ィ ッ ド ク ラ ス または子ク ラ ス ClassDefinition オブジ ェ ク ト の NestedClassList 配列には、そのオブジ ェ ク ト が含んでい る ク ラ ス があ り ます。 NestedClassList 配列には先祖 と 子孫があ り ます。 NestedClassList 配列は先祖オブジ ェ ク ト の ク ラ ス を含む こ と がで き ま す。 た と えば、 先祖 ウ ィ ン ド ウ で定義 さ れ、 子孫 ウ ィ ン ド ウ で修正 さ れた コ マ ン ド ボ タ ンは、 子孫 ウ ィ ン ド ウ の配列に 2 度現われ ます (つ ま り 、 ウ ィ ン ド ウ と その先祖に現われ ます)。 次の ス ク リ プ ト では、 cd_windef で表 さ れ る ウ ィ ン ド ウ に定義 さ れた コ ン ト ロ ール と 構造体の リ ス ト を作成 し ます。 string s, lineend integer li lineend = "~r~n" s = s + "Nested classes:"+ lineend FOR li = 1 to UpperBound(cd_windef.NestedClassList) s = s + cd_windef.NestedClassList[li].Name & + lineend NEXT mle_1.Text = s ア プ リ ケーシ ョ ン テ ク ニ ッ ク 61 ク ラ ス定義の調査 次の ス ク リ プ ト で は、 ClassDefinition オ ブ ジ ェ ク ト cd_windef に あ る NestedClassList 配列を検索 し て、 入れ子の ド ロ ッ プダ ウ ン リ ス ト ボ ッ ク ス コ ン ト ロ ールを見つけ出 し ます。 integer li ClassDefinition nested_cd FOR li = 1 to UpperBound(cd_windef.NestedClassList) IF cd_windef.NestedClassList[li].DataTypeOf & = "dropdownlistbox" THEN nested_cd = cd_windef.NestedClassList[li] EXIT END IF NEXT オブ ジ ェ ク ト イ ン ス タ ン ス と オブ ジ ェ ク ト 参照のク ラ ス定義 先祖やネ ス テ ィ ッ ド オブ ジ ェ ク ト な ど、 イ ン ス タ ン ス 化 さ れた オブ ジ ェ ク ト の ClassDefinition オブジ ェ ク ト を取得 し て も 、 親 ク ラ ス ま た は子 ク ラ ス の イ ン ス タ ン ス への参照は行われ ません。 イ ン ス タ ン ス 化 さ れ た オ ブ ジ ェ ク ト へ の 参照 を 取得お よ び格納す る に は、 標準 の PowerBuilder プ ロ グ ラ ミ ン グ テ ク ニ ッ ク を使用 し ます。 ク ラ スのス ク リ プ ト に関する情報の取得 こ の節に含まれ る コ ー ド フ ラ グ メ ン ト では、 cd_windef と い う ClassDefinition オブジ ェ ク ト か ら ス ク リ プ ト 情報を取得す る 方法を説 明 し ます。 cd_windef に値を割 り 当て る 例については、 59 ページの 「 ク ラ ス定義オ ブジ ェ ク ト の取得」 を参照 し て く だ さ い。 スク リ プ トのリ ス ト ScriptList 配列には、 あ る ク ラ ス に定義 さ れてい る すべての関数 と イ ベ ン ト の ScriptDefinition オブジ ェ ク ト があ り ます。 関数が多重定義 さ れ た場合には、 その関数は異な る 引数 リ ス ト を付けて配列内に 1 回以上 現われ ます。 関数ま たは イ ベン ト が階層構造内の複数の レベルに コ ー ド を持っ てい る 場合には、 その関数ま たは イ ベン ト は、 コ ーデ ィ ン グ さ れたバージ ョ ン ご と に配列に現れます。 次の例では、 ScriptList 配列をループ し て、 ス ク リ プ ト 名の リ ス ト を作 成 し ます。 すべてのオブジ ェ ク ト が PowerObject か ら 継承 さ れ る ため、 すべてのオブジ ェ ク ト には、 ClassName や PostEvent な ど、 い く つかの 標準関数があ り ます。 62 PowerBuilder 第 4 章 PowerBuilder の ク ラ ス定義に関する情報の取得 string s, lineend integer li ScriptDefinition sd lineend = "~r~n" FOR li = 1 to UpperBound(cd_windef.ScriptList) sd = cd_windef.ScriptList[li] s = s + sd.Name + " " + lineend NEXT mle_1.Text = s 次の例では、 前の例を拡張 し て、 ScriptDefinition オブジ ェ ク ト 内の さ ま ざ ま なプ ロ パテ ィ にア ク セ ス し ます。 こ の例では、 ス ク リ プ ト が関 数で あ る か イ ベン ト で あ る か、 ロ ーカルで ス ク リ プ ト 作成 さ れたか ど う か、 戻 り デー タ 型 と 引数の種類、 お よ び引数の渡 し 方を レ ポー ト し ます。 string s, lineend integer li, lis, li_bound ScriptDefinition sd lineend = "~r~n" FOR li = 1 to UpperBound(cd_windef.ScriptList) sd = cd_windef.ScriptList[li] s = s + sd.Name + " " CHOOSE CASE sd.Kind CASE ScriptEvent! // イ ベン ト には、 コ ー ド の定義場所について // 関連する プ ロパテ ィ が 3 つあ り ます。 s = s + "Event, " IF sd.IsScripted = TRUE then s = s + "scripted, " END If IF sd.IsLocallyScripted = TRUE THEN s = s + "local, " END IF IF sd.IsLocallyDefined = TRUE THEN s = s + "local def," END IF CASE ScriptFunction! // 関数には、 コ ー ド の定義場所について // 関連する プ ロパテ ィ が 1 つあ り ます。 s = s + "Function, " IF sd.IsLocallyScripted = TRUE THEN s = s + "local, " END IF ア プ リ ケーシ ョ ン テ ク ニ ッ ク 63 ク ラ ス定義の調査 END CHOOSE s = s + "returns " + & sd.ReturnType.DataTypeOf + "; " s = s + "Args: " li_bound = UpperBound(sd.ArgumentList) IF li_bound = 0 THEN s = s + "None" FOR lis = 1 to li_bound CHOOSE CASE sd.ArgumentList[lis]. & CallingConvention CASE ByReferenceArgument! s = s + "REF " CASE ByValueArgument! s = s + "VAL " CASE ReadOnlyArgument! s = s + "READONLY " CASE ELSE s = s + "BUILTIN " END CHOOSE s = s + sd.ArgumentList[lis].Name + ", " NEXT s = s + lineend NEXT mle_1.text = s 継承階層内の コ ー ド の位置 IsLocallyScripted プ ロ パテ ィ をチ ェ ッ ク すれ ば、 ス ク リ プ ト が継承階層内の ク ラ ス独自の レベルに コ ー ド を持っ て い る か ど う か を確認で き ま す。 Ancestor プ ロ パテ ィ を介 し て継承階層 を逆向 き にた ど る と 、 ス ク リ プ ト の コ ー ド が ど こ にあ る か を見つけ る こ と がで き ます。 次の例では、 まず ClassDefinition cd_windef に関連付け ら れた ク ラ ス の ス ク リ プ ト を調べます。 ス ク リ プ ト の コ ー ド が こ の レベルに定義 さ れ て い る こ と がわか る と 、 その ス ク リ プ ト 名は ド ロ ッ プ ダ ウ ン リ ス ト ボ ッ ク ス に追加 さ れます。 ま た、 ScriptList 配列におけ る ス ク リ プ ト の 位置は、 イ ン ス タ ン ス変数 ii_localscript_idx に保存 さ れ ます。 ド ロ ッ プ ダ ウ ン リ ス ト ボ ッ ク ス は ソ ー ト さ れないため、 リ ス ト 内の位置 と 配列 内の位置は同期 し てい ます。 integer li_pos, li FOR li = 1 to UpperBound(cd_windef.ScriptList) IF cd_windef.ScriptList[li].IsLocallyScripted & 64 PowerBuilder 第 4 章 PowerBuilder の ク ラ ス定義に関する情報の取得 = TRUE THEN li_pos = ddlb_localscripts.AddItem( & cd_windef.ScriptList[li].Name) ii_localscript_idx[li_pos] = li END IF NEXT 関数シグネチ ャ の照合 ク ラ ス に多重定義 さ れた関数が あ る 場合には、 FindMatchingFunction を 呼び出す こ と に よ っ て、 特定の引数 リ ス ト に対 し て呼び出 さ れ る 関数 を調べ る こ と がで き ます。 一例 と し て、 『PowerScript リ フ ァ レ ン ス』 マニ ュ アルの FindMatchingFunction を参照 し て く だ さ い。 変数に関する情報の取得 こ の 節 に 含 ま れ る コ ー ド フ ラ グ メ ン ト で は、 cd_windef と い う ClassDefinition オブ ジ ェ ク ト か ら 変数に関す る 情報 を 取得す る 方法 を 説明 し ま す。 cd_windef に値 を 割 り 当て る 例につい て は、 59 ページ の 「 ク ラ ス定義オブジ ェ ク ト の取得」 を参照 し て く だ さ い。 ク ラ ス に 関連付 け ら れ た 変数 は、 ClassDefinition オ ブ ジ ェ ク ト の VariableList 配列に登録 さ れ ます。 こ の配列を調べ る と 、 明 示的に定義 し た変数に加え て、 イ ン ス タ ン ス 変数で あ る PowerBuilder オブジ ェ ク ト プ ロ パテ ィ と ネ ス テ ィ ッ ド オブジ ェ ク ト も 見つか り ま す。 変数の リ ス ト 次の例では、 VariableList 配列をループ し て、 変数名の リ ス ト を作成 し ます。 最初に PowerBuilder プ ロ パテ ィ が現われ、 続いてネ ス テ ィ ッ ド オブジ ェ ク ト 、 独自の イ ン ス タ ン ス、 お よ び共有変数が現われ ます。 string s, lineend integer li VariableDefinition vard lineend = "~r~n" FOR li = 1 to UpperBound(cd_windef.VariableList) vard = cd_windef.VariableList[li] s = s + vard.Name + lineend NEXT mle_1.Text = s ア プ リ ケーシ ョ ン テ ク ニ ッ ク 65 ク ラ ス定義の調査 変数に関する詳細 次の例では、VariableList 配列に含まれ る 各変数のプ ロ パテ ィ を調べて、 そのデー タ 型、 基数、 お よ びグ ロ ーバル、 共有、 ま たは イ ン ス タ ン ス の区別を レ ポー ト し ます。 ま た、 イ ン ス タ ン ス変数が先祖宣言を上書 き す る か ど う か も チ ェ ッ ク し ます。 string s integer li VariableDefinition vard lineend = "~r~n" FOR li = 1 to UpperBound(cd_windef.VariableList) vard = cd_windef.VariableList[li] s = s + vard.Name + ", " s = s + vard.TypeInfo.DataTypeOf CHOOSE CASE vard.Cardinality.Cardinality CASE ScalarType! s = s + ", scalar" CASE UnboundedArray!, BoundedArray! s = s + ", array" END CHOOSE CHOOSE CASE vard.Kind CASE VariableGlobal! s = s + ", global" CASE VariableShared! s = s + ", shared" CASE VariableInstance! s = s + ", instance" IF vard.OverridesAncestorValue = TRUE THEN s = s + ", override" END IF END CHOOSE s = s + lineend NEXT mle_1.text = s 66 PowerBuilder 第 3 部 ユーザ イ ン タ フ ェ ース テクニッ ク PowerBuilder に よ る ア プ リ ケ ー シ ョ ン 開発 に お い て、 ユーザ イ ン タ フ ェ ース機能を実現する ためのテ ク ニ ッ ク について説明 し ます。 MDI ア プ リ ケーシ ョ ンの構築、 ド ラ ッ グア ン ド ド ロ ッ プ機能の使い方、 オ ン ラ イ ン ヘルプ 機能な どについて説明 し ます。 第 5 章 MDI ア プ リ ケーシ ョ ン の構築 こ の章について こ の章では、 PowerBuilder におけ る マルチ ド キ ュ メ ン ト イ ン タ フ ェ ー ス (MDI) アプ リ ケーシ ョ ン の構築方法について説明 し ま す。 内容 項目 MDI について MDI フ レーム ウ ィ ン ド ウ の作成 シー ト の使い方 マ イ ク ロ ヘルプの使い方 ツールバーの使い方 ク ラ イ ア ン ト 領域のサ イ ズ設定 MDI アプ リ ケーシ ョ ンにおけ る キーボー ド 操作について ページ 69 72 73 75 76 89 92 MDI について マルチ ド キ ュ メ ン ト イ ン タ フ ェース (MDI) は、 1 つの ウ ィ ン ド ウ 内で複数の (シー ト と 呼ばれ る ) ウ ィ ン ド ウ を開いた り 、 シー ト 間 を 自由に移動す る こ と がで き る ア プ リ ケーシ ョ ン 形式です。 MDI アプ リ ケーシ ョ ン を構築す る 場合は、 MDI フ レーム と い う 種 類の ウ ィ ン ド ウ を定義 し 、 その フ レーム内でほかの ウ ィ ン ド ウ を シー ト と し て開 き ます。 大規模な Windows アプ リ ケーシ ョ ン のほ と ん ど は MDI 形式で作 成 さ れてい ます。 た と えば、 PowerBuilder も MDI アプ リ ケーシ ョ ン です。 PowerBuilder ウ ィ ン ド ウ が フ レ ーム、 ペ イ ン タ がシー ト です。 エ ン ド ユーザに複数の ウ ィ ン ド ウ を開かせた り 、 ウ ィ ン ド ウ 間を 簡単に移動 さ せたい場合には、 MDI 形式でアプ リ ケーシ ョ ン を構 築 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 69 MDI について テ ン プ レー ト ア プ リ ケーシ ョ ン機能の使い方 新規の ア プ リ ケーシ ョ ン を 作成 し た場合には、 ア プ リ ケーシ ョ ン ス タ ー ト ウ ィ ザー ド を選択 し てか ら 、 SDI、 MDI、 ま たは PFC のアプ リ ケーシ ョ ン を作成す る よ う 選択で き ます。 MDI アプ リ ケーシ ョ ン を選 択 し た場合には、 シー ト を開 く ま たは閉 じ る な ど の ウ ィ ン ド ウ 操作を 行 う 関数をすべて備え た MDI フ レーム、 シー ト マネージ ャ オブジ ェ ク ト と い く つかの シー ト 、 バージ ョ ン 情報 ダ イ ア ロ グ ボ ッ ク ス、 メ ニ ュ ー、 ツールバー、 お よ びス ク リ プ ト を含む MDI アプ リ ケーシ ョ ン のシ ェ ルが生成 さ れ ます。 MDI フ レーム ウ ィ ン ドウ MDI フ レ ーム ウ ィ ン ド ウ は、 メ ニ ュ ー バー、 フ レ ーム、 ク ラ イ ア ン ト 領域、 シー ト な ど の複数の要素か ら 構成 さ れ る ウ ィ ン ド ウ です。 通 常、MDI フ レーム ウ ィ ン ド ウ の構成要素には上記のほかに ス テー タ ス バーが含 ま れ、 こ の領域には マ イ ク ロ ヘルプ (現在選択 し て い る メ ニ ュ ー項目や操作についての簡単な説明) が表示 さ れ ます。 フ レーム MDI フ レームは、 MDI ウ ィ ン ド ウ の外枠領域で、 ク ラ イ ア ン ト 領域を 含みます。 MDI フ レームには、 以下の 2 種類があ り ます。 70 • 標準フ レーム • カ ス タ ム フ レーム PowerBuilder 第 5 章 MDI ア プ リ ケーシ ョ ンの構築 標準 MDI フ レーム ウ ィ ン ド ウ には、 メ ニ ュ ー バー と 、 通常は、 マ イ ク ロ ヘルプ が表示 さ れ る ス テ ー タ ス バーが あ り ま す。 シー ト が開かれていない と き は、 ク ラ イ ア ン ト 領域は空白にな り ます。 シ ー ト は、 独自 の メ ニ ュ ー、 ま た は MDI フ レ ー ム か ら 継承 し た メ ニ ュ ーを持つ こ と がで き ます。MDI アプ リ ケーシ ョ ンの メ ニ ュ ー バー は、 常に フ レーム上に表示 さ れ、 シー ト 上に表示 さ れ る こ と はあ り ま せん。 通常、 メ ニ ュ ー バーには、 現在開かれてい る すべての ウ ィ ン ド ウ を リ ス ト 表示す る メ ニ ュ ー項目があ り 、 それ ら の ウ ィ ン ド ウ を並べ て表示、 カ ス ケー ド 表示、 ま たは重ねて表示で き ます。 標準フ レーム 標準フ レーム と 同様に、 カ ス タ ム フ レーム ウ ィ ン ド ウ に も 、 通常、 メ ニ ュ ー バー と ス テー タ ス バーがあ り ます。 標準フ レーム と カ ス タ ム フ レーム の違いは ク ラ イ ア ン ト 領域にあ り ます。 標 準フ レーム の場合は、 ク ラ イ ア ン ト 領域には開いてい る シー ト だけが 表示 さ れ ますが、 カ ス タ ム フ レームの場合は、 シー ト だけではな く ボ タ ンやス タ テ ィ ッ ク テ キ ス ト な ど、 ほかのオブジ ェ ク ト も 表示で き ま す。 た と えば、 テ キ ス ト が表示 さ れたボ タ ン を ク ラ イ ア ン ト 領域に配 置で き ます。 カ ス タ ム フ レーム ク ラ イ ア ン ト 領域 標準フ レーム ウ ィ ン ド ウ では、 PowerBuilder が自動的に ク ラ イ ア ン ト 領域のサ イ ズ を設定 し 、 ク ラ イ ア ン ト 領域内でシー ト が開かれ表示 さ れ る よ う にな っ てい ます。 ク ラ イ ア ン ト 領域にオブジ ェ ク ト があ る カ ス タ ム フ レーム ウ ィ ン ド ウ では、開発者自身が ク ラ イ ア ン ト 領域のサ イ ズ を設定 し なければな り ません。 ク ラ イ ア ン ト 領域のサ イ ズが正 し く 設定 さ れなか っ た場合、 シー ト を開いて も 表示 さ れない こ と があ り ます。 開発者が MDI フ レ ー ム ウ ィ ン ド ウ を 作成す る と 、 フ レーム ウ ィ ン ド ウ の ク ラ イ ア ン ト 領域を識別す る ために、MDI_1 と い う 名前の コ ン ト ロ ールが PowerBuilder に よ っ て作成 さ れます。 標 準フ レーム では PowerBuilder が自動的に MDI_1 を管理 し ます。 カ ス タ ム フ レーム では、開発者が フ レームの Resize イ ベン ト に対 し て ス ク リ プ ト を記述 し MDI_1 のサ イ ズ を設定 し ます。 MDI_1 コ ン ト ロール MDI_1 に関する情報の表示 MDI_1 のプ ロ パテ ィ と 関数を ブ ラ ウ ザで参照で き ます。 MDI 型の ウ ィ ン ド ウ を作成 し 、 ブ ラ ウ ザで [ ウ ィ ン ド ウ ] タ ブ を選択 し ます。 MDI フ レーム ウ ィ ン ド ウ を選択 し 、 ポ ッ プア ッ プ メ ニ ュ ーか ら [ こ の下を すべて表示] を選択 し ます。 す る と 、 MDI_1 が ウ ィ ン ド ウ コ ン ト ロ ー ル と し て表示 さ れ る ため、 そのプ ロ パテ ィ や関数な ど を ブ ラ ウ ザの右 側ペ イ ン で調べ る こ と がで き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 71 MDI フ レーム ウ ィ ン ド ウの作成 MDI シー ト シー ト は、 MDI フ レームの ク ラ イ ア ン ト 領域で開 く こ と がで き る ウ ィ ン ド ウ です。MDI フ レーム以外のあ ら ゆ る 種類の ウ ィ ン ド ウ が MDI ア プ リ ケ ー シ ョ ン の シ ー ト と し て 使用 で き ま す。 シ ー ト を 開 く に は OpenSheet 関数か OpenSheetWithParm 関数を使用 し ます。 ツールバー MDI アプ リ ケーシ ョ ン において、エ ン ド ユーザに ツールバーを提供 し たい こ と があ り ます。PowerBuilder では、現行 メ ニ ュ ーを基に し た ツー ルバーを自動的に作成 し 、 管理で き ま す。 ま た、 (通常は、 ユーザ オ ブジ ェ ク ト と し て) 独自のカ ス タ ム ツールバーを作成 し 、 ク ラ イ ア ン ト 領域のサ イ ズ を再設定す る こ と も で き ます。 ツールバーの利用の詳細については、 76 ページの 「ツールバーの使い 方」 を参照 し て く だ さ い。 ク ラ イ ア ン ト 領域のサ イ ズ設定の詳細につ いては、 89 ページの 「 ク ラ イ ア ン ト 領域のサ イ ズ設定」 を参照 し て く だ さ い。 MDI フ レーム ウ ィ ン ド ウの作成 PowerBuilder で新規の ウ ィ ン ド ウ を作成す る と き 、 そのデフ ォ ル ト の ウ ィ ン ド ウ の種類は メ イ ン です。 [全般] プ ロ パテ ィ ページで、 [mdi!] ま たは [mdihelp!] を選択 し て、 ウ ィ ン ド ウ を MDI フ レーム ウ ィ ン ド ウ に変更 し ます。 メ ニ ュ ーの使い方 ウ ィ ン ド ウ の種類を MDI に変更 し た場合には、 メ ニ ュ ー と フ レーム を 関連付け る 必要があ り ます。 一般に、 メ ニ ュ ーを使用すれば、 フ レー ム内のシー ト を開いた り 、 すべてのシー ト が閉 じ ら れてい る 場合には フ レーム を閉 じ た り す る こ と がで き ます。 メ ニ ュ ー と シー ト について シー ト ご と に独自の メ ニ ュ ーを持つ こ と がで き ますが、 必ず し も そ う す る 必要はあ り ません。 メ ニ ュ ーを持た ないシー ト が開かれ る と 、 フ レーム の メ ニ ュ ーが使用 さ れ ます。 72 PowerBuilder 第 5 章 MDI ア プ リ ケーシ ョ ンの構築 シー ト の使い方 MDI フ レ ー ム ウ ィ ン ド ウ では、 ユーザは複数の ウ ィ ン ド ウ (ま たは シー ト ) を開いて作業を行 う こ と がで き ま す。 た と えば、 電子 メ ール シ ス テ ム の場合、 MDI フ レ ー ム は複数の シー ト を 持ち、 それぞれの シー ト において、 メ ッ セージ を作成 し て送信 し た り 、 メ ッ セージ を読 んで返答 し た り す る こ と がで き ます。 すべてのシー ト を同時に開 く こ と がで き 、 ユーザはシー ト 間を移動 し て各シー ト で異な る 作業を行 う こ と がで き ます。 メ ニ ュ ー と シー ト について シー ト ご と に独自の メ ニ ュ ーを持つ こ と がで き ますが、 必ず し も そ う す る 必要はあ り ません。 メ ニ ュ ーを持た ないシー ト が開かれ る と 、 フ レーム の メ ニ ュ ーが使用 さ れます。 シー ト を開 く MDI フ レ ーム の ク ラ イ ア ン ト 領域でシー ト を開 く には、 OpenSheet 関 数を使用 し ます。 OpenSheet 関数は、 メ ニ ュ ー項目、 別のシー ト 、 ま た は フ レーム内の任意のオブジ ェ ク ト の イ ベン ト に対す る ス ク リ プ ト で 呼び出 し ます。 OpenSheet 関数の詳細については、 『PowerScript リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 ウ ィ ン ド ウのイ ン ス タ ン ス を開 く MDI アプ リ ケーシ ョ ン では、 エ ン ド ユーザは特定の Window 型の イ ン ス タ ン ス を複数開 く こ と がで き ます。 た と えば、 受発注情報を管理す る アプ リ ケーシ ョ ン では、 複数の異な る 受注情報を同時に見 る こ と が で き ま す。 個々の受注情報は、 それぞれ個別の ウ ィ ン ド ウ (シー ト ) に表示 さ れ ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 73 シー ト の使い方 ク ラ イ ア ン ト 領域でシー ト を開 く と 、 ド ロ ッ プダ ウ ン メ ニ ュ ーの一番 下にその ウ ィ ン ド ウ (シー ト ) の タ イ ト ルを表示で き ます。 以下の図 の メ ニ ュ ーでは、 開いてい る 2 つのシー ト 名が表示 さ れてい ます。 開いている シー ト の一 覧表示 ❖ ド ロ ッ プダウン メ ニ ュ ーに開いてい る シー ト 名を表示するには • メ ニ ュ ー バー項目の番号を指定す る (左端の項目が 1 )。OpenSheet 関数を呼び出 し て シー ト を開 く と 、 そのシー ト 名が メ ニ ュ ー バー 項目の ド ロ ッ プダ ウ ン メ ニ ュ ーに表示 さ れ る 一度に 9 つ以上のシー ト が開いてい る 場合、 最初の 9 シー ト の名前は 表示 さ れ ますが、 10 番目以降は [その他の ウ ィ ン ド ウ ] と 表示 さ れ ま す。 10 番目以降のシー ト を表示す る には、 [その他の ウ ィ ン ド ウ ] を ク リ ッ ク し ます。 シー ト の整列 ArrangeSheets 関数を使用 し て、 MDI フ レーム内で開いて る シー ト の並 べ方を変更す る こ と がで き ます。 シー ト の並び方の変更 エ ン ド ユーザが シー ト の並べ方 を 変更で き る よ う に、 メ ニ ュ ー項目 (通常は [ ウ ィ ン ド ウ ] メ ニ ュ ーの ド ロ ッ プダ ウ ン メ ニ ュ ー項目) を作 成 し ます。エ ン ド ユーザが メ ニ ュ ー項目を選択 し た時に、ArrangeSheets 関数を使用 し てシー ト を並べ替え ます。 74 PowerBuilder 第 5 章 MDI ア プ リ ケーシ ョ ンの構築 シー ト の最大表示 シー ト を閉 じ る MDI ウ ィ ン ド ウ に開かれてい る シー ト が コ ン ト ロ ール メ ニ ュ ー を持 つ場合、 エ ン ド ユーザはそのシー ト を最大表示す る こ と がで き ま す。 ア ク テ ィ ブな シー ト が最大表示 さ れた場合の動作は以下の よ う にな り ます。 • ほかのシー ト がア ク テ ィ ブにな る と 、 そのア ク テ ィ ブにな っ た シー ト が最大表示 さ れ る 。 ア ク テ ィ ブにな っ た シー ト は、 直前の シー ト の状態を継承す る • 新 し いシー ト を開 く と 、 現行シー ト は直前のサ イ ズに戻 り 、 新 し いシー ト はオ リ ジナルのサ イ ズの ま ま表示 さ れ る 〔Ctrl〕 + 〔F4〕 を 押す と 、 ア ク テ ィ ブ な ウ ィ ン ド ウ (シー ト ) が閉 じ ます。 メ ニ ュ ーの親 ウ ィ ン ド ウ (シー ト ) を閉 じ る ス ク リ プ ト を メ ニ ュ ー項目に記述す る こ と も で き ま す。 こ の場合、 メ ニ ュ ーは フ レーム ではな く シー ト に関連付け ます。 た と えば、 次の よ う に ス ク リ プ ト を記述 し ます。 ア ク テ ィ ブ なシー ト Close(ParentWindow) 〔Alt〕 + 〔F4〕 を押す と 、 すべてのシー ト を閉 じ て アプ リ ケーシ ョ ン を終了す る こ と がで き ます。 開いてい る シー ト を配列に 保持 し ておいて、 ループに よ っ てすべてのシー ト を閉 じ る よ う に ス ク リ プ ト を記述す る こ と も で き ます。 すべてのシー ト マ イ ク ロヘルプの使い方 MDI では、 フ レームの底辺に位置す る ス テー タ ス バーにマ イ ク ロ ヘル プ を 用意 し て、 エ ン ド ユーザに対 し て情報 を 提供す る こ と がで き ま す。 た と えば、 エ ン ド ユーザが メ ニ ュ ー項目 を 選択す る と き に、 ス テー タ ス バーに選択 さ れた メ ニ ュ ー項目の説明が表示 さ れ ます。 開発者は、 メ ニ ュ ー項目 と カ ス タ ム フ レ ーム ウ ィ ン ド ウ 内の コ ン ト ロ ールに対 し てマ イ ク ロ ヘルプ を定義で き ます。 メ ニ ュ ー項目に対する マ イ ク ロヘルプ メ ニ ュ ー項目に関連付け る マ イ ク ロ ヘルプのテ キ ス ト は、 メ ニ ュ ー ペ イ ン タ の [マ イ ク ロ ヘルプ] テ キ ス ト ボ ッ ク ス で指定 し ます。 メ ニ ュ ー 項 目 の ス ク リ プ ト で マ イ ク ロ ヘ ル プ の テ キ ス ト を 変 更 す る に は、 SetMicroHelp 関数を使用 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 75 ツールバーの使い方 コ ン ト ロールに対する マ イ ク ロヘルプ コ ン ト ロ ールの Tag プ ロ パテ ィ を使用 し て、カ ス タ ム フ レーム ウ ィ ン ド ウ の コ ン ト ロ ールにマ イ ク ロ ヘルプ を関連付け る こ と がで き ま す。 た と えば、 ク ラ イ ア ン ト 領域に [印刷] ボ タ ン を 配置 し た と し ま す。 こ の ボ タ ン に 対 す る マ イ ク ロ ヘ ル プ を 表 示 す る に は、 ボ タ ン の GetFocus イ ベン ト に対 し て ス ク リ プ ト を記述 し ます。 GetFocus イ ベン ト において、 Tag プ ロ パテ ィ にマ イ ク ロ ヘルプで表示 し たいテ キ ス ト を設定 し 、 SetMicroHelp 関数を使用 し てそのテ キ ス ト を マ イ ク ロ ヘルプ に表示 し ます。 た と えば、 次の よ う にな り ます。 cb_print.Tag=" 現行ジ ョ ブの情報を印刷 し ます " w_genapp_frame.SetMicroHelp(This.Tag) コ ン ト ロ ールのプ ロ パテ ィ シー ト で コ ン ト ロ ールの Tag プ ロ パテ ィ を 設定す る こ と も で き ます。 LoseFocus イ ベン ト で、 マ イ ク ロ ヘルプの表示を元に戻 し ます。 w_genapp_frame.SetMicroHelp("Ready") ツールバーの使い方 MDI アプ リ ケーシ ョ ン を よ り 使いやす く す る には、 複数のボ タ ン か ら 構成 さ れ る ツールバーを配置す る と よ いで し ょ う 。 エ ン ド ユーザは、 メ ニ ュ ーを選択す る かわ り にボ タ ン を ク リ ッ ク し て即座にその操作を 行 う こ と がで き ま す。 ツ ールバーは、 MDI フ レ ー ム やア ク テ ィ ブ な シー ト に関連付け る こ と がで き ます。 次の画面では、 [開 く ]、 [印刷]、 [終了] ボ タ ンがあ る ツールバーはフ レーム (フ レームバー) に、 ウ ィ ン ド ウ 管理用の各ボ タ ン があ る ツールバーはシー ト (シー ト バー) に 関連付け ら れてい ます。 76 PowerBuilder 第 5 章 MDI ア プ リ ケーシ ョ ンの構築 ツールバーの動作形態 MDI アプ リ ケーシ ョ ン に追加 し た ツールバーは、 PowerBuilder の開発 環境に提供 さ れ る ツールバー と 同 じ よ う に動作 し ます。 • エン ド ユーザは、ツ ールバーでのテキス ト の表示 / 非表示、PowerTips の使用、 ツールバーの浮動、 フ レーム ま わ り の ツールバーの配置、 ほかの ツールバーの下や横への配置を行 う こ と がで き ま す。 こ れ ら の ツールバーの基本的な操作は、 ス ク リ プ ト を記述す る 必要は あ り ません。 • ツ ールバーの ボ タ ン は、 メ ニ ュ ー項目に関連付け ら れて い ま す。 ツールバーのボ タ ン を ク リ ッ ク す る の と 、 対応す る メ ニ ュ ー項目 を ク リ ッ ク す る (ま たはその メ ニ ュ ー項目のア ク セ ラ レー タ キー を押す) のは同 じ こ と です。 • ツールバーは、 MDI フ レーム ウ ィ ン ド ウ と MDI シー ト において のみ動作 し ます。 ツールバーのあ る メ ニ ュ ー と 一緒に MDI 以外の ウ ィ ン ド ウ を開いた場合、 ツールバーは表示 さ れ ません。 • シー ト と フ レ ーム の両方に ツールバーがあ り 、 シー ト が開いてい る 場合は、 表示 さ れてい る メ ニ ュ ーはシー ト の メ ニ ュ ーです。 ま た、 シー ト と フ レ ーム の両方の ツールバーが表示 さ れ、 ど ち ら も 操作で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 77 ツールバーの使い方 • メ ニ ュ ーにおける複数 のツールバー 現行のア ク テ ィ ブな シー ト に メ ニ ュ ーがない場合は、 フ レ ーム の メ ニ ュ ー と ツールバーがその ま ま 残っ て表示 さ れ、 操作す る こ と が で き ま す。 表 示 さ れ た メ ニ ュ ー が ア ク テ ィ ブ な シ ー ト の メ ニ ュ ーではない ため、 エ ン ド ユーザは混乱す る か も し れ ま せん。 メ ニ ュ ーのあ る シー ト が 1 つで も あ る 場合は、 すべてのシー ト に メ ニ ュ ーを持たせた方が よ いで し ょ う 。 1 つの メ ニ ュ ーにおいて、 複数の ツールバーを持たせ る こ と がで き ま す。 MDI フ レーム ま たはシー ト に、 複数の ツールバーがあ る メ ニ ュ ー を 関連付 け る と 、 PowerBuilder は ウ ィ ン ド ウ を 開 く と き にすべ て の ツールバーを表示 し ます。 次の画面では、 1 つの フ レームバー と 2 つ のシー ト バーがあ る フ レーム内でシー ト が開かれてい ます。 ツールバーは、 それぞれ別々に使用で き ます。 た と えば、 ツールバー を別々に浮動に し た り 、 フ レーム の ま わ り に移動 し て配置で き ます。 1 つの メ ニ ュ ー項目に関連付け ら れたボ タ ンは、1 つの ツールバーに し か表示で き ません。 メ ニ ュ ー項目のボ タ ン が ど の ツールバーに属すか を指定す る には、 メ ニ ュ ー項目の ToolbarItemBarIndex プ ロ パテ ィ に イ ンデ ッ ク ス を設定 し ます。 同 じ イ ンデ ッ ク ス があ る メ ニ ュ ー項目のボ タ ンは、 すべて同 じ ツールバーに表示 さ れ ます。 78 PowerBuilder 第 5 章 MDI ア プ リ ケーシ ョ ンの構築 MDI ア プ リ ケーシ ョ ンへのツールバーの追 加 ❖ PowerBuilder では、 簡単な操作で MDI アプ リ ケーシ ョ ン に ツールバー を 設定す る こ と がで き ま す。 つ ま り 、 メ ニ ュ ー ペ イ ン タ で、 MDI フ レーム ウ ィ ン ド ウ や MDI シー ト に関連付け る メ ニ ュ ーを定義す る 際 に、 メ ニ ュ ー項目に対 し て ピ ク チ ャ と ツールバー表示を指定す る だけ で ツールバーが設定で き ます。 実行時には、 その メ ニ ュ ーが関連付け ら れて い る MDI フ レ ー ム ウ ィ ン ド ウ や MDI シー ト に対 し て ツ ール バーが自動的に生成 さ れます。 MDI フ レームに関連付け ら れ る ツール バーは、 フ レームバー と 呼ばれ ます。 ア ク テ ィ ブな シー ト に関連付け ら れ る ツールバーは、 シー ト バー と 呼ばれ ます。 MDI ウ ィ ン ド ウにツールバーを追加する には 1 メ ニ ュ ー ペ イ ン タ で、 ツールバーに表示 し たい メ ニ ュ ー項目の表 示特性を指定 し ます。 詳細については、 次の 「 メ ニ ュ ー ペ イ ン タ での ツールバー プ ロ パ テ ィ の設定」 を参照 し て く だ さ い。 2 (オプシ ョ ン) メ ニ ュ ー ペ イ ン タ で、 メ ニ ュ ー項目の ド ロ ッ プダ ウ ン ツールバーを指定 し ます。 3 ウ ィ ン ド ウ ペ イ ン タ で、 その メ ニ ュ ーを ウ ィ ン ド ウ に関連付け、 ツールバーを表示す る よ う に指定 し ます。 4 (オプシ ョ ン) ウ ィ ン ド ウ ペ イ ン タ で、 浮動ツールバーのサ イ ズや 位置な ど、 [ツ ールバー] プ ロ パテ ィ ページ のそのほかのプ ロ パ テ ィ を指定 し ます。 メ ニ ュ ー ペ イ ン タ でのツールバー プ ロパテ ィ の設定 メ ニ ュ ー ペ イ ン タ では、 ツールバーに表示 し たい メ ニ ュ ー項目、 ツー ルバー ボ タ ン と PowerTip のテ キ ス ト 、メ ニ ュ ー項目の表示に使用す る ピ ク チ ャ 、 お よ びツールバーのそのほかの特性を指定 し ます。 ❖ ツールバー項目の表示特性を指定するには 1 メ ニ ュ ー ペ イ ン タ の メ ニ ュ ーを開 き 、 ツールバーに表示 し たい メ ニ ュ ー項目を選択 し ます。 2 [ツールバー] プ ロ パテ ィ ページ を選択 し 、 表 5-1 に示 さ れてい る よ う に、 ツールバー項目のプ ロ パテ ィ を設定 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 79 ツールバーの使い方 表 5-1: メ ニ ュ ー ペ イ ン タ で設定で き る ツールバー プ ロパテ ィ プ ロパテ ィ [項目テ キ ス ト ] (ToolbarItemText) 指定する内容 次に示す よ う に、 ツールバー ボ タ ン と PowerTip に対 し て、 2 つの異な る テ キ ス ト 値を カ ン マで区 切っ た文字列で指定 し ます。 ボ タ ンのテキス ト , PowerTip のテキス ト [ピ ク チ ャ 名] (ToolbarItemName) [ダ ウ ン ピ ク チ ャ 名] (ToolbarItemDownName) [表示可能] (ToolbarItemVisible) [項目のダ ウ ン表示] (ToolbarItemDown) [項目の間隔] (ToolbarItemSpace) [項目の順序] (ToolbarItemOrder) [項目 イ ンデ ッ ク ス] (ToolbarItemBarIndex) メ ニ ュ ー項目の ド ロ ッ プダウン ツールバー 80 ド ロ ッ プダ ウ ン リ ス ト ボ ッ ク ス か ら 組み込み ピ ク チ ャ を選択 し ます。ま たは、ブ ラ ウ ズ し て BMP フ ァ イ ルを選択 し ます。組み込みピ ク チ ャ を選択 す る と 、 ボ タ ン が ク リ ッ ク さ れて い な い と き は ア ッ プ ピ ク チ ャ が表示 さ れ、 ボ タ ン が ク リ ッ ク さ れ た と き は ダ ウ ン ピ ク チ ャ が表示 さ れ ま す。 ア ッ プ ピ ク チ ャ はボ タ ン が浮 き 上が っ た よ う に 見え、 ダ ウ ン ピ ク チ ャ はボ タ ン が く ぼんだ よ う に見え ま す。 ピ ク チ ャ フ ァ イ ル を指定す る 場合 には、 ピ ク チ ャ の幅 と 高 さ はそれぞれ 16 ピ ク セ ル と 15 ピ ク セルでなければな り ません。 ボ タ ン が ク リ ッ ク さ れ た と き に 表示す る ピ ク チ ャ を変更す る 場合に指定 し ます (オプシ ョ ン)。 ツールバー ボ タ ン を隠 し たい場合には、 こ れ を オ フ に し ます。 デフ ォ ル ト では表示 さ れます。 初期状態でダ ウ ン ピ ク チ ャ のボ タ ン を表示す る 場合には、 オンに し ます。 ツ ールバーの ピ ク チ ャ の前に間隔 を 空け る 場合 は、 任意の整数を指定 し ます。 間隔が ど の よ う に 空 く かは、数値をいろいろ変えて確認 し て く だ さ い。 0 を指定す る と 、 ピ ク チ ャ の前には間隔が空 き ません。ツールバーにテ キ ス ト が表示 さ れない と き のみ、 間隔を空け る こ と がで き ます。 ツ ールバーに表示す る ボ タ ン の順序 を 指定 し ま す。 0 を指定す る と 、 PowerBuilder はツールバー を表示す る 際に、 メ ニ ュ ー項目の順序で配置 し ま す。 メ ニ ュ ーに複数の ツールバーを表示す る 場合は、 1 以上の数値を指定 し ます。 指定 し た数値に よ っ て、現行の メ ニ ュ ー項目に対応する ボ タ ンが ど の ツールバーに表示 さ れ る かが決ま り ます。同 じ イ ンデ ッ ク ス があ る メ ニ ュ ー項目のボ タ ンは、すべ て同 じ ツールバーに表示 さ れます。 メ ニ ュ ー項目は、 ド ロ ッ プダ ウ ン ツールバーを表示す る ツールバーの ボ タ ン に関連付け る こ と がで き ます。 エ ン ド ユーザがボ タ ン を ク リ ッ ク す る と 、 ド ロ ッ プダ ウ ン ツールバーが表示 さ れます。 ド ロ ッ プダ ウ ン ツールバーには、 メ ニ ュ ー項目の下位レベルに定義 さ れた メ ニ ュ ー PowerBuilder 第 5 章 MDI ア プ リ ケーシ ョ ンの構築 項目の ツールバー ボ タ ン がすべて表示 さ れ ま す。 た と えば、 [フ ァ イ ル] メ ニ ュ ー項目の ド ロ ッ プダ ウ ン ツールバーを定義す る と 、 ド ロ ッ プダ ウ ン ツールバーには、 [フ ァ イ ル] メ ニ ュ ー項目の下位 レ ベルに 定義 さ れた [新規作成]、 [開 く ]、 [閉 じ る ]、 [終了] な ど のボ タ ンが 表示 さ れ ます。 メ ニ ュ ー項目の [オブジ ェ ク ト の種類] が MenuCascade であ る 場合に は、デフ ォ ル ト で、PowerBuilder は実行時に ド ロ ッ プダ ウ ン ツールバー を表示 し ます。 サブ メ ニ ュ ー項目を ド ロ ッ プダ ウ ン ツールバーに表示 す る か、 それ と も 普通の ツールバー項目 と し て表示す る か を プ ロ グ ラ ム で指定す る には、 メ ニ ュ ー項目の DropDown プ ロ パテ ィ を設定 し て く だ さ い。 た と えば、 子孫 メ ニ ュ ー項目に ド ロ ッ プダ ウ ン ツールバー を持たせて も 、 その先祖には持たせた く ない場合には、 先祖の [ツー ルバー] プ ロ パテ ィ ページの [ ド ロ ッ プダ ウ ン] チ ェ ッ ク ボ ッ ク ス を オ フ に し 、 ス ク リ プ ト で子孫 メ ニ ュ ー項目の DropDown プ ロ パテ ィ に TRUE を設定 し ます。 ❖ メ ニ ュ ー項目の ド ロ ッ プダウン ツールバーを指定するには 1 メ ニ ュ ー ペ イ ン タ で、 ド ロ ッ プダ ウ ン ツールバーを追加 し たい メ ニ ュ ー項目を選択 し ます。 2 [ツールバー] プ ロ パテ ィ ページで、 [オブジ ェ ク ト の種類] を 「MenuCascade」 に変更 し ます。 3 (オプシ ョ ン) 表示 し たいカ ラ ムの数を [カ ラ ム] ボ ッ ク ス に指定 し ます。 デ フ ォ ル ト の カ ラ ム 数は 1 です。 ウ ィ ン ド ウ ペ イ ン タ で コ ン ト ロ ール を挿入す る ための ツールバー項目の場合の よ う に、 サブ メ ニ ュ ー上に多数の項目があ る 場合には、3 つま たは 4 つのカ ラ ム を 指定す る こ と がで き ます。 ウ ィ ン ド ウ ペ イ ン タ におけ る ツールバー プ ロパテ ィ の設定 ウ ィ ン ド ウ ペ イ ン タ では、 ウ ィ ン ド ウ の [全般] プ ロ パテ ィ ページで MDI ウ ィ ン ド ウ に メ ニ ュ ーを関連付け ます。 デフ ォ ル ト では、 ウ ィ ン ド ウ に ツールバーが表示 さ れ ます。 ツールバーを表示 し た く ない場合 には、 ウ ィ ン ド ウ の [ツールバー] プ ロ パテ ィ ページで [ツールバー の表示] チ ェ ッ ク ボ ッ ク ス を オ フ に し ます。 こ のプ ロ パテ ィ ページで は、 ツールバーの配置 と 位置 も 指定で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 81 ツールバーの使い方 ア プ リ ケーシ ョ ン ペ イ ン タ におけ る ツールバー プ ロパテ ィ の設定 ア プ リ ケーシ ョ ン 内のすべて の ツ ールバーの グ ロ ーバル プ ロ パテ ィ を指定す る には、 アプ リ ケーシ ョ ン ペ イ ン タ で [ツールバー] プ ロ パ テ ィ ページに指定す る か、ま たは ス ク リ プ ト でアプ リ ケーシ ョ ン オブ ジ ェ ク ト のプ ロ パテ ィ を設定 し ます。 通常、 プ ロ パテ ィ の設定はアプ リ ケーシ ョ ン の Open イ ベン ト で行い ま すが、 ど の イ ベン ト で行っ て も か ま い ません。 表 5-2: ア プ リ ケーシ ョ ン ペ イ ン タ で設定で き る ツールバー プ ロパテ ィ プ ロパテ ィ [ツールバーの フ レー ム タ イ ト ル] (ToolbarFrameTitle) [ツールバーのシー ト タ イ ト ル] (ToolbarSheetTitle) [ツールバーのポ ッ プ ア ッ プ メ ニ ュ ーのテ キ ス ト] (ToolbarPopMenuText) [ツールバーのユーザ コ ン ト ロ ール] (ToolbarUserControl) [ツールバーのテ キ ス ト ] (ToolbarText) [ツールバーの Tips] (ToolbarTips) ツールバーのポ ッ プ ア ッ プ メ ニ ュ ーにお ける テキス ト の指定 意味 浮動型の フ レ ー ム バーに対す る ツ ールバーの タ イ ト ル と し て表示 さ れ る テ キ ス ト 浮動型の シー ト バーに対す る ツ ールバーの タ イ ト ル と し て表示 さ れ る テ キ ス ト (String 型) ツールバーのポ ッ プア ッ プ メ ニ ュ ーに 表示 さ れ る テ キ ス ト (以下を参照) (Boolean 型) TRUE の場合 (デフ ォ ル ト ) 、 エン ド ユーザは ツールバーのポ ッ プ ア ッ プ メ ニ ュ ーを使 用 し て、 ツールバーの表示 / 非表示、 移動、 ボ タ ン 上の テ キ ス ト 表示の指定が行え ま す。 FALSE の場 合、 エ ン ド ユーザは ツールバーの操作を行え ま せ ん。 (Boolean 型) TRUE の場合、 ボ タ ンにテ キ ス ト を表 示 し ます。 FALSE の場合 (デフ ォ ル ト ) 、 ボ タ ンに テ キ ス ト を表示 し ません。 (Boolean 型) TRUE の場合 (デフ ォ ル ト )、 ボ タ ンの テ キ ス ト が非表示の と き に、 PowerTips を表示 し ま す。 FALSE の場合、 PowerTips を表示 し ません。 PowerBuilder では、 デフ ォ ル ト で ツールバーに対す る ポ ッ プア ッ プ メ ニ ュ ーが用意 さ れてお り 、 エ ン ド ユーザはツールバーを自由に操作で き ます。 こ のポ ッ プア ッ プ メ ニ ュ ーは、 パ ワ ーバーやペ イ ン タ バーの ポ ッ プア ッ プ メ ニ ュ ーに似てい ます。 ポ ッ プ ア ッ プ メ ニ ュ ーに表示 さ れ る テ キ ス ト を 変更で き ま すが、 メ ニ ュ ー項目の機能は変更で き ません。 通常、 表示 さ れ る テ キ ス ト の変 更は、 英語以外の言語でアプ リ ケーシ ョ ン を構築 し てい る と き に行 う こ と がで き ます。 テ キ ス ト の変更は次の よ う に行い ます。 82 PowerBuilder 第 5 章 MDI ア プ リ ケーシ ョ ンの構築 • ポ ッ プア ッ プ メ ニ ュ ーの最初の 2 項目は、 ToolbarFrameTitle プ ロ パテ ィ と ToolbarSheetTitle プ ロ パテ ィ で設定 さ れた タ イ ト ル (デ フ ォ ル ト は、 FrameBar と SheetBar) を表示 し ます。 • 残 り の項目は、 ToolbarPopMenuText プ ロ パテ ィ で指定 し ます。 こ のプ ロ パテ ィ に値を指定す る には、 テ キ ス ト を カ ン マで区切っ て 指定 し ます。 以下の よ う に指定す る と 、 テ キ ス ト [左端]、 [上端]、 [右端]、 [下端]、 [浮動]、 [テ キ ス ト を表示す る ]、 [PowerTips の 表示] に置 き 換え ら れます。 toolbarPopMenuText = " 左端 , 上端 , 右端 , 下端 , 浮動 , テキス ト の 表示 , PowerTips の表示 " た と えば、 ツールバー ポ ッ プア ッ プ項目のテ キ ス ト を ド イ ツ語に変更 し 、 各ポ ッ プア ッ プ項目に下線付 き のホ ッ ト キーを設定す る 場合は、 以下の よ う に指定 し ます。 ToolbarPopMenuText = "&Links, &Oben, &Rechts, " + & "&Unten, &Frei positionierbar, &Text anzeigen, " & + "&PowerTips anzeigen" MDI ア プ リ ケーシ ョ ンにおけ る ツールバーの使い方 こ の節では、 ツールバーのカ ス タ マ イ ズについて説明 し ます。 ツールバー ボ タ ンの 使用不可 ツールバー ボ タ ン を使用不可にす る には、 そのボ タ ンに関連付け ら れ てい る メ ニ ュ ー項目を使用不可にす る 必要があ り ます。 メ ニ ュ ー項目 を使用不可にす る と 、 自動的に ツールバー ボ タ ン も 使用不可にな り ま す。 メ ニ ュ ー項目を使用不可にす る には、 メ ニ ュ ー項目の Enabled プ ロ パ テ ィ に FALSE を設定 し ます。 m_test.m_file.m_new.Enabled = FALSE ツールバー ボ タ ンの 非表示 メ ニ ュ ー項目を非表示にす る には、 メ ニ ュ ー項目の Visible プ ロ パテ ィ に FALSE を設定 し ます。 m_test.m_file.m_open.Visible = FALSE メ ニ ュ ー項目を非表示に し て も 、 その ツールバー ボ タ ンは非表示ま た は使用不可にな り ません。 ツールバー ボ タ ン を非表示にす る には、 メ ニ ュ ー項目の ToolbarItemVisible プ ロ パテ ィ に FALSE を設定す る 必要 があ り ます。 m_test.m_file.m_open.ToolBarItemVisible = FALSE ア プ リ ケーシ ョ ン テ ク ニ ッ ク 83 ツールバーの使い方 ツールバー ボ タ ン を非表示に し て も 、 ド ロ ッ プダ ウ ン ま たはカ ス ケー ド の メ ニ ュ ー項目におけ る 下位レベルの ツールバー ボ タ ンは、 非表示 ま たは使用不可にはな り ません。 下位レベルのボ タ ンは、 個別に非表 示ま たは使用不可にす る 必要があ り ます。 ド ロ ッ プダウン ツー ルバーにおける現行の ボ タ ンの設定 エ ン ド ユーザが ド ロ ッ プダ ウ ン ツールバーの ツールバー ボ タ ン を ク リ ッ ク す る と 、 PowerBuilder は選択 さ れたボ タ ン を現行のボ タ ン と し ます。 こ の よ う にすれば、 エ ン ド ユーザが繰 り 返 し そのボ タ ン を使用 す る の が 容 易 に な り ま す。 さ ら に、 MenuCascade オ ブ ジ ェ ク ト の CurrentItem プ ロ パテ ィ を設定す る こ と に よ っ て、 ス ク リ プ ト で特定の ボ タ ン を現行のボ タ ン と す る こ と がで き ます。 た と えば、 [フ ァ イ ル] メ ニ ュ ーの [新規作成] メ ニ ュ ー項目に対応す る ツールバー ボ タ ン を 現行のボ タ ン と し て設定す る には、 以下の ス ク リ プ ト を実行 し ます。 m_test.m_file.currentitem = m_test.m_file.m_new こ の ス ク リ プ ト を 正常に実行す る た め には、 メ ニ ュ ー ペ イ ン タ で、 [フ ァ イ ル] メ ニ ュ ーのオブジ ェ ク ト デー タ 型 と し て MenuCascade を 指定す る 必要があ り ます。 ツールバーの移動の確 認 ツールバーが MDI フ レ ーム ウ ィ ン ド ウ で移動す る と 、 ウ ィ ン ド ウ の ToolBarMoved イ ベン ト が起動 さ れ ます。 こ の イ ベン ト に対す る ス ク リ プ ト では、 ど の ツールバーが移動 し たか を確認 し て、 処理を実行す る こ と が で き ま す。 フ レ ー ム バ ー ま た は シ ー ト バ ー を 移 動 す る と 、 ToolbarMoved イ ベン ト が起動 さ れて、Message.WordParm プ ロ パテ ィ と Message.LongParm プ ロ パテ ィ に ど の ツールバーが移動 し たか を示す値 が設定 さ れ ます。 表 5-3: Message.WordParm プ ロパテ ィ と Message.LongParm プ ロパ テ ィ の値 プ ロパテ ィ Message.WordParm Message.LongParm 84 値 0 1 0 1 2 3 4 意味 フ レームバーが移動 さ れた シー ト バーが移動 さ れた 左へ移動 さ れた 上へ移動 さ れた 右へ移動 さ れた 下へ移動 さ れた 浮動に設定 さ れた PowerBuilder 第 5 章 MDI ア プ リ ケーシ ョ ンの構築 ツールバー設定の保存 と 復元 ツールバーの設定に関す る 情報を検索 し た り 更新 し た り す る 関数を使 用すれば、 現行の ツールバーの設定の保存 と 復元がで き ます。 GetToolbar 関数 と GetToolbarPos 関数を使用すれば、 現行の ツールバー の設定を取得で き ます。SetToolbar 関数 と SetToolbarPos 関数を使用すれ ば、 ツールバーの設定を変更で き ます。 ツールバーの表示位置が浮動 か固定かに よ っ て、 GetToolbarPos 関数 と SetToolbarPos 関数は、 使用す る 構文が異な り ます。 浮動ツールバー 浮動ツールバーの表示位置は、 その x 座標 と y 座標に よ っ て決ま り ま す。 浮動ツールバーのサ イ ズは、 その幅 と 高 さ に よ っ て決ま り ます。 GetToolbarPos 関数 と SetToolbarPos 関数を使用 し て、 浮動ツールバーの 位置の取得 と 設定を行 う 場合は、 x 座標、 y 座標、 幅、 高 さ の引数が必 要です。 固定ツールバー 固定ツールバーの表示位置は、 配置 さ れた行 と その行の開始位置か ら のオ フ セ ッ ト に よ っ て決ま り ます。 上端ま たは下端に配置 さ れた ツー ルバーの場合、 オ フ セ ッ ト は左端か ら 算出 さ れ ます。 左端 ま たは右端 に配置 さ れた ツールバーの場合、オ フ セ ッ ト は上端か ら 算出 さ れます。 デフ ォ ル ト では、ツールバーが配置 さ れ る 行は、ツールバーの イ ンデ ッ ク ス と 同 じ 位置にな り ます。 ウ ィ ン ド ウ と 異な る 枠線で ツールバーを 配置す る 場合、 その配置す る 位置に よ っ て、 行は変更 さ れ る こ と があ り ます。 GetToolbarPos 関数 と SetToolbarPos 関数を使用 し て、 固定ツールバーの 位置の取得 と 設定を行 う 場合は、 行 と オ フ セ ッ ト の引数が必要です。 例 以下の例では、ツールバーの設定を管理す る カ ス タ ム ユーザ オブジ ェ ク ト の使用方法を示 し ます。 ユーザ オブジ ェ ク ト には、 2 つの関数が あ り ます。 1 つは現行の設定を保存す る ための関数、 も う 1 つは後で 設定を復元す る ための関数です。 ツールバーの設定の保存 と 復元をす る た めの処理は、 ウ ィ ン ド ウ ではな く ユーザ オブ ジ ェ ク ト で行 う の で、 こ のユーザ オブジ ェ ク ト を使用すればど の ウ ィ ン ド ウ において も 簡単に ツールバーの設定の保存 と 復元がで き ます。 例では、 固定ツールバー と 浮動ツールバーの両方をサポー ト し ます。 ウ ィ ン ド ウ が開かれ る と 、 初期設定フ ァ イ ル toolbar.ini か ら ツールバーの設定を復元 し ます。 設定を復元す る ため、カ ス タ ム ユーザ オブジ ェ ク ト u_toolbar の イ ン ス タ ン ス を作成 し 、 ユーザ定義関数 Restore を呼び出 し ます。 ウ ィ ン ド ウの Open イ ベン ト に対する ス ク リ プ ト ア プ リ ケーシ ョ ン テ ク ニ ッ ク 85 ツールバーの使い方 // ツールバー NVO を作成 し ます。 u_toolbar = create u_toolbar // ツールバーの表示位置を復元 し ます。 u_toolbar.Restore(this,"toolbar.ini", ()) this.ClassName ウ ィ ン ド ウの Close イ ベン ト に対する ス ク リ プ ト ウ ィ ン ド ウ が閉じ る と 、 ユーザ定義関数 Save を呼び出 し て、 ツールバーの設定を保存 し ます。 設定を保存 し た後は、 ユーザ オブジ ェ ク ト の イ ン ス タ ン ス を破棄 し ま す。 // ツールバーの設定を保存 し ます。 stateu_toolbar.Save(this, "toolbar.ini", ClassName()) // NVOdestroy u_toolber ツールバーを破棄 し ます。 Save 関数のス ク リ プ ト Save 関数には、 3 つの引数があ り ます。 • Win - ウ ィ ン ド ウ の参照 • File - 設定を保存す る フ ァ イ ルの名前 • Section - 設定を保存す る フ ァ イ ル内のセ ク シ ョ ン名 Save 関数では、 GetToolbar 関数 と GetToolbarPos 関数を使用 し て、 現行 の ツールバーの設定を取得 し ます。 初期設定フ ァ イ ルに設定を記述す る には SetProfileString 関数を使用 し ます。 Save 関数は、 1 つの メ ニ ュ ーにおけ る 複数の ツールバーを処理で き ま す。 そのため、 ツールバーの イ ンデ ッ ク ス を使用 し て、 各ツールバー の情報を管理 し ます。 // ウ ィ ン ド ウのツールバーの設定を保存 し ます。 integer index, row, offset, x, y, w, h boolean visible string visstring, alignstring, title toolbaralignment alignmentFOR index = 1 to 16 // ツールバーの属性を取得 し ます。 IF win.GetToolbar(index, visible, alignment, & title)= 1 THEN // 変数 visible の値を String 型に変換 し ます。 CHOOSE CASE visible CASE true visstring = "true" CASE false visstring = "false" END CHOOSE // 変数 alignment の値を String 型に変換 し ます。 CHOOSE CASE alignment 86 PowerBuilder 第 5 章 MDI ア プ リ ケーシ ョ ンの構築 CASE AlignAtLeft! alignstring = "left" CASE AlignAtTop! alignstring = "top" CASE AlignAtRight! alignstring = "right" CASE AlignAtBottom! alignstring = "bottom" CASE Floating! alignstring = "floating" END CHOOSE // 基本的な属性を保存 し ます。 SetProfileString(file, section + & String(index), "visible", visstring) SetProfileString(file, section + & String(index), "alignment", alignstring) SetProfileString(file, section + & String(index), "title", title) // 固定ツールバーの表示位置を保存 し ます。 win.GetToolbarPos(index, row, offset) SetProfileString(file, section + & String(index), "row", String(row)) SetProfileString(file, section + & String(index), "offset", String(offset)) // 浮動ツールバーの表示位置を保存 し ます。 win.GetToolbarPos(index, x, y, w, h) SetProfileString(file, section + & String(index), "x", String(x)) SetProfileString(file, section + & String(index), "y", String(y)) SetProfileString(file, section + & String(index), "w", String(w)) SetProfileString(file, section + & String(index), "h", String(h)) END IF NEXT Restore 関数のス ク リ プ ト Restore 関数に も 、 Save 関数 と 同 じ 3 つの引 数があ り ます。 Restore 関数は、 初期設定フ ァ イ ルか ら ツールバーの設 定を取得す る ため、 ProfileString 関数を使用 し ます。 設定を取得 し た ら 、 SetToolbar 関数 と SetToolbarPos 関数を使用 し て、ツールバーの設定を復 元 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 87 ツールバーの使い方 Save 関数 と 同 じ よ う に、Restore 関数 も 1 つの メ ニ ュ ーにおけ る 複数の ツールバーを処理で き ます。 そのため、 ツールバーの イ ンデ ッ ク ス を 使用 し て、 各ツールバーの情報を管理 し ます。 // ウ ィ ン ド ウのツールバーの設定を復元 し ます。 integer index, row, offset, x, y, w, h boolean visible string visstring, alignstring, title toolbaralignment alignment FOR index = 1 to 16 // ツールバーの属性を取得 し ます。 IF win.GetToolbar(index, visible, alignment, & title)= 1 THEN // .ini フ ァ イルか ら // ツールバーの設定情報を取得 し ます。 visstring = ProfileString(file, section + & String(index), "visible", "") IF visstring > "" THEN // ツールバーのすべての設定情報を取得 し ます。 alignstring = ProfileString(file, section + & String(index), "alignment", "left") title = ProfileString(file, section + & String(index), "title", "(Untitled)") row = Integer(ProfileString(file, section + & String(index), "row", "1")) offset = Integer(ProfileString(file, & section + String(index), "offset", "0")) x = Integer(ProfileString(file, section + & String(index), "x", "0")) y = Integer(ProfileString(file, section + & String(index), "y", "0")) w = Integer(ProfileString(file, section + & String(index), "w", "0")) h = Integer(ProfileString(file, section + & String(index), "h", "0")) // 変数 visstring の値を Boolean 型に変換 し ます。 CHOOSE CASE visstring CASE "true" visible = true CASE "false" visible = false END CHOOSE // 変数 Alignstring の値を 88 PowerBuilder 第 5 章 MDI ア プ リ ケーシ ョ ンの構築 // toolbaralignment カ タ ログ デー タ 型に変換 し ます。 CHOOSE CASE alignstring CASE "left" alignment = AlignAtLeft! CASE "top" alignment = AlignAtTop! CASE "right" alignment = AlignAtRight! CASE "bottom" alignment = AlignAtBottom! CASE "floating" alignment = Floating! END CHOOSE // 新 し い表示位置を設定 し ます。 win.SetToolbar(index, visible, alignment, title) win.SetToolbarPos(index, row, offset, false) win.SetToolbarPos(index, x, y, w, h) END IF END IF NEXT ク ラ イ ア ン ト 領域のサイ ズ設定 PowerBuilder は、自動的に標準 MDI フ レーム ウ ィ ン ド ウ の ク ラ イ ア ン ト 領域のサ イ ズ を設定 し 、 ク ラ イ ア ン ト 領域内にシー ト を開いて表示 し ます。 ま た、 前節で も 説明 し た よ う に、 メ ニ ュ ー項目に対 し て ツー ルバーを定義 し た場合 も 、 ク ラ イ ア ン ト 領域のサ イ ズは自動的に再設 定 さ れます。 カ ス タ ム MDI フ レ ーム ウ ィ ン ド ウ では、 ク ラ イ ア ン ト 領域にはシー ト が開かれ る ほかに コ ン ト ロ ールが配置 さ れ ま すが、 PowerBuilder は ク ラ イ ア ン ト 領域のサ イ ズ を設定 し ないので、 開発者がサ イ ズ設定を 行わな ければな り ません。 ク ラ イ ア ン ト 領域のサ イ ズが適切に設定 さ れていない と 、 シー ト が開いて も 表示 さ れなか っ た り 、 ク ラ イ ア ン ト 領域か ら はみ出 し た部分が切 り 取 ら れて表示 さ れた り し ます。 カ ス タ ム MDI フ レーム ウ ィ ン ド ウ で ツールバーを使用す る 場合は、ク ラ イ ア ン ト 領域に配置 し た コ ン ト ロ ールが、 ク ラ イ ア ン ト 領域の境界 か ら 十分に離れてい る こ と を確認 し て く だ さ い。 ウ ィ ン ド ウ を表示 し た と き に、 ツールバーが コ ン ト ロ ールの上に表示 さ れない よ う に し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 89 ク ラ イ ア ン ト 領域のサイ ズ設定 表示 さ れないシー ト がある場合に現われる ス ク ロールバー ウ ィ ン ド ウ を定義す る 際に HScrollBar プ ロ パテ ィ と VScrollBar プ ロ パ テ ィ を設定す る と 、 表示 さ れないシー ト があ る 場合に ス ク ロ ールバー が現れ ます。 こ れはシー ト 内のすべての情報が表示 さ れ る と い う 意味 ではあ り ません。 エ ン ド ユーザは、 ス ク ロ ールバーを ス ク ロ ール し て 情報を表示で き ます。 カ ス タ ム MDI フ レーム ウ ィ ン ド ウ を作成す る と 、MDI_1 と い う 名前の コ ン ト ロ ールが作成 さ れ、 フ レーム の ク ラ イ ア ン ト 領域を識別す る た めに使用 さ れ ます。 AutoScript を有効に し た場合には、 フ レーム の ス ク リ プ ト を作成す る と 、オー ト ス ク リ プ ト ポ ッ プア ッ プ ウ ィ ン ド ウ のオ ブジ ェ ク ト リ ス ト に MDI_1 が表示 さ れ ます。 ❖ フ レームが開かれる と き、 またはフ レームのサイ ズが変更 さ れる と き に、 ク ラ イ ア ン ト 領域のサイ ズを設定または変更するには • フ レームの Open ま たは Resize イ ベン ト に対 し て ス ク リ プ ト を記 述 し ます。 • フ レームのサ イ ズ を決定す る • ク ラ イ ア ン ト 領域 (MDI_1) のサ イ ズ を適切に設定す る た と えば、 以下の ス ク リ プ ト は、 フ レーム w_genapp_frame の ク ラ イ ア ン ト 領域のサ イ ズ を設定 し ます。 こ の フ レーム では、 メ ニ ュ ーのす ぐ 下にボ タ ン が配置 さ れ、 フ レーム の一番下にはマ イ ク ロ ヘルプが表示 さ れ る も の と し ます。 90 PowerBuilder 第 5 章 MDI ア プ リ ケーシ ョ ンの構築 int li_width, li_height // フ レームにおけるワー ク スペースの幅 と 高 さ を取得 し ます。 // // MDI ツールバーを表示する場合は、 // WorkSpaceWidth 関数 と WorkSpaceHeight 関数が返 し た // ワー ク スペースのサイ ズか ら ツールバーの // サイ ズ分を差 し 引 く こ と に注意 し て く だ さ い。 // この調整方法については、 後で説明 し ます。 // li_width = w_genapp_frame.WorkSpaceWidth() li_height = w_genapp_frame.WorkSpaceHeight() // // // // // // // // // // // // // // // // // // // // 次に、 以下の処理を行 う こ と によ っ て、 ク ラ イ ア ン ト 領域の高 さ を決めます。 1) WorkSpaceHeight 値から コ ン ト ロールの高 さ と コ ン ト ロールの y 座標を減算 し ます。 つま り 、 こ の値は、 ツールバーがない場合の フ レームにおける ワー ク スペースの上端 と コ ン ト ロールの上端 と の距離 にな り ます。 2) 次の減算を行います。 フ レームのマ イ ク ロヘルプ バーが ある場合は、 その高 さ を減算 し ます。 3) 次の加算を行います。 表示する ツールバーの高 さ を 加算 し ます。 最初に WorkSpaceHeight 関数が 返 し た値からは、 ツールバーの高 さ が 差 し 引かれているから です。 最終的に ツールバーの高 さ は、 WorkspaceY 関数が返す Y 座標 と 同 じ にな り ます。 li_height = li_height - (cb_print.y + cb_print.height) li_height = li_height - MDI_1.MicroHelpHeight li_height = li_height + WorkspaceY() // 次に、 ワー ク スペースの コ ン ト ロールの真下から ク ラ イ ア ン ト 領 // 域が始ま る よ う に移動 し ます。 mdi_1.Move (WorkspaceX (), cb_print.y + cb_print.height) ア プ リ ケーシ ョ ン テ ク ニ ッ ク & 91 MDI ア プ リ ケーシ ョ ンにおけるキーボー ド 操作について // 最後に、 以前に計算 し た幅 と 高 さ に基づいて、 // ク ラ イ ア ン ト 領域のサイ ズを変更 し ます。 mdi_1.Resize (li_width, li_height) MicroHelpHeight プ ロパテ ィ について MicroHelpHeight プ ロ パテ ィ は MDI_1 のプ ロ パテ ィ で、 ウ ィ ン ド ウ の種 類に MDI フ レーム を選択 し た と き に設定 さ れます。MDI フ レーム を選 択 し た場合、マ イ ク ロ ヘルプは表示 さ れず MicroHelpHeight プ ロ パテ ィ は 0 にな り ます。 マ イ ク ロ ヘルプ付 き MDI フ レーム を選択 し た場合、 MicroHelpHeight プ ロ パテ ィ の値はマ イ ク ロ ヘルプの高 さ にな り ます。 MDI ア プ リ ケーシ ョ ンにおけるキーボー ド 操作について PowerBuilder MDI アプ リ ケーシ ョ ン では、 矢印キー と シ ョ ー ト カ ッ ト キーが自動的にサポー ト さ れ ます。 矢印キー 92 MDI フ レーム では、エ ン ド ユーザが矢印キーを押 し た と き のポ イ ン タ の動 き は、 キーが押 さ れた と き に フ ォ ーカ ス さ れていた場所に よ っ て 異な り ます。 PowerBuilder 第 5 章 MDI ア プ リ ケーシ ョ ンの構築 表 5-4: 矢印キーによ る フ ォ ー カ スの移動 キー 〔←〕 フ ォ ー カ スの位置 メ ニ ュ ー バー 〔→〕 最初 (左端) の メ ニ ュ ー バー 項目 ア ク テ ィ ブ シー ト の コ ン ト ロ ール メ ニ ュ ー フ レームの コ ン ト ロ ール メ ニ ュー メ ニ ュ ー バー 最後 (右端) の メ ニ ュ ー バー 〔↓〕 〔↑〕 シ ョ ー ト カ ッ ト キー フ レームの コ ン ト ロ ール メ ニ ュー ア ク テ ィ ブ シー ト の コ ン ト ロ ール メ ニ ュ ー ド ロ ッ プダ ウ ン メ ニ ュ ーま た はカ ス ケー ド メ ニ ュ ー ド ロ ッ プダ ウ ン メ ニ ュ ーやカ ス ケー ド メ ニ ュ ーの最後の メ ニ ュ ー項目 ド ロ ッ プダ ウ ン メ ニ ュ ーま た はカ ス ケー ド メ ニ ュ ー ド ロ ッ プダ ウ ン メ ニ ュ ーやカ ス ケー ド メ ニ ュ ーの最初の メ ニ ュ ー項目 フ ォ ー カ スの移動先 フ ォーカ ス があ る メ ニ ュ ー項目 の左側の メ ニ ュ ー項目 ア ク テ ィ ブ シー ト の コ ン ト ロ ー ル メ ニ ュー フ レームの コ ン ト ロ ール メ ニ ュー 最後 (右端) の メ ニ ュ ー バー フ ォーカ ス があ る メ ニ ュ ー項目 の右側の メ ニ ュ ー項目 フ レームの コ ン ト ロ ール メ ニ ュー ア ク テ ィ ブ シー ト の コ ン ト ロ ー ル メ ニ ュー メ ニ ュ ー バーの最初 (左端) の 項目 現行の項目の下位の メ ニ ュ ー項 目 その メ ニ ュ ーの最初の項目 現行の項目の上位の メ ニ ュ ー項 目 その メ ニ ュ ーの最後の項目 PowerBuilder で は、 すべ て の MDI フ レ ー ム に 対 し て 以下 の 2 つ の シ ョ ー ト カ ッ ト キーが割 り 当て ら れてい ます。 表 5-5: MDI フ レームのシ ョ ー ト カ ッ ト キー キー 〔Ctrl〕 + 〔F4〕 〔Ctrl〕 + 〔F6〕 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 機能 ア ク テ ィ ブなシー ト を閉 じ 、 次のシー ト を ア ク テ ィ ブに し ます。 次にア ク テ ィ ブにな る のは、 閉 じ ら れた シー ト の直 前にア ク テ ィ ブにな っ ていたシー ト です。 直前にア ク テ ィ ブにな っ ていた シー ト を ア ク テ ィ ブに し ま す。 93 MDI ア プ リ ケーシ ョ ンにおけるキーボー ド 操作について 94 PowerBuilder 第 6 章 ウィ ン ド ウ イ ン ス タ ン ス の管理 こ の章について こ の章では、 同 じ ウ ィ ン ド ウ の複数の ウ ィ ン ド ウ イ ン ス タ ン ス を 管理す る 方法について説明 し ます。 内容 項目 ウ ィ ン ド ウ イ ン ス タ ン ス について ウ ィ ン ド ウ イ ン ス タ ン ス の宣言 ウ ィ ン ド ウ配列の使い方 子孫オブジ ェ ク ト のエン テ ィ テ ィ の参照 ページ 95 96 98 101 ウ ィ ン ド ウ イ ン ス タ ン スについて アプ リ ケーシ ョ ン を構築す る と き 、 構造は同 じ で、 デー タ 値が異 な る ウ ィ ン ド ウ をい く つか表示 し たい こ と があ り ます。 た と えば、 ウ ィ ン ド ウ w_employee の複数の コ ピー ( イ ン ス タ ン ス) を開いて、 同時に複数の従業員情報を表示す る と い う 場合です。 こ れには、 ま ず、 PowerBuilder が ど の よ う に ウ ィ ン ド ウ 定義を格 納す る か を理解す る 必要があ り ます。 PowerBuilder によ る ウ ィ ン ド ウ定義の格納方法 ウ ィ ン ド ウ を保存す る と き 、 PowerBuilder は、 以下の 2 つのエ ン テ ィ テ ィ を ラ イ ブ ラ リ に生成 し ます。 • 新 し いデー タ 型 デー タ 型名は ウ ィ ン ド ウ 名 と 同 じ た と えば、 w_employee と い う 名前の ウ ィ ン ド ウ を保存す る と 、 PowerBuilder は内部的に w_employee と い う 名前のデー タ 型を 作成 し ます。 • 新 し いデー タ 型のグローバル変数 グ ロ ーバル変数名は ウ ィ ン ド ウ名 と 同じ た と えば、 ウ ィ ン ド ウ w_employee を保存す る と 、 w_employee 型で w_employee と い う 名前のグ ロ ーバル変数 も 暗黙的に定義 さ れます。 次の よ う に宣言す る の と 同 じ です。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 95 ウ ィ ン ド ウ イ ン ス タ ン スの宣言 図 6-1: 変数宣言 デー タ 型や変数の名前 を 複製す る こ と に よ り 、 PowerBuilder の新規 ユーザは、 デー タ 型の コ ン セプ ト を気にせずに、 変数を使用 し て ウ ィ ン ド ウ に簡単にア ク セ ス で き ます。 ウ ィ ン ド ウを開 く と き に行われる処理 ウ ィ ン ド ウ を開 く には、 次の よ う に Open 関数を使用 し ます。 Open(w_employee) こ れに よ っ て実際は、 デー タ 型 w_employee の イ ン ス タ ン ス が作成 さ れ、 グ ロ ーバル変数 w_employee への参照が割 り 当て ら れ ます。 すで に開い て い る ウ ィ ン ド ウ を 開 く と 、 PowerBuilder は単に既存の ウ ィ ン ド ウ を ア ク テ ィ ブにす る だけで、 新たに ウ ィ ン ド ウ を開 き ませ ん。 た と え ば、 次 の ス ク リ プ ト を コ マ ン ド ボ タ ン コ ン ト ロ ール の Clicked イ ベン ト に記述 し た と し ます。 Open(w_employee) こ のボ タ ン を何回 ク リ ッ ク し て も 、 ウ ィ ン ド ウ w_employee は 1 つ し か 開 き ません。 こ の ウ ィ ン ド ウ は、 グ ロ ーバル変数 w_employee にポ イ ン ト さ れ ます。 ウ ィ ン ド ウ の複数の イ ン ス タ ン ス を開 く には、 その ウ ィ ン ド ウ の種類 をデー タ 型 と し て変数を宣言 し ます。 ウ ィ ン ド ウ イ ン ス タ ン スの宣言 ウ ィ ン ド ウ は、 実際はデー タ 型であ る ため、 Integer 型や String 型な ど の変数を宣言す る の と 同様に、 ウ ィ ン ド ウ の種類をデー タ 型 と し て変 数を宣言で き ます。 そ う すれば、 ス ク リ プ ト でそれ ら の変数を参照で き ます。 例 w_employee mywin w_employee 型の変数 mywin を宣言 し ます。 96 PowerBuilder 第 6 章 ウ ィ ン ド ウ イ ン ス タ ン スの管理 変数の制限 ウ ィ ン ド ウ イ ン ス タ ン ス を宣言す る と 、 ほかの ウ ィ ン ド ウ か ら 参照で き ません。 た と えば、 3 つの ウ ィ ン ド ウ が開いてい る 場合、 2 番目 と 3 番目の ウ ィ ン ド ウ か ら 1 番目の ウ ィ ン ド ウ を明示的に参照す る こ と が で き ません。 参照変数を使用 し て開いた ウ ィ ン ド ウ のグ ロ ーバル ハン ド ルがあ り ません。 ス ク リ プ ト を使用 し て ウ ィ ン ド ウ イ ン ス タ ン スへ の参照を維持す る 方法については、 98 ページの 「 ウ ィ ン ド ウ 配列の使 い方」 を参照 し て く だ さ い。 イ ン ス タ ン ス を開 く ウ ィ ン ド ウ イ ン ス タ ン ス を開 く には、 次の よ う に、 Open 関数で ウ ィ ン ド ウ 変数を参照 し ます。 w_employee mywin Open(mywin) こ の場合、 Open 関数は、 変数 mywin のデー タ 型を w_employee と し て ウ ィ ン ド ウ w_employee の イ ン ス タ ン ス を作成 し 、変数 mywin への参照 を割 り 当て ます。 こ の ス ク リ プ ト を コ マ ン ド ボ タ ンの Clicked イ ベン ト に記述す る と 、ボ タ ンが ク リ ッ ク さ れ る たびに、 ウ ィ ン ド ウ w_employee の新 し い イ ン ス タ ン ス が作成 さ れ ます。 つ ま り 、 ボ タ ン が ク リ ッ ク さ れ る たびに、 新 し い ウ ィ ン ド ウ が開 き ます。 し たが っ て、 ウ ィ ン ド ウ 名 をデー タ 型 と し て変数 を 作成す る こ と で、 複数の ウ ィ ン ド ウ イ ン ス タ ン ス を開 く こ と がで き ます。 こ れは簡単な 方法です。 PowerBuilder は、 ウ ィ ン ド ウ を自動的に管理 し ま す。 た と えば、 開発者が ウ ィ ン ド ウ を閉 じ る と 、 自動的に メ モ リ を解放 し ます。 イ ン ス タ ン ス を閉 じ る 一般的に、 ウ ィ ン ド ウ の イ ン ス タ ン ス を閉 じ る には、 コ マ ン ド ボ タ ン の Clicked イ ベン ト に次の ス ク リ プ ト を記述 し て ウ ィ ン ド ウ 内に配置 し ます。 Close(Parent) こ のス ク リ プ ト は、 コ マン ド ボ タ ンの親、 つま り コ マン ド ボ タ ンが配置 さ れてい る ウ ィ ン ド ウ を閉じ ます。 し たがっ て、 こ のス ク リ プ ト を記述 し た コ マン ド ボ タ ン を ウ ィ ン ド ウ w_employee に配置すれば、 w_employee の現行の ウ ィ ン ド ウ イ ン ス タ ン ス が閉じ ら れます。 w_employee の mywin イ ン ス タ ン ス にあ る CommandButton を ク リ ッ ク す る と 、 mywin が閉 じ ら れます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 97 ウ ィ ン ド ウ配列の使い方 ウ ィ ン ド ウ配列の使い方 ウ ィ ン ド ウ 配列を作成す る には、 ウ ィ ン ド ウ のデー タ 型で配列を宣言 し ます。 た と えば、 次の ス テー ト メ ン ト では、 ウ ィ ン ド ウ w_employee の イ ン ス タ ン ス を 5 つ含んだ配列 myarray を宣言 し ます。 w_employee myarray[5] ウ ィ ン ド ウ を い く つ開 く のか コ ンパ イ ル時にわか ら ない場合は、 可変 長の ウ ィ ン ド ウ 配列を作成で き ます。 配列を使用 し て イ ン ス タ ン ス を開 く 配列内の ウ ィ ン ド ウ の イ ン ス タ ン ス を開 く には、 Open 関数に引数 と し て配列の イ ンデ ッ ク ス を渡 し ます。 上記の宣言に続 き 、 以下の ス テー ト メ ン ト では、 ウ ィ ン ド ウ w_employee の 1 番目 と 2 番目の イ ン ス タ ン ス を開 き ます。 Open(myarray[1]) Open(myarray[2]) // ウ ィ ン ド ウ w_employee の // 1 番目のイ ン ス タ ン ス を開き ます。 // 2 番目のイ ン ス タ ン ス を開き ます。 最初に開いた イ ン ス タ ン スの移動 上記の ス テー ト メ ン ト では、 1 番目の イ ン ス タ ン ス と 同 じ 位置に 2 番 目の イ ン ス タ ン ス が開 き ます。 2 番目の Open 関数を呼び出す前に ス ク リ プ ト で Move 関数を呼び出 し て、最初に開いた イ ン ス タ ン ス を別の位 置に移動す る 必要があ り ます。 配列の操作 ウ ィ ン ド ウ 配列を使用す る と 、 配列の イ ンデ ッ ク ス を指定 し て特定の ウ ィ ン ド ウ イ ン ス タ ン ス を操作で き ます。 た と えば、 次の ス テー ト メ ン ト は、 配列内の 2 番目の ウ ィ ン ド ウ を非表示に し ます。 myarray[2].Hide() ま た、 次の よ う に、 配列の イ ンデ ッ ク ス を使用 し て ウ ィ ン ド ウ 内の コ ン ト ロ ールを参照で き ます。 myarray[2].st_count.text = "2" 98 PowerBuilder 第 6 章 ウ ィ ン ド ウ イ ン ス タ ン スの管理 複数のウ ィ ン ド ウ を開 く 多数の ウ ィ ン ド ウ イ ン ス タ ン ス を開いた り 、 閉 じ た り す る 場合は、 メ イ ン ウ ィ ン ド ウ の ス ク リ プ ト に FOR...NEXT 文を記述 し て ウ ィ ン ド ウ イ ン ス タ ン ス を開いた り 、 閉 じ た り で き ま す。 た と えば、 次の よ う に ス ク リ プ ト を記述 し ます。 w_employee myarray[5] for i = 1 to 5 Open(myarray[i]) next 型が混在する配列の作 成 前述の例では、 配列内の ウ ィ ン ド ウ はすべて同 じ 型で し たが、 型が混 在す る 配列を作成す る こ と も で き ます。 こ の方法を習得す る 前に、 ま ず、 ウ ィ ン ド ウ の継承機能について詳 し く 知っ てお く 必要があ り ます。 定義す る ウ ィ ン ド ウ は、 実際はすべて、 組み込みデー タ 型 window の 子孫 ウ ィ ン ド ウ です。 ゼ ロ か ら 定義 さ れた ウ ィ ン ド ウ w_employee と 、w_employee か ら 継承 さ れた ウ ィ ン ド ウ w_customer があ る 場合、 継承階層は次の よ う にな り ま す。 図 6-2: ウ ィ ン ド ウの継承階層 window と い う 名前のシ ス テ ム定義オブジ ェ ク ト は、 PowerBuilder で定 義 さ れ る すべての ウ ィ ン ド ウ の先祖オブジ ェ ク ト です。 組み込みオブ ジ ェ ク ト window には、 すべての ウ ィ ン ド ウ で使用 さ れ る 、 X、 Y、 タ イ ト ルな ど のプ ロ パテ ィ が定義 さ れてい ます。 ユ ー ザ定義 ウ ィ ン ド ウ はすべ て window の 子孫 ウ ィ ン ド ウ な の で、 window 型の変数 を定義すればア プ リ ケーシ ョ ン内で ど の よ う な種類 の ウ ィ ン ド ウ で も 参照で き ます。 次の ス ク リ プ ト では、 3 つの ウ ィ ン ド ウ を含む配列 newarray を定義 し ま す。 ユーザ定義 ウ ィ ン ド ウ はすべてデー タ 型 window か ら 派生 し て い る ので、 配列はど の よ う な ウ ィ ン ド ウ で も 参照で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 99 ウ ィ ン ド ウ配列の使い方 window newarray[3] string win[3] int i win[1] = "w_employee" win[2] = "w_customer" win[3] = "w_sales" for i = 1 to 3 Open(newarray[i], win[i]) next こ の コ ー ド では、 次に示す書式の Open 関数を使用 し ます。 Open ( windowVariable, windowType ) windowVariable は window 型の変数 (子孫 ウ ィ ン ド ウ )、 windowType は ウ ィ ン ド ウ の種類を指定す る 文字列です。 上記の ス ク リ プ ト では、 ウ ィ ン ド ウ w_employee、 w_customer、 お よ び w_sales の ウ ィ ン ド ウ イ ン ス タ ン ス を開 き ます。 配列の使い方 と 参照変 数の使い方 表 6-1 に、 ウ ィ ン ド ウ イ ン ス タ ン ス を操作す る ために参照変数を使用 す る 場合 と 配列を使用す る 場合を示 し ます。 表 6-1: 配列 と 参照変数 項目 配列 長所 特定の ウ ィ ン ド ウ イ ン ス タ ン ス が参照で きる 参照変数 使 い 方 が 簡単- PowerBuilder が 自動 的に処理を行 う 短所 使い方が複雑。 た と えば、 配列内の 2 番 目の ウ ィ ン ド ウ を閉 じ た後で新 し い ウ ィ ン ド ウ を開 こ う と する 場合、(必要以上に メ モ リ を使用す る が) 配列の最後に ウ ィ ン ド ウ を追加す る か、 ま たは既存の配列 内に新 し い ウ ィ ン ド ウ 用の空 ス ロ ッ ト を 探すか ど う かの ス ク リ プ ト を記述す る 必 要があ る 参照変数を使用 し て作成 し た ウ ィ ン ド ウ の特定の イ ン ス タ ン ス を操作で き ない w_employee を使用 し て、 個々の従業員のデー タ を提供ま たは修正す る も の と 仮定 し ます。 w_employee の 2 番目の イ ン ス タ ン ス が同 じ 従業員 を開 く こ と を禁止 し た り 、 w_employee の イ ン ス タ ン ス を ど の従業員に 対 し て開 く か を決定 し た り す る こ と も で き ます。 こ の よ う な管理を行 う には、 配列を使用す る 必要があ り ます。 特定の ウ ィ ン ド ウ イ ン ス タ ン ス を管理す る 必要がない場合には、 かわ り に使いやすい参照変数を 使用 し て く だ さ い。 100 PowerBuilder 第 6 章 ウ ィ ン ド ウ イ ン ス タ ン スの管理 子孫オブ ジ ェ ク ト のエ ン テ ィ テ ィ の参照 デー タ 型が window な ど オブジ ェ ク ト の一種であ る 変数を宣言す る と 、 その変数を使用 し て、 子孫オブジ ェ ク ト ではな く 先祖オブジ ェ ク ト に 定義 さ れてい る エ ン テ ィ テ ィ を参照で き ます。 し か し 、 次の場合を考 え てみま し ょ う 。 w_customer mycust Open(mycust) // 次のス テー ト メ ン ト は、 ウ ィ ン ド ウ w_customer に // コ ン ト ロール st_name があれば有効です。 mycust.st_name.text = "Joe" mycust は w_customer 型の変数 と し て宣言 さ れてい ます。つま り 、mycust は ウ ィ ン ド ウ w_customer です。 ウ ィ ン ド ウ w_customer に st_name と い う 名前の ス タ テ ィ ッ ク テ キ ス ト コ ン ト ロ ールが存在すれば、上記の最 後の ス テー ト メ ン ト は有効です。 し か し 、 次の場合を考え てみま し ょ う 。 window newwin string winname = "w_customer" Open(newwin, winname) // window 型のオブ ジ ェ ク ト にス タ テ ィ ッ ク テキス ト // コ ン ト ロール st_name がないので無効です。 newwin.st_name.text = "Joe" こ の 場 合、 newwin は window 型 の 変 数 と し て 定 義 さ れ て い ま す。 PowerBuilder は、 コ ンパ イ ル時に厳密なデー タ 型チ ェ ッ ク を行 う ため、 上記の ス テー ト メ ン ト は拒否 さ れ ます。 つ ま り 、 変数の コ ンパ イ ル時 デー タ 型に明示的に含ま れていないオブジ ェ ク ト のエ ン テ ィ テ ィ を参 照す る こ と はで き ません。 window 型のオブジ ェ ク ト には st_name と い う コ ン ト ロ ールは含まれて いないので、 こ の ス テー ト メ ン ト は無効にな り ます。 下記のいずれか を行 う 必要があ り ます。 • 次の よ う に、 newwin の宣言を、 w_customer に、 ま たは コ ン ト ロ ー ル st_name を含む先祖 ウ ィ ン ド ウ に変更 し ます。 w_customer newwin string winname = "w_customer" Open(newwin, winname) // 今度は有効です。 newwin.st_name.text = "Joe" ア プ リ ケーシ ョ ン テ ク ニ ッ ク 101 子孫オブ ジ ェ ク ト のエ ン テ ィ テ ィ の参照 • 次の よ う に、w_customer 型の別の変数を定義 し 、その変数を newwin に代入 し ます。 window newwin w_customer custwin stringwinname = "w_customer" Open(newwin, winname) custwin = newwin // 今度は有効です。 custwin.st_name.text = "Joe" 102 PowerBuilder 第 7 章 ウィ ン ド ウにおける タ ブ コ ン ト ロ ールの使い方 こ の章について こ の章では、 アプ リ ケーシ ョ ン での タ ブ コ ン ト ロ ールの使い方に ついて説明 し ます。 内容 項目 タ ブ コ ン ト ロ ールについて タ ブ ページの定義 と 管理 タ ブ コ ン ト ロ ールのカ ス タ マ イ ズ ス ク リ プ ト におけ る タ ブ コ ン ト ロ ールの使い方 ページ 103 104 108 111 タ ブ コ ン ト ロールについて タ ブ コ ン ト ロ ール と は、 ほかの コ ン ト ロ ールを表示す る タ ブ ペー ジの コ ン テナです。 1 つの タ ブ ページは、 タ ブ コ ン ト ロ ールの表 示域を満た し ます。 ま た、 タ ブ ページには、 イ ンデ ッ ク ス カー ド を分割す る よ う な タ ブがあ り ま す。 ページ を移動す る には、 タ ブ を ク リ ッ ク し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 103 タ ブ ページの定義 と 管理 タ ブ コ ン ト ロ ールを使用すれば、 た く さ んの情報を整理 し て、 表示で き る よ う にな り ます。 ほかの コ ン ト ロ ール と 同様に、 タ ブ コ ン ト ロ ー ルの追加、 サ イ ズの変更、 移動がで き ます。 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルでは、 ウ ィ ン ド ウ やカ ス タ ム ビ ジ ュ アル ユーザ オ ブジ ェ ク ト に コ ン ト ロ ールを追加す る 方法について説明 し てい ます。 タ ブ関連の用語 次の定義を知っ てお く 必要があ り ます。 タ ブ コ ン ト ロール ウ ィ ン ド ウ ま たはユーザ オブ ジ ェ ク ト の中に配置 す る 、 タ ブ ページ を持つ コ ン ト ロ ールです。 タ ブ コ ン ト ロ ールは、 タ ブ と タ ブ ページで構成 さ れ ます。残 り の スペース は タ ブ ページその も のが占めてい ます。 タ ブ ページ タ ブ ページはユーザ オブ ジ ェ ク ト です。 タ ブ ページ内 に、 ほかの コ ン ト ロ ールを配置す る こ と がで き ます。 タ ブ コ ン ト ロ ー ルの中にあ る すべての タ ブ ページは、 タ ブ コ ン ト ロ ール と 同 じ エ リ ア を占め ます。 し たが っ て、 タ ブ ページは一度に 1 つの タ ブ ページ し か 表示で き ません。 ア ク テ ィ ブな タ ブ ページが、 ほかの タ ブ ページ を覆 い隠 し て し ま い ます。 ペ イ ン タ ま たは実行時に、 タ ブ コ ン ト ロ ールの中に タ ブ ページ を定義 で き ます。 ま た、 タ ブ ページ を ユーザ オブジ ェ ク ト の中に定義 し て、 ペ イ ン タ で、あ る いは実行中にそのユーザ オブジ ェ ク ト を タ ブ コ ン ト ロ ールに挿入す る こ と も で き ます。 タ ブ タ ブ ページのビ ジ ュ アルなハン ド ルです。 タ ブは、 タ ブ ページ の ラ ベルを表示 し ます。 タ ブ ページが表示 さ れていない場合は、 タ ブ を ク リ ッ ク し て、 その タ ブ ページ を前面に持っ て き て ア ク テ ィ ブに し ます。 タ ブ ページの定義 と 管理 タ ブ ページは、 ユーザ オブジ ェ ク ト です。 2 つの方法 タ ブ ページ を定義す る には、 い く つかの方法があ り ます。 定義は、 以 下の よ う に行い ます。 • 104 ペ イ ン タ で、タ ブ コ ン ト ロ ールに タ ブ ページ を挿入 し て、 そのページに コ ン ト ロ ール を追加 し ま す。 埋め込み タ ブ ページは、 UserObject ク ラ ス ですが、 再利用で き ません。 埋め込み タ ブ ページ PowerBuilder 第 7 章 ウ ィ ン ド ウにおける タ ブ コ ン ト ロールの使い方 • ユーザ オブジ ェ ク ト ペ イ ン タ で、 カ ス タ ム ビ ジ ュ アル ユーザ オブジ ェ ク ト を作成 し て、 タ ブ ページ に表示 さ れ る コ ン ト ロ ールを追加 し ます。 ユーザ オブジ ェ ク ト ペ イ ン タ か ス ク リ プ ト の中で OpenTab 関数を呼び出 し て、 タ ブ コ ン ト ロ ール内の タ ブ ページ と し て ユーザ オブ ジ ェ ク ト を 使用で き ます。 独立 し たユーザ オブジ ェ ク ト と し て定義 さ れた タ ブ ページ は、 再利用で き ます。 独立 し たユーザ オブ ジ ェ ク ト こ れ ら 2 つの方法は、 同時に使用で き ます。 つま り 、 1 つの タ ブ コ ン ト ロ ールに、埋め込み タ ブ ページ と 独立 し たユーザ オブジ ェ ク ト の両 方を挿入で き ます。 新 し い タ ブ コ ン ト ロ ールを作成す る と 、埋め込み タ ブ ページが自動的 に 1 つ作成 さ れ ます。 その タ ブ ページ を使用す る こ と も 、 削除す る こ と も で き ます。 タ ブ ページの作成方 法 ❖ ❖ ❖ タ ブ コ ン ト ロール内に新 し い タ ブ ページ を作成する には 1 タ ブ コ ン ト ロ ール内の タ ブエ リ ア を右 ク リ ッ ク し ます。 タ ブ ペー ジ を ク リ ッ ク し てはいけ ません。 2 ポ ッ プア ッ プ メ ニ ュ ーか ら [ タ ブ ページの挿入] を選択 し ます。 3 新 し い タ ブ ページに コ ン ト ロ ールを追加 し ます。 タ ブ コ ン ト ロールの独立 し た タ ブ ページ を定義する には 1 新規作成 ダ イ ア ロ グ ボ ッ ク ス で、 [PB オブジ ェ ク ト ] タ ブの [カ ス タ ム ビ ジ ュ アル] を選択 し ます。 2 ユーザ オブジ ェ ク ト ペ イ ン タ で、使用す る タ ブ コ ン ト ロ ールの表 示領域のサ イ ズに合わせて、 ユーザ オブジ ェ ク ト のサ イ ズ を設定 し ます。 3 タ ブ ページに表示 さ れ る コ ン ト ロ ールを ユーザ オブジ ェ ク ト に 追加 し て、 イ ベン ト に対す る ス ク リ プ ト を記述 し ます。 4 ユーザ オブジ ェ ク ト のプ ロ パテ ィ シー ト で、 [ タ ブ ページ] タ ブ を ク リ ッ ク し て、 タ ブ ページで使用 さ れ る 情報を設定 し ます。 タ ブ コ ン ト ロ ールに、 タ ブ ページと し てユーザ オブ ジェ ク ト を 追加するには 1 タ ブ コ ン ト ロ ール内の タ ブエ リ ア を右 ク リ ッ ク し ます。 タ ブ ペー ジ を ク リ ッ ク し てはいけ ません。 2 ポ ッ プア ッ プ メ ニ ュ ーか ら [ユーザ オブジ ェ ク ト の挿入] を選択 し ます。 3 ユーザ オブジ ェ ク ト を選択 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 105 タ ブ ページの定義 と 管理 タ ブ ページは、 選択 し たユーザ オブジ ェ ク ト か ら 継承 さ れ ます。 タ ブ コ ン ト ロ ール内の タ ブ ページ を定義す る の と 同 じ よ う に、 継 承 さ れた ユーザ オブ ジ ェ ク ト の タ ブ ページ にプ ロ パテ ィ を 設定 し 、 ス ク リ プ ト を記述で き ます。 タ ブ コ ン ト ロール内のユーザ オブ ジ ェ ク ト に配置 さ れた コ ン ト ロールの 編集 タ ブ コ ン ト ロ ール内に あ る ユーザ オブ ジ ェ ク ト の内容は編集で き ま せん。 ユーザ オブ ジ ェ ク ト 上の コ ン ト ロ ール を編集 し た り 、 ス ク リ プ ト を記述す る 場合は、 ウ ィ ン ド ウ ま たは タ ブ コ ン ト ロ ー ルがあ る ユーザ オブジ ェ ク ト を閉 じ てか ら 、 ユーザ オブジ ェ ク ト ペ イ ン タ に戻っ て変更を行い ます 。 タ ブ コ ン ト ロ ール上で、 タ ブ ページの表示、 表示順序の変更、 削除が で き ます。 タ ブ ページの管理 ❖ 別の タ ブ ページ を表示するには • タ ブ ページの タ ブ を ク リ ッ ク し ます。 タ ブ ページは前面に表示 さ れ、 ア ク テ ィ ブな タ ブ ページ と な り ま す。 タ ブは、 設定 し た タ ブ順序に応 じ て再配置 さ れます。 ❖ ❖ 106 タ ブ コ ン ト ロール内の タ ブの表示順序を変更するには 1 タ ブ コ ン ト ロ ールのプロ パティ シート の [タ ブ順序]タ ブを ク リ ッ ク し ます。 2 表示 し たい位置に タ ブ ページの名前を ド ラ ッ グ し ます。 タ ブ コ ン ト ロールから タ ブ ページ を削除するには 1 タ ブ ページの タ ブ を ク リ ッ ク し ます。 2 タ ブ ページ を右 ク リ ッ ク し 、 ポ ッ プア ッ プ メ ニ ュ ーか ら [切 り 取 り ] ま たは [削除] を選択 し ます。 PowerBuilder 第 7 章 ウ ィ ン ド ウにおける タ ブ コ ン ト ロールの使い方 タ ブ コ ン ト ロール と タ ブ ページの選択 タ ブ コ ン ト ロ ール内の さ ま ざ ま な領域を ク リ ッ ク し てみ る と 、 プ ロ パ テ ィ ビ ューが変化し て、タ ブ コ ン ト ロ ール自身のプ ロ パテ ィ 、タ ブ ペー ジ、 ま たは タ ブ ページ上の コ ン ト ロ ールが表示 さ れ る こ と がわか り ま す。 ポ ッ プア ッ プ メ ニ ュ ーか ら [切 り 取 り ] な ど の項目を選択す る 前 に、 正 し いオブジ ェ ク ト が選択 さ れてい る こ と を確認 し て く だ さ い。 タ ブ コ ン ト ロ ールの タ ブ領域の ど こ か を ク リ ッ ク す る と 、その タ ブ コ ン ト ロ ールが選択 さ れ ます。 特定ページの タ ブ を ク リ ッ ク す る と 、 そ の タ ブ ページはア ク テ ィ ブにな り ますが、 選択 さ れ る オブジ ェ ク ト は 依然 と し て タ ブ コ ン ト ロ ールです。 タ ブ ページ を選択す る には、 その タ ブ を ク リ ッ ク し て ア ク テ ィ ブに し てか ら 、 タ ブ自身を除 く 、 ページ の背景の ど こ か を ク リ ッ ク し ます。 タ ブ ページ上の コ ン ト ロール タ ブ コ ン ト ロ ールの本来の目的は、 タ ブ ページにほかの コ ン ト ロ ール を表示 さ せ る こ と です。 タ ブ ページ を ウ ィ ン ド ウ の ミ ニチ ュ ア版 と し て考え る こ と がで き ます。 ウ ィ ン ド ウ に対 し て行 う よ う に、 タ ブ ペー ジに コ ン ト ロ ールを追加 し ます。 タ ブ コ ン ト ロ ールで作業 し てい る と き は、 タ ブ コ ン ト ロ ール内に作成 さ れた タ ブ ページに し か コ ン ト ロ ールを追加す る こ と がで き ません。 タ ブ コ ン ト ロール内のユーザ オブ ジ ェ ク ト へのコ ン ト ロールの追加 タ ブ コ ン ト ロ ール内のユーザ オブジ ェ ク ト に コ ン ト ロ ール を追加す る には、 ユーザ オブジ ェ ク ト ペ イ ン タ でそのユーザ オブジ ェ ク ト を 開 き ます。 ❖ 埋め込み タ ブ ページに コ ン ト ロールを追加するには • ウ ィ ン ド ウ に コ ン ト ロ ール を追加す る 場合 と 同様に、 ツールバー ま たは [挿入] メ ニ ュ ーか ら コ ン ト ロ ールを選択 し て、 タ ブ ペー ジ を ク リ ッ ク し ます。 タ ブ ページ を ク リ ッ ク す る と 、 その タ ブ ページが コ ン ト ロ ールの 親にな り ます。 ❖ 1 つの タ ブ ページか ら別の タ ブ ページに コ ン ト ロールを移動する には • コ ン ト ロ ールを切 り 取 る か コ ピー し て、 目的の タ ブ ページに貼 り 付け ます。 移動元の タ ブ ページ と 移動先の タ ブ ページは、両方 と も 埋め込み タ ブ ページでなければな り ません。 独立 し たユーザ オブジ ェ ク ト であ っ て はな り ません。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 107 タ ブ コ ン ト ロールのカ ス タ マ イ ズ ❖ タ ブ ページ と その タ ブ コ ン ト ロールがあるウ ィ ン ド ウの間で コ ン ト ロールを 移動するには • コ ン ト ロ ール を切 り 取 る か コ ピー し て、 目的の ウ ィ ン ド ウ か タ ブ ページに貼 り 付け ます。 タ ブ コ ン ト ロ ールの外の ウ ィ ン ド ウ に、 コ ン ト ロ ールを ド ラ ッ グ す る こ と はで き ません。 タ ブ ページ と ウ ィ ン ド ウ の間で コ ン ト ロ ールを移動す る こ と は、 コ ン ト ロ ールの親を変更す る こ と にな り ます。 し たが っ て、 コ ン ト ロ ール を参照す る ス ク リ プ ト に影響を与え ます。 タ ブ コ ン ト ロールのカ ス タ マ イ ズ タ ブ コ ン ト ロ ールには、 タ ブの表示位置 と 表示形態を制御す る 設定が あ り ます。 それぞれの タ ブには、 タ ブ自身の ラ ベル、 ピ ク チ ャ 、 背景 色があ り ます。 すべての タ ブは、 タ ブのプ ロ パテ ィ シー ト の [フ ォ ン ト ] タ ブ ページ で設定 さ れた、 同 じ フ ォ ン ト 設定を共有 し ます。 タ ブ コ ン ト ロール と タ ブ ページのための、 ポ ッ プア ッ プ メ ニ ュ ー と プ ロパテ ィ シー ト タ ブ コ ン ト ロ ールにはい く つかの要素があ り 、 それぞれにポ ッ プア ッ プ メ ニ ュ ー と プ ロ パテ ィ シー ト があ り ま す。 プ ロ パテ ィ シー ト を開 く ためには、 ポ ッ プア ッ プ メ ニ ュ ー上で [プ ロ パテ ィ ] を選択 し ます。 ア ク セ ス し たい要素の箇所で ク リ ッ ク し ます。 表 7-1: タ ブ コ ン ト ロール要素へのア ク セス 構成要素 タ ブ コ ン ト ロ ール タ ブ ページ タ ブ ペー ジ 内 の コ ン ト ロ ール タ ブの表示位置 と サイ ズ 108 方法 タ ブ コ ン ト ロ ールの タ ブエ リ ア内を右 ク リ ッ ク する か、 ダブル ク リ ッ ク する タ ブ ページ を ア ク テ ィ ブにす る ために タ ブ を ク リ ッ ク し てか ら 、タ ブ ページ内で コ ン ト ロ ールが な い部分 を ど こ か右 ク リ ッ ク す る か、 ダ ブル ク リ ッ ク する タ ブ ページ を ア ク テ ィ ブにす る ために タ ブ を ク リ ッ ク し てか ら 、 コ ン ト ロ ールを右 ク リ ッ ク す る か、 ダブル ク リ ッ ク す る タ ブのプ ロ パテ ィ シー ト の [全般] タ ブ ページには、 タ ブの表示位置 と サ イ ズ を 制御す る ための、 い く つかの設定が あ り ま す。 た と えば、 次の よ う にな り ます。 PowerBuilder 第 7 章 ウ ィ ン ド ウにおける タ ブ コ ン ト ロールの使い方 表 7-2: タ ブのサイ ズ と 表示位置の制御 変更内容 タ ブ コ ン ト ロ ールの タ ブを表示する 位置 タ ブ コ ン ト ロ ールの大 き さ に連動 し た タ ブの サ イ ズ変更 タ ブ コ ン ト ロ ールの左右に連動 し た テ キ ス ト の 向 き 。 垂直 テ キ ス ト を サ ポ ー ト す る の は True Type フ ォ ン ト のみであ る ため、 こ の設定 には注意が必要 変更する値 [ タ ブの位置] [幅合わせを し ない]、[複数 行]、 [均等な タ ブ幅] [テ キ ス ト を タ ブ に対 し て 垂直に表示] [均等な タ ブ幅] と [幅合わせを し ない] チ ェ ッ ク ボ ッ ク ス [均等な タ ブ幅] を オ ン にす る と 、 タ ブ幅は同 じ にな り ます。 [均等な タ ブ幅] を オ ン にす る こ と と 、 [幅合わせを し ない] を オ フ にす る こ と と は違い ます。 [幅合わせを し ない] を オ フ にす る と 、 タ ブ コ ン ト ロ ー ルの縁にあわせて、 タ ブが引 き 延ば さ れ ます。 すべての タ ブ ラ ベルの 長 さ が同 じ 場合は タ ブ幅 も 同 じ にな り ますが、 長い ラ ベル と 短い ラ ベ ルが混ざ っ てい る 場合は、 [均等な タ ブ幅] を オ ンに し ない限 り 、 タ ブ 幅は、 タ ブ ラ ベルの長 さ に応 じ て異な り ます。 以下の タ ブ コ ン ト ロ ールは、 い く つかの設定を組み合わせた結果を表 し ます。 タ ブの位置は上端に設定 し て あ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 109 タ ブ コ ン ト ロールのカ ス タ マ イ ズ 次の例では、 タ ブ コ ン ト ロ ールは、 住所録の よ う に、 タ ブが左側 と 右 側を行 き 来 し ます。 [選択テ キ ス ト を太字] チ ェ ッ ク ボ ッ ク ス を オ ン に し て、 タ ブ位置を変更すれば、 選択 さ れた タ ブ を見つけ る こ と が容易 にな り ます。 タ ブ ラ ベル タ ブ コ ン ト ロ ール と タ ブ シー ト の両方のプ ロ パテ ィ シー ト を使用 し て、 タ ブの外観を変更で き ます。 表 7-3: タ ブの外観の変更 プ ロパテ ィ シー ト タブ コン ト ロ ール プ ロパテ ィ ページ [全般] タ ブ ページ [全般] タ ブ ページ [ タ ブページ] 設定 [ピ ク チ ャ を右側に表 示]、 [ピ ク チ ャ の表 示]、 [テ キ ス ト の表 示] [テ キ ス ト ]、 [背景色] [ピ ク チ ャ 名]、 [ タ ブ の文字の色]、 [ タ ブの 背景色]、 [ピ ク チ ャ マ ス ク 色] 作用対象 コ ン ト ロ ール内のす べての タ ブ タ ブ上の ラ ベル と タ ブ ページの背景色 テ キ ス ト の色、 タ ブ 上の ピ ク チ ャ 、( タ ブ ページではな く ) タ ブ自身の背景色 タ ブ ページ と し て使用す る ユーザ オブジ ェ ク ト を ユーザ オブジ ェ ク ト ペ イ ン タ で作成 し てい る 場合、 タ ブ ページのプ ロ パテ ィ シー ト で 作成で き る 、 ユーザ オブジ ェ ク ト のプ ロ パテ ィ シー ト の [ タ ブ ペー ジ] で同 じ 設定がで き ます。 110 PowerBuilder 第 7 章 ウ ィ ン ド ウにおける タ ブ コ ン ト ロールの使い方 以下の例では、 ピ ク チ ャ と テ キ ス ト がそれぞれの タ ブ ページに設定 さ れてい ます。 タ ブは、 それぞれ異な る 背景色が設定 さ れてい ます。 [ピ ク チ ャ を表示] と [テ キ ス ト を表示] の両チ ェ ッ ク ボ ッ ク ス の設定は、 ど ち ら も オ ン です。 ス ク リ プ ト で タ ブの表 示形態を変更 ペ イ ン タ で行っ た、 こ れ ら のプ ロ パテ ィ の設定は、 ス ク リ プ ト で も で き ます。 ス ク リ プ ト でプ ロ パテ ィ を設定すれば、 実行時に動的に タ ブ コ ン ト ロ ールの表示形態を変更で き ます。 ス ク リ プ ト における タ ブ コ ン ト ロールの使い方 こ の節では、 以下の よ う な ス ク リ プ ト におけ る タ ブの例について説明 し ます。 • ス ク リ プ ト での タ ブ ページの参照 • タ ブ ページにあ る コ ン ト ロ ールの参照 • タ ブ ページ を開 く 、 閉 じ る 、 非表示にす る • タ ブ ページの履歴 • 必要な と き だけ タ ブ ページ を生成 • タ ブ コ ン ト ロ ールの各部分におけ る イ ベン ト ス ク リ プ ト での タ ブ ページの参照 ド ッ ト (.) 表記を使用 し て、 個々の タ ブ ページ と その タ ブ ページに あ る コ ン ト ロ ールを参照で き ます。 • ウ ィ ン ド ウ やユーザ オブジ ェ ク ト は、 その中にあ る タ ブ コ ン ト ロ ールの親です。 window.tabcontrol • タ ブ コ ン ト ロ ールは、 その中にあ る タ ブ ページの親です。 window.tabcontrol.tabpageuo • タ ブ ページは、 その中にあ る コ ン ト ロ ールの親です。 window.tabcontrol.tabpageuo.controlonpage ア プ リ ケーシ ョ ン テ ク ニ ッ ク 111 ス ク リ プ ト における タ ブ コ ン ト ロールの使い方 た と えば、 以下の ス テー ト メ ン ト は、 ウ ィ ン ド ウ w_display 内の タ ブ コ ン ト ロ ール tab_1 の PowerTips プ ロ パテ ィ を設定 し ます。 w_display.tab_1.PowerTips = TRUE 次の例では、 タ ブ ページ tabpage_1 の PowerTipText プ ロ パテ ィ を設定 し ます。 w_display.tab_1.tabpage_1.PowerTipText = & "Font settings" 以下の例では、 タ ブ ページ tabpage_doit にあ る コ マ ン ド ボ タ ン cb_OK を使用可能に し ます。 w_display.tab_1.tabpage_doit.cb_OK.Enabled = TRUE 汎用的な プ ログ ラ ミ ン グ ス ク リ プ ト を汎用的に作成す る には、 Parent 代名詞 と GetParent 関数を 使用 し ます。 ど んな タ ブ ページの ス ク リ プ ト において も タ ブ コ ン ト ロ ールを参照す る ために、 Parent 代名詞を使用で き ます。 Parent 代名詞 Parent.SelectTab(This) タ ブ ページの イ ベン ト に対す る ス ク リ プ ト では、 タ ブ ページの親で あ る タ ブ コ ン ト ロ ールを参照す る ために GetParent 関数 を呼び出す こ と がで き ま す。 こ の関数を使用 し て、 Tab デー タ 型の変 数に親への参照を代入で き ます。 GetParent 関数 タ ブ ページ と し て使用 さ れてい る 、ユーザ オブジ ェ ク ト の イ ベン ト に 対す る ス ク リ プ ト で、 イ ン ス タ ン ス変数に タ ブ ページの親であ る タ ブ コ ン ト ロ ールへの参照を代入す る ために、 以下の ス ク リ プ ト が使用で き ます。 以下は、 イ ン ス タ ン ス 変数の宣言です。 こ の イ ン ス タ ン ス 変数は、 ど んな タ ブ コ ン ト ロ ールへの参照 も 代入で き ます。 tab itab_settings 以下は、 イ ン ス タ ン ス変数に タ ブ ページの親への参照を代入 し ます。 // タ ブ コ ン ト ロールへの参照を取得 し ます。 // This 代名詞は、 タ ブ ページのユーザ オブ ジ ェ ク ト を参照 し ます。 itab_settings = This.GetParent() タ ブ ページにあ る コ ン ト ロ ールの イ ベン ト に対す る ス ク リ プ ト では、 タ ブ ページのユーザ オブジ ェ ク ト と その親の タ ブ コ ン ト ロ ールを参 照す る ために、 GetParent 関数を 2 回呼び出 し ます。 tab tab_mytab userobject tabpage_generic 112 PowerBuilder 第 7 章 ウ ィ ン ド ウにおける タ ブ コ ン ト ロールの使い方 tabpage_generic = This.GetParent() tab_mytab = tabpage_generic.GetParent() tabpage_generic.PowerTipText = & "Important property page" tab_mytab.PowerTips = TRUE tab_mytab.SelectTab(tabpage_generic) Tab デー タ 型の変数の制限事項 PowerBuilder の シ ス テ ム オ ブ ジ ェ ク ト デー タ 型であ る Tab 型の変数は、 タ ブ コ ン ト ロ ールにあ る タ ブ ページ を認識で き ません。 ま た、 UserObject 型の変数は、 タ ブ ページにあ る コ ン ト ロ ールを認識で き ません。 以下の タ ブ ページ の イ ベ ン ト に対す る ス ク リ プ ト で記述 し た ロ ーカ ル変数は、 親で あ る タ ブ コ ン ト ロ ールへの参照が代入 さ れてい ま す。 Tab 型の変数 tab_settings は タ ブ コ ン ト ロ ール内のページについて認識 で き ないので、 特定なページ を参照で き ません。 ただ し 、 タ ブ コ ン ト ロ ールの関数を呼び出 し て、 タ ブ コ ン ト ロ ールのプ ロ パテ ィ を参照す る こ と はで き ます。 tab tab_settings tab_settings = This.GetParent() tab_settings.SelectTab(This) タ ブ ページ が独立 し た ユーザ オブ ジ ェ ク ト の場合は、 そのユーザ オブジ ェ ク ト をデー タ 型 と し て、 タ ブ ページの 変数を定義で き ます。 ユーザ オブジ ェ ク ト は、 挿入 し た タ ブ ページの 先祖です。 宣言 し た変数は、 ユーザ オブジ ェ ク ト にあ る コ ン ト ロ ール が参照で き ます。 ユーザ オブ ジ ェ ク ト 変数 以下の タ ブ コ ン ト ロ ールの イ ベ ン ト に対す る ス ク リ プ ト では、 引数 index は、 タ ブ ページ を参照 し て、 Control プ ロ パテ ィ 配列か ら ユーザ オブジ ェ ク ト への参照を取得す る ために使用 さ れ ます。 例では、 すべ ての タ ブ ページが同 じ ユーザ オブジ ェ ク ト uo_emprpt_page を使用 し てい る も の と し ます。 uo_emprpt_page tabpage_current tabpage_current = This.Control[index] tabpage_current.dw_emp.Retrieve & (tabpage_current.st_name.Text) ア プ リ ケーシ ョ ン テ ク ニ ッ ク 113 ス ク リ プ ト における タ ブ コ ン ト ロールの使い方 タ ブ コ ン ト ロールの Control プ ロパテ ィ 配列 Control プ ロ パテ ィ 配列には、埋め込みユーザ オブジ ェ ク ト や独立 し た ユーザ オブジ ェ ク ト な ど、 コ ン ト ロ ール内のすべての タ ブ ページへの 参照が含 ま れ ま す。 新し い タ ブ ページ をペイ ン タ で挿入し た り 、 ス ク リ プ ト で開いた り する と 、 それ ら の タ ブ ページが配列に追加 さ れ ます。 タ ブ ページにあ る コ ン ト ロールの参照 別の ウ ィ ン ド ウ の タ ブ ページにあ る コ ン ト ロ ールを参照す る 場合は、 ウ ィ ン ド ウ レ ベル ま で コ ン ト ロ ールの名前 を 修飾 し な ければな り ま せん。 次の例では、完全修飾 し て ス タ テ ィ ッ ク テ キ ス ト コ ン ト ロ ールを参照 し ます。 w_activity_manager.tab_fyi.tabpage_today. & st_currlogon_time.Text = ls_current_logon_time PowerBuilder の コ ー ド サ ン プル集の以下の例は、 ウ ィ ン ド ウ に あ る デー タ ウ ィ ン ド ウ コ ン ト ロ ールのサ イ ズ と タ ブ ページに あ る デー タ ウ ィ ン ド ウ コ ン ト ロ ールのサ イ ズが一致す る よ う に設定 し ます。 すべ ての タ ブ ページはペ イ ン タ で挿入 さ れてい る ので、Control プ ロ パテ ィ 配列は タ ブ ページの イ ンデ ッ ク ス順に、 タ ブ ページへの参照が保持 さ れ て い ま す。 す べ て の タ ブ ペ ー ジ は、 同 じ ユ ー ザ オ ブ ジ ェ ク ト u_tab_dir が挿入 さ れた も のです。 u_tab_dir luo_Tab luo_Tab = This.Control[newindex] luo_Tab.dw_dir.Height = dw_list.Height luo_Tab.dw_dir.Width = dw_list.Width タ ブ ページ と し て使用 さ れ る ユーザ オブジ ェ ク ト の ス ク リ プ ト と 関 数は、 ユーザ オブ ジ ェ ク ト に あ る コ ン ト ロ ール を 認識 し ま す。 し た が っ て、 コ ン ト ロ ールへの参照を修飾す る 必要はあ り ません。 ユーザ オブジ ェ ク ト u_tab_dir の関数であ る 以下の例は、 デー タ ウ ィ ン ド ウ コ ン ト ロ ール dw_dir にデー タ を取得 し ます。 IF NOT ib_Retrieved THEN dw_dir.SetTransObject(SQLCA) dw_dir.Retrieve(as_Parm) ib_Retrieved = TRUE END IF RETURN dw_dir.RowCount() 114 PowerBuilder 第 7 章 ウ ィ ン ド ウにおける タ ブ コ ン ト ロールの使い方 タ ブ ページ を開 く 、 閉 じ る、 非表示にする ス ク リ プ ト で タ ブ ページ を開 く こ と がで き ます。 ス ク リ プ ト で開いた タ ブ ページ を閉 じ る こ と はで き ますが、ペ イ ン タ で挿入 し た タ ブ ペー ジ を閉 じ る こ と はで き ません。 ただ し 、 ど んな タ ブ ページ も 非表示に す る こ と はで き ます。 以下の例は、 ユーザ オブジ ェ ク ト tabpage_listbox を タ ブ ページ と し て 開いて、 イ ン ス タ ン ス 変数 i_tabpage にユーザ オブジ ェ ク ト への参照 を代入 し ます。 OpenTab 関数の引数 0 は、 その タ ブ ページが タ ブ コ ン ト ロ ールで最後のページにな る こ と を指定 し ます。 後か ら タ ブ ページ を閉 じ る には、 ユーザ オブジ ェ ク ト への参照を保持す る 必要があ り ま す。 以下は、 タ ブ ページのユーザ オブジ ェ ク ト への参照のための イ ン ス タ ン ス変数宣言です。 userobject i_tabpage 以下の ス テー ト メ ン ト は、ユーザ オブジ ェ ク ト を タ ブ ページ と し て開 き ます。 li_rtn = tab_1.OpenTab & (i_tabpage, "tabpage_listbox", 0) 以下の ス テー ト メ ン ト は、 タ ブ ページ を閉 じ ます。 tab_1.CloseTab(i_tabpage) タ ブ ページの履歴 タ ブ ページに あ る コ ン ト ロ ール を参照す る には、 タ ブ ページの イ ン デ ッ ク ス やユーザ オブ ジ ェ ク ト への参照が必要です。 タ ブ ページの Control プ ロ パテ ィ 配列を使用す る と 、すべての タ ブ ページへの参照を 取得で き ます。 タ ブ ページの Control プ ロパテ ィ 配列 タ ブ コ ン ト ロ ールの Control プ ロ パテ ィ 配列は、 ペ イ ン タ で定義 し た タ ブ ページ と ス ク リ プ ト で追加 し た タ ブ ページへの参照を保持す る 配列です。 イ ベ ン ト に渡 さ れ る イ ン デ ッ ク ス の値は、 Control プ ロ パ テ ィ 配列の配列要素 と 一致 し ます。 SelectedTab プ ロ パテ ィ を使用 し て、選択 し た タ ブ ページのユーザ オブ ジ ェ ク ト への参照を取得で き ます。 userobject luo_tabpage luo_tabpage = tab_1.Control[tab_1.SelectedTab] ア プ リ ケーシ ョ ン テ ク ニ ッ ク 115 ス ク リ プ ト における タ ブ コ ン ト ロールの使い方 タ ブ コ ン ト ロ ールの イ ベン ト では、 SelectionChanged イ ベン ト の よ う に、 イ ベン ト に渡 さ れた タ ブ ページの イ ンデ ッ ク ス の値を使用 し て、 Control プ ロ パテ ィ 配列か ら タ ブ ページへの参照を取得で き ます。 userobject tabpage_generic tabpage_generic = This.Control[newindex] 新 し い タ ブ ページの 追加 OpenTab 関数を呼び出す と 、 Control プ ロ パテ ィ 配列の要素が 1 つ増え ます。新 し い要素は、新 し く 開いた タ ブ ページへの参照を保持 し ます。 次の ス テー ト メ ン ト では、 タ ブ コ ン ト ロ ールの 2 番目の位置に新 し い タ ブ を追加 し ます。 tab_1.OpenTab(uo_newtab, 2) tab_1 の Control 配列内の 2 番目の要素が uo_newtab への参照を保持す る ので、 それ以降の タ ブ ページの Control 配列の イ ンデ ッ ク ス が 1 つ ずつ加算 さ れ ます。 タ ブ ページ を閉 じ る CloseTab 関数を呼び出す と 、 配列のサ イ ズが 1 つ減少 し 、 ユーザ オブ ジ ェ ク ト ま たはページへの参照が破棄 さ れ ます。 配列の最後の要素以 外の タ ブ を閉 じ た場合は、 それ以降の タ ブ ページの イ ンデ ッ ク ス が 1 つずつ減少 し ます。 タ ブ ページの移動 MoveTab 関数は、 タ ブ コ ン ト ール内のページの順序を変更 し 、 その順 序に合わせて Control 配列の要素の順序 も 変更 し ます。 ユーザ オブ ジ ェ ク ト の Control プ ロパテ ィ 配列 ユーザ オブジ ェ ク ト の Control プ ロ パテ ィ 配列の場合 も 同様に行い ま す。 必要な と き だけ タ ブ ページ を生成 エ ン ド ユーザは、 タ ブ コ ン ト ロ ール内のすべての タ ブ ページ を参照 す る と は限 り ません。 タ ブ コ ン ト ロ ールの [全般] プ ロ パテ ィ ページ で [現行 タ ブ 上の コ ン ト ロ ール のみ生成] を チ ェ ッ ク し て お く か、 CreateOnDemand プ ロ パテ ィ を TRUE に設定 し ておけば、 すべての タ ブ ページの コ ン ト ロ ールのグ ラ フ ィ ッ ク 表現を作成す る オーバーヘ ッ ド を回避で き ます。 116 PowerBuilder 第 7 章 ウ ィ ン ド ウにおける タ ブ コ ン ト ロールの使い方 タ ブ コ ン ト ロ ールを作成す る と 、 タ ブ コ ン ト ロ ール内のすべての タ ブ ページの コ ン ト ロ ールの イ ン ス タ ン ス がいつ も 作成 さ れます。ただ し 、 [現行 タ ブ上の コ ン ト ロ ールのみ作成] がチ ェ ッ ク し て あれば、 タ ブ ページの コ ン ト ロ ールの Constructor イ ベン ト は発生せず、 ユーザがそ の タ ブ ページ を参照 し ない限 り 、 コ ン ト ロ ールのグ ラ フ ィ ッ ク 表現は 作成 さ れ ません。 選択 し た タ ブ ページの Constructor イ ベン ト タ ブ コ ン ト ロ ール を作成す る と 、 選択 し た タ ブ ページに あ る コ ン ト ロ ールの Constructor イ ベン ト が常に発生 し ます。 [現行 タ ブ上の コ ン ト ロールのみ生成] オプ シ ョ ンの ト レー ド オ フ コ ン ト ロ ールが多 く あ る タ ブ ページ の グ ラ フ ィ ッ ク 表現の作成 を 遅 ら せ る と 、 ウ ィ ン ド ウ が よ り すばや く 開 き ます。 し か し 、 タ ブ ページ の Constructor イ ベン ト が起動 さ れて コ ン ト ロ ールのグ ラ フ ィ ッ ク 表現 が作成 さ れ る ま では、 ス ク リ プ ト で タ ブ ページの コ ン ト ロ ールを参照 す る こ と は で き ま せ ん。 [現行 タ ブ上 の コ ン ト ロ ール のみ生成] が チ ェ ッ ク さ れて い る 場合は、 表示 さ れて い な い タ ブ ページ の コ ン ト ロ ールを ス ク リ プ ト で参照す る こ と はで き ません。 タ ブ ページの生成 チェ ック PageCreated 関数を使用 し て、タ ブ ページが作成 さ れたか ど う か を確認 で き ま す。 作成 さ れていない場合は、 CreatePage 関数を使用 し て その タ ブ ページの Constructor イ ベン ト を発生 さ せ る こ と がで き ます。 IF tab_1.tabpage_3.PageCreated() = FALSE THEN tab_1.tabpage_3.CreatePage() END IF タ ブ ページ に あ る コ ン ト ロ ールのハ ン ド ルがゼ ロ で な いか を チ ェ ッ ク し て、 タ ブ ページの イ ン ス タ ン ス が生成 さ れたか を確認で き ま す。 ハン ド ルがゼ ロ でない場合は、 コ ン ト ロ ールの イ ン ス タ ン ス は生成 さ れてい ます。 IF Handle(tab_1.tabpage_3.dw_list) > 0 THEN ... 実行時での CreateOnDemand プ ロパテ ィ の変更 ス ク リ プ ト で CreateOnDemand プ ロ パテ ィ を FALSE に設定す る と 、 グ ラ フ ィ ッ ク 表現が作成 さ れて い な か っ た タ ブ ページ の グ ラ フ ィ ッ ク 表現がす ぐ に作成 さ れます。 すべての タ ブ ページのグ ラ フ ィ ッ ク 表現が作成 さ れてい る 場合は、 実 行時に CreateOnDemand プ ロ パテ ィ を TRUE に変更 し て も 、何 も 変わ り ません。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 117 ス ク リ プ ト における タ ブ コ ン ト ロールの使い方 タ ブ ページの動的な 作成 CreateOnDemand が FALSE であ る 場合には、 メ ッ セージ オブジ ェ ク ト に渡 さ れた OpenTabWithParm への引数を使用 し て、 Constructor イ ベン ト におい て 動的に作成 さ れ た タ ブ ペー ジ の ラ ベル を 設定で き ま す。 CreateOnDemand が TRUE で あ る 場 合 に は、 タ ブ が 選 択 さ れ る ま で Constructor イ ベン ト は発生 し ないため、 タ ブ ページが イ ン ス タ ン ス化 さ れ る と き に ラ ベルを設定す る 必要があ り ます。ウ ィ ン ド ウ の Open イ ベ ン ト か ら ポ ス ト さ れた ユーザ イ ベ ン ト に以下の ス ク リ プ ト が含 ま れ る 場合には、 5 つの タ ブ ページが開かれ、 イ ン ス タ ン ス化 さ れ る と き に タ ブご と の ラ ベルが設定 さ れます。 int li_ctr string is_title THIS.setredraw(false) FOR li_ctr = 1 to 5 is_title = "Tab#" + string(li_ctr) tab_test.opentabwithparm(iuo_tabpage[li_ctr], & is_title, 0) iuo_tabpage[li_ctr].text = is_title // タ ブ ラ ベルを設定 NEXT THIS.setredraw(true) RETURN 1 タ ブ コ ン ト ロールの各部分におけ る イ ベ ン ト タ ブ コ ン ト ロ ールの各部分 ( タ ブ、 タ ブ ページ、 タ ブ ページにあ る コ ン ト ロ ール) は、 重な る エ リ アが多いため、 イ ベン ト に対す る ス ク リ プ ト を ど こ に記述す る か を知っ てお く 必要があ り ます。 表 7-4: タ ブ コ ン ト ロール イ ベン ト に対する ス ク リ プ ト の記述 イ ベン ト の起動対象 と な る箇所 タ ブに対する ク リ ッ ク やド ラ ッ グ を 含む、 タ ブ コ ン ト ロ ールのタ ブ エリ ア タ ブ ページ ( タ ブではない) タ ブ ページ内の コ ン ト ロ ール 118 イ ベン ト に対する ス ク リ プ ト の所属 タ ブ コ ン ト ロ ール タ ブ ページ (埋め込み タ ブ ページの 場合) ま たはユーザ オブジ ェ ク ト (独 立 し た タ ブ ページの場合) タ ブ ページ上の コ ン ト ロ ール自身 PowerBuilder 第 7 章 ウ ィ ン ド ウにおける タ ブ コ ン ト ロールの使い方 た と えば、 エ ン ド ユーザが タ ブへ ド ラ ッ グ し て、 タ ブに関連付け ら れ てい る タ ブ ページに何か を行いたい場合、タ ブ ページではな く タ ブ コ ン ト ロ ールの DragDrop イ ベン ト に ス ク リ プ ト を記述す る 必要が あ り ます。 例 タ ブ コ ン ト ロ ール tab_1 の DragDrop イ ベン ト の以下の ス ク リ プ ト は、 エ ン ド ユーザが タ ブの上に何か を ド ロ ッ プ し た と き に、 ド ロ ッ プ先の タ ブ ペー ジ を 選択 し ま す。 ド ロ ッ プ さ れ た タ ブ の イ ン デ ッ ク ス が、 DragDrop イ ベン ト の引数 と な り ます。 This.SelectTab( index ) 次の ス ク リ プ ト は、 タ ブ コ ン ト ロ ールの DragDrop イ ベン ト の も ので す。 エ ン ド ユーザがデー タ ウ ィ ン ド ウ のデー タ を タ ブに ド ラ ッ グす る と 、 その タ ブに関連付け ら れてい る タ ブ ページの リ ス ト に、 そのデー タ が挿入 さ れ ます。 ListBox コ ン ト ロ ール lb_list があ る tabpage_listbox 型のユーザ オブジェ ク ト は、 ユーザ オブジェ ク ト ペイ ン タ で定義さ れていま す。 タ ブ コ ン ト ロ ールには、tabpage_listbox 型の独立 し た タ ブ ページが複数あ り ます。 Control プ ロ パ テ ィ 配列 か ら タ ブ ペー ジ へ の 参照 を 取得す る に は、 DragDrop イ ベン ト の引数 index を使用 し ます。 ユーザ オブジ ェ ク ト へ の参照に よ り 、 ス ク リ プ ト で タ ブ ページの コ ン ト ロ ールにア ク セ ス で き ます。 タ ブ コ ン ト ロ ールの以下の ス ク リ プ ト の Parent 代名詞は、 ウ ィ ン ド ウ を参照 し てい ます。 long ll_row string ls_name tabpage_listbox luo_tabpage IF TypeOf(source) = DataWindow!THEN l_row = Parent.dw_2.GetRow() ls_name = Parent.dw_2.Object.lname.Primary[ll_row] // Control プ ロパテ ィ 配列から参照を取得 し ます。 luo_tabpage = This.Control[index] // タ ブ ページ を選択 し ます。 This.SelectTab(index) // ド ラ ッ グ さ れたデー タ を挿入 し ます。 luo_tabpage.lb_list.InsertItem(ls_name, 0) END IF ア プ リ ケーシ ョ ン テ ク ニ ッ ク 119 ス ク リ プ ト における タ ブ コ ン ト ロールの使い方 タ ブ ページが作成 さ れていない場合 タ ブ コ ン ト ロ ールの CreateOnDemand プ ロ パテ ィ が TRUE にな っ てい る 場合、 タ ブ ページが選択 さ れ る ま では、 タ ブ ページやその コ ン ト ロ ールの Constructor イ ベ ン ト は発生 し ま せん。 上記の例では、 タ ブ ページ を選択 し た こ と に よ っ て、 Constructor イ ベン ト が発生 し てい ま す。 CreatePage 関数を使用 し て、 Constructor イ ベン ト を発生 さ せ る こ と も で き ます。 IF luo_tabpage.PageCreated() = FALSE THEN & luo_tabpage.CreatePage() 120 PowerBuilder 第 8 章 ウィ ン ド ウで のリ ス ト の使い方 こ の章について こ の章では、 アプ リ ケーシ ョ ン において情報を提示す る リ ス ト の 使い方について説明 し ます。 内容 項目 リ ス ト の提示について リ ス ト の使い方 ド ロ ッ プダ ウ ン リ ス ト の使い方 リ ス ト ビ ュ ー コ ン ト ロ ールの使い方 ページ 121 122 127 130 リ ス ト の提示について アプ リ ケーシ ョ ン で リ ス ト を提示す る 複数の方法があ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク • リ ス ト ボ ッ ク ス と ピ ク チ ャ リ ス ト ボ ッ ク ス は、 テ キ ス ト の表 示 と ア ク シ ョ ン の起動がで き ま す。 選択肢を表示 し て、 エ ン ド ユーザに選択 さ せます。 • ド ロ ッ プダ ウ ン リ ス ト ボ ッ ク ス と ド ロ ッ プダ ウ ン ピ ク チ ャ リ ス ト ボ ッ ク ス も 、 選択肢を表示 し ま す。 ま た、 エ ン ド ユー ザに表示 し てい る テ キ ス ト を編集 さ せ る こ と も で き ま す。 ド ロ ッ プ ダ ウ ン リ ス ト ボ ッ ク ス はテ キ ス ト だけの リ ス ト です。 ド ロ ッ プダ ウ ン ピ ク チ ャ リ ス ト ボ ッ ク ス はテ キ ス ト と ピ ク チ ャ を一緒に表示 し ます。 • リ ス ト ビ ュ ー コ ン ト ロ ールは、 ピ ク チ ャ と テ キ ス ト の両方を 一 緒 に リ ス ト に し て 提 示 し ま す。 エ ン ド ユ ー ザ に リ ス ト ビ ュ ーの項目 を追加、 削除、 編集、 お よ び再配置 さ せ る こ と がで き ま す。 ま た、 リ ス ト ビ ュ ーの項目を使用 し て ア ク シ ョ ン を起動 さ せ る こ と も で き ます。 121 リ ス ト の使い方 ツ リ ービ ュ ー コ ン ト ロール ツ リ ービ ュ ー コ ン ト ロ ール も 、 ピ ク チ ャ と テ キ ス ト を一緒に リ ス ト に 提示 し ます。 リ ス ト ビ ュ ー コ ン ト ロ ール と の違いは、 ツ リ ービ ュ ー コ ン ト ロ ールは、 ツ リ ービ ュ ー項目間の階層的な関係を表示す る こ と で す。 リ ス ト ビ ュ ー コ ン ト ロ ール と 同 じ よ う に、 エ ン ド ユーザに ツ リ ー ビ ュ ー項目を追加、 削除、 編集、 お よ び再配置 さ せ る こ と がで き ます。 ま た、 ア ク シ ョ ン を起動 さ せ る こ と も で き ます。 ツ リ ービ ュ ーの詳細については、 第 9 章 「ツ リ ービ ュ ー コ ン ト ロ ール の使い方」 を参照 し て く だ さ い。 リ ス ト の使い方 リ ス ト を使用 し て、 エ ン ド ユーザに、 ス ク ロ ールで き る 簡単な リ ス ト で情報を提示で き ます。 ピ ク チ ャ リ ス ト ボ ッ ク ス は、 テ キ ス ト と ピ ク チ ャ の情報を提示で き ます。 ま た、 リ ス ト ボ ッ ク ス は、 テ キ ス ト の情 報だけ を提示で き ます。 アプ リ ケーシ ョ ン の設計に も よ り ますが、 エ ン ド ユーザは、 1 つま た はそれ以上の リ ス ト 項目を選択 し て、 その選択に基づいた ア ク シ ョ ン を実行で き ます。 ウ ィ ン ド ウ に リ ス ト ボ ッ ク ス コ ン ト ロ ール ま た は ピ ク チ ャ リ ス ト ボ ッ ク ス コ ン ト ロ ールを追加す る には、 ほかの コ ン ト ロ ールを追加す る の と 同様の方法で行い ます。つま り 、[挿入| コ ン ト ロ ール] メ ニ ュ ー か ら [ リ ス ト ボ ッ ク ス] ま たは [ピ ク チ ャ リ ス ト ボ ッ ク ス] を選択 し て、 ウ ィ ン ド ウ 上の配置 し たい位置で ク リ ッ ク し ます。 新規項目を追加す る には、 コ ン ト ロ ールの [項目] プ ロ パテ ィ ページ を使用 し ます。 リ ス ト コ ン ト ロール への項目の追加 ペ イ ン タ で追加 ❖ リ ス ト ボ ッ ク ス またはピ ク チ ャ リ ス ト ボ ッ ク スに項目を追加するには 1 コ ン ト ロ ールのプ ロ パテ ィ ビ ュ ーで [項目] タ ブ を選択 し ます。 2 リ ス ト ボ ッ ク ス の項目名を入力 し ます。 さ ら に、 ピ ク チ ャ リ ス ト ボ ッ ク ス の場合は、 項目に ピ ク チ ャ を関連付け る ため、 ピ ク チ ャ イ ンデ ッ ク ス を [ピ ク チ ャ イ ンデ ッ ク ス] ボ ッ ク ス に入力 し ます。 ピ ク チ ャ リ ス ト ボ ッ ク ス に ピ ク チ ャ を追加す る 方法については、 123 ページ の 「ピ ク チ ャ リ ス ト ボ ッ ク ス コ ン ト ロ ールへの ピ ク チ ャ の追加」 を参照 し て く だ さ い。 122 PowerBuilder 第 8 章 ウ ィ ン ド ウでの リ ス ト の使い方 ス ク リ プ ト で追加 実行時に、 リ ス ト ボ ッ ク ス ま た は ピ ク チ ャ リ ス ト ボ ッ ク ス に項目を動的に追加す る には、 AddItem 関数 と InsertItem 関数 を使用 し ます。 AddItem 関数は、 リ ス ト の最後に項目を追加 し ます。 し か し 、 リ ス ト が ソ ー ト さ れ る と 、 その項目は ソ ー ト 順の該当す る 位置 に移動 さ れ ます。 リ ス ト 中で項目が挿入 さ れ る 位置を指定 し たい場合 は、 InsertItem 関数を使用 し ます。 表 8-1: InsertItem 関数 と AddItem 関数の使用 関数 InsertItem 指定する内容 項目名 項目の挿入位置 AddItem (ピ ク チ ャ リ ス ト ボ ッ ク ス の場合) ピ ク チ ャ イ ンデ ッ ク ス 項目名 (ピ ク チ ャ リ ス ト ボ ッ ク ス の場合) ピ ク チ ャ イ ンデ ッ ク ス た と えば、 以下の ス ク リ プ ト では、 リ ス ト ボ ッ ク ス に項目を追加 し ま す。 This.AddItem (" 小物 ") This.InsertItem (" ソ フ ト ウ ェ ア ",2) This.InsertItem (" ハー ド ウ ェ ア ",2) This.InsertItem (" ド キ ュ メ ン ト ",2) 以下の ス ク リ プ ト では、 ピ ク チ ャ リ ス ト ボ ッ ク ス に項目 と ピ ク チ ャ を 追加 し ます。 This.AddItem (" This.AddItem (" This.AddItem (" This.InsertItem モニ タ ",2) モデム ", 3) プ リ ン タ ",4) (" スキ ャ ナ ",5,1) Sort プ ロパテ ィ の使い方 リ ス ト 項目が常にアルフ ァ ベ ッ ト の昇順に並ぶ よ う にす る には、 コ ン ト ロ ールの Sort プ ロ パテ ィ に TRUE を設定す る か、 [全般] プ ロ パテ ィ ページで [ ソ ー ト ] チ ェ ッ ク ボ ッ ク ス をチ ェ ッ ク し ます。 ピ ク チ ャ を追加す る には、 コ ン ト ロ ールの [ピ ク チ ャ ] プ ロ パテ ィ ページ と [項目] プ ロ パテ ィ ページ を使用 し ます。 ピクチャ リス ト ボッ ク ス コ ン ト ロールへ のピ ク チ ャ の追加 ペ イ ン タ で追加 ❖ ピ ク チ ャ リ ス ト ボ ッ ク スにピ ク チ ャ を追加するには 1 ア プ リ ケーシ ョ ン テ ク ニ ッ ク コ ン ト ロ ールのプ ロ パテ ィ ビ ュ ーで [ピ ク チ ャ ] タ ブ を選択 し ま す。 123 リ ス ト の使い方 2 ド ロ ッ プダ ウ ン リ ス ト ボ ッ ク ス か ら ピ ク チ ャ を 選択す る か、 [参 照] (...) ボ タ ン を ク リ ッ ク し て、 ビ ッ ト マ ッ プ、 ポ イ ン タ 、 ま た はア イ コ ン ピ ク チ ャ を選択 し ます。 3 [ピ ク チ ャ マ ス ク の色] ド ロ ッ プダ ウ ン リ ス ト ボ ッ ク ス か ら ピ ク チ ャ の色を選択 し ます。 ピ ク チ ャ マ ス ク に選択 し た色は、 ピ ク チ ャ リ ス ト ボ ッ ク ス では透 明に見え ます。 4 ピ ク チ ャ の高 さ と 幅を選択 し ます。 こ れで、 ピ ク チ ャ リ ス ト ボ ッ ク ス の ピ ク チ ャ のサ イ ズ を調整 し ま す。 動的にピ ク チ ャ サイ ズを変更する ス ク リ プ ト で、 実行時に ピ ク チ ャ のサ イ ズ を変更で き ま す。 ピ ク チ ャ リ ス ト ボ ッ ク ス に ピ ク チ ャ が 1 つ も 追加 さ れていない場合だ け、 PictureHeight プ ロ パテ ィ と PictureWidth プ ロ パテ ィ を設定で き ます。 PictureHeight プ ロ パ テ ィ と PictureWidth プ ロ パ テ ィ の詳細につい ては、『PowerScript リ フ ァ レ ン ス 』 マニ ュ アルを参照 し て く だ さ い。 5 ピ ク チ ャ リ ス ト ボ ッ ク ス で使用す る 各ピ ク チ ャ に対 し て処理を繰 り 返 し ます。 6 [項目] タ ブ を選択 し 、 各項目の ピ ク チ ャ 番号を適切な数字に変更 し ます。 ス ク リ プ ト で追加 実行時に、 ピ ク チ ャ リ ス ト ボ ッ ク ス に ピ ク チ ャ を動 的に追加す る には、 AddPicture 関数を使用 し ます。 以下の例では、 ピ ク チ ャ のサ イ ズ を設定 し 、ピ ク チ ャ リ ス ト ボ ッ ク ス に ビ ッ ト マ ッ プ フ ァ イ ルを追加 し て、 ピ ク チ ャ リ ス ト ボ ッ ク ス に項目を追加 し ます。 This.PictureHeight = 75 This.PictureWidth = 75 This.AddPicture ("c:¥ArtGal¥bmps¥butterfly.bmp") This.AddItem("Aine Minogue",8) ピクチャ リス ト コン ト ロールからのピ ク チ ャの削除 ピ ク チ ャ リ ス ト ボ ッ ク ス ま たは ド ロ ッ プダ ウ ン ピ ク チ ャ リ ス ト ボ ッ ク ス の い ずれ か か ら ピ ク チ ャ を 削除す る に は、 DeletePicture 関数 と DeletePictures 関数を使用 し ます。 DeletePicture 関数を使用す る 場合、 削除 し たい ピ ク チ ャ の ピ ク チ ャ イ ンデ ッ ク ス を指定す る 必要があ り ます。 124 PowerBuilder 第 8 章 ウ ィ ン ド ウでの リ ス ト の使い方 例 This.DeletePicture (1) コ ン ト ロ ールか ら 最初の ピ ク チ ャ を削除 し ます。 次に、 This.DeletePictures () コ ン ト ロ ールか ら すべての ピ ク チ ャ を削除 し ます。 以下の ウ ィ ン ド ウ には、 リ ス ト ボ ッ ク ス と ピ ク チ ャ リ ス ト ボ ッ ク ス が あ り ま す。 リ ス ト ボ ッ ク ス の項目は 4 つあ り 、 ピ ク チ ャ リ ス ト ボ ッ ク ス の項目は 1 つあ り ます。 例 エ ン ド ユーザが リ ス ト ボ ッ ク ス の項目を ダブル ク リ ッ ク す る と 、 ス ク リ プ ト は以下を実行 し ます。 • ピ ク チ ャ リ ス ト ボ ッ ク ス か ら すべての項目を削除す る • ダ ブル ク リ ッ ク さ れた リ ス ト ボ ッ ク ス の項目に関連す る 項目 を、 ピ ク チ ャ リ ス ト ボ ッ ク ス に新 し く 追加す る 以下は、 リ ス ト ボ ッ ク ス の DoubleClicked イ ベン ト に対す る ス ク リ プ ト です。 int li_count // ピ ク チ ャ リ ス ト ボ ッ ク スの // 項目数を取得 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 125 リ ス ト の使い方 li_count = plb_1.totalItems() // // // // // どの項目がダブルク リ ッ ク さ れたかを判別 し ます。 次に * ピ ク チ ャ リ ス ト ボ ッ ク スから すべての項目を削除 し ます。 * ダブルク リ ッ ク さ れた項目に 関連する項目を追加 し ます。 CHOOSE CASE index CASE 1 DO WHILE plb_1.totalitems() > 0 plb_1.DeleteItem(plb_1.totalitems()) LOOP plb_1.AddItem(" モニ タ ",2) plb_1.AddItem(" モデム ",3) plb_1.AddItem(" プ リ ン タ ",4) plb_1.InsertItem(" スキ ャ ナ ",5,1) CASE 2 DO WHILE plb_1.totalitems() > 0 plb_1.DeleteItem(plb_1.totalitems()) LOOP plb_1.InsertItem(" グ リ ーンバー ",6,1) plb_1.InsertItem(" レ タ ーヘ ッ ド ",7,1) plb_1.InsertItem(" コ ピー ",8,1) plb_1.InsertItem("50 lb.",9,1) CASE 3 DO WHILE plb_1.totalitems() > 0 plb_1.DeleteItem(plb_1.totalitems()) LOOP plb_1.InsertItem("SpreadIt!",10,1) plb_1.InsertItem("WriteOn!",11,1) plb_1.InsertItem("WebMaker!",12,1) plb_1.InsertItem("Chessaholic",13,1) CASE 4 DO WHILE plb_1.totalitems() > 0 plb_1.DeleteItem(plb_1.totalitems()) LOOP plb_1.InsertItem("AlnaWarehouse",14,1) plb_1.InsertItem("AlnaInfo",15,1) plb_1.InsertItem("Info9000",16,1) plb_1.InsertItem("AlnaThink",17,1) END CHOOSE 126 PowerBuilder 第 8 章 ウ ィ ン ド ウでの リ ス ト の使い方 ド ロ ッ プ ダウン リ ス ト の使い方 ド ロ ッ プダ ウ ン リ ス ト は、エ ン ド ユーザに簡単な リ ス ト で情報を提示 で き る も う 1 つの方法です。 ド ロ ッ プダ ウ ン リ ス ト ボ ッ ク ス ではテ キ ス ト だけ を提示 し た り 、 ド ロ ッ プダ ウ ン ピ ク チ ャ リ ス ト ボ ッ ク ス では テ キ ス ト と ピ ク チ ャ を 提示 し た り で き ま す。 ド ロ ッ プ ダ ウ ン リ ス ト ボ ッ ク ス お よ び ド ロ ッ プダ ウ ン ピ ク チ ャ リ ス ト ボ ッ ク ス コ ン ト ロ ー ルを ウ ィ ン ド ウ に追加す る 方法は、 ほかの コ ン ト ロ ールを追加す る 方 法 と 同 じ です。 つま り 、 [挿入| コ ン ト ロ ール] メ ニ ュ ーか ら [ ド ロ ッ プダ ウ ン リ ス ト ボ ッ ク ス] ま たは [ ド ロ ッ プダ ウ ン ピ ク チ ャ リ ス ト ボ ッ ク ス] を選択 し て、 ウ ィ ン ド ウ 上の配置 し たい位置で ク リ ッ ク し ます。 項目を追加す る には、 コ ン ト ロ ールの [項目] プ ロ パ テ ィ ページ を使用 し ます。 ド ロ ッ プ ダウン リ ス ト コ ン ト ロールへの 項目の追加 ペ イ ン タ で追加 ❖ ド ロ ッ プダウン リ ス ト ボ ッ ク ス または ド ロ ッ プダウン ピ ク チ ャ リ ス ト ボ ッ ク スに項目を追加するには 1 コ ン ト ロ ールのプ ロ パテ ィ ビ ュ ーで [項目] タ ブ を選択 し ます。 2 リ ス ト ボ ッ ク ス の項目名を入力 し ます。 さ ら に、 ピ ク チ ャ リ ス ト ボ ッ ク ス の場合は、 項目に ピ ク チ ャ を関連付け る ため、 ピ ク チ ャ イ ンデ ッ ク ス を [ピ ク チ ャ イ ンデ ッ ク ス] ボ ッ ク ス に入力 し ます。 ド ロ ッ プ ダ ウ ン ピ ク チ ャ リ ス ト ボ ッ ク ス への ピ ク チ ャ の追加方 法については、128 ページの「 ド ロ ッ プダ ウ ン ピ ク チ ャ リ ス ト ボ ッ ク ス コ ン ト ロ ールへの ピ ク チ ャ の追加」 を参照 し て く だ さ い。 ス ク リ プ ト で追加 実行時に、 ド ロ ッ プダ ウ ン リ ス ト ボ ッ ク スや ド ロ ッ プ ダ ウ ン ピ ク チ ャ リ ス ト ボ ッ ク ス に 動的 に項目 を 追加す る に は、 AddItem 関数や InsertItem 関数を使用 し ます。 AddItem 関数は、 リ ス ト の最後に項目を追加 し ます。 し か し 、 リ ス ト が ソ ー ト さ れ る と 、その項目は ソ ー ト 順の該当す る 位置に移動 さ れ ます。 リ ス ト 中で項目が挿入 さ れ る 位置を指定 し たい場合は、 InsertItem 関数 を使用 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 127 ド ロ ッ プダウン リ ス ト の使い方 表 8-2: InsertItem 関数 と AddItem 関数の使用 関数 InsertItem AddItem 指定する内容 項目名 ( ド ロ ッ プダ ウ ン ピ ク チ ャ リ ス ト ボ ッ ク ス の場合)ピ ク チ ャ イ ンデ ッ ク ス 項目の挿入位置 項目名 ( ド ロ ッ プダ ウ ン ピ ク チ ャ リ ス ト ボ ッ ク ス の場合)ピ ク チ ャ イ ンデ ッ ク ス 以下の例では、 ド ロ ッ プダ ウ ン ピ ク チ ャ リ ス ト ボ ッ ク ス の 1 番目、 2 番目、 3 番目のそれぞれの位置に、 項目を挿入 し ます。 This.InsertItem ("Atropos", 2, 1) This.InsertItem ("Clotho", 2, 2) This.InsertItem ("Lachesis", 2, 3) 以下の例では、 ド ロ ッ プダ ウ ン ピ ク チ ャ リ ス ト ボ ッ ク ス に 2 つの項目 を追加 し ます。 this.AddItem ("Plasma", 2) this.AddItem ("Platelet", 2) Sort プ ロパテ ィ の使い方 リ ス ト の項目を常に昇順に ソ ー ト す る には、 コ ン ト ロ ールの Sort プ ロ パテ ィ に TRUE を設定 し ます。 ペ イ ン タ で追加 ピ ク チ ャ を追加す る には、 リ ス ト ビ ュ ー コ ン ト ロ ール の [ピ ク チ ャ ] と [項目] プ ロ パテ ィ ページ を使用 し ます。 ド ロ ッ プダウン ピ ク チャ リス ト ボッ クス コ ン ト ロールへのピ ク チ ャの追加 ❖ ド ロ ッ プダウン ピ ク チ ャ リ ス ト ボ ッ ク スにピ ク チ ャ を追加するには 1 コ ン ト ロ ールのプ ロ パテ ィ ビ ュ ーで [ピ ク チ ャ ] タ ブ を選択 し ま す。 2 ド ロ ッ プダ ウ ン リ ス ト ボ ッ ク ス か ら ピ ク チ ャ を選択す る か、 [参 照] (...) ボ タ ン を ク リ ッ ク し て、 ビ ッ ト マ ッ プ、 ポ イ ン タ 、 ま た はア イ コ ン ピ ク チ ャ を選択 し ます。 3 [ピ ク チ ャ マ ス ク の色] ド ロ ッ プダ ウ ン リ ス ト ボ ッ ク ス か ら ピ ク チ ャ の色を選択 し ます。 ピ ク チ ャ マ ス ク に選択 し た色は、ド ロ ッ プダ ウ ン ピ ク チ ャ リ ス ト ボ ッ ク ス では透明に見え ます。 4 128 ピ ク チ ャ の高 さ と 幅を それぞれ選択 し ます。 PowerBuilder 第 8 章 ウ ィ ン ド ウでの リ ス ト の使い方 こ れで、 ド ロ ッ プダ ウ ン ピ ク チ ャ リ ス ト ボ ッ ク ス の ピ ク チ ャ のサ イ ズ を調整 し ます。 動的にピ ク チ ャ サイ ズを変更する ピ ク チ ャ サ イ ズの変更を実行時に行 う には、 ド ロ ッ プダ ウ ン ピ ク チ ャ リ ス ト ボ ッ ク ス の 作 成 時 に、 PictureHeight プ ロ パ テ ィ と PictureWidth プ ロ パ テ ィ を 設定 し て か ら ピ ク チ ャ を 追加 し ま す。 PictureHeight プ ロ パテ ィ と PictureWidth プ ロ パテ ィ の詳細につい ては、『PowerScript リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 5 ド ロ ッ プ ダ ウ ン ピ ク チ ャ リ ス ト ボ ッ ク ス で使用す る 各 ピ ク チ ャ に対 し て処理を繰 り 返 し ます。 6 [項目] タ ブ を選択 し 、 各項目の ピ ク チ ャ 番号を適切な数字に変更 し ます。 ス ク リ プ ト で追加 実行時に、 ピ ク チ ャ リ ス ト ボ ッ ク ス に ピ ク チ ャ を動 的に追加す る には、 AddPicture 関数を使用 し ます。 た と えば、 以下の例 では、ピ ク チ ャ リ ス ト ボ ッ ク ス に 2 つの ビ ッ ト マ ッ プ フ ァ イ ルを追加 し ます。 This.AddPicture ("c:¥images¥justify.bmp") This.AddPicture ("c:¥images¥center.bmp") ド ロ ッ プ ダウン ピ ク チャ リス ト ボッ クス コ ン ト ロールから のピ ク チ ャ の削除 ド ロ ッ プ ダ ウ ン ピ ク チ ャ リ ス ト ボ ッ ク ス コ ン ト ロ ールか ら の ピ ク チ ャ の削除方法につい ては、 124 ページ の 「ピ ク チ ャ リ ス ト コ ン ト ロ ールか ら の ピ ク チ ャ の削除」 を参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 129 リ ス ト ビ ュ ー コ ン ト ロールの使い方 リ ス ト ビ ュ ー コ ン ト ロールの使い方 リ ス ト ビ ュ ー コ ン ト ロ ールでは、 い ろいろ な組み合わせでテ キ ス ト と ア イ コ ン を表示で き ます。 大 き いア イ コ ンや小 さ いア イ コ ン を フ リ ー フ ォ ーム形式で表示 し た り 、 一覧形式で リ ス ト を表示で き ます。 ま た、 各 リ ス ト 項目についての詳細情報を、 リ ス ト 項目に関連す る 追加カ ラ ム と し てい っ し ょ に表示で き ます。 リ ス ト ビ ュ ー コ ン ト ロ ールは、 リ ス ト ビ ュ ー項目で構成 さ れます。 そ れぞれの リ ス ト ビ ュ ー項目は配列に格納 さ れてい ます。 リ ス ト ビ ュ ー 項目は、 以下で構成 さ れ ます。 リ ス ト ビ ュ ー項目の名前 • ラ ベル • イ ンデ ッ ク ス • コ ン ト ロ ールにおけ る リ ス ト ビ ュ ー項目の表示位置 ピ ク チ ャ イ ンデ ッ ク ス リ ス ト ビ ュ ー項目に関連す る ピ ク チ ャ の番 号 提示 さ れ る ス タ イ ルに も よ り ま すが、 大 き い ピ ク チ ャ ま たは小 さ い ピ ク チ ャ は、 リ ス ト ビ ュ ー項目に関連付け る こ と も で き ます。 • オーバーレ イ ピ ク チ ャ イ ンデ ッ ク ス リ ス ト ビ ュ ー項目に関連付け る オーバーレ イ ピ ク チ ャ の番号 • 状態ピ ク チ ャ イ ンデ ッ ク ス リ ス ト ビ ュ ー項目に関連付け る 状態 ピ ク チ ャ の番号 リ ス ト ビ ュ ー項目、 ピ ク チ ャ イ ンデ ッ ク ス、 提示様式の詳細について は、『PowerBuilder ユーザーズ ガ イ ド 』マニ ュ アルを参照 し て く だ さ い。 130 PowerBuilder 第 8 章 ウ ィ ン ド ウでの リ ス ト の使い方 リ ス ト ビ ュー コ ン ト ロールの作成 ウ ィ ン ド ウ に リ ス ト ビ ュ ー コ ン ト ロ ールを追加す る には、 ほかの コ ン ト ロ ールを追加す る の と 同様の方法で行い ます。 つま り 、 [挿入| コ ン ト ロ ール] メ ニ ュ ーか ら [ リ ス ト ビ ュ ー] を選択 し て、 ウ ィ ン ド ウ 上 の配置 し たい位置で ク リ ッ ク し ます。 リ ス ト ビ ュ ー項目の追 加 ペ イ ン タ で追加 項目を追加す る には、 コ ン ト ロ ールの [項目] プ ロ パ テ ィ ページ を使用 し ます。 ❖ リ ス ト ビ ュ ーに項目を追加するには 1 コ ン ト ロ ールのプ ロ パテ ィ ビ ュ ーで [項目] タ ブ を選択 し ます。 2 リ ス ト ビ ュ ーに追加す る 項目の ラ ベル と ピ ク チ ャ イ ンデ ッ ク ス を 入力 し ます。 注意 最初の項目の ピ ク チ ャ イ ン デ ッ ク ス を ゼ ロ に設定す る と 、 タ ブ ページ上のすべての設定が消去 さ れます。 リ ス ト ビ ュ ー コ ン ト ロ ールに ピ ク チ ャ を追加す る 方法の詳細につ いては、 132 ページの 「 リ ス ト ビ ュ ー コ ン ト ロ ールへの ピ ク チ ャ の追加」 を参照 し て く だ さ い。 ス ク リ プ ト で追加 実行時に、 リ ス ト ビ ュ ーに項目を動的に追加す る に は、 AddItem 関数 と InsertItem 関数を使用 し ます。 リ ス ト ビ ュ ーに項目 を追加す る ために、 AddItem 関数ま たは InsertItem 関数を使用す る 場合 は、 2 つの方法があ り ます。 以下の例が示す よ う に、 ピ ク チ ャ イ ンデ ッ ク ス と ラ ベルを指定 し て、 項目を追加で き ます。 lv_1.AddItem("Item 1", 1) ま たは、 リ ス ト ビ ュ ー、 ラ ベル、 お よ びピ ク チ ャ イ ンデ ッ ク ス の項目 の表示位置を指定 し て、 項目を挿入で き ます。 lv_1.InsertItem (1,"Item 2", 2) リ ス ト ビ ュ ー項目 を 直接指定 し て追加す る こ と も で き ま す。 リ ス ト ビ ュ ーの DragDrop イ ベン ト に対す る 以下の ス ク リ プ ト の例では、 リ ス ト ビ ュ ーに ド ラ ッ グ さ れた リ ス ト ビ ュ ー項目を挿入 し ます。 listviewitem lvi This.GetItem(index, lvi) lvi.label = "Test" lvi.pictureindex = 1 This.AddItem (lvi) ま たは、 リ ス ト ビ ュ ーの表示位置 と リ ス ト ビ ュ ー項目を指定 し て、 項 目を挿入で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 131 リ ス ト ビ ュ ー コ ン ト ロールの使い方 listviewitem l_lvi //2 番目の リ ス ト ビ ュ ー項目の情報を // 取得 し ます。 lv_list.GetItem(2, l_lvi) // 項目のラ ベルを Entropy に変更 し ます。 //5 番目の表示位置に 2 番目の項目を挿入 し ます。 lv_list.InsertItem (5, l_lvi) lv_list.DeleteItem(2) PowerBuilder は 4 つの ピ ク チ ャ リ ス ト に、 リ ス ト ビ ュ ーの ピ ク チ ャ を 保持 し ます。 リ ス ト ビ ュー コ ン ト ロールへのピ ク チ ャの 追加 • 小 さ い ピ ク チ ャ イ ンデ ッ ク ス • 大 き い ピ ク チ ャ イ ンデ ッ ク ス • 状態ピ ク チ ャ イ ンデ ッ ク ス • オーバーレ イ ピ ク チ ャ イ ンデ ッ ク ス ペ イ ン タ を使用す る か、 ま たは実行時に AddItem 関数 と InsertItem 関数 を 使用 し て リ ス ト ビ ュ ー を 作成 し た場合、 上記の ピ ク チ ャ を リ ス ト ビ ュ ー項目に関連付け る こ と がで き ます。 し か し 、 リ ス ト ビ ュ ー項目に ピ ク チ ャ を関連付け る には、 リ ス ト ビ ュ ー コ ン ト ロ ールに リ ス ト ビ ュ ー項目が追加 さ れ て い な ければな り ま せ ん。 ペ イ ン タ で追加 ピ ク チ ャ を追加す る には、 リ ス ト ビ ュ ー コ ン ト ロ ール の [ピ ク チ ャ ] と [項目] プ ロ パテ ィ ページ を使用 し ます。 ❖ リ ス ト ビ ュ ー コ ン ト ロールにピ ク チ ャ を追加するには 1 コ ン ト ロ ールのプ ロ パテ ィ ビ ュ ーで、 [大 き い ピ ク チ ャ ]、 [小 さ い ピ ク チ ャ ]、 ま たは [状態] タ ブのいずれか を選択 し ます。 オーバーレ イ ピ ク チ ャ ス ク リ プ ト でのみ、 リ ス ト ビ ュ ー コ ン ト ロ ールにオーバーレ イ ピ ク チ ャ を追加で き ます。 2 ド ロ ッ プダ ウ ン リ ス ト ボ ッ ク ス か ら ピ ク チ ャ を選択す る か、 [参 照] (...) ボ タ ン を ク リ ッ ク し て、 ビ ッ ト マ ッ プ、 ポ イ ン タ 、 ま た はア イ コ ン ピ ク チ ャ を選択 し ます。 3 [ピ ク チ ャ マ ス ク の色] ド ロ ッ プダ ウ ン リ ス ト ボ ッ ク ス か ら ピ ク チ ャ の色を選択 し ます。 ピ ク チ ャ マ ス ク に選択 し た色は、 リ ス ト ビ ュ ーでは透明に見え ま す。 132 PowerBuilder 第 8 章 ウ ィ ン ド ウでの リ ス ト の使い方 ピ ク チ ャ の高 さ と 幅を それぞれ選択 し ます。 4 こ れで、 リ ス ト ビ ュ ーの ピ ク チ ャ のサ イ ズ を調整 し ます。 動的にピ ク チ ャ サイ ズを変更する ピ ク チ ャ サ イ ズの変更を実行時に行 う には、 リ ス ト ビ ューの作成時 に、 PictureHeight プ ロ パテ ィ と PictureWidth プロ パティ を 設定し て から ピ ク チャ を 追加し ま す。PictureHeight プ ロ パテ ィ と PictureWidth プ ロ パテ ィ の詳細については、 『PowerScript リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 以下に対 し て処理を繰 り 返 し ます。 5 • リ ス ト ビ ュ ーで使用す る ピ ク チ ャ の種類 (大 き い、 小 さ い、 状 態) の数 • リ ス ト ビ ュ ーで使用す る 各 ピ ク チ ャ の種類に対応 し た ピ ク チ ャ の数 リ ス ト ビ ュ ーの ピ ク チ ャ リ ス ト に ピ ク チ ャ を追加す る には、 表 8-3 に示 さ れてい る 関数を使用 し ます。 ス ク リ プ ト で追加 表 8-3: リ ス ト ビ ュ ー ピ ク チ ャ リ ス ト にピ ク チ ャ を追加する関数 関数 AddLargePicture AddSmallPicture AddStatePicture ピ ク チ ャ リ ス ト に追加する ピ ク チ ャ 大きいピ ク チャ 小さ いピ ク チャ 状態ピ ク チ ャ 以下の例では、 大 き い ピ ク チ ャ と 小 さ い ピ ク チ ャ の高 さ と 幅を設定 し て、 大 き い ピ ク チ ャ の ピ ク チ ャ リ ス ト と 小 さ い ピ ク チ ャ の ピ ク チ ャ リ ス ト に 3 つの ピ ク チ ャ を追加 し ます。 大き いピ ク チ ャ と 小 さ いピ ク チ ャ の追加 // 大き いピ ク チ ャの高 さ と 幅を設定 し ます。 lv_1.LargePictureHeight=32 lv_1.LargePictureWidth=32 // 大き いピ ク チ ャ を追加 し ます。 lv_1.AddLargePicture("c:¥ArtGal¥bmps¥celtic.bmp") lv_1.AddLargePicture("c:¥ArtGal¥bmps¥list.ico") lv_1.AddLargePicture("Custom044!") // 小 さ いピ ク チ ャの高 さ と 幅を設定 し ます。 lv_1.SmallPictureHeight=16 lv_1.SmallPictureWidth=16 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 133 リ ス ト ビ ュ ー コ ン ト ロールの使い方 // 小 さ いピ ク チ ャ を追加 し ます。 lv_1.AddSmallPicture("c:¥ArtGal¥bmps¥celtic.bmp") lv_1.AddSmallPicture("c:¥ArtGal¥bmps¥list.ico") lv_1.AddSmallPicture("Custom044!") // リ ス ト ビ ュ ーに項目を追加 し ます。 lv_1.AddItem("Item 1", 1) lv_1.AddItem("Item 2", 1) lv_1.AddItem("Item 3", 1) オーバーレ イ ピ ク チ ャの追加 項目のオーバー レ イ と し て、 大 き い ピ ク チ ャ や小 さ い ピ ク チ ャ を使用す る には、SetOverLayPicture 関数を使用 し ます。 以下の例では、 リ ス ト ビ ュ ーに大 き い ピ ク チ ャ を追加 し て、 リ ス ト ビ ュ ー項目のオーバーレ イ ピ ク チ ャ と し て、 大 き い ピ ク チ ャ を使 用 し ます。 listviewitem lvi_1 int li_index // リ ス ト ビ ュ ーに大き いピ ク チ ャ を追加 し ます。 li_index = lv_list.AddLargePicture & ("c:¥ArtGal¥bmps¥dil2.ico") // 追加 し た大き いピ ク チ ャ を // オーバーレ イ ピ ク チ ャ と し て設定 し ます。 lv_list.SetOverlayPicture (3, li_index) // リ ス ト ビ ュ ー項目 と と も にオーバーレ イ ピ ク チ ャ を使用 し ます。 lv_list.GetItem(lv_list.SelectedIndex (), lvi_1) lvi_1.OverlayPictureIndex = 3 lv_list.SetItem(lv_list.SelectedIndex (), lvi_1) 状態ピ ク チ ャの追加 以下の例では、 選択 さ れた リ ス ト ビ ュ ー項目に状 態ピ ク チ ャ を設定す る ために、項目の StatePictureIndex プ ロ パテ ィ を使 用 し ます。 listviewitem lvi_1 lv_list.GetItem(lv_list.SelectedIndex (), lvi_1) lvi_1.StatePictureIndex = 2 lv_list.SetItem(lv_list.SelectedIndex (), lvi_1) リ ス ト ビ ュ ーの項目 と ピ ク チ ャの削除 DeleteItem 関数で、リ ス ト ビ ュ ーか ら 項目を 1 つずつ削除で き ます。 DeleteItems 関数は、リ ス ト ビ ュ ーか ら すべての項目を削除 し ます。同様 に、DeleteLargePicture 関数、DeleteSmallPicture 関数、DeleteStatePicture 関数 で、特定の種類の ピ ク チ ャ を 1 つずつ削除で き ます。DeleteLargePictures 関数、DeleteSmallPictures 関数、DeleteStatePictures 関数は、特定の種類の ピ ク チ ャ をすべて削除 し ます。 134 PowerBuilder 第 8 章 ウ ィ ン ド ウでの リ ス ト の使い方 以下の例では、 リ ス ト ビ ュ ーか ら 、 1 つの項目 と すべての小 さ い ピ ク チ ャ を削除 し ます。 int li_index li_index = This.SelectedIndex() This.DeleteItem (li_index) This.DeleteSmallPictures () ホ ッ ト ト ラ ッ キング と シ ングルまたはダブ ル ク リ ッ ク によ る ア ク テ ィ ブ化 ホ ッ ト ト ラ ッ キ ン グでは、 リ ス ト ビ ュ ー コ ン ト ロ ール内の項目の上に マ ウ ス が移動す る と その項目の外観が変化 し 、 マ ウ ス が一時停止す る と 、 カー ソ ルの下にあ る 項目が自動選択 さ れ ます。 ホ ッ ト ト ラ ッ キ ン グ を有効にす る には、 TrackSelect プ ロ パテ ィ に TRUE を設定 し ます。 ま た、OneClickActivate ま たは TwoClickActivate に TRUE を設定 し て も 、 ホ ッ ト ト ラ ッ キ ン グが有効にな り ます。OneClickActivate が TRUE の場 合には、 UnderlineHot プ ロ パテ ィ ま たは UnderlineCold プ ロ パテ ィ を設 定す る こ と に よ っ て、 選択 し た項目 ま たは選択 し ない項目に下線を付 け る よ う 指定で き ます。 こ れ ら すべてのプ ロ パテ ィ は、 コ ン ト ロ ール の [全般] プ ロ パテ ィ ページ ま たは ス ク リ プ ト で設定で き ます。 表 8-4 に示 さ れてい る OneClickActivate と TwoClickActivate の設定は、 ItemActivate イ ベン ト が発生 し た と き に作用 し ます。 表 8-4: OneClickActivate と TwoClickActivate の設定 カ ス タム イベン ト の 使い方 ItemActivate が発生する タ イ ミ ング OneClickActivate TwoClickActivate TRUE TRUE ま たは FALSE 任意の項目を ク リ ッ ク FALSE TRUE FALSE FALSE 選択 し た項目を ク リ ッ ク 任意の項目を ダブル ク リ ッ ク PowerBuilder バージ ョ ン 7 以降の リ リ ース では、 リ ス ト ビ ュ ー コ ン ト ロ ール と ツ リ ービ ュ ー コ ン ト ロ ールに Microsoft の コ ン ト ロ ールが使 用 さ れてお り 、 右 ク リ ッ ク し た と き に発生す る イ ベン ト が以前のバー ジ ョ ン と は異な り ます。 以下に、 リ ス ト ビ ュ ー コ ン ト ロ ール内で右 ク リ ッ ク し た と き に発生す る イ ベン ト を示 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 135 リ ス ト ビ ュ ー コ ン ト ロールの使い方 表 8-5: 右 ク リ ッ ク で発生する リ ス ト ビ ュ ー コ ン ト ロールのイ ベン ト 場所 動作内容 リ ス ト ビ ュ ー マ ウ ス の右ボ タ ン 項目 を押す マ ウ ス の右ボ タ ン を放す リ ス ト ビ ュー 内の空白領域 マ ウ ス の右ボ タ ン を押す マ ウ ス の右ボ タ ン を放す 発生する イ ベン ト pbm_rbuttondown pbm_lvnrclicked(組み込み RightClicked! イ ベン ト ) pbm_contextmenu pbm_rbuttondown pbm_lvnrclicked(組み込み RightClicked! イ ベン ト ) pbm_contextmenu pbm_rbuttonup pbm_contextmenu 詳細表示の使い方 リ ス ト ビ ュ ーの詳細表示は、 大 き いア イ コ ン表示、 小 さ いア イ コ ン表 示、 そ し て一覧表示 よ り 多 く の情報を必要 と し ます。 リ ス ト ビ ュ ー コ ン ト ロ ールで詳細表示す る には、AddColumn 関数 と SetColumn 関数でカ ラ ム を設定す る ス ク リ プ ト を記述 し 、 SetItem 関数を使用 し て カ ラ ム の 値を設定 し ます。 カ ラ ム値の設定 リ ス ト ビ ュ ーでカ ラ ム を作成す る には、 AddColumn 関数を使用 し ます。 AddColumn 関数を使用す る と き は、 以下の指定を し ます。 • カ ラ ム ラ ベル • カ ラ ム配置 • カ ラ ムのサイ ズ カ ラ ム ヘ ッ ダで表示 さ れ る 名前 テ キ ス ト の左詰め、 右詰め、 ま たは中央揃え PowerBuilder 単位系でのカ ラ ム の幅 以下の例では、 リ ス ト ビ ュ ーに 3 つのカ ラ ム を作成 し ます。 This.AddColumn("Name", Left!, 1000) This.AddColumn("Size", Left!, 400) This.AddColumn("Date", Left!, 300) カ ラ ムの設定 カ ラ ム番号、 名前、 配置、 サ イ ズ を設定す る には、 SetColumn 関数を使 用 し ます。 This.SetColumn (1, "Composition", Left!, 860) This.SetColumn (2, "Album", Left!, 610) This.SetColumn (3, "Artist", Left!, 710") 136 PowerBuilder 第 8 章 ウ ィ ン ド ウでの リ ス ト の使い方 カ ラ ム項目の設定 リ ス ト ビ ュ ーのカ ラ ム に値を設定す る には SetItem 関数を使用 し ます。 This.SetItem This.SetItem This.SetItem This.SetItem This.SetItem This.SetItem This.SetItem This.SetItem This.SetItem (1, (1, (1, (2, (2, (2, (3, (3, (3, 1, 2, 3, 1, 2, 3, 1, 2, 3, "St.Thomas") "Saxophone Colossus") "Sonny Rollins") "So What") "Kind of Blue") "Miles Davis") "Good-bye, Porkpie Hat") "Mingus-ah-um") "Charles Mingus") リ ス ト ビ ュ ー コ ン ト ロ ー ル へ の カ ラ ム の 追加 の 詳細 に つ い て は、 『PowerScript リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 137 リ ス ト ビ ュ ー コ ン ト ロールの使い方 138 PowerBuilder 第 9 章 ツ リ ービ ュ ー コ ン ト ロ ールの使い方 こ の章について こ の章では、 ツ リ ービ ュ ー コ ン ト ロ ールを使用 し て階層構造 (分 岐型) の リ ス ト を表示す る 方法について説明 し ます。 内容 項目 ツ リ ービ ュ ー コ ン ト ロ ールについて ツ リ ービ ュ ーの表示 ツ リ ービ ュ ーの項目の管理 ツ リ ービ ュ ー ピ ク チ ャ の管理 デー タ ウ ィ ン ド ウ のデー タ の ツ リ ービ ュ ーへの表示 ページ 139 143 149 158 161 ツ リ ービ ュ ー コ ン ト ロールについて ツ リ ービ ュ ー コ ン ト ロ ールに よ っ て、 階層構造の リ ス ト を表示す る こ と がで き ま す。 ツ リ ービ ュ ーは、 階層を開いた り 閉 じ た り す る 標準 イ ン タ フ ェース を提供 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 139 ツ リ ービ ュ ー コ ン ト ロールについて ツ リ ービ ュ ーの用途 ツ リ ービ ュ ーは、 ウ ィ ン ド ウ と カ ス タ ム ビ ジ ュ アル ユーザ オブジ ェ ク ト で使用 し ます。 同レベルの項目だけでな く 、 さ ま ざ ま な項目で構 成 さ れた、 よ り 複雑な リ ス ト や、 1 つの項目か ら 多数の項目が分岐す る リ ス ト を表示す る 場合に、 リ ス ト ボ ッ ク スや リ ス ト ビ ュ ーのかわ り に ツ リ ービ ュ ーを使用 し ます。エ ン ド ユーザが標準ツ リ ービ ュ ー イ ン タ フ ェ ー ス を使用 し て リ ス ト の分岐を表示す る 場合に も 、 デー タ ウ ィ ン ド ウ コ ン ト ロ ールではな く ツ リ ービ ュ ーを使用 し ます。 階層構造の リ ス ト リ ス ト ビ ュ ーの レ ポー ト ビ ュ ーの よ う な単一階層の リ ス ト で ツ リ ー ビ ュ ーを使用 し て も か ま い ま せんが、 1 つの項目か ら 多数の項目が分 岐 し 、 複数の階層で構成 さ れ る リ ス ト で ツ リ ービ ュ ーは威力を発揮 し ま す。 た と えば、 1 つ ま たは複数の親項目の下にそれぞれい く つかの 子項目が属す る よ う な リ ス ト で ツ リ ービ ュ ーを利用す る と よ いで し ょ う 。 ま た、 複数の レベルで段階的に分類 さ れてい る リ ス ト に も 有効で す。 ルー ト 項目 1 二次項目 1a 詳細項目 詳細項目 二次項目 1b 詳細項目 詳細項目 項目 2 二次項目 2a 詳細項目 レ ベルの数 分岐に よ っ て必要な階層の深 さ が異な る 場合、 分岐ご と の レベルの数 が一致 し な く て も か ま い ません。 ただ し 、 同 じ レベルの項目が、 あ る 分岐では二次項目で あ り 、 ほかの分岐では詳細項目で あ る と い う よ う にバ ラ バ ラ で あ る よ り は、 同 じ 種類の項目であ る 方が、 プ ロ グ ラ ミ ン グは容易にな り ます。 た と えば、 項目の レベルを テ ス ト し て、 適切な ア ク シ ョ ン を決め る ス ク リ プ ト を考え てみ ま し ょ う 。 こ の場合、 SetLevelPictures 関数を呼び 出 し て、 特定の レベルのすべての項目に ピ ク チ ャ を設定す る こ と がで き ます。 ツ リ ービ ュ ーのデー タ ソ ース 140 PowerBuilder のほ と ん ど の リ ス ト では、 ペ イ ン タ ま たは ス ク リ プ ト を 使用 し て項目を追加で き ますが、 ツ リ ービ ュ ーでは ス ク リ プ ト を作成 し な ければな り ません。 通常、 ウ ィ ン ド ウ を開 く と 、 ツ リ ービ ュ ーの 第 1 レベル (ルー ト レベル) が表示 さ れ ます。 エ ン ド ユーザが分岐を 表示 し た と き に、 ツ リ ービ ュ ーの ItemPopulate イ ベン ト に対す る ス ク リ プ ト に よ っ て、 次の レベルの項目を追加で き ます。 PowerBuilder 第 9 章 ツ リ ービ ュ ー コ ン ト ロールの使い方 項目のデー タ は ス ク リ プ ト でハー ド コ ー ド 化で き ますが、 エ ン ド ユー ザの入力や、 ツ リ ービ ュ ーの内容が登録 さ れてい る デー タ ベー ス を使 用す る 方が効率的です。 1 つの項目か ら 複数の子項目が分岐す る ので、 デー タ ベー ス内の複数のテーブルを使用 し て ツ リ ービ ュ ーを表示で き ます。 デー タ ス ト アの使用例については、 161 ページの 「デー タ ウ ィ ン ド ウ のデー タ の ツ リ ービ ュ ーへの表示」 を参照 し て く だ さ い。 項目のピ ク チ ャ ツ リ ービ ュ ーでは、 各項目に ピ ク チ ャ が関連付け ら れてい ます。 コ ン ト ロ ールの ピ ク チ ャ リ ス ト で使用す る ピ ク チ ャ を選択 し てか ら 、 その ピ ク チ ャ の イ ンデ ッ ク ス を項目に関連付け ます。 一般的に、 ピ ク チ ャ は各項目に固有の も のではあ り ません。 ピ ク チ ャ は、 その レベル内で 項目を分類 し た り 識別す る ための も のです。 以下の よ う な方法で ピ ク チ ャ を使用す る と 、 エ ン ド ユーザがデー タ を識別 し やす く な り ます。 • 各レベルで異な る ピ ク チ ャ を使用す る • 同一レベルで、 項目の種類ご と に異な る ピ ク チ ャ を使用す る • 特定の レベルのみピ ク チ ャ を使用す る • エ ン ド ユーザが項目を ク リ ッ ク し た ら ピ ク チ ャ を変更す る ピ ク チ ャ に よ っ て エ ン ド ユーザに情報 を提示す る 必要がない場合は、 ピ ク チ ャ を使用 し な く て も か ま い ませ ん。 項目の ラ ベル と 階層の レベルだけで十分な場合 も あ り ます。 ピ ク チ ャ を使用 し な く て も よい ツ リ ービ ュ ーの外観 プ ロ パテ ィ を使用 し て ツ リ ービ ュ ーの外観を制御で き ます。 全体的な 外観を変更す る プ ロ パテ ィ は表 9-1 の と お り です。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 141 ツ リ ービ ュ ー コ ン ト ロールについて 表 9-1: ツ リ ービ ュ ーのプ ロパテ ィ プ ロパテ ィ HasButtons HasLines、 LinesAtRoot Checkboxes TrackSelect FullRowSelect SingleExpand Indent フ ォ ン ト プ ロ パテ ィ 各種ピ ク チ ャ プ ロ パ ティ 効果 項目の前にプ ラ ス (+) やマ イ ナ ス (-) ボ タ ン が あ る 場合は子項目があ り 、 そのボ タ ン を ク リ ッ ク す る こ と に よ っ て分岐を開閉で き る こ と を示す 分岐内の項目や、 ルー ト レベルの項目を接続す る 線 を表示す る 状態ピ ク チ ャ をチ ェ ッ ク 済みチ ェ ッ ク ボ ッ ク スお よ び未チ ェ ッ ク チ ェ ッ ク ボ ッ ク ス に置き 換え る マ ウ ス が上に移動 し た と き に項目の外観を変更す る 選択 し た項目の行全体をハ イ ラ イ ト 表示す る 選択 し た項目を展開 し 、 前に選択 し た項目を自動的 に折 り たたむ 項目を イ ンデン ト す る 量を指定す る すべての ラ ベルの フ ォ ン ト を指定す る ピ ク チ ャ と そのサ イ ズ を制御す る こ れ ら のプ ロ パテ ィ の詳細につい ては、 『オブ ジ ェ ク ト と コ ン ト ロ ー ル』 マニ ュ アルを参照 し て く だ さ い。 ユーザ操作 開発者が特に ス ク リ プ ト を作成 し な く て も 、 ツ リ ービ ュ ーの基本機能 を利用 し て、 エ ン ド ユーザが ラ ベルの編集、 項目の削除、 分岐の開閉、 お よ びアル フ ァ ベ ッ ト 順の ソ ー ト を 行 う こ と がで き ま す。 た と えば、 エ ン ド ユーザが選択 し た項目を も う 一度 ク リ ッ ク す る と 、 ラ ベルは編 集状態にな り ま す。 ま た、 〔Delete〕 を押す と 項目が削除 さ れ ま す。 プ ロ パテ ィ を設定 し て、 こ の よ う な操作を実行で き ない よ う にす る こ と も 可能です。 ス ク リ プ ト を作成 し て、 こ の よ う な基本操作を カ ス タ マ イ ズす る こ と がで き ます。 基本操作に イ ベン ト を関連付け る こ と に よ り 、 操作を実 行可能ま たは実行不可に し ます。 ま た、 項目の追加、 項目の ド ラ ッ グ、 ソ ー ト 指定のカ ス タ マ イ ズ な ど、 そのほかの機能を実装す る こ と も で き ます。 カ ス タ ム イ ベン ト の 使い方 PowerBuilder バージ ョ ン 7 以降では、 リ ス ト ビ ュ ー コ ン ト ロ ール と ツ リ ービ ュ ー コ ン ト ロ ールに Microsoft の コ ン ト ロ ールが使用 さ れてい ます。 右 ク リ ッ ク し た と き に呼び出 さ れ る イ ベン ト が、 以前の リ リ ー ス と は異な り ます。 マ ウ ス の右ボ タ ン を放 し た と き に、pbm_rbuttonup イ ベン ト は発生 し ま せん。 こ のボ タ ン が放 さ れ る と 、 ツ リ ービ ュ ー コ ン ト ロ ールの組み込 み RightClicked! イ ベン ト pbm_tvnrclickedevent が発生 し ます。 142 PowerBuilder 第 9 章 ツ リ ービ ュ ー コ ン ト ロールの使い方 選択 さ れていない ツ リ ービ ュ ー項目を右 ク リ ッ ク し た場合、 その右ボ タ ン を放す と 、 以前選択 さ れていた項目に フ ォ ーカ ス が戻 り ます。 新 し い項目を選択す る には、次の コ ー ド を pbm_tvnrclickedevent ス ク リ プ ト に挿入 し ます。 その後で、 その項目に対す る 処理 ス ク リ プ ト を記述 し ます。 this.SelectItem(handle) マ ウ ス の右ボ タ ン でダブル ク リ ッ ク す る と 、 pbm_rbuttondblclk イ ベン ト のみ発生 し ます。 以前の リ リ ース では pbm_rbuttondblclk と pbm_tvnrdoubleclick の両方の イ ベン ト が発生 し てい ま し た。 ツ リ ービ ュ ーの表示 ツ リ ービ ュ ーに項目を追加す る には、 ス ク リ プ ト を作成す る 必要があ り ます。 ほかの リ ス ト コ ン ト ロ ールの よ う に、 ペ イ ン タ でア イ テ ム を 追加す る こ と はで き ません。 ツ リ ービ ュ ーのすべての レベルを一度に 表示す る こ と も で き ますが、 ツ リ ービ ュ ーの イ ベン ト を使用 し てエ ン ド ユーザが必要な分岐のみを表示 し た方が、 不要な手間を省 く こ と が で き ます。 通常、 コ ン ト ロ ールを 表示し たと き に、 ツ リ ービ ュ ーの第 1 レ ベルが表 示さ れま す。 こ のコ ード は、 ウ ィ ン ド ウ の Open イ ベン ト 、 Open イ ベン ト か ら 起動 さ れ る ユーザ イ ベン ト 、 ま たはツ リ ービ ュ ーの Constructor イ ベン ト にあ り ま す。 その後で、 コ ン ト ロ ールの ItemPopulate イ ベン ト に対す る ス ク リ プ ト に よ っ て、 エ ン ド ユーザが分岐 を 開い た と き に、 その項目の子項目が挿入 さ れ ます。 エ ン ド ユーザが項目のプ ラ ス ボ タ ン を ク リ ッ ク す る か、項目を ダブル ク リ ッ ク す る と 、 その項目の Children プ ロ パテ ィ が TRUE の場合のみ、 ItemPopulate イ ベン ト が起動 さ れ ます。 こ のため、 子項目があ る 項目を 挿入す る 場合、 Children プ ロ パテ ィ を TRUE に し て、 エ ン ド ユーザが 分岐を開いた と き に子項目が表示 さ れ る よ う に し ておかな ければな り ません。 ItemPopulate イ ベン ト 以外に も 項目を追加す る 方法はあ り ます。た と え ば、 エ ン ド ユーザが リ ス ト ボ ッ ク ス か ら 項目を ド ラ ッ グ し た り 、 テ キ ス ト ボ ッ ク ス に入力す る こ と に よ っ て追加す る こ と も で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 143 ツ リ ービ ュ ーの表示 項目挿入関数 表 9-2 に、 ツ リ ービ ュ ー コ ン ト ロ ールに項目を追加す る 関数を示 し ま す。 表 9-2: ツ リ ービ ュ ー コ ン ト ロールに項目を追加する関数 関数 InsertItem InsertItemFirst InsertItemLast InsertItemSort 挿入位置 指定 し た親項目の兄弟項目の後 兄弟項目がない場合は、 別の挿入関数を使用 し な ければな ら ない 親項目の最初の子項目にな る 親項目の最後の子項目にな る 可能な場合は、 子項目のアルフ ァ ベ ッ ト 順で適切な位置に 挿入 すべての InsertItem 関数で、 SortType プ ロ パテ ィ を使用 し て項目を追加 す る 位置を指定で き ます。 追加 し た項目に関す る 情報を表示す る には、 プ ロ パテ ィ を使用 し た以 下の 2 つの方法があ り ます。 方法 1 : ラ ベル と ピ ク チ ャ イ ンデ ッ ク スの み指定する 項目に ピ ク チ ャ イ ンデ ッ ク ス と ラ ベルを付けて挿入 し ます。 そのほか のプ ロ パテ ィ はすべて、 デフ ォ ル ト 値を使用 し ます。 ハン ド ルを使用 し て、 必要であれば、 後でそのほかのプ ロ パテ ィ を設定で き ます。 以下の例は、 現在選択 さ れてい る 項目の後に、 同 レ ベルの新規項 目を追加す る 場合です。 最初に、 現在選択 さ れてい る 項目 と その親項 目 の ハ ン ド ル を 取得 し、 そ の 後現在選択 さ れ て い る 項目 の 後 に Hindemith と い う ラ ベルの項目を挿入 し ます。 こ の項目の ピ ク チ ャ イ ン デ ッ ク ス は 2 です。 例 long ll_tvi, ll_tvparent ll_tvi = tv_list.FindItem(CurrentTreeItem!, 0) ll_tvparent = tv_list.FindItem(ParentTreeItem!, & ll_tvi) tv_list.InsertItem(ll_tvparent, ll_tvi, & "Hindemith", 2) 方法 2 :TreeViewItem 構造体で項目のプ ロパ テ ィ を設定する 144 特定の値にプ ロ パテ ィ を設定 し た TreeViewItem 構造体を使用 し て項目 を追加 し ます。 必要なプ ロ パテ ィ は ラ ベルだけです。 表 9-3 に示 さ れ てい る プ ロ パテ ィ を設定で き ます。 PowerBuilder 第 9 章 ツ リ ービ ュ ー コ ン ト ロールの使い方 表 9-3: TreeViewItem プ ロパテ ィ プ ロパテ ィ Label PictureIndex SelectedPictureIndex StatePictureIndex Children Data 値 項目名を示すテ キ ス ト 標準ピ ク チ ャ リ ス ト の値 標準ピ ク チ ャ リ ス ト の値。その項目が選択 さ れた と き のみ表示 さ れ る ピ ク チ ャ 。 こ の値が 0 の場合、 その項 目を選択 し て も ピ ク チ ャ は表示 さ れない 状態ピ ク チ ャ リ ス ト の値。標準ピ ク チ ャ の左側にその 状態ピ ク チ ャ が表示 さ れ る ダブル ク リ ッ ク に よ っ て ItemPopulate イ ベン ト を起動 す る 場合、 こ の値が TRUE でなければな ら ない。 こ の イ ベン ト ス ク リ プ ト に よ っ て子項目を挿入で き る 項目に関連付け る デー タ 型の値 (オプシ ョ ン) 。 ソ ー ト の制御やデー タ ベース の ク エ リ で使用で き る 以下の例では、ツ リ ービ ュ ー コ ン ト ロ ールに項目を追加す る 前に、 TreeViewItem 構造体ですべてのプ ロ パテ ィ を設定 し ます。 こ の項目は、 現在の項目の子項目 と し て追加 さ れます。 例 treeviewitem tvi long h_item = 0, h_parent = 0 h_parent = tv_1.FindItem(CurrentTreeItem!, 0) tvi.Label = "Choral" tvi.PictureIndex = 1 tvi.SelectedPictureIndex = 2 tvi.Children = true tvi.StatePictureIndex = 0 h_item = tv_1.InsertItemSort(h_parent, tvi) ツ リ ービ ュ ー コ ン ト ロ ールに項目を挿入す る 方法の詳細については、 『PowerScript リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 ルー ト レ ベルへの項目の挿入 最初に挿入 し た項目には兄弟項目がないので、 InsertItem 関数を使用で き ません。 こ の場合、InsertItemFirst 関数か InsertItemLast 関数を使用す る 必要があ り ます。 ルー ト レベルに項目を挿入す る 場合、 親は 0 にな り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 145 ツ リ ービ ュ ーの表示 以下のサ ンプル コ ー ド は、ツ リ ービ ュ ーを表示す る ウ ィ ン ド ウ の Open イ ベン ト か ら 起動 さ れたユーザ イ ベン ト の も のです。 こ こ では、 以下 に示す 2 つの イ ン ス タ ン ス変数配列があ る も の と し ます。 • item_label と い う 名前の文字列配列。 ルー ト レベルに挿入 さ れ る す べての項目の ラ ベル ( こ こ では作曲家名) • Data プ ロ パテ ィ の値 ( こ こ では作曲家の世紀) にな る 整数配列。 こ の数値を使用 し てユーザ定義の ソ ー ト を行 う int ct long h_item = 0 treeviewitem tvi FOR ct = 1 TO UpperBound(item_label) tvi.Label = item_label[ct] tvi.Data = item_data[ct] tvi.PictureIndex = 1 tvi.SelectedPictureIndex = 2 tvi.Children = TRUE tvi.StatePictureIndex = 0 tvi.DropHighlighted = TRUE h_item = tv_1.InsertItemSort(0, tvi) NEXT すべての項目を挿入 し た後で、 以下の コ ー ド に よ っ て ツ リ ービ ュ ーを 最初の項目ま で ス ク ロ ール し て戻 し 、 最初の項目を現在の項目に し ま す。 // 最初の項目ま でス ク ロール h_item = tv_1.FindItem(RootTreeItem!, 0) tv_1.SetFirstVisible(h_item) tv_1.SelectItem(h_item) ルー ト レ ベルの下への項目の挿入 エ ン ド ユーザが子項目を表示す る ために最初に分岐を開いた と き に、 その項目の Children プ ロ パテ ィ が TRUE の場合のみ、ItemPopulate イ ベ ン ト が起動 さ れます。 ItemPopulate イ ベン ト で、 現在開いてい る レベル に子項目を追加で き ます。 146 PowerBuilder 第 9 章 ツ リ ービ ュ ー コ ン ト ロールの使い方 親項目の Children プ ロパテ ィ 最初に分岐を開いた と き に ItemPopulate イ ベン ト が起動 さ れなか っ た 場合、 その項目の Children プ ロ パテ ィ が TRUE にな っ てい る か ど う か を確認 し て く だ さ い。 子項目があ る 項目の Children プ ロ パテ ィ はすべ て TRUE にな っ ていなければな り ません。 ItemPopulate イ ベン ト 以外の方法によ る挿入 ItemPopulate イ ベン ト を使 用す る と 、 エ ン ド ユーザが必要な項目のみを表示すれば よ いので、 効 率的にプ ロ グ ラ ム を作成で き ますが、 エ ン ド ユーザが分岐を開 く ま で 待たなければな り ません。ItemPopulate イ ベン ト が起動 さ れ る 前に挿入 し たい場合は、 ルー ト レベルに項目を挿入す る よ う に、 ス ク リ プ ト に よ っ て子項目を追加す る こ と も で き ます。 た と えば、 小 さ な ツ リ ービ ュ ーの場合、 ウ ィ ン ド ウ を開いた と き に全 体を表示 し 、 ExpandAll 関数を使用 し て分岐がすべて開いた状態で項目 を表示す る こ と がで き ます。 その項目の ExpandedOnce プ ロ パテ ィ をチ ェ ッ ク す る こ と に よ り 、 エ ン ド ユーザがその子項目を表示 し たか ど う か を確認す る こ と がで き ます。 エ ン ド ユーザが子項目を表示 し て い る 場合、 Expanded プ ロ パテ ィ も TRUE にな り ます。 子項目を表示 し たかど う かの確認 以下の ツ リ ー ビ ュ ーは、 作曲家 と そ の楽曲 を 分類 し た も のです。 ItemPopulate イ ベン ト に対す る ス ク リ プ ト に よ っ て、現在開いてい る 項 目が、 レベル 1 (作曲家) ま たは レベル 2 (分類) のいずれに属す る か をチ ェ ッ ク し ます。 レベル 3 の項目は開いてい ません。 例 レベル 1 の項目の下に、 ス ク リ プ ト に よ っ て 3 つの標準分類を追加 し ま す。 レ ベル 2 の項目の下に、 その分類に属す る 楽曲 を追加 し ま す。 こ の場合、 以下の よ う な構造にな り ます。 モーツ ァ ル ト 管弦楽 交響曲第 33 番 魔笛への序曲 室内楽 ホルン五重奏曲 変ホ長調 ア イ ネ ク ラ イ ネ ナハ ト ムジー ク 声楽 ド ン ジ ョ バン ニ イ ド メ ネオ ItemPopulate イ ベン ト に対す る ス ク リ プ ト は以下の と お り です。 TreeViewItem tvi_current, tvi_child, tvi_root long hdl_root ア プ リ ケーシ ョ ン テ ク ニ ッ ク 147 ツ リ ービ ュ ーの表示 Integer ct string categ[] // 現在の項目は、 新規項目の親項目です。 This.GetItem(handle, tvi_current) IF tvi_current.Level = 1 THEN // レ ベル 2 の標準分類を表示 し ます。 categ[1] = " 管弦楽 " categ[2] = " 室内楽 " categ[3] = " 声楽 " tvi_child.StatePictureIndex = 0 tvi_child.PictureIndex = 3 tvi_child.SelectedPictureIndex = 4 tvi_child.OverlayPictureIndex = 0 tvi_child.Children = TRUE FOR ct = 1 to UpperBound(categ) tvi_child.Label = categ[ct] This.InsertItemLast(handle, tvi_child) NEXT END IF // レ ベル 3 の楽曲名を表示 し ます。 IF tvi_current.Level = 2 THEN // 現在の項目の親項目を表示 し ます。 // 現在の分岐のルー ト であ り 、 // 子項目を選択するキーの 1 つにな り ます。 hdl_root = This.FindItem(ParentTreeItem!, handle) This.GetItem(hdl_root, tvi_root) FOR ct = 1 to 4 // このス テー ト メ ン ト はラ ベルを構成 し ます。 テーブルや // デー タ ベースでデー タ を検索する場合や、 エ ン ド ユーザの // 入力を受け付ける際に ラ ベルを使用する と 便利です。 This.InsertItemLast(handle, & tvi_root.Label + " 音楽 " & + tvi_current.Label + String(ct), 3) NEXT END IF 148 PowerBuilder 第 9 章 ツ リ ービ ュ ー コ ン ト ロールの使い方 ツ リ ービ ュ ーの項目の管理 ツ リ ービ ュ ーの各項目が TreeViewItem 構造体にな り ます。 こ の構造体 で項目のプ ロ パテ ィ を設定 し 、 ツ リ ービ ュ ーに項目を挿入す る 方法に ついては、 前節を参照 し て く だ さ い。 以下の コ ー ド は、 TreeViewItem 構造体を宣言 し 、 一部のプ ロ パテ ィ を 設定 し ます。 TreeViewItem tvi_defined tvi_defined.Label = "Symphony No. 3 Eroica" tvi_defined.StatePictureIndex = 0 tvi_defined.PictureIndex = 3 tvi_defined.SelectedPictureIndex = 4 tvi_defined.OverlayPictureIndex = 0 tvi_defined.Children = TRUE ピ ク チ ャ プ ロ パテ ィ につい て は、 158 ページ の 「ツ リ ー ビ ュ ー ピ ク チ ャ の管理」 を参照 し て く だ さ い。 項目を挿入す る と 、 挿入関数に よ っ てその項目に対す る ハン ド ルが戻 さ れ ます。 TreeViewItem 構造体が ツ リ ービ ュ ー コ ン ト ロ ールに コ ピー さ れ る ので、その項目のプ ロ パテ ィ にア ク セ スす る 必要はあ り ません。 itemhandle = This.InsertItemLast(parenthandle, & tvi_defined) 項目の取得、 変更、 設 定 ツ リ ービ ュ ー項目のプ ロ パテ ィ を変更 し たい場合には、 以下の操作を 実行 し ます。 1 その項目を取得 し 、 TreeViewItem 構造体に割 り 当て ます。 2 TreeViewItem プ ロ パテ ィ を設定 し て変更 し ます。 3 項目を設定 し 、 ツ リ ービ ュ ーに コ ピー し て戻 し ます。 ツ リ ービ ュ ーに挿入 さ れた項目を処理す る 場合、 そのハン ド ルを操作 し ます。 大部分の ツ リ ービ ュ ー イ ベン ト では、 引数 と し て 1 つま たは 2 つのハン ド ルを渡 し ます。 こ のハン ド ルに よ っ て、 エ ン ド ユーザが 処理 し てい る 項目を識別 し ます。 Clicked イ ベン ト に対す る 以下の コ ー ド は、エ ン ド ユーザが ク リ ッ ク し た 項 目 の ハ ン ド ル を 使 用 し て、 開 発 者 が プ ロ パ テ ィ を 変 更 し た TreeViewItem 構造体にその項目を コ ピー し て戻 し ます。 treeviewitem tvi This.GetItem(handle, tvi) tvi.OverlayPictureIndex = 1 This.SetItem(handle, tvi) ア プ リ ケーシ ョ ン テ ク ニ ッ ク 149 ツ リ ービ ュ ーの項目の管理 重要 項目のプ ロ パテ ィ を変更 し た後は、必ず SetItem 関数を呼び出 し て く だ さ い。 SetItem 関数を呼び出 さ ない と 、 ツ リ ービ ュ ーの表示が変更 さ れ ません。 項目 と 階層 FindItem 関数 と 項目のハン ド ルを使用 し て、ツ リ ービ ュ ーで構造体を調 べ る こ と がで き ます。 項目のプ ロ パテ ィ で レベルはわか り ますが、 親 項目はわか り ません。 FindItem 関数に よ っ て、 その項目が ど の親項目の 下にあ る かがわか り ます。 long h_parent h_parent = This.FindItem(ParentTreeItem!, handle) FindItem 関数を使用 し て子項目を探 し た り 、レベルに関係な く 現在表示 さ れてい る 項目の中か ら 検索す る こ と がで き ます。 詳細については、 『PowerScript リ フ ァ レ ン ス 』 マニ ュ アルの FindItem 関 数に関す る 節を参照 し て く だ さ い。 ス ク リ プ ト によ る ツ リ ービ ュ ー機能の制御 ス ク リ プ ト を作成 し な く て も 、ツ リ ービ ュ ーのプ ロ パテ ィ を設定 し て、 項目の削除や名前の変更な ど のユーザ操作を使用可能 / 使用禁止にで き ますが、 関数を呼び出す こ と に よ っ て こ れ ら のユーザ操作を制御す る こ と も で き ます。 以下の こ と を行 う こ と がで き ます。 • 項目の削除 • 項目の名前の変更 • ド ラ ッ グ ア ン ド ド ロ ッ プに よ る 項目の移動 • 項目の ソ ー ト 項目の削除 エ ン ド ユーザが項目を削除で き る よ う にす る ためには、 ツ リ ービ ュ ー の DeleteItems プ ロ パ テ ィ を 使 用 可 能 に し ま す。 エ ン ド ユ ー ザ が 〔Delete〕 を押す と 、 選択 し た項目が削除 さ れ、 DeleteItem イ ベン ト が 起動 さ れ ます。 子項目 も すべて削除 さ れ ます。 詳細項目のみ削除す る な ど、削除対象を よ り 細か く 指定 し たい場合は、 プ ロ パ テ ィ を 設 定 す る か わ り に DeleteItem 関 数 を 呼 び 出 し ま す。 DeleteItem 関数を呼び出 し た場合 も 、 DeleteItem イ ベン ト が起動 さ れま す。 150 PowerBuilder 第 9 章 ツ リ ービ ュ ー コ ン ト ロールの使い方 例 TreeView ユーザ イ ベン ト に対す る ス ク リ プ ト を以下に示 し ます。 イ ベ ン ト ID は pbm_keydown で、 ツ リ ービ ュ ーに フ ォーカ ス があ る 場合に キーを押す と 起動 さ れ ます。 こ の ス ク リ プ ト に よ っ て、 〔Delete〕 が押 さ れたか ど う か、 ま た、 選択 さ れた項目が詳細項目か ど う か をチ ェ ッ ク し ます。 両方 と も TRUE だっ た場合にその項目を削除 し ます。 ツ リ ービ ュ ーの DeleteItems プ ロ パテ ィ の値は FALSE に し ます。 TRUE にな っ てい る と 、 コ ー ド の内容にかかわ ら ず、 エ ン ド ユーザが任意の 項目を削除で き ます。 TreeViewItem tvi long h_item IF KeyDown(KeyDelete!)= TRUE THEN h_item = This.FindItem(CurrentTreeItem!, 0) This.GetItem(h_item, tvi) IF tvi.Level = 3 THEN This.DeleteItem(h_item) END IF END IF RETURN 0 項目の名前の変更 ツ リ ービ ュ ーの EditLabels プ ロ パテ ィ が使用可能な場合、 エ ン ド ユー ザが項目の ラ ベルを 2 回 ク リ ッ ク す る と 、 ラ ベルの編集状態にな り ま す。 イ ベン ト ラ ベルの編集には以下の 2 つの イ ベン ト が関連付け ら れてい ます。 BeginLabelEdit イ ベン ト は、 EditLabels プ ロ パテ ィ が設定 さ れてい る 場 合、 ま たは EditLabel 関数を呼び出 し た と き に、 2 回目の ク リ ッ ク の後 で起動 さ れます。 戻 り 値が 1 の場合は編集で き ない よ う にす る こ と が で き ます。 BeginLabelEdit イ ベン ト に対す る 以下の ス ク リ プ ト では、レベル 2 の項 目の ラ ベルは変更で き ません。 TreeViewItem tvi This.GetItem(handle, tvi) IF tvi.Level = 2 THEN RETURN 1 ELSE RETURN 0 END IF ア プ リ ケーシ ョ ン テ ク ニ ッ ク 151 ツ リ ービ ュ ーの項目の管理 EndLabelEdit イ ベン ト は、 エ ン ド ユーザが、 〔Enter〕 を 押す、 別の項 目を ク リ ッ ク す る 、 別の コ ン ト ロ ールのテ キ ス ト 入力エ リ ア を ク リ ッ ク す る 、 の いずれ か に よ っ て 編集 を 終了 し た と き に起動 さ れ ま す。 EndLabelEdit イ ベ ン ト に 対す る ス ク リ プ ト を 作成す る こ と に よ り 、 ユ ー ザ の 変更 が 適切 か ど う か を 確認 で き ま す (た と え ば、 ス ペ ル チ ェ ッ カ を起動で き ます)。 EditLabel 関数 エ ン ド ユーザに よ る ラ ベルの編集を制限す る ために、 上記の よ う な方 法で、BeginLabelEdit イ ベン ト を使用 し て ラ ベルの編集を禁止す る こ と がで き ます。 ラ ベルを編集可能に し たい場合は、 EditLabels プ ロ パテ ィ を FALSE に設定 し 、 EditLabel 関数を呼び出 し ます。 EditLabel 関数を呼び出す と 、編集を開始 し た と き には BeginLabelEdit イ ベン ト が、 エ ン ド ユーザが 〔Enter〕 を押 し た と き 、 あ る いは別の項目 を ク リ ッ ク し た と き には EndLabelEdit イ ベン ト が起動 さ れます。 CommandButton イ ベン ト に対す る 以下の コ ー ド に よ っ て、 現在の項目 が編集モー ド にな り ます。 long h_tvi h_tvi = tv_1.findItem(CurrentTreeItem!, 0) tv_1.EditLabel(h_tvi) ド ラ ッ グ ア ン ド ド ロ ッ プに よ る項目の移動 PowerBuilder では、 ウ ィ ン ド ウ レベルで コ ン ト ロ ールを ほかの コ ン ト ロ ールに ド ラ ッ グす る ための関数 と プ ロ パテ ィ が用意 さ れてい ま す。 ツ リ ー ビ ュ ー内でエ ン ド ユーザが項目 を ほかの項目に ド ラ ッ グ で き る よ う にす る こ と も で き ま す。 エ ン ド ユーザは、 項目を ソ ー ト す る 、 別の分岐に移動す る 、 親項目の下に子項目を配置す る 、 な ど の場合に ド ラ ッ グ を利用で き ます。 項目の移動方法 と し て ド ラ ッ グ ア ン ド ド ロ ッ プ を実装 し た場合、 ド ラ ッ グ さ れた項目が兄弟項目にな る のか子項目にな る のか、 移動す る のか コ ピーす る のか、 ま た、 子項目 も 一緒に移動す る のか を指定 し ま す。 表 9-4 に、 ド ラ ッ グ ア ン ド ド ロ ッ プ を実装す る 際に指定す る プ ロ パ テ ィ と イ ベン ト を示 し ます。 152 PowerBuilder 第 9 章 ツ リ ービ ュ ー コ ン ト ロールの使い方 表 9-4: ド ラ ッ グ ア ン ド ド ロ ッ プのプ ロパテ ィ と イ ベン ト プ ロパテ ィ またはイ ベン ト DragAuto プ ロ パテ ィ 設定 と 目的 TRUE ま たは FALSE FALSE の場合、 BeginDrag イ ベン ト で Drag 関 数を呼び出 さ なければな ら ない DisableDragDrop プ ロ パテ ィ DragIcon プ ロ パテ ィ BeginDrag イ ベン ト DragWithin イ ベン ト DragDrop イ ベン ト 例 FALSE 適切なア イ コ ン ま たは None!! (ユーザがア イ テ ム の画像を ド ラ ッ グ する) ド ラ ッ グ さ れた項目のハン ド ルを保存 し 、 オ プ シ ョ ン で特定の項目 を ド ラ ッ グ で き な い よ う にす る ス ク リ プ ト ド ロ ッ プ先を ハイ ラ イ ト 表示する ス ク リ プト ド ラ ッ グ操作の結果を実装す る ス ク リ プ ト ド ラ ッ グ ア ン ド ド ロ ッ プの実装が成功す る 鍵は、 詳細項目に あ り ま す。 こ の節では、 項目を移動す る 方法について説明 し ます。 以下の例 では、 ド ラ ッ グ さ れた項目は ド ロ ッ プ先の兄弟項目にな り 、 ド ロ ッ プ 先の項目の後に挿入 さ れ ます。 子項目 も 一緒に移動 さ れ、 元の項目は 削除 さ れ ます。 関数を繰 り 返 し 呼び出す こ と に よ り 、 レベルの数にかかわ ら ず、 すべ ての レベルの子項目が移動 さ れ ます。 無限ループ を避け る ため、 項目 が自分自身の子項目にな る こ と はで き ません。 すなわち、 ド ラ ッ グす る 項目の子項目に ド ロ ッ プす る こ と はで き ません。 以下の ス ク リ プ ト は、 ド ラ ッ グす る 項目のハン ド ルを イ ン ス タ ン ス変数に保存 し ます。 BeginDrag イ ベン ト ll_dragged_tvi_handle = handle 特定の レベルの項目の よ う な一部の項目を ド ラ ッ グで き ない よ う に し たい場合、 以下の よ う な コ ー ド を作成 し ます。 TreeViewItem tvi This.GetItem(handle, tvi) IF tvi.Level = 3 THEN This.Drag(Cancel!) DragWithin イ ベン ト 以下の ス ク リ プ ト は、 エ ン ド ユーザが ド ロ ッ プ 先を確認で き る よ う に、カー ソ ル位置の項目をハ イ ラ イ ト 表示 し ます。 ド ロ ッ プ先の項目が制限 さ れ る 場合には、 その項目が ド ロ ッ プ先 と し て適切か ど う か を チ ェ ッ ク し てか ら ハ イ ラ イ ト 表示 し ます。 以下の例 では、 ド ラ ッ グす る 項目の親項目か ど う か を チ ェ ッ ク し 、 親項目でな い場合のみハ イ ラ イ ト 表示 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 153 ツ リ ービ ュ ーの項目の管理 TreeViewItem tvi This.GetItem(handle, tvi) tvi.DropHighlighted = TRUE This.SetItem(handle, tvi) 以下の ス ク リ プ ト に よ っ て移動処理を実行し ます。 選択 し た位置にその項目を挿入で き る か ど う か をチ ェ ッ ク し て、 新 し い位置に ( ド ロ ッ プ先の兄弟項目 と し て) ド ラ ッ グ さ れた項目を挿入 し ます。 その後で、 ド ラ ッ グ さ れた項目の子項目 も 移動す る 関数を呼 び出 し ます。 DragDrop イ ベン ト TreeViewItem tvi_src, tvi_child long h_parent, h_gparent, h_moved, h_child integer rtn // ド ラ ッ グ さ れた項目の TreeViewItem を取得 し ます。 This.GetItem(ll_dragged_tvi_handle, tvi_src) // その項目の分岐先には移動で き ません。 // すなわち、 その項目の子項目にはなれません。 h_gparent = This.FindItem(ParentTreeItem!, handle) DO WHILE h_gparent <> -1 IF h_gparent = ll_dragged_tvi_handle THEN MessageBox(" ド ラ ッ グで き ません ", & " 子項目にする こ と はで き ません ") RETURN 0 END IF h_gparent=This.FindItem(ParentTreeItem!, h_gparent) LOOP // 挿入先の親項目を取得 し ます。 h_parent = This.FindItem(ParentTreeItem!, handle) // ド ロ ッ プ先がレ ベル 1 のため親項目がない場合は 0 を使用 し ます。 IF h_parent = -1 THEN h_parent = 0 // ド ロ ッ プ先の後に項目を挿入 し ます。 h_moved = This.InsertItem(h_parent, handle, tvi_src) IF h_moved = -1 THEN MessageBox(" ド ラ ッ グで き ません ", " 項目は移動で き ません ") RETURN 0 ELSE // 引数 :old parent、 new parent rtn = uf_movechildren(ll_dragged_tvi_handle, & h_moved) 154 PowerBuilder 第 9 章 ツ リ ービ ュ ー コ ン ト ロールの使い方 // すべての子項目の移動が完了 し た ら、 // 元の項目を削除 し ます。 IF rtn = 0 THEN This.DeleteItem(ll_dragged_tvi_handle) END IF END IF 上記の DragDrop イ ベン ト の ス ク リ プ ト では、 uf_movechildren 関数を呼 び出 し ます。 こ の関数は、 ド ラ ッ グ さ れた項目のすべての レベルの子 項目が移動 さ れ る ま で、 繰 り 返 し その関数自身を呼び出 し ます。 // // // // // // // // // 関数 :uf_movechildren 引数 : oldparent - 子項目が移動 さ れた 項目のハン ド ル。 最初は、 元の位置にある 項目 ( ド ラ ッ グ さ れる項目) newparent - 子項目の移動先 項目のハン ド ル。 最初は、 別の位置にある 項目 ( ド ラ ッ グ さ れる項目) long h_child, h_movedchild TreeViewItem tvi // 挿入が失敗 し た場合は戻 り 値 -1 // 子項目があるか? h_child = tv_2.FindItem(ChildTreeItem!, oldparent) IF h_child <> -1 THEN tv_2.GetItem(h_child, tvi) h_movedchild = tv_2.InsertItemLast(newparent, tvi) IF h_movedchild = -1 THEN RETURN -1 // 子項目の子がある場合は移動 し ます。 uf_movechildren(h_child, h_movedchild) // 元のレ ベルで、 ほかに子項目がないかど う かを チ ェ ッ ク し ます。 h_child = tv_2.FindItem(NextTreeItem!, h_child) DO WHILE h_child <> -1 tv_2.GetItem(h_child, tvi) h_movedchild= tv_2.InsertItemLast(newparent,tvi) IF h_movedchild = -1 THEN RETURN -1 uf_movechildren(h_child, h_movedchild) // 元のレ ベルに子項目が残っ ているか ? h_child = tv_2.FindItem(NextTreeItem!, h_child) ア プ リ ケーシ ョ ン テ ク ニ ッ ク 155 ツ リ ービ ュ ーの項目の管理 LOOP END IF RETURN 0 // すべての子項目の移動完了 項目の ソ ー ト ツ リ ービ ュ ーの機能を使用 し て自動的に ソ ー ト す る か、 開発者が手動 で ソ ー ト を制御す る こ と がで き ます。 手動 ソ ー ト では、 ラ ベルを アル フ ァ ベ ッ ト 順に ソ ー ト で き る ほか、 ソ ー ト 条件を定義 し てユーザ定義 の ソ ー ト を実装す る こ と も で き ます。 SortType プ ロ パテ ィ で ソ ー ト 方 法を制御 し ま す。 こ のプ ロ パテ ィ の値は、 デー タ 型 grSortType が列挙 さ れた形にな り ます。 自動アルフ ァ ベッ ト 順ソ ート テキス ト ラ ベルを ソ ート する には、SortType プ ロ パテ ィ を Ascending! ま たは Descending! に設定 し ます。 挿入 さ れた 項目が自動的に ソ ー ト さ れ ます。 手動アル フ ァ ベ ッ ト 順ソ ー ト ソ ー ト 条件 を よ り 細 か く 指定す る に は、 SortType を Unsorted! に設定 し 、 表 9-5 の関数を呼び出 し て ソ ー ト を実 行 し ます。 表 9-5: ツ リ ービ ュ ーのソ ー ト 関数 使用する関数 InsertItemSort Sort SortAll 処理内容 可能な場合には、 アルフ ァ ベ ッ ト 順で適切な位置に項 目を挿入す る その項目のすぐ下の子項目を ソ ー ト す る その項目の分岐をすべて ソ ー ト す る ユーザが項目を ド ラ ッ グ し て リ ス ト を作成 し た場合、 ソ ー ト は使用禁 止に し てお く 必要があ り ます。 ラ ベル以外によ る ソ ー ト ラ ベル以外で項目を ソ ー ト す る には、 UserDefinedSort! に SortType プ ロ パテ ィ を設定 し て Sort イ ベン ト に対す る ス ク リ プ ト を作成 し 、 ユーザ定義の ソ ー ト を実装 し ます。 その ス ク リ プ ト で ソ ー ト す る 方法を指定 し ます。 並べ替え を試み る たびに Sort イ ベン ト が起動 さ れます。 Sort ス ク リ プ ト は、 ど の項目がほかの項目 よ り 大 き いか を示す値を戻 し ます。 こ の ス ク リ プ ト に よ っ て、 項目の種類ご と に異な る 基準で ソ ー ト す る こ と がで き ます。 た と えば、 レベル 2 の項目を、 レベル 3 の項目 と は異な る 基準で ソ ー ト で き ます。 項目を挿入す る と 常に ツ リ ービ ュ ーが ソ ー ト さ れ ます。 156 PowerBuilder 第 9 章 ツ リ ービ ュ ー コ ン ト ロールの使い方 Sort イ ベン ト の例 以下のサ ン プル ス ク リ プ ト では、 第 1 レベルを Data プ ロ パテ ィ の値 で、 それ以外の レ ベル を ラ ベルの アル フ ァ ベ ッ ト 順に ソ ー ト し ま す。 Data プ ロ パテ ィ にはその作曲家の世紀が登録 さ れてい る ので、 第 1 レ ベルでは作曲家が年代順に並べ ら れ ます。 // 戻 り 値 //-1 handle 1 は handle 2 よ り 古い // 0 handle 1 と handle 2 は同 じ // 1 handle 1 は handle 2 よ り 新 し い TreeViewItem tvi1, tvi2 This.GetItem(handle1, tvi1) This.GetItem(handle2, tvi2) IF tvi1.Level = 1 THEN // Data プ ロパテ ィ に登録 さ れている世紀を比較 IF tvi1.data > tvi2.Data THEN RETURN 1 ELSEIF tvi1.data = tvi2.Data THEN RETURN 0 ELSE RETURN -1 END IF ELSE // ほかのレ ベルを アルフ ァ ベ ッ ト 順に ソ ー ト IF tvi1.Label > tvi2.Label THEN RETURN 1 ELSEIF tvi1.Label = tvi2.Label THEN RETURN 0 ELSE RETURN -1 END IF END IF ア プ リ ケーシ ョ ン テ ク ニ ッ ク 157 ツ リ ービ ュ ー ピ ク チ ャ の管理 ツ リ ービ ュ ー ピ ク チ ャの管理 ツ リ ービ ュ ーの画像は、 以下の 3 つの画像 リ ス ト に保存 さ れます。 • ピ ク チ ャ リ ス ト ( こ こ では標準ピ ク チ ャ リ ス ト と 呼びます) • 状態ピ ク チ ャ リ ス ト • オーバーレ イ ピ ク チ ャ リ ス ト こ れ ら の リ ス ト に ピ ク チ ャ を追加 し て、 ツ リ ービ ュ ーの項目 と 関連付 け ます。 項目のピ ク チ ャ ツ リ ー ビ ュ ーで ピ ク チ ャ を使用す る にはい く つかの方法が あ り ま す。 表 9-6 に示 さ れてい る 項目の ピ ク チ ャ プ ロ パテ ィ を設定す る こ と に よ り 、 ピ ク チ ャ リ ス ト にあ る ピ ク チ ャ を項目 と 関連付け ます。 表 9-6: ツ リ ービ ュ ー ピ ク チ ャ プ ロパテ ィ プ ロパテ ィ PictureIndex StatePictureIndex 目的 その項目に関連付け ら れてい る 主ピ ク チ ャ 。 ラ ベルの 左横に表示 さ れ る 標準ピ ク チ ャ の左側に表示 さ れ る 状態ピ ク チ ャ 。状態 ピ ク チ ャ を 表示す る ス ペー ス だけ項目が右に移動 さ れ る 。 Checkboxes プ ロ パテ ィ が TRUE であ る 場合は、 状態 ピ ク チ ャ は一組のチ ェ ッ ク ボ ッ ク ス に置 き 換え られる 状態ピ ク チ ャ に よ っ て項目の位置がずれ る ので、状態 ピ ク チ ャ があ る 項目 と ない項目では位置が揃わない。 すべての項目を揃え る には、空白の状態ピ ク チ ャ を使 用す る と よ い OverlayPictureIndex エ ン ド ユーザが選択 し た項目の横にチ ェ ッ ク マー ク を付け る 場合な ど に状態ピ ク チ ャ を使用す る 標準 ピ ク チ ャ の上に表示 さ れ る オーバー レ イ ピ ク チャ オーバーレ イ ピ ク チ ャ リ ス ト に標準ピ ク チ ャ リ ス ト の ピ ク チ ャ を 割 り 当て る ス ク リ プ ト に よ っ て オー バーレ イ ピ ク チ ャ を設定する オーバー レ イ ピ ク チ ャ は標準ピ ク チ ャ と 同 じ サ イ ズ だが、 標準ピ ク チ ャ 全体に重な ら ない よ う に、 一部を 使用す る 場合が多い。 Windows のエ ク ス プ ロ ー ラ で シ ョ ー ト カ ッ ト ア イ テ ム を示す矢印な ど がオーバー レ イ ピ ク チ ャ であ る 158 PowerBuilder 第 9 章 ツ リ ービ ュ ー コ ン ト ロールの使い方 プ ロパテ ィ SelectedPictureIndex 目的 標準 ピ ク チ ャ リ ス ト か ら 選択 し た ピ ク チ ャ 。 その項 目が現在の項目であ る と き に、標準ピ ク チ ャ のかわ り に表示 さ れ る 。 エ ン ド ユーザが別の項目を選択す る と 、 最初の項目にその標準ピ ク チ ャ が割 り 当て ら れ、 新 し い項目に選択 し た ピ ク チ ャ が表示 さ れ る 現在の項目であ る と き に も 異な る ピ ク チ ャ を使用す る 必要がない場合は、 SelectedPictureIndex を PictureIndex と 同 じ 値に設定す る ピ ク チ ャ の設定方法 SetLevelPictures 関数 を 使用 し て、 特定の レ ベルに 属す る すべての項目の ピ ク チ ャ を変更す る こ と がで き ます。あ る いは、 項目ご と に ピ ク チ ャ プ ロ パテ ィ を設定で き ます。 ピ ク チ ャ が必要ない場合 ツ リ ービ ュ ーの項目に必ず ピ ク チ ャ を付け る 必要はあ り ません。 その項目の ピ ク チ ャ イ ンデ ッ ク ス が 0 の場合、 ピ ク チ ャ は表示 さ れ ません。 ただ し 、 ツ リ ービ ュ ーでは常に、 標準ピ ク チ ャ 用の スペース が用意 さ れてい ます。PictureWidth プ ロ パテ ィ を 0 に 設定す る と 、 こ の スペース が削除 さ れます。 tv_2.DeletePictures() tv_2.PictureWidth = 0 ピ ク チ ャ リ ス ト の設定 ペ イ ン タ を使用 し て、 あ る いは実行時に、 標準ピ ク チ ャ リ ス ト と 状態 ピ ク チ ャ リ ス ト に ピ ク チ ャ を 追加で き ま す。 実行時には、 標準 ピ ク チ ャ リ ス ト の ピ ク チ ャ を オーバー レ イ リ ス ト に割 り 当て る こ と がで き ます。 マス クの色 マ ス ク の色 と は、 ピ ク チ ャ で使用 さ れ る 色の 1 つで、 ツ リ ービ ュ ーに ピ ク チ ャ が表示 さ れ る と き には透明にな り ます。 通常は、 ピ ク チ ャ を ツ リ ービ ュ ーの色 と 合成で き る よ う に、 ピ ク チ ャ の背景色を使用 し ま す。 ペ イ ン タ ま たは ス ク リ プ ト で ピ ク チ ャ を追加す る 前に、 その ピ ク チ ャ に合わせて マ ス ク の色 を 設定で き ま す。 以下の ス テー ト メ ン ト では、 ピ ク チ ャ の背景色が白なので、 マ ス ク の色を白に設定 し ます。 tv_1.PictureMaskColor = RGB(255, 255, 255) ピ ク チ ャ にはそれぞれ独自のマ ス ク の色があ り ます。 ピ ク チ ャ を挿入 す る と き に、 こ の色が表示 さ れ ます。 ピ ク チ ャ のマ ス ク の色を変更す る には、 その ピ ク チ ャ を削除 し て追加 し 直 さ なければな り ません。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 159 ツ リ ービ ュ ー ピ ク チ ャ の管理 画像サイ ズ ペ イ ン タ で、各ピ ク チ ャ タ ブの Height と Width プ ロ パテ ィ を設定す る こ と に よ り 、 随時画像サ イ ズ を変更で き ます。 リ ス ト 内の ピ ク チ ャ は すべて、 指定 し たサ イ ズに拡大 さ れ ます。 実行時には、 リ ス ト が空の場合のみ、 ピ ク チ ャ リ ス ト の画像サ イ ズ を 変更で き ます。 DeletePictures 関数 と DeleteStatePictures 関数で リ ス ト を 消去で き ます。 例 以下のサ ン プル コ ー ド は、 実行時にプ ロ パ テ ィ を 変更 し て標準 ピ ク チ ャ リ ス ト に ピ ク チ ャ を追加す る 方法を示す も のです。 状況ピ ク チ ャ の場合 も こ の コ ー ド を応用 し て く だ さ い。 tv_list.DeletePictures() tv_list.PictureHeight = 32 tv_list.PictureWidth = 32 tv_list.PictureMaskColor = RGB(255.255.255) tv_list.AddPicture("c:¥apps_pb¥kelly.bmp") tv_list.PictureMaskColor = RGB(255,0,0) tv_list.AddPicture("Custom078!") tv_list.PictureMaskColor = RGB(128,128,128) tv_list.AddPicture("Custom044!") ピ ク チ ャの削除によ る 既存の項目への影響 ピ ク チ ャ リ ス ト か ら ピ ク チ ャ を削除 し た と き に、 表示 さ れてい る 項目 の ピ ク チ ャ に予期せぬ変化が起 こ る 場合があ り ます。 ピ ク チ ャ を削除 す る と 、 リ ス ト の空白を埋め る ために、 リ ス ト 内の残 り の ピ ク チ ャ が 移動 さ れ ます。 こ れに よ り 、 それ ら の ピ ク チ ャ には異な る イ ンデ ッ ク ス 値が割 り 当て ら れ ます。 つま り 、 こ れ ら の イ ンデ ッ ク ス を使用す る 項目に、 従来 と は異な る 画像が関連付け ら れ る と い う こ と です。 オーバーレ イ リ ス ト は独立 し た リ ス ト ではな く 、 標準ピ ク チ ャ を ポ イ ン ト し てい る だけなので、 標準ピ ク チ ャ リ ス ト か ら ピ ク チ ャ を削除す る と 、 オーバーレ イ リ ス ト に も 影響があ り ます。 こ の よ う に項目の ピ ク チ ャ が変更 さ れ る の を防 ぐ には、 その項目の ピ ク チ ャ イ ン デ ッ ク ス を 使用 し た後は ピ ク チ ャ を 削除 し な い方が よ い でし ょ う 。 160 PowerBuilder 第 9 章 ツ リ ービ ュ ー コ ン ト ロールの使い方 オーバーレ イ ピ ク チ ャ の使い方 オーバーレ イ リ ス ト の ピ ク チ ャ は、標準ピ ク チ ャ リ ス ト に対応 し てい ま す。 まず、 ペ イ ン タ を使用 し て、 ま たは実行時に、 標準 リ ス ト に ピ ク チ ャ を追加 し なければな り ません。 次に、 実行時にオーバーレ イ ピ ク チ ャ リ ス ト に ピ ク チ ャ を指定 し ます。 その後で、 SetLevelPictures 関 数を使 う か、 個別に ピ ク チ ャ を項目に割 り 当て ます。 以下の コ ー ド では、 標準ピ ク チ ャ リ ス ト に ピ ク チ ャ を追加 し てか ら 、 その ピ ク チ ャ を オーバーレ イ リ ス ト に割 り 当て ます。 integer idx idx = tv_1.AddPicture("Custom085!") IF tv_1.SetOverlayPicture(1, idx) <> 1 THEN sle_get.Text = "Setting overlay picture failed" END IF Clicked イ ベン ト に対す る 以下の コ ー ド は、エ ン ド ユーザがその項目を ク リ ッ ク す る ご と にオーバーレ イ ピ ク チ ャ の表示 / 非表示を切 り 替え ます。 treeviewitem tvi This.GetItem(handle, tvi) IF tvi.OverlayPictureIndex = 0 THEN tvi.OverlayPictureIndex = 1 ELSE tvi.OverlayPictureIndex = 0 END IF This.SetItem(handle, tvi) デー タ ウ ィ ン ド ウのデー タ のツ リ ービ ュ ーへの表示 デー タ ウ ィ ン ド ウ か ら 取 り 出 し たデー タ を使用 し て、 ツ リ ービ ュ ー コ ン ト ロ ールを表示す る の も よ い方法です。 こ のためには、 アプ リ ケー シ ョ ン で以下の操作を実行 し なければな り ません。 • デー タ ス ト ア を宣言 し て イ ン ス タ ン ス を作成 し 、 デー タ ウ ィ ン ド ウ オブジ ェ ク ト を割 り 当て る • 必要に応 じ てデー タ を取 り 出す • 取 り 出 さ れたデー タ を使用 し て ツ リ ービ ュ ーを表示す る • 処理が完了 し た ら デー タ ス ト アの イ ン ス タ ン ス を破棄す る ア プ リ ケーシ ョ ン テ ク ニ ッ ク 161 デー タ ウ ィ ン ド ウのデー タ のツ リ ービ ュ ーへの表示 ツ リ ービ ュ ーでは異な る レベルで異な る 種類のデー タ を表示で き る の で、 レベルご と に追加のデー タ ウ ィ ン ド ウ を定義で き ます。 こ れ ら の デー タ ウ ィ ン ド ウ は、 通常異な る テーブル (関連す る テーブル) を参 照 し ます。 分岐を開 く と 、 その項目は子項目を取得す る ための検索引 数にな り ます。 第 1 レ ベルの表示 以下の例では、 作曲家 リ ス ト の ツ リ ー ビ ュ ー を 表示 し ま す。 ツ リ ー ビ ュ ーの第 2 レベルには、 その作曲家の楽曲が表示 さ れ ます。 デー タ ベース には、 作曲家名 と 、 (作曲家名を外部キー と す る ) 楽曲名の 2 つ のテーブルがあ り ます。 こ の例では、 ツ リ ービ ュ ー コ ン ト ロ ールを表示す る ウ ィ ン ド ウ 用に、 以下の 2 つのデー タ ス ト ア イ ン ス タ ン ス変数を宣言 し ます。 datastore ids_data, ids_info こ の例では、 ツ リ ービ ュ ー コ ン ト ロ ールの Constructor イ ベン ト を使用 し て以下の処理を行い ます。 • デー タ ス ト アの イ ン ス タ ン ス を作成す る • 作成 し た イ ン ス タ ン ス をデー タ ウ ィ ン ド ウ に関連付け、 デー タ を 取 り 出す • 取 り 出 さ れたデー タ を使用 し て ツ リ ービ ュ ーのルー ト レベルを表 示す る // tv_1 に対する Constructor イ ベン ト treeviewitem tvi1, tvi2 long ll_lev1, ll_lev2, ll_rowcount, ll_row // デー タ ス ト アのイ ン ス タ ン ス変数を作成 し ます。 ids_data = CREATE datastore ids_data.DataObject = "d_composers" ids_data.SetTransObject(SQLCA) ll_rowcount = ids_data.Retrieve() // ツ リ ービ ュ ーの第 1 レ ベルを作成 し ます。 tvi1.PictureIndex = 1 tvi1.Children = TRUE // デー タ ス ト アから取 り 出 さ れたデー タ で // ツ リ ービ ュ ーを表示 し ます。 FOR ll_row = 1 to ll_rowcount tvi1.Label = ids_data.GetItemString(ll_row, & 'name') This.InsertItemLast(0, tvi1) NEXT 162 PowerBuilder 第 9 章 ツ リ ービ ュ ー コ ン ト ロールの使い方 第 2 レ ベルの表示 エ ン ド ユーザがルー ト レベルの項目を開 く と 、 ItemPopulate イ ベン ト が起動 さ れ ます。 こ の イ ベン ト に対す る ス ク リ プ ト で、 以下の処理を 行い ます。 • 2 番目のデー タ ス ト アの イ ン ス タ ン ス を作成す る そのデー タ ウ ィ ン ド ウ で、 作曲家名を楽曲名テーブルの検索引数 と し て使用 し ます。 • 選択 し た作曲家に楽曲名を子項目 と し て挿入す る ItemPopulate のハン ド ル引数は、 新 し い項目の親項目にな り ます。 // tv_1 に対する ItemPopulate イ ベン ト TreeViewItem tvi1, tvi2 long ll_row, ll_rowcount // デー タ ス ト アのイ ン ス タ ン ス変数を作成 し ます。 ids_info = CREATE datastore ids_info.DataObject = "d_music" ids_info.SetTransObject(SQLCA) // 表示 さ れている項目のラ ベルを // 検索引数 と し て使用 し ます。 This.GetItem(handle, tvi1) ll_rowcount = ids_info.Retrieve(tvi1.Label) // デー タ ベースから取 り 出 さ れたデー タ を使用 し て // 開かれた項目を表示 し ます。 FOR ll_row = 1 to ll_rowcount This.InsertItemLast(handle, & ids_info.GetItemString(ll_row, & music_title'), 2) LOOP デー タ ス ト ア イ ン ス タ ン スの破棄 ツ リ ー ビ ュ ー コ ン ト ロ ールが表示 さ れて い る ウ ィ ン ド ウ を 閉 じ る と き に、 以下の コ ー ド でデー タ ス ト アの イ ン ス タ ン ス を破棄 し ます。 // w_treeview に対する Close イ ベ ン ト DESTROY ids_data DESTROY ids_info ア プ リ ケーシ ョ ン テ ク ニ ッ ク 163 デー タ ウ ィ ン ド ウのデー タ のツ リ ービ ュ ーへの表示 164 PowerBuilder 第 1 0 章 ド ラ ッ グ ア ン ド ド ロ ッ プ 機能の 使い方 こ の章について こ の章では、 ド ラ ッ グ ア ン ド ド ロ ッ プ機能 を 使用 し て、 ア プ リ ケーシ ョ ン を グ ラ フ ィ カルに操作す る 方法について説明 し ます。 内容 項目 ド ラ ッ グ ア ン ド ド ロ ッ プ機能について ド ラ ッ グ ア ン ド ド ロ ッ プのプ ロ パテ ィ 、 イ ベン ト 、 お よ び関 数 ド ラ ッ グ さ れた コ ン ト ロ ールの識別 ページ 165 166 168 ド ラ ッ グ ア ン ド ド ロ ッ プ機能について ド ラ ッ グ ア ン ド ド ロ ッ プ機能 と は、 コ ン ト ロ ールを ド ラ ッ グ し 、 ほかの コ ン ト ロ ール上に ド ロ ッ プす る こ と で、 ア ク シ ョ ン を起動 す る 機能の こ と です。 こ の機能を用い る と 、 アプ リ ケーシ ョ ン が グ ラ フ ィ カルで操作 し やす く な り ます。 た と えば、 製造用のアプ リ ケーシ ョ ン で、 部品の ピ ク チ ャ を ド ラ ッ グ し 、 完成 し た組み立 て品の ピ ク チ ャ に ド ロ ッ プす る こ と で、 組み立て作業を行え る よ う にで き ます。 ド ラ ッ グ ア ン ド ド ロ ッ プ操作には、ド ラ ッ グ さ れ る コ ン ト ロ ール ( ド ラ ッ グ コ ン ト ロ ール) と ド ラ ッ グ先の コ ン ト ロ ール( タ ーゲ ッ ト )の少なく と も 2 つのコ ント ロ ールが必要と なり ま す。PowerBuilder では、描画オブジ ェ ク ト (線、楕円、長方形、丸長方形)を除 く すべて の コ ン ト ロ ールを ド ラ ッ グす る こ と がで き ます。 自動 ド ラ ッ グ モー ド ア プ リ ケーシ ョ ン テ ク ニ ッ ク コ ン ト ロ ールは、 ド ラ ッ グ さ れ る と ド ラ ッ グ モー ド にな り ま す。 コ ン ト ロ ール に Clicked イ ベ ン ト が発生 し た と き に自動的に ド ラ ッ グ モー ド にな る よ う に、 コ ン ト ロ ールを定義す る こ と がで き ます。 ま た、 ウ ィ ン ド ウ やアプ リ ケーシ ョ ン で、 あ る イ ベン ト が 発生 し た と き に コ ン ト ロ ールが ド ラ ッ グ モー ド にな る よ う に ス ク リ プ ト を記述す る こ と も で き ます。 165 ド ラ ッ グ ア ン ド ド ロ ッ プのプ ロパテ ィ 、 イ ベン ト 、 および関数 ド ラ ッグ アイ コン ド ラ ッ グ可能な コ ン ト ロ ールの ス タ イ ル を ウ ィ ン ド ウ ペ イ ン タ で定 義す る 際に、 ド ラ ッ グ ア イ コ ン を指定す る こ と がで き ます。 ド ラ ッ グ ア イ コ ンは、 その コ ン ト ロ ールが有効な ド ロ ッ プ領域 ( コ ン ト ロ ール を ド ロ ッ プで き る 領域) 上に ド ラ ッ グ さ れ る と 表示 さ れ ます。 ド ラ ッ グ ア イ コ ン を指定 し ていない場合は、 その コ ン ト ロ ールのサ イ ズの長 方形が表示 さ れ ます。 ド ラ ッ グ イ ベン ト 描画 オ ブ ジ ェ ク ト を 除 く すべ て の コ ン ト ロ ール と ウ ィ ン ド ウ オ ブ ジ ェ ク ト は、 ド ラ ッ グ タ ーゲ ッ ト にな っ た と き に特別な イ ベン ト を持 つ こ と が で き ま す。 ド ラ ッ グ さ れ た コ ン ト ロ ールが タ ーゲ ッ ト 内に 入っ た り タ ーゲ ッ ト 上に ド ロ ッ プ さ れ る と 、 該当す る イ ベン ト の ス ク リ プ ト が実行 さ れ ます。 ド ラ ッ グ コ ン ト ロ ールが タ ーゲ ッ ト に入 る と き 、 タ ーゲ ッ ト 内に ド ラ ッ グ さ れてい る と き 、 タ ーゲ ッ ト か ら 離れ る と き 、 タ ーゲ ッ ト 上に ド ロ ッ プ さ れ る と き 、 それぞれの タ イ ミ ン グで ど の よ う な処理を行 う か を ス ク リ プ ト で指定 し ます。 ド ラ ッ グ ア ン ド ド ロ ッ プのプ ロパテ ィ 、イ ベン ト 、および 関数 PowerBuilder の各 コ ン ト ロ ールは、 以下の 2 つの ド ラ ッ グ ア ン ド ド ロ ッ プのプ ロ パテ ィ を持ち ます。 ド ラ ッ グ アン ド ド ロ ッ プのプ ロパテ ィ • DragAuto • DragIcon DragAuto プ ロパテ ィ DragAuto は、 Boolean 型のプ ロ パテ ィ です。 表 10-1: DragAuto プ ロパテ ィ 値 値 TRUE FALSE ❖ 166 意味 オブ ジ ェ ク ト が ク リ ッ ク さ れ る と 、 コ ン ト ロ ールは自動的に ド ラ ッ グ モー ド にな る オブジ ェ ク ト が ク リ ッ ク さ れて も 、コ ン ト ロ ールは自動的には ド ラ ッ グ モー ド にな ら ない。 ド ラ ッ グ モー ド にす る には、 ス ク リ プ ト で Drag 関数を使用 し なければな ら ない ウ ィ ン ド ウ ペ イ ン タ で コ ン ト ロールに対する自動 ド ラ ッ グ モー ド を指定する には 1 コ ン ト ロ ールのプ ロ パテ ィ ビ ュ ーで [その他] プ ロ パテ ィ ページ を選択 し ます。 2 [自動 ド ラ ッ グモー ド ] チ ェ ッ ク ボ ッ ク ス を オ ンに し ます。 PowerBuilder 第 10 章 ド ラ ッ グ ア ン ド ド ロ ッ プ機能の使い方 DragIcon プ ロ パテ ィ を使用 し て、コ ン ト ロ ールが ド ラ ッ グ モー ド にな っ た と き のア イ コ ン を指定 し ます。 DragIcon プ ロ パテ ィ は、 組み込みア イ コ ン名か、 ア イ コ ン フ ァ イ ル (ICO フ ァ イ ル) 名です。 デフ ォ ル ト の ド ラ ッ グ ア イ コ ンは、 コ ン ト ロ ール と 同 じ サ イ ズの長方形です。 DragIcon プ ロパテ ィ コ ン ト ロ ールを ド ラ ッ グす る と 、 その コ ン ト ロ ールが ド ロ ッ プで き る 領域 (有効 ド ロ ッ プ領域) 上にあ る と き に、 ド ラ ッ グ ア イ コ ン が表示 さ れ ます。 コ ン ト ロ ールを ド ロ ッ プで き ない領域 (た と えば、 ウ ィ ン ド ウ の ス ク ロ ールバー) では ド ロ ッ プ禁止ア イ コ ンが表示 さ れます。 ❖ ド ラ ッ グ ア イ コ ン を指定するには 1 コ ン ト ロ ールのプ ロ パテ ィ ビ ュ ーで [その他] プ ロ パテ ィ ページ を選択 し ます。 2 組み込みア イ コ ン の リ ス ト か ら 使用す る ア イ コ ン を 選択す る か、 [参照] (...) ボ タ ン を ク リ ッ ク し て ICO フ ァ イ ルを選択 し 、 [OK] ボ タ ン を ク リ ッ ク し ます。 ア イ コ ンの作成 ア イ コ ンは、Microsoft Windows の ICO フ ァ イ ル形式で保存可能な描画 アプ リ ケーシ ョ ン を利用 し て作成 し ます。 ド ラ ッ グ アン ド ド ロ ッ プのイ ベン ト ド ラ ッ グ ア ン ド ド ロ ッ プの イ ベン ト には、 以下の 6 種類があ り ます。 表 10-2: ド ラ ッ グ ア ン ド ド ロ ッ プのイ ベン ト イ ベン ト BeginDrag BeginRightDrag DragDrop DragEnter DragLeave DragWithin ア プ リ ケーシ ョ ン テ ク ニ ッ ク 発生する状況 リ ス ト ビ ュ ー ま たは ツ リ ービ ュ ー コ ン ト ロ ール上で、 マ ウ ス の左ボ タ ン を押 し て ド ラ ッ グ を開始す る と き リ ス ト ビ ュ ー ま たは ツ リ ービ ュ ー コ ン ト ロ ール上で、 マ ウ ス の右ボ タ ン を押 し て ド ラ ッ グ を開始す る と き ド ラ ッ グ ア イ コ ンのホ ッ ト ス ポ ッ ト (通常は中央)が タ ー ゲ ッ ト ( ド ラ ッ グ先の PowerBuilder コ ン ト ロ ールや ウ ィ ン ド ウ) 上にあ り 、 マ ウ ス ボ タ ンが放 さ れた と き ド ラ ッ グ ア イ コ ンのホ ッ ト ス ポ ッ ト が タ ーゲ ッ ト の境界 内に入 る と き ド ラ ッ グ ア イ コ ンのホ ッ ト ス ポ ッ ト が タ ーゲ ッ ト の境界 外に出 る と き ド ラ ッ グ ア イ コ ンのホ ッ ト ス ポ ッ ト が タ ーゲ ッ ト の境界 内で移動す る と き 167 ド ラ ッ グ さ れた コ ン ト ロールの識別 ド ラ ッ グ アン ド ド ロ ッ プの関数 PowerBuilder の各 コ ン ト ロ ールでは、 ド ラ ッ グ ア ン ド ド ロ ッ プの イ ベ ン ト に対す る ス ク リ プ ト を記述す る ために、 以下の 2 種類の関数が用 意 さ れてい ます。 表 10-3: ド ラ ッ グ ア ン ド ド ロ ッ プ イ ベン ト の関数 関数 Drag DraggedObject 動作内容 コ ン ト ロ ールの ド ラ ッ グ を開始ま たは終了す る 現在 ド ラ ッ グ さ れてい る コ ン ト ロ ールを取得す る こ れ ら の イ ベン ト お よ び関数の詳細については、 『PowerScript リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 ド ラ ッ グ さ れた コ ン ト ロールの識別 ド ロ ッ プ さ れた コ ン ト ロ ールの種類を識別す る には、 DragDrop イ ベン ト の source 引数を使用 し ます。 以下の ス ク リ プ ト は、ピ ク チ ャ 内の DragDrop イ ベン ト に対す る ス ク リ プ ト です。 こ こ では 2 種類の変数を宣言 し てか ら 、 ド ロ ッ プ さ れたオ ブジ ェ ク ト の種類を特定 し てい ます。 CommandButton lcb_button StaticText lst_info IF source.TypeOf() = CommandButton!THEN lcb_button = source lcb_button.Text = "You dropped a Button!" ELSEIF source.TypeOf() = StaticText!THEN lst_info = source lst_info.Text = "You dropped the text!" END IF CHOOSE CASE 文の使用 ウ ィ ン ド ウ に ド ロ ッ プ可能な コ ン ト ロ ールが数多 く あ る と き は、 CHOOSE CASE 文を使用 し ます。 168 PowerBuilder 第 11 章 オン ラ イ ン ヘルプ の提供 こ の章について こ の章では、 Windows 上でほかの開発者お よ びエ ン ド ユーザに対 し てオ ン ラ イ ン ヘルプ を提供す る 方法について説明 し ます。 内容 項目 ヘルプ フ ァ イ ルの作成 開発者に対す る オン ラ イ ン ヘルプの提供 エン ド ユーザに対す る オン ラ イ ン ヘルプの提供 ページ 169 171 173 ヘルプ フ ァ イルの作成 ヘルプ オーサ リ ング ツー ルについて Windows でオ ン ラ イ ン ヘルプ フ ァ イ ルを作成す る 際には、多数の オーサ リ ン グ ツール と 関連製品を使用で き ます。 RTF ベース のヘ ルプ フ ァ イ ルを 作成する すべてのオーサリ ン グ ツ ールは、Microsoft ヘルプ コ ンパ イ ラ を使用 し て、一連の ソ ース フ ァ イ ルを完成 し た ヘルプ フ ァ イ ルに コ ンパ イ ル し ます。 組み込まれる内容 一般に、ヘルプ シ ス テ ム用の ソ ース フ ァ イ ルには以下の要素が組 み込まれてい ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク • ト ピ ッ ク フ ァ イ ル (RTF) : ト ピ ッ ク の識別に役立ち、 ナビ ゲーシ ョ ン な ど の機能を提供す る コ マ ン ド と 脚注 コ ー ド に加 え て、 ヘルプ シ ス テ ム のテ キ ス ト も 含む • グ ラ フ ィ ッ ク フ ァ イ ル : 一般的にはビ ッ ト マ ッ プ (BMP) で、 特定の ト ピ ッ ク に関連付け ら れてい る • プ ロ ジ ェ ク ト フ ァ イ ル (HPJ) : 完成 し たヘルプ シ ス テ ムには 組み込 ま れないが、 コ ン パ イ ラ 用の命令が含 ま れてお り 、 そ の う ちのい く つかは、 指定 し たヘルプ ウ ィ ン ド ウ の外観 と 機 能に影響を与え る • コ ン テ ン ツ フ ァ イ ル (CNT) : 完成 し たヘルプ フ ァ イ ルには 組み込ま れないが、 ヘルプ シ ス テ ム全体の一部 と し てヘルプ フ ァ イ ル と と も に配布 さ れ る 169 ヘルプ フ ァ イルの作成 コ ン テ ン ツ フ ァ イ ルは、 ヘルプ ト ピ ッ ク ダ イ ア ロ グ ボ ッ ク ス の [目次] タ ブに表示す る エ ン ト リ を提供す る 。 ま た、 ヘルプ シ ス テ ム の動作全体に影響を及ぼす こ と のあ る そのほかの情報 も 提供す る 処理方法 多機能なヘルプ オーサ リ ン グ ツールを使用 し てい る 場合には、その指 示に従っ て、 必要な ソ ース フ ァ イ ルを作成 し 、 コ ンパ イ ルす る こ と が で き ます。 Microsoft SDK に添付の Microsoft ヘルプ ワ ー ク シ ョ ッ プ を使用 し てい る 場合には、 こ の ツールを使用 し てプ ロ ジ ェ ク ト フ ァ イ ル と コ ン テ ン ツ フ ァ イ ルを作成 し 、完成 し たヘルプ フ ァ イ ルを コ ンパ イ ルす る こ と がで き ます。 し か し 、 Microsoft Word で直接ヘルプ ト ピ ッ ク を記述す る 必要があ り ます。Microsoft ヘルプ ワ ー ク シ ョ ッ プ用のオ ン ラ イ ン ヘ ルプでは、 ヘルプ コ ンパ イ ラ 、 WinHelp マ ク ロ 、 お よ び WinHelp API に よ っ て識別 さ れ る さ ま ざ ま な脚注 コ ー ド の使い方に関す る 指示をは じ め と し て、 ヘルプ作成に関す る 多 く の情報を提供 し てい ます。 サン プル プ ロ ジ ェ ク ト フ ァ イル 参考用にサン プルのプ ロ ジ ェ ク ト フ ァ イ ルが、 PowerBuilder と と も に イ ン ス ト ール さ れ る PBUSR90.HLP フ ァ イ ルの ト ピ ッ ク に あ り ま す。 テ キ ス ト の取 り 出 し 方法を以下に示 し ます。 1 PowerBuilder ヘルプ を開いて、 [ユーザ] ボ タ ン を ク リ ッ ク し ます。 2 ユーザ定義ヘルプの下で、 ト ピ ッ ク の検索 ダ イ ア ロ グボ ッ ク ス の [目次] タ ブか ら 「ヘルプ プ ロ ジ ェ ク ト フ ァ イ ルのサ ン プル」 項 目に移動 し ます。 3 ヘルプ ト ピ ッ ク を Windows の ク リ ッ プボー ド に コ ピー し ます。 4 メ モ帳な ど のテ キ ス ト エデ ィ タ を開いて、 ク リ ッ プボー ド のテ キ ス ト を空の ド キ ュ メ ン ト に貼 り 付け ます。 5 その ド キ ュ メ ン ト を PBUSR90.HPJ と し て テ キ ス ト 形式で保存 し ます。 ソ ース フ ァ イ ル名やデ ィ レ ク ト リ パ ス名な ど、ヘルプ開発環境の細部 を 反映 さ せ る には、 プ ロ ジ ェ ク ト フ ァ イ ル を 編集す る 必要が あ り ま す。 そのためには、 テ キ ス ト エデ ィ タ を使用 し た り 、 ヘルプ ワ ー ク シ ョ ッ プ ま たはそのほかのヘルプ オーサ リ ン グ ツールでプ ロ ジ ェ ク ト フ ァ イ ルを開いて編集す る こ と がで き ます。 170 PowerBuilder 第 11 章 オ ン ラ イ ン ヘルプの提供 開発者に対する オ ン ラ イ ン ヘルプの提供 ヘルプ を提供する 2 つの方法 ユーザ定義関数の状況 依存ヘルプの機能 ユーザ定義関数、 ユーザ イ ベン ト 、 お よ びユーザ オブジ ェ ク ト のオ ン ラ イ ン ヘルプ を PowerBuilder の開発環境に統合す る には、 2 つの方法 があ り ます。 PowerBuilder メ イ ン ヘルプ ウ ィ ン ド ウ の [ユー ザ] ボ タ ン をハー ド コ ー ド 化 し て、 PBUSR90.HLP と い う フ ァ イ ル を起動 し ます。 • [ユーザ] ボ タ ン • ス ク リ プ ト ビ ュ ーで関数名 を 選択 し て (ま た は カー ソ ル を関数名に置いて) 〔Shift〕 + 〔F1〕 を押す と 、 ユーザ定 義関数の状況依存ヘルプ を表示で き ます。 状況依存ヘルプ ス ク リ プ ト ビ ュ ーで関数の名前 を 選択す る か関数名に カー ソ ル を 置 いて、 〔Shift〕 + 〔F1〕 を押す と 、 以下の動作が行われ ます。 1 PowerBuilder は、 関数名の中か ら 標準の接頭辞 (デフ ォ ル ト は uf_) を探 し ます。 2 標準の接頭辞が見つか っ た場合には、 PowerBuilder は (自身の メ イ ン ヘルプ フ ァ イ ルであ る PBHLP90J.HLP を調べ る かわ り に) ユー ザ定義関数のヘルプ ト ピ ッ ク を 含んでい る ヘルプ フ ァ イ ルか ら ヘルプ ト ピ ッ ク を探 し ます。 ユーザ定義関数のヘルプのデフ ォ ル ト フ ァ イ ル名は PBUSR90.HLP です。 PowerBuilder は、 PB.INI 内の UserHelpFile 変数を読み取 る こ と に よ っ て、 調べ る ヘルプ フ ァ イ ルの名前を判別 し ます。 こ の変数の 値を変更す る 方法については、 172 ページの 「高度な手順」 を参照 し て く だ さ い。 3 最も 簡単な方法 PowerBuilder が変数を 見つけ出し た場合には、指定し たヘルプ フ ァ イ ルか ら 選択 し た関数の名前 を 探 し ま す。 PB.INI に UserHelpFile 変数が存在 し な い場合には、 PowerBuilder は、 PowerBuilder Help デ ィ レ ク ト リ の PBUSR90.HLP フ ァ イ ルか ら キー ワ ー ド を探 し ま す。 PowerBuilder のデフ ォ ル ト を使用す る 場合には、 以下の操作が必要に な り ます。 • ア プ リ ケーシ ョ ン テ ク ニ ッ ク ユーザ定義関数、 ユーザ イ ベン ト 、 お よ びユーザ オブジ ェ ク ト の すべてのオ ン ラ イ ン ヘルプ を、PBUSR90.HLP と い う 1 つの フ ァ イ ルに コ ンパ イ ル し ます。 171 開発者に対する オ ン ラ イ ン ヘルプの提供 オ プ シ ョ ン で コ ン テ ン ツ フ ァ イ ル を 提供で き ま す。 そ の名前は PBUSR90.CNT と す る 必要があ り ます。 • 基本的な手順 作成す る 各ユーザ定義関数の名前の前に uf_ を付け ます (た と え ば、 uf_calculate)。 次に、 オ ン ラ イ ン ヘルプ を PowerBuilder 環境に組み込む方法について 説明 し ます。 ❖ [ユーザ] ボ タ ンから PowerBuilder 開発者用のオ ン ラ イ ン ヘルプ を起動す るには 1 Microsoft Word お よ び Microsoft ヘルプ ワ ー ク シ ョ ッ プ ま たはその ほかのヘルプ オーサ リ ン グ ツールを使用 し て、オ ン ラ イ ン ヘルプ フ ァ イ ルを作成 し ます。 2 PowerBuilder と と も に イ ン ス ト ール さ れた PBUSR90.HLP と PBUSR90.CNT の フ ァ イ ル名を変更 し ます。 独自の コ ン テ ン ツ フ ァ イ ルを提供 し ない場合で も 、 オ リ ジナルの PBUSR90.CNT フ ァ イ ルの名前は変更 し て く だ さ い。 3 コ ンパ イ ル し たヘルプ フ ァ イ ル と オプシ ョ ン の コ ン テ ン ツ フ ァ イ ルを、 PowerBuilder の Help デ ィ レ ク ト リ に保存 し ます。 ヘルプ フ ァ イ ルの名前は PBUSR90.HLP、 コ ン テ ン ツ フ ァ イ ルの名前は PBUSR90.CNT と し ます。 [ユーザ] ボ タ ン を ク リ ッ ク す る と 、 ヘルプ フ ァ イ ルが表示 さ れま す。 ❖ ユーザ定義関数の状況依存ヘルプ を作成するには 1 ユーザ定義関数を作成 し た場合には、 関数の名前には標準の接頭 辞を付け ます。 デフ ォ ル ト の接頭辞は uf_ です (た と えば、 uf_calculate)。 2 ユーザ定義関数のヘルプ ト ピ ッ ク ご と に、 関数名 と 同 じ 検索キー ワー ド (脚注 と し て K を使用) を割 り 当て ます。 た と えば、 ユーザ定義関数 uf_CutBait のヘルプ項目には、 検索キー ワー ド uf_CutBait を設定 し ます。 PowerBuilder は、 こ のキー ワー ド を使用 し て、ヘルプ ウ ィ ン ド ウ に適切な ト ピ ッ ク を呼び出 し ます。 3 高度な手順 172 ヘルプ フ ァ イ ルを コ ンパ イ ル し 、 PowerBuilder Help デ ィ レ ク ト リ に保存 し ます。 状況依存ヘルプに別の フ ァ イ ル名を指定す る には、 PB.INI フ ァ イ ルの UserHelpFile 変数の値を変更 し ま す。 こ の変数を使用す る には、 ヘル プ フ ァ イ ルが PowerBuilder Help デ ィ レ ク ト リ に存在す る 必要が あ り ます。 PowerBuilder 第 11 章 オ ン ラ イ ン ヘルプの提供 ❖ 状況依存ヘルプに別のフ ァ イル名を指定するには 1 テ キ ス ト エデ ィ タ で PB.INI フ ァ イ ルを開 き ます。 2 [PB] セク ショ ン で、UserHelpFile 変数を 追加し て、状況依存ト ピ ッ ク を含むヘルプ フ ァ イ ルの名前を指定 し ます。 変数の書式は次の と お り です。 UserHelpFile = helpfile.hlp フ ァ イ ル名だけ を指定 し ま す。 絶対パ ス で指定 し て も 認識 さ れ ま せん。 ユーザ定義関数には、 デフ ォ ル ト の uf_ 接頭辞以外の標準の接頭辞を 付け る こ と がで き ます。使用 し たい接頭辞を定義す る には、PB.INI フ ァ イ ルに UserHelpPrefix 変数を記述 し ます。 ❖ ユーザ定義関数に別の接頭辞を使用するには 1 テ キ ス ト エデ ィ タ で PB.INI フ ァ イ ルを開 き ます。 2 [PB] セ ク シ ョ ン で、 UserHelpPrefix 変数を追加 し て、 接頭辞の値 を指定 し ます。 次の書式を使用 し ます。 UserHelpPrefix = yourprefix_ 指定す る 接頭辞の最後は、 ア ン ダー ス コ ア文字にす る 必要が あ り ます。 エ ン ド ユーザに対する オ ン ラ イ ン ヘルプの提供 ア プ リ ケーシ ョ ンから ヘルプ を呼び出す 2 つの方法 ShowHelp の使い方 PowerBuilder は、 PowerBuilder アプ リ ケーシ ョ ン か ら オ ン ラ イ ン ヘル プ フ ァ イ ルを呼び出すために 2 つの方法を提供 し てい ます。 • アプ リ ケーシ ョ ン ス ク リ プ ト で ShowHelp お よ び ShowPopupHelp 関数を使用 し て、 ヘルプ ト ピ ッ ク を呼び出す • WinHelp API を外部関数 と し て宣言 し 、 アプ リ ケーシ ョ ン ス ク リ プ ト で WinHelp 関数を使用 し てヘルプ ト ピ ッ ク を呼び出す ShowHelp の実装は、 WinHelp API の場合 よ り も 簡単です。 ShowHelp 関 数を使用すれば、 ヘルプ コ ン テ キ ス ト ID ま たはキー ワー ド に よ っ て、 あ る いはヘルプ フ ァ イ ルの コ ン テ ン ツ ト ピ ッ ク (プ ロ ジ ェ ク ト フ ァ イ ルにヘルプ コ ン テ ン ツ ト ピ ッ ク と し て定義 さ れた ト ピ ッ ク ) にア ク セ スす る こ と に よ っ て、 ヘルプ ト ピ ッ ク を検索で き ます。 ShowHelp 関 数は、 コ ンパ イ ル済みの HTML (.chm) フ ァ イ ルで も 使用で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 173 エ ン ド ユーザに対する オ ン ラ イ ン ヘルプの提供 ShowPopupHelp 関数は、 コ ン ト ロ ールのポ ッ プア ッ プ ヘルプ を表示 し ます。 通常、 ShowPopupHelp 関数は、 Context Help プ ロ パテ ィ を有効に し た状態で、 レ ス ポ ン ス ウ ィ ン ド ウ の Help イ ベン ト で使用 し ます。 ま た、 コ ン ト ロ ール上でのカー ソ ルの動 き に応 じ て発生す る イ ベン ト や、 コ ン ト ロ ール ま たはオブジ ェ ク ト を ド ラ ッ グ し た と き に発生す る イ ベ ン ト は、 ShowPopupHelp に よ っ て呼び出 さ れ ます。 ShowHelp 関数、 ShowPopupHelp 関数、 お よ び Help イ ベン ト の詳細につ いては、 『PowerScript リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 WinHelp API を使用す る と 、WinHelp 関数の全域に渡 る ア ク セ ス が可能 と な り ま す。 こ れ ら の関数の多 く は、 ShowHelp では使用で き ま せん。 た と えば、WinHelp 関数を使用すれば、ヘルプ ト ピ ッ ク を提示す る ウ ィ ン ド ウ の種類ま たは ウ ィ ン ド ウ 名を簡単に指定で き ます。 WinHelp API の使い方 ❖ 外部関数 と し て WinHelp API を宣言する には 1 ス ク リ プ ト ペ イ ン タ の最初の ド ロ ッ プダ ウ ン リ ス ト ボ ッ ク ス か ら [(Declare)] を、 2 番目の ド ロ ッ プダ ウ ン リ ス ト ボ ッ ク ス か ら [Global External Functions] を選択 し ます。 2 関数宣言を ス ク リ プ ト ビ ュ ーに入力 し ます。 次の例では、 WinHelp API を宣言 し ます。 FUNCTION boolean WinHelpA(long hWndMain, & string lpszHelp, long uCommand, & long dwData) & LIBRARY "USER32.DLL" WinHelp API の詳細については、 Microsoft ヘルプ ワ ー ク シ ョ ッ プのオ ン ラ イ ン ヘルプ ま たはご使用のヘルプ オーサ リ ン グ ツールの資料を 参照 し て く だ さ い。 グ ロ ーバル外部関数の宣言 と 使用の詳細について は、 『PowerScript リ フ ァ レ ン ス』 マニ ュ アルお よ び 433 ページの 「外 部関数の使い方」 を参照 し て く だ さ い。 174 PowerBuilder 第 4 部 デー タ ア ク セス テ ク ニ ッ ク PowerBuilder に よ る ア プ リ ケ ー シ ョ ン 開発 に お い て、 デー タ ア ク セス機能を実現する ためのテ ク ニ ッ ク につい て説明 し ます。ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方、 XML の処理、 グ ラ フ の操作、 リ ッ チ テキス ト の作成方法、 デー タ ソ ー ス間のデー タ 転送な ど につい て説明 し ま す。 デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト お よびデー タ ス ト ア での デー タ ア ク セスの使い方については 『デー タ ウ ィ ン ド ウ プ ロ グ ラ マーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 第 1 2 章 ト ラ ン ザク シ ョ ン オブ ジ ェ ク ト の 使い方 こ の章について こ の章では、 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト と PowerBuilder アプ リ ケーシ ョ ンにおけ る それ ら の使い方について説明 し ます。 内容 項目 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト について ト ラ ンザ ク シ ョ ン オブジ ェ ク ト の使い方 ス ト ア ド プ ロ シージ ャ を 呼び出すた めの ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト の使い方 ス ト ア ド プ ロ シージ ャ を 呼び出す と き サ ポー ト さ れて い る DBMS の機能 ページ 177 182 194 203 ト ラ ンザク シ ョ ン オブ ジ ェ ク ト について PowerBuilder で行 う デー タ ベース処理は、 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト と 呼ばれ る 、 PowerScript と デー タ ベース と の通信領域 と し て機能す る ク ラ ス オブジ ェ ク ト を使用 し ます。 PowerBuilder が デー タ ベース に接続す る ためには、 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト にパ ラ メ ー タ を指定 し ます。 なお、 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト は、 図 12-1 に示す よ う に、 アプ リ ケーシ ョ ン か ら デー タ ベー ス にア ク セ スす る 前に、 あ ら か じ め設定 し なければな り ません。 図 12-1: デー タ ベースにア ク セスする ための ト ラ ンザク シ ョ ン オブ ジェ ク ト ア プ リ ケーシ ョ ン テ ク ニ ッ ク 177 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト について PowerBuilder ア プ リ ケーシ ョ ン において、 デー タ を表示 し た り 、 操作 す る ためには、 デー タ ベース と 通信す る 必要があ り ます。 デー タ ベース と の通信 ❖ PowerBuilder ア プ リ ケーシ ョ ンから デー タ ベース と 通信するには 1 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト に適切な値を設定 し ます。 2 デー タ ベース に接続 し ます。 3 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト をデー タ ウ ィ ン ド ウ コ ン ト ロ ー ルに関連付け ます。 4 デー タ ベース処理を行い ます。 5 デー タ ベース と の接続を解除 し ます。 デー タ ウ ィ ン ド ウ コ ン ト ロ ール用の ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト の設定方法、 お よ びデー タ ウ ィ ン ド ウ を使用 し て検索 と 更新を行 う 方 法についての詳細は、 『デー タ ウ ィ ン ド ウ プ ロ グ ラ マーズ ガ イ ド 』 マ ニ ュ アルを参照 し て く だ さ い。 デ フ ォル ト ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト ア プ リ ケーシ ョ ン の実行 を 開始す る と き に、 PowerBuilder は SQLCA (SQL Communications Area) と い う 名前のグ ロ ーバルなデフ ォ ル ト ト ラ ン ザ ク シ ョ ン オブ ジ ェ ク ト の イ ン ス タ ン ス を 作成 し ま す。 ア プ リ ケーシ ョ ン では、 こ のデフ ォ ル ト ト ラ ンザ ク シ ョ ン オブジ ェ ク ト を使 用で き ます。 ま た、 アプ リ ケーシ ョ ン が複数のデー タ ベー ス に接続す る 場合は、 ほかの ト ラ ンザ ク シ ョ ン オブジ ェ ク ト を作成 し て使用で き ます。 ト ラ ンザ ク シ ョ ン オ ブ ジ ェ ク ト のプ ロパ ティ ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト には、 以下の 15 種類のプ ロ パテ ィ が あ り ます。 • 10 種類のプ ロ パテ ィ は、 デー タ ベース に接続す る ために使用 さ れ ます。 • 5 種類のプ ロ パテ ィ は、 実行 さ れた SQL 文の成否についての ス テー タ ス 情報 を デー タ ベー ス か ら 受け取 る た めに使用 さ れ ま す。 こ れ ら のエ ラ ーをチ ェ ッ ク す る プ ロ パテ ィ 名は、5 種類 と も すべて SQL か ら 始ま り ます。 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト のプ ロパテ ィ 表 12-1 に、 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト のプ ロ パテ ィ を示 し ます。 接続のための 10 種類のプ ロ パテ ィ には、それぞれのプ ロ パテ ィ に対応 す る DB プ ロ フ ァ イ ル設定ダ イ ア ロ グ ボ ッ ク ス の フ ィ ール ド を示 し ま す。 DB プ ロ フ ァ イ ル設定ダ イ ア ロ グボ ッ ク ス は、 PowerBuilder の開発 環境でデー タ ベース プ ロ フ ァ イ ルを作成 し ます。 178 PowerBuilder 第 12 章 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 PoweBuilder デー タ ベース イ ン タ フ ェ ースにおける ト ラ ンザク シ ョ ン オブ ジ ェ ク ト のプ ロパテ ィ PowerBuilder デー タ ベー ス イ ン タ フ ェ ー ス で使用で き る ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト のプ ロ パテ ィ については、 181 ページの 「 ト ラ ン ザ ク シ ョ ン オブ ジ ェ ク ト のプ ロ パテ ィ と PowerBuilder デー タ ベー ス イ ン タ フ ェース のサポー ト 」 を参照 し て く だ さ い。 接続のための 10 種類のプ ロ パテ ィ に設定す る 値については、 『デー タ ベース と の接続』 マニ ュ アルの該当す る PowerBuilder デー タ ベース イ ン タ フ ェース の節を参照 し て く だ さ い。 表 12-1: ト ラ ンザク シ ョ ン オブ ジ ェ ク ト のプ ロパテ ィ プ ロパテ ィ DBMS デー タ 型 String Database UserID DBPass Lock String String String String LogID String LogPass String ServerName String ア プ リ ケーシ ョ ン テ ク ニ ッ ク DB プ ロ フ ァ イ ル設定の フ ィ ール ド DBMS 説明 接続のための PowerBuilder の DBMS 識別子。 サポー ト さ れてい る デー タ ベー ス イ ン タ フ ェ ー ス の識別子の一 覧については、 オン ラ イ ン ヘルプ を参照 接続す る デー タ ベース の名前 [データ ソ ース ] デー タ ベース に接続する ユーザの名前ま たは ID [ユーザ ID] デー タ ベース に接続する と き に使用する パス ワ ー ド [パ ス ワー ド ] Lock の値 と 分離レベルの使用をサポー ト す る DBMS の [分離レベル] 場合、 デー タ ベース に接続する と き の分離レベル。 ご使 用の DBMS に設定で き る Lock の値については、 オン ラ イ ン ヘルプの Lock DBParm パ ラ メ ー タ の記述を参照 デー タ ベー ス サーバに ロ グ イ ンす る ユーザの名前 ま た [ ロ グ イ ン ID] は ID デー タ ベー ス サーバに ロ グ イ ンす る と き に使用す る パ [パ ス ワー ド ] ス ワー ド デー タ ベース が常駐する サーバの名前 [サーバ」 179 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト について プ ロパテ ィ AutoCommit デー タ 型 Boolean DBParm String SQLReturnData String SQLCode Long SQLNRows Long SQLDBCode Long SQLErrText String 180 DB プ ロ フ ァ イ ル設定の 説明 フ ィ ール ド AutoCommit を サポート する DBMS のために、PowerBuilder [自動 コ ミ ッ ト が SQL 文 を ト ラ ン ザ ク シ ョ ン の ス コ ープ外 ま た は ス モー ド ] コ ープ内の ど ち ら で発行する か を指定する 。 設定で き る 値は、 以下の と お り • True SQL 文は、 ト ラ ン ザ ク シ ョ ン の ス コ ープ外で 発行 さ れ る 。 つま り 、 ス テー ト メ ン ト は、 論理的な作 業単位 (LUW) の一部ではない。 SQL 文の実行が成 功 し た場合、 DBMS は、 COMMIT 文が発行 さ れたかの よ う に、 デー タ ベース を ただちに更新する • False (デフ ォ ル ト ) SQL 文は、 ト ラ ンザ ク シ ョ ンの ス コ ープ内で発行 さ れ る 。 PowerBuilder は、 接続を開 始す る と き に BEGIN TRANSACTION 文を発行す る 。 さ ら に、 COMMIT 文や ROLLBACK 文が発行 さ れた後に、 BEGIN TRANSACTION 文を発行する 詳細については、 オン ラ イ ン ヘルプの AutoCommit に関 す る 記述を参照 DBMS 固有の接続パ ラ メ ー タ 。 特定の DBMS 機能を サ ポ ー ト 。 PowerBuilder が サ ポ ー ト す る 各 DBParm パ ラ メ ー タ の記述については、 『デー タ ベー ス と の接続』 マ ニ ュ アルの追加の 「接続パ ラ メ ー タ の設定」 についての 章を参照 DBMS 固有の情報。 た と えば、 Informix デー タ ベース に 接 続 し 、 埋 め 込み SQL の INSERT 文 を 実行す る と 、 SQLReturnData プ ロ パテ ィ には、 テーブルに挿入 し た行 のシ リ アル番号が入 る 直前に実行 し た SQL 文の成否 コ ー ド 。 詳細については、 192 ページの 「SQL 文実行後のエ ラ ー処理」 を参照 直前に実行 し た SQL 文に よ っ て影響を受けた行の数。こ の行数はデー タ ベース が返すので、その意味は DBMS に よ っ て異な る デー タ ベース ベン ダのエ ラ ーコ ー ド 。 詳細については、 192 ページの 「SQL 文実行後のエ ラ ー処理」 を参照 デー タ ベー ス ベン ダのエ ラ ー コ ー ド に対応す る エ ラ ー メ ッ セージのテ キ ス ト 。 詳細については、 192 ページの 「SQL 文実行後のエ ラ ー処理」 を参照 [ ド ラ イ バ固有 のパ ラ メ ー タ ] — — — — — PowerBuilder 第 12 章 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 ト ラ ンザク シ ョ ン オブ ジ ェ ク ト のプ ロパテ ィ と PowerBuilder デー タ ベース イ ン タ フ ェ ースのサポー ト デー タ ベー ス に接続す る ために必要な ト ラ ン ザ ク シ ョ ン オブ ジ ェ ク ト のプ ロ パテ ィ は、 PowerBuilder デー タ ベース イ ン タ フ ェース に よ っ て異な り ま す。 SQLReturnData プ ロ パテ ィ を除 き 、 SQL 文の成否につ い て の ス テ ー タ ス 情報 を 返すプ ロ パ テ ィ は、 すべ て の PowerBuilder デー タ ベース イ ン タ フ ェ ース に適用 し ます。 サポー ト す る PowerBuilder デー タ ベース イ ン タ フ ェース と ト ラ ンザ ク シ ョ ン オブジ ェ ク ト のプ ロ パテ ィ を、 表 12-2 に示 し ます。 表 12-2: PowerBuilder デー タ ベース イ ン タ フ ェ ース デー タ ベース イ ン タ フ ェ ース Informix JDBC ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト のプ ロパテ ィ DBMS UserID DBPass Database ServerName DBParm Lock AutoCommit SQLReturnData SQLCode SQLNRows SQLDBCode SQLErrText DBMS LogID LogPass DBParm Lock DBMS Database ServerName LogID LogPass DBParm Lock AutoCommit SQLCode SQLNRows SQLDBCode SQLErrText ODBC DBMS #UserID +LogID +LogPass DBParm Lock OLE DB DBMS LogID LogPass DBParm AutoCommit SQLReturnData SQLCode SQLNRows SQLDBCode SQLErrText AutoCommit SQLCode SQLNRows SQLDBCode SQLErrText Microsoft SQL Server ア プ リ ケーシ ョ ン テ ク ニ ッ ク AutoCommit SQLCode SQLNRows SQLDBCode SQLErrText 181 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 デー タ ベース イ ン タ フ ェ ース Oracle Sybase Adaptive Server Enterprise ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト のプ ロパテ ィ DBMS ServerName LogID LogPass DBParm DBMS Database ServerName LogID LogPass DBParm Lock SQLReturnData SQLCode SQLNRows SQLDBCode SQLErrText AutoCommit SQLCode SQLNRows SQLDBCode SQLErrText # ODBC に対する オプショ ン ( UserID プロ パティ を 指定する と き は、 ODBC の SQLGetInfo 関数呼び出 し に よ っ て返 さ れ る UserName プ ロ パテ ィ を上書 き す る ので、 注意 し て く だ さ い)。 + ご使用の ODBC ド ラ イ バが ODBC SQL ド ラ イ バの Connect 関数呼び出 し を サポー ト し ていない場合に限 り 、 PowerBuilder は LogID プ ロ パテ ィ と LogPass プ ロ パテ ィ を使 用 し ます。 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 PowerBuilder は、 論理的な作業単位 (LUW) と 呼ばれ る デー タ ベース ト ラ ンザ ク シ ョ ン処理の基本的な コ ン セプ ト を使用 し てい ます。 LUW は、 ト ラ ンザ ク シ ョ ンの同意語です。 ト ラ ンザ ク シ ョ ンは、 LUW を形 成す る 1 つま たは複数の SQL 文のセ ッ ト です。 ト ラ ンザ ク シ ョ ン内の すべての SQL 文は、 1 つの論理的な単位 と し て処理 さ れ ます。 PowerScript の ト ラ ンザ ク シ ョ ン管理文には、 以下の 4 つの ス テー ト メ ン ト があ り ます。 182 • COMMIT • CONNECT • DISCONNECT • ROLLBACK PowerBuilder 第 12 章 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 ト ラ ンザク シ ョ ンの基礎 CONNECT 文 と DISCONNECT 文 CONNECT 文 が 正常 に 実行 さ れ る と ト ラ ン ザ ク シ ョ ン が 開始 さ れ、 DISCONNECT 文によ っ てそのト ラ ン ザク ショ ン が終了し ま す。 CONNECT 文 と DISCONNECT 文の間で実行 さ れ る SQL 文はすべて、その ト ラ ンザ ク シ ョ ン に属 し ます。 CONNECT 文を実行す る 前に、 ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト は存在 し なければな り ません。 ま た、 DBMS に接続す る ためには、 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の必要な プ ロ パテ ィ に値 を 設定 し な ければな り ません。 COMMIT 文 と ROLLBACK 文 COMMIT 文が実行 さ れ る と 、 現行の ト ラ ンザ ク シ ョ ンが開始 (ま たは、 最後に実行 さ れた COMMIT 文や ROLLBACK 文) 後にデー タ ベース に対 し て行われたすべての変更が確定 さ れ、 新 し い ト ラ ンザ ク シ ョ ン が開 始 さ れ ま す。 ROLLBACK 文が実行 さ れ る と 、 現行の ト ラ ン ザ ク シ ョ ン が開始以降のすべての変更は取 り 消 さ れ、 新 し い ト ラ ン ザ ク シ ョ ン が 開始 さ れ ます。 ト ラ ンザ ク シ ョ ン型 コ ン ポーネ ン ト が EAServer ま たは MTS に配布 さ れた場合、TransactionServer コ ン テ キ ス ト オブジ ェ ク ト を使用 し て、 ト ラ ン ザ ク シ ョ ン を コ ン ト ロ ールで き ま す。 184 ページの 「 ト ラ ン ザ ク シ ョ ン サーバの配布」 を参照 し て く だ さ い AutoCommit プ ロパ テ ィ の設定 COMMIT 文 と ROLLBACK 文が実行で き る のは、 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の AutoCommit プ ロ パテ ィ の値が False (デフ ォ ル ト ) で、 埋 め込み SQL を使用 し た ト ラ ン ザ ク シ ョ ン を ま だ開始 し ていない と き だけです。 AutoCommit プ ロ パテ ィ についての詳細は、 178 ページの 「 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト のプ ロ パテ ィ 」 を参照 し て く だ さ い。 接続が解除 さ れた と きの自動コ ミ ッ ト ト ラ ン ザ ク シ ョ ン の接続が解除 さ れた と き に、 COMMIT 文が発行 さ れ ます。 ト ラ ンザク シ ョ ン プール ト ラ ンザ ク シ ョ ン プールを使用 し て、 デー タ ベース の処理を最適化で き ます。 詳細については、193 ページの 「デー タ ベース ト ラ ンザ ク シ ョ ン のプー ル」 を参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 183 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 ト ラ ンザ ク シ ョ ン サーバの配布 PowerBuilder で開発 し た コ ン ポーネ ン ト は、 EAServer、 MTS、 COM+ の ト ラ ンザ ク シ ョ ン に関与で き ます。 コ ン ポーネ ン ト にマー ク を付け る こ と に よ っ て、 ト ラ ンザ ク シ ョ ン サポー ト を提供す る コ ン ポーネ ン ト を判別で き ます。 コ ン ポーネ ン ト が ト ラ ンザ ク シ ョ ン サポー ト を提 供す る 場合、 ト ラ ン ザ ク シ ョ ン サーバは、 コ ン ポーネ ン ト のデー タ ベー ス操作が ト ラ ンザ ク シ ョ ン の一部 と し て実行 さ れ、 し か も 関与 し てい る コ ン ポーネ ン ト に よ っ て行われたデー タ ベー ス変更はすべて コ ミ ッ ト ま たは ロ ールバ ッ ク さ れ る よ う に し ます。 ト ラ ン ザ ク シ ョ ン を 使用す る コ ン ポーネ ン ト を定義すれば、 ト ラ ンザ ク シ ョ ン に関与す る コ ン ポーネ ン ト に よ っ て実行 さ れ る すべての作業は意図 し た と お り に 行われ る こ と を保証で き ます。 PowerBuilder は、 TransactionServer と い う ト ラ ン ザ ク シ ョ ン サー ビ ス コ ン テ キ ス ト オブジ ェ ク ト を提供 し ます。 こ のオブジ ェ ク ト は、 ト ラ ン ザ ク シ ョ ン サーバが現行の ト ラ ン ザ ク シ ョ ン を コ ミ ッ ト す る か中 止す る かの判断に影響を与え る 、 ト ラ ンザ ク シ ョ ン状態プ リ ミ テ ィ ブ へ の ア ク セ ス 権 を 与 え ま す。 MTS お よ び COM+ ク ラ イ ア ン ト は、 OleTxnObject オブジ ェ ク ト を使用 し て、 ト ラ ンザ ク シ ョ ン を制御す る こ と も で き ま す。 TransactionServer コ ン テ キ ス ト オブジ ェ ク ト を使用 し 、 UseContextObject DBParm パ ラ メ ー タ に Yes を設定 し た場合、 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト 内で COMMIT 文 と ROLLBACK 文を呼び出す と デー タ ベース エ ラ ーにな り ます。 デフ ォ ル ト では、 TransactionServer コ ン テ キ ス ト オブジ ェ ク ト は使用 さ れ ません。 その代わ り に、 COMMIT 文 と ROLLBACK 文を使用 し て ト ラ ンザ ク シ ョ ン を管理で き ます。こ の場合には、COMMIT は SetComplete 関数 と 解釈 さ れ、 ROLLBACK は SetAbort 関数 と 解釈 さ れ ます。 詳細については、 EAServer の場合は 480 ページの 「 ト ラ ンザ ク シ ョ ン のサポー ト 」、 MTS お よ び COM+ の場合は 594 ページの 「 ト ラ ンザ ク シ ョ ン のサポー ト 」 を参照 し て く だ さ い。 デ フ ォル ト ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト SQLCA たいていのアプ リ ケーシ ョ ンは 1 つのデー タ ベース にだけ ア ク セ スす る ので、 PowerBuilder は、 SQLCA と 呼ばれ る グ ロ ーバルなデフ ォ ル ト ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト を用意 し てい ま す。 SQLCA は、 SQL 通信領域 (SQL Communication Area) を意味 し ます。 PowerBuilder は、アプ リ ケーシ ョ ン の Open イ ベン ト に対す る ス ク リ プ ト を実行す る 前に、 SQLCA オブジ ェ ク ト を作成 し ます。 SQLCA と そ の プ ロ パ テ ィ は、 ア プ リ ケ ー シ ョ ン 内 の ど の ス ク リ プ ト か ら も 、 PowerScript の ド ッ ト (.) 表記に よ っ て参照で き ます。 184 PowerBuilder 第 12 章 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト は、 (一度に複数のデー タ ベー ス に接 続す る 場合な ど に) 必要で あれば独自に作成で き ます。 ただ し 、 通常 は必要 と な る ト ラ ンザ ク シ ョ ン オブジ ェ ク ト は SQLCA だけで済みま す。 例 デフ ォ ルト ト ラ ン ザク ショ ン オブジェ ク ト SQLCA を 使用し て、Sample と い う 名前の ODBC デー タ ソ ース に接続 し 、 さ ら にその接続を解除す る 簡単な例を以下に示 し ます。 // デ フ ォル ト ト ラ ンザク シ ョ ン オブ ジ ェ ク ト のプ ロパテ ィ を設定 し ま す。 SQLCA.DBMS="ODBC" SQLCA.DBParm="ConnectString='DSN=Sample'" // デー タ ベースに接続 し ます。 CONNECT USING SQLCA; IF SQLCA.SQLCode < 0 THEN & MessageBox(" 接続エ ラ ー ", SQLCA.SQLErrText,& Exclamation!) ... // デー タ ベース と の接続を解除 し ます。 DISCONNECT USING SQLCA; IF SQLCA.SQLCode < 0 THEN & MessageBox(" 接続解除エ ラ ー ", SQLCA.SQLErrText,& Exclamation!) SQL 文の区切 り 子はセ ミ コ ロ ン PowerBuilder の ス ク リ プ ト 内で埋め込み SQL を使用す る 場合、 SQL 文 は必ずセ ミ コ ロ ン (;) で終了 し なければな り ません。 なお、 複数行に わた る SQL 文に対 し て、 継続行文字を使用す る 必要はあ り ません。 ト ラ ンザク シ ョ ン オブ ジ ェ ク ト のプ ロパテ ィ 値の設定 デフ ォ ル ト ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト (SQLCA) や独自に作成 し た ト ラ ンザ ク シ ョ ン オブジ ェ ク ト を使用す る 前に、 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト のプ ロ パテ ィ に値を設定す る 必要があ り ます。 値を設 定す る には、 PowerScript の ド ッ ト (.) 表記を使用 し ます。 例 以下の PowerScript 文では、SQLCA のプ ロ パテ ィ に値を割 り 当て ます。 こ れは、 PowerBuilder Adaptive Server Enterprise デー タ ベー ス イ ン タ フ ェース を通 じ て Sybase Adaptive Server Enterprise デー タ ベース に接続 す る ために必要です。 sqlca.DBMS="SYC" sqlca.database="testdb" ア プ リ ケーシ ョ ン テ ク ニ ッ ク 185 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 sqlca.LogId="CKent" sqlca.LogPass="superman" sqlca.ServerName="Dill" 外部 フ ァ イルか ら の値の読み込み 外部 フ ァ イルの使い方 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト のプ ロ パテ ィ の値は、 外部フ ァ イ ルか ら 読み込んで設定で き ます。 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト の設定に 使用す る 外部 フ ァ イ ルには、 ア プ リ ケ ーシ ョ ン の開発時に使用す る PowerBuilder の初期設定フ ァ イ ルや、 アプ リ ケーシ ョ ン を配布す る 際 に指定す る 初期設定フ ァ イ ルな ど があ り ます。 ProfileString 関数 設定す る 値は、 PowerScript の ProfileString 関数を使用 し て、 初期設定 フ ァ イ ルか ら 読み込む こ と がで き ます。初期設定フ ァ イ ルは、Windows の INI フ ァ イ ル と 同様に、 変数値の代入式が集 ま っ た複数のセ ク シ ョ ン で構成 さ れてい ます。 PowerBuilder の初期設定 (INI) フ ァ イ ル も 初 期設定フ ァ イ ルの 1 つで あ り 、 PB、 Application、 Database な ど のセ ク シ ョ ン か ら 構成 さ れてい ます。 [PB] 変数 と その変数値 ... [Application] 変数 と その変数値 ... [Database] 変数 と その変数値 ... ProfileString 関数の構文は以下の と お り です。 ProfileString ( file, section, key, default) 例 次の ス ク リ プ ト では、 初期設定フ ァ イ ルか ら 値を読み取っ て、 ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト をデー タ ベース に接続す る よ う 設定 し ます。 条件付 き コ ー ド では、 プ ラ ッ ト フ ォーム ご と に適切な値を変数 startupfile に設定 し ます。 sqlca.DBMS = ProfileString(startupfile, "database",& "dbms", "") sqlca.database = ProfileString(startupfile,& "database", "database", "") sqlca.userid = ProfileString(startupfile, "database",& "userid", "") sqlca.dbpass = ProfileString(startupfile, "database",& "dbpass", "") 186 PowerBuilder 第 12 章 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 sqlca.logid = ProfileString(startupfile, "database",& "logid", "") sqlca.logpass = ProfileString(startupfile, "database",& "LogPassWord","") sqlca.servername = ProfileString(startupfile,& "database", "servername","") sqlca.dbparm = ProfileString(startupfile, "database",& "dbparm", "") デー タ ベースへの接続 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト のプ ロ パテ ィ に値を設定 し た ら 、 SQL の CONNECT 文を使用 し て、 デー タ ベース に接続で き ます。 // ト ラ ンザク シ ョ ン オブ ジ ェ ク ト の値は設定 さ れています。 CONNECT; CONNECT 文は、 PowerScript 文ではな く SQL 文なので、 文の末尾にセ ミ コ ロ ン (;) が必要です。 SQLCA 以外の ト ラ ンザ ク シ ョ ン オブジ ェ ク ト を使用 し てい る 場合は、 SQL 構文に USING TransactionObject 句が必要です。 CONNECT USING TransactionObject; 例 CONNECT USING ASETrans; PowerBuilder ア プ リ ケーシ ョ ン で接続する ための [プ レ ビ ュ ー] タ ブ の使い方 DB プ ロ フ ァ イ ル設定ダ イ ア ロ グボ ッ ク ス の [プ レ ビ ュ ー] タ ブ を使っ て、 開発時に PowerBuilder アプ リ ケーシ ョ ンの ス ク リ プ ト で使用す る PowerScript 接続構文を、 正確かつ簡単に作成で き ます。 DB プ ロ フ ァ イ ル設定ダ イ ア ロ グ ボ ッ ク ス で必要な項目を指定す る と 、 [プレ ビ ュー] タ ブに、選択し たオプシ ョ ンに対応する正し い PowerScript 接 続 構 文 が 表 示 さ れ ま す。 対 応 す る DBParm パ ラ メ ー タ 、 ま た は SQLCA プ ロ パテ ィ 名が各オプシ ョ ン に割 り 当て ら れ、 必要に応 じ て、 引用符、 カ ン マ、 セ ミ コ ロ ン な ど の文字が挿入 さ れ ます。 こ の構文は、 [プ レ ビ ュ ー] タ ブか ら ス ク リ プ ト に直接 コ ピーで き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 187 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 ❖ PowerBuilder ア プ リ ケーシ ョ ン で接続する ための [プ レ ビ ュ ー] タ ブ を使 用するには 1 接続用の DB プ ロ フ ァ イ ル設定ダ イ ア ロ グ ボ ッ ク ス で、デー タ ベー ス イ ン タ フ ェ ー ス の指示に従 っ て、 [接続] タ ブの基本オプ シ ョ ン、ほかの タ ブの DBParm パ ラ メ ー タ と SQLCA プ ロ パテ ィ に値を 代入 し ます。 イ ン タ フ ェ ー ス の接続パ ラ メ ー タ と 指定す る 値については、 ヘル プ を参照 し て く だ さ い。 2 [更新] を選択 し て、 DB プ ロ フ ァ イ ル設定ダ イ ア ロ グボ ッ ク ス を 閉 じ ないで、 設定を保存 し ます。 3 [プ レ ビ ュ ー] タ ブ を選択 し ます。 選択 し たオプシ ョ ン に対す る 適切な PowerScript 接続構文が、 [プ レ ビ ュ ー] タ ブの [DB 接続構文] ボ ッ ク ス に表示 さ れ ます。 4 [DB 接続構文] ボ ッ ク ス で 1 行以上のテ キ ス ト 行を選択 し 、 [ コ ピー] を選択 し ます。 選択 し た テ キ ス ト が ク リ ッ プボー ド に コ ピー さ れ ま す。 次に、 こ の構文を ス ク リ プ ト に貼 り 付け、 必要で あれば、 デ フ ォ ル ト の ト ラ ンザ ク シ ョ ン オブジ ェ ク ト 名 (SQLCA) を修正 し ます。 5 [OK] を ク リ ッ ク し ます。 デー タ ベース と の接続の解除 デー タ ベー ス の処理が終了 し た ら 、 SQL の DISCONNECT 文 を 使用 し て、 デー タ ベース と の接続を解除 し ます。 DISCONNECT; SQLCA 以外の ト ラ ンザ ク シ ョ ン オブジ ェ ク ト を使用 し てい る 場合は、 SQL 構文に USING TransactionObject 句が必要です。 DISCONNECT USING TransactionObject; 例 DISCONNECT USING ASETrans; 接続が解除 さ れた と きの自動コ ミ ッ ト デフ ォ ル ト では、 ト ラ ンザ ク シ ョ ン の接続が解除 さ れた と き に、 COMMIT 文が実行 さ れ ます。 188 PowerBuilder 第 12 章 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 複数のデー タ ベース接続におけ る ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の定義 接続ご と に 1 つの ト ラ ンザク シ ョ ン オブ ジ ェ ク ト を使用する 同時に複数のデー タ ベー ス に対す る 処理を行 う と き は、 複数の ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト をデー タ ベース の接続ご と に 1 つずつ使用 し ます。 独自に定義す る ト ラ ンザ ク シ ョ ン オブジ ェ ク ト を参照す る と き には、 その前にオブジ ェ ク ト を宣言 し て作成す る 必要があ り ます。 ま た、 そのオブジ ェ ク ト が不要にな っ た ら 破棄す る よ う に し ます。 注意 PowerBuilder は、 SQLCA を自動的に作成 し 、 破棄 し ます。 し たが っ て、 ス ク リ プ ト で SQLCA の作成や破棄は行わないで く だ さ い。 SQLCA 以外の ト ラ ン ザク シ ョ ン オブ ジ ェ ク ト の作成 SQLCA 以 外 の ト ラ ン ザ ク シ ョ ン オ ブ ジ ェ ク ト を 作 成 す る に は、 Transaction 型の変数を宣言 し ます。 transaction TransactionObjectName 次に、 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト の イ ン ス タ ン ス を作成 し ます。 TransactionObjectName = CREATE transaction た と えば、 DBTrans と い う 名前の ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト を作 成す る 場合は、 以下の よ う に記述 し ます。 transaction DBTrans DBTrans = CREATE transaction // これで、 DBTrans のプ ロパテ ィ に値を設定で き ます。 DBTrans.DBMS = "ODBC" ... プ ロパテ ィ 値の設定 ス ク リ プ ト で宣言 し て作成 し た ト ラ ン ザ ク シ ョ ン オブ ジ ェ ク ト のプ ロ パテ ィ に値を設定す る と き は、 以下の よ う に、 プ ロ パテ ィ の値を一 度に 1 つずつ設定 し なければな り ません。 // 以下の記述は、 正 し い結果 と な り ます。 transaction ASETrans ASETrans = CREATE TRANSACTION ASETrans.DBMS = "Sybase" ASETrans.Database = "Personnel" 次の よ う に、 デ フ ォ ル ト 以外 の ト ラ ン ザ ク シ ョ ン オ ブ ジ ェ ク ト で SQLCA と 同 じ オブジ ェ ク ト を設定 し て、値を代入す る こ と はで き ませ ん。 // 以下の記述は正 し い結果にな り ません。 transaction ASETrans ASETrans = CREATE TRANSACTION ASETrans = SQLCA // エ ラ ー ! ア プ リ ケーシ ョ ン テ ク ニ ッ ク 189 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 SQL 文の実行に ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト が必要 と な る 場合は、 特に指定 し な い限 り 、 デ フ ォ ル ト ト ラ ン ザ ク シ ョ ン オ ブ ジ ェ ク ト SQLCA が使用 さ れ ます。 し たがっ て、 以下の 2 つの CONNECT 文は同 一です。 SQL 文に対する ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の指定 CONNECT; CONNECT USING SQLCA; SQLCA 以外の ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト を使用す る 場合は、 表 12-3 の SQL 文において、 USING TransactionObject 句を使用 し て、 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト を指定す る 必要があ り ます。 表 12-3: USING TransactionObject 句を必要 と する SQL 文 ❖ COMMIT INSERT CONNECT PREPARE (動的 SQL) DELETE ROLLBACK DECLARE Cursor SELECT DECLARE Procedure SELECTBLOB DISCONNECT UPDATEBLOB EXECUTE (動的 SQL) UPDATE SQL 文にユーザ定義の ト ラ ンザク シ ョ ン オブ ジ ェ ク ト を指定するには • SQL 文の終わ り に以下の句を追加 し ます。 USING TransactionObject た と えば、 以下の ス テー ト メ ン ト では、 ASETrans と い う 名前の ト ラ ンザ ク シ ョ ン オブジ ェ ク ト を使用 し て、 デー タ ベース に接続 し ます。 CONNECT USING ASETrans; ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト のス ク リ プ ト 記述の推奨 SQL 文におけ る USING TransactionObject 句の指定は、 SQLCA を使用す る と き はオプシ ョ ン で、 独自の ト ラ ンザ ク シ ョ ン オブジ ェ ク ト を使用 す る と き は必須です。 し か し 、 SQLCA を含むすべての ト ラ ンザ ク シ ョ ン オブジ ェ ク ト に対 し て、 USING TransactionObject 句を記述 し ておけ ば、複数の ト ラ ンザ ク シ ョ ン オブジ ェ ク ト を使用す る 場合な どは、SQL 文で使用す る ト ラ ン ザ ク シ ョ ン オブ ジ ェ ク ト が明確に な り ま す。 ま た、 USING TransactionObject 句が必要な場合に必ず指定す る こ と がで き ます。 190 PowerBuilder 第 12 章 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 例 以下の ス テー ト メ ン ト では、デフ ォ ル ト ト ラ ンザ ク シ ョ ン オブジ ェ ク ト (SQLCA) を使用 し て Adaptive Server Anywhere デー タ ベー ス に接 続 し ます。 ま た、 ASETrans と い う 独自に作成 し た ト ラ ンザ ク シ ョ ン オ ブジ ェ ク ト を使用 し て、 Adaptive Server Enterprise デー タ ベース に接続 し ます。 // デ フ ォル ト ト ラ ンザク シ ョ ン オブ ジ ェ ク ト のプ ロパテ ィ を設定 し ま す。 SQLCA.DBMS = "ODBC" SQLCA.DBParm = "ConnectString='DSN=Sample'" // Adaptive Server Anywhere デー タ ベースに接続 し ます。 CONNECT USING SQLCA; // ASE ト ラ ンザク シ ョ ン オブ ジ ェ ク ト を宣言 し ます。 transaction ASETrans // ASE ト ラ ンザク シ ョ ン オブ ジ ェ ク ト を作成 し ます。 ASETrans = CREATE TRANSACTION // ASE ト ラ ンザク シ ョ ン オブ ジ ェ ク ト のプ ロパテ ィ を設定 し ます。 ASETrans.DBMS = "Sybase" ASETrans.Database = "Personnel" ASETrans.LogID = "JPL" ASETrans.LogPass = "JPLPASS" ASETrans.ServerName = "SERVER2" // ASE デー タ ベースに接続 し ます。 CONNECT USING ASETrans; // Adaptive Server Anywhere デー タ ベースに行を挿入 // し ます。 INSERT INTO CUSTOMER VALUES ( 'CUST789', 'BOSTON' ) USING SQLCA; // ASE デー タ ベースに行を挿入 し ます。 INSERT INTO EMPLOYEE VALUES ( "Peter Smith", "New York" ) USING ASETrans; // Adaptive Server Anywhere デー タ ベース と の接続を解除 // し ます。 DISCONNECT USING SQLCA; // ASE デー タ ベース と の接続を解除 し ます。 DISCONNECT USING ASETrans; // ASE ト ラ ンザク シ ョ ン オブ ジ ェ ク ト を破棄 し ます。 DESTROY ASETrans ア プ リ ケーシ ョ ン テ ク ニ ッ ク 191 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 エ ラ ー チ ェ ッ クの使い方 実際の ス ク リ プ ト では、 CONNECT 文、 INSERT 文、 DISCONNECT 文の 後にエ ラ ー チ ェ ッ ク の ス ク リ プ ト を記述 し ます。 詳細については、 次の「 SQL 文実行後のエラ ー処理」 を参照 し て く だ さ い。 SQL 文実行後のエ ラ ー処理 エ ラ ー チ ェ ッ クの タ イ ミ ング ス ク リ プ ト で以下の ス テー ト メ ン ト を実行 し た後は、 その成否 コ ー ド ( ト ラ ンザ ク シ ョ ン オブジ ェ ク ト の SQLCode プ ロ パテ ィ ) を確認す る 必要があ り ます。 • ト ラ ンザ ク シ ョ ン管理文 (CONNECT 文、 COMMIT 文、 DISCONNECT 文な ど) • 埋め込み SQL 文や動的 SQL デー タ ウ ィ ン ド ウでのエ ラ ー チ ェ ッ ク こ の よ う なエ ラ ー チ ェ ッ ク は、 デー タ ウ ィ ン ド ウ で検索や更新を行っ た後には使用 し ないで く だ さ い。 デー タ ウ ィ ン ド ウ でのエ ラ ー処理についての詳細は、『デー タ ウ ィ ン ド ウ プ ロ グ ラ マーズガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 SQLCode の戻 り 値 表 12-4 に SQLCode の戻 り 値を示 し ます。 表 12-4: SQLCode の戻 り 値 値 0 100 -1 意味 正常終了 取得 し よ う と し た行が見つか ら ない エ ラ ー (ス テー ト メ ン ト の実行に失敗) SQLErrText プ ロ パテ ィ や SQLDBCode プ ロ パテ ィ の値 を使用 し て詳細を参照。 SQLErrText プ ロパ テ ィ と SQLDBCode プ ロパテ ィ の使い方 192 ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト の String 型の SQLErrText プ ロ パテ ィ には、 デー タ ベー ス か ら 提供 さ れ る エ ラ ー メ ッ セージが保持 さ れてい ます。 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト の Long 型の SQLDBCode プ ロ パテ ィ には、 デー タ ベース か ら 提供 さ れ る ス テー タ ス コ ー ド が保持 さ れてい ます。 こ れ ら の変数は、 ス ク リ プ ト で参照で き ます。 PowerBuilder 第 12 章 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 例 接続が失敗 し た場合に、 メ ッ セージボ ッ ク ス で DBMS のエ ラ ー番 号 と メ ッ セージ を表示す る には、 以下の よ う に記述 し ます。 CONNECT USING SQLCA; IF SQLCA.SQLCode = -1 THEN MessageBox("SQL error " + String(SQLCA.SQLDBCode),& SQLCA.SQLErrText ) END IF デー タ ベース ト ラ ンザ ク シ ョ ンのプール ト ラ ンザク シ ョ ン プール アプ リ ケーシ ョ ンは、 デー タ ベース ト ラ ンザ ク シ ョ ン を プールす る こ と に よ っ て、 デー タ ベース の処理を最適化で き ます。 ト ラ ン ザ ク シ ョ ン を プールす る と 、デー タ ベース に接続で き る 数を制御 し なが ら 、デー タ ベー ス の処理の ス ループ ッ ト を上げ る こ と がで き ます。 ト ラ ンザ ク シ ョ ン プール を 設定す る 場合は、 ア プ リ ケーシ ョ ン は、 同 じ デー タ ベース に対す る 接続を再利用で き ます。 動作 ト ラ ン ザ ク シ ョ ン プール を 使用 し な いで ア プ リ ケーシ ョ ン がデー タ ベース に接続す る 場合、 PowerBuilder は DISCONNECT 文が実行 さ れた デー タ ベース ト ラ ンザ ク シ ョ ン を物理的に終了 さ せます。 ト ラ ンザ ク シ ョ ン プールが有効な場合、 PowerBuilder は論理的にデー タ ベー ス と の接続を解除 し て、 デー タ ベー ス に対す る 変更を コ ミ ッ ト し ま す。 し か し 、 デー タ ベー ス と の接続は物理的に解除 さ れ ま せん。 そのかわ り 、 デー タ ベースへの接続は ト ラ ンザ ク シ ョ ン プールで開い た ま ま保たれ、 ほかのデー タ ベース 操作のために再利用す る こ と がで き ます。 効果 同 じ デー タ ベー ス に対 し て短い ト ラ ン ザ ク シ ョ ン を数多 く 処理す る ア プ リ ケーシ ョ ンは、 ト ラ ンザ ク シ ョ ン プールを使用 し て、 パフ ォ ーマ ン ス を向上 さ せ る こ と がで き ます。 使い方 ト ラ ン ザ ク シ ョ ン プールを設定す る には、 SetTransPool 関数を使用 し ま す。 ア プ リ ケ ー シ ョ ン が デ ー タ ベ ー ス に 接 続 す る 前 な ら ば、 SetTransPool 関数はア プ リ ケーシ ョ ン の ス ク リ プ ト の ど こ にで も 記述 で き ま す。 SetTransPool 関数は通常、 ア プ リ ケーシ ョ ン オブジ ェ ク ト の Open イ ベン ト で呼び出 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 193 ス ト ア ド プ ロ シージ ャ を呼び出すための ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 例 以下の ス テー ト メ ン ト は、 SetTransPool 関数を使用 し て、 デー タ ベース に接続で き る ト ラ ン ザ ク シ ョ ン の数に 16 を指定 し ま す。 ま た、 一度 デー タ ベース に接続 し た ら 、DISCONNECT 文を実行 し て も デー タ ベー ス と の接続を物理的に解除 し ない ト ラ ン ザ ク シ ョ ン の数に 12 を指定 し ま す。 接続の数が最大数に到達 し た場合は、 次か ら の接続要求は、 ト ラ ン ザ ク シ ョ ン プールに接続が保持で き る よ う にな る ま で 10 秒間 待ち ます。10 秒間経過す る と 、 アプ リ ケーシ ョ ンはエ ラ ーを返 し ます。 myapp.SetTransPool (12,16,10) 詳細情報 SetTransPool 関数につい て の詳細は、 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ アルを参照 し て く だ さ い。 スト アド プ ロ シージャ を 呼び出すためのト ラ ン ザク ショ ン オブ ジェ ク ト の使い方 SQLCA は、 すべ て の PowerBuilder ア プ リ ケ ー シ ョ ン で 使用 さ れ る Transaction 型の組み込み グ ロ ーバル変数です。 ア プ リ ケ ー シ ョ ン に よ っ ては、 デー タ に特定の処理や計算を行わせ る ために、 SQLCA を カ ス タ マ イ ズ し て使用 し たい こ と があ り ます。 ご使用のデー タ ベー ス が ス ト ア ド プ ロ シージ ャ を サポー ト し て い る 場合は、ス ト ア ド プ ロ シージ ャ を処理す る ための リ モー ト ス ト ア ド プ ロ シージ ャ がすでに定義 さ れてい る こ と があ り ます。 アプ リ ケーシ ョ ン におい て、 デー タ ベー ス の ス ト ア ド プ ロ シージ ャ を 呼び出すた め に、 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト を カ ス タ マ イ ズ し て、 リ モー ト ス ト ア ド プ ロ シージ ャ を呼び出す (Remote Procedure Call、 RPC) こ と が で き ます。 結果集合 RPC テ ク ニ ッ ク を使用 し て、 ス ト ア ド プ ロ シージ ャ が返す結果集合に ア ク セ スす る こ と はで き ません。 ス ト ア ド プ ロ シージ ャ が 1 つま たは 複数の結果集合を返す場合は、PowerBuilder は結果集合を無視 し て、出 力パ ラ メ ー タ と 戻 り 値を返 し ます。 ス ト ア ド プ ロ シージ ャ が結果集合 を返す場合は、 埋め込み SQL の DECLARE Procedure 文を使用 し ます。 DECLARE Procedure 文についての詳細は、 『PowerScript リ フ ァ レ ン ス』 マニ ュ アルの 「SQL 文」 を参照 し て く だ さ い。 194 PowerBuilder 第 12 章 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 PowerBuilder アプ リ ケーシ ョ ン か ら デー タ ベース の ス ト ア ド プ ロ シー ジ ャ を呼び出すには、 その ス ト ア ド プ ロ シージ ャ を呼び出す よ う に ト ラ ンザ ク シ ョ ン オブジ ェ ク ト を カ ス タ マ イ ズ し て、PowerScript の ド ッ ト 表示 (object.function) を使用 し ます。 RPC プ ロ シージ ャの 概要 ❖ ア プ リ ケーシ ョ ンにおいてデー タ ベースのス ト ア ド プ ロ シージ ャ を呼び出す には 1 新規作成 ダ イ ア ロ グボ ッ ク ス の [PB オブジ ェ ク ト ] タ ブにおい て、 組み込み ト ラ ンザ ク シ ョ ン オブジ ェ ク ト か ら 継承 し た標準 ク ラ ス ユーザ オブジ ェ ク ト を定義 し ます。 2 ユーザ オブジ ェ ク ト ペ イ ン タ の ス ク リ プ ト ビ ュ ーで、 RPCFUNC キー ワ ー ド を使用 し て、 ス ト ア ド プ ロ シージ ャ を ユーザ オブジ ェ ク ト の外部関数ま たはサブルーチン と し て宣言 し ます。 3 ユーザ オブジ ェ ク ト を保存 し ます。 4 アプ リ ケーシ ョ ン ペ イ ン タ で、 定義済みのユーザ オブジ ェ ク ト を SQLCA の代わ り にデフ ォ ル ト グ ロ ーバル変数 と し て指定 し ます。 5 PowerBuilder アプ リ ケーシ ョ ン でそのユーザ オブジ ェ ク ト を使用 し ます。 PowerBuilder におけ る ユーザ オブジ ェ ク ト 、 アプ リ ケーシ ョ ン ペ イ ン タ 、 およ びス ク リ プト ビ ュ ーの使い方についての詳細は、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 カ ス タ ム ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の例 こ の節では、 アプ リ ケーシ ョ ン で ス ト ア ド プ ロ シージ ャ を呼び出すために、カ ス タ ム ト ラ ンザ ク シ ョ ン オブジ ェ ク ト の使い方を解説 し ます。 例では、 u_trans_database と い う 、 標準 ク ラ ス ユーザ オブジ ェ ク ト の定義 と 使い方を示 し ます。 u_trans_database ユーザ オブ ジ ェ ク ト u_trans_database ユーザ オブジ ェ ク ト は、組み込み ト ラ ンザ ク シ ョ ン オ ブジ ェ ク ト SQLCA か ら 継承 し た子孫オブジ ェ ク ト です。子孫オブジ ェ ク ト と は、 先祖オブジ ェ ク ト のプ ロ パテ ィ 、 変数、 関数、 イ ベン ト に 対す る ス ク リ プ ト を継承 し てい る オブジ ェ ク ト です。 子孫オブジ ェ ク ト は、 サブ ク ラ ス と も 呼ばれ ます。 GIVE_RAISE ス ト ア ド プ ロ シージ ャ u_trans_database ユーザ オブジ ェ ク ト は、GIVE_RAISE と い う Oracle デー タ ベース の ス ト ア ド プ ロ シージ ャ を使用 し て、 現行の給料の 5 % の昇給を計算す る のに使用 し ます。 以 下に、 GIVE_RAISE ス ト ア ド プ ロ シージ ャ を作成す る ための Oracle の 構文を示 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 195 ス ト ア ド プ ロ シージ ャ を呼び出すための ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 SQL 文の区切 り 子 Oracle の ス ト ア ド プ ロ シージ ャ を 作成す る た めの構文では、 バ ッ ク ク ォ ーテーシ ョ ン (`) 記号を SQL 文の区切 り 子 と し て使っ てい ます。 // Oracle の GIVE_RAISE 関数を作成 し ます。 // SQL 文の区切 り 子は、 ` (バ ッ ク ク ォ ーテーシ ョ ン) です。 CREATE OR REPLACE FUNCTION give_raise (salary IN OUT NUMBER) return NUMBER IS rv NUMBER; BEGIN salary := salary * 1.05; rv := salary; return rv; END; ` // 変更内容を保存 し ます。 COMMIT WORK` // エ ラ ーを チ ェ ッ ク し ます。 SELECT * FROM all_errors` ス テ ッ プ 1: 標準ク ラ ス ユーザ オブ ジ ェ ク ト の定義 ❖ 標準 ク ラ ス ユーザ オブ ジ ェ ク ト を定義するには 1 PowerBuilder を起動 し ます。 2 ス ト ア ド プ ロ シージ ャ をサポー ト するデータ ベースに接続し ます。 こ の例では、デー タ ベース サーバ上に リ モー ト ス ト ア ド プ ロ シー ジ ャ を持っ てい る Oracle デー タ ベース に接続す る も の と し ます。 PowerBuilder におけ る Oracle デー タ ベー ス と の接続お よ び Oracle の ス ト ア ド プ ロ シージ ャ の使い方についての詳細は、『デー タ ベー ス と の接続』 マニ ュ アルを参照 し て く だ さ い。 3 パ ワ ーバーの [新規作成] ボ タ ン を ク リ ッ ク す る か、 メ ニ ュ ーバー か ら [フ ァ イ ル|新規作成] を選択 し ます。 新規作成 ダ イ ア ロ グ ボ ッ ク ス が表示 さ れます。 4 196 [PB オブジ ェ ク ト ] タ ブで、[標準 ク ラ ス]ア イ コ ン を選択 し 、[OK] ボ タ ン を ク リ ッ ク し て新規の標準 ク ラ ス ユーザ オブ ジ ェ ク ト を 定義 し ます。 PowerBuilder 第 12 章 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 標準 ク ラ ス デー タ 型の選択 ダ イ ア ロ グボ ッ ク ス が表示 さ れます。 5 ユーザ オブジ ェ ク ト を継承 し たい組み込みシ ス テ ム のデー タ 型 と し て、 [デー タ 型] ボ ッ ク ス か ら [transaction] を選択 し 、 [OK] ボ タ ン を選択 し ます。 ユーザ オブジ ェ ク ト ペ イ ン タ の ワー ク スペース が表示 さ れ、 ユー ザ オブジ ェ ク ト にプ ロ パテ ィ ( イ ン ス タ ン ス変数) と 関数を設定 す る こ と がで き ます。 ス テ ッ プ 2: 外部関数 と し てのス ト ア ド プ ロ シージ ャの宣言 FUNCTION または SUBROUTINE 宣言 PowerBuilder ア プ リ ケーシ ョ ン で、 外部関数 ま たは外部サブルーチ ン と し て結果集合の な いデー タ ベー ス の ス ト ア ド プ ロ シージ ャ を 宣言 で き ます。 ス ト ア ド プ ロ シージ ャ に戻 り 値があ る 場合は、 (FUNCTION キー ワ ー ド を 使用 し て) 関数 と し て宣言 し ま す。 ス ト ア ド プ ロ シー ジ ャ に戻 り 値がないか VOID を返す場合は、 (SUBROUTINE キー ワー ド を使用 し て) サブルーチン と し て宣言 し ます。 RPCFUNC と ALIAS FOR キーワー ド 外部関数が DLL では な く 、 デー タ ベー ス の リ モー ト ス ト ア ド プ ロ シージ ャ コ ール (RPC) であ る こ と を示すために、 外部関数や外部サ ブルーチ ン の宣言で RPCFUNC キー ワ ー ド を必ず使用 し な ければな り ません。 デー タ ベース の ス ト ア ド プ ロ シージ ャ の名前 と 異な る 名前を ス ク リ プ ト で使用 し たい場合は、 ALIAS FOR"spname" 句を使用 し て、 リ モー ト ス ト ア ド プ ロ シージ ャ コ ールに名前を与え る こ と がで き ます。 ス ト ア ド プ ロ シージ ャ を リ モー ト プ ロ シージ ャ コ ール と し て宣言す る ための構文についての詳細は、 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ アルの 「関数 と イ ベン ト の呼び出 し 」 の章を参照 し て く だ さ い。 ❖ ス ト ア ド プ ロ シージ ャ をユーザ オブ ジ ェ ク ト の外部関数 と し て宣言するには 1 ア プ リ ケーシ ョ ン テ ク ニ ッ ク ユーザ オブジ ェ ク ト ペ イ ン タ の ス ク リ プ ト ビ ュ ーで、最初の リ ス ト か ら 「Declare」 を 選択 し 、 2 番目の リ ス ト か ら 「Local External Funcions」 を選択 し ます。 197 ス ト ア ド プ ロ シージ ャ を呼び出すための ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 2 カ ー ソ ル を ロ ー カ ル外部関数の宣言 ビ ュ ーに置 き ま す。 ポ ッ プ ア ッ プ メ ニ ュ ーま たは [編集] メ ニ ュ ーか ら 、 [形式を指定 し て貼 り 付け| SQL | リ モー ト ス ト ア ド プ ロ シージ ャ ] を選択 し ます。 デー タ ベース か ら ス ト ア ド プ ロ シージ ャ が ロ ー ド さ れ、 リ モー ト ス ト ア ド プ ロ シージ ャ ダ イ ア ロ グボ ッ ク ス が表示 さ れ ます。 ダ イ ア ロ グ ボ ッ ク ス には、 現行のデー タ ベー ス に あ る ス ト ア ド プ ロ シージ ャ 名の リ ス ト が表示 さ れ ます。 3 ユーザ オブジェ ク ト の関数と し て宣言する ス ト ア ド プロ シージャ を 1 つま たは複数選択 し 、 [OK] ボ タ ン を選択 し ます。 PowerBuilder は、 デー タ ベー ス か ら ス ト ア ド プ ロ シージ ャ の宣言 を取 り 出 し 、 各宣言を ビ ュ ーに貼 り 付け ます。 た と えば、 sp_addlanguage を選択 し た場合には、 1 行に表示 さ れ る 宣言は次の よ う にな り ます。 function long sp_addlanguage() RPCFUNC ALIAS FOR "dbo.sp_addlanguage" 4 必要であれば、 アプ リ ケーシ ョ ン に対す る ス ト ア ド プ ロ シージ ャ の宣言を編集す る こ と がで き ます。 外部関数 ま たは外部サブルーチ ン と し て、 デー タ ベー ス の リ モー ト ス ト ア ド プ ロ シージ ャ コ ール (RPC) を宣言す る 場合は、 以下 の 構 文 の い ず れ か を 使 用 し ま す (構 文 に つ い て の 詳 細 は、 『PowerScript リ フ ァ レ ン ス 』 マニ ュ アルを参照 し て く だ さ い)。 FUNCTION rtndatatype functionname ( { { REF } datatype1 arg1, ..., { REF } datatypen argn } ) RPCFUNC { ALIAS FOR "spname" } SUBROUTINE functionname ( { { REF } datatype1 arg1 , ..., { REF } datatypen argn } ) RPCFUNC { ALIAS FOR "spname" } 以下に、 sp_addlanguage に対す る RPC 関数の宣言を編集 し た も の を示 し ます。 198 PowerBuilder 第 12 章 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 FUNCTION long sp_addlanguage() RPCFUNC ALIAS FOR "addlanguage_proc" ス テ ッ プ 3: ユーザ オブ ジ ェ ク ト の保存 ❖ ユーザ オブ ジ ェ ク ト を保存するには 1 ユーザ オブジ ェ ク ト ペ イ ン タ で、 [保存] ボ タ ン を選択す る か、 メ ニ ュ ーバーか ら [フ ァ イ ル|名前を付けて保存] を選択 し ます。 ユーザオブジ ェ ク ト の保存 ダ イ ア ロ グボ ッ ク ス が表示 さ れ ます。 2 ユーザ オブジ ェ ク ト の名前を指定 し 、 そのユーザ オブジ ェ ク ト に ついての コ メ ン ト を記述 し 、 ユーザ オブジ ェ ク ト を保存す る ラ イ ブ ラ リ を指定 し ます。 3 [OK] ボ タ ン を選択 し て、 ユーザ オブジ ェ ク ト を保存 し ます。 ユーザ オブジ ェ ク ト は、 指定 し た名前で選択 し た ラ イ ブ ラ リ に保 存 さ れ ます。 ス テ ッ プ 4: SQLCA に対するデ フ ォル ト のグ ローバル変数の型の指定 ア プ リ ケ ー シ ョ ン ペ イ ン タ で、 定 義 し た ユ ー ザ オ ブ ジ ェ ク ト を SQLCA に対す る デフ ォ ル ト グ ロ ーバル変数の型 と し て指定 し な けれ ばな り ません。 こ れに よ り 、 アプ リ ケーシ ョ ン を実行す る と 、 組み込 みシ ス テ ム ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト の代わ り にその標準 ク ラ ス ユーザ オブジ ェ ク ト がデフ ォ ル ト ト ラ ンザ ク シ ョ ン オブジ ェ ク ト と し て使用 さ れます。 SQLCA の代わ り に独自の ト ラ ンザク シ ョ ン オブ ジ ェ ク ト を使用 こ のプ ロ シージ ャ では、 ア プ リ ケーシ ョ ン でデ フ ォ ル ト ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト SQLCA を使用す る も の と し てい ますが、 独自の ト ラ ンザ ク シ ョ ン オブジ ェ ク ト の イ ン ス タ ン ス を宣言 し て作成 し 、 そ の後、ユーザ オブジ ェ ク ト を ト ラ ンザ ク シ ョ ン オブジ ェ ク ト のプ ロ パ テ ィ と し て呼び出す こ と も 可能です。 詳細については、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルの 「ユーザ オブジ ェ ク ト 」 の章を参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 199 ス ト ア ド プ ロ シージ ャ を呼び出すための ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 ❖ SQLCA に対するデ フ ォル ト グローバル変数の型を指定するには 1 パ ワ ーバーの [開 く ] ボ タ ン を ク リ ッ ク す る か、 メ ニ ュ ーバーか ら [フ ァ イ ル|開 く ] を選択 し ます。 開 く ダ イ ア ロ グボ ッ ク ス が表示 さ れ ます。 2 [オブジ ェ ク ト の種類] ド ロ ッ プダ ウ ン リ ス ト ボ ッ ク ス か ら [アプ リ ケーシ ョ ン] を選択 し ます。 新規のユーザ オブジ ェ ク ト を使用 し たい ア プ リ ケーシ ョ ン を選択 し て、 [OK] ボ タ ン を ク リ ッ ク し ます。 アプ リ ケーシ ョ ン ペ イ ン タ ワ ー ク スペース が表示 さ れます。 3 プ ロ パテ ィ ビ ュ ーで [全般] タ ブ を選択 し ます。 [付加的なプ ロ パ テ ィ ] ボ タ ン を ク リ ッ ク し ます。 アプ リ ケーシ ョ ン ダ イ ア ロ グボ ッ ク ス が表示 さ れ ます。 200 4 [変数の型] タ ブ を選択 し て、 [変数の型] プ ロ パテ ィ ページ を表 示 し ます。 5 テ キ ス ト ボ ッ ク ス に、 ス テ ッ プ 1 か ら 3 ま でで定義 し た標準 ク ラ ス ユーザ オブジ ェ ク ト の名前を指定 し ます。 6 [OK] ボ タ ン か、 [更新] ボ タ ン を選択 し ます。 PowerBuilder 第 12 章 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 アプ リ ケーシ ョ ン を実行す る と 、 組み込みシ ス テ ム オブジ ェ ク ト の代わ り に、 そ の シ ス テ ム オ ブ ジ ェ ク ト を 継承 し た標準 ク ラ ス ユーザ オブジ ェ ク ト が使用 さ れます。 ス テ ッ プ 5: ア プ リ ケーシ ョ ン でユーザ オブ ジ ェ ク ト を使用する こ れま でに行っ た こ と 先の操作手順では、 標準 ク ラ ス ユーザ オブジ ェ ク ト u_trans_database の外部関数 と し て リ モー ト ス ト ア ド プ ロ シー ジ ャ GIVE_RAISE を定義 し ま し た。 次に、 SQLCA に対す る デフ ォ ル ト グ ロ ーバル変数の型 と し て、 u_trans_database を指定 し ま し た。 こ れで、 PowerBuilder アプ リ ケーシ ョ ンは、 ユーザ オブジ ェ ク ト 内にカプセル 化 さ れたプ ロ パテ ィ と 関数にア ク セ ス で き ます。 こ の後に行 う こ と 次は、こ のユーザ オブジ ェ ク ト に ス ト ア ド プ ロ シー ジ ャ を実行 さ せ る ス ク リ プ ト を記述す る 必要があ り ます。 アプ リ ケーシ ョ ンの ス ク リ プ ト で、 ユーザ オブジ ェ ク ト で定義 し た ス ト ア ド プ ロ シージ ャ 関数 を 呼び出すには、 ほかの PowerBuilder オブ ジ ェ ク ト と 同様に SQLCA に対 し て、 PowerScript の ド ッ ト (.) 表記を 使用 し ます。 ド ッ ト (.) 表記の構文は以下の と お り です。 object.function ( arguments ) た と えば、 以下の記述で、 GIVE_RAISE ス ト ア ド プ ロ シージ ャ を呼び出 す こ と がで き ます。 SQLCA.give_raise(salary) ❖ ア プ リ ケーシ ョ ン でユーザ オブ ジ ェ ク ト を使用するには 1 ス ク リ プ ト を記述す る オブジ ェ ク ト ま たは コ ン ト ロ ールを選択 し ます。 2 ス ク リ プ ト を記述 し たい イ ベン ト を選択 し ます。 ス ク リ プ ト ビ ュ ーの使い方については、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 3 アプ リ ケーシ ョ ン で ス ト ア ド プ ロ シージ ャ に よ る 処理を行 う ため に、 ユーザ オブジ ェ ク ト を用いた ス ク リ プ ト を記述 し ます。 以下の例は、 Oracle デー タ ベース に接続 し 、 GIVE_RAISE ス ト ア ド プ ロ シージ ャ を呼び出 し て、昇給額を計算 し 、昇給後の給料を メ ッ セージ ボ ッ ク ス に表示 し てか ら 、 デー タ ベー ス と の接続を解除 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 201 ス ト ア ド プ ロ シージ ャ を呼び出すための ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 // ト ラ ンザク シ ョ ン オブ ジ ェ ク ト のプ ロパテ ィ を設定 し ます。 SQLCA.DBMS="OR7" SQLCA.LogID="scott" SQLCA.LogPass="xxyyzz" SQLCA.ServerName="@t:oracle:testdb" SQLCA.DBParm="sqlcache=24,pbdbms=1" // Oracle デー タ ベースに接続 し ます。 CONNECT USING SQLCA; // エ ラ ーを チ ェ ッ ク し ます。 IF SQLCA.sqlcode <> 0 THEN MessageBox (" 接続エ ラ ー ",SQLCA.SQLErrText) return END IF // 現在の給料 と し て 2,000,000 を設定 し ます。 DOUBLE val = 2000000 DOUBLE rv // // // // rv GIVE_RAISE ス ト ア ド プ ロ シージ ャ を 呼び出 し 、 昇給額を計算 し ます。 ス ト ア ド プ ロ シージ ャ を呼び出すのに ド ッ ト (.) 表記を 使用 し ます。 = SQLCA.give_raise(val) // メ ッ セージボ ッ ク スに昇給後の給料を表示 し ます。 MessageBox(" 新 し い給与額は ",string(rv)) // Oracle デー タ ベース と の接続を解除 し ます。 DISCONNECT USING SQLCA; 4 ス ク リ プ ト を コ ンパ イ ル し て、 変更内容を保存 し ます。 エ ラ ー チ ェ ッ クの使い方 実際 の ス ク リ プ ト で は、 CONNECT 文や DISCONNECT 文 の実行後 と GIVE_RAISE プ ロ シージ ャ を呼び出 し た後に、 エ ラ ーのチ ェ ッ ク をす る べ き です。 詳細については、 192 ページの 「SQL 文実行後のエ ラ ー処 理」 を参照 し て く だ さ い。 202 PowerBuilder 第 12 章 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 ス ト ア ド プ ロ シージ ャ を呼び出す と きサポー ト さ れてい る DBMS の機能 アプ リ ケーシ ョ ン で、 リ モー ト ス ト ア ド プ ロ シージ ャ を呼び出すため に、 カ ス タ ム ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト を定義 し て使用す る 場 合、 アプ リ ケーシ ョ ンが接続す る DBMS に よ っ てサポー ト さ れ る 機能 が異な り ます。 こ の節では、 PowerBuilder か ら ア ク セ ス で き る DBMS に応 じ てサポー ト さ れてい る 機能の違い を解説 し ま す。 PowerBuilder アプ リ ケーシ ョ ン で RPC テ ク ニ ッ ク を使用す る 場合は、 使用 し てい る DBMS に関す る 項目を参照 し て、 で き る こ と と で き ない こ と を確認 し て く だ さ い。 結果集合 リ モー ト ス ト ア ド プ ロ シージ ャ を呼び出 し て、ス ト ア ド プ ロ シージ ャ が返す結果集合にア ク セ スす る こ と はで き ません。 ス ト ア ド プ ロ シー ジ ャ が 1 つ以上の結果集合を返す場合、 PowerBuilder は結果集合を無 視 し て、 出力パ ラ メ ー タ と 戻 り 値を返 し ます。 ス ト ア ド プ ロ シ ー ジ ャ が結果集合 を 返す場合は、 埋め込み SQL の DECLARE Procedure 文を使用 し ます。 DECLARE Procedure 文についての 詳細は、 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ アルの 「SQL 文」 を参照 し て く だ さ い。 Informix アプ リ ケーシ ョ ンが Informix デー タ ベース に接続す る 場合は、 配列以 外のデー タ 型が使用で き ます。 なお、 Blob (Binary Large Object) 型は 使用で き ません。 ODBC アプ リ ケーシ ョ ンが ODBC デー タ ソ ース に接続す る 場合は、ODBC ド ラ イ バがサ ポー ト し て いれば、 以下の ODBC の機能が使用で き ま す (詳細については、 使用 し てい る ODBC ド ラ イ バのマニ ュ アルを参照 し て く だ さ い)。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 203 ス ト ア ド プ ロ シージ ャ を呼び出す と きサポー ト さ れている DBMS の機能 • 表 12-5 に IN、 OUT、 IN OUT の各パ ラ メ ー タ を示 し ます。 表 12-5: ODBC の IN、 OUT、 IN OUT の各パラ メ ー タ パラ メ ー タ IN (入力) OUT (出力) IN OUT (入力 / 出力) Oracle 結果 IN 変数は値に よ っ て渡 さ れ る 。 プ ロ シージ ャ には値が 渡される OUT 変数は参照に よ っ て渡 さ れ る 。 プ ロ シージ ャ は、 渡 さ れた PowerScript 変数の内容を変更で き る 。 こ のパ ラ メ ー タ には、PowerScript の REF キーワー ド を指定す る IN OUT 変数は参照に よ っ て渡 さ れ る 。プ ロ シージ ャ は 渡 さ れた値の参照 と 、 PowerScript 変数の内容の変更が で き る 。 こ のパ ラ メ ー タ には、 PowerScript の REF キー ワー ド を指定する • パ ラ メ ー タ と し ての Blob デー タ 。 Blob デー タ は、 32,512 バ イ ト ま で使用で き ます。 • Integer 型の リ タ ーン コ ー ド ア プ リ ケーシ ョ ン が Oracle デー タ ベー ス に接続す る 場合は、 以下の Oracle PL/SQL の機能が使用で き ます。 • 表 12-6 に IN、 OUT、 IN OUT の各パ ラ メ ー タ を示 し ます。 表 12-6: Oracle の IN、 OUT、 IN OUT の各パラ メ ー タ パラ メ ー タ IN (入力) OUT (出力) IN OUT (入力 / 出力) 204 結果 IN 変数は値に よ っ て渡 さ れ る 。 プ ロ シージ ャ には値が 渡される OUT 変数は参照に よ っ て渡 さ れ る 。 プ ロ シージ ャ は、 渡 さ れた PowerScript 変数の内容を変更で き る 。 こ のパ ラ メ ー タ には、PowerScript の REF キーワー ド を指定す る IN OUT 変数は参照に よ っ て渡 さ れ る 。プ ロ シージ ャ は 渡 さ れた値の参照 と 、 PowerScript 変数の内容の変更が で き る 。 こ のパ ラ メ ー タ には、 PowerScript の REF キー ワー ド を指定する • パ ラ メ ー タ と し ての Blob デー タ 。 Blob デー タ は、 32,512 バ イ ト ま で使用で き ます。 • パ ラ メ ー タ と し ての PL/SQL テーブル。 PowerScript の配列が使用 で き ます。 • 関数の リ タ ーン コ ー ド PowerBuilder 第 12 章 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の使い方 Microsoft SQL Server または Sybase Adaptive Server Enterprise アプ リ ケーシ ョ ンが Microsoft SQL Server ま たは Sybase Adaptive Server Enterprise のデー タ ベース に接続 さ れた場合には、 以下の Transact-SQL 機能を使用で き ます。 表 12-7 に IN、 OUT、 IN OUT の各パ ラ メ ー タ を示 し ます。 • 表 12-7: Adaptive Server Enterprise および Microsoft SQL Server の IN、 OUT、 IN OUT の各パラ メ ー タ パラ メ ー タ IN (入力) 結果 IN 変数は値に よ っ て渡 さ れ る 。 プ ロ シージ ャ には値が 渡される OUT (出力) OUT 変数は参照に よ っ て渡 さ れ る 。 プ ロ シージ ャ は、 渡 さ れた PowerScript 変数の内容を変更で き る 。 こ のパ ラ メ ー タ には、PowerScript の REF キーワー ド を指定す る IN OUT (入力 IN OUT 変数は参照に よ っ て渡 さ れ る 。プ ロ シージ ャ は / 出力) 渡 さ れた値の参照 と 、 PowerScript 変数の内容の変更が で き る 。 こ のパ ラ メ ー タ には、 PowerScript の REF キー ワ ー ド を指定する Adaptive Server Anywhere • パ ラ メ ー タ と し ての Blob デー タ 。 Blob デー タ は、 32,512 バ イ ト ま で使用で き ます。 • Integer 型の リ タ ーン コ ー ド ア プリ ケ ーショ ン が Adaptive Server Anywhere のデータ ベース に接続さ れた場合には、 以下の Adaptive Server Anywhere 機能を 使用でき ま す。 表 12-8 に IN、 OUT、 IN OUT の各パ ラ メ ー タ を示 し ます。 • 表 12-8: Adaptive Server Anywhere の IN、 OUT、 IN OUT の各パラ メ ー タ パラ メ ー タ IN (入力) 結果 IN 変数は値に よ っ て渡 さ れ る 。 プ ロ シージ ャ には値が 渡される OUT (出力) OUT 変数は参照に よ っ て渡 さ れ る 。 プ ロ シージ ャ は、 渡 さ れた PowerScript 変数の内容を変更で き る 。 こ のパ ラ メ ー タ には、PowerScript の REF キーワー ド を指定す る IN OUT (入力 IN OUT 変数は参照に よ っ て渡 さ れ る 。プ ロ シージ ャ は / 出力) 渡 さ れた値の参照 と 、 PowerScript 変数の内容の変更が で き る 。 こ のパ ラ メ ー タ には、 PowerScript の REF キー ワ ー ド を指定する • ア プ リ ケーシ ョ ン テ ク ニ ッ ク パ ラ メ ー タ と し ての Blob デー タ 。 Blob デー タ は、 32,512 バ イ ト ま で使用で き ます。 205 ス ト ア ド プ ロ シージ ャ を呼び出す と きサポー ト さ れている DBMS の機能 206 PowerBuilder 第 1 3 章 PowerBuilder XML サービ スの 使い方 こ の章について こ の章では、PowerBuilder の XML サービ ス の概要について説明 し ます。 PowerBuilder ド キ ュ メ ン ト オブジ ェ ク ト モデル (PBDOM: PowerBuilder Document Object Model) と 、 そ れ を PowerBuilder ア プ リ ケーシ ョ ン で使 う 方法について説明 し ます。 内容 項目 XML と PowerBuilder について PBDOM について PBDOM オブジ ェ ク ト 階層 PBDOM ノ ー ド オブジ ェ ク ト ラ イ ブ ラ リ 探索パ スへの pbdom90J.pbd の追加 PBDOM の使い方 PBDOM 例外の処理 XML 名前空間 ページ 207 208 209 210 226 227 233 235 XML と PowerBuilder について PowerBuilder には、 Extensible Markup Language (XML) を 扱 う た めの機能がい く つかあ り ます。以下の こ と を行 う こ と がで き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク • デー タ ウ ィ ン ド ウ オブジ ェ ク ト 内のデー タ を XML にエ ク ス ポー ト し 、 XML ド キ ュ メ ン ト 内のデー タ 、 ま た は文字列 を デー タ ウ ィ ン ド ウ オブジ ェ ク ト に イ ン ポー ト す る • PowerScript 関数の XMLParseFile と XMLParseString を使用 し て、 XML ド キ ュ メ ン ト や文字列が well-formed (整形式) であ る か、 あ る いは ス キーマや DTD に準拠 し てい る か を判断す る • XML ド キ ュ メ ン ト の作成お よ び処理を行 う アプ リ ケーシ ョ ン と コ ン ポーネ ン ト を作成す る 207 PBDOM について XML の概要 と 、デー タ ウ ィ ン ド ウ のエ ク ス ポー ト 機能 と イ ン ポー ト 機 能の詳細については、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルの 「XML デー タ のエ ク ス ポー ト と イ ン ポー ト 」 の章を参照 し て く だ さ い。 XML パーサ関数については、 オ ン ラ イ ン ヘルプの解説を参照 し て く だ さ い。 こ の章では、 PowerBuilder ド キ ュ メ ン ト オブジ ェ ク ト モデルを使用 し て XML ド キ ュ メ ン ト を作成お よ び処理す る 方法について説明 し ます。 PBDOM について PBDOM は、 PowerBuilder に実装 し てい る ド キ ュ メ ン ト オブジ ェ ク ト モデル (DOM: Document Object Model) です。 DOM は、 XML ド キ ュ メ ン ト への ア ク セ ス と 操作の方法 を 定義す る プ ロ グ ラ ミ ン グ イ ン タ フ ェ ース です。 PBDOM は、 World Wide Web コ ン ソ ーシ ア ム (W3C) DOM API の実装 ではあ り ませんが、 それ と よ く 似てい ます。 PBDOM PowerBuilder API を使用 し て、 PowerScript コ ー ド 内か ら 標準形式 XML の読み書 き や操 作を行 う こ と がで き ます。 PBDOM は、 XML ド キ ュ メ ン ト を相互関連 オブジ ェ ク ト の集合 と し て表現 し 、 ま た、 各オブジ ェ ク ト の用途 と 機 能を直観的に示す方法を提供 し てい ます。 PBDOM は、 XML フ ァ イ ル用の Java ベース の ド キ ュ メ ン ト オブジ ェ ク ト モデルであ る JDOM と も 似てい ます。 W3C DOM オブジ ェ ク ト と JDOM オブジ ェ ク ト 、 お よ び階層について は、 それぞれの仕様を参照 し て く だ さ い。 W3C DOM 仕様は http://www.w3.org/DOM/ か ら 入手で き ます。 JDOM 仕様お よ びその仕様 への リ ン ク は、 http://www.jdom.org/docs/ に掲載 さ れてい ます。 PBDOM を使用 し た アプ リ ケーシ ョ ン では、既存の XML ド キ ュ メ ン ト を解析 し た り 、 外部要求への応答の中やビ ジネ ス ロ ジ ッ ク の一部 と し て含まれてい る 情報を抽出す る こ と がで き ます。アプ リ ケーシ ョ ンは、 ほかのアプ リ ケーシ ョ ン、 プ ロ セ ス、 ま たはシ ス テ ム が要求す る タ イ プか ス キーマに合致す る XML ド キ ュ メ ン ト を作成す る こ と も で き ま す。 XML 文字列を直接編集す る かわ り に、 オブジ ェ ク ト の PBDOM ツ リ ーを操作 し た り と 変換す る こ と に よ り 、 既存の XML ド キ ュ メ ン ト の読み込み と 修正が行え ます。 208 PowerBuilder 第 13 章 PowerBuilder XML サービ スの使い方 多層 ア プ リ ケ ー シ ョ ン で使用す る XML ド キ ュ メ ン ト 、 ま た は Web サービ ス の一部 と し ての XML ド キ ュ メ ン ト を作成 ま たは処理す る コ ン ポーネ ン ト も 作成で き ます。 ノード ツリー PBDOM は、 親 ノ ー ド と 子 ノ ー ド で構成 さ れ る ツ リ ービ ュ ー モデルに 従っ て、 XML ド キ ュ メ ン ト と 対話 し ます。 ド キ ュ メ ン ト 要素は、 XML ド キ ュ メ ン ト の最上レベルの ノ ー ド を表 し ます。 ド キ ュ メ ン ト 要素の それぞれの子 ノ ー ド には、 ツ リ ーの分岐を表す 1 つ以上の子 ノ ー ド が あ り ま す。 ツ リ ー内の ノ ー ド には、 PBDOM ク ラ ス の メ ソ ッ ド を使っ て ア ク セ ス で き ます。 XML パーサ PBDOM XML パーサ を使用 し て、 XML ド キ ュ メ ン ト を ロ ー ド お よ び 解析 し た り 、ユーザ指定の DOM ノ ー ド に基づいた XML ド キ ュ メ ン ト を生成 し た り し ます。 PBDOM には、 ノ ー ド ツ リ ー内での移動、 ノ ー ド と 属性値 (存在す る 場合)へのア ク セ ス、ノ ー ド の挿入 と 削除を行 う ためのすべての メ ソ ッ ド が用意 さ れてい ます。 ま た、 ノ ー ド ツ リ ーを ほかのシ ス テ ム で使用 す る ために XML ド キ ュ メ ン ト を変換す る 際に必要な メ ソ ッ ド も 用意 さ れてい ます。 PBDOM オブ ジ ェ ク ト 階層 次の図に、 PBDOM オブジ ェ ク ト 階層を示 し ます。 図 13-1: PBDOM オブ ジ ェ ク ト 階層 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 209 PBDOM ノ ー ド オブ ジ ェ ク ト PBDOM_OBJECT と その子孫 PBDOM_BUILDER XML ノ ー ド を 表 す PBDOM オ ブ ジ ェ ク ト の 基 本 ク ラ ス で あ る PBDOM_OBJECT は、 PowerBuilder NonVisualObject ク ラ ス か ら 継承 し ます。 各 ノ ー ド タ イ プは、 PBDOM ク ラ ス に よ り 表 さ れ ます。 こ の ク ラ ス の メ ソ ッ ド を使用 し て PBDOM ノ ー ド ツ リ ー内のオブジ ェ ク ト に ア ク セ ス し ま す。 PBDOM_OBJECT と そ の 子 孫 に つ い て は、 次 の 「 PBDOM ノ ード オブジ ェ ク ト 」 で説明 し ます。 XML ノ ー ド タ イ プに ついては、『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルの 「XML デー タ のエ ク ス ポー ト と イ ン ポー ト 」 の章で も 説明 し てい ます。 PBDOM_BUILDER ク ラ ス も NonVisualObject か ら 継承 し ます。 こ の ク ラ ス は、 文字列、 フ ァ イ ル、 デー タ ス ト ア な ど各種の XML 入力元か ら PBDOM_DOCUMENT を 作成す る フ ァ ク ト リ ク ラ ス と し て機能 し ます。 PBDOM_DOCUMENT を最初から作成する 既存の XML ソ ース を使用せずに PBDOM_DOCUMENT を作成す る に は、 PBDOM_DOCUMENT NewDocument メ ソ ッ ド を使用 し ます。 PBDOM_EXCEPTION PBDOM_EXCEPTION ク ラ ス は、 PowerBuilder Exception ク ラ ス か ら 継 承 し ま す。 こ の ク ラ ス は、 PBDOM ア プ リ ケーシ ョ ン で例外が発生 し た と き に定義済み例外 コ ー ド を返す メ ソ ッ ド を持つ Exception ク ラ ス を拡張 し ます。 こ の ク ラ ス の詳細については、 233 ページの 「PBDOM 例外の処理」 を参照 し て く だ さ い。 PBDOM ノ ー ド オブ ジ ェ ク ト こ の節では、 PBDOM_OBJECT ク ラ ス と 、 その ク ラ ス を継承す る すべ ての ク ラ ス について説明 し ます。 210 • PBDOM_OBJECT • PBDOM_DOCUMENT • PBDOM_DOCTYPE • PBDOM_ELEMENT • PBDOM_ATTRIBUTE • PBDOM_ENTITYREFERENCE • PBDOM_CHARACTERDATA • PBDOM_TEXT PowerBuilder 第 13 章 PowerBuilder XML サービ スの使い方 • PBDOM_CDATA • PBDOM_COMMENT • PBDOM_PROCESSINGINSTRUCTION PBDOM ク ラ ス の メ ソ ッ ド 詳細については、 『PowerBuilder エ ク ス テ ン シ ョ ン リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 PBDOM_OBJECT PBDOM_OBJECT ク ラ ス は、XML ノ ー ド ツ リ ー内の ノ ー ド を表 し 、特 定の ノ ー ド タ イ プ を表す専用 PBDOM ク ラ ス の基本 ク ラ ス と し て機能 し ます。 PBDOM_OBJECT に対応す る DOM ク ラ ス は ノ ー ド オブジ ェ ク ト です。 PBDOM_OBJECT には、 派生 ク ラ ス に必要な基本機能がす べて含ま れ ます。 ノ ー ド は、 要素 ノ ー ド 、 ド キ ュ メ ン ト ノ ー ド 、 ま た は、 上記の PBDOM_OBJECT か ら 派生 し た任意の ノ ー ド タ イ プです。 メソッド PBDOM_OBJECT 基本 ク ラ ス には以下の メ ソ ッ ド があ り ます。 • AddContent、 GetContent、 InsertContent、 RemoveContent、 お よ び SetContent では、 PBDOM_OBJECT の子を操作で き る • Clone では、 PBDOM_OBJECT の簡易 ク ロ ーン か詳細 ク ロ ーン を作 成で き る • Detach では、 PBDOM_OBJECT を その親か ら デ タ ッ チす る • Equals では、別の PBDOM_OBJECT と 同等であ る こ と を テス ト する • GetName と SetName では、 PBDOM_OBJECT の名前の取得 と 設定 を行 う • GetObjectClass と GetObjectClassString では、 PBDOM_OBJECT の ク ラ ス を識別す る • • GetOwnerDocumentObject では、 現行の PBDOM_OBJECT のオーナ PBDOM_DOCUMENT を識別す る GetParentObject と SetParentObject では、 PBDOM_OBJECT の親の取 得 と 設定を行 う • GetText、 GetTextNormalize、 お よ び GetTextTrim では、 PBDOM_OBJECT のテ キ ス ト デー タ を取得す る • HasChildren では、PBDOM_OBJECT に子があ る かど う かを 判断する • IsAncestorObjectOf では、PBDOM_OBJECT が別の PBDOM_OBJECT の先祖か ど う か を判断す る ア プ リ ケーシ ョ ン テ ク ニ ッ ク 211 PBDOM ノ ー ド オブ ジ ェ ク ト PBDOM_OBJECT 継 承 PBDOM_OBJECT ク ラ ス は、 直接 イ ン ス タ ン ス化お よ び使用す る こ と が前提 と さ れない点で、 C++ の仮想 ク ラ ス に似てい ま す。 た と えば、 PowerScript の CREATE 文を使用 し て PBDOM_OBJECT を作成で き ます が、 その メ ソ ッ ド を直接使 う こ と はで き ません。 PBDOM_OBJECT pbdom_obj pbdom_obj = CREATE PBDOM_OBJECT pbdom_obj.SetName("VIRTUAL_PBDOM_OBJ") // 例外 ! 上の コ ー ド の 3 行目は、 基本 ク ラ ス PBDOM_OBJECT の SetName メ ソ ッ ド に直接ア ク セ ス し よ う と す る ので、 例外を送出 し ます。 ただ し 、 SetName メ ソ ッ ド が PBDOM_ELEMENT な ど の派生 ク ラ ス か ら ア ク セ ス さ れ る 場合には、 こ の よ う な実装の仕方 も あ り え ます。 PBDOM_OBJECT pbdom_obj pbdom_obj = CREATE PBDOM_ELEMENT pbdom_obj.SetName ("VIRTUAL_PBDOM_OBJ") プ レースホルダ と し て の基本 ク ラ ス PBDOM_OBJECT の 使い方 PBDOM_OBJECT ク ラ ス を、 派生 ク ラ ス のオブジ ェ ク ト のプ レー ス ホ ルダ と し て使用で き ます。 PBDOM_DOCUMENT pbdom_doc PBDOM_OBJECT pbdom_obj pbdom_doc = CREATE PBDOM_DOCUMENT pbdom_doc.NewDocument ("", "", & "Root_Element_From_Doc_1", "", "") pbdom_obj = pbdom_doc.GetRootElement pbdom_obj.SetName & ("Root_Element_From_Doc_1_Now_Changed") イ ン ス タ ン ス化 さ れた PBDOM_OBJECT pbdom_obj は、 PBDOM_DOCUMENT オブジェ ク ト に割り 当てら れま す。 こ のオブジェ ク ト には、 GetRootElement メ ソ ッ ド の戻 り 値が格納 さ れ ます。 こ こ で、 pbdom_obj は、 PBDOM_ELEMENT への参照を保持 し 、 ま た、 PBDOM_OBJECT か ら 派生 し た ク ラ ス の任意のオブジ ェ ク ト に対 し て 有効に動作 し ます。 ス タ ン ド ア ロ ン オブ ジェク ト PBDOM_OBJECT は、 すべての ド キ ュ メ ン ト や親の PBDOM_OBJECT か ら 独立 し た自己完結型のオブジ ェ ク ト を作成で き ます。 こ の よ う な PBDOM_OBJECT を ス タ ン ド ア ロ ン オブジ ェ ク ト と 呼びます。 た と え ば、 次の よ う にな り ます。 PBDOM_ELEMENT pbdom_elem_1 pbdom_elem_1 = Create PBDOM_ELEMENT pbdom_elem_1.SetName("pbdom_elem_1") 212 PowerBuilder 第 13 章 PowerBuilder XML サービ スの使い方 pbdom_elem_1 は、 Create キー ワ ー ド を使用 し て派生 ク ラ ス PBDOM_ELEMENT 内で イ ン ス タ ン ス化 さ れます。 次に、 ど の ド キ ュ メ ン ト 内に も 含まれない ス タ ン ド ア ロ ン オブジ ェ ク ト であ る pbdom_elem_1 オブジ ェ ク ト か ら 、 SetName メ ソ ッ ド を呼び出す こ と が で き ます。 ス タ ン ド ア ロ ン オブ ジ ェ ク ト は有効な PBDOM 操作 を 実行で き ま す が、 ス タ ン ド ア ロ ン で あ る こ と に よ っ てそのオブジ ェ ク ト に特別な メ リ ッ ト ま たはデ メ リ ッ ト があ る わけではあ り ません。 親がオーナのオブ ジ ェ ク ト および ド キ ュ メ ン ト がオーナのオブ ジ ェ クト 次の例の よ う に、 PBDOM_OBJECT を別の ス タ ン ド ア ロ ン PBDOM_OBJECT に追加す る こ と に よ り 、 PBDOM_OBJECT に親 ク ラ ス を割 り 当て る こ と がで き ます。 PBDOM_ELEMENT pbdom_elem_1 PBDOM_ELEMENT pbdom_elem_2 pbdom_elem_1 = Create PBDOM_ELEMENT pbdom_elem_2 = Create PBDOM_ELEMENT pbdom_elem_1.SetName("pbdom_elem_1") pbdom_elem_2.SetName("pbdom_elem_2") pbdom_elem_1.AddContent(pbdom_elem_2) 2 つの PBDOM_ELEMENT オブジ ェ ク ト pbdom_elem_1 と pbdom_elem_2 が イ ン ス タ ン ス化 さ れます。 pbdom_elem_2 オブジェ ク ト は、 AddContent メ ソ ッ ド を使用 し て、 pbdom_elem_1 の子オブジ ェ ク ト と し て追加 さ れます。 こ の例では、 pbdom_elem_1 と pbdom_elem_2 のいずれ も 、 オーナは ド キ ュ メ ン ト ではあ り ません。 ま た、 pbdom_elem_1 オブジ ェ ク ト は ス タ ン ド ア ロ ン の ま ま です。 pbdom_elem_1 に、 ド キ ュ メ ン ト を オーナ と す る 親の PBDOM_OBJECT が割 り 当て ら れた場合、 pbdom_elem_1 は ス タ ン ド ア ロ ン オブジ ェ ク ト ではな く な り ます。 PBDOM_DOCUMENT PBDOM_DOCUMENT ク ラ ス は、 PBDOM_OBJECT か ら 派生 し 、 XML DOM ド キ ュ メ ン ト を表 し ます。 PBDOM_DOCUMENT メ ソ ッ ド では、 ルー ト 要素、 処理命令な ど の ド キ ュ メ ン ト レベル情報にア ク セ ス で き ます。 メソッド PBDOM_OBJECT か ら 継承す る メ ソ ッ ド に加え、PBDOM_DOCUMENT ク ラ ス には以下の メ ソ ッ ド があ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 213 PBDOM ノ ー ド オブ ジ ェ ク ト • DetachRootElement、 GetRootElement、 HasRootElement、 お よ び SetRootElement では、 PBDOM_DOCUMENT のルート 要素を 操作する • GetDocType と SetDocType では、XML ド キ ュ メ ン ト の DOCTYPE 宣 言を取得お よ び設定す る • NewDocument では、 新規の PBDOM_DOCUMENT を最初か ら 作成 する • SaveDocument では、 PBDOM_DOCUMENT 内の DOM ツ リ ーの内 容を フ ァ イ ルに保存す る PBDOM_DOCTYPE PBDOM_DOCTYPE ク ラ ス は、 XML DOM ド キ ュ メ ン ト の ド キ ュ メ ン ト 型宣言オブジ ェ ク ト を表 し ま す。 PBDOM_DOCTYPE メ ソ ッ ド を使 用 し て、 ルー ト 要素名、 内部サブセ ッ ト 、 お よ び、 シ ス テ ム ID と パブ リ ッ ク ID にア ク セ ス で き ます。 メソッド PBDOM_OBJECT か ら 継承す る メ ソ ッ ド に加え、 PBDOM_DOCTYPE ク ラ ス には以下の メ ソ ッ ド があ り ます。 • GetPublicID、 SetPublicID、 GetSystemID、 お よ び SetSystemID では、 PBDOM_DOCTYPE 内で宣言さ れる 外部参照 ID のパブリ ッ ク ID と シ ス テ ム ID を取得お よ び設定す る • GetInternalSubset と SetInternalSubset では、 PBDOM_DOCTYPE の内 部サブセ ッ ト デー タ を取得お よ び設定す る PBDOM_ELEMENT PBDOM_ELEMENT は、 PowerScript 内でモデル化 さ れた XML 要素を 表 し ま す。 PBDOM_ELEMENT メ ソ ッ ド を 使用 し て、 要素属性、 子、 お よ びテ キ ス ト にア ク セ ス で き ます。 メソッド PBDOM_OBJECT か ら 継承す る メ ソ ッ ド に加え、 PBDOM_ELEMENT ク ラ ス には以下の メ ソ ッ ド があ り ます。 • 214 AddNamespaceDeclaration と RemoveNamespaceDeclaration では、 PBDOM_ELEMENT に名前空間宣言を追加 し た り 、 PBDOM_ELEMENT か ら 名前空間宣言を削除 し た り す る PowerBuilder 第 13 章 PowerBuilder XML サービ スの使い方 GetAttribute、 GetAttributes、 GetAttributeValue、 HasAttributes、 RemoveAttribute、 SetAttribute、 お よ び SetAttributes では、 • PBDOM_ELEMENT の属性を操作す る GetChildElement、 GetChildElements、 HasChildElements、 RemoveChildElement、 お よ び RemoveChildElements では、 • PBDOM_ELEMENT の子を操作す る GetNamespacePrefix と GetNamespaceURI では、 PBDOM_ELEMENT • に関連付け ら れた名前空間の接頭辞 と URI を取得す る PBDOM_ELEMENT と PBDOM_ATTRIBUTE の関係 • GetQualifiedName では、 接頭辞 (あ る 場合) を含めた PBDOM_ELEMENT の完全名を取得す る • SetDocument では、PBDOM_DOCUMENT を PBDOM_ELEMENT の 親 と し て設定す る • SetNamespace では、 PBDOM_ELEMENT の名前空間を設定す る • SetText では、 PBDOM_ELEMENT のテ キ ス ト 内容を設定す る PBDOM では、 XML 要素の属性はその要素の子ではあ り ません。 XML 要素の属性は、 関連付け ら れた要素 と は別に識別 さ れ る のではな く 、 要素のプ ロ パテ ィ です。 次の単純な XML ド キ ュ メ ン ト について考え てみます。 <root attr="value1"> <child attr_1="value1" attr_2="value2"/> </root> こ れに相当す る PBDOM ツ リ ーを図 13-2 に示 し ます。 図 13-2: PBDOM_ELEMENT と PBDOM_ATTRIBUTE の関係 ルー ト と 子 を 結ぶ実線は、 親子関係 を 表 し ま す。 点線は、 属性 と その オーナ要素 と の間の 「~のプ ロ パテ ィ 」 と い う 関係を表 し ます。 PBDOM_ELEMENT の内容を管理す る メ ソ ッ ド は、 PBDOM_ATTRIBUTE オブジェ ク ト には使用でき ま せん。 属性を 取得、 設定、 お よ び削除す る メ ソ ッ ド は別にあ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 215 PBDOM ノ ー ド オブ ジ ェ ク ト 属性は、 オーナ要素の子ではないので PBDOM ド キ ュ メ ン ト ツ リ ー全 体の一部 と はみな さ れ ませんが、 オーナ要素を通 し て ツ リ ーに リ ン ク さ れ ます。 属性には子オブジ ェ ク ト (XML テ キ ス ト と エ ン テ ィ テ ィ 参照 ノ ー ド ) を格納で き る ので、 属性はそれ自体のサブ ツ リ ーを形成 し ます。 要素の属性はその要素の子 と はみな さ れないので、 子オブジ ェ ク ト 間 にあ る よ う な兄弟関係が属性間にはあ り ま せん。 サ ン プルの XML ド キ ュ メ ン ト 、 お よ び図 13-2 では、 attr_1 と attr_2 は兄弟ではあ り ま せ ん。 オーナ要素内での属性の表示順序には、 特に意味はあ り ません。 属性の設定 と 作成 PBDOM では、 XML 要素の属性は、 PBDOM_ELEMENT SetAttribute メ ソ ッ ド と SetAttributes メ ソ ッ ド を 使用 し て設定 さ れ ま す。 こ れ ら の メ ソ ッ ド は常に、 PBDOM_ELEMENT の新規属性を作成 し よ う と し 、 既 存の属性を同 じ 名前お よ び同 じ 名前空間の URI に置 き 換え よ う と し ま す。 PBDOM_ELEMENT に、 同 じ 名前 と 同 じ 名前空間 URI の既存の属性が すでに含ま れてい る 場合、 こ れ ら の メ ソ ッ ド は、 既存の属性を削除 し て か ら 新規属性 を PBDOM_ELEMENT に 挿入 し ま す。 SetAttribute メ ソ ッ ド を呼び出す と 、 PBDOM_ATTRIBUTE (PBDOM_ELEMENT の既 存属性を表す) がそのオーナ PBDOM_ELEMENT か ら デ タ ッ チ さ れ ま す。 た と えば、 次の要素について考え てみます。 <an_element an_attr="some_value"/> PBDOM_ELEMENT オブジ ェ ク ト pbdom_an_elem が an_element 要素を 表 し 、 次の文が発行 さ れた場合、 こ の メ ソ ッ ド は ま ず、 an_element 要 素の新規属性を作成 し よ う と し ます。 pbdom_an_elem.SetAttribute("an_attr", "some_other_value") 次に、 an_element にはすでに an_attr と い う 名前の属性が含まれてい る ので、 その属性は削除 さ れ ます。 元の an_attr 属性を表す既存の PBDOM_ATTRIBUTE オブジ ェ ク ト があ る 場合、 こ の PBDOM_ATTRIBUTE はそのオーナ要素 (an_element) から デタ ッ チさ れ ます。 属性 と 名前空間の詳細については、 235 ページの 「XML 名前空間」 を 参照 し て く だ さ い。 216 PowerBuilder 第 13 章 PowerBuilder XML サービ スの使い方 PBDOM_ATTRIBUTE PBDOM_ATTRIBUTE ク ラ ス は、PowerScript 内でモデル化 さ れた XML 属性を表 し ま す。 PBDOM_ATTRIBUTE メ ソ ッ ド を使用 し て、 要素属 性お よ び名前空間情報にア ク セ ス で き ます。 メソッド PBDOM_OBJECT か ら 継承す る メ ソ ッ ド に加え、 PBDOM_ATTRIB ク ラ ス には以下の メ ソ ッ ド があ り ます。 • GetBooleanValue 、 SetBooleanValue 、 GetDateValue 、 SetDateValue 、 GetDateTimeValue、SetDateTimeValue、GetDoubleValue、SetDoubleValue、 GetIntValue、 SetIntValue、 GetLongValue、 SetLongValue、 GetRealValue、 SetRealValue、GetTimeValue、SetTimeValue、GetUIntValue、SetUintValue、 GetULongValue、 お よ び SetULongValue では、 PBDOM_ATTRIBUTE の値を指定 さ れたデー タ 型 と し て取得お よ び設定す る • GetNamespacePrefix と GetNamespaceURI では、 PBDOM_ATTRIBUTE に関連付け ら れた名前空間の接頭辞 と URI を取得す る • GetOwnerElementObject と SetOwnerElementObject では、 PBDOM_ATTRIBUTE のオーナ PBDOM_ELEMENT を取得お よ び 設定す る 子オブ ジ ェ ク ト PBDOM_OBJECT • GetQualifiedName では、 接頭辞 (あ る 場合) を含めた PBDOM_ATTRIBUTE の完全名を取得す る • SetNamespace では、 PBDOM_ATTRIBUTE の名前空間を設定す る • SetText では、 PBDOM_ATTRIBUTE のテ キ ス ト 内容を設定す る PBDOM_ATTRIBUTE には、 子オブジ ェ ク ト PBDOM_OBJECT のサブ ツ リ ーが含まれてい ます。子オブジ ェ ク ト は、PBDOM_TEXT オブジ ェ ク ト と PBDOM_ENTITYREFERENCE オブジ ェ ク ト を組み合わせ る こ と も で き ます。 次の例では、 attr と い う 名前の PBDOM_ATTRIBUTE が含 ま れて い る elem と い う 名前の PBDOM_ELEMENT を作成 し ます。 PBDOM_ATTRIBUTE pbdom_attr PBDOM_TEXT pbdom_txt PBDOM_ENTITYREFERENCE pbdom_er PBDOM_ELEMENT pbdom_elem pbdom_elem = Create PBDOM_ELEMENT pbdom_elem.SetName ("elem") pbdom_attr = Create PBDOM_ATTRIBUTE pbdom_attr.SetName("attr") ア プ リ ケーシ ョ ン テ ク ニ ッ ク 217 PBDOM ノ ー ド オブ ジ ェ ク ト pbdom_attr.SetText("Part 1 ") pbdom_txt = Create PBDOM_TEXT pbdom_txt.SetText (" End.") pbdom_er = Create PBDOM_ENTITYREFERENCE pbdom_er.SetName("ER") pbdom_attr.AddContent(pbdom_er) pbdom_attr.AddContent(pbdom_txt) pbdom_elem.SetAttribute(pbdom_attr) XML 内の要素 タ グは次の よ う にな り ます。 <elem attr="Part 1 &ER; End."> 図 13-3 で、矢印は PBDOM_ATTRIBUTE と ほかの PBDOM_OBJECT と の親子関係を示 し ます。 図 13-3: PBDOM_ATTRIBUTE サブ ツ リ ーの例 PBDOM_TEXT のデ フ ォル ト の子オブ ジ ェ クト PBDOM_ATTRIBUTE には一般に、PBDOM_TEXT の子オブジ ェ ク ト が 少な く と も 1 つ含まれてい ます。 その子オブジ ェ ク ト の内容が空の文 字列の場合 も あ り ます。 ただ し 、 RemoveContent メ ソ ッ ド の呼び出 し に よ り PBDOM_ATTRIBUTE の内容がすべ て 削除 さ れ た場合 を 除 き ま す。 以下の例は、 空の文字列を持つ PBDOM_TEXT オブジ ェ ク ト が ど の よ う に し て PBDOM_ATTRIBUTE の子オ ブ ジ ェ ク ト に な る か を 示 し ま す。 例 1 次の例では、PBDOM_ELEMENT の SetAttribute メ ソ ッ ド を使用 し ます。 PBDOM_ATTRIBUTE の名前は attr に設定 さ れてい ますが、 テ キ ス ト 値は空の文字列です。 PBDOM_ATTRIBUTE には、 空の文字列 を 持つ子オブジ ェ ク ト PBDOM_TEXT が 1 つあ り ます。 PBDOM_DOCUMENT pbdom_doc PBDOM_ATTRIBUTE pbdom_attr 218 PowerBuilder 第 13 章 PowerBuilder XML サービ スの使い方 PBDOM_OBJECT pbdom_obj_array[] try pbdom_doc = Create PBDOM_DOCUMENT pbdom_doc.NewDocument("root") // 属性の名前は // "attr" に設定 さ れ、 そのテキス ト 値は空の文字列 "" です。 pbdom_doc.GetRootElement().SetAttribute("attr", "") pbdom_attr = & pbdom_doc.GetRootElement().GetAttribute("attr") MessageBox ("HasChildren", & string(pbdom_attr.HasChildren())) catch(PBDOM_EXCEPTION pbdom_except) MessageBox ("PBDOM_EXCEPTION", & pbdom_except.GetMessage()) end try SaveDocument メ ソ ッ ド を使用 し て pbdom_doc を XML と し て変更す る と き は、 次の よ う にな り ます。 <root attr="" /> 例 2 次の例では、 PBDOM_ATTRIBUTE を作成 し 、 その名前を attr に 設定 し ます。テ キ ス ト 値は設定 さ れませんが、PBDOM_TEXT オブジ ェ ク ト が自動作成 さ れ、 PBDOM_ATTRIBUTE に ア タ ッ チ さ れ ま す。 こ れは、 こ の方法で作成 さ れたすべての PBDOM_ATTRIBUTE のデフ ォ ル ト の振 る 舞いです。 PBDOM_DOCUMENT pbdom_doc PBDOM_ATTRIBUTE pbdom_attr try pbdom_doc = Create PBDOM_DOCUMENT pbdom_doc.NewDocument("root") // PBDOM_ATTRIBUTE を作成 し 、 その名前を "attr" に設定 し ま す。 pbdom_attr = Create PBDOM_ATTRIBUTE pbdom_attr.SetName("attr") pbdom_doc.GetRootElement().SetAttribute(pbdom_attr) MessageBox ("HasChildren", & ア プ リ ケーシ ョ ン テ ク ニ ッ ク 219 PBDOM ノ ー ド オブ ジ ェ ク ト string(pbdom_attr.HasChildren())) catch(PBDOM_EXCEPTION pbdom_except) MessageBox ("PBDOM_EXCEPTION", & pbdom_except.GetMessage()) end try SetText メ ソ ッ ド (ま たは、 SetNamespace を除 く ほかの Set* メ ソ ッ ド の いずれか。 ) を呼び出す と き 、 デフ ォ ル ト の PBDOM_TEXT が新規の PBDOM_TEXT に置 き 換わ り ます。 SetContent メ ソ ッ ド を呼び出す と 、 デ フ ォ ル ト の PBDOM_TEXT を、 PBDOM_TEXT オ ブ ジ ェ ク ト と PBDOM_ENTITYREFERENCE オブ ジ ェ ク ト の組み合わせに置 き 換え る こ と がで き ます。 PBDOM_ENTITYREFERENCE PBDOM_ENTITYREFERENCE ク ラ ス は、 XML エ ン テ ィ テ ィ 参照 ノ ー ド の振 る 舞い を定義 し ます。 こ れは、 主にエ ン テ ィ テ ィ 参照を、 属性 ノ ー ド と 同様に要素 ノ ー ド 内に も 挿入す る ための単純な ク ラ ス です。 PBDOM_BUILDER ク ラ ス が XML ド キ ュ メ ン ト を 解析 し て DOM ツ リ ー を 構築す る と き 、 こ の ク ラ ス は、 DTD 内で出現す る と き にエ ン テ ィ テ ィ を完全に拡張 し ます。 し たが っ て、 PBDOM_BUILDER 構築 メ ソ ッ ド のいずれか を使用 し て PBDOM_DOCUMENT オブジ ェ ク ト が作 成 さ れた直後は、 作成 さ れた ド キ ュ メ ン ト ツ リ ーにエ ン テ ィ テ ィ 参照 ノ ー ド はあ り ません。 PBDOM_ENTITYREFERENCE オブジ ェ ク ト は、 いつで も 作成で き 、 ど の ド キ ュ メ ン ト に も 挿入で き ま す。 参照 さ れ る エ ン テ ィ テ ィ を表す、 対応す る DOM エ ン テ ィ テ ィ ノ ー ド がその ド キ ュ メ ン ト 内にあ る か ど う かには左右 さ れません。 メソッド PBDOM_ENTITYREFERENCE ク ラ ス には、PBDOM_OBJECT か ら 継承 さ れた メ ソ ッ ド 以外の メ ソ ッ ド はあ り ません。 PBDOM_CHARACTERDATA PBDOM_CHARACTERDATA ク ラ ス は PBDOM_OBJECT か ら 派生 し 、 XML ド キ ュ メ ン ト 内の文字ベース の内容 (マー ク ア ッ プではない) を 表 し ま す。 PBDOM_CHARACTERDATA ク ラ ス は、 PBDOM_OBJECT を拡張 し 、 文字デー タ の操作専用の メ ソ ッ ド を持ち ます。 220 PowerBuilder 第 13 章 PowerBuilder XML サービ スの使い方 メソッド PBDOM_OBJECT か ら 継承す る メ ソ ッ ド に加え、 PBDOM_CHARACTERDATA ク ラ ス には以下の メ ソ ッ ド があ り ます。 • Append では、 PBDOM_CHARACTERDATA オブジ ェ ク ト のテ キ ス ト 文字列ま たはテ キ ス ト デー タ を現行オブジ ェ ク ト 内のテ キ ス ト に追加す る • SetText では、 PBDOM_CHARACTERDATA オブジ ェ ク ト のテ キ ス ト 内容を設定す る 3 つのク ラ スの親ク ラ ス PBDOM_CHARACTERDATA ク ラ ス は、 以下の 3 つの PBDOM ク ラ ス の親 ク ラ ス です。 • PBDOM_TEXT • PBDOM_CDATA • PBDOM_COMMENT PBDOM_CHARACTERDATA ク ラ ス は、その親ク ラ ス PBDOM_OBJECT と 同様に、 直接 イ ン ス タ ン ス 化お よ び使用す る こ と が前提 と さ れない 点で、 「仮想」 ク ラ ス と いえ ます。 こ れは、 C++ の仮想 ク ラ ス に似てい ま す。 た と えば、 CREATE 文で PBDOM_CHARACTERDATA を作成す る こ と は PowerScript では有効ですが、 PBDOM_CHARACTERDATA を SetText メ ソ ッ ド を呼び出 し て直接操作す る こ と は無効です。 次の コ ー ド の最後の行は例外を発生 し ます。 PBDOM_CHARACTERDATA pbdom_chrdata pbdom_chrdata = CREATE PBDOM_CHARACTERDATA pbdom_chrdata.SetText("character string") // 例外 ! こ の例では、 pbdom_chrdata は、 PBDOM_CHARACTERDATA と し て宣 言 さ れ ますが PBDOM_TEXT と し て イ ン ス タ ン ス化 さ れます。 pbdom_chrdata で SetText を呼び出す こ と は、 PBDOM_TEXT SetText メ ソ ッ ド を呼び出す こ と に相当 し ます。 PBDOM_CHARACTERDATA pbdom_chrdata pbdom_chrdata = CREATE PBDOM_TEXT pbdom_chrdata.SetText("character string") PBDOM_TEXT PBDOM_TEXT ク ラ ス は PBDOM_CHARACTERDATA か ら 派 生 し 、 XML ド キ ュ メ ン ト 内の DOM テ キ ス ト ノ ー ド を表 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 221 PBDOM ノ ー ド オブ ジ ェ ク ト メソッド PBDOM_TEXT ク ラ ス には、 PBDOM_OBJECT か PBDOM_CHARACTERDATA か ら 継承 さ れていない メ ソ ッ ド はあ り ま せん。 PBDOM_TEXT オブ ジ ェ ク ト の使い方 PBDOM_TEXT オブジ ェ ク ト は、 PBDOM_ELEMENT か PBDOM_ATTRIBUTE のテキ ス ト 内容を 表すために広く 使用さ れま す。 PBDOM_TEXT オブジ ェ ク ト は、 カ ギ カ ッ コ で区切 ら れてい ませんが オブジ ェ ク ト であ り 、 親 ク ラ ス PBDOM_ELEMENT の値の一部ではあ り ません。 PBDOM ツ リ ー内で グ ラ フ ィ カ ルに表現 さ れ た PBDOM_TEXT オ ブ ジ ェ ク ト は、 リ ーフ ノ ー ド であ り 、 子オブジ ェ ク ト を持ち ません。 た と えば、 図 13-4 は次の PBDOM_ELEMENT を表 し ます。 <parent_element>some text</parent_element> 図 13-4: PBDOM_TEXT 親子関係 矢印は親子関係を表 し ます。 PBDOM_TEXT の出 現 XML ド キ ュ メ ン ト の初回の解析時、要素の内容中にマー ク ア ッ プがな い場合は、 要素内のテ キ ス ト は単一の PBDOM_TEXT オブジ ェ ク ト と し て表 さ れ ます。 こ の PBDOM_TEXT オブジ ェ ク ト は、 その要素の唯 一の子です。 マー ク ア ッ プがあ る 場合、 PBDOM_ELEMENT オブジ ェ ク ト と PBDOM_TEXT オブジ ェ ク ト の リ ス ト に解析 さ れ ます。 こ の リ ス ト は、 要素の子の リ ス ト にな り ます。 た と えば、 次の XML を解析す る と 、 <element_1> を表す 1 つの PBDOM_ELEMENT と 、 テ キ ス ト 内容 Some Text を表す 1 つの PBDOM_TEXT が作成 さ れ ます。 <root> <element_1>Some Text</element_1> </root> <element_1> PBDOM_ELEMENT には、 唯一の子 と し ての PBDOM_TEXT オブジ ェ ク ト があ り ます。 222 PowerBuilder 第 13 章 PowerBuilder XML サービ スの使い方 次の ド キ ュ メ ン ト について考え てみます。 <root> <element_1> Some Text <element_1_1>Sub Element Text</element_1_1> More Text <element_1_2/> Yet More Text </element_1> </root> 次の XML を解析す る と 、<element_1> を表す PBDOM_ELEMENT と 、 その子が 5 つ作成 さ れ ます。 隣接する PBDOM_TEXT オブ ジェク ト • Some Text を表す PBDOM_TEXT • <element_1_1/> を表す PBDOM_ELEMENT • More Text を表す PBDOM_TEXT • <element_1_2/> を表す PBDOM_ELEMENT • Yet More Text を表す PBDOM_TEXT 指定 さ れ た要素の内容 を マー ク ア ッ プの介入な し で表 し て い る 隣接 す る PBDOM_TEXT オブジ ェ ク ト を作成で き ます。 た と えば、 次の ド キ ュ メ ン ト か ら 始め ます。 <root> <element_1>Some Text</element_1> </root> element_1 の PBDOM_ELEMENT で AddContent("More Text") を呼び 出す と 、 次の よ う な結果にな り ます。 <root> <element_1>Some TextMore Text</element_1> </root> 「Some Text」 と 「More Text」 を表す、 相互に隣接 し た 2 つの PBDOM_TEXT オブジ ェ ク ト が作成 さ れてい ます。 それ ら の間には何 も な く 、 ま たそれ ら の分離を表す方法 も あ り ません。 PBDOM_TEXT オブ ジ ェ ク ト の永続格納 隣接す る PBDOM_TEXT オブジ ェ ク ト が離れ る と 、 DOM を編集す る セ ッ シ ョ ンは続 き ません。 前の例で示 し た 「More Text」 の追加に よ り 作成 さ れた ド キ ュ メ ン ト が再オープ ンお よ び再解析 さ れ る と 、 1 つの PBDOM_TEXT オブジ ェ ク ト だけが 「Some TextMore Text」 を表 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 223 PBDOM ノ ー ド オブ ジ ェ ク ト PBDOM_CDATA PBDOM_CDATA ク ラ ス は、 PBDOM_TEXT か ら 派生 し 、 XML DOM CDATA セ ク シ ョ ン を表 し ます。 メソッド PBDOM_CDATA ク ラ ス には、 PBDOM_OBJECT か PBDOM_CHARACTERDATA か ら 継承 さ れていない メ ソ ッ ド はあ り ま せん。 CDATA オブ ジ ェ ク ト の使い方 PBDOM_CDATA オブジ ェ ク ト は、拡張 さ れた PBDOM_TEXT オブジ ェ ク ト と し て考え る こ と がで き ます。PBDOM_CDATA オブジ ェ ク ト を使 用 し て、 <、 & な ど、 XML で禁止 さ れてい る 文字を含む こ と ので き る テ キ ス ト を格納で き ます。 こ のオブジ ェ ク ト の主な目的は、 エ ン テ ィ テ ィ 参照な し で、 その よ う な特殊文字を大 き な テ キ ス ト ブ ロ ッ ク 内に 含め る こ と です。 次の例には PBDOM_CDATA オブジ ェ ク ト が含まれてい ます。 <some_text> <![CDATA[ (x < y) & (y < z) => x < z ]]> </some_text> 同 じ テ キ ス ト 内容 を PBDOM_TEXT オ ブ ジ ェ ク ト と し て表現す る に は、 次の よ う に記述 し ます。 <some_text> (x < y) & (y < z) => x < z </some_text> PBDOM_CDATA ク ラ ス は PBDOM_TEXT か ら 派生 し ますが、 PBDOM_TEXT を挿入で き る 個所に PBDOM_CDATA オブジ ェ ク ト を 必ず挿入で き る わけではあ り ません。 た と えば、 PBDOM_TEXT オブ ジ ェ ク ト を PBDOM_ATTRIBUTE の子オブジ ェ ク ト と し て追加で き ま すが、 PBDOM_CDATA オブジ ェ ク ト は追加で き ません。 PBDOM_COMMENT PBDOM_COMMENT ク ラ ス は、 XML ド キ ュ メ ン ト 内の DOM コ メ ン ト ノ ー ド です。 PBDOM_COMMENT ク ラ ス は PBDOM_CHARACTERDATA ク ラ ス か ら 派生 し ます。 メソッド PBDOM_COMMENT ク ラ ス には、 PBDOM_OBJECT か PBDOM_CHARACTERDATA か ら 継承 さ れていない メ ソ ッ ド はあ り ま せん。 コ メ ン ト の使い方 コ メ ン ト は、 ユーザが読め る 表現で XML ド キ ュ メ ン ト に注釈を付け る のに便利です。 224 PowerBuilder 第 13 章 PowerBuilder XML サービ スの使い方 ド キ ュ メ ン ト の解析時、 ド キ ュ メ ン ト 内のすべての コ メ ン ト は、 メ モ リ 内の DOM ツ リ ーの一部 と し て メ モ リ 内に永続 し ます。 実行時に作 成 さ れた PBDOM_COMMENT も DOM ツ リ ーの一部にな り ます。 XML コ メ ン ト は、 通常、 ド キ ュ メ ン ト の内容モデルの一部ではあ り ま せん。 コ メ ン ト の有無は ド キ ュ メ ン ト の有効性に影響 し ません。 ま た、 DTD 内で コ メ ン ト を宣言す る 必要 も あ り ません。 PBDOM_PROCESSINGINSTRUCTION PBDOM_PROCESSINGINSTRUCTION ク ラ ス は、 XML 処理命令 (PI) を表 し ます。 PBDOM_PROCESSINGINSTRUCTION メ ソ ッ ド を使用 し て、 処理命令先 と そのデー タ に ア ク セ ス で き ま す。 そのデー タ には、 文字列 と し て、 ま たは、 必要に応 じ て名前 と 値のペア と し て ア ク セ ス で き ます。 PI の実際の処理命令は文字列です。 こ れは、 命令が個別の name="value" のペアに分割 さ れ る 場合 も 同 じ です。 PBDOM は こ の よ う な PI 書式をサポー ト し ます。 一般に、 PI データ はこ れら のペアを 含 みます。 その場合、 PBDOM_PROCESSINGINSTRUCTION は こ れ ら の ペア を名前 と 値の内部 リ ス ト に解析 し ます。 メソッド PBDOM_OBJECT か ら 継承す る メ ソ ッ ド に加え、 PBDOM_PROCESSINGINSTRUCTION ク ラ ス には以下の メ ソ ッ ド があ り ます。 • GetData と SetData では、 PBDOM_PROCESSINGINSTRUCTION オ ブジ ェ ク ト の生デー タ を取得お よ び設定す る • GetNames では、 PBDOM_PROCESSINGINSTRUCTION のデー タ の 一部 (name="value" のペア に分割 さ れてい る ) か ら 取 っ た、 名前 の リ ス ト を取得す る • GetValue、 RemoveValue、 お よ び SetValue では、 PBDOM_PROCESSINGINSTRUCTION オブジェ ク ト 内で、 指定さ れ た名前 と 値のペアの値を取得、 削除、 お よ び設定す る • GetTarget では、 PBDOM_PROCESSINGINSTRUCTION の タ ーゲ ッ ト を取得す る 。 た と えば、 XML 宣言の タ ーゲ ッ ト (特殊な処理命 令) は文字列 xml にな る ア プ リ ケーシ ョ ン テ ク ニ ッ ク 225 ラ イ ブ ラ リ 探索パスへの pbdom90J.pbd の追加 ラ イ ブ ラ リ 探索パスへの pbdom90J.pbd の追加 PBDOM ク ラ ス は DLL フ ァ イ ル pbdom90J.dll に実装 さ れます。PBDOM ク ラ ス を PowerBuilder アプ リ ケーシ ョ ン で使用す る には、pbdom90J.dll を ア プ リ ケ ーシ ョ ン のパ ス に置 き 、 pbdom90J.pbd フ ァ イ ル を ア プ リ ケーシ ョ ンの ラ イ ブ ラ リ 探索パ ス に追加す る 必要があ り ます。PBD は、 DLL の ラ ッ パー と し て動作 し 、 こ れに よ り PowerBuilder ア プ リ ケー シ ョ ンは、 PowerBuilder ク ラ ス のユーザ オブジ ェ ク ト を使用す る の と 同 じ よ う に、 DLL 内で PBDOM ク ラ ス を使用で き ます。 pbdom90J.dll フ ァ イ ル と pbdom90J.pbd フ ァ イ ルは、 PowerBuilder の イ ン ス ト ール時に Shared¥PowerBuilder デ ィ レ ク ト リ に配置 さ れ ま す。 PBDOM ア プ リ ケ ー シ ョ ン の作成時に pbdom90J.dll を 別の場所に コ ピーす る 必要はあ り ませんが、 アプ リ ケーシ ョ ン の探索パ ス 中のデ ィ レ ク ト リ に、 こ の フ ァ イ ルを アプ リ ケーシ ョ ン と と も に配布す る 必要 があ り ます。 pbdom90J.pbd フ ァ イ ルは、 アプ リ ケーシ ョ ンの ラ イ ブ ラ リ リ ス ト 内に あ る 必要があ り ます。テ ン プ レー ト アプ リ ケーシ ョ ン ウ ィ ザー ド を使 用 し て、 ウ ィ ザー ド 内で ア プ リ ケーシ ョ ン タ ーゲ ッ ト の作成お よ び PBD フ ァ イ ルの追加を行え ます。 アプ リ ケーシ ョ ン ウ ィ ザー ド を使用 す る か、 既存の タ ーゲ ッ ト があ る 場合、 タ ーゲ ッ ト のプ ロ パテ ィ ダ イ ア ロ グ ボ ッ ク ス で、 ラ イ ブ ラ リ リ ス ト に PBD フ ァ イ ルを追加で き ま す。 ❖ ❖ 226 pbdom90J.pbd を新規 タ ーゲ ッ ト の探索パスに追加するには 1 新規作成 ダ イ ア ロ グ ボ ッ ク ス で、 [テ ン プ レー ト アプ リ ケーシ ョ ン ウ ィ ザー ド ] ア イ コ ン を 選択 し 、 ウ ィ ザー ド の指示に従 っ て [ ラ イ ブ ラ リ 検索パ ス] ページ ま で進みます。 2 [参照] (...) ボ タ ン を ク リ ッ ク し 、 Shared¥PowerBuilder デ ィ レ ク ト リ に移動 し ます。 3 [フ ァ イ ルの種類] ド ロ ッ プダ ウ ン リ ス ト か ら 「PB ダ イ ナ ミ ッ ク ラ イ ブ ラ リ 」 を 選択 し 、 「pbdom90J.pbd」 を 選択 し 、 [開 く ] を ク リ ッ ク し ます。 4 ウ ィ ザー ド を完了 し ます。 pbdom90J.pbd を既存 タ ーゲ ッ ト の探索パスに追加するには 1 シ ス テ ム ツ リ ー内で ク ラ イ ア ン ト タ ーゲ ッ ト を 右 ク リ ッ ク し 、 ポ ッ プア ッ プ メ ニ ュ ーか ら [プ ロ パテ ィ ] を選択 し ます。 2 [ ラ イ ブ ラ リ リ ス ト ] ページで [参照] を選択 し 、 Shared¥PowerBuilder デ ィ レ ク ト リ に移動 し ます。 PowerBuilder 第 13 章 PowerBuilder XML サービ スの使い方 3 [フ ァ イ ルの種類] ド ロ ッ プダ ウ ン リ ス ト か ら 「PB ダ イ ナ ミ ッ ク ラ イ ブ ラ リ 」 を 選択 し 、 「pbdom90J.pbd」 を 選択 し 、 ダ イ ア ロ グ ボ ッ ク ス を閉 じ ます。 pbdom90J.pbd を追加 し た後、 PBDOM オブジ ェ ク ト がシ ス テ ム ツ リ ー に表示 さ れ ます。 PBDOM の使い方 こ の節では、 PBDOM の ク ラ ス お よ び メ ソ ッ ド を使用 し て基本的な タ ス ク を遂行す る 方法について説明 し ます。 ダ ウ ン ロ ー ド し て テ ス ト で き る 完全な コ ー ド サン プルを見 る には、 Windows の [ス タ ー ト |プ ロ グ ラ ム| Sybase | PowerBuilder 9.0 | PB 9 コ ー ド サン プル] を選択 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 227 PBDOM の使い方 XML の検証 フ ァ イ ル か 文字列 か ら ド キ ュ メ ン ト を 作成す る 前 に、 XMLParseFile PowerScript 関数ま たは XMLParseString PowerScript 関数を使用 し て、 そ の XML が well formed (整形式) であ る か ど う か、 あ る いはオプシ ョ ン で、 DTD か ス キーマに準拠 し てい る か ど う か を テ ス ト で き ます。 た と えば、 次の コ ー ド は、 フ ァ イ ル内の XML が well formed (整形式) で あ る か ど う か を テ ス ト し ます。 long ll_ret ll_ret = XMLParseFile("c:¥temp¥mydoc.xml", ValNever!) デフ ォ ル ト では、 こ れ ら の関数に よ り 、 エ ラ ーが発生 し た場合に メ ッ セージ ボ ッ ク ス が表示 さ れます。parsingerrors 文字列引数を指定 し て、 プ ロ グ ラ ム に よ り エ ラ ーを処理す る こ と も で き ます。 こ れ ら の関数の 詳細については、 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ アルかオ ン ラ イ ン ヘルプの解説を参照 し て く だ さ い。 XML から の XML ド キュ メ ン ト の作成 PBDOM_BUILDER ク ラ ス は、 既存の XML ソ ース か ら PBDOM_DOCUMENT を 作成する ための 3 つのメ ソ ッ ド を 提供し ま す。 ま た、 発生し たすべての解析エラ ーのリ ス ト を 取得する GetParseErrors メ ソ ッ ド も 提供 し ます。 BuildFromString の使 い方 次 の 例 で は、 XML 文 字 列 と PBDOM_BUILDER ク ラ ス を 使 用 し て PBDOM_DOCUMENT を 作成し ま す。ま ず、オブジェ ク ト を 宣言し ま す。 PBDOM_BUILDER pbdom_builder_new PBDOM_DOCUMENT pbdom_doc 次に、コ ン ス ト ラ ク タ と PBDOM_BUILDER の BuildFromString メ ソ ッ ド を使用 し てオブジ ェ ク ト を イ ン ス タ ン ス化 し ます。 pbdombuilder_new = Create PBDOM_Builder pbdom_doc = pbdombuilder_new.BuildFromString(Xml_doc) XML は、 次の例の よ う に、 文字列変数に直接 ロ ー ド す る こ と も で き ま す。 string Xml_str Xml_str = "<?xml version="1.0" ?>" Xml_str += "<WHITEPAPER>" Xml_str += "<TITLE>Document Title</TITLE>" Xml_str += "<AUTHOR>Author Name</AUTHOR>" Xml_str += "<PARAGRAPH>Document text.</PARAGRAPH>" Xml_str += "</WHITEPAPER>" 228 PowerBuilder 第 13 章 PowerBuilder XML サービ スの使い方 BuildFromFile の使い 方 BuildFromFile メ ソ ッ ド と 、PBDOM_DOCUMENT の作成元 と な る フ ァ イ ルへのパ ス を含む文字列を使用 し て、 XML フ ァ イ ルを作成で き ます。 PBDOM_BUILDER pbdombuilder_new PBDOM_DOCUMENT pbdom_doc pbdombuilder_new = Create PBDOM_Builder pbdom_doc = pbdombuilder_new.BuildFromFile & ("c:¥pbdom_doc_1.xml") BuildFromDataStore の使い方 次に示す PowerScript コ ー ド の一部は、 BuildFromDataStore メ ソ ッ ド を、 参照 さ れ る デー タ ス ト ア オブ ジ ェ ク ト と と も に使用す る 方法 を 示 し ます。 PBDOM_Builder pbdom_bldr pbdom_document pbdom_doc datastore ds ds = Create datastore ds.DataObject = "d_customer" ds.SetTransObject (SQLCA) ds.Retrieve pbdom_doc = pbdom_bldr.BuildFromDataStore(ds) GetParseErrors の使 い方 Build メ ソ ッ ド のいずれか を呼び出 し た後、 GetParseErrors メ ソ ッ ド を 使用 し て、Build メ ソ ッ ド で発生 し た解析エ ラ ー と 検証エ ラ ーの リ ス ト を取得で き ます。 PBDOM_Builder pbdom_bldr pbdom_document pbdom_doc string strParseErrors[] BOOLEAN bRetTemp = FALSE pbdom_buildr = Create PBDOM_BUILDER pbdom_doc = pbdom_buildr.BuildFromFile("D:¥temp.xml") bRetTemp = pbdom_buildr.GetParseErrors(strParseErrors) if bRetTemp = true then for l = 1 to UpperBound(strParseErrors) MessageBox (" 解析エ ラ ー ", strParseErrors[l]) next end if 解析エ ラ ー 解析エ ラ ーが検出 さ れ、 GetParseErrors が true を返 し た場合、 調べ る こ と がで き る 完全な PBDOM ノ ー ド ツ リ ーが作成 さ れてい る 場合があ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 229 PBDOM の使い方 最初から の XML ド キュ メ ン ト の作成 適切な PBDOM_OBJECT サブ ク ラ ス と メ ソ ッ ド を使用 し て、 ス ク リ プ ト 内に XML ド キ ュ メ ン ト を作成で き ます。 次の コ ー ド では、 PBDOM_ELEMENT ク ラ ス と PBDOM_DOCUMENT ク ラ ス、 お よ びそ れ ら の メ ソ ッ ド の一部を使用 し て、 単純な XML ド キ ュ メ ン ト を作成 し ます。 まず、 オブジ ェ ク ト を宣言 し 、 イ ン ス タ ン ス化 し ます。 PBDOM_ELEMENT pbdom_elem_1 PBDOM_ELEMENT pbdom_elem_2 PBDOM_ELEMENT pbdom_elem_3 PBDOM_ELEMENT pbdom_elem_root PBDOM_DOCUMENT pbdom_doc1 pbdom_elem_1 = Create PBDOM_ELEMENT pbdom_elem_2 = Create PBDOM_ELEMENT pbdom_elem_3 = Create PBDOM_ELEMENT イ ン ス タ ン ス化 さ れたオブジ ェ ク ト に命名 し ます。 PBDOM_DOCUMENT オブジェ ク ト の pbdom_doc1 には命名 し ない こ と に注意 し て く だ さ い。 pbdom_elem_1.SetName("pbdom_elem_1") pbdom_elem_2.SetName("pbdom_elem_2") pbdom_elem_3.SetName("pbdom_elem_3") AddContent メ ソ ッ ド を使用 し て、 オブジ ェ ク ト を ノ ー ド ツ リ ーに配置 し ます。AddContent メ ソ ッ ド は、参照 さ れ る オブジ ェ ク ト を、AddContent の呼び出 し 元オブジ ェ ク ト の子 ノ ー ド と し て追加 し ます。 pbdom_elem_1.AddContent(pbdom_elem_2) pbdom_elem_2.AddContent(pbdom_elem_3) NewDocument メ ソ ッ ド を使用 し て新規の XML ド キ ュ メ ン ト を作成 し ま す。 NewDocument メ ソ ッ ド に指定 し たパ ラ メ ー タ 値が、 ルー ト 要素 の 名 前 に な り ま す。 次 に、 GetRootElement メ ソ ッ ド を 使 用 し て、 PBDOM_DOCUMENT オブ ジ ェ ク ト pbdom_doc1 か ら こ の名前に ア ク セ ス し 、 それ を PBDOM_ELEMENT オブジ ェ ク ト pbdom_elem_root に 割 り 当て ます。 pbdom_doc1.NewDocument("Root_Element_From_Doc_1") pbdom_elem_root = pbdom_doc1.GetRootElement() 230 PowerBuilder 第 13 章 PowerBuilder XML サービ スの使い方 要素オブジ ェ ク ト pbdom_elem_1 お よ びそのオブジ ェ ク ト のすべての 子 ノ ー ド を、 AddContent メ ソ ッ ド を使用 し てルー ト 要素下の新規の XML ド キ ュ メ ン ト ノ ー ド ツ リ ーに配置 し ます。 子孫 ノ ー ド pbdom_elem_1 を ノ ード ツ リ ーに配置する と 、 そのすべての子ノ ード が 移動 さ れ る こ と に注目 し て く だ さ い。 pbdom_elem_root.AddContent(pbdom_elem_1) 作成 さ れた XML ド キ ュ メ ン ト は次の よ う にな り ます。 <!DOCTYPE Root_Element_From_Doc_1> <Root_Element_From_Doc_1> <pbdom_elem_1> <pbdom_elem_2> <pbdom_elem_3/> </pbdom_elem_2> </pbdom_elem_1> </Root_Element_From_Doc_1> ノ ード データ へのア ク セス XML ド キ ュ メ ン ト は、 適切な PBDOM_OBJECT サブ ク ラ ス と メ ソ ッ ド を使用 し て ノ ー ド ツ リ ーの要素にア ク セ スす る こ と に よ っ て、 読み 込む こ と がで き ます。 次の コ ー ド では、 配列、 PBDOM_OBJECT と そ の子孫 ク ラ ス PBDOM_DOCUMENT、 お よ び、 PBDOM_DOCUMENT ク ラ ス の GetContent メ ソ ッ ド と GetRootElement メ ソ ッ ド を 使用 し て、 XML ド キ ュ メ ン ト の ノ ー ド デー タ にア ク セ ス し ます。 pbdom_doc と い う 名前の PBDOM_DOCUMENT オブジ ェ ク ト には、 次 の XML ド キ ュ メ ン ト が含まれます。 <Root> <Element_1> <Element_1_1/> <Element_1_2/> <Element_1_3/> </Element_1> <Element_2/> <Element_3/> </Root> 次の コ ー ド は、 GetContent メ ソ ッ ド か ら 返 さ れた要素を格納す る 配列 を宣言 し ます。 こ の メ ソ ッ ド は、 pbdom_doc と い う 名前の PBDOM_DOCUMENT オブジ ェ ク ト を読み込みます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 231 PBDOM の使い方 PBDOM_OBJECT pbdom_obj_array[] ... pbdom_doc.GetContent(ref pbdom_obj_array) こ れで、 pbdom_obj_array 配列に pbdom_doc のルー ト 要素を表す 1 つの 値 <Root> が格納 さ れ ます。 pbdom_doc 内のほかの ノ ー ド に ア ク セ ス す る には、 GetRootElement メ ソ ッ ド を GetContent メ ソ ッ ド と と も に使用 し ます。 pbdom_doc.GetRootElement().GetContent & (ref pbdom_obj_array) こ れで、 pbdom_obj_array 配列に、 pbdom_doc のルー ト 要素の 3 つの子 ノ ー ド に対応す る 3 つの値、 つま り <Element_1>、 <Element_2>、 お よ び <Element_3> が格納 さ れ ます。 PBDOM には、 デー タ にア ク セ ス す る ための メ ソ ッ ド がほかに も あ り ます。 InsertContent、 AddContent、 RemoveContent、 SetContent な ど です。 配列によ る ノ ー ド 内容 の変更 AddContent メ ソ ッ ド を使用 し て ノ ー ド 内容を変更で き ます。 pbdom_obj_array[3].AddContent("This is Element 3.") 次の コ ー ド 行は、 次の よ う に ノ ー ド ツ リ ーを変更 し ます。 <Root> <Element_1> <Element_1_1/> <Element_1_2/> <Element_1_3/> </Element_1> <Element_2/> <Element_3>This is Element 3.</Element_3> </Root> 配列 と オブ ジ ェ ク ト 参照 PBDOM_DOCUMENT ク ラ ス の GetContent メ ソ ッ ド な ど の メ ソ ッ ド を 使 用 し て PBDOM_OBJECT 参 照 の 配 列 を 返 す 場 合、 そ の 参 照 は PBDOM オブジ ェ ク ト に対す る も のです。 配列項目を通 し て こ れ ら の オブジ ェ ク ト のいずれか を修正 し た場合、 変更内容は永続 し 、 同 じ オ ブジ ェ ク ト 参照を持つほかのすべての配列に反映 さ れ ます。 232 PowerBuilder 第 13 章 PowerBuilder XML サービ スの使い方 ノ ード ツ リ ー階層の操作 XML ノ ー ド ツ リ ーは、 ノ ー ド を再配置す る こ と に よ り 再構築で き ま す。 ノ ー ド 操作の 1 つの方法は、 子 ノ ー ド を親 ノ ー ド か ら デ タ ッ チす る こ と です。 こ れは、 次の例の よ う に、 Detach メ ソ ッ ド を使用 し て実 行で き ます。 pbdom_doc と い う 名前の PBDOM_DOCUMENT オブジ ェ ク ト のルー ト 要素を、 GetRootElement メ ソ ッ ド を使用 し て取得 し ます。 pbdom_obj = pbdom_doc.GetRootElement() ルー ト 要素 を PBDOM_DOCUMENT オ ブ ジ ェ ク ト か ら デ タ ッ チ し ま す。 こ のオブジ ェ ク ト はルー ト 要素の親 ノ ー ド です。 pbdom_obj.Detach() PBDOM は、 別のオブジ ェ ク ト の子オブジ ェ ク ト を作成す る SetParentObject メ ソ ッ ド を提供 し ます。 親 ノ ー ド のチ ェ ッ ク 次の例の よ う に、 GetParentObject メ ソ ッ ド を使用 し て、 要素に親オブ ジ ェ ク ト があ る か ど う か を判断で き ます。 pbdom_parent_obj = pbdom_obj.GetParentObject() if not IsValid(pbdom_parent_obj) then MessageBox (" 不正 ", " ルー ト 要素に親があ り ません。 ") end if GetParentObject が呼び出 さ れ る オブジ ェ ク ト に親オブジ ェ ク ト がない 場合、 関数は NULL を返 し ます。 PBDOM には、XML ノ ー ド ツ リ ー内での要素の場所に関す る 情報を返 す メ ソ ッ ド が ほ か に も あ り ま す。 そ の よ う な メ ソ ッ ド の 例 は、 HasChildren (オブジ ェ ク ト に子オブジ ェ ク ト が あ る か ど う かのブール 値を返す) 、 IsAncestorObjectOf (オブジ ェ ク ト が別のオブジ ェ ク ト の先 祖か ど う か を示す) な ど です。 PBDOM 例外の処理 PBDOM は、 標準の PowerBuilder Exception ク ラ ス か ら 派生す る 例外 ク ラ ス PBDOM_EXCEPTION を定義 し ます。 Exception ク ラ ス の標準 Text プ ロ パテ ィ を使用 し て、 送出 さ れ る 例外の性質に関す る 詳細を知 る こ と がで き ます。 こ の ク ラ ス は PowerBuilder Exception ク ラ ス を拡張 し 、 1 つの メ ソ ッ ド GetExceptionCode を持ち ます。 こ の メ ソ ッ ド は、 送出 さ れ る 例外を識別す る 固有の コ ー ド を返 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 233 PBDOM 例外の処理 例外 コ ー ド の リ ス ト につい ては、 『PowerBuilder エ ク ス テ ン シ ョ ン リ フ ァ レ ン ス』 マニ ュ アルか、 オ ン ラ イ ン ヘルプの PBDOM 例外に関す る ト ピ ッ ク を参照 し て く だ さ い。 PBDOM は PowerBuilder エ ク ス テ ン シ ョ ン であ り 、 PBNI を使用 し て作 成 さ れ ます。 こ のエ ク ス テ ン シ ョ ン自体が PBXRuntimeError 例外を送 出す る 場合があ り ます。次の例では、try-catch ブ ロ ッ ク が、まず PBDOM 例外をチ ェ ッ ク し 、 次に PBXRuntimeError をチ ェ ッ ク し ます。 次の例では、渡 さ れた フ ァ イ ル名か ら PBDOM_DOCUMENT を作成 し 、 ProcessData と い う 名前のユーザ定義関数を使用 し て DOM ノ ー ド を処 理 し ます。 ProcessData 関数は、 以降の処理のために DOM 要素か ら 情 報を抽出す る 再帰関数であ る 場合 も あ り ます。 Long ll_ret ll_ret = XMLParseFile(filename, ValNever!) if ll_ret < 0 then return PBDOM_Builder domBuilder TRY domBuilder = CREATE PBDOM_Builder PBDOM_Document domDoc PBDOM_Element root domDoc = domBuilder.BuildFromFile( filename ) IF IsValid( domDoc ) THEN IF domDoc.HasChildren() THEN PBDOM_Object data[] IF domDoc.GetContent( data ) THEN Long ll_index, ll_count ll_count = UpperBound( data ) FOR ll_index = 1 TO ll_count ProcessData( data[ll_index], 0 ) NEXT END IF END IF END IF CATCH ( PBDOM_Exception pbde ) MessageBox( "PBDOM 例外 ", pbde.getMessage() ) CATCH ( PBXRuntimeError re ) MessageBox( "PBNI 例外 ", re.getMessage() ) END TRY 234 PowerBuilder 第 13 章 PowerBuilder XML サービ スの使い方 XML 名前空間 XML 名前空間を使用すれば、 グ ロ ーバルに固有名を作成 し て、 名前は 同 じ だが用語の種類が異な る と い う 要素 と 属性 と を区別す る こ と がで き ま す。 た と えば、 書店の XML 送 り 状 ド キ ュ メ ン ト で、 「date」 と い う 名前は、 会計処理では注文日を表 し 、 注文処理では発行日を表す場 合があ り ます。 XML 名前空間は、Web 上の リ ソ ース を一意に識別す る 短い文字列であ る Uniform Resource Identifier (URI) に よ っ て識別 さ れ ます。 各名前空 間内の要素 と 属性は、 要素名ま たは属性名 ( ロ ーカル名) に名前空間 の URI を使用 し て接頭辞を付け る こ と に よ っ て一意に識別で き ます。 接頭辞 と 名前空間の関 連付け xmlns を使用 し て、 名前空間宣言属性の一部 と し て XML 名前空間を宣 言 し ます。 名前空間宣言属性を使用 し て、 接頭辞を名前空間に関連付 け る こ と がで き ます。 た と えば、 次の名前空間宣言属性は、 http://www.pre.com の名前空間を 宣言 し 、 接頭辞 pre を こ の名前空間に関連付け ます。 xmlns:pre="http://www.pre.com" デ フ ォル ト の XML 名 前空間 XML 名前空間宣言が接頭辞を指定 し ない場合、その名前空間はデフ ォ ル ト の XML 名前空間にな り ます。 た と えば、 次の要素 digicom は名前 空間 と し て http://www.digital_software.com を宣言 し ます。 <digicom xmlns="http://www.digital_software.com" /> 名前空間 http://www.digital_software.com は、要素 digicom、お よ び digicom に含 ま れ る 可能性のあ る すべての子要素の、 ス コ ープ内でのデフ ォ ル ト の名前空間です。 digicom の子要素は、 自動的に こ の名前空間に配置 さ れ ます。 NONAMESPACE 宣言 次の名前空間宣言を NONAMESPACE 宣言 と 呼びます。 xmlns="" 含んでい る 要素 と その子要素を名前空間内に配置 し ない よ う 宣言 し ま す。 NONAMESPACE の名前空間内の要素には、空の文字列に設定 さ れ た名前空間の接頭辞お よ び URI セ ッ ト が付け ら れてい ます。 初期状態 PBDOM_ELEMENT か PBDOM_ATTRIBUTE を 初め て作成 し た と き 、 そ れ に は 名 前 が あ り ま せ ん。 名 前 空 間 の 情 報 は、 デ フ ォ ル ト で NONAMESPACE に設定 さ れてい ます。 (つま り 、 その名前空間の接頭 辞 と URI はど ち ら も 空の文字列です。 ) SetName メ ソ ッ ド を使用 し て ロ ーカル名を設定 し 、 SetNamespace メ ソ ッ ド を使用 し て名前空間の接 頭辞 と URI を設定 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 235 XML 名前空間 名前は必須 名前は PBDOM_ELEMENT お よ び PBDOM_ATTRIBUTE の必須プ ロ パ テ ィ ですが、 名前空間の情報は必須ではあ り ません。 解析済み ド キ ュ メ ン ト か らの取 り 出 し PBDOM_ELEMENT か PBDOM_ATTRIBUTE を解析済み ド キ ュ メ ン ト か ら プ ロ グ ラ ム に よ っ て取 り 出す と 、 名前 と 名前空間の情報が、 解析 済み ド キ ュ メ ン ト に含まれてい る Element か Attribute か ら 継承 さ れま す。 ただ し 解析後 も 、 SetName メ ソ ッ ド お よ び SetNamespace メ ソ ッ ド を使用 し て、 PBDOM_ELEMENT お よ び PBDOM_ATTRIBUTE の名前 と 名前空間の情報を さ ら に修正す る こ と がで き ます。 名前 と 名前空間の情報は、 内部で個別に格納 さ れ ます。 PBDOM_ELEMENT か PBDOM_ATTRIBUTE の名前の変更は、 名前空 間の情報には影響 し ません。 ま た、 名前空間の情報の変更は、 名前に 影響 し ません。 PBDOM_ATTRIBUTE の名前およ び名前空間の設定 W3C の 「XML 名前空間」 仕様 (セ ク シ ョ ン 5.3) では、 PBDOM_ATTRIBUTE の名前お よ び名前空間の設定に制限を設けてい ます。 1 つの タ グ内に同一名の属性を 2 つ置 く こ と はで き ません。 ま た、 同一 ロ ーカル名を含んでい る 修飾名、 かつ同一名前空間名に関連 付け ら れた接頭辞を含んでい る 修飾名を持つ属性を、 1 つの タ グ内に 2 つ置 く こ と はで き ません。 こ の仕様では、 不正な属性お よ び有効な属性 と し て以下の例が挙げ ら れてい ます。 <!-- http://www.w3.org is bound to n1 and n2 --> <x xmlns:n1="http://www.w3.org" xmlns:n2="http://www.w3.org" > <bad a="1" a="2" /> <bad n1:a="1" n2:a="2" /> </x> <!-- http://www.w3.org is bound to n1 and is the default --> <x xmlns:n1="http://www.w3.org" xmlns="http://www.w3.org" > <good a="1" b="2" /> <good a="1" n1:a="2" /> </x> 236 PowerBuilder 第 13 章 PowerBuilder XML サービ スの使い方 最初の例では、 <bad a="1" a="2" /> は、 1 つの タ グ内に同一名の属 性を 2 つ置 く こ と はで き ない と い う 規約に違反 し てい ま す。 2 つ目の タ グにあ る 複数の属性は、 ロ ーカル名は同 じ ですが接頭辞が異な る の で、 属性の名前は相互に異な り ます。 し か し 、 こ れ ら の属性の接頭辞 は同 じ 名前空間 URI http://www.w3.org を指すので、 同 じ オーナ要素内 にそれ ら の属性を配置す る こ と は不正です。 PBDOM シナ リ オ 以下のシナ リ オでは、 ど の よ う に し て PBDOM が上の要件を満たすか を示 し ます。 • PBDOM_ATTRIBUTE の SetName メ ソ ッ ド を呼び出す場合 : PBDOM_ATTRIBUTE の pbdom_attr1 のオーナ PBDOM_ELEMENT に含ま れている 既存の PBDOM_ATTRIBUTE が、 pbdom_attr1 に設定 さ れ る こ と にな っ てい る 名前 と 同 じ 名前を持ち、 かつ pbdom_attr1 と 同 じ 名前空間 URI を持つ場合、EXCEPTION_INVALID_NAME 例 外が送出 さ れ ます。 • PBDOM_ATTRIBUTE の SetNamespace メ ソ ッ ド を呼び出す場合 : PBDOM_ATTRIBUTE の pbdom_attr1 のオーナ PBDOM_ELEMENT に含 ま れてい る 既存の PBDOM_ATTRIBUTE が、 pbdom_attr1 と 同 じ 名前を持ち、 かつ pbdom_attr1 に設定 さ れ る こ と にな っ てい る も の と 同 じ 名前空間 URI を持つ場合、EXCEPTION_INVALID_NAME 例外が送出 さ れます。 • PBDOM_ELEMENT の SetAttribute(pbdom_attribute pbdom_attribute_ref) メ ソ ッ ド を呼び出す場合 : PBDOM_ELEMENT に、 入力 PBDOM_ATTRIBUTE と 同 じ 名前お よ び同 じ 名前空間 URI の属性がすでにあ る 場合、 既存の属性は入 力 PBDOM_ATTRIBUTE に置 き 換え ら れ ま す。 し たが っ て、 既存 の属性はオーナ要素か ら 削除 (デ タ ッ チ) さ れ ます。 • PBDOM_ELEMENT の SetAttributes(pbdom_attribute pbdom_attribute_array[]) メ ソ ッ ド を呼び出す場合 : 配列内で、 いずれか 2 つの PBDOM_ATTRIBUTE オブジ ェ ク ト が 同 じ 名前お よ び同 じ 名前空間 URI を持つ場合、 EXCEPTION_INVALID_NAME 例外が送出 さ れ ます。 名前の衝突 ま たは名前空間の衝突が配列内にない場合、 PBDOM_ELEMENT のすべての既存の属性が、 配列内で PBDOM_ATTRIBUTE オブ ジ ェ ク ト に置 き 換え ら れます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 237 XML 名前空間 注意 上のシナ リ オはすべて、NONAMESPACE 名前空間に含まれてい る PBDOM_ATTRIBUTE オブジ ェ ク ト に適用 さ れ る も のです。 • PBDOM_ELEMENT の SetAttribute(string strName, string strValue) メ ソ ッ ド を呼び出す場合 : 指定 さ れた名前 と 値を持つ PBDOM_ATTRIBUTE が新規に作成 さ れ、 PBDOM_ELEMENT に設定 さ れ ます。 PBDOM_ELEMENT に、 同 じ 名前で、 かつ NONAMESPACE 名前空間内に含 ま れてい る 属 性がすでにあ る 場合、その属性は PBDOM_ELEMENT か ら 削除(デ タ ッ チ) さ れます。 • PBDOM_ELEMENT の SetAttribute(string strName, string strValue, string strNamespacePrefix, string strNamespaceUri, boolean bVerifyNamespace) メ ソ ッ ド を呼び出す場合 : 指定 さ れた名前、 値、 お よ び名前空間の情報を持つ PBDOM_ATTRIBUTE が新規に作成 さ れ、 PBDOM_ELEMENT に 設定 さ れ ます。 PBDOM_ELEMENT に、 入力名前空間 URI と 同 じ 名前お よ び同 じ 名前空間 URI を持つ PBDOM_ATTRIBUTE がすで にあ る 場合、 その属性は PBDOM_ELEMENT か ら 削除 (デ タ ッ チ) さ れ ます。 例 次の例は、 入力 PBDOM_ATTRIBUTE と 同 じ 名前お よ び同 じ 名前空間 URI の属性が PBDOM_ELEMENT にすでに存在す る 場合に、 PBDOM_ATTRIBUTE を PBDOM_ELEMENT に対 し て設定す る と ど の よ う な影響があ る か を示 し ます。 次の例では、 次の ド キ ュ メ ン ト に基づいて PBDOM_DOCUMENT を作 成 し ます。 <root xmlns:pre1="http://www.pre.com" xmlns:pre2="http://www.pre.com"> <child1 pre1:a="123"/> </root> 次に、 PBDOM_ATTRIBUTE オブジ ェ ク ト を作成 し 、 名前を a に、 接 頭辞 URI を それぞれ pre2 と http://www.pre.com に設定 し ます。 PBDOM_ATTRIBUTE にオーナ PBDOM_ELEMENT が ま だ割 り 当て ら れていないので、 bVerifyNamespace 引数を FALSE に設定 し ます。 こ れ に よ り 、 事前に宣言 さ れた名前空間の信頼確認が失敗 し ます。 テ キ ス ト 値を 456 に設定 し ます。 238 PowerBuilder 第 13 章 PowerBuilder XML サービ スの使い方 child1 要素には、 接頭辞 pre1 が示す よ う に、 名前空間 http://www.pre.com に属す る a と い う 名前の属性がすでにあ り ます。 新規の PBDOM_ATTRIBUTE は接頭辞 pre2 を使用 し ますが、 こ れは同 じ 名前空間 URI を表すので、 新規の PBDOM_ATTRIBUTE を child1 に 正常に設定す る と 、既存の pre1:a は新規の PBDOM_ATTRIBUTE pre2:a に置 き 換え ら れ ます。 PBDOM_BUILDER pbdom_buildr PBDOM_DOCUMENT pbdom_doc PBDOM_ATTRIBUTE pbdom_attr string strXML = "<root xmlns:pre1=~"http://www.pre.com~" xmlns:pre2=~"http://www.pre.com~"><child1 pre1:a=~"123~"/></root>" try pbdom_buildr = Create PBDOM_BUILDER pbdom_doc = pbdom_buildr.BuildFromString (strXML) // PBDOM_ATTRIBUTE を作成 し 、 そのプ ロパテ ィ を設定 し ます。 pbdom_attr = Create PBDOM_ATTRIBUTE pbdom_attr.SetName ("a") pbdom_attr.SetNamespace ("pre2", & "http://www.pre.com", false) pbdom_attr.SetText("456") // child1 要素の取得を試み、 // 新規属性を それに設定 し ます。 pbdom_doc.GetRootElement(). & GetChildElement("child1").SetAttribute(pbdom_attr) pbdom_doc.SaveDocument & ("pbdom_elem_set_attribute_1.xml") catch (PBDOM_EXCEPTION except) MessageBox ("PBDOM_EXCEPTION", except.GetMessage()) end try SaveDocument か ら の XML 出力は、 次の よ う にな り ます。 <root xmlns:pre1="http://www.pre.com" xmlns:pre2="http://www.pre.com"> <child1 pre2:a="456"/> </root> ア プ リ ケーシ ョ ン テ ク ニ ッ ク 239 XML 名前空間 240 PowerBuilder 第 1 4 章 グ ラ フ の操作 こ の章について こ の章では、 実行時に、 アプ リ ケーシ ョ ン のグ ラ フ にア ク セ ス し て変更す る ための コ ー ド の記述方法について説明 し ます。 内容 項目 グ ラ フ の使い方 グ ラ フへのデー タ 表示 グ ラ フ のプ ロ パテ ィ の修正 デー タ のプ ロ パテ ィ へのア ク セ ス ポ イ ン ト ア ン ド ク リ ッ ク の使い方 ページ 241 243 245 247 249 グ ラ フ の使い方 PowerBuilder でグ ラ フ を表示す る には、 2 つの方法があ り ます。 • デー タ ウ ィ ン ド ウ で、 デー タ ウ ィ ン ド ウ デー タ ソ ース か ら 取 り 出 し たデー タ を使用す る 方法 • ユーザ オブジ ェ ク ト ま たは ウ ィ ン ド ウ 内のグ ラ フ コ ン ト ロ ー ルで、 アプ リ ケーシ ョ ン コ ー ド か ら 提供 さ れたデー タ を使用 す る 方法 こ の章では、グ ラ フ コ ン ト ロ ールについて検討 し 、アプ リ ケーシ ョ ン コ ー ド を使用 し て グ ラ フ にデー タ を提供 し 、 その外観を操作す る 方法について説明 し ます。 デー タ ウ ィ ン ド ウ のグ ラ フ についての詳細は、『デー タ ウ ィ ン ド ウ プ ロ グ ラ マーズ ガ イ ド 』 マニ ュ アル と 『デー タ ウ ィ ン ド ウ リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 ペ イ ン タ におけ る グ ラ フ のデザ イ ン と グ ラ フ プ ロ パテ ィ の設定に ついては、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 241 グ ラ フの使い方 コ ード における グラ フ コ ン ト ロ ールの操作 ウ ィ ン ド ウ 内のグ ラ フ コ ン ト ロ ールは、 使用可能 / 使用不可、 表示 / 非表示を切 り 替え る こ と がで き 、 ド ラ ッ グ ア ン ド ド ロ ッ プ を使用で き ます。 ま た、 グ ラ フ コ ン ト ロ ールの イ ベン ト お よ び補助的な グ ラ フ関 数を使用す る コ ー ド も 記述で き ます。 グ ラ フ コ ン ト ロール のプ ロパテ ィ グ ラ フ コ ン ト ロール のイ ベン ト グ ラ フ にア ク セ ス す る (そ し てオプシ ョ ン で修正す る ) には、 実行時 に ス ク リ プ ト で グ ラ フ のプ ロ パ テ ィ を 操作 し ま す。 グ ラ フ の プ ロ パ テ ィ には次の 2 種類があ り ます。 • こ れは、 グ ラ フ を作成す る と き にデー タ ウ ィ ン ド ウ ペ イ ン タ で最初に設定す る プ ロ パテ ィ です。 グ ラ フ の種類、 タ イ ト ル、 軸 ラ ベル を設定 し 、 軸に目盛を付け る か ど う か を指定 し ます。 • こ れ ら のプ ロ パテ ィ は、 実行時にデー タ が グ ラ フ に ロ ー ド さ れた と き にだけ関係 し ま す。 こ れ ら のプ ロ パテ ィ では、 グ ラ フ内の系列数 (系列は実行時に作成 さ れ る )、 系列の横 棒 ま たは縦棒の色、 系列がオーバ レ イ か ど う か、 項目の文字 (項 目は実行時に作成 さ れ る ) な ど を設定 し ます。 グ ラ フ定義自体のプ ロパテ ィ デー タ のプ ロパテ ィ グ ラ フ コ ン ト ロ ールには、表 14-1 に リ ス ト さ れてい る イ ベン ト があ り ます。 表 14-1: グ ラ フ コ ン ト ロールのイ ベン ト Clicked DragLeave Constructor DragWithin Destructor GetFocus DoubleClicked LoseFocus DragDrop Other DragEnter RButtonDown た と えば、 (グ ラ フ が使用で き る 状態で) エ ン ド ユーザがグ ラ フ を ク リ ッ ク し た と き 、 ま たはオブジ ェ ク ト を グ ラ フ上に ド ラ ッ グ し た と き に起動 さ れ る よ う な ス ク リ プ ト を記述で き ます。 グ ラ フ コ ン ト ロール 用の関数 242 表 14-2 の PowerScript グ ラ フ関数を使っ て、 グ ラ フ のデー タ を操作で き ます。 PowerBuilder 第 14 章 グ ラ フの操作 表 14-2: PowerScript グ ラ フ関数 関数 動作内容 AddCategory 項目の追加 デー タ ポ イ ン ト の追加 系列の追加 項目の削除 デー タ ポ イ ン ト の削除 系列の削除 ク リ ッ プボー ド か ら グ ラ フ にデー タ を コ ピー テ キ ス ト フ ァ イ ル内のデー タ を グ ラ フ に コ ピー 文字列の内容を グ ラ フ に コ ピー ほかの項目の前に項目を挿入 AddData AddSeries DeleteCategory DeleteData DeleteSeries ImportClipboard ImportFile ImportString InsertCategory InsertData InsertSeries ModifyData Reset 系列内のほかのデー タ ポ イ ン ト の前にデー タ ポ イ ン ト を挿入 ほかの系列の前に系列を挿入 デー タ ポ イ ン ト の値を変更 グ ラ フ のデー タ を リ セ ッ ト グ ラ フ へのデー タ 表示 こ の節では、 空のグ ラ フ にデー タ を表示す る 方法を示 し ます。 AddSeries 関数の使い 方 AddSeries 関数を使用 し て系列を作成 し ます。AddSeries 関数の構文は次 の と お り です。 graphName.AddSeries ( seriesName ) AddSeries 関数は、 作成 さ れた系列を識別す る 整数を返 し ます。 最初の 系列には 1、 2 番目には 2 の よ う に番号が付け ら れ ます。 一般に こ の番 号は、 系列を操作す る ほかのグ ラ フ関数の最初の引数 と し て使用 さ れ ます。 ス テ ラ と い う 名前の系列を作成す る には、 次の コ ー ド を使用 し ます。 int SNum SNum = gr_1.AddSeries(" ス テ ラ ") AddData 関数の使い 方 AddData 関数を使っ て、 指定 し た系列にデー タ ポ イ ン ト を追加 し ます。 AddData 関数の構文は次の と お り です。 graphName.AddData ( seriesNumber, value, categoryLabel ) ア プ リ ケーシ ョ ン テ ク ニ ッ ク 243 グ ラ フへのデー タ 表示 AddData 関数の最初の引数は、PowerBuilder に よ っ てその系列に割 り 当 て ら れてい る 番号です。 し たが っ て、 上記の よ う に変数 SNum に番号 が格納 さ れてい る ス テ ラ と い う 系列に 2 つのデー タ ポ イ ン ト を追加す る には、 次の コ ー ド を使用 し ます。 gr_1.AddData(SNum, 12, "Q1") // 項目は Q1 です。 gr_1.AddData(SNum, 14, "Q2") // 項目は Q2 です。 系列番号の取得 FindSeries 関数を使用 し て、系列に割 り 当て ら れた番号を知 る こ と がで き ます。 FindSeries 関数は系列番号を返 し ます。 こ れは、 汎用関数を記 述 し て グ ラ フ を操作す る と き に便利です。 例 四半期ご と のプ リ ン タ 販売台数のグ ラ フ を作成す る には、 次の ス ク リ プ ト を使用 し てデー タ を グ ラ フ に し ます。 gr_1.Reset(All!)// グ ラ フ を リ セ ッ ト し ます。 // 最初の系列を作成 し 、 デー タ を表示 し ます。 int SNum SNum = gr_1.AddSeries(" ス テ ラ ") gr_1.AddData(SNum, 12, "Q1") // 項目は Q1 gr_1.AddData(SNum, 14, "Q2") // 項目は Q2 gr_1.Adddata(SNum, 18, "Q3") // 項目は Q3 gr_1.AddData(SNum, 25, "Q4") // 項目は Q4 // 2 番目の系列を作成 し 、 デー タ を表示 し ます。 SNum = gr_1.AddSeries(" コ ス ミ ッ ク ") です。 です。 です。 です。 // 系列 1 と 同 じ 項目を使用する ため、 デー タ は // 系列 1 のデー タ の横に表示 さ れます。 gr_1.AddData(SNum, 18, "Q1") gr_1.AddData(SNum, 24, "Q2") gr_1.Adddata(SNum, 38, "Q3") gr_1.AddData(SNum, 45, "Q4") // 3 番目の系列を作成 し 、 デー タ を表示 し ます。 SNum = gr_1.AddSeries(" ギ ャ ラ ク テ ィ ッ ク ") gr_1.AddData(SNum, 44, "Q1") gr_1.AddData(SNum, 44, "Q2") gr_1.Adddata(SNum, 58, "Q3") gr_1.AddData(SNum, 65, "Q4") 244 PowerBuilder 第 14 章 グ ラ フの操作 次に実行結果のグ ラ フ を示 し ます。 実行時には、 グ ラ フ関数を介 し て、 ウ ィ ン ド ウ 内のグ ラ フ のデー タ を 追加、 修正、 ま たは削除で き ます。 詳細情報 各グ ラ フ 関数についての詳細は、 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ アルを参照 し て く だ さ い。 グ ラ フ のプ ロパテ ィ の修正 ウ ィ ン ド ウ ま たはユーザ オブ ジ ェ ク ト ペ イ ン タ で グ ラ フ を定義す る と き は、 その動作 と 表示方法を指定 し ます。 た と えば、 何 ら かの タ イ ト ルを も つ縦棒グ ラ フ と し て グ ラ フ を定義 し 、 数値軸を 4 つの目盛 り に分割 し ます。 各入力項目は、 グ ラ フ のプ ロ パテ ィ に対応 し ます。 ど の グ ラ フ に も 、 グ ラ フ の種類を指定す る カ タ ロ グ型の属性 GraphType があ り ます。 グ ラ フ の種類の動的な変更 グ ラ フ の種類 を 変更す る 場合、 新 し い グ ラ フ を正 し く 定義す る には、 必要に応 じ てほかのプ ロ パテ ィ も 変更 し なければな り ません。 実行時に こ れ ら のグ ラ フ プ ロ パテ ィ を変更す る には、 ス ク リ プ ト でグ ラ フ プ ロ パテ ィ に値を割 り 当て ます。 た と えば、 グ ラ フ gr_emp の種 類を縦棒グ ラ フ に変更す る には、 次の コ ー ド を使用 し ます。 gr_emp.GraphType = ColGraph! 実行時にグ ラ フ の タ イ ト ルを変更す る には、次の コ ー ド を使用 し ます。 gr_emp.Title = " 新 し い タ イ ト ル " ア プ リ ケーシ ョ ン テ ク ニ ッ ク 245 グ ラ フのプ ロパテ ィ の修正 グラ フ 要素の表示 グ ラ フ は、 タ イ ト ル、 凡例、 お よ び軸で構成 さ れ ます。 こ れ ら の要素 には、 それぞれ表示プ ロ パテ ィ があ り ます。 こ れ ら の表示プ ロ パテ ィ は、 grDispAttr と い う 名前の Graph のサブオブジ ェ ク ト (構造体) にプ ロ パテ ィ と し て格納 さ れてい ます。 グ ラ フ には、 タ イ ト ルの文字を指定す る Title プ ロ パテ ィ があ り ます。 ま た、 grDispAttr 型の TittleDispAttr プ ロ パテ ィ には、 フ ォ ン ト やサ イ ズ、 斜体な ど タ イ ト ル文字の特性を指定す る プ ロ パテ ィ が入っ てい ま す。 同様に、グ ラ フ にはそれぞれプ ロ パテ ィ を備え た 2 本の軸があ り ます。 軸のプ ロ パテ ィ は、 grAxis と い う 名前の Graph サブオブジ ェ ク ト (構造 体) に格納 さ れてい ます。 値の自動 ス ケー リ ン グの有無、 大小の区分 の数、 軸 ラ ベルな ど の数値軸プ ロ パテ ィ を指定す る ためのプ ロ パテ ィ が、 grAxis 型の Values プ ロ パテ ィ に入っ てい ます。 以下にグ ラ フ のプ ロ パテ ィ を示 し ます。 Graph int Height int Depth grGraphType GraphType boolean Border string Title … grDispAttr TitleDispAttr, LegendDispAttr, PieDispAttr string FaceName int TextSize boolean Italic … grAxis Values, Category, Series boolean AutoScale int MajorDivisions int MinorDivisions string Label … グラ フ 要素の参照 表示プ ロ パテ ィ を参照す る には、 ド ッ ト (.) 表記を使用 し ます。 た と えば、 グ ラ フ タ イ ト ルのプ ロ パテ ィ の 1 つに、 その文字が斜体か ど う か を指定す る も のがあ り ます。 こ の情報は、 グ ラ フ の TitleDispAttr プ ロ パテ ィ にあ る Boolean 型の Italic プ ロ パテ ィ に格納 さ れてい ます。 246 PowerBuilder 第 14 章 グ ラ フの操作 た と えば、 グ ラ フ gr_emp の タ イ ト ルを斜体にす る には、 次の コ ー ド を 使用 し ます。 gr_emp.TitleDispAttr.Italic = TRUE ま た、 グ ラ フ の数値軸を自動 ス ケー リ ン グす る には、 次の コ ー ド を使 用 し ます。 gr_emp.Values.Autoscale = TRUE 数値軸の ラ ベルの文字を変更す る には、 次の コ ー ド を使用 し ます。 gr_emp.Values.Label = " 新 し い ラ ベル " 数値軸の ラ ベル文字の位置を変更す る には、次の コ ー ド を使用 し ます。 gr_emp.Values.LabelDispAttr.Alignment = Left! グ ラ フ のプ ロ パテ ィ の一覧につい ては、 『オブ ジ ェ ク ト と コ ン ト ロ ー ル』 マニ ュ アルを参照す る か、 ま たはブ ラ ウ ザを使用 し て く だ さ い。 ブ ラ ウ ザについての詳細は、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 デー タ のプ ロパテ ィ へのア ク セス 実行時に、 グ ラ フ のデー タ に関連付け ら れてい る プ ロ パテ ィ にア ク セ スす る には、 PowerScript グ ラ フ関数を使用 し ます。 デー タ には、 以下 の よ う な種類の関数が関連付け ら れてい ます。 関数の使い方 • グ ラ フ のデー タ に関す る 情報を提供す る 関数 • グ ラ フ か ら のデー タ を保存す る 関数 • デー タ の色や模様な ど の表示プ ロ パテ ィ を変更す る 関数 グ ラ フ コ ン ト ロ ール内のグ ラ フ に対す る 関数を呼び出すには、 次の構 文を使用 し ます。 graphControlName.FunctionName ( Arguments ) ウ ィ ン ド ウ 内のグ ラ フ gr_printer の項目数を取得す る には、 次の よ う に し ます。 Ccount = gr_printer.CategoryCount() ア プ リ ケーシ ョ ン テ ク ニ ッ ク 247 デー タ のプ ロパテ ィ へのア ク セス デー タ ウ ィ ン ド ウにおけるグ ラ フ の さ ま ざ ま な構文 次に示す よ う に、 グ ラ フ がデー タ ウ ィ ン ド ウ 内にあ る 場合には、 同 じ 関数の構文が も っ と 複雑にな り ます。 DataWindowName.FunctionName ( "graphName", otherArguments… ) 詳細については、 『デー タ ウ ィ ン ド ウ プ ロ グ ラ マーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 データ の情報の取得 表 14-3 の PowerScript 関数を使用すれば、 実行時にグ ラ フ内のデー タ に関す る 情報を取得で き ます。 表 14-3: 実行時に情報を取得する ための PowerScript 関数 関数 CategoryCount CategoryName DataCount FindCategory FindSeries GetData GetDataPieExplode GetDataStyle GetDataValue GetSeriesStyle ObjectAtPointer SeriesCount SeriesName 受け取る情報 グ ラ フ内の項目数 指定 さ れた項目番号に対応す る 項目名 系列内のデー タ ポ イ ン ト 数 指定 さ れた項目名に対応す る 項目番号 指定 さ れた系列名に対応す る 系列番号 指定 さ れた系列 と 位置に対応す る デー タ ポ イ ン ト 値 (GetDataValue の方が柔軟性が高い) 円グ ラ フ の ス ラ イ ス の展開割合 指定 さ れたデー タ ポ イ ン ト の色や模様な ど表示関係 のプ ロ パテ ィ 指定 さ れた系列 と 位置に対応す る デー タ ポ イ ン ト 値 指定 さ れた系列の色や模様な ど の表示関係のプ ロ パ ティ マ ウ ス が ク リ ッ ク さ れた と き にポ イ ン ト さ れてい る グ ラ フ の要素 グ ラ フ内の系列数 指定 さ れた系列番号に対応す る 系列名 グラ フ のデータ の保存 表 14-4 の PowerScript 関数を使っ て、 グ ラ フ か ら のデー タ を保存で き ます。 248 PowerBuilder 第 14 章 グ ラ フの操作 表 14-4: グ ラ フ のデー タ の保存に使用する PowerScript 関数 関数 Clipboard SaveAs 動作内容 指定 さ れた グ ラ フ の ビ ッ ト マ ッ プ イ メ ージ を ク リ ッ プボー ド に コ ピー 基にな る グ ラ フ 内のデー タ を ク リ ッ プボー ド ま たは さ ま ざ ま な書式の フ ァ イ ルに保存 色や模様、 そのほかのデータ の修正 表 14-5 の PowerScript 関数を使っ て、 グ ラ フ内のデー タ の表示方法を 修正で き ます。 表 14-5: デー タ の表示を修正する ための PowerScript 関数 関数 ResetDataColors SetDataPieExplode SetDataStyle SetSeriesStyle 動作内容 指定 さ れたデー タ ポ イ ン ト の色を リ セ ッ ト 円グ ラ フ内の ス ラ イ ス を展開 指定 さ れたデー タ ポ イ ン ト の色や模様な ど の表示関 係のプ ロ パテ ィ を設定 系列の色や模様な ど の表示関係のプ ロ パテ ィ を設定 ポ イ ン ト ア ン ド ク リ ッ ク の使い方 エ ン ド ユーザは、 実行時にグ ラ フ を ク リ ッ ク で き ます。 PowerScript に は、何が ク リ ッ ク さ れたか と い う 情報を格納す る ObjectAtPointer 関数が あ り ます。 こ の関数は、 Clicked イ ベン ト において さ ま ざ ま な方法で使 用で き ます。 た と えば、 グ ラ フ内のデー タ 値を ポ イ ン ト ア ン ド ク リ ッ ク し て、 メ ッ セージ ボ ッ ク ス内にその値に関す る 情報を表示す る 機能 を付け る こ と がで き ます。 こ の節では、 その方法について説明 し ます。 Clicked イ ベ ン ト と グ ラフ エ ン ド ユーザが グ ラ フ を ク リ ッ ク し た と き に ア ク シ ョ ン が起動す る よ う に、 グ ラ フ の コ ン ト ロ ールに Clicked ス ク リ プ ト を記述 し ます。 コ ン ト ロ ールが有効でなければ、 Clicked イ ベン ト は発生 し ません。 ObjectAtPointer 関数 の使い方 ObjectAtPointer 関数の構文は、 以下の と お り です。 graphName.ObjectAtPointer ( seriesNumber, dataNumber ) ObjectAtPointer 関数は、 Clicked イ ベン ト の最初の ス テー ト メ ン ト で呼 び出 さ なければな り ません。 呼び出 さ れた ObjectAtPointer 関数は、 3 つの こ と を行い ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 249 ポ イ ン ト ア ン ド ク リ ッ ク の使い方 • ク リ ッ ク さ れたオブジェ ク ト の種類を 、カ タ ロ グ 値 grObjectType と し て返 し ます。 た と えばエ ン ド ユーザがデー タ ポ イ ン ト を ク リ ッ ク し た場合、 ObjectAtPointer 関数は TypeData! を 返 し ま す。 エン ド ユーザがグラ フ のタ イ ト ルを ク リ ッ ク し た場合には、 ObjectAtPointer 関数は TypeTitle! を返 し ます。 grObjectType のカ タ ロ グ値をすべて閲覧す る には、ペ イ ン タ バーの [オブジ ェ ク ト ブ ラ ウ ザ] を ク リ ッ ク し て、 ブ ラ ウ ザを開いて [カ タ ロ グ デー タ 型] タ ブ を選択 し て く だ さ い。 • ポ イ ン タ が置かれた系列の番号を、 変数 seriesNumber に格納 し ま す。 こ れは参照に よ っ て渡 さ れ る 引数です。 • デー タ ポ イ ン ト の番号を、 変数 dataNumber に格納 し ます。 こ れ も 参照に よ っ て渡 さ れ る 引数です。 系列番号 と デー タ ポ イ ン ト 番号を取得 し た ら 、 そのほかのグ ラ フ関数 を使っ て情報を取得 し た り 情報を提供で き ます。 た と えば、 ク リ ッ ク さ れたデー タ ポ イ ン ト の値を、 エ ン ド ユーザに レ ポー ト し ます。 例 ウ ィ ン ド ウ に gr_sale と い う グ ラ フ があ る と し ます。 gr_sale の Clicked イ ベン ト に対 し て次の よ う な ス ク リ プ ト を記述す る と 、 以下の よ う な メ ッ セージ ボ ッ ク ス が開 き ます。 • • エ ン ド ユーザが系列を ク リ ッ ク す る と (つま り ObjectAtPointer 関数 が TypeSeries! を返す と ) 、 ク リ ッ ク し た系列の名前が メ ッ セージ ボ ッ ク ス に表示 さ れ ま す。 こ の ス ク リ プ ト では、 SeriesName 関数 を使っ て、 ObjectAtPointer 関数に よ っ て格納 さ れてい る 系列番号に 対応す る 系列名を取得 し ます。 エ ン ド ユーザがデー タ ポ イ ン ト を ク リ ッ ク す る と (つま り ObjectAtPointer 関数が TypeData! を返す と )、 ク リ ッ ク さ れた系列の 名前 と 値の リ ス ト が メ ッ セージ ボ ッ ク ス に表示 さ れます。 こ の ス ク リ プ ト では、 GetData 関数を使っ て、 デー タ の系列番号 と デー タ ポ イ ン ト 番号に対応す る デー タ 値を取得 し ます。 int SeriesNum, DataNum double Value grObjectType ObjectType string SeriesName, ValueAsString // 次の関数は、 ク リ ッ ク さ れた系列の番号を // SeriesNum に格納 し 、 ク リ ッ ク さ れたデー タ ポ イ ン ト // の番号を DataNum に格納 し ます。 ObjectType = & gr_sale.ObjectAtPointer (SeriesNum, DataNum) 250 PowerBuilder 第 14 章 グ ラ フの操作 IF ObjectType = TypeSeries! THEN SeriesName = gr_sale.SeriesName (SeriesNum) MessageBox(" グ ラ フ ", & SeriesName + " の系列がク リ ッ ク さ れま し た。 ") ELSEIF ObjectType = TypeData! THEN Value = gr_sale.GetData (SeriesNum, DataNum) ValueAsString = String(Value) MessageBox(" グ ラ フ ", & gr_sale.SeriesName (SeriesNum) + & " の値は " + ValueAsString + " です。 ") END IF ア プ リ ケーシ ョ ン テ ク ニ ッ ク 251 ポ イ ン ト ア ン ド ク リ ッ ク の使い方 252 PowerBuilder 第 1 5 章 リ ッ チ テキス ト の作成方法 こ の章について こ の章では、 リ ッ チテ キ ス ト デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト と リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールにおけ る 、 リ ッ チテ キ ス ト の使い方について説明 し ます。 内容 は じ めに 項目 アプ リ ケーシ ョ ンにおけ る リ ッ チテ キ ス ト の使い方 リ ッ チテ キ ス ト デー タ ウ ィ ン ド ウ オブジ ェ ク ト の使い方 リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールの使い方 リ ッ チテ キ ス ト と エン ド ユーザ ページ 253 254 257 275 こ の章は、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルで解説 さ れてい る 、 リ ッ チテ キ ス ト デー タ ウ ィ ン ド ウ オブジ ェ ク ト と リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールの作成方法を 知っ てい る こ と を前提 と し てい ます。 ア プ リ ケーシ ョ ンにおける リ ッ チ テキス ト の使い方 リ ッ チテ キ ス ト 形式 (RTF) は、 1 つの ASCII 文書中に書式や文書 内容を指定す る テ キ ス ト フ ァ イ ルの標準形式です。 リ ッ チテ キ ス ト フ ォ ーマ ッ ト を サポー ト す る エデ ィ タ は、 フ ォーマ ッ ト 命令を 解釈 し フ ォーマ ッ ト し たテ キ ス ト を表示 し ます。 アプ リ ケーシ ョ ン では、 た と えば以下の よ う な処理が可能です。 • リ ッ チテ キ ス ト 文書の作成用の ウ ィ ン ド ウ を表示す る 本格的な ワ ープ ロ 機能ではあ り ませんが、 リ ッ チテ キ ス ト エ デ ィ ッ ト コ ン ト ロ ールを使用す る こ と に よ っ てエ ン ド ユーザ は、段落、単語、お よ び文字に書式を設定す る こ と がで き ます。 • 差 し 込み印刷をす る 開発者あ る いはエ ン ド ユーザは、 デー タ ベース カ ラ ムに関連 付け ら れた入力フ ィ ール ド を使用 し て、 文書を作成で き ます。 • ア プ リ ケーシ ョ ン テ ク ニ ッ ク 書式付 き テ キ ス ト の レ ポー ト を表示す る 253 リ ッ チ テキス ト デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト の使い方 リ ッ チ テ キ ス ト デー タ ウ ィ ン ド ウ オ ブ ジ ェ ク ト は、 基本的に、 デー タ 入力 よ り も デー タ 表示のために使用 さ れ る オブジ ェ ク ト で す。 ほかの提示様式 と 異な り 、 デー タ ウ ィ ン ド ウ 提示様式では編 集様式は使用で き ません。 • リ ッ チテ キ ス ト を String 型のデー タ と し てデー タ ベース に格納 し 、 リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールで表示 さ せ る リ ッ チテ キスト の作成 ワー ド プ ロ セ ッ サ リ ッ チ テ キ ス ト 形式の フ ァ イ ル を 保存 あ る いはエ ク ス ポー ト で き る ワー ド プ ロ セ ッ サ を使用 し て、 リ ッ チテ キ ス ト を作成で き ます。 PowerBuilder だけの 入力 フ ィ ール ド 多 く の ワ ー ド プ ロ セ ッ サではなん ら かの種類の フ ィ ール ド を サポー ト し てい ますが、 通常それ ら の フ ィ ール ド はほかの リ ッ チテ キ ス ト と 互 換 性 が あ り ま せ ん。 PowerBuilder ア プ リ ケ ー シ ョ ン に お い て 入 力 フ ィ ール ド を指定す る には、 PowerBuilder の リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールを使用 し て フ ィ ール ド を挿入 し なければな り ません。 デー タ ベースにおける リ ッ チ テキス ト リ ッ チテキ ス ト は ASCII 文字によ っ て表現さ れている ため、データ ベー ス の String 型カ ラ ム や文字列変数に格納する こ と も でき ま す。 データ ベース の String 型カ ラ ム から リ ッ チテ キ ス ト を 取得し 、 PasteRTF 関数 を使用 し て リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールに書式付 き テ キ ス ト を表示で き ます。 リ ッ チ テキス ト デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト の使い方 こ の節では、 以下の項目について説明 し ます。 ページ ス ク ロール 254 • ほかの提示様式 と のページ ス ク ロ ールの違い • 新 し い行におけ る デフ ォ ル ト 値 と 入力条件則 • エ ン ド ユーザが変更を行っ た と き の動作 リ ッ チテ キ ス ト データ ウ ィ ン ド ウ オブジ ェ ク ト では、 複数ページ の リ ッ チテ キ ス ト (文書テ ン プ レ ー ト ) を作成で き 、 1 行のデー タ が複 数ページに ま たが る こ と も あ り ます。 こ れに対 し て、 ほかの提示様式 では、 1 ページに複数行のデー タ が表示 さ れ る こ と も あ り ます。 PowerBuilder 第 15 章 リ ッ チ テキス ト の作成方法 リ ッ チテ キ ス ト デー タ ウ ィ ン ド ウ オブジ ェ ク ト では、 1 ページの構成 がほかの提示様式 と 異な る ため、 ス ク ロ ール関数はほかの提示様式 と は異な る 動作を し ます。 • ScrollNextRow 関数 と ScrollPriorRow 関数は、 デー タ ベース テーブル の行か ら 行へ と 移動す る ので、 リ ッ チテ キ ス ト (文書テ ン プ レ ー ト ) 内において、 前の行ま たは次の行のデー タ を表示 し ます。 • ScrollNextPage 関数 と ScrollPriorPage 関数は、 行ではな く 、 文書の ページ を ス ク ロ ール し ます。 ス ク ロ ールす る と 、 行か ら 行へ と 移動 し ま す。 文書の最終 ページで次ページへス ク ロ ールす る と 、 次の行の最初のページへ移動 し ます。 ユーザは、 文書内の多 く の イ ン ス タ ン ス で ス ク ロ ールの効果 を利用す る こ と がで き ます。 改ページ 新 し い行 : デ フ ォル ト のデー タ と 入力条件則 入力フ ィ ール ド に値がない場合、入力フ ィ ール ド は非表示にな り ます。 入力フ ィ ール ド が見え る よ う に、デー タ が検索 さ れ る 前は、入力フ ィ ー ル ド には疑問符 (??) が表示 さ れ ま す。 新 し い行に対 し ては、 カ ラ ム のデー タ 型を基に入力フ ィ ール ド に初期値が設定 さ れ ます。 カ ラ ム にすでに初期値が設定 さ れてい る 場合は、 その値が使用 さ れ ま す。 初期値が設定 さ れていない場合、 PowerBuilder は、 String 型のカ ラ ム に対 し ては空白文字 (スペース) を、 numeric 型のカ ラ ムに対 し ては ゼ ロ を初期値 と し て設定 し ます。 PowerBuilder で提供 さ れ る デフ ォ ル ト の初期値が入 力条件則を満た さ ない場合、 新 し い行が挿入 さ れた直後にエ ン ド ユー ザに入力条件則エ ラ ーが表示 さ れ ます。 こ れを回避す る ためには、 入 力条件則に合 う 初期値を指定す る 必要があ り ます。 入力条件則エ ラ ー エ ン ド ユーザによ る 変更 編集禁止の指定 リ ッ チテ キ ス ト オブジ ェ ク ト プ ロ パテ ィ シー ト の[全 般] タ ブ ページで [編集禁止] チ ェ ッ ク ボ ッ ク ス を オ ンにす る と 、 エ ン ド ユーザはデー タ お よ びテ キ ス ト を一切変更で き な く な り ます。 [ポ ッ プア ッ プ メ ニ ュ ー] チ ェ ッ ク ボ ッ ク ス を オ ン に し た場合は、 エ ン ド ユーザはプ ロ パテ ィ シー ト を開 く こ と がで き る ので、 [編集禁止] チ ェ ッ ク ボ ッ ク ス を オ フ に し て、 デー タ ウ ィ ン ド ウ オブジ ェ ク ト を編 集可能にす る こ と がで き ます。 編集可能な リ ッ チテ キ ス ト デー タ ウ ィ ン ド ウ では、エ ン ド ユーザはカ ラ ム の入力フ ィ ール ド を選択 し て点滅 さ せ、 スペース キーを押 し て ア ク テ ィ ブに し て、 値を入力す る こ と がで き ます。 入力 フ ィ ール ド のプ ロ パテ ィ シー ト を表示 し 、 [デー タ 値] テ キ ス ト ボ ッ ク ス を 編集す る こ と も で き ま す。 計算 フ ィ ール ド に 対応す る 入力 フ ィ ール ド の場合、 [デー タ 値] テ キ ス ト ボ ッ ク ス は変更で き ません。 入力フ ィ ール ド ア プ リ ケーシ ョ ン テ ク ニ ッ ク 255 リ ッ チ テキス ト デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト の使い方 デー タ の代わ り に入力 フ ィ ール ド 名 を 表示 さ せ る こ と も で き ま す。 デー タ の代わ り に入力フ ィ ール ド 名を表示 し て、 エ ン ド ユーザが独自 に リ ッ チ テ キ ス ト デー タ ウ ィ ン ド ウ を 作成で き る 編集環境 を 提供す る こ と も で き ます。 し か し 、 エ ン ド ユーザに編集環境を提供 し たい場 合は、 リ ッ チテ キ ス ト デー タ ウ ィ ン ド ウ よ り も 、 ス ク リ プ ト で制御で き る リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ール を使用す る 方が適 し て い ます。 リ ッ チ テキス ト エ ン ド ユーザが テ キ ス ト ま たは書式 を 変更 し た場合 は、 文書テ ン プ レー ト が変更 さ れた こ と にな り ます。 変更はすべての 行に現れます。 文書テ ン プ レー ト に対す る 変更を保存す る ス ク リ プ ト を記述 し ておか ない と 、 エ ン ド ユーザが行っ た変更は現行のセ ッ シ ョ ン だけに適用 さ れ、 次回ま で保持 さ れ ません。 変更を保存す る には、 CopyRTF 関数を使用 し ます。 こ の関数は、 入力 フ ィ ール ド を含むすべてのテ キ ス ト を取得 し ますが、 行デー タ は取得 し ません。 その後、 取得 し た文字列を フ ァ イ ル ま たはデー タ ベー ス に 保存 し ま す。 こ れに よ っ て、 エ ン ド ユーザが リ ッ チテ キ ス ト デー タ ウ ィ ン ド ウ を操作す る と き に、前回の変更点を復元 し て表示 さ せた り 、 オ リ ジナルの文書テ ン プ レー ト に戻 し て表示 さ せ る こ と がで き ます。 リ ッ チ テキス ト デー タ ウ ィ ン ド ウにおける 関数 デー タ ウ ィ ン ド ウ コ ン ト ロ ールには、 数多 く の関数があ り ます。 同様に動作する関数 Update 関数や Retrieve 関数の よ う なデー タ 操作関 数は、 すべての提示様式のデー タ ウ ィ ン ド ウ オブジ ェ ク ト に対 し て同 様に動作 し ます。 コ ン ト ロ ール内のオブ ジ ェ ク ト が リ ッ チ テ キ ス ト デー タ ウ ィ ン ド ウ オブジ ェ ク ト であ る 場合には、 一部の関数は適用 さ れないか、 異な る 動作を行い ます。 適用 さ れない関数 関数の中には、 リ ッ チテ キ ス ト デー タ ウ ィ ン ド ウ オ ブジ ェ ク ト では使用で き ない も の も あ り ます。 以下の関数は、 エ ラ ー を返すか、 ま たは何 も 処理を行い ません。 • グ ラ フ と ク ロ ス タ ブ デー タ ウ ィ ン ド ウ オブジ ェ ク ト のための関 数 • グループ化のための関数 : GroupCalc、 FindGroupChange • コ ー ド 表のための関数 : GetValue、 SetValue • 行選択のための関数 : SelectRow、 SetRowFocusIndicator、 GetSelectedRow • カ ラ ム と 詳細区域の表示形態を指定す る ための関数 : SetBorderStyle、 SetDetailHeight 256 PowerBuilder 第 15 章 リ ッ チ テキス ト の作成方法 • ObjectAtPointer • OLEActivate リ ッ チテ キ ス ト デー タ ウ ィ ン ド ウ の場合に異な る 動作をす る 関数 も あ り ます。 異な る動作をする関数 • ク リ ッ プボー ド のための関数 : Copy、 Clear な ど • 編集可能な テ キ ス ト のための関数 (ほかの提示様式のエデ ィ ッ ト コ ン ト ロ ールに適用 さ れ ます) : LineCount、 Position、 SelectText な ど • Find と FindNext 関数 (一般的なデー タ ウ ィ ン ド ウ の Find 関数か、 リ ッ チテ キ ス ト の Find 関数かは、 Find 関数に指定す る 引数に よ っ て決ま り ます) • ページ ス ク ロ ール リ ッ チ テキス ト エデ ィ ッ ト コ ン ト ロールの使い方 ウ ィ ン ド ウ あ る いはユーザ オブ ジ ェ ク ト 上に配置 し た リ ッ チ テ キ ス ト エデ ィ ッ ト コ ン ト ロ ールを使用 し て、 エ ン ド ユーザに、 書式設定 さ れ た テ キ ス ト を 参 照 さ せ た り 、 編 集 さ せ る こ と が で き ま す。 PowerScript 関数を使用 し て、 テ キ ス ト の挿入、 選択 さ れたテ キ ス ト の 取得、 入力 フ ィ ール ド の管理、 内容のプ ロ パテ ィ 設定な ど を 行 っ て、 コ ン ト ロ ールの内容を操作で き ます。 ウ ィ ン ド ウ ペ イ ン タ ま たはユーザ オブジ ェ ク ト ペ イ ン タ で、 リ ッ チ テ キ ス ト エデ ィ ッ ト コ ン ト ロ ールを定義 し ます。 エ ン ド ユーザに制御権を 与え る ウ ィ ン ド ウ ま たはユーザ オブジ ェ ク ト ペ イ ン タ では、 リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールのプ ロ パテ ィ シー ト の [ ド キ ュ メ ン ト ] ペー ジで、 表 15-1 の機能を使用可能ま たは使用不可に設定で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 257 リ ッ チ テキス ト エデ ィ ッ ト コ ン ト ロールの使い方 表 15-1: リ ッ チ テキス ト エデ ィ ッ ト コ ン ト ロールの機能 機能 編集用ツールバー ポ ッ プア ッ プ メ ニ ュー 印刷 さ れない文字 の表示 フ ィ ール ド の表示 詳細 書式設定、 ルー ラ 、 お よ び タ ブ プ ロ パテ ィ シー ト や、 フ ァ イ ルの挿入、 ク リ ッ プボー ド コ マ ン ド が使用可能 改行記号、 タ ブ文字、 お よ び半角スペース 自動 ワー ド ラ ッ プ 新たに入力 さ れた テ キ ス ト だけに影響す る 。 既存の段 落に新 し いテ キ ス ト を入力す る と 、 テ キ ス ト は、 コ ン ト ロ ールの右端に達 し た と き に ワ ー ド ラ ッ プ さ れ る 。 コ ン ト ロ ールがサ イ ズ可変の場合は、 コ ン ト ロ ールの サ イ ズ を少 し 縮小す る こ と に よ っ て、 既存のテ キ ス ト を ワー ド ラ ッ プ さ せ る こ と がで き る デフ ォ ル ト のページ サ イ ズに対応 余白 フ ィ ール ド の表示 / 非表示、フ ィ ール ド 名で表示す る か ど う か、 お よ びフ ィ ール ド の背景色 ま た、印刷キ ュ ーに表示 さ れ る 文書の名前を設定す る こ と も で き ます。 文書名は、 コ ン ト ロ ールに挿入す る テ キ ス ト フ ァ イ ル と は関係あ り ま せん。 エ ン ド ユーザによ る プ ロパテ ィ の変更 エ ン ド ユーザは、 プ ロ パテ ィ シー ト を使用 し て、 リ ッ チテ キ ス ト 文書 のプ ロ パテ ィ を設定で き ますが、 開発者が望ま ない操作を行 う 可能性 も あ り ます。 た と えば以下の よ う な操作を行っ て し ま う か も し れ ませ ん。 • 上書 き 禁止に設定 し て あ る 文書の [編集禁止] オプシ ョ ン を オ フ に し て、 文書を編集す る • ツール バー、 ルー ラ 、 タ ブ バーを非表示にす る • デー タ ではな く 入力フ ィ ール ド 名を表示す る • ポ ッ プア ッ プ メ ニ ュ ーを使用不可に し たため、 非表示に し た ツー ルを元に戻す こ と がで き な く な る こ の よ う な操作 ミ ス を防 ぐ ために、 ス ク リ プ ト でプ ロ パテ ィ 値を変更 す る こ と がで き ます。 た と えば、 以下の ス ク リ プ ト を コ マ ン ド ボ タ ン の Clicked イ ベン ト に記述 し て、 ポ ッ プア ッ プ メ ニ ュ ーを表示 さ せ る こ と がで き ます。 rte_1.PopMenu = TRUE 258 PowerBuilder 第 15 章 リ ッ チ テキス ト の作成方法 変更の取 り 消 し UndoDepth プ ロ パテ ィ を設定す る こ と に よ っ て、 アプ リ ケーシ ョ ン に 操作の取 り 消 し 機能を 持たせ る こ と がで き ま す。 こ の場合、 〔Ctrl〕 + 〔Z〕 を 押す と 、 変更は取 り 消 さ れ ま す。 ま た、 コ マ ン ド ボ タ ン や メ ニ ュ ー項目の ス ク リ プ ト か ら Undo 関数を呼びだす こ と も で き ます。 Undo 関数が繰 り 返 し 呼ばれた場合は、 UndoDepth プ ロ パテ ィ で設定 し た上限ま で、 変更は取 り 消 さ れます。 ス ク リ プ ト で CanUndo 関数を呼 び出す と 、 元に戻せ る 変更があ る か ど う か (つま り UndoDepth プ ロ パ テ ィ の上限に達 し てい る か ど う か) をチ ェ ッ ク す る こ と がで き ます。 IF rte_1.CanUndo() THEN rte_1.Undo() ELSE MessageBox(" 停止 ", " 元に戻せる操作があ り ません ") END IF リ ッ チテ キス ト エ ディ ッ ト コ ン ト ロ ールのためのテ キス ト ウ ィ ン ド ウ ペ イ ン タ では、 リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ール にテ キ ス ト を入力す る こ と はで き ません。そのかわ り 、アプ リ ケーシ ョ ン において、 ス ク リ プ ト か ら テ キ ス ト を挿入 し た り 、 エ ン ド ユーザに テ キ ス ト 入力を さ せ る こ と がで き ます。 テキス ト の挿入 フ ァ イルから 挿入 InsertFile 関数を使用 し て、 アプ リ ケーシ ョ ン にテ キ ス ト フ ァ イ ル を 挿入す る こ と が で き ま す。 挿入で き る フ ァ イ ルは、 リ ッ チテ キ ス ト 形式ま たは ASCII 形式です。 li_rtn = rte_1.InsertDocument & ("c:¥mydir¥contacts.rtf", FALSE, FileTypeRichText!) Boolean 型の clearflag 引数に よ っ て、 フ ァ イ ルを挿入す る のか、 既存 のテ キ ス ト と 置 き 換え る のか を指定で き ます。 デー タ ベースから 挿入 デー タ ベー ス に文字列 と し て リ ッ チテ キ ス ト を 保存 し た場合、 デー タ ス ト ア オブジ ェ ク ト を使用 し て テ キ ス ト を取得 す る こ と がで き ます。 以下の ス ク リ プ ト は、 デー タ ベース か ら テ キ ス ト を取得 し て、 リ ッ チ テ キ ス ト エデ ィ ッ ト コ ン ト ロ ールに貼 り 付け ます。 ls_desc = dw_1.Object.prod_desc.Primary[1] rte_1.PasteRTF(ls_desc) ア プ リ ケーシ ョ ン テ ク ニ ッ ク 259 リ ッ チ テキス ト エデ ィ ッ ト コ ン ト ロールの使い方 リ ッ チ テキス ト と ク リ ッ プボー ド CopyRTF 関数 と PasteRTF 関数は、 書式指示 と と も に リ ッ チテ キ ス ト を 取得 し て、 文字列に格納 し ます。 Copy、 Cut、 お よ び Paste 関数で ク リ ッ プボー ド を使用す る と 、 テ キ ス ト し か取得で き ないため、 書式指示は 失われて し ま い ます。 デー タ ベースに リ ッ チ テキス ト を保存する例 た と えば、 テ ク ニ カル サポー ト にかか っ て く る 電話の内容を、 デー タ ベース テーブルに記録 し てい る も の と し ます。 フ ィ ール ド には、 電話 がかか っ て き た日付、 サポー ト エ ン ジ ニ ア名、 顧客名を記録 し ま す。 別の フ ィ ール ド では、 内容についての メ モ を格納 し ます。 リ ッ チテ キ ス ト を使用す る と 、 エ ン ド ユーザに書式付 き の メ モ を記録 さ せ る こ と がで き ます。 単純な テ キ ス ト ではな く リ ッ チテ キ ス ト を使用す る こ と に よ っ て、 太字や斜体で強調 さ せ る こ と がで き ます。 編集用の ウ ィ ン ド ウ は、 以下の コ ン ト ロ ールか ら 構成 さ れ ます。 • すべてのデー タ を検索 し て、 電話 メ モ を除 く すべてのデー タ を表 示す る デー タ ウ ィ ン ド ウ コ ン ト ロ ール • 電話 メ モ を表示す る リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ール • デー タ ベース を更新す る ための コ マ ン ド ボ タ ン RowFocusChanged イ ベン ト に ス ク リ プ ト を記述 し て、フ ォ ーカ ス が移動 し て も 、常に現行の行の電話 メ モ を リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールに表示 さ せます。 RowFocusChanged イ ベン ト string ls_richtext // call_notes カ ラ ムから 文字列を取得 し ます。 ls_richtext = dw_1.Object.call_notes[currentrow] // 点滅を防止 し ます。 rte_1.SetRedraw(FALSE) // 現行の行のテキス ト で古いテキス ト を置き換え ます。 rte_1.SelectTextAll() rte_1.Clear() rte_1.PasteRTF(ls_richtext) rte_1.SetRedraw(TRUE) LoseFocus イ ベン ト に以下の ス ク リ プ ト を記述 し て、 エ ン ド ユーザが変更 し た テ キ ス ト を、 デー タ ウ ィ ン ド ウ コ ン ト ロ ールに転送 し ます。 LoseFocus イ ベン ト は、 エ ン ド ユーザがテ キ ス ト の編集を終え て、 コ マ ン ド ボ タ ン ま たはデー タ ウ ィ ン ド ウ を選択 し た と き に起動 さ れます。 LoseFocus イ ベン ト 260 PowerBuilder 第 15 章 リ ッ チ テキス ト の作成方法 string ls_richtext long l_currow GraphicObject l_control // リ ッ チ テキス ト エデ ィ ッ ト コ ン ト ロールに // フ ォ ー カ スが残っ ているかど う かを確認 し ます。 // フ ォ ー カ スが残っ ている場合は、 テキス ト を転送 し ません。 l_control = GetFocus() IF TypeOf(l_control) = RichTextEdit! THEN RETURN 0 // 点滅を防止 し ます。 rte_1.SetRedraw(FALSE) // 文字列 ls_richtext にすべてのテキス ト を格納 し ます。 ls_richtext = rte_1.CopyRTF() // 現行の行の call_notes カ ラ ムに // リ ッ チ テキス ト を割 り 当て ます。 l_currow = dw_1.GetRow() dw_1.Object.call_notes[l_currow] = ls_richtext rte_1.SetRedraw(TRUE) LoseFocus イ ベン ト と ツールバー エ ン ド ユーザが ツールバーを選択 し た と き も 、 LoseFocus イ ベン ト が 起動 さ れ ます。 ツール バーは、 リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ー ル と は別の コ ン ト ロ ール と し て作成 さ れてい る か ら です。し か し 、 リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールには フ ォ ーカ ス が残っ てい る た め、 GetFocus 関数を使用 し て、 ツールバーが ク リ ッ ク さ れたのか ど う か を確認す る こ と がで き ます。 フ ァ イルに リ ッ チ テキ ス ト を保存 SaveDocument 関数を使用す る と 、入力フ ィ ール ド の定義 と と も に、リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ール内の リ ッ チテ キ ス ト を保存す る こ と がで き ます。 保存す る フ ァ イ ルの種類 と し て、 リ ッ チテ キ ス ト 形 式 (RTF) ま たは ASCII 形式を指定す る こ と がで き ます。 rte_1.SaveDocument("c:¥...¥contacts.rtf", & FileTypeRichText!) SaveDocument 関数は、 入力フ ィ ール ド のデー タ は保存 し ません。 文書 テ ン プ レー ト を保存 し ます。 同名のフ ァ イルが存在する場合 フ ァ イ ルが既に存在す る 場合は、 SaveDocument 関数を呼ぶ と FileExists イ ベン ト が起動 さ れます。 FileExists イ ベン ト のス ク リ プト で、 エン ド ユーザにフ ァ イ ルを 上書き す る か ど う か を問い合わせ る こ と がで き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 261 リ ッ チ テキス ト エデ ィ ッ ト コ ン ト ロールの使い方 保存処理を キ ャ ン セルす る には、 FileExists イ ベン ト の ス ク リ プ ト で リ タ ーン コ ー ド の 1 を指定 し ます。 保存する必要のある変更があるか Modified プ ロ パテ ィ は、 リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールの文書が変更 さ れたか ど う か を示 し ます。 ま た、 文書が保存 さ れていない状態であ る こ と も 示 し ます。 最初の変 更で Modified イ ベン ト が起動 さ れて、 Modified プ ロ パテ ィ に TRUE が 設定 さ れ ます。SaveDocument 関数を呼ぶ と 、文書が保存 さ れ、Modified プ ロ パテ ィ に FALSE が設定 さ れます。 フ ァ イ ル を リ ッ チ テ キ ス ト エデ ィ ッ ト コ ン ト ロ ールに挿入す る と 、 リ ッ チ テ キ ス ト エデ ィ ッ ト コ ン ト ロ ールの文書が変更 さ れ る ので、 Modified イ ベン ト が起動 さ れて Modified プ ロ パテ ィ に TRUE が設定 さ れ ます。 し か し 通常の場合、 本当に知 り たいのは フ ァ イ ルの内容が コ ン ト ロ ールの内容に対応 し てい る か ど う かです。 こ の点を確認す る た めには、 フ ァ イ ルを開 く ス ク リ プ ト で、 Modefied プ ロ パテ ィ を FALSE に設定 し ます。エ ン ド ユーザが文章を編集す る と Modified イ ベン ト が 起動 さ れ、Modified プ ロ パテ ィ に TRUE が設定 さ れ る ので、 コ ン ト ロ ー ルの文書の内容 と フ ァ イ ルの内容が一致 し て い な い こ と がわか り ま す。 フ ァ イルを開 く 、 フ ァ イルを保存する : 例 フ ァ イ ルを開いた り 保存 し た り す る ス ク リ プ ト の例を示 し ます。 エ ン ド ユーザは、既存の フ ァ イ ルを開いて、 リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールで文書を変更 し て保存す る こ と がで き ます。 ま た、 文書を フ ァ イ ルに保存す る こ と も で き ます。 エ ン ド ユーザが開いた フ ァ イ ル に文書を保存す る 場合は、 フ ァ イ ルの上書 き は確認 さ れずにその ま ま 保存 さ れ ます。 既存の フ ァ イ ル と 同名の フ ァ イ ル名で保存 し よ う と す る と 、 フ ァ イ ルの上書 き を確認す る メ ッ セージボ ッ ク ス が表示 さ れ ま す。 262 PowerBuilder 第 15 章 リ ッ チ テキス ト の作成方法 こ の例では、 イ ン ス タ ン ス 変数の宣言、 ス ク リ プ ト 、 関数、 イ ベン ト について解説 し ます。 イ ン ス タ ン ス変数の宣 言 ib_saveas FileExists イ ベン ト のための フ ラ グ。 FALSE の場合は、 エ ン ド ユーザが開いた フ ァ イ ルに保存 し よ う と し てい る ため、 フ ァ イ ルは 上書 き さ れ ます。 boolean ib_saveas=FALSE is_filename 現行 フ ァ イ ル名。 初期状態では 「 タ イ ト ル未設定」 と 設 定 さ れます。 string is_filename フ ァ イルを開 く ための スク リプ ト 以下の ス ク リ プ ト は、 エ ン ド ユーザが選択 し た フ ァ イ ルを開 き ま す。 フ ァ イ ル を 開 く と き に Modified イ ベン ト が起動 さ れて Modified プ ロ パテ ィ が TRUE に設定 さ れ る ので、 ス ク リ プ ト で Modified プ ロ パテ ィ を FALSE に リ セ ッ ト し てい ます。 [変更] チ ェ ッ ク ボ ッ ク ス の Checked プ ロ パテ ィ も 、 FALSE に設定 さ れてい ます。 integer li_answer, li_result string ls_name, ls_path li_answer = GetFileOpenName("Open File", ls_path, & ls_name, "rtf", & "Rich Text(*.RTF),*.RTF, Text files(*.TXT),*.TXT") ア プ リ ケーシ ョ ン テ ク ニ ッ ク 263 リ ッ チ テキス ト エデ ィ ッ ト コ ン ト ロールの使い方 IF li_answer = 1 THEN // エ ン ド ユーザが、 キ ャ ン セル し ませんで し た。 li_result = rte_1.InsertDocument(ls_path, TRUE) IF li_result = 1 THEN // 文書が正常に開かれま し た。 // 保存 し て、 フ ァ イル名を表示 し ます。 is_filename = ls_path st_filename.Text = is_filename // 保存 し て、 文書の変更状況を表示 し ます。 rte_1.Modified = FALSE cbx_modified.Checked = rte_1.Modified ELSE MessageBox(" エ ラ ー ", " フ ァ イルが開かれていません ") END IF END IF RETURN 0 文書を保存する ための スク リプ ト エ ン ド ユーザが文書を保存で き る よ う に、 [上書 き 保存] ボ タ ン と [名 前を付け て保存] ボ タ ン を用意 し ます。 ま た、 必要に応 じ て メ ニ ュ ー 項目 も 作成 し 、 同 じ ス ク リ プ ト を記述 し ます。 [上書 き 保存] ボ タ ン の ス ク リ プ ト では、 イ ン ス タ ン ス変数 is_filename に正 し い フ ァ イ ル名が 保持 さ れてい る か ど う か をチ ェ ッ ク し ます。 正 し い フ ァ イ ル名で あ っ た場合は、 of_save 関数へその フ ァ イ ル名を渡 し ます。 無効な フ ァ イ ル 名の場合は、 [名前を付けて保存] ボ タ ンの Clicked イ ベン ト の ス ク リ プ ト を起動 し ます。 integer li_result string ls_name // フ ァ イル名が無効な場合は、 フ ァ イル名を取得 し ます。 IF is_filename = " タ イ ト ル未設定 " THEN cb_saveas.EVENT Clicked() ELSE li_result = Parent.of_save(is_filename) END IF RETURN 0 FileExists イ ベ ン ト が起動 さ れた時に、 フ ァ イ ルの上書 き の確認 メ ッ セージ を表示す る ために、 [名前を付けて保存] ボ タ ンの Clicked イ ベ ン ト の ス ク リ プ ト で、イ ン ス タ ン ス変数 ib_saveas に TRUE を設定 し ま す。 こ の ス ク リ プ ト では、 of_save 関数に フ ァ イ ル名を渡す前に、 フ ァ イ ル名を取得す る ために of_getfilename 関数を呼びます。 264 PowerBuilder 第 15 章 リ ッ チ テキス ト の作成方法 integer li_result string ls_name ib_saveas = TRUE ls_name = Parent.of_getfilename() // エ ン ド ユーザがキ ャ ン セルを し たか、 エ ラ ーが発生 し た場合は、 // 中断 さ せます。 IF ls_name = "" THEN RETURN -1 li_result = Parent.of_save(ls_name) ib_saveas = FALSE RETURN 0 フ ァ イル名の保存 と 取 得を行 う 関数 of_save 関数は、 フ ァ イ ル名を引数 と し て受け取 り 、 その フ ァ イ ルに文書を保存 し ます。 ま た、 保存 し た フ ァ イ ル名を イ ン ス タ ン ス変数 is_filename に設定 し 、 SaveDocument 関数を正常に呼び出せた 後は、自動的に FALSE に設定 さ れ る Modified プ ロ パテ ィ に対応す る よ う に、 [変更] チ ェ ッ ク ボ ッ ク ス の値を設定 し ます。 of_save 関数 integer li_result MessageBox(" フ ァ イル名 ", as_name) // 拡張子が正 し い種類の保存を起動するので、 // フ ァ イルの種類は必要あ り ません。 li_result = rte_1.SaveDocument(as_name) IF li_result = -1 THEN MessageBox(" 警告 ", " フ ァ イルは保存 さ れませんで し た ") RETURN -1 ELSE // フ ァ イルが正常に保存 さ れた場合。 is_filename = as_name st_filename.Text = is_filename cbx_modified.Checked = rte_1.Modified RETURN 1 END IF of_getfilename 関数 of_getfilename 関数では、 エ ン ド ユーザに対 し て フ ァ イ ル名を入力す る ためのプ ロ ン プ ト を表示 し 、 ユーザの選択 し た フ ァ イ ル名を戻 し ま す。 こ の関数は、 フ ァ イ ル名が ま だ指定 さ れてい ない場合、 ま たはエ ン ド ユーザが [名前を付けて保存] ボ タ ン を選択 し た場合に呼ばれます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 265 リ ッ チ テキス ト エデ ィ ッ ト コ ン ト ロールの使い方 integer li_answer string ls_name, ls_path li_answer = GetFileSaveName(" 文書名 ", ls_path, & ls_name, "rtf", & "Rich Text(*.RTF),*.RTF, Text files(*.TXT),*.TXT") IF li_answer = 1 THEN // 指定 し た フ ァ イル名を戻 し ます。 RETURN ls_path ELSE RETURN "" END IF 保存 し て閉 じ る ための イ ベン ト エ ン ド ユーザが指定 し た フ ァ イ ルが既に存在 し て い る 場合に、 警告 メ ッ セージ を表示 し 、 保存の取 り 消 し がで き る よ う に し ます。 SaveDocument 関数が フ ァ イ ルを保存 し よ う と し て、 フ ァ イ ルが既に存在 し てい る 場合に、 FileExists イ ベン ト が起動 さ れます。 こ の ス ク リ プ ト では、 変数 ib_saveas が TRUE か ど う か を確認 し 、 TRUE の場合はフ ァ イ ルの上書 き を問い合わせます。 FileExists イ ベン ト integer li_answer // 現行の フ ァ イルを上書き保存する場合は、 // フ ァ イルの上書き を確認する プ ロ ン プ ト は表示 さ れません。 IF ib_saveas = FALSE THEN RETURN 0 li_answer = MessageBox(" フ ァ イルが存在 ", & filename + " はすでに存在 し ます。 上書き し ますか ?", & Exclamation!, YesNo!) // ゼロ でない値を戻せば、 保存がキ ャ ン セル さ れます。 IF li_answer = 2 THEN RETURN 1 [変更]チ ェ ッ ク ボ ッ ク ス に値を設定 し 、エ ン ド ユー ザに、 文書の変更が保存 さ れていない こ と を表示 し ます。 Modified プ ロ パテ ィ は、 Modified イ ベン ト が起動 さ れた と き に自動的に設定 さ れ ます。 リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールの文書が変更 さ れた と き に、 Modified イ ベン ト が起動 さ れます。 Modified イ ベン ト cbx_modified.Checked = TRUE 保存 さ れていない変更が あ る か ど う か を チ ェ ッ ク し て、 ウ ィ ン ド ウ を 閉 じ る 前に文書の保存 を 確認す る メ ッ セージ ボ ッ ク ス を表示 し ます。 CloseQuery イ ベン ト 266 PowerBuilder 第 15 章 リ ッ チ テキス ト の作成方法 integer li_answer // 保存 さ れていない変更があるかど う か。 なければ、 終了 し ます。 IF rte_1.Modified = FALSE THEN RETURN 0 // 文書の保存の確認を、 エ ン ド ユーザに求めます。 li_answer = MessageBox(" 文書が保存 さ れていません ", & " 次の文書を保存 し ますか ?" + is_filename, & Exclamation!, YesNo! ) IF li_answer = 1 THEN // エ ン ド ユーザが、 文書を保存する場合 // [上書き保存] ボ タ ンの Clicked イ ベン ト を起動 し ます。 cb_save.EVENT Clicked() END IF RETURN 0 リ ッ チテ キス ト の書式設定 リ ッ チテ キ ス ト コ ン ト ロ ールには、 ユーザがア ド レ ス指定可能なオブ ジ ェ ク ト がい く つか存在 し ます。 • 文書 ( リ ッ チテ キ ス ト デー タ ウ ィ ン ド ウ ) 全体 • 選択 さ れたテ キ ス ト と 段落 • 入力フ ィ ール ド • ピ クチャ エ ン ド ユーザは上記のオブジ ェ ク ト を選択 し た り 、 ツールバーを使用 し た り 、 プ ロ パテ ィ シー ト を表示す る こ と がで き ます。 開発者 ま たはエ ン ド ユーザが入力 フ ィ ール ド にデー タ を入力 し た り 、 DataSource を呼び出 し て コ ン ト ロ ールをデー タ ウ ィ ン ド ウ オブジ ェ ク ト ま たはデー タ ス ト アに関連付け る こ と に よ っ て、 入力フ ィ ール ド は 値を取得 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 267 リ ッ チ テキス ト エデ ィ ッ ト コ ン ト ロールの使い方 入力フ ィ ールド 入力フ ィ ール ド は、 名前付 き の値です。 入力フ ィ ール ド は、 名前を付 けて、 値を設定 し て使用 し ま す。 値は、 入力フ ィ ール ド 名に関連付け ら れ ま す。 入 力 フ ィ ー ル ド が コ ピ ー さ れ て い て、 同 じ 名 前 の 入 力 フ ィ ール ド が複数あ る 場合、 すべての入力フ ィ ール ド に同 じ 値が表示 さ れ ま す。 ま た、 エ ン ド ユーザが入力フ ィ ール ド の値を変更す る と 、 その変更は、 同 じ 名前のすべての入力フ ィ ール ド に反映 さ れます。 以下のサ ンプル テ キ ス ト では、入力フ ィ ール ド customer を コ ピー し て 3 箇所で使用 し てい ます。 {customer} 様 {customer} 様か ら ご注文いただいた品が入荷 さ れてお り ま す。 ま た、 30 日か ら セールが始ま り ますので、 {customer} 様のお知 り 合 いに も お声をおかけ く だ さ い。 ス ク リ プ ト で、 入力フ ィ ール ド customer にデー タ 値を設定す る こ と が で き ます。 rte_1.InputFieldChangeData("customer", " 本田 ") テ キ ス ト は、 以下の よ う に表示 さ れます。 本田様 本田様か ら ご注文いただいた品が入荷 さ れてお り ま す。 ま た、 30 日か ら セールが始 ま り ま すので、 本田様のお知 り 合いに も お声を おかけ く だ さ い。 さ ら に、 エ ン ド ユーザ も 、 デー タ 値を設定す る こ と がで き ます。 以下 のいずれかの方法を使用 し ます。 • 入力フ ィ ール ド を選択 し て ( ク リ ッ ク し て点滅 さ せます)、 新 し い デー タ 値を入力 し ます。 • 入力フ ィ ール ド オブジ ェ ク ト プ ロ パテ ィ シー ト を表示 し て、 [全 般] タ ブ ページの [デー タ 値] テ キ ス ト ボ ッ ク ス を編集 し ます。 ス ク リ プ ト で入力フ ィ ール ド を挿入 InputFieldInsert 関数は、挿入ポ イ ン ト に入力フ ィ ール ド を挿入 し ます。 rtn = rte_1.InputFieldInsert("datafield") た と えば、 リ ッ チテ キ ス ト 編集アプ リ ケーシ ョ ン で、 エ ン ド ユーザに 入力フ ィ ール ド を挿入 さ せ る と し ます。 こ の場合、 エ ン ド ユーザに入 力フ ィ ール ド 名を指定 さ せ る 方法が必要です。 た と えば、 エ ン ド ユーザに、 リ ス ト ボ ッ ク ス か ら 入力フ ィ ール ド 名を 選択 さ せ る と し ます。 以下の ス ク リ プ ト は、 選択 さ れた入力フ ィ ール ド 名を使用 し て、 挿入ポ イ ン ト に入力フ ィ ール ド を挿入 し ます。 268 PowerBuilder 第 15 章 リ ッ チ テキス ト の作成方法 string ls_field integer rtn ls_field = lb_fields.SelectedItem() IF ls_field <> "" THEN rtn = rte_1.InputFieldInsert( ls_field ) IF rtn = -1 THEN MessageBox(" エ ラ ー ", " フ ィ ール ド を挿入で き ません ") END IF ELSE MessageBox(" 未選択 ", & " フ ィ ール ド 名を選択 し て く だ さ い ") END IF 日付やページ番号を入れて文書を印刷す る には、 入力フ ィ ール ド を定 義 し て、 その入力フ ィ ール ド に日付やページ番号を設定 し ます。 日付 と ページ番号のた めの入力フ ィ ール ド ❖ 文書に日付を入れるには 1 テ キ ス ト 中に入力フ ィ ール ド を作成 し 、 入力フ ィ ール ド 名を指定 し ます。 2 ウ ィ ン ド ウ の Open イ ベン ト な ど で、入力フ ィ ール ド のデー タ 値に 今日の日付を設定 し ます。 た と え ば、 本文に入力 フ ィ ール ド today が含 ま れ て い る 場合、 入力 フ ィ ール ド にデー タ 値を設定す る ス ク リ プ ト は、 以下の よ う に記述 し ます。 integer li_rtn li_rtn = rte_1.InputFieldChangeData( "today", & String(Today()) ) 印刷時にページ番号を設定す る 方法については、 272 ページの 「プ レ ビ ュ ー と 印刷」 を参照 し て く だ さ い。 データ ベース のデータ の使い方 リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールを、 デー タ ウ ィ ン ド ウ コ ン ト ロ ール ま たはデー タ ス ト ア オブ ジ ェ ク ト と 関連付け る こ と がで き ます。 入力フ ィ ール ド 名が、 デー タ ウ ィ ン ド ウ オブジ ェ ク ト のカ ラ ム 名ま たは計算フ ィ ール ド 名 と 一致す る 場合、 入力フ ィ ール ド はその同 じ カ ラ ム名のデー タ を表示 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 269 リ ッ チ テキス ト エデ ィ ッ ト コ ン ト ロールの使い方 リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールにデー タ ソ ー ス があ る かな いかにかかわ ら ず、 リ ッ チテ キ ス ト の内容は常に 1 つです。 つ ま り 、 文書テ ン プ レ ー ト と し て リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールの 内容を表示す る こ と がで き ます。 行か ら 行へス ク ロ ール し てい る と き は、 入力フ ィ ール ド のデー タ 値だけが変更 さ れ ます。 デー タ ウ ィ ン ド ウ オブジ ェ ク ト ま たはデー タ ス ト ア オブ ジ ェ ク ト と デー タ を共有す る には、 DataSource 関数を使用 し ます。 rte_1.DataSource(ds_empdata) デー タ を共有する例 デー タ ス ト ア オブジ ェ ク ト ds_empdata に関連付け ら れてい る デー タ ウ ィ ン ド ウ オブジェ ク ト に 4 つのカラ ム emp_id、emp_lname、emp_fname、 state があ り 、リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールには以下の よ う なテ キ ス ト と 入力フ ィ ール ド があ る と し ます。 従業員テーブルのカ ラ ムを含むサン プル ID: {emp_id} {emp_lname} {emp_fname} 様 : 当社の新工場が福島県に開かれ ます。 あ な たが {state} か ら 福島県に転 勤を希望す る 場合は、 会社がすべての経費を カバー し ます。 行 と ページの操作 リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールでは、 エ ン ド ユーザはペー ジ単位で文書を ス ク ロ ールす る こ と がで き ます。 ページ単位ではな く 行単位で ス ク ロ ール さ せ る には、そのための コ マ ン ド ボ タ ン を追加 し 、 ス ク リ プ ト を記述 し なければな り ません。 [前の行へ移動] ボ タ ン と [次の行へ移動] ボ タ ン を追加す る 必要があ り ます。 ス ク リ プ ト は簡単です。 [次の行へ移動] ボ タ ン では、 以下の よ う に記述 し ます。 rte_1.ScrollNextRow() [前の行へ移動] ボ タ ン では、 以下の よ う に記述 し ます。 rte_1.ScrollPriorRow() ページ ボ タ ン を用意す る こ と も で き ます。エ ン ド ユーザが最終ページ で次ページへス ク ロ ールす る と 、 先頭ページの次の行に対応す る デー タ 値を表示 し ます。 rte_1.ScrollNextPage() 270 PowerBuilder 第 15 章 リ ッ チ テキス ト の作成方法 リ ッ チテ キス ト エ ディ ッ ト コ ン ト ロ ールにおける カ ーソ ル位置 関数を使用 し て、 リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールで選択 さ れ てい る 項目を取得 し た り 、テ キ ス ト を選択 し た り す る こ と がで き ます。 挿入ポ イ ン ト の位置 と 選択 さ れている内容の 判定 テ キ ス ト には常に挿入ポ イ ン ト があ り 、 挿入ポ イ ン ト が、 選択 さ れた テ キ ス ト を含む こ と も あ り ます。 テ キ ス ト が選択 さ れてい る 場合、 挿 入ポ イ ン ト の位置は選択範囲の先頭 ま たは最後にな り ます。 テ キ ス ト を前か ら 後ろへ ド ラ ッ グ し て選択 し た場合、 挿入ポ イ ン ト は選択範囲 の最後にあ り ます。 テ キ ス ト を後ろ か ら 前へ ド ラ ッ グ し て選択 し た場 合、 挿入ポ イ ン ト は選択範囲の先頭にあ り ます。 Position 関数は、テ キ ス ト の選択範囲 と 挿入ポ イ ン ト に関す る 情報を提 供 し ます。 Position 関数についての詳細は 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ ア ルを参照 し て く だ さ い。 プ ログ ラ ムによ る テキ ス ト の選択 以下の関数を使用 し て、 挿入ポ イ ン ト の位置か ら 相対的にテ キ ス ト を 選択す る こ と がで き ます。 • SelectTextWord 関数 • SelectTextLine 関数 • SelectTextAll 関数 最 も 一般的な テ キ ス ト 選択の関数は、 SelectText 関数です。 テ キ ス ト の 選択範囲を、 最初 と 最後の行番号 と 文字番号で指定 し ます。 Position 関数で得 ら れ る 値は、 テ キ ス ト の選 択範囲だけではないので、その値を直接 SelectText 関数に渡す こ と はで き ません。 特に、 ゼ ロ は選択範囲を示すには意味があ り ますが、 テ キ ス ト 選択には有効な値ではあ り ません。 SelectText 関数へ値を渡す Position 関数についての詳細は 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ ア ルを参照 し て く だ さ い。 スペルチ ェ ッ ク のために、 1 つずつ単語を選択 し たい場合は、 『PowerScript リ フ ァ レ ン ス』 マニ ュ アルの SelectTextWord 関数を参照 し て く だ さ い。 タ ブ順序、 フ ォ ー カ ス、 選択 タ ブ順序 ウ ィ ン ド ウ ま たはユーザ オブジ ェ ク ト で、 リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールを コ ン ト ロ ールの タ ブ順序に含め ます。 ただ し 、 リ ッ チ テ キ ス ト エデ ィ ッ ト コ ン ト ロ ールに タ ブ移動 し た場合、 〔TAB〕 を押すたびにテ キ ス ト の中に タ ブ を挿入 し て し ま い ます。 リ ッ チテ キ ス ト コ ン ト ロ ールか ら 別の コ ン ト ロ ールへは、 タ ブ移動で き ま せん。 その点に注意 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 271 リ ッ チ テキス ト エデ ィ ッ ト コ ン ト ロールの使い方 フ ォ ー カ ス と テキス ト の選択 リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ール を 〔Tab〕 を押 し て選択す る と 、 コ ン ト ロ ールが フ ォーカ ス さ れ、 現行 の挿入ポ イ ン ト ま たはテ キ ス ト 選択は保持 さ れます。 リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールを選択 し て フ ォーカ ス を設定 し た場合は、 挿 入ポ イ ン ト はエ ン ド ユーザが ク リ ッ ク し た位置に移動 し ます。 し たが っ て、 エ ン ド ユーザが別の コ ン ト ロ ールへフ ォ ーカ ス を変更す る と 、 テ キ ス ト の選択が更新 さ れ ます。 テ キ ス ト の選択を変更せずに コ ン ト ロ ールへフ ォ ーカ ス を戻す こ と はで き ません。 エ ン ド ユーザが リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールの ツールバーを選択す る と LoseFocus イ ベン ト が発生 し ま す が、 リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールの フ ォ ーカ ス は残 り ま す。 コ ン ト ロ ールが フ ォ ーカ ス を失っ たか ど う か を GetFocus 関数で確 認す る こ と がで き ます。 LoseFocus イ ベン ト プ レ ビ ュ ーと 印刷 エ ン ド ユーザは、 リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールの レ イ ア ウ ト を プ レ ビ ュ ー し た り 、 内容を印刷す る こ と がで き ます。 レ イ アウ ト のプ レ ビ ュー エ ン ド ユーザは、プ レ ビ ュ ー モー ド で文書の レ イ ア ウ ト を確認す る こ と がで き ます。 プ レ ビ ュ ー モー ド では、 コ ン ト ロ ールの大 き さ に合わ せて文書の内容が縮小 さ れ ます。 コ ン ト ロ ールが小 さ い場合は、 プ レ ビ ュ ー さ れ る 内容が と て も 小 さ く な り ます。 エ ン ド ユーザは、 プ レ ビ ュ ー モー ド で以下の操作が可能です。 272 • 文書の余白を設定す る • 矢印ボ タ ン を使用 し て、 ページ を ス ク ロ ールす る PowerBuilder 第 15 章 リ ッ チ テキス ト の作成方法 リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールがデー タ ウ ィ ン ド ウ オ ブジ ェ ク ト と デー タ を共有 し てい る 場合は、 プ レ ビ ュ ーはテ キ ス ト と マージ さ れた最初のデー タ 行だけ を表示 し ます。 プ レ ビ ュ ーす る には、 以下のいずれかの操作を行い ます。 • エ ン ド ユーザは、 〔CTRL〕 + 〔F2〕 を押す こ と に よ っ て、 編集モー ド と プ レ ビ ュ ー モー ド を切 り 換え る こ と がで き ます。 • ス ク リ プ ト で Preview 関数を呼び出 し ます。 rte_1.Preview(TRUE) 印刷 リ ッ チ テ キ ス ト エデ ィ ッ ト コ ン ト ロ ールがデー タ ウ ィ ン ド ウ オ ブ ジ ェ ク ト のデー タ を使用 し てい る 場合、 デー タ ウ ィ ン ド ウ コ ン ト ロ ー ルの Print.Page.Range プ ロ パテ ィ を設定 し て、印刷 さ れ る 行の数を制限 す る こ と が で き ま す。 Print.Page.Range プ ロ パ テ ィ の値は、 印刷す る ページ番号を リ ス ト し た文字列です。 ダ ッ シ ュ (-) を使用 し て範囲を 指定で き ます。 た と えば、 リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ール が、 デー タ ウ ィ ン ド ウ コ ン ト ロ ール dw_source のデー タ を共有 し てい る と し ます。 リ ッ チテ キ ス ト 文書は 3 ページで、2 行目 と 5 行目のデー タ を印刷す る と し ます。 印刷す る 前に、 ページ範囲のプ ロ パテ ィ を設 定す る こ と がで き ます。 ページ範囲の例 dw_source.Object.DataWindow.Print.Page.Range = & "4-6,13-15" さ ら に、 行が印刷 さ れない よ う に、 行を フ ィ ル タ ま たは破棄す る こ と がで き ます。 詳細につい ては、 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ アルの SetFilter、 Filter、 RowsMove、 RowsDiscard 関数お よ び 『デー タ ウ ィ ン ド ウ リ フ ァ レ ン ス 』 マ ニ ュ ア ルの Print デー タ ウ ィ ン ド ウ オ ブ ジ ェ ク ト プ ロ パ テ ィ を参照 し て く だ さ い。 ページ番号の設定 ページ番号を印刷す る には、 ヘ ッ ダ ま たは フ ッ タ に入力フ ィ ール ド を 配置 し ます。 ❖ ヘ ッ ダまたはフ ッ タ にページ番号を挿入するには 1 ヘ ッ ダ ま たは フ ッ タ に入力フ ィ ール ド を作成 し 、 入力フ ィ ール ド 名を指定 し ます。 2 PrintHeader ま たは PrintFooter イ ベン ト の ス ク リ プ ト で、 現行の ページ番号を入力フ ィ ール ド の値 と し て設定 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 273 リ ッ チ テキス ト エデ ィ ッ ト コ ン ト ロールの使い方 ページ番号の付け方は、 開発者が決定 し ます。 イ ベン ト には、 ページ 番号を計算す る ために使用で き る 引数が 3 つあ り ます。 currentpage 引 数の値を変更せずにその ま ま使用 し た り 、 あ る いは、 デー タ の行ご と にページ番号を リ セ ッ ト す る こ と も で き ます。 連続番号の使用 た と えば文書の フ ッ タ に、 テ キ ス ト と と も に page と total と い う 2 つの入力フ ィ ール ド があ る と し ます。 Page {page} of {total} PrintFooter イ ベン ト で、 以下の よ う な ス ク リ プ ト を記述 し て値を設定 し ます。 rte_1.InputFieldChangeData( "page", & String(currentpage)) rte_1.InputFieldChangeData( "total", & String(totalpages)) 行 ご と にページ番号 を リ セ ッ ト す る 場 合には、 フ ッ タ はた と えば次の よ う に設定 し ます。 行ご と のページ番号の リ セ ッ ト Row {row}, Page {page} 「連続番号の使用」 と 同様に、 PrintFooter イ ベン ト の ス ク リ プ ト で、 値 を設定 し ます。 各行が同 じ ページ数であ る と 仮定す る と 、 ページの値 は ス ク リ プ ト に渡 さ れた引数か ら 算出 さ れます。 rte_1.InputFieldChangeData( "page", & String(Mod(currentpage, totalpages/currentrow))) rte_1.InputFieldChangeData( "row", & String(currentrow)) ス ク リ プ ト によ る フ ッ タ テキス ト の挿入 以下のサ ン プル コ ー ド では、 フ ッ タ に挿入ポ イ ン ト を設定 し て、 2 つ の空白行、 テ キ ス ト 、 そ し て 2 つの入力フ ィ ール ド を挿入 し てい ます。 rte_1.SelectText(1, 1, 0, 0, Footer!) rte_1.ReplaceText("~r~n~r~nRow ") rte_1.InputFieldInsert("row") rte_1.ReplaceText(" Page ") rte_1.InputFieldInsert("page") rte_1.SetAlignment(Center!) 274 PowerBuilder 第 15 章 リ ッ チ テキス ト の作成方法 リ ッ チ テキス ト と エ ン ド ユーザ 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルの リ ッ チテ キ ス ト の使い 方に関す る 章、 お よ び こ の章で解説 し た編集ツールは、 エ ン ド ユーザ も 使用す る こ と がで き ます。 エ ン ド ユーザが行え る操作 エ ン ド ユーザが可能 な操作のス ク リ プ ト で の記述 エ ン ド ユーザは、 以下の操作を行 う こ と がで き ます。 • ツールバーを使用 し たテ キ ス ト の書式設定 • ポ ッ プア ッ プ メ ニ ュ ーの使用 (ほかの リ ッ チテ キ ス ト や ASCII フ ァ イ ルを開いた り 、 ク リ ッ プボー ド を使用で き ます) • 入力フ ィ ール ド の内容の編集 • 編集ツールのオ ン / オ フ の切 り 換え エ ン ド ユーザが以下の操作を で き る よ う に、 アプ リ ケーシ ョ ン を設定 す る こ と がで き ます。 • 入力フ ィ ール ド の挿入 と 削除 • ピ ク チ ャ の挿入 • ヘ ッ ダ と フ ッ タ 編集への切 り 換え • 印刷す る 文書のプ レ ビ ュ ー リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールが、 デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト ま たはデー タ ス ト ア オブジ ェ ク ト と デー タ を共有す る 場合、 以下の よ う に ス ク リ プ ト を記述す る こ と がで き ます。 • 行か ら 行へ ス ク ロ ール さ せ る (ページか ら ページへ ス ク ロ ール さ せ る ス ク リ プ ト も 記述で き ますが、 その必要はあ り ません) • 入力フ ィ ール ド で変更 さ れたデー タ 値をデー タ ベースへ更新す る リ ッ チテ キ ス ト を使用す る アプ リ ケーシ ョ ン を作成す る 際には、 開発 者自身がエ ン ド ユーザ と な っ て アプ リ ケーシ ョ ン を使用 し 、 テ キ ス ト を編集 し てみ る こ と をお勧め し ます。 実行時に も 、 編集用のすべての ツールを使用す る こ と がで き ます。 エ ン ド ユーザへの表 示 デフ ォ ル ト の表示は本文テ キ ス ト です。 ヘ ッ ダ と フ ッ タ のテ キ ス ト お よ び印刷プ レ ビ ュ ー も 表示で き ます。 ヘ ッ ダ と フ ッ タ リ ッ チテ キ ス ト デー タ ウ ィ ン ド ウ オブジ ェ ク ト ま た は リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールにおいて、 メ ニ ュ ーま たは コ マ ン ド ボ タ ン の ス ク リ プ ト で ShowHeadFoot 関数 を呼ぶ こ と がで き ます。 こ の関数を呼ぶ と 、 ヘ ッ ダ と フ ッ タ の編集パネルが表示 さ れ ま す。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 275 リ ッ チ テキス ト と エ ン ド ユーザ dw_1.ShowHeadFoot(TRUE) 通常の表示に戻すには、 再度 ShowHeadFoot 関数を呼び出 し ます。 dw_1.ShowHeadFoot(FALSE) エ ン ド ユーザは、 〔CTRL〕 + 〔F2〕 を 押す こ と に よ っ て、 プ レ ビ ュ ー モー ド のオ ン と オ フ を切 り 換え る こ と がで き ます。 ま た、 ス ク リ プ ト か ら プ レ ビ ュ ー モー ド を制御す る こ と も で き ます。 印刷プ レ ビ ュ ー リ ッ チテ キ ス ト エデ ィ ッ ト コ ン ト ロ ールでは、 Preview 関数を呼び出 し ます。 rte_1.Preview(TRUE) リ ッ チテ キ ス ト デー タ ウ ィ ン ド ウ オブジ ェ ク ト では、 Preview プ ロ パ テ ィ を設定 し ます。 dw_1.Object.DataWindow.Print.Preview = TRUE エ ン ド ユーザは、 以下の項目に対 し て書式設定 を す る こ と がで き ま す。 テキス ト の構成要素 と 書式設定 ❖ • 選択 さ れたテ キ ス ト • 段落 • ピ クチャ • リ ッ チテ キ ス ト 文書全体 オブ ジ ェ ク ト のプ ロパテ ィ シー ト を表示するには 1 2 ❖ • ド ラ ッ グす る か、ま たは編集キーを使用 し て テ キ ス ト を選択 し ます。 • ピ ク チ ャ を ク リ ッ ク し ます。 • リ ッ チテ キ ス ト 文書に挿入ポ イ ン ト を設定 し ます(テ キ ス ト を 選択 し ない よ う に注意 し て く だ さ い)。 ワー ク スペース で右 ク リ ッ ク し て、ポ ッ プア ッ プ メ ニ ュ ーか ら [プ ロ パテ ィ ] を選択 し ます。 選択 さ れた段落に書式を設定するには • 276 以下の操作を行っ て、 オブジ ェ ク ト を選択 し ま す。 た と えば、 次 の よ う にな り ます。 ルー ラ を ダブル ク リ ッ ク し ます。 ま たは 〔Ctrl〕 + 〔Shift〕 + 〔S〕 を押 し ます。 PowerBuilder 第 15 章 リ ッ チ テキス ト の作成方法 リ ッ チテ キ ス ト オブジ ェ ク ト を編集禁止に設定 し ていない限 り 、 エ ン ド ユーザは入力フ ィ ール ド の値を変更で き ます。 入力フ ィ ール ド の値の 変更 ❖ 入力フ ィ ール ド の値を変更するには 1 入力フ ィ ール ド を ク リ ッ ク し て選択 し ます。 入力フ ィ ール ド が点滅 し ます。 2 ス ペー ス キ ー を 押 し て値 を 入力す る か、 ワ ー ク ス ペー ス で右 ク リ ッ ク し て、 ポ ッ プア ッ プ メ ニ ュ ーか ら [プ ロ パテ ィ ] を選択 し ます。 入力フ ィ ール ド オブジ ェ ク ト プ ロ パテ ィ シー ト が表示 さ れます。 3 [全般] ページの [デー タ 値] テ キ ス ト ボ ッ ク ス を編集 し ます。 入力 フ ィ ール ド に書式 を 設 定す る こ と がで き ます。 入力フ ィ ール ド を選択 し てい る 場合は、 入力 フ ィ ール ド オブジ ェ ク ト プ ロ パテ ィ シー ト の [フ ォ ン ト ] ページ と ツールバーに よ っ て書式を設定す る こ と がで き ます。 テ キ ス ト と と も に入力フ ィ ール ド を選択 し てい る 場合は、 書式設定は、 入力フ ィ ール ド を含むすべてのテ キ ス ト に反映 さ れ ます。 入力フ ィ ール ド におけるデー タ 値の書式設定 エ ン ド ユーザは、 入力フ ィ ール ド の個々の文字ま たは単語に書式を設 定す る こ と はで き ません。 入力フ ィ ール ド を選択す る と 、 入力フ ィ ー ル ド 全体が選択 さ れ ます。 入力フ ィ ール ド の挿入 と 削除 ス ク リ プ ト を記述 し て、 エ ン ド ユーザに 入力フ ィ ール ド を挿入 さ せた り 削除 さ せ る こ と がで き ます。 ま た、 エ ン ド ユーザは、 既存の入力フ ィ ール ド を コ ピー し て貼 り 付け る こ と も で き ます。 コ ピー さ れた入力フ ィ ール ド は、 すべて同 じ デー タ 値を表 示 し ます。 書式設定のためのキー と ツールバー ツールバーが表示 さ れてい る 場合、 エ ン ド ユーザはツールバーのボ タ ン を 使用 し て、 プ レ ビ ュ ー モー ド で テ キ ス ト の書式 を 設定 し た り 、 シ ョ ー ト カ ッ ト キー を 使用 し て ワ ー ク ス ペー ス 内の テ キ ス ト の書式 を設定で き ます。 リ ッ チ テ キ ス ト におけ る 書式設定の た めの シ ョ ー ト カ ッ ト キーにつ いては、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルの リ ッ チテ キ ス ト に関す る 章を参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 277 リ ッ チ テキス ト と エ ン ド ユーザ 278 PowerBuilder 第 1 6 章 デー タ ソ ース間のデー タ 転送 こ の章について こ の章では、 アプ リ ケーシ ョ ン でパ イ プ ラ イ ン オブジ ェ ク ト を使 用 し て、1 つま たは複数の転送元テーブルか ら 新規ま たは既存の転 送先テーブルへデー タ パ イ プ ラ イ ン処理を行 う 方法について説明 し ます。 内容 サン プル ア プ リ ケーシ ョ ン 項目 デー タ パ イ プ ラ イ ンについて 必要なオブジ ェ ク ト の作成 パ イ プ ラ イ ン処理の前準備 パ イ プ ラ イ ン処理の開始 エ ラ ー行の処理 パ イ プ ラ イ ンの後処理 ページ 279 281 288 291 298 302 こ の章では、 簡単な商品受注管理シ ス テ ム を使っ てデー タ パ イ プ ラ イ ンの使い方を説明 し ます。 デー タ パ イ プ ラ イ ン処理の参考例 と し て、 Code Examples サン プル アプ リ ケーシ ョ ンのデー タ パ イ プ ラ イ ン項目にあ る サン プルを参照 し て く だ さ い。 サン プル アプ リ ケーシ ョ ン の使い方についての詳細は、第 1 章「サ ン プル アプ リ ケーシ ョ ン の使い方」 を参照 し て く だ さ い。 デー タ パイ プ ラ イ ン について デー タ パ イ プ ラ イ ン と は、デー タ ベース テーブル間でデー タ を転 送で き る 機能です。 デー タ パ イ プ ラ イ ン機能に よ っ て、 1 つ ま た は複数の転送元テーブルか ら 、 新規 ま たは既存の転送先テーブル に行を コ ピーで き ま す。 ま た、 こ の機能に よ っ て、 同一のデー タ ベース内、 複数のデー タ ベース間、 ま たは異な る DBMS 間におい て も デー タ を移行で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 279 デー タ パイ プ ラ イ ンについて デー タ パ イ プ ラ イ ン処理は、 以下の 2 種類の用途で使用 さ れます。 デー タ パイ プ ラ イ ン 処理の用途 • 開発時のユーテ ィ リ テ ィ と し て PowerBuilder 開発環境での作業中に、デー タ を移行 し たい こ と があ り ま す (運用時に使用す る 大 き な テーブルか ら テ ス ト 用に小 さ な テーブルを作成す る と き な ど) 。 こ の場合、 デー タ パ イ プ ラ イ ン ペ イ ン タ で対話的に作業を行っ て、 す ぐ にデー タ を移行で き ます。 デー タ パ イ プ ラ イ ン ペ イ ン タ の開発環境での使い方につい て の 詳細は、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 • ア プ リ ケーシ ョ ンにおけるデー タ 移行ツール と し て実装するには 複数のテーブル間でデー タ の移行を必要 と す る よ う な ア プ リ ケー シ ョ ン を構築 し てい る 場合は、 デー タ パ イ プ ラ イ ン ペ イ ン タ で適 切なデー タ パ イ プ ラ イ ン を設計 し 、 パ イ プ ラ イ ン オブジ ェ ク ト を 保存 し てお き ま す。 こ れに よ り 、 ア プ リ ケーシ ョ ン実行時に、 エ ン ド ユーザにそのデー タ パ イ プ ラ イ ン処理 を 行わせ る こ と がで き ます。 デー タ パ イ プ ラ イ ンは、 アプ リ ケーシ ョ ン の さ ま ざ ま な局面で利 用で き ます。 た と えば、 アプ リ ケーシ ョ ン で、 デー タ ベース サー バ か ら テ ーブ ル の ロ ー カ ル コ ピ ー を リ モ ー ト ユーザ に ダ ウ ン ロ ー ド さ せ る 場合や、 分散 し てい る ト ラ ンザ ク シ ョ ン テーブルの デー タ を マ ス タ ー ト ラ ン ザ ク シ ョ ン テーブルに ま と め る 場合な ど です。 ア プ リ ケーシ ョ ン にデー タ パ イ プ ラ イ ン を 使用す る 必要が あ る 場合 は、 そのための手順を決定 し な ければな り ま せん。 通常は、 以下の 5 段階の基本操作を行い ます。 基本操作の概要 ❖ ア プ リ ケーシ ョ ン でデー タ パイ プ ラ イ ン処理を行 う には 1 パ イ プ ラ イ ン、 ユーザ オブジ ェ ク ト 、 ウ ィ ン ド ウ な ど、 必要なオ ブジ ェ ク ト を作成 し ます。 2 パ イ プ ラ イ ン処理の準備を行い ます。 3 パ イ プ ラ イ ン処理を開始 し ます。 4 エ ラ ー と な っ た行を処理 し ます。 5 パ イ プ ラ イ ン の後処理を し ます。 本章の後半は、 以上の各操作の詳細について説明 し ます。 280 PowerBuilder 第 16 章 デー タ ソ ース間のデー タ 転送 必要なオブ ジ ェ ク ト の作成 アプ リ ケーシ ョ ン でデー タ のパ イ プ ラ イ ン処理を実装す る には、 以下 の種類のオブジ ェ ク ト を作成す る 必要があ り ます。 • パ イ プ ラ イ ン オブジ ェ ク ト • ユーザ オブジ ェ ク ト • ウィンドウ パイ プ ラ イ ン オブ ジ ェ ク ト の作成 パ イ プ ラ イ ン オブジ ェ ク ト を作成 し て、 アプ リ ケーシ ョ ン で実行 し た いパ イ プ ラ イ ン のデー タ 定義やア ク セ ス 情報を指定 し ます。 パ イ プ ラ イ ン オブジ ェ ク ト は、PowerBuilder のデー タ パ イ プ ラ イ ン ペ イ ン タ で 作成 し 、 パ イ プ ラ イ ン処理に必要な特性を定義 し てお き ます。 パイ プ ラ イ ンの定義 デー タ パ イ プ ラ イ ン ペ イ ン タ では、以下の特性を指定 し てパ イ プ ラ イ ン オブジ ェ ク ト を定義 し ます。 • ア ク セ スす る 転送元テーブル と テーブルか ら 取得 (検索) す る デー タ (デー タ ソ ース に ス ト ア ド プ ロ シージ ャ も ア ク セ ス で き る ) • デー タ を転送す る 転送先テーブル • パ イ プ ラ イ ン操作 (作成、 置 き 換え、 リ フ レ ッ シ ュ 、 追加、 更新) の実行 • パ イ プ ラ イ ン操作中に COMMIT を発行す る 頻度(n 行ご と の発行、 すべての行を転送 し た後で発行、 ま たは コ ミ ッ ト し ない。 こ の場 合、 開発者が ス ク リ プ ト で COMMIT 文を実行す る 必要があ る ) • パ イ プ ラ イ ン操作が終了す る ま でに許容 さ れ る エ ラ ーの件数 • (転送元デー タ ベース の PowerBuilder リ ポジ ト リ か ら ) 転送先デー タ ベース に拡張属性を転送す る か ど う か デー タ パ イ プ ラ イ ン ペ イ ン タ を使用 し てパ イ プ ラ イ ン オブジ ェ ク ト を作成す る 方法についての詳細は、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 例 デー タ パ イ プ ラ イ ン ペ イ ン タ を使用 し て、pipe_sales_extract1 と い う パ イ プ ラ イ ン オ ブ ジ ェ ク ト を 定義す る 方法 を 以下に示 し ま す (な お、 pipe_sales_extract1 は、 商品受注管理シ ス テ ム の w_sales_extract ウ ィ ン ド ウ で使用 さ れ る 2 つのパ イ プ ラ イ ン オブ ジ ェ ク ト の う ち の 1 つで す)。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 281 必要なオブ ジ ェ ク ト の作成 転送元のデー タ こ のパ イ プ ラ イ ン オブジ ェ ク ト は、会社の販売デー タ ベー ス の社員情報 (Sales-rep) テ ーブル と 売上一覧 テ ーブル (Salessummary) を結合 し て、 転送元デー タ を形成 し てい ます。 転送元デー タ は、 あ る 特定の四半期の行だけ を検索 し ます (アプ リ ケーシ ョ ン では、 Quarter と い う 検索引数に割 り 当て ら れた値に よ っ て、 ど の四半期に関 す る デー タ を検索す る か を指定 し ます)。 パ イ プ ラ イ ン オブジ ェ ク ト pipe_sales_extract1 は、各転送元テーブルか ら ど のカ ラ ム を転送す る か を指定 し てい ます (Sales_rep テーブルか ら は srep_id、 srep_lname、 srep_fname の各カ ラ ム、 さ ら に、 Sales_summary テーブルか ら は ssum_quarter、 ssum_rep_team の各カ ラ ム)。 ま た、 検索 時に計算 し てか ら 転送す る 計算カ ラ ム も 定義 し てい ます。 こ の計算カ ラ ム では、 Sales-summary テーブルの ssum-rep-actual カ ラ ム か ら ssumrep-quota カ ラ ム を減算 し てい ます。 282 PowerBuilder 第 16 章 デー タ ソ ース間のデー タ 転送 デー タ の転送方法 pipe_sales_extract1 が転送元デー タ を転送す る 方法を 以下に示 し ます。 こ のパ イ プ ラ イ ン オブ ジ ェ ク ト が、 販売成績 (Quarterly-extract) と い う 転送先テーブルを新規に作成す る よ う に定義 し てい る こ と に注意 し て く だ さ い。 アプ リ ケーシ ョ ン で、 こ の新規テーブルを格納す る 転送 先デー タ ベース を指定す る 方法については、(転送元テーブルのデー タ ベース を指定す る 方法について も ) 後で示 し ます。 こ のほか、pipe_sales_extract1 について以下の項目に注意 し て く だ さ い。 • コ ミ ッ ト が発行 さ れ る のは、 対象 と な る 行がすべて転送 さ れた後 のみ(つま り 、パ イ プ ラ イ ンの実行が中断 さ れ る と 、Quarterly_extract テ ーブルに対す る 変更内容はすべ て ロ ールバ ッ ク さ れ破棄 さ れ る) • アプ リ ケーシ ョ ン で発生す る エ ラ ー件数の制限はない。 し たが っ て、 ど の行でエ ラ ーが起 き て も 、 パ イ プ ラ イ ン の実行は中断 さ れ ない • 拡張属性は、 転送先デー タ ベース には転送 さ れない • Quarterly-extract テーブルの主キーは、 srep-id カ ラ ム と ssum-quarter カ ラ ム か ら 構成 さ れ る 複合キーであ る • ア プ リ ケーシ ョ ン テ ク ニ ッ ク アプ リ ケーシ ョ ンが Quarterly-extract テーブルに作成す る 計算カ ラ ムの名前は、 computed_net であ る 283 必要なオブ ジ ェ ク ト の作成 ユーザ オブ ジ ェ ク ト の作成 こ こ ま で、 パ イ プ ラ イ ン オブジ ェ ク ト にパ イ プ ラ イ ン に対す る デー タ やア ク セ ス を定義す る 方法について説明 し て き ま し たが、 パ イ プ ラ イ ン オブジ ェ ク ト には、 アプ リ ケーシ ョ ン で実際にパ イ プ ラ イ ン を実行 し た り 管理す る 際に必要 と な る さ ま ざ ま な定義 (プ ロ パテ ィ 、 イ ベン ト 、 関数な ど) は含ま れてい ません。 ア プ リ ケ ーシ ョ ン でパ イ プ ラ イ ン 処理 を 行 う 際に、 そ の ア プ リ ケ ー シ ョ ン で 必 要 と な る 個 別 の 定 義 を 実 装 す る に は、 PowerBuilder の Pipeline シ ス テ ム オブジ ェ ク ト を継承 さ せたユーザ オブジ ェ ク ト の作 成が必要です。 表 16-1 に、 実行時にアプ リ ケーシ ョ ン に よ る オブジ ェ ク ト の管理を可能にす る 、 Pipeline シ ス テ ム オブジ ェ ク ト の さ ま ざ ま なプ ロ パテ ィ 、 イ ベン ト 、 関数を示 し ます。 Pipeline シス テム オ ブ ジ ェ ク ト について 表 16-1: Pipeline シ ス テム オブ ジ ェ ク ト のプ ロパテ ィ 、 イ ベ ン ト 、 関数 プ ロパテ ィ DataObject、 イ ベン ト PipeStart、 関数 Start、 RowsRead、 PipeMeter、 PipeEnd Repair、 RowsWritten、 Cancel RowsInError、 Syntax アプ リ ケーシ ョ ン におけ る こ れ ら のプ ロ パテ ィ 、 イ ベン ト 、 関数の使 い方は、 こ の章の後半で説明 し ます。 ❖ パイ プ ラ イ ン処理をサポー ト するユーザ オブ ジ ェ ク ト を作成するには 1 新規作成 ダ イ ア ロ グ ボ ッ ク ス の [PB オブジ ェ ク ト ] タ ブか ら [標 準 ク ラ ス] を選択 し ます。 標準 ク ラ ス デー タ 型の選択 ダ イ ア ロ グ ボ ッ ク ス が表示 さ れ、 新規 のユーザ オブジ ェ ク ト に継承 し たい PowerBuilder のシ ス テ ム オブ ジ ェ ク ト 名が指定で き ます。 2 284 「pipeline」 を選択 し て、 [OK] ボ タ ン を選択 し ます。 PowerBuilder 第 16 章 デー タ ソ ース間のデー タ 転送 3 必要に応 じ て、ユーザ オブジ ェ ク ト に変更を加え ます。アプ リ ケー シ ョ ン で使用す る イ ベン ト 、 関数、 変数な ど を記述 し ます。 特に有効なユーザ オブジ ェ ク ト の機能については、 293 ページの 「パ イ プ ラ イ ン処理のモニ タ 」 を参照 し て く だ さ い。 再利用を考えた設計 ユーザ オブジ ェ ク ト を作成す る 場合、 そのユーザ オブジ ェ ク ト が 将来再利用 さ れ、 ほかのパ イ プ ラ イ ン処理の実行に も 使用 さ れ る こ と があ る こ と を考慮 し て く だ さ い。ユーザ オブジ ェ ク ト は、デー タ パ イ プ ラ イ ン ペ イ ン タ で作成 し た 特定のパ イ プ ラ イ ン オ ブ ジ ェ ク ト と 自動的に関連付け ら れ る わけではな く 、 ほかのパ イ プ ラ イ ン オブジ ェ ク ト に対 し て も 使用す る こ と がで き ます。 こ の柔軟性を有効に活用す る ために も 、 ユーザ オブジ ェ ク ト で記 述す る イ ベン ト 、 関数、 変数は、 あ ら ゆ る パ イ プ ラ イ ン オブジ ェ ク ト に適応で き る よ う な汎用性を持たせてお く 必要があ り ます。 4 ユーザ オブジ ェ ク ト を保存 し ます。 ユーザ オブジ ェ ク ト ペ イ ン タ での操作手順については、『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 ウィ ン ド ウの作成 ウ ィ ン ド ウ は、 アプ リ ケーシ ョ ン でデー タ パ イ プ ラ イ ン処理をす る と き に必要 と な る も う 1 つのオブジ ェ ク ト です。 ウ ィ ン ド ウ を作成 し て、 パ イ プ ラ イ ン 処理に対す る ユーザ イ ン タ フ ェ ー ス を 提供 し 、 エ ン ド ユーザに よ る さ ま ざ ま なパ イ プ ラ イ ン操作を可能に し ます。 通常のア プ リ ケーシ ョ ン では、 以下の よ う な エ ン ド ユーザ操作が考え ら れ ま す。 ウ ィ ン ド ウに必要 と な る機能 • パ イ プ ラ イ ン処理を開始す る • エ ラ ー内容の表示や修正を行 う • 必要に応 じ 、 パ イ プ ラ イ ン処理の実行を中断す る ウ ィ ン ド ウ を作成す る 際に、 そのパ イ プ ラ イ ン処理でエ ラ ー と な っ た 行(何 ら かの理由で転送先テーブルに転送で き ない行) を表示す る デー タ ウ ィ ン ド ウ コ ン ト ロ ールが必要 と な り ます。 こ のデー タ ウ ィ ン ド ウ コ ン ト ロ ールにデー タ ウ ィ ン ド ウ オブ ジ ェ ク ト を 関連付け る 必要は あ り ません。 実行時にパ イ プ ラ イ ン に よ っ て独自のデー タ ウ ィ ン ド ウ オブジ ェ ク ト が提供 さ れ ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 285 必要なオブ ジ ェ ク ト の作成 こ のデー タ ウ ィ ン ド ウ コ ン ト ロ ールの使い方については、 291 ページ の 「パ イ プ ラ イ ン処理の開始」 お よ び 298 ページの 「エ ラ ー行の処理」 を参照 し て く だ さ い。 ウ ィ ン ド ウに対するオ プ シ ョ ン機能 ウ ィ ン ド ウ は、 開発者が自由に設計で き ますが、 通常は以下の よ う な コ ン ト ロ ールを配置 し てユーザ イ ン タ フ ェース を実現 し ます。 • エ ン ド ユーザが (パ イ プ ラ イ ンの開始、 修正、 停止な ど の) 操作 を行え る よ う にす る コ マ ン ド ボ タ ン コ ン ト ロ ールやピ ク チ ャ ボ タ ン コ ン ト ロ ール • パ イ プ ラ イ ン の ス テー タ ス情報を表示す る ス タ テ ィ ッ ク テ キ ス ト コ ン ト ロ ール • 転送元テーブルや転送先テーブルの内容を表示す る デー タ ウ ィ ン ド ウ コ ン ト ロ ール ウ ィ ン ド ウ の作成について の詳細は、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 例 次の ウ ィ ン ド ウ は、 商品受注管理シ ス テ ム におけ る デー タ パ イ プ ラ イ ン 処理の ユーザ イ ン タ フ ェ ー ス を 扱 い ま す。 ウ ィ ン ド ウ 名 は、 w_sales_extract です。 こ の ウ ィ ン ド ウ 上の各 コ ン ト ロ ールは、 パ イ プ ラ イ ン処理に関連 し た さ ま ざ ま な機能を実現す る ために使用 さ れてい ま す。 使用 さ れてい る コ ン ト ロ ールの詳細を、 表 16-2 に ま と めてい ます。 286 PowerBuilder 第 16 章 デー タ ソ ース間のデー タ 転送 表 16-2: パイ プ ラ イ ンの機能を実現する ためのウ ィ ン ド ウ コ ン ト ロール コ ン ト ロールの 種類 ラ ジオボ タ ン コマン ド ボ タ ン コ ン ト ロール名 rb_create 目的 実行す る パ イ プ ラ イ ン オブ ジ ェ ク ト に、 pipe_sales_extract1 を選択する rb_insert 実行す る パ イ プ ラ イ ン オブ ジ ェ ク ト に、 pipe_sales_extract2 を選択する 選択 し た パ イ プ ラ イ ン 処理の実行 を 開始す る パ イ プ ラ イ ンの実行を停止 し 、行の修 正内容を破棄す る (dw_pipe_errors デー タ ウ ィ ン ド ウ コ ン ト ロ ール内で) エ ン ド ユーザが行 に加え た修正内容で転送先テーブル を更新す る dw_pipe_errors デー タ ウ ィ ン ド ウ コ ン ト ロ ールか ら 、すべてのエ ラ ー行を削 除す る (エ ン ド ユーザが修復 を 希望 し ない と き に使用) 転送先テーブル (Quarterly-extract) の 現行の内容を表示す る (必須) パ イ プ ラ イ ン自身が使用す る デー タ ウ ィ ン ド ウ コ ン ト ロ ー ル。 PowerBuilder のパ イ プ ラ イ ン エ ラ ー の内容 (何 ら かのエ ラ ーで転送で き な かっ た行の リ ス ト ) を自動的に表示す る パ イ プ ラ イ ン が転送元テーブルか ら 読み込む行数を表示す る パ イ プ ラ イ ン が転送元テーブルに書 き 込む行数や、 dw_pipe_ errors デー タ ウ ィ ン ド ウ の行数を表示す る st_status_error パ イ プ ラ イ ンが dw_pipe_ errors デー タ ウ ィ ン ド ウ に渡 し た行数 (エ ラ ー と な っ た行数) を 表示す る cb_write cb_stop cb_applyfixes cb_forgofixes デー タ ウ ィ ン ド ウ dw_review_extract dw_pipe_errors スタテ ィ ッ ク テキ ス ト st_status_read st_status_written st_status_error ア プ リ ケーシ ョ ン テ ク ニ ッ ク 287 パイ プ ラ イ ン処理の前準備 パイ プ ラ イ ン処理の前準備 アプ リ ケーシ ョ ン で必要 と な る オブジ ェ ク ト の準備がで き た ら 、 アプ リ ケーシ ョ ン でパ イ プ ラ イ ン処理を行 う ス ク リ プ ト を記述 し ます。 ま ず、 アプ リ ケーシ ョ ン がパ イ プ ラ イ ン処理を実行で き る よ う に、 い く つかの設定を行わなければな り ません。 ❖ ア プ リ ケーシ ョ ン でパイ プ ラ イ ン を実行する ための準備をするには 1 パ イ プ ラ イ ン に用い る 転送元お よ び転送先デー タ ベー ス に接続 し ます。 こ れは、 適切な イ ベン ト において、 接続のための一般的な ス ク リ プ ト を記述 し て行い ま す。 ただ し 、 転送元デー タ ベー ス に接続す る 際に使用す る ト ラ ンザ ク シ ョ ン オブジ ェ ク ト と 、 転送先デー タ ベース と の接続に使用す る ト ラ ンザ ク シ ョ ン オブジ ェ ク ト は、(同 一のデー タ ベース の場合で も ) 異な る こ と に注意 し て く だ さ い。 デー タ ベー ス への接続についての詳細は、 第 12 章 「 ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト の使い方」 を参照 し て く だ さ い。 2 ユーザ オブジ ェ ク ト の イ ン ス タ ン ス を作成 し ます ( イ ン ス タ ン ス を作成す る こ と に よ り 、 アプ リ ケーシ ョ ン でユーザ オブジ ェ ク ト のプ ロ パテ ィ 、 イ ベン ト 、 関数が使用で き る よ う にな り ます)。 最初に、 定義 し たユーザ オブジ ェ ク ト をデー タ 型 と す る 変数を宣 言 し ます。 次に、 ス ク リ プ ト で CREATE 文を使っ て、 ユーザ オブ ジ ェ ク ト の イ ン ス タ ン ス を作成 し 、 それを変数に代入 し ます。 3 使用 し たいパ イ プ ラ イ ン オブジ ェ ク ト を指定 し ます。 こ れは、 ス ク リ プ ト で 代入文を記述 し て行い ます。 使用す る パ イ プ ラ イ ン オブジ ェ ク ト 名を示す文字列を、 ユーザ オブジ ェ ク ト の イ ン ス タ ン ス の DataObject プ ロ パテ ィ に代入 し ます。 CREATE 文お よ び代入文についての詳細は、『PowerScript リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 例 次のサン プル コ ー ド は、 商品受注管理シ ス テ ム におけ る こ れ ら のパ イ プ ラ イ ンの設定を行い ます。 転送元および転送先デー タ ベース と の接続 こ の場合は、 会社の販売デー タ ベース (ABNCSALE.DB) を、転送元お よ び転送先の両方のデー タ ベー ス と し て 使 用 し て い ま す。 こ の 販 売 デ ー タ ベ ー ス と の 接 続 は、 uevent_pipe_setup と い う ユーザ イ ベン ト に ス ク リ プ ト を記述 し て行っ てい ます (uevent_pipe_setup イ ベン ト は、 w_sales_extract ウ ィ ン ド ウ の Open イ ベン ト か ら ポ ス ト さ れます)。 288 PowerBuilder 第 16 章 デー タ ソ ース間のデー タ 転送 以下の ス ク リ プ ト は、 転送元デー タ ベース と の接続を確立 し ます。 // ト ラ ンザク シ ョ ン オブ ジ ェ ク ト のイ ン ス タ ン ス を新規に作成 し 、 // itrans_source (あ ら か じ め Transaction デー タ 型 // と し て宣言 し た変数) に保持 し ます。 itrans_source = CREATE transaction // 次に、 ト ラ ンザク シ ョ ン オブ ジ ェ ク ト itrans_destination の // プ ロパテ ィ に値を代入 し ます。 ... // 転送元デー タ ベースに接続 し ます。 CONNECT USING itrans_source; 以下の ス ク リ プ ト は、 転送先デー タ ベース と の接続を確立 し ます。 // ト ラ ンザク シ ョ ン オブ ジ ェ ク ト のイ ン ス タ ン ス を新規に作成 し 、 // itrans_destination (あ らか じ め Transaction デー タ 型 // と し て宣言 し た変数) に保持 し ます。 itrans_destination = CREATE transaction // 次に、 ト ラ ンザク シ ョ ン オブ ジ ェ ク ト itrans_destination の // プ ロパテ ィ に値を代入 し ます。 ... // 転送先デー タ ベースに接続 し ます。 CONNECT USING itrans_destination; ネ イ テ ィ ブ ド ラ イバの USERID 設定 ネ イ テ ィ ブ ド ラ イ バを使用 し てい る 場合に、パ イ プ ラ イ ン ペ イ ン タ で パ イ プ ラ イ ン を実行す る と 、 PowerBuilder は、 テーブルのオーナ名で テーブル名を自動的に修飾 し ます。 ネ イ テ ィ ブ ド ラ イ バを使用 し てい る 場合に、 アプ リ ケーシ ョ ン でパ イ プ ラ イ ン を実行す る と き は、 テー ブル名が正 し く 修飾 さ れ る よ う に、 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト で USERID プ ロ パテ ィ を設定 し なければな り ません。 転送先デー タ ベー ス の ト ラ ン ザ ク シ ョ ン オブ ジ ェ ク ト で USERID プ ロ パテ ィ を設定 し なか っ た場合には、 パ イ プ ラ イ ン の実行エ ラ ーが発 生 し ます。 転送元デー タ ベース がネ イ テ ィ ブ ド ラ イ バを使用す る 場合 には、 USERID が設定 さ れていなければ、 拡張属性は転送 さ れ ません。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 289 パイ プ ラ イ ン処理の前準備 u_sales_pipe_logistics と い う パ イ プ ラ イ ン 処理に必要 と な る ユーザ オブ ジ ェ ク ト を 作成す る 方法に つい て は、 すでに説明 し ま し た。 こ のユーザ オブ ジ ェ ク ト を ア プ リ ケーシ ョ ン で使用す る には、 まずそのユーザ オブジ ェ ク ト をデー タ 型 と す る 変数を宣言 し ます。 ユーザ オブ ジ ェ ク ト のイ ン ス タ ン スの作成 // こ れは w_sales_extract ウ ィ ン ド ウの // イ ン ス タ ン ス変数です。 u_sales_pipe_logistics iuo_pipe_logistics 次に、 ユーザ オブジ ェ ク ト u_sales_pipe_logistics の イ ン ス タ ン ス を作 成 し 、 iuo_pipe_logistics 変数に保持す る コ ー ド を、 ユーザ イ ベン ト uevent_pipe_setup に記述 し ます。 iuo_pipe_logistics = CREATE u_sales_pipe_logistics 使用するパイ プ ラ イ ン オブ ジ ェ ク ト の指定 こ のアプ リ ケーシ ョ ンは、 必 要 と す る パ イ プ操作の種類に よ っ て、 以下のいずれかのパ イ プ ラ イ ン オブジ ェ ク ト を使用 し てい ます。 • pipe_sales_extract1 (前述の説明を参照) は、 Quarterly-extract テーブ ル を新規に作成す る ( こ のテーブルは現時点で存在 し ていない も の と する) • pipe_sales_extract2 は、 Quarterly-extract テーブルに行を挿入す る ( こ のテーブルは現時点で存在 し てい る も の と す る ) パ イ プ ラ イ ン オブジ ェ ク ト を選択 し 、 その使用準備を行 う ス ク リ プ ト を、 コ マ ン ド ボ タ ン cb_write の Clicked イ ベン ト に記述 し ます ( コ マ ン ド ボ タ ンは、 エ ン ド ユーザがパ イ プ を開始 し たい と き に ク リ ッ ク し ま す)。 // w_sales_extract ウ ィ ン ド ウで選択 さ れてい る // ラ ジオボ タ ン を確認 し ます。 次に、 iuo_pipe_logistics に // 適切なパイ プ ラ イ ン オブ ジ ェ ク ト を代入 し ます。 IF rb_create.checked = true THEN iuo_pipe_logistics.dataobject = "pipe_sales_extract1" ELSE iuo_pipe_logistics.dataobject = "pipe_sales_extract2" END IF こ の コ ー ド は、 選択 さ れたパ イ プ ラ イ ン を開始す る ス ク リ プ ト よ り 前 に、 通常ス ク リ プ ト の先頭で記述 し ます。 290 PowerBuilder 第 16 章 デー タ ソ ース間のデー タ 転送 パイ プ ラ イ ン オブ ジ ェ ク ト を配布する際の注意 通常、 ア プ リ ケーシ ョ ン は、 実行時にパ イ プ ラ イ ン オブ ジ ェ ク ト を (String 型の変数に よ っ て) 動的に参照 し ます。 そのため、 アプ リ ケー シ ョ ン を配布す る 場合は、 こ れ ら のオブジ ェ ク ト を 1 つま たは複数の PBD か DLL フ ァ イ ルにパ ッ ケージ化す る 必要があ り ます。 なお、 実行 (EXE) フ ァ イ ルにパ イ プ ラ イ ン オブジ ェ ク ト を含め る こ と はで き ま せん。 配布についての詳細は、 第 9 部 「配布のテ ク ニ ッ ク 」 を参照 し て く だ さ い。 パイ プ ラ イ ン処理の開始 パ イ プ ラ イ ン の準備が整っ た ら 、 実行を開始 し ます。 ❖ パイ プ ラ イ ン処理を開始するには 1 適切な ス ク リ プ ト に Start 関数を記述 し ます。 こ の関数では、 以下 の内容が指定で き ます。 • 転送元デー タ ベース に対す る ト ラ ンザ ク シ ョ ン オブジ ェ ク ト • 転送先デー タ ベース に対す る ト ラ ンザ ク シ ョ ン オブジ ェ ク ト • Start 関数がエ ラ ー行を表示す る デー タ ウ ィ ン ド ウ コ ン ト ロ ー ル Start 関数は、 PowerBuilder のパ イ プ ラ イ ン エ ラ ー デー タ ウ ィ ン ド ウ オ ブ ジ ェ ク ト と 、 使用す る デー タ ウ ィ ン ド ウ コ ン ト ロ ールを自動的に関連付け ます (必要な場合のみ)。 • パ イ プ ラ イ ン オブジ ェ ク ト で定義 し た検索引数に対す る 値 こ れ ら の値を省略す る と 、 Start 関数は、 アプ リ ケーシ ョ ン実行 時にそれ ら の入力を自動的に要求 し ます。 2 Start 関数の結果を調べます。 Start 関数の記述についての詳細は、『PowerScript リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 291 パイ プ ラ イ ン処理の開始 例 以下のサ ンプル ス ク リ プ ト は、 商品受注管理シ ス テ ム のパ イ プ ラ イ ン を開始 し ます。 Start 関数の呼び出 し 選択 し たパ イ プ ラ イ ン を開始す る 場合は、エ ン ド ユーザに w_sales_extract ウ ィ ン ド ウ の コ マ ン ド ボ タ ン (cb_write) を選 択 さ せます。 cb_write コ マ ン ド ボ タ ンの Clicked イ ベン ト が起動 さ れます ( こ の イ ベ ン ト の ス ク リ プ ト に、 Start 関数が記述 さ れてい ます)。 // 転送を開始 し ます。 integer li_start_result li_start_result = iuo_pipe_logistics.Start & (itrans_source,itrans_destination,dw_pipe_errors) ス ク リ プ ト では、 ユーザがパ イ プ ラ イ ン の検索引数 (Quarter) に対す る 値を設定 し てい ません。 そ こ で、 Start 関数が、 その値を入力す る よ う エ ン ド ユーザに要求 し ます。 cb_write コ マ ン ド ボ タ ン の Clicked イ ベ ン ト に対す る 以 下の ス ク リ プ ト に よ っ て、 Start 関数の戻 り 値を調べます。 こ れに よ っ て、 アプ リ ケーシ ョ ン で関数が正常終了 し たか ど う か (正常終了 し な か っ た場合は、 エ ラ ーの内容) を調べ る こ と がで き ます。 結果を調べる CHOOSE CASE li_start_result CASE -3 Beep (1) MessageBox(" 転送エ ラ ー ", & "Quarterly_Extract テーブルは既に存在 し ています ... RETURN CASE -4 292 PowerBuilder 第 16 章 デー タ ソ ース間のデー タ 転送 Beep (1) MessageBox(" 転送エ ラ ー ", & "Quarterly_Extract テーブルは存在 し ません ... RETURN ... END CHOOSE パイ プ ラ イ ン 処理のモ ニタ パ イ プ ラ イ ン の実行状態を モニ タ す る には、 Start 関数の戻 り 値を調べ る 方法があ り ます。 そのほかの方法 と し て、 ユーザ オブジ ェ ク ト がパ イ プ ラ イ ン処理 さ れた行数を保持 し てい る 集計値を取得す る 方法 も あ り ます。 こ れに よ り 、 パ イ プ ラ イ ン に よ っ て処理 さ れた以下の数値が 求め ら れます。 • 転送元テーブルか ら 読み込ま れた行数 • 転送先テーブルお よ びエ ラ ーのデー タ ウ ィ ン ド ウ コ ン ト ロ ールに 書 き 込ま れた行数 • (転送先テーブルではな く ) エ ラ ー用のデー タ ウ ィ ン ド ウ ロ ールに書 き 込まれたエ ラ ー行の数 コン ト こ れ ら の集計値を ユーザ オブジ ェ ク ト か ら 取得 し 、 ウ ィ ン ド ウ 上で動 的に表示 し て、 エ ン ド ユーザにパ イ プ ラ イ ン処理を確認 さ せ る こ と が で き ます。 ❖ パイ プ ラ イ ンによ っ て処理 さ れた行の集計を表示するには 1 ユーザ オブジ ェ ク ト ペ イ ン タ で、 ユーザ オブジ ェ ク ト を開 き ま す。 ユーザ オブジ ェ ク ト ペ イ ン タ の ワー ク スペース が表示 さ れ、 ユー ザ オブジ ェ ク ト の編集が可能にな り ます。 2 StaticText 型の イ ン ス タ ン ス変数を 3 種類宣言 し ます。 statictext ist_status_read, ist_status_written, & ist_status_error こ れ ら の イ ン ス タ ン ス 変数は、 今後、 ウ ィ ン ド ウ 上の 3 つの ス タ テ ィ ッ ク テ キ ス ト コ ン ト ロ ールの内容 を 保持す る ために使用 し ます。 こ れに よ り 、 ユーザ オブジ ェ ク ト で ス タ テ ィ ッ ク テ キ ス ト コ ン ト ロ ールの内容を直接操作 し 、 パ イ プ ラ イ ン に よ る 各種の行 の集計を動的に表示で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 293 パイ プ ラ イ ン処理の開始 3 ユーザ オブジェ ク ト の PipeMeter イ ベン ト ス ク リ プト では、 Pipeline シ ス テ ム オブジ ェ ク ト か ら 継承 し たプ ロ パテ ィ の値を、 3 つの ス タ テ ィ ッ ク テ キ ス ト イ ン ス タ ン ス 変数のテ キ ス ト プ ロ パテ ィ に 割 り 当て る ス テー ト メ ン ト を記述 し ます。 ist_status_read.text = string(RowsRead) ist_status_written.text = string(RowsWritten) ist_status_error.text = string(RowsInError) 4 ユーザ オブジ ェ ク ト に加え た変更内容を保存 し 、 ユーザ オブジ ェ ク ト ペ イ ン タ を閉 じ ます。 5 使用す る ウ ィ ン ド ウ を ウ ィ ン ド ウ ペ イ ン タ で開 き ます。 6 3 つの ス タ テ ィ ッ ク テ キ ス ト コ ン ト ロ ールを ウ ィ ン ド ウ に挿入 し ます。 RowsRead プ ロ パテ ィ の値 を 表示す る ス タ テ ィ ッ ク テ キ ス ト コ ン ト ロ ール RowsWritten プ ロ パテ ィ の値 を 表示す る ス タ テ ィ ッ ク テ キ ス ト コ ン ト ロ ール RowsInError プ ロ パテ ィ の値 を 表示す る ス タ テ ィ ッ ク テ キ ス ト コ ン ト ロ ール 7 ウ ィ ン ド ウ の Open イ ベン ト に対す る ス ク リ プ ト (ま たは、 ウ ィ ン ド ウ を 開い た直後に実行す る ほ か の イ ベ ン ト に対す る ス ク リ プ ト ) を編集 し ます。 こ こ では、 ( ウ ィ ン ド ウ に挿入 し たばか り の) 3 つの ス タ テ ィ ッ ク テ キ ス ト コ ン ト ロ ールを、 ユーザ オブジ ェ ク ト であ ら か じ め宣言 し ておいた 3 つの対応す る ス タ テ ィ ッ ク テ キ ス ト イ ン ス タ ン ス変 数に割 り 当て る ス テー ト メ ン ト を記述 し ま す。 こ れに よ り 、 その ユーザ オブジ ェ ク ト か ら こ れ ら の ス タ テ ィ ッ ク テ キ ス ト コ ン ト ロ ールを直接操作で き ます。 商品受注管理シ ス テ ム では、こ の ロ ジ ッ ク を uevent_pipe_setup ユー ザ イ ベ ン ト に対 し て 記述 し て い ま す ( こ の ユーザ イ ベ ン ト は、 w_sales_extract ウ ィ ン ド ウ の Open イ ベン ト か ら ポ ス ト さ れます)。 294 PowerBuilder 第 16 章 デー タ ソ ース間のデー タ 転送 iuo_pipe_logistics.ist_status_read = st_status_read iuo_pipe_logistics.ist_status_written = & st_status_written iuo_pipe_logistics.ist_status_error = & st_status_error 8 ウ ィ ン ド ウ への変更内容を 保存し 、ウ ィ ン ド ウ ペイ ン タ を 閉じ ま す。 商品受注管理シ ス テ ム の w_sales_extract ウ ィ ン ド ウ でパ イ プ ラ イ ン を開始す る と 、 ユーザ オブジ ェ ク ト の PipeMeter イ ベン ト が起 動 さ れ、 その イ ベン ト の ス ク リ プ ト が実行 さ れて、 パ イ プ ラ イ ン に よ る 行の集計が 3 個の ス タ テ ィ ッ ク テ キ ス ト コ ン ト ロ ールに表 示 さ れ ます。 パイ プ ラ イ ン 処理のキャ ン セル パ イ プ ラ イ ン の実行を途中で停止す る 機能を エ ン ド ユーザ (ま たはア プ リ ケーシ ョ ン) に提供 し たい場合が多 く あ り ます。 た と えば、間違っ てパ イ プ ラ イ ン を開始 し た り 、 (大量の行数を扱っ てい る と き に) 処理 を途中で中断 し たい場合な ど です。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 295 パイ プ ラ イ ン処理の開始 ❖ パイ プ ラ イ ンの実行をキ ャ ン セルするには 1 適切な ス ク リ プ ト に Cancel 関数を記述 し ます。 Cancel 関数は、 パ イ プ ラ イ ン の開始後 (適切で あれば) 、 エ ン ド ユーザ ま たは ア プ リ ケーシ ョ ン の ど ち ら か ら で も 実行で き ま す。 Cancel 関数が実行 さ れ る と 、 それ以降の行の転送が停止 さ れ ます。 処理が中断 さ れた時点 ま でに転送 さ れた行が転送先テーブルに コ ミ ッ ト さ れ る か ど う かは、 デー タ パ イ プ ラ イ ン ペ イ ン タ でパ イ プ ラ イ ン オブジ ェ ク ト の作成時に指定 し た [ コ ミ ッ ト 単位]オプシ ョ ンに よ っ て決ま り ます。 コ ミ ッ ト については、 次節で説明 し ます。 2 Cancel 関数の結果を調べます。 Cancel 関数の記述についての詳細は、 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ アルを参照 し て く だ さ い。 例 次の例では、 エ ン ド ユーザが コ マ ン ド ボ タ ン を使っ て商品受注管理シ ス テ ム のパ イ プ ラ イ ン実行を中断 し ます。 コ マ ン ド ボ タ ンの提供 w_sales_extract ウ ィ ン ド ウ を 作成す る と き に、 cb_stop と い う コ マ ン ド ボ タ ン コ ン ト ロ ールを配置 し ます。 ま た、 パ イ プ ラ イ ン の開始時に こ の コ マ ン ド ボ タ ン を使用可能に し 、 その終了 と と も に使用不可にす る コ ー ド を アプ リ ケーシ ョ ン の ス ク リ プ ト に記述 し ます。 次に、 cb_stop コ マ ン ド ボ タ ンの Clicked イ ベン ト に対 し て以下の ス ク リ プ ト を記述 し ます。 こ の ス ク リ プ ト は、 Cancel 関数を呼び出 し 、 それが正 し く 機能 し てい る か ど う か を調べます。 Cancel 関数の呼び出 し IF iuo_pipe_logistics.Cancel() = 1 THEN Beep (1) MessageBox(" パイ プ ラ イ ン処理の状況 ", & " デー タ 転送が (ユーザの要求によ っ て) 中断 さ れま し た。 ") ELSE Beep (1) MessageBox(" パイ プ ラ イ ン処理の状況 ", & " デー タ 転送の中断時にエ ラ ーが発生 し ま し た。 ", & Exclamation!) END IF こ れ ら の機能は、 エ ン ド ユーザが cb_stop コ マ ン ド ボ タ ン を選択す る こ と に よ っ て、現在実行中のパ イ プ ラ イ ン を停止で き る よ う に し ます。 296 PowerBuilder 第 16 章 デー タ ソ ース間のデー タ 転送 更新処理のコ ミ ッ ト パ イ プ ラ イ ン オブジ ェ ク ト を実行す る と 、 デー タ パ イ プ ラ イ ン ペ イ ン タ での指定に従 っ て転送先テーブルへの更新が コ ミ ッ ト さ れ ま す。 開発者は、 アプ リ ケーシ ョ ン の ス ク リ プ ト で、 こ の コ ミ ッ ト 処理のた めに COMMIT 文を記述す る 必要はあ り ません (ただ し 、 パ イ プ ラ イ ン オブ ジ ェ ク ト を 作成 し た と き に、 [ コ ミ ッ ト 単位] オプ シ ョ ン に [な し ] を指定 し た と き を除 く )。 例 た と えば、 商品受注管理シ ス テ ムの 2 つのパ イ プ ラ イ ン オブジ ェ ク ト (pipe_sales_extract1 と pipe_sales_extract2) は、 すべての行が転送 さ れた 後で コ ミ ッ ト を行 う よ う にデー タ パ イ プ ラ イ ン ペ イ ン タ で定義 さ れ てい ます。 こ れに よ り 、 Start 関数 (ま たは Repair 関数) は、 すべての 行が転送 さ れてか ら 、 コ ミ ッ ト し ます。 代わ り に、 一定量の行 (10 行ま たは 100 行な ど) を転送す る たびに定 期的に コ ミ ッ ト す る よ う なパ イ プ ラ イ ン オブ ジ ェ ク ト を 定義す る こ と も で き ます。 Cancel 関数が呼び出 さ れた場合 アプ リ ケーシ ョ ンが Cancel 関数を呼び出 し て、 現在実行 し てい る パ イ プ ラ イ ン を中断 し た場合は、 コ ミ ッ ト 処理が行われ る か ど う かが問題 にな り ます。その時点で コ ミ ッ ト 処理の方法が、表 16-3 に示す よ う に、 デー タ パ イ プ ラ イ ン ペ イ ン タ で指定す る [ コ ミ ッ ト 単位] オプシ ョ ン に よ っ て決ま り ます。 表 16-3: [ コ ミ ッ ト 単位] オプ シ ョ ンの値 [ コ ミ ッ ト 単位]オプ シ ョ ン の値 すべて 特定の行数 (1、 10、 100 な ど) Cancel 関数の処理の内容 現行の Start 関数 (ま たは Repair 関数) に よ っ て、 転送 し た行をすべて ロ ールバ ッ ク し ます。 中断 さ れ る 直前ま でに転送 し た行を、すべて コ ミ ッ ト し ます。 こ れは、 エ ラ ーがパ イ プ ラ イ ン の最大エ ラ ー件数に達 し た と き に起 こ る コ ミ ッ ト や ロ ールバ ッ ク の動作 と 同 じ です (なお、 最大エ ラ ー件数 はデー タ パ イ プ ラ イ ン ペ イ ン タ で指定 し ます)。 パ イ プ ラ イ ン オブ ジ ェ ク ト に対す る コ ミ ッ ト や ロ ールバ ッ ク の操作 についての詳細は、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参 照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 297 エ ラ ー行の処理 エ ラ ー行の処理 パ イ プ ラ イ ン の実行時に、 行が転送先テーブルに書 き 込めない場合が あ り ます。 た と えば、 転送先テーブルに転送元テーブル と 同 じ 主キー を持つ行があ る 場合な ど です。 パイ プ ラ イ ン エ ラ ー デー タ ウ ィ ン ド ウの使 い方 パ イ プ ラ イ ンは、 ウ ィ ン ド ウ 上に配置 さ れ Start 関数で指定 し たデー タ ウ ィ ン ド ウ コ ン ト ロ ールにエ ラ ー と な っ た行を表示 し ま す。 こ れは、 特定のデー タ ウ ィ ン ド ウ オブジ ェ ク ト (PowerBuilder のパ イ プ ラ イ ン エ ラ ー デー タ ウ ィ ン ド ウ ) と デー タ ウ ィ ン ド ウ コ ン ト ロ ールが自動的 に関連付け ら れて行われます。 こ れを商品受注管理シ ス テ ム で考え てみま し ょ う 。w_sales_extract ウ ィ ン ド ウ でパ イ プ ラ イ ン を実行す る 場合、 Start 関数は、 すべてのエ ラ ー 行 を dw_pipe_errors デー タ ウ ィ ン ド ウ コ ン ト ロ ール に 表示 し ま す。 dw_pipe_errors には、 各行のエ ラ ーを表示す る エ ラ ー メ ッ セージ カ ラ ムが配置 さ れてい ます。 エ ラ ー メ ッ セージ を短 く する パ イ プ ラ イ ン の転送先 の ト ラ ン ザ ク シ ョ ン オ ブ ジ ェ ク ト が ODBC デー タ ソ ース を指定 し てい る 場合は、DBParm の MsgTerse パ ラ メ ー タ を設定 し て、 デー タ ウ ィ ン ド ウ に表示す る エ ラ ー メ ッ セージ を短 く す る こ と がで き ます。 具体的には、 以下の よ う に指定 し ます。 MsgTerse = 'Yes' 298 PowerBuilder 第 16 章 デー タ ソ ース間のデー タ 転送 こ の よ う に指定す る こ と に よ っ て、 SQLSTATE エ ラ ー番号は表示 さ れ ません。 MsgTerse DBParm についての詳細は、 オ ン ラ イ ン ヘルプ を参照 し て く だ さ い。 エ ラ ー行の処理 エ ラ ー行があ る 場合は、 それ ら を処理す る 必要があ り ます。 以下のい ずれかの操作を行い ます。 • エ ラ ー行の一部ま たはすべての修復 • エ ラ ー行の一部ま たはすべての破棄 エ ラ ー行の修復 ほ と ん ど の場合は、 エ ラ ー と な っ た行を修正 し て、 転送先テーブルに 適用で き る よ う にす る こ と をお勧め し ま す。 通常、 1 つ ま たは複数の カ ラ ム値を転送先テーブルで受け入れ ら れ る よ う に変更 し て修復 し ま す。 エ ラ ー行の修正は、 エ ラ ーを表示 し てい る デー タ ウ ィ ン ド ウ コ ン ト ロ ール上の行を以下のいずれかの方法で編集 し て行い ます。 • エ ン ド ユーザに編集 さ せ る (開発者が ス ク リ プ ト を記述す る 必要 な し) • アプ リ ケーシ ョ ンの ス ク リ プ ト に よ っ て編集す る いずれの場合 も 、 次の操作手順で、 修正 し た行を こ のデー タ ウ ィ ン ド ウ コ ン ト ロ ールか ら 転送先テーブルに適用 し ます。 ❖ 転送先テーブルに行の修正内容を適用するには 1 適切な ス ク リ プ ト に Repair 関数を記述 し ます。Repair 関数には、転 送先デー タ ベー ス に対す る ト ラ ン ザ ク シ ョ ン オブ ジ ェ ク ト を 指 定 し ます。 2 Repair 関数の結果を調べます。 Repair 関数の記述につい て の詳細は、 『PowerScript リ フ ァ レ ン ス 』 マ ニ ュ アルを参照 し て く だ さ い。 例 次の例では、 エ ン ド ユーザがデー タ ウ ィ ン ド ウ コ ン ト ロ ール dw_pipe_errors の内容を 編集する こ と で、 表示さ れたエラ ー行を 修正で き る よ う に し ます。 その後、 修正 し たそれ ら の行を転送先テーブルに 適用 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 299 エ ラ ー行の処理 コ マ ン ド ボ タ ンの提供 w_sales_extract ウ ィ ン ド ウ の作成時に、 cb_applyfixes と い う コ マ ン ド ボ タ ン コ ン ト ロ ールを配置 し ます。 ま た、 dw_pipe_errors データ ウ ィ ン ド ウ にエラ ー行が入力さ れたと き に、 こ の コ マ ン ド ボ タ ン を使用可能に し 、 エ ラ ー行がない と き には使用不可に し てお く コ ー ド を アプ リ ケーシ ョ ン の ス ク リ プ ト に記述 し ます。 Repair 関数の呼び出 し 次に、 cb_applyfixes コ マ ン ド ボ タ ン の Clicked イ ベ ン ト に対 し て以下の ス ク リ プ ト を 記述 し ま す。 こ の ス ク リ プ ト は Repair 関数を呼び出 し 、 それが正 し く 機能 し てい る か ど う か を調べ ま す。 IF iuo_pipe_logistics.Repair(itrans_destination) & <> 1 THEN Beep (1) MessageBox(" パイ プ ラ イ ン処理の状況 ", & " 修正 し よ う と し た と き エ ラ ーが起き ま し た ", Exclamation!) END IF こ れ ら の機能を提供す る こ と に よ っ て、 エ ン ド ユーザが cb_applyfixes コ マ ン ド ボ タ ン を ク リ ッ ク す る と 、 dw_pipe_errors デー タ ウ ィ ン ド ウ か ら 修正 し た行を持つ転送先テーブルを更新で き る よ う にな り ます。 行の修正の停止 パ イ プ ラ イ ン の実行時にエ ン ド ユーザ (ま たはアプ リ ケーシ ョ ン) が 転送先テーブルへの行の書 き 込みを中断す る 方法については、 こ の章 ですでに説明 し ま し た。 状況に よ っ ては、 行の修正中に も 同様に書 き 込みを停止 さ せ る こ と がで き ます。 詳細については、 295 ページの 「パ イ プ ラ イ ン処理の キ ャ ン セル」 を 参照 し て く だ さ い。 行の修正内容の コ ミ ッ ト Repair 関数は、 Start 関数 と 同 じ 方法でデー タ ベー ス の更新を コ ミ ッ ト (ま たは ロ ール バ ッ ク ) し ます。 詳細については、 297 ページの 「更新処理の コ ミ ッ ト 」 を参照 し て く だ さ い。 修正 さ れていない行の 処理 Repair 関数の実行後、 エ ラ ー行が、 エ ラ ー デー タ ウ ィ ン ド ウ コ ン ト ロ ールに ま だ残っ てい る こ と があ り ます。 こ れには、 以下の よ う な原 因が考え ら れます。 • エ ン ド ユーザやアプ リ ケーシ ョ ンに よ っ て修正 さ れたに も かかわ ら ず、 エ ラ ーが ま だ直っ ていない場合 • エ ン ド ユーザやアプ リ ケーシ ョ ンに よ っ てエ ラ ーが修正 さ れてい ない場合 • Cancel 関数が呼び出 さ れたため、 転送先テーブルに書 き 込まれな か っ た場合 (ま たは、 停止時に、 転送先テーブルか ら ロ ールバ ッ ク さ れた場合) 300 PowerBuilder 第 16 章 デー タ ソ ース間のデー タ 転送 こ の時点で も 、 こ れ ら の行は、 エ ン ド ユーザやア プ リ ケーシ ョ ン に よ っ て再度修正 し 、 Repair 関数を用いて転送先テーブルに適用す る こ と がで き ます。場合に よ っ ては こ れ ら の行を破棄す る こ と も で き ます。 こ の方法については後述 し ます。 エ ラ ー行の破棄 状況に よ っ ては、エ ラ ー デー タ ウ ィ ン ド ウ コ ン ト ロ ールか ら 1 つま た は複数のエ ラ ー行を、 エ ン ド ユーザやアプ リ ケーシ ョ ン に よ っ て破棄 し たい こ と があ り ます。 こ れは、 修正 し た く ないエ ラ ー行に対す る 有 効な措置 と 言え ます。 表 16-4 に、 エ ラ ー行の破棄を行 う こ と がで き る 方法を示 し ます。 表 16-4: エ ラ ー行の破棄 破棄する エ ラ ー行 エ ラ ー デー タ ウ ィ ン ド ウ コ ン ト ロ ール上の、 すべてのエ ラ ー行 エ ラ ー デー タ ウ ィ ン ド ウ コ ン ト ロ ール上の、 1 つま たは複数のエ ラ ー行 使用する関数 Reset 関数 RowsDiscard 関数 こ れ ら の関数についての詳細は、 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ アルを参照 し て く だ さ い。 例 次の例では、 エ ン ド ユーザが dw_pipe_errors デー タ ウ ィ ン ド ウ コ ン ト ロ ールのすべてのエ ラ ー行を破棄で き る よ う に し てい ます。 コ マ ン ド ボ タ ンの提供 w_sales_extract ウ ィ ン ド ウ の作成時に、 cb_forgofixes と い う コ マ ン ド ボ タ ン コ ン ト ロ ールを配置 し ます。 dw_pipe_errors データ ウ ィ ン ド ウ にエラ ー行が入力さ れたと き に、 こ の コ マ ン ド ボ タ ン を使用可能に し 、 エ ラ ー行がない と き には使用不可に し てお く コ ー ド を アプ リ ケーシ ョ ン の ス ク リ プ ト に記述 し ます。 次に、cb_fogofixes コ マ ン ド ボ タ ンの Clicked イ ベ ン ト に対 し て 以下の ス ク リ プ ト を 記述 し ま す。 こ の ス ク リ プ ト で、 Reset 関数を呼び出 し ます。 Reset 関数の呼び出 し dw_pipe_errors.Reset() こ れら の機能を 提供する こ と によ っ て、エン ド ユーザが cb_forgofixes コ マ ン ド ボ タ ン を選択す る と 、 dw_pipe_errors デー タ ウ ィ ン ド ウ か ら すべ てのエ ラ ー行が破棄 さ れ る よ う にな り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 301 パイ プ ラ イ ンの後処理 パイ プ ラ イ ンの後処理 アプ リ ケーシ ョ ン でのパ イ プ ラ イ ン処理が終わ っ た ら 、 い く つかの後 処理を行わな ければな り ません。 こ れ ら の処理には、 パ イ プ ラ イ ン処 理のために取得 し た リ ソ ース の解放な ど が含まれます。 ガベージ コ レ ク シ ョ ン 破棄す る オブジ ェ ク ト がほかで使われていない こ と を確認で き ない場 合 に は、 リ ソ ー ス の 後処理 に DESTROY 文 を 使 わ な い で く だ さ い。 PowerBuilder のガベージ コ レ ク シ ョ ン機能に よ っ て、 参照 さ れていな いオブジ ェ ク ト は自動的に削除 さ れ ます。 詳細については、 49 ページ の 「ガベージ コ レ ク シ ョ ン と メ モ リ 管理」 を参照 し て く だ さ い。 ❖ パイ プ ラ イ ンの後処理を行 う には 1 パ イ プ ラ イ ン処理に使用 し たユーザ オブジ ェ ク ト の イ ン ス タ ン ス を破棄 し ます。 適切な ス ク リ プ ト に DESTROY 文を記述 し 、 そのユーザ オブジ ェ ク ト の イ ン ス タ ン ス変数名を指定 し ます。 2 パ イ プ ラ イ ン の転送元デー タ ベー ス お よ び転送先デー タ ベー ス と の接続を解除 し ます。 こ れは、 適切な ス ク リ プ ト に DISCONNECT 文を 2 行記述 し て行い ます。 一方の DISCONNECT 文では、転送元 ト ラ ンザ ク シ ョ ン オブ ジ ェ ク ト の イ ン ス タ ン ス変数名を、も う 一方の DISCONNECT 文で は転送先 ト ラ ン ザ ク シ ョ ン オ ブ ジ ェ ク ト の イ ン ス タ ン ス 変数名 を、 それぞれ指定 し ます。 各 DISCONNECT 文の結果を調べます。 3 転送元 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト の イ ン ス タ ン ス と 転送先 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト の イ ン ス タ ン ス を破棄 し ます。 こ れは、 適切な ス ク リ プ ト に DESTROY 文を 2 行記述 し て行い ま す。 一方の DESTROY 文では、 転送元 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト の イ ン ス タ ン ス 変数名を、 も う 一方の DESTROY 文では転送 先 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト の イ ン ス タ ン ス変数名を、 それ ぞれ指定 し ます。 DESTROY 文 と DISCONNECT 文についての詳細は、 『PowerScript リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 例 302 次の コ ー ド は、 w_sales_extract ウ ィ ン ド ウ の Close イ ベン ト に対 し て ス ク リ プ ト を記述 し 、 パ イ プ ラ イ ン の後処理を行い ます。 PowerBuilder 第 16 章 デー タ ソ ース間のデー タ 転送 ユーザ オブ ジ ェ ク ト イ ン ス タ ン スの破棄 Close イ ベ ン ト ス ク リ プ ト の 先頭に、 以下の ス テー ト メ ン ト を記述 し て、 (iuo_pipe_logistics 変数に 保持 さ れてい る ) ユーザ オブジ ェ ク ト u_sales_pipe_logistics の イ ン ス タ ン ス を破棄 し ます。 DESTROY iuo_pipe_logistics 次に、 以下の ス テー ト メ ン ト を記述 し て 転 送 元 デ ー タ ベ ー ス と の 接 続 を 解 除 し 、 そ の 結 果 を 調 べ て、 (itrans_source 変数に保持 さ れて い る ) 転送元 ト ラ ン ザ ク シ ョ ン オブ ジ ェ ク ト の イ ン ス タ ン ス を破棄 し ます。 転送元デー タ ベース と の接続の解除 DISCONNECT USING itrans_source; // DISCONNECT 文の結果を調べます。 IF itrans_source.SQLCode = -1 THEN Beep (1) MessageBox(" デー タ ベース接続エ ラ ー ", & " 転送元デー タ ベース と の “ & + " 接続を解除する際に問題が発生 し ま し た。 " & + " テ ク ニ カルサポー ト ま で ご連絡 く だ さ い。 " & + "~n~r~n~r 詳細は以下の と お り です : " + & String(itrans_source.SQLDBCode) + " " + & itrans_source.SQLErrText, Exclamation!) END IF DESTROY itrans_source 転送先デー タ ベース と の接続の解除 最後に、 以下の ス テー ト メ ン ト を記 述 し て 転送先デー タ ベー ス と の接続 を 解除 し 、 そ の結果 を 調べ て、 (itrans_destination 変数に保持 さ れてい る ) 転送先 ト ラ ンザ ク シ ョ ン オ ブジ ェ ク ト の イ ン ス タ ン ス を破棄 し ます。 DISCONNECT USING itrans_destination; // DISCONNECT 文の結果を調べます。 IF itrans_destination.SQLCode = -1 THEN Beep (1) MessageBox(" デー タ ベース接続エ ラ ー ", & " 転送先デー タ ベース と の " + & " 接続を解除にする際に問題が発生 し ま し た。 " + & " テ ク ニ カルサポー ト ま でご連絡 く だ さ い。 " + & "~n~r~n~r 詳細は以下の と お り です : " + & String(itrans_destination.SQLDBCode) + " " + & itrans_destination.SQLErrText, Exclamation!) END IF DESTROY itrans_destination ア プ リ ケーシ ョ ン テ ク ニ ッ ク 303 パイ プ ラ イ ンの後処理 304 PowerBuilder 第 5 部 プ ログ ラ ム ア ク セス テクニッ ク PowerBuilder に よ る ア プ リ ケーシ ョ ン開発において、 プ ロ グ ラ ム ア ク セス機能を実現する ためのテ ク ニ ッ ク につ いて説明 し ます。ア プ リ ケーシ ョ ン における DDE の使い 方お よび OLE の使い方、 メ ール対応ア プ リ ケーシ ョ ンの 構築、 そのほかの拡張処理機能の追加な ど について説明 し ます。 第 1 7 章 DDE の使い方 こ の章について こ の章では、 PowerBuilder がサポー ト す る DDE 機能について説明 し ます。 内容 項目 DDE について DDE 関数 と イ ベン ト ページ 307 308 DDE について ダイ ナミ ッ ク データ エク ス チェ ン ジ(DDE: Dynamic Data Exchange) を使用す る と 、 2 つの Windows アプ リ ケーシ ョ ン間で コ マ ン ド や デー タ をや り 取 り さ せて、 相互に通信す る こ と がで き ま す。 つ ま り 、2 つのアプ リ ケーシ ョ ン でデー タ を共有 し た り 、 コ マ ン ド の遠 隔実行や、 エ ラ ー状態のチ ェ ッ ク を行 う こ と がで き ます。 PowerBuilder は DDE をサポー ト す る ために、特別な PowerScript 関 数や イ ベン ト を提供 し てい ま す。 こ れ ら の関数や イ ベン ト を用い る こ と に よ り 、 PowerBuilder アプ リ ケーシ ョ ン か ら DDE を サポー ト す る ほかのアプ リ ケーシ ョ ン に メ ッ セージ を送信 し た り 、 ほか の DDE アプ リ ケーシ ョ ン か ら の DDE リ ク エ ス ト に対 し て応答で き ます。 ク ラ イ ア ン ト と サーバ DDE をサポー ト し てい る アプ リ ケーシ ョ ンは、 ク ラ イ ア ン ト ま た はサーバの ど ち ら かの役割を果たす こ と がで き ます。 用語について DDE で用い る ク ラ イ ア ン ト と サーバ と い う 用語は、 PC や ワ ー ク ス テーシ ョ ン の ク ラ イ ア ン ト マ シ ン がデー タ ベー ス サーバに ア ク セ スす る ク ラ イ ア ン ト / サーバ アーキ テ ク チ ャ と は関係あ り ま せん。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 307 DDE 関数 と イ ベン ト ク ラ イ ア ン ト アプ リ ケーシ ョ ンは、DDE をサポー ト し てい る ほかのア プ リ ケーシ ョ ン (サーバ と 呼ばれ る ) に対 し て リ ク エ ス ト を出 し ます。 こ の リ ク エ ス ト は、 コ マ ン ド (open、 close、 save な ど) であ っ た り デー タ に対す る リ ク エ ス ト であ っ た り し ます。 サーバ アプ リ ケーシ ョ ンは、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン と は逆の 機能を実行 し ます。 サーバ アプ リ ケーシ ョ ンは、 DDE をサポー ト し て い る ほかのアプ リ ケーシ ョ ン ( ク ラ イ ア ン ト と 呼ばれ る ) か ら の リ ク エ ス ト に応答 し ま す。 ク ラ イ ア ン ト ア プ リ ケーシ ョ ン の場合 と 同様 に、 こ の リ ク エ ス ト は コ マ ン ド や特定のデー タ に対す る リ ク エ ス ト で す。 PowerBuilder のアプ リ ケーシ ョ ンは、DDE ク ラ イ ア ン ト と し て も 、DDE サーバ と し て も 機能 し ます。 PowerBuilder では DDE ク ラ イ ア ン ト お よ び DDE サーバに対 し て特別 な組み込み関数 と イ ベン ト を用意 し てい ます。 コ マ ン ド やデー タ が ク ラ イ ア ン ト か ら サーバに (ま たはサーバか ら ク ラ イ ア ン ト に) 送 ら れ る と 、 DDE 関連の イ ベン ト が起動 さ れ ます。 DDE 関数 と イ ベン ト 以下の表に、 DDE 関連の関数 と イ ベン ト を示 し ます。 関数 と イ ベン ト は DDE ク ラ イ ア ン ト と DDE サーバご と にそれぞれ ま と め ら れてい ま す。 DDE サポー ト の詳細については、 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ アルを参照 し て く だ さ い。 戻り値 DDE 関数はすべて整数値を返 し ます。 308 PowerBuilder 第 17 章 DDE の使い方 DDE ク ラ イ ア ン ト 表 17-1: DDE ク ラ イ ア ン ト 関数 関数 動作内容 CloseChannel OpenChannel 関数で開か れ た DDE サーバ ア プ リ ExecRemote GetDataDDE GetDataDDEOrigin GetRemote OpenChannel RespondRemote SetRemote StartHotLink StopHotLink ケーシ ョ ンへのチ ャ ネルを閉 じ る DDE サーバ アプ リ ケーシ ョ ンに コ マ ン ド を実行す る よ う 要求する ホ ッ ト リ ン ク さ れて い る DDE サーバ ア プ リ ケー シ ョ ンか ら 新 し いデー タ を取得 し て、指定 し た文字 列型変数に保持する ど の DDE サーバ アプ リ ケーシ ョ ンがホ ッ ト リ ン ク でデー タ を送信 し たか を判別す る DDE サーバ ア プ リ ケ ー シ ョ ン にデー タ を 要求す る 。 こ の関数には、 チ ャ ネルを用い る 形式 と 用いな い形式の 2 通 り の構文があ る 指定 さ れ た DDE サ ー バ ア プ リ ケ ー シ ョ ン へ の DDE チ ャ ネルを開 く DDE アプ リ ケーシ ョ ン か ら 受信 し た コ マ ン ド ま た はデー タ が、 DDE ク ラ イ ア ン ト に受け入れ ら れた か ど う か を、 DDE サーバ アプ リ ケーシ ョ ンに通知 する DDE サーバ アプ リ ケーシ ョ ンに、 ワ ー ク シー ト の セルな ど の項目や変数に特定の値 を 設定す る よ う 要求す る 。 こ の関数には、 DDE チ ャ ネルを用い る 形式 と 用いない形式の 2 通 り の構文があ る DDE サーバ アプ リ ケーシ ョ ンへのホ ッ ト リ ン ク を 開始 し 、 DDE サーバ アプ リ ケーシ ョ ンの中の特定 のデー タ 変更が PowerBuilder に た だ ち に通知 さ れ る よ う にする DDE サーバ アプ リ ケーシ ョ ン と のホ ッ ト リ ン ク を 終了する 表 17-2: DDE ク ラ イ ア ン ト イ ベ ン ト イ ベン ト HotLinkAlarm DDE サーバ 発生する状況 DDE サーバ アプ リ ケーシ ョ ンが新 し い (変更 さ れ た) デー タ を送信 し た と き 表 17-3: DDE サーバ関数 関数 GetCommandDDE GetCommandDDEOrigin ア プ リ ケーシ ョ ン テ ク ニ ッ ク 動作内容 DDE ク ラ イ ア ン ト アプ リ ケーシ ョ ンが送信 し た コ マ ン ド を取得する ど の DDE ク ラ イ ア ン ト アプ リ ケーシ ョ ンが コ マ ン ド を送信 し たか を判別する 309 DDE 関数 と イ ベン ト 関数 GetDataDDE GetDataDDEOrigin RespondRemote SetDataDDE StartServerDDE StopServerDDE 動作内容 DDE ク ラ イ ア ン ト ア プ リ ケ ー シ ョ ン が送信 し た デー タ を取得 し て、指定 し た文字列型変数に保持す る ど の DDE ク ラ イ ア ン ト アプ リ ケーシ ョ ンがホ ッ ト リ ン ク でデー タ を送信 し たかを判別する DDE アプ リ ケーシ ョ ン か ら 受信 し た コ マ ン ド ま た はデー タ が DDE サーバに受け入れ ら れたか ど う か を、 送信元の DDE ク ラ イ ア ン ト アプ リ ケーシ ョ ン に通知す る 指定 さ れたデー タ を DDE ク ラ イ ア ン ト アプ リ ケー シ ョ ンに送信す る PowerBuilder アプ リ ケーシ ョ ン を DDE サーバ と し て起動す る PowerBuilder が DDE サーバ と し て動作す る こ と を 終了 さ せ る 表 17-4: DDE サーバ イ ベン ト イ ベン ト RemoteExec RemoteHotLinkStart RemoteHotLinkStop RemoteRequest RemoteSend 310 発生する状況 DDE ク ラ イ ア ン ト アプ リ ケーシ ョ ンが コ マ ン ド を 送信 し た と き DDE ク ラ イ ア ン ト アプ リ ケーシ ョ ンがホ ッ ト リ ン ク の開始を要求す る と き DDE ク ラ イ ア ン ト アプ リ ケーシ ョ ンがホ ッ ト リ ン ク の終了を要求す る と き DDE ク ラ イ ア ン ト アプ リ ケーシ ョ ンがデー タ を要 求し た と き DDE ク ラ イ ア ン ト アプ リ ケーシ ョ ンがデー タ を送 信し た と き PowerBuilder 第 1 8 章 ア プ リ ケーシ ョ ン におけ る OLE の 使い方 こ の章について こ の章では、 PowerBuilder のアプ リ ケーシ ョ ン で OLE を実装す る 方法について説明 し ます。 内容 項目 PowerBuilder におけ る OLE のサポー ト ウ ィ ン ド ウ におけ る OLE コ ン ト ロ ール OLE コ ン ト ロ ール と 挿入可能なオブジ ェ ク ト OLE カ ス タ ム コ ン ト ロ ール プ ロ グ ラ ム可能な OLE オブジ ェ ク ト ス ク リ プ ト におけ る OLE オブジ ェ ク ト オブジ ェ ク ト ブ ラ ウ ザでの OLE 情報 OLE オブジ ェ ク ト の高度な操作 ページ 311 313 315 330 334 344 364 366 PowerBuilder における OLE のサポー ト OLE (Object Linking and Embedding) を利用す る と 、 Windows プ ロ グ ラ ム で のデー タ と プ ロ グ ラ ム 機能の共有が簡単に で き ま す。 PowerBuilder の OLE コ ン ト ロ ールは、OLE サーバ アプ リ ケーシ ョ ン を呼び出 し て、 OLE オブジ ェ ク ト を表示 し た り 、 操作を行 う こ と がで き る 、 OLE コ ン テナです。 OLE コ ン ト ロール ア プ リ ケーシ ョ ン テ ク ニ ッ ク ウ ィ ン ド ウ ペ イ ン タ の OLE コ ン ト ロ ールを使用すれば、複数のア プ リ ケーシ ョ ン の コ ン ポーネ ン ト を ウ ィ ン ド ウ に リ ン ク し た り 、 埋め込んだ り す る こ と がで き ます。 さ ら に、 OLE サーバに よ っ て 定義 さ れた関数 と プ ロ パテ ィ を使用 し て、 OLE サーバを制御す る こ と がで き ます。 311 PowerBuilder における OLE のサポー ト PowerBuilder の OLE コ ン ト ロ ールは、OLE オブジ ェ ク ト の コ ン テナで す。 エ ン ド ユーザは、 OLE オブ ジ ェ ク ト を ア ク テ ィ ブに し て、 OLE サーバ ア プ リ ケーシ ョ ン に よ っ て提供 さ れて い る 機能で編集作業が 行え ます。 ま た、 OLE 関連の操作は、 ス ク リ プ ト で OLE オブジ ェ ク ト を ア ク テ ィ ブに し て、 OLE サーバへ コ マ ン ド を送 る こ と に よ っ て、 自 動化で き ます。 OLE サーバは、 DLL ま たは別個の EXE フ ァ イ ルのい ずれか と す る こ と がで き ます。 こ れ ら のサーバは、 異な る コ ン ピ ュ ー タ 上で動作 し ていて も か ま い ません。 PowerScript のオー ト メ ーシ ョ ン を使用すれば、 ウ ィ ン ド ウ に表示 さ れ てい る OLE コ ン ト ロ ール、ま たは OLEObject 変数に保持 さ れてい る 非 表示の OLE オブジ ェ ク ト の参照を操作で き ます。 OLEObject 型を使用 す る と 、OLE コ ン テナを ウ ィ ン ド ウ に表示 し な く て も OLE オブジ ェ ク ト が作成で き ます。 OLE カ ス タ ム コ ン ト ロール 2 番目の コ ン ト ロ ールであ る 、 OLE カ ス タ ム コ ン ト ロ ールは、 ActiveX コ ン ト ロ ール (OCX コ ン ト ロ ール と も 呼ばれます) 用の コ ン テナです。 ActiveX コ ン ト ロ ールは DLL で あ り (拡張子 OCX が付 く こ と も あ り ます)、 アプ リ ケーシ ョ ン と 常に同 じ プ ロ セ ス で動作 し ます。 OLE オブ ジ ェ ク ト の 管理 OLE オ ブ ジ ェ ク ト の管理は、 OLE オ ブ ジ ェ ク ト を 変数に保持 し て、 フ ァ イ ルに保存 し て行 う こ と がで き ます。 こ のために 2 つのオブジ ェ ク ト のデー タ 型 OLEStorage と OLEStream が用意 さ れてい ま す。 ほ と ん ど のアプ リ ケーシ ョ ン では こ れ ら のオブジ ェ ク ト を用い る 必要はあ り ません。 し か し 、 (複数の OLE オブジ ェ ク ト を 1 つのデー タ 構造に 組み込む よ う な) 複雑な処理 を 必要 と す る 場合は、 OLEStorage 型や OLEStream 型のオブジ ェ ク ト と その関数を使用 し て対処で き ます。 そのほかの OLE のサ ポー ト デー タ ウ ィ ン ド ウ オブジ ェ ク ト におけ る OLE オブジ ェ ク ト について の詳細は、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 COM ま たは OLE サーバ と し ての PowerBuilder についての詳細は、 第 26 章 「COM/MTS/COM+ コ ン ポ ー ネ ン ト の 構 築」 お よ び 第 19 章 「PowerBuilder の ラ ン タ イ ム オー ト メ ーシ ョ ン サーバ」 を参照 し て く だ さ い。 312 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 ウ ィ ン ド ウにおける OLE コ ン ト ロール OLE オブジ ェ ク ト と ActiveX コ ン ト ロ ールは、 ウ ィ ン ド ウ ま たはユー ザ オブジ ェ ク ト に追加で き ます。 そのためには、 OLE コ ン テナ と し て 機能す る 、 PowerBuilder OLE コ ン ト ロ ールの 1 つを使用 し ます。 こ の 節では、 コ ン ト ロ ールが OLE オブジ ェ ク ト (挿入可能なオブジ ェ ク ト と も 呼ばれ ます) ま たは ActiveX コ ン ト ロ ールのいずれを保持す る か 選ぶ こ と に よ っ て、 必要な コ ン ト ロ ールの選択方法について説明 し ま す。 • 挿入可能な OLE オブジ ェ ク ト は、 OLE サーバ アプ リ ケーシ ョ ン に関連付け ら れてい る ド キ ュ メ ン ト です。 OLE オブジ ェ ク ト はア ク テ ィ ブにで き ます。 OLE サーバは、 OLE オブジ ェ ク ト を変更す る ための コ マ ン ド やツールバーを提供 し ます。 • ActiveX コ ン ト ロ ール ま たは OLE カ ス タ ム コ ン ト ロ ールはサーバ 自身で あ り 、 PowerBuilder でプ ロ グ ラ ム し た ス ク リ プ ト に基づい て、 ユーザのア ク シ ョ ン を処理 し ます。 開発者は、 ActiveX コ ン ト ロ ールの イ ベン ト 用の ス ク リ プ ト と 、PowerBuilder コ ン テナの イ ベ ン ト 用の ス ク リ プ ト を記述で き ま す。 こ れ ら の ス ク リ プ ト は、 関 数を呼び出 し 、ActiveX コ ン ト ロ ールに属す る プ ロ パテ ィ を設定 し ます。 必要であれば、 ActiveX コ ン ト ロ ールは、 ユーザ と の対話の ために独自の ビ ジ ュ アルな イ ン タ フ ェ ー ス を表示す る こ と も で き ます。 ActiveX コ ン ト ロ ールは、 簡単な ビ ジ ュ アル表示 (た と えば、 メ ー タ や ゲージ) やカ ス タ マ イ ズで き る 1 つのア ク テ ィ ビ テ ィ (単語や句の ス ペルチ ェ ッ ク な ど) を行 う こ と がで き ます。 OLE コ ン ト ロール コ ン テナの機能 OLE コ ン ト ロ ール コ ン テナは、 すべて、 一連の必要な イ ン タ フ ェース を サポー ト し てい ま す。 PowerBuilder は、 そのほかに も い く つかのサ ポー ト を提供 し てい ます。 • ア プ リ ケーシ ョ ン テ ク ニ ッ ク OLE コ ン ト ロ ールは、 拡張 コ ン ト ロ ールのプ ロ パ テ ィ を 使用 し て、 実行時 に そ の 配置 を 決定、 修正 で き ま す。 PowerBuilder では、 X (Left) 、 Y (Top) 、 Width、 Height の各プ ロ パテ ィ をサポー ト し てお り 、 PowerBuilder ユニ ッ ト で測定 し ます。 コ ン ト ロ ールの開発者が こ れ ら の プ ロ パ テ ィ に ア ク セ ス す る に は、 IOleControlSite イ ン タ フ ェ ー ス 上の GetExtendedControl メ ソ ッ ド か ら 戻 さ れ る 、 IDispatch か ら 継承 し た イ ン タ フ ェ ー ス を使用で き ます。 拡張 コ ン ト ロール 313 ウ ィ ン ド ウにおける OLE コ ン ト ロール • PowerBuilder は、ウ ィ ン ド ウ レベ ルで IOleContainer ク ラ ス を実装 し てい る ので、 ウ ィ ン ド ウ 上のす べての コ ン ト ロ ールは兄弟関係にあ り 、 お互いに各 コ ン ト ロ ール の情報を共有で き ま す。 コ ン ト ロ ールの開発者が こ の情報にア ク セ スす る には、 OLE EnumObjects メ ソ ッ ド が使用で き ます。 コ ン ト ロ ールが一連の コ ン ト ロ ールの一部 と な っ てい る 場合、 兄弟関係 に関す る 情報は と て も 便利です。 ほかの コ ン ト ロ ール と 異な り 、 ウ ィ ン ド ウ 上の OLE コ ン ト ロ ールは単一の階層構造に格納 さ れ ま す。 OLE コ ン テナ と し てのウ ィ ン ド ウ OLE オブ ジ ェ ク ト と OLE コ ン ト ロールに限 られます こ のオブ ジ ェ ク ト 列挙子に見え る のは OLE オブ ジ ェ ク ト と OLE コ ン ト ロ ールに限 ら れ ま す。 ウ ィ ン ド ウ 上のほかの コ ン ト ロ ール を処理す る のには こ のテ ク ニ ッ ク は使用で き ません。 • コ ン ト ロールの定義 メ ッ セージの反映 コ ン ト ロ ール コ ン テナが メ ッ セージの反映を サ ポー ト し て い な い場合、 リ フ レ ク タ ウ ィ ン ド ウ は、 OLE コ ン ト ロ ールが親 コ ン ト ロ ールに メ ッ セージ を送っ た と き に作成 さ れ ま す。 リ フ レ ク タ ウ ィ ン ド ウ は コ ン ト ロ ールに戻 る メ ッ セージ を反 映す る ので、 コ ン ト ロ ール自身で メ ッ セージ を処理で き ま す。 コ ン テナが メ ッ セージの反映を サポー ト し てい る 場合は、 リ フ レ ク タ ウ ィ ン ド ウ は必要な く 、 それに関連す る 実行時オーバーヘ ッ ド も な く な り ます。 PowerBuilder の OLE コ ン ト ロ ール コ ン テナは、 特定の メ ッ セージ セ ッ ト に対 し て メ ッ セージの反映を行い ます。 OLE コ ン ト ロ ールを作成 し て、 その内容を選択す る 手順は以下の と お り です。 v ウ ィ ン ド ウ オブ ジ ェ ク ト やユーザ オブ ジ ェ ク ト で OLE コ ン ト ロールを配置 するには 1 OLE コ ン ト ロ ールを含む ウ ィ ン ド ウ ま たはユーザ オブジ ェ ク ト を 開 き ます。 2 メ ニ ュ ー バーか ら [挿入| コ ン ト ロ ール| OLE] を選択 し ます。 オ ブ ジ ェ ク ト の挿入 ダ イ ア ロ グ ボ ッ ク ス が表示 さ れ ま す。 オ ブ ジ ェ ク ト は、 3 つの タ ブか ら 選択で き ます。 3 314 サーバ アプ リ ケーシ ョ ン ま たは特定の OLE オブジ ェ ク ト を選択 し て、 OLE コ ン ト ロ ールに OLE オブジ ェ ク ト を埋め込むか、 リ ン ク で き ます。 ま た、 OLE カ ス タ ム コ ン ト ロ ール (OCX) を選択 し て、 OLE カ ス タ ム コ ン ト ロ ールに挿入で き ます。 ま たは、 OLE コ ン ト ロ ールにオブジ ェ ク ト を挿入 し ないでお く こ と も で き ます。 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 • 新 し いオブ ジ ェ ク ト を 作成 し て埋め込む場合は、 [新規作成] タ ブ を ク リ ッ ク し ます。 OLE サーバ アプ リ ケーシ ョ ン を選択 し て、 [OK] ボ タ ン を ク リ ッ ク し ます。 • OLE コ ン ト ロ ールに既存のオブ ジ ェ ク ト を 選択す る 場合は、 [フ ァ イ ルか ら 作成] タ ブ を ク リ ッ ク し ます。 フ ァ イ ル名を指 定 し て、 [OK] ボ タ ン を ク リ ッ ク し ます。 • カ ス タ ム コ ン ト ロ ール (ActiveX コ ン ト ロ ール) を挿入す る 場 合は、 [ コ ン ト ロ ールの挿入] タ ブ を ク リ ッ ク し ます。 ActiveX コ ン ト ロ ールを選択 し てか ら 、[OK]ボ タ ン を ク リ ッ ク し ます。 • OLE コ ン ト ロ ールにオブジ ェ ク ト を挿入 し ない場合は、 [キ ャ ン セル] ボ タ ン を ク リ ッ ク し ます。 [キ ャ ン セル] ボ タ ン を ク リ ッ ク し た場合には、 コ ン ト ロ ール は OLE カ ス タ ム コ ン ト ロ ールではな く 、OLE コ ン ト ロ ールに な り ます。 OLE コ ン ト ロ ールへの OLE オブジ ェ ク ト の埋め込 みま たは リ ン ク は、いつで も で き ます。し か し 、後か ら ActiveX コ ン ト ロ ールを挿入す る こ と はで き ません。 4 コ ン ト ロ ールを表示 し たい場所で、 ウ ィ ン ド ウ を ク リ ッ ク し ます。 OLE オブジ ェ ク ト を挿入 し た場合、PowerBuilder は、OLE オブジ ェ ク ト を表示 し て編集で き る よ う に、 OLE サーバ アプ リ ケーシ ョ ン を起動 し ます。 ActiveX コ ン ト ロ ールは開 く こ と がで き ません。 一覧表示 さ れ て い な い OLE サーバ ア プ リ ケ ー シ ョ ン に属す る オ ブ ジ ェ ク ト を挿入す る と き は、 OLE サーバ ア プ リ ケーシ ョ ン を イ ン ス ト ールす る 必要があ り ます。 イ ン ス ト ール方法については、 OLE サー バ アプ リ ケーシ ョ ン のマニ ュ アルを参照 し て く だ さ い。 オブジ ェ ク ト の挿入 ダ イ ア ロ グ ボ ッ ク ス の使い方についての詳細は、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 OLE コ ン ト ロール と 挿入可能なオブ ジ ェ ク ト OLE コ ン ト ロ ール内には、 挿入可能な OLE オブジ ェ ク ト があ り ます。 ペ イ ン タ やス ク リ プ ト で OLE コ ン ト ロ ール内の OLE オブジ ェ ク ト を 変更で き ます。 ま た、 PowerBuilder のプ ロ パテ ィ を設定 し て、 OLE オ ブジ ェ ク ト を指定で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 315 OLE コ ン ト ロール と 挿入可能なオブ ジ ェ ク ト OLE コ ン ト ロ ールの設定 OLE コ ン ト ロ ールを作成 し て、 OLE オブジ ェ ク ト を挿入す る と 、 OLE サーバ アプ リ ケーシ ョ ン がア ク テ ィ ブにな り 、OLE オブジ ェ ク ト が修 正で き ま す。 PowerBuilderOLE オブジ ェ ク ト を非ア ク テ ィ ブに し た後 (レ イ ア ウ ト ビ ュ ーで OLE オブジ ェ ク ト の枠線の外側を ク リ ッ ク し ま す)、 OLE コ ン ト ロ ールのプ ロ パテ ィ シー ト を使用 し て、 OLE コ ン ト ロ ールを設定で き ます。 v OLE コ ン ト ロールの表示 と 動作の形態を指定するには 1 OLE コ ン ト ロ ールを ダブル ク リ ッ ク す る か、 コ ン ト ロ ールのポ ッ プア ッ プ メ ニ ュ ーか ら [プ ロ パテ ィ ] を選択 し ます。 2 プ ロ パテ ィ ビ ュ ーで、 使用アプ リ ケーシ ョ ンに関係す る 名前を コ ン ト ロ ールに与え ます。 ス ク リ プ ト では こ の名前を使用 し ます。 デフ ォ ル ト 名は 「ole_」 の 接頭辞に数字を組み合わせた も のです。 3 OLE サーバが使用す る 表示の名前の値を指定 し ます。 OLE サーバ は、 ウ ィ ン ド ウ の タ イ ト ル バーに こ の名前を使用 し ます。 4 コ ン ト ロ ールの外観 と 動作を指定す る には、 プ ロ パテ ィ ビ ュ ーで 適切な設定を選択 し ます。 ほかの コ ン ト ロ ールに あ る 標準的な [表示可能] 、 [使用可能] 、 [フ ォ ーカ ス時の枠表示] 、 お よ び [枠の ス タ イ ル] プ ロ パテ ィ の ほかに、OLE オブジ ェ ク ト と OLE サーバ と の関係を管理す る オプ シ ョ ン があ り ます。 316 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 オプ シ ョ ン 起動方法 意味 コ ン ト ロ ールを ア ク テ ィ ブにする 方法 オプシ ョ ンは以下の と お り • ダブル ク リ ッ ク (activatedoubleclick!) – コ ン ト ロ ール がダブル ク リ ッ ク さ れた と き に、 OLE サーバ アプ リ ケーシ ョ ン を ア ク テ ィ ブにす る • フ ォーカ ス (activategetfocus!) – コ ン ト ロ ールが ク リ ッ ク さ れ る か、 タ ブ に よ っ て選択 さ れ た と き に、 OLE サーバ ア プ リ ケーシ ョ ン を ア ク テ ィ ブにす る 。 ま た、 GetFocus イ ベ ン ト に対す る ス ク リ プ ト では、 MessageBox 関数な ど の フ ォーカ ス移動 さ せ る よ う な 関数を呼び出 さ ない よ う にする • ス ク リ プ ト (activatemanually!) – Activate 関数を ス ク リ プ ト で使用 し な ければ、 コ ン ト ロ ール を ア ク テ ィ ブにで き ない 表示の種類 コ ン ト ロ ールは、 [起動方法] オプシ ョ ン の設定に関係 な く 、 いつで も ス ク リ プ ト でア ク テ ィ ブにで き る コ ン ト ロ ールに何を表示する かの指定 オプシ ョ ンは以下の と お り • 内容 (displayascontent!) – コ ン ト ロ ールのサ イ ズに合 わせて、 オブジ ェ ク ト を縮小 し て表示す る • ア イ コ ン (displayasicon!) – デー タ に関連付け ら れて い る ア イ コ ン を表示する 。通常 こ のア イ コ ンは、 OLE サーバ アプ リ ケーシ ョ ンか ら 提供 さ れ る 内容の更新 可能 • ActiveX ド キ ュ メ ン ト (displayasactivexdocument!) – ActiveX ド キ ュ メ ン ト と し て 表示す る 。 ActiveX ド キ ュ メ ン ト は、 コ ン テナの ス ペー ス を満た し 、 サー バ アプ リ ケーシ ョ ンのすべての機能を使用で き る コ ン ト ロ ール上のオブ ジ ェ ク ト を リ ン ク す る か埋め込 むかの指定 オプシ ョ ンは以下の と お り • 埋め込み / リ ン ク (containsany!) – オブジ ェ ク ト を リ ン ク ま たは埋め込みで挿入で き る • 埋め込み (containsembeddedonly!) – オブジ ェ ク ト を 埋め込みで挿入で き る • リ ン ク (containslinkedonly!) – オブジ ェ ク ト を リ ン ク で挿入で き る [内容の更新可能] オプシ ョ ン を設定す る と 、 ContentsAllowed プ ロ パテ ィ の値が変更 さ れ る ア プ リ ケーシ ョ ン テ ク ニ ッ ク 317 OLE コ ン ト ロール と 挿入可能なオブ ジ ェ ク ト オプ シ ョ ン 意味 リ ン ク の更 新オプシ ョ ン コ ン ト ロ ール上のオブ ジ ェ ク ト が リ ン ク さ れてい る と き の、 リ ン ク 情報の更新方法 オプシ ョ ンは以下の と お り • 自 動 (linkupdateautomatic!) – リ ン ク が 中 断 さ れ て、 PowerBuilder が リ ン ク さ れた フ ァ イ ル を 検索で き な い場合に、 エ ン ド ユーザが フ ァ イ ルを指定で き る ダ イ ア ロ グ ボ ッ ク ス を表示する • ス ク リ プ ト (linkupdatemanual!) – リ ン ク が中断 さ れ る と 、 オブ ジ ェ ク ト はア ク テ ィ ブにで き ない。 ス ク リ プ ト で LinkTo 関数 ま たは UpdateLinksDialog 関数を 使用 し て、 再 リ ン ク を行 う サ イ ズ モー ド [ リ ン ク の更新オプシ ョ ン] を設定する と 、 LinkUpdateOptions プ ロ パテ ィ の値が変更 さ れ る コ ン テナにおけ る オブジ ェ ク ト の表示方法 オプシ ョ ンは以下の と お り • ク リ ッ プ (clip!) – オブジ ェ ク ト の画像が フルサ イ ズ で表示 さ れ る 。 画像が OLE コ ン ト ロ ール よ り 大 き い 場合は、 コ ン ト ロ ールの枠線か ら はみ出す部分が切 り 捨て ら れ る • ス ト レ ッ チ (stretch!) – オブジ ェ ク ト の画像は、 OLE コ ン テナ コ ン ト ロ ールのサ イ ズに合 う よ う にサ イ ズ 変更 さ れ る (デフ ォ ル ト ) ペ イ ン タ における オブ ジ ェ ク ト のア ク テ ィ ブ化 OLE コ ン ト ロ ール内のオブ ジ ェ ク ト を サーバ ア プ リ ケーシ ョ ン を 使 用 し て操作す る には、 そのオブジ ェ ク ト を ア ク テ ィ ブに し な ければな り ません。 デフ ォ ル ト では、 ユーザがオブジ ェ ク ト を ア ク テ ィ ブにす る と き には、 そのオブジ ェ ク ト を ダブル ク リ ッ ク し ます。 こ のデフ ォ ル ト の方法を変更す る には、 コ ン ト ロ ールの [起動方法] プ ロ パテ ィ を設定 し ます (前の表を参照) 。 開発時は、 ウ ィ ン ド ウ ペ イ ン タ でオ ブジ ェ ク ト を ア ク テ ィ ブに し ます。 v ウ ィ ン ド ウ ペ イ ン タ で OLE オブ ジ ェ ク ト を ア ク テ ィ ブにするには 1 OLE コ ン ト ロ ールのポ ッ プア ッ プ メ ニ ュ ーか ら [開 く ] を選択 し ます。 コ ン ト ロ ールにオブジ ェ ク ト が挿入 さ れていない場合は、 [開 く ] は選択で き ません。 ポ ッ プア ッ プ メ ニ ュ ーか ら [オブジ ェ ク ト の 挿入] を選択 し て、 コ ン ト ロ ールにオブジ ェ ク ト を挿入 し て く だ さ い。 318 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 サーバ アプ リ ケーシ ョ ン が起動 さ れ、 オブジ ェ ク ト がオ フ サ イ ト でア ク テ ィ ブ化 さ れます。 2 サーバ アプ リ ケーシ ョ ン上で、 オブジ ェ ク ト を修正 し ます。 3 更新が終わ っ た ら 、ハ ッ チン グ表示の枠線の外を ク リ ッ ク し て、オ ブジ ェ ク ト を非ア ク テ ィ ブに し ます。 サーバ ア プ リ ケーシ ョ ン の [フ ァ イ ル] メ ニ ュ ーか ら [閉 じ る ] ま たは [閉 じ て戻 る ] を選択す る こ と も で き ます。 OLE コ ン ト ロール内のオブ ジ ェ ク ト の変更 ウ ィ ン ド ウ ペ イ ン タ で、OLE コ ン ト ロ ール内のオブジ ェ ク ト の変更や 削除がで き ます。 v OLE コ ン ト ロールか ら オブ ジ ェ ク ト を削除するには • OLE コ ン ト ロ ールのポ ッ プア ッ プ メ ニ ュ ーか ら [オブジ ェ ク ト の 削除] を選択 し ます。 OLE コ ン ト ロ ール内のオブジ ェ ク ト は削除 さ れたので、 ア ク テ ィ ブ化で き ません。 [削除] は選択 し ないで く だ さ い。 ウ ィ ン ド ウ か ら OLE コ ン ト ロ ールが削除 さ れ ます。 v OLE コ ン ト ロールにオブ ジ ェ ク ト を挿入するには 1 コ ン ト ロ ールのポ ッ プア ッ プ メ ニ ュ ーか ら [オブジ ェ ク ト の挿入] を選択 し ます。 オブジ ェ ク ト の挿入 ダ イ ア ロ グボ ッ ク ス が表示 さ れ ます。 実行時のオブ ジ ェ ク ト の変更 2 [新規作成] タ ブ を選択 し てサーバ アプ リ ケーシ ョ ン を選択す る か、 コ ン ト ロ ールを定義 し た と き と 同様に、 [フ ァ イ ルか ら 作成] タ ブ を選択 し て フ ァ イ ルを指定 し ます。 3 [OK] を ク リ ッ ク し ます。 InsertObject、InsertFile、InsertClass、ま たは LinkTo 関数を呼び出 し て、OLE コ ン ト ロ ールに OLE オ ブ ジ ェ ク ト を 挿入で き ま す。 Cut 関数 ま た は Clear 関数を呼び出 し て、 OLE コ ン ト ロ ールか ら OLE オブジ ェ ク ト を 削除で き ます。 ユーザの OLE コ ン ト ロールの使い方 OLE コ ン ト ロ ールが配置 さ れた ウ ィ ン ド ウ が開 く と 、PBL(アプ リ ケー シ ョ ン が作成 さ れてい る 場合は、PBD ま たは EXE フ ァ イ ル) 内の OLE コ ン ト ロ ールに格納 さ れた情報を使用 し て、 デー タ が表示 さ れます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 319 OLE コ ン ト ロール と 挿入可能なオブ ジ ェ ク ト エ ン ド ユーザがダブル ク リ ッ ク す る か、 コ ン ト ロ ールを タ ブで選択す る か、 ス ク リ プ ト で Activate 関数を呼び出 し て、 オブ ジ ェ ク ト が ア ク テ ィ ブ化 さ れ る と 、 サーバ アプ リ ケーシ ョ ンが起動 さ れ、 OLE コ ン ト ロ ール内でオブジ ェ ク ト が編集で き ます。 OLE コ ン ト ロ ール内でオブ ジ ェ ク ト が編集で き ない場合は、 オ フ サ イ ト で編集で き ます。 エ ン ド ユーザがオブジ ェ ク ト を変更す る と 、OLE コ ン ト ロ ールのデー タ は最新の状態に更新 さ れ ます。オブジ ェ ク ト が OLE コ ン ト ロ ール内 で編集 さ れてい る と き は、 デー タ が更新 さ れてい る こ と は明 ら かです が、 オ フ サ イ ト で編集 し てい る 場合 も 同 じ よ う に更新 さ れ ます。 ほ と ん ど のサーバ アプ リ ケーシ ョ ンは、 定期的にオブジ ェ ク ト を更新 し ま す。 ま た、 オ フ サ イ ト の編集を終了す る と き は、 自動的に最後に行っ た変更が更新 さ れます。 し たがっ て、 OLE コ ン ト ロ ールの内容 も その と き の タ イ ミ ン グ で変更が反映 さ れ ま す。 し か し 、 安全の ためには、 オ フ サ イ ト の編集を終了す る 前に、 サーバ アプ リ ケーシ ョ ン で 更新 し てお く 必要があ り ます。 リ ン ク と 埋め込み アプ リ ケーシ ョ ン では、 OLE オブジ ェ ク ト は リ ン ク す る こ と も 埋め込 む こ と も で き ます。 ど ち ら の方法を選択す る かは、 ど の よ う にデー タ を管理 し たいかに よ っ て決ま り ます。 デー タ の埋め込み オブジ ェ ク ト を埋め込んだ場合、 そのデー タ はアプ リ ケーシ ョ ン に保 持 さ れ ます。 開発時には、 そのデー タ はアプ リ ケーシ ョ ン の PBL フ ァ イ ルに保存 さ れます。ま た、アプ リ ケーシ ョ ンが完成す る と 、EXE フ ァ イ ルや PBD フ ァ イ ルに保存 さ れます。 こ のデー タ はユーザのためのテ ン プ レー ト ま たは開始点です。 埋め込みオブジ ェ ク ト は構築 し た アプ リ ケーシ ョ ン の一部 と し て保存 さ れてい る ため、 実行中にそのデー タ を編集す る こ と はで き ますが、 変更内容は保存 さ れ ません。 オブ ジ ェ ク ト の埋め込みは、 た と えば レ タ ー フ ォ ー ム の本文の よ う な、 変更を行わないデー タ に適 し た方法です。 ま た、 変更 し て ど こ か ほかの と こ ろ に保持す る デー タ の開始点 と し て使用す る のに適 し てい ます。 実行時にデー タ を保存す る には、 SaveAs 関数 と Open 関数を使用 し て、 フ ァ イ ル ま たは OLE ス ト レージにデー タ を保存す る こ と がで き ます。 320 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 デー タ の リ ン ク オブジ ェ ク ト の リ ン ク では、 デー タ その も のではな く 、 デー タ への参 照を アプ リ ケーシ ョ ン に含め ます。 アプ リ ケーシ ョ ンは、 表示を目的 と し たデー タ の画像 も 格納 し ます。 サーバ アプ リ ケーシ ョ ンが、 実際 のデー タ (通常、 フ ァ イ ルに保存 さ れ る デー タ ) を取 り 扱い ます。 そ のため、ほかのアプ リ ケーシ ョ ン か ら も 同 じ デー タ に リ ン ク で き ます。 アプ リ ケーシ ョ ン がデー タ に加え た変更は、 リ ン ク し てい る すべての 文書に現れ ます。 リ ン ク には優れた点が 2 つあ り ます。 • 複数のアプ リ ケーシ ョ ン か ら 同一のデー タ にア ク セ ス で き る • サーバ アプ リ ケーシ ョ ン がデー タ の保存を管理す る 。 そのデー タ にア ク セ スす る PowerBuilder アプ リ ケーシ ョ ン が 1 つ し かな く て も 、 デー タ は変更で き る リ ン ク 情報の管理 リ ン ク 情報の管理は、 PowerBuilder ではな く サーバ が行い ま す。 起動す る サーバ、 お よ び使用す る フ ァ イ ル内のデー タ フ ァ イ ル や 項 目 と い っ た 情 報 は、 OLE オ ブ ジ ェ ク ト に よ っ て PowerBuilder に通知 さ れ ま す。 サーバは、 デー タ を提供 し 、 そのデー タ を更新 し て元のデー タ フ ァ イ ルに保存 し 、 さ ら に、 その項目に関す る 情報 (た と えば、 リ ン ク し た列の範囲内に列を挿入 し た場合の覚え 書 き と いっ た情報) を更新 し ます。 サーバが リ ン ク を管理 し てい る ので、 開発者 は、 OLE オブジ ェ ク ト が埋め込まれてい る のか リ ン ク さ れてい る のか を気にせずに、 そのオブジ ェ ク ト を アプ リ ケーシ ョ ン内で移動 し た り 操作 し た り す る こ と がで き ます。 中断 さ れた リ ン ク の修復 フ ァ イ ルの移動、 名前の変更、 ま たは削除な ど が原因で リ ン ク が中断 さ れた場合は、 コ ン ト ロ ールの [ リ ン ク の更新オプシ ョ ン] の設定内 容に よ っ て、 それに ど う 対処す る かが決ま り ます。 [ リ ン ク の更新オプ シ ョ ン] が 「自動」 に設定 さ れてい る 場合は、 PowerBuilder がダ イ ア ロ グ ボ ッ ク ス を 表 示 し て、 フ ァ イ ル の 検 索 を 指 示 し ま す。 UpdateLinksDialog 関数を使用 し て、ス ク リ プ ト で同 じ ダ イ ア ロ グボ ッ ク ス を表示す る こ と がで き ま す。 ま た、 リ ン ク は、 LinkTo 関数を使用 し て ス ク リ プ ト で行 う こ と がで き ます。 コ ン ト ロ ールには、 リ ン ク さ れてい る オブジ ェ ク ト が、 そのオブジ ェ ク ト を開いた と き と 同 じ 画像で表示 さ れます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 321 OLE コ ン ト ロール と 挿入可能なオブ ジ ェ ク ト オフ サイ ト ア ク テ ィ ブ 化と イ ン プ レ ース ア ク テ ィ ブ 化 アプ リ ケーシ ョ ン実行時に、 エ ン ド ユーザが OLE コ ン ト ロ ール上の オブジ ェ ク ト を ア ク テ ィ ブにす る と 、 PowerBuilder は、 埋め込 ま れて い る オブジ ェ ク ト を イ ン プ レース ア ク テ ィ ブ化 し よ う と し ます。 つま り 、 エ ン ド ユーザに よ る そのオブジ ェ ク ト の操作は、 PowerBuilder の ウ ィ ン ド ウ 内部で行われます。 サーバ アプ リ ケーシ ョ ン が提供す る メ ニ ュ ーは、 PowerBuilder アプ リ ケーシ ョ ン の メ ニ ュ ー と マージ さ れ ま す。 メ ニ ュ ーのマージは、 メ ニ ュ ー ペ イ ン タ で管理で き ます (323 ペー ジの 「 イ ンプ レース ア ク テ ィ ブ化に対す る メ ニ ュ ー」 参照)。 コ ン ト ロ ールが イ ン プ レース ア ク テ ィ ブ化 さ れ る と 、 幅広のハ ッ チン グ表示の枠線が現れ ます。 オ フ サ イ ト ア ク テ ィ ブ化 と は、 サーバ アプ リ ケーシ ョ ン が開 き 、 サー バの ウ ィ ン ド ウ 上でオブジ ェ ク ト の内容 (文書な ど) が開かれ る こ と です。 こ の場合は、 サーバの メ ニ ュ ーすべてが使用で き ます。 コ ン ト ロ ール自体は斜線 ス ト ラ イ プの影が付け ら れて表示 さ れ、 オブジ ェ ク ト がサーバ アプ リ ケーシ ョ ン で開いてい る こ と が示 さ れ ます。 イ ン プ レース ア ク テ ィ ブ化の制限 PowerBuilder が OLE オブ ジ ェ ク ト を イ ン プ レ ー ス ア ク テ ィ ブ化で き る か ど う かは、 サーバの機能に よ っ て決 ま り ま す。 OLE 1.0 オブジ ェ ク ト は、 イ ン プ レース ア ク テ ィ ブ化で き ません。 ま た、 OLE 2.0 標準 は、 リ ン ク さ れたオブジ ェ ク ト が イ ン プ レース ではな く オ フ サ イ ト で ア ク テ ィ ブ化す る よ う に指定 し てい ます。 ウ ィ ン ド ウ ペ イ ン タ 上では、オブジ ェ ク ト は常にオ フ サ イ ト ア ク テ ィ ブ化 さ れ ます。 322 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 デフ ォ ル ト の動作形態は、 ス ク リ プ ト で Activate 関数を呼び出 し 、 オブ ジ ェ ク ト を イ ン プ レース ま たはオ フ サ イ ト の ど ち ら でア ク テ ィ ブ化す る か を指定 し て変更す る こ と がで き ます。 コ ン ト ロ ールの [起動方法] が 「ス ク リ プ ト (activatemanually!)」 に設定 さ れてい る 場合は、 Activate 関数の呼び出 し を DoubleClicked イ ベン ト (ま たはほかの イ ベン ト ) に 対す る ス ク リ プ ト に記述 し ます。 デ フ ォル ト の動作形態 の変更 ole_1.Activate(Offsite!) コ ン ト ロールがア ク テ ィ ブ化 さ れない場合 空の コ ン ト ロ ール、つま り OLE オブジ ェ ク ト と 関連付け ら れていない OLE コ ン ト ロ ールは、 ア ク テ ィ ブ化で き ません。 エ ン ド ユーザに OLE オブジ ェ ク ト を選択 さ せたい場合は、 InsertObject 関数を呼び出す ス ク リ プ ト を記述 し ます。 ま た、 コ ン ト ロ ール上のオブジ ェ ク ト を リ ン ク す る と き に リ ン ク す る フ ァ イ ルが見つか ら ない場合 も 、 その コ ン ト ロ ールを ア ク テ ィ ブ化で き ません。 ただ し 、 [ リ ン ク の更新オプシ ョ ン] が 「自動」 に設定 さ れ てい る 場合は、 PowerBuilder がダ イ ア ロ グ ボ ッ ク ス を表示 し て、 エ ン ド ユーザに フ ァ イ ルを検索 さ せ る こ と がで き ます。 [ リ ン ク の更新オプシ ョ ン] が 「ス ク リ プ ト (activatemanually!)」 に設 定 さ れてい る 場合は、 UpdateLinksDialog 関数を使用 し て、 ス ク リ プ ト で ダ イ ア ロ グ ボ ッ ク ス を表示 し た り 、 LinkTo 関数を使用 し て、 ス ク リ プ ト で別フ ァ イ ルに リ ン ク す る こ と がで き ます。 イ ン プ レ ース ア ク テ ィ ブ 化に対する メ ニュ ー オブジ ェ ク ト が イ ンプ レース ア ク テ ィ ブ化す る と 、サーバ アプ リ ケー シ ョ ン の メ ニ ュ ーは、 PowerBuilder ア プ リ ケ ー シ ョ ン の メ ニ ュ ー と マージ さ れ ます。 メ ニ ュ ー ペ イ ン タ の [マージ オプシ ョ ン] の設定内 容に よ っ て、 2 つのアプ リ ケーシ ョ ン の メ ニ ュ ーのマージ方法が決定 さ れ ま す。 選択肢 と し て は、 「merge!」 と 「exclude!」 のほかに、 標準 メ ニ ュ ー名があ り ます。 v OLE オブジェ ク ト がアク ティ ブ化さ れたと き に、 アプリ ケーショ ン のメ ニュ ー を制御するには 1 メ ニ ュ ー ペ イ ン タ で メ ニ ュ ーを開 き ます。 2 メ ニ ュ ー バーに表示す る メ ニ ュ ー項目を選択 し ます。 [マージ オ プシ ョ ン] の設定は、 ド ロ ッ プダ ウ ン メ ニ ュ ーの メ ニ ュ ー項目で はな く 、 メ ニ ュ ー バーの メ ニ ュ ー項目だけに適用 さ れます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 323 OLE コ ン ト ロール と 挿入可能なオブ ジ ェ ク ト 3 プ ロ パテ ィ ページで、 適切な [マージ オプシ ョ ン] の設定を選択 し ます。 表 18-1 は設定の リ ス ト です。 表 18-1: [マージ オプ シ ョ ン] の設定 オプ シ ョ ン filemenu! editmenu! windowmenu! filemenu! merge! exclude! 4 意味 コ ン テナ アプ リ ケーシ ョ ン (PowerBuilder アプ リ ケーシ ョ ン) の メ ニ ュ ー バーの一番左に表示 さ れ る メ ニ ュ ー。 サーバの [フ ァ イ ル] メ ニ ュ ーは表示 さ れない コ ン テナ アプ リ ケーシ ョ ンの [編集] メ ニ ュ ーは表示 さ れ な い。 サーバの [編集] メ ニ ュ ーが表示 さ れ る 開いて いる シ ート のリ ス ト を 持つコ ン テナ アプリ ケ ーショ ン のメ ニュ ー。 サーバの [ ウ ィ ン ド ウ] メ ニ ュ ーは表 示 さ れない コ ン テナ ア プ リ ケーシ ョ ン の [ヘル プ] メ ニ ュ ーは表示 さ れない。 サーバ の [ヘルプ] メ ニ ュ ーが表示 さ れ る サーバ ア プ リ ケーシ ョ ン の最初の メ ニ ュ ーの後に、その メ ニ ュ ーが表示 さ れる オブジ ェ ク ト がア ク テ ィ ブな間は、 メ ニ ュ ーは表示 さ れない メ ニ ュ ー バー に表示 さ れ る メ ニ ュ ーの入 手先 コ ン テナ サーバ コ ン テナ サーバ コ ン テナ メ ニ ュ ー バーにあ る 各 メ ニ ュ ー項目に対 し て、 操作手順 2 と 3 を 繰 り 返 し ます。 標準 メ ニ ュ ーの標準的 な割 り 当て 通常、[マージ オプシ ョ ン]の 「filemenu!」、「editmenu!」、「windowmenu!」、 お よ び 「helpmenu!」 は、 それぞれ [フ ァ イ ル] 、 [編集] 、 [ ウ ィ ン ド ウ ] 、 [ヘルプ] の各 メ ニ ュ ーに割 り 当て ます。 実際の メ ニ ュ ー名が国 際的な アプ リ ケーシ ョ ンにおいては異な る か も し れないので、[マージ オプシ ョ ン] を使用 し て正 し い関係を設定 し ます。 ア ク テ ィ ブ化 さ れたオ ブジ ェ ク ト の メ ニ ュー バー [マー ジ オ プ シ ョ ン] を 設定す る と 、 メ ニ ュ ー バーに、 コ ン テ ナの [フ ァ イ ル] と [ ウ ィ ン ド ウ ] メ ニ ュ ー、 お よ びサーバの [編集] と [ヘルプ] メ ニ ュ ーを表示で き ま す。 「merge!」 が設定 さ れたすべての メ ニ ュ ーは、 メ ニ ュ ー バーの適切な位置に挿入 さ れ ま す。 ま た、 メ ニ ュ ー バーには、 サーバが適切であ る と 判断 し たほかの メ ニ ュ ー も 表 示 さ れ ます。 324 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 OLE コ ン ト ロ ール上で のオブ ジ ェ ク ト の修正 OLE オブジ ェ ク ト が OLE コ ン ト ロ ールに表示 さ れてい る と き は、その オブジ ェ ク ト と それを作成 し た アプ リ ケーシ ョ ン (OLE サーバ) の操 作が可能です。 ま た、 そ こ で行われ る 可能性のあ る 操作を ス ク リ プ ト に記述す る こ と も で き ます。 こ の節では、 以下の方法について説明 し ます。 • OLE オブジ ェ ク ト を ア ク テ ィ ブに し て、 一般的な コ マ ン ド をサー バに送 る 方法 • コ ン ト ロ ール内のオブジ ェ ク ト の変更 と 保存方法 • デー タ ま たはプ ロ パテ ィ が イ ベ ン ト に よ っ て変更 さ れた と き に、 それを検出す る 方法 コ ン ト ロ ールのオー ト メ ーシ ョ ン については、 344 ページの 「ス ク リ プ ト におけ る OLE オブジ ェ ク ト 」 を参照 し て く だ さ い。 OLE オブ ジ ェ ク ト のア ク テ ィ ブ化 通常は、 OLE コ ン ト ロ ールでは、 ダブル ク リ ッ ク でオブジ ェ ク ト を ア ク テ ィ ブ化で き ます。 ま た、 Activate 関数を呼び出せば、 ス ク リ プ ト か ら も そのオブジ ェ ク ト を ア ク テ ィ ブ化で き ます。 OLE コ ン ト ロ ールの Activation プ ロ パテ ィ が Manual に設定 さ れてい る 場合は、 Activate 関数 を呼び出 し てサーバの編集セ ッ シ ョ ン を開始 し なければな り ません。 ole_1.Activate(InPlace!) 一般的な OLE ア ク シ ョ ンは、DoVerb 関数を呼び出す こ と に よ っ て起動 で き ます。 バーブ (Verb) と は、 実行 さ れ る ア ク シ ョ ン を指定す る 整 数値の こ と です。 各整数値の意味は、 サーバに よ っ て異な り ます。 通 常、 デ フ ォ ル ト の ア ク シ ョ ン (0 を指定) は、 編集です。 ま た、 こ の ア ク シ ョ ンはオブジ ェ ク ト のア ク テ ィ ブ化 も 同時に行い ます。 た と えば、 ole_1 コ ン ト ロ ールが Microsoft Excel の ス プ レ ッ ド シー ト を 含んでい る 場合は、 以下の式に よ っ てオブジ ェ ク ト を ア ク テ ィ ブ化 し て、 編集可能に し ます。 ole_1.DoVerb(0) サーバ ア プ リ ケーシ ョ ン のマ ニ ュ アル を 調べ、 サ ポー ト さ れて い る バーブの内容を確認 し て く だ さ い。 OLE バーブに よ る 、 オブジ ェ ク ト の操作は比較的制限 さ れ ます。 柔軟な イ ン タ フ ェ ース を必要 と す る 場 合は、 オー ト メ ーシ ョ ン を使用 し て く だ さ い。 ただ し 、 OLE 1.0 サー バは、 バーブ し かサポー ト し てお ら ず、 オー ト メ ーシ ョ ンはサポー ト し てい ません。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 325 OLE コ ン ト ロール と 挿入可能なオブ ジ ェ ク ト OLE コ ン ト ロール上のオブ ジ ェ ク ト の変更 PowerBuilder は、 OLE コ ン ト ロ ール上のオブジ ェ ク ト を変更す る ため の関数をい く つか提供 し てい ます。 こ れ ら の関数は、 表 18-2 に示す よ う に、 オブジ ェ ク ト を エ ン ド ユーザに選択 さ せ る か、 オブジ ェ ク ト を リ ン ク す る か埋め込むかに よ っ て使い分け ます。 表 18-2: OLE コ ン ト ロール上のオブ ジ ェ ク ト を変更する ための関数 選択条件 オブジ ェ ク ト をエン ド ユーザに選択 さ せ る 。コ ン ト ロ ールの Contents プ ロ パテ ィ が Any の場合は、オブ ジ ェ ク ト を リ ン ク し て も 埋め込んで も か ま わない 指定 し たサーバで新たなオブジ ェ ク ト を作成 し 、 コ ン ト ロ ールに埋め込む 既存のオブ ジ ェ ク ト の コ ピ ー を コ ン ト ロ ールに埋 め込む 既存のオブジ ェ ク ト を コ ン ト ロ ールに リ ン ク す る 既存のオブ ジ ェ ク ト を フ ァ イ ルか ス ト レ ージ か ら 開 く 。 フ ァ イ ルの情報が、 オブジ ェ ク ト を リ ン ク す る か埋め込むか を決め る 関数 InsertObject InsertClass InsertFile LinkTo Open 図 18-1 は、 リ ン ク か埋め込みかの選択がで き ない 3 つの関数の動 き を 示 し てい ます。 図 18-1: リ ン クか埋め込みかの選択がで き ない関数 Blob 型変数に保持 さ れてい る OLE オブジ ェ ク ト のデー タ は、 OLE コ ン ト ロ ールの ObjectData プ ロ パテ ィ に代入で き ます。 326 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 blob myblob ...// Blob 型変数に保持 し た OLE デー タ を代入する コ ー ド ole_1.ObjectData = myblob コ ン ト ロ ールの Contents プ ロ パテ ィ に よ っ て、 埋め込みや リ ン ク の対 象 と な る オブジ ェ ク ト を受け入れ る か ど う かが指定 さ れ ます。 こ れに よ っ て、エ ン ド ユーザにオブジ ェ ク ト の挿入 ダ イ ア ロ グボ ッ ク ス で埋 め込みか リ ン ク か を選択 さ せ る か ど う かが決ま り ます。 ま た、 Contents プ ロ パテ ィ に よ っ て、使用可能な関数が決め ら れます。こ のプ ロ パテ ィ が許可 し ない方法を選択す る 関数を呼び出す と 、 その関数の実行は失 敗 し ます。 オブ ジ ェ ク ト ブ ラ ウ ザでの OLE 情報 使用 し てい る シ ス テ ム に イ ン ス ト ール さ れてい る OLE サーバ アプ リ ケーシ ョ ンの登録名を検索す る 場合は、 オブジ ェ ク ト ブ ラ ウ ザを使用 し ま す。 こ こ に 表 示 さ れ る 名 前 は、 InsertClass、 ConnectToObject、 ConnectToNewObject の各関数の引数 と し て使用で き ます (334 ページの 「プ ロ グ ラ ム可能な OLE オブジ ェ ク ト 」 を参照)。 OLE と オブジ ェ ク ト ブ ラ ウ ザについての詳細は、 364 ページの 「オブ ジ ェ ク ト ブ ラ ウ ザでの OLE 情報」 を参照 し て く だ さ い。 ク リ ッ プボー ド の使い 方 メ ニ ュ ー項目の ス ク リ プ ト に Cut、 Copy、 Paste の各関数を記述す る と 、 ク リ ッ プボー ド 機能がエ ン ド ユーザに提供 さ れます。 Cut 関数や Copy 関数を OLE コ ン ト ロ ールに対 し て呼び出す と 、その コ ン ト ロ ール上の OLE オブジ ェ ク ト が ク リ ッ プボー ド に コ ピー さ れ ます。 同様に、 エ ン ド ユーザがサーバ ア プ リ ケーシ ョ ン で こ れ ら の メ ニ ュ ー項目を選択 す る と 、 デー タ が ク リ ッ プボー ド 上に コ ピー さ れ ます。 こ れ ら の関数 は、 メ ニ ュ ー項目に限 ら ず、 任意の ス ク リ プ ト で記述で き ます。 OLE コ ン ト ロ ールには、 オブジ ェ ク ト を挿入す る ための Paste 関数が い く つか用意 さ れてい ます。 こ れ ら の関数には、 貼 り 付け る オブジ ェ ク ト を リ ン ク す る か、 埋め込むかの違いがあ る だけです。 表 18-3: Paste 関数 選択条件 ク リ ッ プボー ド 上のオブ ジ ェ ク ト を コ ン ト ロ ー ルに埋め込む 関数 ク リ ッ プボー ド 上のオブ ジ ェ ク ト を コ ン ト ロ ー ルに貼 り 付けて リ ン ク す る 貼 り 付け る オブジ ェ ク ト を埋め込むか、 リ ン ク す る か を エン ド ユーザに選択 さ せる PasteLink Paste PasteSpecial 通常 Paste 関数 を 用い て 処理 し て い る ス ク リ プ ト で、 貼 り 付 け 先が OLE コ ン ト ロ ールにな る 場合があ る と き は、 以下の よ う な ス ク リ プ ト で PasteSpecial 関数 (ま たは PasteLink 関数) を呼び出 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 327 OLE コ ン ト ロール と 挿入可能なオブ ジ ェ ク ト graphicobject lg_obj datawindow ldw_dw olecontrol lole_ctl // フ ォ ー カ ス さ れてい るオブ ジ ェ ク ト を取得 し ます。 lg_obj = GetFocus() // オブ ジ ェ ク ト の種類を基に、 ク リ ッ プボー ド 上のデー タ を挿入 し ま す。 CHOOSE CASE TypeOf(lg_obj) CASE DataWindow! ldw_dw = lg_obj ldw_dw.Paste() ... CASE OLEControl! lole_ctl = lg_obj lole_ctl.PasteSpecial() END CHOOSE 埋め込まれたオブ ジ ェ ク ト の保存 ウ ィ ン ド ウ の設計時に埋め込まれた OLE オブジ ェ ク ト は、OLE コ ン ト ロ ール と と も に ラ イ ブ ラ リ に保存 さ れ ます。 し か し 、 アプ リ ケーシ ョ ン実行時に埋め込ま れたオブジ ェ ク ト は、 コ ン ト ロ ール と と も に保存 で き ません。 アプ リ ケーシ ョ ン の実行モジ ュ ールや ラ イ ブ ラ リ は、 読 み出 し 専用だか ら です。 こ のオブジ ェ ク ト を保存 し たい場合は、 その デー タ を フ ァ イ ルかデー タ ベース に保存 し なければな り ません。 た と えば、 以下の ス ク リ プ ト は、 SaveAs 関数を使用 し てオブジ ェ ク ト を フ ァ イ ルに保存 し てい ます。 こ こ では、 エ ン ド ユーザに対 し て フ ァ イ ル名の入力を指示 し 、 コ ン ト ロ ール上のオブジ ェ ク ト を、 サーバ ア プ リ ケーシ ョ ン本来のデー タ と し てではな く 、OLE デー タ フ ァ イ ル と し て保存 し ます。 こ の フ ァ イ ルは、 ス ク リ プ ト に よ っ て、別のセ ッ シ ョ ンの コ ン ト ロ ール上で開 く こ と も で き ます。 string myf ilename, mypathname integer result GetFileSaveName("Select File", mypathname, & myfilename, "OLE", & "OLE Files (*.OLE),*.OLE") result = ole_1.SaveAs(myfilename) 通常、 フ ァ イ ルに保存 し た OLE デー タ はサーバ アプ リ ケーシ ョ ン で 直接開 く こ と がで き ま せん。 し か し 、 PowerBuilder でそのオブジ ェ ク ト を開いてか ら サーバ アプ リ ケーシ ョ ン を起動す る こ と はで き ます。 328 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 オブジ ェ ク ト を コ ン ト ロ ールに埋め込む と 、実際のデー タ は Blob デー タ と し て コ ン ト ロ ールの ObjectData プ ロ パテ ィ に保持 さ れます。 埋め 込んだオブジ ェ ク ト をデー タ ベース に保存 し て後か ら 検索 し たい場合 は、 そのオブジ ェ ク ト を Blob デー タ と し て保存 し ます。 Blob 型変数 と コ ン ト ロ ー ル 間 の デ ー タ 転 送 は、 Blob デ ー タ を コ ン ト ロ ー ル の ObjectData プ ロ パテ ィ に代入 し た り その逆を行っ た り し て、 実行 し ま す。 blob myblob myblob = ole_1.ObjectData Blob デー タ は、埋め込み SQL の UPDATEBLOB 文を使用 し てデー タ ベー ス で更新す る こ と がで き ます ( 『PowerScript リ フ ァ レ ン ス 』 マニ ュ ア ルを参照)。 ま た、 OLE オ ブ ジ ェ ク ト は、 SaveAs 関数や Save 関数 を 使用 し て、 PowerBuilder の OLEStorage 型変数に保持で き ます (369 ページの 「ス ト レージ を開 く 、 保存す る 」 を参照)。 リ ン ク し たオブジ ェ ク ト を サーバに保存 し て も 、 リ ン ク 情報に影響は あ り ません。 し たが っ て、 その開いてい る オブジ ェ ク ト 自体は、 保存 す る 必要はあ り ません。 し か し 、 エ ン ド ユーザがそのオブジ ェ ク ト 名 を変更 し た り 、 リ ン ク し た項目の範囲に影響を及ぼ し た場合は、 Save 関数を呼び出 し て、 リ ン ク 情報を保存 し なければな り ません。 OLE コ ン ト ロールにおける イ ベン ト サーバ アプ リ ケーシ ョ ン で OLE オブジ ェ ク ト に影響す る ア ク シ ョ ン が起 き た こ と を PowerBuilder に通知す る イ ベン ト がい く つか用意 さ れ てい ます。 デー タ のイ ベン ト デー タ に関す る イ ベン ト は、 次の と お り です。 デー タ が変更 さ れた と き • DataChange イ ベン ト • Rename イ ベン ト • Save、 SaveObject イ ベン ト • ViewChange イ ベン ト オブジ ェ ク ト の名前が変更 さ れた と き デー タ が保存 さ れた と き エ ン ド ユーザがデー タ の表示を変更 し た と き こ れ ら の イ ベン ト が起 こ る と 、 その変更内容は OLE コ ン ト ロ ールに自 動的に反映 さ れ ます。 オブジ ェ ク ト に対す る 名前の変更、 保存、 ま た はオブジ ェ ク ト の変更が行われた と き に、 何 ら かの処理を必要 と す る 場合は、 適切な ス ク リ プ ト を記述 し て対処 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 329 OLE カ ス タ ム コ ン ト ロール OLE アーキ テ ク チ ャ が起因 し て、上記 イ ベン ト 内で OLE オブジ ェ ク ト を処理で き ない場合があ り ます。 実行す る と 、 ラ ン タ イ ム エ ラ ーを引 き 起 こ し かねません。 通常は、 PostEvent 関数を使用 し て非同期 イ ベン ト ハン ド ラ に イ ベン ト を ポ ス ト し ます。 SaveObject イ ベン ト を ポ ス ト す る 必要はないので、 サーバ アプ リ ケーシ ョ ン がオブジ ェ ク ト を保存 す る 際に、 常にオブジ ェ ク ト 内のデー タ を フ ァ イ ルに保存 し たい場合 には、 こ の イ ベン ト が便利です。 プ ロパテ ィ のイ ベン ト サーバがプ ロ パテ ィ 通知を サポー ト し てい る 場合は、 サーバのプ ロ パ テ ィ 値が変更 さ れた と き に、 PropertyRequestEdit イ ベン ト と PropertyChanged イ ベン ト が起動 さ れます。 変更を キ ャ ン セル し た り 、 古い値を保存 し た り 、 ま たは新 し い値を読み込むス ク リ プ ト を記述す る こ と がで き ます。 プ ロ パテ ィ 通知の詳細については、 357 ページの 「ホ ッ ト リ ン ク の作 成」 を参照 し て く だ さ い。 OLE カ ス タ ム コ ン ト ロール [ コ ン ト ロ ール] ド ロ ッ プダ ウ ン ツールバーの [OLE] ボ タ ン を ク リ ッ ク し て、 OLE コ ン テナに OLE オブジ ェ ク ト ま たは OLE カ ス タ ム コ ン ト ロ ールの ど ち ら を挿入す る か を選択で き ます。OLE カ ス タ ム コ ン ト ロ ール (ActiveX コ ン ト ロ ール) を選択す る と 、 コ ン テナの種類 と 内容 が確定 さ れ ます。 後か ら 、 挿入す る オブジ ェ ク ト を選択 し た り 、 別の ActiveX コ ン ト ロ ールを選択す る こ と はで き ません。 ActiveX コ ン ト ロ ールには、 ActiveX コ ン ト ロ ール自身のプ ロ パテ ィ 、 イ ベン ト 、 関数があ り ます。 ス ク リ プ ト で ActiveX コ ン ト ロ ールのプ ロ パテ ィ と メ ソ ッ ド を呼び出す際に、ActiveX コ ン ト ロ ールが変更 さ れ ない よ う にす る こ と は、 エ ラ ーの回避に も な り ます。 OLE カ ス タ ム コ ン ト ロ ールの設定 PowerBuilder のカ ス タ ム コ ン ト ロ ール コ ン テナには、 ど んな ActiveX コ ン ト ロ ールに も 適用す る プ ロ パテ ィ があ り ます。ActiveX コ ン ト ロ ー ルは、 ActiveX コ ン ト ロ ール自身のプ ロ パテ ィ を持っ てい ます。 こ の節 では、 それぞれの種類のプ ロ パテ ィ の用途 と 設定方法について説明 し ます。 330 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 OLE カ ス タ ム コ ン ト ロ ールのプ ロ パテ ィ には、2 つの用途があ り ます。 PowerBuilder のプ ロ パテ ィ • ほかの コ ン ト ロ ール と 同様に、 コ ン テナの表示 と 動作の形態を設 定す る [全般] プ ロ パテ ィ ページの標準設定 ( [表示可能] 、 [使用可能] な ど) と 同様に、 表示位置、 ポ イ ン タ 、 お よ び ド ラ ッ グ ア ン ド ド ロ ッ プの設定がで き ます。 • ActiveX コ ン ト ロ ールが使用で き る デフ ォ ル ト の情報を提供す る OLE コ ン テナの フ ォ ン ト 情報や表示名を ア ン ビ エ ン ト プ ロ パテ ィ と 呼び ます。 PowerBuilder が直接ア ン ビ エ ン ト プ ロ パテ ィ を使用 し て ActiveX コ ン ト ロ ールにテ キ ス ト を表示す る こ と はあ り ま せ ん。 ActiveX コ ン ト ロ ールがア ン ビ エ ン ト プ ロ パテ ィ を認識で き る 場合は、 ActiveX コ ン ト ロ ールは、 PowerBuilder のプ ロ パテ ィ を 使用で き ま す。 ActiveX コ ン ト ロ ールは、 テ キ ス ト を表示 し た り 、 タ イ ト ル バーに OLE コ ン テナの名前を表示で き ます。 v OLE カ ス タ ム コ ン ト ロールの PowerBuilder プ ロパテ ィ を変更するには 1 OLE コ ン ト ロ ールを ダブル ク リ ッ ク す る か、 コ ン ト ロ ールのポ ッ プア ッ プ メ ニ ュ ーか ら [プ ロ パテ ィ ] を選択 し ます。 OLE カ ス タ ム コ ン ト ロ ール プ ロ パテ ィ シー ト が表示 さ れ ます。 2 コ ン ト ロ ールに名前を付け ま す。 ス ク リ プ ト では こ の名前を使用 し ます。 デフ ォ ル ト 名は 「ole_」 の接頭辞に数字を組み合わせた も のです。 3 [全般] プ ロ パテ ィ ページやほかのページにあ る プ ロ パテ ィ の値 も 適切な値に設定 し ます。 4 プ ロ パテ ィ の設定が終わ っ た ら 、 [OK] ボ タ ン を ク リ ッ ク し ます。 コ ン ト ロールの説明 ウ ィ ン ド ウ ま たは コ ン ト ロ ールの [ タ グ] プ ロ パテ ィ に、 使用 し てい る ActiveX コ ン ト ロ ールに関す る 説明を入力 し ます。 別の環境で こ の ウ ィ ン ド ウ を使用す る 際に ActiveX コ ン ト ロ ールが イ ン ス ト ール さ れ ていない場合、 ウ ィ ン ド ウ が ど の ActiveX コ ン ト ロ ールを使用 し てい たか を簡単に調べ る こ と がで き ます。 ActiveX コ ン ト ロール のプ ロパテ ィ ActiveX コ ン ト ロ ールは、 通常、 ActiveX コ ン ト ロ ール自身のプ ロ パ テ ィ と 、 プ ロ パテ ィ の値を設定す る ためのプ ロ パテ ィ シー ト を持っ て い ま す。 ActiveX コ ン ト ロ ールのプ ロ パテ ィ は、 PowerBuilder の OLE コ ン テナではな く 、ActiveX コ ン ト ロ ールの表示 と 動作の形態を管理 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 331 OLE カ ス タ ム コ ン ト ロール v OLE カ ス タ ム コ ン ト ロール内の ActiveX コ ン ト ロールのプ ロパテ ィ を設定 するには 1 コ ン ト ロ ールのポ ッ プア ッ プ メ ニ ュ ーま たは [全般] プ ロ パテ ィ ページか ら 、 [OLE コ ン ト ロ ール プ ロ パテ ィ ] を選択 し ます。 2 プ ロ パテ ィ の値を設定 し た ら 、 [OK] ボ タ ン を ク リ ッ ク し ます。 OLE コ ン ト ロ ールのプ ロ パテ ィ シー ト は、 ActiveX コ ン ト ロ ールのプ ロ パテ ィ の一部 し か提示 し ていない場合があ り ます。 その場合、 ス ク リ プ ト で ActiveX コ ン ト ロ ールのプ ロ パテ ィ シー ト にないプ ロ パテ ィ を設定で き ます。 ActiveX コ ン ト ロ ールのプ ロ パテ ィ についての詳細は、 ActiveX コ ン ト ロ ールのマニ ュ アルを参照 し て く だ さ い。 ActiveX コ ン ト ロ ールのプ ロ グラ ミ ン グ ActiveX コ ン ト ロ ールのプ ロ パテ ィ を設定 し た り 、 ActiveX コ ン ト ロ ー ルの関数を呼び出すス ク リ プ ト を記述 し た り し て、ActiveX コ ン ト ロ ー ルの機能が使用で き ます。ActiveX コ ン ト ロ ールの開発者が提供す る イ ン タ フ ェ ー ス に よ っ て、 1 回の関数呼び出 し で一連のア ク テ ィ ビ テ ィ ま た は個々のプ ロ パ テ ィ 設定が起動 さ れ る 場合 と 、 関数呼び出 し で ユーザに ActiveX コ ン ト ロ ールのア ク シ ョ ン を制御 さ せ る 場合があ り ます。 ActiveX コ ン ト ロ ールは常にア ク テ ィ ブです。 開いた り 、 ア ク テ ィ ブに す る 必要のあ る オブジ ェ ク ト を持っ てい ません。 つま り 、 エ ン ド ユー ザは、 OLE カ ス タ ム コ ン ト ロ ールを ダブル ク リ ッ ク し て、 OLE サーバ を起動す る こ と は し ません。 し か し 、 ActiveX コ ン ト ロ ールの処理を開 始す る 関数を呼ぶために、 DoubleClicked イ ベン ト ま たはほかの イ ベン ト に対す る ス ク リ プ ト を記述す る こ と がで き ます。 ス ク リ プ ト でのプ ロパ テ ィ の設定 ActiveX コ ン ト ロ ールのプ ロ グ ラ ミ ン グは、挿入可能なオブジ ェ ク ト の オー ト メ ーシ ョ ン を プ ロ グ ラ ムす る こ と と 同 じ です。 ActiveX コ ン ト ロ ールのプ ロ パテ ィ と 関数を指定す る には、 コ ン テナの Object プ ロ パ テ ィ を使用 し ます。 次の構文は、 ActiveX コ ン ト ロ ールのプ ロ パテ ィ 値にア ク セ ス し ます。 こ の構文は、 式を記述で き る 箇所で あれば、 その使用箇所に制限はあ り ません。 こ の式のデー タ 型は Any です。 式が評価 さ れ る と 、 式の値 は、 コ ン ト ロ ール プ ロ パテ ィ のデー タ 型の値にな り ます。 olecontrol.Object.ocxproperty 332 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 次の構文は、 ActiveX コ ン ト ロ ールの関数を呼び出 し ます。 適切なデー タ 型の変数で、 戻 り 値を取得で き ます。 { value } = olecontrol.Object.ocxfunction ( { argumentlist } ) プ ロパテ ィ のア ク セス 時のエ ラ ー PowerBuilder の コ ンパ イ ラ は、ActiveX コ ン ト ロ ールのプ ロ パテ ィ と 関 数にア ク セ ス す る ための正 し い構文を認識 し ないため、 Object プ ロ パ テ ィ の後の構文をチ ェ ッ ク し ません。 こ れは、 ActiveX コ ン ト ロ ールの プ ロ グ ラ ミ ン グに必要な柔軟性につなが り ます。 し か し 、 プ ロ パテ ィ や関数の名前が間違っ ていた り 、 不足 し ていた り す る と 、 アプ リ ケー シ ョ ン が実行時にエ ラ ーを起 こ す可能性があ り ます。 PowerBuilder は、 OLE のエ ラ ー処理を す る ため、 ExternalException と Error と い う 2 つの イ ベン ト を用意 し てい ます。 ActiveX コ ン ト ロ ール が組み込みエ ラ ー イ ベン ト を定義 し た場合、 PowerBuilder OLE コ ン ト ロ ール コ ン テナには、 追加 イ ベン ト で あ る ocx_event があ り ます。 こ れ ら の イ ベ ン ト を 使用す る と 、 割 り 込みの形で エ ラ ー処理が で き 、 SystemError イ ベ ン ト が起動 し て ア プ リ ケーシ ョ ン が終了す る こ と は あ り ません。 ま た、 例外ハン ド ラ TRY-CATCH も 使用で き ます。 詳細については、 354 ページの 「エ ラ ー処理」 を参照 し て く だ さ い。 ActiveX コ ン ト ロール のイ ベン ト の使い方 ActiveX コ ン ト ロ ールには、 ActiveX コ ン ト ロ ール自身が持つ イ ベン ト があ り ます。 PowerBuilder は、 ActiveX コ ン ト ロ ールの イ ベン ト と OLE カ ス タ ム コ ン ト ロ ール コ ン テナの イ ベン ト を マージ し ます。 ActiveX コ ン ト ロ ールの イ ベン ト は、 PowerBuilder の イ ベン ト と と も に、 イ ベ ン ト リ ス ト ビ ュ ーに表示 さ れます。 PowerBuilder の イ ベン ト に対す る ス ク リ プ ト と 同 じ よ う に、 PowerScript で ActiveX コ ン ト ロ ールの イ ベ ン ト に対す る ス ク リ プ ト も 記述で き ます。ActiveX コ ン ト ロ ールのプ ロ パ テ ィ と メ ソ ッ ド を 参照す る に は、 OLE カ ス タ ム コ ン ト ロ ール の Object プ ロ パテ ィ を使用 し ます。 ActiveX コ ン ト ロ ールの イ ベン ト と PowerBuilder の イ ベン ト の唯一の 違いは、 イ ベン ト が起動 さ れ る タ イ ミ ン グです。 ActiveX コ ン ト ロ ール の イ ベン ト の詳細については、ActiveX コ ン ト ロ ールのマニ ュ アルを参 照 し て く だ さ い。 ActiveX コ ン ト ロ ールの開発元が、 ActiveX コ ン ト ロ ールの イ ベン ト 、 プ ロ パテ ィ 、 関数に関す る マニ ュ アルを提供 し て い ます。 ActiveX コ ン ト ロ ールのプ ロ パテ ィ と メ ソ ッ ド の一覧は、 PowerBuilder のオブジ ェ ク ト ブ ラ ウ ザで参照で き ます。 詳細については、 364 ペー ジの 「オブジ ェ ク ト ブ ラ ウ ザでの OLE 情報」 を参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 333 プ ログ ラ ム可能な OLE オブ ジ ェ ク ト ActiveX コ ン ト ロールの新規バージ ョ ン ActiveX コ ン ト ロ ールの新規バー ジ ョ ン を イ ン ス ト ール し て、 そ の ActiveX コ ン ト ロ ールに新規の イ ベン ト があ っ た場合で も 、ウ ィ ン ド ウ ペ イ ン タ の [ イ ベン ト ] ド ロ ッ プダ ウ ン リ ス ト ボ ッ ク ス には新規の イ ベン ト が追加 さ れ ません。 新規の イ ベン ト を使用す る には、 既存の イ ベン ト の ス ク リ プ ト と と も に、OLE カ ス タ ム コ ン ト ロ ールを削除 し て 再作成 し な ければな り ま せん。 新規の イ ベン ト を 使用 し な い場合は、 コ ン ト ロ ールを その ま ま に し てお き 、 更新 さ れた既存の ActiveX コ ン ト ロ ール イ ベン ト を使用す る こ と がで き ます。 プ ロ グ ラ ム可能な OLE オブ ジ ェ ク ト OLE オブジ ェ ク ト を ス ク リ プ ト で操作す る と き は、 必ず し も 、 ウ ィ ン ド ウ 上 に OLE コ ン ト ロ ー ル を 配 置 し な く て も か ま い ま せ ん。 PowerBuilder アプ リ ケーシ ョ ン で表示す る 必要のない OLE オブジ ェ ク ト は、 コ ン ト ロ ール と 無関係に作成 し 、 サーバ アプ リ ケーシ ョ ン と の 関連付け を行い、 関数呼び出 し やプ ロ パテ ィ を設定す る こ と がで き ま す。 サーバ アプ リ ケーシ ョ ン が、 関数を実行 し て、 OLE オブジ ェ ク ト のプ ロ パテ ィ を変更 し ます。つま り 、OLE オブジ ェ ク ト を変更 し ます。 アプ リ ケーシ ョ ン の中には、 表示、 非表示の指定が可能な も のがあ り ます。 表示を指定すれば、 エ ン ド ユーザは、 そのアプ リ ケーシ ョ ン を ア ク テ ィ ブ化 し 、 サーバ アプ リ ケーシ ョ ンの コ マ ン ド やツールを使用 し て、 OLE オブジ ェ ク ト を操作で き ます。 OLEObject オブ ジ ェ ク ト 型 PowerBuilder の OLEObject オブジ ェ ク ト デー タ 型は、 オー ト メ ーシ ョ ン機能で用い る ために設計 さ れてい ます。 OLEObject 変数は動的オブ ジ ェ ク ト の一種です。 つ ま り 、 コ ンパ イ ラ は、 こ のオブジ ェ ク ト に対 す る ど の よ う なプ ロ パテ ィ 名、 関数名、 パ ラ メ ー タ リ ス ト も 受け入れ ま す。 PowerBuilder は、 それ ら のプ ロ パテ ィ と 関数が有効か ど う か を 知 る 必要があ り ません。 こ のオブジ ェ ク ト の メ ソ ッ ド の呼び出 し やプ ロ パテ ィ の設定は、 そのオブ ジ ェ ク ト を 作成 し た サーバ ア プ リ ケー シ ョ ン に よ っ て把握 さ れてい ます。 こ れ ら の関数やプ ロ パテ ィ が、 ア プ リ ケーシ ョ ン実行時に存在 し ない場合は、 実行時エ ラ ーが起 こ り ま す。 334 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 OLEObject 変数を使用す る 手順は次の と お り です。 1 変数を宣言 し て、 イ ン ス タ ン ス を作成 し ます。 2 OLE オブジ ェ ク ト と 関連付け ます。 3 OLE サーバのプ ロ パテ ィ と 関数を使用 し て、適切な OLE オブジ ェ ク ト を操作 し ます。 4 OLE オブジ ェ ク ト と の関連付け を解除 し て、 イ ン ス タ ン ス を破棄 し ます。 こ れ ら の手順は、 次に説明 し ます。 OLEObject 変数の宣 言 OLEObject 変数を宣言 し て、 メ モ リ を割 り 当て る 必要があ り ます。 OLEObject myoleobject myoleobject = CREATE OLEObject OLE コ ン テ ナ コ ン ト ロ ール (OLEControl や OLECustomControl) の Object プ ロ パテ ィ は、 OLEObject オブジ ェ ク ト デー タ 型です。 サーバへの接続 OLEObject オブジ ェ ク ト と OLE サーバ間の接続を確立す る には、 いず れかの ConnectToObject 関数を使用 し ます。オブジ ェ ク ト に接続す る と 、 適切なサーバが起動 さ れます。 表 18-4: ConnectToObject 関数 選択条件 指定 し た OLE サーバで新たなオブジ ェ ク ト を 作成す る 。 こ の関数の機能は、 OLE コ ン ト ロ ールの InsertClass 関数に似てい る サーバのセキ ュ リ テ ィ に よ り 作成権限があ り 、 新規オブジ ェ ク ト が PowerBuilder の OLEObject 変数に関連付け ら れ る 場合は、 指 定 さ れた リ モー ト サーバ アプ リ ケーシ ョ ンに 新たな OLE オブジ ェ ク ト を作成す る 既存の OLE オブジ ェ ク ト を フ ァ イ ルか ら 開 く 。 OLE ク ラ ス を指定 し ていない場合は、 PowerBuilder が フ ァ イ ルの拡張子を調べて、 起動す る サーバを決め る OLE オブジ ェ ク ト を PowerBuilder の OLEObject 変数に関連付け、 リ モー ト サーバ アプ リ ケーシ ョ ン を起動す る 関数 ConnectToNewObject ConnectToNewRemoteObject ConnectToObject ConnectToRemoteObject 関連付け を行っ た ら 、 オー ト メ ーシ ョ ン のために用意 さ れてい る 一連 のサーバ コ マ ン ド を使用 し て、 オブジ ェ ク ト の操作がで き ます ( 344 ページの 「ス ク リ プ ト におけ る OLE オブジ ェ ク ト 」 を参照)。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 335 プ ログ ラ ム可能な OLE オブ ジ ェ ク ト コ マ ン ド にアプ リ ケーシ ョ ン修飾子を付け る 必要はあ り ません。 アプ リ ケーシ ョ ン修飾子は、 サーバ と 関連付け ら れた と き に、 アプ リ ケー シ ョ ン の ク ラ ス と し てすでに指定 さ れてい ます。 た と えば、 以下の コ マ ン ド は、 OLEObject 変数 を 作成 し 、 Microsoft Word の OLE イ ン タ フ ェ ー ス (word.application) と の関連付け を 行い、 文書 を 開 き 、 文書 に関す る 情報を表示 し 、 テ キ ス ト を挿入 し 、 編集 さ れた文書を保存 し 、 サーバを シ ャ ッ ト ダ ウ ン し ます。 OLEObject o1 string s1 o1 = CREATE oleobject o1.ConnectToNewObject("word.application") o1.documents.open("c:¥temp¥temp.doc") // オブ ジ ェ ク ト を表示状態に し 、 // MS Word ユーザ名 と フ ァ イル名を表示 し ます。 o1.Application.Visible = True s1 = o1.UserName MessageBox("MS Word ユーザ名 ", s1) s1 = o1.ActiveDocument.Name MessageBox("MS Word 文書名 ", s1) // 新規パラ グ ラ フ 内にテキス ト を挿入 し ます。 o1.Selection.TypeParagraph() o1.Selection.typetext(" こ のテキス ト を挿入 ") o1.Selection.TypeParagraph() // 最初のブ ッ ク マー ク にテキス ト を挿入 し ます。 o1.ActiveDocument.Bookmarks[1].Select o1.Selection.typetext("Hail!") // End と 名前の付いたブ ッ ク マー ク にテキス ト を挿入 し ます。 o1.ActiveDocument.Bookmarks.item("End").Select o1.Selection.typetext("Farewell!") // 文書を保存 し 、 サーバを シ ャ ッ ト ダウン し ます。 o1.ActiveDocument.Save() o1.quit() RETURN Microsoft Word の 旧 バ ー ジ ョ ン で は、 word.application の か わ り に word.basic を使用 し て く だ さ い。以下の コ マ ン ド は、Microsoft Word バー ジ ョ ン 7.0 の OLE イ ン タ フ ェース (word.basic) に関連付け を行い、 文 書を開 き 、 ブ ッ ク マー ク の位置ま で移動 し 、 指定 さ れた テ キ ス ト を挿 入 し ます。 336 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 myoleobject.ConnectToNewObject("word.basic") myoleobject.fileopen("c:¥temp¥letter1.doc") myoleobject.editgoto("NameAddress") myoleobject.Insert(" 挿入する テキス ト ") 修飾子 と し て word.application や word.basic (ConnectToNewObject 関数 の ク ラ ス) は付け ません。 // 不適切な コ マ ン ド 修飾子 myoleobject.word.basic.editgoto("NameAddress") Microsoft Word バージ ョ ン 7.0 の使用上の注意 OLEObject 変数では、word.basic がサーバ アプ リ ケーシ ョ ン Word バー ジ ョ ン 7.0 の ク ラ ス 名 と な り ま す。 一方、 コ ン ト ロ ール内のオブジ ェ ク ト では、 application.wordbasic 修飾子を使用 し てオブジ ェ ク ト の階層 構造を ど の よ う に移動 し て目的の wordbasic オブジ ェ ク ト にア ク セ ス す る のか を、 Word に知 ら せなければな り ません。 サーバ と の関連付けの 解除およびシ ャ ッ ト ダ ウン オー ト メ ーシ ョ ン と と も にアプ リ ケーシ ョ ン を終了 し た ら 、 明示的に サーバに終了を知 ら せ る 必要があ り ます。 ま た、 サーバ と の関連付け を解除 し て、 オブジ ェ ク ト の メ モ リ を解放す る 必要があ り ます。 myoleobject.Quit() rtncode = myoleobject.DisconnectObject() DESTROY myoleobject ガベージ コ レ ク シ ョ ン を使っ て OLEObject 変数を破棄で き ます。 OLEObject 変数を破棄すれば、 サーバ と の関連付け を自動的に解除 し ます。 ガ ベ ー ジ コ レ ク シ ョ ン を 使 っ て 解 除 す る 方 を お 勧 め し ま す が、 OLEObject 変数が使用 し て い る メ モ リ を た だ ち に解放 し た い場合で、 さ ら に メ モ リ がアプ リ ケーシ ョ ン のほかの部分で使用 し ていない こ と が明 ら かな場合は、 上記の ス ク リ プ ト で も 示 さ れてい る よ う に、 明示 的に関連付け を解除す る か、 OLEObject 変数を破棄 し て関連付け を解 除で き ます。 詳細については、 49 ページの 「ガベージ コ レ ク シ ョ ン と メ モ リ 管理」 を参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 337 プ ログ ラ ム可能な OLE オブ ジ ェ ク ト OLEControl、 OLECustomControl、 OLEObject データ 型の代入 OLEObject 変数に OLE コ ン ト ロ ール (OLEControl オブジ ェ ク ト デー タ 型) や ActiveX コ ン ト ロ ール (OLECustomControl オブジ ェ ク ト デー タ 型) を直接代入す る こ と はで き ません。 コ ン ト ロ ールのベン ダがプ ロ グ ラ ム識別子 (vendor.application の形式) を エ ク ス ポーズ し てい る 場合は、ConnectToNewObject 関数で こ の識別子 を指定す る こ と で、 ビ ジ ュ アル コ ン ト ロ ールを使用せずに、 プ ロ グ ラ ム可能な イ ン タ フ ェ ース に接続で き ます。 し か し 、 ActiveX コ ン ト ロ ー ルでは、 こ のテ ク ニ ッ ク を使用す る と ActiveX コ ン ト ロ ールの イ ベン ト が使用で き な く な り ます。 ActiveX コ ン ト ロ ールでは、 こ の よ う な使 用法を考慮 し てい ません し 、 ほ と ん ど の場合は役に立ち ません。 OLE コ ン ト ロ ールの Object プ ロ パテ ィ の値を OLEObject 変数に代入 し た り 、関数の中で OLEObject 型 と し て使用 し た り す る こ と がで き ます。 た と えば、 ウ ィ ン ド ウ に OLEControl の ole_1 と OLECustomControl の ole_2 があ り 、 次の よ う に変数を宣言 し た と し ます。 OLEObject oleobj_automate こ の場合、 以下の よ う に代入で き ます。 oleobj_automate = ole_1.Object oleobj_automate = ole_2.Object OLE コ ン ト ロ ールの OLEObject プ ロ パ テ ィ は読み出 し 専用 な の で、 OLEObject 型のオブジ ェ ク ト を代入す る こ と はで き ま せん。 以下の よ う な代入はで き ません。 ole_1.Object = oleobj_automate // エ ラ ー ! OLEObject のイ ベン ト OLEObject を継承す る ユーザ オブジ ェ ク ト を作成 し て、 OLEObject の イ ベン ト が実装で き ま す。 PowerScript の SetAutomationPointer 関数は、 OLE オー ト メ ーシ ョ ン を使用で き る よ う に、 OLE のオー ト メ ーシ ョ ン ポ イ ン タ を子孫オブジ ェ ク ト に割 り 当て ます。 oleobjectchild は、 OLEObject の子孫オブジ ェ ク ト で、 ExternalException や Error な ど の イ ベン ト を実装す る も の と し ま す。 以下に示す コ ー ド は、 OLEObject と oleobjectchild の イ ン ス タ ン ス (OLEObject の子孫 と な る ユーザ オブジ ェ ク ト ) を作成 し 、 Excel に接続 し てか ら オー ト メ ー シ ョ ン ポ イ ン タ を oleobjectchild に割 り 当て ます。 OLEObject ole1 oleobjectchild oleChild ole1 = CREATE OLEObject ole1.ConnectToNewObject( "Excel.Application") 338 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 oleChild = CREATE oleobjectchild oleChild.SetAutomationPointer( ole1 ) こ れで、 オー ト メ ーシ ョ ン で olechild を使用で き ます。 オート メ ーシ ョ ン オー ト メ ーシ ョ ン に関す る 各手順は、 単一の ス ク リ プ ト の中に含ま れ ていた り 、 ウ ィ ン ド ウ 上のい く つかの コ ン ト ロ ールのア ク シ ョ ン に分 離 さ れていた り し ます。 エ ン ド ユーザを オー ト メ ーシ ョ ンに よ る 処理 に関与 さ せたい場合は、 以下の よ う に し ます。 • OLE オブジ ェ ク ト を ウ ィ ン ド ウ の イ ン ス タ ン ス変数 と し て宣言す る • その変数の イ ン ス タ ン ス を作成 し 、 ウ ィ ン ド ウ の Open イ ベン ト で サーバ と の関連付け を行 う • エ ン ド ユーザに よ る リ ス ト ボ ッ ク ス か ら の選択やエデ ィ ッ ト ボ ッ ク スへの入力に応答 し て、 サーバに コ マ ン ド を送 る • ウ ィ ン ド ウ の Close イ ベン ト で、 サーバ と の関連付け を解除 し 、 そ の イ ン ス タ ン ス を破棄す る エ ン ド ユーザを オー ト メ ーシ ョ ン に関与 さ せた く ない場合は、 すべて の処理を単一の ス ク リ プ ト で行い ます。 例 :OLE を使用 し た レ タ ー フ ォ ームの生成 こ の例で は、 Microsoft Word で VBA ス ク リ プ テ ィ ン グ を 使用 し て、 デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト か ら 名前 と 住所 を、 マルチ ラ イ ン エ デ ィ ッ ト か ら 手紙の本文を取 り 込み、 手紙の作成 と 印刷を行い ます。 v レ タ ー フ ォ ームの例を セ ッ ト ア ッ プするには 1 4 つのブ ッ ク マー ク があ る CONTACT.DOC と い う 名前の Word 文 書を作成 し 、 PowerBuilder デ ィ レ ク ト リ に保存 し ます。 ブ ッ ク マー ク は次の と お り です。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク • name1 – 受取人の名前 • name2 – あい さ つ文に入れ る 名前 • address1 – 受取人の住所 (番地、 市、 県、 郵便番号) • body – 手紙の本文 339 プ ログ ラ ム可能な OLE オブ ジ ェ ク ト 手紙の本文は次の と お り です。 Multimedia Promotions, Inc. 1234 Technology Drive Westboro, Massachusetts January 12, 2001 [bookmark name1] [bookmark address1] Dear [bookmark name2]: [bookmark body] Sincerely, Harry Mogul President 会社名や自筆サ イ ン の ロ ゴ な ど を付け て、 手紙の形式を充実 さ せ る こ と も で き ま す。 重要な項目は、 ブ ッ ク マー ク の名前 と 位置で す。 2 PowerBuilder では、d_maillist と い う デー タ ウ ィ ン ド ウ オブジ ェ ク ト を定義 し ま す。 こ のデー タ ウ ィ ン ド ウ オブジ ェ ク ト には、 以下の カ ラ ム があ り ます。 id first_name last_name street city state zip デー タ ウ ィ ン ド ウ オ ブ ジ ェ ク ト に検索引数の指定 ダ イ ア ロ グ ボ ッ ク ス を表示 し て、 エ ン ド ユーザが手紙を受け取 る 顧客を選択 で き る よ う に し ます。 340 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 3 dw_mail と い う デー タ ウ ィ ン ド ウ コ ン ト ロ ール、 mle_body と い う マルチ ラ イ ン エデ ィ ッ ト 、 お よ び コ マ ン ド ボ タ ンや ピ ク チ ャ ボ タ ン な ど を含む ウ ィ ン ド ウ を定義 し ます。 4 デー タ ウ ィ ン ド ウ オブジ ェ ク ト d_maillist を デー タ ウ ィ ン ド ウ コ ン ト ロ ール dw_mail に割 り 当て ます。 5 デー タ ベース と 接続 し 、 デー タ をデー タ ウ ィ ン ド ウ オブジ ェ ク ト に読み取 る ス ク リ プ ト を ウ ィ ン ド ウ の Open イ ベン ト に記述 し ま す。 以下の コ ー ド は、 Adaptive Server Anywhere デー タ ベース と の 接続を行い ま す。 その ウ ィ ン ド ウ が大規模な アプ リ ケーシ ョ ン の 一部の場合、 通常、 こ の接続はアプ リ ケーシ ョ ンの Open イ ベン ト に対す る ス ク リ プ ト で行われ ます。 /************************************************** ト ラ ンザク シ ョ ン オブ ジ ェ ク ト を INI フ ァ イルか ら セ ッ ト ア ッ プ し ます。 **************************************************/ SQLCA.DBMS=ProfileString("myapp.ini", & "Database", "DBMS", " ") SQLCA.DbParm=ProfileString("myapp.ini", & "Database", "DbParm", " ") /************************************************** デー タ ベース と 接続 し 、 その接続が正常かど う かを テ ス ト し ます。 **************************************************/ CONNECT USING SQLCA; IF SQLCA.SQLCode <> 0 THEN MessageBox(" 接続が失敗 し ま し た ", " デー タ ベースに " & + " 接続で き ません " + SQLCA.SQLErrText) RETURN ア プ リ ケーシ ョ ン テ ク ニ ッ ク 341 プ ログ ラ ム可能な OLE オブ ジ ェ ク ト END IF /************************************************** ト ラ ンザク シ ョ ン オブ ジ ェ ク ト をデー タ ウ ィ ン ド ウ コ ン ト ロール に対 し て設定 し 、 デー タ を検索 し ます。 **************************************************/ dw_mail.SetTransObject(SQLCA) dw_mail.Retrieve() 6 [Generate Letters] ボ タ ンに対す る ス ク リ プ ト を記述 し ます (ス ク リ プ ト については以下を参照)。 ス ク リ プ ト で、 以下の作業をすべて行い ます。 • OLEObject 変数を作成す る • サーバ アプリ ケーショ ン (word.application)と の関連付けを 行う • デー タ ウ ィ ン ド ウ オブジ ェ ク ト の各行に対 し て手紙を 1 通生 成す る そのために、 VBA 文を使用 し て表 18-5 の作業を実行す る 表 18-5: ス ク リ プ ト の作業 VBA 文 Open goto と typetext goto と typetext printout close 7 作業 ブ ッ ク マー ク を備えた文書を開 く デー タ ウ ィ ン ド ウ オブジ ェ ク ト の行か ら 名 前 と 住所 を抽出 し 、 それ を手紙内の適切な 位置に挿入する エン ド ユーザが mle_body に入力 し たテ キ ス ト を手紙に挿入する 手紙を印刷する 手紙文書を保存せずに閉 じ る • サーバ アプ リ ケーシ ョ ン と の関連付け を解除す る • OLEObject 変数を破棄す る [Close] ボ タ ン に対 し て ス ク リ プ ト を記述 し ます。 こ こ で必要な コ マ ン ド は次の 1 行だけです。 Close(Parent) レ タ ー フ ォ ームを生 成する ス ク リ プ ト 以下の ス ク リ プ ト で、 レ タ ー フ ォ ーム の生成 と 印刷を行い ます。 OLEObject contact_ltr integer result, n string ls_name, ls_addr /*************************************************** OLEObject 変数に メ モ リ を割 り 当て ます。 342 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 ***************************************************/ contact_ltr = CREATE oleObject /*************************************************** サーバ と の関連付け を行い、 エ ラ ーを チ ェ ッ ク し ます。 ***************************************************/ result = & contact_ltr.ConnectToNewObject("word.application") IF result <> 0 THEN DESTROY contact_ltr MessageBox("OLE エ ラ ー ", & "Microsoft Word に接続で き ません " & + " コー ド : " & + String(result)) RETURN END IF /*************************************************** デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト の各行で、 Word に顧客デー タ を送 り 、 手紙を印刷 し ます。 ***************************************************/ FOR n = 1 to dw_mail.RowCount() /************************************************ ブ ッ ク マー ク がある文書を開き ます。 ************************************************/ contact_ltr.documents.open("c:¥pb9¥contact.doc") /************************************************ 名字 と 名前を 1 つの文字列に し て、 Word の name1 と name2 の各ブ ッ ク マー ク に挿入 し ます。 ************************************************/ ls_name = dw_mail.GetItemString(n, "first_name")& + " " + dw_mail.GetItemString(n, "last_name") contact_ltr.Selection.goto("name1") contact_ltr.Selection.typetext(ls_name) contact_ltr.Selection.goto("name2") contact_ltr.Selection.typetext(ls_name) /************************************************ 住所を 1 つの文字列に し て、 Word の address1 の ブ ッ ク マー ク に挿入 し ます。 ************************************************/ ls_addr = dw_mail.GetItemString(n, "street") & + "~r~n" & + dw_mail.GetItemString(n, "city") & + ", " & + dw_mail.GetItemString(n, "state") & + " " & + dw_mail.GetItemString(n, "zip") ア プ リ ケーシ ョ ン テ ク ニ ッ ク 343 ス ク リ プ ト における OLE オブ ジ ェ ク ト contact_ltr.Selection.goto("address1") contact_ltr.Selection.typetext(ls_addr) /************************************************ 手紙本文のテキス ト を Word の body ブ ッ ク マー ク に挿入 し ます。 ***********************************************/ contact_ltr.Selection.goto("body") contact_ltr.Selection.typetext(mle_body.Text) /************************************************ 手紙を印刷 し ます。 ************************************************/ contact_ltr.Application.printout() /************************************************ こ の文書を保存せずに閉 じ ます。 ************************************************/ contact_ltr.Documents.close contact_ltr.quit() NEXT /*************************************************** サーバ と の関連付けを解除 し 、 OLEObject 変数の メ モ リ を解放 し ます。 ***************************************************/ contact_ltr.DisconnectObject() DESTROY contact_ltr 例の実行 例を実行す る には、 アプ リ ケーシ ョ ン オブジ ェ ク ト の ス ク リ プ ト に、 ウ ィ ン ド ウ を開 く ための記述をす る か、 パ ワ ーバーの [実行] ボ タ ン を ク リ ッ ク し ます。 アプ リ ケーシ ョ ンが ウ ィ ン ド ウ を開けば、 エ ン ド ユーザは検索引数を 指定 し て、 手紙を受け取 る 顧客を選択で き ます。 ま た、 手紙本文のテ キ ス ト を マルチ ラ イ ン エデ ィ ッ ト に入力 し た ら 、 [Generate Letters] ボ タ ン を ク リ ッ ク し て、 選択 し た各顧客への手紙を印刷す る こ と がで き ます。 ス ク リ プ ト における OLE オブ ジ ェ ク ト こ の章では、 ウ ィ ン ド ウ やユーザ オブジ ェ ク ト において、 以下の OLE の 3 つの使用方法について説明 し ま し た。 学習 し た内容は以下の と お り です。 344 • OLE コ ン ト ロ ールへのオブジ ェ ク ト の挿入 • OLE カ ス タ ム コ ン ト ロ ールへの ActiveX コ ン ト ロ ールの配置 • OLEObject 変数の宣言 と 、 OLE オブジ ェ ク ト への関連付け PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 ス ク リ プ ト では、 OLE オー ト メ ーシ ョ ン を使用 し て、 プ ロ パテ ィ 値の 取得や設定、 OLE サーバで定義 さ れてい る 関数の呼び出 し な ど のオブ ジ ェ ク ト の操作がで き ます。 前節では、 オー ト メ ーシ ョ ン の コ マ ン ド の例が紹介 さ れてい ま す。 次の節では、 PowerBuilder におけ る オー ト メ ーシ ョ ンの イ ン タ フ ェース について詳 し く 説明 し ます。 オート メ ーシ ョ ン のイ ン タ フ ェ ース PowerBuilder では、 OLEObject 変数が、 OLE サーバや ActiveX コ ン ト ロ ール への イ ン タ フ ェ ー ス と な り ま す。 OLEObject 変数を宣言 し て、 OLE オブジ ェ ク ト と の関連付け を行い、 変数に ド ッ ト (.) 表記を使用 し て、 サーバへ指示を送 る こ と がで き ます。 その指示に よ っ て、 プ ロ パテ ィ 値の取得や設定、 関数の呼び出 し がで き ます。 OLEObject 変数の一般的なオー ト メ ーシ ョ ン構文は、 次の と お り です。 oleobjectvar.serverinstruction OLE コ ン ト ロ ールでは、 Object プ ロ パテ ィ が、 OLE サーバや ActiveX コ ン ト ロ ールへの イ ン タ フ ェ ー ス です。 Object プ ロ パテ ィ のデー タ 型 は、 OLEObject 型です。 OLE コ ン ト ロ ールの一般的なオー ト メ ーシ ョ ン構文は、 次の と お り で す。 olecontrol.Object.serverinstruction OLE サーバへの コ マ ン ド を記述 し たス ク リ プ ト の コ ンパイル PowerBuilder コ ンパ イ ラ では、 サーバの コ マ ン ド セ ッ ト を認識で き な いので、 OLEObject 変数に対 し て コ ン ト ロ ールの Object プ ロ パテ ィ と メ ソ ッ ド を指定 し た ス ク リ プ ト を コ ンパ イ ルす る 際に、 Object プ ロ パ テ ィ の次に続 く コ マ ン ド はチ ェ ッ ク さ れ ません。 実行時のエ ラ ーを回 避す る には、 構文が正 し く なければな り ません。 アプ リ ケーシ ョ ンの実行テ ス ト を行っ て、 サーバ アプ リ ケーシ ョ ンの コ マ ン ド が正 し い こ と を確認 し て く だ さ い。 OLE サーバがサポー ト する も の サーバの コ マ ン ド には、 プ ロ パテ ィ と メ ソ ッ ド (関数 と イ ベン ト ) が あ り ます。 OLE サーバ アプ リ ケーシ ョ ンには、オー ト メ ーシ ョ ン をサポー ト す る コ マ ン ド が用意 さ れて い ま す。 詳細につい ては、 OLE サーバ ア プ リ ケーシ ョ ンのマニ ュ アルを参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 345 ス ク リ プ ト における OLE オブ ジ ェ ク ト OLE カ ス タ ム コ ン ト ロ ール と プ ロ グ ラ ム可能な OLE オブジ ェ ク ト に つい て は、 PowerBuilder の オ ブ ジ ェ ク ト ブ ラ ウ ザで プ ロ パ テ ィ と メ ソ ッ ド の リ ス ト を参照で き ます。オブジ ェ ク ト ブ ラ ウ ザにおけ る OLE 情報についての詳細は、364 ページの「オブジ ェ ク ト ブ ラ ウ ザでの OLE 情報」 を参照 し て く だ さ い。 プ ロパテ ィ の設定 以下の構文を使用す る と 、 OLE コ ン ト ロ ールの Object プ ロ パテ ィ を介 し て OLE コ ン ト ロ ールのプ ロ パテ ィ にア ク セ ス で き ます。 olecontrolname.Object.{ serverqualifiers.}propertyname OLE オブジェ ク ト の階層構造が複雑な場合は、そのオブジェ ク ト の中に さ ら にネス ト し たオブジェ ク ト やプロ パティ がある 場合があ り ま す。 た と えば、 Excel ス プ レ ッ ド シー ト オブジ ェ ク ト に対す る 以下の コ マ ン ド は、 そのオブジ ェ ク ト を ア ク テ ィ ブ化 し 、 セルの value プ ロ パテ ィ を設定 し ます。 double value ole_1.Activate(InPlace!) ole_1.Object.cells(1.1).value ole_1.Object.cells(2.2).value ole_1.Object.cells(3.3).value ole_1.Object.cells(4.4).value = = = = 55 66 77 88 Excel バージ ョ ン 95 の ス プ レ ッ ド シー ト の場合は、 セルの行 と 列の引 数を大カ ッ コ でな く カ ッ コ で囲み ます。 た と えば、 次の よ う にな り ま す。 ole_1.Object.cells(1,1).value = 55 OLEObject 変数を使用 し てプ ロ パテ ィ を指定す る 場合は、 サーバ修飾 子 と サーバのプ ロ パテ ィ 名が OLEObject 変数の後ろに続 き ます。 oleobjectvar.{ serverqualifiers.}propertyname サーバ修飾子は、 オブジ ェ ク ト と の関連付け を行 う 方法に応 じ て指定 す る 必要があ り ます。 詳細については、 350 ページの 「サーバ コ マ ン ド の修飾子」 を参照 し て く だ さ い。 関数の呼び出 し 以下の構文は、 OLE コ ン ト ロ ールの Object プ ロ パ テ ィ を 使用 し て、 サーバの関数を呼び出す こ と がで き ます。 olecontrolname.Object.{ serverqualifiers.}functionname ( { arguments } ) 346 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 OLE オブジ ェ ク ト の階層構造が複雑な場合は、 そのオブジ ェ ク ト の中 に さ ら に ネ ス ト し た オ ブ ジ ェ ク ト やプ ロ パ テ ィ が あ る 場合が あ り ま す。 カ ッ コ について PowerScript では、 サーバに対す る コ マ ン ド を プ ロ パテ ィ の設定か関数 の ど ち ら か と みな し ます。 メ ソ ッ ド を プ ロ パテ ィ の設定 と 識別す る た めに、 メ ソ ッ ド 名に続 く パ ラ メ ー タ を カ ッ コ で囲む必要が あ り ま す。 パ ラ メ ー タ がない場合で も 、 空のカ ッ コ を付加 し ます。 引数 と 戻 り 値のデー タ 型 PowerBuilder は、 OLE デー タ を PowerBuilder と 互換性のあ る デー タ 型 に変換 し ます。 引数に指定 し た値のデー タ 型は、 OLE サーバで期待 さ れてい る デー タ 型 と の互換性が必要ですが、 デー タ 型が一致す る 必要 はあ り ません。 関数が戻 り 値を返す と き 、 戻 り 値を互換性のあ る デー タ 型の変数に代 入す る こ と がで き ます。 引数の参照渡 し OLE サーバが値を ス ク リ プ ト に渡 し て返す こ と がで き る よ う に、 引数 の参照渡 し を要求す る 場合は、 引数の前に REF キー ワ ー ド を指定 し ま す。 以下の よ う に、 外部関数におけ る 宣言で使用す る REF キー ワー ド と 似てい ます。 olecontrol.Object.functionname ( REF argname ) 以下の例では、 ls_string 引数 と li_return 引数が参照渡 し さ れてい る の で、 サーバで値を変更す る こ と がで き ます。 string ls_string integer li_return ole_1.Object.testfunc(REF ls_string, REF li_return) 以下の例では、 OLEObject 変数を使用 し て、 同 じ 関数の呼び出 し を行 い ます。 OLEObject ole_obj ole_obj = CREATE OLEObject ole_obj.ConnectToNewObject("servername") ole_obj.testfunc(REF ls_string, REF li_return) タ イムアウ ト 時間の設定 PowerBuilder ク ラ イ ア ン ト か ら サーバへの呼び出 し は 5 分間で タ イ ム ア ウ ト にな り ます。特定の OLE リ ク エ ス ト に も っ と 長い時間を かけた い場合、PowerScript の SetAutomationTimeout 関数を使用 し てデフ ォ ル ト の タ イ ム ア ウ ト 時間を変更で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 347 ス ク リ プ ト における OLE オブ ジ ェ ク ト Word と オー ト メ ー ション Microsoft Word バージ ョ ン 6.0 と 7.0 は、 WordBasic のマ ク ロ 言語に似 た コ マ ン ド セ ッ ト に よ っ てオー ト メ ーシ ョ ン を サポー ト し てい ま す。 こ の コ マ ン ド セ ッ ト には、 ス テー ト メ ン ト と 関数の両方が含まれ、 名 前の付いたパ ラ メ ー タ を使用で き ます。 Microsoft Word バージ ョ ン 7.0 よ り 後のバージ ョ ン では Visual Basic for Applications (VBA) を使用 し てお り 、 オブジ ェ ク ト の階層構造は、 特定の一連の メ ソ ッ ド と プ ロ パ テ ィ を エ ク ス ポーズ し ます。 WordBasic には、 ス テー ト メ ン ト と 関数が あ り ます。 ス テー ト メ ン ト と 関数の う ちのい く つかは、 同 じ 名前です。 WordBasic 構文は ス テー ト メ ン ト と 関数の呼び出 し に違いが あ り ま す が、 PowerBuilder にはあ り ません。 WordBasic ス テー ト メ ン ト ス テ ー ト メ ン ト の 呼び出 し を 指定す る 場合 は、 引数 に AsStatement! (OLEFunctionCallType カタ ロ グ データ 型の値) を 渡すこ と ができ ま す。関 数と 同じ 名前の WordBasic ス テート メ ン ト を 呼び出すには、 AsStatement! を使用す る 以外、 方法はあ り ません。 ス テー ト メ ン ト と 関数の名前が 異な っ ていて も 、 AsStatement! を指定 し た方が、 効率的です。 olecontrol.Object.application.wordbasic.statementname ( argumentlist, AsStatement! ) た と えば、 以下の コ ー ド では、 AppMinimize ス テー ト メ ン ト を呼び出 し てい ます。 ole_1.Object.application.wordbasic. & AppMinimize("",1,AsStatement!) 名前の付いたパ ラ メ ー タ PowerBuilder では、WordBasic と Visual Basic の 名前の付いたパ ラ メ ー タ を サポー ト し ません。 カ ッ コ の中には、 パ ラ メ ー タ の名前ではな く 、 値だけ を指定 し ます。 た と えば、 以下の ス テー ト メ ン ト は、 Word バージ ョ ン 6.0 ま たは 7.0 の文書中のブ ッ ク マー ク にテ キ ス ト を挿入 し ます。 ole_1.Activate(InPlace!) Clipboard(mle_nameandaddress.Text) ole_1.Object.application.wordbasic.& fileopen("c:¥msoffice¥winword¥doc1.doc") ole_1.Object.application.wordbasic.& editgoto("NameandAddress", AsStatement!) ole_1.Object.application.wordbasic.& editpaste(1, AsStatement!) 最後の 2 行の コ マ ン ド は、 WordBasic マ ク ロ では以下の よ う に記述 さ れます。 Destination は、 名前の付いたパ ラ メ ー タ です。 EditGoto.Destination = "NameandAddress" EditPaste 348 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 PowerBuilder の ス ク リ プ ト では、 Word バージ ョ ン 97 ま たはそれ以降 の文書にテ キ ス ト を挿入す る ためには、次の よ う な構文を使用 し ます。 ole_1.Object.Selection.TypeText(" こ のテキス ト を挿入 し ます。 ") 対応す る Visual Basic ス テー ト メ ン ト では、Text と い う 名前が付いたパ ラ メ ー タ に、 挿入す る 文字列を代入 し ます。 Selection.TypeText Text:=" こ のテキス ト を挿入 し ます。 " オー ト メ ーシ ョ ンはマ ク ロ プ ログ ラ ミ ングではあ り ません 変数を宣言 し た り 、 実行の流れを制御す る コ マ ン ド (IF THEN 文な ど) をサーバ アプ リ ケーシ ョ ン に送 る こ と はで き ません。 オー ト メ ーシ ョ ンは、 ほかの コ マ ン ド と は独立 し て、 一度に 1 つずつ コ マ ン ド を実行 し ま す。 プ ロ グ ラ ム の流れ を 制御す る には、 PowerScript の条件文や ループ文を使用 し ます。 PowerScript と サーバ コ マ ン ド を組み合わ せて使用す る 方法について説明 し ます。以下の ス ク リ プ ト は、Microsoft Word の OLE オブ ジ ェ ク ト の中に あ る ブ ッ ク マー ク の個数 を数え て、 ブ ッ ク マー ク の名前を表示 し ます。 Word オー ト メ ーシ ョ ンの例 integer i, count string bookmarklist, curr_bookmark ole_1.Activate(InPlace!) count = ole_1.Object.Bookmarks.Count bookmarklist = "Bookmarks = " + String(count) + "~n" FOR i = 1 to count curr_bookmark = ole_1.Object.Bookmarks[i].Name bookmarklist = bookmarklist + curr_bookmark + "~n" END FOR MessageBox(" ブ ッ ク マー ク ", bookmarklist) Word オー ト メ ーシ ョ ンに関する参考事項 Word オー ト メ ーシ ョ ン に正 し い構文 を用いて い る か ど う か を チ ェ ッ ク す る には、 Word マ ク ロ エデ ィ タ が使用で き ます。 Word でマ ク ロ 記 録を開始 し 、 ス ク リ プ ト で自動化 し たい手順を実行 し 、 その後マ ク ロ 記録を終了 し ます。 マ ク ロ エデ ィ タ を開いて作成 さ れた構文を調べ る には、 〔Alt〕 + 〔F11〕 を押 し ます。 PowerBuilder では、 大カ ッ コ を配列 イ ンデ ッ ク ス に使用 し てい る こ と に注意 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 349 ス ク リ プ ト における OLE オブ ジ ェ ク ト 次に示すス ク リ プト では、Microsoft Word バージ ョ ン 6.0 と 7.0 の OLE オブジ ェ ク ト 中にあ る ブ ッ ク マー ク の個数を数え て、 ブ ッ ク マー ク の名前を表示 し ます。 Word バージ ョ ン 6.0 と 7.0 のオー ト メ ーシ ョ ンの例 integer i, count string bookmarklist, curr_bookmark ole_1.Activate(InPlace!) // ブ ッ ク マー クの個数を取得 し ます。 count = ole_1.Object. & & application.wordbasic.countbookmarks bookmarklist = "Bookmarks = " + String(count) + "~n" // 各ブ ッ ク マー クの名前を取得 し ます。 FOR i = 1 to count curr_bookmark = ole_1.Object. & & application.wordbasic.bookmarkname(i) bookmarklist = bookmarklist + curr_bookmark + "~n" END FOR MessageBox(" ブ ッ ク マー ク ", bookmarklist) サーバ コ マ ン ド の修飾子 サーバ コ マ ン ド にアプ リ ケーシ ョ ン名を付け て修飾す る か ど う かは、 サーバ と 、 オブジ ェ ク ト が関連付け ら れてい る 形式に よ っ て決ま り ま す。 各サーバは、 オブジ ェ ク ト の階層構造を独自のバージ ョ ン で実現 し て い る ため、 それ を コ マ ン ド の構文に反映 さ せ る 必要が あ り ま す。 た と えば、 Microsoft Excel におけ る オブジ ェ ク ト の階層構造は図 18-2 の よ う にな っ てい ます。 図 18-2: Microsoft Excel のオブ ジ ェ ク ト 階層 サーバが Excel の場合、 以下の コ マ ン ド は同 じ 意味を持っ てい る よ う に見え ま すが、 実行結果は異な り ます。 Microsoft Excel バージ ョ ン 95 の場合、 セルの行 と 列の引数には、 大カ ッ コ でな く カ ッ コ を用い ます。 350 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 ole_1.Object.cells(1.2).value = 55 ole_1.Object.cells[1,2].value = 55 最初の ス テー ト メ ン ト は、 ア ク テ ィ ブな文書のセルを変更す る も ので す。 こ の ス テー ト メ ン ト では、 Excel におけ る オブジ ェ ク ト の階層構造 を アプ リ ケーシ ョ ン オブジ ェ ク ト ま で上っ てか ら 、 開いてい る シー ト に下 り て き ます。その開いてい る シー ト が、PowerBuilder の コ ン ト ロ ー ル上の文書 と 同 じ も のか ど う かは問題に し ま せん。 エ ン ド ユーザが Excel に移行 し て別のシー ト を ア ク テ ィ ブ化す る と 、 ス ク リ プ ト は、 コ ン ト ロ ール上の文書ではな く そのシー ト を変更 し て し ま い ます。 し た がっ て、 こ の構文は使用すべ き ではあ り ません。 2 番目の ス テー ト メ ン ト は、PowerBuilder の コ ン ト ロ ール上の文書に対 し てだけ作用 し ます。 ただ し 、 その文書がア ク テ ィ ブ化 さ れていない と 、 実行時エ ラ ーを起 こ し て し ま い ます。 こ ち ら の ス テー ト メ ン ト の 方が、 別のデー タ に作用す る 危険がないだけ安全な構文 と いえ ます。 Microsoft Word バージ ョ ン 6.0 と 7.0 では、 アプ リ ケーシ ョ ンの階層構 造を独自に実現 し てい ま す。 そのため、 コ ン ト ロ ール上のオブジ ェ ク ト を操作す る と き には、 以下の よ う に修飾子 application.wordbasic を必 要 と し ます。 オブジ ェ ク ト はア ク テ ィ ブ化 し ておかなければな り ませ ん。 た と えば、 次の よ う にな り ます。 ole_1.Object.application.wordbasic.bookmarkname(i) Microsoft Word バージ ョ ン 7.0 よ り 後のバージ ョ ン では修飾子は必要あ り ません。 し か し 、 修飾子を指定 し て も 有効です。 以下のすべての構 文を使用で き ます。 ole_1.Object.Bookmarks.[i].Name ole_1.Object.Bookmarks.item(i).Name ole_1.Object.application.ActiveDocument. & Bookmarks.[i].Name コ ン ト ロ ール上のオブ ジ ェ ク ト ではな く 、 PowerBuilder の OLEObject オブジ ェ ク ト デー タ 型のデー タ を操作 し てい る と き は、 コ マ ン ド のア プ リ ケーシ ョ ン修飾子を省略 し ま す。 オブジ ェ ク ト を関連付け る と き に、 すでに指定 し てい る か ら です。 OLEObject オブジ ェ ク ト デー タ 型 についての詳細は、 334 ページの 「プ ロ グ ラ ム可能な OLE オブジ ェ ク ト 」 を参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 351 ス ク リ プ ト における OLE オブ ジ ェ ク ト オート メ ーシ ョ ン と Any 型 PowerBuilder は、 サーバ アプ リ ケーシ ョ ンの コ マ ン ド や関数を知 り ま せん。 し たが っ て、 ス ク リ プ ト を コ ンパ イ ルす る と き も サーバ関数の 戻 り 値やプ ロ パテ ィ のデー タ 型は認識 し ません。 プ ロ パテ ィ にア ク セ ス し 、 関数を呼び出す式には Any 型の変数を使用 し ま す。 Any 型の変 数にデー タ を代入すれば、 デー タ 型の変換エ ラ ーを回避で き ます。 実行時に、 デー タ が Any 型の変数に代入 さ れ る と 、 その変数は、 代入 さ れ たデー タ と 同 じ デー タ 型に転 じ ま す。 ClassName 関数 を 用い て、 Any 型の変数のデー タ 型を調べて、 適切な代入を行 う こ と がで き ます。 矛盾す る 代入を行 う と 、 実行時エ ラ ーが起 こ り ます。 不必要な Any 型は使用 し ないで く だ さ い サーバの関数が返すデー タ のデー タ 型がわか っ てい る 場合は、 Any 型 を使用 し ないで く だ さ い。 返 さ れたデー タ は、 正 し いデー タ 型に直接 代入 し て く だ さ い。 以下のサ ン プル コ ー ド は、 Excel か ら 読み込んだデー タ を、 そのデー タ に応 じ たデー タ 型の PowerBuilder 変数に代入 し ます。Excel バージ ョ ン 95 の場合、 セルの行 と 列の引数には、 大カ ッ コ でな く カ ッ コ を用い ます。 string stringval double dblval date dateval any anyval anyval = myoleobject.application.cells[1,1].value CHOOSE CASE ClassName(anyval) CASE "string" stringval = anyval CASE "double" dblval = anyval CASE "datetime" dateval = Date(anyval) END CHOOSE 352 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 効率的な OLEObjects 変数の使い方 オー ト メ ーシ ョ ンの コ マ ン ド にサーバ修飾子が複数あ る 場合、つま り 、 オブジ ェ ク ト の階層構造のネ ス ト が深い場合は、 オブジ ェ ク ト の階層 構造を た ど っ てオブジ ェ ク ト を参照す る ため、 アプ リ ケーシ ョ ン の実 行に時間がかか り ます。 オブジ ェ ク ト の階層構造の同 じ 部分を繰 り 返 し て参照す る 場合は、 そのオブジ ェ ク ト の参照部分を OLEObject 変数 に代入 し てお く と よ いで し ょ う 。 オブジ ェ ク ト の参照は一度だけ行わ れ、 その後はその参照が再利用 さ れます。 次の ス テー ト メ ン ト を プ ロ パテ ィ ご と に使用す る と 、 同 じ オブジ ェ ク ト を何度 も 参照す る こ と にな り ます。 ole_1.Object.application.wordbasic.propertyname OLEObject 変数に、 オブジ ェ ク ト の参照部分を代入 し た場合、 次の よ う にな り ます。 オブジ ェ ク ト の参照は一度だけですみます。 OLEObject ole_wordbasic ole_wordbasic = ole_1.Object.application.wordbasic ole_wordbasic.propertyname1 = value ole_wordbasic.propertyname2 = value 例 : オブ ジ ェ ク ト の参 照の解決 次の例は、 OLEObject 変数を使用 し て、 Microsoft Word のオブジ ェ ク ト を参照 し ます。 オブジ ェ ク ト が FOR ループ文で繰 り 返 し 参照 さ れてい ま す。 オ ブ ジ ェ ク ト の参照 を OLEObject 変数に代入す る こ と に よ っ て、そのオブジ ェ ク ト への参照は一度 し か行われ ません。 そのため、処 理が効率的にな り ま す。 例では、 OLEObject 変数が不要にな っ た と き に、 変数を破棄 し てい ます。 integer li_i, li_count string ls_curr_bookmark OLEObject ole_wb ole_1.Activate(InPlace!) ole_wb = ole_1.Object.application.wordbasic // ブ ッ ク マー クの個数を取得 し ます。 li_count = ole_wb.countbookmarks // 各ブ ッ ク マー クの名前を取得 し ます。 FOR li_i = 1 to count ls_curr_bookmark = ole_wb.bookmarkname(i) ...// リ ス ト にブ ッ ク マー ク の名前を保存する ためのコ ー ド END FOR ア プ リ ケーシ ョ ン テ ク ニ ッ ク 353 ス ク リ プ ト における OLE オブ ジ ェ ク ト エ ラ ー処理 PowerBuilder は、 OLE サーバが実行で き る オー ト メ ーシ ョ ン の構文を 知 ら ないので、 ス ク リ プ ト を コ ンパ イ ル し て も 、 OLE サーバのプ ロ パ テ ィ を参照す る ス テー ト メ ン ト はチ ェ ッ ク さ れ ません。 コ ンパ イ ラ は エ ラ ーをチ ェ ッ ク す る こ と がで き ないので、 OLE サーバが認識で き な いプ ロ パテ ィ や関数の名前お よ び引数を指定す る と 、 アプ リ ケーシ ョ ン を実行 し た と き に実行時エ ラ ーが起 き ます。 OLE エ ラ ー時のイ ベ ン ト の連鎖 OLE コ ン ト ロ ール ま たは OLE サーバに よ り エ ラ ーが発生 し た場合、以 下の順で PowerBuilder の イ ベン ト が連続 し て起動 さ れます。 1 組み込みエ ラ ー イ ベン ト を設定 し てい る ActiveX コ ン ト ロ ール に よ り エ ラ ー が発生 し た 場合、 PowerBuilder OLE コ ン ト ロ ール の ocx_event が起動 さ れ ます。 2 それ以外の場合は、 OLE オブジ ェ ク ト の ExternalException イ ベン ト が起動 さ れます。 3 ExternalException イ ベ ン ト に ス ク リ プ ト が記述 さ れ て い な い か、 ExternalException イ ベン ト の action 引数に ExceptionFail! (デフ ォ ル ト ) が設定 さ れてい る 場合は、 OLE オブジ ェ ク ト の Error イ ベン ト が起動 さ れ ます。 4 Error イ ベン ト に ス ク リ プ ト が記述 さ れていないか、Error イ ベン ト の action 引数に ExceptionFail! (デフ ォ ル ト ) が設定 さ れてい る 場合 は、RuntimeError ま たはその子孫オブジ ェ ク ト のア ク テ ィ ブな例外 ハン ド ラ が起動 さ れ ます。 5 例外ハ ン ド ラ が存在 し な い場合、 ま た は既存の例外ハ ン ド ラ に よ っ て例外が処理 さ れない場合は、 アプ リ ケーシ ョ ン オブジ ェ ク ト の SystemError イ ベン ト が発生 し ます。 6 SystemError イ ベン ト に ス ク リ プ ト が記述 さ れていない場合は、 ア プ リ ケーシ ョ ン の実行時エ ラ ーが起 こ り 、 アプ リ ケーシ ョ ン は終 了 し ます。 こ れら のど のイ ベン ト でも 、エラ ー処理ができ ま す。ま た、TRY-CATCH ブ ロ ッ ク を使用 し て ス ク リ プ ト 内で も エ ラ ーは処理で き ます。 し か し 、 SystemError イ ベ ン ト が起動 さ れた後 も 処理 を 継続す る こ と は よ く あ り ません。 例外処理についての詳細は、 42 ページの 「例外の処理」 を参照 し て く だ さ い。 OLE エ ラ ーのイ ベン ト 354 PowerBuilder の OLE オブジ ェ ク ト と OLE コ ン ト ロ ールには、 エ ラ ー 処理を行 う 2 つの イ ベン ト があ り ます。 それ ら の イ ベン ト は以下の と お り です。 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 OLE サーバ ま たは OLE コ ン ト ロ ール で、 例外処理や (ocx_error イ ベン ト がない場合の) エ ラ ー イ ベン ト が起 き た と き に起動 さ れ ます。 OLE サーバか ら 提供 さ れた情報 は、 エ ラ ーの診断に役立ち ます。 • ExternalException イ ベン ト • Error イ ベン ト 例外処理やエ ラ ー イ ベン ト を扱わない と き に起動 さ れ ます。 PowerBuilder のエ ラ ー情報は、 ス ク リ プ ト で使用で き ま す。 OLE コ ン ト ロ ールで組み込みエ ラ ー イ ベ ン ト を 設定 し て い る 場合、 PowerBuilder の OLE コ ン ト ロ ール コ ン テナは イ ベン ト を追加 し ます。 • OLE サーバで エ ラ ー イ ベ ン ト が発生 し た と き に起動 さ れ ます。 OLE サーバか ら 提供 さ れた情報は、 エ ラ ーの診断に役 立ち ます。 ocx_error OLE コ ン ト ロ ールの作成者は、 Microsoft Foundation Classes (MFC) ク ラ ス ウ ィ ザー ド を使用 し て コ ン ト ロ ールの組み込みエ ラ ー イ ベン ト を生成で き ます。 PowerBuilder での ocx_error イ ベン ト の引数は、 組み 込みエ ラ ー イ ベン ト に設定 さ れた引数にマ ッ プ し ます。 OLE エ ラ ーに対する 対応 PowerBuilder の OLE コ ン ト ロ ールに ocx_error イ ベン ト に対す る ス ク リ プ ト が記述 さ れてい る 場合、 イ ベン ト の引数か ら そのエ ラ ーに関す る 情報を取得 し て、 適切な対応を と る こ と がで き ます。 ocx_error の引 数の う ちの 1 つは、 Boolean 型の CancelDisplay です。 CancelDisplay に TRUE を設定すれば、 MFC のエ ラ ー メ ッ セージの表示を キ ャ ン セルで き ます。 ま た、 エ ラ ーについてのほかの表示を行 う こ と も で き ます。 ExternalException イ ベン ト と Error イ ベン ト の ど ち ら に対す る ス ク リ プ ト で も 、 action 引数を適切な ExceptionAction カ タ ロ グ デー タ 型の値に 設定 し ます。 ど の値を設定す る かは、 開発者が OLE エ ラ ーについて何 を知っ てお り 、OLE サーバ アプ リ ケーシ ョ ンの少ない情報を いかに う ま く 取 り 扱え る かに依存 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 355 ス ク リ プ ト における OLE オブ ジ ェ ク ト 表 18-6: ExceptionAction カ タ ログ デー タ 型の値 ExceptionAction 値 効果 ExceptionFail! ExceptionIgnore! イ ベ ン ト に ス ク リ プ ト が記述 さ れ て い な い場合 と 同 じ 。 エ ラ ーが発生す る と 、 エ ラ ー イ ベン ト の起動順位 に し たがっ て、 次のエ ラ ー イ ベン ト が起動 さ れ る エ ラ ーを無視 し て、 何 も エ ラ ーが発生 し なか っ た よ う に し て戻 る 注意 OLE サーバのプ ロ パテ ィ 値の取得や OLE 関数か ら の 戻 り 値が あ る 場合は、 異な る デー タ 型の代入が行われ る ために別のエ ラ ーが発生す る 可能性があ る ExceptionRetry! OLE サーバへ コ マ ン ド を再び送 る 。 OLE サーバの準備 がで き ていない場合に有効 注意 OLE サーバの関数名、プ ロ パテ ィ 名、引数の指定が誤っ てい る こ と がエ ラ ーの原因で あ る 場合、 何度 も 再試行 す る よ う に設定す る と 、 ア プ リ ケーシ ョ ン は無限ルー プに入 る 。 再試行の回数 を制限す る ため、 ア プ リ ケー シ ョ ンでカ ウ ン タ を設定す る こ と がで き る ExceptionSubstitute ReturnValue! OLE サーバが返す関数の戻 り 値やプ ロ パテ ィ 値のかわ り に、 returnvalue 引数に指定 し た値を使用 し て、 エ ラ ー を無視す る OLE サーバ を呼び出 し て、 returnvalue 引数に適切な値 を代入す る 前に、 ア プ リ ケーシ ョ ン を その ま ま 継続 し て も 問題な い値 を イ ン ス タ ン ス 変数に設定 し てお く 。 returnvalue 引数のデー タ 型は、Any 型であ る 。Any 型は、 すべてのデー タ 型のデー タ を代入で き る エ ラ ーが発生 し た後 も アプ リ ケーシ ョ ン を継続す る 場 合は、 OLE サーバが返す正 し く ない値のかわ り に、 有 効な値を使用す る ため安全であ る 例 :ExternalException イ ベン ト ocx_error イ ベン ト と 同様、 ExternalException イ ベン ト は、 OLE サーバ か ら のエ ラ ー情報を提供 し ます。 こ の情報は、 アプ リ ケーシ ョ ン をデ バ ッ グす る と き に役立ち ます。 た と えば、 ウ ィ ン ド ウ オブジ ェ ク ト に 2 つの イ ン ス タ ン ス変数があ る と し ます。 1 つは、 ExceptionAction 値を指定す る ための変数です。 も う 1 つは、 OLE サーバが返す値のかわ り の値を保持す る ための Any 型の 変数です。 OLE サーバのプ ロ パテ ィ にア ク セ スす る 前に、 適切な値を イ ン ス タ ン ス変数に設定 し ます。 356 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 ie_action = ExceptionSubstituteReturnValue! ia_substitute = 0 li_currentsetting = ole_1.Object.Value OLE コ マ ン ド が失敗 し た場合は、 ExternalException イ ベン ト に対す る ス ク リ プ ト で、OLE サーバに よ っ て指定 さ れたヘルプ ト ピ ッ ク が表示 さ れ ます。 そ し て ExternalException イ ベン ト は、 OLE サーバが返す値 のかわ り に、 準備 し て あ っ た値に置 き 換え ま す。 li_currentsetting 変数 への代入は、 と も に互換性のあ る デー タ 型なので、 正 し く 行われ ます。 string ls_context // WinHelp の コ ン テキス ト ID に切 り 替え る ための コ マ ン ド 行 ls_context = "-n " + String(helpcontext) IF Len(HelpFile) > 0 THEN Run("winhelp.exe " + ls_context + " " + HelpFile) END IF Action = ExceptionSubstituteReturnValue! ReturnValue = ia_substitute こ の イ ベン ト に対す る ス ク リ プ ト は、 すべてのオー ト メ ーシ ョ ン コ マ ン ド に対応 し なければな り ません。 各オー ト メ ーシ ョ ン コ マ ン ド の前 に、 イ ン ス タ ン ス変数に適切な値を設定す る 必要があ り ます。 Error イ ベン ト Error イ ベン ト は、 エ ラ ーが発生 し た と き の PowerBuilder の コ ン テ キ ス ト に関す る 情報を提供 し ます。 エ ラ ーの発生 し たオブジ ェ ク ト 名、 ス ク リ プ ト の内容、 エ ラ ーの発生 し た ス ク リ プ ト の行番号、 PowerBuilder のエ ラ ー番号、 エ ラ ー メ ッ セージな ど を取得す る こ と がで き ます。 こ の情報は、 アプ リ ケーシ ョ ン をデバ ッ グす る と き に役立ち ます。 Action 引数 と ReturnValue 引数の設定は、 ExternalException イ ベン ト と 同 じ よ う に Error イ ベン ト に も 適用 さ れます。 エ ラ ー処理を行 う ための イ ベン ト についての詳細は、 『PowerScript リ フ ァ レ ン ス 』 マニ ュ アルを参照 し て く だ さ い。 ホッ ト リ ン ク の作成 OLE サーバには、プロ パティ の変更通知を サポート する も のがあり ま す。 つま り 、 OLE サーバのプ ロ パテ ィ の変更直前 と 変更直後に、 OLE サー バは、 OLE コ ン ト ロ ールにプロ パティ の変更に関する 情報を 渡し て通知 し ま す。こ れら のメ ッ セージは、OLE コ ン ト ロ ールの PropertyRequestEdit イ ベン ト と PropertyChanged イ ベン ト を起動 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 357 ス ク リ プ ト における OLE オブ ジ ェ ク ト PropertyRequestEdit イ ベン ト OLE サーバのプ ロ パテ ィ の変更直前に、 PropertyRequestEdit イ ベン ト が起動 さ れ ます。 こ の イ ベン ト に対す る ス ク リ プ ト で、 以下の よ う な こ と が可能です。 • PropertyName 引数か ら 、 変更 さ れたプ ロ パテ ィ の名前がわか る • 古いプ ロ パテ ィ 値を取得 し て保存で き る プ ロ パテ ィ 値は ま だ変更 さ れていないので、 標準の構文を使用 し てその値にア ク セ ス で き る • PropertyChanged イ ベン ト CancelChange 引数の値を TRUE に変更 し て、 変更を キ ャ ン セルで きる プ ロ パテ ィ が変更 さ れた と き に、 PropertyChanged イ ベン ト が起動 さ れ ます。 こ の イ ベン ト に対す る ス ク リ プ ト で、 以下の よ う な こ と が可能 です。 • PropertyName 引数か ら 、 変更 さ れたプ ロ パテ ィ の名前がわか る • 新 し いプ ロ パテ ィ 値を取得す る プ ロ パテ ィ 値はすでに変更 さ れてい る ので、 その変更はキ ャ ン セ ルで き ない PropertyName 引数の 使い方 PropertyName 引数は、プ ロ パテ ィ の名前が戻 り ます。 し たが っ て、 ド ッ ト (.) 表記で使用 し て、 OLE サーバのプ ロ パテ ィ の値は取得で き ませ ん。 value = This.Object.PropertyName // プ ロパテ ィ 値は取得で き ません。 そのかわ り に、 CHOOSE CASE 文ま たは IF 文を使用 し て、 プ ロ パテ ィ 名を調べて、 そのプ ロ パテ ィ の値を取得で き ます。 た と えば、 PropertyChanged イ ベン ト 以下の ス ク リ プ ト では、 3 つのプ ロ パテ ィ 名を調べて、変更 さ れたプ ロ パテ ィ の新 し い値を取得 し ます。 プ ロ パテ ィ 値は、 適切なデー タ 型の変数に代入 し ます。 integer li_index, li_minvalue long ll_color CHOOSE CASE Lower(PropertyName) CASE "value" li_index = ole_1.Object.Value CASE "minvalue" li_minvalue = ole_1.Object.MinValue CASE "backgroundcolor" ll_color = ole_1.Object.BackgroundColor CASE ELSE 358 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 ...// そのほかの処理 END CHOOSE 大規模な変更が発生 し た場合 PropertyName 引数の値に空文字列 ("") が返 る 場合があ り ま す。 こ れ は、 も っ と 一般的な変更が発生 し た こ と を意味 し ます。 た と えば、 複 数のプ ロ パテ ィ に影響す る 変更が発生 し た こ と を意味 し ます。 プ ロパテ ィ 通知がサ ポー ト さ れない場合 OLE サーバが プ ロ パ テ ィ の変更通知 を サ ポー ト し て い な い場合は、 PropertyRequestEdit イ ベン ト と PropertyChanged イ ベン ト は起動 さ れな いので、それ ら の イ ベン ト に記述 さ れた ス ク リ プ ト は実行 さ れ ません。 OLE サーバがプ ロ パテ ィ の変更通知を サポー ト し てい る か ど う かは、 OLE サーバのマニ ュ アルを調べて く だ さ い。 OLE サーバでプ ロ パテ ィ の変更通知がサポー ト さ れていないが、 アプ リ ケーシ ョ ン で新 し いプ ロ パテ ィ 値を知 る 必要があ る 場合は、 プ ロ パ テ ィ を定期的にチ ェ ッ ク す る 独自の関数を記述 し ます。 PropertyRequestEdit イ ベン ト と PropertyChanged イ ベン ト についての詳 細は、 『PowerScript リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 OLE サーバで使用でき る 言語 オー ト メ ーシ ョ ン コ マ ン ド を記述す る と き 、 通常は コ ン ピ ュ ー タ の地 域 (locale) に一致す る コ マ ン ド を使用 し ます。 開発者の地域 と エ ン ド ユーザの地域が異な る 場合は、 SetAutomationLocale 関数でオー ト メ ー シ ョ ン で使用 し た言語を指定で き ます。 OLE コ ン ト ロ ール、 OLE カ ス タ ム コ ン ト ロ ール、 OLEObject オブジ ェ ク ト に対 し て SetAutomationLocale 関数を使用 し て、 アプ リ ケーシ ョ ン 中のオー ト メ ーシ ョ ン オブジ ェ ク ト と は異な る 地域を指定で き ます。 た と えば、 開発者が ド イ ツ でアプ リ ケーシ ョ ン を開発 し 、 ヨ ー ロ ッ パ 全体に配布す る 場合は、 オー ト メ ーシ ョ ン が使用す る 言語が ド イ ツ語 で あ る こ と を SetAutomationLocale 関数で指定で き ま す。 ole_1 と い う OLE コ ン ト ロ ールには次の構文を使用 し ます。 ole_1.Object.SetAutomationLocale(LanguageGerman!) oleobj_report と い う OLEObject には次の構文を使用 し ます。 oleobj_report.SetAutomationlocale(LanguageGerman!) OLE サーバ アプ リ ケーシ ョ ン に ド イ ツ語のオー ト メ ーシ ョ ン イ ン タ フ ェース がなければな り ません。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 359 ス ク リ プ ト における OLE オブ ジ ェ ク ト エ ン ド ユーザの コ ン ピ ュ ー タ がサポー ト する言語 エ ン ド ユーザが OLE サーバ アプ リ ケーシ ョ ン を イ ン ス ト ールす る と き 、 (特に Microsoft の OLE アプ リ ケーシ ョ ン の場合) は、 自国の言語 と 英語のオー ト メ ーシ ョ ン イ ン タ フ ェ ー ス が提供 さ れ ま す。 エ ン ド ユーザが開発者 と 異な る 言語を使用 し てい る 場合は、 開発者の自国語 でオー ト メ ーシ ョ ン コ マ ン ド を記述す る こ と は適当ではあ り ません。 詳細については、 『PowerScript リ フ ァ レ ン ス』 マニ ュ アルの SetAutomationLocale 関数を参照 し て く だ さ い。 OLE オブ ジ ェ ク ト への低レ ベル ア ク セス C ま たは C++ で作成 さ れた DLL 内の外部関数を PowerBuilder か ら 呼 び出 し て、 OLE サーバへ低 レ ベルのア ク セ ス をす る 必要が あ る 場合、 以下の関数を使用で き ます。 • GetNativePointer (OLEControl と OLECustomControl の場合) • GetAutomationNativePointer (OLEObject の場合) 処理が終了 し た ら 、ポ イ ン タ を解放す る ため以下の関数を使用 し ます。 • ReleaseNativePointer (OLEControl と OLECustomControl の場合) • ReleaseAutomationNativePointer (OLEObject の場合) 詳細については、 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ アル を参照 し て く だ さ い。 データ ウィ ン ド ウ オブ ジ ェ ク ト における OLE オブ ジ ェ ク ト 前節では、 OLE コ ン ト ロ ール と OLEObject オブ ジ ェ ク ト へのオー ト メ ーシ ョ ン イ ン タ フ ェ ース について説明 し ま し た。 ス ク リ プ ト を使っ て、 デー タ ウ ィ ン ド ウ オブジ ェ ク ト に埋め込 ま れた OLE オブジ ェ ク ト の設定 も 変更で き ま す。 ま た、 外部の OLE オブ ジ ェ ク ト のプ ロ パ テ ィ を通知す る こ と も で き ます。 こ の節では、 Object プ ロ パ テ ィ に ド ッ ト (.) 表記 を 使用 し てデー タ ウ ィ ン ド ウ プ ロ パ テ ィ を 設定す る 方法につい て 説明 し ま す。 ま た、 デー タ ウ ィ ン ド ウ オブジ ェ ク ト の OLE オブジ ェ ク ト に対す る オー ト メ ーシ ョ ン コ マ ン ド の発行方法について も 説明 し ます。 360 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 OLE オブ ジ ェ ク ト の 名前付け OLE オブジ ェ ク ト に ド ッ ト (.) 表記を使用す る ために、 オブジ ェ ク ト に名前を付け ます。 オブジ ェ ク ト のプ ロ パテ ィ シー ト の [全般] ペー ジで名前を指定 し ます。 プ ロパテ ィ の設定 OLE コ ン テナ オブジ ェ ク ト のプ ロ パテ ィ は、 デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト のほかのオブジ ェ ク ト と 同様に設定 し ます。 コ ン ト ロ ールの Object プ ロ パテ ィ は、 デー タ ウ ィ ン ド ウ オブジ ェ ク ト 内のオブジ ェ ク ト への イ ン タ フ ェース と な り ます。 た と えば、 次の ス テー ト メ ン ト では、 オブ ジ ェ ク ト の Pointer プ ロ パ テ ィ に ole_word を設定 し ます。 dw_1.Object.ole_word.Pointer = "Cross!" コ ンパ イ ラ は、 Object プ ロ パテ ィ 以下の構文を チ ェ ッ ク し ないので注 意 し て く だ さ い。 プ ロ パテ ィ の設定に誤 り があ る と 実行時エ ラ ーが起 こ り ます。 プ ロ パテ ィ の設定、 エ ラ ー処理、 お よ び OLE DWObject のプ ロ パテ ィ の リ ス ト についての詳細は、『デー タ ウ ィ ン ド ウ リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 OLE オブ ジ ェ ク ト と Modify 関数 Modify 関数の CREATE キー ワー ド を使用 し て、 デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト 中の OLE オブジ ェ ク ト を動的に作成す る こ と はで き ません。 OLE オブジ ェ ク ト のバ イ ナ リ デー タ は、 Modify 関数の構文 と の互換性 があ り ません。 関数 と プ ロパテ ィ OLE DWObject を呼び出すために 4 つの関数が用意 さ れてお り 、 いず れ も OLE コ ン ト ロ ールに対 し て同 じ 効果を及ぼ し ます。その 4 つの関 数は以下の と お り です。 • Activate • Copy • DoVerb • UpdateLinksDialog こ れ ら の関数を呼び出すには、 デー タ ウ ィ ン ド ウ オブジ ェ ク ト のプ ロ パテ ィ の場合 と 同様に、デー タ ウ ィ ン ド ウ コ ン ト ロ ールの Object プ ロ パテ ィ を使用 し ます。 dw_1.Object.ole_word.Activate(InPlace!) ウ ィ ン ド ウ の OLE コ ン ト ロ ールに適用 さ れ る 4 つのプ ロ パ テ ィ は、 OLE DWObject に も 適用 さ れます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 361 ス ク リ プ ト における OLE オブ ジ ェ ク ト 表 18-7: OLE コ ン ト ロール と OLE DWObject に適用 さ れる プ ロパテ ィ プ ロパテ ィ ClassLongName String デー タ 型 ClassShortName String LinkItem String 説明 (読み出 し 専用)OLE DWObject に関連付け ら れた サーバ ア プ リ ケーシ ョ ン の た めの長い 名前 (読み出 し 専用)OLE DWObject に関連付け ら れた サーバ ア プ リ ケーシ ョ ン の た めの短い 名前 (読み出 し 専用) オブジ ェ ク ト の リ ン ク 先項 目の完全な リ ン ク 名 た と えば、 オブジ ェ ク ト が C:¥FILENAME.XLS!A1:B2 に リ ン ク さ れてい る 場合は、 LinkItem は C:¥FILENAME.XLS!A1:B2 と な る ObjectData Blob オブジ ェ ク ト が埋め込まれてい る 場合は、 オ ブ ジ ェ ク ト 自身が ObjectData プ ロ パ テ ィ の Blob 型デー タ と し て格納 さ れ る オブジ ェ ク ト が リ ン ク さ れてい る 場合は、 こ のプ ロ パテ ィ には リ ン ク 情報 と (表示用の) キ ャ ッ シ ュ イ メ ージが含まれ る オー ト メ ーシ ョ ン ド ッ ト (.) 表記を使用 し て OLE サーバに コ マ ン ド が送信で き ます。 構 文には 2 つの Object プ ロ パテ ィ が含ま れ ます。 OLE コ ン テ ナの DWObject な ど のデー タ ウ ィ ン ド ウ オブジ ェ ク ト へア ク セ ス で き る • データ ウィ ン ド ウ コ ン ト ロ ールの Object プロ パティ • OLE DWObject の Object プ ロパテ ィ オート メ ーショ ン オブジェ ク ト へア ク セ ス で き る 構文は次の と お り です。 dwcontrol.Object.oledwobject.Object.{ serverqualifiers. }serverinstruction た と えば、 次の ス テー ト メ ン ト では、 WordBasic の Insert 関数を使用 し て、 Word 文書のデー タ テーブルの最初に報告書 タ イ ト ルを追加 し ま す。 dw_1.Object.ole_word.Object.application.wordbasic.& Insert("Report Title " + String(Today())) 362 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 ア プ リ ケーシ ョ ンにおける OLE カ ラ ム デー タ ウ ィ ン ド ウ オブジ ェ ク ト の OLE カ ラ ム を使用 し て、デー タ ベー ス の Blob 型デー タ を格納、 検索、 修正で き ます。 アプ リ ケーシ ョ ン で OLE カ ラ ム を使用す る には、 ウ ィ ン ド ウ に デー タ ウ ィ ン ド ウ コ ン ト ロ ールを配置 し 、 デー タ ウ ィ ン ド ウ オブジ ェ ク ト と の関連付け を行い ます。 SQL Server のユーザに関する注意 SQL Server デー タ ベース を使用 し てい る 場合は、 OLE を使用す る ため には ト ラ ンザ ク シ ョ ン処理を終了す る 必要があ り ます。 デー タ ウ ィ ン ド ウ コ ン ト ロ ールで使用 さ れてい る ト ラ ン ザ ク シ ョ ン オブ ジ ェ ク ト では、 AutoCommit 関数に TRUE を設定 し ます。 デー タ ウ ィ ン ド ウ オブジ ェ ク ト の OLE カ ラ ム の作成方法については、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 OLE サーバ ア プ リ ケーシ ョ ンのア ク テ ィ ブ化 エ ン ド ユーザは、開発者が デー タ ウ ィ ン ド ウ ペ イ ン タ で前 も っ て扱っ たの と ま っ た く 同 じ よ う に Blob 型を扱え ます。 つま り 、 Blob 型を ダブ ル ク リ ッ ク す る だけで、 サーバ アプ リ ケーシ ョ ン を呼び出す こ と がで き ます。 ま た、 開発者がサーバ アプ リ ケーシ ョ ン を呼び出すには、 ス ク リ プ ト で OLEActivate 関数を使用で き ます。 OLEActivate 関数を呼び出 すのは、 設定 さ れた Blob 型を ダブル ク リ ッ ク す る の と 同 じ こ と です。 OLEActivate 関数の構文は次の と お り です。 dwcontrol.OLEActivate (row, columnnameornumber, verb ) バーブの設定 OLEActivate 関数を使用す る 場合は、OLE サーバ アプ リ ケーシ ョ ンに渡 すア ク シ ョ ン がわか っ てい る 必要があ り ます。 Windows では、 こ のア ク シ ョ ン の こ と をバーブ と 呼びます。 通常、 文書を編集 し たい場合は、 大部分のサーバでは、 バーブに 0 を設定 し ます。 特定の OLE サーバ アプ リ ケーシ ョ ン でサポー ト さ れてい る バーブ を 取得す る には、Windows の レ ジ ス ト リ エデ ィ タ ユーテ ィ リ テ ィ の高度 な イ ン タ フ ェ ース (REGEDT32 /V) を実行 し ます。 レ ジ ス ト リ エデ ィ タ についての詳細は、Windows のオ ン ラ イ ン ヘルプ の REGEDT32.HLP を参照 し て く だ さ い。 例 た と えば、 ボ タ ンに対す る Clicked ス ク リ プ ト で OLEActivate 関数を使 用 し て、 エ ン ド ユーザがダブル ク リ ッ ク で き る Blob 型ア イ コ ン を知 ら な く て も OLE を使用で き る よ う にす る 場合を考え ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 363 オブ ジ ェ ク ト ブ ラ ウザでの OLE 情報 次の ス テー ト メ ン ト は、 デー タ ウ ィ ン ド ウ コ ン ト ロ ールの dw_1 の現 行の行にあ る OLE カ ラ ムのため、 OLE サーバ アプ リ ケーシ ョ ン を呼 び出 し ます。 こ こ では、 デー タ ウ ィ ン ド ウ オブジ ェ ク ト の 2 番目のカ ラ ムが OLE カ ラ ム であ る と 仮定 し てい ます。 dw_1.OLEActivate(dw_1.GetRow(), 2, 0) データ ウ ィ ン ド ウ オブジェ ク ト における OLE の使い方についての詳細 は、『 PowerBuilder ユーザーズ ガイ ド 』 マニュ アルを 参照し てく ださ い。 詳細情報 オブ ジ ェ ク ト ブ ラ ウザでの OLE 情報 OLE サーバ アプ リ ケーシ ョ ン と OLE カ ス タ ム コ ン ト ロ ール (OCX) を イ ン ス ト ールす る と 、 そのオブジ ェ ク ト の情報が レ ジ ス ト リ に登録 さ れ ます。 PowerBuilder は、 レ ジ ス ト リ を読み込んで、 登録 さ れたすべての OLE サーバ と OCX の レ ジ ス ト リ 情報を表示 し ます。 v OLE 情報を表示する には 1 パ ワ ーバーの [オブジ ェ ク ト ブ ラ ウ ザ] ボ タ ン を ク リ ッ ク し ます。 2 オブジ ェ ク ト ブ ラ ウ ザの [OLE] タ ブ を ク リ ッ ク し ます。 表 18-8 に示す OLE オブジ ェ ク ト の 3 つのカ テ ゴ リ が表示 さ れ ます。 表 18-8: OLE オブ ジ ェ ク ト のカ テ ゴ リ OLE オブ ジ ェ ク ト の カテゴ リ 挿入可能なオブジ ェ クト OLE カ ス タ ム コ ン ト ロ ール OLE オー ト メ ーシ ョ ン オブジ ェ ク ト 364 説明 OLE コ ン テナにオブ ジ ェ ク ト を リ ン ク ま た は埋め 込む こ と がで き る OLE サーバ。挿入可能なオブジ ェ ク ト をサポー ト す る OLE サーバには、ビ ジ ュ アルな 構成要素が必要 OLE コ ン テナに含め る こ と がで き る ActiveX コ ン ト ロ ール。 さ ら に ActiveX コ ン ト ロ ールは、 挿入可能 なオブジ ェ ク ト で あ る こ と も で き る 。 ActiveX コ ン ト ロ ールが挿入可能なオブジ ェ ク ト の場合、 挿入可 能なオブジ ェ ク ト の リ ス ト に表示 さ れ る オー ト メ ーシ ョ ン をサポー ト す る OLE サーバ。オー ト メ ーシ ョ ン オブジ ェ ク ト は、非表示のオブジ ェ ク ト の場合 も あ る 。 つま り 、 オー ト メ ーシ ョ ンだけ を サ ポー ト し てお り 、 挿入可能な オ ブ ジ ェ ク ト はサ ポー ト し ていない と い う こ と であ る PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 こ れ ら のカ テ ゴ リ を展開す る と 、 イ ン ス ト ール さ れた個々の OLE サー バが参照で き ます。 こ れ ら の OLE サーバは さ ら に展開で き ます。 提供 さ れ る 情報は、 カ テ ゴ リ に依存 し ます。 ク ラ ス情報 すべての カ テ ゴ リ は、 OLE サーバに関す る ク ラ ス 情報を提供 し ま す。 ク ラ ス 情報には レ ジ ス ト リ キーの リ ス ト が表示 さ れ ま す。 キーには、 キー自身に意味があ る も のや、キーに対す る 値があ る も のがあ り ます。 キーの値やキーの有無に よ っ て、OLE サーバの検索方法 と OLE サーバ が何を サポー ト す る か を知 ら せます。 表 18-9 は、 い く つかのキー と その説明です。 表 18-9: OLE レ ジ ス ト リ キー レ ジス ト リ キー GUID TypeLib - GUID ProgID VersionIndependentProgID InprocServer32 ToolboxBitmap32 DefaultIcon Version Insertable Control Verb 値 OLE サーバのグ ロ ーバル一意識別子 ActiveX コ ン ト ロ ールの タ イ プ ラ イ ブ ラ リ のグ ロ ーバル一意識別子 OLE サーバや ActiveX コ ン ト ロ ールを識別する 文字列。 通常、 バージ ョ ン番号が含まれ る OLE サーバや ActiveX コ ン ト ロ ールを識別する 文字列だが、 バージ ョ ン番号を含ま ない 32 ビ ッ ト 版 ActiveX コ ン ト ロ ールの フ ァ イ ル名 開発環境で ツ ールバーや ツ ールボ ッ ク ス に 32 ビ ッ ト の ActiveX コ ン ト ロ ールを表示す る ため に使用す る ビ ッ ト マ ッ プ フ ァ イ ル名 OLE サーバや ActiveX コ ン ト ロ ールを ア イ コ ン で表示す る と き に使用 さ れ る ア イ コ ン フ ァ イ ル 名。 ま たは、 ア イ コ ン を含む実行フ ァ イ ル OLE サーバ ま たは ActiveX コ ン ト ロ ールのバー ジ ョ ン番号名 値な し – エン ト リ が挿入可能なオブジ ェ ク ト を サポー ト す る OLE サーバであ る こ と を表す 値な し – エ ン ト リ が ActiveX コ ン ト ロ ールであ る こ と を表す 値な し – エン ト リ がバーブ を コ マ ン ド と し て受 け入れ る こ と を表す レ ジ ス ト リ の情報に加え て、 オブジ ェ ク ト ブ ラ ウ ザは、 ActiveX コ ン ト ロ ール と オー ト メ ーシ ョ ン オブ ジ ェ ク ト のプ ロ パテ ィ と メ ソ ッ ド も 表示 し ます。 OLE の情報を提供す る ために、 PowerBuilder は レ ジ ス ト リ の情報を使用 し て ActiveX コ ン ト ロ ールを検索 し 、ActiveX コ ン ト ロ ールのプ ロ パテ ィ と メ ソ ッ ド を取得 し ます。 こ の情報には、 引数 と デー タ 型があ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 365 OLE オブ ジ ェ ク ト の高度な操作 ス ク リ プ ト を記述す る と き 、 オブジ ェ ク ト ブ ラ ウ ザを使用 し て、 プ ロ パテ ィ 名や関数名を検索 し 、ス ク リ プ ト に貼 り 付け る こ と がで き ます。 オブジ ェ ク ト ブ ラ ウ ザは、 プ ロ パテ ィ を ア ク セ スす る ため構文を提供 し ます。 ス ク リ プ ト 記述時のオ ブ ジ ェ ク ト ブ ラ ウザ v OLE の情報を ス ク リ プ ト に貼 り 付け るには 1 ブ ラ ウ ザを開 き ます。 2 [OLE] タ ブ を ク リ ッ ク し ます。 3 オブジ ェ ク ト を検索す る ために リ ス ト を展開 し ます。た と えば、あ る ActiveX コ ン ト ロ ー ル プ ロ パ テ ィ を 検 索 す る た め に、 そ の ActiveX コ ン ト ロ ール の リ ス ト を さ ら に展開 し ます。 4 プ ロ パテ ィ をハ イ ラ イ ト 表示 し て、ポ ッ プア ッ プ メ ニ ュ ーか ら [ コ ピー] を選択 し ます。 5 ス ク リ プト ビ ュ ーで挿入ポイ ン ト を 決めて、ポッ プアッ プ メ ニュ ー か ら [貼 り 付け] を選択 し ます。 オブジ ェ ク ト ブ ラ ウ ザは、 以下の よ う に ス ク リ プ ト に構文を挿入 し ます。 OLECustomControl.Object.NeedlePosition OLECustomControl を実際の コ ン ト ロ ール名に変更 し た後は、 ス ク リ プ ト で NeedlePosition プ ロ パテ ィ を正 し く 設定 し て く だ さ い。 オブジ ェ ク ト ブ ラ ウ ザが ス ク リ プ ト に貼 り 付け る 内容は、 選択 し た内 容に よ っ て異な り ます。 オブジ ェ ク ト (階層構造におけ る プ ロ パテ ィ の 1 つ上の レベル) を選択 し た場合は、 PowerBuilder はオブジ ェ ク ト の ProgID を貼 り 付け ます。ConnectToNewObject 関数で ProgID を使用で き ます。 オート メ ーショ ン と レ ジス ト リ についての詳細は、第 19 章「PowerBuilder の ラ ン タ イ ム オー ト メ ーシ ョ ン サーバ」 を参照 し て く だ さ い。 OLE オブ ジ ェ ク ト の高度な操作 PowerBuilder は、 コ ン ト ロ ール上の OLE オ ブ ジ ェ ク ト と オー ト メ ー シ ョ ン に対す る オブジ ェ ク ト のほかに も 、 基本的な OLE デー タ ス ト レージに対す る イ ン タ フ ェ ース を提供 し てい ます。 366 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 OLE デー タ は、 ス ト リ ーム と 呼ばれ る オブジ ェ ク ト に保持 さ れてい ま す。 ま た、 ス ト リ ームは、 ス ト レージ と 呼ばれ る オブジ ェ ク ト の中に 存在 し ます。 ス ト リ ーム と ス ト レージは、 フ ァ イ ル シ ス テ ムにおけ る フ ァ イ ル と デ ィ レ ク ト リ の関係に似てい ます。 ス ト リ ームや ス ト レー ジ を開 き 、 読み取 り 、 書 き 込み、 保存、 削除す る こ と に よ り 、 OLE オ ブ ジ ェ ク ト の作成、 結合、 削除 を 行 う こ と がで き ま す。 PowerBuilder では、 OLEStorage オブジ ェ ク ト と OLEStream オブ ジ ェ ク ト の 2 つの デー タ 型を用いて、ス ト レージやス ト リ ームへのア ク セ ス を行い ます。 OLE コ ン ト ロ ール と OLEObject 変数を定義すれば、サーバ アプ リ ケー シ ョ ンやオー ト メ ーシ ョ ン のすべての機能にア ク セ ス で き 、 こ れだけ で も 、 OLE の機能を活用す る こ と がで き ます。 し たが っ て、 保持 さ れ てい る デー タ の構造が複雑な場合には、 PowerBuilder の ス ト レージ オ ブジ ェ ク ト やス ト リ ーム オブジ ェ ク ト は必要あ り ません。 ほかのア プ リ ケーシ ョ ンのス ト レージ フ ァ イル こ の節では、 PowerBuilder アプ リ ケーシ ョ ン が作成 し た OLE ス ト レー ジ フ ァ イ ルについて説明 し ます。 ほかの PowerBuilder アプ リ ケーシ ョ ン も 、 PowerBuilder で作成 し た ス ト レージ フ ァ イ ル内のオブジ ェ ク ト を開 く こ と がで き ま す。 Excel、 Word、 お よ びそのほかのサーバ ア プ リ ケーシ ョ ン は、 それ ら のネ イ テ ィ ブ デー タ を OLE ス ト レージに保 持 し ますが、 各フ ァ イ ルに独自の形式があ る ため、 それ ら を ス ト レー ジ フ ァ イ ル と し て直接開 く こ と はお勧め し ません。Word や Excel な ど の フ ァ イ ルは、(InsertFile 関数を用いて) コ ン ト ロ ール上に挿入す る か、 (ConnectToObject 関数を用いて) コ ン ト ロ ール と オー ト メ ーシ ョ ン で関 連付けた方が よ いで し ょ う 。 OLE スト レ ージ の構造 OLE ス ト レージは、OLE デー タ の リ ポジ ト リ です。ス ト レージは、デ ィ ス ク のデ ィ レ ク ト リ 構造に似てい ます。 ス ト レージは、 1 つの OLE オ ブジ ェ ク ト であ る 場合や、 ほかの ス ト レージやサブ ス ト レージに格納 さ れてい る 複数の OLE オブジ ェ ク ト を格納 し てい る 場合 も あ り ます。 図 18-3 に示す よ う に、 サブ ス ト レージは、 デ ィ レ ク ト リ 内の フ ァ イ ル の よ う に、 独立 し た要素の個別の OLE オブジ ェ ク ト に も で き 、 画像を 含む文書な ど の大規模な OLE オブジ ェ ク ト も 形成で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 367 OLE オブ ジ ェ ク ト の高度な操作 図 18-3: OLE ス ト レージの構造 OLE オブジ ェ ク ト を含むス ト レージやサブ ス ト レージでは、 それが特 定のサーバ ア プ リ ケーシ ョ ン に属 し て い る こ と を 示す タ グ を 付け て 情報を識別 し てい ます。 こ れに よ り 、 その下位レベルの各 コ ン ポーネ ン ト は、 そのサーバ アプ リ ケーシ ョ ン で し か操作 さ れな く な り ま す。 なお、 サーバのオブジ ェ ク ト を格納 し てい る ス ト レージ を開いて、 そ の中か ら オブジ ェ ク ト を取 り 出す こ と がで き ますが、 その ス ト レージ は変更すべ き ではあ り ません。 OLE オブジ ェ ク ト を格納 し てい る ス ト レージは、 オブジ ェ ク ト の表示 情報を持っ てい ま す。 表示情報が ス ト レージに属 し てい る ので、 OLE は、 オブジ ェ ク ト を表示す る ためにサーバ アプ リ ケーシ ョ ン を起動す る 必要があ り ません。 OLE オブジ ェ ク ト を含まず、 単にほかの ス ト レージ を格納 し てい る だ けの ス ト レージ も あ り ます。 こ の場合は、 挿入す る オブジ ェ ク ト がな いので、 その ス ト レージ を コ ン ト ロ ール上で開 く こ と はで き ません。 ス ト レ ージ と ス ト リ ームに対する オブ ジ ェ ク ト データ 型 PowerBuilder は、 OLE フ ァ イ ルの ス ト レージ と ス ト リ ーム に対す る オ ブジ ェ ク ト デー タ 型を 2 種類用意 し てい ます。 368 • OLEStorage • OLEStream PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 こ れ ら のオブジ ェ ク ト は、 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト や メ ッ セー ジ オブジ ェ ク ト と 同 じ よ う な ク ラ ス ユーザ オブジ ェ ク ト です。 こ れ ら のオブジ ェ ク ト デー タ 型の変数を宣言 し 、 その イ ン ス タ ン ス を作成 し てか ら 、 ス ト レージ を開 き ます。 ス ト レージ を使っ た作業を終了 し た ら 、 ス ト レージ を閉 じ 、 変数を破棄 し て、 OLE サーバ と 変数に割 り 当て ら れていた メ モ リ を解放 し ます。 ス ト レージ を開 く と 、 OLEStorage 変数 と デ ィ ス ク 上の フ ァ イ ルが関連 付け ら れ ます。こ の フ ァ イ ルは、現行セ ッ シ ョ ンのための一時的な フ ァ イ ルであ っ た り 、 OLE オブジ ェ ク ト を含む既存の フ ァ イ ルであ っ た り し ます。 フ ァ イ ルが存在 し ない場合は、 PowerBuilder が作成 し ます。 OLE オブジ ェ ク ト を ス ト レージに格納す る には、 SaveAs 関数を使用 し ます。 ま た、 ウ ィ ン ド ウ 上の OLE コ ン ト ロ ール と ス ト レージ と の関連 付けは、 OLE コ ン ト ロ ールに対す る Open 関数を呼び出 し て行い ます。 ス ト リ ームは、 OLE オブジ ェ ク ト ではないので、 コ ン ト ロ ール上で開 く こ と はで き ません。 し か し 、 ス ト リ ーム を使用す る と 、 オブジ ェ ク ト に関す る 独自の情報 を ス ト レ ージ フ ィ ルに格納 し てお く こ と がで き ます。 ス ト リ ームは、 ス ト レージ ま たはサブ ス ト レージ内部か ら 開 き 、 フ ァ イ ル と 同様に、 デー タ の入出力を行 う こ と がで き ます。 パフ ォ ーマ ン スに関する ヒ ン ト ス ト レージは、 OLE デー タ を効率 よ く 表示す る こ と がで き ます。 サー バ ア プ リ ケーシ ョ ン で作成 し た フ ァ イ ル を コ ン ト ロ ールに挿入す る と き に、 OLE は、 そのサーバを起動 し て、 オブジ ェ ク ト を表示 し なけ ればな り ません。 し か し 、 OLE ス ト レージに格納 さ れたオブジ ェ ク ト を開 く と き は、サーバを起動す る と い う オーバーヘ ッ ド があ り ません。 OLE は、 ス ト レージが保持 し てい る 表示情報を使用 し て、 オブジ ェ ク ト を表示 し ます。 エ ン ド ユーザがそのオブジ ェ ク ト を ア ク テ ィ ブに し ない限 り 、 サーバを起動す る 必要があ り ません。 スト レ ージ を 開く 、 保存する PowerBuilder は、 ス ト レ ージ を管理す る ための関数を い く つか用意 し てい ます。 も っ と も 重要な関数は、 Open、 Save、 お よ び SaveAs です。 Open 関数の使い方 フ ァ イ ル内の OLE デー タ にア ク セ ス す る 場合は、 Open 関数を呼び出 し ます。 ス ト レージ フ ァ イ ルの構造に よ っ ては、 Open 関数の呼び出 し が複数回必要 と な る こ と があ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 369 OLE オブ ジ ェ ク ト の高度な操作 以下の コ ー ド は、 コ ン ト ロ ールの中で フ ァ イ ルのルー ト ス ト レージ を 開 き ます。 こ の Open の構文では、 ルー ト ス ト レージは、 ほかの ス ト レージ を格納 し てい る だけの コ ン テナではな く 、 OLE オブジ ェ ク ト で なければな り ません。 必ず戻 り 値を調べて、 OLE 関数が成功 し たか ど う か を確認 し て く だ さ い。 result = ole_1.Open("MYFILE.OLE") コ ン ト ロ ールへフ ァ イ ルのサブ ス ト レージ を開 き たい場合は、 Open 関 数を 2 回呼び出す必要があ り ます。 1 回目は OLEStorage 変数へフ ァ イ ルを開 く ために、 2 回目は コ ン ト ロ ールへサブ ス ト レ ージ を開 く ため に行い ます。 Stg_data は、 CREATE 関数を使っ て宣言 し て、 イ ン ス タ ン ス を作成 し た OLEStorage 変数です。 result = stg_data.Open("MYFILE.OLE") result = ole_1.Open(stg_data, "mysubstorage") Save 関数の使い方 エ ン ド ユーザが、 コ ン ト ロ ール上のオブ ジ ェ ク ト を ア ク テ ィ ブに し て、 編集す る も の と し ます。 こ の場合、 サーバは、 変更内容を メ モ リ 上のデー タ に保持 し 、 DataChange イ ベン ト を PowerBuilder アプ リ ケー シ ョ ン で起動 し ます。 アプ リ ケーシ ョ ン では、 Save 関数を呼び出 し て、 ス ト レージ フ ァ イ ルのデー タ を変更 し なければな り ません。 result = ole_1.Save() IF result = 0 THEN result = stg_data.Save() SaveAs 関数の使い方 SaveAs 関数を使用 し て、 コ ン ト ロ ール上のオブジ ェ ク ト を ほかの ス ト レ ージ変数か フ ァ イ ルに保存す る こ と も で き ま す。 以下の コ ー ド は、 コ ン ト ロ ールで ス ト レ ージ フ ァ イ ル を 開 き 、 さ ら に別の ス ト レ ージ フ ァ イ ルを開いた後、 その ス ト レージ フ ァ イ ルでサブ ス ト レージ を開 き ます。 次いで、 オ リ ジナルのオブジ ェ ク ト を 3 階層のネ ス ト し たサ ブ ス ト レージ と し て コ ン ト ロ ールに保存 し ます。 OLEStorage stg_data, stg_subdata stg_data = CREATE OLEStorage stg_subdata = CREATE OLEStorage ole_1.Open("FILE_A.OLE") stg_data.Open("FILE_B.OLE") stg_subdata.Open("subdata", stgReadWrite!, & stgExclusive!, stg_data) ole_1.SaveAs(stg_subdata, "subsubdata") 以下の図は、 ネ ス ト し た ス ト レージ を順に開 き 、 SaveAs 関数を実行す る ま でのプ ロ セ ス を示 し てい ます。 フ ァ イ ルや ス ト レージが存在 し な い場合は、 Open 関数や SaveAs 関数に よ っ て作成 さ れ ます。 SaveAs 関 数を呼び出す前に、 コ ン ト ロ ールに対 し て Save 関数を呼び出す と 、 コ ン ト ロ ールのオブジェ ク ト が FILE_A フ ァ イ ルに保存さ れま す。 SaveAs 関数を 呼び出し た後に Save 関数を 呼び出すと 、オブジェ ク ト は FILE_B フ ァ イ ルの subsubdata に保存 さ れ ます。 370 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 図 18-4: ネス ト し た OLE ス ト レージ 次の例に、 第 3 レ ベルに ス ト レ ージ を 作成せずにサブ レ ベルの ス ト レージ を作成す る 簡単な方法を示 し ます。 こ の場合、 第 3 レベルで ス ト レ ージ を ネ ス ト し た り 、 オ ブ ジ ェ ク ト を 保存す る た めにサ ブ ス ト レージ を開いた り す る 必要があ り ません。 OLEStorage stg_data, stg_subdata stg_data = CREATE OLEStorage stg_subdata = CREATE OLEStorage ole_1.Open("FILE_A.OLE") stg_data.Open("FILE_B.OLE") ole_1.SaveAs(stg_data, "subdata") ス ト レージの メ ンバーに関する情報の取得 ス ト レージ を開 く と 、 以下の メ ンバー関数を使用 し て、 その ス ト レー ジ内のサブ ス ト レ ージ と ス ト リ ー ム に関す る 情報の取得や変更 を 行 う こ と がで き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 371 OLE オブ ジ ェ ク ト の高度な操作 表 18-10: OLE ス ト レージの メ ンバ関数 関数 MemberExists MemberDelete MemberRename 機能 指定 し た メ ンバーが ス ト レ ージ内に存在す る か ど う か を調べ る メ ン バーは、 ス ト レ ージか ス ト リ ーム のいずれかで あ る 。 各 メ ン バー名は、 一意で な ければな ら ない。 し た がっ て、ス ト レージやス ト リ ームに同 じ 名前は付け ら れ ない。 メ ンバーは、 空の ま ま存在 し て も か ま わない ス ト レージか ら メ ンバーを削除す る ス ト レージの メ ンバーの名前を変更す る 以下の コ ー ド は、 subdata ス ト レージが stg_data ス ト レージ内に存在す る か ど う か を調べてか ら 、 その ス ト レージ を開 き ます。 こ の コ ー ド で は、 stg_data と stg_subdata が宣言 さ れ、 イ ン ス タ ン ス が作成 さ れてい る も の と 想定 し てい ます。 boolean lb_exists result = stg_data.MemberExists("subdata", lb_exists) IF result = 0 AND lb_exists THEN result = stg_subdata.Open(stg_data, "subdata") END IF ス ト レージの メ ンバー IOle10Native に対 し て MemberExists 関数を実行 す る には、 次の よ う に記述 し ます。 ole_storage.memberexists(char(1) + 'Ole10Native', & lb_boolean) char(1) が必要なのは、 Microsoft の DocFile Viewer な ど のユーテ ィ リ テ ィ で ス ト レージ を見た と き に、 IOle10Native の "I" は I ではないか ら です。 ス ト リ ーム を開 く 場合 も 同 じ よ う に記述す る 必要があ り ます。 た と え ば、 次の よ う にな り ます。 ole_stream.open(ole_storage, char(1) + 'Ole10Native', & StgReadWrite!, StgExclusive!) 例 : ス ト レージの作成 た と えば、 描画ツールで描かれた製品 イ メ ージ図を、 デー タ ウ ィ ン ド ウ オブジ ェ ク ト の製品レ コ ー ド に対応 さ せて表示す る も の と し ま す。 デー タ ベース レ コ ー ド にはその画像の識別子が格納 さ れてい ます。 ア プ リ ケーシ ョ ン では、 こ の識別子を フ ァ イ ル名 と し て用いて InsertFile 関数を呼び出 し ます。 し か し 、 サーバ アプ リ ケーシ ョ ン を呼び出 し て 画像を表示す る には比較的時間がかか り ます。 372 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 以下の図の よ う に、 ス ト レージ フ ァ イ ルを作成 し 、 すべての図を保持 し てお く こ と に し ます。アプ リ ケーシ ョ ン で画像を表示 し たい と き は、 適切なサブ ス ト レージが開かれ る よ う に し ます。 図 18-5: OLE ス ト レージ フ ァ イル サーバ アプ リ ケーシ ョ ン か ら フ ァ イ ルを コ ン ト ロ ールに挿入せずに、 こ の よ う に ス ト レージ フ ァ イ ルを使用す る と 、 処理速度が速 く な る う え、 すべての画像を単一の フ ァ イ ルに ま と め る こ と がで き て扱いやす く な り ます。 ど の画像を表示す る に も ス ト レージ フ ァ イ ルを 1 つだけ 開けば よ く 、 サーバ アプ リ ケーシ ョ ン の起動 も 必要 と し ないので、 画 像が速 く 表示で き る よ う にな り ます。 ス ト レージ内の OLE オブ ジ ェ ク ト こ の例で示す ス ト レ ージ フ ァ イ ルは、 画像だけ を格納 し てい ま すが、 フ ァ イ ル内の ス ト レ ージ が同一のサーバ ア プ リ ケーシ ョ ン に よ る も ので あ る 必要はあ り ません。 作成す る アプ リ ケーシ ョ ン の用途に応 じ て、 ス ト レージ フ ァ イ ルに、 任意の OLE サーバ アプ リ ケーシ ョ ンの オブジ ェ ク ト を格納す る こ と がで き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 373 OLE オブ ジ ェ ク ト の高度な操作 こ こ に示す例は、ス ト レージ フ ァ イ ルを作成す る ユーテ ィ リ テ ィ アプ リ ケーシ ョ ン です。 こ のユーテ ィ リ テ ィ アプ リ ケーシ ョ ンは、 デー タ ウ ィ ン ド ウ オブジ ェ ク ト と OLE コ ン ト ロ ールが 1 つずつあ る 単一の ウ ィ ン ド ウ です。 dw_prodid と い う こ のデー タ ウ ィ ン ド ウ オブジ ェ ク ト には、製品 コ ー ド カ ラ ム が 1 つ設け ら れてい ます。 デー タ ベース テーブルの設定を行っ て、 製品 コ ー ド と 製品画像フ ァ イ ル名 と が対応付け ら れ る よ う に し ま す。なお、画像は ole_product と い う OLE コ ン ト ロ ール上に表示 し ます。 ス ク リ プ ト の記述例 こ の例は、 3 つの メ イ ン ス ク リ プ ト を必要 と し ます。 • ウ ィ ン ド ウ の Open イ ベン ト に対す る ス ク リ プ ト では、 ス ト レージ 変数の イ ン ス タ ン ス を作成 し 、ス ト レージ フ ァ イ ルを開いて、デー タ ウ ィ ン ド ウ オブジ ェ ク ト のデー タ を読み取 る 。 デー タ ベース と の接続は、 アプ リ ケーシ ョ ン の Open イ ベン ト で行 う • デー タ ウ ィ ン ド ウ オブジ ェ ク ト の RowFocusChanged イ ベン ト に 対す る ス ク リ プ ト で、画像を開 き 、ス ト レージ フ ァ イ ルに格納す る • ウ ィ ン ド ウ の Close イ ベン ト に対す る ス ク リ プ ト では、ス ト レージ フ ァ イ ルを保存 し 、 ス ト レージ変数を破棄す る ウ ィ ン ド ウに コ ン ト ロールを追加する 最初に、 dw_prodid コ ン ト ロ ール と ole_product コ ン ト ロ ールを ウ ィ ン ド ウ に追加 し ます。 ア プ リ ケーシ ョ ンの Open イ ベン ト に対す るスク リ プ ト アプ リ ケーシ ョ ン の Open イ ベン ト で、 デー タ ベー ス と 接続 し 、 ウ ィ ン ド ウ を開 き ます。 イ ン ス タ ン ス変数 OLEStorage 変数を ウ ィ ン ド ウ の イ ン ス タ ン ス変数 と し て宣言 し ます。 OLEStorage stg_prod_pic ウ ィ ン ド ウの Open イ ベン ト に対する ス ク リ プト ウ ィ ン ド ウ の Open イ ベン ト に対す る 以下の コ ー ド は、 OLEStorage 変 数の イ ン ス タ ン ス を作成 し 、 その変数で PICTURES.OLE フ ァ イ ルを開 き ます。 integer result stg_prod_pic = CREATE OLEStorage result = stg_prod_pic.Open("PICTURES.OLE") dw_prod.SetTransObject(SQLCA) dw_prod.Retrieve() 374 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 Retrieve 関数で RowFocusChanged イ ベン ト を呼び出す ス ト レージ関数を作成 し 、ス ト レージ フ ァ イ ルを開 く コ ー ド を Retrieve 関数 の 前 に 記述 し て お く こ と は 重要 な こ と で す。 Retrieve 関数 は、 RowFocusChanged イ ベン ト を 起動し 、そのイ ベン ト によ っ て OLEStorage 変数が参照 さ れ る こ と にな り ます。 し たがっ て、 Retrieve 関数を呼び出 す前に、 ス ト レージ フ ァ イ ルを開いておかなければな り ません。 RowFocusChanged イ ベン ト に対する ス ク リプ ト InsertFile 関数に よ っ て、 画像が OLE コ ン ト ロ ール上に表示 さ れ ます。 RowFocusChanged イ ベン ト に対す る ス ク リ プ ト では、 デー タ ウ ィ ン ド ウ オブジ ェ ク ト の prod_id カ ラ ム か ら 製品 コ ー ド を取得 し 、それを用い て製品画像の フ ァ イ ル名を作成 し て、InsertFile 関数を呼び出 し ます。最 後に、 表示 し た画像を ス ト レージに保存 し ます。 integer result string prodid // デー タ ウ ィ ン ド ウから製品 コ ー ド を取得 し ます。 prodid = this.Object.prod_id [currentrow] // 製品 コ ー ド を用いて フ ァ イル名を作成 し ます。 そのフ ァ イル // のオブ ジ ェ ク ト を コ ン ト ロール上に挿入 し ます。 result = ole_product.InsertFile( & GetCurrentDirectory() + "¥" + prodid + ".gif") // OLE オブ ジ ェ ク ト を ス ト レージに保存 し 、 // 同 じ 製品 コ ー ド を用いてそのス ト レージに名前を付けます。 result = ole_product.SaveAs( stg_prod_pic, prodid) Close イ ベン ト に対す るスク リ プ ト ウ ィ ン ド ウ の Close イ ベン ト に対す る コ ー ド では、 ス ト レージ を保存 し 、 OLE ス ト レ ージ を サーバか ら 解放 し て、 さ ら に OLEStorage 変数 の メ モ リ を解放 し ます。 integer result result = stg_prod_pic.Save() DESTROY stg_prod_pic 戻 り 値のチ ェ ッ ク OLE 関数を呼び出 し た ら 、 必ず戻 り 値をチ ェ ッ ク し て く だ さ い。 こ の チ ェ ッ ク を行わない と 、 アプ リ ケーシ ョ ンは、 操作が正常終了 し たか ど う か を把握で き ません。 例では、 関数の実行が失敗す る と ス ク リ プ ト を中断 し て戻 り ますが、 エ ラ ー メ ッ セージ を表示す る こ と も で き ま す。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 375 OLE オブ ジ ェ ク ト の高度な操作 ユーテ ィ リ テ ィ ア プ リ ケーシ ョ ンの実行 ス ト レージ フ ァ イル の使い方 製品画像の識別子をデー タ ベース テーブルに設定 し て、 製品 コ ー ド ご と に画像を作成 し た ら 、 アプ リ ケーシ ョ ン を実行 し ます。 デー タ ウ ィ ン ド ウ オブジ ェ ク ト を ス ク ロ ールす る と 、 対応す る フ ァ イ ルが開 き 、 その OLE オブジ ェ ク ト が ス ト レージに保存 さ れ ます。 ス ト レ ージに格納 し た画像を ア プ リ ケーシ ョ ン で使用す る ためには、 prod_id カ ラ ム を デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト に配置 し 、 その製品 コ ー ド を用いて PICTURES.OLE フ ァ イ ル内の ス ト レージ を開 き ます。 以 下 の コ ー ド は、 現 行 の 行 に 対 す る 画 像 を OLE コ ン ト ロ ー ル の ole_product に表示 し ます。 通常、 こ の コ ー ド は、 上述のユーテ ィ リ テ ィ アプ リ ケーシ ョ ンの よ う に、い く つかの イ ベン ト に分けて使用 し ます。 OLEStorage stg_prod_pic // ス ト レージ変数を イ ン ス タ ン ス化 し て、 フ ァ イルを開き ます。 stg_prod_pic = CREATE OLEStorage result = stg_prod_pic.Open("PICTURES.OLE") // デー タ ウ ィ ン ド ウから ス ト レージ名を取 り 出 し ます。 // デー タ ウ ィ ン ド ウの rowfocuschanging イ ベン ト に // 追加 さ れてい る と 仮定 し ています。 prodid = this.Object.prod_id[newrow] // 製品の画像を コ ン ト ロール上に開き ます。 result = ole_product.Open( stg_prod_pic, prodid ) 実際のアプ リ ケーシ ョ ン では、 開いてい る ス ト レージ を閉 じ て、 ス ト レージ変数を破棄す る コ ー ド も 記述 し てお き ます。 ス ト リ ームを 開く ス ト リ ームには、OLE オブジ ェ ク ト の生デー タ が入っ てい る ので、サー バ ア プ リ ケーシ ョ ン で作成 し た ス ト リ ー ム を 変更す る こ と は ま ずあ り ません。 し か し 、 ス ト リ ーム を ス ト レージ フ ァ イ ルに追加 し て ス ト レージに関す る 情報を格納す る こ と がで き ます。た と えば、各ス ト レー ジに対す る ラ ベルを付けた り 、 ス ト レージの メ ンバーの リ ス ト を表示 す る よ う な ス ト リ ーム を記述で き ます。 OLE の ス ト レ ージ フ ァ イ ルの ス ト リ ーム に ア ク セ ス す る には、 ス ト リ ーム変数を定義 し 、 その イ ン ス タ ン ス を作成 し て、 すでに開いてい る ス ト レージか ら ス ト リ ーム を開 き ます。 ス ト リ ーム を開 く と 、 ス ト リ ー ム 変数 と ス ト レ ージ内の ス ト リ ー ム デー タ と の関連付け が行わ れます。 376 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 以下の コ ー ド では、 OLEStorage 変数 と OLEStream 変数を宣言 し 、 ス ト レージ を開いてか ら 、 ス ト リ ーム を開 き ます。 integer result OLEStorage stg_pic OLEStream stm_pic_label /*************************************************** ス ト レージ変数 と ス ト リ ーム変数に メ モ リ を割 り 当て ます。 ***************************************************/ stg_pic = CREATE OLEStorage stm_pic_label = CREATE OLEStream /*************************************************** ス ト レージ を開き、 戻 り 値を チ ェ ッ ク し ます。 ***************************************************/ result = stg_prod_pic.Open("picfile.ole") IF result <> 0 THEN RETURN /*************************************************** ス ト リ ームを開き、 戻 り 値を チ ェ ッ ク し ます。 ***************************************************/ result = stm_pic_label.Open( stg_prod_pic, & "pic_label", stgReadWrite!) IF result <> 0 THEN RETURN PowerBuilder は、 ス ト リ ーム の開閉や、 ス ト リ ーム に対す る 情報の入 出力に用い る ス ト リ ーム関数をい く つか用意 し てい ます。 表 18-11: ス ト リ ーム関数 関数 機能 Open 指定 し た OLEStream 変数に ス ト リ ーム を開 く 。 こ の ス ト リ ー ム を格納 し てい る ス ト レ ージは、 あ ら か じ め開いておかな け ればな ら ない ス ト リ ームのサ イ ズ をバ イ ト 単位で取得す る シー ク ポ イ ン タ を ス ト リ ーム内に配置す る 。 次の読み書き 操 作は、 こ のポ イ ン タ か ら 行われ る Length Seek Read Write Close ア プ リ ケーシ ョ ン テ ク ニ ッ ク ス ト リ ームか ら のデー タ の読み取 り を シー ク ポ イ ン タ の位置 か ら 開始す る ス ト リ ームへのデー タ の書 き 込みを シー ク ポ イ ン タ の位置か ら 開始す る ポ イ ン タ が ス ト リ ーム の終わ り を指 し ていない場合は、 Write 関数は既存デー タ を上書す る 。 書 き 込むデー タ が ス ト リ ーム の現行サ イ ズ よ り 大 き く な る 場合は、 そのサ イ ズが拡張 さ れ る ス ト リ ーム を閉 じ 、 OLEStream 変数 と の関連を解除す る 377 OLE オブ ジ ェ ク ト の高度な操作 例 : ス ト リ ームの読み 書き 以下の例は、 製品の在庫デー タ を デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト の ole_product に表示す る と き に、 その製品の画像を OLE コ ン ト ロ ールに 表示 し ます。 こ こ では、 前述のユーテ ィ リ テ ィ アプ リ ケーシ ョ ン で構 築 し た フ ァ イ ルを使用 し ます (372 ページの 「例 : ス ト レージの作成」 を参照) 。 画像は、 OLE ス ト レージ フ ァ イ ルに格納 さ れてい ます。 ま た、 各画像の ス ト レージの名前はデー タ ベース テーブルの製品 コ ー ド と 同一です。 こ の例では、 各画像に ラ ベル情報を追加 し 、 製品 コ ー ド に接尾辞 _lbl を付けた名前の ス ト リ ームに格納 し ます。 図 18-6 は フ ァ イ ルの構造を示 し てい ます。 図 18-6: OLE ス ト レージ フ ァ イルの構造 こ の例は、 3 つの ス ク リ プ ト を必要 と し ます。 • ウ ィ ン ド ウ の Open イ ベン ト に対す る ス ク リ プ ト では、 ス ト レージ フ ァ イ ルを開いて、 デー タ ウ ィ ン ド ウ オブジ ェ ク ト のデー タ を読 み取 る 。 デー タ ベース と の接続は、 アプ リ ケーシ ョ ンの Open イ ベ ン ト で行 う • デー タ ウ ィ ン ド ウ オブジ ェ ク ト の RowFocusChanged イ ベン ト に 対す る ス ク リ プ ト では、 画像を表示す る 。 ま た、 その画像の ラ ベ ルを持つ ス ト リ ーム を開 き 、 その ラ ベルを StaticText に表示す る 。 ス ト リ ーム名は、 製品 コ ー ド に接尾辞 _lbl を付けた も の と な る ラ ベルが空 (サ イ ズがゼ ロ ) の場合は、 ラ ベル を ス ク リ プ ト で記 述 し ま す。 こ の と き 記述す る デー タ は、 処理を簡単にす る ために ス ト リ ーム名 と 同 じ に し ま す。 ラ ベルは、 フ ァ イ ルの作成時に記 述 し 、 フ ァ イ ルの表示時に読み取 る も のですが、 こ こ では、 説明 のために、 ス ト リ ームの読み書 き の両方について示 し てい ます。 378 PowerBuilder 第 18 章 ア プ リ ケーシ ョ ンにおける OLE の使い方 • ウ ィ ン ド ウ の Close イ ベン ト に対す る ス ク リ プ ト では、ス ト レージ フ ァ イ ルを保存 し 、 ス ト レージ変数を破棄す る OLEStorage 変数 stg_prod_pic は、 ウ ィ ン ド ウ の イ ン ス タ ン ス変数です。 OLEStorage stg_prod_pic ウ ィ ン ド ウ の Open イ ベン ト に対す る ス ク リ プ ト は以下の と お り です。 integer result stg_prod_pic = CREATE OLEStorage result = stg_prod_pic.Open( is_ole_file) dw_prod の RowFocusChanged イ ベン ト に対す る ス ク リ プ ト は以下の と お り です。 integer result string prodid, labelid, ls_data long ll_stmlength OLEStream stm_pic_label /*************************************************** OLEStream 変数を作成 し ます。 ***************************************************/ stm_pic_label = CREATE OLEStream /*************************************************** デー タ ウ ィ ン ド ウから 製品コ ー ド を取 り 出 し ます。 ***************************************************/ this.Object.prod_id[currentrow] /*************************************************** ス ト レージ フ ァ イルの画像を コ ン ト ロール上に開き ます。 ス ト レージ名 は製品 コ ー ド と 同 じ です。 ***************************************************/ result = ole_prod.Open(stg_prod_pic, prodid) IF result <> 0 THEN RETURN /*************************************************** 製品ラ ベルのス ト リ ーム名を作成 し 、 そのス ト リ ームを 開き ます。 ***************************************************/ labelid = prodid + "_lbl" result = stm_pic_label.Open( stg_prod_pic, & labelid, stgReadWrite! ) IF result <> 0 THEN RETURN /*************************************************** ス ト リ ームのサイ ズを求めます。 デー タ があれば (サイ ズが 0 よ り 大き ければ)、 そのデー タ を読み取 り 、 デー タ がなけれ ば、 ラ ベルを記述 し ます。 ***************************************************/ result = stm_pic_label.Length(ll_stmlength) IF ll_stmlength > 0 THEN ア プ リ ケーシ ョ ン テ ク ニ ッ ク 379 OLE オブ ジ ェ ク ト の高度な操作 result = stm_pic_label.Read(ls_data) IF result <> 0 THEN RETURN // ス ト リ ーム デー タ を st_label に表示 し ます。 st_label.Text = ls_data ELSE result = stm_pic_label.Write( labelid ) IF result < 0 THEN RETURN // 記述 し たデー タ を st_label に表示 し ます。 st_label.Text = labelid END IF /**************************************************** ス ト リ ームを閉 じ 、 ス ト リ ーム変数の メ モ リ を解放 し ます。 ***************************************************/ result = stm_pic_label.Close() DESTROY stm_pic_label ウ ィ ン ド ウ の Close イ ベン ト に対す る ス ク リ プ ト は以下の と お り です。 integer result result = stg_prod_pic.Save() DESTROY stg_prod_pic ス ト レ ージ を 使用する 際のス ト ラ テ ジ デー タ を ス ト レージに格納す る こ と と デー タ ベー ス に格納す る こ と は 異な り ます。 ス ト レージ フ ァ イ ルでは、 ス ト レージ を好 き な よ う に編 成で き る ので、 デー タ を編成す る 必要があ り ません。 た と えば、 ス ト レ ージ フ ァ イ ル を ネ ス ト さ せて階層的な シ ス テ ム を 設計す る こ と が で き ま す。 ま た、 ア プ リ ケーシ ョ ン の配布やバ ッ ク ア ッ プ を簡単にす る ために、ス ト レージ フ ァ イ ルのルー ト レベルにい く つかのサブ ス ト レージ を一緒に格納 し てお く だけで も か ま い ません。 ま た、1 つの フ ァ イ ルの中に、 さ ま ざ ま な OLE サーバ アプ リ ケーシ ョ ン で作成 し た ス ト レージ を格納す る こ と がで き ます。 使用 し てい る DBMS が Blob 型を サポー ト し ていない場合や、 デー タ ベー ス 管理者が大 き な Blob 型デー タ を デー タ ベー ス の ロ グ に残 さ な い よ う に し てい る 場合は、 OLE デー タ を保持す る 別の手段 と し て、 ス ト レージ を使用で き ます。 ス ト レージの構造の遷移を記録 し てお く こ と も で き ます。 ス ト レージ フ ァ イ ル内の メ ンバー名 (ス ト レージや ス ト リ ーム) の リ ス ト を表示 す る ス ト リ ーム をルー ト レベルで記述 し た り 、 ス ト リ ームに ス ト レー ジの ラ ベルやデー タ ベー ス のキー情報を記述 し て ス ト レージの説明文 書 と し て利用す る こ と がで き ます。 380 PowerBuilder 第 1 9 章 PowerBuilder の ラ ン タ イ ム オー ト メ ーシ ョ ン サーバ こ の章について こ の章では、 オー ト メ ーシ ョ ン を使用 し て PowerBuilder の ク ラ ス ユーザ オ ブ ジ ェ ク ト に ア ク セ ス す る 方法につい て 説明 し ま す。 PowerBuilder オブ ジ ェ ク ト は、 OLE サーバ と し て使用で き ま す。 PowerBuilder や OLE に対応 し た開発ツールは、 PowerBuilder オブ ジ ェ ク ト の メ ソ ッ ド やプ ロ パテ ィ にア ク セ ス で き ます。 内容 項目 ラ ン タ イ ム オー ト メ ーシ ョ ン サーバの使い方 ユーザ オブ ジ ェ ク ト を オー ト メ ーシ ョ ン サーバ と し て使用 す る 方法 PowerBuilder をオー ト メ ーシ ョ ン サーバ と し て使用す る 方法 名前付 き PowerBuilder オー ト メ ーシ ョ ン サーバの作成 と 使用 ユーザ オブジ ェ ク ト と レ ジ ス ト リ についての詳細 オー ト メ ーシ ョ ン サーバを使用する アプ リ ケーシ ョ ンの配布 オー ト メ ーシ ョ ン サーバ リ フ ァ レ ン ス ページ 381 387 392 397 399 407 408 ラ ン タ イ ム オー ト メ ーシ ョ ン サーバの使い方 PowerBuilder COM サーバの使い方 こ の章では、 PowerBuilder ラ ン タ イ ム オー ト メ ーシ ョ ン サーバの 使い方に重点を置いて説明 し ます。COM 準拠のサーバを構築す る 際には、 PowerBuilder の COM/MTS/COM+ サーバ生成が よ く 用い ら れます。PowerBuilder のオー ト メ ーシ ョ ン サーバ テ ク ノ ロ ジは、 将来の リ リ ース では廃止 さ れ る 可能性があ り ます。 カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト か ら PowerBuilder COM オブ ジ ェ ク ト を生成す る 方法の詳細については、 第 26 章 「COM/MTS/COM+ コ ン ポーネ ン ト の構築」 を参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 381 ラ ン タ イ ム オー ト メ ーシ ョ ン サーバの使い方 第 18 章 「アプ リ ケーシ ョ ンにおけ る OLE の使い方」 では、 OLE オブ ジ ェ ク ト と カ ス タ ム コ ン ト ロ ールの コ ン テナの提供方法 と 、OLE オブ ジ ェ ク ト の メ ソ ッ ド と プ ロ パ テ ィ に ア ク セ ス す る た めのオー ト メ ー シ ョ ン の使用方法について説明 し ま し た。OLE オブジ ェ ク ト の機能は、 サーバ アプ リ ケーシ ョ ン に よ っ て提供 さ れ ます。 デー タ を操作す る た めの コ マ ン ド をサーバ アプ リ ケーシ ョ ン に送 り ます。 オー ト メ ーシ ョ ン サーバについて PowerBuilder オー ト メ ーシ ョ ン サーバは、挿入可能で ビ ジ ュ アルなオ ブジ ェ ク ト ではな く 、 プ ロ グ ラ ミ ン グ可能なオブジ ェ ク ト に対応し た OLE サーバです。PowerBuilder オート メ ーショ ン サーバは、PowerBuilder ラ イ ブ ラ リ 内の ク ラ ス ユーザ オブジ ェ ク ト (非ビ ジ ュ アル ユーザ オ ブジ ェ ク ト ) へのア ク セ ス を提供 し ます。 ユーザ オブジ ェ ク ト にア ク セ ス す る には、 オー ト メ ーシ ョ ン サーバ と のセ ッ シ ョ ン を 確立 し て ユーザ オブジ ェ ク ト の イ ン ス タ ン ス を作成 し ます。 次に、 オー ト メ ー シ ョ ン の構文を使用 し て コ マ ン ド を ユーザ オブジ ェ ク ト に送 り ます。 ク ラ ス ユーザ オブジ ェ ク ト は、ほかのオブジ ェ ク ト の イ ン ス タ ン ス を 作成で き ます。 サーバは、 こ れ ら のオブジ ェ ク ト の参照を ク ラ イ ア ン ト に渡す こ と がで き ます。 図 19-1: サーバはク ラ ス ユーザ オブ ジ ェ ク ト の参照を ク ラ イ ア ン ト に渡す ク ラ イアン ト アプ リ ケーシ ョ ン オー ト メ ーシ ョ ン サーバ と プ ロ グ ラ ミ ン グ可能な オブ ジ ェ ク ト を サ ポー ト す る ク ラ イ ア ン ト ア プ リ ケ ーシ ョ ン は、 PowerBuilder オー ト メ ーシ ョ ン サーバにア ク セ ス で き ます。 ク ラ イ ア ン ト アプ リ ケーシ ョ ンは、 PowerBuilder、 Visual C++、 Visual Basic な ど の COM 準拠の ツー ルで作成で き ます。 実行時のオーバーヘ ッ ド オー ト メ ーシ ョ ン サーバ と の関連付けが行われ る と 、 PowerBuilder の 実行環境の イ ン ス タ ン ス が起動 し ます。 ただ し 、 サーバの ラ ン タ イ ム セ ッ シ ョ ン と ク ラ イ ア ン ト の ラ ン タ イ ム セ ッ シ ョ ン はシ ス テ ム ク ラ ス の定義を共有す る ため、 オーバーヘ ッ ド にはな り ません。 382 PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ ユーザ ク ラ ス の定義は、 共有 さ れ ません。 し たがっ て、 複数の ラ ン タ イ ム セ ッ シ ョ ン ご と に、 同 じ 大 き さ のオブジ ェ ク ト を作成 し た場合、 オブ ジ ェ ク ト の メ モ リ 使用量は ラ ン タ イ ム セ ッ シ ョ ン の数の倍に な り ます。 アプ リ ケーシ ョ ン を再編成 し て 1 つのサーバ セ ッ シ ョ ンにオ ブジ ェ ク ト を作成す る よ う にすれば、 アプ リ ケーシ ョ ンは メ モ リ を効 率的に使用で き ます。 ラ ン タ イ ム オート メ ーシ ョ ン の用途 機能 を カ プ セ ル化 し て ア ク セ ス 情報 を 提供す る ク ラ ス ユーザ オ ブ ジ ェ ク ト は、 オー ト メ ーシ ョ ン サーバ と し て使用で き ます。 ク ラ イ ア ン ト アプ リ ケーシ ョ ン か ら ア ク セ スす る 情報は、 パブ リ ッ ク の イ ン ス タ ン ス 変数に保持す る か、 関数の戻 り 値や引数 (参照渡 し ) で使用で き る よ う にす る 必要があ り ます。 オー ト メ ーシ ョ ン サーバの例 と し て、以下のユーザ オブジ ェ ク ト があ り ます。 • デー タ ス ト ア オブジ ェ ク ト を作成 し て、 検索 し たデー タ の統計を レ ポー ト す る ユーザ オブジ ェ ク ト • デー タ の妥当性チ ェ ッ ク を行 う な ど、 ビ ジネ ス ルールが定義 さ れ たユーザ オブジ ェ ク ト 3 つのア ク セス 方法 PowerBuilder ユーザ オブジ ェ ク ト にア ク セ ス す る には、 3 つの方法が あ り ます。 以下にその方法を示 し ます。 オー ト メ ーシ ョ ン サーバ と し てのユーザ オブ ジ ェ ク ト • 定義お よ び登録 し た PowerBuilder ク ラ ス ユーザ オブジ ェ ク ト にア ク セ スす る • 指定 し た ラ イ ブ ラ リ に あ る 定義済みの オ ブ ジ ェ ク ト を 作成 し た 後、 PowerBuilder 自身を サーバ と し て ア ク セ スす る • PowerBuilder サーバへのア ク セ ス を提供す る と 同時に、ビ ジネ ス に 適 し た名前を使用で き る 名前付 き サーバにア ク セ スす る ク ラ ス ユーザ オブジ ェ ク ト を定義 し 、 レ ジ ス ト リ に登録で き ます。 ク ラ イ ア ン ト ア プ リ ケーシ ョ ン で提供 さ れて い る 外部オブ ジ ェ ク ト に ア ク セ スす る ための関数を使用すれば、 ユーザ オブジ ェ ク ト のプ ロ パ テ ィ と 関数にア ク セ ス で き ます。 オー ト メ ーシ ョ ン では、 ユーザ オブ ジ ェ ク ト の イ ン ス タ ン ス変数を プ ロ パテ ィ と し て ア ク セ ス し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 383 ラ ン タ イ ム オー ト メ ーシ ョ ン サーバの使い方 ユーザ オブ ジ ェ ク ト を オー ト メ ーシ ョ ン サーバ と し て レ ジ ス ト リ に 登録す る 利点は、 以下の と お り です。 • レ ジ ス ト リ に登録 さ れたユーザ オブジ ェ ク ト の情報を取得で き る ので、 ほかの開発者はそのユーザ オブジ ェ ク ト を使用 し たプ ロ グ ラ ム を簡単に作成で き る • ユーザ オブジ ェ ク ト にア ク セ スす る ための ク ラ イ ア ン ト アプ リ ケーシ ョ ンの コ ー ド が簡単にな る • ク ラ イ ア ン ト アプ リ ケーシ ョ ンは、 レ ジ ス ト リ に登録 さ れた ク ラ ス だけにア ク セ ス で き る 。 し たが っ て、 ユーザ オブジ ェ ク ト の関 数の戻 り 値や イ ン ス タ ン ス変数にア ク セ ス で き る 図 19-2: サーバ と し てのク ラ ス ユーザ オブ ジ ェ ク ト と ク ラ イ ア ン ト の対話 個々のユーザ オブジ ェ ク ト にア ク セ スす る には、 ア ク セ スす る すべて の ユ ー ザ オ ブ ジ ェ ク ト を レ ジ ス ト リ に 登録す る 必要 が あ り ま す。 OLEObject オブ ジ ェ ク ト デー タ 型の変数にユーザ オブ ジ ェ ク ト を 関 連付け、 オー ト メ ーシ ョ ン を使用 し てユーザ オブジ ェ ク ト の メ ソ ッ ド やプ ロ パ テ ィ ( イ ン ス タ ン ス 変数) に ア ク セ ス し ま す。 ユーザ オブ ジ ェ ク ト を関連付け る と 、 PowerBuilder の ラ ン タ イ ム セ ッ シ ョ ンが起 動 し ます。 ラ ン タ イ ム セ ッ シ ョ ン内でユーザ オブ ジ ェ ク ト にア ク セ ス す る 場合 は、 そのユーザ オブジ ェ ク ト の イ ン ス タ ン ス を作成 し ます。 ユーザ オ ブジ ェ ク ト の 1 つの イ ン ス タ ン ス を作成す る たびに、 PowerBuilder の ラ ン タ イ ム セ ッ シ ョ ンが起動 し ます。 登録オブジ ェ ク ト ご と に、 追加 の ラ ン タ イ ム セ ッ シ ョ ン のオーバーヘ ッ ド がかか り ます。 ユーザ オブ ジ ェ ク ト を レ ジ ス ト リ に登録 し て使用す る ための操作手 順については、 387 ページの 「ユーザ オブジ ェ ク ト を オー ト メ ーシ ョ ン サーバ と し て使用す る 方法」 を参照 し て く だ さ い。 384 PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ オー ト メ ーシ ョ ン サーバ と し ての PowerBuilder PowerBuilder を イ ン ス ト ールす る と 、 PowerBuilder を オー ト メ ーシ ョ ン サーバ と し て使用で き る よ う に、 レ ジ ス ト リ に PowerBuilder.Application キーが登録 さ れます。 複数の ク ラ ス ユーザ オブジ ェ ク ト の イ ン ス タ ン ス を作成 し 、 それぞれのプ ロ パテ ィ や メ ソ ッ ド にア ク セ ス で き ます。 オー ト メ ーシ ョ ン では、 ユーザ オブ ジ ェ ク ト の イ ン ス タ ン ス変数を プ ロ パテ ィ と し て ア ク セ ス し ます。 PowerBuilder.Application サーバ オブジ ェ ク ト を使用す る 利点は、 以下 の と お り です。 • PowerBuilder の実行環境を複数起動す る こ と がないので、その分の オーバーヘ ッ ド がかか ら ない。 1 つのサーバ セ ッ シ ョ ン で複数の ユーザ オブジ ェ ク ト にア ク セ ス で き る • 指定 し た ラ イ ブ ラ リ リ ス ト 内のすべてのシ ス テ ム ク ラ ス と 、 プ ラ イ ベー ト ク ラ ス に直接ア ク セ ス で き る 。 こ れ ら の ク ラ ス は PowerBuilder.Application サーバ オブジ ェ ク ト の CreateObject 関数 を使用 し て イ ン ス タ ン ス を作成で き る PowerBuilder.Application サーバ オ ブ ジ ェ ク ト に関連付 け を 行 っ た 後 で、 ア ク セ スす る ラ ン タ イ ム ラ イ ブ ラ リ を指定 し ます。 ラ イ ブ ラ リ 内 のユーザ オブジ ェ ク ト やシ ス テ ム ク ラ ス は、 同 じ サーバ セ ッ シ ョ ン に複数の イ ン ス タ ン ス を作成で き ます。 ク ラ イ ア ン ト ア プ リ ケーシ ョ ン で作成 し た各オブ ジ ェ ク ト の イ ン ス タ ン ス は、 ク ラ イ ア ン ト の OLEObject オブ ジ ェ ク ト と し て扱い ま す。 OLEObject オブジ ェ ク ト に対 し てオー ト メ ーシ ョ ン を使用す る と 、 そ れぞれのオブジ ェ ク ト にア ク セ ス で き ます。 ク ラ イ ア ン ト アプ リ ケー シ ョ ン が、同 じ ラ ン タ イ ム セ ッ シ ョ ン でサーバ オブジ ェ ク ト の参照を 別のサーバ オブジ ェ ク ト に渡す場合、 その渡 さ れたオブジ ェ ク ト の参 照は、 PowerBuilder では PowerBuilder オブジ ェ ク ト デー タ 型 と し て認 識 さ れ ます。 こ れに よ っ て、 ク ラ イ ア ン ト か ら のオー ト メ ーシ ョ ン コ マ ン ド に制限 さ れずに、 同 じ サーバ セ ッ シ ョ ン で 2 つのオブジ ェ ク ト を相互に操作で き る よ う にな り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 385 ラ ン タ イ ム オー ト メ ーシ ョ ン サーバの使い方 図 19-3: 1 つのサーバ セ ッ シ ョ ン内で対話する オブ ジ ェ ク ト PowerBuilder.Application を設定 し て使用す る ための操作手順について は、 392 ページの 「PowerBuilder を オー ト メ ーシ ョ ン サーバ と し て使 用す る 方法」 を参照 し て く だ さ い。 名前付き オー ト メ ー シ ョ ン サーバ ビ ジネ ス上の理由で、 エ ン ド ユーザに PowerBuilder.Application サーバ オブジ ェ ク ト を参照で き ない よ う にす る が、 こ のサーバ オブジ ェ ク ト が提供す る 機能 (た と えば、 1 つのサーバ セ ッ シ ョ ン で複数のユーザ オブジ ェ ク ト の イ ン ス タ ン ス を作成す る よ う な場合) は利用す る と し ます。 レ ジ ス ト リ に PowerBuilder.Application サーバ オブジ ェ ク ト を参照す る も う 1 つのエ ン ト リ を登録す る と 、 その ビ ジネ ス に適切な OLE オー ト メ ーシ ョ ン サーバの名前を付け る こ と がで き ます。 名前付 き オー ト メ ーシ ョ ン サーバ を 設定す る た めの操作手順につい ては、 397 ページの 「名前付 き PowerBuilder オー ト メ ーシ ョ ン サーバ の作成 と 使用」 を参照 し て く だ さ い。 386 PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ ユーザ オブジェ ク ト を オート メ ーショ ン サーバと し て使用 する方法 レ ジ ス ト リ に登録 さ れ た ユ ーザ オ ブ ジ ェ ク ト を オ ー ト メ ー シ ョ ン サーバ と し て ア ク セ スす る には、 以下の操作手順に従い ます。 1 ク ラ ス ユーザ オブジ ェ ク ト を作成 し ます。 2 ク ラ ス ユーザ オブジ ェ ク ト の ラ ン タ イ ム ラ イ ブ ラ リ を構築 し ま す。 3 ク ラ ス ユーザ オブジ ェ ク ト を レ ジ ス ト リ に登録 し ます。 4 ク ラ イ ア ン ト アプ リ ケーシ ョ ン で、ク ラ ス ユーザ オブジ ェ ク ト を 関連付け る オー ト メ ーシ ョ ン コ マ ン ド を記述 し ます。 サーバと な る ク ラ ス ユーザ オブ ジ ェ ク ト の作成 ユーザ オブ ジ ェ ク ト を オー ト メ ーシ ョ ン サーバ と し て使用す る ため に ど の よ う な定義を行 う かは、アプ リ ケーシ ョ ンの設計に依存 し ます。 ユーザ オブジ ェ ク ト は、 カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト でなけ ればな り ません。 ユーザ オブジ ェ ク ト の イ ン ス タ ン ス変数 と 関数を定 義 し ます。 ユーザ オブジ ェ ク ト は、 PowerBuilder のほかのオブジ ェ ク ト を宣言 し てそのオブジ ェ ク ト の イ ン ス タ ン ス を作成で き ます。 ビ ジ ュ アル オブ ジ ェ ク ト は参照 し ない オー ト メ ーシ ョ ン サーバ と し て使用す る ク ラ ス ユーザ オブジ ェ ク ト は、 メ ッ セージ ボ ッ ク スや ウ ィ ン ド ウ な ど の ビ ジ ュ アル オブジ ェ ク ト への参照を含む こ と がで き ません。 ク ラ イアン ト アプ リ ケーシ ョ ンにおける オ ブジ ェ ク ト ク ラ イ ア ン ト アプ リ ケーシ ョ ンの任意のオブジ ェ ク ト は、 ク ラ ス ユー ザ オブ ジ ェ ク ト を参照で き ま す。 ユーザ オブジ ェ ク ト を参照す る に は、 OLEObject オブジ ェ ク ト デー タ 型を使用 し ます。 ク ラ イ ア ン ト ア プ リ ケーシ ョ ン のオブジ ェ ク ト は、 オー ト メ ーシ ョ ン を使用 し てその ユーザ オ ブ ジ ェ ク ト の プ ロ パ テ ィ や メ ソ ッ ド に ア ク セ ス で き ま す。 オー ト メ ーシ ョ ン では、 ユーザ オブジ ェ ク ト の イ ン ス タ ン ス変数を プ ロ パテ ィ と し て ア ク セ ス し ます。 ユーザ オブ ジ ェ ク ト のテ ス ト ユーザ オブ ジ ェ ク ト を オー ト メ ーシ ョ ン サーバ と し て ア ク セ ス す る 前に、 簡単な テ ス ト 環境で、 そのユーザ オブジ ェ ク ト が問題な く 機能 す る か ど う か を テ ス ト し て く だ さ い。 ロ ーカルでユーザ オブジ ェ ク ト を テ ス ト す る ためのアプ リ ケーシ ョ ン を構築で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 387 ユーザ オブ ジ ェ ク ト を オー ト メ ーシ ョ ン サーバ と し て使用する方法 ユーザ オブ ジ ェ ク ト のラ ン タ イ ム ラ イ ブ ラ リ の構築 ユーザ オブジ ェ ク ト を定義 し た後は、 ラ イ ブ ラ リ ペ イ ン タ を使用 し て 動的 ラ イ ブ ラ リ (PBD) か コ ンパ イ ル さ れた ラ イ ブ ラ リ (DLL) を構 築 し ます。 P-code かマシ ン コ ー ド の ど ち ら か を選択す る 理由は、 ど の PowerBuilder アプ リ ケーシ ョ ン を構築す る と き で も 同 じ です。 詳細については、 776 ページの 「 コ ン パ イ ラ の基本事項」 を参照 し て く だ さ い。 ユーザ オブ ジ ェ ク ト と ユーザ オブジ ェ ク ト 内で イ ン ス タ ン ス を作成 す る オブジ ェ ク ト だけ を 1 つの ラ イ ブ ラ リ に格納す る よ う に、 ラ イ ブ ラ リ ペ イ ン タ を使用 し て ラ イ ブ ラ リ を再編成 し ます。 使用 さ れないオ ブジ ェ ク ト を残 し た ま ま に し てお く と 、 ラ ン タ イ ム ラ イ ブ ラ リ が必要 以上に大 き く な り ます。 ラ イ ブ ラ リ ペ イ ン タ で動的 ラ イ ブ ラ リ を構築す る には、 以下の操作を 行い ます。 1 ラ イ ブ ラ リ ペ イ ン タ で、 ラ イ ブ ラ リ 名を選択 し ます。 2 [エ ン ト リ | ラ イ ブ ラ リ |動的 ラ イ ブ ラ リ の構築] を選択 し ます。 3 PBD フ ァ イ ル と DLL フ ァ イ ルのいずれを作成す る かに応 じ て、 [マシ ン コ ー ド ] チ ェ ッ ク ボ ッ ク ス を オ ン ま たはオ フ に し ます。 動的 ラ イ ブ ラ リ の構築 ダ イ ア ロ グ ボ ッ ク ス のほかのオプ シ ョ ン は、 こ のプ ロ セ ス では不要です。 ほかのオプシ ョ ン の詳細につい ては、 [ ヘルプ]ボタ ン を 選択し て、説明を 参照する か、『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 4 [OK] ボ タ ン を ク リ ッ ク し て ラ ン タ イ ム ラ イ ブ ラ リ を構築 し ます。 5 レ ジ ス ト リ に登録す る デ ィ レ ク ト リ に、 ラ ン タ イ ム ラ イ ブ ラ リ を 移動 し ます。 ク ラ ス ユーザ オブ ジ ェ ク ト の登録 ユーザ オブジ ェ ク ト を オー ト メ ーシ ョ ン サーバ と し て使用す る には、 レ ジ ス ト リ に登録す る 必要があ り ます。 ま た、 ユーザ オブジ ェ ク ト の プ ロ パテ ィ と 関数につい て の情報 を 提供す る タ イ プ ラ イ ブ ラ リ を 作 成 し て、 ブ ラ ウ ザ アプ リ ケーシ ョ ン を登録す る こ と も で き ます。 詳細については、 399 ページの 「ユーザ オブジ ェ ク ト と レ ジ ス ト リ に ついての詳細」 を参照 し て く だ さ い。 388 PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ オー ト メ ーシ ョ ン サーバ プ ロ ジ ェ ク ト ウ ィ ザー ド を使用すれば、 タ イ プ ラ イ ブ ラ リ の登録 と 作成が簡単にで き ます。 ❖ レ ジ ス ト リ 情報を作成 し てユーザ オブ ジ ェ ク ト を登録するには 1 新規作成 ダ イ ア ロ グ ボ ッ ク ス の [プ ロ ジ ェ ク ト ] タ ブか ら [オー ト メ ーシ ョ ン サーバ ウ ィ ザー ド ] を選択 し ます。 2 ウ ィ ザー ド 内のすべてのページ を完成 し ます。 表 19-1 を参考に し て く だ さ い。 表 19-1: オー ト メ ーシ ョ ン サーバ ウ ィ ザー ド のページ ページ [ コ ン ポーネ ン ト の選択] 指定する内容 オー ト メ ーシ ョ ン サーバ と し て使用す る オブ ジ ェ ク ト を選択す る 。 オブジ ェ ク ト は 1 つだけ選択で き る 。 PowerBuilder.Application を指定す る タ イ ミ ン グについ ては、397 ページの「名前付 き PowerBuilder オー ト メ ー シ ョ ン サーバの作成 と 使用」 を参照 [プ ロ グ ラ ム識 別子の指定] Mycompany.Myapp な ど、 オブジ ェ ク ト の識別子を指定 [レ ジ ス ト リ フ ァ イ ル と オブ ジ ェ ク ト GUID の指定] [タ イプ ラ イ ブ ラ リ の作成] [構築オプシ ョ ンの指定] ア プ リ ケーシ ョ ン テ ク ニ ッ ク す る 。 バージ ョ ン番号は指定 し ない。PowerBuilder は、 別の画面で指定 さ れ た バー ジ ョ ン 番号 を 使用 し て、 バージ ョ ンに依存す る エン ト リ を構築す る 。 識別子に 使用で き る 文字数の上限は 39 文字であ る 。 ベン ダ と ア プ リ ケーシ ョ ン 間の ピ リ オ ド 以外に句読文字は使 用で き ない。 先頭に数字は使用で き ない [オブジ ェ ク ト ク ラ ス の GUID] テ キ ス ト ボ ッ ク ス が 空で あ る 場合には、 [新規] を ク リ ッ ク し て新規のグ ロ ー バ ル一意識別子 (GUID) を 生成す る 。 新規 の GUID は、 オブジ ェ ク ト の ク ラ ス識別子 (CLSID) に な る 。 既存のプ ロ グ ラ ム識別子を指定 し た場合は、 そ の GUID が テ キ ス ト ボ ッ ク ス に表示 さ れ る 。 既存の GUID を再利用 し ない場合は、 新規の GUID を作成。 GUID の再利用の詳細については、 408 ページの 「複 数のバージ ョ ン と ア ッ プデー ト 」 を参照 レ ジ ス ト リ フ ァ イ ルは、レ ジ ス ト リ の更新情報を格納 す る テ キ ス ト フ ァ イ ルであ る 。 一般に、 こ の フ ァ イ ル は ラ イ ブ ラ リ と 同 じ 名前を持ち、 拡張子は REG であ る タ イ プ ラ イ ブ ラ リ を作成す る 必要が あ る のは、 オブ ジ ェ ク ト の プ ロ パ テ ィ と メ ソ ッ ド に 関す る 情報 を OLE ブ ラ ウ ザで表示する 場合のみ PBD フ ァ イ ルのかわ り に DLL を構築 し た場合には、 [マシ ン コ ー ド DLL の使用] チ ェ ッ ク ボ ッ ク ス を オン にす る 389 ユーザ オブ ジ ェ ク ト を オー ト メ ーシ ョ ン サーバ と し て使用する方法 3 メ ニ ュ ーバーか ら [フ ァ イ ル|開 く ] を選択 し て ウ ィ ザー ド に よ っ て作成 さ れたプ ロ ジ ェ ク ト を選択す る か、 ToDo リ ス ト の 「... プ ロ ジ ェ ク ト を構築す る 」 を ダブル ク リ ッ ク し ます。 4 プ ロ ジ ェ ク ト ペ イ ン タ で メ ニ ュ ーバーか ら [デザ イ ン|プ ロ ジ ェ ク ト の配布] を選択 し 、 レ ジ ス ト リ フ ァ イ ル と タ イ プ ラ イ ブ ラ リ フ ァ イ ルを生成 し ます。 5 レ ジ ス ト リ フ ァ イ ルを実行 し て、レ ジ ス ト リ に情報を追加 し ます。 レ ジ ス ト リ お よ び独自の登録ツールの記述方法の詳細については、403 ページの 「レ ジ ス ト リ 情報の作成」 を参照 し て く だ さ い。 ユーザ オブ ジ ェ ク ト にア ク セス する ク ラ イ ア ン ト ア プ リ ケーシ ョ ン の コ ード の記述 レ ジ ス ト リ に登録 さ れた ユーザ オブ ジ ェ ク ト に ア ク セ ス す る ク ラ イ ア ン ト アプ リ ケーシ ョ ン の コ ー ド は、 PowerBuilder.Application サーバ にア ク セ スす る コ ー ド よ り も 簡単に記述で き ます。 ラ イ ブ ラ リ リ ス ト と マシ ン コ ー ド のプ ロ パテ ィ は、 すでに レ ジ ス ト リ に登録 さ れてい ま す。 ユーザ オブ ジ ェ ク ト のプ ロ パテ ィ や メ ソ ッ ド に ア ク セ ス す る に は、 ユーザ オブ ジ ェ ク ト を 関連付け て オー ト メ ーシ ョ ン を 使用 し ま す。 ク ラ イアン ト アプ リ ケーシ ョ ン と し ての PowerBuilder ユーザ オブ ジ ェ ク ト にア ク セ ス す る ためにオー ト メ ーシ ョ ン サーバ のセ ッ シ ョ ン を確立す る には、 以下の よ う に し ます。 1 ユーザ オブジ ェ ク ト に関連付け る ために、 OLEObject オブジ ェ ク ト デー タ 型の変数を宣言 し ます。 OLEObject ole_analyze 2 ユーザ オブジ ェ ク ト のプ ロ グ ラ ム識別子(ProgID) を使用 し てユー ザ オブジ ェ ク ト と 関連付け を行い、 サーバ セ ッ シ ョ ンが確立 さ れ た こ と を チ ェ ッ ク し ます。 ス テー タ ス 0 は、 セ ッ シ ョ ン の確立が 成功 し た こ と を示 し ます。 ole_analyze = CREATE OLEObject li_status = ole_analyze.ConnectToNewObject & ("MyCompany.Analyze") IF li_status < 0 THEN MessageBox(" サーバが存在 し ません ", & "MyCompany.Analyze に接続で き ません。 ") RETURN END IF 390 PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ 3 オー ト メ ーシ ョ ン構文を使用 し てユーザ オブジ ェ ク ト の関数やプ ロ パテ ィ にア ク セ ス し ます。 ld_avg = ole_analyze.uof_average() ole_analyze.Projection = TRUE li_status = ole_analyze.uof_RTFreport(REF ls_rpt) OLEObject の ExternalException イ ベン ト と Error イ ベン ト でエ ラ ーを処 理 し たい場合には、OLEObject 変数を宣言す る かわ り に、OLEObject か ら 継承 し たユーザ オブジ ェ ク ト を使用 し ます。 1 ユーザ オブジ ェ ク ト ペ イ ン タ を開 き 、 OLEObject オブジ ェ ク ト を 継承 し た標準 ク ラ ス ユーザ オブジ ェ ク ト を作成 し ます。 2 Error イ ベン ト と ExternalException イ ベン ト の ス ク リ プ ト を記述 し ます。 3 OLEObject オブジ ェ ク ト のかわ り に、新 し い ク ラ ス名を宣言文で使 用 し ます。 uo_oleobject ole_analyze ク ラ イ ア ン ト と し ての Visual Basic Visual Basic で も 、 同様の コ ー ド を使用 し て、 レ ジ ス ト リ に登録 さ れた ユーザ オブジ ェ ク ト にア ク セ ス で き ます。 1 ユーザ オブジ ェ ク ト と 関連付け る ために、 オブジ ェ ク ト 型の変数 を宣言 し ます。 Dim ole_analyze As Object 2 ユーザ オブジ ェ ク ト のプ ロ グ ラ ム識別子(ProgID) を使用 し てユー ザ オブジ ェ ク ト と 関連付け を行い、 サーバ セ ッ シ ョ ンが確立 さ れ た こ と をチ ェ ッ ク し ます。 Set ole_analyze = CreateObject("MyCompany.Analyze") If ole_analyze Is Nothing Then REM Handle the error End If 3 オー ト メ ーシ ョ ン構文を使用 し てユーザ オブジ ェ ク ト の関数やプ ロ パテ ィ にア ク セ ス し ます。 ld_avg = ole_analyze.uof_average() ole_analyze.Projection = TRUE li_status = ole_analyze.uof_RTFreport(REF ls_rpt) ア プ リ ケーシ ョ ン テ ク ニ ッ ク 391 PowerBuilder を オー ト メ ーシ ョ ン サーバ と し て使用する方法 PowerBuilder を オー ト メ ーシ ョ ン サーバ と し て使用する 方法 オー ト メ ーシ ョ ン サーバ と し て PowerBuilder.Application サーバ オブ ジ ェ ク ト を使用す る には、 以下の手順が必要です。 1 ア ク セ スす る ク ラ ス ユーザ オブジ ェ ク ト を定義 し ます。 2 作成 し たオブジ ェ ク ト のための ラ ン タ イ ム ラ イ ブ ラ リ を構築 し ま す。 3 ク ラ イ ア ン ト アプ リ ケーシ ョ ン で、 PowerBuilder と 関連付け を行 い、 ユーザ オブ ジ ェ ク ト の イ ン ス タ ン ス を 作成 し 、 ユーザ オブ ジ ェ ク ト の メ ソ ッ ド やプ ロ パテ ィ にア ク セ ス す る コ ー ド を記述 し ます。 ア ク セス する ク ラ ス ユーザ オブ ジ ェ ク ト の作成 ユーザ オブ ジ ェ ク ト を オー ト メ ーシ ョ ン サーバ と し て使用す る ため に ど の よ う な定義を行 う かは、アプ リ ケーシ ョ ンの設計に依存 し ます。 ユーザ オブジ ェ ク ト は、 カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト でなけ ればな り ません。 ユーザ オブジ ェ ク ト の イ ン ス タ ン ス変数 と 関数を定 義 し ます。 ユーザ オブジ ェ ク ト は、 PowerBuilder のほかのオブジ ェ ク ト を宣言 し てそのオブジ ェ ク ト の イ ン ス タ ン ス を作成で き ます。 オー ト メ ーシ ョ ン を使 用 し て作成 さ れたオブ ジェク ト ク ラ イ ア ン ト アプ リ ケーシ ョ ン が、 同 じ サーバ ラ ン タ イ ム セ ッ シ ョ ン に複数のオブジ ェ ク ト の イ ン ス タ ン ス を作成 し た場合、 オブジ ェ ク ト の参照を別のオブジ ェ ク ト に渡 し て こ れ ら のオブジ ェ ク ト を一緒に 処理で き ます。 オブジ ェ ク ト の参照を渡す と 、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン で作成 し た PowerBuilder オブジ ェ ク ト の イ ン ス タ ン ス が、 ほかのオブジ ェ ク ト を 認識で き ま す。 オブ ジ ェ ク ト の イ ン ス タ ン ス が同 じ サーバ セ ッ シ ョ ン に あ る 場合、 PowerBuilder はその OLE オブ ジ ェ ク ト の参照 と PowerBuilder オブジ ェ ク ト デー タ 型を認識 し ます。 ど の PowerBuilder アプ リ ケーシ ョ ン で も 、 オブジ ェ ク ト の参照は、 オブジ ェ ク ト のプ ロ パテ ィ と メ ソ ッ ド へのア ク セ ス を提供 し ます。 ユーザ オブジ ェ ク ト の関数は、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン か ら 渡 さ れたオブジ ェ ク ト の参照を受け入れた り 、 正 し いオブジ ェ ク ト デー タ 型の変数にオブ ジ ェ ク ト の参照 を代入 し た り す る こ と がで き ま す。 ま た、 PowerBuilder オブジ ェ ク ト の イ ン ス タ ン ス の参照を扱 う こ と も で き ます。 392 PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ ラ ン タ イ ム ラ イ ブ ラ リ の構築 ユーザ オブ ジ ェ ク ト を定義 し た後は、 ラ イ ブ ラ リ ペ イ ン タ を使用 し て、 PowerBuilder 動的 ラ イ ブ ラ リ (PBD) ま たは コ ン パ イ ル さ れた ラ イ ブ ラ リ (DLL) を構築 し ます。 同 じ PowerBuilder.Application サーバ セ ッ シ ョ ン でア ク セ ス さ れ る ラ ン タ イ ム ラ イ ブ ラ リ は、 すべて同 じ 種 類 (PBD か DLL の ど ち ら か) でな ければな り ま せん。 P-code かマ シ ン コ ー ド の ど ち ら か を選択す る 理由は、 ど の PowerBuilder アプ リ ケー シ ョ ン を構築す る と き で も 同 じ です。 ラ イ ブ ラ リ ペ イ ン タ で ラ ン タ イ ム ラ イ ブ ラ リ を構築す る には、以下の 操作を行い ます。 1 ラ イ ブ ラ リ ペ イ ン タ で、 ラ イ ブ ラ リ 名を選択 し ます。 2 [エ ン ト リ | ラ イ ブ ラ リ |動的 ラ イ ブ ラ リ の構築] を選択 し ます。 3 PBD フ ァ イ ル と DLL フ ァ イ ルのいずれを作成す る かに応 じ て、 [マシ ン コ ー ド ] チ ェ ッ ク ボ ッ ク ス を オ ン ま たはオ フ に し ます。 動的 ラ イ ブ ラ リ の構築 ダ イ ア ロ グ ボ ッ ク ス のほかのオプ シ ョ ン は、 こ のプ ロ セ ス では不要です。 ほかのオプシ ョ ン の詳細につい ては、 [ ヘルプ]ボタ ン を 選択し て、説明を 参照する か、『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 4 [OK] ボ タ ン を ク リ ッ ク し て ラ ン タ イ ム ラ イ ブ ラ リ を構築 し ます。 5 PowerBuilder.Application サーバ オブジ ェ ク ト の LibraryList プ ロ パ テ ィ に指定 し た各 ラ イ ブ ラ リ に対 し て、 操作 1 ~ 4 を繰 り 返 し ま す。 6 構築 さ れた PBD フ ァ イ ルま たは DLL フ ァ イ ルを適切なデ ィ レ ク ト リ へ移動 し ます。 ク ラ イ ア ン ト アプ リ ケーシ ョ ン では、 オー ト メ ーシ ョ ン サーバが ラ ン タ イ ム フ ァ イ ルの場所 を 確認で き る よ う に、 ラ ン タ イ ム フ ァ イ ルのパ ス を指定 し ます。 プ ロ ジ ェ ク ト ペ イ ン タ で の プ ロ ジ ェ ク ト の構築の詳細につい て は、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 393 PowerBuilder を オー ト メ ーシ ョ ン サーバ と し て使用する方法 PowerBuilder と ユーザ オブ ジ ェ ク ト にア ク セス する ク ラ イ ア ン ト ア プ リ ケーシ ョ ン のコ ード の記述 ク ラ イ ア ン ト ア プ リ ケ ー シ ョ ン で、 PowerBuilder.Application サーバ セ ッ シ ョ ン を確立す る には、 以下の記述を行い ます。 • オー ト メ ーシ ョ ン サーバへの関連付け • オー ト メ ーシ ョ ン サーバのプ ロ パテ ィ の設定 • ユーザ オブジ ェ ク ト の イ ン ス タ ン ス の作成 • ユーザ オブジ ェ ク ト へのア ク セ ス サーバ セ ッ シ ョ ン の確立は失敗す る こ と も あ る ので、 プ ロ セ ス のすべ ての手順でエ ラ ー チ ェ ッ ク を行 う 必要があ り ます。 以下の例は、 その方法を表 し てい ま す。 最初に、 PowerBuilder の ク ラ イ ア ン ト アプ リ ケーシ ョ ンの コ ー ド を示 し ます。 次に、 Visual Basic の 例を示 し ます。 ク ラ イアン ト アプ リ ケーシ ョ ン と し ての PowerBuilder PowerBuilder.Application サーバ セ ッ シ ョ ン を確立 し てオブジ ェ ク ト に ア ク セ スす る には、 以下の よ う に し ます。 1 PowerBuilder.Application サーバ オブジ ェ ク ト と 関連付け を行 う た めに、OLEObject オブジ ェ ク ト デー タ 型の変数を 1 つ宣言 し ます。 次に、 ユ ーザ オ ブ ジ ェ ク ト の イ ン ス タ ン ス を 作成す る た め に、 OLEObject オブジ ェ ク ト デー タ 型の変数を追加宣言 し ます。 OLEObject ole_pba, ole_analyze OLEObject オブジ ェ ク ト の ExternalException イ ベン ト と Error イ ベ ン ト でエ ラ ーを扱 う 場合は、OLEObject オブジ ェ ク ト を継承 し た標 準 ク ラ ス ユーザ オブジ ェ ク ト を使用 し ます。 2 名前付 き PowerBuilder オー ト メ ーシ ョ ン サーバに関連付け を行 い、サーバ セ ッ シ ョ ンが確立 さ れた こ と をチ ェ ッ ク し ます。ス テー タ ス 0 は、 サーバ セ ッ シ ョ ンが成功 し た こ と を示 し ます。 ole_pba = CREATE OLEObject li_status = ole_pba.ConnectToNewObject & ("PowerBuilder.Application") IF li_status < 0 THEN MessageBox(" サーバが存在 し ません ", & "PowerBuilder.Application に接続で き ません。 ") RETURN END IF 394 PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ 3 ア ク セ スす る ラ ン タ イ ム ラ イ ブ ラ リ を設定す る ために、 PowerBuilder.Application サーバ オブジ ェ ク ト のプ ロ パテ ィ を設定 し ます。 ユーザ オブジ ェ ク ト の イ ン ス タ ン ス を作成 し た後では、 こ れ ら のプ ロ パテ ィ の値を変更す る こ と はで き ません。 ole_pba.LibraryList = & "c:¥pb9¥myobj¥serv1.dll;c:¥pb9¥myobj¥serv2.dll" ole_pba.MachineCode = TRUE 4 ユーザ オブジ ェ ク ト の イ ン ス タ ン ス を作成 し 、 イ ン ス タ ン ス の作 成が成功 し たか ど う か を チ ェ ッ ク し ま す。 こ の と き 、 ラ ン タ イ ム ラ イ ブ ラ リ 内にあ る ユーザ オブジ ェ ク ト の名前を指定 し ます。 ole_analyze = ole_pba.CreateObject("uo_analyze") IF IsNull(ole_analyze) THEN MessageBox(" オブ ジ ェ ク ト が存在 し ません ", & " オブ ジ ェ ク ト uo_analyze を作成で き ません。 ") RETURN END IF 5 オー ト メ ーシ ョ ン の構文を使用 し てオブジ ェ ク ト の関数やプ ロ パ テ ィ にア ク セ ス し ま す。 以下にプ ロ パテ ィ と メ ソ ッ ド の例を示 し ます。 ld_avg = ole_analyze.uof_average() ole_analyze.Projection = TRUE li_status = ole_analyze.uof_RTFReport(REF ls_rpt) 6 ア ク セ ス が終了 し た ら 、 PowerBuilder.Application サーバ オブジ ェ ク ト と の関連付け を解除 し 、 ユーザ オブジ ェ ク ト の イ ン ス タ ン ス を破棄 し ま す。 ま た、 こ の処理は、 ア プ リ ケーシ ョ ン を終了 し て 実行す る こ と も で き ます。 DESTROY ole_analyze ole_pba.DisconnectObject() DESTROY ole_pba ク ラ イアン ト アプ リ ケーシ ョ ン と し ての Visual Basic 以下に、PowerBuilder.Application サーバ オブジェ ク ト を 使用する Visual Basic ク ラ イ ア ン ト の コ ー ド を示 し ます。コ ー ド の内容は、PowerBuilder と 同 じ です。 1 PowerBuilder.Application サーバ オブジェ ク ト と 関連付ける ために、 オブジ ェ ク ト 型の変数を宣言 し ま す。 ま た、 イ ン ス タ ン ス を作成 す る オブジ ェ ク ト のために、 オブジ ェ ク ト 型の変数を追加宣言 し ます。 Dim ole_pba As Object Dim ole_analyze As Object ア プ リ ケーシ ョ ン テ ク ニ ッ ク 395 PowerBuilder を オー ト メ ーシ ョ ン サーバ と し て使用する方法 2 名前付 き PowerBuilder オー ト メ ーシ ョ ン サーバに関連付け を行 い、サーバ セ ッ シ ョ ンが確立 さ れた こ と をチ ェ ッ ク し ます。ス テー タ ス 0 は、 サーバ セ ッ シ ョ ンが成功 し た こ と を示 し ます。 Set ole_pba = CreateObject_ ("PowerBuilder.Application") If ole_pba Is Nothing Then REM Handle the error End If 3 ア ク セ スす る ラ ン タ イ ム ラ イ ブ ラ リ を設定す る ために、 PowerBuilder.Application サーバ オブジ ェ ク ト のプ ロ パテ ィ を設定 し ます。 ユーザ オブジ ェ ク ト の イ ン ス タ ン ス を作成 し た後では、 こ れ ら のプ ロ パテ ィ の値を変更す る こ と はで き ません。 ole_pba.LibraryList = _ "c:¥pb¥myobj¥serv1.dll;c:¥pb¥myobj¥serv2.dll" ole_pba.MachineCode = TRUE 4 ユーザ オブジ ェ ク ト の イ ン ス タ ン ス を作成 し 、 イ ン ス タ ン ス の作 成が成功 し たか ど う か を チ ェ ッ ク し ま す。 こ の と き 、 ラ ン タ イ ム ラ イ ブ ラ リ 内にあ る ユーザ オブジ ェ ク ト の名前を指定 し ます。 Set ole_analyze = ole_pba.CreateObject _ ("uo_analyze") If ole_analyze Is Nothing Then REM Handle the error End If 5 オー ト メ ーシ ョ ン の構文を使用 し てオブジ ェ ク ト の関数やプ ロ パ テ ィ にア ク セ ス し ま す。 以下にプ ロ パテ ィ と メ ソ ッ ド の例を示 し ます。 ld_avg = ole_analyze.uof_average() ole_analyze.Projection = TRUE li_status = ole_analyze.uof_RTFreport(REF ls_rpt) 6 オブジ ェ ク ト の イ ン ス タ ン ス を破棄 し ま す。 アプ リ ケーシ ョ ン を 終了 し て も 同 じ 結果が得 ら れ ます。 Set ole_analyze = Nothing Set ole_pba = Nothing PowerBuilder.Application サーバ オブジ ェ ク ト の関数 と プ ロ パテ ィ の詳 細については、408 ページの 「オー ト メ ーシ ョ ン サーバ リ フ ァ レ ン ス」 を参照 し て く だ さ い。 396 PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ 名前付き PowerBuilder オー ト メ ーシ ョ ン サーバの作成 と 使用 名前付 き PowerBuilder オー ト メ ーシ ョ ン サーバを使用す る には、 以下 の よ う に し ます。 ア ク セスする ク ラ ス ユーザ オブ ジ ェ ク ト の作成 1 ア ク セ スす る ク ラ ス ユーザ オブジ ェ ク ト を定義 し ます。 2 作成 し たオブジ ェ ク ト のための ラ ン タ イ ム ラ イ ブ ラ リ を構築 し ま す。 3 レ ジ ス ト リ にオー ト メ ーシ ョ ン サーバを登録 し ます。 4 オー ト メ ーシ ョ ン サーバに関連付け を行い、 ユーザオブジ ェ ク ト の イ ン ス タ ン ス を作成 し ます。次に、ユーザオブジ ェ ク ト の メ ソ ッ ド と プ ロ パテ ィ にア ク セ ス す る ク ラ イ ア ン ト ア プ リ ケーシ ョ ン の コ ー ド を記述 し ます。 名前付 き PowerBuilder オー ト メ ーシ ョ ン サーバにおけ る ク ラ ス ユー ザ オブジ ェ ク ト の定義は、 PowerBuilder.Application サーバ オブジ ェ ク ト と 同 じ です。 詳細については、 392 ページの 「ア ク セ スす る ク ラ ス ユーザ オブジ ェ ク ト の作成」 を参照 し て く だ さ い。 ラ ン タ イム ラ イ ブ ラ リ の構築 名前付 き PowerBuilder オー ト メ ーシ ョ ン サーバにおけ る ラ ン タ イ ム ラ イ ブ ラ リ の構築は、 PowerBuilder.Application サーバ オブジ ェ ク ト と 同 じ です。 詳細については、 393 ページの 「 ラ ン タ イ ム ラ イ ブ ラ リ の構築」 を参 照 し て く だ さ い。 オー ト メ ーシ ョ ン サーバの登録 388 ページの 「 ク ラ ス ユーザ オブジ ェ ク ト の登録」 で説明 し た よ う に、 サーバを登録す る には、 オー ト メ ーシ ョ ン サーバ プ ロ ジ ェ ク ト ウ ィ ザー ド を使用 し ます。 1 つのユーザ オブジ ェ ク ト ではな く 、サーバを登録す る には、コ ン ポー ネ ン ト と し て PowerBuilder.Application を選択 し ます。388 ページの 「 ク ラ ス ユーザ オブジ ェ ク ト の登録」 で説明 し た よ う に操作を行い、 レ ジ ス ト リ に レ ジ ス ト リ フ ァ イ ルを取 り 込みます。 名前付 き サーバの タ イ プ ラ イ ブ ラ リ フ ァ イ ルを作成す る 必要はあ り ません。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 397 名前付き PowerBuilder オー ト メ ーシ ョ ン サーバの作成 と 使用 オー ト メ ーシ ョ ン サーバ と ユーザ オブ ジ ェ ク ト を ア ク セスす る ク ラ イアン ト アプ リ ケーシ ョ ンの コ ー ド の記述 ク ラ イ ア ン ト アプ リ ケーシ ョ ン で、 名前付 き PowerBuilder オー ト メ ー シ ョ ン サーバのセ ッ シ ョ ン を確立す る には、 以下の記述を行い ます。 • オー ト メ ーシ ョ ン サーバへの関連付け • ユーザ オブジ ェ ク ト の イ ン ス タ ン ス の作成 • ユーザ オブジ ェ ク ト へのア ク セ ス 以下の例は、 その方法を表 し てい ま す。 例は、 PowerBuilder の ク ラ イ ア ン ト アプ リ ケーシ ョ ン の コ ー ド です。サーバ セ ッ シ ョ ンの確立は失 敗す る こ と も あ る ので、 プ ロ セ ス のすべての手順でエ ラ ー チ ェ ッ ク を 行 う 必要があ り ます。 1 名前付 き PowerBuilder オー ト メ ーシ ョ ン サーバ と 関連付け を行 う ために、 OLEObject オブジ ェ ク ト デー タ 型の変数を 1 つ宣言 し ま す。 次に、 ユーザ イ ン ス タ ン ス を作成す る ために、 OLEObject オ ブジ ェ ク ト デー タ 型の変数を追加宣言 し ます。 OLEObject ole_server, ole_analyze OLEObject オブジ ェ ク ト の ExternalException イ ベン ト と Error イ ベ ン ト でエ ラ ーを扱 う 場合は、OLEObject オブジ ェ ク ト を継承 し た標 準 ク ラ ス ユーザ オブジ ェ ク ト を使用 し ます。 2 名前付 き PowerBuilder オー ト メ ーシ ョ ン サーバに関連付け を行 い、サーバ セ ッ シ ョ ンが確立 さ れた こ と をチ ェ ッ ク し ます。ス テー タ ス 0 は、 セ ッ シ ョ ンの確立が成功 し た こ と を示 し ます。 ole_server = CREATE OLEObject li_status = ole_server.ConnectToNewObject & ("MyCompany.MyServer") IF li_status < 0 THEN MessageBox(" サーバが存在 し ません ", & " サーバに接続で き ません。 ") RETURN END IF 3 ユーザ オブジ ェ ク ト の イ ン ス タ ン ス を作成 し 、 イ ン ス タ ン ス の作 成が成功 し たか ど う か を チ ェ ッ ク し ま す。 こ の と き 、 ラ ン タ イ ム ラ イ ブ ラ リ 内にあ る ユーザ オブジ ェ ク ト の名前を指定 し ます。 ole_analyze = & ole_server.CreateObject("uo_analyze") IF IsNull(ole_analyze) THEN MessageBox(" オブ ジ ェ ク ト が存在 し ません ", & " オブ ジ ェ ク ト uo_analyze を作成で き ません。 ") RETURN END IF 398 PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ 4 オー ト メ ーシ ョ ン の構文を使用 し てオブジ ェ ク ト の関数やプ ロ パ テ ィ にア ク セ ス し ま す。 以下にプ ロ パテ ィ と メ ソ ッ ド の例を示 し ます。 ld_avg = ole_analyze.uof_average() ole_analyze.Projection = TRUE li_status = ole_analyze.uof_RTFReport(REF ls_rpt) 5 ア ク セ ス が終了 し た ら 、 名前付 き PowerBuilder オー ト メ ーシ ョ ン サーバ と の関連付け を解除 し 、 ユーザ オブジ ェ ク ト の イ ン ス タ ン ス を破棄 し ま す。 ま た、 こ の処理は、 ア プ リ ケーシ ョ ン を終了 し て実行す る こ と も で き ます。 DESTROY ole_analyze ole_server.DisconnectObject() DESTROY ole_server ユーザ オブ ジ ェ ク ト と レ ジ ス ト リ についての詳細 レ ジ ス ト リ は、 登録 さ れたオブジ ェ ク ト を ア ク セ ス す る ために、 プ ロ グ ラ ム が必要 と す る レ ジ ス ト リ 情報を格納 し てい ます。 こ の情報は登 録デー タ ベー ス に格納 さ れてい ます。 レ ジ ス ト リ を更新す る には、 レ ジ ス ト リ エデ ィ タ で レ ジ ス ト リ フ ァ イ ル (REG) を読み取 り 、 レ ジ ス ト リ 情報を更新 し ます。 識別子について GUID と CLSID グ ロ ーバル一意識別子 (GUID) は、 128 ビ ッ ト の整数で一意であ る こ と が 保 証 さ れ て い ま す。 PowerBuilder.Application オ ブ ジ ェ ク ト の GenerateGUID 関数を使用す る と 、 独自に GUID を生成す る こ と も で き ます。 GUID は、 時刻、 日付、 使用 し てい る ネ ッ ト ワ ー ク カー ド の固 有の番号に基づいて生成 さ れ ます。 ネ ッ ト ワー ク カー ド を使用 し てい ない場合は、 Microsoft に 256 セ ッ ト の GUID を問い合わせ る こ と がで き ます。 GUID は、 オブジ ェ ク ト と タ イ プ ラ イ ブ ラ リ を一意に識別す る ための ク ラ ス 識別子 (CLSID) と し て使用 さ れ ます。 CLSID は、 プ ロ グ ラ ム が使用す る オブジ ェ ク ト を確実に識別す る こ と がで き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 399 ユーザ オブ ジ ェ ク ト と レ ジ ス ト リ についての詳細 ProgID プ ロ グ ラ ム識別子 (ProgID) は、 ロ ーカルの環境で一意です。 ProgID に使用でい る 文字数の上限は 39 文字で、ピ リ オ ド 以外の区切 り 記号を 使用 し た り 、 先頭文字に数字 を 使用 し た り す る こ と は で き ま せん。 ProgID には、 2 つの種類があ り ます。 • バージ ョ ン非依存 (Vergion-independent) ProgID ProgID にバージ ョ ン番号を含ま ない applicationname.objectname た と えば、 MyApp.Application、 MyApp.AnalysisUserObject な ど です。 • バージ ョ ン依存 (Vergion-dependent) ProgID ProgID に バ ー ジ ョ ン 番号を含む applicationname.objectname.versionnumber た と えば、 MyApp.Application.1、 MyApp.AnalysisUserObject.1 な ど です。 ほ かの開発者がオ ブ ジ ェ ク ト 間の関係 を 理解で き る よ う に、 ア プ リ ケーシ ョ ン と オブジ ェ ク ト の命名規約は、 一貫性があ る よ う にす る 必 要があ り ます。 レ ジ ス ト リ に登録 し たオブジ ェ ク ト へア ク セ スす る ために、 ProgID を 使用 し ます。 バージ ョ ン非依存 ProgID を指定 し た場合、 レ ジ ス ト リ は 現行のバージ ョ ンのオブジ ェ ク ト を呼び出 し ます。 PowerBuilder.Application オブジ ェ ク ト の GenerateRegFile 関数を使用す る と き に、 バージ ョ ン非依存 ProgID を引数に指定す る と 、 関数の引数 に指定 し たバージ ョ ン 番号 を 使用 し て バージ ョ ン 番号の あ る ProgID が作成 さ れます。 オブ ジ ェ ク ト に関する 情報の登録場所 オブジ ェ ク ト に関す る 情報は、 レ ジ ス ト リ の以下のサブキーに登録 さ れ ます。 以下のセ ク シ ョ ン があ り ます。 • CLSID • Version-dependent ProgID • Version-independent ProgID • TypeLib (オプシ ョ ン) オブジ ェ ク ト が ど の よ う に起動 さ れて も 、 こ のサブキーの参照に よ っ て、 オブジ ェ ク ト に関す る 情報が必ず見つか る よ う にな っ てい ます。 400 PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ キー と サブキー PowerBuilder.Application オブジェ ク ト の関数は、HKEY_CLASSES_ROOT キーを更新 し ます。 レ ジ ス ト リ のほかのキーに対 し て も こ の情報が反 映 さ れ ます。 サブキー オブジ ェ ク ト の情報は、 キーの下位レベルにあ る サブキーに登録 さ れ ま す。 サ ブ キ ーに は、 フ ァ イ ル名 な ど の値 が含 ま れ て い る も のや、 NotInsertable な ど の よ う に存在す る だけで意味のあ る も の も あ り ます。 各エ ン ト リ と そのサブキーについては、 以下で説明 し ます。 ProgID 登録 さ れた ProgID の一覧は、 レ ジ ス ト リ の以下の キーの下に あ り ま す。 My Computer¥HKEY_LOCAL_MACHINE¥SOFTWARE¥CLASSES バージ ョ ン依存 ProgID と バージ ョ ン非依存 ProgID が表示 さ れ ま す。 ProgID は、 オブジ ェ ク ト の CLSID への相互参照です。 表 19-2: ProgID サブキー サブキー ¥CLASSES¥ProgID ¥CLASSES¥ProgID¥CLSID ¥CLASSES¥ProgID¥CurVer (バ ー ジ ョ ン 非依存 ProgID のみ) ¥CLASSES¥ProgID¥NotInsertable CLSID 値 オブジ ェ ク ト の コ メ ン ト オブジ ェ ク ト の CLSID バージ ョ ン依存 ProgID 空の文字列 CLASSES キーの下には、 レ ジ ス ト リ に登録 さ れたすべての CLSID の 一覧を表示す る サブキー CLSID があ り ます。 各 CLSID は、 登録 さ れ たオブジ ェ ク ト に関す る すべての情報を記録 し てい ます。 My Computer¥HKEY_LOCAL_MACHINE¥SOFTWARE¥CLASSES¥CLSID ア プ リ ケーシ ョ ン テ ク ニ ッ ク 401 ユーザ オブ ジ ェ ク ト と レ ジ ス ト リ についての詳細 表 19-3: CLSID サブキーの内容 サブキー ¥CLASSES¥CLSID¥{guid} ¥CLASSES¥CLSID¥{guid}¥InProcServer32 ¥CLASSES¥CLSID¥{guid}¥NotInsertable ¥CLASSES¥CLSID¥{guid}¥PowerBuilder ¥CLASSES¥CLSID¥{guid}¥Programmable ¥CLASSES¥CLSID¥{guid}¥ProgID ¥CLASSES¥CLSID¥{guid}¥TypeLib ¥CLASSES¥CLSID¥{guid}¥ VersionIndependentProgID 値 オブジ ェ ク ト の GUID PowerBuilder の ラ ン タ イ ム DLL フ ァ イ ル名 と パ ス名 "" 何 も 設定 さ れない。 サブキー は、 オブジ ェ ク ト の環境に関 する 情報を格納する (次表を 参照)。 "" 現行のバージ ョ ン番号が指定 さ れたバージ ョ ン依存 ProgID タ イ プ ラ イ ブ ラ リ の CLSID バージ ョ ン非依存 ProgID 表 19-4: PowerBuilder サブキーの内容 ¥CLASSES¥CLSID の下の PowerBuilder サブキー {guid}¥PowerBuilder¥BinaryType {guid}¥PowerBuilder¥LibraryList {guid}¥PowerBuilder¥ClassName TypeLib 値 ラ ン タ イ ム ラ イ ブ ラ リ の種 類。 コ ンパ イ ル さ れたマシ ン コ ー ド (MCODE) か Pcode オブジ ェ ク ト を格納 し てい る ラ ン タ イ ム ラ イ ブ ラ リ の名前 ラ ン タ イ ム ラ イ ブ ラ リ 内のオ ブジ ェ ク ト の名前 CLASSES キーの下には、 タ イ プ ラ イ ブ ラ リ のためのサブキーがあ り ます。 My Computer¥HKEY_LOCAL_MACHINE¥SOFTWARE¥CLASSES TypeLib 402 PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ 表 19-5: TypeLib サブキーの内容 サブキー ¥CLASSES¥TypeLib¥{guid} ¥CLASSES¥TypeLib¥{guid}¥VersionNum ¥CLASSES¥TypeLib¥{guid}¥FLAGS ¥CLASSES¥TypeLib¥{guid}¥HELPDIR 値 タ イ プ ラ イ ブ ラ リ の GUID タ イ プ ラ イ ブ ラ リ のバージ ョ ン番号 い く つかの言語に対応 し た タ イ プ ラ イ ブ ラ リ を登録で き る よ う に、 バージ ョ ン番号か ら 下にサブキーの ツ リ ーがあ る VersionNum¥LanguageID¥Win3 2 は、 32 ビ ッ ト の Windows オ ペレーテ ィ ン グ シ ス テ ム用 タ イ プ ラ イ ブ ラ リ フ ァ イ ルの パ ス と 名前を指定す る 0 ヘルプ フ ァ イ ルがあ る デ ィ レ クトリ レ ジ ス ト リ 情報の作成 ク ラ イ ア ン ト アプ リ ケーシ ョ ンは、ユーザ オブジ ェ ク ト にア ク セ スす る ために必要な情報を取得す る ために、 レ ジ ス ト リ を使用 し ます。 レ ジ ス ト リ は、 PowerBuilder の実行環境 と ラ ン タ イ ム ラ イ ブ ラ リ があ る デ ィ レ ク ト リ のパ ス 名を格納 し てい ます。 ま た、 オブジ ェ ク ト のプ ロ パ テ ィ と メ ソ ッ ド の情報 を 提供す る タ イ プ ラ イ ブ ラ リ フ ァ イ ルの GUID と 、そのデ ィ レ ク ト リ のパ ス名を レ ジ ス ト リ に登録で き ます。 タ イ プ ラ イ ブ ラ リ が登録 さ れていれば、 エ ン ド ユーザに OLE ブ ラ ウ ザ の機能を持つアプ リ ケーシ ョ ン で、 ユーザ オブジ ェ ク ト を調べ る こ と がで き ます。 ユーザ オブジ ェ ク ト の イ ン ス タ ン ス変数は、 OLE ブ ラ ウ ザではプ ロ パテ ィ と し て表示 さ れます。 PowerBuilder.Application サーバ オブジ ェ ク ト には、 レ ジ ス ト リ 情報を 生成す る 機能があ り ます。レ ジ ス ト リ にオブジ ェ ク ト を登録す る には、 レ ジ ス ト リ フ ァ イ ルが必要です。 こ の フ ァ イ ルには、 シ ス テ ム の登録 デー タ ベース に追加 さ れ る 情報が格納 さ れます。 タ イ プ ラ イ ブ ラ リ の 作成は任意です。 ほかの開発者が、 OLE ブ ラ ウ ザでオブジ ェ ク ト のプ ロ パテ ィ や メ ソ ッ ド を調べ る 場合に必要です。 以下の関数を使用す る には、 PowerBuilder.Application サーバ オブジ ェ ク ト に ア ク セ ス す る ク ラ イ ア ン ト ア プ リ ケーシ ョ ン を 実行す る 必要 があ り ます。 開発環境で、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン を実行す る こ と がで き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 403 ユーザ オブ ジ ェ ク ト と レ ジ ス ト リ についての詳細 以下の関数は、 レ ジ ス ト リ 情報を生成 し ます。 グ ロ ーバル一意識別子 (GUID) を生成 し ます。 GUID は、 オブジ ェ ク ト やそのオブジ ェ ク ト の タ イ プ ラ イ ブ ラ リ の CLSID と し て使用 し ます。 • GenerateGUID 関数 • GenerateRegFile 関数 • GenerateTypeLib 関数 レ ジ ス ト リ エデ ィ タ (REGEDT32.EXE) で 取 り 込め る レ ジ ス ト リ フ ァ イ ルを生成 し ます。 レ ジ ス ト リ フ ァ イ ルは、 PowerBuilder.Application サーバ オブジ ェ ク ト のプ ロ パテ ィ 、 ユーザ オブジ ェ ク ト の GUID、 ク ラ ス名な ど が記述 さ れてい ます。 タ イ プ ラ イ ブ ラ リ フ ァ イ ルを生成 し ます。 タ イ プ ラ イ ブ ラ リ は、 ユーザ オブ ジ ェ ク ト の メ ソ ッ ド やプ ロ パ テ ィ 情報な ど が記述 さ れてい ます。 開発者は、 以下の例で示 さ れ る よ う に、 こ れ ら の関数を使用で き ます。 ま た、InstallShield の よ う な イ ン ス ト ール アプ リ ケーシ ョ ン を使用 し て レ ジ ス ト リ 情報を作成す る こ と も で き ます。 配布 と レ ジ ス ト リ ロ ーカル マシ ン で作成 し た レ ジ ス ト リ フ ァ イ ルは、 ロ ーカル マ シ ン にオブジ ェ ク ト を登録す る ために使用で き ます。 フ ァ イ ル (オブジ ェ ク ト が格納 さ れてい る ラ イ ブ ラ リ と タ イ プ ラ イ ブ ラ リ ) のパ ス名はマ シ ン固有で、 ほかのマシ ン には適用で き ません。 オブジ ェ ク ト を配布 す る 場合は、 エ ン ド ユーザが イ ン ス ト ールす る と き に指定す る デ ィ レ ク ト リ に応 じ て、 レ ジ ス ト リ フ ァ イ ルを更新す る か、 レ ジ ス ト リ 自身 を更新す る 関数を呼び出す必要があ り ます。 407 ページの 「オー ト メ ーシ ョ ン サーバを使用す る アプ リ ケーシ ョ ン の配布」 を参照 し て く だ さ い。 レ ジ ス ト リ 情報を生成 する ためのス ク リ プ ト のサン プル こ の ス ク リ プ ト は、い く つかのシ ン グル ラ イ ン エデ ィ ッ ト コ ン ト ロ ー ル と チ ェ ッ ク ボ ッ ク ス か ら 情報を取得 し 、 レ ジ ス ト リ フ ァ イ ル と タ イ プ ラ イ ブ ラ リ を生成 し ます。 ス ク リ プ ト ではバージ ョ ン情報を直接指 定 し てい ますが、エデ ィ ッ ト ボ ッ ク ス な ど を使用 し てエ ン ド ユーザに 入力 さ せ る こ と も で き ます。 例 で 使用 さ れ て い る シ ン グ ル ラ イ ン エ デ ィ ッ ト コ ン ト ロ ー ル と チ ェ ッ ク ボ ッ ク ス は、 表 19-6 の と お り です。 404 PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ 表 19-6: シ ングルラ イ ン エデ ィ ッ ト コ ン ト ロール と チ ェ ッ ク ボ ッ ク スの例 デー タ 入力用の コ ン ト ロール 入力 さ れるデー タ sle_object PowerBuilder ラ イ ブ ラ リ 内のユーザ オブジ ェ ク ト の名前 sle_progid プ ロ グ ラ ム識別子 sle_desc レ ジ ス ト リ に表示 さ れ る オブジ ェ ク ト の コ メ ン ト sle_regfile 生成す る レ ジ ス ト リ フ ァ イ ルの名前 sle_typelibfile 生成す る タ イ プ ラ イ ブ ラ リ フ ァ イ ルの名前 sle_library オブジ ェ ク ト を格納 し てい る PowerBuilder ラ ン タ イ ム ラ イ ブ ラ リ の名前 cbx_machinecode ラ ン タ イ ム ラ イ ブ ラ リ が、マシ ン コ ー ド と P-code の ど ち ら で作成 さ れてい る か 以下のプ ロ グ ラ ムは、レ ジ ス ト リ フ ァ イ ル と タ イ プ ラ イ ブ ラ リ を生成 し ます。 oleObject ole_pb string ls_reg_guid, ls_tlb_guid long ll_result, ll_res2 // PowerBuilder.Application サーバ オブ ジ ェ ク ト と の関連付け ole_pb = CREATE oleObject ll_result = ole_pb.ConnectToNewObject & ("PowerBuilder.Application") IF ll_result < 0 THEN MessageBox( " 接続で き ません ", & "PowerBuilder.Application への接続エ ラ ー ") RETURN END IF // 値 と な る PowerBuilder.Application サーバ オブ ジ ェ ク ト の // プ ロパテ ィ の設定 ole_pb.LibraryList = sle_library.Text ole_pb.MachineCode = cbx_machinecode.Checked // オブ ジ ェ ク ト と タ イ プ ラ イ ブ ラ リ の GUID の取得 ll_result = ole_pb.GenerateGUID( REF ls_reg_guid) ll_res2 = ole_pb.GenerateGUID( REF ls_tlb_guid) IF ll_result < 0 THEN MessageBox( "GUID を取得で き ません ", & " レ ジ ス ト リ フ ァ イルの GUID の生成に失敗 し ま し た。 ") RETURN ELSEIF ll_res2 < 0 THEN MessageBox( "GUID を取得で き ません ", & " タ イ プ ラ イ ブ ラ リ フ ァ イルの GUID の生成に失敗 し ま し た。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 405 ユーザ オブ ジ ェ ク ト と レ ジ ス ト リ についての詳細 ") RETURN END IF // レ ジ ス ト リ フ ァ イルを生成する ために、 エ ン ド ユーザが // 入力 し た情報を使用 // GenerateRegFile 関数の引数 : // 有効な GUID // PB ラ イ ブ ラ リ のユーザ オブ ジ ェ ク ト の名前 // レ ジ ス ト リ における ProgID // メ ジ ャ ー バージ ョ ン、 マ イ ナー バージ ョ ン // コメント // レ ジ ス ト リ フ ァ イルの名前 ll_result = ole_pb.GenerateRegFile( & ls_reg_guid, & sle_object.Text, & sle_progid.Text, & 1, 0, & sle_desc.Text, & sle_RegFile.Text ) IF ll_result < 0 THEN MessageBox(" レ ジ ス ト リ フ ァ イルを生成で き ません ", & " 結果コ ー ド は " + String(ll_result) ) RETURN END IF // タ イ プ ラ イ ブ ラ リ を生成する ために、 レ ジ ス ト リ フ ァ イル と // 一致する情報を使用 // GenerateTypeLib 関数の引数 : // // レ ジ ス ト リ フ ァ イル内の GUID // PB ラ イ ブ ラ リ のユーザ オブ ジ ェ ク ト の名前 // レ ジ ス ト リ フ ァ イルにおける ProgID // ロ ケール、 メ ジ ャ ー バージ ョ ン、 マ イ ナー バージ ョ ン // コメント // ヘルプ コ ン テキス ト 、 ヘルプ フ ァ イル // タ イ プ ラ イ ブ ラ リ の GUID // タ イ プ ラ イ ブ ラ リ フ ァ イルの名前 // レ ジ ス ト リ フ ァ イルの名前 ll_result = ole_pb.GenerateTypeLib( & ls_reg_guid, & sle_object.Text, & sle_progid.Text, & 0, 1, 0, & sle_desc.Text, & 0, "", & 406 PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ ls_tlb_guid, & sle_typelibfile.text, & sle_regfile.text) IF ll_result < 0 THEN MessageBox(" タ イ プ ラ イ ブ ラ リ フ ァ イルを生成で き ません ", & " 結果 コ ー ド は " + String(ll_result) ) RETURN END IF オー ト メ ーシ ョ ン サーバを使用する ア プ リ ケーシ ョ ンの 配布 オブジ ェ ク ト を配布す る 場合、 すべての フ ァ イ ルの イ ン ス ト ール先の デ ィ レ ク ト リ のパ ス名を レ ジ ス ト リ に登録す る 必要があ り ます。 PowerBuilder ラ ン タ イム フ ァ イル PowerBuilder.Application サーバ オブジ ェ ク ト と オー ト メ ーシ ョ ン サー バ と し て登録 さ れたユーザ オブジ ェ ク ト を実行す る には、エ ン ド ユー ザのマシ ンに PowerBuilder の実行環境を配布す る 必要があ り ます。 PowerBuilder の配布お よ び必要な フ ァ イ ルの詳細については、 第 9 部 「配布のテ ク ニ ッ ク 」 を参照 し て く だ さ い。 レ ジ ス ト リ は、 実行環境を起動す る ために PowerBuilder の仮想マシ ン DLL (PBVM90J.DLL) を PowerBuilder の実行フ ァ イ ルのかわ り に検索 し ます。 配布時に、 こ の フ ァ イ ルのデ ィ レ ク ト リ のパ ス名が レ ジ ス ト リ に登録 さ れ ます。 レ ジ ス ト リ の情報が無効にな る ので、 別の レ ジ ス ト リ に こ の フ ァ イ ルを移動 し ないで く だ さ い。 オブ ジ ェ ク ト が格納 さ れた ラ イ ブ ラ リ と タ イ プ ライブラ リ レ ジ ス ト リ は、 オブジ ェ ク ト が格納 さ れてい る ラ イ ブ ラ リ と タ イ プ ラ イ ブ ラ リ のデ ィ レ ク ト リ のパ ス名を登録 し ます。 ロ ーカル マシ ン で レ ジ ス ト リ フ ァ イ ルを生成す る と 、パ ス情報はその マシ ン の現行の フ ァ イ ルのパ ス を反映 し ます。 レ ジ ス ト リ フ ァ イ ルを 配布す る と き に、 以下の こ と がで き ます。 • レ ジ ス ト リ フ ァ イ ルを カ ス タ マ イ ズす る (レ ジ ス ト リ フ ァ イ ル は、 編集可能な テ キ ス ト フ ァ イ ル) • レ ジ ス ト リ フ ァ イ ルを更新 し た後で、 レ ジ ス ト リ を変更す る レ ジ ス ト リ の変更には、 PowerBuilder ま たは Windows SDK の関数 を プ ロ グ ラ ム で使用す る 方法 と 、 レ ジ ス ト リ エデ ィ タ で レ ジ ス ト リ フ ァ イ ルを手動で取 り 込む方法があ る ア プ リ ケーシ ョ ン テ ク ニ ッ ク 407 オー ト メ ーシ ョ ン サーバ リ フ ァ レ ン ス 複数のバージ ョ ン と ア ッ プ デート 新 し いバージ ョ ン のオブジ ェ ク ト を再配布す る 場合、 以前のバージ ョ ン の CLSID を再利用で き ます。 ま た、 新 し い GUID を CLSID と し て レ ジ ス ト リ に登録す る こ と も で き ます。 ど ち ら を選択す る かは、 バー ジ ョ ン間の互換性に依存 し ます。 表 19-7: CLSID オプ シ ョ ン CLSID のオプ シ ョ ン GUID の再利用 新 し い GUID の割 り 当て 条件 オブ ジ ェ ク ト の イ ン タ フ ェ ー ス が同 じ で、 既存 の ア プ リ ケーシ ョ ン が古いバージ ョ ン と 同 じ プ ロ パテ ィ と 関数にア ク セ ス で き る 場合 オブ ジ ェ ク ト の イ ン タ フ ェ ー ス が変更 さ れ、 既 存の ア プ リ ケーシ ョ ン が新 し いバージ ョ ン を ア ク セ ス す る と 、 ア プ リ ケーシ ョ ン がエ ラ ーを発 生する 場合 既存のアプ リ ケーシ ョ ン が古いオブジ ェ ク ト を その ま ま使用で き る よ う に、 新 し い GUID を割 り 当てた場合は、 新 し い ProgID も 必要にな り ます。既存のアプ リ ケーシ ョ ンがバージ ョ ン非依存 ProgID を参照 し て いて、 新 し いバージ ョ ン のオブジ ェ ク ト も 同 じ ProgID であ る 場合、 既 存のアプ リ ケーシ ョ ンは新 し いオブジ ェ ク ト にア ク セ ス し ます。 サーバ オブジ ェ ク ト を設計す る 場合は、 そのオブジ ェ ク ト の将来の発 展を考慮 し て現行のアプ リ ケーシ ョ ン を設計す る 必要があ り ます。 オー ト メ ーシ ョ ン サーバ リ フ ァ レ ン ス こ の節で は、 PowerBuilder.Application サーバ オ ブ ジ ェ ク ト の プ ロ パ テ ィ と 関数について説明 し ます。 408 • PowerBuilder.Application サーバ オブジ ェ ク ト • CreateObject 関数 • GenerateGUID 関数 • GenerateRegFile 関数 • GenerateTypeLib 関数 • 例外 コ ー ド • レ ジ ス ト リ フ ァ イ ルのサン プル PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ PowerBuilder.Application サーバ オブ ジ ェ ク ト 説明 PowerBuilder.Application サーバ オ ブ ジ ェ ク ト は、 オー ト メ ー シ ョ ン サーバです。 オー ト メ ーシ ョ ン サーバを起動す る OLE ク ラ イ ア ン ト アプ リ ケーシ ョ ンは、 オー ト メ ーシ ョ ン と オー ト メ ーシ ョ ン オブジ ェ ク ト 型 を サ ポー ト す る PowerBuilder やほかの ク ラ イ ア ン ト に な り ま す。 以下の よ う に し て、 オー ト メ ーシ ョ ン を 使用 し て PowerBuilder オ ブ ジ ェ ク ト に ア ク セ ス で き ま す。 サーバを使用 し たオブ ジ ェ ク ト へのア ク セス 1 PowerBuilder を サーバ アプ リ ケーシ ョ ン と し て起動す る よ う に、 OLEObject オブジ ェ ク ト デー タ 型 ( ク ラ イ ア ン ト アプ リ ケーシ ョ ン に 用意 さ れ て い る 同等 の オ ブ ジ ェ ク ト デー タ 型) の 変数 を PowerBuilder.Application サーバ オブジ ェ ク ト に関連付け ます。 2 ア ク セ スす る PowerBuilder ラ ン タ イ ム ラ イ ブ ラ リ を指定す る ため に、 PowerBuilder.Application サーバ オブジ ェ ク ト のプ ロ パテ ィ を 設定 し ます。 3 ラ イ ブ ラ リ で ク ラ ス ユーザ オブジ ェ ク ト (非ビ ジ ュ アル) の イ ン ス タ ン ス を作成す る 関数を呼び出 し 、 別の OLEObject オブジ ェ ク ト デー タ 型の変数に、 作成 し た イ ン ス タ ン ス を代入 し ます。 4 オー ト メ ーシ ョ ン構文を使用 し てユーザ オブジ ェ ク ト のプ ロ パ テ ィ と 関数にア ク セ ス し ます。 レ ジ ス ト リ における オー ト メ ーシ ョ ン オブ ジ ェ ク ト PowerBuilder.Application サーバ オブジ ェ ク ト は、 PowerBuilder シ ス テ ム オブジ ェ ク ト の階層構造にあ る ク ラ ス ではあ り ません。 Windows の レ ジ ス ト リ に登録 さ れたオー ト メ ーシ ョ ン オブジ ェ ク ト です。 ブ ラ ウ ザで参照す る には、 [OLE] タ ブ を選択 し 、 [OLE オー ト メ ーシ ョ ン オ ブジ ェ ク ト ] カ テ ゴ リ を展開 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 409 PowerBuilder.Application サーバ オブ ジ ェ ク ト プ ロパテ ィ 表 19-8: PowerBuilder.Application のプ ロパテ ィ プ ロパテ ィ LibraryList MachineCode デー タ 型 説明 String ラ ン タ イ ム フ ァ イ ル (DLL か PBD) を セ ミ コ ロ ン (;) で区切っ た フ ァ イ ル名の一 覧。 PowerBuilder.Application サ ー バ セ ッ シ ョ ン で ア ク セ ス す る オブ ジ ェ ク ト が格 納 さ れてい る Boolean すべての ラ ン タ イ ム ラ イ ブ ラ リ は、 同 じ 実行形式 (マシ ン コ ー ド か Pcode) でなけ ればな ら ない LibraryList プ ロ パテ ィ の設 定は、オブジ ェ ク ト の イ ン ス タ ン ス を作成 する 前だけに有効であ る 。オブジ ェ ク ト の イ ン ス タ ン ス を作成 し た後で変更 し て も 、 設定は無視 さ れ る ラ ン タ イ ム ラ イ ブ ラ リ がマシ ン コ ー ド と Pcode の ど ち ら で生成す る かを指定する 値は以下の と お り • TRUE – (デフ ォ ル ト ) ラ イ ブ ラ リ はマ シ ン コ ー ド で生成 さ れ る 。 デフ ォ ル ト の フ ァ イ ル名の拡張子は DLL • FALSE – ラ イ ブ ラ リ は Pcode で生成 さ れ る 。 デ フ ォ ル ト の フ ァ イ ル名の拡張 子は PBD MachineCode プ ロ パ テ ィ の設定は、 オ ブ ジ ェ ク ト の イ ン ス タ ン ス を 作成す る 前だ けに有効であ る 。オブジ ェ ク ト の イ ン ス タ ン ス を作成 し た後で変更 し て も 、設定は無 視される 関数 410 表 19-9: PowerBuilder.Application の関数 関数 戻 り 値の デー タ 型 CreateObject OLEObject 説明 OLE サーバ セ ッ シ ョ ンに、 ク ラ ス ユーザ オブジ ェ ク ト の イ ン ス タ ン ス を作成す る 。 ク ラ イ ア ン ト セ ッ シ ョ ン にオブジ ェ ク ト の参照が戻 る 。 ク ラ イ ア ン ト ア プ リ ケー シ ョ ンは、オー ト メ ーシ ョ ンの構文を使用 し て オブ ジ ェ ク ト のプ ロ パテ ィ と 関数に ア ク セスでき る PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ 関数 戻 り 値の デー タ 型 GenerateGUID Long GenerateRegFile Long GenerateTypeLib Long ア プ リ ケーシ ョ ン テ ク ニ ッ ク 説明 グ ロ ーバル一意識別子 (GUID) を生成 し て文字列 と し て返す。文字列は参照に よ っ て渡 さ れ る 文字列変数で識別 さ れ る こ の関数 を 使用す る には、 ネ ッ ト ワ ー ク カー ド が必要 レ ジ ス ト リ 更新フ ァ イ ルを生成す る 。レ ジ ス ト リ フ ァ イ ル の 内容 は、 オ ー ト メ ー ショ ン サーバと し て配布する PowerBuilder のオブジ ェ ク ト に関す る 情報であ る タ イ プ ラ イ ブ ラ リ フ ァ イ ル を 生成す る 。 タ イ プ ラ イ ブ ラ リ は、 オー ト メ ーシ ョ ン サーバ と し て配布す る PowerBuilder のオ ブ ジ ェ ク ト に関す る 情報 を ほかの開発者 に提供す る 411 PowerBuilder.Application サーバ オブ ジ ェ ク ト CreateObject 関数 機能 PowerBuilder.Application OLE サーバ セ ッ シ ョ ン で、 PowerBuilder ク ラ ス の イ ン ス タ ン ス を作成 し ます。 対象 PowerBuilder.Application (オー ト メ ーシ ョ ン サーバ) 構文 { automationobject.}CreateObject ( classname ) 引数 automationobject classname 説明 PowerBuilder が OLE ク ラ イ ア ン ト アプ リ ケーシ ョ ンの 場合は、PowerBuilder.Application サーバ オブジ ェ ク ト と 関連付け ら れた OLEObject オブジ ェ ク ト デー タ 型の イ ン ス タ ン ス変数。 PowerBuilder 以外の OLE ク ラ イ ア ン ト アプ リ ケーシ ョ ン の場合は、 そのアプ リ ケーシ ョ ン が提供する 同 じ 機能を持つ関数を呼び出すために、適切 な構文を使用する 作成する ク ラ ス の名前を指定 し た文字列。 PowerBuilder.Application サーバ オブジ ェ ク ト の LibraryList プ ロ パテ ィ で指定 し た ラ イ ブ ラ リ 内に定義 さ れた ク ラ ス でなければな ら ない 戻り値 OLEObject 型。 オー ト メ ーシ ョ ン で有効なオブジ ェ ク ト の イ ン ス タ ン ス を返 し ます。オブジ ェ ク ト の イ ン ス タ ン ス が作成で き なか っ た場合、 CreateObject 関数は NULL 値を返 し ます。 解説 OLE ク ラ イ ア ン ト アプ リ ケーシ ョ ンが Visual Basic の場合は、キー ワ ー ド nothing を使用 し て CreateObject 関数が成功 し たか ど う か を確認で き ます。 ラ ン タ イ ム ラ イ ブ ラ リ に格納 さ れた オブ ジ ェ ク ト の実行形式が指定 し た MachineCode プ ロ パテ ィ に対応 し な い場合、 CreateObject 関数は NULL 値を返 し ます。 1 つの PowerBuilder.Application サーバ セ ッ シ ョ ン で作成 さ れたすべてのオブジ ェ ク ト の イ ン ス タ ン ス は、 同 じ 実行形 式 (P-code ま た は マ シ ン コ ー ド ) で な け れ ば な り ま せ ん。 1 つ の PowerBuilder.Application サーバ セ ッ シ ョ ン で、 複数のオブジ ェ ク ト の イ ン ス タ ン ス を作成す る 場合、 作成 し たオブジ ェ ク ト の参照を、 ほか のオブジ ェ ク ト の関数の引数に渡す こ と がで き ます。 CreateObject 関数を呼び出す前に、 CREATE 文を使用 し て OLEObject 型 の イ ン ス タ ン ス を作成す る 必要はあ り ません。 例 412 以下の例は、 PowerBuilder.Application サーバ オブ ジ ェ ク ト を 起動 し 、 MYLIBRARY.DLL に 格 納 さ れ て い る オ ブ ジ ェ ク ト を 作 成 す る PowerBuilder の ス ク リ プ ト です。 オブジ ェ ク ト の作成が成功 し た場合 は、関数 uf_calc を呼び出 し ます。 こ の関数は、計算結果を変数 ld_result に代入 し て、 ス テー タ ス コ ー ド と し て Long 型の戻 り 値を返 し ます。 PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ OLEObject PBObject, PBNVObject long ll_status double ld_result PBObject = CREATE OLEObject ll_status = PBObject.ConnectToNewObject & ("PowerBuilder.Application") IF ll_status = 0 THEN // エ ラ ー処理 ELSE PBObject.LibraryList = "c:¥myappl¥mylibrary.dll" PBObject.MachineCode = TRUE PBNVObject = CREATE OLEObject PBNVObject = & PBObject.CreateObject("nvo_myobject") IF IsNull(PBNVObject) THEN // エ ラ ー処理 ELSE ll_status = PBNVObject.uf_calc & (12, 14, REF result) END IF DESTROY PBNVObject PBObject.DisconnectObject( ) END IF DESTROY PBObject 以下の例は、 上記の PowerBuilder ス ク リ プ ト と 同 じ こ と を行 う Visual Basic ス ク リ プ ト です。 Dim Dim Dim Dim PBObject as object PBNVObject as object status as long result as double Set PBObject = _ CreateObject("PowerBuilder.Application") If PBObject is nothing then REM エ ラ ーの取 り 扱い Else PBObject.LibraryList = “c:¥myappl¥mylibrary.dll” Set PBNVObject = _ PBObject.CreateObject(“nvo_myobject“) If PBNVObject is nothing then REM エ ラ ーの取 り 扱い ア プ リ ケーシ ョ ン テ ク ニ ッ ク 413 PowerBuilder.Application サーバ オブ ジ ェ ク ト Else status = PBNVObject.uf_calc(12, 14, REF result) Set PBNVObject = nothing End if Set PBObject = nothing End if 関連項目 414 ConnectToNewObject PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ GenerateGUID 関数 機能 グ ロ ーバル一意識別子 (GUID) を生成 し ます。 GUID は、 オブジ ェ ク ト と その タ イ プ ラ イ ブ ラ リ を Windows の レ ジ ス ト リ に登録す る と き に、 ク ラ ス 識別子 (CLSID) と し て使用 し ま す。 オブジ ェ ク ト と その タ イ プ ラ イ ブ ラ リ に対 し て、 それぞれ GUID があ り ます。 対象 PowerBuilder.Application (オー ト メ ーシ ョ ン サーバ) 構文 { automationobject.}GenerateGUID ( REF guidvariable ) 引数 automationobject REF guidvariable 説明 PowerBuilder が OLE ク ラ イ ア ン ト アプ リ ケーシ ョ ンの 場合は、PowerBuilder.Application サーバ オブジ ェ ク ト と 関連付け ら れた OLEObject オブジ ェ ク ト デー タ 型の イ ン ス タ ン ス変数。 PowerBuilder 以外の OLE ク ラ イ ア ン ト アプ リ ケーシ ョ ン の場合は、 そのアプ リ ケーシ ョ ン が提供す る 同 じ 機能を持つ関数を呼び出すために、適切 な構文を使用す る 参照渡 し (reference) の String 型変数。生成 さ れた GUID を文字列 と し て返す GenerateGUID 関 数 は、 構 文 が コ ン パ イ ラ に よ っ て チ ェ ッ ク さ れてい ないオー ト メ ーシ ョ ン の関数 と し て 呼び出 さ れてい る ので、 guidvariable を参照渡 し で渡す ために REF を指定す る 必要があ る 戻り値 解説 Long 型。 エ ラ ーが発生 し たか ど う か を表すス テー タ ス コ ー ド を返 し ま す。 値は以下の と お り です。 0 GUID は正常に生成 さ れ ま し た。 -1 GenerateGUID 関数を呼び出すために必要な DLL を ロ ー ド す る こ と がで き ませんで し た。 -2 ネ ッ ト ワ ー ク カー ド が見つか ら なか っ たので、 GUID を生成す る こ と がで き ませんで し た。 -3 GUID の生成が失敗 し ま し た。 -9 予期せぬエ ラ ーが発生 し ま し た。 GenerateGUID 関数を使用す る 場合、 以下の も のが必要です。 • RPCRT4.DLL フ ァ イ ル。 こ の DLL フ ァ イ ルの UuidCreate 関数を呼 び出 し ます。 DLL フ ァ イ ルは、 現行のパ ス に存在す る 必要があ り ます。 • ネ ッ ト ワー ク カー ド 。関数は固有の値を生成す る ため、ネ ッ ト ワ ー ク カー ド の識別情報を使用 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 415 PowerBuilder.Application サーバ オブ ジ ェ ク ト こ れ ら の条件が満た さ れない と き は、 Microsoft か ら GUID を入手 し て く だ さ い。 GUID は、 書式 (8-4-4-4-12 桁の数字) の文字列 と し て表現で き る Long 型の 16 進数の数値です。 {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} GUID は、 アプ リ ケーシ ョ ン が使用す る オブジ ェ ク ト を識別す る ため に、 Windows レ ジ ス ト リ で使用 さ れ ます。 レ ジ ス ト リ に登録 さ れたオ ブジ ェ ク ト と その タ イ プ ラ イ ブ ラ リ には、 それぞれに対応す る GUID があ り ます。 オブジ ェ ク ト が レ ジ ス ト リ に登録 さ れ る ま では、 PowerBuilder のオブ ジ ェ ク ト に対 し て オー ト メ ー シ ョ ン を 実行す る こ と は で き ま せん。 GenerateGUID 関数は、 必要な レ ジ ス ト リ 情報の作成を補助す る 関数で す。 生 成 さ れ た GUID は、 レ ジ ス ト リ 更 新 フ ァ イ ル を 作 成 す る GenerateRegFile 関数 と GenerateTypeLib 関数に渡 し ます。 各ユーザのマ シ ン の更新フ ァ イ ルを使用 し て、 レ ジ ス ト リ にオブジ ェ ク ト を イ ン ス ト ール し ます。 オブジ ェ ク ト に対 し て、 新 し い GUID を生成 し て レ ジ ス ト リ を更新す る と 、 新 し い レ ジ ス ト リ エ ン ト リ が作成 さ れ ます。 レ ジ ス ト リ フ ァ イ ルに前 と 同 じ GUID を使用 し た場合は、 現行の レ ジ ス ト リ のオブジ ェ ク ト の情報は、 新 し い情報に置 き 換え ら れ ます。 オブジ ェ ク ト を更新 し て配布す る 場合に、 同 じ GUID を使用 し て新 し いオブ ジ ェ ク ト に対す る レ ジ ス ト リ フ ァ イ ル を 生成す る こ と がで き ます。新 し く 更新 さ れたオブジ ェ ク ト の イ ン タ フ ェース (そのオブジ ェ ク ト のプ ロ パテ ィ と 関数のシ グ ネチ ャ ) が更新前のオブジ ェ ク ト と 互 換性があ る 場合、 現行のアプ リ ケーシ ョ ンは新 し いオブジ ェ ク ト に正 常にア ク セ ス で き ます。 ただ し 、 オブジ ェ ク ト の イ ン タ フ ェ ー ス を変 更 し た場合は、 更新 し たオブジ ェ ク ト に対す る 新 し い GUID を使用す る 必要があ り ます。新 し い GUID を使用す る と 、既存のアプ リ ケーシ ョ ンは、 引 き 続 き 更新前のオブジ ェ ク ト にア ク セ ス で き ます。 ま た、 新 し い ア プ リ ケーシ ョ ン は新 し いオブ ジ ェ ク ト に ア ク セ ス で き る ので、 変更ま たは新 し い機能を使用で き ます。 PowerBuilder ツールを使用 し てユーザ オブジ ェ ク ト を登録す る 方法に ついては、 388 ページの 「 ク ラ ス ユーザ オブジ ェ ク ト の登録」 を参照 し て く だ さ い。 例 以下の例では、 PowerBuilder.Application サーバ オブジ ェ ク ト と 関連付 け を行い、 GUID を生成 し ます。 oleObject PBObject string ls_GUID 416 PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ long ll_result PBObject = CREATE oleObject result = PBObject.ConnectToNewObject & ("PowerBuilder.Application") IF result < 0 THEN // エ ラ ー処理 ELSE ll_result = PBObject.GenerateGUID(REF ls_GUID) END IF 関連項目 GenerateRegFile 関数 GenerateTypeLib 関数 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 417 PowerBuilder.Application サーバ オブ ジ ェ ク ト GenerateRegFile 関数 機能 オー ト メ ーシ ョ ン サーバ と し て配布す る ための PowerBuilder オブジ ェ ク ト に対す る レ ジ ス ト リ フ ァ イ ルを生成 し ます。 対象 PowerBuilder.Application (オー ト メ ーシ ョ ン サーバ) 構文 { automationobject.}GenerateRegFile ( guid, classname, progid, majorversion, minorversion, description, outputfilename ) 引数 automationobject guid 説明 PowerBuilder が OLE ク ラ イ ア ン ト アプ リ ケーシ ョ ンの場 合は、 PowerBuilder.Application サーバ オブジ ェ ク ト と 関 連付け ら れた OLEObject オブジ ェ ク ト デー タ 型の イ ン ス タ ン ス変数。 PowerBuilder 以外の OLE ク ラ イ ア ン ト アプ リ ケーシ ョ ン の場合は、 そのアプ リ ケーシ ョ ン が提供す る 同 じ 機能を持つ関数を呼び出すために、 適切な構文を 使用す る String 型。 オブジ ェ ク ト のグ ロ ーバル一意識別子 (GUID) 以下の よ う に、 生成 さ れた GUID を指定で き る • GenerateGUID 関数の呼び出 し に よ っ て生成 • 以前に生成 さ れた GUID を再利用 ( こ のオブジ ェ ク ト は以前のバージ ョ ン を置 き 換え る ) classname progid majorversion minorversion description outputfilename 418 • マ イ ク ロ ソ フ ト 社か ら 取得 String 型。 オー ト メ ーシ ョ ン サーバ と な る ク ラ ス ユーザ オブジ ェ ク ト の名前。 オブジ ェ ク ト は LibraryList プ ロ パ テ ィ で指定 し た ラ ン タ イ ム ラ イ ブ ラ リ 内になければな ら ない String 型。 サーバ オブジ ェ ク ト にア ク セ ス す る ために使 用す る プ ロ グ ラ ム識別子 Integer 型。 サーバ オブジ ェ ク ト の メ ジ ャ ー バージ ョ ン番 号 Integer 型。 サーバ オブジ ェ ク ト のマ イ ナー バージ ョ ン番 号 String 型。 サーバ オブジ ェ ク ト の コ メ ン ト 。 コ メ ン ト は、 レ ジ ス ト リ エデ ィ タ や OLE ブ ラ ウ ザ機能の あ る ア プ リ ケーシ ョ ンで表示 さ れ る String 型。 OLE GenerateRegFile 関数が生成する レ ジ ス ト リ フ ァ イ ルの名前。 レ ジ ス ト リ が認識で き る デフ ォ ル ト の フ ァ イ ル名の拡張子は REG PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ 戻り値 解説 Long 型。 エ ラ ーが発生 し たか ど う か を表すス テー タ ス コ ー ド を返 し ま す。 値は以下の と お り です。 0 レ ジ ス ト リ フ ァ イ ルが正常に生成 さ れま し た。 -1 メ モ リ 割 り 当てのエ ラ ーが発生 し ま し た。 -2 出力フ ァ イ ル名が指示 さ れてい ません。 -3 出力フ ァ イ ルが開け ません。 -9 予期せぬエ ラ ーが発生 し ま し た。 GenerateRegFile 関数 を 呼び出す前に、 PowerBuilder.Application サーバ オブジ ェ ク ト と 関連付け、 その LibraryList プ ロ パテ ィ と MachineCode プ ロ パテ ィ に値を設定す る 必要があ り ます。 ま た、 オブジ ェ ク ト の ク ラ ス識別子 (CLSID) に使用す る GUID も 必要です。 GUID の書式の詳 細については、 415 ページの GenerateGUID 関数を参照 し て く だ さ い。 レ ジ ス ト リ フ ァ イ ルを生成 し た後は、 オブジ ェ ク ト の メ ソ ッ ド と プ ロ パテ ィ の情報を提供す る タ イ プ ラ イ ブ ラ リ フ ァ イ ル も 生成す る こ と がで き ます。 421 ページの GenerateTypeLib 関数を参照 し て く だ さ い。 レ ジ ス ト リ フ ァ イ ルのデフ ォ ル ト の識別子は、 REG です。 レ ジ ス ト リ フ ァ イ ルを ダブル ク リ ッ ク す る と 、 レ ジ ス ト リ にオブジ ェ ク ト を登録 で き ます。 オブジ ェ ク ト が格納 さ れてい る ラ ン タ イ ム ラ イ ブ ラ リ と タ イ プ ラ イ ブ ラ リ フ ァ イ ルのデ ィ レ ク ト リ のパ ス名な ど、オブジ ェ ク ト に関す る 情報が レ ジ ス ト リ に登録 さ れ ま す。 PowerBuilder ツールを使 用 し てユーザ オブジ ェ ク ト を登録す る 方法については、 388 ページの 「 ク ラ ス ユーザ オブジ ェ ク ト の登録」 を参照 し て く だ さ い。 例 以下の例では、 GenerateRegFile 関数を呼び出 し てい ま す。 ご使用のア プ リ ケーシ ョ ン では、 こ の GUID を使用 し ないで く だ さ い。 long ll_result ll_result = GenerateRegFile( & "{12345678-1234-1234-1234-123456789012}", & "uo_salary_formulas", "MyCompany.SalaryFormulas", & 1, 0, & "PowerBuilder functions for calculating salaries", & "c:¥pbds¥bizrules.reg") 以下の例では、 PowerBuilder.Application サーバ オブジ ェ ク ト と 関連付 け を行い、 レ ジ ス ト リ フ ァ イ ルを生成す る ために必要なすべてのプ ロ パテ ィ 値を設定 し てい ます。 oleObject PBObject string ls_GUID long ll_result ア プ リ ケーシ ョ ン テ ク ニ ッ ク 419 PowerBuilder.Application サーバ オブ ジ ェ ク ト PBObj = CREATE oleObject result = & PBObj.ConnectToNewObject("PowerBuilder.Application") IF result < 0 THEN // エ ラ ー処理 ELSE PBObject.LibraryList = "c:¥myappl¥mylibrary.pbd" PBObject.MachineCode = FALSE ll_result = PBObject.GenerateGUID(REF ls_GUID) IF ll_result < 0 THEN // エ ラ ー処理 ELSE ll_result = PBObject.GenerateRegFile( ls_GUID, & "uo_myserverobject", "MyCompany.Object", & 1, 0, "My object's description", & "c:¥myappl¥object.reg") IF ll_result < 0 THEN // エ ラ ー処理 ELSE // タ イ プ ラ イ ブ ラ リ の生成 END IF END IF END IF 関連項目 420 GenerateGUID 関数 GenerateTypeLib 関数 PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ GenerateTypeLib 関数 機能 オー ト メ ーシ ョ ン サーバ と し て配布す る PowerBuilder オブジ ェ ク ト の タ イ プ ラ イ ブ ラ リ フ ァ イ ルを生成 し ます。 ア ク セス レ ベル PowerBuilder.Application (オー ト メ ーシ ョ ン サーバ) 構文 { automationobject.}GenerateTypeLib ( classguid, classname, progid, localeid, majorversion, minorversion, description, helpcontext, helpfile, typelibguid, typelibfilename, registryfilename ) 引数 automationobject classguid classname progid localeid 説明 PowerBuilder が OLE ク ラ イ ア ン ト アプ リ ケーシ ョ ンの 場合は、PowerBuilder.Application サーバ オブジ ェ ク ト と 関連付け ら れた OLEObject オブジ ェ ク ト デー タ 型の イ ン ス タ ン ス変数。 PowerBuilder 以外の OLE ク ラ イ ア ン ト アプ リ ケーシ ョ ン の場合は、 そのアプ リ ケーシ ョ ン が提供す る 同 じ 機能を持つ関数を呼び出すために、適切 な構文を使用す る String 型。 オブジ ェ ク ト の レ ジ ス ト リ フ ァ イ ルを生成す る と き に指定 し た グ ロ ーバル一意識別子 (GUID) String 型。 PowerBuilder ラ ン タ イ ム ラ イ ブ ラ リ に格納 さ れてい る オブジ ェ ク ト の名前。指定 し たオブジ ェ ク ト の タ イ プ ラ イ ブ ラ リ が生成 さ れ る classname は、 レ ジ ス ト リ フ ァ イ ルを生成 し た と き に指 定 し た名前 と 同 じ 名前でなければな ら ない String 型。 サーバ オブジ ェ ク ト にア ク セ スす る ために使 用す る プ ロ グ ラ ム識別子 progid は、 レ ジ ス ト リ フ ァ イ ルを生成 し た と き に指定 し た値 と 同 じ 値にす る 必要があ る Long 型。 オブジ ェ ク ト の国別言語のための ロ ケール識 別子 (LCID)。 言語 ID (LANGID) は、 マ イ ク ロ ソ フ ト 株式会社が提供す る マニ ュ アルに定義 さ れてい る LanguageID に PowerBuilder の カ タ ロ グデー タ 型の値を 指定す る こ と も 可能 majorversion Integer 型。 サーバ オブジ ェ ク ト の メ ジ ャ ー バージ ョ ン minorversion Integer 型。 サーバ オブジ ェ ク ト のマ イ ナー バージ ョ ン description helpcontext String 型。 サーバ オブジ ェ ク ト の コ メ ン ト 番号 番号 Long 型。 helpfile のヘルプ ト ピ ッ ク のための コ ン テ キ ス ト ID。 ヘルプ フ ァ イ ルの目次ページ を表示す る には、 0 を指定す る ア プ リ ケーシ ョ ン テ ク ニ ッ ク 421 PowerBuilder.Application サーバ オブ ジ ェ ク ト 引数 helpfile typelibguid typelibfilename registryfilename 説明 String 型。 サーバ オブジ ェ ク ト のヘルプ ト ピ ッ ク を格 納 し てい る ヘルプ フ ァ イ ルの名前 String 型。 レ ジ ス ト リ に登録する タ イ プ ラ イ ブ ラ リ に対 する グ ロ ーバル一意識別子 (GUID) String 型。 GenerateTypeLib 関数が生成す る タ イ プ ラ イ ブ ラ リ フ ァ イ ルの名前。 レ ジ ス ト リ が認識で き る デ フ ォ ル ト の フ ァ イ ル名の拡張子は TLB String 型。GenerateRegFile 関数に よ っ て生成 さ れた レ ジ ス ト リ フ ァ イ ルの名前 タ イ プ ラ イ ブ ラ リ フ ァ イ ルだ け を 生成す る 場合は、 registryfilename に空の文字列を指定する 戻り値 Long 型。エ ラ ーが発生 し たか ど う か を表すス テー タ ス コ ー ド を返 し ま す。 値は以下の と お り です。 0 レ ジ ス ト リ フ ァ イ ルが正常に生成 さ れま し た。 2 出力フ ァ イ ル名が指示 さ れてい ません。 3 タ イ プ ラ イ ブ ラ リ の生成に失敗 し ま し た。 4 無効な名前か名前の設定中にエ ラ ーが発生 し ま し た。 5 無効な ロ ケール識別子か ロ ケール識別子の設定中にエ ラ ーが発生 し ま し た。 6 タ イ プ ラ イ ブ ラ リ の GUID を CLSID に変換中にエ ラ ーが発生 し ま し た。 7 無効な GUID か GUID を設定中にエ ラ ーが発生 し ま し た。 8 コ メ ン ト の設定中にエ ラ ーが発生 し ま し た。 9 バージ ョ ンの設定中にエ ラ ーが発生 し ま し た。 10 ヘルプ コ ン テ キ ス ト の設定中にエ ラ ーが発生 し ま し た。 11 ヘルプ フ ァ イ ル名の設定中にエ ラ ーが発生 し ま し た。 14 LibraryList プ ロ パテ ィ に指定 し た ラ ン タ イ ム ラ イ ブ ラ リ には、 ク ラ ス を見つけ る こ と がで き ませんで し た。 18 オブ ジ ェ ク ト の GUID を CLSID に変換中にエ ラ ーが発生 し ま し た。 30 標準 タ イ プ ラ イ ブ ラ リ の ロ ー ド 中にエ ラ ーが発生 し ま し た (OLE が正 し く イ ン ス ト ール さ れてい ません)。 31 IUnknown イ ン タ フ ェ ー ス に ア ク セ ス 中にエ ラ ーが発生 し ま し た (OLE が正 し く イ ン ス ト ール さ れてい ません)。 422 PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ 解説 32 IDispatch イ ン タ フ ェ ー ス に ア ク セ ス 中に エ ラ ーが発生 し ま し た (OLE が正 し く イ ン ス ト ール さ れてい ません)。 36 こ の タ イ プ ラ イ ブ ラ リ に関連付け ら れてい る レ ジ ス ト リ フ ァ イ ルを開いてい る と き にエ ラ ーが発生 し ま し た。 タ イ プ ラ イ ブ ラ リ の登録は任意です。 オブジ ェ ク ト のプ ロ パテ ィ と メ ソ ッ ド に関す る 情報を、 OLE ブ ラ ウ ザ機能のあ る アプ リ ケーシ ョ ン で 表示す る 場合は、 タ イ プ ラ イ ブ ラ リ が必要です。 タ イ プ ラ イ ブ ラ リ を登録す る 場合は、 タ イ プ ラ イ ブ ラ リ フ ァ イ ルを 作成す る 前に、 オブジ ェ ク ト を登録す る レ ジ ス ト リ フ ァ イ ルが存在す る 必要があ り ます。 タ イ プ ラ イ ブ ラ リ を生成す る 過程で、 レ ジ ス ト リ フ ァ イ ルに情報を追加 し ます。 レ ジ ス ト リ フ ァ イ ルの生成については、 418 ページの GenerateRegFile 関数を参照 し て く だ さ い。 GenerateTypeLib 関数の引数に指定す る 値は、 すでに生成 さ れた レ ジ ス ト リ フ ァ イ ルの値 と 同 じ でなければな り ません。レ ジ ス ト リ フ ァ イ ル と 同 じ 値を使用 し ない場合、 ど のオブジ ェ ク ト に も 関連付け ら れてい ない TypeLib サブキーが レ ジ ス ト リ に作成 さ れ ます。 GenerateTypeLib 関数 を 呼び出す前に、 PowerBuilder.Application サーバ オ ブ ジ ェ ク ト と 関 連 付 け を 行 い、 そ の LibraryList プ ロ パ テ ィ と MachineCode プ ロ パテ ィ の値を設定す る 必要があ り ま す。 さ ら に、 オ ブジ ェ ク ト の CLSID と し て使用 さ れ る GUID (レ ジ ス ト リ フ ァ イ ルを 生成 し た と き に指定 し た GUID) と タ イ プ ラ イ ブ ラ リ の GUID が必要 です。 GUID の書式の詳細については、 415 ページの GenerateGUID 関 数を参照 し て く だ さ い。 レ ジ ス ト リ フ ァ イ ル と タ イ プ ラ イ ブ ラ リ フ ァ イ ルを生成 し た後は、オ ブジ ェ ク ト を レ ジ ス ト リ に登録で き ます。 オブジ ェ ク ト を レ ジ ス ト リ に登録す る と 、 ラ イ ブ ラ リ フ ァ イ ル と タ イ プ ラ イ ブ ラ リ フ ァ イ ル のデ ィ レ ク ト リ の パ ス 名 が 格納 さ れ ま す。 LibraryList プ ロ パテ ィ の値は、 オブジ ェ ク ト が格納 さ れてい る ラ ン タ イ ム フ ァ イ ルがあ る デ ィ レ ク ト リ のパ ス名です。 オブジ ェ ク ト を登録 す る と き は、 タ イ プ ラ イ ブ ラ リ フ ァ イ ルが、 指定 し たデ ィ レ ク ト リ に あ る 必要があ り ます。 例 以下の例は、 GenerateTypeLib 関数を呼び出 し てい ま す。 ご使用のアプ リ ケーシ ョ ン では、 こ の GUID を使用 し ないで く だ さ い。 long ll_result ll_result = GenerateTypeLib( & "{12345678-1234-1234-1234-123456789012}", & "uo_salary_formulas", "MyCompany.SalaryFormulas", & ア プ リ ケーシ ョ ン テ ク ニ ッ ク 423 PowerBuilder.Application サーバ オブ ジ ェ ク ト 0, 1, 0, & "PowerBuilder functions for calculating salaries", & 0, "c:¥pbds¥bizrules.hlp", & "{12345679-1234-1234-1234-123456789012}", & "c:¥pbds¥bizrules.tlb", "c:¥pbds¥bizrules.reg") 以下の例は、 PowerBuilder.Application サーバ オブジ ェ ク ト と 関連付け を行い、 レ ジ ス ト リ フ ァ イ ルを生成す る ために必要なすべての値を設 定 し てい ます。 oleObject PBObject string ls_GUID, ls_typelibGUID long ll_result PBObject = CREATE oleObject result = PBObject.ConnectToNewObject & ("PowerBuilder.Application") IF result < 0 THEN // エ ラ ー処理 RETURN -1 END IF PBObject.LibraryList = "c:¥myappl¥mylibrary.pbd" PBObject.MachineCode = FALSE // オブ ジ ェ ク ト の CLSID のための GUID ll_result = PBObject.GenerateGUID(REF ls_GUID) IF ll_result < 0 THEN // エ ラ ー処理 RETURN -1 END IF // オブ ジ ェ ク ト の タ イ プ ラ イ ブ ラ リ のための GUID ll_result = PBObject.GenerateGUID(REF ls_typelibGUID) IF ll_result < 0 THEN // エ ラ ー処理 RETURN -1 END IF // レ ジ ス ト リ フ ァ イルの生成 ll_result = PBObject.GenerateRegFile( ls_GUID, & "uo_myserverobject", "MyCompany.Object", & 1, 0, "My object's description", & "c:¥myappl¥object.reg") IF ll_result < 0 THEN // エ ラ ー処理 424 PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ RETURN -1 END IF // タ イ プ ラ イ ブ ラ リ の生成 ll_result = PBObject.GenerateTypeLib( ls_GUID, & uo_myserverobject", "MyCompany.Object", 0, 1, 0, & "My object's description", 0, $ "c:¥myappl¥myhelp.hlp", ls_typelibGUID, & "c:¥myappl¥object.tlb", "c:¥myappl¥object.reg") IF ll_result < 0 THEN // エ ラ ー処理 RETURN -1 END IF 関連項目 GenerateGUID 関数 GenerateRegFile 関数 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 425 例外 コ ー ド 例外 コ ー ド PowerBuilder オート メ ーショ ン サーバにアク セス する オート メ ーショ ン ク ラ イ ア ン ト では、 あ る 状況で、 OLE の例外が発生す る 場合があ り ま す。エ ン ド ユーザのア ク シ ョ ンが例外を発生 さ せた場合、PowerBuilder は 例外 の 種類 を 識別す る 例外 コ ー ド を、 呼び出 し 元 か ら 渡 さ れ た EXCEPINFO 構造体に値 を 設定 し ま す。 PowerBuilder の ク ラ イ ア ン ト ア プ リ ケーシ ョ ン に対 し ては、 ExternalException イ ベン ト の引数に例 外 コ ー ド が渡 さ れます。 ク ラ イ ア ン ト ア プ リ ケ ーシ ョ ン は、 PowerBuilder オー ト メ ーシ ョ ン サーバか ら 、 以下の例外 コ ー ド を受け取 り ます。 表 19-10: PowerBuilder オー ト メ ーシ ョ ン サーバの例外コ ー ド コー ド 1001 1002 1003 1004 1005 1006 1007 1008 426 意味 メ モ リ の割 り 当てに失敗 し ま し た。 要求 さ れたオブジ ェ ク ト が、 ラ イ ブ ラ リ リ ス ト にあ り ませんで し た。 オブジ ェ ク ト の作成に失敗 し ま し た。 バイ ナリ 書式がバージョ ン と 一致し ないか、期限が過ぎていま す。 配列 と し て ア ク セ ス さ れたプ ロ パテ ィ は、 配列ではあ り ませんで し た。 ス ク リ プ ト の実行中に予期せぬエ ラ ーが発生 し ま し た。 要求 さ れた名前 と 引数のデー タ 型に一致す る メ ソ ッ ド が、 1 つ も 見つか り ませんで し た。 Variant 型の引数を変換する こ と がで き ませんで し た。 PowerBuilder 第 19 章 PowerBuilder のラ ン タ イム オー ト メ ーシ ョ ン サーバ レ ジ ス ト リ フ ァ イルのサン プル 以下の レ ジ ス ト リ フ ァ イ ルのサ ン プルには、 uo_salarydata と い う 名前 の ク ラ ス ユーザ オブジ ェ ク ト の登録情報があ り ます。 REGEDIT4 ;;;;;;;;;;;;;;;; ; ; MyCompany.SalaryData のためのレ ジス ト リ エ ン ト リ ; ; CLSID = {E022EF01-6789-11CF-92BF-00805F9236E9} ; ; PowerBuilder が生成 し た レ ジス ト リ フ ァ イル ;;;;;;;;;;;;;;;; ; バージ ョ ン番号のないエ ン ト リ : [HKEY_CLASSES_ROOT¥MyCompany.SalaryData] @="DataStore with functions returning salary statistics" [HKEY_CLASSES_ROOT¥MyCompany.SalaryData¥CLSID] @="{E022EF01-6789-11CF-92BF-00805F9236E9}" [HKEY_CLASSES_ROOT¥MyCompany.SalaryData¥CurVer] @="MyCompany.SalaryData.1" [HKEY_CLASSES_ROOT¥MyCompany.SalaryData¥NotInsertable" @="" ; バージ ョ ン番号に特定のエ ン ト リ : [HKEY_CLASSES_ROOT¥AppID¥{E022EF01-6789-11CF-92BF-00805F9236E9}] @="DataStore with functions returning salary statistics" [HKEY_CLASSES_ROOT¥MyCompany.SalaryData.1] @="DataStore with functions returning salary statistics" [HKEY_CLASSES_ROOT¥MyCompany.SalaryData.1¥CLSID] @="{E022EF01-6789-11CF-92BF-00805F9236E9}" [HKEY_CLASSES_ROOT¥MyCompany.SalaryData.1¥NotInsertable] @="" ; CLSID エ ン ト リ : [HKEY_CLASSES_ROOT¥CLSID¥{E022EF01-6789-11CF-92BF00805F9236E9}] @="DataStore with functions returning salary statistics" "AppID"="{E022EF01-6789-11CF-92BF-00805F9236E9}" [HKEY_CLASSES_ROOT¥CLSID¥{E022EF01-6789-11CF-92BF-0805F9236E9}¥ProgID] @="MyCompany.SalaryData.1" [HKEY_CLASSES_ROOT¥CLSID¥{E022EF01-6789-11CF-92BF00805F9236E9}¥VersionIndependentProgID] @="MyCompany.SalaryData" [HKEY_CLASSES_ROOT¥CLSID¥{E022EF01-6789-11CF-92BF00805F9236E9}¥InProcServer32] @="pbVM90J.dll" ア プ リ ケーシ ョ ン テ ク ニ ッ ク 427 レ ジ ス ト リ フ ァ イルのサン プル "ThreadingModel"="Apartment" [HKEY_CLASSES_ROOT¥CLSID¥{E022EF01-6789-11CF92BF 00805F9236E9}¥NotInsertable] @="" [HKEY_CLASSES_ROOT¥CLSID¥{E022EF01-6789-11CF-92BF-00805F9236E9}¥Programmable] @="" [HKEY_CLASSES_ROOT¥CLSID¥{E022EF01-6789-11CF-92BF00805F9236E9}¥PowerBuilder¥ClassName] @="uo_salarydata" [HKEY_CLASSES_ROOT¥CLSID¥{E022EF01-6789-11CF-92BF00805F9236E9}¥PowerBuilder¥LibraryList] @="D:¥¥pbserver.pbd" [HKEY_CLASSES_ROOT¥CLSID¥{E022EF01-6789-11CF-92BF00805F9236E9}¥PowerBuilder¥BinaryType] @="PCODE" ; タ イ プ ラ イ ブ ラ リ 登録エ ン ト リ : [HKEY_CLASSES_ROOT¥CLSID¥{E022EF01-6789-11CF-92BF-00805F9236E9}¥TypeLib] @="{E022EF02-6789-11CF-92BF-00805F9236E9}" [HKEY_CLASSES_ROOT¥TypeLib¥{E022EF02-6789-11CF-92BF-00805F9236E9}¥1.0] @="Type Library for DataStore with functions returning salary statistics" [HKEY_CLASSES_ROOT¥TypeLib¥{E022EF02-6789-11CF-92BF00805F9236E9}¥1.0¥9¥Win32] @="D:¥¥pbserver.tlb" 428 PowerBuilder 第 2 0 章 MAPI の使い方 こ の章について こ の章では、 PowerBuilder ア プ リ ケーシ ョ ン で MAPI (Messaging Application Program Interface) を使用 し て電子 メ ールを送受信す る 方法について説明 し ます。 内容 項目 MAPI について MAPI の使い方 ページ 429 430 MAPI について PowerBuilder は MAPI (Messaging Application Program Interface) を サポー ト し ます。 こ れに よ り 、 アプ リ ケーシ ョ ンは MAPI 準拠の 任意の電子 メ ール シ ス テ ム を使用 し て メ ッ セージ を送受信で き ま す。 た と えば、 PowerBuilder アプ リ ケーシ ョ ンは以下を実行で き ます。 MAPI サポー ト の実装方法 ア プ リ ケーシ ョ ン テ ク ニ ッ ク • アプ リ ケーシ ョ ン が実行 し た解析の結果を メ ールで送信す る • ユーザが特定の操作を実行 し た と き に メ ールを送信す る • 情報を要求す る メ ールを送信す る • ア プ リ ケーシ ョ ン のユーザが必要 と す る 情報を含む メ ール を 受け取 る MAPI をサポー ト す る ために、 PowerBuilder は 表 20-1 に示す項目 を提供 し ます。 429 MAPI の使い方 表 20-1: PowerBuilder の MAPI サポー ト 項目 メ ール関連のシ ス テ ム オブ ジェ ク ト メ ール関連の構造体 名前 MailSession MailFileDescription MailMessage MailRecipient MailSession オブジ ェ ク ト のオ ブジ ェ ク ト 関数 MailAddress MailDeleteMessage MailGetMessages MailHandle MailLogoff MailLogon MailReadMessage MailRecipientDetails MailResolveRecipient MailSaveMessage MailSend カ タ ロ グデー タ 型 MailFileType MailLogonOption MailReadOption MailRecipientType MailReturnCode MAPI の使い方 MAPI を使 う には、 MailSession オブジ ェ ク ト を作成 し てか ら 、 MailSession 関数を使用 し てそのオブジ ェ ク ト を管理 し ます。 例 MailSession PBmail PBmail = CREATE MailSession PBmail.MailLogon(...) ... // セ ッ シ ョ ンの管理処理 : た と えば、 メ ッ セージの送信、 ... // メ ッ セージの受信な ど PBmail.MailLogoff() DESTROY PBmail 430 PowerBuilder 第 20 章 MAPI の使い方 ブ ラ ウ ザを使用 し て、MailSession シ ス テ ム オブジ ェ ク ト のプ ロ パテ ィ と 関数、 メ ール関連の構造体のプ ロ パテ ィ 、 お よ び メ ール関連のカ タ ロ グデー タ 型 と し て有効な値についての詳細を取得で き ます。 ブ ラ ウ ザの使い方の詳細につい ては、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 MailSession 関数の詳細について は、『PowerScript リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。MAPI についての詳細は、 各 MAPI に準拠 し た メ ール アプ リ ケーシ ョ ンのマ ニ ュ アルを参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 431 MAPI の使い方 432 PowerBuilder 第 2 1 章 外部関数 と そのほかの拡張処理機能 の使い方 こ の章について こ の章では、 PowerBuilder におけ る 外部関数の使い方 と そのほか の拡張処理機能について説明 し ます。 内容 項目 外部関数の使い方 ユーテ ィ リ テ ィ 関数の使い方 Windows メ ッ セージの送信 メ ッ セージ オブジ ェ ク ト コ ン テ キ ス ト 情報 ページ 433 440 441 443 445 外部関数の使い方 外部関数は、 PowerScript 以外の言語で記述 さ れ、 ダ イ ナ ミ ッ ク ラ イ ブ ラ リ に保存 さ れてい る 関数です。 Windows 上では、 外部関数 はダ イ ナ ミ ッ ク リ ン ク ラ イ ブ ラ リ ( DLL: Dynamic LinkLibrary) に保存 さ れます。 32 ビ ッ ト プ ラ ッ ト フ ォ ー ム 用の標準呼び出 し シ ー ケ ン ス を サ ポー ト す る 、 任意の言語で書かれた外部関数を使用で き ます。 自分で書いた ラ イ ブ ラ リ 内の関数を呼び出す場合は、 その関数を エ ク ス ポー ト し な ければな ら ないので注意 し て く だ さ い。 こ のエ ク ス ポー ト は、 使用 コ ン ピ ュ ー タ に よ っ て関数プ ロ ト タ イ プ ま た は リ ン カ定義 (DEF) フ ァ イ ルで行い ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 433 外部関数の使い方 PBNI の使い方 外 部 関 数 は PowerBuilder エ ク ス テ ン シ ョ ン で も 呼 び 出 せ ま す。 PowerBuilder エ ク ス テ ン シ ョ ンは PowerBuilder Native Interface (PBNI) を使用 し て作成 さ れ ま す。 PowerBuilder エ ク ス テ ン シ ョ ン の作成につ いての詳細は、『PowerBuilder ネ イ テ ィ ブ イ ン タ フ ェース プ ロ グ ラ マー ズ ガイ ド と リ フ ァ レ ン ス 』マニュ アルを 参照し てく ださ い。PowerBuilder エ ク ス テ ン シ ョ ンの使い方についての詳細は、 『PowerBuilder エ ク ス テ ン シ ョ ン機能 リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 外部関数の宣言 外部関数は、 ス ク リ プ ト で使用す る 前に宣言 し ておかな ければな り ま せん。 2 種類の外部関数が宣言で き ます。 2 種類の外部関数 • グ ロ ーバル外部関数 こ の関数は、 アプ リ ケーシ ョ ン内の ど こ か ら で も 使用で き ます。 • ロ ーカ ル外部関数 こ の関数は、 特定の ウ ィ ン ド ウ 、 メ ニ ュ ー、 ユーザ オブジ ェ ク ト 、 ま たはユーザ定義関数に対 し て定義 さ れ ま す。 ロ ーカル外部関数はオブジ ェ ク ト の定義の一部 と な る ので、 その オブジ ェ ク ト 自身の ス ク リ プ ト の中で使用で き ま す。 さ ら に、 こ の関数を ほかの ス ク リ プ ト で使用す る こ と も 可能です。 外部関数の引数のデー タ型 外部関数を宣言す る と き は、 引数のデー タ 型がその関数の ソ ース 定義 の中で宣言 さ れたデー タ 型 と 一致 し なければな り ません。 外部関数のデー タ 型 と PowerBuilder 内のデー タ 型の比較については、 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ アルの外部関数の宣言 と 呼び出 し に関す る 章を参照 し て く だ さ い。 ❖ 434 外部関数を宣言するには 1 ロ ーカル外部関数を宣言す る 場合には、 関数を宣言 し たいオブ ジ ェ ク ト を開 き ます。 2 ス ク リ プ ト ビ ュ ーでは、 最初の ド ロ ッ プダ ウ ン リ ス ト か ら 「(Decleare)」 を選択 し 、 2 番目の ド ロ ッ プダ ウ ン リ ス ト か ら 「Global External Function」 ま たは 「Local External Function」 を選択 し ます。 3 関数宣言を ス ク リ プ ト ビ ュ ーに入力 し ます。 PowerBuilder 第 21 章 外部関数 と そのほかの拡張処理機能の使い方 使用す る 構文については、 『PowerScript リ フ ァ レ ン ス』 マニ ュ アル ま たは下記の例を参照 し て く だ さ い。 4 オブジ ェ ク ト を保存 し ます。 PowerBuilder は宣言を コ ンパ イ ル し ます。構文エ ラ ーが存在す る 場 合には、 エ ラ ー ウ ィ ン ド ウ が開 き ます。 その場合には、 エ ラ ーを 修正 し なければ、 宣言を保存で き ません。 既存の関数の変更 ス ク リ プ ト ビ ュ ーでは、 既存の外部関数の宣言を修正す る こ と も で き ます。 外部関数の宣言例 こ こ で、 文字列 と 構造体の 2 つのパ ラ メ ー タ を受け取 る SimpleFunc と い う 関数を保持す る SIMPLE.DLL と い う C 言語のダ イ ナ ミ ッ ク ラ イ ブ ラ リ を作成 し た と し ます。 以下の ス テー ト メ ン ト は、 こ の参照で引 数を渡す関数を PowerBuilder で宣言 し ます。 FUNCTION int SimpleFunc(REF string lastname, & REF my_str pbstr) LIBRARY "simple.dll" Windows API 関数の 宣言 Windows の API には、PowerBuilder か ら 呼び出 し 可能な関数が 1,000 個 以上 あ り ま す。 以下 の 例 は、 32 ビ ッ ト の Windows API ラ イ ブ ラ リ KERNEL32.DLL、 GDI32.DLL、 お よ び USER32.DLL の中の関数の宣言 例です。 Windows API の呼び出 し い く つかの 32 ビ ッ ト 関数名の最後には、 A (ANSI の略) ま たは W ( ワ イ ド の略) が付いてい ます。 アプ リ ケーシ ョ ン を DBCS 環境で実行す る 場合は、 ワ イ ド 関数名を使用 し ます。 Windows の API 関数の全 リ ス ト については、Microsoft Windows ソ フ ト ウ ェ ア開発キ ッ ト (SDK)のマニ ュ アルを参照 し て く だ さ い。 PowerBuilder の宣言構文 と ス ク リ プ ト の例については、Sybase Web サイ ト (英語)の Technical Documents のページ www.sybase.com/support/techdocs/ で Windows API call を検索 し てみて く だ さ い。 以下の ス テー ト メ ン ト は、 名前で呼び出 さ れ る 任意の ウ ィ ン ド ウ のハ ン ド ルを入手す る 関数 と 、 開いたオブジ ェ ク ト のハン ド ルを解放す る 関数を宣言 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 435 外部関数の使い方 FUNCTION ulong FindWindowA(ulong classname, & string windowname) LIBRARY "User32.dll" FUNCTION boolean CloseHandle(ulong w_handle) & LIBRARY "Kernel32.dll" 以下の ス テー ト メ ン ト は、 受け取っ た座標に基づいて円グ ラ フ を描 く 関数を宣言 し ます。 FUNCTION boolean Pie(ulong hwnd,long x1,long y1, & long x2,long y2,long x3,long y3,long x4, & long y4) LIBRARY "Gdi32.dll" 以下の ス テー ト メ ン ト は、 IsZoomed と い う 外部 C 関数を宣言 し ます。 FUNCTION boolean IsZoomed(Ulong handle) LIBRARY "User32.DLL" & 外部関数 IsZoomed を使用す る ス ク リ プ ト は、 440 ページの 「ユーテ ィ リ テ ィ 関数の使い方」 に例 と し て記載 し て あ り ます。 こ れ ら の関数についての詳細は、 MSDN Library http://www.microsoft.com/japan/msdn/library/default.asp にあ る Microsoft のマ ニ ュ アルを参照 し て く だ さ い。 引数の受け渡し PowerBuilder では、 外部関数を定義す る 際に、 引数の受け渡 し を参照 か値の ど ち ら で行 う か を指定で き ま す。 引数 を参照 (reference) で渡 す場合、 外部関数はその引数のポ イ ン タ を受け取 る ため、 引数の内容 を変更で き ます。 そ し て変更後の内容を、 PowerBuilder に返 し ます。 一 方、 引数 を 値 (value) に よ っ て 渡す場合、 外部関数は そ の引数の コ ピーを受け取 る ため、 その コ ピーの内容 し か変更で き ません。 こ の場 合に変更 さ れ る のは ロ ーカル コ ピーだけで、 オ リ ジナルの引数の内容 は変更 さ れません。 参照に よ っ て渡 さ れ る 引数の構文は以下の と お り です。 REF datatype arg 値に よ っ て渡 さ れ る 引数の構文は以下の と お り です。 datatype arg 436 PowerBuilder 第 21 章 外部関数 と そのほかの拡張処理機能の使い方 数値デー タ 型の受け渡 し 以下の ス テー ト メ ン ト は、 PowerBuilder で外部関数 TEMP を宣言 し ま す。 こ の関数は整数値を返 し 、 参照に よ っ て渡 さ れ る 整数値の引数を 必要 と し ます。 FUNCTION int TEMP(ref int degree) LIBRARY "LibName.DLL" こ の ス テー ト メ ン ト は、 C で記述す る と 以下の よ う にな り ます。 int _stdcall TEMP(int * degree) 引数は参照に よ っ て渡 さ れ る ため、 こ の関数が引数の内容を変更す る と 、 その変更内容は、 PowerBuilder のオ リ ジナルの変数値に直接影響 し ます。 た と えば、 C の ス テー ト メ ン ト *degree = 75 は、 degree と い う 引数を 75 に変更 し て、 PowerBuilder に 75 を返 し ます。 以下の ス テー ト メ ン ト は、 PowerBuilder で外部関数 TEMP2 を宣言 し ま す。 こ の関数は Integer 型を返 し 、 値に よ っ て渡 さ れ る Integer 型の引数 を必要 と し ます。 FUNCTION int TEMP2(int degree) LIBRARY "LibName.DLL" こ の ス テー ト メ ン ト は、 C で記述す る と 以下の よ う にな り ます。 int _stdcall TEMP2(int degree) 引数は値に よ っ て渡 さ れ る ため、 関数は引数の内容を変更で き ます。 変更はすべて引数の ロ ーカル コ ピーに対 し て行われ る ので、 PowerBuilder の変数への影響はあ り ません。 文字列の受け渡 し 値によ る受け渡 し 以下の ス テー ト メ ン ト は、 PowerBuilder で C の外部 関数 NAME を宣言 し ます。 こ の関数は、 値に よ っ て渡 さ れ る String 型 の引数を取 り ます。 FUNCTION string NAME(string CODE) LIBRARY "LibName.DLL" C に よ る 同様の ス テー ト メ ン ト では、 こ の String 型が保持 さ れてい る バ ッ フ ァ を ポ イ ン タ で示 し ます。 char * _stdcall NAME(char * CODE) こ の String 型は値に よ っ て渡 さ れ る ため、 こ の C 関数が変更で き る の は引数 CODE の ロ ーカル コ ピーの内容だけで、 PowerBuilder のオ リ ジ ナルの変数には影響 し ません。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 437 外部関数の使い方 PowerBuilder は自身の メ モ リ にのみア ク セ ス で き ます。 し た がっ て、 外部関数は PowerBuilder に文字列のポ イ ン タ を返す こ と がで き ません ( メ モ リ ア ド レ ス を返す こ と がで き ません)。 参照渡 し 値渡 し 、 参照渡 し にかかわ ら ず、 外部関数に文字列を渡す と 、 その文 字列のポ イ ン タ が渡 さ れ ます。 値渡 し では、 外部関数がその文字列に 行っ た変更内容は、 PowerBuilder か ら ア ク セ スす る こ と がで き ません。 し か し 、 参照渡 し では変更内容にア ク セ スす る こ と がで き ます。 以下の ス テー ト メ ン ト は、PowerBuilder で C の外部関数 NAME2 を宣言 し た も のです。 こ の関数は、 参照に よ っ て引 き 渡 さ れ る String 型変数 を取 り 、 String 型を返 し ます。 FUNCTION string NAME2(ref string CODE) LIBRARY "LibName.DLL" & C 言語に よ っ て こ れを記述す る と 、 引数が値で渡 さ れ る ス テー ト メ ン ト と 同 じ にな り ます。 char * _stdcall NAME2(char * CODE) こ の場合、 String 型引数は参照に よ っ て渡 さ れ る ので、 C の関数は引数 の内容 と と も に、 PowerBuilder のオ リ ジナルの変数の内容 も 変更で き ます。 た と えば、 Strcpy(CODE,STUMP) は CODE の内容を変数 STUMP に変更 し 、 呼び出 し 側の PowerBuilder の ス ク リ プ ト の変数の値 も 変数 STUMP の内容に変更 し ます。 前例の関数 NAME2 でユーザ ID を引数 と し て取っ て、 それを そのユー ザの名前に置 き 換え る も の と し ま す。 こ の と き 、 PowerScript の String 型変数 CODE が、 返 さ れ る 値を保持す る のに十分な大 き さ でなければ な り ません。 十分な大 き さ を確保す る ために、 String 型変数を宣言 し た 後で、 Space 関数を使用 し て、 NAME2 関数が返す最大文字数 と 同数の ブ ラ ン ク (空白文字) を こ の String 型変数に与え てお き ます。 ユーザ名に許 さ れ る 最大文字数が 40 バ イ ト で、 ユーザ ID が常に 5 バ イ ト であ る 場合には、NAME2 関数を呼び出す前に、String 型変数 CODE に 35 個のブ ラ ン ク を追加 し てお き ます。 String CODE CODE = ID + Space(35) . . . NAME2(CODE) Space 関数の詳細については、 『PowerScript リ フ ァ レ ン ス』 マニ ュ アル を参照 し て く だ さ い。 C の関数への文字の受け渡 し C の 外部関数 に 渡 さ れ た Char 型 の 変数 は、 渡 さ れ る 前に C の Char 型に変換 さ れ ます。 Char 型変数の配列は、 C の同等の Char 型変数の配列に変換 さ れ ます。 438 PowerBuilder 第 21 章 外部関数 と そのほかの拡張処理機能の使い方 構造体に埋め込まれた Char 型変数の配列は、 C の構造体に埋め込まれ た配列に変換 さ れ ま す。 こ れは、 埋め込みの String 型 (C の構造体の String への埋め込みポ イ ン タ と な り ます) と は異な り ます。 注意 可能な と き は必ず、 関数か ら の戻 り 値 と し て String 型の変数を PowerBuilder に返 し て く だ さ い。 UNIX での外部関数と プ ロ グラ ムの呼び出し PowerBuilder カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト を UNIX プ ラ ッ ト フ ォ ーム上に EAServer コ ン ポーネ ン ト と し て配布す る 場合、サーバが 動作す る オペ レ ーテ ィ ン グ シ ス テ ム で コ ン パ イ ル さ れた共有 ラ イ ブ ラ リ の外部関数を呼び出す こ と がで き ます。 ただ し 、 Windows API の 呼び出 し が発生す る 外部関数や、 グ ラ フ ィ カル プ ロ セ ス に依存す る 外 部関数を呼び出す こ と はで き ません。 UNIX 共有 ラ イ ブ ラ リ にあ る 関数を宣言す る には、 標準の PowerScript 構文を使用で き ます。 た と えば、 次の ス テー ト メ ン ト では、 Solaris の 標準 C ラ イ ブ ラ リ にあ る 関数 getcwd を宣言 し ます。 FUNCTION string getcwd(REF string buff, & unsigned int size) LIBRARY "/usr/lib/libc.so" アプ リ ケーシ ョ ン で ス ク リ プ ト か ら 関数を呼び出す方法は、 ほかの関 数 を 呼び出す方法 と 同 じ です。 次の例では、 space 関数は、 getcwd に よ っ て返 さ れたデ ィ レ ク ト リ 名を保持す る のに十分な領域を割 り 当て ます。 string ls_return, ls_directory ls_directory = space(100) . . . ls_return = getcwd(ls_directory, 100) ロー ド ラ イ ブ ラ リ パスの更新 UNIX で コ ン ポーネ ン ト が外部関数を呼び出す場合には、 コ ン ポーネ ン ト は、 その関数が置かれてい る 共有 ラ イ ブ ラ リ を検出で き な ければ な り ません。 そのためには、 ラ イ ブ ラ リ パ ス環境変数を更新 し て、 そ の共有 ラ イ ブ ラ リ が置かれてい る デ ィ レ ク ト リ を追加す る 必要があ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 439 ユーテ ィ リ テ ィ 関数の使い方 ユーテ ィ リ テ ィ 関数の使い方 ユーテ ィ リ テ ィ 関数は、 Windows の情報を入手 し て外部関数に渡す手 段を提供す る ので、 PowerScript の Send 関数の引数 と し て使用で き ま す。 ユーテ ィ リ テ ィ 関数は 4 つあ り ます。 4 つのユーテ ィ リ テ ィ 関数 表 21-1: ユーテ ィ リ テ ィ 関数 関数 戻り値 Handle UnsignedInt IntHigh UnsignedInt 目的 指定 さ れたオブジ ェ ク ト のハン ド ルを返す 指定 さ れた Long 型数値の上位ワ ー ド を返す UnsignedInt こ の関数は、 外部関数や メ ッ セージ オブジ ェ ク ト の LongParm プ ロ パテ ィ に よ っ て入手 さ れ る Windows パ ラ メ ー タ の値をデ コ ー ド す る と き に 用い る 指定 さ れた Long 型数値の下位ワ ー ド を返す IntLow Long Long こ の関数は、 外部関数や メ ッ セージ オブジ ェ ク ト の LongParm プ ロ パテ ィ に よ っ て入手 さ れ る Windows パ ラ メ ー タ の値をデ コ ー ド す る と き に 用い る 下位ワー ド と 上位ワー ド を連結 し て、 Long 型数 値にす る Long 関数は、 外部関数に値を渡す と き に用い る 例 以下の ス ク リ プ ト は、 外部関数 IsZoomed を使用 し て、 現行 ウ ィ ン ド ウ のサ イ ズが最大にな っ てい る か ど う かテ ス ト し ます。 こ の ス ク リ プ ト は、 Handle 関数を使用 し て、 ウ ィ ン ド ウ ハン ド ルを IsZoomed に渡 し ま す。ま た、その結果を、sle_output と い う 名前のシ ン グル ラ イ ン エデ ィ ッ ト に表示 し ます。 boolean Maxed Maxed = IsZoomed(Handle(parent)) if Maxed then sle_output.Text = " 最大表示 " if not Maxed then sle_output.Text = " 通常の表示 " 以下の ス ク リ プ ト は、 ウ ィ ン ド ウ オブジ ェ ク ト のハン ド ルを外部関数 FlashWindow に渡 し て、 ウ ィ ン ド ウ の タ イ ト ルバーを使用不可に し 、 し ば ら く し て使用可能に戻 し ます。 // ループのカ ウン タ 変数 と ウ ィ ン ド ウ オブ ジ ェ ク ト のハン ド ルを // 宣言 し ます。 int nLoop uint hWnd // PowerBuilder のウ ィ ン ド ウのハン ド ルを入手 し ます。 hWnd = handle(This) // タ イ ト ル バーを使用不可に し ます。 440 PowerBuilder 第 21 章 外部関数 と そのほかの拡張処理機能の使い方 FlashWindow (hWnd, TRUE) // し ばら く そのま まに し ます。 For nLoop = 1 to 300 Next // ウ ィ ン ド ウの タ イ ト ル バーを使用可能に戻 し ます。 FlashWindow (hWnd, FALSE) Windows メ ッ セージの送信 PowerBuilder で作成 し た ウ ィ ン ド ウ ま たは外部 ウ ィ ン ド ウ (た と えば、 外部関数で作成 し た ウ ィ ン ド ウ ) に メ ッ セージ を送 る と き は、 Post 関 数ま たは Send 関数を使用 し ます。 PowerBuilder イ ベン ト を発生 さ せ る には、 EVENT 構文、 TriggerEvent 関数、 ま たは PostEvent 関数を使用 し ます。 Post 関数 と Send 関 数の使い方 通常、Post 関数 と Send 関数は、PowerBuilder イ ベン ト にはない Windows イ ベン ト を発生 さ せ る と き に使用 し ます。 こ れ ら の関数は、 イ ベン ト を発生す る ウ ィ ン ド ウ の ス ク リ プ ト 、 ま たはアプ リ ケーシ ョ ン の任意 の ス ク リ プ ト で使用で き ます。 Post 関数は非同期関数です。 つ ま り 、 メ ッ セージは ウ ィ ン ド ウ ま たは コ ン ト ロ ールの メ ッ セージ キ ュ ーに送 ら れます。Send 関数は同期関数 であ り 、 ウ ィ ン ド ウ や コ ン ト ロ ールが直接 メ ッ セージ を受け取 り ます。 PowerBuilder 6.0 の時点では、 PowerBuilder に よ っ てポ ス ト さ れたすべ ての イ ベン ト は、 Windows のシ ス テ ム キ ュ ー と は別のキ ュ ーに よ っ て 処理 さ れ ま す。 PowerBuilder がポ ス ト し た メ ッ セージは、 Windows が ポ ス ト し た メ ッ セージの前に処理 さ れ ます。 ウ ィ ン ド ウのハン ド ルの入手方法 ウ ィ ン ド ウ のハン ド ルを入手す る には、 Handle 関数を使用 し ます。2 つ の Integer 型の数値を結合 し て メ ッ セージの Long 値を形成す る と き は、 Long 関数を使用 し ます。Handle 関数 と Long 関数はユーテ ィ リ テ ィ 関数 で、 こ の章で後述 し ます。 PowerBuilder イ ベン ト の発生方法 PowerBuilder イ ベン ト を発生 さ せ る には、 表 21-2 に示 し た方法を使用 で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 441 Windows メ ッ セージの送信 表 21-2: PowerBuilder イ ベン ト を発生 さ せる方法 使用する もの TriggerEvent 関数 PostEvent 関数 イ ベン ト 呼び出 し 構文 説明 ウ ィ ン ド ウ や コ ン ト ロ ールの ス ク リ プ ト の実行中、 指定 し た オブ ジ ェ ク ト の イ ベ ン ト を た だ ち に起動 す る 同期関数 非同期関数。 イ ベン ト は ウ ィ ン ド ウや コ ン ト ロ ール の イ ベン ト キ ュ ーに追加 さ れ る ド ッ ト (.) 表記 を使用 し て、 コ ン ト ロ ールの イ ベ ン ト を直接呼び出す方法 3 つの方法 と も 、 メ ッ セージ キ ュ ーをバ イ パ スす る ので、 Send 関数 と Post 関数 よ り ス ク リ プ ト の記述が簡単です。 以下の 3 つの ス テー ト メ ン ト はすべて、 コ マ ン ド ボ タ ン cb_OK の Clicked イ ベン ト を起動 し ます。 こ れ ら の ス テー ト メ ン ト は、 cb_OK が 配置 さ れてい る ウ ィ ン ド ウ の ス ク リ プ ト に記述 さ れてい る も の と し ま す。 例 Send 関数では、 Handle ユーテ ィ リ テ ィ 関数を使用 し て、 コ マ ン ド ボ タ ン cb_OK があ る ウ ィ ン ド ウ のハン ド ルを入手 し ます。 ま た、 Long 関数 を使用 し て、 コ マ ン ド ボ タ ン cb_OK のハン ド ル と 0 (BN_CLICK) を連 結 し 、 オブ ジ ェ ク ト と イ ベン ト を 識別す る Long 型の数値に変換 し ま す。 Send(Handle(Parent),273,0,Long(Handle(cb_OK),0)) cb_OK.TriggerEvent(Clicked!) cb_OK.EVENT Clicked() TriggerEvent 関数は、 イ ベン ト を起動す る オブジ ェ ク ト を識別 し ま す。 Clicked イ ベン ト を起動す る には、 カ タ ロ グデー タ 型の値 Clicked! を指 定 し ます。 イ ベン ト 呼び出 し は、 EVENT キー ワ ー ド を使用 し て Clicked イ ベン ト を起動 し ます。 イ ベン ト を呼び出す と き は、 TRIGGER キー ワ ー ド がデ フ ォ ル ト です。 Clicked イ ベン ト を ポ ス ト す る 場合は、 POST キー ワ ー ド を使用 し ます。 Cb_OK.EVENT POST Clicked() 442 PowerBuilder 第 21 章 外部関数 と そのほかの拡張処理機能の使い方 メ ッ セージ オブ ジ ェ ク ト メ ッ セ ー ジ (Message) オ ブ ジ ェ ク ト は、 あ ら か じ め 定 義 さ れ た PowerBuilder のグ ロ ーバル オブジ ェ ク ト です (デフ ォ ル ト の ト ラ ンザ ク シ ョ ン オブジ ェ ク ト の SQLCA やエ ラ ー オブジ ェ ク ト の同類です)。 メ ッ セージ オブジ ェ ク ト は、 PowerBuilder で定義 さ れた イ ベン ト にな い Microsoft Windows イ ベン ト を処理す る ス ク リ プ ト の中で使用 さ れ ます。 PowerBuilder で定義 さ れた イ ベン ト にない Windows イ ベン ト が発生す る と 、 PowerBuilder は そ の イ ベ ン ト に関す る 情報 を メ ッ セー ジ オ ブ ジ ェ ク ト に保持 し ます。 メ ッ セージ オブ ジ ェ ク ト のそのほかの用途 メ ッ セージ オブジ ェ ク ト は、 以下の よ う な場合に も 用い ら れ ます。 • ウ ィ ン ド ウ の開閉時に、 ウ ィ ン ド ウ 間でパ ラ メ ー タ の受け渡 し を す る ため 詳細については、 『PowerScript リ フ ァ レ ン ス』 マニ ュ アルの OpenWithParm、 OpenSheetWithParm、 お よ び CloseWithReturn の各関 数の説明を参照 し て く だ さ い。 • TriggerEvent 関数や PostEvent 関数で、オプシ ョ ンのパ ラ メ ー タ が使 用 さ れた場合で も 、 イ ベン ト に情報を渡すため 詳細については、 『PowerScript リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 メ ッ セージ オブ ジ ェ ク ト のカ ス タ マ イ ズ ア プ リ ケーシ ョ ン で使用 し てい る グ ロ ーバル メ ッ セージ オブジ ェ ク ト は、 組み込みの Message オブジ ェ ク ト を継承 し た標準 ク ラ ス ユーザ オ ブ ジ ェ ク ト を 定義す る こ と に よ っ て カ ス タ マ イ ズ で き ま す。 そ の ユーザ オブジ ェ ク ト では、 新たなプ ロ パテ ィ ( イ ン ス タ ン ス変数) や 関数の追加が可能です。 アプ リ ケーシ ョ ン の必要に応 じ て、 ユーザ定 義プ ロ パテ ィ の設定や関数の呼び出 し が行え ます。 標準 ク ラ ス ユーザ オブジ ェ ク ト の定義の詳細については、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 メ ッ セージ オブ ジ ェ ク ト のプ ロ パテ ィ メ ッ セ ー ジ オ ブ ジ ェ ク ト の 最初 の 4 つ の プ ロ パ テ ィ は、 Microsoft Windows の メ ッ セージ構造体の最初の 4 つのプ ロ パ テ ィ に対応 し ま す。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 443 メ ッ セージ オブ ジ ェ ク ト 表 21-3: メ ッ セージ オブ ジ ェ ク ト のプ ロパテ ィ プ ロパテ ィ Handle デー タ 型 用途 Integer Number Integer WordParm UnsignedInt LongParm Long DoubleParm StringParm PowerObjectParm Double Processed Boolean ウ ィ ン ド ウや コ ン ト ロ ールのハン ド ル イ ベン ト を識別す る 番号。 こ の番号は Windows か ら 送 ら れ る イ ベ ン ト の Word パ ラ メ ー タ 。 こ の パ ラ メ ー タ は Windows か ら 送 ら れ る 。パ ラ メ ー タ の値 と 意味は イ ベン ト に よ っ て異な る イ ベン ト の Long 型パ ラ メ ー タ 。 こ のパ ラ メ ー タ は Windows か ら 送れ る 。パ ラ メ ー タ の値 と 意味は イ ベン ト に よ っ て異な る 数値ま たは数値変数 文字列ま たは String 型変数 構造体 を 含む PowerBuilder オ ブ ジ ェ ク ト デー タ 型 ユーザ定義 イ ベ ン ト に対応す る ス ク リ プ ト で設定 さ れた Boolean 型の値 String PowerObject • TRUE— ス ク リ プ ト が イ ベン ト を処理 し た。 イ ベン ト の処理の後、 デフ ォ ル ト ウ ィ ン ド ウ プ ロ シージ ャ (DefWindowProc 関数) を呼び出 さ ない ReturnValue Long • FALSE— (デフ ォ ル ト ) イ ベン ト の処理 の後、 DefWindowProc 関数を呼び出す Message.Processed プ ロ パテ ィ が TRUE の と き に、 開発者が Windows に戻す値 Message.Processed プ ロ パ テ ィ が FALSE の と き は、 こ のプ ロ パテ ィ は無視 さ れ る メ ッ セージ オブジ ェ ク ト の値は、 メ ッ セージ オブジ ェ ク ト に値が生成 さ れ る イ ベン ト ス ク リ プ ト 内で使用 し ます。 た と えば、 FileExists イ ベ ン ト に以下の ス ク リ プ ト が記述 さ れてい る と し ます。 OpenWithParm で 応答 ウ ィ ン ド ウ を表示 し て、 フ ァ イ ルを上書 き す る か ど う か を確認す る メ ッ セージ を ユーザに表示 し ます。フ ァ イ ルを保存す る か ど う かは、 FileExists か ら の戻 り 値に よ っ て決ま り ます。 OpenWithParm( w_question, & " 指定 さ れた フ ァ イルはすでに存在 し ます。 " + & " このフ ァ イルを上書き し ますか ?" ) IF Message.StringParm = "Yes" THEN RETURN 0 // フ ァ イルを保存 し ます ELSE RETURN -1 // 保存をキ ャ ン セル し ます END IF 444 PowerBuilder 第 21 章 外部関数 と そのほかの拡張処理機能の使い方 Microsoft Windows の メ ッ セージ番号 と パ ラ メ ー タ の詳細については、 Microsoft Windows ソ フ ト ウ ェ ア開発キ ッ ト (SDK) のマニ ュ アルを参 照 し て く だ さ い。 コ ン テキス ト 情報 PowerBuilder の コ ン テ キ ス ト 機能を使用 し て、 ア プ リ ケーシ ョ ン で一 定の ホ ス ト (PowerBuilder 以外) のサービ ス に ア ク セ ス で き ま す。 こ れは、 COM QueryInterface に類似 し た PowerBuilder の実装機能です。 PowerBuilder では、 以下のホ ス ト サービ ス にア ク セ ス で き ます。 • コ ン テ キ ス ト 情報サービ ス • コ ン テ キ ス ト キー ワー ド サービ ス • CORBACurrent サービ ス • エ ラ ー ロ ギ ン グ サービ ス • イ ン タ ーネ ッ ト サービ ス • Secure Sockets Layer サービ ス • ト ラ ンザ ク シ ョ ン サーバ サービ ス PowerBuilder は、 現行の実行コ ン テキ ス ト (ネイ ティ ブな PowerBuilder、 PowerBuilder のプ ラ グ イ ン、 PowerBuilder ウ ィ ン ド ウ の ActiveX、 ト ラ ンザ ク シ ョ ン サーバ) に合わせて適切なサービ ス オブジ ェ ク ト を作成 し ます。 こ の機能に よ り 、 アプ リ ケーシ ョ ン で実行環境を最大限利用 で き る よ う にな り ま す。 た と えば、 PowerBuilder ウ ィ ン ド ウ のプ ラ グ イ ン では、 EMBED 構成要素に指定 さ れたパ ラ メ ー タ にア ク セ ス で き ます。 ま た、 Internet Explorer で PowerBuilder ウ ィ ン ド ウ の ActiveX を 実行 し てい る と き は、 アプ リ ケーシ ョ ン か ら ActiveX オー ト メ ーシ ョ ン サーバにア ク セ ス で き る ので、 プ ロ グ ラ ム か ら ブ ラ ウ ザにア ク セ ス し た り 、 その制御を行 う こ と がで き ます。 コ ン テ キ ス ト 機 能 で は、 ContextInformation、 ContextKeyword、 CORBACurrent、ErrorLogging、Inet、SSLServiceProvider、TransactionServer と い う 7 つの PowerBuilder サービ ス オブジ ェ ク ト と InternetResult オブ ジ ェ ク ト を使用 し ます。 コ ン テ キ ス ト 機能は コ ン テ キ ス ト オブジ ェ ク ト と 呼ばれ る こ と があ り ますが、 PowerBuilder のシ ス テ ム オブジ ェ ク ト ではあ り ません。 こ れ ら のオブジ ェ ク ト の詳細については、『オブジ ェ ク ト と コ ン ト ロ ー ル』 マニ ュ アル ま たは PowerBuilder ブ ラ ウ ザを参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 445 コ ン テキス ト 情報 サー ビ ス を 使用す る 前に、 GetContextService 関数 を 呼び出 し て、 そ の サ ー ビ ス の イ ン ス タ ン ス を 作 成 し ま す。 こ の 関 数 を 呼 び 出 す と 、 PowerBuilder はその イ ン ス タ ン ス 化 さ れたサービ ス への参照を返 し ま す。 サービ ス の関数を呼び出す と き は、 こ の参照を ド ッ ト (.) 表記で 使用 し て く だ さ い。 サービ ス を使用可能に する方法 ❖ サービ ス を使用可能にするには 1 適切な型の イ ン ス タ ン ス変数を設定 し ます。 ContextInformation ContextKeyword CORBACurrent ErrorLogging Inet SSLServiceProvider TransactionServer 2 icxinfo_base icxk_base corbcurr_base erl_base iinet_base sslsp_base ts_base GetContextService 関数を呼び出 し て、 イ ン ス タ ン ス変数の イ ン ス タ ン ス を作成 し ます。 this.GetContextService("ContextInformation", & icxinfo_base) this.GetContextService("Keyword", icxk_base) this.GetContextService("CORBACurrent", & corbcurr_base) this.GetContextService("ErrorLogging", erl_base) this.GetContextService("Internet", iinet_base) this.GetContextService("SSLServiceProvider", & sslsp_base) this.GetContextService("TransactionServer",ts_base) CREATE 文の使い方 446 サービ ス オブジ ェ ク ト は、PowerScript の CREATE 文で イ ン ス タ ン ス化 で き ます。 ただ し 、 こ の ス テー ト メ ン ト では、 アプ リ ケーシ ョ ン が ど こ で実行 し てい る かに関係な く 、 常にデフ ォ ル ト コ ン テ キ ス ト (ネ イ テ ィ ブな PowerBuilder の実行環境) のオブジ ェ ク ト が作成 さ れ ます。 PowerBuilder 第 21 章 外部関数 と そのほかの拡張処理機能の使い方 コ ン テ キス ト 情報サービ ス コ ン テ キ ス ト 情報サービ ス は、 アプ リ ケーシ ョ ン の実行 コ ン テ キ ス ト に関す る 情報を入手す る と き に使用 し ます。 こ のサービ ス では、 アプ リ ケーシ ョ ン が PowerBuilder 実行環境で PowerBuilder ウ ィ ン ド ウ のプ ラ グ イ ン ま たは PowerBuilder ウ ィ ン ド ウ の ActiveX と し て実行 し てい る か ど う かがわか る だけでな く 、 現行バージ ョ ン に関す る 情報 も 入手 で き ます。 こ の情報を使えば、 デ ィ ス プ レ イ の特性やアプ リ ケーシ ョ ン の動作形態を修正で き ます。 た と えば、 プ ラ グ イ ンや ActiveX と し て実行 し てい る と き に、コ マ ン ド ボ タ ン[閉 じ る ]を非表示にで き ます。 さ ら に、 Internet Explorer の PowerBuilder ウ ィ ン ド ウ の ActiveX で実行 し て い る 場合、 コ ン テ キ ス ト 情報サー ビ ス は ActiveX の オー ト メ ー シ ョ ン サーバ オブジ ェ ク ト への参照を返 し ます。アプ リ ケーシ ョ ン で こ の参照を使えば、 Web ブ ラ ウ ザを制御す る 関数を呼び出せます。 コ ン テキス ト 情報への ア ク セス コ ン テ キ ス ト 情報サービ ス を使用 し て、 表 21-4 の情報にア ク セ ス で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 447 コ ン テキス ト 情報 表 21-4: コ ン テキス ト 情報 項目 コ ンテキ ス ト 名 使用する関数 GetName 説明 戻 り 値は コ ン テ キ ス ト に よ っ て異な る • デフ ォ ル ト : PowerBuilder Runtime • ウ ィ ン ド ウ のプ ラ グ イ ン : PowerBuilder Window Plug-in • ウ ィ ン ド ウ の ActiveX: PowerBuilder Window ActiveX コ ンテキ ス ト 名 の略称 GetShortName 戻 り 値は コ ン テ キ ス ト に よ っ て異な る • デフ ォ ル ト : PBRUN • ウ ィ ン ド ウ のプ ラ グ イ ン : PBWinPlugin ClassName 関数の使 い方 会社名 バージ ョ ン GetCompanyName メ ジ ャ ー バー ジョン マ イ ナー バー ジョン フ ィ ッ ク ス バー ジョン GetMajorVersion GetVersionName GetMinorVersion GetFixesVersion • ウ ィ ン ド ウ の ActiveX: PBRTX 会社名を返す (Sybase, Inc な ど) 完全なバージ ョ ン番号を返す (9.0.1 な ど) メ ジ ャ ー バージ ョ ン番号を返す (9 な ど) マ イ ナー バージ ョ ン番号を返す (0 な ど) フ ィ ッ ク ス バージ ョ ン番号を返す (1 な ど) ClassName 関数を使用 し て、 オブジ ェ ク ト の コ ン テ キ ス ト を決定す る こ と も で き ま す。 ClassName 関数の戻 り 値は、 コ ン テ キ ス ト に よ っ て 異 な り ま す。 た と え ば、 ウ ィ ン ド ウ の プ ラ グ イ ン の 戻 り 値 は plugincontextinformation で、ウ ィ ン ド ウ の ActiveX では rtxcontextinformation です。 こ の情報は以下の よ う な さ ま ざ ま な用途に使用で き ます。 • 実行 コ ン テキス ト に基づいてア プ リ ケーシ ョ ンの表示形態を修正する場 合 た と えば、PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンや PowerBuilder ウ ィ ン ド ウ ActiveX と し て実行 し てい る と き には [閉 じ る ] ボ タ ン を非表示にで き ま す。 プ ラ グ イ ンや ActiveX では、 ウ ィ ン ド ウ を閉 じ る と HTML ページに空の スペース が生成 さ れ ます。 • コ ン テキス ト で現行バージ ョ ン をサポー ト し ているかど う かを検証する 場合 た と えば、 アプ リ ケーシ ョ ン で管理バージ ョ ン 9.0.1 の機能 や修正部分が必要な場合は、 コ ン テ キ ス ト 情報サービ ス を使用 し て、 現行の実行 コ ン テ キ ス ト のバージ ョ ン を確認で き ます。 448 PowerBuilder 第 21 章 外部関数 と そのほかの拡張処理機能の使い方 ❖ コ ン テキス ト 情報にア ク セスするには 1 ContextInformation 型の イ ン ス タ ン ス ま たはグ ロ ーバル変数を宣言 し ます。 ContextInformation icxinfo_base 2 GetContextService 関数を呼び出 し て、コ ン テ キ ス ト 情報サービ ス を 作成 し ます。 this.GetContextService("ContextInformation", icxinfo_base) 3 & 必要な場合は、 コ ン テ キ ス ト 情報サービ ス関数を呼び出 し ます。 こ の例では、 GetShortName 関数を呼び出 し て現行 コ ン テ キ ス ト を 確認 し 、 さ ら に GetVersionName 関数を呼び出 し て現行バージ ョ ン を確認 し ます。 String ls_name String ls_version Constant String ls_currver = "7.0.01" icxinfo_base.GetShortName(ls_name) IF ls_name <> "PBRun" THEN cb_close.visible = FALSE END IF icxinfo_base.GetVersionName(ls_version) IF ls_version <> ls_currver THEN MessageBox(" エ ラ ー ", & " 次のバージ ョ ン でなければな り ません " + ls_currver) END IF ActiveX オー ト メ ー シ ョ ン サーバのア ク セス Internet Explorer の バ ー ジ ョ ン 3.0 ま た は こ れ 以 降 の バ ー ジ ョ ン で PowerBuilder ウ ィ ン ド ウ の ActiveX を実行 し てい る 場合は、アプ リ ケー シ ョ ン で コ ン テ キ ス ト 情報サービ ス の GetHostObject 関数を使用 し て、 ActiveX オー ト メ ーシ ョ ン サーバ オブジ ェ ク ト (ホ ス ト オブジ ェ ク ト ) へ の 参 照 を 入 手 で き ま す。 特 に、 イ ン ス タ ン ス 化 さ れ て い な い OLEObject 変数を GetHostObject に渡す と 、IWebBrowserApp オー ト メ ー シ ョ ン サーバへの参照が返 さ れます。 アプ リ ケーシ ョ ン では、IWebBrowserApp の メ ソ ッ ド と プ ロ パテ ィ を呼 び出 し 、 ア ク セ ス で き る ので、 以下の よ う な一定局面のブ ラ ウ ザの動 作にア ク セ ス し 、 その制御を行 う こ と が可能です。 • [戻 る ] • [進む] • [ホーム] ア プ リ ケーシ ョ ン テ ク ニ ッ ク 449 コ ン テキス ト 情報 • [更新] • [お気に入 り ] • [終了] IWebBrowserApp イ ン タ フ ェース、 メ ソ ッ ド 、 お よ びプ ロ パテ ィ の詳細 については、 Internet Explorer のマニ ュ アル ま たは Microsoft の Web サ イ ト を参照 し て く だ さ い。 ❖ ActiveX オー ト メ ーシ ョ ン サーバにア ク セスするには 1 ContextInformation 型お よ び OLEObject 型の イ ン ス タ ン ス ま たはグ ロ ーバル変数を宣言 し ます。 ContextInformation icxinfo_base OLEObject iole_browser 2 GetContextService 関数を呼び出 し て、 コ ン テ キ ス ト 情報サービ ス を 作成 し ます。 GetContextService("ContextInformation", icxinfo_base) 3 & GetHostObject 関数を呼び出 し て、ActiveX オー ト メ ーシ ョ ン サーバ への参照を設定 し ます。 Integer li_rtrn li_rtrn = icxinfo_base.GetHostObject(iole_browser) IF li_rtrn = 1 THEN sle_host.Text = "GetHostObject succeeded" ELSE sle_host.Text = "GetHostObject failed" END IF 4 必要な IWebBrowserApp の関数を呼び出 し ます。 こ の例では、 Navigate 関数を呼び出 し て、 Sybase のホーム ページ を表示す る デ フ ォ ル ト の Web ブ ラ ウ ザを開 き ます。 IF IsValid(iole_browser) THEN iole_browser.Navigate & ("http://www.sybase.com", 0, 0, 0) END IF 450 PowerBuilder 第 21 章 外部関数 と そのほかの拡張処理機能の使い方 コ ン テ キス ト キーワード サービ ス 現行 コ ン テ キ ス ト の環境情報にア ク セ スす る には、 コ ン テ キ ス ト キー ワー ド サービ ス を使用 し ます。 デフ ォ ル ト 環境の場合、 こ のサービ ス は ホ ス ト の ワ ー ク ス テーシ ョ ン の環境変数 を 返 し ま す。 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン では、 こ のサービ ス を使用す る と 、 プ ラ グ イ ン の Embed 構成要素に指定 さ れてい る パ ラ メ ー タ にア ク セ ス で き ます。 EAServer 内で実行す る と き には、 キー ワー ド サービ ス を使用 し て、 コ ン ポーネ ン ト のプ ロ パテ ィ 値を取得で き ます。 EAServer で コ ン テ キ ス ト キー ワ ー ド サービ ス を使用す る 方法の詳細 については、 509 ページの 「 コ ン ポーネ ン ト プ ロ パテ ィ へのア ク セ ス」 を参照 し て く だ さ い。 環境変数のア ク セス PowerBuilder の実行環境 (デフ ォ ル ト の コ ン テ キ ス ト ) で実行 し てい る 場合、 こ のサービ ス を使用 し て環境変数を戻 し ます。 ❖ 環境変数にア ク セスするには 1 ContextKeyword 型の イ ン ス タ ン ス ま たはグ ロ ーバル変数を宣言 し ます。 戻 り 値を保持す る String 型の可変長配列 も 宣言 し ます。 ContextKeyword icxk_base String is_values[ ] 2 GetContextService 関数を呼び出 し て、 コ ン テ キ ス ト 情報サービ ス を 作成 し ます。 this.GetContextService("Keyword", icxk_base) 3 GetContextKeyword 関数を呼び出 し て、 必要な環境変数にア ク セ ス し ま す。 こ の例では、 GetContextKeyword 関数を呼び出 し て現行ア プ リ ケーシ ョ ン の Path を確認 し ます。 icxk_base.GetContextKeywords("Path", is_values) 4 引数に指定 し た配列か ら 値を抽出 し ま す。 環境変数にア ク セ ス す る 場合、 配列の構成要素は常に 1 つだけに し なければな り ません。 MessageBox("Path", "Path is:" + is_values[1]) Embed 構成要素パラ メ ー タ のア ク セス Embed 構成要素には追加のユーザ指定パ ラ メ ー タ を入れ る こ と が可能 です。 ま た、 Embed 構成要素では、 各パ ラ メ ー タ に 2 つ以上の値を持 たせ る こ と が可能です。 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン の コ ン テ キ ス ト で実行 し てい る 場 合、 キー ワー ド サービ ス は、 Embed 構成要素に指定 さ れたパ ラ メ ー タ へア ク セ ス す る と き に使用 し ます。 指定 さ れたパ ラ メ ー タ が見つか ら ない場合、 こ のサービ ス は指定 さ れたパ ラ メ ー タ と 環境変数の照合を 試みます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 451 コ ン テキス ト 情報 ❖ Embed 構成要素のパラ メ ー タ にア ク セスするには 1 ContextKeyword 型の イ ン ス タ ン ス ま たはグ ロ ーバル変数を宣言 し ます。 戻 り 値を保持す る String 型の可変長配列 も 宣言 し ます。 ContextKeyword icxk_base String is_values[ ] 2 GetContextService 関数を呼び出 し て、 コ ン テ キ ス ト 情報サービ ス を 作成 し ます。 GetContextService("Keyword", icxk_base) 3 GetContextKeyword 関数を呼び出 し ます。 こ の例では、 GetContextKeyword 関数を呼び出 し てユーザ指定パ ラ メ ー タ VALID の値にア ク セ ス し ます。 icxk_base.GetContextKeywords("VALID", is_values) 4 戻 り 値の配列か ら 値を抽出 し ま す。 こ の例では、 パ ラ メ ー タ を リ ス ト ボ ッ ク ス に表示 し ます。 Integer li_count FOR li_count = 1 to UpperBound(is_values) lb_parms.AddItem(is_values[li_count]) NEXT CORBACurrent サービ ス OTS ス タ イ ル と し て マー ク さ れた ク ラ イ ア ン ト ア プ リ ケーシ ョ ン と EAServer コ ン ト ロ ールでは、CORBACurrent コ ン テ キ ス ト サービ ス オ ブジ ェ ク ト の関数を使用 し て、 EAServer ト ラ ンザ ク シ ョ ンに関す る 情 報の作成、 制御お よ び取得がで き ま す。 CORBACurrent オブジ ェ ク ト は、 CORBACurrent イ ン タ フ ェ ー ス 用に定義 さ れた数多 く の メ ソ ッ ド を備え てい ます。 詳細については、 548 ページの 「 ク ラ イ ア ン ト と コ ン ポーネ ン ト を区 別す る ト ラ ンザ ク シ ョ ン」 を参照 し て く だ さ い。 エ ラ ー ロ ギン グ サービ ス ト ラ ン ザク ショ ン サーバ内で動作し ている PowerBuilder オブジェ ク ト に よ っ て生成さ れたエラ ーを ロ グ フ ァ イ ルに記録する には、 ErrorLogging サービ ス オブジ ェ ク ト の イ ン ス タ ン ス を作成 し 、その ロ グ メ ソ ッ ド を 呼び出 し ます。 た と えば、 次の よ う にな り ます。 452 PowerBuilder 第 21 章 外部関数 と そのほかの拡張処理機能の使い方 ErrorLogging erlinfo_base this.GetContextService("ErrorLogging", & erlinfo_base) erlinfo_base.log(" こ の文字列を ロ グに書き込む ") コ ン ポーネ ン ト が EAServer で動作 し てい る 場合、 エ ラ ーは EAServer ロ グに記録 さ れ ます。 コ ン ポーネ ン ト が MTS で動作 し てい る 場合は、 エ ラ ーは Windows NT のシ ス テ ム アプ リ ケーシ ョ ン ロ グに記録 さ れ ま す。 イ ン タ ーネッ ト サービ ス イ ン タ ーネ ッ ト サービ ス は、 以下の用途に使用 し ます。 • デフ ォ ル ト のブ ラ ウ ザで Web ページ を表示す る 。 HyperLinkToURL 関数は指定 さ れた URL を 使 っ てデ フ ォ ル ト のブ ラ ウ ザ を 起動す る • 指定 さ れたページの HTML にア ク セ スす る 。 GetURL 関数は HTTP Get を実行す る • CGI、 ISAPI、 ま たは NSAPI プ ロ グ ラ ムにデー タ を送信す る 。 PostURL 関数は HTTP Post を実行す る イ ン タ ーネ ッ ト サービ ス の HyperLinkToURL 関数を呼び出 し て、 指定 さ れた URL を使っ てデフ ォ ル ト のブ ラ ウ ザを起動 し ます。 URL へのハイパー リ ン ク 接続 ❖ URL にハイパー リ ン ク で接続するには 1 Inet 型の イ ン ス タ ン ス ま たはグ ロ ーバル変数を宣言 し ます。 Inet 2 iinet_base GetContextService 関数を呼び出 し て、イ ン タ ーネ ッ ト サービ ス を作 成 し ます。 THIS.GetContextService("Inet", iinet_base) 3 HyperLinkToURL 関数を呼び出 し て、ブ ラ ウ ザの起動時に表示 さ れ る ページの URL を渡 し ます。 iinet_base.HyperlinkToURL & ("http://www.sybase.com") URL の入手 イ ン タ ーネ ッ ト サービ ス の GetURL 関数を呼び出 し て HTTP Get を実 行 し 、 指定 さ れ た URL の 生 の HTML を 入手 し ま す。 こ の 関数 は、 InternetResult オブジ ェ ク ト を使用 し て生の HTML を返 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 453 コ ン テキス ト 情報 ❖ HTTP Get を実行するには 1 Inet 型の イ ン ス タ ン ス ま たはグ ロ ーバル変数を宣言 し ます。子孫オ ブジ ェ ク ト InternetResult ( こ の例では、 n_ir_msgbox) をデー タ 型 と し て使っ て、 イ ン ス タ ン ス ま たはグ ロ ーバル変数を も う 1 つ宣言 して く ださい 。 Inet iinet_base n_ir_msgbox iir_msgbox 2 GetContextService 関数を呼び出 し て、イ ン タ ーネ ッ ト サービ ス を作 成 し ます。 THIS.GetContextService("Internet", iinet_base) 3 子孫オブジ ェ ク ト InternetResult の イ ン ス タ ン ス を作成 し ます。 iir_msgbox = CREATE n_ir_msgbox 4 GetURL 関数を呼び出 し 、返 さ れ る ページの URL と 、 子孫オブジ ェ ク ト InternetResult の イ ン ス タ ン スへの参照を渡 し ます。 iinet_base.GetURL & ("http://www.sybase.com", iir_msgbox) GetURL 関数は実行を終了す る と 、 子孫オブジ ェ ク ト InternetResult で定義 さ れてい る InternetData 関数を呼び出 し 、指定 さ れた URL の HTML を渡 し ます。 イ ン タ ーネ ッ ト サービ ス の PostURL 関数を呼び出 し て HTTP Post を実 行 し 、 デー タ を CGI、 ISAPI、 ま たは NSAPI プ ロ グ ラ ムに送信 し ます。 こ の関数は、 InternetResult オブジ ェ ク ト を介 し て生の HTML を返 し ま す。 URL へのポス ト ❖ HTTP Post を実行するには 1 Inet 型の イ ン ス タ ン ス ま たはグ ロ ーバル変数を宣言 し ます。子孫オ ブジ ェ ク ト InternetResult ( こ の例では、 n_ir_msgbox) をデー タ 型 と し て使っ て、 イ ン ス タ ン ス ま たはグ ロ ーバル変数を も う 1 つ宣言 して く ださい 。 Inet iinet_base n_ir_msgbox iir_msgbox 2 GetContextService 関数を呼び出 し て、イ ン タ ーネ ッ ト サービ ス を作 成 し ます。 THIS.GetContextService("Internet", iinet_base) 3 子孫オブジ ェ ク ト InternetResult の イ ン ス タ ン ス を作成 し ます。 iir_msgbox = CREATE n_ir_msgbox 454 PowerBuilder 第 21 章 外部関数 と そのほかの拡張処理機能の使い方 4 PostURL 関数への引数を設定 し ます。 Blob lblb_args String ls_headers String ls_url Long ll_length ls_url = "http://coltrane.sybase.com/" ls_url += "cgi-bin/pbcgi80.exe/" ls_url += "myapp/n_cst_html/f_test?" lblb_args = Blob("") ll_length = Len(lblb_args) ls_headers = "Content-Length: " & + String(ll_length) + "~n~n" 5 PostURL 関数を呼び出 し 、 実行す る ルーチンの URL、 引数、 ヘ ッ ダ、 お よ び子孫オブジ ェ ク ト InternetResult の イ ン ス タ ン スへの参 照を渡 し ます。 iinet_base.PostURL & (ls_url, lblb_args, ls_headers, 8080, iir_msgbox) PostURL 関数は実行を終了す る と 、子孫オブジ ェ ク ト InternetResult で定義 さ れた InternetData 関数を呼び出 し 、 指定 さ れたルーチンか ら 返 さ れた HTML を渡 し ます。 GetURL 関数 と PostURL 関数は、いずれ も InternetResult オブジ ェ ク ト の デー タ を受け取 り ます。 こ のオブジ ェ ク ト は、 イ ン タ ーネ ッ ト 経由で 返 さ れ る 非同期デー タ を受け取 り 、 キ ャ ッ シ ュ す る バ ッ フ ァ と し て動 作 し ます。 デー タ を全部受け取 る と 、 こ の InternetResult オブジ ェ ク ト はその InternetData 関数を呼び出すので、 必要であれば、 こ こ でデー タ を上書 き し て処理で き ます。 InternetResult オブ ジ ェ ク ト の使い方 InternetResult の子孫オブ ジ ェ ク ト への実装 こ の機能は、 InternetResult 型の標準 ク ラ ス ユーザ オブジ ェ ク ト を作成 し て実装 し ます。 こ の子孫ユーザ オブジ ェ ク ト のそれぞれに、 渡 さ れ た HTML を必要に応 じ て処理す る InternetData 関数を定義 し て く だ さ い。 ❖ 子孫オブ ジ ェ ク ト InternetResult を実装する には 1 InternetResult 型の標準 ク ラ ス ユーザ オブジ ェ ク ト を作成 し ます。 2 以下の よ う な新規ユーザ オブジ ェ ク ト 関数を宣言 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク • 名前 • ア ク セス レ ベル InternetData パブ リ ッ ク 455 コ ン テキス ト 情報 3 • 戻り値 • 引数名 値渡 し のデー タ • 引数のデー タ 型 Blob Integer 返 さ れた HTML を処理す る InternetData 関数の コ ー ド を追加 し ま す。 こ の例では、 HTML を MessageBox に表示す る だけです。 MessageBox(" 返 さ れた HTML", String(data)) Return 1 Secure Sockets Layer サービ ス PowerBuilder を使用すれば、 EAServer への Secure Sockets Layer (SSL) 接続を設定で き ます。 SSL プ ロ ト コ ルでは、 デジ タ ル認証に基づ く 公 開鍵の暗号化 と 認証のアルゴ リ ズ ム を使用 し て、 安全に接続す る こ と がで き ます。 SSL は 「 ラ ッ パー」 プ ロ ト コ ルであ り 、 ほかのプ ロ ト コ ル用のパケ ッ ト は、 SSL パケ ッ ト の内部に埋め込む こ と に よ っ て保護 さ れ ます。 た と えば、 HTTPS は、 各 HTTP パケ ッ ト を SSL パケ ッ ト 内 に埋め込む こ と に よ っ て保護 さ れ る HTTP です。 同様に、 IIOPS は、 SSL 内に埋め込ま れた IIOP です。 SSLServiceProvider オブジ ェ ク ト の イ ン ス タ ン ス を使用 し て、 ク ラ イ ア ン ト か ら サーバへの接続を確立 し ます。 詳細については、 『PowerScript リ フ ァ レ ン ス』 マニ ュ アルお よ び第 25 章 「PowerBuilder ク ラ イ ア ン ト での SSL の使い方」 を参照 し て く だ さ い。 ト ラ ン ザク シ ョ ン サーバ サービ ス EAServer、 MTS、 COM+ な ど の ト ラ ンザ ク シ ョ ン サーバ内で動作す る オブジ ェ ク ト の コ ン テ キ ス ト に関す る 情報にア ク セ ス す る には、 ト ラ ン ザ ク シ ョ ン サーバ サー ビ ス を 使用 し ま す。 TransactionServer オ ブ ジ ェ ク ト を使用すれば、 ト ラ ン ザ ク シ ョ ン の動作を プ ロ グ ラ ム で制御 し た り 、 ト ラ ンザ ク シ ョ ン サーバ上の別の コ ン ポーネ ン ト の メ ソ ッ ド にア ク セ ス し た り す る こ と がで き ます。 詳細については、 第 23 章 「EAServer コ ン ポーネ ン ト の構築」 お よ び 第 26 章 「COM/MTS/COM+ コ ン ポーネ ン ト の構築」 を参照 し て く だ さ い。 456 PowerBuilder 第 6 部 分散ア プ リ ケーシ ョ ンの開発 PowerBuilder で分散ア プ リ ケーシ ョ ン を構築する ための ツール と テ ク ニ ッ ク について説明 し ます。 PowerBuilder Enterprise 版のみ PowerBuilder で使用可能な多層ア プ リ ケーシ ョ ン を構築す る た めのツールは、 Enterprise 版でのみサポー ト し ます。 第 2 2 章 PowerBuilder を使 っ た分散ア プ リ ケーシ ョ ン開発 こ の章について こ の章では PowerBuilder を使っ た分散アプ リ ケーシ ョ ン開発の概 要を示 し ます。 PowerBuilder Enterprise 版のみ 分散アプ リ ケーシ ョ ン開発は、 Enterprise 版でのみサポー ト さ れて い ます。 内容 項目 分散アプ リ ケーシ ョ ンのアーキ テ ク チ ャ サーバのサポー ト ページ 459 460 分散ア プ リ ケーシ ョ ンのアーキテ ク チ ャ 分散アプ リ ケーシ ョ ン開発は、 多階層アプ リ ケーシ ョ ン開発 と も 呼ばれ、 自然な方法でアプ リ ケーシ ョ ン で必要な ビ ジネ ス ロ ジ ッ ク か ら ア プ リ ケーシ ョ ン のユーザ イ ン タ フ ェ ー ス コ ン ポーネ ン ト を分離で き ます。 ビ ジネ ス ロ ジ ッ ク を中間層のサーバに集中す る こ と で、 ク ラ イ ア ン ト の作業負荷を軽減 し 、 機密情報へのア ク セ ス制御を行え ます。 分散アプ リ ケーシ ョ ン では、 ク ラ イ ア ン ト と サーバは、 連携 し て ビ ジ ネ ス ユーザのための タ ス ク を実行 し ま す。 ク ラ イ ア ン ト は、 ユーザ と の対話をすべて処理 し 、 中間層のサーバは ク ラ イ ア ン ト に対 し てバ ッ ク グ ラ ウ ン ド のサービ ス を提供 し ま す。 通常、 中間 層のサーバがほ と ん ど の処理 と デー タ ベー ス ア ク セ ス を 行い ま す。 サーバのサービ ス を呼び出すには、 ク ラ イ ア ン ト は、 サーバ に置かれた コ ン ポーネ ン ト (ま たはオブジ ェ ク ト ) に関連付け ら れてい る メ ソ ッ ド (ま たは関数) を呼び出 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 459 サーバのサポー ト 分割 さ れたア プ リ ケー ション エ ン タ ープ ラ イ ズ ア プ リ ケーシ ョ ン の ク ラ イ ア ン ト サ イ ド の ロ ジ ッ ク は、 ネ ッ ト ワ ー ク の帯域幅を節約で き る よ う にで き る だけ小 さ く 効 率的にす る 必要があ り ます。 こ のためには、 アプ リ ケーシ ョ ン を プ レ ゼン テーシ ョ ン、 ビ ジネ ス ロ ジ ッ ク 、 デー タ ベース ア ク セ ス の 3 つに 分割 し ます。 デー タ ベース は、 エ ン タ ープ ラ イ ズ シ ス テ ムの最下層に あ り 、 組織の資産を保持 し 、 ま たセ キ ュ リ テ ィ 保護 し ます。 ビ ジネ ス ロ ジ ッ ク は、 中間層ま たはサーバに置かれ ます。 プ レ ゼン テーシ ョ ン は、 ユーザのデ ス ク ト ッ プ、 つ ま り 最上位層に配置 さ れ る か、 ユーザ のデス ク ト ッ プに動的にダ ウ ン ロ ー ド さ れ ます。 サーバは、 企業のビ ジネ ス ロ ジ ッ ク の大多数の実行 と セ キ ュ リ テ ィ 保 護を担当 し ます。 こ のため、 サーバは、 ネ ッ ト ワ ー ク 中心のアーキ テ ク チ ャ の重要な コ ン ポーネ ン ト と な り ます。 ク ラ イ ア ン ト は、 ビ ジネ ス ロ ジ ッ ク を実行す る 中間層 コ ン ポーネ ン ト を呼び出 し て、 サーバ と 通信を行い ます。 Web ア プ リ ケーシ ョ ン アーキテ ク チ ャ Web アプ リ ケーシ ョ ンは分散型アーキ テ ク チ ャ の一種で、 ク ラ イ ア ン ト が Web ブ ラ ウ ザで動作 し てい ます。 PowerBuilder には、 シ ン ク ラ イ ア ン ト ソ リ ュ ーシ ョ ン を提供す る Web タ ーゲ ッ ト お よ び Web デー タ ウ ィ ン ド ウ な ど、 Web アプ リ ケーシ ョ ン の構築のためのテ ク ノ ロ ジが 複数用意 さ れてい ます。 アプ リ ケーシ ョ ン のアーキ テ ク チ ャ は、 使用 す る テ ク ノ ロ ジに よ っ て異な り ます。 詳細については、 第 29 章 「PowerBuilder での Web アプ リ ケーシ ョ ン開 発」 を参照 し て く だ さ い。 サーバのサポー ト PowerBuilder の開発者は、 Sybase EAServer お よ び Microsoft Transaction Server (MTS) サーバのサービ ス を呼び出す ク ラ イ ア ン ト を作成 し 、 さ ら に各サーバの内部で ビ ジ ネ ス ロ ジ ッ ク を 実行す る コ ン ポーネ ン ト (ま たはオブジ ェ ク ト ) を作成で き ます。 ま た、 PowerBuilder は、 J2EE 準 拠 の サ ー バ で 動 作 す る Enterprise JavaBeans コ ン ポーネ ン ト (EJB) の ク ラ イ ア ン ト の作成 も サポー ト し てい ます。 EAServer 460 PowerBuilder と EAServer は完全に統合 さ れ ま し た。 PowerBuilder アプ リ ケーシ ョ ンは、 EAServer コ ン ポーネ ン ト の ク ラ イ ア ン ト の役目を果 た し ます。 さ ら に、 EAServer は、 中間層 コ ン ポーネ ン ト と し て動作す る PowerBuilder カ ス タ ム ク ラ ス ユーザ (非ビ ジ ュ アル) オブジ ェ ク ト を持つ こ と がで き ます。 PowerBuilder 第 22 章 PowerBuilder を使 っ た分散ア プ リ ケーシ ョ ン開発 EAServer は、 PowerBuilder 仮想マシ ン のネ イ テ ィ ブのホ ス ト と し て機 能 し ます。 つ ま り 、 EAServer と PowerBuilder 非ビ ジ ュ アル ユーザ オ ブジ ェ ク ト はお互いに直接通信で き ま す。 PowerBuilder で開発 さ れた EAServer コ ン ポーネ ン ト は、 PowerScript の使いやす さ と 柔軟性、 お よ び PowerBuilder のシ ス テ ム オブジ ェ ク ト のパ ワ ーを フルに活用で き ま す。 PowerBuilder で開発 さ れた コ ン ポーネ ン ト は、 ト ラ ン ザ ク シ ョ ン、 相 互運用性、 お よ び イ ン ス タ ン ス プールな ど の機能を活用で き ます。 図 22-1 に示す よ う に、 ど の タ イ プの ク ラ イ ア ン ト で も 、 コ ン ポーネ ン ト の開発に使用 さ れた言語に関係な く 、 EAServer で動作す る すべての タ イ プの コ ン ポーネ ン ト にア ク セ ス で き ます。 図 22-1: ク ラ イ ア ン ト と EAServer 上の コ ンポーネ ン ト 詳細については、 第 23 章 「EAServer コ ン ポーネ ン ト の構築」 お よ び 第 24 章 「EAServer ク ラ イ ア ン ト の構築」 を参照 し て く だ さ い。 Microsoft Transaction Server (MTS) PowerBuilder アプ リ ケーシ ョ ンは、 COM サーバへの ク ラ イ ア ン ト と し て機能で き ます。 こ のサーバは、 PowerBuilder ま たはそのほかの COM 準拠型ア プ リ ケーシ ョ ン開発 ツ ール を 使用 し て作成で き ま す。 ま た、 図 22-2 に示す よ う に、イ ン プ ロ セ ス サーバ と し て リ モー ト コ ン ピ ュ ー タ 上で、ま たは MTS か COM+ で、ロ ーカルに実行す る こ と がで き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 461 サーバのサポー ト 図 22-2: COM コ ンポーネ ン ト の PowerBuilder ク ラ イ ア ン ト ビ ジ ネ ス ロ ジ ッ ク を 含む カ ス タ ム ク ラ ス ユ ーザ オ ブ ジ ェ ク ト を PowerBuilder で開発 し てか ら 、そのオブジ ェ ク ト を COM オブジ ェ ク ト と し てパ ッ ケージす る こ と がで き ま す。 PowerBuilder COM サーバに は、1 つま たは複数の PowerBuilder カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト を組み込む こ と がで き ます。ユーザ オブジ ェ ク ト を ユーザ オブジ ェ ク ト ペ イ ン タ で作成 し てか ら 、プ ロ ジ ェ ク ト ペ イ ン タ でサーバを構築 し ます。COM サーバを ロ ーカルの MTS ま たは COM+ サーバに直接配 布 し た り 、 プ ロ ジ ェ ク ト ペ イ ン タ で MTS ま たは COM+ パ ッ ケージ を 作成 し た り す る こ と も で き ます。 詳細については、 第 26 章 「COM/MTS/COM+ コ ン ポーネ ン ト の構築」 お よ び第 27 章 「COM/MTS/COM+ ク ラ イ ア ン ト の構築」 を参照 し て く だ さ い。 462 PowerBuilder 第 22 章 PowerBuilder を使 っ た分散ア プ リ ケーシ ョ ン開発 J2EE サーバ J2EE (Java 2 Platform, Enterprise Edition) は、 エ ン タ ープ ラ イ ズ アプ リ ケーシ ョ ン開発用の公認 Java フ レ ーム ワ ー ク です。 J2EE アプ リ ケー シ ョ ンは、 多層シ ス テ ム の さ ま ざ ま な コ ン ピ ュ ー タ に イ ン ス ト ール さ れた別々の コ ン ポーネ ン ト で構成 さ れ ます。 図 22-3 に、 こ のシ ス テ ム の 3 つの階層、 ク ラ イ ア ン ト 層、 中間層、 エ ン タ ープ ラ イ ズ情報シ ス テ ム (EIS) 層を示 し ます。 中間層は、 Web 層 と ビ ジネ ス層の 2 つの層 で構成 さ れ る と みな さ れ る こ と も あ り ます。 図 22-3: J2EE ク ラ イ ア ン ト 層、 中間層、 EIS 層 ア プ リ ケーシ ョ ン ク ラ イ ア ン ト やア プ レ ッ ト な ど の ク ラ イ ア ン ト コ ン ポーネ ン ト は、 ク ラ イ ア ン ト 層の コ ン ピ ュ ー タ 上で動作 し ます。Java サーブ レ ッ ト お よ び JavaServer Pages (JSP) コ ン ポーネ ン ト な ど の Web コ ン ポ ー ネ ン ト は、 Web 層の J2EE サーバ で 動作 し ま す。 Enterprise JavaBeans (EJB) コ ン ポーネ ン ト は ビ ジ ネ ス コ ン ポーネ ン ト で あ り 、 ビ ジ ネ ス 層の J2EE サーバで動作 し ま す。 EIS 層は、 リ レ ーシ ョ ナル デー タ ベース管理シ ス テ ム、エ ン タ ープ ラ イ ズ リ ソ ース プ ラ ン ニ ン グ アプ リ ケーシ ョ ン、 メ イ ン フ レーム ト ラ ンザ ク シ ョ ン処理、 そのほか の レ ガシ情報シ ス テ ム を実行す る サーバで構成 さ れます。 PowerBuilder では、任意の J2EE 準拠サーバで動作す る EJB コ ン ポーネ ン ト のサー ビ ス を 使用す る ク ラ イ ア ン ト ア プ リ ケーシ ョ ン を 作成で き ます。 詳細については、 第 28 章 「EJB ク ラ イ ア ン ト の構築」 を参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 463 サーバのサポー ト 464 PowerBuilder 第 2 3 章 EAServer コ ン ポーネ ン ト の構築 こ の章について こ の章では、 PowerBuilder を使用 し て EAServer コ ン ポーネ ン ト を 構築す る 方法について説明 し ます。 内容 項目 EAServer コ ン ポーネ ン ト の構築について 共有 コ ン ポーネ ン ト お よ びサービ ス コ ン ポーネ ン ト の操作 イ ン ス タ ン ス プー リ ン グのサポー ト ト ラ ンザ ク シ ョ ンのサポー ト EAServer コ ン ポーネ ン ト か ら デー タ ベースへのア ク セ ス コ ン ポーネ ン ト イ ン タ フ ェ ース の定義 既存 イ ン タ フ ェース の実装 別のサーバ コ ン ポーネ ン ト の メ ソ ッ ド の呼び出 し コ ン ポーネ ン ト プ ロ パテ ィ へのア ク セ ス コ ン ポーネ ン ト のテ ス ト と デバ ッ グ デー タ の印刷 EAServer への コ ン ポーネ ン ト の配布 ページ 465 469 475 480 486 500 504 506 509 514 519 525 EAServer コ ンポーネ ン ト の構築について PowerBuilder には、 カ ス タ ム ク ラ ス (非ビ ジ ュ アル) ユーザ オブ ジ ェ ク ト を開発 し て、 それ ら を EAServer コ ン ポーネ ン ト と し て配 布す る た め の ツ ー ル が あ り ま す。 こ う し た コ ン ポ ー ネ ン ト を Windows、 Sun Solaris、 Hewlett-Packard HP-UX、 IBM AIX オペレー テ ィ ン グ シ ス テ ム で実行 し て い る EAServer ホ ス ト に配布で き ま す。 525 ページの 「EAServer への コ ン ポーネ ン ト の配布」 を参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 465 EAServer コ ンポーネ ン ト の構築について UNIX の制限 コ ン ポーネ ン ト を UNIX サーバに配布す る こ と を予定 し てい る 場合、 UNIX プ ラ ッ ト フ ォ ーム上では PowerBuilder ラ ン タ イ ム ラ イ ブ ラ リ が グ ラ フ ィ ッ ク 処理や、Windows アプ リ ケーシ ョ ン プ ロ グ ラ ミ ン グ イ ン タ フ ェ ー ス の呼び出 し を サ ポー ト し て い な い こ と に注意 し て く だ さ い。 ウィ ザード の使い方について PowerBuilder には、 EAServer コ ン ポーネ ン ト の開発 と 配布を容易にす る ウ ィ ザー ド がい く つか用意 さ れてい ます。 • 新規のアプ リ ケーシ ョ ン、 新規の カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト 、 お よ び新規のプ ロ ジ ェ ク ト を作成 し ます。 • オブ ジ ェ ク ト ウ ィ ザー ド • プ ロ ジ ェ ク ト ウ ィ ザー ド タ ーゲ ッ ト ウ ィ ザー ド 既存の ア プ リ ケ ー シ ョ ン と 新規の プ ロ ジ ェ ク ト の中に、カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト を新規作成 し ます。 既存の カ ス タ ム ク ラ ス ユーザ オブ ジ ェ ク ト か ら EAServer コ ン ポーネ ン ト を生成す る ためのプ ロ ジ ェ ク ト を作成 し ます。 開発プ ロ セスについて EAServer コ ンポーネ ン ト の作成手順 466 カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト か ら EAServer コ ン ポーネ ン ト を 作成 し て配布す る には、 次の手順で操作を進め ます。 1 EAServer コ ン ポーネ ン ト タ ーゲ ッ ト ウ ィ ザー ド を使用 し て、新規 アプ リ ケーシ ョ ン でユーザ オブジ ェ ク ト を新規作成 し ます。 既存 のアプ リ ケーシ ョ ン で作業 し てい る 場合は、 こ の操作を行 う かわ り に、EAServer コ ン ポーネ ン ト オブジ ェ ク ト ウ ィ ザー ド を使用 し てオブジ ェ ク ト を作成で き ます。 2 ユーザ オブジ ェ ク ト ペ イ ン タ で、生成 さ れたユーザ オブジ ェ ク ト に関数、 イ ベン ト 、 お よ び イ ン ス タ ン ス変数を追加 し ます。 3 オブジ ェ ク ト のテ ス ト と デバ ッ グ を行い ます。 4 オブジ ェ ク ト を EAServer に配布 し ます。 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 PowerBuilder で開発 し た EAServer コ ン ポーネ ン ト のテ ス ト ま たは配布 を 行 う には、 プ ロ ジ ェ ク ト オブ ジ ェ ク ト と プ ロ ジ ェ ク ト を 作成 し ま す。 プ ロ ジ ェ ク ト オブジ ェ ク ト は、 タ ーゲ ッ ト ウ ィ ザー ド 、 オブジ ェ ク ト ウ ィ ザー ド 、 ま たはプ ロ ジ ェ ク ト ウ ィ ザー ド で作成で き ます。 コ ン ポーネ ン ト を配布す る には、 プ ロ ジ ェ ク ト ペ イ ン タ でプ ロ ジ ェ ク ト を開 き 、 必要な場合はプ ロ ジ ェ ク ト の設定を修正 し て、 プ ロ ジ ェ ク ト を 作成 し ま す。 その後、 EAServer コ ン ポーネ ン ト ジ ェ ネ レ ー タ に よ っ て、 コ ン ポーネ ン ト イ ン タ フ ェ ース と PowerBuilder に実装 さ れた その イ ン タ フ ェース が タ ーゲ ッ ト サーバに配布 さ れ ます。 テ ス ト のために、 ラ イ ブ編集を利用 し てユーザ オブジ ェ ク ト ペ イ ン タ か ら 自動的にプ ロ ジ ェ ク ト を作成で き ます。 こ の操作では、 プ ロ ジ ェ ク ト ペ イ ン タ か ら プ ロ ジ ェ ク ト を作成す る 必要はあ り ません。 ユーザ オブジ ェ ク ト ペ イ ン タ で ラ イ ブ編集を有効にす る と 、ユーザ オブジ ェ ク ト を 保存す る たびに EAServer コ ン ポーネ ン ト のプ ロ ジ ェ ク ト が作 成 さ れ ま す。 ラ イ ブ編集についての詳細は、 514 ページの 「 コ ン ポー ネ ン ト のテ ス ト と デバ ッ グ」 を参照 し て く だ さ い。 To-Do リ ス ト EAServer の タ ーゲ ッ ト ウ ィ ザー ド かオブジ ェ ク ト ウ ィ ザー ド を使用 し て新規のユーザ オブジ ェ ク ト を作成す る と 、 オプシ ョ ン で To-Do リ ス ト を作成で き ます。 ウ ィ ザー ド の最終ページにあ る [To-Do リ ス ト の作成] チ ェ ッ ク ボ ッ ク ス を オ ンにす る と 、 ウ ィ ザー ド は To-Do リ ス ト に タ ス ク を追加 し て、 開発の全フ ェ ーズが遂行 さ れ る よ う に開発者 の注意を促 し ます。 EAServer プ ロ フ ァ イ ルの作成 EAServer プ ロ フ ァ イ ルは、 シ ス テ ム レ ジ ス ト リ に保存 さ れてい る 名 前付 き パ ラ メ ー タ セ ッ ト で、 特定の EAServer ホ ス ト への接続を定義 し ます。 ウ ィ ザー ド を使用 し て コ ン ポーネ ン ト を作成す る 前に、 コ ン ポーネ ン ト が配布 さ れ る サーバのプ ロ フ ァ イ ルを作成す る 必要があ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 467 EAServer コ ンポーネ ン ト の構築について EAServer プ ロ フ ァ イ ル ダ イ ア ロ グ ボ ッ ク ス には、定義済みの EAServer プ ロ フ ァ イ ル が一覧表示 さ れ ま す。 こ の ダ イ ア ロ グ ボ ッ ク ス か ら 、 EAServer プ ロ フ ァ イ ルの作成、 編集、 お よ びテ ス ト を実行で き ます。 ❖ EAServer プ ロ フ ァ イルを作成するには 1 パ ワ ーバーの [EAServer プ ロ フ ァ イ ル] ボ タ ン を ク リ ッ ク し ます。 EAServer プ ロ フ ァ イ ル ダ イ ア ロ グ ボ ッ ク ス が表示 さ れ、 定義済み の EAServer プ ロ フ ァ イ ルが一覧表示 さ れます。 2 [追加] を選択 し ます。 EAServer プ ロ フ ァ イ ルの編集 ダ イ ア ロ グ ボ ッ ク ス が表示 さ れ ま す。 3 プ ロ フ ァ イ ル名、 サーバ名、 ポー ト 番号、 ロ グ イ ン名、 お よ びパ ス ワ ー ド (必要な場合) を入力 し ます。 4 (オプシ ョ ン) [テ ス ト ] を選択 し て、 接続の検証を行い ます。 5 [OK] を ク リ ッ ク し て変更内容を保存 し 、 ダ イ ア ロ グ ボ ッ ク ス を 閉 じ ます。 EAServer プ ロ フ ァ イ ル ダ イ ア ロ グ ボ ッ ク ス に、 新規プ ロ フ ァ イ ル 名の リ ス ト が表示 さ れます。 EAServer プ ロ フ ァ イ ルの値は、 HKEY_CURRENT_USER¥Software¥Sybase¥PowerBuilder¥9.0j¥Jagua rServerProfiles の レ ジ ス ト リ に保存 さ れ ます。 468 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 共有コ ン ポーネン ト およ びサービ ス コ ン ポーネン ト の操作 PowerBuilder で EAServer コ ン ポーネ ン ト を作成す る と き には、 標準 コ ン ポーネ ン ト 、 共有 コ ン ポーネ ン ト 、 ま たはサービ ス コ ン ポーネ ン ト の どれを作成す る か を ウ ィ ザー ド で選択で き ます。 共有コ ン ポーネン ト について EAServer によ る プ ロ グ ラ ム変数領域の管理 EAServer アーキ テ ク チ ャ は コ ン ポーネ ン ト 指向です。 各 コ ン ポーネ ン ト は、 それぞれの状態を保持 し てい ま す。 1 つの ク ラ イ ア ン ト がサー バ上で い く つか の PowerBuilder オ ブ ジ ェ ク ト を イ ン ス タ ン ス 化す る と 、 EAServer は、 オブジ ェ ク ト のプ ロ グ ラ ム変数領域を別々に管理 し ます。 EAServer で動作す る 各 PowerBuilder ユーザ オブジ ェ ク ト は、 グ ロ ーバル変数 と 共有変数につい て 独自の コ ピ ー を 保持 し て い ま す。 PowerBuilder オブジ ェ ク ト はそれぞれ共通の状態にはあ り ま せん。 し たが っ て、 PowerBuilder オブ ジ ェ ク ト ど う し は、 メ ソ ッ ド 、 EAServer の共有 コ ン ポーネ ン ト 、 サーバ フ ァ イ ル、 お よ びデー タ ベース を介 し てのみ通信で き ます。 ク ラ イ ア ン ト が状態情報 を 共有で き る よ う に、 EAServer は共有 コ ン ポーネ ン ト を サポー ト し ます。 共有 コ ン ポーネ ン ト を使用すれば、 複 数の ク ラ イ ア ン ト が同 じ コ ン ポーネ ン ト イ ン ス タ ン ス を 共有で き ま す。 PowerBuilder ウ ィ ザー ド で共有 コ ン ポーネ ン ト と し て マー ク す る と 、 Jaguar Manager の コ ン ポーネ ン ト プ ロ パ テ ィ ダ イ ア ロ グ ボ ッ ク ス の [ イ ン ス タ ン ス] ページで コ ン ポーネ ン ト を共有 と し てマー ク し た場合 と 同 じ 結果にな り ます。 EAServer では、 コ ン ポーネ ン ト の 1 つの イ ン ス タ ン ス だけ を イ ン ス タ ン ス化で き ます。 ク ラ イ ア ン ト ( と そ のほかのサーバ コ ン ポーネ ン ト ) は、 共有 コ ン ポーネ ン ト に対 し て、 それがあ たか も 別の種類の コ ン ポーネ ン ト で あ る かの よ う にア ク セ ス し ます。 EAServer 共有 コ ン ポーネ ン ト を使用する 利点 共有 コ ン ポーネ ン ト を使 う と 、 以下の こ と が可能にな り ます。 • ク ラ イ ア ン ト 接続ご と に別々に取 り 出す必要が あ る 共通デー タ に 容易にア ク セ ス で き る よ う にす る • デー タ ベース ア ク セ ス の数を減 ら す こ と に よ っ て、 デー タ ベース サーバを ほかの処理に使用で き る よ う にす る ア プ リ ケーシ ョ ン テ ク ニ ッ ク 469 共有 コ ンポーネ ン ト およびサービ ス コ ンポーネ ン ト の操作 EAServer 共有 コ ン ポーネ ン ト と PowerBuilder 共有オ ブジ ェ ク ト EAServer 共有コ ンポーネント と し て提供する 利点の多く は、PowerBuilder 共有オブジェ ク ト の場合と 同じ です。 EAServer に配布す る PowerBuilder コ ン ポーネ ン ト は、PowerBuilder 共有オブジ ェ ク ト に加え て、EAServer 共有 コ ン ポ ー ネ ン ト に対 し て も ク ラ イ ア ン ト の役目 を 果 た せ ま す。 EAServer 共有 コ ン ポーネ ン ト に対 し ては、 PowerBuilder で実装 さ れて いない ク ラ イ ア ン ト と コ ン ポーネ ン ト か ら ア ク セ ス で き ます。 し か し 、 EAServer は、 PowerBuilder 共有オブジ ェ ク ト を EAServer 共有 コ ン ポーネ ン ト の よ う には扱い ま せん。 し たが っ て、 PowerBuilder 共 有 オ ブ ジ ェ ク ト の 操 作 に 使 用 す る 関 数 (SharedObjectRegister や SharedObjectGet な ど) は、 EAServer 共有 コ ン ポーネ ン ト では動作 し ま せん。 EAServer で動作 し てい る PowerBuilder コ ン ポーネ ン ト 内で こ れ ら の関数を呼び出そ う と し て も 、 その リ ク エ ス ト は失敗 し ます。 サービ ス コ ン ポーネン ト について サ ー ビ ス コ ン ポ ー ネ ン ト は、 EAServer ク ラ イ ア ン ト と そ の ほ か の EAServer コ ン ポーネン ト のバッ ク グ ラ ウ ン ド 処理を 行いま す。EAServer は、 サーバの起動時にサービ ス コ ン ポーネ ン ト を ロ ー ド し ます。 いずれかの PowerBuilder ウ ィ ザー ド で、 コ ン ポーネ ン ト をサービ ス コ ン ポーネ ン ト と し てマー ク し た場合には、 その コ ン ポーネ ン ト は配布 時にサービ ス と し て EAServer に イ ン ス ト ール さ れ ます。 こ れは、 サー バの com.sybase.EAServer.server.services プ ロ パテ ィ を修正 し て、 サーバ のサービ ス リ ス ト に コ ン ポーネ ン ト を追加す る の と 同 じ です。 共有か非共有か サービ ス コ ン ポーネ ン ト を作成す る 場合は、 ウ ィ ザー ド でサービ ス コ ン ポーネ ン ト にマー ク を付け ます。 サービ ス コ ン ポーネ ン ト の複数の イ ン ス タ ン ス を使用 し たい場合は、 プ ロ ジ ェ ク ト ペ イ ン タ で設定を変 更で き ます。 プ ロ ジ ェ ク ト ペ イ ン タ の EAServer コ ン ポーネ ン ト ジ ェ ネ レー タ のプ ロ パテ ィ シー ト にあ る [ コ ン ポーネ ン ト ] ページで、 [作 成] ス ピ ン コ ン ト ロ ールか ら 使用 し たい イ ン ス タ ン ス の数を選択 し ま す。 イ ン ス タ ン ス の数を複数に変更す る と [同時実行] と [自動的な デマ ケーシ ョ ン / 不活性化] がオ ンにな る ので、 注意 し て く だ さ い。 こ れは、 EAServer で コ ン ポーネ ン ト が ス レ ッ ド 実行の問題に遭わない よ う にす る ためです。 詳細については、 次の 「ス レ ッ ド 実行の問題 と コ ン ポーネ ン ト の種類」 を参照 し て く だ さ い。 サービ ス コ ンポーネ ン ト の関数 PowerBuilder ウ ィ ザー ド は、 サービ ス コ ン ポーネ ン ト 用に 3 つの補助 関数を組み込み ま す。 こ れ ら の関数は CTSServices::GenericServices イ ン タ フ ェ ー ス に定義 さ れてお り 、 サービ ス に関連付け ら れてい る バ ッ ク グ ラ ウ ン ド 処理の動作を制御で き ます。 470 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 • Start サー ビ ス コ ン ポーネ ン ト が ロ ー ド さ れ た後、 EAServer は Start 関数を呼び出 し ます。 こ の関数に ロ ジ ッ ク を追加すれば、サー ビ ス起動の初期設定を実行で き ます。 • 最初に呼び出 さ れた Start 関数が戻っ た後、 EAServer は Run 関数を呼び出 し ます。 Run 関数を使 う と 、 反復 タ ス ク をバ ッ ク グ ラ ウ ン ド プ ロ セ ス と し て実行で き ます。 Run 関数は、 その実行を定 期的に一時停止す る ために、 JagSleep C 関数を呼び出 さ な ければ な り ま せん。 JagSleep 関数は、 ほかの タ ス ク を実行で き る よ う に CPU を解放 し ます。 JagSleep 関数を使用す る には、 PowerBuilder で JagSleep の外部関数を宣言 し ま す。 関数の宣言に使用す る 構文を 次に示 し ます。 Run subroutine JagSleep (Long seconds) LIBRARY "libjdispatch.dll" • こ の関数を使 う と 、Run 関数で コ ーデ ィ ン グ さ れたバ ッ ク グ ラ ウ ン ド プ ロ セ ス の実行 も 停止で き ます。 EAServer を再起動す る こ と な く サービ ス を再開で き る よ う に、 Stop、 Start、 お よ び Run を 呼び出すサー ビ ス マ ネージ ャ ク ラ イ ア ン ト を サー ビ ス に実装で き ま す。 Stop 関数の ス ク リ プ ト は、 Start 関数で割 り 当て ら れた リ ソ ース の後処理 も 実行で き ます。 Stop スレ ッ ド 実行の問題と コ ン ポーネン ト の種類 PowerBuilder コ ン ポーネ ン ト の各 イ ン ス タ ン ス は独自のセ ッ シ ョ ン を 実行 し てい る ため、 各セ ッ シ ョ ン では ス レ ッ ド を 1 つ し か実行で き ま せん。 し たが っ て、 PowerBuilder コ ン ポーネ ン ト の イ ン ス タ ン ス の 1 つが、 ク ラ イ ア ン ト の リ ク エ ス ト を同時に複数実行す る こ と は不可能 です。 ただ し 、 同 じ コ ン ポーネ ン ト の複数の イ ン ス タ ン ス は、 それぞ れ別の ク ラ イ ア ン ト の リ ク エ ス ト を実行で き ます。 コ ン ポーネ ン ト を 作成す る と 、 EAServer での ス レ ッ ド の処理方法に影響す る い く つかの プ ロ パテ ィ にデフ ォ ル ト 値が設定 さ れ ます。 Thread Manager の使い方 EAServer Thread Manager では、よ り 堅固なサービ ス の開発 も 可能です。 474 ページの「EAServer Thread Manager の使い方」を参照 し て く だ さ い。 Concurrency プ ロパ ティ コ ン ポーネ ン ト の複数の イ ン ス タ ン ス を作成 し て複数の ク ラ イ ア ン ト の リ ク エ ス ト を処理で き る か ど う かは、Concurrency プ ロ パテ ィ に よ っ て 決 ま り ま す。 com.sybase.jaguar.component.thread.safe プ ロ パ テ ィ を TRUE に設定す る には、 ウ ィ ザー ド かプ ロ ジ ェ ク ト ペ イ ン タ で [同時 実行] チ ェ ッ ク ボ ッ ク ス を オ ンに し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 471 共有 コ ンポーネ ン ト およびサービ ス コ ンポーネ ン ト の操作 標準 コ ン ポーネ ン ト では、 コ ン ポーネ ン ト の複数 の イ ン ス タ ン ス で ク ラ イ ア ン ト の リ ク エ ス ト を 処理す る こ と に よ っ て、 パ フ ォ ーマ ン ス を向上で き ます。 デフ ォ ル ト 設定では、 標準 コ ン ポーネ ン ト の Concurrency プ ロ パテ ィ がチ ェ ッ ク さ れ ま すが、 その コ ン ポーネ ン ト の イ ン ス タ ン ス を 1 つ し か使用 し ない場合は、 設定を変 更す る こ と も 可能です。 標準 コ ンポーネ ン ト 共有 コ ン ポーネ ン ト の場合、 コ ン ポーネ ン ト の イ ン ス タ ン ス は常に 1 つ し かア ク テ ィ ブにな り ません。 し たがっ て、 ス レ ッ ド は 1 つ し か実行で き ません。 共有 コ ン ポーネ ン ト の [同時実行] チ ェ ッ ク ボ ッ ク ス は選択不可能で、 オ ン にはな り ません。 共有 コ ンポーネ ン ト 通常は、 サービ ス コ ン ポーネ ン ト は共有 コ ン ポーネ ン ト と し て処理 さ れ ますが、 サービ ス コ ン ポーネ ン ト の イ ン ス タ ン ス を複数作成 し て、 パ フ ォ ーマ ン ス と ス ケー ラ ビ リ テ ィ を向上 さ せ る こ と も 可能です。 サービ ス コ ン ポーネ ン ト の [ コ ン ポーネ ン ト ] ページには、 [同時実行]、 [自動的なデマ ケーシ ョ ン / 不活性化]、 お よ び [作成] の 3 つのオプシ ョ ン があ り 、 [作成] オプシ ョ ンはサービ ス コ ン ポーネ ン ト でのみ変更で き ます。 サービ ス コ ンポーネ ン ト [作成] オプシ ョ ン を 2 以上に変更す る と 、 [同時実行] チ ェ ッ ク ボ ッ ク ス と [自動的なデマ ケーシ ョ ン / 不活性化] チ ェ ッ ク ボ ッ ク ス がオ ンにな り ます。 必要であれば、 サービ ス コ ン ポーネ ン ト の複数の イ ン ス タ ン ス を作成 し 、 各 メ ソ ッ ド の呼び出 し 後、 それ ら の イ ン ス タ ン ス を非ア ク テ ィ ブにで き ます。 開発者が コ ン ポーネ ン ト の イ ン ス タ ン ス を明示的に非ア ク テ ィ ブにす る ために [自動的なデマケーシ ョ ン / 不 活性化] チ ェ ッ ク ボ ッ ク ス を オ フ にす る と 、 [作成] ス ピ ン コ ン ト ロ ー ルは 1 に リ セ ッ ト さ れ、 [同時実行] チ ェ ッ ク ボ ッ ク ス がオ フ にな り ま す。 bind.thread、 sharing、 および tx_vote プ ロパ ティ EAServer の ス レ ッ ド の処理に影響す る コ ン ポーネ ン ト プ ロ パテ ィ に は、 ほかに sharing、 tx_vote、 お よ び bind.thread の 3 つがあ り ます。 Bind Object プ ロパテ ィ (未使用) 付加的なプ ロ パテ ィ であ る bind.object を使 う と 、 ク ラ イ ア ン ト ス レ ッ ド を 1 つの イ ン ス タ ン ス内で実行で き る だけでな く 、 複数 イ ン ス タ ン ス の作成 も サポー ト さ れ ま す。 こ のプ ロ パテ ィ は、 PowerBuilder コ ン ポーネ ン ト 用には使用で き ないため、 常に FALSE に設定 さ れ ます。 472 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 bind.thread プ ロ パテ ィ が TRUE に設定 さ れてい る と き は、コ ン ポーネ ン ト イ ン ス タ ン ス の メ ソ ッ ド は、 その イ ン ス タ ン ス を作成 し た ス レ ッ ド と 同 じ ス レ ッ ド で実行 さ れな ければな り ません。 ラ イ ブ編集を使用 し て コ ン ポーネ ン ト を作成 し てい る 場合は、 こ のプ ロ パテ ィ を TRUE に 設定 し な ければな り ま せん。 UNIX サーバに配布 さ れ る コ ン ポーネ ン ト では、 ス ケ ー ラ ビ リ テ ィ を 向上 さ せ る た め に、 こ のプ ロ パ テ ィ を FALSE に設定す る 必要があ り ます。 sharing プ ロ パテ ィ では、 コ ン ポーネ ン ト を共有す る か ど う か を識別 し ま す。 こ の プ ロ パ テ ィ は、 ウ ィ ザー ド で [標準] を 選択 し た と き は FALSE、 [共有] ま たは [サービ ス] を選択 し た と き には TRUE に設定 さ れ ま す。 PowerBuilder で こ のプ ロ パテ ィ を変更す る には、 プ ロ ジ ェ ク ト ペ イ ン タ で、 サービ ス コ ン ポーネ ン ト の [ コ ン ポーネ ン ト ] タ ブ ページにあ る [ イ ン ス タ ン ス] 設定を変更す る 以外、 方法はあ り ませ ん。 sharing プ ロ パテ ィ か thread.safe プ ロ パテ ィ の一方が TRUE に設定 さ れてい る 場合は、 も う 一方のプ ロ パテ ィ を FALSE に設定 し なければ な り ません。 連続す る メ ソ ッ ド 呼び出 し の間、 ア ク テ ィ ブな ま ま保たれ る コ ン ポー ネ ン ト の こ と を、 ス テー ト フル (状態を持つ) コ ン ポーネ ン ト と 呼び ます。 イ ン ス タ ン ス プー リ ン グ を サポー ト し ていて メ ソ ッ ド 呼び出 し 後に非ア ク テ ィ ブにな る コ ン ポーネ ン ト の こ と を、 ス テー ト レ ス (状 態を持たない) コ ン ポーネ ン ト と 呼びます。 一般に、 ス テー ト レ ス コ ン ポーネ ン ト で作成 さ れた アプ リ ケーシ ョ ン の方が、 高い ス ケー ラ ビ リ テ ィ を実現で き ます。 コ ン ポーネ ン ト が メ ソ ッ ド 呼び出 し 後に非ア ク テ ィ ブにな る か ど う かは、 tx_vote プ ロ パテ ィ に よ っ て決 ま り ま す。 こ のプ ロ パテ ィ が FALSE (ス テー ト レ ス) に設定 さ れ る のは、 ウ ィ ザー ド の [自動的なデマ ケーシ ョ ン / 不活性化] チ ェ ッ ク ボ ッ ク ス を オ ン に し た場合ま たはプ ロ ジ ェ ク ト ペ イ ン タ の [ コ ン ポーネ ン ト ] ページ で複数の イ ン ス タ ン ス を選択 し た場合です。 それ以外の場合、 こ のプ ロ パテ ィ は TRUE (ス テー ト フル) に設定 さ れます。 ス テー ト フル サー ビ ス オブジ ェ ク ト の イ ン ス タ ン ス は、 1 つ し か所有で き ません。 表 23-1 に、 コ ン ポーネ ン ト の種類に よ る デフ ォ ル ト 設定 と 変更で き る 設定を示 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 473 共有 コ ンポーネ ン ト およびサービ ス コ ンポーネ ン ト の操作 表 23-1: ス レ ッ ド 処理プ ロパテ ィ コ ンポーネ ント 標準 共有 サービ ス (単 一インス タ ン ス) サービ ス (複 数インス タ ン ス) bind.thread sharing thread.safe tx_vote FALSE、 変更可 FALSE、変更 FALSE、変更 TRUE、 変更 可 不可 可 FALSE、変更 TRUE、 変更 FALSE、変更 可 不可 不可 FALSE、 変更可 FALSE、変更 TRUE、 変更 FALSE、変更 可 不可 可 FALSE、変更 FALSE、変更 TRUE、 変更 FALSE、 変更可 可 不可 可 TRUE に 変 更 し FALSE、 変更可 た 場 合、 イ ン ス タ ン ス数は 1 に、 sharing は TRUE に、 thread.safe は FALSE に 設定 さ れる bind.thread、 thread.safe、 お よ び sharing が TRUE に設定 さ れてい る サー ビ ス コ ン ポーネ ン ト を 配布す る 場合は、 実行時に thread.safe プ ロ パ テ ィ が自動的に無効化 さ れ ます。 EAServer Thread Manager の使い方 Thread Manager は組み込みの EAServer コ ン ポーネ ン ト で、EAServer コ ン ポーネ ン ト の イ ン ス タ ン ス を、 ク ラ イ ア ン ト の メ ソ ッ ド 呼び出 し が 独立 し て行われ る ス レ ッ ド 内で実行で き ます。 Thread Manager に よ っ て生成 さ れた ス レ ッ ド を使用 し て、 ユーザ と の対話 と 非同期に発生す る 処理を実行で き ます。 た と えば、 フ ァ イ ルの イ ンデ ッ ク ス 作成 と い う 長い操作を開始す る コ ン ポーネ ン ト メ ソ ッ ド があ る と し ます。 こ の場合、 メ ソ ッ ド を使えば、 Thread Manager を呼び出 し て新 し い ス レ ッ ド で処理を開始 し 、 即座に 復帰で き ます。 474 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 PowerBuilder コ ン ポーネ ン ト の各 イ ン ス タ ン ス は独自のセ ッ シ ョ ン を 実行 し 、 それぞれのセ ッ シ ョ ンは実行の ス レ ッ ド を 1 つ し かサポー ト し ないため、 Thread Manager を使用せずに停止や更新がで き る サービ ス を開発す る のは不可能です。 サービ ス の start メ ソ ッ ド と run メ ソ ッ ド は、 サービ ス の処理を行 う ス レ ッ ド を生成 し ます。 サービ ス の stop メ ソ ッ ド は、 Thread Manager の stop メ ソ ッ ド を呼び出 し て、 ス レ ッ ド を停止 し ます。 Thread Manager につい ての詳細は、 『EAServer プ ロ グ ラ マーズ ・ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 イ ン ス タ ン ス プー リ ングのサポー ト イ ン ス タ ン ス プー リ ングの利点 EAServer コ ン ポーネ ン ト は、オプシ ョ ン で イ ン ス タ ン ス プー リ ン グ を サポー ト で き ます。 イ ン ス タ ン ス プー リ ン グ を利用す る と 、 EAServer ク ラ イ ア ン ト は コ ン ポーネ ン ト イ ン ス タ ン ス を再利用で き ます。 イ ン ス タ ン ス プー リ ン グは、 コ ン ポーネ ン ト イ ン ス タ ン ス を繰 り 返 し 割 り 当て る こ と に よ り 生 じ る リ ソ ース の枯渇を解消 し 、 EAServer の全体的 なパフ ォーマ ン ス を改善 し ます。 ウ ィ ザー ド でのプー リ ング オプ シ ョ ンの指 定 いずれかの PowerBuilder ウ ィ ザー ド を使用 し て EAServer コ ン ポーネ ン ト を作成 し た場合には、 コ ン ポーネ ン ト に対 し て表 23-2 に示すいず れかの イ ン ス タ ン ス プー リ ン グ オプシ ョ ン を指定で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 475 イ ン ス タ ン ス プー リ ン グのサポー ト 表 23-2: EAServer コ ンポーネ ン ト プー リ ン グ オプ シ ョ ン プー リ ング オプ ション [サポー ト す る ] [サポー ト な し ] 説明 ク ラ イ ア ン ト 使用のたびに必ず コ ン ポーネ ン ト のプー リ ン グ を実行 し ま す。 こ のオプシ ョ ン が選択 さ れた場合に は、 コ ン ポーネ ン ト に対 し て CanBePooled イ ベン ト は発 生 し ません。 こ のオプシ ョ ン を オ ン にす る と 、 コ ン ポーネ ン ト のプー リ ン グ プ ロ パテ ィ が TRUE に設定 さ れます。 コ ン ポーネ ン ト の [自動的なデマケーシ ョ ン / 不活性化] 設定が有効 であ る 場合には、 メ ソ ッ ド 呼び出 し のたびに イ ン ス タ ン ス がプール さ れます。 [自動的なデマケーシ ョ ン / 不活性 化] 設 定 が 無 効 で あ る 場 合 に は、 コ ン ポ ー ネ ン ト が TransactionServer コ ンテキス ト オブジェ ク ト の SetComplete メ ソ ッ ド か SetAbort メ ソ ッ ド を呼び出 し た と き に、 イ ン ス タ ン ス がプール さ れます。 デフ ォ ル ト では、 ク ラ イ ア ン ト 使用後に コ ン ポーネ ン ト プー リ ン グは実行 さ れません。 ただ し 、 CanBePooled イ ベ ン ト の ス ク リ プ ト を作成 し てデフ ォ ル ト 動作を無効にす る こ と も 可能です。 CanBePooled イ ベン ト では、 特定の コ ン ポーネ ン ト イ ン ス タ ン ス を プールする か ど う か をプ ロ グ ラ ムで指定で き ます。CanBePooled イ ベン ト の ス ク リ プ ト を作成 し た場合には、 こ の イ ベン ト は ク ラ イ ア ン ト 使 用のたびに発生 し ます。 こ のオプシ ョ ン を オ ン にす る と 、 コ ン ポーネ ン ト のプー リ ン グ プ ロ パテ ィ が FALSE に設定 さ れます。 プール さ れた イ ン ス タ ン スの状態の制御 イ ン ス タ ン ス プー リ ン グ を サポー ト す る EAServer コ ン ポーネ ン ト を 作成 し た場合には、 各 ク ラ イ ア ン ト がプール さ れた イ ン ス タ ン ス の使 用を終了 し た後で、 その コ ン ポーネ ン ト の状態を リ セ ッ ト し な ければ な ら ない こ と があ り ます。 コ ン ポーネ ン ト の状態を制御で き る よ う に、 コ ン ポーネ ン ト の有効期 間中に、 EAServer は 表 23-3 に示す イ ベン ト を 1 つま たは複数発生 さ せます。 表 23-3: コ ンポーネ ン ト の状態イ ベン ト イ ベン ト Activate CanBePooled Deactivate 476 PBM コ ー ド PBM_COMPONENT_ACTIVATE PBM_COMPONENT_CANBEPOOLED PBM_COMPONENT_DEACTIVATE PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 コ ン ポーネ ン ト のプー リ ン グ オプ シ ョ ン を [サ ポー ト す る ] に設定 (プー リ ン グ プ ロ パテ ィ を TRUE に設定) し た場合には、 Activate イ ベ ン ト と Deactivate イ ベン ト の ス ク リ プ ト を作成 し て、 プール さ れた コ ン ポーネ ン ト の状態を リ セ ッ ト す る 必要があ り ます。 コ ン ポーネ ン ト が イ ン ス タ ン ス 変数、 共有変数、 ま たはグ ロ ーバル変数の状態を保持 す る 場合には、 こ の操作が必要です。 コ ン ポーネ ン ト のプー リ ン グ オプシ ョ ン を [サポー ト し ない] に設定 (プー リ ン グ プ ロ パテ ィ を FALSE に設定) し た場合には、 CanBePooled イ ベン ト の ス ク リ プ ト を作成 し て、 特定の コ ン ポーネ ン ト イ ン ス タ ン ス を プールす る か ど う か を指定で き ま す。 CanBePooled イ ベン ト の ス ク リ プ ト を作成 し た場合には、Activate イ ベン ト と Deactivate イ ベン ト の ス ク リ プ ト も 作成 し て、 プール さ れ た コ ン ポーネ ン ト の状態 を リ セ ッ ト す る 必要があ り ま す。 CanBePooled イ ベン ト の ス ク リ プ ト を作 成 し な い場合には、 コ ン ポーネ ン ト イ ン ス タ ン ス はプール さ れ ま せ ん。 EAServer コ ン ポーネ ン ト の タ ーゲ ッ ト ウ ィ ザー ド と オ ブ ジ ェ ク ト ウ ィ ザー ド は、EAServer コ ン ポーネ ン ト と し て配布 さ れ る カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト に、 Activate イ ベン ト と Deactivate イ ベン ト を自動的に組み込み ま す。 CanBePooled イ ベン ト の ス ク リ プ ト を作成 し たい場合は、 こ の イ ベン ト を自分で追加す る 必要があ り ます。 その 場合には、 イ ベン ト を正 し い PBM コ ー ド にマ ッ プ し て く だ さ い。 Constructor と Destructor は 1 回起動 さ れます イ ン ス タ ン ス プー リ ン グが有効であ る 場合には、 Constructor イ ベン ト と Destructor イ ベン ト は、 コ ン ポーネ ン ト に対 し て 1 回だけ起動 さ れ ま す。 Constructor イ ベン ト と Destructor イ ベン ト は、 新 し い ク ラ イ ア ン ト が コ ン ポーネ ン ト イ ン ス タ ン ス を 使用す る たびに起動 さ れ る の ではあ り ません。 し たが っ て、 プール さ れ る コ ン ポーネ ン ト イ ン ス タ ン ス の状態を リ セ ッ ト す る には、 Constructor イ ベン ト と Destructor イ ベン ト ではな く 、Activate イ ベン ト と Deactivate イ ベン ト に ロ ジ ッ ク を 追加 し ます。 プール サイ ズの最大 値 と 最小値 イ ン ス タ ン ス プー リ ン グ に よ っ て ク ラ イ ア ン ト 応答時間 を 短縮で き ま すが、 サーバ の メ モ リ 使用量が増加す る こ と も あ り ま す。 Jaguar Manager の [ リ ソ ース] タ ブ ページのオプシ ョ ン を設定 し て、 プール サ イ ズの最大値 と 最小値を設定 し 、 イ ン ス タ ン ス プールを維持す る た めの メ モ リ 量を制限で き ます。 た と えば、 頻繁に使用す る コ ン ポーネ ン ト のプール サ イ ズ の最大値 と 最小値は、 あ ま り 使用 さ れな い コ ン ポーネ ン ト よ り 大 き く す る 必要があ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 477 イ ン ス タ ン ス プー リ ン グのサポー ト EAServer は、プールにあ ら か じ め イ ン ス タ ン ス を割 り 当て ません。プー ル サ イ ズは、 ク ラ イ ア ン ト リ ク エ ス ト を満たすための追加 イ ン ス タ ン ス が必要にな る につれて、 指定 さ れた最大サ イ ズ (最大値が指定 さ れ てい る 場合) ま で増加 し ます。 最小プール サ イ ズに到達す る と 、 最小 サ イ ズ以下には縮小 さ れ ません。 プールか ら 休止中の イ ン ス タ ン ス を 解放す る ため、EAServer には定期的に実行 さ れ る ガベージ コ レ ク タ ス レ ッ ド があ り ます。 こ の ス レ ッ ド が実行 さ れ る たびに、 ガベージ コ レ ク タ は、 休止中の イ ン ス タ ン ス を 1 つプールか ら 削除 し ます。 ただ し 、 プールが最小サ イ ズに到達 し た と き は削除 さ れ ません。 プールサ イ ズの最小値を設定す る 場合は、 最大値はそれ よ り 少 し 大 き めに設定 し ます。 最大値 と 最小値の差分があ る と 、 実際のプール サ イ ズが最小値に近づいた場合に、 減衰率のために イ ン ス タ ン ス の割 り 当 て と 解除を繰返 し 行わずに済みます。 コ ンポーネ ン ト の有効 期間 478 イ ン ス タ ン ス プー リ ン グの仕組みを理解す る には、 コ ン ポーネ ン ト イ ン ス タ ン ス の有効期間 ( ラ イ フ サ イ ク ル) を理解す る 必要があ り ます。 コ ン ポーネ ン ト の有効期間中の動作を以下に示 し ます。 1 一般に、 コ ン ポーネ ン ト は最初の メ ソ ッ ド 呼び出 し で イ ン ス タ ン ス化 さ れ ます。PowerBuilder で開発 さ れた コ ン ポーネ ン ト が こ の イ ン ス タ ン ス 化の対象 と な っ た場合、 コ ン ポーネ ン ト が動作す る た めの新 し い PowerBuilder セ ッ シ ョ ンが EAServer に よ り 作成 さ れま す。 2 PowerBuilder セ ッ シ ョ ン では、 EAServer コ ン ポーネ ン ト を表す、 PowerBuilder 非ビ ジ ュ アル オブジ ェ ク ト の イ ン ス タ ン ス を作成 し ます。 オブジ ェ ク ト を作成す る と 、 Constructor イ ベン ト が発生 し ます。 3 オブジ ェ ク ト が イ ン ス タ ン ス化 さ れた後、 EAServer は非ビ ジ ュ ア ル オブジ ェ ク ト 上で Activate イ ベン ト を発生 さ せ、 オブジ ェ ク ト が新 し い ク ラ イ ア ン ト に よ っ て使用 さ れ る こ と を オブジ ェ ク ト に 通知 し ま す。 こ の時点で、 コ ン ポーネ ン ト は、 自分自身が実行可 能な状態であ る こ と を確認 し なければな り ません。 4 次に、 EAServer は コ ン ポーネ ン ト 上の ク ラ イ ア ン ト に よ っ て呼び 出 さ れた メ ソ ッ ド を実行 し ます。 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 5 コ ン ポ ー ネ ン ト が そ の 作 業 の 完 了 を 知 ら せ る と 、 EAServer は Deactivate イ ベン ト を発生 さ せて、コ ン ポーネ ン ト がその後処理を 行え る よ う に し ま す。 コ ン ポーネ ン ト の [自動的なデマ ケーシ ョ ン / 不活性化] 設定が有効であ る 場合には、 各 メ ソ ッ ド 呼び出 し の 後で、 Deactivate イ ベン ト が自動的に発生 し ます。 設定が無効であ る 場合には、 コ ン ポーネ ン ト が TransactionServer コ ン テ キ ス ト オ ブジ ェ ク ト の SetComplete メ ソ ッ ド か SetAbort メ ソ ッ ド を呼び出 し た と き に、 Deactivate イ ベン ト を発生 さ せます。 6 プー リ ン グ オプシ ョ ン で [サポー ト し ない] を選択す る か、 コ ン ポーネ ン ト の イ ン ス タ ン ス プー リ ン グ プ ロ パテ ィ を FALSE に設 定 し 、 CanBePooled イ ベ ン ト の ス ク リ プ ト も 作成 し た場合には、 EAServer は、 こ の イ ベン ト を発生 さ せ る こ と に よ っ て、 こ の時点 で プ ー リ ン グ で き る か ど う か を コ ン ポ ー ネ ン ト に た ずね ま す。 CanBePooled イ ベン ト を発生さ せる と 、 コ ンポーネン ト イ ン ス タ ン スは、プー リ ン グ を選択的に実行する か拒否で き ます。CanBePooled イ ベン ト の戻 り 値は、 コ ン ポーネ ン ト イ ン ス タ ン ス がプール さ れ る か ど う か を決定 し ます。 戻 り 値が 1 で あ る 場合には、 プー リ ン グ が有効です。 戻 り 値が 0 であ る 場合には、 プー リ ン グが無効です。 CanBePooled イ ベン ト の ス ク リ プ ト が作成 さ れていない場合、 デフ ォ ル ト では、 イ ン ス タ ン ス はプール さ れ ません。 プー リ ング プ ロパテ ィ が有効である場合の動作 プー リ ン グ オプシ ョ ンで [サポー ト す る ] を選択し た場合、 ま たは コ ン ポーネ ン ト のプー リ ン グ プ ロ パテ ィ を TRUE に設定 し た場合 は、 コ ンポーネン ト イ ン ス タ ン スは常にプール さ れ、 CanBePooled イ ベン ト は発生 し ません。 7 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 非ア ク テ ィ ブ化の後で イ ン ス タ ン ス がプール さ れな い場合には、 EAServer は Destructor イ ベン ト を発生さ せます。次に、PowerBuilder オブジ ェ ク ト を破棄 し 、 実行時セ ッ シ ョ ン を終了 さ せます。 479 ト ラ ンザ ク シ ョ ンのサポー ト ト ラ ンザ ク シ ョ ンのサポー ト EAServer の ト ラ ンザ ク シ ョ ン サポー ト の 利点 PowerBuilder で開発す る EAServer コ ン ポーネ ン ト は、EAServer ト ラ ン ザ ク シ ョ ンに関与で き ます。 EAServer ト ラ ンザ ク シ ョ ンは、 その境界 と 結果が EAServer に よ っ て決定 さ れ る ト ラ ン ザ ク シ ョ ン です。 コ ン ポーネ ン ト にマー ク を付け る こ と に よ っ て、 ト ラ ンザ ク シ ョ ン サポー ト を提供す る コ ン ポーネ ン ト を判別で き ます。 コ ン ポーネ ン ト が ト ラ ンザ ク シ ョ ン サポー ト を提供す る 場合には、 EAServer は、 コ ン ポーネ ン ト のデー タ ベー ス 操作が ト ラ ンザ ク シ ョ ン の一部 と し て実行 さ れ る こ と を保証 し ます。 1 つの EAServer ト ラ ン ザ ク シ ョ ン に複数の EAServer コ ン ポーネ ン ト が関与で き ます。 EAServer では、 関与す る コ ン ポーネ ン ト に よ る デー タ ベース 変更内容すべての コ ミ ッ ト ま たは ロ ールバ ッ ク が確実に完了 し ます。 EAServer ト ラ ンザ ク シ ョ ン を使用す る コ ン ポーネ ン ト を定義 すれば、 ト ラ ンザ ク シ ョ ン に関与す る コ ン ポーネ ン ト に よ っ て実行 さ れ る すべての作業は意図 し た と お り に行われ る こ と を保証で き ます。 コ ンポーネ ン ト によ る ト ラ ンザ ク シ ョ ン サ ポー ト の指示 各 EAServer コ ン ポーネ ン ト には、 コ ン ポーネ ン ト が EAServer ト ラ ン ザ ク シ ョ ン に ど う 関与す る か を指示す る ト ラ ン ザ ク シ ョ ン属性があ り ま す。 PowerBuilder で EAServer コ ン ポーネ ン ト を開発す る 場合には、 ウ ィ ザー ド で ト ラ ンザ ク シ ョ ン属性を指定で き ます。 表 23-4 に、 オプ シ ョ ン を示 し ます。 表 23-4: ト ラ ンザク シ ョ ン属性オプ シ ョ ン ト ラ ンザ ク シ ョ ンの 種類 [サポー ト さ れてい ません] [ ト ラ ンザ ク シ ョ ン をサポー ト ] 480 説明 コ ン ポーネ ン ト は ト ラ ンザ ク シ ョ ン の一部 と し て実 行 さ れない。 コ ン ポーネ ン ト が、 ト ラ ン ザ ク シ ョ ン 内部で実行中の別の コ ン ポー ネ ン ト に よ っ て ア ク テ ィ ブに さ れた場合には、 その新 し い イ ン ス タ ン ス の作業は既存の ト ラ ンザ ク シ ョ ンの外部で行われ る コ ン ポーネ ン ト は EAServer ト ラ ン ザ ク シ ョ ン の コ ン テ キ ス ト 内で実行で き る が、 コ ン ポーネ ン ト の メ ソ ッ ド を実行す る ために ト ラ ン ザ ク シ ョ ンは必要 と し ない。 コ ン ポーネ ン ト が ク ラ イ ア ン ト に よ っ て直 接 イ ン ス タ ン ス化 さ れた場合、 EAServer は ト ラ ンザ ク シ ョ ン を 開始 し な い。 コ ン ポーネ ン ト A が コ ン ポーネ ン ト B に よ っ て イ ン ス タ ン ス 化 さ れてい て、 コ ン ポーネ ン ト B は ト ラ ンザ ク シ ョ ン内部で実行 さ れてい る 場合には、 コ ン ポーネ ン ト A は同 じ ト ラ ン ザ ク シ ョ ン内で実行 さ れ る PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 ト ラ ンザ ク シ ョ ンの 種類 [ ト ラ ンザ ク シ ョ ン が必要] [新規の ト ラ ンザ ク シ ョ ンが必要] [Mandatory] [OTS ス タ イ ル] [Never] ト ラ ンザク シ ョ ン サービ ス コ ン テキス ト オブ ジ ェ ク ト の使 い方 説明 コ ン ポーネ ン ト は常に ト ラ ン ザ ク シ ョ ン で実行 さ れ る 。 コ ン ポーネ ン ト が ク ラ イ ア ン ト に よ っ て直接 イ ン ス タ ン ス 化 さ れ た 場合に は、 新 し い ト ラ ン ザ ク シ ョ ンが始ま る 。 コ ン ポーネ ン ト A が コ ン ポーネ ン ト B に よ っ て ア ク テ ィ ブ化 さ れ、 B は ト ラ ン ザ ク シ ョ ン内で実行 さ れてい る 場合には、 A は同 じ ト ラ ン ザ ク シ ョ ン内で実行 さ れ る 。 B が ト ラ ン ザ ク シ ョ ン内で実行 さ れていない場合には、 A は新 し い ト ラ ンザ ク シ ョ ン内で実行 さ れ る コ ン ポーネ ン ト が イ ン ス タ ン ス 化 さ れ る たびに、 新 し い ト ラ ンザ ク シ ョ ン が始 ま る 。 コ ン ポーネ ン ト A が コ ン ポーネ ン ト B に よ っ て ア ク テ ィ ブに さ れ、 B が ト ラ ン ザ ク シ ョ ン 内部で実行 さ れ て い る 場合に は、 A は B の ト ラ ンザ ク シ ョ ンの結果に影響 さ れな い新 し い ト ラ ン ザ ク シ ョ ン を開始す る 。 B が ト ラ ン ザ ク シ ョ ン内で実行 さ れていない場合には、 A は新 し い ト ラ ンザ ク シ ョ ン内で実行 さ れ る メ ソ ッ ド は、 実行中の ト ラ ン ザ ク シ ョ ン があ る ク ラ イ ア ン ト に よ っ てのみ呼び出 さ れ る 。 実行中の ト ラ ン ザ ク シ ョ ン がない と き に こ の コ ン ポーネ ン ト を呼 び出す と 、 実行時エ ラ ーにな る コ ン ポーネ ン ト は ト ラ ン ザ ク シ ョ ン を管理で き 、 ま た ク ラ イ ア ン ト の ト ラ ン ザ ク シ ョ ン を 継承で き る 。 ト ラ ン ザ ク シ ョ ン な し で呼び出 さ れ た 場合、 コ ン ポーネ ン ト は、 CORBACurrent コ ン テ キ ス ト サービ ス オブジ ェ ク ト の イ ン ス タ ン ス を使用 し て、 ト ラ ン ザ ク シ ョ ン の開始、 コ ミ ッ ト 、 お よ び ロ ールバ ッ ク を行 う 未処理の ト ラ ン ザ ク シ ョ ン があ る 場合、 メ ソ ッ ド の 呼び出 し は不可能。 実行中の ト ラ ン ザ ク シ ョ ン があ る と き に こ の コ ン ポーネ ン ト を呼び出す と 、 実行時 エ ラ ーにな る コ ン ポーネ ン ト メ ソ ッ ド を使 う と 、EAServer の ト ラ ンザ ク シ ョ ン状態 プ リ ミ テ ィ ブ を呼び出 し て、 EAServer が現行の ト ラ ンザ ク シ ョ ン を コ ミ ッ ト す る か中断す る か を制御で き ます。 EAServer の ト ラ ンザ ク シ ョ ン 状態プ リ ミ テ ィ ブに ア ク セ ス で き る よ う にす る た め、 PowerBuilder は TransactionServer と い う ト ラ ンザ ク シ ョ ン サービ ス コ ン テ キ ス ト オブジ ェ ク ト を提供 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 481 ト ラ ンザ ク シ ョ ンのサポー ト TransactionServer コ ン テ キ ス ト オ ブ ジ ェ ク ト を 使 用 す る に は、 UseContextObject DBParm パ ラ メ ー タ を Yes に設定す る 必要があ り ま す。 こ れに よ っ て、 COMMIT と ROLLBACK のかわ り に TransactionServer オブジ ェ ク ト の メ ソ ッ ド を使用 し て、 コ ン ポーネ ン ト が現行の ト ラ ン ザ ク シ ョ ンの作業を完了 し たか ど う か を示す こ と を PowerBuilder に指 示 し ます。 ト ラ ンザ ク シ ョ ン コ ン テ キ ス ト サービ ス を使用す る には、 TransactionServer 型の変数を宣言 し 、 GetContextService 関数を呼び出 し てか ら 、 ト ラ ン ザク ショ ン コ ン テキ ス ト サービ ス のイ ン ス タ ン ス を 作 成 し ます。 コ ン ポーネ ン ト の Activat イ ベ ン ト か Constructor イ ベン ト 発生時 は、 GetContextService を呼び出 し て TransactionServer サービ ス を イ ン ス タ ン ス化で き ます。 例 // イ ン ス タ ン ス変数 : // TransactionServer ts Integer li_rc li_rc = this.GetContextService("TransactionServer", & ts) IF li_rc <> 1 THEN // エ ラ ー処理 END IF いずれかの コ ン ポーネ ン ト メ ソ ッ ド では、 デー タ ベー ス を更新 し て、 更新に成功 し た場合には SetComplete を 呼び出 し 、 失敗 し た場合には SetAbort を呼び出せます。 // イ ン ス タ ン ス変数 : // DataStore ids_datastore long ll_rv ... ... ll_rv = ids_datastore.Update() IF ll_rv = 1 THEN ts.SetComplete() ELSE ts.SetAbort() END IF TransactionServer イ ン タ フ ェース が提供す る 表 23-5 の メ ソ ッ ド を使用 すれば、EAServer の ト ラ ンザ ク シ ョ ン プ リ ミ テ ィ ブにア ク セ ス で き ま す。 482 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 表 23-5: TransactionServer メ ソ ッ ド メソッド DisableCommit EnableCommit IsInTransaction IsTransactionAborted SetAbort SetComplete 自動的なデマケーシ ョ ン / 不活性化 説明 コ ン ポーネ ン ト の作業が完了 し ていないため、現行の ト ラ ンザ ク シ ョ ン を コ ミ ッ ト で き ない こ と を示す。イ ン ス タ ン ス は、 現行の メ ソ ッ ド が復帰 し た後 も ア ク テ ィ ブな ま ま であ る 現行の メ ソ ッ ド を呼び出 し た後で、コ ン ポーネ ン ト を 非ア ク テ ィ ブに し ない こ と を 示す。 コ ン ポーネ ン ト イ ン ス タ ン ス が非ア ク テ ィ ブに さ れた場合には、現行 の ト ラ ンザ ク シ ョ ン を コ ミ ッ ト で き る 現行の メ ソ ッ ド が ト ラ ン ザ ク シ ョ ン内で実行 さ れて い る か ど う か を判定する 現行の ト ラ ン ザ ク シ ョ ン が中断 さ れた か ど う か を判 定する コ ン ポーネ ン ト は現行の ト ラ ン ザ ク シ ョ ン に対す る 作業を完了で き ず、 ト ラ ンザ ク シ ョ ン を ロ ールバ ッ ク する こ と を示す。 メ ソ ッ ド が復帰 し た と き 、 コ ン ポー ネ ン ト イ ン ス タ ン ス は非ア ク テ ィ ブに さ れ る コ ン ポーネ ン ト が現行の ト ラ ン ザ ク シ ョ ン で作業 を 完了 し 、 その コ ン ポーネ ン ト に関す る 限 り 、 ト ラ ンザ ク シ ョ ン を コ ミ ッ ト で き 、 コ ン ポーネ ン ト イ ン ス タ ン ス を非ア ク テ ィ ブにで き る こ と を示す 各 メ ソ ッ ド 呼び出 し の後で コ ン ポーネ ン ト を自動的に非ア ク テ ィ ブに し たい場合には、 コ ン ポーネ ン ト の [自動的なデマ ケーシ ョ ン / 不活 性化] を有効に し て く だ さ い。 こ れに よ っ て、コ ン ポーネ ン ト の tx_vote プ ロ パテ ィ に FALSE が設定 さ れます。[自動的なデマ ケーシ ョ ン / 不活 性化] が有効に さ れた場合には、 デフ ォ ル ト で SetComplete が想定 さ れ る ため、 SetComplete を明示的に呼び出 し て非ア ク テ ィ ブにす る 必要は あ り ません。 ト ラ ンザ ク シ ョ ン を ロ ールバ ッ ク す る には、 SetAbort を呼 び出 し ます。 各 メ ソ ッ ド 呼び出 し の後で コ ン ポーネ ン ト を自動的に非ア ク テ ィ ブに し た く ない場合には、 コ ン ポーネ ン ト の [自動的なデマ ケーシ ョ ン / 不 活性化] 設定を無効に し ます。 こ れに よ っ て、コ ン ポーネ ン ト の tx_vote プ ロ パテ ィ に TRUE が設定 さ れます。 [自動的なデマ ケーシ ョ ン / 不活 性化] を 無効にす る と 、 EAServer は、 通知 を 待 っ て か ら ト ラ ン ザ ク シ ョ ン を完了 し ます。し たがっ て、プ ロ グ ラ ム で SetComplete か SetAbort を明示的に呼び出す こ と に よ っ て、必ず非ア ク テ ィ ブに し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 483 ト ラ ンザ ク シ ョ ンのサポー ト COMMIT 文 と ROLLBACK 文 TransactionServer コ ン テ キ ス ト オ ブ ジ ェ ク ト を 無効に し 、 か わ り に COMMIT 文 と ROLLBACK 文 を 使 用 し て、 コ ン ポ ー ネ ン ト に 対 す る EAServer ト ラ ンザ ク シ ョ ン状態を指定す る こ と も 可能です。 こ の機能 を 使 う と 、 コ ー ド を 修正せず に、 PowerBuilder 6 の オ ブ ジ ェ ク ト を EAServer に移行で き ます。 TransactionServer コ ン テ キ ス ト オブジ ェ ク ト を無効にす る には、UseContextObject DBParm パ ラ メ ー タ を No に設 定 し ま す。 こ れ を行っ た場合、 COMMIT は SetComplete と 同 じ にな り 、 ROLLBACK は SetAbort と 同 じ にな り ます。 非 ト ラ ンザ ク シ ョ ン コ ンポーネ ン ト におけ る COMMIT と ROLLBACK TransactionServer コ ン テ キ ス ト オブジ ェ ク ト を無効にす る 非 ト ラ ン ザ ク シ ョ ン コ ン ポーネ ン ト では、 COMMIT は SetComplete を呼び出 さ ず、 ROLLBACK は SetAbort を呼び出 し ま せん。 た と えば、 ト ラ ン ザ ク シ ョ ンの種類 と し て [サポー ト さ れてい ません] を指定 し 、 [自動的なデマ ケ ー シ ョ ン / 不 活 性 化] を 無 効 に し (tx_vote を TRUE に 設 定) 、 UseContextObject パ ラ メ ー タ を No に設定 し た場合には、 COMMIT を実 行 し て も PowerBuilder 仮 想 マ シ ン は SetComplete を 発 行 し ま せ ん (ROLLBACK を実行 し た場合には SetAbort を発行 し ません) 。 こ の場合 には、 EAServer は、 SetComplete か SetAbort への呼び出 し を待機 し てい る ため、 コ ン ポーネ ン ト が解放 さ れません。 デー タ ベース ア ク セ ス を ま っ た く 行わない コ ン ポーネ ン ト の [自動的 なデマケーシ ョ ン / 不活性化] を無効に し た場合には、TransactionServer オブジ ェ ク ト を使用 し て SetComplete か SetAbort を呼び出 し 、 コ ン ポー ネ ン ト を非ア ク テ ィ ブにす る 必要があ り ます。 それ以外の場合は、 コ ン ポーネ ン ト は非ア ク テ ィ ブに さ れ ません。 ト ラ ンザ ク シ ョ ン処理 と 実行時エ ラ ー 484 PBVM で内部例外が発生 し た と き 、 ま たは PowerBuilder コ ン ポーネ ン ト が実行時例外を生成 し た と き の EAServer の動作を制御で き ます。 そ のためには、 コ ン ポーネ ン ト が実行 さ れてい る サーバ上で、 環境変数 PBOnFatalError ま たは PBRollbackOnRTError をバ ッ チ フ ァ イ ル内で設 定す る か、 シ ス テ ム環境変数 と し て設定 し ます。 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 表 23-6: 例外処理用の環境変数 変数 PBOnFatalError 説明 PBVM で内部例外が発生 し た と き に、EAServer を継続動作 さ せ る か、シ ャ ッ ト ダ ウ ンす る か、 ま たは再起動す る か を指定す る 。 デフ ォ ル ト は継続動作。 EAServer で実行 さ れてい る PowerBuilder コ ン ポーネ ン ト に よ っ て未処理の 内部例外が生成 さ れ る と 、 PBVM が不安定にな り 、 予期 し ない動作を起 こ す 可能性があ る 値は以下の と お り • continue - 動作を継続 さ せて CORBA_TRANSACTION_ROLLEDBACK 例 外を送出す る (デフ ォ ル ト ) • restart - 自動的に再起動する PBRollbackOnRTError • shutdown - 自動的にシ ャ ッ ト ダ ウ ンす る EAServer で実行 さ れてい る PowerBuilder コ ン ポーネ ン ト に よ っ て実行時例 外が生成 さ れた と き に、 ト ラ ンザ ク シ ョ ン を ど の よ う に処理する か を指定す る 。 デフ ォ ル ト では、 ト ラ ンザ ク シ ョ ン を ロ ールバ ッ ク し て ク ラ イ ア ン ト に 例外を送出す る 値は以下の と お り • n、 no、 ま たは false - ト ラ ンザ ク シ ョ ン を コ ミ ッ ト し てか ら ク ラ イ ア ン ト に例外を送出す る • y、 yes、 ま たは true - ト ラ ンザ ク シ ョ ン を ロ ールバ ッ ク し てか ら ク ラ イ ア ン ト に例外を送出す る (デフ ォ ル ト ) ト ラ ンザク シ ョ ン と コ ンポーネ ン ト 有効期間 EAServer の ト ラ ン ザ ク シ ョ ン モデル と コ ン ポーネ ン ト 有効期間は密 に統合 さ れてい ます。 ト ラ ンザ ク シ ョ ンに関与す る コ ン ポーネ ン ト イ ン ス タ ン ス は、 ト ラ ン ザ ク シ ョ ン が終了す る か、 ト ラ ン ザ ク シ ョ ン に 対す る コ ン ポーネ ン ト の関与が終了 し た こ と が示 さ れ る (その作業が 終了 し て コ ミ ッ ト の用意がで き る か、 その作業を ロ ールバ ッ ク す る 必 要があ る ) ま では、 非ア ク テ ィ ブにな り ません。 イ ン ス タ ン ス がア ク テ ィ ブにな る タ イ ミ ン グは、 ト ラ ンザ ク シ ョ ンへの イ ン ス タ ン ス の関 与開始 と 終了に正確に一致 し ます。 詳細については、 EAServer のマニ ュ アルを参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 485 EAServer コ ンポーネ ン ト から デー タ ベースへのア ク セス EAServer コ ンポーネ ン ト か ら デー タ ベースへのア ク セス デー タ ベースの接続性 EAServer コ ン ポ ー ネ ン ト か ら デ ー タ ベ ー ス に ア ク セ ス で き ま す。 EAServer に よ る 接続プー リ ン グ と ト ラ ンザ ク シ ョ ン管理のサポー ト を 活用 し た い場合には、 EAServer に よ っ て サ ポー ト さ れ て い る デー タ ベース イ ン タ フ ェース のいずれか を使用 し て、 デー タ ベース に接続す る 必要が あ り ま す。 デー タ ベー ス イ ン タ フ ェ ー ス についての詳細は、 『デー タ ベース と の接続』 マニ ュ アルを参照 し て く だ さ い。 デー タ ス ト アの使い方 PowerBuilder で開発 さ れた EAServer コ ン ポーネ ン ト は、 デー タ ス ト ア を使用 し てデー タ ベー ス と 対話で き ます。 デー タ ス ト アは、 非ビ ジ ュ アルなデー タ ウ ィ ン ド ウ の コ ン ト ロ ールです。 デー タ ス ト アは、 デー タ ウ ィ ン ド ウ の コ ン ト ロ ール と 同 じ よ う に機能 し ますが、 ビ ジ ュ アル 属性を持っ てい ません。 デー タ ス ト アは、 分散アプ リ ケーシ ョ ン で使用す る と 便利です。 デー タ ス ト ア を使用す る と 、 各 ク ラ イ ア ン ト マシ ンのかわ り に、 リ モー ト サーバ上でデー タ ベース処理を実行で き ます。 リ ッ チ テキス ト 提示様式はサポー ト さ れていません サーバ コ ン ポーネ ン ト は、 リ ッ チテ キ ス ト 提示様式を使用す る デー タ ウ ィ ン ド ウ オ ブ ジ ェ ク ト を 備 え たデー タ ス ト ア を 格納で き ま せん。 リ ッ チテ キ ス ト 処理は、 分散アプ リ ケーシ ョ ン ではサポー ト さ れてい ません。 サーバ と ク ラ イ ア ン ト 間でのデー タ 共有 サーバ上で検索 さ れ る デー タ に視覚的な イ ン タ フ ェ ース を提供 し たい 場合、 デー タ ウ ィ ン ド ウ コ ン ト ロ ールを持つ ウ ィ ン ド ウ を ク ラ イ ア ン ト に追加 し ます。 サーバ上でデー タ が検索 さ れ る たびに、 デー タ ウ ィ ン ド ウ コ ン ト ロ ール を 更新 し て サーバ上のデー タ ス ト ア の結果集合 を表示 し ます。 同様に、 ユーザが ク ラ イ ア ン ト 上でデー タ を変更す る たびに、 サーバ上のデー タ ス ト アの内容を更新 し て、 ク ラ イ ア ン ト 上 のデー タ ウ ィ ン ド ウ コ ン ト ロ ールの最新の ス テー タ ス を 反映 さ せ ま す。 ク ラ イ ア ン ト と サーバ間でデー タ を共有す る には、 サーバのデー タ ス ト ア と ク ラ イ ア ン ト のデー タ ウ ィ ン ド ウ コ ン ト ロ ール を プ ロ グ ラ ム に よ っ て同期 さ せます。 アプ リ ケーシ ョ ン にデー タ ベース 更新の処理 を行わせたい場合は、 加え てデー タ ウ ィ ン ド ウ のデー タ バ ッ フ ァ と ス テー タ ス フ ラ グ を、 ク ラ イ ア ン ト と サーバの間で互いにや り と り す る 必要 も あ り ます。 サーバのデー タ ス ト ア と ク ラ イ ア ン ト のデー タ ウ ィ ン ド ウ と の同期に ついての詳細は、 492 ページの 「更新の実行」 を参照 し て く だ さ い。 486 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 分散ア プ リ ケーシ ョ ンは ShareData 関数をサポー ト し ません ク ラ イ ア ン ト 上のデー タ ウ ィ ン ド ウ コ ン ト ロ ール と サーバ上のデー タ ス ト ア と の間では、 ShareData 関数を使用 し てのデー タ 共有はで き ま せん。 接続キャ ッ シ ュ の使い方 接続キ ャ ッ シ ュの利点 デー タ ベース処理を最適化す る ため、 EAServer は接続キ ャ ッ シ ュ を サ ポー ト し ます。 接続キ ャ ッ シ ュ を使用すれば、 EAServer コ ン ポーネ ン ト は、 リ モー ト デー タ ベース サーバに対 し て あ ら か じ め割 り 当て ら れ た接続のプールを共有で き る ため、 コ ン ポーネ ン ト の各 イ ン ス タ ン ス が別々の接続を確立す る こ と に よ る オーバーヘ ッ ド を避け る こ と が可 能です。 接続キ ャ ッ シ ュ を設定す る こ と に よ っ て、 サーバは同 じ デー タ ソ ース に対す る 接続を再利用で き ます。 動作 通常、 PowerBuilder アプ リ ケーシ ョ ン がデー タ ベース に接続 さ れ る と 、 PowerBuilder は、 DISCONNECT 文が実行 さ れた各デー タ ベー ス 接続を 物理的に終了 さ せます。一方、PowerBuilder コ ン ポーネ ン ト が EAServer 接続キ ャ ッ シ ュ を使用 し た場合には、 EAServer はデー タ ベース接続を 論理的に終了 さ せますが、 接続を物理的に解除す る わけではあ り ませ ん。 接続キ ャ ッ シ ュ 内ではデー タ ベー ス接続が開いた ま ま で あ り 、 ほ かのデー タ ベース操作で再利用で き ます。 destructor イ ベン ト で接続を解除 し ない EAServer は、 ト ラ ンザ ク シ ョ ンが完了す る 時や コ ン ポーネ ン ト が非ア ク テ ィ ブにな る 時に、 キ ャ ッ シ ュ へのすべての接続ハン ド ルを解放 し ま す。 destructor イ ベ ン ト (deactivate イ ベ ン ト の 後 に 発生す る ) に DISCONNECT 文を 配置する と 、接続はすでに論理的に終了し ている ので、 DISCONNECT で物理的に終了 さ れます。 DISCONNECT 文は、 deactivate イ ベン ト に配置で き ます。 キ ャ ッ シ ュ 内のすべての接続は、 共通のユーザ名、 パ ス ワ ー ド 、 サー バ名、 お よ び接続 ラ イ ブ ラ リ を共有 し なければな り ません。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 487 EAServer コ ンポーネ ン ト から デー タ ベースへのア ク セス ユーザによ るキ ャ ッ シ ュへのア ク セス 指定 さ れた一連のユーザ名、 パ ス ワ ー ド 、 サーバ、 お よ び接続 ラ イ ブ ラ リ の 値 を 使 用 す る キ ャ ッ シ ュ か ら 接 続 を 検 索 し た い 場 合 に は、 キ ャ ッ シ ュ を使え る よ う にデー タ ベー ス ア ク セ ス コ ー ド を修正す る 必要はあ り ま せん。 Jaguar Manager で、 コ ン ポーネ ン ト が必要 と す る デー タ ベー ス 接続プ ロ パテ ィ (ユーザ名、 パ ス ワ ー ド 、 サーバ名、 お よ び接続 ラ イ ブ ラ リ ) を備え た新 し いキ ャ ッ シ ュ を作成 し ます。 実行 時に、 コ ン ポーネ ン ト がデー タ ベー ス への接続を試み る と 、 EAServer は、 コ ン ポーネ ン ト が要求す る 接続値に一致す る 接続を キ ャ ッ シ ュ か ら 自動的に返 し ます。 名前によ るキ ャ ッ シ ュ へのア ク セス キ ャ ッ シ ュ 名を指定す る こ と に よ っ て、 キ ャ ッ シ ュ か ら 接続を検索 し たい場合には、CacheName DBParm を設定 し て、使用 し たいキ ャ ッ シ ュ を識別 し ます。 名前に よ っ て キ ャ ッ シ ュ にア ク セ ス すれば、 コ ン ポー ネ ン ト の対応す る ソ ース コ ー ド を変更せずに、 Jaguar Manager でユー ザ名、 パ ス ワー ド 、 ま たはサーバを変更で き ます。 キ ャ ッ シ ュ名によ る ア ク セス を有効にする 名前に よ っ て キ ャ ッ シ ュ にア ク セ スす る には、Jaguar Manager でキ ャ ッ シ ュ の [Enable Cashe-By-Name Access] オプ シ ョ ン を 選択 し ま す。 デ フ ォ ル ト では、 こ のオプシ ョ ンは選択 さ れ ません。 こ のオプシ ョ ン を有効にす る には、 jagadmin 権限が必要です。 次の PowerBuilder コ ン ポーネ ン ト の コ ー ド 例に、 名前に よ る キ ャ ッ シ ュ へのア ク セ ス方法を示 し ます。 SQLCA.DBMS = "ODBC" SQLCA.Database = "EAS Demo DB" SQLCA.AutoCommit = FALSE SQLCA.DBParm = "ConnectString='DSN=EAS Demo DB; UID=dba;PWD=sql',CacheName='mycache'" キ ャ ッ シ ュ名では大文字 と 小文字が区別 さ れる キ ャ ッ シ ュ 名では大文字 と 小文字が区別 さ れ ます。 し たが っ て、 ス ク リ プ ト に指定す る キ ャ ッ シ ュ 名が EAServer での名前 と 完全に一致す る こ と を確認 し て く だ さ い。 プ ロキシによ る接続 488 キ ャ ッ シ ュ にユーザに よ っ て ア ク セ スす る か名前に よ っ て ア ク セ ス す る かに関係な く 、 プ ロ キ シで接続で き ます。 プ ロ キ シで接続 し た場合 は、 代替 ロ グ イ ン名を入力す る こ と で、 別のユーザの識別情報 と 権限 を使用で き ます。 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 こ の機能は、 SQL コ マ ン ド set session authorization を認識す る 任意の デー タ ベース で使用で き ます。 ユーザ A が ProxyUserName DBParm を 使用 し て別のユーザ B の識別情報を使用す る には、 ユーザ A は こ の ス テー ト メ ン ト を実行す る 権限を所有 し ていな ければな り ません。 た と えば、 ASA の場合、 ユーザ A は DBA 権限を所有 し てい る 必要があ り 、 ま た ASE の場合、 ユーザ A はシ ス テ ム のセキ ュ リ テ ィ 担当者か ら set session authorization を実行す る 権限を与え ら れてい る 必要があ り ます。 プ ロ キ シ接続をサポー ト す る PowerBuilder デー タ ベース イ ン タ フ ェ ー ス についての詳細は、 『デー タ ベース と の接続』 マニ ュ アルを参照 し て く だ さ い。 プ ロ キ シ 接続 を 使用す る に は、 代替 ロ グ イ ン 名 を 識別す る た め の ProxyUserName DBParm を設定 し ます。 次の例に、 プ ロ キ シに よ る 接 続方法を示 し ます。 SQLCA.DBMS = "ODBC" SQLCA.DBParm = "CacheName='MyEAServerCache', UseContextObject='Yes',ProxyUserName='pikachu'" プ ロキシ接続を利用する前に コ ン ポーネ ン ト がプ ロ キ シ接続を利用す る には、 事前にキ ャ ッ シ ュ プ ロ パテ ィ フ ァ イ ルでプ ロ キ シ設定の Set-proxy サポー ト を有効に し て お く 必要があ り ます。 Jaguar Manager では、 キャ ッ シュ 作成時には個々 のキャ ッ シュ のプロ パティ は自動作成さ れま せん。し たがっ て、こ のフ ァ イ ルは手動で作成す る 必要があ り ます。 フ ァ イ ルに cachename.props と い う 名前を付けて、 EAServer¥Repository¥ConnCache デ ィ レ ク ト リ に格 納 し ます。 キ ャ ッ シ ュ のプ ロ パテ ィ フ ァ イ ルを作成 し た ら 、 次の行を 追加 し ます。 com.sybase.jaguar.conncache.ssa=true こ の設定を有効にす る には、 EAServer を更新 し な ければな り ま せん。 接続キ ャ ッ シ ュ の管理についての詳細は、 『EAServer シ ス テ ム管理者 ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 ま た、 デー タ ベース サーバが ProxyUserName DBParm で定義 し た代替 ロ グ イ ン 名 を 認識 し て権限 を 与え る よ う に設定 し な ければな り ま せ ん。 すべての接続が使用中 である場合の動作 キ ャ ッ シ ュ 内のすべての接続が使用中で あ る 場合の動作を制御で き ま す。 そのためには、 GetConnectionOption DBParm に次のいずれかの値 を設定 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 489 EAServer コ ンポーネ ン ト から デー タ ベースへのア ク セス 値 JAG_CM_NOWAIT JAG_CM_WAIT JAG_CM_FORCE 説明 接続を返せなか っ た場合に、 接続を試み る と エ ラ ー で停止す る 接続が利用可能にな る ま で、 コ ン ポーネ ン ト が待機 する 新し い 接続を 割り 当て て 開く 。 こ の 新し い 接続は キ ャ ッ シュ さ れないため、不要になっ たら 破棄さ れる デフ ォ ル ト では、 PowerBuilder は JAG_CM_FORCE を使用 し ます。 接続が解放 さ れた と き の動作 接 続 が 解 放 さ れ た と き の 動 作 も 制 御 で き ま す。 そ の た め に は、 ReleaseConnectionOption DBParm に以下の いずれか の値 を 設定 し ま す。 値 JAG_CM_DROP JAG_CM_UNUSED 説明 接続を閉 じ て割 り 当て解除す る 。 キ ャ ッ シ ュ か ら の 接続であ る 場合には、 その位置に新 し い接続が作成 さ れ る 。 エ ラ ーに よ っ て使用で き な く な っ た場合に は、 JAG_CM_DROP を使用 し て接続を破棄す る キ ャ ッ シ ュ か ら の 接 続 で あ る 場 合 に は、 接 続 が キ ャ ッ シ ュ に戻 さ れ る 。 キ ャ ッ シ ュ の外部で作成 さ れた接続は、 閉 じ て破棄 さ れ る デフ ォ ル ト では、 PowerBuilder は JAG_CM_UNUSED を使用 し ます。 検索操作の実行 デー タ ス ト ア を使用 し て検索操作を行 う には、 まずス ク リ プ ト でデー タ ス ト ア オブジ ェ ク ト の イ ン ス タ ン ス を作成 し 、デー タ ウ ィ ン ド ウ オ ブジ ェ ク ト をデー タ ス ト アに割 り 当て る 必要があ り ます。 次に、 デー タ ス ト アの ト ラ ンザ ク シ ョ ン オブジ ェ ク ト を設定 し ます。 こ れ ら の設 定が完了 し た ら 、 デー タ ス ト ア内でのデー タ の検索や、 デー タ ス ト ア の内容の印刷な ど の処理を、検索 し た結果集合に対 し て実行で き ます。 490 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 例 : 参照によ る配列渡 し 解説 次の例に、 デー タ ス ト ア を使用 し てサーバ コ ン ポーネ ン ト 内のデー タ を取 り 出す方法を示 し ます。サーバ コ ン ポーネ ン ト uo_customers には、 retrieve_custlist と い う 関数があ り ます。 retrieve_custlist は、 デー タ ス ト ア ds_datastore の イ ン ス タ ン ス を 生成 し 、 こ のデー タ ス ト ア を 使用 し て Customer テーブル内のすべての行を取 り 出 し ます。 デー タ が取 り 出 さ れた ら 、retrieve_custlist はデー タ を ク ラ イ ア ン ト アプ リ ケーシ ョ ンに戻 し ます。 関数の宣言 retrieve_custlist 関数は、 構造体 st_custlist の配列 と し て定義 さ れ る 引数 customers を受け取 り ます。 構造体 st_custlist は、 デー タ ウ ィ ン ド ウ オ ブジ ェ ク ト がデー タ ベースへのア ク セ ス に使用 し た d_custlist と 同 じ レ イ ア ウ ト を 備え て い ま す。 取 り 出 さ れ た行数 を 返すた めに使用す る retrieve_custlist の戻 り 値は Long 型です。 retrieve_custlist 関数のシ グネチ ャ を次に示 し ます。 retrieve_custlist( REF st_custlist customers [] ) returns long スク リプ ト retrieve_custlist 関数の ス ク リ プ ト を次に示 し ます。 datastore ds_datastore long ll_rowcount ds_datastore = create datastore ds_datastore.dataobject = "d_custlist" ds_datastore.SetTransObject (SQLCA) IF ds_datastore.Retrieve() <> -1 THEN ll_rowcount = ds_datastore.RowCount() END IF customers = ds_datastore.object.data destroy ds_datastore return ll_rowcount retrieve_custlist 関数は、 処理の最後にデー タ ス ト ア を破棄 し て、 取 り 出 さ れた行数を ク ラ イ ア ン ト に返 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 491 EAServer コ ンポーネ ン ト から デー タ ベースへのア ク セス 更新の実行 デー タ ウ ィ ン ド ウの同 期 従来の ク ラ イ ア ン ト / サーバ アプ リ ケーシ ョ ン では、 デー タ ベース の 更新は、 ク ラ イ ア ン ト マシ ン上で動作 し てい る 1 つのアプ リ ケーシ ョ ン に よ っ て開始 さ れ ます。 分散アプ リ ケーシ ョ ン の場合、 状況は多少 異な り ます。 アプ リ ケーシ ョ ン コ ン ポーネ ン ト は ク ラ イ ア ン ト と サー バの間で分割 さ れ る ため、 ロ ジ ッ ク を記述す る こ と に よ っ て、 ク ラ イ ア ン ト 上のデー タ ウ ィ ン ド ウ コ ン ト ロ ールのデー タ バ ッ フ ァ と ス テー タ ス フ ラ グ を、 サーバ上のデー タ ス ト アのそれ ら と 同期 さ せ る こ と が必要にな り ます。 PowerBuilder は、 分散アプ リ ケーシ ョ ン においてデー タ ウ ィ ン ド ウ と デー タ ス ト ア を同期 さ せ る ために 4 つの関数を提供 し てい ます。 • GetFullState • SetFullState • GetChanges • SetChanges こ れ ら の関数は分散アプ リ ケーシ ョ ン上では非常に役立ち ますが、 複 数のデー タ ウ ィ ン ド ウ (デー タ ス ト ア) を同期 さ せなければな ら ない、 分散モデル以外のアプ リ ケーシ ョ ン で も 使用で き ます。 デー タ ウ ィ ン ド ウの バ ッ フ ァ と ス テー タ ス フ ラ グの移動 ク ラ イ ア ン ト 上のデー タ ウ ィ ン ド ウ コ ン ト ロ ール と サーバ上のデー タ ス ト ア を同期 さ せ る には、 デー タ ウ ィ ン ド ウ のデー タ バ ッ フ ァ と ス テー タ ス フ ラ グ を、 デー タ の変化が起 こ る たびに ク ラ イ ア ン ト と サー バの間でや り と り し ます。 こ れを行 う ための手順は、 変更の原因が ク ラ イ ア ン ト にあ っ て も サーバにあ っ て も 、 本質的に同 じ です。 完全な状態情報を 1 つのデー タ ウ ィ ン ド ウ (ま たはデー タ ス ト ア) か ら 別のデー タ ウ ィ ン ド ウ (ま たはデー タ ス ト ア) に適用す る には、 次 の手順を実行す る 必要があ り ます。 1 GetFullState 関数を呼び出 し て、 ソ ース デー タ ウ ィ ン ド ウ の現行状 態を取 り 込みます。 2 SetFullState 関数を呼び出 し て、 ソ ース デー タ ウ ィ ン ド ウ の状態を タ ーゲ ッ ト に適用 し ます。 変更を 1 つのデー タ ウ ィ ン ド ウ (ま たはデー タ ス ト ア) か ら 別のデー タ ウ ィ ン ド ウ (ま たはデー タ ス ト ア) に適用す る には、 次の手順を実 行す る 必要があ り ます。 1 GetChanges 関数を呼び出 し て、 ソ ース デー タ ウ ィ ン ド ウ か ら 変更 を取 り 込みます。 492 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 2 SetChanges 関数を呼び出 し て、 ソ ース デー タ ウ ィ ン ド ウ の変更を タ ーゲ ッ ト に適用 し ます。 SetChanges は空のデー タ ウ ィ ン ド ウに適用で き ます SetChanges を呼び出 し て、 変更を空のデー タ ウ ィ ン ド ウ (ま たはデー タ ス ト ア) に適用で き ます。 タ ーゲ ッ ト デー タ ウ ィ ン ド ウ は、 前の取 り 出 し 操作の結果集合を格納す る 必要はあ り ません。 し か し 、 デー タ ウ ィ ン ド ウ はデー タ ウ ィ ン ド ウ 定義にア ク セ ス で き な ければな り ませ ん。 つま り 、 SetChanges を呼び出す前に、 デー タ ウ ィ ン ド ウ オブジ ェ ク ト を タ ーゲ ッ ト デー タ ウ ィ ン ド ウ に割 り 当て る 必要があ り ます。 デー タ ウ ィ ン ド ウの状 態は Blob に格納 さ れ ます GetFullState 関数ま たは GetChanges 関数を 呼び出し たと き 、PowerBuilder は デー タ ウ ィ ン ド ウ の ス テ ー タ ス 情報 を Blob 型 の 値 で 返 し ま す。 GetFullState 関数か ら 返 さ れ る Blob 値は、 デー タ バ ッ フ ァ 、 ス テー タ ス フ ラ グ、 デー タ ウ ィ ン ド ウ の詳細な仕様な ど、 デー タ ウ ィ ン ド ウ の再 構築に必要なすべての情報を提供 し ます。 GetChanges 関数か ら 返 さ れ る Blob 値は、 変更あ る いは削除が行われた行につい て のみ、 デー タ バ ッ フ ァ や状態フ ラ グの情報を提供 し ます。 更新後の同期 デフ ォ ル ト では、 Update 関数は、 更新に成功 し た後で更新フ ラ グ を リ セ ッ ト し ます。 し たが っ て、 サーバ上で Update 関数を呼び出 し た場合 には、サーバ デー タ ス ト アの ス テー タ ス フ ラ グは自動的に リ セ ッ ト さ れます。 し か し 、 対応す る ク ラ イ ア ン ト デー タ ウ ィ ン ド ウ コ ン ト ロ ー ルの更新フ ラ グは リ セ ッ ト さ れ ません。 し たが っ て、 サーバ デー タ ス ト アの Update 関数が成功 し た場合には、ク ラ イ ア ン ト デー タ ウ ィ ン ド ウ の ResetUpdate を呼び出 し て、 フ ラ グ を リ セ ッ ト し ます。 1 つのソ ース、 1 つの タ ーゲ ッ ト 1 つの ソ ース デー タ ウ ィ ン ド ウ (デー タ ス ト ア) と 1 つの タ ーゲ ッ ト デー タ ウ ィ ン ド ウ (デー タ ス ト ア) と の同期化が可能です。 1 つの ソ ー ス を 複数の タ ーゲ ッ ト に同期 さ せた り 、 逆に複数の ソ ー ス を 1 つの タ ーゲ ッ ト に同期 さ せた り し ないで く だ さ い。 一般的な使用シナ リ オ サーバに、 DS_1 と い う デー タ ス ト ア を使用す る コ ン ポーネ ン ト があ る と し ます。 こ のデー タ ス ト アは、 ク ラ イ ア ン ト 上の DW_1 と い う タ ー ゲ ッ ト デー タ ウ ィ ン ド ウ のデー タ の ソ ー ス です。 Activate イ ベン ト で は、 コ ン ポーネ ン ト はデー タ ベース に接続 し 、 デー タ ス ト ア を作成 し 、 デー タ ス ト アにデー タ ウ ィ ン ド ウ オブジ ェ ク ト を割 り 当て ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 493 EAServer コ ンポーネ ン ト から デー タ ベースへのア ク セス そ の メ ソ ッ ド の 1 つ で、 サ ー バ コ ン ポ ー ネ ン ト は DS_1 に 対す る Retrieve 関数を発行 し 、 DS_1 の GetFullState 関数を呼び出 し て、 取得 し た Blob を ク ラ イ ア ン ト に渡 し ます。 コ ン ポーネ ン ト の [自動的なデマ ケーシ ョ ン / 不活性化] 設定が無効に さ れてい る ため、 メ ソ ッ ド が復 帰す る 前に SetComplete 関数 も 呼び出 し て、 コ ン ポーネ ン ト イ ン ス タ ン ス を非ア ク テ ィ ブに し ます。 [自動的なデマケーシ ョ ン / 不活性化] が有効である場合 コ ン ポーネ ン ト に対す る [自動的なデマケーシ ョ ン / 不活性化] 設定 が有効の場合には、 メ ソ ッ ド が実行を終了 し た時点で、 コ ン ポーネ ン ト イ ン ス タ ン ス は自動的に非ア ク テ ィ ブに さ れ ます。 し たがっ て、 取 り 出 し の後に SetComplete 関数を呼び出す必要はあ り ません。 ク ラ イ ア ン ト がデー タ ウ ィ ン ド ウ Blob を取得す る と 、 SetFullState 関数 を 呼び出 し て、 Blob の状態情報 を DW_1 に適用 し ま す。 こ の時点で、 ユーザは DW_1 に新 し い行を挿入 し た り 、 既存の行を変更ま たは削除 し た り で き ます。 ユーザが更新 リ ク エ ス ト を行 う と 、 ク ラ イ ア ン ト は GetChanges 関数を呼び出 し 、 別の コ ン ポーネ ン ト メ ソ ッ ド を呼び出 し て取得 し た Blob を サーバに戻 し ます。 次に、 コ ン ポーネ ン ト メ ソ ッ ド は SetChanges 関数を呼び出 し て、 DW_1 の変更を DS_1 に適用 し ます。 サーバ コ ン ポーネ ン ト は、 DS_1 を DW_1 に同期 さ せて か ら 、 デー タ ベー ス を更新 し 、 SetComplete 関数 ま たは SetAbort 関数を呼び出 し て、 更新に成功 し たか ど う か を示 し ます。 更新が成功 し た場合には、ク ラ イ ア ン ト は ResetUpdate 関数を呼び出 し て、 ク ラ イ ア ン ト デー タ ウ ィ ン ド ウ の ス テー タ ス フ ラ グ を リ セ ッ ト し ます。 494 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 図 23-1: 更新処理の例 最初の更新操作が完了 し た後、 ク ラ イ ア ン ト と サーバは、 完全な状態 情報ではな く Blob の変更結果を互いにや り と り し て、 それ以降の更新 を処理で き ます。 それ以降の更新プ ロ セ ス は、 手順 7 か ら 手順 14 ま で の繰 り 返 し と な り ます。 例 次の例に、 PowerBuilder ク ラ イ ア ン ト と EAServer コ ン ポーネ ン ト の間 で、デー タ ウ ィ ン ド ウ の同期を と る 方法を示 し ます。こ の例では ス テー ト レ ス コ ン ポーネ ン ト を使用 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 495 EAServer コ ンポーネ ン ト から デー タ ベースへのア ク セス ク ラ イアン ト ウ ィ ン ド ウの定義 ク ラ イ ア ン ト には w_employee と い う ウ ィ ン ド ウ があ り 、 その ウ ィ ン ド ウ のボ タ ン を使用 し て、 ユーザはデー タ の検索 と 更新を行え る も の と し ます。 ク ラ イ ア ン ト ウ ィ ン ド ウ の [検索] ボ タ ン には、 次の ス ク リ プ ト があ り ます。 // // // // グローバル変数 : connection myconnect イ ン ス タ ン ス変数 : uo_employee iuo_employee blob lblb_data long ll_rv myconnect.CreateInstance(iuo_employee) iuo_employee.RetrieveData(lblb_data) ll_rv = dw_employee.SetFullState(lblb_data) if ll_rv = -1 then MessageBox(" エ ラ ー ", "SetFullState 呼び出 し に失敗 し ま し た !") end if ク ラ イ ア ン ト ウ ィ ン ド ウ の [更新] ボ タ ンには、 次の ス ク リ プ ト があ り ます。 blob lblb_data long ll_rv ll_rv = dw_employee.GetChanges(lblb_data) if ll_rv = -1 then MessageBox(" エ ラ ー ", "GetChanges 呼び出 し に失敗 し ま し た !") else if iuo_employee.UpdateData(lblb_data) = 1 then & dw_employee.ResetUpdate() end if サーバ オブ ジ ェ ク ト の定義 イ ン ス タ ン ス変数 サーバのオブジ ェ ク ト uo_employee には、 以下の関数があ り ます。 • RetrieveData • UpdateData uo_employee オブジ ェ ク ト には、 以下の イ ン ス タ ン ス変数があ り ます。 protected TransactionServer ts protected DataStore ids_datastore 496 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 Activate uo_employee オブジ ェ ク ト の Activate イ ベン ト は、TransactionServer サー ビ ス を イ ン ス タ ン ス 化 し ます。 さ ら に、 デー タ ベー ス に接続 し てデー タ ス ト ア を作成 し ます。 こ のデー タ ス ト アは、 デー タ ベー ス へのア ク セ ス に使用 さ れ ます。 this.GetContextService("TransactionServer", ts) SQLCA.DBMS="ODBC" SQLCA.DBParm="ConnectString= 'DSN=EAS Demo DB;UID=dba;PWD=sql', UseContextObject='Yes'" CONNECT USING SQLCA; IF SQLCA.SQLCode < 0 THEN // エ ラ ー処理 END IF ids_datastore = CREATE datastore ids_datastore.dataobject = "d_emplist" ids_datastore.SetTransObject (SQLCA) RetrieveData 関数の スク リプ ト RetrieveData 関数は ablb_data と い う 引数を受け取 り ます。 こ の引数は、 参照渡 し さ れ る Blob です。 こ の関数は Long 値を返 し ます。 RetrieveData 関数の ス ク リ プ ト を次に示 し ます。 long ll_rv ids_datastore.Retrieve() ll_rv = ids_datastore.GetFullState(ablb_data) ts.SetComplete() return ll_rv UpdateData 関数のス クリプ ト UpdateData 関数は ablb_data と い う 引数を受け取 り ま す。 こ の引数は、 参照渡 し さ れ る Blob です。 こ の関数は Long 値を返 し ます。 UpdateData 関数の ス ク リ プ ト を次に示 し ます。 long ll_rv if ids_datastore.SetChanges(ablb_data) = 1 then ll_rv = ids_datastore.Update() end if if ll_rv = 1 then ts.SetComplete() else ts.SetAbort() end if return ll_rv ア プ リ ケーシ ョ ン テ ク ニ ッ ク 497 EAServer コ ンポーネ ン ト から デー タ ベースへのア ク セス Deactivate uo_employee オブジ ェ ク ト の Deactivate イ ベン ト は、 デー タ ス ト ア を破 棄 し 、 デー タ ベース か ら 接続を解除 し ます。 DESTROY ids_datastore DISCONNECT USING SQLCA; 結果集合の受け渡し PowerBuilder は、 2 つのシ ス テ ム オブジ ェ ク ト を提供す る こ と に よ っ て、 EAServer で動作 し てい る コ ン ポーネ ン ト か ら 結果集合を取得 し 、 EAServer コ ン ポーネ ン ト と し て動作 し てい る PowerBuilder ユーザ オ ブジ ェ ク ト か ら 結果集合を返 し ます。 こ れ ら のシ ス テ ム オブジ ェ ク ト (ResultSet と ResultSets) は、 デー タ ス ト ア オブジ ェ ク ト と の間で ト ラ ン ザ ク シ ョ ン サーバの結果集合の相互変換 を 簡単にす る よ う 設計 さ れてお り 、 状態情報は含 ま れてい ません。 ま た、 デー タ ベー ス の更新 に使用す る よ う には設計 さ れてい ません。 デー タ ス ト ア オブジ ェ ク ト と の間で こ れ ら のオ ブ ジ ェ ク ト に格納 さ れ た結果集合 を 変換す る に は、 デー タ ス ト ア オブジ ェ ク ト の CreateFrom 関数 と GenerateResultSet 関数を使用 し ます。 GenerateResultSet について GenerateResultSet には も う 1 つの構文があ り 、EAServer と と も に MASP (Method as Stored Procedure) を 使 用 す る と き に、 TDS (Tabular Data Stream) の結果集合を返すために使用 さ れ ます。詳細については、『デー タ ウ ィ ン ド ウ リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 結果集合を返す コ ン ポーネ ン ト メ ソ ッ ド は、TabularResults モジ ュ ール を使用 し ます。1 つの結果集合は TabularResults::ResultSet 構造体 と し て 返 さ れ ます。 複数の結果集合は、 TabularResults::ResultSets デー タ 型を 使用 し て、 一連の ResultSet 構造体 と し て返 さ れます。 PowerBuilder ク ラ イ ア ン ト か ら EAServer コ ンポーネ ン ト 内の結 果集合にア ク セス 498 TabularResults::ResultSet を返す EAServer コ ン ポーネ ン ト メ ソ ッ ド に対 し て、PowerBuilder で EAServer プ ロ キ シ オブジ ェ ク ト を生成 し た場合 には、 プ ロ キ シ オブジ ェ ク ト の メ ソ ッ ド は、 PowerBuilder ResultSet オ ブ ジ ェ ク ト を 返 し ま す。 複 数 の 結 果 集 合 を 返 す メ ソ ッ ド は、 PowerBuilder ResultSets オブジ ェ ク ト を返 し ます。 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 ブ ラ ウザで プ ロキシ を表示 PowerBuilder ブ ラ ウ ザの [プ ロ キ シ] タ ブでは、 EAServer プ ロ キ シ オ ブジ ェ ク ト のプ ロ パテ ィ と メ ソ ッ ド を表示で き ます。 た と えば、 Sybase Virtual University サン プルの SVUBookstore コ ン ポー ネ ン ト には、TabularResults::ResultSet 値を返すい く つかの メ ソ ッ ド があ り ま す。 こ の コ ン ポーネ ン ト の EAServer プ ロ キ シ オブジ ェ ク ト を作 成す る と 、 GetMajors メ ソ ッ ド は、 ブ ラ ウ ザでは PowerBuilder ユーザ オ ブジ ェ ク ト 関数 と し て次の よ う に表示 さ れます。 SVUBookStore.GetMajors ( ) returns ResultSet PowerBuilder ク ラ イ ア ン ト か ら 結果集合に ア ク セ ス す る に は、 コ ン ポーネ ン ト の イ ン ス タ ン ス を作成 し 、 メ ソ ッ ド を呼び出 し 、 結果集合 を使用 し てデー タ ス ト ア オブ ジ ェ ク ト に CreateFrom 関数 を 追加 し ま す。 次の例では、 SVUBookstore コ ン ポーネ ン ト の イ ン ス タ ン ス を作成 し 、 GetMajors メ ソ ッ ド を呼び出 し ます。 SVUBookstore lcst_mybookstore resultset lrs_resultset datastore ds_local integer li_rc // myconnect は接続オブ ジ ェ ク ト です li_rc = myconnect.CreateInstance(lcst_mybookstore) IF li_rc <> 0 THEN MessageBox(" イ ン ス タ ン スの作成 ", string(li_rc) ) myconnect.DisconnectServer() RETURN END IF lrs_resultset = lcst_mybookstore.GetMajors() ds_local = CREATE datastore ds_local.CreateFrom(lrs_resultset) EAServer コ ンポーネ ン ト から 結果集合を返 す EAServer に配布 さ れ る PowerBuilder ユーザ オブ ジ ェ ク ト か ら 結果集 合を渡 し た り 返 し た り す る には、 関数の引数ま たは戻 り 値のデー タ 型 に ResultSet (1 つの結果集合の場合) ま たは ResultSets (複数の結果集 合の場合) を設定 し ま す。 ユーザ オブジ ェ ク ト が EAServer コ ン ポー ネ ン ト と し て配布 さ れた場合には、 ResultSet と ResultSets の戻 り 値は、 コ ン ポーネ ン ト の IDL イ ン タ フ ェ ース では、TabularResults::ResultSet と TabularResults::ResultSets のデー タ 型 と し て表 さ れ ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 499 コ ンポーネ ン ト イ ン タ フ ェ ースの定義 次の例では、 デー タ ス ト ア オブジ ェ ク ト を作成 し 、 その中にあ る デー タ を取 り 出 し 、 続いて GenerateResultSet 関数を使用 し て、 ク ラ イ ア ン ト に返す こ と ので き る 結果集合を作成 し てい ます。 datastore ds_datastore resultset lrs_resultset integer li_rc ds_datastore = create datastore ds_datastore.dataobject = "d_empdata" ds_datastore.SetTransObject (SQLCA) IF ds_datastore.Retrieve() = -1 THEN // エ ラ ーを レポー ト し て復帰 END IF li_rc = ds_datastore.generateresultset(lrs_resultset) IF li_rc <> 1 THEN // エ ラ ーを レポー ト し て復帰 END IF return lrs_resultset コ ンポーネ ン ト イ ン タ フ ェ ースの定義 イ ン タ フ ェ ースの指定 方法 EAServer は、 すべての コ ン ポーネ ン ト イ ン タ フ ェ ー ス を CORBA 2.0 イ ン タ フ ェ ース定義言語(IDL: Interface Definition Language)モジ ュ ー ルに格納 し ます。 IDL は、 オブジ ェ ク ト マネジ メ ン ト グループに よ っ て、 コ ン ポーネ ン ト イ ン タ フ ェ ース を定義す る ための標準言語 と し て 定義 さ れてい ます。PowerBuilder カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト を EAServer コ ン ポーネ ン ト と し て配布す る と 、 そのオブジ ェ ク ト に定 義 さ れた メ ソ ッ ド (関数 と イ ベン ト ) と イ ン ス タ ン ス変数が コ ン ポー ネ ン ト イ ン タ フ ェース に追加 さ れ ます。EAServer コ ン ポーネ ン ト ジ ェ ネ レー タ がユーザにかわ っ て IDL を記述す る ため、 イ ン タ フ ェース の ために IDL を記述す る 必要はあ り ません。 イ ン タ フ ェ ースに組み 込まれる もの EAServer コ ン ポーネ ン ト ジ ェ ネ レー タ は、 ユーザ オブジ ェ ク ト に宣 言 さ れたすべて のパブ リ ッ ク 関数 を コ ン ポーネ ン ト イ ン タ フ ェ ー ス に組み込み ます。 さ ら に、 コ ン ポーネ ン ト に指定 し た構築オプシ ョ ン に応 じ て、ジ ェ ネ レー タ はパブ リ ッ ク イ ン ス タ ン ス変数のア ク セサ メ ソ ッ ド を組み込み、 ユーザ イ ベン ト を メ ソ ッ ド と し てエ ク ス ポーズで き ます。 500 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 メ ソ ッ ド名と メ ソ ッ ド の多重定義 IDL は メ ソ ッ ド の多重定義を サポー ト し てい ま せん。 それで も 、 多重 定義 さ れた メ ソ ッ ド を持つ EAServer に対 し て、 PowerBuilder カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト を配布で き ます。IDL の制約を回避す る た め、 多重定義 さ れ る メ ソ ッ ド 名に対 し て、 コ ン ポーネ ン ト ジ ェ ネ レー タ は 2 つのア ン ダース コ ア (__) と 一意の接尾辞を付加 し ます。 し た が っ て、 PowerBuilder オブジ ェ ク ト 用に生成 さ れた IDL を調べてみ る と 、 PowerBuilder で多重定義 さ れた メ ソ ッ ド に接尾辞が付加 さ れてい る こ と がわか り ます。 多重定義 さ れた メ ソ ッ ド を持つ コ ン ポーネ ン ト に ス タ ブ ま たはプ ロ キ シ オブジ ェ ク ト を生成す る と 、 ク ラ イ ア ン ト が正 し い名前を使用 し て メ ソ ッ ド にア ク セ ス で き る よ う に、 EAServer は IDL の接尾辞を取 り 除 き ます。 IDL についての詳細は、 EAServer のマニ ュ アルを参照 し て く だ さ い。 メ ソ ッ ド 名には 2 つの連続 し たア ン ダース コ ア を使用 し ないで く だ さ い EAServer は 2 つのア ン ダース コ ア (__) を予約区切 り 記号 と し て扱 う ため、EAServer コ ン ポーネ ン ト と し て配布す る 予定のカ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト の関数名には、 2 つの連続 し た ア ン ダース コ ア を 使用 し ないで く だ さ い。 デー タ 型 EAServer コ ン ポーネ ン ト と し て配布す る ユーザ オブ ジ ェ ク ト の イ ン タ フ ェ ース では、 以下のデー タ 型を使用で き ます。 • 標準のデー タ 型 (Any デー タ 型を除 く ) • 構造体 • EAServer コ ン ポーネ ン ト と し て配布 さ れた カ ス タ ム ク ラ ス (非ビ ジ ュ アル) ユーザ オブジ ェ ク ト こ れ ら のデー タ 型は、 パブ リ ッ ク イ ン ス タ ン ス 変数に限 ら ず、 パブ リ ッ ク メ ソ ッ ド の戻 り 値 と 引数に も 使用で き ます。 プ ラ イ ベー ト 型 と プ ロ テ ク ト 型の イ ン ス タ ン ス 変数 と メ ソ ッ ド では、 PowerBuilder がサ ポー ト す る すべてのデー タ 型を使用で き ます。 コ ン ポーネ ン ト のパブ リ ッ ク イ ン タ フ ェ ー ス では、 Any 型はサポー ト さ れてい ま せん。 さ ら に、 ResultSet と ResultSets のオブジ ェ ク ト を除 いて、 コ ン ポーネ ン ト イ ン タ フ ェ ース は、 組み込みの PowerBuilder シ ス テ ム オブ ジ ェ ク ト (た と えば、 ト ラ ン ザ ク シ ョ ン オブ ジ ェ ク ト や デー タ ス ト ア オブジ ェ ク ト ) を実装で き ません。 コ ン ポーネ ン ト イ ン タ フ ェ ース に実装で き ない も の と し ては、 それ以外にビ ジ ュ アル オブ ジ ェ ク ト ( ウ ィ ン ド ウ や メ ニ ュ ーな ど) も あ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 501 コ ンポーネ ン ト イ ン タ フ ェ ースの定義 コ ン ポーネ ン ト メ ソ ッ ド は、 標準デー タ 型の配列 と 構造体の配列を渡 し 、 カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト を使用 し て配列を渡せます。 EAServer で 使用 さ れ る デー タ 型 の リ ス ト 、 各デー タ 型 の 対応す る CORBA IDL、 お よ び各デー タ 型がマ ッ ピ ン グ さ れ る PowerBuilder の デー タ 型については、 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ アル ま たは オ ン ラ イ ン ヘルプ を参照 し て く だ さ い。 参照渡 し 引数を参照に よ っ て コ ン ポーネ ン ト メ ソ ッ ド に渡せます。 し か し 、 分 散アプ リ ケーシ ョ ン と 分散モデル以外のアプ リ ケーシ ョ ン では、 動作 がい く ぶん異な り ます。 参照で渡す場合には、 メ ソ ッ ド が実行 さ れ る 前に変数が実際にサーバ に コ ピー さ れ、 その後、 メ ソ ッ ド が実行を完了 し た と き に コ ピー し て 戻 さ れ ます。 通常、 こ の動作はアプ リ ケーシ ョ ンか ら は透過的ですが、 場合に よ っ ては処理結果に影響を与え る こ と も あ り ます。 た と え ば、 x と y の 2 つ の 引数 (い ず れ も 参照渡 し ) を 受 け 取 る 、 increment_values と い う メ ソ ッ ド を定義す る と し ます。次に示す よ う に、 メ ソ ッ ド の ス ク リ プ ト は x と y を イ ン ク リ メ ン ト し ます。 x = x + 1 y = y + 1 ク ラ イ ア ン ト は、 次の コ ー ド を使用 し て メ ソ ッ ド を呼び出 し ます。 int z z = 1 increment_values(z,z) 分散モデル以外のアプ リ ケーシ ョ ン では、 メ ソ ッ ド が実行を完了 し た 後の z の値は 3 と な り ます ( こ れは、 ロ ーカル呼び出 し で z へのポ イ ン タ を渡 し て z を 2 回 イ ン ク リ メ ン ト す る ためです)。分散アプ リ ケー シ ョ ン では、 z の値は 2 と な り ます ( リ モー ト 呼び出 し で z の 2 つの コ ピーを渡 し て、 別々に イ ン ク リ メ ン ト す る ためです)。 読み込み専用値を渡す 読み込み専用の値を渡す と き の動作は、 デー タ を変更で き ない こ と を 除けば、 値渡 し に似てい ます。 デー タ の コ ピーが、 ネ ッ ト ワ ー ク を介 し てサーバに渡 さ れます。 オブ ジ ェ ク ト を渡す EAServer コ ン ポーネ ン ト 内で作成 さ れたオブジ ェ ク ト を ク ラ イ ア ン ト に戻す こ と は可能ですが、 こ の場合は こ れ ら のオブジ ェ ク ト が イ ン ス ト ー ル 済 み の EAServer コ ン ポ ー ネ ン ト で な け れ ば な り ま せ ん。 EAServer コ ン ポーネ ン ト ではない PowerBuilder オブジ ェ ク ト を戻そ う と し た場合は、 実行時エ ラ ーが出力 さ れ ます。 サーバか ら 戻 さ れた コ ン ポーネ ン ト を使用す る には、 ク ラ イ ア ン ト には、 対応す る EAServer プ ロ キ シ (PowerBuilder ク ラ イ ア ン ト の 場 合) ま た は ス タ ブ (非 PowerBuilder ク ラ イ ア ン ト の場合) が必要です。 502 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 ク ラ イ ア ン ト アプ リ ケーシ ョ ンは、 PowerBuilder オブジ ェ ク ト 参照を EAServer に渡せません。 し たが っ て、 PowerBuilder オブジ ェ ク ト 参照 を使用 し て も 、 サーバか ら PowerBuilder ク ラ イ ア ン ト への メ ッ セージ のプ ッ シ ュ は実行で き ません。し か し 、ク ラ イ ア ン ト 上の共有オブジ ェ ク ト を使用 し て EAServer と 通信す る こ と に よ っ て、 こ の動作を シ ミ ュ レー ト す る こ と は可能です。 サーバ プ ッ シ ュ を シ ミ ュ レー ト す る には、 ク ラ イ ア ン ト は、 SharedObjectRegister 関数 と SharedObjectGet 関数を使用 し て、 共有オブ ジ ェ ク ト を作成 し ます。 オブジ ェ ク ト が作成 さ れ る と 、 ク ラ イ ア ン ト か ら 共有オブジ ェ ク ト に メ ソ ッ ド を ポ ス ト し て、 サーバ上で処理終了 時に通知 し なければな ら ない コ ールバ ッ ク オブジ ェ ク ト を渡せます。 共有オブジ ェ ク ト の メ ソ ッ ド は、 処理を行 う EAServer コ ン ポーネ ン ト メ ソ ッ ド の同期呼び出 し を行い ます。 共有オブジ ェ ク ト は ク ラ イ ア ン ト 上の独立 し た ス レ ッ ド で動作 し てい る ため、 サーバ上でプ ロ セ ス を実行 し なが ら 、 ク ラ イ ア ン ト アプ リ ケーシ ョ ンがほかの作業を 続行で き ます。 NULL 値のサポー ト PowerBuilder では、 EAServer コ ン ポーネ ン ト の メ ソ ッ ド が NULL 値を 関数引数 と し て受け取 る か、 戻 り 値の型 と し て受け取 る か を指定で き ます。 コ ン ポーネ ン ト イ ン タ フ ェ ース で NULL 値を サポー ト す る には、 EAServer コ ン ポーネ ン ト の生成に使用 さ れた プ ロ ジ ェ ク ト のプ ロ パ テ ィ シー ト で、 [NULL 値を サポー ト ] チ ェ ッ ク ボ ッ ク ス を オ ン に し ま す。 こ のボ ッ ク ス がオ フ で あ る 場合には、 ク ラ イ ア ン ト は ど の引数に も NULL 値を渡せないため、サーバは、引数に NULL を設定 し た り NULL 値を返せません。 EAServer 検証 EAServer コ ン ポーネ ン ト と し て配布す る 予定のカ ス タ ム ク ラ ス ユー ザ オブジ ェ ク ト を設計 し てい る 場合には、EAServer で無効な コ ー ド 要 素が使用 さ れた と き に、 PowerBuilder で警告 を 出す よ う にで き ま す。 EAServer 検証では、パブ リ ッ ク イ ン ス タ ン ス変数 と パブ リ ッ ク 関数の シ ス テ ム タ イ プ、 ビ ジ ュ アル タ イ プ、 構造体、 お よ び変数をチ ェ ッ ク し ます。 EAServer 検証は、EAServer ウ ィ ザー ド を使用 し てユーザ オブジ ェ ク ト を作成 し た場合には、 デフ ォ ル ト でオ ン にな っ てい ます。 チ ェ ッ ク す る には、 ユーザ オブジ ェ ク ト ペ イ ン タ の [デザ イ ン] メ ニ ュ ーを選択 し 、 [EAServer 検証] がオ ンにな っ てい る こ と を確認 し ます。 オブジ ェ ク ト を保存す る と 、 出力 ウ ィ ン ド ウ に以下の よ う な警告が一覧表示 さ れ ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 503 既存イ ン タ フ ェ ースの実装 ---------- コ ンパイ ラ : 情報 メ ッ セージ 情報 C0197: コ ンポーネ ン ト 検証 警告 C0198: 適切でない Jaguar タ イ プ : 'window' arg type for function: 'of_badfunc' 警告 C0198: 適切でない Jaguar タ イ プ : 'any' return type for function: 'of_badfunc' 検証は、 ユーザ オブジ ェ ク ト ペ イ ン タ ではな く 、 編集中のオブジ ェ ク ト に関連付け ら れ ます。 オブジ ェ ク ト を再び開 く と 、 オブジ ェ ク ト の 検証状態は閉 じ た と き と 同 じ にな り ます。 例外の送出 EAServer に配布す る ユーザ オブジ ェ ク ト の関数で例外を宣言す る と 、 その例外は メ ソ ッ ド のプ ロ ト タ イ プの一部 と し て、CORBA IDL に変換 さ れ ま す。 例外は、 任意の種類の EAServer ク ラ イ ア ン ト アプ リ ケー シ ョ ン ま たは呼び出 し た コ ン ポーネ ン ト で処理で き ます。 詳細につい ては、 39 ページの 「PowerBuilder での例外処理」 を参照 し て く だ さ い。 既存イ ン タ フ ェ ースの実装 新規作成 ダ イ ア ロ グ ボ ッ ク ス の [ タ ーゲ ッ ト ] タ ブ ま たは [PB オブ ジ ェ ク ト ] タ ブの EAServer コ ン ポーネ ン ト ウ ィ ザー ド を使用 し て、既 存 イ ン タ フ ェース の PowerBuilder の実装を作成で き ます。 こ の機能は 一般的には、 Financial Fusion の CORBA IDL テ ン プ レー ト と し て提供 さ れ る 、 オ ン ラ イ ン バ ン キ ン グや証券取引のプ ロ ト コ ルな ど の標準 API の実装を作成す る のに使用 さ れ ます。 イ ン タ フ ェ ースの選択 ウ ィ ザー ド の [ イ ン タ フ ェース実装の指定] ページで [既存の EAServer リ モー ト イ ン タ フ ェ ー ス を 実装す る ] を 選択 し 、 次に、 実装 し た い IDL イ ン タ フ ェ ー ス が保存 さ れて い る サーバの EAServer プ ロ フ ァ イ ルを選択 し ます。 ウ ィ ザー ド でパ ッ ケージの リ ス ト を拡張 し た と き に 表示 さ れ る リ ス ト か ら 、 イ ン タ フ ェース を 1 つだけ選択で き ます。 PowerBuilder コ ン ポーネ ン ト の場合、 普通、 イ ン タ フ ェ ー ス 名は コ ン ポーネ ン ト 名 と 同 じ ですが、 イ ン タ フ ェ ー ス の リ ス ト がその ま ま サー バ上の コ ン ポーネ ン ト の リ ス ト にマ ッ ピ ン グ さ れ る わけではあ り ませ ん。 リ ス ト には、 タ イ プ イ ン タ フ ェ ース のすべての IDL モジ ュ ールが 含まれます。 Jaguar Manager では、 こ れ ら のモジ ュ ールは、 左側のペ イ ンの IDL フ ォ ルダのパ ッ ケージ名を ク リ ッ ク し た と き に右側のペ イ ン に表示 さ れ ます。 504 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 ウ ィ ザー ド のオプ シ ョ ンの設定 実装す る イ ン タ フ ェ ース を選択 し た ら 、 コ ン ポーネ ン ト の EAServer 名 を入力 し ます。PowerBuilder カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト の名 前は変更で き ません。 こ の名前は常に、 リ モー ト イ ン タ フ ェ ース の名 前 と 同 じ にな り す。 新規 イ ン タ フ ェ ー ス作成時の よ う に、 パ ッ ケージ 名、 イ ン ス タ ン ス プー リ ン グ な ど、 そのほか多 く のオプシ ョ ン を設定 で き ます。 標準 API の PowerBuilder の実装を作成 し てい る 場合、 普通は リ モー ト コ ン ポーネ ン ト の コ ン ポーネ ン ト 名を使用 し ますが、 同 じ パ ッ ケージ 名を使用 し てはいけ ません。 リ モー ト コ ン ポーネ ン ト の イ ン タ フ ェ ース は変更で き ないため、 引数 に NULL 値を サポー ト す る な ど、 メ ソ ッ ド のシ グ ネチ ャ が変更 さ れて し ま う よ う なオプシ ョ ンは、 ウ ィ ザー ド では設定で き ません。 ペ イ ン タ でのユーザ オブ ジ ェ ク ト の編集 ウ ィ ザー ド で作成 し た カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト では、 リ モー ト イ ン タ フ ェ ー ス のパブ リ ッ ク 属性はパブ リ ッ ク イ ン ス タ ン ス 変数 と し て表 さ れ、 パブ リ ッ ク メ ソ ッ ド はパブ リ ッ ク 関数 と し て表 さ れ ます。 関数の ス ク リ プ ト には、 コ ンパ イ ル エ ラ ーが発生 し ない よ う に return ス テー ト メ ン ト が格納 さ れてい ますが、 それぞれの関数を実 装す る ス ク リ プ ト を提供す る 必要があ り ます。 リ モー ト イ ン タ フ ェ ー ス にほかに も 依存す る 要素 (構造体な ど) が含 ま れてい る 場合、 ウ ィ ザー ド はユーザ オブジ ェ ク ト と 同 じ PBL でそれ ら を作成 し ます。 ユーザ オブジ ェ ク ト は、 ほかのカ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト と 同様に編集で き ます。ユーザ オブジ ェ ク ト ペ イ ン タ で制約を適用 さ れ る こ と はあ り ません。 ただ し 、 イ ン タ フ ェ ース に影響す る よ う な変 更を行っ てはいけ ません。 既存 イ ン タ フ ェ ース の属性 と メ ソ ッ ド に対 応す る イ ン ス タ ン ス変数や関数を削除 し た り 、 そのモー ド をパブ リ ッ ク か ら プ ラ イ ベー ト やプ ロ テ ク ト に変更 し な い で く だ さ い。 関数は オーバー ロ ー ド で き ま せん。 ま た、 戻 り 値か引数には NULL 値を使用 で き ません。 EAServer への コ ン ポーネ ン ト の配布 ウ ィ ザー ド に よ っ て作成 さ れたプ ロ ジ ェ ク ト には、 ウ ィ ザー ド が コ ン ポーネ ン ト を構築 し た イ ン タ フ ェ ー ス に関す る 情報が格納 さ れてい ま す。 プ ロ ジ ェ ク ト を実行す る と 、 PowerBuilder は次の こ と を チ ェ ッ ク し ます。 • 既存 IDL イ ン タ フ ェ ース のすべてのパブ リ ッ ク 属性 と メ ソ ッ ド が、 ユーザ オブジ ェ ク ト のパブ リ ッ ク イ ン ス タ ン ス変数や関数 と し て定義 さ れてい る • IDL イ ン タ フ ェ ース で定義 さ れた メ ソ ッ ド が、 ユーザ オブジ ェ ク ト でオーバー ロ ー ド さ れていない ア プ リ ケーシ ョ ン テ ク ニ ッ ク 505 別のサーバ コ ンポーネ ン ト の メ ソ ッ ド の呼び出 し こ れ ら のチ ェ ッ ク のいずれかが失敗 し た場合、 コ ン ポーネ ン ト は配布 さ れ ますが、 プ ロ ジ ェ ク ト ペ イ ン タ と 出力 ウ ィ ン ド ウ に警告が表示 さ れます。 異な る プ ロ ジ ェ ク ト の 使い方 こ れ ら のチ ェ ッ ク は、 コ ン ポーネ ン ト 作成時に作成 さ れたプ ロ ジ ェ ク ト を使用 し て コ ン ポーネ ン ト が配布 さ れた場合のみ実行 さ れ ます。 新 し いプ ロ ジ ェ ク ト を作成 し た り 、 別のプ ロ ジ ェ ク ト に コ ン ポーネ ン ト を追加 し た場合は、 プ ロ ジ ェ ク ト 実行時にはチ ェ ッ ク は実行 さ れ ませ ん。 コ ン ポーネ ン ト と 一緒に作成 さ れたプ ロ ジ ェ ク ト を使用 し て配布す る と 、 新規の実装は常にサーバ上の既存の IDL を使用 し ます。 別のプ ロ ジ ェ ク ト を使用す る 場合は、 コ ン ポーネ ン ト を オ リ ジナル パ ッ ケージ に配布 し て、 イ ン タ フ ェース の変更に関す る 警告な し に既存 IDL を上 書 き す る こ と があ る ため、 注意が必要です。 プ ロキシの生成 既存 イ ン タ フ ェ ー ス を 実装す る オ ブ ジ ェ ク ト の プ ロ キ シ を 生成 し 、 サーバの既存 IDL を使用す る と き は、 プ ロ キ シは既存 IDL に基づ き ま す。 結果 と し て、 [EAServer パ ッ ケージ名を オブ ジ ェ ク ト 名の前に追 加] オプシ ョ ン を選択す る と 、 オブジ ェ ク ト 名に付 く 名前は、 新 し い パ ッ ケージの名前ではな く IDL モジ ュ ールの名前にな り ます。 別のサーバ コ ンポーネ ン ト の メ ソ ッ ド の呼び出 し EAServer では、 サーバ コ ン ポーネ ン ト の メ ソ ッ ド を 使 っ て、 ほかの サーバ コ ン ポーネ ン ト の メ ソ ッ ド を呼び出せます。 呼び出 さ れ る 側の サーバ コ ン ポーネ ン ト は、 PowerBuilder コ ン ポーネ ン ト であ る 必要は な く 、 EAServer に よ っ て サ ポー ト さ れ る 言語で実装 さ れて い る コ ン ポーネ ン ト で も か ま い ません。 現行のサーバの コ ン ポーネ ン ト にア ク セス 506 現行のサーバに あ る 別の EAServer コ ン ポーネ ン ト の メ ソ ッ ド に ア ク セ ス す る には、 PowerBuilder ク ラ イ ア ン ト の場合 と 同 じ よ う に、 接続 オ ブ ジ ェ ク ト を 使用 し て コ ン ポ ー ネ ン ト と 通信 し ま す。 あ る い は、 PowerBuilder が提供す る 、 TransactionServer と い う ト ラ ンザ ク シ ョ ン サービ ス コ ン テ キ ス ト オブジ ェ ク ト を使用 し ま す。 TransactionServer イ ン タ フ ェ ー ス が提供す る CreateInstance と い う メ ソ ッ ド を 使用すれ ば、 ロ ーカ ルで使用す る ほかの コ ン ポーネ ン ト に ア ク セ ス で き ま す。 CreateInstance は、 呼び出 し 元の コ ン ポーネ ン ト に適用 さ れ る も の と 同 じ ユーザ情報 と パ ス ワー ド 情報を使用 し ます。 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 ト ラ ンザ ク シ ョ ン コ ン テ キ ス ト サービ ス を使用す る には、 TransactionServer 型の変数を宣言 し 、 GetContextService 関数を呼び出 し てか ら 、 ト ラ ン ザク ショ ン コ ン テキ ス ト サービ ス のイ ン ス タ ン ス を 作 成 し ます。 コ ン ポーネ ン ト の Activate イ ベ ン ト で GetContextService を 呼び出 し て、 TransactionServer サービ ス を イ ン ス タ ン ス化で き ます。 例 // イ ン ス タ ン ス変数 : // TransactionServer ts Integer rc rc = this.GetContextService("TransactionServer", & ts) IF rc <> 1 THEN // エ ラ ー処理 END IF いずれかの コ ン ポーネ ン ト メ ソ ッ ド か ら 、 CreateInstance を呼び出 し て 2 番目の コ ン ポーネ ン ト を イ ン ス タ ン ス 化 し 、 その メ ソ ッ ド の 1 つを 呼び出せます。 // 2 番目のコ ンポーネ ン ト のイ ン ス タ ン ス変数 : // nvo_comp2 mycomp2 Integer rc rc = ts.CreateInstance(mycomp2, "mypackage/nvo_comp2") IF rc <> 0 THEN // エ ラ ー処理 ELSE mycomp2.method1() END IF ほかのサーバ内にある コ ンポーネ ン ト へのア ク セス ほ か の サ ー バ の サ ー バ コ ン ポ ー ネ ン ト に ア ク セ ス す る 手 順 は、 PowerBuilder ク ラ イ ア ン ト か ら サーバ コ ン ポーネ ン ト にア ク セ スす る 手順 と 基本的に同 じ です。ほかのサーバの EAServer コ ン ポーネ ン ト に ア ク セ スす る には、 接続オブジ ェ ク ト を作成 し 、 接続オブジ ェ ク ト の プ ロ パテ ィ を設定 し 、 ConnectToServer を呼び出 し ます。 EJB コ ンポーネ ン ト へのア ク セス PowerBuilder コ ンポーネント は、接続オブジェ ク ト ま たは TransactionServer オブジ ェ ク ト のいずれかの Lookup メ ソ ッ ド を使用 し て、 EJB コ ン ポー ネ ン ト に ア ク セ ス で き ま す。 TransactionServer オブ ジ ェ ク ト の Lookup メ ソ ッ ド には、 オプシ ョ ン と し て、 ホーム イ ン タ フ ェ ース の名前を指 定す る ための第 3 引数があ り ます。 こ の引数は、 ホーム イ ン タ フ ェ ー ス名が一般的な命名規約に従わない場合のみ使用 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 507 別のサーバ コ ンポーネ ン ト の メ ソ ッ ド の呼び出 し こ の ス ク リ プ ト は、 Cart コ ン ポーネ ン ト を イ ン ス タ ン ス 化 し 、 い く つかの コ ン ポーネ ン ト メ ソ ッ ド を呼び出 し ます。次の例では、Lookup メ ソ ッ ド の第 2 引数に、 コ ン ポーネ ン ト 名 と EAServer パ ッ ケージ名を 指定 し てい ます。 例 // イ ン ス タ ン ス変数 : //Connection myconnect CartHome MyCartHome // EJB のホーム イ ン タ フ ェ ース Cart MyShoppingCart // EJB の リ モー ト イ ン タ フ ェ ース TransactionServer ts long ll_result This.GetContextService("TransactionServer", ts) // ホーム イ ン タ フ ェ ース を取得 ll_result = & ts.Lookup(MyCartHome, "Shopping/Cart") // Cart コ ンポーネ ン ト のビ ジネス ロ ジ ッ クへの参照を取得 MyShoppingCart = MyCartHome.Create() // シ ョ ッ ピ ン グ カ ー ト を使用 MyShoppingCart.AddItem(66) MyShoppingCart.Purchase() PowerBuilder ク ラ イ ア ン ト か ら EJB コ ン ポーネ ン ト へのア ク セ ス につ いては、 538 ページの 「EJB コ ン ポーネ ン ト メ ソ ッ ド の呼び出 し 」 を 参照 し て く だ さ い。 コ ンポーネ ン ト を区別 する ト ラ ンザ ク シ ョ ン [OTS ス タ イ ル] と し て マ ー ク さ れ た EAServer コ ン ポ ー ネ ン ト は、 CORBACurrent コ ン テ キ ス ト サー ビ ス オブ ジ ェ ク ト の関数 を 使用 し て、 EAServer ト ラ ンザ ク シ ョ ンに関す る 情報の作成、 制御、 お よ び取 得が行え ます。 CORBACurrent オブジ ェ ク ト は、 CORBACurrent イ ン タ フ ェ ース用に定義 さ れた数多 く の メ ソ ッ ド を備え てい ます。 詳細については、 548 ページの 「 ク ラ イ ア ン ト と コ ン ポーネ ン ト を区 別す る ト ラ ンザ ク シ ョ ン」 を参照 し て く だ さ い。 508 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 コ ンポーネ ン ト プ ロパテ ィ へのア ク セス ContextKeyword サー ビ ス オブ ジ ェ ク ト ContextKeyword サービ ス オブジ ェ ク ト を使用 し て、 コ ン ポーネ ン ト の プ ロ パ テ ィ 値 を 取 得 で き ま す。 プ ロ パ テ ィ 値 を 取 り 出 す に は、 GetContextKeywords 関数を呼び出 し ます。 ContextKeyword サービ ス オブジェ ク ト を使用する には、 GetContextService 関数 を 呼び出 し 、 サー ビ ス 名 と し て Keyword を 使用 し て か ら 、 オブ ジ ェ ク ト への参照を作成 し ます。 PowerBuilder の EAServer プ ロパテ ィ 次の表に、 EAServer コ ン ポーネ ン ト と し て動作す る PowerBuilder カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト に関係す る コ ン ポーネ ン ト プ ロ パ テ ィ を示 し ます。 コ ン ポーネ ン ト プ ロ パテ ィ の前には、 文字列 com.sybase.jaguar.component が付け ら れます。 Jaguar Manager の コ ン ポーネ ン ト のプ ロ パテ ィ ダ イ ア ロ グボ ッ ク ス の [すべてのプ ロ パ テ ィ ] タ ブには、 すべての コ ン ポーネ ン ト プ ロ パテ ィ の値が表示 さ れ ます。 表 23-7 に示す よ う に、 い く つかのプ ロ パテ ィ は、 こ のダ イ ア ロ グボ ッ ク ス のほかの タ ブの項目に も マ ッ プ さ れます。 表 23-7: PowerBuilder コ ンポーネ ン ト の EAServer コ ンポーネ ン ト プ ロパ ティ プ ロパテ ィ auto.failover 説明 サーバが使用で き な く な っ た と き に コ ン ポーネ ン ト を代替サーバ に転送す る ための ク ラ イ ア ン ト プ ロ キ シ を有効にす る こ のプ ロ パテ ィ は、 [自動的なデマケーシ ョ ン / 不活性化] が有効 でなければ有効にで き ない bind.thread code.set 表示位置 ト ラ ンザ ク シ ョ ン (自動フ ェー ルオーバ) 自動フ ェ イ ルオーバーでは、 冗長サーバでア プ リ ケーシ ョ ン の コ ン ポーネ ン ト を実行で き る よ う に、 アプ リ ケーシ ョ ン がサーバの ク ラ ス タ を 使用す る 必要が あ る 。 ク ラ ス タ は最低 1 つの ネー ム サーバを含み、 ク ラ イ ア ン ト はネー ミ ン グ サービ ス を使用 し てプ ロ キ シ参照を解決 し なければな ら ない。詳細については、『EAServer シ ス テ ム 管理者ガ イ ド 』 マ ニ ュ ア ルの 「 ロ ー ド ・ バ ラ ン シ ン グ、 フ ェ イ ルオーバ、 お よ びコ ン ポーネ ン ト の可用性」 を参照 作成す る ス レ ッ ド 上で コ ン ポーネ ン ト イ ン ス タ ン ス を常に起動 さ イ ン ス タ ン ス せ る か ど う か を指示する (ス レ ッ ド のバ 有効な値は TRUE と FALSE であ る 。 ラ イ ブ編集の場合には、 こ の イ ン ド ) プ ロ パテ ィ を TRUE に設定 し なければな ら ないが、それ以外の場合 は、 ス ケー ラ ビ リ テ ィ を向上 さ せ る ために FALSE に設定す る 必要 があ る コ ン ポーネ ン ト が使用する コ ー ド 化文字セ ッ ト の名前を指定する デフ ォ ル ト では、 コ ン ポーネ ン ト はサーバの コ ー ド 化文字セ ッ ト (サーバのプ ロ パテ ィ ウ ィ ン ド ウ の [一般] タ ブで指定) を使用す る 。ヨ ー ロ ッ パ言語ま たはア ジ ア言語では、こ のプ ロ パテ ィ を iso_1 ま たは big5 な ど の値に設定 し なければな ら ない場合があ る ア プ リ ケーシ ョ ン テ ク ニ ッ ク すべてのプ ロ パ ティ 509 コ ンポーネ ン ト プ ロパテ ィ へのア ク セス プ ロパテ ィ interfaces minpool maxpool name pb.appname pb.class pb.cookie debug pb.librarylist pb.live_edit pb.trace pb.version 510 説明 コ ン ポーネ ン ト が実装す る イ ン タ フ ェース を識別する 表示位置 すべてのプ ロ パ こ れは、 IDL イ ン タ フ ェ ース名を カ ン マで区切っ た リ ス ト であ り 、 テ ィ それぞれの イ ン タ フ ェース名は module::interface と い う 書式 と なる イ ン ス タ ン ス プー リ ン グが有効の と き は、 プールで き る イ ン ス タ リ ソ ース ン ス の最少数を指定す る プールか ら 休止中の イ ン ス タ ン ス を解放す る ため、 EAServer には 定期的に実行 さ れ る ガベージ コ レ ク タ ス レ ッ ド が あ る 。 こ の ス レ ッ ド が実行 さ れ る たびに、 ガベージ コ レ ク タ は、 休止中の イ ン ス タ ン ス を 1 つプールか ら 削除す る 。 ただ し 、 プールが最小サ イ ズに到達 し た と き は削除 さ れない。 デフ ォ ル ト は 0 イ ン ス タ ン ス プー リ ン グが有効の と き に、 プールで き る イ ン ス タ ン ス の最大数を指定す る リ ソ ース プール サ イ ズの最大値に到達 し た場合、 EAServer は非ア ク テ ィ ブ 化後に過剰 イ ン ス タ ン ス を破棄す る 。デフ ォ ル ト は 0 で、最大プー ル サ イ ズが有効でない こ と を意味す る コ ン ポーネ ン ト の名前を指定す る 一般 (コ ン ポー ネ ン ト 部のみ) こ の値の書式は package/component でなければな ら ない PowerBuilder アプ リ ケーシ ョ ンの名前を指定す る 一般 PowerBuilder カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト の名前を指定す 一般 る すべてのプ ロ パ ラ イ ブ ラ リ リ ス ト のパス の作成に使用す る 数を提供す る ティ パ ス の書式は次の と お り Repository¥Component¥package¥component¥Ccookie PowerBuilder デバ ッ ガで コ ン ポーネ ン ト をデバ ッ グ で き る か ど う かを示す PowerBuilder ラ イ ブ ラ リ リ ス ト を指定す る すべてのプ ロ パ ティ 一般 ラ イ ブ ラ リ 名の前に円記号 (¥) が付いてい る 場合は、 その位置は EAServer Repository デ ィ レ ク ト リ か ら の相対指定で あ る と みな さ れ る 。 ラ イ ブ ラ リ 名の前に円記号が付いていない場合は、 その名 前は絶対パ ス を指定す る と みな さ れ る プ ロ ジ ェ ク ト ペ イ ン タ ではな く 、ユーザ オブジ ェ ク ト ペ イ ン タ で プ ロ ジ ェ ク ト を構築で き る か ど う かを指定す る すべてのプ ロ パ ティ 514 ページの 「 ラ イ ブ編集」 を参照 コ ン ポーネ ン ト に対す る ロ グ収集動作の ト レース オプシ ョ ン を指 すべてのプ ロ パ 定す る (現在無効) ティ コ ン ポーネ ン ト が作成 さ れた PowerBuilder のバージ ョ ン を指定す すべてのプ ロ パ る ティ PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 プ ロパテ ィ pooling 説明 コ ン ポーネ ン ト がプール さ れてい る か ど う か を示す 表示位置 インスタンス pooling プ ロ パテ ィ に TRUE が設定 さ れた場合は、 コ ン ポーネ ン ト は常にプール さ れ、CanBePooled イ ベン ト は発生 し ない。pooling プ ロ パテ ィ に FALSE が設定 さ れた場合は、 CanBePooled イ ベン ト が 発生す る ため、 プー リ ン グの拒否を選択で き る sharing tx_vote プ ロ パテ ィ に FALSE が設定 さ れた場合は、 各 メ ソ ッ ド の後 で コ ン ポーネ ン ト がプール さ れ る 。 それ以外の場合は、 ト ラ ン ザ ク シ ョ ンの最後にプール さ れ る 共有 コ ン ポーネ ン ト であ る か ど う か を示す インスタンス sharing プ ロ パテ ィ に TRUE が設定 さ れた場合は、 すべての ク ラ イ ア ン ト が 1 つの コ ン ポーネ ン ト イ ン ス タ ン ス を共有す る 。 共有 コ ン ポーネ ン ト にプー リ ン グ オプシ ョ ンは適用 さ れない 共有 コ ン ポーネ ン ト をサービ ス にする には、 com.EAServer.server.services プ ロ パテ ィ 用に指定 し たサービ ス の リ ス ト に共有 コ ン ポーネ ン ト を追加する state state.gs 自動的な永続格納を使用する と き に、 IDL 型の名前を指定する 永続性 PowerBuilder では、 名前の付いてい る 型はユーザ定義の構造体で、 永続す る すべてのデー タ を カプセル化 し なければな ら ない。 [永続 性] タ ブ ページ で [自動永続状態] を 選択 し 、 [状態] テ キ ス ト ボ ッ ク ス に構造体の名前を入力 し て [OK] を ク リ ッ ク す る と 、ペー ジ上にあ る ほかのプ ロ パテ ィ がデ フ ォ ル ト 値に設定 さ れ る 。 自動 的な永続格納 を使用す る 場合、 PowerBuilder コ ン ポーネ ン ト の ス テー ト フル フ ェ イ ルオーバーがサポー ト さ れ る 。詳細については、 『EAServer プ ロ グ ラ マーズ ・ ガ イ ド 』 マニ ュ アルの 「 コ ン ポーネ ン ト の永続状態の管理」 の章を参照 state デー タ 型を取得 し 設定す る state 構造体の メ ソ ッ ド 名で、 2 項 永続性 (State メ 目のカ ン マ区切 り の リ ス ト と し て指定 さ れ る ソ ッ ド) デフ ォ ル ト は getState、 setState stateless EJB セ ッ シ ョ ン Beans と 、 コ ン ト ロ ール イ ン タ フ ェース CtsComponents::ObjectControl を使用する 非 EJB コ ン ポーネ ン ト の みに適用 さ れ る インスタンス こ のプ ロ パテ ィ を設定する と 、 tx_vote プ ロ パテ ィ を FALSE に設定 す る の と 同 じ 結果にな る が、activate イ ベン ト と deactivate イ ベン ト も 無効にな る 。 コ ン ポーネ ン ト を ス テー ト レ ス に指定す る 場合は、 こ のプ ロ パテ ィ を設定 し ない こ と 。 かわ り に、 pooling を TRUE に、 tx_vote を FALSE に設定す る ア プ リ ケーシ ョ ン テ ク ニ ッ ク 511 コ ンポーネ ン ト プ ロパテ ィ へのア ク セス プ ロパテ ィ storage 説明 表示位置 リ モー ト デー タ ベース サーバか ら コ ン ポーネ ン ト の状態情報を読 永続性 (ス ト み書 き す る コ ン ポーネ ン ト の名前を指定す る レージ ・ コ ン ポーネ ン ト、 接 自動的な永続格納を使用す る と き 、 ま たは EAServer の組み込み格 続キ ャ ッ シ ュ、 納 コ ン ポーネ ン ト に実装を任せて コ ン ポーネ ン ト 管理に よ る 永続 テーブル) 性使用す る と き に必要 と な る 。 デフ ォ ル ト は CtsComponents/JdbcStorage thread.safe timeout tx_outcome ま た、 格納 コ ン ポーネ ン ト が使用す る 接続キ ャ ッ シ ュ と テーブル を指定す る 複数の呼び出 し を同時に処理で き る か ど う かを示す 詳細については、 471 ページの 「Concurrency プ ロ パテ ィ 」 を参照 メ ソ ッ ド 呼び出 し の後、 次の メ ソ ッ ド 呼び出 し ま での間に、 ア ク テ ィ ブな コ ン ポーネ ン ト イ ン ス タ ン ス が自動的に非ア ク テ ィ ブに さ れずにア イ ド ル状態でい ら れ る 時間を指定する ト ラ ンザ ク シ ョ ンが ロ ールバ ッ ク さ れた と き に、 CORBA::TRANSACTION_ROLLEDBACK 例外を ク ラ イ ア ン ト に送 出す る か ど う かを決定す る インスタンス (同時実効性) リ ソ ース ( イ ン スタンス ・ タ イ ムアウ ト ) すべてのプ ロ パ ティ 以下の設定を使用で き る • always デフ ォ ル ト 。 ト ラ ンザ ク シ ョ ン が ロ ール バ ッ ク さ れ る と 、 サーバか ら ク ラ イ ア ン ト に例外が送出 さ れ る • failed ト ラ ンザ ク シ ョ ンが ロ ール バ ッ ク さ れて も 、 ク ラ イ ア ン ト に 例 外 が 送 出 さ れ な い。 こ の 設 定 を 使 用 す る 場 合、 RollbackWork ト ラ ンザ ク シ ョ ン プ リ ミ テ ィ ブ を呼び出 し た後で 説明 メ ッ セージ付 き の別の例外を発生す る よ う に、 コ ン ポーネ ン ト を コ ーデ ィ ン グで き る failed 設定を有効に し て も 、 コ ン ポーネ ン ト の リ ク エ ス ト に よ る ト ラ ンザ ク シ ョ ン を コ ミ ッ ト で き ない場合は、CORBA シ ス テ ム例外 が送出 さ れ る こ と があ る tx_timeout ロ ールバ ッ ク さ れた ト ラ ン ザ ク シ ョ ン の例外を ク ラ イ ア ン ト に送 り た く ない場合や、 別の例外を送出す る 必要が あ る 場合、 こ のプ ロ パテ ィ を failed に設定で き る 。 こ の設定は、 ト ラ ンザ ク シ ョ ンが ロ ールバ ッ ク さ れた後で、 ク ラ イ ア ン ト が出力パ ラ メ ー タ を得 ら れ る よ う にす る 必要の あ る 場合に役立つ。 例外が送出 さ れ る 場合 は、 出力パ ラ メ ー タ を使用で き ない EAServer ト ラ ンザ ク シ ョ ンの最大継続時間を指定する 各 メ ソ ッ ド が復帰 し た後で タ イ ム ア ウ ト がチ ェ ッ ク さ れ る 512 リ ソ ース ( ト ラ ンザ ク シ ョ ン ・ タ イ ムアウ ト ) PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 プ ロパテ ィ tx_type 説明 表示位置 EAServer ト ラ ンザ ク シ ョ ンに対する コ ン ポーネ ン ト の関与を示す ト ラ ンザ ク シ ョ ン 有効な値は、 以下の と お り • not_supported • supports • requires • requires_new • mandatory • user-managed • never tx_vote type ト ラ ンザ ク シ ョ ン ([自動分離 / 非ア ク テ ィ ブ tx_vote に TRUE が設定 さ れた場合は、 コ ン ポーネ ン ト は、 化] チ ェ ッ ク TransactionServer サービ ス オブジ ェ ク ト の メ ソ ッ ド を明示的に呼 ボ ッ ク ス がオン び出す こ と に よ っ て、 ト ラ ンザ ク シ ョ ン状態 と コ ン ポーネ ン ト の であ る 場合は、 非ア ク テ ィ ブ化を制御する 必要があ る こ のプ ロ パテ ィ tx_vote に FALSE が設定 さ れた場合は、各 メ ソ ッ ド 呼び出 し の後で、 の値は FALSE) EAServer は コ ン ポ ー ネ ン ト を 自動的 に 非 ア ク テ ィ ブ に す る 。 SetComplete はデフ ォ ル ト で呼び出 さ れ る ため、SetComplete を明示 的に呼び出 し て非ア ク テ ィ ブにする 必要はない。 SetAbort を呼び出 せば、 デフ ォ ル ト 状態に上書き で き る コ ン ポーネ ン ト の タ イ プ を指定する 一般 コ ン ポーネ ン ト で自動的なデマケーシ ョ ン /不活性化をサポー ト す る か ど う か を示す EAServer は PowerBuilder オブジェ ク ト のプロ パティ を pb に設定する ア プ リ ケーシ ョ ン テ ク ニ ッ ク 513 コ ンポーネ ン ト のテ ス ト と デバ ッ グ コ ンポーネ ン ト のテ ス ト と デバ ッ グ こ の節では、 コ ン ポーネ ン ト を テ ス ト す る ための 3 つの方法について 説明 し ます。 • ラ イ ブ編集 • リ モー ト デバ ッ グ • EAServer ロ グへの メ ッ セージ出力 EAServer コ ンポーネ ン ト の ト ラ ブルシ ュ ーテ ィ ング コ ン ポーネ ン ト の ト ラ ブルシ ュ ーテ ィ ン グについての詳細は、 EAServer の 『 ト ラ ブルシ ュ ーテ ィ ン グ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 ラ イ ブ 編集 コ ン ポーネ ン ト を テ ス ト ま たはデバ ッ グす る には、 ラ イ ブ編集 と い う PowerBuilder の機能を利用すれば、 ユーザ オブジ ェ ク ト ペ イ ン タ でプ ロ ジ ェ ク ト を自動的に作成で き ます。 ラ イ ブ編集が有効で あれば、 対 応 す る ユ ー ザ オ ブ ジ ェ ク ト を 保 存 す る た び に、 PowerBuilder は EAServer コ ン ポーネ ン ト のプ ロ ジ ェ ク ト を作成 し ます。 ジ ェ ネ レー タ は、 EAServer に PBD を配布 し ないかわ り に、 必要なオブジ ェ ク ト 定義 を含む PBL へのア ク セ ス方法を EAServer に指示 し ます。 サービ ス コ ンポーネ ン ト ラ イ ブ編集を利用 し て も 、 サービ ス コ ン ポーネ ン ト と し てセ ッ ト ア ッ プ し た コ ン ポーネ ン ト はテ ス ト で き ません。 サービ ス コ ン ポーネ ン ト は、 サーバの稼動中は常に使用 さ れてい る ため、 ユーザ オブジ ェ ク ト ペ イ ン タ で行っ た変更の保存はで き ません。 ラ イ ブ編集を有効にす る方法 ユーザ オブジ ェ ク ト の ラ イ ブ編集を有効にす る には、 次の手順を実行 す る 必要があ り ます。 1 EAServer コ ン ポーネ ン ト を生成 し たいユーザ オブジ ェ ク ト を含む プ ロ ジ ェ ク ト を作成 し ます。 EAServer への配布を可能にす る 既存の PBL を使用 し た り 、 新規プ ロ ジ ェ ク ト を作成 し てテ ス ト 用に使用 し た り で き ます。 2 514 必要に応 じ て、 プ ロ ジ ェ ク ト の ラ イ ブ編集 ラ イ ブ ラ リ リ ス ト を修 正 し ます。 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 リ モー ト マシ ン上にあ る サーバで コ ン ポーネ ン ト を テ ス ト し てい る 場合には、 PBL の位置を EAServer に通知す る 必要があ り ます。 こ のためには、 プ ロ ジ ェ ク ト ペ イ ン タ で、 コ ン ポーネ ン ト のプ ロ パテ ィ シー ト にあ る [高度なオプシ ョ ン] ページ (下図参照) の ラ イ ブ ラ リ リ ス ト を修正 し ます。 こ こ で指定す る ラ イ ブ ラ リ リ ス ト は、 Universal Naming Convention (UNC) 名を使用す る 、 絶対パ ス 名を含んでい る 必要があ り ます。 UNC 名の書式は ¥¥servername¥sharename¥path¥file です。 デフ ォ ル ト では、ラ イ ブ編集 ラ イ ブ ラ リ リ ス ト は、アプ リ ケーシ ョ ン ラ イ ブ ラ リ リ ス ト に基づい て い ま す。 使用 し て い る サーバが ロ ーカルであ る 場合には、 ラ イ ブ編集 ラ イ ブ ラ リ リ ス ト を修正す る 必要はあ り ません。 3 ユーザ オブジ ェ ク ト ペ イ ン タ で、 コ ン ポーネ ン ト の生成に使用す る プ ロ ジ ェ ク ト を指定 し ます。 プ ロ ジ ェ ク ト 名は、 [EAServer プ ロ ジ ェ ク ト ] フ ィ ール ド に入力 し ます。 こ の フ ィ ール ド は、 ユーザ オブジ ェ ク ト プ ロ パテ ィ シー ト の [全般] プ ロ パテ ィ ページ (下図参照) にあ り ます。 指定す る プ ロ ジ ェ ク ト 名は、 以下の要件を満たす必要があ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク • EAServer コ ン ポーネ ン ト プ ロ ジ ェ ク ト であ る こ と • ユーザ オブジ ェ ク ト ペ イ ン タ で現在開いてい る ユーザ オブ ジ ェ ク ト を含んでい る こ と • プ ロ ジ ェ ク ト の ラ イ ブ ラ リ リ ス ト は、 現行のアプ リ ケーシ ョ ン ラ イ ブ ラ リ リ ス ト と 一致す る こ と 515 コ ンポーネ ン ト のテ ス ト と デバ ッ グ コ ンポーネ ン ト の生成 方法 ユーザ オブジ ェ ク ト ペ イ ン タ で EAServer コ ン ポーネ ン ト を生成す る には、 [フ ァ イ ル|上書 き 保存] を選択 し ます。 コ ンポーネ ン ト を生成 する と 何が起き るか ユーザ オブジ ェ ク ト ペ イ ン タ でプ ロ ジ ェ ク ト を作成す る と 、以下の処 理が行われます。 • 保存 し た非ビ ジ ュ アル オブジ ェ ク ト を記述す る CORBA IDL を生 成 こ の IDL は、 さ ら に ス タ ブ と ス ケル ト ン の作成に使用 さ れ ま す。 IDL フ ァ イ ル、 ス タ ブ、 お よ び ス ケル ト ン の名前は、 オブジ ェ ク ト の名前をベース に し てい ます。 コ ン ポーネ ン ト ジ ェ ネ レー タ は、EAServer の イ ン ス ト ール デ ィ レ ク ト リ の Repository サブデ ィ レ ク ト リ に新 し い IDL を格納 し ます。 • EAServer コ ン ポーネ ン ト のプ ロ パテ ィ を記述す る PROPS フ ァ イ ルを生成 PROPS フ ァ イ ルは、EAServer の イ ン ス ト ール デ ィ レ ク ト リ のサブ デ ィ レ ク ト リ に格納 さ れ ま す。 こ のサブデ ィ レ ク ト リ のパ ス は以 下の と お り です。 Repository¥Component¥package-name PowerBuilder は、 配布時 と 同様に コ ン ポーネ ン ト を作成 し ま す。 ただ し 、 コ ン ポーネ ン ト の PBD は生成 さ れ ません。 さ ら に、 コ ン ポーネ ン ト ジ ェ ネ レー タ は、 pb.live_edit プ ロ パテ ィ を TRUE に設定 し 、 ラ イ ブ 編集用に指定 し た ラ イ ブ ラ リ リ ス ト を pb.librarylist プ ロ パテ ィ に割 り 当て ます。 プ ロ ジ ェ ク ト を作成す る と エ ラ ーにな る 場合には、PowerBuilder は、出 力 ウ ィ ン ド ウ にエ ラ ー メ ッ セージ を表示 し ます。 ユーザ オブ ジ ェ ク ト に対す る イ ン ス タ ン ス プー リ ン グ が有効で あ る 場合には、 ジ ェ ネ レー タ は、 現行の構築に対す る プー リ ン グ を無効に し ます。 ユーザ オブジ ェ ク ト を含む PBL が EAServer に よ っ て ロ ッ ク さ れた場合には、 PowerBuilder はユーザ オブジ ェ ク ト を保存で き ない ため、 ラ イ ブ編集ではプー リ ン グはサポー ト さ れてい ません。 516 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 リ モ ート デバッ グ PowerBuilder のカ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト を EAServer コ ン ポーネ ン ト と し て作成 し てい る 場合には、 PowerBuilder デバ ッ ガ を使 用 し て、 EAServer コ ン ポーネ ン ト を デバ ッ グ で き ま す。 ユーザ オブ ジ ェ ク ト ペ イ ン タ の ラ イ ブ編集機能を利用 し て も 、プ ロ ジ ェ ク ト ペ イ ン タ か ら EAServer に コ ン ポーネ ン ト を配布 し て も 、 コ ン ポーネ ン ト を デバ ッ グで き ます。 ラ イ ブ編集についての詳細は、 514 ページの 「 ラ イ ブ編集」 を参照 し て く だ さ い。 コ ンポーネ ン ト をデ バ ッ グする ための準備 デバ ッ ガの起動 リ モー ト コ ン ポーネ ン ト のデバ ッ グ を始め る 前に、 ご使用の構成が以 下の条件を満たすか ど う か をチ ェ ッ ク し て く だ さ い。 • 配布 さ れ る コ ン ポーネ ン ト の開発に使用 し た も の と 同 じ バージ ョ ン のアプ リ ケーシ ョ ン と PBL を使用 し てい る 。 配布 さ れた複数の コ ン ポーネ ン ト を 同 じ セ ッ シ ョ ン 内でデバ ッ グ し た い場合には、 それ ら の コ ン ポーネ ン ト は、 すべて同 じ バージ ョ ン の PBL、 同 じ アプ リ ケーシ ョ ン名、 お よ び同 じ ラ イ ブ ラ リ リ ス ト を使用 し て作 成 さ れた も のでなければな ら ない • プ ロ ジ ェ ク ト ペ イ ン タ の コ ン ポーネ ン ト プ ロ パテ ィ のページで、 [ リ モー ト デバ ッ グ を サポー ト ] チ ェ ッ ク ボ ッ ク ス がオ ンにな っ て い る 。 デバ ッ グ オプ シ ョ ン を 設定す る には、 プ ロ ジ ェ ク ト ウ ィ ザー ド で [ リ モー ト デバ ッ グ を サポー ト ] チ ェ ッ ク ボ ッ ク ス を オ ン にす る 方法 も あ る • 配布 さ れた コ ン ポーネ ン ト に含 ま れ る メ ソ ッ ド と プ ロ パテ ィ を実 行す る ク ラ イ ア ン ト ア プ リ ケーシ ョ ン が あ る 。 こ の ア プ リ ケ ー シ ョ ン と し ては、 互換性の あ る 開発ツールで作成 さ れた コ ン パ イ ル済みの実行フ ァ イ ル、 ま たは別の PowerBuilder セ ッ シ ョ ン で実 行 さ れてい る PowerBuilder アプ リ ケーシ ョ ン で も よ い デバ ッ グ を始め る には、 配布 さ れた コ ン ポーネ ン ト を含む タ ーゲ ッ ト を開 き ます。 ペ イ ン タ バーの [ リ モー ト を開始] ボ タ ン を ク リ ッ ク し 、 ウ ィ ザー ド を完了 し ます。 選択で き る コ ン ポーネ ン ト は、 PowerBuilder で [ リ モー ト デバ ッ グ をサポー ト ] を オ ンに し て生成 さ れた コ ン ポー ネ ン ト だけです。 [ リ モー ト デバ ッ グ を サポー ト ] はセ キ ュ リ テ ィ 設 定の 1 つであ り 、 コ ン ポーネ ン ト にデバ ッ グ情報を追加 し ません。 コ ン ポーネ ン ト を テ ス ト す る と き に [ リ モー ト デバ ッ グ を サポー ト ] を オ ンに し ます。 コ ン ポーネ ン ト を ユーザのサ イ ト に配布す る と き には、 [ リ モー ト デバ ッ グ を サポー ト ] を オ フ に し て、 ユーザに コ ー ド がわ か ら ない よ う に し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 517 コ ンポーネ ン ト のテ ス ト と デバ ッ グ ロ ーカ ル ア プ リ ケーシ ョ ン を デバ ッ グす る と き の よ う にブ レ ー ク ポ イ ン ト を設定 し てか ら 、 リ モー ト コ ン ポーネ ン ト を呼び出す ク ラ イ ア ン ト アプ リ ケーシ ョ ン を起動 し ます (ま だ実行 さ れていない場合)。 ロー カル デバ ッ グ と の違い ロ ーカル ア プ リ ケーシ ョ ン と リ モー ト ア プ リ ケーシ ョ ン のデバ ッ グ には、 2 つの主な違いがあ り ます。 • デバ ッ ガ を起動 し て も 、 デバ ッ ガは最小化 さ れない • 新規 イ ン ス タ ン ス ビ ュ ーには、 デバ ッ グ中の コ ン ポーネ ン ト の各 イ ン ス タ ン ス が表示 さ れ る 。 イ ン ス タ ン ス ご と に、 コ ン ポーネ ン ト 名 と パ ッ ケージ名、 イ ン ス タ ン ス 番号、 お よ びその現在の状態 (ア イ ド ル、 実行中、 ま たは一時停止) が表示 さ れ る 。 複数の イ ン ス タ ン ス があ る 場合には、 現在デバ ッ グ中の イ ン ス タ ン ス が黄色 の矢印で示 さ れ る サポー ト さ れていない機能 Objects In Memory ビ ュ ー、 式の評価、 お よ び変数値の変更はサポー ト さ れてい ません。 状態について イ ン ス タ ン ス ビ ュ ーには、 コ ン ポーネ ン ト ご と に各 イ ン ス タ ン ス の状 態が示 さ れます。 • アイ ドル コ ン ポーネ ン ト は休止中か、イ ン ス タ ン ス プール内にあ る • 実行中 • 一時停止 コ ン ポーネ ン ト は、 現在 コ ー ド を実行 し てい る コ ン ポーネ ン ト はブ レー ク ポ イ ン ト で一時停止 し て、 デ バ ッ ガ操作を待機 し てい る イ ン ス タ ン ス が破棄 さ れ る と 、 イ ン ス タ ン ス ビ ュ ーか ら 取 り 除かれま す。 複数のイ ン ス タ ン ス 同時に複数の コ ン ポーネ ン ト イ ン ス タ ン ス を 一時停止 さ せ る こ と は 可能ですが、 デバ ッ ガで行 う 操作は、 ブ レー ク ポ イ ン ト に到達 し た最 初の イ ン ス タ ン ス にだけ作用 し ます。 こ の イ ン ス タ ン ス は、 イ ン ス タ ン ス ビ ュ ーの黄色の矢印に よ っ て示 さ れ ま す。 メ ソ ッ ド が完了す る か、 [実行の継続] を ク リ ッ ク し た場合には、 現行の イ ン ス タ ン ス は キ ュ ー内の次の イ ン ス タ ン ス に変わ り ます。 イ ン ス タ ン ス ビ ュ ーで新規 イ ン ス タ ン ス を ダブル ク リ ッ ク し て も 、 1 つの イ ン ス タ ン ス か ら 別の イ ン ス タ ン ス に コ ン テ キ ス ト を変更で き ま す。 別の コ ン ポーネ ン ト イ ン ス タ ン スへの呼び出 し を除いて、 イ ン ス タ ン ス ビ ュ ーに呼び出 さ れた イ ン ス タ ン ス が一時停止 し た こ と が示 さ れてい る 場合には、 こ の方法を利用で き ます。 518 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 EAServer ロ グへのメ ッ セージ 出力 EAServer で動作 し てい る PowerBuilder オブジ ェ ク ト に よ っ て生成 さ れ たエ ラ ーを EAServer ロ グに記録す る には、ErrorLogging サービ ス コ ン テ キ ス ト オブジ ェ ク ト の イ ン ス タ ン ス を作成 し 、 その log メ ソ ッ ド を 呼び出 し ます。 た と えば、 次の よ う にな り ます。 ErrorLogging inv_el this.GetContextService("ErrorLogging", inv_el) inv_el.log("Write this string to log") ErrorLogging サービ ス を使用 し て、 サーバ上のシ ス テ ム エ ラ ーま たは 実行時エ ラ ーの コ ン テ キ ス ト に関す る 詳細情報を表示で き ます。 こ の 情報は、 シ ス テ ム管理者や開発者が問題を解決す る 際に役立ち ます。 コ ン ポーネ ン ト の開発中は、 ErrorLogging サービ ス を使用 し て、 コ ン ポーネ ン ト の実行を ト レー ス で き ます。 た と えば、 関数に入 る と き や 出 る と き に、 ロ グに メ ッ セージ を書 き 込む こ と も 可能です。 こ の メ ッ セージに よ っ て、 コ ン ポーネ ン ト の名前、 関数に入っ てい る か出てい る か、 それはど の関数か を特定で き ます。 デー タ の印刷 サーバが Windows ま たは Solaris で動作 し てい る 場合は、デー タ ス ト ア を使用 し てデー タ を リ モー ト サーバに印刷で き ます。 プ ラ ッ ト フ ォ ームに関する注意 次の例は、 HP-UX ま たは AIX 上では機能 し ません。 こ れ ら のプ ラ ッ ト フ ォ ーム では、EAServer が Windows 非搭載版の PowerBuilder 実行環境 を使用す る ため、 印刷な ど のグ ラ フ ィ ッ ク 処理はサポー ト し てい ませ ん。 デー タ ス ト ア印刷関数 を 使用 し た印刷は、 現在 Solaris だ け でサ ポー ト し てい ます。 ただ し 、 SaveAs 関数 と PDF SaveAsType を使用す れば、 デー タ ス ト ア オブジ ェ ク ト をすべての UNIX プ ラ ッ ト フ ォ ーム で印刷で き ます。 詳細については、 524 ページの 「PDF への印刷」 を参照 し て く だ さ い。 こ の例では、 サーバ コ ン ポーネ ン ト uo_employees は、 print_employees と い う 関数を備えています。print_employees はデー タ ス ト ア ds_datastore の イ ン ス タ ン ス を生成 し 、 こ のデー タ ス ト アの内容を印刷 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 519 デー タ の印刷 print_employees 関数のシ グネチ ャ を次に示 し ます。 print_employees( ) returns integer print_employees 関数の ス ク リ プ ト を次に示 し ます。 datastore ds_datastore int li_rc ds_datastore = create datastore ds_datastore.dataobject = "d_empdata" ds_datastore.SetTransObject (SQLCA) ds_datastore.Retrieve() li_rc = ds_datastore.Print() return li_rc Solaris オペレ ーテ ィ ン グ シ ステ ムでの印刷 Solaris で は、 PostScript ま た は PCL5 フ ァ イ ル に直接印刷 で き ま す。 Windows ではな く Solaris で レ ポー ト を印刷す る ために コ ー ド を変更す る 必要はあ り ません。 Windows の場合 と 同 じ プ ロ パテ ィ 、 関数、 お よ び イ ベン ト を使用で き ます。 デー タ ス ト ア を 印刷す る に は、 デー タ ス ト ア Print メ ソ ッ ド ま た は PrintDataWindow(PrintJobName, DataStoreName) を使用 し ます。 デー タ ス ト ア を デー タ ウ ィ ン ド ウ に リ ン ク し てデー タ ウ ィ ン ド ウ オブ ジ ェ ク ト を Solaris で印刷す る 場合、 印刷結果は、 デー タ ウ ィ ン ド ウ オブジ ェ ク ト で定義 し た フ ォ ン ト と レ イ ア ウ ト にな り ます。 スペース Solaris で は 印 刷 ジ ョ ブ で の ス ペ ー ス を サ ポ ー ト し て い な い た め、 PBVM に よ っ て、 印刷ジ ョ ブ を プ リ ン タ に送信す る 前に印刷ジ ョ ブ名 の各スペース がハ イ フ ンに置 き 換え ら れ ます。 フ ォ ン ト の使い方 印刷に使用 さ れ る フ ォ ン ト は、 dwprinter/fontmetrics デ ィ レ ク ト リ に用 意 さ れてい る フ ォ ン ト です。 AFM フ ァ イ ル と TFM フ ァ イ ルは、 特定 の PostScript (AFM) と PCL (TFM) の フ ォ ン ト に関す る 情報 を 含む ASCII 形式の フ ァ イ ルです。 PostScript と PCL の各フ ォ ン ト には、 対応 す る フ ォ ン ト メ ト リ ッ ク フ ァ イ ルがあ り ます。 印刷 メ カ ニ ズ ム で、 フ ォ ン ト メ ト リ ッ ク 情報を取得す る ために AFM フ ァ イ ル と TFM フ ァ イ ルが読み込まれ ます。 こ の情報には、 文字幅、 ベー ス ラ イ ン位置、 ア セ ン ダ サ イ ズ、 デ ィ セ ン ダ サ イ ズ、 下線 ス ト ロ ー ク 幅、 下線位置な ど が あ り ま す。 次に、 こ の メ ト リ ッ ク 情報は、 XTextWidth の よ う な Xlib API が要求す る 形式に変換 さ れ ます。 520 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 最善の方法は、 デー タ ウ ィ ン ド ウ の設計時に、 Windows と Solaris の両 方で使用可能な フ ォ ン ト を 選択す る こ と です。 た だ し 、 各プ ラ ッ ト フ ォ ー ム に は 独自 の フ ォ ン ト レ ン ダ リ ン グ エ ン ジ ン が あ る た め、 Solaris と Windows での フ ォ ン ト サ イ ズの違いが気にな る こ と があ り ます。 Solaris での印刷結果を開発プ ロ セ ス の早い時期にテ ス ト す る 必 要があ り ます。 制限 データ ウ ィ ン ド ウ オブジ ェ ク ト の印刷のサポー ト は、Bristol Technology の Wind/U 製品に基づいてい ます。 Wind/U GDI ラ イ ブ ラ リ と Xprinter ラ イ ブ ラ リ には、 以下の制限があ り ます。 • マルチバ イ ト 文字セ ッ ト (MBC) お よ び Unicode はサポー ト し て いない • Xprinter は ス レ ッ ド セーフ ではないため、 印刷ジ ョ ブはシ リ ア ラ イ ズ される プ リ ン タ の設定 デー タ ウ ィ ン ド ウ オブジ ェ ク ト を印刷す る プ リ ン タ を設定す る には、 プ リ ン タ へのア ク セ ス の追加、dwprint.ini 環境設定フ ァ イ ルの設定、お よ び XPPATH 環境変数の作成を行わなければな り ません。 プ リ ン タ へのア ク セス の追加 ルー ト ユーザで、Solaris admintool ユーテ ィ リ テ ィ を使用 し て Solaris 上 のプ リ ン タ へのア ク セ ス を追加 し ます。 詳細については、 Solaris のマ ニ ュ アルを参照 し て く だ さ い。 dwprint.ini の設定 $EAServer/bin デ ィ レ ク ト リ の dwprint.ini フ ァ イ ルは、 デー タ ウ ィ ン ド ウ 印刷用の環境設定フ ァ イ ルです。こ の フ ァ イ ルは、Microsoft Windows のプ リ ン タ 環境設定方法に厳密に従っ てい ます。 その結果、 こ の フ ァ イ ルには [windows]、 [devices]、 [ports] の各セ ク シ ョ ン が用意 さ れて お り 、 各セ ク シ ョ ン にプ リ ン タ の適切なエ ン ト リ を指定 し な ければな り ません。 通常、 こ の フ ァ イ ルのほかのセ ク シ ョ ン を変更す る 必要はあ り ません。 ただ し 、 い く つかの問題を解決す る ために、 ほかのセ ク シ ョ ン の追加 ま たは変更を行い ま す。 た と えば、 [intl] セ ク シ ョ ン に次の よ う なエ ン ト リ を追加 し て日付形式を変更で き ます。 [intl] sShortDate=m/d/yyyy // 4 桁の年を設定 し ます。 dwprint.ini 内のエ ン ト リ は、 .WindU フ ァ イ ル内のエ ン ト リ に基づいて い ます。 こ の フ ァ イ ルの設定方法についての詳細は、 http://www.bristol.com/support/windu/wu_ug/ch13.htm の 『Wind/U User's Guide』 を参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 521 デー タ の印刷 ポー ト の指定 dwprint.ini の [ports] セ ク シ ョ ン の各行には、 出力 フ ァ イ ルの ス プー ルに使用 さ れ る ユーザ定義のポー ト 名 と 関連 コ マ ン ド を記述 し ま す。 た と えば、 シ ス テ ム に直接接続 さ れてい る myprinter と い う プ リ ン タ に 印刷ジ ョ ブ を送信す る コ マ ン ド は、 次の と お り です。 lp -s -d myprinter -t$XPDOCNAME $XPDOCNAME は、 プ リ ン タ に送信 さ れた出力フ ァ イ ルの名前を表 し ます。 -s オプシ ョ ン を指定す る と 、 EAServer コ ン ソ ールでの lp か ら 送 信 さ れた メ ッ セージの表示が抑制 さ れます。 こ の後に、 dwprint.ini フ ァ イ ルの [ports] セ ク シ ョ ンの例を示 し ます。 こ のセ ク シ ョ ン では、 prnt1、 prnt2 と い う リ モー ト プ リ ン タ 用に定義 さ れた 2 つのポー ト 、 ロ ーカル プ リ ン タ 用の 1 つのポー ト 、 お よ びフ ァ イ ルへの印刷用のエ ン ト リ が記述 さ れてい ます。 出力フ ァ イ ルの名前 は引用符で囲みます。 こ の よ う に指定す る と 、 複数単語の フ ァ イ ル名 を使用で き ます。 rsh ス ク リ プ ト で引用符が取 り 除かれ る ので、 リ モー ト サーバでエ ス ケープ し なければな り ません。 [ports] colorpr1=rsh prntsvr lp -s -d prnt1 -t¥"$XPDOCNAME¥" colorpr2=rsh prntsvr lp -s -d prnt2 -t¥"$XPDOCNAME¥" LOCAL=lp -d myprinter -t"$XPDOCNAME" FILE: = プ リ ン タ の種類を定義 済みのポー ト に合わせ る [devices] セ ク シ ョ ン には、 現在設定 さ れてい る すべてのプ リ ン タ の リ ス ト を記述 し ます。 各行には、 プ リ ン タ のユーザ定義のエ リ ア ス、 お よ び 3 つの引数 と し てプ リ ン タ 機種、 プ リ ン タ モー ド (PCL4、 PCL5、 ま たは PostScript) 、 プ リ ン タ が接続 さ れてい る 1 つま たは複数のポー ト が記述 さ れ ます。 プ リ ン タ 機種は、 プ リ ン タ で使用 さ れ る プ リ ン タ 記述フ ァ イ ル (PPD) の名前です。PPD フ ァ イ ルは、PBVM の イ ン ス ト ール時に dwprinter/ppds デ ィ レ ク ト リ に イ ン ス ト ール さ れてい ます。 そのデ ィ レ ク ト リ 内のテ キ ス ト フ ァ イ ル filename_map.txt で、 プ リ ン タ 記述を含むフ ァ イ ルの 名前を プ リ ン タ の種類にマ ッ プ し ます。 た と えば、 次に示すのは、 以 降の例で使用す る color_lj モデルのマ ッ ピ ン グです。 color_lj.pcl:"HP Color LaserJet PCL Cartridge" color_lj.ps:"HP Color LaserJet PS" プ リ ン タ 機種 と モー ド は、 スペース で区切 り ます。 モー ド と ポー ト は、 カ ン マで区切 り ま す。 た と えば、 次の [devices] セ ク シ ョ ン で指定 さ れてい る 最初のデバ イ ス の場合は、 エ リ ア ス が HP Color LaserJet PS で あ り 、 機種は color_lj、 モー ド は PostScript で、 2 つのポー ト (FILE: と colorpr1) が指定 さ れてい ます。 522 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 [devices] HP Color LaserJet PS=color_lj PostScript,FILE:,colorpr1 HP Color LaserJet PS=color_lj PCL5,colorpr2 HP Color LaserJet PS=color_lj PostScript,LOCAL HP LaserJet PS=NULL PostScript,FILE: HP LaserJet PCL=NULL PCL,FILE: デ フ ォル ト プ リ ン タ の指定 [windows] セ ク シ ョ ン には、 デ フ ォ ル ト プ リ ン タ 情報を記述 し ま す。 ポー ト の指定 と 同様に、 各デバ イ ス行で 3 つの引数 と し て PPD フ ァ イ ル、 ド ラ イ バ、 お よ びポー ト の名前を指定 し ますが、 [windows] セ ク シ ョ ン では、 それ ら をすべて カ ン マで区切 り ます。 次の例は、 プ リ ン タ フ ァ イ ル記述が NULL に設定 さ れた と き に フ ァ イ ルに印刷す る ためのデフ ォ ル ト エ ン ト リ 、 お よ びほかの 2 つのエ ン ト リ を示 し てい ます。 後半 2 行の先頭のセ ミ コ ロ ンは コ メ ン ト 文字なの で、 現在のデフ ォ ル ト プ リ ン タ は、 ポー ト colorpr1 の HP Color LaserJet プ リ ン タ にな っ てい ます。 [windows] device=color_lj,PostScript,colorpr1 ;device=color_lj,PostScript,colorpr2 ;device=NULL,PostScript,FILE: プ リ ン タ オプ シ ョ ン の設定 dwprint.ini フ ァ イ ルには、 [windows]、 [devices]、 [ports] の各セ ク シ ョ ン で定義 し た機種ご と に環境設定セ ク シ ョ ン を記述 し なければな り ま せん。 環境設定セ ク シ ョ ン では、 部数、 印刷の向 き 、 ページ サ イ ズ、 DPI な ど の、 プ リ ン タ のデフ ォ ル ト 設定情報を指定 し ます。 た と えば、 先ほ ど の例で使用 さ れた color_lj プ リ ン タ の場合は、 次の よ う に環境設定セ ク シ ョ ン を追加 し ます。 [color_lj,PostScript] Filename=jaguar.ps Scale=1.00 Copies=1 Orientation=Portrait PageSize=Letter DPI=300 [color_lj,PCL5] Filename=jaguar.pcl Scale=1.00 Copies=1 Orientation=Portrait PageSize=Letter DPI=300 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 523 デー タ の印刷 XPPATH 環境変数の 設定 印刷ジ ョ ブ を開始す る 前に、 XPPATH 環境変数を設定 し ます。 XPPATH 変数には、 プ リ ン タ 記述フ ァ イ ル と プ リ ン タ 固有の フ ォ ン ト マ ッ ピ ン グ フ ァ イ ル を 格納 し て い る デ ィ レ ク ト リ へのパ ス を 設定 し な ければ な り ません。こ れ ら の フ ァ イ ルは、PBVM の イ ン ス ト ール時に dwprinter デ ィ レ ク ト リ に イ ン ス ト ール さ れ ます。 C シ ェ ルの場合は、 次の よ う にパ ス を設定 し ます。 setenv XPPATH $EAServer/dwprinter Korn シ ェ ル ま たは Bourne シ ェ ルの場合は、 次の よ う にパ ス を設定 し ます。 XPPATH = $EAServer/dwprinter;export XPPATH PDF への印刷 デー タ ス ト アのデー タ を PDF に保存す る には、GNU Ghostscript distiller を利用す る か、 XSL Formatting Objects (XSL-FO) を使用 し てデー タ を 処理す る 機能を利用 し ます。 デー タ ウ ィ ン ド ウ オブジ ェ ク ト のデー タ を XSL-FO ま たは PDF に保存 し 、 Java の印刷機能を利用 し て印刷で き ます。 GNU Ghostscript distiller を使用す る には、Ghostscript フ ァ イ ルお よ びデ フ ォ ル ト PostScript プ リ ン タ ド ラ イ バ と 関連 フ ァ イ ル を サーバ上の PowerBuilder ラ ン タ イ ム フ ァ イ ル と 同 じ デ ィ レ ク ト リ に イ ン ス ト ール し てお く 必要があ り ます。 XSL-FO を 使用す る には、 Apache XSL Formatting Objects プ ロ セ ッ サ (FOP) を サーバ上の PowerBuilder ラ ン タ イ ム フ ァ イ ル と 同 じ デ ィ レ ク ト リ に イ ン ス ト ール さ れていて、 以下の JAR フ ァ イ ルが ク ラ ス パ ス に なければな り ません。 fop-0.20.4¥build¥fop.jar fop-0.20.4¥lib¥batik.jar fop-0.20.4¥lib¥xalan-2.3.1.jar fop-0.20.4¥lib¥xercesImpl-2.1.0.jar fop-0.20.4¥lib¥xml-apis.jar fop-0.20.4¥lib¥avalon-framework-cvs-20020315.jar こ れ ら の フ ァ イ ル を CLASSPATH 環境変数、 あ る いは User_setenv.bat ま たは Serverstart.bat に追加で き ます。 524 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 EAServer で XSL-FO を使用 し て PDF フ ァ イ ルを生成す る と 、詳細情報 メ ッ セージ と 警告 メ ッ セージが Jaguar ロ グに書 き 込まれ ます。 こ れ ら のメ ッ セージの出力を抑制する には、 環境変数 PB_FOP_SUPPRESSLOG に 1 を設定 し ます。 詳細については、 『PowerBuilder ユーザーズ ガ イ ド 』 の 「デー タ ウ ィ ン ド ウ オブジ ェ ク ト の機能拡張」 の章を参照 し て く だ さ い。 EAServer への コ ンポーネ ン ト の配布 サーバ上に PowerBuilder VM が必 要 コ ン ポーネ ン ト を、Windows と UNIX 上で稼動 し てい る EAServer ホ ス ト に配布で き ま す。 開発に使用 し た コ ン ピ ュ ー タ の PowerBuilder VM のバージ ョ ン が、 サーバ上で も 使用で き る 必要があ り ます。 PowerBuilder VM には、PBVM90J.DLL、PBJAG90J.DLL、PBDWE90J.DLL な ど、 実行時 に 必要 な PowerBuilder フ ァ イ ル が 用意 さ れ て い ま す。 UNIX の場合、 共有 ラ イ ブ ラ リ は libpbvm90x.ext、 libdwe90x.ext、 な ど と 呼ばれ、ext は各 UNIX プ ラ ッ ト フ ォ ーム の共有 ラ イ ブ ラ リ 拡張子で す。 EAServer は PowerBuilder ラ ン タ イ ム フ ァ イ ル を 使 用 し ま す。 PowerBuilder ラ ン タ イ ム フ ァ イ ルは、 フ ァ イ ル名の最後に x が付 き 、 印刷を含む Window API の呼び出 し やグ ラ フ ィ ッ ク 処理を サポー ト し てい ません。 EAServer は、 同一サーバ上で PowerBuilder VM の複数のバージ ョ ン を サポー ト し ます。 異な る バージ ョ ン の PowerBuilder で作成 さ れた コ ン ポーネ ン ト は、 必要なバージ ョ ン の PowerBuilder VM がサーバ上で使 用で き る 限 り 、 同一サーバ上で共存で き ます。 PowerBuilder 9 から EAServer にコ ン ポーネン ト を 配布する と き は、コ ン ポーネン ト は使用し て いる PowerBuilder VM のバージ ョ ン に関連付け ら れま す。 Jaguar Manager では、 コ ン ポーネン ト のプロ パティ シート の [すべてのプロ パティ ] タ ブ ページの com.sybase.jaguar.component.pb.version プ ロ パテ ィ が 9.0 に設定 さ れ ます。 PowerBuilder 開発環境を使用 し ないで PowerBuilder コ ン ポーネ ン ト を EAServer に配布す る 場合は、 Jaguar Manager の コ ン ポーネ ン ト のプ ロ パテ ィ シー ト に、 正 し い VM のバージ ョ ン を指定で き ます。 開発環境で使 っ た PowerBuilder VM のバージ ョ ン が な いサーバでは、 PowerBuilder コ ン ポーネ ン ト を配布 し て も 、 その コ ン ポーネ ン ト は イ ン ス タ ン ス化で き ません。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 525 EAServer への コ ンポーネ ン ト の配布 EAServer コ ンポーネ ン ト の配布について コ ン ポーネ ン ト を EAServer に配布す る には、プ ロ ジ ェ ク ト を新規作成 し て構築 し ます。 新規プ ロ ジ ェ ク ト は、 組み込 ま れ る オブジ ェ ク ト を 一覧に し 、 生成 さ れた コ ン ポーネ ン ト (1 つ ま たは複数) を格納す る 出力 ラ イ ブ ラ リ の名前を指定 し ます。 デー タ ウ ィ ン ド ウの定義の有効化 デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト を 動的に参照す る ス ク リ プ ト の場合 は、 ウ ィ ザー ド ま たはペ イ ン タ の [統合 PBD に参照 さ れないオブジ ェ ク ト を含め る ] ボ ッ ク ス を オ ン に し て、 デー タ ウ ィ ン ド ウ の定義が コ ン ポーネ ン ト で使用で き る よ う に し なければな り ません。 コ ンポーネ ン ト の配布 方法 コ ン ポーネ ン ト を EAServer に配布す る には、 ウ ィ ザー ド に よ っ て作成 さ れたプ ロ ジ ェ ク ト を開いて、 [デザ イ ン|プ ロ ジ ェ ク ト の配布] を選 択 し ます。 EAServer への配布後 の処理内容 コ ン ポーネ ン ト を EAServer に配布す る と 、コ ン ポーネ ン ト ジ ェ ネ レー タ に よ っ て以下の処理が行われ ます。 • 配布用に選択 し た非ビ ジ ュ アル オブジ ェ ク ト を記述す る CORBA IDL を生成 こ の IDL は、 さ ら に ス タ ブ と ス ケル ト ン の作成に使用 さ れ ま す。 IDL フ ァ イ ル、 ス タ ブ、 お よ び ス ケル ト ン の名前は、 オブジ ェ ク ト の名前に基づいてい ます。 コ ン ポーネ ン ト ジ ェ ネ レー タ は、EAServer の イ ン ス ト ール デ ィ レ ク ト リ の Repository サブデ ィ レ ク ト リ に新 し い IDL を格納 し ます。 • EAServer コ ン ポーネ ン ト のプ ロ パテ ィ を記述す る PROPS フ ァ イ ルを生成 PROPS フ ァ イ ルは、EAServer の イ ン ス ト ール デ ィ レ ク ト リ のサブ デ ィ レ ク ト リ に格納 さ れ ま す。 こ のサブデ ィ レ ク ト リ のパ ス を次 に示 し ます。 Repository¥Component¥package-name • 配布 さ れた コ ン ポーネ ン ト に対 し て 1 つま たは複数の PBD フ ァ イ ルを生成 PBD フ ァ イ ルは、 EAServer の イ ン ス ト ール デ ィ レ ク ト リ のサブ デ ィ レ ク ト リ に格納 さ れ ま す。 こ のサブデ ィ レ ク ト リ のパ ス を次 に示 し ます。 Repository¥Component¥package¥component¥Ccookie こ こ で、cookie は構築の生成番号を表 し ます。 ラ イ ブ ラ リ 名が修飾 さ れていない (パ ス が指定 さ れない) 場合には、 コ ン ポーネ ン ト ジ ェ ネ レー タ は名前の前に円記号 (¥) を付け ます。 デフ ォ ル ト で は、 EAServer は最新版の コ ン ポーネ ン ト を使用 し ます。 526 PowerBuilder 第 23 章 EAServer コ ンポーネ ン ト の構築 デ ィ ス ク ス ペー ス を 再度割 り 当 て る に は、 Sybase 社の Web サ イ ト www.sybase.com か ら ダ ウ ン ロ ー ド で き る CookieMonster (英語版) と い う サービ ス コ ン ポーネ ン ト を使用 し て、 不要にな っ たデ ィ レ ク ト リ を 削除 し ます。 あ る いは、 次の手順で不要デ ィ レ ク ト リ を削除 し て も か ま い ません。 EAServer レ ポジ ト リ の後処理 ❖ コ ンポーネ ン ト の コ ー ド セ ッ ト の変更 不要なデ ィ レ ク ト リ と PBD フ ァ イルを削除するには 1 最新のデ ィ レ ク ト リ 以外のデ ィ レ ク ト リ をすべて削除 し ます。 2 残 り のデ ィ レ ク ト リ の名前を C1 に変更 し ます。 3 Jaguar Manager のコ ン ポーネン ト のプロ パティ シート にあ る [すべ てのプ ロ パテ ィ ] タ ブ ページで、 pb.cookie プ ロ パテ ィ の値を 1 に 設定 し ます。 4 EAServer を再起動 し ます。 PowerBuilder に よ っ て配布 さ れた EAServer コ ン ポーネ ン ト は、 自動的 にサーバの コ ー ド セ ッ ト を使用 し ます。 コ ン ポーネ ン ト に別の コ ー ド セ ッ ト を 使 用 さ せ た い 場 合 は、 コ ン ポ ー ネ ン ト の com.sybase.jaguar.component.code.set プ ロ パテ ィ に適切な値を 設定 し ま す。 こ のプ ロ パテ ィ を設定す る には、 Jaguar Manager の コ ン ポーネ ン ト プ ロ パテ ィ ダ イ ア ロ グ ボ ッ ク ス を使用 し ます。 [すべてのプ ロ パテ ィ ] タ ブ を選択 し 、 com.sybase.jaguar.component.code.set プ ロ パテ ィ を 追加 し て、 big5 や iso_1 な ど の適切な値を指定 し ます。 EAServer が utf-8 コ ー ド セ ッ ト を使用 し て起動 さ れ、 コ ン ポーネ ン ト でユー ロ ま たは英国ポ ン ド の記号、 あ る いはその両方を含んでい る 文 字列を返す場合は、 code.set プ ロ パテ ィ に cp1252 を設定 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 527 EAServer への コ ンポーネ ン ト の配布 528 PowerBuilder 第 2 4 章 EAServer ク ラ イ ア ン ト の構築 こ の章について こ の章では、 EAServer コ ンポーネン ト にア ク セ スする PowerBuilder ク ラ イ ア ン ト の作成方法について説明 し ます。 セ キ ュ リ テ ィ で保 護 さ れた接続については、 第 25 章 「PowerBuilder ク ラ イ ア ン ト で の SSL の使い方」 を参照 し て く だ さ い。 内容 項目 EAServer ク ラ イ ア ン ト の構築について EAServer への接続 EAServer プ ロ キ シ オブジ ェ ク ト の生成 コ ン ポーネ ン ト メ ソ ッ ド の呼び出 し JaguarORB オブジ ェ ク ト の使い方 ク ラ イ ア ン ト と コ ン ポーネ ン ト を区別す る ト ラ ンザ ク シ ョ ン サーバ メ ッ セージ返送の要求 エ ラ ー処理 ク ラ イ ア ン ト アプ リ ケーシ ョ ンの配布 ページ 529 531 535 536 543 548 552 556 562 EAServer ク ラ イ ア ン ト の構築について PowerBuilder アプ リ ケーシ ョ ンは、 EAServer コ ン ポーネ ン ト の ク ラ イ ア ン ト の役割を果た し ます。 サーバ上の コ ン ポーネ ン ト に関 連付け ら れた メ ソ ッ ド に ア ク セ ス す る には、 PowerBuilder ク ラ イ ア ン ト は、 サーバに接続 し 、 コ ン ポーネ ン ト を イ ン ス タ ン ス化 し 、 コ ン ポーネ ン ト メ ソ ッ ド を呼び出す必要があ り ます。 EAServer への接続には、 接続オブジ ェ ク ト の イ ン ス タ ン ス を使用 す る のが一般的ですが、CORBA 互換 ク ラ イ ア ン ト を作成す る 場合 には、 JaguarORB オブジ ェ ク ト を使用 し てサーバへの接続を確立 する こ と も 可能です。JaguarORB オブジェ ク ト を 使う と 、PowerBuilder ク ラ イ ア ン ト は、 C++ ク ラ イ ア ン ト と 同 じ 方法で EAServer にア ク セ ス で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 529 EAServer ク ラ イ ア ン ト の構築について こ の章で説明す る 技法を使えば、 EAServer で実行す る EJB コ ン ポーネ ン ト の ク ラ イ ア ン ト を構築で き ます。 EAServer やほかの J2EE 準拠の サーバで EJB コ ン ポーネ ン ト の ク ラ イ ア ン ト を構築す る 方法について は、 第 28 章 「EJB ク ラ イ ア ン ト の構築」 を参照 し て く だ さ い。 ウィ ザード の使い方について PowerBuilder には、 EAServer ク ラ イ ア ン ト の開発に役立つ 2 つの ウ ィ ザー ド があ り ます。 • 接続オブ ジ ェ ク ト ウ ィ ザー ド サーバへの接続に必要な コ ー ド を 追 加す る • ク ラ イ アン ト から ア ク セスする EAServer コ ン ポーネ ン ト のプ ロ キ シ オブジ ェ ク ト を構築す る ため のプ ロ ジ ェ ク ト の作成に役立つ EAServer プ ロキシ ウ ィ ザー ド 開発プ ロ セスについて EAServer ク ラ イ ア ン ト の構築手順 EAServer ク ラ イ ア ン ト を構築 し て配布す る には、 以下の手順をすべて 実行す る 必要があ り ます。 1 EAServer 接続オブジ ェ ク ト ウ ィ ザー ド を使用 し て、 Connection オ ブジ ェ ク ト か ら 継承 し た標準 ク ラ ス のユーザ オブジ ェ ク ト を作成 し ま す。 その後で、 こ のオブジ ェ ク ト を、 接続を確立す る ス ク リ プ ト の中で使用で き ます。 テ ン プ レ ー ト ア プ リ ケーシ ョ ン ス タ ー ト ウ ィ ザー ド を使用 し て ク ラ イ ア ン ト アプ リ ケーシ ョ ン を作成 し た場合は、 その ウ ィ ザー ド で接続オブジ ェ ク ト を作成で き ます。 530 2 EAServer プ ロ キ シ ウ ィ ザー ド を使用 し て、プ ロ キ シ オブジ ェ ク ト を作成す る ためのプ ロ ジ ェ ク ト 作成 し ます。 続いてプ ロ キ シ オブ ジ ェ ク ト を生成 し ます。 3 ユーザ イ ン タ フ ェース の実装に必要な ウ ィ ン ド ウ 、 メ ニ ュ ー、 お よ びス ク リ プ ト を作成 し ます。 4 EAServer コ ン ポーネ ン ト イ ン ス タ ン ス の作成 と 、 ク ラ イ ア ン ト か ら 1 つま たは複数の コ ン ポーネ ン ト メ ソ ッ ド の呼び出 し を行 う た めに必要な コ ー ド を記述 し ます。 PowerBuilder 第 24 章 EAServer ク ラ イ ア ン ト の構築 5 ク ラ イ ア ン ト のテ ス ト と デバ ッ グ を行い ます。 6 アプ リ ケーシ ョ ン を配布 し ます。 EAServer への接続 接続オブ ジ ェ ク ト の使 い方 EAServer に接続す る には、 接続オブジ ェ ク ト (サーバ と の通信を処理 す る 非ビ ジ ュ アル オブジ ェ ク ト ) の機能を利用す る のが も っ と も 簡単 な方法です。 サーバに接続す る には、 接続のための コ ー ド をすべて手 動で記述す る か、 接続オブジ ェ ク ト ウ ィ ザー ド を使用 し て接続を開始 し ます。 コ ード を 手書き する 方法 connection 変数の宣 言 接続オブ ジ ェ ク ト は組み込みの グ ロ ーバル オブ ジ ェ ク ト では あ り ま せん。 connection 型を指定 し て、 グ ロ ーバル変数ま たは イ ン ス タ ン ス変 数を宣言す る 必要があ り ます。 接続の確立 サーバへの接続を確立す る には、 以下の操作を実行す る ために必要な PowerScript 文を実行す る 必要があ り ます。 1 Create 文を使用 し て、 接続オブジ ェ ク ト を イ ン ス タ ン ス化 し ます。 2 接続オブジ ェ ク ト のプ ロ パテ ィ を設定 し ます。 3 ConnectToServer 関数を呼び出 し て、 サーバへの接続を確立 し ます。 4 エ ラ ーの有無をチ ェ ッ ク し ます。 こ れ ら の操作は、 1 つの ス ク リ プ ト ま たは複数の ス ク リ プ ト で実行で き ますが、 上記の順に行 う 必要があ り ます。 次の ス ク リ プ ト では、 myconnect 接続オブジ ェ ク ト を イ ン ス タ ン ス 化 し 、 EAServer の通信 ド ラ イ バ、 サーバのホ ス ト 名 と ポー ト 番号、 お よ びデ フ ォ ル ト パ ッ ケージ を 識別す る た めの接続プ ロ パテ ィ を 設定 し ます。 続いて、 こ の ス ク リ プ ト は ConnectToServer 関数を呼び出 し て サーバへの接続を確立 し 、 エ ラ ーをチ ェ ッ ク し ます。 例 // グローバル変数 : // connection myconnect long ll_rc myconnect = create connection myconnect.driver = "jaguar" ア プ リ ケーシ ョ ン テ ク ニ ッ ク 531 EAServer への接続 myconnect.location = "Jagserver1:9000" myconnect.application = "PB_pkg_1" myconnect.userID = "bjones" myconnect.password = "mypass" ll_rc = myconnect.ConnectToServer() IF ll_rc <> 0 THEN MessageBox(" 接続失敗 ", ll_rc) END IF 接続オブ ジ ェ ク ト プ ロパテ ィ の設定 表 24-1 に EAServer と 通信す る 際の、 接続オブジ ェ ク ト プ ロ パテ ィ を 設定す る ためのガ イ ド ラ イ ン を示 し ます。 表 24-1: EAServer の接続オブ ジ ェ ク ト プ ロパテ ィ プ ロパテ ィ 名 Application Driver Location 説明 EAServer コ ン ポーネ ン ト に 使用す る デ フ ォ ル ト パ ッ ケージ EAServer ド ラ イ バの名前 サーバの ホ ス ト 名 と ポー ト 番号を コ ロ ン で区切っ た も の 例 "PB_pkg_1" "jaguar" "Jagserver:9000" "iiop://srv1:9000" "iiops://srv3:9001" Location プ ロ パ テ ィ に は、 "http://srv5:1080" 以下のいずれかの書式を使 用する 。絶対パ ス URL も 指 "iiop://s1:9000;iiop://s2:9000" 定で き る iiop://host:port iiops://host:port http://host:port https://host:port Password UserID Options 532 EAserver の負荷分散 と フ ェ イ ルオーバのサポー ト を利 用す る 際、 サーバの位置を セ ミ コ ロ ン で区切っ て リ ス ト 形式で指定す る こ と も 可 能 EAServer のパス ワー ド EAServer のユーザ ID 1 つ ま たは複数の EAServer ORB プ ロ パテ ィ 設定 "mypass" "bjones" "ORBLogFile='jaglog.log'" PowerBuilder 第 24 章 EAServer ク ラ イ ア ン ト の構築 複数の接続を確立 PowerBuilder では、 複数の接続オブジ ェ ク ト を イ ン ス タ ン ス 化で き ま す。 し たが っ て、 1 つの ク ラ イ ア ン ト アプ リ ケーシ ョ ン で複数の接続 を確立で き ま す。 た と えば、 2 つの別個の接続オブジ ェ ク ト を イ ン ス タ ン ス化 し て、 2 台の別々のサーバ に ク ラ イ ア ン ト を接続す る こ と も 可能です。 設定オプ シ ョ ン 接続オブジ ェ ク ト ま たは JaguarORB オブジ ェ ク ト のいずれか を使用 し て EAServer に接続す る と き は、 EAServer C++ ク ラ イ ア ン ト ORB を使 用す る こ と に な り ま す。 そ の プ ロ パ テ ィ は、 接続 オ ブ ジ ェ ク ト の Options 文字列に設定す る か、 JaguarORB の Init 関数を使用 し て設定で き ます。 使用する コ ー ド セ ッ ト の変更 2 バ イ ト 文字を扱 う EAServer コ ン ポーネ ン ト に接続す る 際には、 コ ン ポーネ ン ト が適切な コ ー ド セ ッ ト を 使用 し て い る こ と を 確認す る 必 要があ り ます。 コ ー ド セ ッ ト は、 Jaguar Manager の コ ン ポーネ ン ト プ ロ パテ ィ ダ イ ア ロ グ ボ ッ ク ス で変更で き ます。 ま た、 その コ ン ポーネ ン ト を使用す る には、 PowerBuilder ク ラ イ ア ン ト の コ ー ド セ ッ ト を設 定す る こ と も 必要です。 そのためには、接続オブジ ェ ク ト の Options プ ロ パテ ィ を設定 し ます。 た と えば、 eucksc コ ー ド セ ッ ト の韓国文字を 扱いたい場合は、 myConncetion と い う 接続オブジ ェ ク ト に次の ス ク リ プ ト を使用 し ます。 myConnection.Options = "ORBCodeSet='eucksc'" EAServer が utf-8 コ ー ド セ ッ ト を使用 し て起動 さ れ、 ユー ロ ま たは英 国ポ ン ド の記号、 あ る いはその両方を含んでい る 文字列を返す Java ま た は PowerBuilder の コ ン ポ ー ネ ン ト を 呼 び 出 し て い る 場 合 は、 ORBCodeSet プ ロ パテ ィ に cp1252 を設定 し ます。 た と えば、 次の よ う にな り ます。 myConnection.Options = "ORBCodeSet='cp1252'" 接続の ト ラ ブルシ ュ ー テ ィ ング 接続が失敗 し た場合、ORBLogIIOP オプシ ョ ン を オ ンに し 、ORBLogFile オプシ ョ ンの値を指定 し て、 失敗に関す る 詳細を ロ グ フ ァ イ ルに記録 で き ます。 設定す る オプシ ョ ン が複数あ る 場合は、 それ ら のオプシ ョ ン を同一の文中に設定 し なければな り ません。 オプシ ョ ンは、 次の よ う にカ ン マで区切 り ます。 myConnection.Options = & "ORBLogIIOP='TRUE', ORBLogFile='d:¥temp¥ORBLog.txt'" 全オプシ ョ ン の一覧については、 接続オブジ ェ ク ト に関す る オ ン ラ イ ン ヘルプ ま たは EAServer のマニ ュ アルを参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 533 EAServer への接続 ウィ ザード を 使用し た接続オブ ジ ェ ク ト の作成 接続オブジ ェ ク ト ウ ィ ザー ド で、 接続 タ イ プ と し て EAServer を選択 し た場合には、 Connection オブジ ェ ク ト か ら 継承 さ れた標準 ク ラ ス の ユーザ オブジ ェ ク ト が作成 さ れ ます。 ウ ィ ザー ド で接続オブジ ェ ク ト プ ロ パテ ィ を指定 し 、 接続情報の提供元 と し て レ ジ ス ト リ 、 INI フ ァ イ ル、 ま たは ス ク リ プ ト を指定 し ます。接続オブジ ェ ク ト ウ ィ ザー ド は、 開発者がセ ッ ト ア ッ プ し た EAServer プ ロ フ ァ イ ルか ら 、接続先のサー バに関す る 情報を取得 し ます。 EAServer プ ロ フ ァ イ ルの作成方法につ いては、 467 ページの 「EAServer プ ロ フ ァ イ ルの作成」 を参照 し て く だ さ い。 接続オブジ ェ ク ト の Constructor イ ベン ト は、of_getconnectioninfo 関数を 呼び出 し て、 指定 し た ソ ース か ら 格納済みの接続情報を取得 し ます。 接続オブ ジ ェ ク ト ウ ィ ザー ド を 使用 し て接続オブ ジ ェ ク ト を 作成 し た ら 、以下の操作の実行に必要な PowerScript 文を実行す る 必要があ り ます。 1 Create 文を使用 し て、 接続オブジ ェ ク ト を イ ン ス タ ン ス化 し ます。 2 ConnectToServer 関数を呼び出 し て、 サーバへの接続を確立 し ます。 3 エ ラ ーをチ ェ ッ ク し ます (省略可)。 接続オ ブ ジ ェ ク ト の プ ロ パ テ ィ は設定不要ですが、 それ ら の プ ロ パ テ ィ は of_getconnctioninfo 関数で修正で き ます。 接続オブジ ェ ク ト のオ プシ ョ ン を constructor イ ベン ト で設定す る こ と も 可能です。た と えば、 次の よ う に し ます。 this.options = "ORBHttp='TRUE'" 次の ス ク リ プ ト では、 ウ ィ ザー ド で作成 さ れた n_myclient_connect オブジ ェ ク ト の myconnect イ ン ス タ ン ス を イ ン ス タ ン ス化 し 、 ConnectToServer 関数を呼び出 し てサーバへの接続を確立 し 、 エ ラ ーを チ ェ ッ ク し ます。 例 long ll_rc myconnect = create n_myclient_connect ll_rc = myconnect.ConnectToServer() IF ll_rc <> 0 THEN MessageBox(" 接続失敗 ", ll_rc) END IF 複数の接続を確立 534 1 つの ク ラ イ ア ン ト アプ リ ケーシ ョ ン で複数の接続を確立で き ます。2 台の別々のサーバに ク ラ イ ア ン ト 接続 し たい場合には、 も う 一度接続 オブジ ェ ク ト ウ ィ ザー ド を実行 し て、 別々の接続プ ロ パテ ィ を持つ新 規ユーザ オブジ ェ ク ト を作成 し ます。 PowerBuilder 第 24 章 EAServer ク ラ イ ア ン ト の構築 EAServer プ ロキシ オブ ジ ェ ク ト の生成 EAServer プ ロキシ オ ブ ジ ェ ク ト について 各 EAServer コ ン ポーネ ン ト には、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン内 に対応す る プ ロ キ シ オブジ ェ ク ト があ り ます。EAServer コ ン ポーネ ン ト にア ク セ スす る には、 EAServer プ ロ キ シ を通 じ て通信す る 必要があ り ます。 ク ラ イ ア ン ト アプ リ ケーシ ョ ンには、 EJB コ ン ポーネ ン ト に対応す る 2 つのプ ロ キ シ オブジ ェ ク ト (ホーム イ ン タ フ ェ ース用 と リ モー ト イ ン タ フ ェース用) があ り ます。 た と えば、 Cart と い う 名前の EJB コ ン ポーネ ン ト は、 CartHome と Cart と い う 2 つのプ ロ キ シ を生成 し ます。 EJB コ ン ポーネ ン ト にア ク セ スす る には、 こ れ ら 2 つのプ ロ キ シ を介 し て通信す る 必要があ り ます。 EAServer ク ラ イ ア ン ト のプ ロ キ シ オブジ ェ ク ト は、新規プ ロ ジ ェ ク ト を作成 し てか ら 生成す る 必要があ り ます。 新規プ ロ ジ ェ ク ト では、 組 み込 ま れ る オブ ジ ェ ク ト の一覧 を 表示 し 、 生成 さ れた プ ロ キ シ オブ ジ ェ ク ト を格納す る 出力 ラ イ ブ ラ リ の名前を指定 し ます。 EAServer プ ロキシ ウ ィ ザー ド の使い方 EAServer プ ロ キ シ ウ ィ ザー ド は、 EAServer プ ロ キ シ オブジ ェ ク ト を 作成す る ためのプ ロ ジ ェ ク ト の作成に役立ち ます。 こ の ウ ィ ザー ド を 使 う と 、 EAServer サーバに接続 し て、 ク ラ イ ア ン ト か ら ア ク セ ス で き る よ う に し たい コ ン ポーネ ン ト を選択で き ます。 プ ロ ジ ェ ク ト を作成 し た ら 、 続いてプ ロ ジ ェ ク ト ペ イ ン タ を使用 し てプ ロ ジ ェ ク ト 設定を 修正 し 、 プ ロ キ シ ラ イ ブ ラ リ を作成で き ます。 EJB ク ラ イ ア ン ト の構築 EAServer やほかの J2EE 準拠のサーバで EJB コ ン ポーネ ン ト のサービ ス を利用で き る EJB ク ラ イ ア ン ト を構築す る には、 EJB ク ラ イ ア ン ト プ ロ キ シ ウ ィ ザー ド を使い ます。 詳細については、 第 28 章 「EJB ク ラ イ ア ン ト の構築」 を参照 し て く だ さ い。 メ ソ ッ ド 名の予約語 PowerBuilder で作成 さ れなか っ た EAServer コ ン ポーネ ン ト 用にプ ロ キ シ を生成す る と 、 PowerBuilder の予約語を使用す る メ ソ ッ ド の名前が 変更 さ れ ます。 プ ロ キ シ ジ ェ ネ レー タ は、 こ れ ら の メ ソ ッ ド 名の先頭 にア ン ダース コ ア (_) を自動的に追加 し ます。 た と えば、 コ ン ポーネ ン ト に destroy と い う 名前の メ ソ ッ ド があ る 場合、 プ ロ キ シの メ ソ ッ ド は _destroy にな り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 535 コ ンポーネ ン ト メ ソ ッ ド の呼び出 し TO 句の配列の使い方 CORBA IDL では TO 句がサポー ト さ れていないため、 TO 句を使用す る 配列 を 含む PowerBuilder コ ン ポーネ ン ト のプ ロ キ シ を 生成す る 場 合、プ ロ キ シ オブジ ェ ク ト は範囲を単一値 と し て表 し ます。た と えば、 Int ar1[5 TO 10] は Int ar1[6] と 表 し ます。 こ の [6] は、 配列の要 素数を表 し てい ます。 ク ラ イ ア ン ト アプ リ ケーシ ョ ンは、 範囲ではな く 単一値を使用 し て配列を宣言 し なければな り ません。 モ ジ ュ ール名の付加 コ ン ポーネ ン ト を定義す る IDL モジ ュ ールの名前を、 作成 し たプ ロ キ シ オブジ ェ ク ト の名前の前に付加 し てお く と 、 名前が類似す る プ ロ キ シ オブジ ェ ク ト ど う し を容易に判別で き ます。 た と えば、 CTSSecurity モジ ュ ールの SessionInfo コ ン ポーネ ン ト を選択 し て、 ウ ィ ザー ド かプ ロ ジ ェ ク ト ペ イ ン タ の [EAServer パ ッ ケージ名を オブジ ェ ク ト 名の前 に 追 加] オ プ シ ョ ン を オ ン に す る と 、 プ ロ キ シ オ ブ ジ ェ ク ト が ctssecrity_sessioninfo と い う 名前にな り ます。 一部の EAServer シ ス テ ム モジ ュ ール (現在の と こ ろ、 CtsComponents と XDT) では、 名 前の二重定義を避け る 目的か ら 、 常にモジ ュ ール名がオブジ ェ ク ト に 付加 さ れ ます。 パ ッ ケージ名 と IDL モジ ュ ールの名前は普通は同 じ ですが、 異な っ て いて も か ま い ません。 いずれの場合に も 、 前に付加 さ れ る のは IDL モ ジ ュ ールの名前です。 例外の除外 EAServer コ ン ポーネ ン ト のなかには、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン で処理で き る 例外を送出す る も のが数多 く あ り ます。 例外を処理 し な い既存の ク ラ イ ア ン ト ア プ リ ケーシ ョ ン でプ ロ キ シ を 生成 し て使用 し たい場合、 ま たは構築 し てい る ク ラ イ ア ン ト 内で例外を宣言 し た く ない場合は、 ウ ィ ザー ド かプ ロ ジ ェ ク ト ペ イ ン タ で、 生成 さ れたプ ロ キ シか ら 例外を除外で き ます。 ク ラ イ ア ン ト でのエ ラ ー処理について の詳細は、 556 ページの 「エ ラ ー処理」 を参照 し て く だ さ い。 デー タ 型マ ッ ピ ング EAServer コ ン ポーネ ン ト イ ン タ フ ェ ー ス はすべて、 標準の CORBA IDL で定義 さ れます。 EAServer で使用 さ れ る デー タ 型、 各デー タ 型の 対 応 す る CORBA IDL、 お よ び 各 デ ー タ 型 が マ ッ ピ ン グ さ れ る PowerBuilder のデー タ 型の リ ス ト については、『PowerScript リ フ ァ レ ン ス』 マニ ュ アル ま たはオ ン ラ イ ン ヘルプ を参照 し て く だ さ い。 コ ンポーネ ン ト メ ソ ッ ド の呼び出 し EAServer への接続が確立 さ れ、プ ロ キ シ オブジ ェ ク ト かオブジ ェ ク ト が作成 さ れた後では じ めて、 ク ラ イ ア ン ト アプ リ ケーシ ョ ンはサーバ コ ン ポーネ ン ト を使用で き ます。 536 PowerBuilder 第 24 章 EAServer ク ラ イ ア ン ト の構築 コ ン ポーネン ト メ ソ ッ ド の呼び出し ほ と ん ど の コ ン ポーネ ン ト タ イ プで メ ソ ッ ド を呼び出す際は、 以下の 操作を行 う のに必要な PowerScript 文を実行す る 必要があ り ます。 1 CreateInstance メ ソ ッ ド を使用 し て、 コ ン ポーネ ン ト の イ ン ス タ ン ス を作成す る 2 メ ソ ッ ド を呼び出す EJB コ ン ポーネ ン ト メ ソ ッ ド は、 別の方法で呼び出 し ます。 538 ペー ジの 「EJB コ ン ポーネ ン ト メ ソ ッ ド の呼び出 し 」 を参照 し て く だ さ い。 次の ス ク リ プ ト では、サーバ上の コ ン ポーネ ン ト を イ ン ス タ ン ス 化 し 、 コ ン ポーネ ン ト メ ソ ッ ド を 呼び出 し ま す。 こ の例では、 パ ッ ケ ー ジ を CreateInstance メ ソ ッ ド に指定 し て い ま せん。 し た が っ て、 EAServer は、接続オブジ ェ ク ト の Application プ ロ パテ ィ に指定 さ れて い る デフ ォ ル ト パ ッ ケージ を使用 し ます。 例1 // グローバル変数 : // connection myconnect uo_customer iuo_customer string ls_custid long ll_rc ls_custid = Trim(sle_custid.text) ll_rc = myconnect.CreateInstance(iuo_customer) if ll_rc <> 0 then MessageBox("CreateInstance 失敗 ", ll_rc) return 999 end if if iuo_customer.retrieve_balance(ls_custid) != 1 then MessageBox(" エ ラ ー ", " 検索失敗 !") end if 次の ス ク リ プ ト では、サーバ上の コ ン ポーネ ン ト を イ ン ス タ ン ス 化 し て、 デー タ 型が コ ン ポーネ ン ト の ク ラ ス の先祖であ る 変数に、 オ ブ ジ ェ ク ト 参照を割 り 当て ま す。 CreateInstance 関数の第 2 引数には、 コ ン ポーネ ン ト の ク ラ ス名に加え て、 EAServer パ ッ ケージ名 も 指定 し ます。 例2 // グローバル変数 : // connection myconnect uo_person lnv_object string ls_custid long ll_rc ア プ リ ケーシ ョ ン テ ク ニ ッ ク 537 コ ンポーネ ン ト メ ソ ッ ド の呼び出 し ls_custid = Trim(sle_custid.text) ll_rc = myconnect.CreateInstance(lnv_object, & "PB_pkg_1/uo_customer") if ll_rc <> 0 then MessageBox("CreateInstance 失敗 ", ll_rc) return 999 end if if iuo_customer.retrieve_balance(ls_custid) != 1 then MessageBox(" エ ラ ー ", " 検索失敗 !") end if ロー カル イ ン ス タ ン スの呼び出 し デフ ォ ルト で は、 TransactionServer の CreateInstance メ ソ ッ ド は EASserver のネーム サービ ス を呼び出 し てプ ロ キ シ を作成 し ます。 リ モー ト コ ン ポーネ ン ト のプ ロ キ シは、 ロ ーカルで実行 さ れてい る イ ン ス タ ン ス ではな く ネーム サービ ス か ら 返 さ れ る 場合があ り ます。 ロ ー カルの イ ン ス タ ン ス が使用 さ れ る よ う にす る には、 コ ン ポーネ ン ト 名 と し て 「local:package / component」 を指定 し ます。 package はパ ッ ケージ名、 component は コ ン ポーネ ン ト 名です。 コ ン ポーネ ン ト が同 じ サーバに イ ン ス ト ール さ れていない場合、 呼び出 し はエ ラ ーにな り ま す。 EJB コ ン ポーネン ト メ ソ ッ ド の呼び出し EJB コ ン ポーネ ン ト メ ソ ッ ド を呼び出すには、 以下の操作を行 う のに 必要な PowerScript 文を実行す る 必要があ り ます。 1 Lookup 関数を使用 し て、 コ ン ポーネ ン ト のホーム イ ン タ フ ェース にア ク セ スす る 538 2 イ ン タ フ ェ ー ス で メ ソ ッ ド を呼び出 し 、 コ ン ポーネ ン ト の イ ン ス タ ン ス の作成か検索を実行 し て、 コ ン ポーネ ン ト の リ モー ト イ ン タ フ ェースへの参照を取得す る 3 リ モー ト イ ン タ フ ェース で ビ ジネ ス メ ソ ッ ド を呼び出す PowerBuilder 第 24 章 EAServer ク ラ イ ア ン ト の構築 EJBConnection メ ソ ッ ド に適用 さ れない こ と 本節の内容は、 EAServer プ ロ キ シ オブジ ェ ク ト と PowerScript 関数を 使用す る ク ラ イ ア ン ト アプ リ ケーシ ョ ン に適用 さ れ ます。 EJB ク ラ イ ア ン ト プ ロ キ シ と EJBConnection メ ソ ッ ド を使用す る ク ラ イ ア ン ト ア プ リ ケーシ ョ ン で EJB メ ソ ッ ド を呼び出す方法については、 第 28 章 「EJB ク ラ イ ア ン ト の構築」 を参照 し て く だ さ い。 ホーム イ ン タ フ ェ ー ス名の指定 PowerBuilder の、 Lookup 関数には第 3 引数 (省略可能) が用意 さ れて いて、 こ の引数にホーム イ ン タ フ ェ ース名を指定で き ます。 EAServer では、 EJB コ ン ポーネ ン ト に com.sybase.jaguar.component.home.ids と い う プ ロ パテ ィ が設定 さ れ ま す。 home.ids プ ロ パテ ィ が次の よ う な形式 であれば、 Lookup 関数に第 3 引数を指定す る 必要はあ り ません。 IDL:PackageName/ComponentNameHome:1.0 例 IDL:vacation/TripFinderHome:1.0 ただ し 多 く の場合は home.ids プ ロ パテ ィ に java パ ッ ケージの命名ス キーマ を使 う ため、 開発者は EJB イ ン タ フ ェース が確実に見つけ ら れ る よ う に、 第 3 引数を使用 し なければな り ません。 こ の引数には、 先 頭の IDL: と 末尾の :1.0 を除いて、 コ ン ポーネ ン ト の com.sybase.jaguar.component.home.ids プ ロ パテ ィ と 一致 し てい る 文字列 を指定す る 必要があ り ます。 た と えば、 次の よ う な home.ids プ ロ パテ ィ があ る と し ます。 IDL:com/myproj/myejbs/TripFindHome:1.0 こ の場合、 Lookup 関数呼び出 し は次の よ う にな り ます。 myconn.lookup(myTripFindHome,"MyEJBs/TripFindHome", & "com/myproj/myejbs/TripFinderHome") あ る いは、 ド ッ ト 表記で指定す る ホー ム イ ン タ フ ェ ー ス の完全修飾 Java ク ラ ス名を使用す る こ と も で き ます。 た と えば、 次の よ う にな り ます。 ts.lookup(MyCartHome, "MyEJBs/TripFindHome", & "com.myproj.myejbs.TripFinderHome") Lookup の大文字 と 小文字の区別 EAServer の Lookup では大文字 と 小文字が区別 さ れ ます。Lookup 関数の 引数に指定す る 文字列の大文字 と 小文字は、 home.ids プ ロ パテ ィ の大 文字 と 小文字に一致 さ せ る 必要があ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 539 コ ンポーネ ン ト メ ソ ッ ド の呼び出 し EJB のイ ン ス タ ン ス の作成や検索 EAServer では、 3 種類の EJB (セ ッ シ ョ ン Bean、 エ ン テ ィ テ ィ Bean、 お よ び メ ッ セージ駆動型 Bean) をサポー ト し てい ます。 セ ッ シ ョ ン Bean は、ク ラ イ ア ン ト の リ ク エ ス ト に応答 し て作成 さ れ ま す。 ク ラ イ ア ン ト は、 通常の場合、 その ク ラ イ ア ン ト セ ッ シ ョ ンの持 続中はセ ッ シ ョ ン Bean を排他的に使用 し ます。 エ ン テ ィ テ ィ Bean は、 デー タ ベー ス に保存 さ れ る 永続情報を表 し ま す。 ク ラ イ ア ン ト は、 ほかの ク ラ イ ア ン ト と 同時にエ ン テ ィ テ ィ Bean を使用 し ます。エ ン テ ィ テ ィ Bean は ク ラ イ ア ン ト の有効期間が終了 し て も 持続す る ため、 エ ン テ ィ テ ィ Bean がすでに作成 さ れてい る 場合 は、 主キーの ク ラ ス 名を使用 し て、 既存の コ ン ポーネ ン ト の識別や検 索を行 う 必要があ り ます。 メ ッ セージ駆動型 Bean は ス テー ト レ ス セ ッ シ ョ ン Bean に似てい ます が、 JMS メ ッ セージのみに応答 し 、 直接の ク ラ イ ア ン ト イ ン タ フ ェ ー ス は備え てい ません。 次の例では、 E コ マース のシ ョ ッ ピ ン グ カー ト 機能を提供す る EJB コ ン ポーネ ン ト が EAServer 上で実行 さ れてい る こ と を想定 し てい ます。 こ の コ ン ポーネ ン ト は Cart と 呼ばれ、 Shopping と い う パ ッ ケージに含 ま れてい ます。 こ の ス ク リ プ ト は、 Cart コ ン ポーネ ン ト を イ ン ス タ ン ス化 し 、 い く つかの コ ン ポーネ ン ト メ ソ ッ ド を呼び出 し ます。次の例では、Lookup メ ソ ッ ド の第 2 引数に、 コ ン ポーネ ン ト 名 と EAServer パ ッ ケージ名を 指定 し てい ます。 例1 // イ ン ス タ ン ス変数 : //Connection myconnect CartHome MyCartHome // EJB のホーム イ ン タ フ ェ ース Cart MyShoppingCart // EJB の リ モー ト イ ン タ フ ェ ース long ll_result // ホーム イ ン タ フ ェ ース を取得 ll_result = & myconnect.Lookup(MyCartHome, "Shopping/Cart", & "com.sybase.shopping.Cart") // Cart コ ンポーネ ン ト のビ ジネス ロ ジ ッ クへの参照を取得 TRY MyShoppingCart = MyCartHome.Create() CATCH (ctscomponents_createexception ce) MessageBox(" 例外を作成 ", ce.getmessage()) // 例外を処理 END TRY 540 PowerBuilder 第 24 章 EAServer ク ラ イ ア ン ト の構築 // シ ョ ッ ピ ング カ ー ト を使用 MyShoppingCart.AddItem(66) MyShoppingCart.Purchase() CartEJB コ ン ポーネ ン ト がエ ン テ ィ テ ィ Bean と し て定義 さ れて い る 場合は、 ス ク リ プ ト は findByPrimaryKey メ ソ ッ ド を使用 し て、 既存 の コ ン ポーネ ン ト か永続 コ ン ポーネ ン ト を検索 し 参照 し な ければな り ません。 例2 // イ ン ス タ ン ス変数 : //Connection myconnect CartHome MyCartHome // EJB のホーム イ ン タ フ ェ ース Cart MyCart // EJB の リ モー ト イ ン タ フ ェ ース long ll_result // ホーム イ ン タ フ ェ ース を取得 ll_result = & myconnect.Lookup(MyCartHome, "Shopping/Cart", & "com.sybase.shopping.Cart") // 前のセ ッ シ ョ ンからの Cart への参照を取得 TRY MyCart = MyCartHome.findByPrimaryKey("MYkey") CATCH ( ctscomponents_finderexception fe ) MessageBox(" 検索例外 ", & fe.getmessage()) // 例外を処理 END TRY // シ ョ ッ ピ ング カ ー ト を使用 MyCart.AddItem(66) MyCart.Purchase() 制約 EJB オブジ ェ ク ト に対 し て PowerBuilder ク ラ イ ア ン ト は CORBA ク ラ イ ア ン ト の役割を果た し ま す。 つ ま り 、 PowerBuilder ク ラ イ ア ン ト に は Java ク ラ イ ア ン ト の全機能は あ り ま せん。 Java ク ラ イ ア ン ト は、 javax.ejb.EJBObject イ ン タ フ ェ ー ス か ら 継承 し た メ ソ ッ ド を 使用で き ます。 た と えば、Java ク ラ イ ア ン ト は リ モー ト イ ン タ フ ェース イ ン ス タ ン ス のハン ド ルを取得で き ます。 ハン ド ルは、 ク ラ イ ア ン ト と Bean の間の セ ッ シ ョ ン状態を示すバ イ ナ リ エ ン コ ーデ ィ ン グです。 ク ラ イ ア ン ト はハン ド ルを取得 し 、それをデ ィ ス ク に保存す る か別の場所に送信 し 、 後でセ ッ シ ョ ン を再び確立で き ま す。 PowerBuilder ク ラ イ ア ン ト が同 等の機能を得 る には、 JaguarORB オブジ ェ ク ト の Object_To_String 関数 と String_To_Object 関数を使用す る 必要があ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 541 コ ンポーネ ン ト メ ソ ッ ド の呼び出 し 例外の処理 EJB コ ン ポーネ ン ト の リ モー ト イ ン タ フ ェース に、 エ ラ ーか警告が示 さ れ る 場合があ り ます。 EJB コ ン ポーネ ン ト か ら 送出 さ れた標準例外 は、 CORBA シ ス テ ム例外にマ ッ ピ ン グ さ れ ます。 ま た EJB コ ン ポー ネ ン ト が、 ユーザ定義の例外を送出す る 場合 も あ り ます。 EAServer コ ン ポーネ ン ト か ら 送出 さ れた例外の処理については、556 ページの 「エ ラ ー処理」 を参照 し て く だ さ い。 EAServer 内の PowerBuilder コ ン ポーネ ン ト か ら の EJB コ ン ポーネ ン ト の呼び出 し については、 507 ページの 「EJB コ ン ポーネ ン ト へのア ク セ ス」 を参照 し て く だ さ い。 イ ン スタ ン スの破棄 プ ロキシ オブ ジ ェ ク ト のイ ン ス タ ン スの破 棄 EAServer コ ン ポーネ ン ト を使い終わ っ た ら 、 DESTROY 文 を使用 し て EAServer プ ロ キ シ オブジ ェ ク ト を明示的に破棄す る か、 PowerBuilder のガベージ コ レ ク シ ョ ン 機能 を 利用 し て オブ ジ ェ ク ト を 自動的に メ モ リ か ら 消去で き ます。 いずれの場合で も 、 ク ラ イ ア ン ト サ イ ド プ ロ キ シ オブジ ェ ク ト の破棄は、サーバ コ ン ポーネ ン ト の有効期間に影響 を与え ません。 サーバ コ ン ポーネ ン ト の破棄は、 EAServer に よ っ て処 理 さ れ ます。 コ ンポーネ ン ト のイ ン ス タ ン スの非ア ク テ ィ ブ化 コ ン ポーネ ン ト の自動的なデマ ケーシ ョ ン / 不活性化設定が無効であ り 、 し か も コ ン ポーネ ン ト が ま だ ク ラ イ ア ン ト にバ イ ン ド さ れてい る 間に ク ラ イ ア ン ト ア プ リ ケ ーシ ョ ン を 閉 じ た (コ ン ポーネ ン ト が SetComplete も SetAbort も 呼び出 さ なか っ た) 場合には、 コ ン ポーネ ン ト は非ア ク テ ィ ブに さ れ ません。 コ ン ポーネ ン ト の イ ン ス タ ン ス を非 ア ク テ ィ ブにす る には、 次のいずれかの操作を行い ます。 542 • ク ラ イ ア ン ト アプ リ ケーシ ョ ン の Close イ ベン ト で、 (SetComplete か SetAbort を呼び出 し て) コ ン ポーネ ン ト を非ア ク テ ィ ブにす る サーバ コ ン ポーネ ン ト の メ ソ ッ ド を呼び出 し ます。 • コ ン ポーネ ン ト の Timeout プ ロ パテ ィ を 0 に設定 し て し ま う と 、コ ン ポーネ ン ト が タ イ ム ア ウ ト し な く な る ので、0 以外の値に設定 し ます。 PowerBuilder 第 24 章 EAServer ク ラ イ ア ン ト の構築 JaguarORB オブ ジ ェ ク ト の使い方 CORBA 互換 ク ラ イ ア ン ト を作成す る には、 接続オブジ ェ ク ト のかわ り に JaguarORB オブジ ェ ク ト を使用 し て、 サーバへの接続を確立 し ま す。 JaguarORB オブジ ェ ク ト を使 う と 、 C++ ク ラ イ ア ン ト と 同 じ 方法 で PowerBuilder ク ラ イ ア ン ト か ら EAServer にア ク セ ス で き ます。 2 つの方法 JaguarORB オブジ ェ ク ト は、 String_To_Object 関数 と Resolve_Initial_References 関数の 2 つの方法で コ ン ポーネ ン ト イ ン タ フ ェース にア ク セ ス で き ます。 String_To_Object 関数を使 う と 、 接続オブジ ェ ク ト の ConnectToServer 関 数 と CreateInstance 関数が内部的に行 う 処理 と 同 じ 処理が行われ ます。 String_To_Object 関数を使用 し て、 コ ン ポーネ ン ト を ホ ス ト す る サーバ への接続方法を記述す る 文字列引数を渡す こ と で、 プ ロ キ シ イ ン ス タ ン ス を イ ン ス タ ン ス化で き ます。 こ の方法の弱点は、 ネー ミ ン グ サー ビ ス API を 明示的に使用す る こ と に よ っ て提供 さ れ る サーバ ア ド レ ス アブ ス ト ラ ク シ ョ ン を活用で き ない こ と です。 EAServer ネー ミ ン グ サービ ス API を使用 し たい場合は、 Resolve_Initial_References 関数を使用 し て初期状態のネー ミ ン グ コ ン テ キ ス ト を取得で き ます。 ただ し 、 こ の方法は非推奨 メ ソ ッ ド SessionManager::Factory create を使 う 必要があ る ため、 使用 し ない こ と をお勧め し ます。 ほ と ん ど の PowerBuilder ク ラ イ ア ン ト は、 CORBA ネー ミ ン グ サービ ス を明示的に使用する必要はあ り ません。 かわ り に、 接続オブジ ェ ク ト の CreateInstance 関数 と Lookup 関数を使用 し て EAServer コ ン ポーネ ン ト の イ ン ス タ ン ス を作成 し た と き に自動的に実 行 さ れ る 名前解決を使用で き ます。 ネー ミ ング サービ ス について EAServer ネー ミ ン グ サービ ス は、 CORBA CosNaming コ ン ポーネ ン ト (オブジ ェ ク ト のバ イ ン ド と 参照のサポー ト を提供する イ ン タ フ ェース の コ レ ク シ ョ ン) の実装です。 CosNaming モジ ュ ールについての詳細 は、 EAServer イ ン タ フ ェース リ ポジ ト リ のマニ ュ アルを参照し て く だ さ い。 イ ン タ フ ェース リ ポジ ト リ のマニ ュ アルは、 URL http://yourhost:yourport/ir/ のサーバに接続すれば、 Web ブ ラ ウ ザで参照 で き ます。 こ こ で、 yourhost はサーバのホ ス ト 名、 yourport は HTTP ポー ト 番号です。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 543 JaguarORB オブ ジ ェ ク ト の使い方 String_To_Object を 使用し たイ ン スタ ン ス化 SessionManage イ ン タ フ ェ ースのプ ロキシ の取得 CORBA ネー ミ ン グ サービ ス を明示的に使用せずにプ ロ キ シ を イ ン ス タ ン ス 化す る には、 SessionManager モジ ュ ールに定義 さ れてい る イ ン タ フ ェース と 一緒に、 JaguarORB オブジ ェ ク ト の String_To_Object 関数 を使用 し ます。 Manager、 Session、 お よ び Factory イ ン タ フ ェ ース を使 用 す る に は、 事 前 に、 EAServer プ ロ キ シ ウ ィ ザ ー ド を 使 用 し て SessionManager モ ジ ュ ールのプ ロ キ シ ラ イ ブ ラ リ プ ロ ジ ェ ク ト を 作 成 し 、 プ ロ ジ ェ ク ト を構築 し て、 生成 さ れたプ ロ キ シ ラ イ ブ ラ リ を ク ラ イ ア ン ト タ ーゲ ッ ト の ラ イ ブ ラ リ リ ス ト に含めてお く 必要が あ り ます。 サーバの識別 サーバ と 対話す る には、 SessionManager::Manager イ ン タ フ ェ ー ス を使 用 し ま す。 サーバは、 Interoperable Object Reference (IOR) か URL を 使 う と 識別で き ます。IOR 文字列は、サーバのホ ス ト ア ド レ ス と 、サー バが IIOP リ ク エ ス ト を受け取 る ポー ト を エ ン コ ー ド し ます。サーバは 起動のたびに、標準エ ン コ ーデ ィ ン グで 16 進にエ ン コ ー ド さ れた IOR 文字列を、 接続受け付け ご と に 2 つの フ ァ イ ルに書 き 込み ます。 1 つ の フ ァ イ ルには IOR 文字列その も のが格納 さ れ、 も う 1 つの フ ァ イ ル には IOR が、 APPLET タ グに挿入可能な HTML PARAM 定義の一部 と し て格納 さ れ ます。 フ ァ イ ルは、 EAServer デ ィ レ ク ト リ の HTML サブ デ ィ レ ク ト リ に常駐 し て い ま す。 こ れ ら の フ ァ イ ルのいずれかか ら IOR 文字列を取得す る よ う に、 ク ラ イ ア ン ト の コ ー ド を記述で き ます。 認証済みセ ッ シ ョ ンの 作成 ORB を初期化 し てサーバの IOR か URL を取得 し た後で、 String_To_Object 関数で文字列を CORBA オブジ ェ ク ト 参照に変換 し 、 それを _Narrow 関数で Manager イ ン タ フ ェースへの参照に変換で き ま す。 その後で、 Manager イ ン タ フ ェース の createSession メ ソ ッ ド を使 用 し て、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン と サーバの間で認証 さ れた セ ッ シ ョ ン を作成 し ます。 コ ンポーネ ン ト のイ ン タ フ ェ ースへの参照の 作成 セ ッ シ ョ ンの lookup メ ソ ッ ド を使用 し て、 呼び出 し たい コ ン ポーネ ン ト への プ ロ キ シ オ ブ ジ ェ ク ト 参照の フ ァ ク ト リ を 返 し ま す。 次に、 Factory オブジ ェ ク ト の create メ ソ ッ ド を呼び出 し て、 コ ン ポーネ ン ト のプ ロ キ シ を取得 し ます。create メ ソ ッ ド で CORBA オブジ ェ ク ト 参照 が返 さ れた ら 、 _Narrow 関数を使用 し て、 それを コ ン ポーネ ン ト の イ ン タ フ ェースへの参照に変換で き ます。 544 PowerBuilder 第 24 章 EAServer ク ラ イ ア ン ト の構築 コ ン ポーネ ン ト のデフ ォ ル ト 名はパ ッ ケージ名 と コ ン ポーネ ン ト 名で 構成 さ れ、 calculator/calc の よ う に ス ラ ッ シ ュ で区切 ら れてい ます。 た だ し 、コ ン ポーネ ン ト の com.sybase.jaguar.component.naming プ ロ パテ ィ で 別 の 名 前 を 指 定 す る こ と も 可 能 で す。 た と え ば、 USA/MyCompany/FinanceServer/Payroll な ど の論理名 を 指定で き ま す。 ネー ミ ン グ サービ ス の環境設定についての詳細は、 『EAServer シ ス テ ム管理者ガ イ ド 』 マニ ュ アルのネーム ・ サービ ス の節を参照 し て く だ さ い。 例 次の例では、 String_To_Object 関数の第 1 引数に、 ク ラ ス タ 内の 2 つの サーバの URL が含まれてい ます。 // PowerBuilder オブ ジ ェ ク ト JaguarORB my_JaguarORB CORBAObject my_corbaobj n_bank_acct my_acct // プ ロキシ オブ ジ ェ ク ト Manager my_manager Session my_session Factory my_factory long ll_return my_JaguarORB = CREATE JaguarORB //ORB を初期化 ll_return = my_JaguarORB.init("ORBRetryCount=3, ORBRetryDelay=1000") //URL 文字列を オブ ジ ェ ク ト 参照に変換 ll_return = my_JaguarORB.String_To_Object (''iiop://JagOne:9000;iiop://JagTwo:9000'', my_corbaobj) //Manager イ ン タ フ ェ ースへのオブ ジ ェ ク ト 参照を制限 ll_return = my_corbaobj._narrow(my_manager, "SessionManager/Manager") // セ ッ シ ョ ン オブ ジ ェ ク ト 参照を作成 my_session = my_manager.createSession("jagadmin", "") // リ モー ト イ ン タ フ ェ ースへの // プ ロキシ オブ ジ ェ ク ト 参照の Factory を作成 my_corbaobj = my_session.lookup("Bank/n_bank_acct ") my_corbaobj._narrow(my_Factory, "SessionManager/Factory") ア プ リ ケーシ ョ ン テ ク ニ ッ ク 545 JaguarORB オブ ジ ェ ク ト の使い方 // プ ロキシ を取得 し 、 それを リ モー ト イ ン タ フ ェ ースに // 制限 し て メ ソ ッ ド を呼び出す my_corbaobj = my_Factory.create() my_corbaobj._narrow(my_acct, "Bank/n_bank_acct") my_acct.withdraw(1000.0) こ の例では、 コ ン ポーネ ン ト は EJB コ ン ポーネ ン ト です。 ホーム イ ン タ フ ェ ー ス は、 CORBA コ ン ポーネ ン ト に対 し て フ ァ ク ト リ イ ン タ フ ェ ース が行 う の と 同 じ 役割を、 EJB に対 し て効果的に実行 し ます。 JaguarORB my_orb CORBAObject my_corbaobj Manager my_mgr Session my_session CartHome my_cartHome Cart my_cart my_orb = CREATE JaguarORB my_orb.init("ORBLogFile='c:¥temp¥orblog'") my_orb.String_to_Object("iiop://svr1:9000", & my_corbaObj) my_corbaObj._narrow(my_mgr, "SessionManager/Manager" ) my_Session = my_mgr.createSession("jagadmin", "") my_corbaObj = my_session.lookup("Cart") my_corbaObj._narrow(my_CartHome, "shopping/CartHome") my_corbaObj = my_CartHome.create() my_Cart.addItem() 接続オブ ジ ェ ク ト の使い方 PowerBuilder 9 では、 接続オブジ ェ ク ト の Lookup 関数を使用 し て、 EJB コ ン ポーネ ン ト の ホ ー ム イ ン タ フ ェ ー ス への参照 を 取得で き ま す。 538 ページの 「EJB コ ン ポーネ ン ト メ ソ ッ ド の呼び出 し 」 を参照 し て く だ さ い。 546 PowerBuilder 第 24 章 EAServer ク ラ イ ア ン ト の構築 ネーミ ン グ サービ ス API によ る イ ン ス タ ン ス 化 CosNaming イ ン タ フ ェ ース と SessionManage イ ン タ フ ェ ースのプ ロキシ の取得 CORBA ネー ミ ン グ サービ ス API を使用 し てプ ロ キ シ を イ ン ス タ ン ス 化す る には、ネー ミ ン グ サービ ス イ ン タ フ ェース のプ ロ キ シ を生成 し て、 生成 し たプ ロ キ シ を ク ラ イ ア ン ト の ラ イ ブ ラ リ リ ス ト に含め る 必 要があ り ます。EAServer プ ロ キ シ ウ ィ ザー ド を使用 し て CosNaming モ ジ ュ ールのプ ロ キ シ プ ロ ジ ェ ク ト を作成 し 、プ ロ キ シ ラ イ ブ ラ リ を作 成す る ためのプ ロ ジ ェ ク ト を作成 し て、 プ ロ キ シ ラ イ ブ ラ リ を ク ラ イ ア ン ト タ ーゲ ッ ト の ラ イ ブ ラ リ リ ス ト に追加 し ます。 SessionManager モジ ュ ールに も プ ロ キ シが必要です。 初期状態のネー ミ ング コ ン テキス ト の取得 ORB の初期化後、 Resolve_Initial_References 関数を呼び出 し て初期状態 の ネ ー ミ ン グ コ ン テ キ ス ト を 取 得 し 、 _Narrow を 使 用 し て そ れ を CORBA ネー ミ ン グ コ ン テ キ ス ト イ ン タ フ ェースへの参照に変換 し ま す。 次の例に示す よ う に、 ク ラ ス 名に omg.orb を含めて、 CosNaming パ ッ ケージ を識別 し なければな り ません。 ネー ミ ング コ ン テキ ス ト の解決 ネー ミ ン グ コ ン テ キ ス ト を 解決 し て コ ン ポーネ ン ト の Factory オ ブ ジ ェ ク ト へ の 参 照 を 取 得 し、 そ の 後 で そ の イ ン タ フ ェ ー ス を SessionManager::Factory イ ン タ フ ェ ー ス への参照に制限す る 必要が あ り ます。 resolve メ ソ ッ ド は、 一連の NameComponent 構造体であ る 名前 パ ラ メ ー タ を取 り ます。 各 NameComponent 構造体には、 コ ン ポーネ ン ト を識別す る id 属性 と 、 コ ン ポーネ ン ト の記述に使用で き る kind 属性 があ り ます。 次の例では、 名前には 1 つの コ ン ポーネ ン ト し かあ り ま せん。 コ ンポーネ ン ト のイ ン タ フ ェ ースへの参照の 作成 Factory オブジ ェ ク ト の create メ ソ ッ ド を呼び出 し て、 コ ン ポーネ ン ト のプ ロ キ シ を取得 し ます。create メ ソ ッ ド で CORBA オブジ ェ ク ト 参照 が返 さ れた ら 、 _Narrow 関数を使用 し て、 それを コ ン ポーネ ン ト の イ ン タ フ ェ ースへの参照に変換で き ます。 例 次の例 で 使用 さ れ て い る NamingContext 型 と NameComponent 型は、 EAServer の CosNaming パ ッ ケージか ら イ ン ポー ト さ れたプ ロ キ シで、 Factory 型は SessionManager パ ッ ケージか ら イ ン ポー ト さ れ ます。 CORBAObject my_corbaobj JaguarORB my_orb NamingContext my_nc NameComponent the_name[] Factory my_Factory n_jagcomp my_jagcomp my_orb = CREATE JaguarORB // URL の名前は単一引用符で囲む my_orb.init("ORBNameServiceURL='iiop://server1:9000'") ア プ リ ケーシ ョ ン テ ク ニ ッ ク 547 ク ラ イ ア ン ト と コ ンポーネ ン ト を区別する ト ラ ンザ ク シ ョ ン my_orb.Resolve_Initial_References("NameService", & my_corbaobj) my_corbaobj._narrow(my_nc, & "omg.org/CosNaming/NamingContext") the_name[1].id = "mypackage/n_jagcomp" the_name[1].kind = "" my_corbaobj = my_nc.resolve(the_name) my_corbaobj._narrow(my_Factory, & "SessionManager/Factory") my_corbaobj = my_Factory.create("jagadmin","") my_corbaobj._narrow(my_jagcomp, "mypackage/n_jagcomp") my_jagcomp.getdata() ク ラ イ アン ト と コ ン ポーネン ト を 区別する ト ラ ン ザク ショ ン OTS ス タ イ ル と し て マー ク さ れた ク ラ イ ア ン ト ア プ リ ケーシ ョ ン と EAServer コ ン ポーネ ン ト は、CORBACurrent コ ン テ キ ス ト サービ ス オ ブジ ェ ク ト の関数を使用 し て、 EAServer ト ラ ンザ ク シ ョ ンに関す る 情 報の作成、 制御お よ び取得がで き ま す。 CORBACurrent オブジ ェ ク ト は、 CORBACurrent イ ン タ フ ェ ー ス 用に定義 さ れた数多 く の メ ソ ッ ド を備え てい ます。 2 相コ ミ ッ ト 548 ク ラ イ ア ン ト ま たは コ ン ポーネ ン ト を マー ク し た ト ラ ンザ ク シ ョ ン の コ ン ポーネ ン ト は、 OTS/XA ト ラ ンザ ク シ ョ ン コ ーデ ィ ネー タ を使用 す る サーバ上で実行 さ れ て い な ければな り ま せん。 こ の ト ラ ン ザ ク シ ョ ン コ ーデ ィ ネー タ は、 シ ス テ ム障害か ら 保護す る ため、 すべての 参加者か ら の詳細レ コ ー ド を使用す る 、 2 相 コ ミ ッ ト プ ロ ト コ ルをサ ポー ト し ます。 準備フ ェ ーズでは、 ト ラ ンザ ク シ ョ ン コ ーデ ィ ネー タ が ト ラ ンザ ク シ ョ ン の各参加者か ら 、 その ト ラ ン ザ ク シ ョ ン が コ ミ ッ ト で き る と い う 保証を得て、 準備レ コ ー ド を ロ グに書 き 込みます。 コ ミ ッ ト フ ェ ーズ では、 コ ーデ ィ ネー タ はすべて の参加者に対 し 、 リ ソ ー ス が解放 さ れ、 ト ラ ン ザ ク シ ョ ン が コ ミ ッ ト さ れ、 コ ミ ッ ト レ コ ー ド が ロ グに記録 さ れ る こ と を通知 し ます。 PowerBuilder 第 24 章 EAServer ク ラ イ ア ン ト の構築 2 相 コ ミ ッ ト を 使用す る コ ン ポーネ ン ト は、 XA 準拠の PowerBuilder デー タ ベー ス イ ン タ フ ェ ー ス を 使用 し てデー タ ベー ス に接続 し な け ればな り ません。 Windows NT の場合、 Oracle 8.0.x (8.1.x ではな く ) で は Oracle O73 イ ン タ フ ェ ース と O84 イ ン タ フ ェ ース を使用で き 、 Sun の JRE 1.2 と jConnect 5.2 では JDB interface for JDBC を使用で き ます。 コ ン ポーネ ン ト が UNIX ホ ス ト 上で実行 さ れ て い る 場合は、 Sybase Adaptive Server Enterprise CT-LIB イ ン タ フ ェース (SYJ) を使用で き ま す。 OTS/XA ト ラ ンザ ク シ ョ ン コ ーデ ィ ネー タ は、 接続キ ャ ッ シ ュ ではな く XA リ ソ ース を使用 し て ト ラ ンザ ク シ ョ ン を管理 し ます。XA リ ソ ー ス の作成 と 管理についての詳細は、 『EAServer シ ス テ ム管理者ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 コ ンポーネ ン ト を OTS ス タ イルにする ト ラ ン ザ ク シ ョ ン を管理す る EAServer コ ン ポーネ ン ト を作成す る に は、 EAServer プ ロ ジ ェ ク ト ウ ィ ザー ド か プ ロ ジ ェ ク ト ペ イ ン タ の [OTS ス タ イ ル] ボ ッ ク ス を オ ンに し ます。 ま た、 コ ン ポーネ ン ト 配布 後、 Jaguar Manager の コ ン ポーネ ン ト のプ ロ パテ ィ シー ト で、 [ ト ラ ン ザ ク シ ョ ン] タ ブの [OTS ス タ イ ル] を選択す る こ と も 可能です。 CORBACurrent オブ ジ ェ ク ト の初期化 CORBACurrent コ ン テ キ ス ト サービ ス オブジ ェ ク ト の関数を呼び出す 前に、GetContextService 関数を使用 し てオブジ ェ ク ト の イ ン ス タ ン ス を 作成 し 、次に Init 関数を使用 し てその イ ン ス タ ン ス を初期化す る 必要が あ り ます。 OTS ス タ イ ルの コ ン ポーネ ン ト が管理す る ト ラ ンザ ク シ ョ ン では、 Init 関数を引数な し で呼び出 し ます。 GetContextService("CORBACurrent", myCorbCurr) myCorbCurr.Init() ク ラ イ ア ン ト を区別す る ト ラ ンザ ク シ ョ ン では、 Init 関数に引数を指定 し て呼び出 さ な ければな り ません。 引数は、 すでに接続を確立 し た接 続オブ ジ ェ ク ト の イ ン ス タ ン ス か有効な EAServer ホ ス ト を 識別す る URL です。 移植性が高いため、 接続オブジ ェ ク ト を使用す る 方法が よ く 用い ら れ ます。 myCorbCurr.Init( myconnect ) // または myCorbCurr.Init( "iiop://localhost:9000") ア プ リ ケーシ ョ ン テ ク ニ ッ ク 549 ク ラ イ ア ン ト と コ ンポーネ ン ト を区別する ト ラ ンザ ク シ ョ ン ト ラ ンザ ク シ ョ ンの開 始 と 終了 ク ラ イ アン ト かコ ン ポーネン ト を 区別する ト ラ ン ザク ショ ン を 開始する には BeginTransaction 関数を呼び出 し 、 終了す る には CommitTransaction か RollbackTransaction を呼び出 し ます。 ト ラ ンザ ク シ ョ ン に関与す る た め イ ン ス タ ン ス 化す る コ ン ポーネ ン ト は、 ト ラ ン ザ ク シ ョ ン を サポー ト し ていなければな り ません。 // イ ン ス タ ン ス変数 : // CORBACurrent corbcurr // Connection myconnect int li_rc long ll_rc boolean lb_rc, lb_success ll_rc = myconnect.CreateInstance(mycomponent) li_rc = this.GetContextService("CORBACurrent", & corbcurr) IF li_rc <> 1 THEN // エ ラ ーを処理 RETURN END IF li_rc = corbcurr.Init( myconnect ) IF li_rc <> 0 THEN // エ ラ ーを処理 RETURN END IF lb_rc = corbcurr.BeginTransaction() // サーバ上で処理を実行 // 成功か失敗かを検査 ... IF lb_success THEN corbcurr.CommitTransaction() ELSE corbcurr.RollbackTransaction() END IF ネス ト さ れない ト ラ ンザク シ ョ ン 2 番目の ト ラ ン ザ ク シ ョ ン は、 最初の ト ラ ン ザ ク シ ョ ン の コ ミ ッ ト か ロ ールバ ッ ク が完了す る ま では開始で き ません。 550 PowerBuilder 第 24 章 EAServer ク ラ イ ア ン ト の構築 コ ンポーネン ト が OTS ス タ イ ル と し てマー ク さ れてい る場合、EAServer はコ ン ポーネン ト がイ ン ス タ ン ス 化さ れたと き にはト ラ ン ザク ショ ン を 開始し ま せん。 EAServer は、コ ン ポーネン ト が CORBACurrent オブジ ェ ク ト の イ ン ス タ ン ス で BeginTransaction 関数 を 呼び出 し て ト ラ ン ザ ク シ ョ ン を開始す る も の と みな し ます。 SetComplete を呼び出 さ ない コ ン ポーネ ン ト が ト ラ ン ザ ク シ ョ ン を開始 し て SetComplete を呼び出 すには、 その前に ト ラ ンザ ク シ ョ ン の コ ミ ッ ト か ロ ールバ ッ ク を実行 す る 必要があ り ます。 ト ラ ンザ ク シ ョ ンは、 タ イ ム ア ウ ト す る か別の ト ラ ンザ ク シ ョ ンに よ っ て選択 さ れ る ま では、 孤立 し てい ます。 ト ラ ンザク シ ョ ンに関 する情報の取得 CORBACurrent には、 ト ラ ン ザ ク シ ョ ン に関す る 情報を取得す る ため の GetStatus と GetTransactionName と い う 2 つ の 関 数 が あ り ま す。 GetStatus は、 ト ラ ンザ ク シ ョ ン がア ク テ ィ ブか、 ロ ールバ ッ ク のマー ク が付い て い る か、 準備 フ ェ ーズ に あ る か コ ミ ッ ト フ ェ ーズ に あ る か、 ま たは コ ミ ッ ト 済みか ロ ールバ ッ ク 済みか を示す Integer 型の値を 返 し ま す。 GetTransactionName は、 現行 ト ラ ン ザ ク シ ョ ン を 識別す る String 型の値を返 し ます。こ れは、デバ ッ グで使用す る ための関数です。 ト ラ ンザク シ ョ ンの一 時停止 と 再開 呼び出 し ス レ ッ ド は、 ス レ ッ ド が ト ラ ンザ ク シ ョ ン以外の処理を実行 し てい る 間は ト ラ ンザ ク シ ョ ン を一時停止 し 、 その後、 その ト ラ ンザ ク シ ョ ン を再開で き ます。 SuspendTransaction は、 ResumeTransaction 関 数に渡す こ と が で き る ト ラ ン ザ ク シ ョ ン へのハ ン ド ル を 返 し ま す。 ResumeTransaction は、 同 じ 実行 コ ン テ キ ス ト 内にあ る 別の ス レ ッ ド か ら 呼び出せ ます。 次の例では、 ト ラ ン ザ ク シ ョ ン が同 じ ス レ ッ ド に再 度関連付け ら れてい ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 551 サーバ メ ッ セージ返送の要求 long ll_rc unsignedlong ll_handle ... ll_rc = corbcurr.BeginTransaction() // ト ラ ンザク シ ョ ン処理を実行 ll_handle = corbcurr.SuspendTransaction() // 非 ト ラ ンザク シ ョ ン処理を実行 corbcurr.ResumeTransaction(ll_handle) // さ ら に ト ラ ンザク シ ョ ン処理を実行 ト ラ ンザ ク シ ョ ンの タ イムアウ ト 時間の設定 呼び出 し 元の ス レ ッ ド で、 ト ラ ンザ ク シ ョ ン を ロ ールバ ッ ク す る タ イ ム ア ウ ト 時間を指定で き ます。 次の例では、 タ イ ム ア ウ ト 時間を 3 分 (180 秒) に設定 し てい ます。 integer li_rc li_rc = this.GetContextService("CORBACurrent", & corbcurr) IF li_rc <> 1 THEN // エ ラ ーを処理 し て復帰 END IF li_rc = corbcurr.Init() IF li_rc <> 1 THEN // エ ラ ーを処理 し て復帰 END IF corbcurr.SetTimeout(180) corbcurr.BeginTransaction() サーバ メ ッ セージ返送の要求 サーバ プ ッ シ ュのシ ミ ュ レーシ ョ ン 552 ク ラ イ ア ン ト アプ リ ケーシ ョ ンは、 PowerBuilder オブジ ェ ク ト 参照を EAServer に渡せません。 し たが っ て、 PowerBuilder オブジ ェ ク ト 参照 を使用 し て も 、 サーバか ら PowerBuilder ク ラ イ ア ン ト に メ ッ セージ を プ ッ シ ュ で き ません。 し か し 、 ク ラ イ ア ン ト 上の共有オブジ ェ ク ト を 使用 し て EAServer と 通信す る こ と に よ っ て、 こ の動作を シ ミ ュ レー ト す る こ と は可能です。 ク ラ イ ア ン ト 上の共有オブジ ェ ク ト がサーバか ら デー タ を プルす る ため、 こ のテ ク ニ ッ ク は ク ラ イ ア ン ト プル と みな す こ と がで き ます。 PowerBuilder 第 24 章 EAServer ク ラ イ ア ン ト の構築 動作 サ ー バ プ ッ シ ュ を シ ミ ュ レ ー ト す る に は、 ク ラ イ ア ン ト は、 SharedObjectRegister 関数 と SharedObjectGet 関数を使用 し て、 共有オブ ジ ェ ク ト を作成 し ます。 オブジ ェ ク ト が作成 さ れた ら 、 ク ラ イ ア ン ト 上の メ イ ン ス レ ッ ド は、 共有オブジ ェ ク ト の メ ソ ッ ド の非同期呼び出 し を行っ て、 コ ールバ ッ ク オブジ ェ ク ト を渡 し ます。 こ の コ ールバ ッ ク オブジ ェ ク ト は、 サーバ上で処理が終了 し た と き に通知 さ れ ま す。 共有オブジ ェ ク ト の メ ソ ッ ド は、処理を行 う EAServer コ ン ポーネ ン ト メ ソ ッ ド の同期呼び出 し を行い ます。 共有オブジ ェ ク ト は ク ラ イ ア ン ト 上の別の ス レ ッ ド で動作 し てい る ため、 サーバ上でプ ロ セ ス を実行 し なが ら 、 ク ラ イ ア ン ト 上の メ イ ン ス レ ッ ド はほかの作業を続行で き ます。 EAServer の非同期処理 次の例では、POST を使用 し て ク ラ イ ア ン ト 上の共有オブジ ェ ク ト の メ ソ ッ ド を非同期で呼び出 し ま す。 POST の使用は、 EAServer コ ン ポー ネ ン ト への呼び出 し の コ ン テ キ ス ト で は サ ポ ー ト さ れ て い ま せん。 EAServer で の 非 同 期 処 理 に つ い て は、 EAServer の マ ニ ュ ア ル で、 TreadManager モジ ュ ール と MessageService モジ ュ ールに関す る 項目を 参照 し て く だ さ い。 例 次の例では、 共有オブジ ェ ク ト を使用 し て、 EAServer コ ン ポーネ ン ト メ ソ ッ ド に対 し て非同期 リ ク エ ス ト を行い、 デー タ を ク ラ イ ア ン ト ア プ リ ケーシ ョ ン ウ ィ ン ド ウ に返す方法を示 し ます。 ク ラ イ ア ン ト ア プ リ ケーシ ョ ンのウ ィ ン ド ウ ク ラ イ ア ン ト アプ リ ケーシ ョ ンには、 w_employee と い う ウ ィ ン ド ウ が あ り 、 従業員デー タ をデー タ ウ ィ ン ド ウ コ ン ト ロ ールに表示 し ま す。 ユーザが こ の ウ ィ ン ド ウ の [検索] ボ タ ン を ク リ ッ ク す る と 、 ク ラ イ ア ン ト は、 EAServer と 通信す る 共有オブジ ェ ク ト を作成 し ます。 さ ら に、 ユーザ オブジ ェ ク ト の イ ン ス タ ン ス も 作成 し ます。 こ の イ ン ス タ ン ス は、 共有オブジ ェ ク ト の コ ールバ ッ ク の処理に使用 さ れ ます。 イ ン ス タ ン ス変数 w_employee ウ ィ ン ド ウ には、 以下の定義 さ れた イ ン ス タ ン ス変数があ り ます。 uo_sharedobject iuo_sharedobject uo_callback iuo_callback ア プ リ ケーシ ョ ン テ ク ニ ッ ク 553 サーバ メ ッ セージ返送の要求 [検索] ボ タ ン [検索] ボ タ ン は、 EAServer と 通信す る 共有オブ ジ ェ ク ト を作成 し ま す。 さ ら に、 ユーザ オブジ ェ ク ト の イ ン ス タ ン ス も 作成 し ます。 こ の イ ン ス タ ン ス は、 共有オブジ ェ ク ト の コ ールバ ッ ク の処理に使用 し ま す。 コ ールバ ッ ク オブジ ェ ク ト が ウ ィ ン ド ウ に処理の終了を通知で き る よ う に、次の ス ク リ プ ト は コールバ ッ ク オブジ ェ ク ト 上で PassObject と い う 関数を呼び出 し 、 ウ ィ ン ド ウ への参照を渡 し ます。 最後に、 こ の ス ク リ プ ト は、共有オブジ ェ ク ト の RetrieveData 関数の非同期呼び出 し を行っ て、 コ ールバ ッ ク オブジ ェ ク ト への参照を渡 し ます。 [検索] ボ タ ンには次の ス ク リ プ ト があ り ます。 long ll_rv SharedObjectRegister("uo_sharedobject","myshare") SharedObjectGet("myshare",iuo_sharedobject) iuo_callback = CREATE uo_callback iuo_callback.passobject (parent) iuo_sharedobject.post retrievedata(iuo_callback) SetDW 関数 SetDW 関数は、 EAServer コ ン ポーネ ン ト か ら 返 さ れたデー タ ウ ィ ン ド ウ Blob の内容を、ウ ィ ン ド ウ 内の DataWiondow コ ン ト ロ ールに適用 し ます。 SetDW 関数は、 Blob 型の引数 ablb_data を受け取 り 、 Long 値を返 し ます。 こ の関数には、 次の ス ク リ プ ト があ り ます。 long ll_rv ll_rv = dw_employee.SetFullState(ablb_data) if ll_rv = -1 then MessageBox(" エ ラ ー ", "SetFullState 呼び出 し に失敗 し ま し た !") end if return ll_rv EAServer コ ンポーネ ン ト EAServer コ ン ポーネ ン ト は、 uo_employee と い う PowerBuilder ユーザ オブジ ェ ク ト です。 こ の uo_employee オブジ ェ ク ト には、 デー タ ス ト ア を使用 し てデー タ ベース か ら 従業員の行を取 り 出す、 RetrieveData と い う 関数があ り ます。 イ ン ス タ ン ス変数 uo_employee オブジ ェ ク ト には、以下の定義 さ れた イ ン ス タ ン ス変数が あ り ます。 554 PowerBuilder 第 24 章 EAServer ク ラ イ ア ン ト の構築 protected TransactionServer txnsrv protected DataStore ids_datastore RetrieveData 関数 RetrieveData 関数は、 Blob 型の引数 ablb_data を受け取 り 、 Long 値を返 し ます。 こ の関数には、 次の ス ク リ プ ト があ り ます。 long ll_rv ll_rv = ids_datastore.Retrieve() ll_rv = ids_datastore.GetFullState(ablb_data) txnsrv.SetComplete() return ll_rv 共有オブ ジ ェ ク ト の定義 ク ラ イ ア ン ト ア プ リ ケ ー シ ョ ン は、 uo_sharedobject と い う 共有オ ブ ジ ェ ク ト を使用 し て、 EAServer コ ン ポーネ ン ト と 通信 し ます。 こ の共 有オブジ ェ ク ト には、 RetrieveData と い う 1 つの関数があ り ます。 イ ン ス タ ン ス変数 uo_sharedobject オブ ジ ェ ク ト には、 以下の定義 さ れた イ ン ス タ ン ス 変 数があ り ます。 uo_employee iuo_employee n_jagclnt_connect myconnect Constructor イ ベン ト Constructor イ ベン ト は、n_jagclnt_connect と い う カ ス タ ム接続オブジ ェ ク ト を使用 し て、 サーバに接続 し ます。 続いて、 EAServer コ ン ポーネ ン ト の イ ン ス タ ン ス を作成 し ます。 long ll_rc, ll_rv myconnect = create n_jagclnt_connect ll_rc = myconnect.ConnectToServer() ll_rv = myconnect.CreateInstance(iuo_employee, & "uo_employee") RetrieveData 関数 RetrieveData 関数は、 EAServer コ ン ポーネ ン ト の RetrieveData 関数の同 期呼び出 し を行い ます。 関数の処理が終了す る と 、 コ ールバ ッ ク オブ ジ ェ ク ト の Notify 関数を呼び出 し 、 サーバ コ ン ポーネ ン ト か ら 返 さ れ たデー タ ウ ィ ン ド ウ Blob を渡 し ます。 RetrieveData 関数は、 uo_callback 型の auo_callback と い う 引数を受け取 り ます。 blob lblb_data long ll_rv ll_rv = iuo_employee.retrievedata(lblb_data) auo_callback.notify(lblb_data) return ll_rv ア プ リ ケーシ ョ ン テ ク ニ ッ ク 555 エ ラ ー処理 コ ールバ ッ ク オブ ジ ェ ク ト の定義 EAServer コ ン ポーネ ン ト が処理 を 終了 し た ら 、 共有オブ ジ ェ ク ト が uo_callback と い う ユーザ オブジ ェ ク ト に通知 し 、 こ のユーザ オブジ ェ ク ト が同様に w_employee ウ ィ ン ド ウ に通知 し ま す。 uo_callback オ ブ ジ ェ ク ト には、 Notify と PassObject と い う 、 2 つの関数があ り ます。 Notify 関数 Notify 関数は、 w_employee ウ ィ ン ド ウ の SetDW と い う 関数を呼び出 し 、 サーバ コ ン ポーネ ン ト か ら 返 さ れたデー タ ウ ィ ン ド ウ Blob に渡 し ま す。 Notify 関数は、 Blob 型の引数 ablb_data を受け取 り 、 Long 値を返 し ます。 こ の関数には、 次の ス ク リ プ ト があ り ます。 long ll_rv ll_rv = iw_employee.setdw(ablb_data) if ll_rv = -1 then MessageBox(" エ ラ ー ", "SetDW 呼び出 し に失敗 !") end if return ll_rv PassObject 関数 PassObject 関数は、w_employee ウ ィ ン ド ウ への参照を iw_employee イ ン ス タ ン ス変数にキ ャ ッ シ ュ し ます。 こ の関数は、 w_employee 型の引数 aw_employee を受け取 り 、 Long 値を返 し ます。 iw_employee = aw_employee return 1 エ ラ ー処理 PowerBuilder は、 EAServer に接続 し てい る ク ラ イ ア ン ト が使用で き る 3 階層のエ ラ ー処理を提供 し ます。 • EAServer で実行さ れてい る コ ンポーネン ト か ら 送出さ れた例外を、 try/catch/finally ブ ロ ッ ク を使用 し て処理す る メ カ ニズ ム シ ス テ ム エ ラ ー と 実行時エ ラ ーはすべて、 RuntimeError 型か ら 派 生 し たオブジ ェ ク ト に変換 さ れます。 556 • EAServer 接続の コ ン テ キ ス ト で発生す る エ ラ ーを処理す る 、 接続 オブジ ェ ク ト と JaguarORB オブジ ェ ク ト の Error イ ベン ト • ほかの メ カ ニ ズ ム で ト ラ ッ プ さ れなか っ たエ ラ ーを処理す る 、 ア プ リ ケーシ ョ ン オブジ ェ ク ト の SystemError イ ベン ト PowerBuilder 第 24 章 EAServer ク ラ イ ア ン ト の構築 PowerBuilder では、 エ ラ ーに関す る 情報は組み込みの Error 構造に記録 さ れ ます。こ の構造体は、Error イ ベン ト と SystemError イ ベン ト に よ っ て使用 さ れます。 ク ラ イ ア ン ト がで き る こと ク ラ イ ア ン ト アプ リ ケーシ ョ ンは、 さ ま ざ ま な方法で通信エ ラ ーを処 理で き ます。 た と えば、 ク ラ イ ア ン ト がサーバに接続 し 、 オブジ ェ ク ト の メ ソ ッ ド を 呼び出そ う と し た のに そ のオ ブ ジ ェ ク ト が存在 し な か っ た場合は、 サーバ と の接続を解除 し 、 別のサーバに接続 し て操作 を再試行す る 方法があ り ます。あ る いは、ク ラ イ ア ン ト がユーザに メ ッ セージ を表示 し て、 次に起 こ る こ と を制御す る 機会を ユーザに与え る 方法 も あ り ます。 ク ラ イ ア ン ト が操作の再開の た めに新 し いサーバに接続 し て い る 場 合、 エ ラ ー発生時には、 新 し いサーバ上で リ モー ト オブジ ェ ク ト を イ ン ス タ ン ス化 し てか ら 、 リ モー ト オブジ ェ ク ト の メ ソ ッ ド を呼び出す 必要があ り ます。 エ ラ ーが処理 さ れる場 所 次に、 PowerBuilder が EAServer ク ラ イ ア ン ト でエ ラ ー処理 コ ー ド を実 行す る シーケ ン ス を示 し ます。 1 接続オブジ ェ ク ト ま たは JaguarORB オブジ ェ ク ト の コ ン テ キ ス ト でエ ラ ーが発生 し 、 そのオブジ ェ ク ト の Error イ ベン ト に関連付け ら れてい る ス ク リ プ ト があ る 場合は、 イ ベン ト ス ク リ プ ト があれ ば、 それが実行 さ れます。 2 以下のいずれかが真の場合、 RuntimeError ま たはその子孫のア ク テ ィ ブな例外ハン ド ラ が起動 さ れ ます。 3 ア プ リ ケーシ ョ ン テ ク ニ ッ ク • Error イ ベン ト の ス ク リ プ ト が作成 さ れていない • Error イ ベン ト のア ク シ ョ ン引数が ExceptionFail! に設定 さ れ てい る • 接続オブジ ェ ク ト ま たは JaguarORB オブジ ェ ク ト の コ ン テ キ ス ト でエ ラ ーが発生 し ない 例外ハン ド ラ がない場合、 ま たは既存の例外ハン ド ラ がその例外 を処理 し ない場合、 アプ リ ケーシ ョ ン オブジ ェ ク ト の SystemError イ ベン ト が実行 さ れます。 SystemError イ ベン ト の ス ク リ プ ト が作 成 さ れていない場合は、 アプ リ ケーシ ョ ン エ ラ ーが起 き て、 アプ リ ケーシ ョ ンは終了 し ます。 557 エ ラ ー処理 シ ス テム例外ハン ド ラ PowerBuilder には、 致命的な シ ス テ ム エ ラ ーの捕捉を試み る 、 シ ス テ ム例外ハン ド ラ があ り ます。 こ のハン ド ラ は、 個々の ク ラ イ ア ン ト 接 続の ト ラ ブルに よ る サーバ停止の防止に役立ち ます。 ク ラ イ ア ン ト 接 続時に致命的なエ ラ ーが発生す る たびに、 PowerBuilder は、 サーバ を 停止 さ せた り ほかの ク ラ イ ア ン ト 接続を妨げた り す る こ と な く 、 ク ラ イ ア ン ト 接続の終了を試み ます。 ト ラ ブルが発見 さ れた ら 、 ク ラ イ ア ン ト 上のほかの実行時エ ラ ーの場合 と 同様に、 シ ス テ ム例外ハン ド ラ はアプ リ ケーシ ョ ン オブジ ェ ク ト 内で SystemError イ ベン ト を発生 さ せます。 コ ン テキス ト 対応のエ ラ ー処理 try/catch メ カ ニズ ム を利用す る と 、 発生 し た場所でエ ラ ーを処理で き 、 コ ン ポーネ ン ト か ら 送出 さ れた エ ラ ーが、 ク ラ イ ア ン ト ア プ リ ケー シ ョ ン で致命的なエ ラ ーにな る 可能性を最小限に抑え る こ と も 可能で す。接続オブジ ェ ク ト の Error イ ベン ト を ス ク リ プ ト で実行 さ せ る 方法 は正確性が低 く 、 Error イ ベン ト のア ク シ ョ ン引数を ExceptionFail! に設 定 し ない限 り 、 try/catch 例外ハン ド ラ を無視 し て し ま い ます。 し た が っ て、 Error イ ベ ン ト は ス ク リ プ ト で 実行せず に、 コ ー ド に try/catch ブ ロ ッ ク を追加 し て、 も っ と も 効果的なエ ラ ー処理を実現 し なければな り ません。 GetMessage 関数を使用 し て、 例外のエ ラ ー メ ッ セージ を取得で き ます。 例外についての詳細は、 39 ページの 「PowerBuilder での例外処理」 を 参照 し て く だ さ い。 作成 し たエ ラ ー処理 コ ー ド では発生 し たすべてのエ ラ ーを ト ラ ッ プで き る わ け で は な い た め、 必ず、 ア プ リ ケ ー シ ョ ン オ ブ ジ ェ ク ト の SystemError イ ベン ト の ス ク リ プ ト を作成す る 必要があ り ます。 CORBA 例外の処理 CORBA は、 コ ン ポーネ ン ト がエ ラ ー ま たは警告を通知す る ための標 準的な方法を提供 し ます。 CORBA は 2 種類の例外をサポー ト し ます。 • シ ス テ ム例外 • ユーザ定義の例外 シ ス テ ム例外は、サーバで生成 さ れ る 標準エ ラ ーのセ ッ ト の 1 つです。 こ れ ら の例外は、 CORBA 仕様で定義 さ れてい ます。 ユーザ定義例外は、 コ ン ポーネ ン ト の IDL で定義 さ れ る エ ラ ーま たは 警告です。 ユーザ定義例外は新 し いデー タ 型であ り 、 例外が生成 さ れ た と き に ク ラ イ ア ン ト に返 さ れ る 一連のデー タ 要素を表 し ます。 558 PowerBuilder 第 24 章 EAServer ク ラ イ ア ン ト の構築 シ ス テム例外 PowerBuilder では、CORBA シ ス テ ム例外は RuntimeError オブジ ェ ク ト か ら 継承 し た一連のオブジ ェ ク ト にマ ッ ピ ン グ さ れ ます。 こ の よ う な 例外の リ ス ト を参照す る には、 オブジ ェ ク ト ブ ラ ウ ザの [シ ス テ ム] タ ブで 「corbasystemexception」 を選択 し 、 ポ ッ プア ッ プ メ ニ ュ ーで [階 層の表示] を選択 し て、 ツ リ ービ ュ ー項目を拡張 し ます。 PowerBuilder の CORBASystemException オ ブ ジ ェ ク ト の 名 前 は、 CORBA/IIOP 仕様に ア ン ダー ス コ ア 文字 を 省略 し て定義 さ れ て い る CORBA シ ス テ ム 例 外 の 名 前 に マ ッ ピ ン グ さ れ ま す。 た と え ば、 PowerBuilder CORBACommFailure 例外は CORBA_COMM_FAILURE 例 外にマ ッ ピ ン グ し ます。 CORBA 例外についての詳細は、 OMG Web サ イ ト www.omg.org か ら ダ ウ ン ロ ー ド で き る CORBA/IIOP 仕様を参照 し て く だ さ い。 コ ン ポーネ ン ト の メ ソ ッ ド を呼び出す と き には、 次に示す よ う な例外 に対 し てエ ラ ー処理を実行で き ます。 TRY ... // メ ソ ッ ド の呼び出 し CATCH (corbacommfailure cf) ... // コ ンポーネ ン ト によ る EAServer ト ラ ンザク シ ョ ンの異常終了 // または ト ラ ンザク シ ョ ンの タ イ ムアウ ト 。 必要であれば // ト ラ ンザク シ ョ ン を再試行 CATCH (corbatransactionrolledback tr) ... // 多 く の場合は ト ラ ンザク シ ョ ン を再試行 CATCH (corbaobjectnotexist one) ... // 存在 し ない コ ンポーネ ン ト を初期化 し よ う と // し た と き に受け取る。 また、 // オブ ジ ェ ク ト 参照の有効期限が切れた場合に // メ ソ ッ ド を呼び出 し た と き も受け取る // これは、 コ ンポーネ ン ト がス テー ト フ ルで、 // 有限の Instance Timeout プ ロパテ ィ が // 設定 し てある場合に実行 // 必要であれば新 し いプ ロキシ イ ン ス タ ン ス を作成 CATCH (corbanopermission np) ... // ユーザに、 認証 さ れていない こ と を通知 CATCH (corbasystemexception se) ... // エ ラ ーを通知するが再試行は し ない FINALLY // ク リ ーン ア ッ プ コ ー ド は こ こ に挿入 END TRY ユーザ定義例外 ユーザ定義例外は、 Exception オブジ ェ ク ト か ら 継承 さ れ CORBAUserException オブジ ェ ク ト にマ ッ ピ ン グ さ れ ます。 PowerBuilder ク ラ イ ア ン ト は、 ど の コ ン ポーネ ン ト タ イ プか ら 送出 さ れた例外 も 処理で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 559 エ ラ ー処理 EAServer コ ン ポ ー ネ ン ト に 例 外 を 送 出 す る メ ソ ッ ド が あ る 場 合、 PowerBuilder プ ロ キ シ オブジ ェ ク ト のその メ ソ ッ ド も 、 ユーザ定義例 外 を 送出す る よ う に宣言 さ れ ま す。 ユーザ定義例外に関す る 定義は、 開発者が コ ン ポーネ ン ト プ ロ キ シ を作成 し た と き に作成 さ れます。 CORBA では、 例外階層構造をサポー ト し ていません。 CORBA IDL では、 例外階層構造を サポー ト し てい ません。 その結果、 例外を継承 し たサーバ コ ン ポーネ ン ト のプ ロ キ シ を生成す る と 、 生成 さ れたプ ロ キ シはすべて CORBAUserException か ら 直接継承 し ます。 EJB コ ン ポーネ ン ト で Create、 Remove、お よ び FindByPrimaryKey メ ソ ッ ド をすべて使用す る と 、 EJB の CreateException、 RemoveException、 お よ び FinderException 例外が送出 さ れます。 こ れ ら の例外は、 EAServer の CtsComponents パ ッ ケージでは同名の IDL 例外で表 さ れてい ます。 Error イ ベン ト のス ク リ プ ト 作成 実行方法 接続オブジ ェ ク ト の Error イ ベン ト のエ ラ ーを処理す る には、オブジ ェ ク ト の定義を カ ス タ マ イ ズす る ユーザ オブジ ェ ク ト を作成 し ます。 カ ス タ ム接続オブジ ェ ク ト を作成 し た ら 、 接続オブジ ェ ク ト を使用す る ス ク リ プ ト 内の ど こ か ら で も 、 そ の オ ブ ジ ェ ク ト を 参照で き ま す。 JaguarORB イ ベン ト を使用す る 場合は、同 じ よ う に Error イ ベン ト の ス ク リ プ ト を作成で き ます。 接続オブジ ェ ク ト ウ ィ ザー ド は、 カ ス タ ム接続オブジ ェ ク ト を作成 し ます。 534 ページの 「 ウ ィ ザー ド を使用 し た接続オブジ ェ ク ト の作成」 を参照 し て く だ さ い Error イ ベン ト の引数 カ ス タ ム接続オブジ ェ ク ト の Error イ ベン ト には引数がい く つか あ り ます。 こ れ ら の引数を使 う と 、 エ ラ ーの原因 と な っ た条件についての 情報を取得で き ます。 た と えば、 エ ラ ー番号 と エ ラ ー メ ッ セージに加 え て、 エ ラ ーを起 こ し たオブジ ェ ク ト の名前や、 エ ラ ーが発生 し た ス ク リ プ ト の全テ キ ス ト な ど も 、 こ れ ら の引数か ら 取得で き ます。 エ ラ ー情報を提供す る 引数に加え て、 Error イ ベン ト には次に実行す べ き 動作を指定す る 引数があ り ます。 動作を指定す る には、 4 つの値 (ExceptionFail!、 ExceptionRetry!、 ExceptionIgnore!、 ExceptionSubstituteReturnValue!) の 1 つを Error イ ベン ト の Action 引数に 指定 し ます。 560 PowerBuilder 第 24 章 EAServer ク ラ イ ア ン ト の構築 例 次の例では、 Error イ ベン ト ス ク リ プ ト は、 通信エ ラ ーを引 き 起 こ し た 条件を ユーザに伝え て、 次に起 こ る こ と を制御す る 機会を ユーザに与 え ま す。 ユーザの入力に応 じ て、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン は、 異常終了 し た り 、 操作を再試行 し た り 、 エ ラ ーを無視 し て処理を続行 し た り し ます。 int li_choice li_choice = MessageBox(" 接続エ ラ ー " + & string(ErrorNumber), ErrorText, & Question!,AbortRetryIgnore!) CHOOSE CASE li_choice CASE 1 Action = ExceptionFail! CASE 2 Action = ExceptionRetry! CASE 3 Action = ExceptionIgnore! END CHOOSE SystemError イ ベン ト のス ク リ プ ト 作成 実行方法 アプリ ケーショ ン オブジェ ク ト の SystemError イ ベン ト には、PowerBuilder にアプ リ ケーシ ョ ン の実行を中断 さ せた り 、 エ ラ ーを無視す る よ う に 指示す る ス ク リ プ ト を記述で き ます。 例 次の例では、 SystemError イ ベン ト ス ク リ プ ト は、 メ ッ セージ を表示 し て、 ユーザに通信エ ラ ーを引 き 起 こ し た条件を知 ら せ、 ユーザに次に 起 こ る こ と を制御す る 機会を与え ます。 ユーザの入力に応 じ て、 ク ラ イ ア ン ト アプ リ ケーシ ョ ンは、 実行を中断す る か、 エ ラ ーを無視 し て 処理を続行 し ます。 string ls_logline = " シ ス テム エ ラ ー : " ls_logline += String(error.number) + " " + error.text ls_logline += " エ ラ ー発生行 " + & String(error.line) + " " ls_logline += " イ ベン ト " + error.objectevent ls_logline += " オブ ジ ェ ク ト " + error.object if Messagebox(" シ ス テム エ ラ ー ", ls_logline + & "~r~n~r~n プ ログ ラ ムを終了 し ますか ?", & Question!, YesNo!) = 1 then HALT CLOSE end if ア プ リ ケーシ ョ ン テ ク ニ ッ ク 561 ク ラ イ ア ン ト ア プ リ ケーシ ョ ンの配布 ク ラ イ ア ン ト ア プ リ ケーシ ョ ンの配布 分散 コ ン ピ ュ ーテ ィ ン グ環境で ク ラ イ ア ン ト ア プ リ ケーシ ョ ン を 配 布す る 手順は、 ほかの PowerBuilder アプ リ ケーシ ョ ン の配布手順 と ほ ぼ同 じ です。 ク ラ イ ア ン ト アプ リ ケーシ ョ ンのパ ッ ケージ化には 2 つ の基本的な方法があ り ます。 • アプ リ ケーシ ョ ンのオブジ ェ ク ト をすべて含む、1 つの ス タ ン ド ア ロ ン実行フ ァ イ ル (EXE) と し て • 実行フ ァ イ ル と 1 つま たは複数の動的 ラ イ ブ ラ リ と し て ビ ッ ト マ ッ プやア イ コ ン の よ う な、 アプ リ ケーシ ョ ン が使 う 補助的な リ ソ ース を い く つか供給 し な く てはいけ ない こ と も あ り ます。 リ ソ ー ス は、 実行フ ァ イ ルや動的 ラ イ ブ ラ リ で供給す る か、 別々に配布す る こ と も 可能です。 ア プ リ ケ ー シ ョ ン の 実 行 フ ァ イ ル を 作 成 す る 方 法 に つ い て は、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 ア プ リ ケーシ ョ ン と 一緒に配置す る 必要があ る フ ァ イ ルについては、 第 39 章 「アプ リ ケーシ ョ ン と コ ン ポーネ ン ト の配布」 を参照 し て く だ さ い。 562 PowerBuilder 第 2 5 章 PowerBuilder ク ラ イ ア ン ト での SSL の使い方 PowerBuilder ク ラ イ ア ン ト は、 Secure Sockets Layer (SSL) を使用 し て EAServer に接続で き ま す。 ほかのセ キ ュ リ テ ィ 機能の中で も 、 SSL は、 証明書に基づ く サーバ認証、 証明書に基づ く 任意の ク ラ イ ア ン ト 認証、 お よ びネ ッ ト ワ ー ク 経由で送信 さ れ る 任意の デー タ の暗号化を提供 し ます。 内容 項目 EAServer と のセキ ュ ア な接続 PowerBuilder での SSL 接続 セキ ュ ア な接続の確立 SSL コ ールバ ッ ク の使い方 セ ッ シ ョ ン セキ ュ リ テ ィ 情報の取得 ページ 563 565 569 572 576 EAServer と のセキ ュ ア な接続 SSL プ ロ ト コ ルでは、 デジ タ ル認証に基づ く 公開鍵の暗号化 と 認 証のアルゴ リ ズ ム を利用 し て、安全に接続で き ます。SSL は 「 ラ ッ パー」 プ ロ ト コ ルであ り 、 ほかのプ ロ ト コ ル用のパケ ッ ト は、 SSL パケ ッ ト の内部に埋め込む こ と に よ っ て保護 さ れます。 た と えば、 HTTPS は、各 HTTP パケ ッ ト を SSL パケ ッ ト 内に埋め込む こ と に よ っ て保護 さ れ る HTTP です。 同様に、 IIOPS は、 SSL 内に埋め込 まれた IIOP です。 EAServer の組み込み SSL ド ラ イ バは、 動的 ネ ゴ シ エー シ ョ ン、 キ ャ ッ シ ュ セ ッ シ ョ ン、 共有セ ッ シ ョ ン、 お よ び X.509 デジ タ ル 証明書サポー ト に よ る ク ラ イ ア ン ト / サーバの認証を サポー ト し ます。 EAServer でのセ キ ュ リ テ ィ の概要お よ び EAServer と SSL につい ての詳細は、 『EAServer セ キ ュ リ テ ィ 管理お よ びプ ロ グ ラ ミ ン グ ・ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 563 EAServer と のセキ ュ ア な接続 SSL プ ロ ト コ ル に つ い て の 詳 細 は、 Netscape DevEdge Web サ イ ト http://developer.netscape.com/ でセキ ュ リ テ ィ のマニ ュ アルを参照 し て く だ さ い。 保護の質 EAServer パ ッ ケ ージ、 コ ン ポーネ ン ト 、 お よ び メ ソ ッ ド の保護の質 (QOP: quality of protection) は、 Jaguar Manager で設定で き ます。 QOP は、 ク ラ イ ア ン ト が コ ン ポーネ ン ト の ビ ジネ ス ロ ジ ッ ク にア ク セ スす る ために満た さ な ければな ら ない、 最低レベルの暗号化お よ び認証を 構築 し ます。 た と えば、 コ ン ポーネ ン ト に対す る QOP を設定す る に は、コ ン ポーネ ン ト のプ ロ パテ ィ シー ト の [すべてのプ ロ パテ ィ ] ペー ジで com.sybase.jaguar.component.qop プ ロ パテ ィ を追加 し 、EAServer が 提供す る sybpks_intl な ど のセキ ュ リ テ ィ 特性を設定 し ます。 サーバでの QOP の設定について、 お よ び EAServer が提供す る セキ ュ リ テ ィ 特性の リ ス ト については、 『EAServer セ キ ュ リ テ ィ 管理お よ び プ ロ グ ラ ミ ン グ ・ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 こ の章で は、 ク ラ イ ア ン ト での QOP の設定について説明 し ます。 SSL の証明書に基づ く 認証 Jaguar Manager では、 リ ス ナを設定 し 、 その リ ス ナにセ キ ュ リ テ ィ プ ロ フ ァ イ ルを関連付け る こ と で、セキ ュ ア な IIOP ま たは HTTP ポー ト を構成で き ます。 プ ロ フ ァ イ ルは、 目的のサーバでの接続終了を確認 す る ために ク ラ イ ア ン ト に送信 さ れ る セ キ ュ リ テ ィ 証明書 と 、 そのほ かのセキ ュ リ テ ィ 設定を指定 し ます。 PowerBuilder ク ラ イ ア ン ト には、デジタ ル証明書の管理のために公開鍵 基盤(PKI: Public key Infrastructure)シス テム が必要です。EAServer 証明書 データ ベース を 管理する Security Manager、ま たは Entrust Technologies 社 (http://www.entrust.com/)から 個別に入手でき る Entrust/Entelligence を 使 用でき ま す。 PKI お よ びセ キ ュ ア なポー ト と 認証オプシ ョ ン の設定についての詳細 は、 『EAServer セ キ ュ リ テ ィ 管理お よ びプ ロ グ ラ ミ ン グ ・ ガ イ ド 』 マ ニ ュ アルを参照 し て く だ さ い。 ク ラ イ ア ン ト 側のイ ン ス ト ール要件 564 EAServer は、 い く つかの ク ラ イ ア ン ト ラ ン タ イ ム フ ァ イ ルを提供 し ます。 PowerBuilder ク ラ イ ア ン ト の SSL サポー ト は、 C++ ク ラ イ ア ン ト の ORB を介 し て提供 さ れ る ので、 PowerBuilder SSL ク ラ イ ア ン ト が 動作す る コ ン ピ ュ ー タ には SSL お よ び C++ ラ ン タ イ ム フ ァ イ ルを イ ン ス ト ールす る 必要があ り ます。 こ の イ ン ス ト ールには、 ク ラ イ ア ン ト 側のセ キ ュ リ テ ィ デー タ ベース、 SSL サポー ト ラ イ ブ ラ リ 、 ク ラ イ ア ン ト 側の Security Manager な ど が含ま れます。 ま た、 アプ リ ケーシ ョ ンの実行時に ク ラ イ ア ン ト ラ イ ブ ラ リ が読み込まれ る よ う に、 ク ラ イ ア ン ト の イ ン ス ト ール を 構成す る 必要 も あ り ま す。 詳細につい ては、 『 イ ン ス ト ール ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 PowerBuilder 第 25 章 PowerBuilder ク ラ イ ア ン ト での SSL の使い方 PowerBuilder での SSL 接続 PowerBuilder は、 セ キ ュ ア な接続に使用す る 2 つのシ ス テ ム オブジ ェ ク ト を提供 し ます。 • SSLServiceProvider オブ ジ ェ ク ト は、 EAServer の CtsSecurity::SSLServiceProvider イ ン タ フ ェース の実装です。 こ の イ ン タ フ ェース についての詳細は、 Web ブ ラ ウ ザでお使いのサーバ (http://hostname:portnumber/ir) に接続 し て、EAServer イ ン タ フ ェ ース リ ポジ ト リ ド キ ュ メ ン ト を参照 し て く だ さ い。 SSLServiceProvider サービ ス オブ ジ ェ ク ト SSLServiceProvider オブジ ェ ク ト の GetGlobalProperty お よ び SetGlobalProperty 関数を使用 し て、 グ ロ ーバル SSL プ ロ パテ ィ を 設定 し ます。 設定ま たは取得、 あ る いはその両方が可能な グ ロ ー バル プ ロ パテ ィ については、 565 ページの 「SSL プ ロ パテ ィ 」 を 参照 し て く だ さ い。 ま た、接続オブジ ェ ク ト ま たは JaguarORB オブジ ェ ク ト に対 し て、 SSL プ ロ パテ ィ を Options 文字列で指定 し て、接続レベルで設定す る こ と も で き ま す。 対 話 型 の ア プ リ ケ ー シ ョ ン で は 一 般 に、 SSLServiceProvider オブジ ェ ク ト は SSLCallback オブジ ェ ク ト と と も に使用 さ れ ま す。 ユーザ と の対話操作を提供 し ないアプ リ ケー シ ョ ン では、 接続レベルで SSL 設定を構成す る のが普通です。 接 続 レ ベルでのプ ロ パテ ィ の設定につい ては、 568 ページ の 「ORB プ ロ パテ ィ 」 を参照 し て く だ さ い。 • EAServer で、 コ ールバ ッ ク メ ソ ッ ド を 使用 し て ク ラ イ ア ン ト に追加情報を要求す る 場合は、 SSLCallBack オブジ ェ ク ト の イ ン ス タ ン ス に コ ールバ ッ ク メ ソ ッ ド 用の独自の ロ ジ ッ ク を実装で き ます。 SSLCallback オブジ ェ ク ト は、 EAServer の CtsSecurity::SSLCallback イ ン タ フ ェース の実装です。 SSLCallback オブ ジ ェ ク ト SSL プ ロ パテ ィ 表 25-1 に、 SetGlobalProperty ま たは GetGlobalProperty を使用 し て設定ま たは取得で き る プ ロ パテ ィ を示 し ます。 SSL 接続では、 qop (quality of protection) プ ロ パテ ィ を設定 し なければな り ません。 ま た、 こ のプ ロ パテ ィ を取得す る ための コ ールバ ッ ク を実装 し ない場合は、pin プ ロ パ テ ィ を 設定す る 必要が あ り ま す。 選択 し た セ キ ュ リ テ ィ レ ベル を サ ポー ト す る サーバ ア ド レ ス に接続す る 必要 も あ り ます。 こ れについて は、 568 ページの 「セ キ ュ ア なサーバ ア ド レ ス 」 に記載 さ れてい ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 565 PowerBuilder での SSL 接続 PowerBuilder セ ッ シ ョ ン でのグローバル プ ロパテ ィ の設定 PowerBuilder で ク ラ イ ア ン ト ア プ リ ケーシ ョ ン を実行 し てい る 場合、 PowerBuilder のセ ッ シ ョ ン時にグ ロ ーバル プ ロ パテ ィ を設定で き る の は一度だけです。 グ ロ ーバル SSL プ ロ パテ ィ を設定す る コ ー ド を テ ス ト す る たびに、 PowerBuilder を再起動す る 必要があ り ます。 設定さ れて いな いプロ パテ ィ か、 誤っ て 設定さ れて いる プロ パテ ィ が あ る 場合は、SSL コ ールバッ ク メ ソ ッ ド が呼び出さ れま す。SSLCallback オブジ ェ ク ト の イ ン ス タ ン ス を指定 し ていない場合は、 デフ ォ ル ト の コ ールバ ッ ク 実装に よ っ て接続試行が中断 さ れ ます。 表 25-1: SSL プ ロパテ ィ の リ ス ト プ ロパテ ィ callbackImpl certificateLabel qop cacheSize SessLingerTime SessShareCount pin 説明 取得 SSLCallback オブジ ェ ク ト の イ ン ス タ ン ス。 詳細については、 可 572 ページの 「SSL コ ールバ ッ ク の使い方」 を参照 し て く だ さ い。 相互認証が必要な接続で使用す る ク ラ イ ア ン ト 証明書。 ラ ベ 可 ルは、PKCS #11 ト ー ク ンの X.509 証明書お よ びプ ラ イ ベー ト キーを識別す る 単純な名前 相互認証で必要 こ のプ ロ パテ ィ を設定せずに接続の相互認証 を要求す る と 、 コ ールバ ッ ク メ ソ ッ ド getCertificateLabel が呼 び出 さ れ、 使用可能な証明書名の配列が入力パ ラ メ ー タ と し て渡 さ れ る 使用す る セキ ュ リ テ ィ 特性の名前。 SSL で必要。 詳細につい ては、 567 ページの 「セ キ ュ リ テ ィ 特性の選択」 を参照 し て く だ さ い。 SSL セ ッ シ ョ ン ID のキ ャ ッ シ ュ のサ イ ズ。 デフ ォ ル ト は 100 前回の接続で使用 し た セ ッ シ ョ ン ID エ ン ト リ を キ ャ ッ シ ュ に保管す る 期間 (秒単位)。 デフ ォ ル ト は 28800 秒 (8 時間) 同 じ セ ッ シ ョ ン ID を同時に使用で き る SSL セ ッ シ ョ ンの数。 デフ ォ ル ト は 10 PKCS #11 ト ー ク ンの PIN 設定 可 可 可 可 可 可 可 可 可 可 不可 可 こ れは、 ク ラ イ ア ン ト 認証のために PKCS #11 ト ー ク ン に ロ グ イ ンす る 場合、お よ び信頼情報を取得す る 場合に必要。SSL で必要 availableQop availableQopDesc 566 こ のプ ロ パテ ィ が設定 さ れていない場合は、 any が設定 さ れ る 。 ま た、 誤 っ て設定 さ れて い る 場合は、 コ ールバ ッ ク メ ソ ッ ド getPin が呼び出 さ れ る 使用可能なセキ ュ リ テ ィ 特性の リ ス ト 。 qop プ ロ パテ ィ には、 可 こ の リ ス ト 内の値のみ設定で き る 使用可能なセキ ュ リ テ ィ 特性の説明の リ ス ト 。availableQop プ 可 ロ パテ ィ の値 と 同 じ 順序で指定す る 不可 不可 PowerBuilder 第 25 章 PowerBuilder ク ラ イ ア ン ト での SSL の使い方 プ ロパテ ィ availableVersions entrustReady entrustIniFile 説明 取得 SSL ラ ン タ イ ム エ ン ジ ン でサポー ト さ れ る SSL プ ロ ト コ ル 可 バージ ョ ンの リ ス ト ク ラ イ ア ン ト で Entrust PKI ソ フ ト ウ ェ アが使用で き る 場合は 可 TRUE、 それ以外の場合は FALSE Entrust へのア ク セ ス方法に関す る 情報を定義 し た Entrust INI 可 フ ァ イ ルへのパ ス名。 useEntrustid プ ロ パテ ィ が true に設定 さ れてい る 場合に必要 設定 不可 不可 可 entrustUserProfile こ のプ ロ パテ ィ が設定 さ れていない場合は、 コ ールバ ッ ク メ ソ ッ ド getCredentialAttribute が呼び出 さ れ る Entrust ユーザ プ ロ フ ァ イ ル を 含む フ ァ イ ルへの フ ル パ ス。 可 Entrust のシ ン グル ロ グ イ ン機能が使用可能な場合は省略で き る 。 それ以外の場合は必ず指定す る 可 useEntrustID こ のプ ロ パテ ィ が設定 さ れていない場合は、 コ ールバ ッ ク メ ソ ッ ド getCredentialAttribute が呼び出 さ れ る 認証に、Entrust ID ま たは Sybase の PKCS #11 ト ー ク ンの ど ち ら を使用す る か を指定す る 。 こ れは Boolean 型のプ ロ パテ ィ であ る 可 entrustPassword 可 こ のプ ロ パテ ィ が FALSE に設定 さ れてい る 場合、 Sybase の PKCS #11 ト ー ク ン のプ ロ パテ ィ が有効にな り 、 Entrust 固有 のプ ロ パテ ィ は無視 さ れ る 。 こ のプ ロ パテ ィ が TRUE に設定 さ れ て い る 場合、 Entrust 固有の プ ロ パ テ ィ が有効に な り 、 Sybase の PKCS #11 ト ー ク ンのプ ロ パテ ィ は無視 さ れ る 指定 さ れたユーザ プ ロ フ ァ イ ルを使用 し て Entrust に ロ グ イ 不可 ンす る 際のパ ス ワー ド 。 Entrust のシ ン グル ロ グ イ ン機能が使 用可能な場合は省略で き る 。 それ以外の場合は必ず指定す る 可 パ ス ワ ー ド が必要な場合に、 こ のプ ロ パテ ィ が設定 さ れてい ない と き や、 誤っ て設定 さ れてい る と き は、 コ ールバ ッ ク メ ソ ッ ド getPin が呼び出 さ れ る セキ ュ リ テ ィ 特性の選 択 SSL を使用す る には、 使用可能なセキ ュ リ テ ィ 特性の名前を qop プ ロ パテ ィ に指定 し なければな り ません。 こ の特性は、 SSL 接続のネ ゴ シ エーシ ョ ン の際に ク ラ イ ア ン ト が使用す る CipherSuite を定義 し ます。 接続時に、 ク ラ イ ア ン ト は自分が使用す る CipherSuite の リ ス ト をサー バに送信 し ます。サーバは、その リ ス ト か ら CipherSuite を選択 し ます。 サーバは、 その リ ス ト 内か ら 、 使用可能な最初の CipherSuite を選択 し ます。サーバで使用で き る CipherSuite がない場合、接続は失敗 し ます。 『EAServer セキ ュ リ ティ 管理およ びプロ グ ラ ミ ン グ・ ガイ ド 』 マニュ ア ルでは、 EAServer から 提供さ れる セキ ュ リ テ ィ 特性について 説明し て いま す。 サーバで使用可能な 特性のリ ス ト およ びその説明を 取得する には、 GetGlobalProperty を 使用し て availableQop およ び availableQopDesc プロ パティ を 取得し ま す。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 567 PowerBuilder での SSL 接続 セキ ュ ア なサーバ ア ド レス qop 設定で要求 さ れ る セキ ュ リ テ ィ レベル と 同 じ ま たはそれ以上の レ ベルの サーバ リ ス ナに のみ接続で き ま す。 JaguarORB.string_to_ オ ブ ジ ェ ク ト を使用 し て SessionManager::Manager イ ン タ フ ェース のプ ロ シ キの イ ン ス タ ン ス を作成す る 場合、 サーバ ア ド レ ス で指定 さ れ る リ ス ナでは、 ク ラ イ ア ン ト の qop 設定 と 一致す る セキ ュ リ テ ィ プ ロ フ ァ イ ルを使用 し なければな り ません。 ORB プ ロ パテ ィ 接続オブジ ェ ク ト ま たは JaguarORB オブジ ェ ク ト のいずれか を使用 し て EAServer に接続す る 場合、EAServer の C++ ク ラ イ ア ン ト ORB を使 用 し ま す。 そのプ ロ パテ ィ は、 接続オブジ ェ ク ト の Options 文字列に 設定す る か、 JaguarORB の Init 関数を使用 し て設定で き ます。 以下のプ ロ パテ ィ は、特にセキ ュ ア な接続に対 し て適用 さ れ る ORB プ ロ パテ ィ です。 • ORBqop • ORBcertificateLabel • ORBpin • ORBuseEntrustID • ORBentrustPassword • ORBentrustIniFile • ORBentrustUserProfile 以上のプ ロ パテ ィ の機能は、 対応す る SSL プ ロ パテ ィ と 同 じ ですが、 その値は確立中の接続にのみ影響 し 、 セ ッ シ ョ ン全体には影響 し ませ ん。 ORBqop に sybpks_none を設定す る と 、 ど の SSL も 接続で使用 さ れな く な り ます。 こ の設定が便利なのは、 SSLServiceProvider オブジ ェ ク ト を使用 し てすべての ORB に対 し て QOP を グ ロ ーバルに設定 し て い る 場合に、 単一の接続の QOP を オーバー ラ イ ド す る と き です。 ORB プ ロ パテ ィ の リ ス ト については、 接続オブジ ェ ク ト のヘルプ を参 照 し て く だ さ い。 次の例では、 ORBqop プ ロ パテ ィ に sybpks_simple を設定 し 、 ロ グ フ ァ イ ルを指定 し ます。 myconnect.options = "ORBqop='sybpks_simple', " & + "ORBLogFile='C:¥tmp¥log.txt'" 568 PowerBuilder 第 25 章 PowerBuilder ク ラ イ ア ン ト での SSL の使い方 セキ ュ ア な接続の確立 EAServer へのセ キ ュ ア な接続を確立す る には、 次の手順を行い ます。 1 SSLServiceProvider オブジ ェ ク ト の イ ン ス タ ン ス を作成 し ます。 2 (省略可能) GetGlobalProperty 関数を使用 し て、 サーバか ら セ キ ュ リ テ ィ 情報を取得 し ます。 3 SetGlobalProperty 関数を使用 し て、 サーバに必要なプ ロ パテ ィ を設 定 し ます。 4 SSLServiceProvider オブ ジ ェ ク ト のイ ン ス タ ン スの作成 接続オブジ ェ ク ト の ConnectToServer 関数を使用 し て、 サーバに接 続 し ます。 次の コ ー ド は、SSLServiceProvider オブジ ェ ク ト の イ ン ス タ ン ス を作成 し ます。 SSLServiceProvider sp GetContextService( "SSLServiceProvider", sp ) サーバから の情報の取 得 GetGlobalProperty を使用 し て、サーバのセキ ュ リ テ ィ 特性に関す る 情報 を取得 し ます。 次の例では、 サポー ト さ れてい る CipherSuite の情報を availableQop プ ロ パテ ィ か ら 取得 し 、 その情報を ド ロ ッ プダ ウ ン リ ス ト ボ ッ ク ス に表示 し ます。 int i, rc string ls_values[] rc = sp.GetGlobalProperty("availableQop", ls_values) IF rc <> 0 THEN MessageBox("Qop の取得に失敗 し ま し た ", & "rc = " + string(rc)) RETURN END IF FOR i = 1 to UpperBound(ls_values) ddlb_1.AddItem( ls_values[i] ) NEXT RETURN グローバル プ ロパ テ ィ の設定 サーバに接続す る には、 まず必要な グ ロ ーバル プ ロ パテ ィ を設定 し な ければな り ま せん。 次の コ ー ド では、 qop に値 sybpks_intl を 設定 し 、 pin に値 sybase を設定 し ます。 int rc rc = sp.SetGlobalProperty( "qop", "sybpks_intl" ) ア プ リ ケーシ ョ ン テ ク ニ ッ ク 569 セキ ュ ア な接続の確立 IF rc <> 0 THEN MessageBox( "QOP の設定に失敗 し ま し た ", & "rc = " + string(rc) ) ELSE MessageBox( "SSL の QOP プ ロパテ ィ の設定 ", & " 成功 し ま し た " ) END IF rc = sp.SetGlobalProperty( "pin", "sybase" ) IF rc <> 0 THEN MessageBox( "PIN の設定に失敗 し ま し た ", & "rc = " + string(rc) ) ELSE MessageBox( "SSL の PIN プ ロパテ ィ の設定 ", & " 成功 し ま し た " ) END IF SetGlobalProperty を使用 し て設定す る プ ロ パテ ィ のほ と ん どは、 ク ラ イ ア ン ト の実行中に一度だけ設定で き ます。 こ れ ら のプ ロ パテ ィ は、 ク ラ イ ア ン ト がサーバ と の接続を解除 し た場合 ま たはサーバに再接続 し た場合 も 有効です。 PowerBuilder の再起動 PowerBuilder で ク ラ イ ア ン ト ア プ リ ケーシ ョ ン を実行 し てい る 場合、 PowerBuilder のセ ッ シ ョ ン時にグ ロ ーバル プ ロ パテ ィ を設定で き る の は一度だけです。 グ ロ ーバル SSL プ ロ パテ ィ を設定す る コ ー ド を テ ス ト す る たびに、 PowerBuilder を再起動す る 必要があ り ます。 SSLCallback オブジ ェ ク ト の イ ン ス タ ン ス を使用 し て、ユーザ入力を対 話形式で取得す る 場合は、 グ ロ ーバル プ ロ パテ ィ CallBackImpl を設定 す る 必要が あ り ま す。 572 ページの 「SSL コ ールバ ッ ク の使い方」 を 参照 し て く だ さ い。 サーバへの接続 570 セ キ ュ ア な セ ッ シ ョ ン を 開始す る と 、 ク ラ イ ア ン ト お よ びサーバは SSL ハン ド シ ェ イ ク プ ロ セ ス で メ ッ セージ を交換 し ます。 ク ラ イ ア ン ト は、 サーバ と の通信で必要 と さ れ る 情報を提供 し 、 サーバは ク ラ イ ア ン ト に対 し てサーバ自身の認証を行っ た う えで、 プ ロ セ ス を継続 し ます。 サーバが ク ラ イ ア ン ト 認証を必要 と す る 場合は、 プ ロ セ ス を継 続す る 前に ク ラ イ ア ン ト が認証 さ れなければな り ません。 必要な認証 が完了す る と 、 ク ラ イ ア ン ト お よ びサーバは、 暗号化、 復号化、 お よ び SSL セ ッ シ ョ ンの不正箇所の検出に使用す る 、 双方で対称的な キー を 作 成 し ま す。 こ の プ ロ セ ス で 発 生 す る 例 外 を 取 り 込 む に は、 TRY/CATCH ブ ロ ッ ク に ConnectToServer 呼び出 し を置 く 必要があ り ま す。 PowerBuilder 第 25 章 PowerBuilder ク ラ イ ア ン ト での SSL の使い方 セキ ュ ア な接続が確立 し た ら 、接続オブジ ェ ク ト の location プ ロ パテ ィ で iiop ではな く iiops を使用 し ま す。 サーバは一般的には、 ポー ト 9001 ま たは 9002 でセ キ ュ ア な接続要求を待機 し ます。次の例では、 グ ロ ーバル変数 と し て宣言 さ れた接続オブ ジ ェ ク ト g_connect を使用 し ます。 こ こ では、 接続オブジ ェ ク ト の options プ ロ パテ ィ を使用 し て、 こ の接続に別の CypherSuite を指定 し ます。 long l_rc g_connect.userid = sle_user.text g_connect.password = sle_password.text g_connect.driver = "jaguar" g_connect.application = "myserverpkg" g_connect.location = "iiops://myserver:9001" g_connect.options = "ORBqop='sybpks_simple'" TRY l_rc = g_connect.ConnectToServer() CATCH (userabortedexception uae) MessageBox("UserAbortedException を取得 し ま し た ", & "ConnectToServer が次を取得 し ま し た :" & + uae.getMessage() ) l_rc = 999 CATCH ( CORBASystemException cse ) MessageBox("CORBASystemException を取得 し ま し た ", & "ConnectToServer が次を取得 し ま し た :" & + cse.getMessage() ) l_rc = 998 END TRY IF l_rc <> 0 THEN MessageBox(" エ ラ ー ", " 接続に失敗 し ま し た - コ ー ド : " & + string(l_rc) ) MessageBox(" エ ラ ー情報 ", " エ ラ ー コ ー ド = " & + string(g_connect.ErrCode) + "~nErrText= " & + g_connect.ErrText) ELSE MessageBox("OK", " 接続が確立 さ れま し た ") END IF 接続の ト ラ ブルシ ュ ー テ ィ ング セ キ ュ ア な接続が失敗 し た場合は、 セ キ ュ アでない接続の場合 と 同 じ エ ラ ー メ ッ セージが表示 さ れ ます。 そのエ ラ ー メ ッ セージには、 失敗 の原因に関す る 情報は示 さ れません。 ロ グ フ ァ イ ルに記録 さ れた詳細 情報を取得す る には、ORBLogIIOP オプシ ョ ン を有効に し 、ORBLogFile オプ シ ョ ン に値 を 指定 し ま す。 上の例で あれば、 g_connect.options 文を次の よ う な文で置 き 換え ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 571 SSL コ ールバ ッ クの使い方 g_connect.options = "ORBqop='sybpks_simple'" + & "ORBLogIIOP='TRUE', ORBLogFile='d:¥temp¥ORBLog.txt'" ま た、 環境変数 JAG_LOGFILE を設定 し て、 初期化に関す る エ ラ ーを 記録す る ロ グ フ ァ イ ルを指定す る こ と も で き ます。 SSL コ ールバ ッ ク の使い方 SSLCallback オブジ ェ ク ト は、サーバか ら ク ラ イ ア ン ト アプ リ ケーシ ョ ンに送 ら れ る 追加認証情報に対す る SSL リ ク エ ス ト を処理 し ます。pin な ど必要な設定が指定 さ れていない場合や、 無効な値が指定 さ れてい る 場合は、 C++ ORB に よ っ て コ ールバ ッ ク メ ソ ッ ド が呼び出 さ れ ま す。 コ ールバ ッ ク は、 有効期限が切れたサーバ証明書な ど、 例外的な状況 に 対応 し ま す。 相互認証 を 使用す る 場合、 コ ールバ ッ ク メ ソ ッ ド getCertificateLabel を使 う と 、使用可能な証明書の リ ス ト を ユーザに提示 で き ます。 ま た、 コ ールバ ッ ク を使用す る と 、 ユーザが無効な証明書 や無効なパ ス ワ ー ド を登録 し た際の再試行 ロ ジ ッ ク の処理を簡素化で き ます。 SSL コ ールバ ッ ク メ カ ニズ ム を使用す る には、 次の手順を行 う 必要が あ り ます。 1 EAServer の CTS Security モジ ュ ールに対 し てプ ロ キ シ オブジ ェ ク ト を作成 し て、 SSL セ ッ シ ョ ン情報を取得 し ます。 2 SSLCallback オブジ ェ ク ト か ら 継承 し た、標準カ ス タ ム ク ラ ス ユー ザ オブジ ェ ク ト を作成 し 、必要な コ ールバ ッ ク 関数を実装 し ます。 3 SSL のグ ロ ーバル プ ロ パテ ィ CallBackImpl に SSLCallback オブ ジ ェ ク ト の名前を設定 し 、 サーバに接続 し ます。 セッ シ ョ ン 情報の取得 ど の SSL コ ールバ ッ ク 関数か ら で も 、 SSL セ ッ シ ョ ン情報にア ク セ ス で き ます。 こ の情報を使用す る こ と で、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン のユーザに対 し て、 必要な認証情報を提供す る ために必要 と な る 情 報を渡 さ なければな り ません。 SSL セ ッ シ ョ ン情報を コ ールバ ッ ク 関数で使用す る ためには、 CTSSecurity モジ ュ ールに対 し て EAServer プ ロ キ シ を作成 し ます。 572 PowerBuilder 第 25 章 PowerBuilder ク ラ イ ア ン ト での SSL の使い方 ❖ CTSSecurity モ ジ ュ ールに対 し て プ ロキシ を作成する には 1 新規作成 ダ イ ア ロ グボ ッ ク ス の[プ ロ ジ ェ ク ト ]ページで[EAServer プ ロ キ シ ウ ィ ザー ド ] を 選択 し 、 [ タ ーゲ ッ ト ] ド ロ ッ プ ダ ウ ン リ ス ト ボ ッ ク ス か ら 対象の ク ラ イ ア ン ト アプ リ ケーシ ョ ン を選択 し ます。 2 いずれかの EAServer ホ ス ト に接続 し 、CTSSecurity モジ ュ ールを選 択 し ます。 CTSSecurity モ ジ ュ ールは、 すべて のサーバで使用可能な標準モ ジ ュ ールです。 3 ウ ィ ザー ド での操作を完了 し 、 プ ロ ジ ェ ク ト を作成 し ます。 シ ス テ ム ツ リ ー に 表示 さ れ る プ ロ キ シ オ ブ ジ ェ ク ト の う ち、 Sessioninfo オブ ジ ェ ク ト はすべて の SSLCallback 関数に渡 さ れ ま す。 SSLCallback オブ ジ ェ ク ト の実装 4 つの コ ールバ ッ ク 関数があ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 573 SSL コ ールバ ッ クの使い方 表 25-2: SSL コ ールバ ッ ク関数 関数 GetCertificateLabel GetCredentialAttribute GetPin TrustVerify 呼び出 し の タ イ ミ ング サーバが ク ラ イ ア ン ト 認証を要求 し てい る が、 ク ラ イ ア ン ト アプ リ ケーシ ョ ンに ク ラ イ ア ン ト 認証用の 証明書 ラ ベルが設定 さ れていない場合 ク ラ イ ア ン ト アプ リ ケーシ ョ ンにア カ ウ ン ト 情報属 性が設定 さ れていない場合 こ の属性は、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン で SSLServiceProvider オブジ ェ ク ト を使用 し て UseEntrustId プ ロ パテ ィ を設定 し た場合に使用 さ れ る 。 Entrust ID を使用 し てい る 場合のみ GetCredentialAttribute が便利。 Entrust お よ び PKCS 11 ト ー ク ンについての詳細は、 『EAServer セキ ュ リ テ ィ 管理お よ びプ ロ グ ラ ミ ン グ ・ ガ イ ド 』 マニ ュ ア ルを参照 し て く だ さ い。 PKCS11 ト ー ク ンが ロ グ イ ン さ れず、 PIN が SSLServiceProvider オブジ ェ ク ト のプ ロ パテ ィ と し て設定 さ れていない場合。 ま た、 ロ グ イ ン セ ッ シ ョ ンが タ イ ム ア ウ ト し た場合に も 呼び出 さ れ る サーバ内部での SSL 信頼確認チ ェ ッ ク が失敗 し て、 サーバの証明書チ ェ ーン を確認で き ない場合、 ま た は Sybase の PKCS11 ト ー ク ンに ロ グ イ ンする ための pin が設定さ れていないか正し く ない場合、TrustVerify は SSL プ ロ ト コ ルを使用する 場合 も 呼び出す こ と が でき る サーバ認証は SSL ハ ン ド シ ェ イ ク プ ロ セ ス で必要 な手順なので、 任意の SSL プ ロ ト コ ルを使用 し てい る と き に TrustVerify を呼び出す こ と がで き る 。ユーザ は、 内部チ ェ ッ ク を オーバー ラ イ ド し て SSL 接続を 続行す る か ど う かを選択で き る 以上の各関数は、 SSLCallback ク ラ ス に よ っ て実装 さ れてお り 、 デフ ォ ル ト の実装があ り ます。 コ ールバ ッ ク を使用す る 場合は、 その関数を 実装す る 必要があ り ます。各関数の実装例については、『PowerScript リ フ ァ レ ン ス』 マ ニ ュ ア ル ま た はオ ン ラ イ ン ヘルプ を 参照 し て く だ さ い。 ❖ 574 SSLCallBack ク ラ ス を実装するには 1 新規作成 ダ イ ア ロ グ ボ ッ ク ス の [PB オブジ ェ ク ト ] ページか ら [標準 ク ラ ス] を選択 し ます。 2 標準 ク ラ ス デー タ 型の選択 ダ イ ア ロ グボ ッ ク ス で [SSLCallback] を選択 し 、 [OK] を ク リ ッ ク し ます。 PowerBuilder 第 25 章 PowerBuilder ク ラ イ ア ン ト での SSL の使い方 デ フ ォル ト の実装 3 セ ッ シ ョ ン情報を ユーザに提供 し 、 ユーザか ら 必要な認証情報を 返 さ せ る ための、 コ ールバ ッ ク 関数の コ ー ド を記述 し ます。 4 実装す る そのほかの コ ールバ ッ ク 関数に対 し て、 手順 3 を繰 り 返 し ます。 実装を提供 し ていない場合、 ま たは実装か ら 空の文字列が返 さ れた場 合は、 コ ールバ ッ ク のデフ ォ ル ト の実装が使用 さ れます。 GetCertificateLabel お よ び GetCredentialAttribute の場合、 引数 リ ス ト には、 コ ールバ ッ ク に対 し て有効な戻 り 値であ る 文字列値の配列が含ま れ ま す。 こ れ ら の コ ールバ ッ ク のデフ ォ ル ト の実装は、 こ の配列が空の場 合、 例外を送出 し 、 配列が空でない場合は、 その配列の最初の要素を 返 し ます。 その結果、 配列の最初の要素がサーバで受け入れ可能で あ れば、 接続プ ロ セ ス は継続 し ますが、 受け入れ可能でなければ失敗 し ます。 TrustVerify の場合、 デフ ォ ル ト の実装は現行の接続を拒否 し ます。 例外の処理 GetPin、 GetCertificateLabel、 お よ び GetCredentialAttribute の実装では、 要 求 さ れた情報 を ユーザが提供で き な い場合には、 ユーザ側で接続 を キ ャ ン セルで き る よ う にす る 必要が あ り ま す。 こ れ を 実現す る には、 関 数 の 実 装 内 で 例 外 を 送 出 し 、 ConnectToServer 呼 び 出 し を 置 く TRY/CATCH ブ ロ ッ ク 内でその例外を取 り 込み ま す。 コ ールバ ッ ク 関 数内で送出 し た例外に よ っ て、 CTSSecurity::UserAbortedException 例外 が発生 し ます。 関数に よ っ て送出で き る 例外は、 その関数のプ ロ ト タ イ プの Throws 句に追加す る 必要があ り ます。 SSLCallback オブ ジ ェ ク ト の指定 サーバ に 接続す る に は、 ま ず、 SSLCallback オ ブ ジ ェ ク ト の 名前 を SSLServiceProvider の CallbackImpl プ ロ パテ ィ に指定 し ます。 SSLServiceProvider sp int rc getcontextservice("SSLServiceProvider", sp) rc = sp.setglobalproperty( "CallbackImpl", & "uo_sslcallback" ) IF rc <> 0 THEN MessageBox("CallbackImpl の設定に失敗 し ま し た ", & "rc= " + string(rc)) RETURN END IF MessageBox( "CallbackImpl プ ロパテ ィ の設定 ", & ア プ リ ケーシ ョ ン テ ク ニ ッ ク 575 セ ッ シ ョ ン セキ ュ リ テ ィ 情報の取得 " 成功 し ま し た " ) RETURN ク ラ イ ア ン ト ア プ リ ケーシ ョ ン の実行バージ ョ ン で コ ールバ ッ ク オ ブジ ェ ク ト を参照で き る よ う にす る ために、 アプ リ ケーシ ョ ン内でそ の コ ールバ ッ ク オブ ジ ェ ク ト 型の変数 を 宣言 し てお く 必要が あ り ま す。 次に例を示 し ます。 uo_sslcallback iuo_sslcb こ の よ う な宣言を行 う 理由は、 コ ールバ ッ ク オブジ ェ ク ト はその文字 列名に よ っ てのみ参照 さ れ る ので、 技術的には非参照オブジ ェ ク ト で あ り 、 実行フ ァ イ ルには含 ま れないためです。 宣言 し た変数を コ ー ド で使用す る 必要はあ り ません。 セ ッ シ ョ ン セキ ュ リ テ ィ 情報の取得 CtsSecurity.SSLSession お よ び CtsSecurity.SSLSessionInfo ク ラ ス を使用す る と 、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン では、 プ ロ キ シか ら サーバへの 接続で SSL が使用 さ れ る か ど う か を判断で き 、 SSL が使用 さ れ る 場合 には、 SSL セ ッ シ ョ ン設定 を取得 し て ユーザに対 し て表示で き ま す。 値を取得で き る プ ロ パテ ィ の一覧については、 Web ブ ラ ウ ザでお使い のサーバ(http://hostname:portnumber/ir/CtsSecurity__SSLSessionInfo.html)に 接続 し て、SessionInfo に関す る EAServer イ ン タ フ ェース リ ポジ ト リ の マニ ュ アルを参照 し て く だ さ い。 long rc string stmp CTSSecurity_sslSessionInfo mySessionInfo rc = thesessioninfo._narrow( mySessionInfo, & "SessionInfo" ) MessageBox( str_header, "Narrow:rc=" + string(rc)) sTmp = "Properties" sTmp = "~nVersion: " stmp += mySessionInfo.getProperty( "Version" ) sTmp = "~nHost: " stmp += mySessionInfo.getProperty( "host" ) stmp += "~nport: " stmp += mySessionInfo.getProperty( "port" ) stmp += "~nciphersuite: " 576 PowerBuilder 第 25 章 PowerBuilder ク ラ イ ア ン ト での SSL の使い方 stmp += mySessionInfo.getProperty( "ciphersuite" ) stmp += "~nCertificateLabel: " stmp += mySessionInfo.getProperty( "certificateLabel" ) stmp += "~nUserData: " stmp += mySessionInfo.getProperty( "UserData" ) stmp += "~ntokenName: " stmp += mySessionInfo.getProperty( "tokenName" ) stmp += "~nuseEntrustID: " stmp + = mySessionInfo.getProperty( "useEntrustID" ) MessageBox( str_header, stmp) ア プ リ ケーシ ョ ン テ ク ニ ッ ク 577 セ ッ シ ョ ン セキ ュ リ テ ィ 情報の取得 578 PowerBuilder 第 2 6 章 COM/MTS/COM+ コ ン ポーネ ン ト の構築 こ の章について こ の章では、PowerBuilder を使用 し て、COM/MTS/COM+ コ ン ポー ネ ン ト を構築す る 方法について説明 し ます。 内容 項目 COM/MTS/COM+ コ ン ポーネ ン ト の構築について コ ン ポーネ ン ト オブジ ェ ク ト モデルについて コ ン ポーネ ン ト イ ン タ フ ェ ース の定義 COM コ ン ポーネ ン ト か ら デー タ ベースへのア ク セ ス ト ラ ンザ ク シ ョ ンのサポー ト MTS でのオブジ ェ ク ト 有効期間コ ン ト ロ ールのサポー ト 別のサーバ コ ン ポーネ ン ト の メ ソ ッ ド の呼び出 し セキ ュ リ テ ィ 問題 プ ロ ジ ェ ク ト ペ イ ン タ での COM/MTS/COM+ コ ン ポーネ ン ト の構築 PowerBuilder COM オブジ ェ ク ト の実行 PowerBuilder COM サーバの配布 ク ラ イ ア ン ト か ら PowerBuilder COM サーバへのア ク セ ス ページ 579 582 586 590 594 598 598 599 600 605 606 611 COM/MTS/COM+ コ ンポーネ ン ト の構築について ビ ジネ ス ロ ジ ッ ク を含むカ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト を PowerBuilder で開発す る と 、 そ の オ ブ ジ ェ ク ト を COM サーバ、 MTS、 ま たは COM+ アプ リ ケーシ ョ ン と し てパ ッ ケージ化す る こ と がで き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 579 COM/MTS/COM+ コ ンポーネ ン ト の構築について Windows 2000 や Windows XP な ど の COM+ を サポー ト し てい る プ ラ ッ ト フ ォーム では、COM+ アプ リ ケーシ ョ ン を構築 し て COM+ に配布で き ま す。 Windows NT の よ う に、 COM+ は サ ポ ー ト し て い な い が、 Microsoft Transaction Server (MTS) に必要な コ ン ポーネ ン ト は、 イ ン ス ト ール さ れ て い る プ ラ ッ ト フ ォ ー ム で COM サ ーバ を 構築 し て、 MTS に配布で き ます。 こ の章以降では、 COM と COM+ を サポー ト し てい る コ ン ポーネ ン ト の こ と を、 COM コ ン ポーネ ン ト と 呼んでい ます。 PowerBuilder COM ア プ リ ケ ー シ ョ ン に は、 1 つ ま た は 複 数 の PowerBuilder カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト を組み込む こ と が で き ます。ユーザ オブジ ェ ク ト を ユーザ オブジ ェ ク ト ペ イ ン タ で コ ー ド 化 し てか ら 、 プ ロ ジ ェ ク ト ペ イ ン タ でサーバを構築 し ます。 アプ リ ケーシ ョ ン を ロ ーカルの MTS ま たは COM+ サーバに直接配布 し た り 、 プ ロ ジ ェ ク ト ペ イ ン タ で MTS パ ッ ケージ ま たは COM+ Microsoft イ ン ス ト ー ラ パ ッ ケージ を作成す る こ と も で き ます。 PowerBuilder COM ア プ リ ケーシ ョ ン を 生成 し て配布す る と 、 ユーザ は、 PowerBuilder、 Visual Basic、 C++ コ ンパ イ ラ な ど の ツールで構築 さ れ た COM 対応 ク ラ イ ア ン ト ア プ リ ケ ー シ ョ ン か ら 、 PowerBuilder COM ア プ リ ケーシ ョ ン に格納 さ れた PowerBuilder オブジ ェ ク ト の メ ソ ッ ド を呼び出す こ と がで き ます。 ウィ ザード の使い方について PowerBuilder は、 COM コ ン ポーネ ン ト の開発 と 配布を簡単にす る 以下 の ウ ィ ザー ド を用意 し てい ます。 • 新規のアプ リ ケーシ ョ ン、 新規の カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト 、 お よ び新規のプ ロ ジ ェ ク ト を作成 し ます。 • 既存のアプ リ ケーシ ョ ン に新規のカ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト を作成 し 、新規のプ ロ ジ ェ ク ト を作 成 し ます。 • プ ロ ジ ェ ク ト ウ ィ ザー ド 1 つ ま たは複数の既存のカ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト か ら 、COM サーバの構築に使用す る プ ロ ジ ェ ク ト を作成 し 、 オプシ ョ ン で COM+ ま たは MTS パ ッ ケージ も 作 成 し ます。 タ ーゲ ッ ト ウ ィ ザー ド オブ ジ ェ ク ト ウ ィ ザー ド COM/MTS/COM+ の タ ーゲ ッ ト ウ ィ ザー ド ま たはオブ ジ ェ ク ト ウ ィ ザー ド を使用 し て、 新規のユーザ オブジ ェ ク ト を作成 し た場合、 以下 の と お り と な り ます。 580 PowerBuilder 第 26 章 COM/MTS/COM+ コ ンポーネ ン ト の構築 ウ ィ ザー ド を使用する タ イ ミ ング • オブジ ェ ク ト には、 Activate と Deactivate と い う 、 2 つの新 し い イ ベン ト があ り ます。 • オブジ ェ ク ト は、COM/MTS の検証のサポー ト を有効に し ています。 • ウ ィ ザー ド の最終ページのボ ッ ク ス を オ ン に し た場合には、 ウ ィ ザー ド は To-Do リ ス ト に項目を追加す る こ と に よ っ て、 開発のす べての ス テ ッ プ を実行す る よ う 注意を促 し ます。 新規オブ ジ ェ ク ト 単一の新規カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト を 含むサーバ を 構築す る 場合には、 タ ーゲ ッ ト ウ ィ ザー ド ま たはオブ ジ ェ ク ト ウ ィ ザー ド を使用 し て、 その機能を利用 し ます。 複数の新規カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト を含むサーバを構築 す る 場合に タ ーゲ ッ ト ウ ィ ザー ド ま たは オブジ ェ ク ト ウ ィ ザー ド を 使用す る と 、オブジ ェ ク ト ご と に異な る プ ロ ジ ェ ク ト が作成 さ れ ます。 し たがっ て、 いずれか 1 つのプ ロ ジ ェ ク ト にすべてのオブジ ェ ク ト を 追加 し 、 それ以外のプ ロ ジ ェ ク ト は破棄す る 必要があ り ます。 ま た、 タ ーゲ ッ ト ウ ィ ザー ド も オブジ ェ ク ト ウ ィ ザー ド も 使用せずに 新規カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト を作成 し 、その後でプ ロ ジ ェ ク ト ウ ィ ザー ド ま たはプ ロ ジ ェ ク ト ペ イ ン タ を使用 し てプ ロ ジ ェ ク ト を作成す る こ と も で き ます。 ユーザ オブジ ェ ク ト ペ イ ン タ では、 COM/MTS の検証を有効に し て、 Activate イ ベ ン ト と Deactivate イ ベ ン ト を ユーザ定義 イ ベン ト と し て 追加す る こ と がで き ます。 詳細については、 589 ページの 「COM/MTS の検証」 お よ び 598 ページの 「MTS でのオブジ ェ ク ト 有効期間 コ ン ト ロ ールのサポー ト 」 を参照 し て く だ さ い。 COM サーバ と し て配布す る 1 つ ま たは複数の カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト があ る 場合は、 それ ら のオブジ ェ ク ト が、 586 ページの 「 コ ン ポーネ ン ト イ ン タ フ ェ ース の定義」 お よ び それ以降の節で説明す る 要件 を 満た し て い る こ と を 確認 し て く だ さ い。 新規のユーザ オブジ ェ ク ト に関 し ては、 ユーザ オブジ ェ ク ト ペ イ ン タ で COM/MTS の検証を有効に し 、 Activate イ ベン ト と Deactivate イ ベン ト を ユーザ定義 イ ベン ト と し て追加 し ます。 サーバの構築準備 がで き た ら 、 プ ロ ジ ェ ク ト ウ ィ ザー ド を使用 し てプ ロ ジ ェ ク ト を設定 し ます。 既存オブ ジ ェ ク ト 開発プ ロ セス について 1 つま たは複数のカス タ ム ク ラ ス ユーザ オブジェ ク ト から PowerBuilder COM サーバを構築お よ び配布す る には、以下の手順を実行す る 必要が あ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 581 コ ンポーネ ン ト オブ ジ ェ ク ト モデルについて 1 新規カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト を作成す る か、ま たは既 存のユーザ オブジ ェ ク ト を開 き ます。 タ ーゲ ッ ト ウ ィ ザー ド ま たはオブ ジ ェ ク ト ウ ィ ザー ド を 使用す る 場合には、 新規オブジ ェ ク ト の作成 と 配布に使用す る プ ロ ジ ェ ク ト オブジ ェ ク ト も 作成 し ます。 2 ユーザ オブジ ェ ク ト ペ イ ン タ でユーザ オブジ ェ ク ト の ス ク リ プ ト を記述 し ます。 586 ページの 「 コ ン ポーネ ン ト イ ン タ フ ェ ース の定義」 を参照 し て く だ さ い。 3 場合に よ っ ては、 同 じ アプ リ ケーシ ョ ン で追加のユーザ オブジ ェ ク ト の作成 と ス ク リ プ ト の記述を行い ます。 4 ウ ィ ザー ド を 使わずに ユーザ オ ブ ジ ェ ク ト を 作成 し た 場合は、 COM/MTS/COM+ プ ロ ジ ェ ク ト ウ ィ ザー ド ま たはプ ロ ジ ェ ク ト ペ イ ン タ を使用 し てプ ロ ジ ェ ク ト を作成 し ます。 600 ページの 「プ ロ ジ ェ ク ト ペ イ ン タ での COM/MTS/COM+ コ ン ポーネ ン ト の構築」 を参照 し て く だ さ い。 5 プ ロ ジ ェ ク ト を開いて、 必要で あれば、 選択 さ れたオブジ ェ ク ト と そのプ ロ パテ ィ の リ ス ト を修正 し 、プ ロ ジ ェ ク ト を作成 し ます。 6 サーバを配布 し ます。 606 ページの 「PowerBuilder COM サーバの配布」 を参照 し て く だ さ い。 コ ンポーネ ン ト オブ ジ ェ ク ト モデルについて Microsoft コ ン ポーネ ン ト オブジ ェ ク ト モデル (COM) は、 ソ フ ト ウ ェ ア コ ン ポーネ ン ト が互いにサー ビ ス を 提供す る た めの標準的な方法 を定義 し ます。 実行環境、 レ ジ ス ト リ エ ン ト リ 、 お よ び タ イ プ ラ イ ブ ラ リ (オプシ ョ ン) を提供すれば、 ど の PowerBuilder カ ス タ ム ク ラ ス ユーザ オブ ジ ェ ク ト で も 、 COM オブ ジ ェ ク ト と し て使用で き ま す。 PowerBuilder や Visual Basic な ど の COM 準拠ツールで作成 し た ク ラ イ ア ン ト は、COM オブジ ェ ク ト の ビ ジネ ス ロ ジ ッ ク を使用で き ます。そ れ に は、 COM オ ブ ジ ェ ク ト の イ ン ス タ ン ス を 作成 し 、 そ の イ ン タ フ ェ ー ス に よ っ て エ ク ス ポーズ さ れてい る メ ソ ッ ド を 呼び出 し ま す。 サポー ト す る イ ン タ フ ェ ース に よ っ て、 COM オブジ ェ ク ト は、 Java と C++ の ク ラ イ ア ン ト か ら も 使用で き ます。 582 PowerBuilder 第 26 章 COM/MTS/COM+ コ ンポーネ ン ト の構築 COM+ は、 よ り 多 く の リ ソ ース管理 タ ス ク に対処 し 、 ス レ ッ ド プー リ ン グ、 オブジ ェ ク ト プー リ ン グ、 ジ ャ ス ト イ ン タ イ ムのオブジ ェ ク ト のア ク テ ィ ブ化を実現す る こ と で、COM と MTS を拡張 し た も のです。 PowerBuilder COM サーバについて PowerBuilder は、 単一の PowerBuilder COM サーバを作成 し ます。 こ の PowerBuilder COM サーバには、 プ ロ ジ ェ ク ト 作成時に選択 し たすべて のカ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト に対応す る PowerBuilder COM オブジ ェ ク ト が含まれてい ます。 COM は、 オブジ ェ ク ト を作成 と 破棄する 方法、 イ ン タ フ ェース をエ ク ス ポーズする方法、メ ソ ッ ド の呼び出し 方法を指定し ます。PowerBuilder COM サーバは COM 仕様に従い ます。 つま り 、 PowerBuilder COM オブ ジ ェ ク ト が、 PowerBuilder 仮想マシ ン を介 し て カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト と や り 取 り し てい る こ と を、 ク ラ イ ア ン ト が意識す る こ と はあ り ません。 オート メ ーシ ョ ン サーバと PowerBuilder COM サーバの比較 PowerBuilder では、 PowerBuilder COM サーバと オート メ ーショ ン サー バと いう 2 つの方法で COM オブジェ ク ト を 生成でき ま す。いずれも ウ ィ ザード と プロ ジ ェ ク ト ペイ ン タ から ア ク セス でき ま す。 PowerBuilder COM サーバは、 オー ト メ ーシ ョ ン サーバ よ り 多 く の機能を提供 し ま す。 PowerBuilder COM サーバには、複数のカ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト を含め る こ と がで き ます。 ユーザ オ ブジ ェ ク ト を コ ーデ ィ ン グ し た後で、 プ ロ ジ ェ ク ト ペ イ ン タ を使用 し て、 すべてのオブジ ェ ク ト 用の 1 つの自己登録型 DLL を生成 し ます。 構築 コ ン ピ ュ ー タ 上で実行す る 場合には、 作成 し た COM サーバは、 MTS ま たは COM+ に直接配布で き ます。 ま た、 MTS/COM+ パ ッ ケー ジ を作成す る こ と も で き ます。 COM サーバ内の PowerBuilder COM オ ブジ ェ ク ト は、 実行時セ ッ シ ョ ン を共有で き ます。 ま た、 同 じ COM ク ラ イ ア ン ト か ら 作成 さ れたオブジ ェ ク ト 間で参照を受け渡す こ と も で き ます。 PowerBuilder COM サーバ COM サーバには、 埋め込み PowerBuilder 動的 ラ イ ブ ラ リ (PBD) フ ァ イ ル も 含まれてい ます。 PBD フ ァ イ ルは、 選択 し たすべてのカ ス タ ム ク ラ ス ユーザ オ ブ ジ ェ ク ト と そ れに依存す る コ ン パ イ ル済みオ ブ ジェ ク ト に加えて、レ ジス ト リ と タ イ プ ラ イ ブラ リ の情報も 含みま す。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 583 コ ンポーネ ン ト オブ ジ ェ ク ト モデルについて PowerBuilder カ ス タ ム ク ラ ス ユ ー ザ オ ブ ジ ェ ク ト か ら 作成 さ れた オー ト メ ーシ ョ ン サーバには、 1 つのオ ブ ジ ェ ク ト だけが含 ま れてい ま す。 ユーザ オブジ ェ ク ト を記述 し た後、 そのオブジ ェ ク ト を含む PBL か ら ラ ン タ イ ム ラ イ ブ ラ リ を作成 し 、続 いてプ ロ ジ ェ ク ト ペ イ ン タ を使用 し て、 レ ジ ス ト リ フ ァ イ ル と オプ シ ョ ン の タ イ プ ラ イ ブ ラ リ フ ァ イ ルを作成 し ます。オー ト メ ーシ ョ ン サーバを配布す る と き 、 ユーザの コ ン ピ ュ ー タ に合わせて レ ジ ス ト リ フ ァ イ ルを カ ス タ マ イ ズ し 、 その レ ジ ス ト リ フ ァ イ ルを実行 し てオー ト メ ーシ ョ ン サーバを登録 し ます。 オー ト メ ーシ ョ ン サーバ オー ト メ ーシ ョ ン サーバ ま たは PowerBuilder COM サーバに加え て、 サーバが必要 と す る ほかの PowerBuilder ラ ン タ イ ム フ ァ イ ル も あわせ て、 PowerBuilder 仮想マシ ン を配布 し ます。 デ ィ スパ ッ チ、 デ ュ ア ル、 カ ス タ ムの各イ ン タ フ ェ ース オート メ ーショ ン サーバは、 ディ ス パッ チ イ ン タ フ ェ ース (dispinterface と も い う ) を使用 し ます。 こ れに よ っ て、 ユーザは、 IDispatch と い う 標準 COM イ ン タ フ ェ ース の Invoke メ ソ ッ ド を使用 し て、 サーバ上の メ ソ ッ ド を呼び出す こ と がで き ます。 COM サーバでは、デ ィ ス パ ッ チベース の イ ン タ フ ェ ース よ り も 高いパ フ ォ ーマ ン ス を提供す る 、カ ス タ ム イ ン タ フ ェ ース ま たはデ ュ アル イ ン タ フ ェース を使用で き ます。 カ ス タ ム イ ン タ フ ェース は、 サーバの イ ン タ フ ェ ー ス内の メ ソ ッ ド へのポ イ ン タ が格納 さ れた仮想テーブル (VTBL ま たは vtable と も い う ) を介 し て、 サーバ上の メ ソ ッ ド へのア ク セ ス を提供 し ます。 デ ュ アル イ ン タ フ ェ ース を使用すれば、 ク ラ イ ア ン ト は、 IDispatch::Invoke ま たは仮想テーブルの ど ち ら を使用 し て も 、 メ ソ ッ ド を呼び出す こ と がで き ます。 詳細については、 604 ページの 「カ ス タ ム イ ン タ フ ェ ース と デ ュ アル イ ン タ フ ェ ース の選択」 を参照 し て く だ さ い。 サーバ間の相違のま と め 584 表 26-1 に、 PowerBuilder オー ト メ ーシ ョ ン サーバ と 、 デ ュ アル イ ン タ フ ェ ー ス ま た は カ ス タ ム イ ン タ フ ェ ー ス を 使用す る PowerBuilder COM サーバ と の相違を ま と め ます。 PowerBuilder 第 26 章 COM/MTS/COM+ コ ンポーネ ン ト の構築 表 26-1: オー ト メ ーシ ョ ン サーバ と COM サーバの比較 機能 イ ンプ ロ セ ス サーバのサポー ト IDL フ ァ イ ルの生成 C++ ク ラ イ ア ン ト のサポー ト Java ク ラ イ ア ン ト のサポー ト PowerBuilder ク ラ イ ア ン ト の サポー ト Visual Basic 4 ク ラ イ ア ン ト の サポー ト Visual Basic 6 以降のカ ス タ ム イ ン タ フ ェース のサポー ト イ ン ス タ ン ス変数お よ び メ ソ ッ ド 引数 タ イ プ と し ての PowerBuilder 構造体のサポー ト すべての C 言語デー タ 型のサ ポー ト 埋め込み タ イ プ ラ イ ブ ラ リ の サポー ト 自己登録サーバ DCOM のサポー ト # EAServer のサポー ト MTS のサポー ト 別個のプ ロ キシ / ス タ ブ DLL が必要 PowerBuilder ラ ン タ イ ム DLL が必要 (最低限 PBVM90J.DLL と その依存 ラ イブラ リ ) ラ イ ブ ラ リ ペ イ ン タ で作成 し た アプ リ ケーシ ョ ン ラ ン タ イ ム ラ イ ブ ラ リ の配布が必要 オー ト メ ー シ ョ ン サー バ (デ ィ ス パッ チ イン タ フ ェ ース) Yes* COM サーバ (デ ュ アル インタ フ ェ ース) Yes COM サーバ (カ ス タ ム インタ フ ェ ース) Yes No No Yes Yes Yes Yes Yes Yes Yes Yes No No Yes Yes No No No Yes No No No No No No No Yes Yes No Yes Yes Yes No Yes Yes Yes Yes No Yes Yes No Yes No Yes Yes Yes Yes No No * PowerBuilder 実行 DLL (PBVM90J.DLL) は、 イ ンプ ロ セ ス サーバです。 # PowerBuilder 実行 DLL を収容す る ために、 代理ホ ス ト を使用す る 必要があ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 585 コ ンポーネ ン ト イ ン タ フ ェ ースの定義 コ ンポーネ ン ト イ ン タ フ ェ ースの定義 PowerBuilder カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト を COM/MTS コ ン ポーネ ン ト と し て構築 し た場合には、 そのオブジ ェ ク ト に定義 さ れた 関数 と イ ン ス タ ン ス 変数 (オ プ シ ョ ン) が コ ン ポ ー ネ ン ト イ ン タ フ ェ ース に表示 さ れ ます。PowerBuilder が生成す る IDL フ ァ イ ルでは、 サーバ内に含ま れ る カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト ご と の COM ク ラ ス と 1 つの イ ン タ フ ェース に加え て、 PowerBuilder COM サーバの タ イ プ ラ イ ブ ラ リ 名 と 関連す る ID も 定義 し ます。 メ ソ ッ ド と データ 型 関数 各 PowerBuilder COM オブジ ェ ク ト は単一の イ ン タ フ ェ ー ス を サポー ト し てお り 、 こ れに よ っ て、 カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト 内 のユーザ定義パブ リ ッ ク 関数ご と に メ ソ ッ ド を エ ク ス ポーズ し ます。 関数の戻 り 値は、 追加の retval 引数に よ っ て表 さ れ ます。 た と えば、 オ ブジ ェ ク ト に以下のユーザ オブジ ェ ク ト 関数が存在す る と し ます。 f_addtwo (long al_num1, long al_num2) returns long f_getinfo (REF string as_name, REF integer ai_age, REF character ac_gender) returns integer IDL フ ァ イ ル内に以下の メ ンバ関数が生成 さ れます。 HRESULT f_addtwo( [in] long al_num1, [in] long al_num2, [out, retval] long * retval ); HRESULT f_getinfo( [in, out] BSTR * as_name, [in, out] short * ai_age, [in, out] unsigned char * ac_gender, [out, retval] short * retval ); イ ン ス タ ン ス変数 586 COM オブジ ェ ク ト は自分のデー タ を エ ク ス ポーズ し ないため、カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト 内のパブ リ ッ ク イ ン ス タ ン ス 変数は、 COM オブ ジ ェ ク ト において変数値 を取得お よ び設定す る ための イ ン タ フ ェース メ ソ ッ ド と し て表現 し ます。変数のア ク セサ メ ソ ッ ド を イ ン タ フ ェ ー ス と し て エ ク ス ポーズす る た めの指定は、 プ ロ ジ ェ ク ト ウ ィ ザー ド ま たはプ ロ ジ ェ ク ト ペ イ ン タ の [オブ ジ ェ ク ト ] プ ロ パ テ ィ ページで行い ます。 PowerBuilder 第 26 章 COM/MTS/COM+ コ ンポーネ ン ト の構築 パブ リ ッ ク 変数が書 き 込み可能であ る 場合には、Put メ ソ ッ ド がエ ク ス ポーズ さ れ ま す。 プ ラ イ ベー ト 変数 と プ ロ テ ク ト 変数、 privateread ま た は protectedread と し て宣言 さ れた変数、 お よ び privatewrite ま た は protectedwrite と し て宣言 さ れた変数の場合には、 メ ソ ッ ド は生成 さ れ ません。変数がパブ リ ッ ク に読み込み可能であ る 場合には、Get メ ソ ッ ド がエ ク ス ポーズ さ れ ます。 た と えば、 オブジ ェ ク ト に以下の イ ン ス タ ン ス変数があ る と し ます。 public string is_name private integer ii_a public privatewrite string is_label constant real lr_pi = 3.14159265 IDL フ ァ イ ル内に以下の メ ソ ッ ド が作成 さ れ ます。 [id(4), propget] HRESULT BSTR *is_name); [id(4), propput] HRESULT BSTR is_name); [id(1), propget] HRESULT BSTR *is_label); [id(6), propget] HRESULT float * lr_pi); デー タ 型マ ッ ピ ング is_name([out,retval] is_name([in] is_label([out,retval] lr_pi( [out,retval] 表 26-2 で示す よ う に PowerBuilder のデー タ 型は COM のデー タ 型に マ ッ プ し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 587 コ ンポーネ ン ト イ ン タ フ ェ ースの定義 表 26-2: PowerBuilder と COM のデー タ 型のマ ッ ピ ング PowerBuilder デー タ 型 COM のデー タ 型 (バ リ ア ン ト ) Boolean Variant_BOOL Character Unsigned char Integer Short UnsignedInteger Unsigned short Long Long UnsignedLong Unsigned long Real Float Double Double Decimal Double String BSTR Date DATE Time DATE DateTime DATE Blob SAFEARRAY (Unsigned char) Arrays (PowerBuilder デー タ 型) ResultSet カ ス タ ム ク ラ ス ユーザ オブ ジ ェ クト * Any グ ロ ーバル構造体 OLEObjects SAFEARRAY (COM デー タ 型) LPDISPATCH LPDISPATCH サポー ト な し サポー ト な し サポー ト な し * カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト は、 同 じ COM アパー ト メ ン ト の同 じ ク ラ イ ア ン ト 内 (つま り 、 同 じ ス レ ッ ド 内) で作成す る 必要があ り ます。 コ ーディ ン グ上の制約 ユーザ オブ ジ ェ ク ト を COM/MTS コ ン ポーネ ン ト と し て配布す る 場 合には、 コ ー ド で使用で き ない要素がい く つかあ り ます。 関数の多重定義は使用 で き ない 588 COM は、 COM オブジ ェ ク ト への イ ン タ フ ェ ース において、 関数の多 重定義をサポー ト し てい ません。 ユーザ オブジ ェ ク ト (お よ びその先 祖)内の各関数の名前は一意でなければな り ません。PowerBuilder COM オ ブ ジ ェ ク ト は単一の イ ン タ フ ェ ー ス し か持 ち ま せん。 同 じ 名前で あ っ て も シ グ ネチ ャ が異な る 複数の関数は、 複数の イ ン タ フ ェ ー ス が 必要 と な り ます。 PowerBuilder 第 26 章 COM/MTS/COM+ コ ンポーネ ン ト の構築 先祖変数 と 先祖関数の 表現方法 子孫ユーザ オブジ ェ ク ト か ら PowerBuilder COM オブジ ェ ク ト を生成 す る と 、先祖 と 子孫のパブ リ ッ ク イ ン ス タ ン ス変数 と 関数がその COM オブジ ェ ク ト に表現 さ れ ます。 一部の コ ン ポーネ ン ト メ ソ ッ ド は先祖 オブジ ェ ク ト か ら 派生 し た も のにな り ますが、 その こ と は ク ラ イ ア ン ト か ら は見え ません。 上述の関数の多重定義の制約に よ っ て、 子孫オ ブ ジ ェ ク ト の関数は先祖オブ ジ ェ ク ト の関数を 上書 き はで き ま すが、 オーバー ロ ー ド す る こ と はで き ません。 引数 と 戻 り 値のデー タ 型 COM オブジ ェ ク ト と し て配布す る 非ビ ジ ュ アル オブジ ェ ク ト に関連 付け ら れた メ ソ ッ ド は、 以下のデー タ 型を持つ引数を受け取 る こ と が で き ます。 • 標準の OLE オー ト メ ーシ ョ ン デー タ 型 • カ ス タ ム ク ラ ス の (非ビ ジ ュ アル) ユーザ オブジ ェ ク ト COM コ ン ポーネ ン ト メ ソ ッ ド は、PowerBuilder 構造体ま たは Any 型の 引数ま たは戻 り 値を受け取 る こ と がで き ません。 引数 と し て Any 変数 を受け取っ た り 、 Any 変数を返 し た り す る PowerBuilder 非ビ ジ ュ アル オブジ ェ ク ト 上で定義 さ れた関数は、 そのオブジ ェ ク ト の ロ ーカルな コ ー ド か ら は呼び出せますが、ク ラ イ ア ン ト ま たはそのほかの COM コ ン ポーネ ン ト か ら こ れ ら の関数にア ク セ スす る こ と はで き ません。 コ ン ポーネン ト メ ソ ッ ド への引数には、 ビ ジュ アル オブジェ ク ト (ウ ィ ン ド ウ やメ ニュ ーなど ) 、 およ び大半のシス テム タ イ プ (Transaction オ ブジ ェ ク ト や DataStore オブジ ェ ク ト な ど) も 指定で き ません。 サポー ト さ れてい る 唯一のシ ス テ ム タ イ プは、 ResultSet オブジ ェ ク ト です。 コ ン ポーネ ン ト メ ソ ッ ド の戻 り 値には、 任意の標準デー タ 型を指定で き ます。 ま た、 カ ス タ ム ク ラ ス (非ビ ジ ュ アル) ユーザ オブジ ェ ク ト も 指定で き ます。 COM/MTS の検証 COM/MTS コ ン ポ ー ネ ン ト と し て 配布す る 予定 の カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト を設計す る 場合には、 COM ま たは MTS において 有効でない コ ー ド 要素を使用 し た と き に、 PowerBuilder に警告 さ せ る こ と がで き ます。 COM/MTS の検証では、関数の多重定義の有無をチ ェ ッ ク し 、パブ リ ッ ク イ ン ス タ ン ス変数 と パブ リ ッ ク 関数で、 シ ス テ ム タ イ プ、 ビ ジ ュ ア ル タ イ プ、 構造体、 お よ び Any 変数が使用 さ れていないかチ ェ ッ ク し ます。 ユーザ オ ブ ジ ェ ク ト ペ イ ン タ で、 メ ニ ュ ーバーか ら [デザ イ ン | COM/MTS 検証] がチ ェ ッ ク さ れてい る こ と を確認 し て く だ さ い。 オ ブジ ェ ク ト を保存す る と 、 出力 ウ ィ ン ド ウ に以下の よ う な警告が一覧 表示 さ れ ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 589 COM コ ンポーネ ン ト か ら デー タ ベースへのア ク セス 情報 C0197: コ ンポーネ ン ト 検証 警告 C0198: 適切でない COM/MTS タ イ プ :'any' arg type for function:'of_badfunc' 警告 C0198: 適切でない COM/MTS タ イ プ :'window' arg type for function:'of_badfunc' 検証状態は、 ユーザ オブジ ェ ク ト ペ イ ン タ ではな く 、 編集中のオブ ジ ェ ク ト に関連付け ら れ ます。 オブジ ェ ク ト を再び開 く と 、 オブジ ェ ク ト の検証状態は閉 じ た と き と 同 じ にな り ます。 新規の COM/MTS オ ブジ ェ ク ト は、 COM/MTS 検証がチ ェ ッ ク さ れた状態で作成 さ れ ます。 ロ グ フ ァ イ ルへのエ ラ ー記録 MTS ま たは COM+ で動作 し てい る COM オブジ ェ ク ト に よ っ て生成 さ れたエ ラ ーを、 Windows シ ス テ ムのアプ リ ケーシ ョ ン ロ グに出力す る には、 ErrorLogging サービ ス コ ン テ キ ス ト オブジ ェ ク ト の イ ン ス タ ン ス を作成 し 、 その log メ ソ ッ ド を呼び出 し ま す。 た と えば、 次の よ う にな り ます。 ErrorLogging el this.GetContextService("ErrorLogging", el) el.log(" こ の文字列を ロ グに書き込みます ") COM コ ンポーネ ン ト か ら デー タ ベースへのア ク セス MTS ま たは COM+ の ト ラ ンザ ク シ ョ ン管理サポー ト を活用す る には、 MTS ま たは COM+ がサポー ト す る デー タ ベース イ ン タ フ ェース のい ず れ か を 使 用 し て デ ー タ ベ ー ス に 接 続 す る 必 要 が あ り ま す。 PowerBuilder で開発 し た コ ン ポーネ ン ト のデー タ ベー ス 接続の詳細に ついては、 『デー タ ベース と の接続』 マニ ュ アルを参照 し て く だ さ い。 PowerBuilder で開発 さ れた COM コ ン ポーネ ン ト は、デー タ ス ト ア を使 用 し て、 デー タ ベー ス と の対話処理を行 う こ と がで き ます。 デー タ ス ト ア は非表示のデー タ ウ ィ ン ド ウ コ ン ト ロ ールです。 つま り 、 デー タ ウ ィ ン ド ウ コ ン ト ロ ール と 同 じ よ う に動作 し ま すが ビ ジ ュ アル属性 を持ち ません。 デー タ ス ト ア オブジ ェ ク ト を分散アプ リ ケーシ ョ ン で 使用す る と 、 デー タ ベース処理を、 各 ク ラ イ ア ン ト コ ン ピ ュ ー タ 上で はな く リ モー ト サーバ上で行 う こ と がで き ます。 590 PowerBuilder 第 26 章 COM/MTS/COM+ コ ンポーネ ン ト の構築 ト ラ ン ザ ク シ ョ ン サーバ環境におけ る デー タ ベー ス ア ク セ ス に デー タ ス ト ア を使用す る 方法についての詳細は、 486 ページの 「デー タ ス ト アの使い方」 を参照 し て く だ さ い。 結果集合の受け渡し PowerBuilder は、 3 つのシ ス テ ム オブジ ェ ク ト に よ っ て、 ト ラ ン ザ ク シ ョ ン サーバ環境で動作 し て い る コ ン ポーネ ン ト か ら 結果集合 を 取 得 し た り 、 ト ラ ンザ ク シ ョ ン サーバ コ ン ポーネ ン ト と し て動作 し てい る PowerBuilder ユーザ オブジ ェ ク ト か ら 結果集合を返 し た り す る 操作 を行い ま す。 こ れ ら のシ ス テ ム オブジ ェ ク ト (ResultSet、 ResultSets、 お よ び ADOResultSet) は、 デー タ ス ト ア オブジ ェ ク ト と の間で ト ラ ン ザ ク シ ョ ン サーバの結果集合の変換 を 簡単にす る ために設計 さ れた も ので あ り 、 状態情報を含んでい ません。 ま た、 デー タ ベース の更新 用には設計 さ れてい ま せん。 ADOResultSet は、 COM コ ン ポーネ ン ト でのみ使用で き ます。 MTS と COM+ は、 ActiveX Data Objects (ADO) RecordSet オブジ ェ ク ト を使用 し て、 結果集合を返 し ます。 ADO Recordset オブジ ェ ク ト は、 レ コ ー ド (行) と フ ィ ール ド (カ ラ ム) か ら 構成 さ れ、 デー タ ベー ス テーブル内の レ コ ー ド の集合を表 し ます。 ADO Recordsets と PowerBuilder シス テ ム オブ ジ ェ ク ト PowerBuilder では、 PowerBuilder ADOResultSet シ ス テ ム オブジ ェ ク ト 上の関数を使用 し て、 デー タ を取得お よ び設定 し ます。 デー タ は ADO Recordset と し て 受 け 渡 し さ れ ま す。 PowerBuilder ク ラ イ ア ン ト は、 OLEObjects を使用 し て ADO Recordsets を処理 し ま す。 ResultSet オブ ジ ェ ク ト に格納 さ れた結果集合のデー タ ス ト アへの変換 と デー タ ス ト ア オブジ ェ ク ト か ら 結果集合への変換を行 う には、デー タ ス ト ア オブ ジ ェ ク ト の CreateFrom 関数 と GenerateResultSet 関数を使用 し ます。 GenerateResultSet について GenerateResultSet には、EAServer で MASP (Method as Stored Procedure) を使用す る と き 、 結果集合を戻すのに使用す る 別の構文 も あ り ます。 表 26-3 に、 こ れ ら のオブジ ェ ク ト の対話方法を示 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 591 COM コ ンポーネ ン ト か ら デー タ ベースへのア ク セス 表 26-3: 結果集合オブ ジ ェ ク ト 使用する変数の タ イプ 使用方法 ResultSet COM コ ン ポーネ ン ト に定義 さ れた メ ソ ッ ド (関数) の戻 り 値 と し て使用す る 。デー タ は ADO Recordset と し てマー シ ャ リ ング される OLEObject ResultSet を 返す COM コ ン ポーネ ン ト 上の メ ソ ッ ド か ら 返 さ れ た ADO Recordset を 保持す る 。 OLEObject は、 MoveFirst な ど の ADO Recordset 関数を使用 し て操作で き る ADOResultSet SetResultSet を 使用 し て、 ADOResultSet オ ブ ジ ェ ク ト に ResultSet オブジ ェ ク ト のデー タ 値を設定する SetRecordSet を使用 し て、 ADOResultSet オブジ ェ ク ト に、 ADO Recordset を保持す る OLEObject のデー タ 値を設定す る GetRecordSet を使用 し て、 OLEObject に ADOResultSet の デー タ 値を設定す る 。OLEObject は、MoveFirst な ど の ADO DataStore Recordset 関数を使用 し て操作で き る CreateFrom を使用 し て、 ResultSet 型ま たは ADOResultSet 型のオブジ ェ ク ト か ら デー タ ス ト ア を作成す る GenerateResultSet を使用 し て、 ト ラ ンザ ク シ ョ ン サーバ上 の メ ソ ッ ド でデー タ ス ト ア オブジ ェ ク ト か ら ResultSet オ ブジ ェ ク ト を生成す る 。 ResultSet オブジ ェ ク ト は、 ク ラ イ ア ン ト に返す こ と がで き る PowerBuilder ク ラ イ ア ン ト か ら MTS コ ン ポーネ ン ト 内の結果集 合にア ク セス PowerBuilder ク ラ イ ア ン ト が、 ADO Recordset を返す MTS コ ン ポーネ ン ト メ ソ ッ ド を呼び出す と 、 返 さ れたデー タ は OLEObject オブジ ェ ク ト に 格 納 さ れ ま す。 ADO Recordset 内 の デ ー タ を 操 作 す る に は、 Recordset 関数を使用 し ます。 こ れについては、 次の 「PowerBuilder に おけ る ADO Recordset の使い方」 で説明 し ます。 OLEObject オブジ ェ ク ト 内のデー タ を使用 し てデー タ ス ト ア オブジ ェ ク ト を設定す る には、 ADOResultSet オブジ ェ ク ト を作成 し てか ら 、 そ の SetRecordSet 関数を呼び出 し て、 OLEObject オブジ ェ ク ト に格納 さ れたデー タ 値を設定 し ます。 ADOResultSet オブ ジ ェ ク ト 内のデー タ をデー タ ス ト ア オブ ジ ェ ク ト に設定す る には、 CreateFrom デー タ ス ト ア関数を使用 し ます。 OLEObject loo_mycomponent OLEObject loo_ADOrecordset ADOresultset lrs_ADOresultset datastore ds_local integer li_rc loo_mycomponent = CREATE OLEObject 592 PowerBuilder 第 26 章 COM/MTS/COM+ コ ンポーネ ン ト の構築 li_rc = loo_mycomponent.ConnectToNewObject("PB.Test") if li_rc <> 0 then MessageBox(" 接続失敗 ", string(li_rc) ) Return end if // OLEObject を使用 し て、 MTS コ ンポーネ ン ト 上の // メ ソ ッ ド から返 さ れた ADO Recordset を保持する loo_ADOrecordset = loo_mycomponent.GetTestResult() // ADOResultSet を作成 し 、 渡 さ れた ADO Recordset を // 保持 し ている OLEObject から そのデー タ を取得する lrs_ADOresultset = CREATE ADOResultSet lrs_ADOresultset.SetRecordSet(loo_ADOrecordset) // CreateFrom を使用 し て、 ADOResultSet オブ ジ ェ ク ト // のデー タ をデー タ ス ト アに設定する ds_local = CREATE datastore ds_local.createfrom(lrs_ADOresultset) PowerBuilder におけ る ADO Recordset の 使い方 MoveFirst や MoveNext な ど の ADO Recordset メ ソ ッ ド を 使 用 し て、 PowerBuilder で ADO Recordset を操作す る 場合は、 SetResultSet 関数 と GetRecordSet 関数を使用 し ます。 SetResultSet 関数を使用 し て、 新規の ADOResultSet オブ ジ ェ ク ト に ResultSet オブジ ェ ク ト のデー タ 値を設 定 し 、 GetRecordSet 関数を使用 し て ADO Recordset を返 し ます。 次の例では、 既存の デー タ ス ト ア オブジ ェ ク ト か ら 、 ResultSet オブ ジ ェ ク ト に結果集合を生成 し てい ます。 ResultSet オブジ ェ ク ト を使用 し て、 新 し い ADOResultSet オ ブ ジ ェ ク ト に デ ー タ を 設 定 し ま す。 ADOResultSet オ ブ ジ ェ ク ト 上の GetRecordSet 関数 を 使用 し て、 ADO Recordset を OLEObject と し て返 し 、 こ の OLEObject を ADO Recordset メ ソ ッ ド で使用 し ます。 ResultSet lrs_resultset ADOresultset lrs_ADOresultset OLEObject loo_ADOrecordset // 既存のデー タ ス ト アから結果集合を生成する ds_source.GenerateResultSet(lrs_resultset) // 新 し い ADOResultSet オブ ジ ェ ク ト を作成 し 、 生成 さ れた // 結果集合を そのオブ ジ ェ ク ト に設定する lrs_ADOresultset = CREATE ADOResultSet lrs_ADOResultset.SetResultSet(lrs_resultset) // ADOResultSet オブ ジ ェ ク ト 内のデー タ を ア プ リ ケーシ ョ ン テ ク ニ ッ ク 593 ト ラ ンザ ク シ ョ ンのサポー ト // OLEObject に渡 し 、ADO Recordset と し て使用で き る よ う にする loo_ADOrecordset = CREATE OLEObject lrs_ADOResultset.GetRecordSet(loo_ADOrecordset) // OLEObject 上のネ イ テ ィ ブ な ADO Recordset メ ソ ッ ド // を呼び出す loo_ADOrecordset.MoveFirst() MTS お よび COM+ コ ンポーネ ン ト か ら結果 集合を返す MTS ま たは COM+ に配布 さ れ る PowerBuilder ユーザ オブジ ェ ク ト と の間で結果集合を受け渡 し す る には、 関数の引数ま たは戻 り 値のデー タ 型に ResultSet を 指定 し ま す。 GenerateResultSet 関数 を 呼び出 し て、 MTS ま たは COM+ 内のデー タ ス ト ア オブジ ェ ク ト か ら 結果集合を作 成す る と 、結果集合はマーシ ャ リ ン グ さ れて、ADO Recordset と し て ク ラ イ ア ン ト に返 さ れます。 次の例では、 デー タ ス ト ア オブジ ェ ク ト を作成 し 、 その中にあ る デー タ を取 り 出 し 、 続いて GenerateResultSet 関数を使用 し て、 ク ラ イ ア ン ト に返す結果集合を作成 し てい ます。 datastore ds_datastoreresultset lrs_resultset integer li_rc ds_datastore = create datastore ds_datastore.dataobject = "d_empdata" ds_datastore.SetTransObject (SQLCA) IF ds_datastore.Retrieve() = -1 THEN // エ ラ ーを返 し て復帰 END IF li_rc = ds_datastore.generateresultset(lrs_resultset) IF li_rc <> 1 THEN // エ ラ ーを返 し て復帰 END IF return lrs_resultset ト ラ ンザ ク シ ョ ンのサポー ト コ ン ポーネ ン ト が ト ラ ンザ ク シ ョ ン を サポー ト す る 場合、 MTS お よ び COM+ は、 コ ン ポーネ ン ト のデー タ ベース操作が ト ラ ンザ ク シ ョ ン の 一部 と し て実行 さ れ る よ う に し ます。 594 PowerBuilder 第 26 章 COM/MTS/COM+ コ ンポーネ ン ト の構築 ト ラ ンザク シ ョ ン サービ ス コ ン テキス ト オブ ジ ェ ク ト の使 用法 MTS お よ び COM+ で動作す る PowerBuilder コ ン ポーネ ン ト は、 ト ラ ンザ ク シ ョ ン コ ン テ キ ス ト サービ ス を使用 し て、 ト ラ ンザ ク シ ョ ン を 制御で き ます。 PowerBuilder COM オブジ ェ ク ト が作成す る コ ン テ キ ス ト オ ブ ジ ェ ク ト に よ っ て、 PowerBuilder コ ン ポーネ ン ト は Microsoft DTC を 利用す る こ と がで き ま す。 TransactionServer オブ ジ ェ ク ト に よ っ て、 MTS ま たは COM+ で動作す る COM オブ ジ ェ ク ト は、 オブ ジ ェ ク ト に関連付け ら れてい る コ ン テ キ ス ト に ア ク セ ス で き る ため、 ト ラ ン ザ ク シ ョ ン と ア ク テ ィ ブ化 を よ り 厳 し く 管理で き ま す。 ま た、 セキ ュ リ テ ィ コ ン テ キ ス ト に関 し て も 部分的に制御が可能です。 TransactionServer オ ブ ジ ェ ク ト と そ の メ ソ ッ ド の につい て の詳細は、 『オブジ ェ ク ト と コ ン ト ロ ール』 マニ ュ アルお よ び 『PowerScript リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 ト ラ ンザ ク シ ョ ン コ ン テ キ ス ト サービ ス を使用す る には、 その前に、 TransactionServer 型の変数を宣言 し 、 GetContextService 関数を呼び出 し てサービ ス の イ ン ス タ ン ス を作成す る 必要があ り ます。 TransactionServer txninfo_base this.GetContextService("TransactionServer", & txninfo_base) コ ン ポーネ ン ト の ト ラ ン ザ ク シ ョ ン コ ン テ キ ス ト に関す る 情報に ア ク セ ス し て ト ラ ンザ ク シ ョ ン を制御す る には、 た と えば、 次の よ う に、 TransactionServer オブ ジ ェ ク ト の イ ン ス タ ン ス 上の メ ソ ッ ド を呼び出 し ます。 IF txninfo_base.IsInTransaction() THEN txninfo_base.DisableCommit() END IF ... txninfo_base.SetComplete() サービ スへの参照が不要にな っ た ら 、 次の よ う に破棄 し て く だ さ い。 DESTROY txninfo_base COMMIT と ROLLBACK の動作 PowerBuilder コ ン ポーネ ン ト が MTS ま た は COM+ で動作 し てお り 、 UseContextObject DBParm パ ラ メ ー タ に Yes が設定 さ れてい る 場合に は、TransactionServer イ ン タ フ ェース を使用 し て ト ラ ンザ ク シ ョ ン を制 御 し ます。 UseContextObject の DBParm パ ラ メ ー タ に Yes が設定 さ れ てい る と 、 COMMIT 文 と ROLLBACK 文でデー タ ベース エ ラ ーが発生 し ま す。 こ の ト ラ ン ザ ク シ ョ ン は、 TransactionServer コ ン テ キ ス ト オブ ジ ェ ク ト の イ ン ス タ ン ス を介 し て SetComplete ま たは SetAbort が発行 さ れ る ま では、 ア ク テ ィ ブ状態を保ち ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 595 ト ラ ンザ ク シ ョ ンのサポー ト PowerBuilder 6 コ ンポーネ ン ト の移行 PowerBuilder 6 で作成し たコ ン ポーネン ト は、 MTS に対する SetComplete ま たは SetAbort 呼び出 し の発行を、 PowerBuilder のデー タ ベース ド ラ イ バで行っ てい ます。 こ れ ら の コ ン ポーネ ン ト を現行のバージ ョ ン の PowerBuilder に移行す る 場合には、 TransactionServer イ ン タ フ ェース を 使 用 す る よ う に、 コ ー ド を 修 正 し な け れ ば な り ま せ ん。 ま た は、 UseContextObject DBParm に No を設定す る 方法 も あ り ます。こ の場合、 COMMIT は MTS の SetComplete と 等 し く な り 、ROLLBACK は SetAbort と 等 し く な り ます。 こ の方法は、 PowerBuilder 6 のオブジ ェ ク ト を コ ー ド を修正せずに 移行す る 場合にだけお勧め し ます。 コ ンポーネ ン ト が ト ラ ンザ ク シ ョ ン をサポー ト するかど う かの指定 各 MTS ま たは COM+ コ ン ポーネ ン ト には、 コ ン ポーネ ン ト の ト ラ ン ザ ク シ ョ ン への参加方法 を 指示す る ト ラ ン ザ ク シ ョ ン プ ロ パテ ィ が あ り ます。MTS ま たは COM+ におけ る コ ン ポーネ ン ト ト ラ ンザ ク シ ョ ン プ ロ パテ ィ に [新規が必要] を設定す る と 、 PowerBuilder COM オブ ジ ェ ク ト は、 新 規 の コ ン テ キ ス ト オ ブ ジ ェ ク ト を 作 成 し ま す。 PowerBuilder COM オブジ ェ ク ト の コ ン ポーネ ン ト ト ラ ン ザ ク シ ョ ン プ ロ パテ ィ に、 [必要] ま たは [サポー ト ] を設定す る と 、 既存のオブ ジ ェ ク ト か ら ト ラ ンザ ク シ ョ ン を継承す る か、 ま たは新規 ト ラ ンザ ク シ ョ ン を作成 し ます。 こ のプ ロ パテ ィ は、 COM/MTS/COM+ プ ロ ジ ェ ク ト ウ ィ ザー ド ま たは プ ロ ジ ェ ク ト ペ イ ン タ で設定 し ます。 設定可能な値は、 表 26-4 の と お り です。 596 PowerBuilder 第 26 章 COM/MTS/COM+ コ ンポーネ ン ト の構築 表 26-4: コ ンポーネ ン ト ト ラ ンザク シ ョ ン プ ロパテ ィ の値 ト ラ ンザ ク シ ョ ンの 種類 [サポー ト な し ] [サポー ト ] [必要] [新規が必要] 説明 コ ン ポーネ ン ト は ト ラ ン ザ ク シ ョ ン の一部 と し て実 行 さ れない。 コ ン ポーネ ン ト が、 ト ラ ン ザ ク シ ョ ン 内部で実行中の別の コ ン ポー ネ ン ト に よ っ て ア ク テ ィ ブに さ れた場合には、 その新 し い イ ン ス タ ン ス の作業は既存の ト ラ ンザ ク シ ョ ンの外部で行われ る コ ン ポーネ ン ト は MTS ト ラ ン ザ ク シ ョ ン の コ ン テ キ ス ト 内で実行で き る が、 コ ン ポーネ ン ト の メ ソ ッ ド を実行す る ために接続は必要ない。 コ ン ポーネ ン ト が ク ラ イ ア ン ト に よ っ て直接 イ ン ス タ ン ス化 さ れ た場合には、MTS は ト ラ ンザ ク シ ョ ン を開始 し ない。 コ ン ポーネ ン ト A が コ ン ポーネ ン ト B に よ っ て イ ン ス タ ン ス 化 さ れ、 コ ン ポーネ ン ト B は ト ラ ン ザ ク シ ョ ン内部で実行 さ れてい る 場合には、 コ ン ポーネ ン ト A は同 じ ト ラ ンザ ク シ ョ ン内で実行 さ れ る コ ン ポーネ ン ト は常に ト ラ ン ザ ク シ ョ ン内で実行 さ れ る 。 コ ン ポーネ ン ト が ク ラ イ ア ン ト に よ っ て直接 イ ン ス タ ン ス化 さ れた場合には、 新 し い ト ラ ン ザ ク シ ョ ンが始ま る 。 コ ン ポーネ ン ト A が コ ン ポーネ ン ト B に よ っ て ア ク テ ィ ブに さ れ、 し か も B は ト ラ ン ザ ク シ ョ ン内で実行 さ れてい る 場合には、 A は同 じ ト ラ ン ザ ク シ ョ ン内で実行 さ れ る 。 B が ト ラ ン ザ ク シ ョ ン内で実行 さ れていない場合には、 A は新 し い ト ラ ンザ ク シ ョ ン内で実行 さ れ る コ ン ポーネ ン ト が イ ン ス タ ン ス 化 さ れ る たびに、 新 し い ト ラ ンザ ク シ ョ ン が始 ま る 。 コ ン ポーネ ン ト A が コ ン ポーネ ン ト B に よ っ て ア ク テ ィ ブに さ れ、 B が ト ラ ンザ ク シ ョ ン内で実行 さ れてい る 場合には、A が開始す る 新 し い ト ラ ン ザ ク シ ョ ンは、 B の ト ラ ン ザ ク シ ョ ン の結果に影響 さ れない。 B が ト ラ ン ザ ク シ ョ ン内で実行 さ れていない場合には、 A は新 し い ト ラ ンザ ク シ ョ ン内で実行 さ れ る ト ラ ンザ ク シ ョ ンの仕組みについての詳細は、 MSDN Library http://www.microsoft.com/japan/msdn/default.asp にあ る Microsoft MTS ま た は COM+ のマニ ュ アルを参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 597 MTS でのオブ ジ ェ ク ト 有効期間 コ ン ト ロールのサポー ト MTS でのオブ ジ ェ ク ト 有効期間 コ ン ト ロールのサポー ト MTS は、 EAServer やそのほかのオブジ ェ ク ト フ レーム ワ ー ク と 同様、 Activate メ ソ ッ ド と Deactivate メ ソ ッ ド に よ っ て、 コ ン ポーネ ン ト に有 効期間動作を通知 し ます。 MTS は イ ン ス タ ン ス プー リ ン グ を サポー ト し ていないため、 MTS で 動作 し てい る PowerBuilder COM コ ン ポーネ ン ト 上の メ ソ ッ ド を新規 ク ラ イ ア ン ト が 呼び出す と 、 Constructor イ ベ ン ト が 発生 し て か ら 、 Activate イ ベン ト が発生 し ます。ク ラ イ ア ン ト ま たは コ ン ポーネ ン ト 自 身が SetComplete ま たは SetAbort を呼び出 し た場合には、 コ ン ポーネ ン ト の Deactivate イ ベン ト が発生 し 、続いて Destructor イ ベン ト が発生 し ます。 コ ン テ キ ス ト 固有の初期設定 コ ー ド と ク リ ーン ア ッ プ コ ー ド は、 オブ ジ ェ ク ト の Activate イ ベン ト と Deactivate イ ベン ト に書 く こ と がで き ます。 COM/MTS/COM+ コ ン ポーネ ン ト の タ ーゲ ッ ト ウ ィ ザー ド ま たはオブ ジ ェ ク ト ウ ィ ザー ド を使用 し て カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト を作成 し た場合には、Activate イ ベン ト と Deactivate イ ベン ト が自動的 に定義 さ れ ます。 ウ ィ ザー ド を使用 し なか っ た場合、 ま たは既存のカ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト を修正す る 場合には、 自分で イ ベ ン ト を追加 し ます。 カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト に イ ベン ト を追加す る には、 メ ニ ュ ーバーか ら [挿入| イ ベン ト ] を選択 し 、 プ ロ ト タ イ プ ウ ィ ン ド ウ で イ ベン ト を 定義 し ま す。 Activate イ ベ ン ト と Deactivate イ ベ ン ト は、次に示す よ う に、適切な イ ベン ト ID にマ ッ プす る 必要があ り ます。 イ ベン ト 名 Activate Deactivate イ ベン ト ID PBM_COMPONENT_ACTIVATE PBM_COMPONENT_DEACTIVATE 別のサーバ コ ンポーネ ン ト の メ ソ ッ ド の呼び出 し MTS お よ び COM+ では、あ る サーバ コ ン ポーネ ン ト の メ ソ ッ ド が、別 のサーバ コ ン ポーネ ン ト の メ ソ ッ ド を呼び出す こ と がで き ます。 こ の 別のサーバ コ ン ポーネ ン ト は、 PowerBuilder コ ン ポーネ ン ト であ る 必 要はな く 、MTS お よ び COM+ に よ っ てサポー ト さ れてい る 任意の言語 で実装で き ます。 598 PowerBuilder 第 26 章 COM/MTS/COM+ コ ンポーネ ン ト の構築 OLEObject オブ ジ ェ ク ト の使い方 別の コ ン ポーネ ン ト の メ ソ ッ ド にア ク セ ス す る には、 ク ラ イ ア ン ト か ら コ ン ポーネ ン ト を呼び出す場合 と 同様に、 OLEObject 型の変数を宣 言 し 、 ConnectToNewObject 関数を呼び出 し て、 コ ン ポーネ ン ト に接続 し ま す。 ConnectToNewObject は、 サーバ オブジ ェ ク ト の ト ラ ン ザ ク シ ョ ン コ ン テ キ ス ト を自動的に継承 し ます。 TransactionServer オ ブ ジ ェ ク ト の使い方 現行のサーバ内の別の コ ン ポーネ ン ト の メ ソ ッ ド にア ク セ スする には、 PowerBuilder が提供す る、 TransactionServer と い う ト ラ ン ザ ク シ ョ ン サービ ス コ ン テキ ス ト オブジ ェ ク ト を使用で き ます。 TransactionServer イ ン タ フ ェ ー ス が提供す る CreateInstance と い う メ ソ ッ ド を 使用すれ ば、 ロ ーカルで使用す る ほかの コ ン ポーネ ン ト に ア ク セ ス で き ま す。 CreateInstance は、 呼び出 し 元の コ ン ポーネ ン ト に適用 さ れ る の と 同 じ ユーザ情報 と パ ス ワ ー ド 情報を使用 し ます。 セキ ュ リ テ ィ 問題 MTS ま たは COM+ に配布す る コ ン ポーネ ン ト を 開発す る と き には、 ロ ールを定義 し て、 特定の ト ラ ン ザ ク シ ョ ン の実行を許可 さ れ る ユー ザ ま たはユーザのグループ を決定す る こ と がで き ます。 コ ン ポーネ ン ト を配布す る と き には、MTS Explorer ま たは COM+ Component Services ツールで特定のユーザに ロ ールを割 り 当て ます。 プロジ ェ ク ト ペイ ン タ またはウ ィ ザー ド で の権限の設定 ウ ィ ザー ド を使用 し て COM/MTS/COM+ プ ロ ジ ェ ク ト を作成 し た場合 には、 コ ン ポーネ ン ト を呼び出す ク ラ イ ア ン ト のセ キ ュ リ テ ィ 資格を チ ェ ッ ク す る よ う 、 MTS ま たは COM+ に指示す る こ と がで き ます。 プ ロ ジ ェ ク ト ペ イ ン タ では、 [MTS コ ン ポーネ ン ト ] と [MTS パ ッ ケー ジ] のプ ロ パテ ィ ページ、 ま たは [COM+ コ ン ポーネ ン ト ] と [COM+ パ ッ ケージ] のプ ロ パテ ィ ページで、 コ ン ポーネ ン ト と パ ッ ケージの 2 つの レベルでのチ ェ ッ ク を指定す る こ と がで き ます。 セ キ ュ リ テ ィ を 有効にす る には、 Microsoft Management Console 内で COM アプ リ ケーシ ョ ンに ロ ールを追加 し 、ユーザを その ロ ールに割 り 当て、 その ロ ールを コ ン ポーネ ン ト に与え ます。 プ ログ ラ ムによ る セ キュ リ テ ィ PowerBuilder が ト ラ ンザ ク シ ョ ン サービ ス オブジ ェ ク ト で提供 し てい る 関数を コ ン ポーネ ン ト 内で使用すれば、 呼び出 し 側に特定の メ ソ ッ ド を呼び出す権限があ る か ど う か、 プ ロ グ ラ ム で判定す る こ と がで き ます。 IsSecurityEnabled は、 コ ン ポーネ ン ト のセキ ュ リ テ ィ が有効であ る か ど う か を判定 し ます。 IsCallerInRole は、 コ ン ポーネ ン ト の メ ソ ッ ド を呼び出す ク ラ イ ア ン ト プ ロ セ ス ま たはサーバ プ ロ セ ス が、呼び出 し 権限を持つ ロ ールに含まれ る ど う か を判定 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 599 プ ロ ジ ェ ク ト ペ イ ン タ での COM/MTS/COM+ コ ンポーネ ン ト の構築 IsCallerInRole は、 現行の メ ソ ッ ド の直接の呼び出し 側の ロ ールを調べま す。 ク ラ イ ア ン ト が コ ン ポーネ ン ト 上の メ ソ ッ ド を呼び出 し 、 その メ ソ ッ ド がデータ ベースにア ク セ スする場合には、 データ ベースへのア ク セ ス権は、 ク ラ イ ア ン ト ではな く 、 コ ンポーネン ト のセキ ュ リ テ ィ コ ン テキ ス ト に よ っ て決定さ れます。PowerBuilder がト ラ ン ザク ショ ン サー ビ ス オブジ ェ ク ト に提供する 追加関数によ っ て、 コ ン ポーネン ト は、 ク ラ イ ア ン ト に権限のな い操作を 実行する 前に、 ク ラ イ ア ン ト のセ キ ュ リ ティ コ ン テキ ス ト を 判断する こ と ができ ま す。 ImpersonateClient は、 ク ラ イ ア ン ト の セ キ ュ リ テ ィ コ ン テ キ ス ト を 判 断 し ま す。 IsImpersonating は、 コ ン ポーネ ン ト がその ク ラ イ ア ン ト のセキ ュ リ テ ィ コ ン テ キ ス ト 内 で 動 作 し て い る か ど う か を 判 断 し ま す。 ま た、 RevertToSelf は、 コ ン ポーネ ン ト のセキ ュ リ テ ィ コ ン テ キ ス ト を復元 し ます。 偽装 プ ロ ジ ェ ク ト ペ イ ン タ での COM/MTS/COM+ コ ンポーネ ン ト の構築 PowerBuilder COM サーバは、 プ ロ ジ ェ ク ト ペ イ ン タ で構築 し ます。 ユーザ オブ ジ ェ ク ト の作成時にプ ロ ジ ェ ク ト を 作成 し な か っ た場合 には、 COM/MTS/COM+ プ ロ ジ ェ ク ト ウ ィ ザー ド を使用 し て作成で き ます。 [プ ロ ジ ェ ク ト ] タ ブの [COM/MTS/COM+ コ ン ポーネ ン ト ] ア イ コ ン を選択すれば、 プ ロ ジ ェ ク ト ペ イ ン タ で COM コ ン ポーネ ン ト を直接作成す る プ ロ ジ ェ ク ト を設定で き ます。 COM サーバに組み込みたい 1 つま たは複数のオブジ ェ ク ト に対 し て、 COM/MTS/COM+ プ ロ ジ ェ ク ト をすでに作成 し てい る 場合には、 プ ロ ジ ェ ク ト ペ イ ン タ で修正 し 、 必要に応 じ て オブ ジ ェ ク ト を 追加 し ま す。 プ ロ ジ ェ ク ト ペ イ ン タ の ワ ー ク ス ペー ス は読み取 り 専用の領域で あ り 、 ウ ィ ザー ド で選択 し たオプシ ョ ン、 ま たはペ イ ン タ のオブジ ェ ク ト の選択 ダ イ ア ロ グ ボ ッ ク ス お よ びプ ロ パテ ィ ダ イ ア ロ グ ボ ッ ク ス で選択 し たオプシ ョ ンが表示 さ れます。 PowerBuilder COM サーバを構 築す る 際、 こ の ワ ー ク スペー ス には、 構築プ ロ セ ス の各 ス テ ッ プの ス テー タ ス と オブジ ェ ク ト 検査レ ポー ト も 表示 さ れます。 ❖ PowerBuilder COM サーバ プ ロ ジ ェ ク ト を定義および構築するには 1 600 新規作成 ダ イ ア ロ グ ボ ッ ク ス の [プ ロ ジ ェ ク ト ] タ ブか ら [COM/MTS/COM+ コ ン ポーネ ン ト ウ ィ ザー ド ] を選択 し ます。 PowerBuilder 第 26 章 COM/MTS/COM+ コ ンポーネ ン ト の構築 2 プ ロ ジ ェ ク ト の名前 と 位置を含む、 プ ロ ジ ェ ク ト プ ロ パテ ィ を指 定 し ます。 3 サーバに組み込みたい 1 つま たは複数のオブジ ェ ク ト を選択 し ま す。 4 各オブジ ェ ク ト のプ ロ パテ ィ を指定し 、必要な ら MTS ま たは COM+ の配布オプシ ョ ン も 指定 し て、 [完了] を ク リ ッ ク し ます。 プ ロ パテ ィ を指定す る 際には、 ウ ィ ザー ド の状況依存ヘルプ ま た は以下の項目を参考に し て く だ さ い。 プ ロパテ ィ イ ン タ フ ェース オプ ション 構築オプシ ョ ン コ ン ポーネ ン ト の登録 MTS/COM+ の配布オプ シ ョ ン と パ ッ ケージ オ プシ ョ ン MTS/COM+ ト ラ ンザ ク シ ョ ンの設定 MTS/COM+ セキ ュ リ ティ 5 参照箇所 604 ペー ジ の 「カ ス タ ム イ ン タ フ ェ ー ス と デュ アル イ ン タ フ ェ ース の選択」 と 586 ペー ジの 「 イ ン ス タ ン ス変数」 604 ページの 「埋め込み PBD の設定」 602 ページの 「 コ ン ポーネ ン ト の自動登録」 603 ページの「MTS に コ ン ポーネ ン ト を配布」 と 603 ページの 「COM+ に コ ン ポーネ ン ト を 配布」 596 ページの 「 コ ン ポーネ ン ト が ト ラ ン ザ ク シ ョ ン をサポー ト す る か ど う かの指定」 599 ページの 「セキ ュ リ テ ィ 問題」 [フ ァ イ ル|開 く ] を選択 し 、 作成 し たばか り のプ ロ ジ ェ ク ト を選 択 し て、 プ ロ ジ ェ ク ト ペ イ ン タ を開 き ます。 正 し い オ ブ ジ ェ ク ト が選択 さ れ て い る こ と を 確認す る には、 メ ニ ュ ーバーか ら [編集|オブジ ェ ク ト の選択] を選択 し ます。 6 [編集|プ ロ パテ ィ ] を選択 し て ウ ィ ザー ド で設定 し たプ ロ パテ ィ を確認 し 、 必要な ら 修正 し ます。 一部の高度な MTS お よ び COM+ パ ッ ケージ プ ロ パテ ィ は、 プ ロ ジ ェ ク ト ペ イ ン タ でのみ設定で き ます。 7 ア プ リ ケーシ ョ ン テ ク ニ ッ ク プ ロ ジ ェ ク ト ペ イ ン タ で [配布] ボ タ ン を ク リ ッ ク し て、 PowerBuilder COM サーバを構築 し ます。 601 プ ロ ジ ェ ク ト ペ イ ン タ での COM/MTS/COM+ コ ンポーネ ン ト の構築 こ の 構 築 プ ロ セ ス で は、 選 択 し た 各 ユ ー ザ オ ブ ジ ェ ク ト の PowerBuilder COM オブジ ェ ク ト を含む PowerBuilder COM サーバ (DLL) と IDL フ ァ イ ルが作成 さ れ ます。 MTS お よ び COM+ への 配布を指定 し 、MTS お よ び COM+ が コ ン ポーネ ン ト を生成す る コ ン ピ ュ ー タ 上に イ ン ス ト ール さ れ動作 し てい る 場合、 コ ン ポーネ ン ト はサーバに直接配布 さ れ ま す。 こ の と き 、 追加の配布フ ァ イ ルが作成 さ れ る こ と も あ り ます。 PowerBuilder COM サーバに含 ま れ る 埋め込み型 PBD フ ァ イ ルに は、 カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト と 、 それ ら のオブジ ェ ク ト が参照す る 補助オブジ ェ ク ト に加え て、 埋め込みの タ イ プ ラ イ ブ ラ リ も 含まれてい ます。 オブ ジ ェ ク ト 呼び出 し 後のプ ロ ジ ェ ク ト の構築 開発環境で COM オブ ジ ェ ク ト を 呼び出す と 、 COM オブ ジ ェ ク ト は PowerBuilder と 同 じ プ ロ セ ス で管理 さ れ る ので PowerBuilder が終了す る ま で メ モ リ に残 り ます。 オブジ ェ ク ト を呼び出 し てか ら 変更 し 、 プ ロ ジ ェ ク ト ペ イ ン タ で再生成 し よ う と す る と 、 コ ンパ イ ル エ ラ ー と リ ン ク エ ラ ーが発生 し ます。プ ロ ジ ェ ク ト を構築す る 前に、PowerBuilder を シ ャ ッ ト ダ ウ ン し て再起動 し 、 メ モ リ か ら オブジ ェ ク ト を解放 し て く だ さ い。 コ ン ポーネン ト の自動登録 プ ロ ジ ェ ク ト ウ ィ ザー ド ま たはプ ロ ジ ェ ク ト ペ イ ン タ では、構築に成 功 し た と き に、生成 さ れたすべての PowerBuilder COM オブジ ェ ク ト を 自動登録す る よ う に指定で き ます。 こ れに よ っ て、 使用 コ ン ピ ュ ー タ での コ ン ポーネ ン ト のテ ス ト が簡単にな り ます。 使用 コ ン ピ ュ ー タ 上 で不必要な レ ジ ス ト リ エン ト リ が作成 さ れ る のを避け る ため、 こ のオ プシ ョ ン を選択す る のは、 PowerBuilder COM サーバのテ ス ト 準備が完 了 し てか ら に し て く だ さ い。 602 PowerBuilder 第 26 章 COM/MTS/COM+ コ ンポーネ ン ト の構築 MTS にコ ン ポーネン ト を 配布 MTS 管理オブ ジ ェ ク ト が コ ン ピ ュ ー タ に イ ン ス ト ール さ れて い る 場 合には、 構築に成功 し た と き に、 コ ン ポーネ ン ト を MTS に自動配布で き ます。 ま た、 パ ッ ケージ を PAK フ ァ イ ルにエ ク ス ポー ト し 、 それを 使っ てパ ッ ケージ を別の コ ン ピ ュ ー タ の MTS サーバに イ ン ポー ト で き ます。 ま た、 ク ラ イ ア ン ト 環境設定ユーテ ィ リ テ ィ フ ァ イ ルを作成 す る こ と も で き ます。 ク ラ イ ア ン ト 環境設定 ユーテ ィ リ テ ィ につい て ク ラ イ ア ン ト 環境設定ユーテ ィ リ テ ィ は、 パ ッ ケージで コ ン ポーネ ン ト を使用す る ために必要なすべての情報 (レ ジ ス ト リ 情報や コ ン ポー ネ ン ト の タ イ プ ラ イ ブ ラ リ を含む) を ク ラ イ ア ン ト コ ン ピ ュ ー タ に追 加す る た めの実行 フ ァ イ ルです。 ク ラ イ ア ン ト 環境設定ユーテ ィ リ テ ィ フ ァ イ ルは、PAK フ ァ イ ル と 同 じ 名前に拡張子 EXE を付けて、 ク ラ イ ア ン ト を呼び出 し たサブデ ィ レ ク ト リ に作成 さ れます。 ク ラ イアン ト のタ イ プ ラ イ ブ ラ リ の作成 ク ラ イ ア ン ト アプ リ ケーシ ョ ン用に別個の タ イ プ ラ イ ブ ラ リ フ ァ イ ルの作成を選択で き ます。 こ の選択を行わない と 、 ク ラ イ ア ン ト 環境 設定ユーテ ィ リ テ ィ は、COM サーバの DLL を組み込む こ と に よ っ て、 タ イ プ ラ イ ブ ラ リ 情報を取得 し ます。別個の タ イ プ ラ イ ブ ラ リ を提供 し な い 場 合 に は、 COM サ ー バ に よ っ て 使 用 さ れ る バ ー ジ ョ ン の PowerBuilder 仮想 マ シ ン (PBVM90J.DLL) を ク ラ イ ア ン ト に イ ン ス ト ールす る 必要があ り ます。 MTS へ の 配 布 に つ い て の 詳 細 は、 607 ペ ー ジ の 「MTS に 対 す る PowerBuilder COM オブジ ェ ク ト の配布」 を参照 し て く だ さ い。 COM+ にコ ン ポーネン ト を 配布 正常に構築 さ れた コ ン ポーネ ン ト は、COM+ に自動的に配布で き ます。 アプ リ ケーシ ョ ン を Microsoft Windows Installer (MSI) フ ァ イ ルにエ ク ス ポー ト し 、 こ れを使っ て別の コ ン ピ ュ ー タ 上の COM+ サーバにパ ッ ケージ を イ ン ポー ト で き ます。 次にアプ リ ケーシ ョ ン プ ロ キ シ を MSI フ ァ イ ル と し てエ ク ス ポー ト し 、 それを ク ラ イ ア ン ト コ ン ピ ュ ー タ 上 に イ ン ス ト ールす る と 、 リ モー ト の COM+ サーバにア ク セ ス で き る よ う にな り ます。 COM+ コ ン ポーネ ン ト の配布についての詳細は、 MSDN Library http://www.microsoft.com/japan/msdn/default.asp に あ る Microsoft COM+ のマニ ュ アルを参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 603 プ ロ ジ ェ ク ト ペ イ ン タ での COM/MTS/COM+ コ ンポーネ ン ト の構築 カ ス タ ム イ ン タ フ ェ ース と デュ ア ル イ ン タ フ ェ ースの選択 PowerBuilder COM オブジ ェ ク ト を生成す る と き には、 ク ラ イ ア ン ト に カ ス タ ム イ ン タ フ ェ ー ス と デ ュ アル イ ン タ フ ェ ー ス の ど ち ら を エ ク ス ポーズす る のか を選択す る 必要があ り ます。 PowerBuilder COM オブ ジ ェ ク ト では、 現在、 ど ち ら の イ ン タ フ ェ ー ス タ イ プで も 、 標準の OLE オー ト メ ーシ ョ ン デー タ 型 し か使用で き ません。 カスタム イン タ フ ェ ース カ ス タ ム イ ン タ フ ェース は、サーバ オブジ ェ ク ト の仮想関数テーブル (VTBL) へのア ク セ ス を通 じ て、 デ ィ ス パ ッ チベース の イ ン タ フ ェ ー ス よ り 高いパフ ォ ーマ ン ス と 、 デ ュ アル イ ン タ フ ェ ース よ り すっ き り し た使用モデルを提供 し ます。 ク ラ イ ア ン ト を C++ な ど の コ ンパ イ ル 言語で記述す る 場合、 ま たは Visual Basic な ど の ツールで カ ス タ ム イ ン タ フ ェース のサポー ト を活用す る 場合には、 カ ス タ ム イ ン タ フ ェ ー ス の使用を考え て く だ さ い。 カ ス タ ム イ ン タ フ ェ ース を使用す る PowerBuilder COM オブジ ェ ク ト は、 COM に よ っ て提供 さ れ る 標準のマーシ ャ ル処理を使用 し ます。 デ ュ アル イ ン タ フ ェ ース デ ュ アル イ ン タ フ ェース を使用すれば、 プ ロ グ ラ マは、 仮想関数テー ブル と デ ィ ス パ ッ チ イ ン タ フ ェ ー ス の ど ち ら を使用 し て も 、 COM オ ブジ ェ ク ト 内の メ ソ ッ ド を呼び出す こ と がで き ます。 デ ュ アル イ ン タ フ ェ ー ス は、 広範囲の ク ラ イ ア ン ト を サポー ト し 、 メ ソ ッ ド への高速 ア ク セ ス を提供 し ます。 埋め込み PBD の設定 COM サーバに含ま れ る 埋め込み PowerBuilder 動的 ラ イ ブ ラ リ (PBD) フ ァ イ ルには、 選択 し た コ ン パ イ ル済みのすべて の カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト と その依存オブジ ェ ク ト が含まれてい ます。 追加 の未参照オブジ ェ ク ト を PBD に組み込むには、 [ ラ イ ブ ラ リ ] プ ロ パ テ ィ ページで、 そのオブジ ェ ク ト を含む ラ イ ブ ラ リ を選択 し ます。 選 択 し た ラ イ ブ ラ リ 内のすべてのオブジ ェ ク ト が PBD に含め ら れ ます。 ラ イ ブ ラ リ に関連付け ら れた PowerBuilder リ ソ ース (PBR) フ ァ イ ル の名前を指定で き ます。 PBR フ ァ イ ルは、 ビ ッ ト マ ッ プな ど の動的に 割 り 当て ら れた リ ソ ース の リ ス ト を含むテ キ ス ト フ ァ イ ルです。 詳細 については、 781 ページの 「 リ ソ ース について」 を参照 し て く だ さ い。 604 PowerBuilder 第 26 章 COM/MTS/COM+ コ ンポーネ ン ト の構築 PowerBuilder COM オブ ジ ェ ク ト の実行 PowerBuilder COM オ ブ ジ ェ ク ト の イ ン ス タ ン ス を 設 定 す る た め、 PowerBuilder 仮想マシ ン (PBVM90J.DLL) は、 COM サーバ DLL に埋 め込まれた PBD か ら カ ス タ ム ク ラ ス オブジ ェ ク ト を ロ ー ド し 、 適切 なセ ッ シ ョ ン情報 と イ ン ス タ ン ス情報を作成 し ます。 ク ラ イ ア ン ト が PowerBuilder COM オブジ ェ ク ト の メ ソ ッ ド を呼び出す と 、 その メ ソ ッ ド は PowerBuilder 仮想マ シ ン を コ ールバ ッ ク し 、 適切な PowerScript コ ー ド を実行 し ます。 PowerBuilder COM サーバは、 COM の single-threaded apartment (STA) モデルを 使用し て いま す。 実行時セッ シ ョ ン は、 同じ ス レ ッ ド 上に作 成さ れたオブジェ ク ト 間で共有でき ま す。ク ラ イ ア ン ト が PowerBuilder COM オブ ジ ェ ク ト の イ ン ス タ ン ス を要求す る と 、 PowerBuilder COM サーバは実行時セ ッ シ ョ ン を確立 し 、 その実行時セ ッ シ ョ ン中にカ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト の イ ン ス タ ン ス を作成 し ます。 サー バが同 じ ス レ ッ ド か ら COM オブジ ェ ク ト の イ ン ス タ ン ス に対す る 新 し い リ ク エ ス ト を 受け取 る と 、 既存の実行時セ ッ シ ョ ン を使用 し て、 オブジ ェ ク ト を イ ン ス タ ン ス化 し ます。 いずれの場合 も 、 個々の ク ラ イ ア ン ト は異な る PowerBuilder 仮想マシ ン セ ッ シ ョ ン を使用 し ます。 メ モ リ の割り 当て ク ラ イ ア ン ト が PowerBuilder COM サーバか ら PowerBuilder COM オブ ジ ェ ク ト の イ ン ス タ ン ス を初めて要求す る と 、 サーバは PowerBuilder 仮想マシ ン を ロ ー ド し 、 メ モ リ ブ ロ ッ ク を割 り 当て、 実行時セ ッ シ ョ ン を開始 し ます。 PowerBuilder 仮想マシ ン、 キ ャ ッ シ ュ メ モ リ 、 お よ び実行時セ ッ シ ョ ンに約 4 MB の メ モ リ が割 り 当て ら れ ます。 オブジ ェ ク ト が同 じ 実行時セ ッ シ ョ ン を共有で き る 場合には、 それ以 降の リ ク エ ス ト では追加の メ モ リ 割 り 当てが不要にな り ます。 それ以降の リ ク エ ス ト において、 リ ク エ ス ト が別の ク ラ イ ア ン ト ま た は ス レ ッ ド か ら 作成 さ れたな ど の理由で、 PowerBuilder COM オブジ ェ ク ト を別の COM アパー ト メ ン ト で作成す る 必要があ る 場合、オブジ ェ ク ト は新 し い実行時セ ッ シ ョ ン で イ ン ス タ ン ス 化 さ れ ます。 新 し い各 セ ッ シ ョ ン は、 PowerBuilder 仮想マ シ ン の イ ン ス タ ン ス と キ ャ ッ シ ュ メ モ リ を共有す る ため、 約 200 KB の メ モ リ を消費す る だけで済み ま す。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 605 PowerBuilder COM サーバの配布 PowerBuilder COM サーバの配布 PowerBuilder COM サーバを生成 し た ら 、 COM 対応の ク ラ イ ア ン ト ア プ リ ケーシ ョ ン を 使用 し て、 PowerBuilder COM オブ ジ ェ ク ト を 作成 し 、 それ ら の メ ソ ッ ド にア ク セ スす る こ と がで き ます。 COM 対応の任 意のアプ リ ケーシ ョ ン でサーバを使用 し た り 、 サーバをパ ッ ケージ と し て MTS ま たは COM+ に配布す る こ と がで き ます。 COM 対応のアプリ ケーショ ン によ る PowerBuilder COM サーバの使い方 ❖ COM 対応のア プ リ ケーシ ョ ン で PowerBuilder COM サーバを使用するには 1 PowerBuilder COM サーバを ユーザの コ ン ピ ュ ー タ に配布 し ます。 2 PowerBuilder 仮想マシ ン (PBVM90J.DLL) と そのほかの必要なモ ジ ュ ール (PBDWE90J.DLL や必要なデー タ ベース ソ フ ト ウ ェ ア な ど) を、 PowerBuilder COM サーバを イ ン ス ト ール し た コ ン ピ ュ ー タ に配布 し ます。 3 PowerBuilder COM サーバを ユーザの コ ン ピ ュ ー タ に登録 し ます。 4 PowerBuilder COM サーバ内の PB オブジ ェ ク ト 関数を呼び出す ク ラ イ ア ン ト アプ リ ケーシ ョ ン を記述 し ます。 611 ページの 「 ク ラ イ ア ン ト か ら PowerBuilder COM サーバへのア ク セ ス」 を参照 し て く だ さ い PowerBuilder COM サーバを配布す る と き には、 レ ジ ス ト リ に情報を追加 し て、 COM がサーバ オブジ ェ ク ト の イ ン ス タ ン ス を作成で き る よ う にす る 必要があ り ます。COM サー バは自己登録型なので、 登録フ ァ イ ルを別に作成す る 必要はあ り ませ ん。 PowerBuilder COM サーバを登録す る には、 次の よ う に REGSVR32 ユーテ ィ リ テ ィ を使用 し ます。 PowerBuilder COM サーバの登録 regsvr32.exe path_to_server¥mycomserver.dll リ モー ト ク ラ イ ア ン ト か ら サーバにア ク セ スす る 場合には、 レ ジ ス ト リ を さ ら に変更す る 必要があ り 、 サーバへの リ モー ト ア ク セ ス用に ク ラ イ ア ン ト の設定が必要にな る 場合 も あ り ます。 詳細については、 615 ページの 「DCOM での PowerBuilder COM サーバ と オブジ ェ ク ト の使 い方」 を参照 し て く だ さ い。 606 PowerBuilder 第 26 章 COM/MTS/COM+ コ ンポーネ ン ト の構築 テ ス ト 用の自動登録 テ ス ト 目的の場合には、[全般] プ ロ パテ ィ ページにあ る チ ェ ッ ク ボ ッ ク ス を オ ン に し ます。 こ れに よ り 、 サーバが生成 さ れ る と そのサーバ は開発 コ ン ピ ュ ー タ に自動登録 さ れ ます。 使用 コ ン ピ ュ ー タ 上で不必 要な レ ジ ス ト リ エ ン ト リ が作成 さ れ る の を避け る ため、 こ のオプシ ョ ン を選択す る のは、 PowerBuilder COM サーバのテ ス ト 準備が完了 し て か ら に し て く だ さ い。 MTS に対する PowerBuilder COM オブ ジ ェ ク ト の配布 PowerBuilder COM オブジ ェ ク ト は、 MTS に直接配布 し た り 、 MTS コ ン ポーネ ン ト と し て MTS に イ ン ポー ト し た り で き ます。 サーバの要件 MTS がイ ン ス ト ール さ れている場合 PowerBuilder COM サーバを配布す る サーバには、 以下の ソ フ ト ウ ェ ア と フ ァ イ ルが必要です。 • MTS 2.0 以降 • NT 4.0 Service Pack 3 以降 • ODBC ド ラ イ バ (ODBC 3.0 以降) に よ る デー タ ベース接続を使用 す る PowerBuilder COM オブジ ェ ク ト • ( イ ン ス ト ール さ れ、 ユーザのパ ス にあ る ) PowerBuilder 配布 DLL • ( ロ ーカルの フ ァ イ ル シ ス テ ムにあ る ) PowerBuilder COM サーバ DLL PowerBuilder COM サーバ を 構築 し た コ ン ピ ュ ー タ に MTS が イ ン ス ト ール さ れ、 動作 し てい る 場合には、 プ ロ ジ ェ ク ト ペ イ ン タ で MTS に直接配布で き ます。 PAK フ ァ イ ルを作成 し て、 パ ッ ケージ を別の コ ン ピ ュ ー タ 上の MTS サーバに イ ン ポー ト し た り 、ク ラ イ ア ン ト 環境設 定ユーテ ィ リ テ ィ を作成 し て、 レ ジ ス ト リ 情報や コ ン ポーネ ン ト の タ イ プ ラ イ ブ ラ リ な ど、 パ ッ ケージ内の コ ン ポーネ ン ト を使用す る ため に必要なすべて の情報 を ク ラ イ ア ン ト コ ン ピ ュ ー タ に追加 し た り す る こ と も で き ます。 こ れ ら のオプシ ョ ンは、 プ ロ ジ ェ ク ト ペ イ ン タ の MTS パ ッ ケージ プ ロ パテ ィ シー ト に用意 さ れてい ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 607 PowerBuilder COM サーバの配布 レ ジ ス ト リ 情報について パ ッ ケージ を別の コ ン ピ ュ ー タ の MTS サーバに イ ン ポー ト す る 場合 は、 パ ッ ケージ と ク ラ イ ア ン ト 環境設定ユーテ ィ リ テ ィ のパ ス情報が 正 し い こ と を確認 し て く だ さ い。 PBVM90J.DLL な ど のサポー ト フ ァ イ ルは、 別の位置に イ ン ス ト ール さ れてい る こ と も あ り ます。 別の コ ン ピ ュ ー タ で動作 し てい る MTS サーバに PowerBuilder COM オ ブジ ェ ク ト を配布す る には、 以下の手順に従い ます。 MTS がイ ン ス ト ール さ れていない場合 1 MTS サーバ コ ン ピ ュ ー タ に フ ァ イ ルを配布す る 2 PowerBuilder COM オブジ ェ ク ト を MTS へ イ ン ポー ト す る 3 ク ラ イ ア ン ト 配布フ ァ イ ルを作成す る 4 ク ラ イ ア ン ト 配布フ ァ イ ルを イ ン ス ト ールす る MTS サーバ コ ン ピ ュ ー タ に フ ァ イルを配布する 生成 さ れた PowerBuilder COM サーバ DLL を、 PBVM90J.DLL お よ び そのほかの必要な PowerBuilder ラ ン タ イ ム DLL と 一緒に、 MTS サー バ コ ン ピ ュ ー タ の ロ ーカル フ ァ イ ル シ ス テ ム上のデ ィ レ ク ト リ に コ ピー し ます。 PowerBuilder COM オブ ジ ェ ク ト を MTS へイ ンポー ト する PowerBuilder COM オ ブ ジ ェ ク ト を MTS に イ ン ポ ー ト す る に は、 PowerBuilder COM ラ イ ブ ラ リ の配布先 と な る コ ン ピ ュ ー タ を選択 し 、 パ ッ ケージ を作成 し 、 オブジ ェ ク ト を イ ン ポー ト し 、 それ ら の ト ラ ン ザ ク シ ョ ン プ ロ パテ ィ を設定 し 、 それ ら の イ ン タ フ ェ ース と メ ソ ッ ド が正 し く 表示 さ れ る こ と を確認す る 必要があ り ます。 ❖ ❖ 608 MTS サーバ コ ン ピ ュ ー タ 名を選択する には 1 MTS サーバ コ ン ピ ュ ー タ か ら 、 MTS エ ク ス プ ロ ー ラ を開 き ます。 2 コ ン ピ ュ ー タ フ ォ ルダ を選択 し て展開 し ます。 3 適切な コ ン ピ ュ ー タ 名フ ォ ルダ を選択 し て展開 し ます。 新規パ ッ ケージ を作成するには 1 パ ッ ケージ を イ ン ス ト ールす る フ ォ ルダ を選択 し ます。 2 ポ ッ プア ッ プ メ ニ ュ ーか ら [新規作成] を選択 し ます。 PowerBuilder 第 26 章 COM/MTS/COM+ コ ンポーネ ン ト の構築 3 パ ッ ケージ ウ ィ ザー ド ダ イ ア ロ グ ボ ッ ク ス か ら 、 [空のパ ッ ケー ジ を作成す る ] を選択 し ます。 4 パ ッ ケージ名を入力 し ます。 5 パ ッ ケージ ID の設定 ダ イ ア ロ グボ ッ ク ス か ら 、 [対話ユーザ] を 選択す る か、 特定のユーザ名 と パ ス ワー ド を設定 し ます。 ビ ジ ュ アル コ ン テ ン ツ カ ス タ ム ク ラ ス ユーザ オブジ ェ ク ト 内の関数が メ ッ セージ ボ ッ ク ス な ど の ビ ジ ュ アル コ ン テ ン ツ を誤っ て表示 し た場合に、 コ ン ポーネ ン ト のユーザが [対話ユーザ] 以外に設定 さ れてい る と 、 その ビ ジ ュ ア ル コ ン テ ン ツはハン グ ア ッ プ し た よ う に見え ます。 ❖ PowerBuilder COM オブ ジ ェ ク ト を MTS コ ンポーネ ン ト と し て イ ンポー ト するには 1 新 し く 作成 し たパ ッ ケージ名フ ォ ルダ を選択 し て展開 し ます。 2 コ ン ポーネ ン ト フ ォ ルダ を選択 し 、 ポ ッ プア ッ プ メ ニ ュ ーか ら [新規作成| コ ン ポーネ ン ト ] を選択 し ます。 3 コ ン ポーネ ン ト ウ ィ ザー ド ダ イ ア ロ グボ ッ ク ス か ら 、 [新 し い コ ン ポーネ ン ト を イ ン ス ト ールす る ] ア イ コ ン を選択 し ます。 4 コ ン ポーネ ン ト の イ ン ス ト ール ダ イ ア ロ グ ボ ッ ク ス か ら 、[フ ァ イ ルの追加] を選択 し ます。 5 イ ン ス ト ールす る フ ァ イ ルの選択 ダ イ ア ロ グボ ッ ク ス か ら 、 COM サーバ DLL を探 し て [開 く ] を選択 し ます。 [ イ ン ス ト ー ル す る フ ァ イ ル] リ ス ト ボ ッ ク ス が 更 新 さ れ、 PowerBuilder COM サーバ DLL 名が表示 さ れ る だけで な く 、 コ ン ポーネ ン ト と typelib も 表示 さ れ る ため、 コ ン ポーネ ン ト と 埋め込 み タ イ プ ラ イ ブ ラ リ が見つか っ た こ と がわか り ます。[中にあ る コ ン ポ ー ネ ン ト ] リ ス ト ボ ッ ク ス には、 PB90.MyComponent.1 な ど、 サーバで検出 さ れた各 コ ン ポーネ ン ト が表示 さ れます。 6 ❖ [完了] を ク リ ッ ク し ます。 MTS コ ンポーネ ン ト ト ラ ンザク シ ョ ンのプ ロパテ ィ を設定するには 1 コ ン ポーネ ン ト フ ォ ルダの 1 つを選択 し ます。 2 ポ ッ プア ッ プ メ ニ ュ ーか ら [プ ロ パテ ィ ] を選択 し ます。 3 コ ン ポーネ ン ト プ ロ パテ ィ ダ イ ア ロ グボ ッ ク ス か ら 、 [ ト ラ ンザ ク シ ョ ン] タ ブ を選択 し 、 必要な属性を設定 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 609 PowerBuilder COM サーバの配布 ❖ イ ン タ フ ェ ース と メ ソ ッ ド を確認するには • コ ン ポーネ ン ト ご と に、 イ ン タ フ ェース フ ォ ルダ と メ ソ ッ ド フ ォ ルダ を選択お よ び展開 し て、 正 し い イ ン タ フ ェ ー ス 名 と メ ソ ッ ド を確認 し ます。 ク ラ イ ア ン ト 配布フ ァ イルを作成する ❖ MTS ク ラ イ ア ン ト 配布フ ァ イルを作成するには 1 エ ク ス ポー ト す る パ ッ ケージ フ ォ ルダ を選択 し ます。 2 ポ ッ プア ッ プ メ ニ ュ ーか ら [エ ク ス ポー ト ] を選択 し ます。 3 パ ッ ケージのエ ク ス ポー ト ダ イ ア ロ グボ ッ ク ス か ら 、 C:¥MTSPACKAGES な ど、 パ ッ ケージのエ ク ス ポー ト 先デ ィ レ ク ト リ を選択 し ます。 こ れに よ っ て、拡張子 PAK と EXE を持つ 2 つの フ ァ イ ルが作成 さ れ ます。 実行フ ァ イ ルは、 ク ラ イ ア ン ト 配布フ ァ イ ルです。 ク ラ イ ア ン ト 配布フ ァ イルを イ ン ス ト ールする ❖ MTS ク ラ イ ア ン ト 配布フ ァ イルを イ ン ス ト ールするには 1 ク ラ イ ア ン ト 配布フ ァ イ ルを ク ラ イ ア ン ト コ ン ピ ュ ー タ に コ ピー し ます。 2 ク ラ イ ア ン ト 配布フ ァ イ ルを実行 し ます。 こ の配布 フ ァ イ ルは、 すべての MTS コ ン ポーネ ン ト を、 指定 さ れた MTS サーバ コ ン ピ ュ ー タ 上で動作す る リ モー ト オブジ ェ ク ト と し て 登録 し ます。 こ れで、 ク ラ イ ア ン ト アプ リ ケーシ ョ ンは、 適切な コ ン ポーネ ン ト 名を使用す る こ と に よ っ て、 MTS コ ン ポーネ ン ト を作成お よ び実行す る こ と がで き ます。 サーバの位置について サーバを別の コ ン ピ ュ ー タ に移動 し た場合には、 ク ラ イ ア ン ト の レ ジ ス ト リ 情報を更新す る 必要があ り ます。 610 PowerBuilder 第 26 章 COM/MTS/COM+ コ ンポーネ ン ト の構築 ク ラ イ アン ト から PowerBuilder COM サーバへのアク セス COM 準拠の ツールで作成 し た ク ラ イ ア ン ト は、 PowerBuilder COM コ ン ポーネ ン ト 上の メ ソ ッ ド にア ク セ ス で き ます。 MTS の場合、 ク ラ イ ア ン ト は DCOM をサポー ト す る Windows オペレーテ ィ ン グ シ ス テ ム 上で動い て い な ければな り ま せん。 COM+ の場合、 ク ラ イ ア ン ト は Microsoft Windows Installer を必要 と し ます。 COM サーバが ク ラ イ ア ン ト マシ ン に登録 さ れてい る か、COM+ アプ リ ケーシ ョ ン プ ロ キ シ フ ァ イ ルの MTS ク ラ イ ア ン ト 配布フ ァ イ ルが イ ン ス ト ール さ れていな け ればな り ません。 リ モー ト ク ラ イ ア ン ト か ら PB COM サーバにア ク セ ス す る 方法につ いては、 615 ページの 「DCOM での PowerBuilder COM サーバ と オブ ジ ェ ク ト の使い方」 を参照 し て く だ さ い。 以下の例では、 Visual Basic ま た は C++ か ら PowerBuilder COM オ ブ ジ ェ ク ト に ア ク セ ス す る 方 法 を 示 し ま す。 こ れ ら の 例 で は、 ccuo_employee と い う ユーザ オブジ ェ ク ト か ら 生成 さ れ、PB90.employee と い う プ ロ グ ラ ム ID を持つ PowerBuilder COM オブジ ェ ク ト を使用 し ます。 PowerBuilder ク ラ イ ア ン ト の作成方法 と 、同 じ COM オブジ ェ ク ト の使 用例については、 第 27 章 「COM/MTS/COM+ ク ラ イ ア ン ト の構築」 を 参照 し て く だ さ い。 ク ラ イ ア ン ト と し て の Visual Basic Visual Basic では、 そのプ ロ グ ラ ム ID を使用 し て登録オブジ ェ ク ト に 接続で き ます (実行時バ イ ン ド )。 Visual Basic 5 以降では、 その ク ラ ス 名 も 使用で き ます (事前バ イ ン ド )。 ❖ Visual Basic で PowerBuilder COM オブ ジ ェ ク ト にア ク セスするには 1 次の ど ち ら か を実行 し ます。 • オブジ ェ ク ト を宣言 し 、 そのプ ロ グ ラ ム ID を使用 し て接続 し ます。 Dim EmpObj As Object Set EmpObj = CreateObject("PB90.employee") • ア プ リ ケーシ ョ ン テ ク ニ ッ ク PowerBuilder COM オブジ ェ ク ト に対 し て生成 さ れた タ イ プ ラ イ ブ ラ リ への参照を プ ロ ジ ェ ク ト に追加 し 、その ク ラ ス名を使 用 し てオブジ ェ ク ト の イ ン ス タ ン ス を宣言 し ます(Visual Basic 5 以降)。 611 ク ラ イ ア ン ト か ら PowerBuilder COM サーバへのア ク セス Dim EmpObj As New CoEmployee 2 接続が確立 さ れた こ と を確認 し ます。 Dim response If EmpObj Is Nothing Then response = MsgBox("Employee オブ ジ ェ ク ト の作成 ", vbOKOnly, " エ ラ ー ") End If 3 オブジ ェ ク ト の関数ま たはプ ロ パテ ィ にア ク セ ス し ます。 Dim units, time as Long Dim DoubleReturn as Double Dim StringReturn As String DoubleReturn = EmpObj.f_calcdayavg units, time StringReturn = EmpObj.f_teststring EmpObj.ll_hours = 37 4 オブジ ェ ク ト を破棄 し ます。 Set EmpObj = Nothing ク ラ イ ア ン ト と し ての C++ C++ では、 COM ラ イ ブ ラ リ 関数を使用 し て、 PowerBuilder COM オブ ジ ェ ク ト の イ ン ス タ ン ス を作成 し ます。 ク ラ イ ア ン ト を作成す る と き には、PowerBuilder COM オブジ ェ ク ト の C/C++ 定義 も 使用す る 必要が あ り ま す。 Microsoft IDL (MIDL) コ ン パ イ ラ は、 PowerBuilder COM ジ ェ ネ レー タ に よ っ て作成 さ れた IDL フ ァ イ ルか ら 、 こ れ ら の定義を 生成 し ます。 た と えば、 PowerBuilder COM オブジ ェ ク ト Employee に対 し て生成 さ れた IDL フ ァ イ ルを使用す る 場合は、 次の よ う にな り ます。 midl.exe employee.idl MIDL コ ンパ イ ラ は、IDL フ ァ イ ル内の全オブジ ェ ク ト の イ ン タ フ ェ ー ス の定義を含んでい る ヘ ッ ダ フ ァ イ ル (employee.h)、 お よ びオブジ ェ ク ト に関連付け ら れた CLSID と イ ン タ フ ェース ID (IID) を定義す る C フ ァ イ ル (employee_i.c) を生成 し ます。 612 PowerBuilder 第 26 章 COM/MTS/COM+ コ ンポーネ ン ト の構築 そのほかのフ ァ イル MIDL コ ンパ イ ラ はプ ロ キ シ / ス タ ブ コ ー ド も (employee_p.c と dlldata.c に) 生成 し ます。 ただ し 、 C++ ク ラ イ ア ン ト 実行フ ァ イ ルを作成 し た り 、 PowerBuilder COM オブジ ェ ク ト にア ク セ スす る のに、 プ ロ キ シ / ス タ ブ コ ー ド を使用す る 必要はあ り ません。 ク ラ イ ア ン ト の作成 PowerBuilder COM オ ブ ジ ェ ク ト 内の メ ソ ッ ド に ア ク セ ス で き る C++ ク ラ イ ア ン ト 実行フ ァ イ ルを作成す る には、 生成 さ れ た ヘ ッ ダ フ ァ イ ル を 組み込む C++ ソ ー ス フ ァ イ ル を 作成 し 、 MIDL コ ンパ イ ラ に よ っ て生成 さ れた C フ ァ イ ル と C++ ク ラ イ ア ン ト ソ ー ス フ ァ イ ルの両方 を コ ン パ イ ル し 、 それに よ っ て得 ら れ る オブ ジ ェ ク ト フ ァ イ ルを リ ン ク し て実行フ ァ イ ルを作成 し ます。 Employee の例では、 次の よ う にな り ます。 1 client.cpp と い う C++ ソ ース フ ァ イ ル (下記参照) を作成 し ます。 2 client.cpp を コ ンパ イ ル し ます。 3 employee_i.c を コ ンパ イ ル し ます。 4 client.obj と employee_i.obj を リ ン ク し て、 実行フ ァ イ ル (た と え ば、 employee_ecl.exe) を作成 し ます。 以下の コ ー ド は、 MIDL コ ンパ イ ラ に よ っ て生成 さ れた employee.h ヘ ッ ダ フ ァ イ ルの一部で、 C++ ク ラ イ ア ン ト に よ っ て使用 さ れ る 定義を表 し ます。 Employee.h ア プ リ ケーシ ョ ン テ ク ニ ッ ク 613 ク ラ イ ア ン ト か ら PowerBuilder COM サーバへのア ク セス typedef interface DIEmployee DIEmployee; EXTERN_C const IID IID_DIEmployee; interface DECLSPEC_UUID("A2F59F71-D5FB-11D1-92B900A0247712F1") DIEmployee :public IDispatch { public: virtual /* [id] */ HRESULT STDMETHODCALLTYPE f_calcdayavg( /* [in] */ long units, /* [in] */ long time, /* [retval][out] */ double __RPC_FAR *retval) = 0; virtual /* [id] */ HRESULT STDMETHODCALLTYPE f_teststring( /* [retval][out] */ BSTR __RPC_FAR *retval) = 0; }; EXTERN_C const CLSID CLSID_CoEmployee; Client.cpp 次のサン プル ク ラ イ ア ン ト フ ァ イ ルでは、MIDL に よ っ て 生成 さ れた、PowerBuilder COM オブジ ェ ク ト の C/C++ 定義を使用 し て い ます。 client.cpp に示 さ れてい る COM API 呼び出 し についての詳細 は、 Microsoft ソ フ ト ウ ェ ア開発キ ッ ト の資料を参照 し て く だ さ い。 #include <windows.h> // employee.h I( MIDL.EXE から ) #include "employee.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) { HRESULT hr; DIEmployee *pDIEmployee = 0; // COM を初期化する CoInitialize(0); hr = CoCreateInstance(CLSID_CoEmployee,NULL, CLSCTX_INPROC_SERVER, IID_DIEmployee, (void **)&pDIEmployee); if (FAILED(hr)) ErrorMessage("CoCreateInstance", hr); 614 PowerBuilder 第 26 章 COM/MTS/COM+ コ ンポーネ ン ト の構築 // メ ソ ッ ド の変数 long units, time; double dReturn; BSTR strReturn = NULL; // メ ソ ッ ド を呼び出す hr = pDIEmployee->f_calcdayavg(units, time,&dReturn); if (FAILED(hr)) ErrorMessage("f_calcdayavg",hr); hr = pDIEmployee->f_teststring(&strReturn); if (FAILED(hr)) ErrorMessage("f_teststring",hr); // イ ン タ フ ェ ース ptr を解放 pDIEmployee->Release(); CoFreeUnusedLibraries(); // 完了 CoUninitialize(); return 0; } DCOM で の PowerBuilder COM サーバと オブ ジ ェ ク ト の使い方 DCOM を使用すれば、 リ モー ト ク ラ イ ア ン ト か ら PowerBuilder COM オブ ジ ェ ク ト を ア ク テ ィ ブにす る こ と がで き ま す。 オブ ジ ェ ク ト は、 指定 さ れた ホ ス ト コ ン ピ ュ ー タ 上のサーバ プ ロ セ ス で ア ク テ ィ ブに す る 必要が あ り ま す。 ア ウ ト オブ プ ロ セ ス サーバ (EXE フ ァ イ ル) はサーバ プ ロ セ ス を作成 し ま すが、 イ ン プ ロ セ ス サーバ (DLL フ ァ イ ル) は代理プ ロ セ ス下で動作 さ せ る 必要があ り ます。 COM は、 PowerBuilder COM サーバ DLL のホ ス ト と し て使用で き る 汎 用の代理ホ ス ト (DLLHOST.EXE) を 提供 し て い ま す。 代理ホ ス ト を 使用す る よ う に、 PowerBuilder COM サーバにマー ク を付け る こ と は、 PowerBuilder COM オブジ ェ ク ト を リ モー ト ク ラ イ ア ン ト か ら ア ク セ ス を可能にす る ための最 も 重要な ス テ ッ プです。 DCOM 環境設定ユー テ ィ リ テ ィ (DCOMCNFG.EXE) を使用 し て、 位置、 セキ ュ リ テ ィ 、 お よ び識別情報の値を変更で き ますが、 多 く の場合にはデフ ォ ル ト の ま ま で十分です。 詳細については、 DCOMCNFG ユーテ ィ リ テ ィ のオ ン ラ イ ン ヘルプ を参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 615 ク ラ イ ア ン ト か ら PowerBuilder COM サーバへのア ク セス PowerBuilder COM サーバが代理ホ ス ト を使用で き る よ う にす る には、 2 つの方法があ り ます。 PowerBuilder COM サーバが代理ホス ト を 使用で き る よ う にする • レ ジ ス ト リ エデ ィ タ (REGEDIT32.EXE) を使用 し て、PowerBuilder COM サーバの レ ジ ス ト リ エ ン ト リ AppID を編集す る • Microsoft Visual C++ 5.0 以降に付属す る OLE/COM オブジ ェ ク ト ビ ュ ーア (OLEVIEW.EXE) を使用す る コ ン ピ ュ ー タ の レ ジ ス ト リ を手作業で編集す る と 、 コ ン ピ ュ ー タ の構 成 の 一部 ま た は 全部 が 動作不能 に な る こ と が あ る た め、 一般 に は OLEVIEW の使用をお勧め し ます。 ❖ レ ジ ス ト リ エデ ィ タ を使用 し て、 COM サーバが代理プ ロ セス を使用で き る よ う にするには 1 サーバの生成に使われたプ ロ ジ ェ ク ト を開 き 、 [全般] プ ロ パテ ィ ページか ら PowerBuilder COM サーバの AppID 値を コ ピー し ます。 2 REGEDIT.EXE を実行 し 、 My Computer¥HKEY_CLASSES_ROOT¥AppID の位置にあ る サーバ の AppID キーを探 し て選択 し ます。 3 メ ニ ュ ーバーか ら [編集|新規作成|文字列の値] を選択 し ます。 4 名前に DllSurrogate を入力 し 、 デー タ フ ィ ール ド は空の ま ま に し てお き ます。 デー タ フ ィ ール ド が空であ る 場合、COM はデフ ォ ル ト の代理ホ ス ト (DLLHOST.EXE) を使用 し ます。 AppID 値のキーは次の よ う に な り ます。 名前 (デフ ォ ル ト ) DllSurrogate ❖ 616 デー タ PowerBuilder 90 が生成 し たサーバ :servername.dll "" OLE/COM オブ ジ ェ ク ト ビ ュ ーア を使用 し て、 COM サーバが代理プ ロ セス を使用で き る よ う にするには 1 OLEVIEW.EXE を実行 し ます。 2 リ ス ト ビ ュ ーでオー ト メ ーシ ョ ン オブジ ェ ク ト を展開 し 、 PowerBuilder COM サーバのオブジ ェ ク ト を選択 し ます。 3 PowerBuilder COM サーバに関連付け ら れたオブジ ェ ク ト を選択 し ます。 4 [Implementation] タ ブ を選択 し ます。 PowerBuilder 第 26 章 COM/MTS/COM+ コ ンポーネ ン ト の構築 5 ク ラ イアン ト コ ン ピ ュ ー タ を設定 し て、 リ モー ト PowerBuilder COM オ ブジ ェ ク ト をア ク テ ィ ブにする [Inproc Server] タ ブ を選択 し 、 [Use Surrogate Process] チ ェ ッ ク ボ ッ ク ス を オ ン に し ます。 リ モー ト コ ン ポーネ ン ト を ア ク テ ィ ブにす る には、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン が、 オブジ ェ ク ト の ク ラ ス 識別子 (CLSID) を、 リ モー ト ホ ス ト に対す る ア ク テ ィ ブ化 リ ク エ ス ト に指定 し て渡す必要が あ り ます。 PowerBuilder 9 や C++ で作成 さ れた ク ラ イ ア ン ト な ど、 一部の ク ラ イ ア ン ト は、 リ モー ト オブジ ェ ク ト の イ ン ス タ ン ス を作成す る と き に、 メ ソ ッ ド 呼び出 し でオブジ ェ ク ト の CLSID を使用で き ます。 こ れ ら の ク ラ イ ア ン ト アプ リ ケーシ ョ ンは、 ク ラ イ ア ン ト 側の環境設定を必要 と し ません。 多 く の ク ラ イ ア ン ト は、 オブジ ェ ク ト の CLSID ではな く 、 オブジ ェ ク ト の名前 (ProgID) に よ っ てオブジ ェ ク ト を参照 し ま す。 こ の よ う な 場合、 リ モー ト ア ク テ ィ ブ化 リ ク エ ス ト を行 う ためには、 ク ラ イ ア ン ト コ ン ピ ュ ー タ の レ ジ ス ト リ に、 ProgID を CLSID にマ ッ プす る ため に必要な情報が含ま れていな ければな り ません。 必要な レ ジ ス ト リ 情 報を ク ラ イ ア ン ト コ ン ピ ュ ー タ に追加す る には、 次の ど ち ら かの方法 を使用 し ます。 • リ モー ト ア ク セ ス を必要 と する ク ラ イ ア ン ト コ ン ピ ュータ ご と に、 PowerBuilder COM サーバを登録 し ます。 こ の方法を使用す る には、 適切なバージ ョ ン の PBVMn0J.DLL が イ ン ス ト ール さ れていなければな り ません。 • PowerBuilder COM サ ー バ が 登 録 さ れ て い る ホ ス ト 上 で、 REGEDIT.EXE を使用 し て、 必要な レ ジ ス ト リ 情報を .REG フ ァ イ ルにエ ク ス ポー ト し 、 続いて リ モー ト ア ク セ ス を必要 と す る 各 ク ラ イ ア ン ト コ ン ピ ュ ー タ の レ ジ ス ト リ に、 こ れ ら の フ ァ イ ルを コ ピーお よ び イ ン ポー ト し ます。 PowerBuilder COM オブジ ェ ク ト ご と に、 以下の レ ジ ス ト リ キーを エ ク ス ポー ト し ます。 HKEY_CLASSES_ROOT¥PB90.objectname HKEY_CLASSES_ROOT¥PB90.objectname.version_number HKEY_CLASSES_ROOT¥CLSID¥{objects_clsid} PowerBuilder COM サーバには、 以下の レ ジ ス ト リ キーが必要な こ と も あ り ます。 HKEY_CLASSES_ROOT¥TypeLib¥{comserver_typelib_id} HKEY_CLASSES_ROOT¥AppID¥{comserver_application_id} ア プ リ ケーシ ョ ン テ ク ニ ッ ク 617 ク ラ イ ア ン ト か ら PowerBuilder COM サーバへのア ク セス PowerBuilder を使用 し て リ モー ト オブ ジ ェ ク ト に接続する PowerBuilder 6 以降の ク ラ イ ア ン ト は、 ConnectToNewRemoteObject 関 数 を 使用 し て リ モー ト オブ ジ ェ ク ト を ア ク テ ィ ブにす る こ と がで き ます。 こ の部分の コ ー ド は次の よ う にな り ます。 OLEObject remobj remobj = CREATE OLEObject remobj.ConnectToNewRemoteObject(OmyremotehostnameO, ”PB9.employee”) & PowerBuilder 7 以降の ク ラ イ ア ン ト の場合は、 リ モー ト オブジ ェ ク ト の CLSID 文字列を classname パ ラ メ ー タ に指定で き ます。 remobj.ConnectToNewRemoteObject(OmyremotehostnameO, ”Oclsid:0EA53FED-646A-11D2-BF8E-00C04F795006O) & classname パ ラ メ ー タ にオブジ ェ ク ト の CLSID を指定す る と 、 ク ラ イ ア ン ト 側での環境設定は不要にな り ます。 C++ を使用 し た リ モー ト オブ ジ ェ ク ト に接続 生成 さ れた PowerBuilder COM サーバの IDL フ ァ イ ルか ら 作成 さ れた ヘ ッ ダ フ ァ イ ルを使用す る C++ ク ラ イ ア ン ト は、ア ク テ ィ ブ化 リ ク エ ス ト で、 リ モー ト オブジ ェ ク ト の CLSID を使用で き ます。 COSERVERINFO MULTI_QI OLECHAR LPTSTR ServerInfo; mqi[1]; wszHostName[MAXFILE]; pszHost=NULL; memset(&ServerInfo,0,sizeof(ServerInfo)); pszHost =GetUserRequestedHostName(); mbstowcs(wszHostName,pszHost,MAXFILE); ServerInfo.pwszName = wszHostName; mqi[0].pIID = &IID_Iemployee; mqi[0].pItf = NULL; mqi[0].hr = S_OK; // 目的のサーバに employee オブ ジ ェ ク ト を作成する hr = CoCreateInstanceEx(CLSID_Employee,NULL, CLSCTX_REMOTE_SERVER, &ServerInfo,1,mqi); 618 PowerBuilder 第 2 7 章 COM/MTS/COM+ ク ラ イ ア ン ト の 構築 こ の章について こ の章では、 COM、 MTS、 ま たは COM+ サーバ コ ン ポーネ ン ト にア ク セ スす る PowerBuilder ク ラ イ ア ン ト の構築方法について説 明 し ます。 内容 項目 COM/MTS/COM+ ク ラ イ ア ン ト の構築について COM サーバへの接続 COM コ ン ポーネ ン ト と のや り 取 り ク ラ イ ア ン ト か ら の ト ラ ンザ ク シ ョ ン制御 ページ 619 620 621 622 COM/MTS/COM+ ク ラ イ ア ン ト の構築について PowerBuilder アプ リ ケーシ ョ ンは、 COM サーバの ク ラ イ ア ン ト と し て機能で き ます。 COM サーバは、 PowerBuilder ま たはそのほか の COM に準拠 し た アプ リ ケーシ ョ ン開発ツールを使用 し て作成 で き ます。 ま た、 リ モー ト コ ン ピ ュ ー タ 上で イ ン プ ロ セ ス サーバ と し て、 Microsoft Transaction Server (MTS) ま たは COM+ 環境で ロ ーカルに実行で き ます。 アプ リ ケーシ ョ ン ス タ ー ト ウ ィ ザー ド を使用すれば、COM、MTS、 お よ び COM+ ク ラ イ ア ン ト を簡単に構築で き ます。 ク ラ イアン ト コ ンピ ュー タ を設定 し て リ モー ト コ ンポーネ ン ト にア ク セス ア プ リ ケーシ ョ ン テ ク ニ ッ ク COM コ ン ポーネ ン ト が リ モー ト コ ン ピ ュ ー タ 上で動作 し てい る 場合、 ク ラ イ ア ン ト コ ン ピ ュ ー タ は、 その メ ソ ッ ド に透過的にア ク セ ス で き な ければな り ま せん。 そのためには、 ク ラ イ ア ン ト 側 にサーバに対応す る ロ ーカルのプ ロ キ シ DLL を用意 し 、 ク ラ イ ア ン ト コ ン ピ ュ ー タ の レ ジ ス ト リ に リ モー ト サーバ を識別す る エ ン ト リ を登録す る 必要があ り ます。ク ラ イ ア ン ト コ ン ピ ュ ー タ は、 Windows NT 4.x、 Windows 98、 Windows 2000、 ま たは Windows XP 上で動いていなければな り ません。 619 COM サーバへの接続 コ ン ポ ー ネ ン ト が MTS に イ ン ス ト ール さ れ て い る 場合に は、 MTS Explorer を使用 し て実行可能な環境設定ユーテ ィ リ テ ィ を作成 し 、 そ れを実行 し て COM コ ン ポーネ ン ト を使用で き る よ う に ク ラ イ ア ン ト を設定 し ます。 ク ラ イ ア ン ト 上で実行フ ァ イ ルを実行す る と 、 プ ロ キ シ DLL と タ イ プ ラ イ ブ ラ リ が ク ラ イ ア ン ト に コ ピー さ れ、 レ ジ ス ト リ エ ン ト リ が作成 さ れ ます。PowerBuilder COM サーバの環境設定ユー テ ィ リ テ ィ を作成お よ び実行す る 方法については、607 ページの 「MTS に対す る PowerBuilder COM オブ ジ ェ ク ト の配布」 を 参照 し て く だ さ い。 コ ン ポーネ ン ト が COM+ に イ ン ス ト ール さ れてい る 場合は、COM+ コ ン ポーネ ン ト サービ ス ツールを使用 し て 、 ク ラ イ ア ン ト コ ン ピ ュ ー タ 上 に ア プ リ ケ ー シ ョ ン プ ロ キ シ を イ ン ス ト ー ル す る Microsoft Windows イ ン ス ト ー ラ (MSI) フ ァ イ ルを作成 し ます。 サーバが MTS と COM+ の ど ち ら に も イ ン ス ト ール さ れていない場合 は、 ク ラ イ ア ン ト フ ァ イ ル と プ ロ キ シ フ ァ イ ル を ク ラ イ ア ン ト に コ ピー し 、 サーバを代理プ ロ セ ス で動作 さ せ る よ う に設定す る 必要があ り ます。詳細については、615 ページの 「DCOM での PowerBuilder COM サーバ と オブジ ェ ク ト の使い方」 を参照 し て く だ さ い。 レ ジ ス ト リ に書き込まれた リ モー ト サーバ名 COM サーバを別の コ ン ピ ュ ー タ に移動 し た場合には、 ク ラ イ ア ン ト 上 の レ ジ ス ト リ エ ン ト リ を更新す る 必要があ り ます。 COM サーバへの接続 COM サーバ内の コ ン ポーネ ン ト に関連付け ら れた メ ソ ッ ド にア ク セ ス す る ために、 PowerBuilder ク ラ イ ア ン ト は、 コ ン ポーネ ン ト のプ ロ グ ラ ム識別子 (ProgID) ま たは ク ラ ス識別子 (CLSID) を使用 し て、 コ ン ポーネ ン ト に接続 し ます。 プ ロ グ ラ ム ID ま たは CLSID、 お よ び登録 し た PowerBuilder COM オブ ジ ェ ク ト の メ ソ ッ ド を表示す る には、 PowerBuilder ブ ラ ウ ザの OLE タ ブや OLEVIEW な ど の ツールを使用 し ます。 COM サーバへの接続を確立す る には、以下の操作を実行す る ために必 要な PowerScript 文を実行す る 必要があ り ます。 1 620 OLEObject 型の変数を宣言 し 、Create 文を使用 し てその変数を イ ン ス タ ン ス化 し ます。 PowerBuilder 第 27 章 COM/MTS/COM+ ク ラ イ ア ン ト の構築 2 オブジ ェ ク ト の ProgID ま たは CLSID を使用 し て、オブジ ェ ク ト に 接続 し ます。 3 接続が確立 さ れた こ と を確認 し ます。 次の ス ク リ プ ト では、 OLEObject オブジ ェ ク ト EmpObj を イ ン ス タ ン ス 化 し 、 PowerBuilder COM オブジ ェ ク ト PBcom.Employee に接続 し て、 エ ラ ーをチ ェ ッ ク し てい ます。 例 OLEObject EmpObj Integer li_rc EmpObj = CREATE OLEObject li_rc = EmpObj.ConnectToNewObject("PBcom.employee") IF li_rc < 0 THEN DESTROY EmpObj MessageBox(" オブ ジ ェ ク ト への接続に失敗 ", & " エ ラ ー :" + String(li_rc)) Return END IF COM コ ンポーネ ン ト と のや り 取 り コ ンポーネ ン ト メ ソ ッ ド の呼び出 し COM コ ン ポーネ ン ト への接続が確立 さ れ る と 、 ク ラ イ ア ン ト アプ リ ケーシ ョ ンは コ ン ポーネ ン ト メ ソ ッ ド を使用で き る よ う にな り ます。 出力パラ メ ー タ には REF キーワー ド を使用する 出力パ ラ メ ー タ を持つ COM オブジ ェ ク ト 上の メ ソ ッ ド を呼び出す と き に は、 REF キ ー ワ ー ド を 使用 し な け れば な り ま せ ん。 た と え ば、 of_add( arg1, arg2, REF sum ) の よ う に指定 し ます。 前の例で作成 し た EmpObj オブジ ェ ク ト を使用 し て、 次の例では、 コ ン ポーネ ン ト 上の 2 つの メ ソ ッ ド を呼び出 し 、 続いてサーバ と の接 続を切断 し 、 イ ン ス タ ン ス を破棄 し てい ます。 例 Long units, time Double avg, ld_retn String ls_retn ld_retn = EmpObj.f_calcdayavg(units, time, REF avg) ls_retn = EmpObj.f_teststring() EmpObj.DisconnectObject() DESTROY EmpObj ア プ リ ケーシ ョ ン テ ク ニ ッ ク 621 ク ラ イ ア ン ト か ら の ト ラ ンザ ク シ ョ ン制御 結果集合の受け渡 し PowerBuilder は、 3 つのシ ス テ ム オブジ ェ ク ト を提供す る こ と に よ っ て、 ト ラ ンザ ク シ ョ ン サーバ環境で動作 し てい る コ ン ポーネ ン ト か ら 結果集合を取得 し た り 、 ト ラ ンザ ク シ ョ ン サーバ コ ン ポーネ ン ト と し て動作 し てい る PowerBuilder ユーザ オブジ ェ ク ト か ら 結果集合を返 し たり する 操作に対処し ま す。こ れら のシス テム オブジェ ク ト (ResultSet、 ResultSets、 お よ び ADOResultSet) は、 デー タ ス ト ア オブ ジ ェ ク ト と の間で ト ラ ン ザ ク シ ョ ン サーバの結果集合の変換 を 簡単にす る た め に設計 さ れた も のであ り 、 状態情報を含んでい ません。 詳細については、 591 ページの 「結果集合の受け渡 し 」 を参照 し て く だ さ い。 実行時エ ラ ー処理 OLE オー ト メ ーシ ョ ン オブジ ェ ク ト 、COM オブジ ェ ク ト 、ま たは MTS や COM+ コ ン ポーネ ン ト と し て実行 さ れてい る カ ス タ ム ク ラ ス ユー ザ オブジ ェ ク ト か ら の実行時エ ラ ー情報は、 オブジ ェ ク ト を保持す る コ ン テナに例外 と し て (オー ト メ ーシ ョ ン オブジ ェ ク ト の場合は、 例 外ま たは機能エ ラ ー と し て)レ ポー ト さ れ ます。PowerBuilder SignalError 関数への呼び出 し も 、 コ ン テナに レ ポー ト さ れ ま す。 PowerBuilder オ ブジ ェ ク ト に よ っ て生成 さ れた実行時エ ラ ーを処理す る には、 OLE ク ラ イ ア ン ト の ExternalException イ ベン ト を記述 し ます。 OLE オブジ ェ ク ト ま たは COM オブジ ェ ク ト におけ る 実行時エ ラ ー処 理についての詳細は、354 ページの 「エ ラ ー処理」 を参照 し て く だ さ い。 ク ラ イ ア ン ト か ら の ト ラ ンザク シ ョ ン制御 PowerBuilder ク ラ イ ア ン ト は、 OLEObject 型ではな く 、 OleTxnObject 型 の変数を使用 し て COM オブジ ェ ク ト に接続す る こ と に よ っ て、 MTS あ る いは COM+ サーバ上の ト ラ ン ザ ク シ ョ ン を 明示的に制御で き ま す。 MTS または COM+ のイ ン ス ト ールが必要 MTS ま たは COM+ が ク ラ イ ア ン ト コ ン ピ ュ ー タ に イ ン ス ト ール さ れ ていない と 、 OleTxnObject での ConnectToNewObject 呼び出 し は失敗 し ます。 622 PowerBuilder 第 27 章 COM/MTS/COM+ ク ラ イ ア ン ト の構築 OLEObject オ ブ ジ ェ ク ト か ら 派生 し た OleTxnObject オ ブ ジ ェ ク ト に は、 ク ラ イ ア ン ト が ト ラ ンザ ク シ ョ ン制御に参加す る ための 2 つの関 数 (SetComplete と SetAbort) が追加定義 さ れてい ま す。 ク ラ イ ア ン ト が SetComplete を 呼び出す と 、 その ト ラ ン ザ ク シ ョ ン は、 ト ラ ン ザ ク シ ョ ン の別の参加者が SetAbort を呼び出 し ていな ければ コ ミ ッ ト さ れ ますが、 そ う でない場合は失敗 し ま す。 ク ラ イ ア ン ト が SetAbort を呼 び出す と 、 ト ラ ンザ ク シ ョ ンは常に中断 し ます。 次の例では、ボ タ ン の Clicked イ ベン ト に よ っ て OleTxnObject 型の 変数を作成 し 、 サーバ上の PowerBuilder COM オブジ ェ ク ト に接続 し 、 オブジ ェ ク ト 上のい く つかの メ ソ ッ ド を呼び出 し てい ます。 すべての メ ソ ッ ド が復帰す る と 、 ク ラ イ ア ン ト は SetComplete を 呼び出 し て、 サーバ と の接続を切断 し ます。 例 integer li_rc OleTxnObject lotxn_obj lotxn_obj = CREATE OleTxnObject li_rc = lotxn_obj.ConnectToNewObject("pbcom.n_test") IF li_rc <> 0 THEN MessageBox(" 接続が失敗 し ま し た ", string(li_rc) ) HALT END IF lotxn_obj.f_dowork() lotxn_obj.f_domorework() lotxn_obj.SetComplete() lotxn_obj.DisconnectObject() サーバの PowerBuilder COM オブ ジ ェ ク ト に定義 さ れて い る f_dowork 関数は、 ト ラ ンザ ク シ ョ ン コ ン テ キ ス ト サービ ス の イ ン ス タ ン ス を作 成 し 、 そ の DisableCommit メ ソ ッ ド を 呼び出す こ と に よ っ て、 次の メ ソ ッ ド 呼び出 し ま での間に ト ラ ンザ ク シ ョ ン が早期に コ ミ ッ ト さ れ る の を防止 し ます。 そ し て何 ら かの作業を行っ た後、 その作業が正 し く 完 了 し な か っ た 場 合 に は SetAbort を、 正 し く 完 了 し た 場 合 に は、 SetComplete を呼び出 し ます。 TransactionServer txninfo_one integer li_rc li_rc = GetContextService( "TransactionServer", txninfo_one ) txninfo_one.DisableCommit() & // 処理を実行 し 、 リ タ ーン コ ー ド を返す IF li_rc <> 0 THEN ア プ リ ケーシ ョ ン テ ク ニ ッ ク 623 ク ラ イ ア ン ト か ら の ト ラ ンザ ク シ ョ ン制御 txninfo_one.SetAbort() return -1 ELSE txninfo_one.SetComplete() return 1 END IF ト ラ ンザ ク シ ョ ン内のすべての メ ソ ッ ド が SetComplete ま たは EnableCommit を呼び出す と 、 ク ラ イ ア ン ト 上の SetComplete 呼び出 し に よ っ て ト ラ ンザ ク シ ョ ン が コ ミ ッ ト さ れます。 624 PowerBuilder 第 2 8 章 EJB ク ラ イ ア ン ト の構築 こ の章について こ の章では、 J2EE 準拠の ア プ リ ケーシ ョ ン サーバ上で動作す る Enterprise JavaBeans コ ン ポーネ ン ト 用の PowerBuilder ク ラ イ ア ン ト の構築方法について説明 し ま す。 こ の章で説明す る オブジ ェ ク ト の関連情報については、『PowerBuilder エ ク ス テ ン シ ョ ン リ フ ァ レ ン ス』マニ ュ アルお よ びオ ン ラ イ ン ヘルプ を参照 し て く だ さ い。 内容 項目 EJB ク ラ イ ア ン ト の構築について ラ イ ブ ラ リ 探索パ スへの pbejbclient90J.pbd の追加 EJB プ ロ キ シ オブジ ェ ク ト の生成 Java VM の作成 サーバへの接続 コ ン ポーネ ン ト メ ソ ッ ド の呼び出 し 例外処理 ク ラ イ ア ン ト 管理の ト ラ ンザ ク シ ョ ン ク ラ イ ア ン ト のデバ ッ グ ページ 625 627 628 636 639 641 646 647 648 EJB ク ラ イ ア ン ト の構築について PowerBuilder アプ リ ケーシ ョ ンは、 J2EE 準拠のアプ リ ケーシ ョ ン サーバ上で実行す る EJB 1.1 ま たは 2.0 コ ン ポーネ ン ト に対す る ク ラ イ ア ン ト と し て動作す る こ と が可能です。 こ の機能は、 Sybase が提供す る PowerBuilder エ ク ス テン シ ョ ン フ ァ イ ルに依存し ます。 PowerBuilder エ ク ス テ ン シ ョ ン フ ァ イ ルは、 PowerBuilder Native Interface (PBNI) を使用 し て開発 さ れた も のです。 EJB ク ラ イ ア ン ト を 作 成 す る た め に PBNI に 関 す る 知 識 は 必 要 あ り ま せ ん。 PowerBuilder エ ク ス テ ン シ ョ ン につい ての詳細は、 『PowerBuilder エ ク ス テ ン シ ョ ン リ フ ァ レ ン ス』 マ ニ ュ アルに記載 さ れていて、 ま た、 PBNI についての詳細は、 『PowerBuilder ネ イ テ ィ ブ イ ン タ フ ェース プ ロ グ ラ マーズ ガ イ ド と リ フ ァ レ ン ス』 マニ ュ アルに記 載 さ れてい ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 625 EJB ク ラ イ ア ン ト の構築について EAServer 用 EJB ク ラ イ ア ン ト EAServer 用の EJB ク ラ イ ア ン ト を開発す る 場合、 こ の章で説明す る テ ク ニ ッ ク を使用す る こ と がで き ます。 ま た、PowerBuilder 接続オブジ ェ ク ト と EAServer プ ロ キ シ オブジ ェ ク ト を使用す る ク ラ イ ア ン ト を作 成す る こ と も で き ます。 EJB ク ラ イ ア ン ト エ ク ス テ ン シ ョ ン は Java 対応の ラ ッ パーで あ る た め、 よ り 柔軟に EJB と 通信で き ます。 た と えば、 EJB ク ラ イ ア ン ト は、 EJB プ ロ キ シ を介 し て EJB メ ソ ッ ド 呼び出 し か ら 返 さ れた Java ク ラ ス を操作で き ます。 EJB ク ラ イ ア ン ト が存在す る コ ン ピ ュ ー タ 上に JRE を イ ン ス ト ールす る 必要がないので、 PowerBuilder 接続オブジ ェ ク ト は よ り 小 さ く な り 、 配備 し やす く な り ま す。 ま た、 PowerBuilder 接続オブジ ェ ク ト を使用 す る と 、 JRE ロ ー ド に よ る 遅滞が生 じ ないために、 サーバへの接続 も 速 く な り ます。 PowerBuilder 接続オブジ ェ ク ト を使用 し た EAServer 上で動作す る EJB コ ン ポーネ ン ト 用の EJB ク ラ イ ア ン ト 構築についての詳細は、第 24 章 「EAServer ク ラ イ ア ン ト の構築」 を参照 し て く だ さ い。 pbejbclient90J.dll と pbejbclient90J.pbd サーバに接続 し て EJB コ ン ポーネ ン ト と 通信す る ためには、 ク ラ イ ア ン ト は DLL フ ァ イ ル pbejbclient90J.dll に実装 さ れてい る ク ラ ス の セ ッ ト を使用 し ます。 こ の DLL を使用す る には、DLL を アプ リ ケーシ ョ ン のパ ス に置 き 、 さ ら に、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン の ラ イ ブ ラ リ 探索パ ス に pbejbclient90J.pbd フ ァ イ ル を 追加す る 必要 が あ り ま す。 PBD は DLL の ラ ッ パー と し て機能 し 、 こ れに よ り 、 PowerBuilder ク ラ イ ア ン ト は DLL 内の ク ラ ス を PowerBuilder カ ス タ ム ク ラ ス ユーザ オ ブジ ェ ク ト の よ う に使用で き ます。 EJB プ ロキシ オブ ジ ェ ク ト について PowerBuilder ク ラ イ ア ン ト は、 リ モー ト EJB コ ン ポーネ ン ト の メ ソ ッ ド 呼び出 し を EJB コ ン ポーネ ン ト の ロ ーカル プ ロ キ シ オブジ ェ ク ト に任せ ま す。 各 EJB コ ン ポーネ ン ト は最小限、 ク ラ イ ア ン ト ア プ リ ケーシ ョ ン内で、ホーム イ ン タ フ ェ ース用プ ロ キ シ と リ モー ト イ ン タ フ ェ ー ス用プ ロ キ シに よ っ て表 さ れ ます。 た と えば、 Cart と い う EJB コ ン ポーネ ン ト には、 CartHome と Cart の 2 つのプ ロ キ シがあ り ます。 それぞれのプ ロ キ シ には、 こ れ ら の イ ン タ フ ェ ー ス のパブ リ ッ ク メ ソ ッ ド のシ グネチ ャ のみが含まれます。 さ ら に、ホーム イ ン タ フ ェ ース と リ モー ト イ ン タ フ ェ ース に よ っ て使 用 さ れ る 例外 と 補助 ク ラ ス に対 し て も 、 プ ロ キ シが生成 さ れ ます。 詳 細については、 628 ページの 「EJB プ ロ キ シ オブジ ェ ク ト の生成」 を 参照 し て く だ さ い。 626 PowerBuilder 第 28 章 EJB ク ラ イ ア ン ト の構築 プ ロ セスの概要 EJB ク ラ イ ア ン ト を構築す る には、 以下の手順をすべて実行す る 必要 があ り ます。 1 ワー ク スペース と PowerScript タ ーゲ ッ ト を作成 し ます。 2 pbejbclient90J.pbd を、タ ーゲ ッ ト の ラ イ ブ ラ リ 探索パ ス に追加 し ま す。 3 プ ロ キシ オブジ ェ ク ト の構築のためのプ ロ ジ ェ ク ト を作成し ます。 4 プ ロ キ シ オブジ ェ ク ト を生成す る ためにプ ロ ジ ェ ク ト を作成 し ま す。 5 ク ラ イ ア ン ト ア プリ ケ ーショ ン のユーザ イ ン タ フ ェ ース を 実装す る ために必要な ウ ィ ン ド ウ を作成 し ます。 6 Java VM を イ ン ス タ ン ス化 し ます。 7 サーバへの接続を確立 し 、 EJB を検索 し ます。 8 EJB コ ン ポーネ ン ト の イ ン ス タ ン ス を作成 し 、 ク ラ イ ア ン ト か ら コ ン ポーネ ン ト メ ソ ッ ド を呼び出 し ます。 9 ク ラ イ ア ン ト のテ ス ト と デバ ッ グ を行い ます。 ラ イ ブ ラ リ 探索パスへの pbejbclient90J.pbd の追加 PowerBuilder を イ ン ス ト ールす る と 、 pbejbclient90J.dll と pbejbclient90J.pbd フ ァ イ ルは、 Shared¥PowerBuilder デ ィ レ ク ト リ に配 置 さ れます。 EJB ク ラ イ ア ン ト アプ リ ケーシ ョ ン を構築す る 場合、 pbejbclient90J.dll を別の場所に コ ピーす る 必要はあ り ませんが、 アプ リ ケーシ ョ ンの探索パ ス内のデ ィ レ ク ト リ に、 ク ラ イ ア ン ト 実行フ ァ イ ル と と も に こ の フ ァ イ ルを配布す る 必要があ り ます。 pbejbclient90J.pbd フ ァ イ ルは、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン の ラ イ ブ ラ リ リ ス ト に含め る 必要があ り ます。テ ン プ レー ト アプ リ ケーシ ョ ン ウ ィ ザー ド を 使用 し て、 EJB ク ラ イ ア ン ト タ ーゲ ッ ト を 作成 し 、 ウ ィ ザー ド 内で PBD フ ァ イ ルを追加で き ます。アプ リ ケーシ ョ ン ウ ィ ザー ド を使用す る か、 既存の タ ーゲ ッ ト があ る 場合、 タ ーゲ ッ ト のプ ロ パテ ィ ダ イ ア ロ グボ ッ ク ス で、 ラ イ ブ ラ リ リ ス ト に PBD フ ァ イ ル を追加で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 627 EJB プ ロキシ オブ ジ ェ ク ト の生成 ❖ ❖ pbejbclient90J.pbd を新規 タ ーゲ ッ ト の探索パスに追加する には 1 新規作成 ダ イ ア ロ グ ボ ッ ク ス で、 [テ ン プ レー ト アプ リ ケーシ ョ ン] ア イ コ ン を選択 し 、 ウ ィ ザー ド の指示に従っ て [アプ リ ケー シ ョ ン ラ イ ブ ラ リ 探索パ ス の追加] ページ ま で進みます。 2 [参照] (...) ボ タ ン を ク リ ッ ク し 、 Shared¥PowerBuilder デ ィ レ ク ト リ に移動 し ます。 3 [フ ァ イ ルの種類] ド ロ ッ プダ ウ ン リ ス ト の [PB ダ イ ナ ミ ッ ク ラ イ ブ ラ リ ] を選択 し 、 pbejbclient90J.pbd を選び、 [開 く ] を ク リ ッ ク し ます。 4 ウ ィ ザー ド を終了 し ます。 pbejbclient90J.pbd を既存の タ ーゲ ッ ト の探索パスに追加する には 1 シ ス テム ツ リ ー内で ク ラ イ ア ン ト タ ーゲ ッ ト を右 ク リ ッ ク し 、ポ ッ プア ッ プ メ ニ ュ ーか ら [プ ロ パテ ィ ] を選択 し ます。 2 [ ラ イ ブ ラ リ リ ス ト ] ページで [参照 (...)] を選択 し 、 Shared¥PowerBuilder デ ィ レ ク ト リ に移動 し ます。 3 [フ ァ イ ルの種類] ド ロ ッ プダ ウ ン リ ス ト の [PB ダ イ ナ ミ ッ ク ラ イ ブ ラ リ ] を選択 し 、 pbejbclient90J.pbd を選び、 ダ イ ア ロ グ ボ ッ ク ス を閉 じ ます。 pbejbclient90J.pbd を追加す る と 、 シ ス テ ム ツ リ ーには以下のオブジ ェ ク ト が表示 さ れ ます。 オブ ジ ェ ク ト EJBConnection EJBTransaction JavaVM 説明 EJB サーバに接続 し EJB を特定す る ために使用す る javax.transaction.UserTransaction イ ン タ フ ェ ー ス に マ ッ プす る 。 EJB ク ラ イ ア ン ト か ら ト ラ ンザ ク シ ョ ン を制御す る ために使用す る Java VM の イ ン ス タ ン ス を 作成す る た めに使用す る EJB プ ロキシ オブ ジ ェ ク ト の生成 EJB プ ロ キ シ オブジ ェ ク ト を生成す る には、 EJB ク ラ イ ア ン ト プ ロ キ シ プ ロ ジ ェ ク ト を作成す る 必要があ り ます。EJB ク ラ イ ア ン ト プ ロ キ シ プ ロ ジ ェ ク ト の作成には、プ ロ ジ ェ ク ト ペ イ ン タ か ウ ィ ザー ド を使 用 し ます。 628 PowerBuilder 第 28 章 EJB ク ラ イ ア ン ト の構築 EJB プ ロ キシ プ ロ ジ ェ ク ト の使い方 EJB ク ラ イ ア ン ト プ ロ キ シ プ ロ ジ ェ ク ト を新規に作成す る には、新規 作成 ダ イ ア ロ グ ボ ッ ク ス の [プ ロ ジ ェ ク ト ] ページか ら 次のいずれか を選択 し ます。 • [EJB ク ラ イ ア ン ト プ ロ キ シ] ア イ コ ン • [EJB ク ラ イ ア ン ト プ ロ キ シ ウ ィ ザー ド ] ア イ コ ン [EJB ク ラ イ ア ン ト プ ロ キ シ] ア イ コ ン を選択す る と 、 EJB プ ロ キ シ用 のプ ロ ジ ェ ク ト ペ イ ン タ が開 き ます。 こ のプ ロ ジ ェ ク ト ペ イ ン タ を使 用す る と 、 プ ロ ジ ェ ク ト の作成、 オプシ ョ ン の指定、 お よ びプ ロ キ シ ラ イ ブ ラ リ の構築がで き ます。 [EJB ク ラ イ ア ン ト プ ロキシ] ア イ コ ン ❖ プ ロ ジ ェ ク ト ペ イ ン タ で EJB ク ラ イ ア ン ト プ ロキシ プ ロ ジ ェ ク ト を作成す るには 1 新規作成 ダ イ ア ロ グ ボ ッ ク ス の [プ ロ ジ ェ ク ト ] ページで、 [EJB ク ラ イ ア ン ト プ ロ キ シ] ア イ コ ン を ダブル ク リ ッ ク し ます。 2 EJB を指定す る には、 [編集|オブジ ェ ク ト の選択] を選択 し 、 テ キ ス ト ボ ッ ク ス に、 com.sybase.jaguar.sample.svu.SVULogin や portfolio.MarketMaker な ど、 コ ン ポーネ ン ト の リ モー ト イ ン タ フ ェース の完全修飾名を入力 し ます。 3 [ ク ラ ス パ ス] ボ ッ ク ス に、 EJB の ス タ ブ を含むデ ィ レ ク ト リ ま た は JAR フ ァ イ ルのパ ス を入力 し 、 [OK] を ク リ ッ ク し ます。 ス タ ブ フ ァ イ ルがデ ィ レ ク ト リ に格納 さ れ、 EJB の完全修飾名が packagename.beanname であ る 場合、packagename を含むデ ィ レ ク ト リ を入力 し ます。 4 プ ロ キ シ オブジ ェ ク ト を格納す る PBL を指定す る には、 [編集| プ ロ パテ ィ ] を選択 し 、 タ ーゲ ッ ト の ラ イ ブ ラ リ リ ス ト 内の ラ イ ブ ラ リ の格納場所を指定 し ます。 生成 さ れた各プ ロ キ シ名の先頭に追加す る 接頭辞を任意に指定で き ます。 接頭辞を追加す る と 、 指定 し た EJB に関連付け ら れたプ ロ キ シの特定が容易にな り 、 ク ラ ス 名 と PowerBuilder 予約語の衝 突を避け る こ と がで き ま す。 ただ し 、 例外のプ ロ キ シ、 ス ト リ ー ム オ ブ ジ ェ ク ト の プ ロ キ シ、 お よ び EJBHome、 EJBObject、 EJBMetaData、 Handle、 HomeHandle のプ ロ キ シ な ど、 こ の EJB 固 有でないプ ロ キ シ名には、 接頭辞は追加 さ れません。 5 ア プ リ ケーシ ョ ン テ ク ニ ッ ク ダ イ ア ロ グ ボ ッ ク ス を閉 じ て、 [フ ァ イ ル|保存] を選択 し てプ ロ ジ ェ ク ト を保存 し ます。 629 EJB プ ロキシ オブ ジ ェ ク ト の生成 新規プ ロ ジ ェ ク ト は、 プ ロ キ シが生成 さ れ る EJB コ ン ポーネ ン ト を一 覧に し 、 生成 さ れたプ ロ キ シ オブジ ェ ク ト を格納す る 出力 ラ イ ブ ラ リ 名を指定 し ます。 [EJB ク ラ イ ア ン ト プ ロキシ ウ ィ ザー ド ] アイ コン EJB ク ラ イ ア ン ト プ ロ キ シ ウ ィ ザー ド を使用す る と 、 プ ロ ジ ェ ク ト を 容易に作成で き ます。 ❖ 630 ウ ィ ザー ド を使用 し て EJB ク ラ イ ア ン ト プ ロキシ プ ロ ジ ェ ク ト を作成する には 1 新規作成 ダ イ ア ロ グボ ッ ク ス の [プ ロ ジ ェ ク ト ] ページで [EJB ク ラ イ ア ン ト プ ロ キ シ ウ ィ ザー ド ] ア イ コ ン を ダ ブル ク リ ッ ク し 、 ウ ィ ザー ド の最初のページで [次へ] を ク リ ッ ク し ます。 2 プ ロ ジ ェ ク ト オブジ ェ ク ト を格納す る ラ イ ブ ラ リ を選択 し 、 [次 へ] を ク リ ッ ク し ます。 3 プ ロ ジ ェ ク ト 名を指定 し 、 必要に応 じ てプ ロ ジ ェ ク ト の説明を指 定 し て、 [次へ] を ク リ ッ ク し ます。 4 次に示す よ う に、 テ キ ス ト ボ ッ ク ス に、 cocoPortfolio.Portfolio な ど、 コ ン ポーネ ン ト の リ モー ト イ ン タ フ ェ ース の完全修飾名を 入力 し ます。 5 EJB ス タ ブ を格納 し た JAR フ ァ イ ル、 ま たは EJB ス タ ブ パ ッ ケー ジ を格納 し たデ ィ レ ク ト リ を参照 し て選択 し ます。 PowerBuilder 第 28 章 EJB ク ラ イ ア ン ト の構築 ス タ ブ フ ァ イ ルがデ ィ レ ク ト リ に格納 さ れ、 EJB の完全修飾名が packagename.beanname であ る 場合、packagename を含むデ ィ レ ク ト リ を入力 し ます。 6 生成 さ れ た各プ ロ キ シ名の先頭に追加す る 任意の接頭辞 を 指定 し 、 [次へ] を ク リ ッ ク し ます。 接頭辞を追加す る と 、 指定 し た EJB に関連付け ら れたプ ロ キ シの 特定が容易にな り 、 ク ラ ス 名 と PowerBuilder 予約語の衝突を避け る こ と がで き ま す。 ただ し 、 例外のプ ロ キ シ、 サポー ト し てい る ク ラ ス の プ ロ キ シ、 お よ び EJBHome、 EJBObject、 EJBMetaData、 Handle、 HomeHandle のプ ロ キ シな ど、 こ の EJB 固有でないプ ロ キ シ名には、 接頭辞は追加 さ れません。 7 既存の ラ イ ブ ラ リ を参照 し て選択 し 、 [次へ] を ク リ ッ ク し 、 [完 了] を ク リ ッ ク し ます。 プ ロ キ シ オブジ ェ ク ト が生成 さ れ、 こ の ラ イ ブ ラ リ に格納 さ れ ま す。 こ の ラ イ ブ ラ リ を タ ーゲ ッ ト の ラ イ ブ ラ リ リ ス ト に追加す る 必要があ り ます。 ウ ィ ザー ド を使用 し てプ ロ ジ ェ ク ト を作成 し た後、 プ ロ ジ ェ ク ト ペ イ ン タ を使っ てプ ロ ジ ェ ク ト の設定を変更で き ます。 プ ロキシの作成 EJB プ ロ キ シ プ ロ ジ ェ ク ト の作成に ウ ィ ザー ド ま たはペ イ ン タ のいず れを使用す る 場合 も 、 最後にプ ロ キ シ オブジ ェ ク ト を作成 し ます。 プ ロ キ シ オブジ ェ ク ト を作成す る には、 ペ イ ン タ バーで [配布] ア イ コ ン を ク リ ッ ク す る か、 メ ニ ュ ー バーか ら [デザ イ ン|プ ロ ジ ェ ク ト の 配布] を選択 し ます。 プ ロキシの生成には javap.exe が必要 PowerBuilder は、 javap.exe ユーテ ィ リ テ ィ を使っ てプ ロ キ シ オブジ ェ ク ト を生成 し ます。 こ の実行フ ァ イ ルは、 シ ス テ ム パ ス上に置 く 必要 があ り ます。デフ ォ ル ト では、EJB ク ラ イ ア ン ト の開発に PowerBuilder と と も に イ ン ス ト ール さ れ る Sun JDK 1.4 を使用 し ます。Java VM に必 要なパ ス と ク ラ ス パ ス は、 現在のセ ッ シ ョ ン で使用す る パ ス と ク ラ ス パ ス に自動的に追加 さ れ ます。 別の JDK を使用す る 場合は、 [ツール|シ ス テ ム オプシ ョ ン] を選択 し 、 シ ス テ ム オプシ ョ ン ダ イ ア ロ グ ボ ッ ク ス の [Java] ページで [JDK ロ ケーシ ョ ン の設定] を ク リ ッ ク し ま す。 WebSphere を使用す る 場合 は、 IBM JDK のパ ス を使用 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 631 EJB プ ロキシ オブ ジ ェ ク ト の生成 EJB の ホーム イ ン タ フ ェ ー ス と リ モー ト イ ン タ フ ェ ー ス のプ ロ キ シ に加え、 EJB が参照す る すべての Java ク ラ ス、 先祖 ク ラ ス、 EJB と そ のサポー ト す る ク ラ ス か ら 送出 さ れ る すべての例外、 お よ び以下の イ ン タ フ ェース に対 し て も プ ロ キ シが生成 さ れます。 オブ ジ ェ ク ト EJBHome EJBMetaData EJBObject Handle HomeHandle 説明 すべての EJBhome イ ン タ フ ェ ース の基本 ク ラ ス であ る 、 javax.ejb.EJBHome イ ン タ フ ェース のプ ロ キ シ javax.ejb.EJBMetaData イ ン タ フ ェース のプ ロ キ シ。 EJBMetaData を使用す る と 、ク ラ イ ア ン ト は、EJB のホー ム イ ン タ フ ェ ー ス、 EJB のホーム イ ン タ フ ェ ー ス と リ モー ト イ ン タ フ ェ ー ス の ク ラ ス オブジ ェ ク ト 、 お よ び エン テ ィ テ ィ Beans の主キー ク ラ ス を取得 し 、 Beans が セ ッ シ ョ ン オブジ ェ ク ト ま たは ス テー ト レ ス セ ッ シ ョ ン オブジ ェ ク ト か ど う かが判断可能にな る すべての EJB リ モー ト イ ン タ フ ェ ー ス の基本 ク ラ ス で あ る 、 javax.ejb.EJBObject イ ン タ フ ェース のプ ロ キ シ javax.ejb.Handle イ ン タ フ ェ ー ス のプ ロ キ シ。 EJB への堅 牢で永続的な参照を提供す る javax.ejb.HomeHandle イ ン タ フ ェース のプ ロ キ シ。 ホーム オブジ ェ ク ト への堅牢で永続的な参照を提供す る こ れ ら の イ ン タ フ ェ ース についての詳細は、 javax.ejb パ ッ ケージ http://java.sun.com/j2ee/sdk_1.3/ja/techdocs/api/index.html に掲載のマニ ュ ア ルを参照 し て く だ さ い。 プ ロ ジ ェ ク ト は、 Java ク ラ ス のプ ロ キ シ名へのマ ッ ピ ン グ を格納す る 構造体 も 生成 し ま す。 こ の構造体は内部的に使用 さ れ る も の な ので、 変更 し ないで く だ さ い。 ejb2pb90J ツールの使い方 プ ロ キ シの生成には、ejb2pb90J コ マ ン ド ラ イ ン ツールを使用す る 方法 も あ り ます。 こ の ツールを使用 し た場合、 以下が生成 さ れ ます。 632 • 指定 し た EJB のホーム イ ン タ フ ェ ース と リ モー ト イ ン タ フ ェ ー ス のプ ロ キ シ、お よ び EJB が依存す る ク ラ ス のプ ロ キ シ (.srx フ ァ イ ル) • ejbname_ejb_pb_mapping.srs と い う 名前の PowerBuilder 構造体オブ ジ ェ ク ト 。 こ の場合、 ejbname は EJB 名。 こ の構造体は、 Java ク ラ ス名 と PowerBuilder プ ロ キ シ名 と の間のマ ッ ピ ン グ テーブルを ホ ス ト する PowerBuilder 第 28 章 EJB ク ラ イ ア ン ト の構築 • ejbproxies.txt と い う 名前のテ キ ス ト フ ァ イ ル。 エ ラ ーが発生 し た 場合は、 ejbproxies.err. と い う 名前のテ キ ス ト フ ァ イ ル こ れ ら の フ ァ イ ルは、 コ マ ン ド の呼び出 し 元のデ ィ レ ク ト リ 内に生成 さ れ ます。 構文は次の と お り です。 ejb2pb90J [ -classpath pathlist ] EJBName [ prefix ] D:¥Program Files の よ う に、 pathlist 引数に スペース が含まれ る 場合は、 pathlist を引用符で囲む必要があ り ます。 EJBName は、 完全修飾 リ モー ト イ ン タ フ ェ ース ク ラ ス名です。 オプシ ョ ン の prefix を指定す る と 、 生成 さ れたプ ロ キ シ名の先頭に接頭辞が追加 さ れます。 た と えば、次の ス テー ト メ ン ト は、EAServer 上の cocoPortfolio パ ッ ケー ジ 内の Portfolio ク ラ ス の プ ロ キ シ を 生成 し ま す。 Portfolio ク ラ ス の ホーム イ ン タ フ ェ ース と リ モー ト イ ン タ フ ェース のプ ロ キ シには、接 頭辞 と し て pf_ が追加 さ れ、 生成 さ れ た フ ァ イ ルは D:¥work¥proxies デ ィ レ ク ト リ に書 き 込まれます。 cd D:¥work¥proxies ejb2pb90J -classlist "D:¥Program Files¥Sybase¥EAServer¥ html¥classes" cocoPortfolio.Portfolio pf_ EJB のホーム ク ラ ス と リ モー ト ク ラ ス、お よ びそれに従属す る ク ラ ス は、 指定 し た ク ラ ス パ ス に置 く 必要があ り ます。 プ ロ キ シ を生成 し た後に、 生成 し たプ ロ キ シ を タ ーゲ ッ ト に イ ン ポー ト す る には、 ク ラ イ ア ン ト を含む ラ イ ブ ラ リ を選択 し 、 ポ ッ プア ッ プ メ ニ ュ ーか ら [ イ ン ポー ト ] を選び、 表示 さ れたダ イ ア ロ グ ボ ッ ク ス か ら .srx フ ァ イ ルを選び ま す。 .srx フ ァ イ ルを イ ン ポー ト す る 順序に は注意が必要です。 ほかの ク ラ ス に従属す る プ ロ キ シは、 その従属す る ク ラ ス のプ ロ キ シ を イ ン ポー ト し た後でない と イ ン ポー ト で き ませ ん。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 633 EJB プ ロキシ オブ ジ ェ ク ト の生成 生成 さ れたプ ロキシの表示方法 生成 さ れた プ ロ キ シ は、 シ ス テ ム ツ リ ーに表示 さ れ ま す。 プ ロ キ シ ノ ー ド を展開す る と 、 EJB コ ン ポーネ ン ト のホーム イ ン タ フ ェース と リ モー ト イ ン タ フ ェース の メ ソ ッ ド のシ グネチ ャ 、 お よ びプ ロ キ シ を 生成 し たほかのすべてのオブジ ェ ク ト の メ ソ ッ ド のシ グ ネチ ャ が表示 さ れ ます。 634 PowerBuilder 第 28 章 EJB ク ラ イ ア ン ト の構築 予約語 と の衝突 コ ン ポーネ ン ト の メ ソ ッ ド 名が PowerBuilder の予約語 と 衝突す る 場 合、 メ ソ ッ ド を PowerBuilder に イ ン ポー ト で き る よ う に、 プ ロ キ シ内 の メ ソ ッ ド 名に文字列 _j が追加 さ れ ます。 た と えば、 Java Iterator ク ラ ス には Next メ ソ ッ ド があ り 、 こ の メ ソ ッ ド は、 PowerBuilder の予約 語 NEXT と 衝突 し ます。 プ ロ シ キ内で、 こ の メ ソ ッ ド には next_j と い う 名前が付け ら れます。 デー タ 型マ ッ ピ ング EJB プ ロ キシ ジ ェ ネ レータ は、次の表に示すよ う に Java と PowerBuilder の間でデー タ 型を マ ッ プ し ます。 Java のデー タ 型 PowerBuilder のデー タ 型 short Integer int Long long LongLong float Real double Double byte Int char (16 ビ ッ ト 、 符号な し ) Char java.lang.String String boolean Boolean java.util.Date Datetime 基本デー タ 型の配列 パ ラ メ ー タ : 基本デー タ 型の配列 戻 り 値 :Any パ ラ メ ー タ :String ま たは DateTime の配列 戻 り 値 :Any java.lang.String ま たは java.util.Date オブジ ェ ク ト の配列 配列の配列 Java ク ラ ス の引数ま たは戻 り 値 そのほか double 型の精度の相 違 Any Java ク ラ ス の PowerBuilder プ ロ キ シ Any PowerBuilder の double 型は 15 桁の精度(1.79769313486231E+308)を持 ち、Java の double 型は 17 桁の精度(1.7976931348623157e+308)を 持ち ま す。EJB ク ラ イ ア ン ト ア プ リ ケーシ ョ ン の場合、double 型の精度は、 PowerBuilder の範囲(2.2250738585073E-308 ~ 1.79769313486231E+308) に制限 さ れます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 635 Java VM の作成 配列の配列 PowerBuilder は、 Java と は異な り 、 可変長多次元配列を サポー ト し て い ません。 Java メ ソ ッ ド がパ ラ メ ー タ と し て配列の配列を受け取 る 場 合、 こ れに対応す る PowerBuilder プ ロ キ シ メ ソ ッ ド は Any 型のパ ラ メ ー タ を 受け取 り ま す。 PowerBuilder 内で メ ソ ッ ド を 呼び出すには、 Java 配列 と 同 じ 次元で PowerBuilder 配列 を 宣言 し 、 そ の配列 を パ ラ メ ー タ と し て渡 し ます。 Java VM の作成 EJB コ ン ポーネ ン ト を呼び出す場合、 事前に JavaVM ク ラ ス の CreateJavaVM メ ソ ッ ド を使用 し て Java VM を作成す る 必要があ り ま す。 最初の引数は、 Java VM に よ っ て使用 さ れ る ク ラ ス パ ス の先頭に 追加す る ク ラ ス パ ス を指定す る String 型 です。 Java VM がすでにロー ド さ れている場合 Java VM がすでに実行 さ れてい る 場合、 ク ラ ス パ ス 引数は無視 さ れ ま す。 createJavaVM の第 2 引数は、 デバ ッ グ情報を テ キ ス ト フ ァ イ ルに書 き 出すか ど う か を指定す る Boolean 型の引数です。 648 ページの 「 ク ラ イ ア ン ト のデバ ッ グ」 を参照 し て く だ さ い。 こ れ以外に、 JavaVM ク ラ ス には、 Java VM の作成に使用可能な以下の 3 つの メ ソ ッ ド があ り ます。 • IsJavaVMLoaded メ ソ ッ ド 。 こ の メ ソ ッ ド は、Java VM がすでに ロ ー ド さ れてい る か ど う か を判断す る 。 CreateJavaVM に渡 さ れ る ク ラ ス パ ス引数を無視す る ために、 Java VM をすでに ロ ー ド し て あ り 、 アプ リ ケーシ ョ ン の一部の機能を有効 ま たは無効 と し たい場合に は、 CreateJavaVM を呼び出す前に こ の メ ソ ッ ド を使用す る • GetJavaVMVersion メ ソ ッ ド 。 こ の メ ソ ッ ド は、 実行中の Java VM の バージ ョ ン を判断す る • GetJavaClasspath メ ソ ッ ド 。 こ の メ ソ ッ ド は、 Java VM の ラ ン タ イ ム ク ラ ス パ ス を判断す る CreateJavaVM を 使用 し て作成す る JavaVM は、 ク ラ イ ア ン ト ア プ リ ケーシ ョ ン のグ ロ ーバル変数 ま たは イ ン ス タ ン ス 変数でなければな ら ず、 明示的に破棄 さ れない よ う に し ます。 636 PowerBuilder 第 28 章 EJB ク ラ イ ア ン ト の構築 開発環境における Java VM ク ラ スパス PowerBuilder が Java VM を起動す る と 、 Java VM は内部パ ス と ク ラ ス パ ス情報を使っ て、必要な Java ク ラ ス が常に使用で き る 状態に し ます。 開発環境では、 JVM が実行 さ れてい る か ど う か、 実行 さ れてい る 場合 は JVM が ど の ク ラ ス パ ス を使用 し てい る か を シ ス テ ム オプシ ョ ン ダ イ ア ロ グ ボ ッ ク ス の [Java] ページで確認で き ます。 ク ラ ス パ ス は、 以 下のパ ス を結合 し て作成 さ れ ます。 ラ ン タ イム Java VM ク ラ スパス • Java VM の起動時にプ ロ グ ラ ムに よ っ て追加 さ れ る ク ラ ス パ ス。た と えば、 CreateJavaVM メ ソ ッ ド に渡す ク ラ ス パ ス • PowerBuilder ラ ン タ イ ム ス タ テ ィ ッ ク レ ジ ス ト リ ク ラ ス パ ス。 こ のパ ス は、 pbjvm90J.dll に組み込まれ る 。 こ のパ ス には、 実行時に EJB ク ラ イ ア ン ト 、 お よ び Java VM を 使 用 す る そ の ほ か の PowerBuilder 機能に必要な ク ラ ス が含まれ る • PowerBuilder シ ス テ ム ク ラ ス パ ス。 こ のパ ス は、PowerBuilder の イ ン ス ト ール時に イ ン ス ト ール さ れ る Windows レ ジ ス ト リ キー内に 保存 さ れ る 。 こ のパ ス には、 設計時に JSP タ ーゲ ッ ト お よ び JDBC 接続な ど の Java 関連の PowerBuilder 機能に必要な ク ラ ス が含まれ る • PowerBuilder ユーザ ク ラ ス パ ス。 こ のパ ス は、 シ ス テ ム オプシ ョ ン ダ イ ア ロ グ ボ ッ ク ス の [Java] ページで指定す る パ ス • シ ス テ ム の CLASSPATH 環境変数 • 現行デ ィ レ ク ト リ 実行時に、 GetJavaClasspath メ ソ ッ ド を使用す る と 、 Java VM が使用 し てい る ク ラ ス パ ス を判断で き ます。 Java VM は、 実行時に以下の ク ラ ス パ ス を使用 し ます。 • Java VM の起動時にプ ロ グ ラ ムに よ っ て追加 さ れ る ク ラ ス パ ス • PowerBuilder ラ ン タ イ ム ス タ テ ィ ッ ク レ ジ ス ト リ ク ラ ス パ ス • シ ス テ ム の CLASSPATH 環境変数 • 現行デ ィ レ ク ト リ 実行時の Java ク ラ ス パ ス についての詳細は、823 ページの「Java サポー ト 」 を参照 し て く だ さ い。 サーバが必要 と する ク ラス ク ラ ス パ ス には、 EAServer 4.2 用の EJB ク ラ イ ア ン ト が必要 と す る ク ラ ス が含まれます。 別の J2EE サーバを使用す る 場合、 アプ リ ケーシ ョ ン サーバが必要 と す る ク ラ ス を シ ス テ ム の CLASSPATH に さ ら に追加 す る 必要があ り ます。 た と えば、 次の よ う にな り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 637 Java VM の作成 • WebLogic の場合、 weblogic.jar。 こ の フ ァ イ ルは、 サーバ上の wlserver6.1¥lib ま たは weblogic700¥server¥lib に イ ン ス ト ール さ れる • WebSphere の場合、 JAR フ ァ イ ルが、 サーバ上の websphere¥appserver¥lib に イ ン ス ト ール さ れ る ク ラ イ ア ン ト 上の各ア プ リ ケーシ ョ ン サーバに対 し て必要な フ ァ イ ルについての詳細は、 サーバのマニ ュ アルを参照 し て く だ さ い。 例 こ の例では、 EAServer イ ン ス ト ール内の html¥classes フ ォ ルダ を ク ラ ス パ ス と し て指定す る Java VM の イ ン ス タ ン ス の作成を示 し ます。 // グローバル変数 javavm g_jvm、 // boolean gb_jvm_started boolean isdebug string classpath if NOT gb_jvm_started then //JAVAVM を作成 し ます。 g_jvm = create javavm // EJB の Java パ ッ ケージは、 // EAServer html/classes フ ォルダにあ り ます。 classpath = & "D:¥Program Files¥Sybase¥EAServer¥html¥classes;" isdebug = true choose case g_jvm.createJavaVM(classpath, isdebug) case 0 gb_jvm_started = true case -1 MessageBox(" エ ラ ー ", "Java VM のロー ド に失敗 ") case -2 MessageBox(" エ ラ ー ", "EJBLocator のロー ド に失敗 ") end choose end if 使用す る Java VM バージ ョ ン と ク ラ ス パ ス の レ コ ー ド を 作成す る に は、 上記の例に次の コ ー ド を追加 し ます。 integer li_FileNum string ls_classpath, ls_version, ls_string li_FileNum = FileOpen("C:¥temp¥PBJavaVM.log", & LineMode!, Write!, LockWrite!, Append!) ls_classpath = i_jvm.getjavaclasspath() ls_version = i_jvm.getjavavmversion() 638 PowerBuilder 第 28 章 EJB ク ラ イ ア ン ト の構築 ls_string = String(Today()) + " " + String(Now()) ls_string += " Java VM Version: " + ls_version ls_string += " ~r~n" + ls_classpath + "~r~n" FileWrite(li_FileNum, ls_string) FileClose(li_filenum) サーバへの接続 EJB サーバに接続 し EJB を検索す る には、EJBConnection ク ラ ス を使用 し ます。 EJBConnection ク ラ ス には、 次の 4 つの メ ソ ッ ド があ り ます。 ConnectToServer、 DisconnectServer、 Lookup、 お よ び GetEJBTransaction で す。 サ ー バへ の 接続 を 確立す る に は、 以下 の 操作 を 行 う た め に 必要 な PowerScript 文を実行す る 必要があ り ます。 1 EJBConnection ク ラ ス の イ ン ス タ ン ス を宣言 し ます。 2 EJBConnection オブジ ェ ク ト のプ ロ パテ ィ を設定 し ます。 3 CREATE 文を使用 し て、 EJBConnection オブジ ェ ク ト を イ ン ス タ ン ス化 し ます。 4 ConnectToServer メ ソ ッ ド を呼び出 し て、 サーバへの接続を確立 し ます。 5 ク ラ スパス要件 エ ラ ーの有無をチ ェ ッ ク し ます。 アプ リ ケーシ ョ ン サーバに接続 し 、EJB オブジ ェ ク ト を作成す る には、 シ ス テ ム の CLASSPATH 環境変数ま たは createJavaVM の classpath 引数 に、 EJB ス タ ブ フ ァ イ ルの格納場所 (デ ィ レ ク ト リ ま たは JAR フ ァ イ ル) を含め る 必要があ り ます。 ま た、 使用す る アプ リ ケーシ ョ ン サー バが、 ク ラ イ ア ン ト コ ン ピ ュ ー タ 上で ク ラ ス ま たは JAR フ ァ イ ルを利 用で き る よ う に し 、 それ ら を ク ラ ス パ ス に追加す る こ と が必要な場合 も あ り ま す。 詳細については、 637 ページの 「開発環境におけ る Java VM ク ラ ス パ ス 」 を参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 639 サーバへの接続 初期 コ ン テキス ト の設 定 初期 コ ン テ キ ス ト の設定に使用 さ れ る 文字列は、 EJB サーバに依存 し ます。 次の表に、 サン プル文字列値を示 し ます。 詳細については、 サー バのマニ ュ アルを参照 し て く だ さ い。 サーバ EAServer WebLogic WebSphere INITIAL_CONTEXT_FACTORY 値 com.sybase.ejb.InitialContextFactory weblogic.jndi.WLInitialContextFactory com.ibm.websphere.naming.WsnInitialContextFactory 次の ス ク リ プ ト は、 EAServer への接続を示 し てい ます。 こ の ス ク リ プ ト では、 接続プ ロ パテ ィ を設定 し て、 初期 コ ン テ キ ス ト の作成、 サー バのホ ス ト 名 と ポー ト 番号の識別、ユーザ ID と パ ス ワ ー ド の識別を行 い ます。 例 IIOPS IIOPS 接続は、 現時点ではサポー ト さ れてい ません。 続いて、 こ の ス ク リ プ ト では、 EJBConnection オブジ ェ ク ト の イ ン ス タ ン ス を作成 し 、 ConnectToServer メ ソ ッ ド を呼び出 し てサーバへの接続 を確立 し 、 エ ラ ーをチ ェ ッ ク し ます。 ejbconnection conn string properties[] properties[1]="javax.naming.Context.INITIAL_CONTEXT_FACTORY= com.sybase.ejb.InitialContextFactory" properties[2]="javax.naming.Context.PROVIDER_URL=iiop://myejbserver:9000" properties[3]="javax.naming.Context.SECURITY_PRINCIPAL=jagadmin" properties[4]="javax.naming.Context.SECURITY_CREDENTIALS=" conn = CREATE ejbconnection TRY conn.connectToServer(properties) CATCH (exception e) MessageBox(" 例外 ", e.getmessage()) END TRY サーバ と の接続解除 EJB サーバを使用 し て アプ リ ケーシ ョ ン を終了 し た ら 、 サーバ と の接 続を解除す る 必要があ り ます。 conn.disconnectserver() 640 PowerBuilder 第 28 章 EJB ク ラ イ ア ン ト の構築 コ ンポーネ ン ト メ ソ ッ ド の呼び出 し サーバへの接続が確立 さ れ、 プ ロ キ シ オブジ ェ ク ト かオブジ ェ ク ト が 作成 さ れた後では じ めて、 ク ラ イ ア ン ト アプ リ ケーシ ョ ンは EJB コ ン ポーネ ン ト を使用で き ます。 EJB コ ン ポーネ ン ト メ ソ ッ ド を呼び出す には、 以下の操作に必要な PowerScript 文を実行す る 必要があ り ます。 1 EJBConnection の lookup メ ソ ッ ド を使用 し て、 コ ン ポーネ ン ト の ホーム イ ン タ フ ェ ース にア ク セ ス し ます。 2 ホーム イ ン タ フ ェ ース上で create ま たは findByPrimaryKey メ ソ ッ ド を呼び出 し て、 コ ン ポーネ ン ト の イ ン ス タ ン ス を作成 ま たは検索 し 、 コ ン ポーネ ン ト の リ モー ト イ ン タ フ ェ ースへの参照を取得 し ます。 3 リ モー ト イ ン タ フ ェース で ビ ジネ ス メ ソ ッ ド を呼び出 し ます。 こ のプ ロ シージ ャ は、 pbejbclient90J.jar フ ァ イ ル を 使用 し ま す。 こ の フ ァ イ ルは、設計時お よ び実行時に pbjvm90J.dll に よ っ て自動的に Java VM ク ラ ス パ ス に追加 さ れます。 lookup メ ソ ッ ド の使 い方 lookup メ ソ ッ ド は、ホーム イ ン タ フ ェース のプ ロ キ シ名、EJB コ ン ポー ネ ン ト の JNDI 名、EJB コ ン ポーネ ン ト の完全修飾ホーム イ ン タ フ ェ ー ス名の 3 つの文字列引数を受け取 り ます。 ホーム イ ン タ フ ェ ース名は、EJB ホーム イ ン タ フ ェース の完全修飾 ク ラ ス名です。 た と えば、 ク ラ ス の Java ネー ミ ン グ コ ン テ キ ス ト か ら の 相対格納場所が ejbsample で あ る 場合、 ホ ー ム イ ン タ フ ェ ー ス 名は ejbsample.HelloEJBHome にな り ます。 次の例では、 WebLogic 上の HelloEJB に対す る 、 lookup メ ソ ッ ド の呼び 出 し を示 し ます。 HelloEJBHome homeobj homeobj = conn.lookup("HelloEJBHome", "ejbsample.HelloEJB", "ejbsample.HelloEJBHome") Lookup の大文字 と 小文字の区別 EJB サーバの Lookup では大文字 と 小文字が区別 さ れ ま す。 lookup メ ソ ッ ド の引数に指定す る 文字列の大文字 と 小文字は、 サーバの大文字 と 小文字に一致 さ せ る 必要があ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 641 コ ンポーネ ン ト メ ソ ッ ド の呼び出 し EJB のイ ン ス タ ン ス の作成や検索 セ ッ シ ョ ン Bean は、ク ラ イ ア ン ト の リ ク エ ス ト に応答 し て作成 さ れ ま す。 ク ラ イ ア ン ト は、 通常の場合、 その ク ラ イ ア ン ト セ ッ シ ョ ンの持 続中はセ ッ シ ョ ン Bean を排他的に使用 し ます。エ ン テ ィ テ ィ Bean は、 デー タ ベー ス に保存 さ れ る 永続情報を表 し ます。 ク ラ イ ア ン ト は、 ほ かの ク ラ イ ア ン ト と 同時にエ ン テ ィ テ ィ Bean を使用 し ます。エ ン テ ィ テ ィ Bean は、 ク ラ イ ア ン ト の有効期限が終了 し て も 持続す る ため、 エ ン テ ィ テ ィ Bean の イ ン ス タ ン ス が存在す る 場合は主キーの ク ラ ス 名 を使用 し て こ れを検索 し 、エ ン テ ィ テ ィ Bean の イ ン ス タ ン ス が存在 し ない場合は新規に作成す る 必要があ り ます。 セ ッ シ ョ ン Bean の場合、 プ ロ キ シ オブジ ェ ク ト の create メ ソ ッ ド を 使 用 し て、 EJB の イ ン ス タ ン ス を 作 成 し ま す。 create メ ソ ッ ド は、 CreateException と RemoteException を送出 し ま す。 homeobj 内のホーム イ ン タ フ ェ ース への参照を取得 し てい る こ と を前提 と し た場合、 すべ ての EJB サーバでは同 じ 方法で create が使用 さ れ ます。 HelloEJB beanobj try beanobj = homeobj.create() catch (remoteexception re) MessageBox(" リ モー ト 例外 ", re.getmessage()) catch (createexception ce) MessageBox(" 作成例外 ", ce.getmessage()) end try エ ン テ ィ テ ィ Bean の場合、 主キーを提供 し ます。 FindByPrimaryKey メ ソ ッ ド は、 FinderException と RemoteException を送出 し ま す。 こ の例で は、 キーは関数に引数 と し て渡す特定の顧客 ID です。 try beanobj = homeobj.findByPrimaryKey(customerID) catch ( remoteexception re) MessageBox(" リ モー ト 例外 ", re.getmessage()) catch ( finderexception fe) MessageBox(" 検索例外 ", fe.getmessage()) end try EJB コ ンポーネ ン ト メ ソ ッ ド の呼び出 し Bean の イ ン ス タ ン ス の作成ま たは検索が完了 し た ら 、 その メ ソ ッ ド を 呼び出す こ と がで き ます。 た と えば、 次の よ う にな り ます。 string msg msg = beanobj.displaymessage() 642 PowerBuilder 第 28 章 EJB ク ラ イ ア ン ト の構築 Java ク ラ スのイ ン ス タ ン スの作成 Bean に 引 数 と し て Java ク ラ ス を 受 け 取 る メ ソ ッ ド が あ る 場 合、 EJBConnection オブジ ェ ク ト の CreateJavaInstance メ ソ ッ ド を使用 し て Java ク ラ ス の イ ン ス タ ン ス を作成 し ま す。 た と えば、 findByPrimaryKey メ ソ ッ ド へ の 呼 び 出 し 内 の 主 キ ー が Java ク ラ ス で あ る 場 合 は、 CreateJavaInstance メ ソ ッ ド を 使用し てそのク ラ ス を 作成し 、PowerBuilder プ ロ キ シ を使用 し てそれ と 通信 し ます。 こ の例では、 create メ ソ ッ ド は Java の Integer 型の ク ラ ス引数を受け取 り ま す。 PowerBuilder は java_integer と い う プ ロ キ シ を 作 成 し ま す (PowerBuilder integer 型 と の衝突を避け る ために、 接頭辞 java_ が必要 です)。 CreateJavaInstance への呼び出 し がその変数の値を設定 し 、 EJB create メ ソ ッ ド を呼び出せ る よ う に し ます。 CustomerRemoteHome homeobj CustomerRemote beanobj java_integer jint_a try homeobj = conn.lookup("CustomerRemoteHome", & "custpkg/Customer", "custpkg.CustomerRemoteHome" ) catch (Exception e) MessageBox( "Lookup 例外 ", e.getMessage() ) return end try try conn.createJavaInstance(jint_a, "java_integer") jint_a.java_integer("8") beanobj = homeobj.create( jint_a, sle_name.text ) catch (RemoteException re) MessageBox(" リ モー ト 例外 ", re.getmessage()) return catch (CreateException ce) MessageBox(" 例外作成 ", ce.getmessage()) return catch ( Throwable t) MessageBox(" その他例外 ", e.getmessage()) end try MessageBox ("Info", & " こ のレ コ ー ド はデー タ ベースの中に " & + "~r~n 正常に保存 さ れま し た。 " ) ア プ リ ケーシ ョ ン テ ク ニ ッ ク 643 コ ンポーネ ン ト メ ソ ッ ド の呼び出 し 戻 り 値のダウンキ ャ ス ト Java コ ー ド か ら 、 Java プ ロ グ ラ ミ ン グで使用す る ためにダ ウ ン キ ャ ス ト が必要な共通 Java オブジ ェ ク ト が返 さ れ る と 、 Java メ ソ ッ ド は常に Java.lang.Object と し て戻 り 値を設定 し ます。PowerBuilder EJB ク ラ イ ア ン ト プ ロ キ シでは、 java.lang.Object は any デー タ 型にマ ッ プ さ れ ます。 実行時、 PowerBuilder は正 し い Java オブジ ェ ク ト を取得 し 、 生成 さ れ たマ ッ ピ ン グ構造体に イ ンデ ッ ク ス を付けて PowerBuilder プ ロ キ シ名 を取得 し ます。 any 値は、 こ のプ ロ キ シ オブジ ェ ク ト と し て設定 さ れ ます。 返 さ れた Java オブジ ェ ク ト が PowerBuilder 標準デー タ 型にマ ッ プ可能な場合は、any 値が PowerBuilder 標準デー タ 型 と し て設定 さ れ ま す。 リ モー ト イ ン タ フ ェース に次の メ ソ ッ ド が含ま れ る と し ます。 java.lang.Object account::getPrimaryKey() ま た、 ホーム イ ン タ フ ェ ース は次の メ ソ ッ ド を含みます。 account accounthome::findByPrimaryKey(java.lang.String) 戻 り 値 java.lang.Object は、 実行時に java.lang.String と な り ます。 PowerBuilder は戻 り 値を PowerBuilder の string デー タ 型に自動的にダ ウ ン キ ャ ス ト し ます。 any nid try account beanobj homeobj = conn.lookup("AccountHome", & ejb20-containerManaged-AccountHome, & examples.ejb20.basic.containerManaged.AccountHome) beanobj = homeobj.create("101", 0, "savings") nid = beanobj.getPrimaryKey() accounts = homeobj.findByPrimaryKey(string(nid)) catch (exception e) MessageBox(" 例外 ", e.getmessage()) end try 動的キ ャ ス テ ィ ング 644 EJB メ ソ ッ ド への呼び出 し か ら 返 さ れた Java オブジ ェ ク ト が、 必要な メ ソ ッ ド を提供 し ないプ ロ キ シで表 さ れ る 可能性のあ る ケース が 2 つ 考え ら れます。 • EJB メ ソ ッ ド の呼び出 し か ら 返 さ れ る Java オブジ ェ ク ト の ク ラ ス が動的に生成 さ れ る 場合、 PowerBuilder は Java ク ラ ス に よ っ て実 装 さ れ る 最初の イ ン タ フ ェ ース のプ ロ キ シ を使用す る • someclass を実際に返す EJB メ ソ ッ ド のプ ロ ト タ イ プは、 someclass が拡張ま たは実装す る ク ラ ス を返す よ う に定義で き る 。 た と えば、 実 際 に java.util.ArrayList 型 の オ ブ ジ ェ ク ト を 返 す メ ソ ッ ド は、 java.util.Collection を 返 す よ う に 定 義 で き る 。 java.util.ArrayList は、 PowerBuilder 第 28 章 EJB ク ラ イ ア ン ト の構築 java.util.AbstractList か ら 継 承 さ れ、 こ の java.util.AbstractList は、 java.util.AbstractCollection か ら 継承 さ れ、こ の java.util.AbstractCollection が、 java.util.Collection を 実 装 す る 。 こ の 場 合、 PowerBuilder は、 java.util.Collection のプ ロ キ シ を使用す る DynamicCast メ ソ ッ ド を使用す る と 、 返 さ れたプ ロ キ シ オブジ ェ ク ト を、 必要な イ ン タ フ ェ ース のプ ロ キ シにキ ャ ス ト す る か、 実行時に返 さ れ る オブジ ェ ク ト の実際の ク ラ ス のプ ロ キ シにキ ャ ス ト し 、 そのオ ブジ ェ ク ト の メ ソ ッ ド を使用可能にで き ます。 オブジ ェ ク ト の実際の ク ラ ス を取得す る には、 GetActualClass メ ソ ッ ド を使用 し ます。 ま た、 DynamicCast メ ソ ッ ド は、 Java ク ラ ス の直接の親 を 返す GetSuperClass メ ソ ッ ド や、 ク ラ ス に よ っ て実装 さ れ る イ ン タ フ ェ ー ス の リ ス ト を文字列配列に書 き 込む GetInterfaces メ ソ ッ ド と と も に使用で き ます。 た と えば、 次の よ う な ク ラ ス があ る と し ます。 public class java.util.LinkedList extends java.util.AbstractSequentialList implements java.util.List, java.lang.Cloneable, java.io.Serializable GetActualClass は java.util.LinkedList を返 し 、 GetSuperClass は java.util.AbstractSequentialList を返 し 、 GetInterfaces は 3 を返 し 、 java.util.List、 java.lang.Cloneable、 お よ び java.io.Serializable の 3 つの文字 列を、 参照 さ れ る 文字列配列に書 き 込みます。 Java コ レ ク シ ョ ン ク ラス EJB プ ロ キ シの生成では、 Enumeration、 Iterator、 Vector な ど の Java 共 通 コ レ ク シ ョ ン ク ラ ス が生成 さ れます。 PowerBuilder は、 こ れ ら の コ レ ク シ ョ ン ク ラ ス を、 Java ク ラ イ ア ン ト と 同 じ よ う に操作で き ます。 た と えば、 ホーム イ ン タ フ ェ ー ス に戻 り 値 java.util.Enumeration を持つ 次の メ ソ ッ ド が含まれてい る と し ます。 Enumeration accounthome::findNullAccounts () 次の コ ー ド は、 PowerBuilder EJB ク ラ イ ア ン ト が PowerBuilder プ ロ キ シ を介 し て列挙子 ク ラ ス を操作す る 方法を示 し てい ます。 Enumeration enum try enum = homeobj.findNullAccounts() if (not enum.hasMoreElements()) then msg = " ア カ ウン ト は、 NULL ア カ ウン ト 型では見つか り ません。 " end if catch (exception e) MessageBox(" 例外 ", e.getmessage()) end try ア プ リ ケーシ ョ ン テ ク ニ ッ ク 645 例外処理 例外処理 EJB コ ン ポーネ ン ト の メ ソ ッ ド の実行時に発生 し たエ ラ ーは、 例外プ ロ キ シにマ ッ プ さ れ、 呼び出 し 側の ス ク リ プ ト に送出 さ れ ます。 ま た、 サーバへの接続に失敗 し た り 、 コ ン ポーネ ン ト が見つけ ら れなか っ た り 作成で き なか っ た場合 も 、 pbejbclient90J.sdll 内のすべての ク ラ ス の メ ソ ッ ド は例外を送出 し ます。 EJB プ ロ キ シ プ ロ ジ ェ ク ト を構築す る と 、 ホーム イ ン タ ーフ ェース と リ モー ト イ ン タ フ ェース のプ ロ キ シ、EJB に よ っ て参照 さ れ る Java ク ラ ス のプ ロ キ シ、 先祖 ク ラ ス のプ ロ キ シ、 お よ び EJB と そのサポー ト す る ク ラ ス に よ っ て送出 さ れ る 可能性のあ る 例外のプ ロ キ シが生成 さ れ ます。 次の例外プ ロ キ シは、 シ ス テ ム ツ リ ー内に表示 さ れ る 例外プ ロ キ シの一部です。 プ ロキシ名 createexception ejbexception finderexception remoteexception removeexception 例外の捕捉 Java オブ ジ ェ ク ト 名 javax.ejb.CreateException javax.ejb.EJBException javax.ejb.FinderException java.rmi.RemoteException javax.ejb.RemoveException ク ラ イ ア ン ト アプ リ ケーシ ョ ンは、 さ ま ざ ま な方法で通信エ ラ ーを処 理で き ます。 た と えば、 ク ラ イ ア ン ト がサーバに接続 し 、 オブジ ェ ク ト の メ ソ ッ ド を 呼び出そ う と し た のに そ のオ ブ ジ ェ ク ト が存在 し な か っ た場合は、 サーバ と の接続を解除 し 、 別のサーバに接続 し て操作 を再試行す る 方法があ り ます。あ る いは、ク ラ イ ア ン ト がユーザに メ ッ セージ を表示 し て、 次に起 こ る こ と を制御す る 機会を ユーザに与え る 方法 も あ り ます。 ク ラ イ ア ン ト が操作の再開の た めに新 し いサーバに接続 し て い る 場 合、 エ ラ ー発生時には、 新 し いサーバ上で リ モー ト オブジ ェ ク ト を イ ン ス タ ン ス化 し てか ら 、 リ モー ト オブジ ェ ク ト の メ ソ ッ ド を呼び出す 必要があ り ます。 次の例では、 特定の例外の発生時に、 ス ク リ プ ト は メ ッ セージ ボ ッ ク ス を表示す る だけです。 //char getChar() 関数が RemoteException を送出 し ます。 try conn.connectToServer(properties) mappinghome = conn.lookup("pbEjbMappingHome", "pbEjbTest/pbEjbMappingBeanSL", "pbejb.pbEjbMappingHome") mapping = mappinghome.create() 646 PowerBuilder 第 28 章 EJB ク ラ イ ア ン ト の構築 ret = mapping.getChar() messagebox("EJB からの文字列 ", ret) catch (remoteexception re) messagebox(" リ モー ト 例外 ", re.GetMessage()) catch (createexception ce) messagebox(" 作成例外 ", ce.GetMessage()) end try 処理 さ れない例外 例外ハン ド ラ がない場合、 ま たは既存の例外ハン ド ラ がその例外を処 理 し ない場合、 アプ リ ケーシ ョ ン オブジ ェ ク ト の SystemError イ ベン ト が実行 さ れ ます。 SystemError イ ベン ト に ス ク リ プ ト が記述 さ れてい ない場合は、 アプ リ ケーシ ョ ン エ ラ ーが起 き て、 アプ リ ケーシ ョ ンは 終了 し ます。 ク ラ イ ア ン ト 管理の ト ラ ンザク シ ョ ン EJB ク ラ イ ア ン ト アプ リ ケーシ ョ ンは、 EJBTransaction オブジ ェ ク ト を 使用し てサーバ上の ト ラ ンザ ク シ ョ ン を制御し ます。 こ のオブジ ェ ク ト には、 ク ラ イ ア ン ト に ト ラ ンザ ク シ ョ ン を開始、 コ ミ ッ ト 、 ま たは ロ ー ルバ ッ ク さ せる メ ソ ッ ド があ り ます。 ま た、 ク ラ イ ア ン ト は ト ラ ンザ ク シ ョ ンの状態を取得し た り 、 その タ イ ム ア ウ ト 値を変更し た り 、 コ ミ ッ ト で き ない よ う に ト ラ ンザ ク シ ョ ン を変更する こ と も で き ます。 EJBTransaction メ ソ ッ ド は、 javax.transaction.UserTransaction イ ン タ フ ェー ス の メ ソ ッ ド に直接マ ッ プ し ます。 javax.transaction.UserTransaction イ ン タ フ ェースについての詳細は、 Sun Java Web サイ ト http://java.sun.com/j2ee/ja/jta/index.html を参照し て く だ さ い。 ト ラ ンザク シ ョ ンの開 始 と 終了 ク ラ イ アン ト は、EJBConnection ク ラ ス の getEJBTransaction メ ソ ッ ド を 呼び 出し て、EJBTransaction ク ラ ス のメ ソ ッ ド へのアク セス を 取得でき ま す。 ejbconnection conn ejbtransaction trans string properties[] conn = create ejbconnection TRY conn.connectToServer(properties) trans = conn.getEJBTransaction() CATCH (exception e) messagebox(" 例外 ", e.getmessage()) END TRY ア プ リ ケーシ ョ ン テ ク ニ ッ ク 647 ク ラ イ ア ン ト のデバ ッ グ EJBTransaction の イ ン ス タ ン ス を 正常に取得 し た場合、 そ の begin メ ソ ッ ド を使っ て ト ラ ンザ ク シ ョ ン を開始 し 、 その commit メ ソ ッ ド ま た は rollback メ ソ ッ ド を使用 し て ト ラ ンザ ク シ ョ ン を終了 し ます。 TRY // ト ラ ンザク シ ョ ン を開始 し ます。 trans.begin() // コ ンポーネ ン ト を作成 し 、 ト ラ ンザク シ ョ ン内で実行する // メ ソ ッ ド を呼び出 し ます。 ... // ト ラ ンザク シ ョ ン を コ ミ ッ ト し ます。 trans.commit(); CATCH (exception e) messagebox(" 例外 ", e1.getmessage()) trans.rollback() END TRY ト ラ ンザ ク シ ョ ンに関 する情報の取得 GetStatus は、 ト ラ ンザ ク シ ョ ン がア ク テ ィ ブか、 ロ ールバ ッ ク のマー ク が付い てい る か、 prepare フ ェ ーズ に あ る か commit フ ェ ーズ に あ る か、 ま たは コ ミ ッ ト 済みか ロ ールバ ッ ク 済みか を示す Integer 型の値を 返 し ます。 ト ラ ンザ ク シ ョ ンの タ イムアウ ト 時間の設定 呼び出 し 元 ス レ ッ ド で、 ト ラ ン ザ ク シ ョ ン を ロ ールバ ッ ク す る タ イ ム ア ウ ト 時間 を 指定で き ま す。 次の例では、 タ イ ム ア ウ ト 時間 を 3 分 (180 秒) に設定 し てい ます。 trans.SetTimeout(180) trans.Begin() ク ラ イ ア ン ト のデバ ッ グ JavaVM ク ラ ス の createJavaVM メ ソ ッ ド は、第 2 引数 と し て Boolean 型 の値を受け取 り ます。 こ の第 2 引数が Ture の場合、 ク ラ ス の ロ ー ド な ど の実行情報は ア プ リ ケーシ ョ ン が保存 さ れ て い る デ ィ レ ク ト リ の vm.out フ ァ イ ルに記録 さ れます。 // グローバル変数 : JavaVM g_jvm string classpath boolean isdebug classpath = "d:¥tests¥ejbsample;" isdebug = true g_jvm.createJavaVM(classpath, isdebug) 648 PowerBuilder 第 28 章 EJB ク ラ イ ア ン ト の構築 JDK 1.4 では vm.out は生成 さ れない Sun JDK 1.4 の制限に よ り 、 JDK 1.4 使用時には vm.out デバ ッ グ情報 フ ァ イ ルは生成 さ れません。JDK 1.3 を使用 し てデバ ッ グす る ためシ ス テ ム オプシ ョ ン ダ イ ア ロ グ ボ ッ ク ス の JAVA タ ブ を使用 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 649 ク ラ イ ア ン ト のデバ ッ グ 650 PowerBuilder 第 7 部 Web ア プ リ ケーシ ョ ンの開発 PowerBuilder で Web ア プ リ ケーシ ョ ン を開発す る ため のツール と テ ク ニ ッ ク について説明 し ます。 第 2 9 章 PowerBuilder での Web ア プ リ ケーシ ョ ン開発 こ の章について こ の章では、 PowerBuidler での Web アプ リ ケーシ ョ ン開発に使え る 方法について概要を説明 し ます。 内容 項目 Web アプ リ ケーシ ョ ンの作成 Web サービ ス Web タ ーゲ ッ ト JSP タ ーゲ ッ ト Web デー タ ウ ィ ン ド ウ デー タ ウ ィ ン ド ウ Web コ ン ト ロ ール ActiveX デー タ ウ ィ ン ド ウ プ ラ グ イ ン PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン PowerBuilder ウ ィ ン ド ウ ActiveX ページ 653 654 654 655 655 657 657 658 659 Web ア プ リ ケーシ ョ ンの作成 PowerBuilder には、 Web ア プ リ ケーシ ョ ン作成のためのい く つか の ツールが用意 さ れてい ま す。 こ の節では、 こ れ ら の ツールの概 要を説明 し 、 詳細情報の参照場所を示 し ます。 Web Deployment Kit PowerBuilder Web Deployment Kit (Web 配布キ ッ ト ) は、 既存の PowerBuilder 2 階層の ク ラ イ ア ン ト / サーバ アプ リ ケーシ ョ ン に ブ ラ ウ ザか ら ア ク セ ス で き る ユーテ ィ リ テ ィ です。 詳細について は、 Sybase 社の Web サイ ト www.sybase.com を参照 し て く だ さ い (PowerBuilder 日本語版には対応 し てい ません)。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 653 Web ア プ リ ケーシ ョ ンの作成 Web サービ ス Web サー ビ ス は、 イ ン タ ーネ ッ ト テ ク ノ ロ ジ を 利用 し て分散 ソ フ ト ウ ェ ア コ ン ポーネ ン ト が自動で相互にや り と り す る サー ビ ス と し て 大ま かに定義 さ れ ます。 そ う し た ソ フ ト ウ ェ ア コ ン ポーネ ン ト を使 う と 、 株式市況の取得、 イ ン タ ーネ ッ ト でのカ タ ロ グの在庫検索、 航空 会社 と レ ン タ カーの予約サー ビ ス の統合な ど の ビ ジ ネ ス ロ ジ ッ ク を 実行で き ます。 アプ リ ケーシ ョ ン用の コ ン ポーネ ン ト を作成 し な く て も 、 イ ン タ ーネ ッ ト 経由で既存の コ ン ポーネ ン ト を使用で き ます。 PowerBuilder アプ リ ケーシ ョ ン は、 イ ン タ ーネ ッ ト 経由で ア ク セ ス さ れ る Web サ ー ビ ス を 利用す る ク ラ イ ア ン ト と し て 機能 で き ま す。 SOAP と WSDL を利用す る と 、 1 つのエ ン テ ィ テ ィ と し て リ モー ト で 発行 さ れた関数の集ま り を PowerBuilder アプ リ ケーシ ョ ンに含め る こ と がで き ます。 Web サービ ス は、 アプ リ ケーシ ョ ン ま たはほかの Web サービ ス か ら 送信 さ れた リ ク エ ス ト を受信 し て応答 し ま す。 JSP タ ー ゲ ッ ト で Web サービ ス を使用す る こ と も で き ます。 Web サービ ス についての詳細は、 第 30 章 「Web サービ ス ク ラ イ ア ン ト の構築」 お よ び 『Web タ ーゲ ッ ト と JSP タ ーゲ ッ ト での作業』 マニ ュ アルを参照 し て く だ さ い。 Web タ ーゲッ ト Web タ ーゲ ッ ト は、 Web サ イ ト 作成のための フ ァ イ ル と コ ン ポーネ ン ト の集ま り です。 Web タ ーゲ ッ ト は、 デー タ ベース デー タ の統合、 ク ラ イ ア ン ト サ イ ド イ ベン ト と サーバ サ イ ド イ ベン ト の ス ク リ プ ト 作 成、 お よ び中間層のサーバに保存 さ れてい る コ ン ポーネ ン ト の メ ソ ッ ド の呼び出 し に よ っ て、 動的な対話型 コ ン テ ン ツ を配布で き ます。 標準的な HTML ページや、 ク ラ イ ア ン ト サ イ ド と サーバ サ イ ド の ス ク リ プ ト 、Web デー タ ウ ィ ン ド ウ 、EAServer コ ン ポーネ ン ト (Enterprise JavaBeans を含む) 、 お よ び ActiveX コ ン ポーネ ン ト を包括で き る 複雑 な Web ページ を作成で き ます。 Web タ ーゲ ッ ト のオブジ ェ ク ト モデルでは、 複数のアプ リ ケーシ ョ ン サーバに対す る サーバ サ イ ド のプ ロ グ ラ ミ ン グ がサポー ト さ れて い る ため、 Web タ ーゲ ッ ト を複数のサーバに配布で き ます。 Web アプ リ ケーシ ョ ンの動的 コ ン テ ン ツ を提供す る には、JavaScript で ス ク リ プ ト を作成す る か、 任意の ECMA 準拠ス ク リ プ ト (DynaScript、 VBScript、 JScript な ど) を作成 し ます。 654 PowerBuilder 第 29 章 PowerBuilder での Web ア プ リ ケーシ ョ ン開発 Web タ ーゲ ッ ト オブジ ェ ク ト モデルの 4GL 拡張は、 EAServer に配布 す る アプ リ ケーシ ョ ン専用の機能です。 こ れ ら の拡張機能は、 サーバ サ イ ド の イ ベ ン ト 処理 を 提供 し 、 Web タ ー ゲ ッ ト の ユ ーザ イ ン タ フ ェ ー ス で選択 さ れた内容を基に自動的にサーバ サ イ ド コ ー ド を生 成 し ます。 Web タ ーゲ ッ ト についての詳細は、『Web タ ーゲ ッ ト と JSP タ ーゲ ッ ト での作業』 マニ ュ アルを参照 し て く だ さ い。 JSP タ ーゲッ ト JavaServer Pages (JSP) テ ク ノ ロ ジ を利用すれば、 迅速かつ容易な方法 で静的 コ ン テ ン ツ と 動的 コ ン テ ン ツ を 持つ Web ページ を 作成で き ま す。 JSP は、 通常 HTML ま たは XML での静的マー ク ア ッ プ、 お よ び ス ク リ プ ト 形式の Java コ ン テ ン ツ ま たは Java コ ン ポーネ ン ト の呼び 出 し 、あ る いはその両方を含むテ キ ス ト ベース の文書です。JSP は Java サーブ レ ッ ト API を拡張 し た も ので、 すべての Java API と コ ン ポーネ ン ト にア ク セ ス で き ます。 Web ベース のアプ リ ケーシ ョ ン において数多 く の方法で JSP を使用で き ます。 一般に JSP は、 J2EE アプ リ ケーシ ョ ン モデルの一部 と し て中 間層の Web サーバで実行 し 、 ク ラ イ ア ン ト か ら の HTTP リ ク エ ス ト に 応答 し て、 ト ラ ン ザ ク シ ョ ン サーバの Enterprise JavaBeans (EJB) コ ン ポーネ ン ト の ビ ジネ ス メ ソ ッ ド を呼び出 し ます。 PowerBuilder を使用 し て作成 さ れた JSP ページは、 JavaServer Pages 仕 様のバージ ョ ン 1.2、Java Servlet 仕様のバージ ョ ン 2.3、お よ び JDK 1.3 以降を サポー ト し ます。 PowerBuilder では、 JSP 1.2 の形式を使用す る カ ス タ ム タ グ ラ イ ブ ラ リ も サポー ト し て い ま す。 JSP タ ーゲ ッ ト を Web アプ リ ケーシ ョ ン と し て EAServer、 Apache Tomcat、 ま たは コ マ ン ド 行配布機能を設定で き る 任意の JSP 1.2 サーバに配布で き ます。 Web タ ーゲ ッ ト についての詳細は、『Web タ ーゲ ッ ト と JSP タ ーゲ ッ ト での作業』 マニ ュ アルを参照 し て く だ さ い。 Web データ ウィ ン ド ウ Web デー タ ウ ィ ン ド ウ は、 Web アプ リ ケーシ ョ ン のシ ン ク ラ イ ア ン ト デー タ ウ ィ ン ド ウ の実装です。 Web デー タ ウ ィ ン ド ウ は、 ク ラ イ ア ン ト 上で PowerBuilder DLL を必要 と せずに、 PowerBuilder デー タ ウ ィ ン ド ウ のデー タ 操作、 提示、 お よ び ス ク リ プ ト 作成機能の大部分を提供 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 655 Web ア プ リ ケーシ ョ ンの作成 Web デー タ ウ ィ ン ド ウ は、 以下の よ う な、 個別の コ ン ピ ュ ー タ 上で実 行で き る い く つかの ソ フ ト ウ ェ ア コ ン ポーネ ン ト のサー ビ ス を 利用 し ます。 • アプ リ ケーシ ョ ン サーバか ト ラ ンザ ク シ ョ ン サーバで実行 さ れ る Web デー タ ウ ィ ン ド ウ サーバ コ ン ポーネ ン ト • 動的ページ サーバ • Web サーバ • Web ブ ラ ウ ザ • デー タ ベース サーバ コ ン ポーネ ン ト は非 ビ ジ ュ アル ユーザ オブ ジ ェ ク ト で あ り 、 デー タ ス ト ア を使用 し て取得 と 更新の処理を行い、 HTML を生成 し ま す。 開発者は、 PowerBuilder かカ ス タ ム コ ン ポーネ ン ト に付属の汎用 コ ン ポーネ ン ト を使用で き ます。 Web デー タ ウ ィ ン ド ウ の機能を活用す る には、 い く つかの方法があ り ます。 • Web データ ウィ ン ド ウのデザイ ン タ イ ム コ ン ト ロ ール Web タ ー ゲ ッ ト では、 Web デー タ ウ ィ ン ド ウ のデザ イ ン タ イ ム コ ン ト ロ ールを 使用 し て、 Web デー タ ウ ィ ン ド ウ コ ン ポーネ ン ト にア ク セ スす る サーバ サ イ ド ス ク リ プ ト を 作成で き ま す。 こ れは、 最 も 簡単に Web デー タ ウ ィ ン ド ウ を使用で き る 方法です。 • Web タ ーゲッ ト オブジェ ク ト モデルのコ ーディ ン グ Web タ ーゲ ッ ト では、 Web タ ーゲ ッ ト オブジ ェ ク ト モデルを使用 し て Web デー タ ウ ィ ン ド ウ の コ ン ポーネ ン ト にア ク セ スす る ためのサーバ サ イ ド ス ク リ プ ト を記述で き ます。Web タ ーゲ ッ ト オブジ ェ ク ト モデ ルには、 Web デー タ ウ ィ ン ド ウ の コ ン ポーネ ン ト の コ ー ド 作成を 容易にす る 、 定義済みオブジ ェ ク ト と メ ソ ッ ド のセ ッ ト があ り ま す。 Web デ ー タ ウ ィ ン ド ウ の コ ン ポーネ ン ト に直接ア ク セ スす る サーバ サ イ ド ス ク リ プ ト を記述で き ます。 • Web データ ウィ ン ド ウのコ ン ポーネン ト 自体のコ ーディ ン グ • 独自の HTML ジ ェ ネ レー タ の記述 PowerBuilder で 提 供 さ れ て い る サ ンプル PBL を基に し て、 アプ リ ケーシ ョ ンに必要な メ ソ ッ ド を 提供す る ユーザ独自の HTML ジ ェ ネ レー タ を作成で き ます。 Web デー タ ウ ィ ン ド ウ についての詳細は、 『デー タ ウ ィ ン ド ウ プ ロ グ ラ マーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 656 PowerBuilder 第 29 章 PowerBuilder での Web ア プ リ ケーシ ョ ン開発 データ ウィ ン ド ウ Web コ ン ト ロ ール ActiveX デー タ ウ ィ ン ド ウ Web コ ン ト ロ ール ActiveX は、 Internet Explorer で使 用で き る 完全対話形式のデー タ ウ ィ ン ド ウ コ ン ト ロ ールです。 こ の コ ン ト ロ ールは、 リ ッ チ テ キ ス ト を除 く PowerBuilder デー タ ウ ィ ン ド ウ のすべての機能を実装 し ます。 デー タ ウ ィ ン ド ウ Web コ ン ト ロ ール ActiveX は、 検索引数に よ る デー タ 検索 と デー タ 更新を サポー ト し ま す。 開発者は、 編集様式、 表示書 式、 お よ び検証規則を使用で き 、 デー タ ウ ィ ン ド ウ を操作す る ための PowerBuilder メ ソ ッ ド の大部分を利用で き ます。 フ ァ イ ル シ ス テ ムの 対話に か か わ る い く つか の関数が サ ポー ト さ れ て い な い た め、 Web ActiveX は、 ActiveX コ ン ト ロ ールの中では安全に ス ク リ プ ト 実行で き る コ ン ト ロ ール と し て分類 さ れてい ます。 デー タ ウ ィ ン ド ウ Web コ ン ト ロ ールには、 い く つかのデー タ ウ ィ ン ド ウ Web コ ン ト ロ ールで共有で き る デー タ ベー ス 接続 を 作成す る た め の、 デー タ ウ ィ ン ド ウ ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト コ ン ト ロ ール が含まれてい ます。 Web ActiveX は CAB フ ァ イ ル と し て提供 さ れ、 こ れを使っ て ク ラ イ ア ン ト ブ ラ ウ ザは コ ン ト ロ ールを イ ン ス ト ール し て登録 し ます。 ユーザ が CAB フ ァ イ ルを参照す る Web ページ を ダ ウ ン ロ ー ド す る と 、 ブ ラ ウ ザは必要であれば CAB フ ァ イ ル も ダ ウ ン ロ ー ド し 、その フ ァ イ ルを ア ンパ ッ ク し て、 コ ン ト ロ ールを登録 し ます。 デー タ ウ ィ ン ド ウ Web コ ン ト ロ ール ActiveX についての詳細は、『デー タ ウ ィ ン ド ウ プ ロ グ ラ マーズ ガ イ ド 』 マ ニ ュ アル を参照 し て く だ さ い。 データ ウィ ン ド ウ プ ラ グイ ン デー タ ウ ィ ン ド ウ プ ラ グ イ ンは、こ れま でに生成 さ れて Web サーバに 保存 さ れてい る Powersoft レ ポー ト (PSR) を表示 し ます。 PSR フ ァ イ ルがすでに生成 さ れてい る ため、 デー タ ベース ア ク セ ス は必要あ り ま せん。 こ のプ ラ グ イ ン は、 読み込み専用ア ク セ ス のみ を サポー ト し 、 ユーザは レ ポー ト の表示、 印刷、 保存は可能ですが、 修正す る こ と は で き ません。 プ ラ グ イ ンは、 Netscape Navigator をは じ め と す る Netscape プ ラ グ イ ン に対応す る ブ ラ ウ ザな ら 、ど んなブ ラ ウ ザで も 使用で き ます (Microsoft Internet Explorer 5.5 Service Pack 2 以降のバージ ョ ン では、 Netscape プ ラ グ イ ン を サポー ト し てい ません) 。 ク ラ イ ア ン ト ブ ラ ウ ザに必要な フ ァ イ ルは、 デー タ ウ ィ ン ド ウ プ ラ グ イ ンの DLL だけです。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 657 Web ア プ リ ケーシ ョ ンの作成 詳細については、 第 31 章 「デー タ ウ ィ ン ド ウ プ ラ グ イ ンの使い方」 を 参照 し て く だ さ い。 PowerBuilder ウィ ン ド ウ プ ラ グイ ン PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン は、 ク ラ イ ア ン ト ワ ー ク ス テー シ ョ ン の HTML ペ ー ジ に PowerBuilder ウ ィ ン ド ウ を 表 示 す る PowerBuilder アプ リ ケーシ ョ ン を実行 し ます。 プ ラ グ イ ンは、 Netscape Navigator を は じ め と す る Netscape プ ラ グ イ ン に対応す る ブ ラ ウ ザな ら 、 ど ん な ブ ラ ウ ザで も 使用で き ま す (Microsoft Internet Explorer 5.5 Service Pack 2 以降のバージ ョ ン では、 Netscape プ ラ グ イ ン を サポー ト し てい ません) 。 プ ラ グ イ ンのセキ ュ リ テ ィ バージ ョ ン を使 う と 、 イ ン タ ーネ ッ ト を 介 し て ダ ウ ン ロ ー ド さ れ る PowerBuilder ア プ リ ケ ー シ ョ ン が ク ラ イ ア ン ト シ ス テ ム を損傷 し た り 、 ク ラ イ ア ン ト ワー ク ス テーシ ョ ン上の情報にア ク セ スす る と い っ た こ と が防止 さ れ ます。 アプ リ ケーシ ョ ン が子 ウ ィ ン ド ウ か ら 起動 さ れ る 場合は、 ウ ィ ン ド ウ プ ラ グ イ ン内のアプ リ ケーシ ョ ン でほ と ん ど の PowerBuilder 機能を実 行で き ます。 アプ リ ケーシ ョ ンは、 任意の PowerBuilder ウ ィ ン ド ウ の 実行、 情報の表示、 入力デー タ の受け付け、 デー タ ベー ス の更新を行 い ま す。 デー タ ベー ス への ア ク セ ス は、 ク ラ イ ア ン ト ワ ー ク ス テー シ ョ ン上で ク ラ イ ア ン ト がデー タ ベース に接続す る こ と で開始 さ れ ま す。 プ ラ グ イ ンの最大の弱点は、 フ ァ ッ ト ク ラ イ ア ン ト を必要 と す る こ と です。 フ ァ ッ ト ク ラ イ ア ン ト は、 PowerBuilder ラ ン タ イ ム DLL か共有 ラ イ ブ ラ リ と 、PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン DLL か共有 ラ イ ブ ラ リ を必要 と す る ブ ラ ウ ザ ク ラ イ ア ン ト です。 詳細については、 第 32 章 「PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン の使い 方」 を参照 し て く だ さ い。 658 PowerBuilder 第 29 章 PowerBuilder での Web ア プ リ ケーシ ョ ン開発 PowerBuilder ウィ ン ド ウ ActiveX PowerBuilder ウ ィ ン ド ウ ActiveX は、ActiveX を サポー ト す る Web ブ ラ ウ ザ を 使用す る と き に、 HTML ペー ジ 内 で の グ ラ フ ィ カ ル イ ン タ フ ェース を提供 し ます。 ま た、 ウ ィ ン ド ウ と デー タ ウ ィ ン ド ウ プ ラ グ イ ンの全機能のほかに、 JavaScript や VBScript を使っ て、 PowerBuilder の子 ウ ィ ン ド ウ の イ ベン ト と 関数のサブセ ッ ト にア ク セ スす る ための 機能を提供 し ます。 こ の中には、 ウ ィ ン ド ウ ActiveX コ ン ト ロ ールに あ る 子 ウ ィ ン ド ウ の関数 と イ ベン ト を呼び出すための メ ソ ッ ド が含ま れ ます。 アプ リ ケーシ ョ ンが子 ウ ィ ン ド ウ か ら 起動 さ れ る 場合は、PowerBuilder ウ ィ ン ド ウ ActiveX 内のアプ リ ケーシ ョ ン でほ と ん ど の PowerBuilder 機能を実行で き ます。 アプ リ ケーシ ョ ンは、 任意の PowerBuilder ウ ィ ン ド ウ の実行、 情報の表示、 入力デー タ の受け付け、 デー タ ベー ス の 更新を行い ます。 デー タ ベースへのア ク セ ス は、 ク ラ イ ア ン ト ワー ク ス テーシ ョ ン上で ク ラ イ ア ン ト がデー タ ベー ス に接続す る こ と で開始 さ れ ます。 ウ ィ ン ド ウ プ ラ グ イ ン と 同様、 ウ ィ ン ド ウ ActiveX の最大の弱点は、 フ ァ ッ ト ク ラ イ ア ン ト を必要 と す る こ と です。フ ァ ッ ト ク ラ イ ア ン ト は、 PowerBuilder ラ ン タ イ ム DLL と PowerBuilder ウ ィ ン ド ウ ActiveX を必要 と す る ブ ラ ウ ザ ク ラ イ ア ン ト です。 詳細については、第 33 章 「PowerBuilder ウ ィ ン ド ウ ActiveX の使い方」 を参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 659 Web ア プ リ ケーシ ョ ンの作成 660 PowerBuilder 第 3 0 章 Web サービ ス ク ラ イ ア ン ト の構築 こ の章について こ の章では、 PowerBuilder アプ リ ケーシ ョ ン で Web サービ ス を使 用す る 方法について説明 し ます。 こ の章で説明す る オブジ ェ ク ト の関連情報については、『PowerBuilder エ ク ス テ ン シ ョ ン リ フ ァ レ ン ス』 マニ ュ アルお よ びオ ン ラ イ ン ヘルプ を参照 し て く だ さ い。 内容 項目 Web サービ ス について PBSoapClient90J.pbd を ラ イ ブ ラ リ 探索パ ス に追加す る Web サービ ス プ ロ キシ オブジ ェ ク ト の生成 SOAP サーバへの接続 Web サービ ス メ ソ ッ ド の起動 Web サービ ス の作成 例外処理 ページ 661 663 664 666 668 668 669 Web サービ スについて Web サービ ス は、 イ ン タ ーネ ッ ト テ ク ノ ロ ジ を活用 し て分散 ソ フ ト ウ ェ ア コ ン ポーネ ン ト が自動で相互にや り と り す る サービ ス と し て大ま かに定義 さ れ ます。 こ れ ら の ソ フ ト ウ ェ ア コ ン ポーネ ン ト は、 た と えば、 株価を取得 し た り 、 イ ン タ ーネ ッ ト 上で商品カ タ ロ グの在庫を検索 し た り 、 航空券やレ ン タ カーの予約サービ ス を 統合す る よ う な ビ ジ ネ ス ロ ジ ッ ク を 実行 し ま す。 ア プ リ ケー シ ョ ン用の コ ン ポーネ ン ト を作成 し な く て も 、 イ ン タ ーネ ッ ト 越 し に既存の コ ン ポーネ ン ト を使用で き ます。 Web サービ ス は、 Simple Object Access Protocol (SOAP) が登場 し た と き に生 ま れた も のです。 SOAP は Extensible Markup Language (XML) を利用 し 、通常は、 ト ラ ン ス ポー ト と し て Hypertext Transfer Protocol (HTTP) を使用 し ます。 SOAP を介 し て Web サービ ス を 起動す る には、 デー タ 型のシ リ ア ラ イ ズ と デシ リ ア ラ イ ズ、 お よ び SOAP メ ッ セージの構築 と 解析が必要です。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 661 Web サービ スについて Web サービ ス の利点の 1 つ と し て、 Web Services Description Language (WSDL) を使用 し てサービ ス を その中に記述で き る と い う こ と があ り ます。 WSDL は、 XML 文法を使用 し 、 メ ッ セージ を交換で き る 通信エ ン ド ポ イ ン ト の集ま り と し て Web サービ ス を定義 し ます。 WSDL サー ビ ス 定義は、 分散シ ス テ ム を ド キ ュ メ ン ト 化 し 、 アプ リ ケーシ ョ ン通 信に関連す る 細部を自動化す る 方法を示す役割を し ます。 Sybase の EAServer と Web サービ ス ・ ツールキ ッ ト を使用す る こ と に よ り 、 こ れ ら の 記 述 を ア プ リ ケ ー シ ョ ン に 組 み 込 み、 Universal Description, Discovery, and Integration (UDDI) を使用す る Web サ イ ト に 登録す る こ と がで き ます。 使用 し てい る ブ ラ ウ ザを使っ て UDDI レ ジ ス ト リ サ イ ト にア ク セ ス し 、 開発中のアプ リ ケーシ ョ ン に必要なサー ビ ス を検索で き ます。 SOAP、 WSDL、 お よ び UDDI に よ り 、 ア プ リ ケーシ ョ ン 間の イ ン タ フ ェ ー ス が、 異な る プ ラ ッ ト フ ォ ーム間で標準化 さ れ る ため、 サー ド パーテ ィ の コ ン ポーネ ン ト を簡単に使用で き る よ う にな り ます。 PowerBuilder は以下の Web サービ ス規格をサポー ト し てい ます。 • SOAP 1.1 • WSDL 1.1 • HTTP ま たは HTTPS PowerScript タ ーゲ ッ ト ま たは JSP タ ーゲ ッ ト か ら Web サービ ス に ア ク セ ス で き ます。PowerBuilder で作成 し た JSP アプ リ ケーシ ョ ン で Web サービ ス に ア ク セ ス す る 方法の詳細については、 『Web タ ーゲ ッ ト と JSP タ ーゲ ッ ト での作業』 マニ ュ アルの JSP タ ーゲ ッ ト に関す る 章、 ま たはオ ン ラ イ ン ヘルプの JSP ページのオーサ リ ン グに関す る ト ピ ッ ク を参照 し て く だ さ い。 UDDI のサポー ト PowerBuilder 9.0 は UDDI を使用 し ません。 WSDL フ ァ イ ルを生成 し 発 行す る には、 Sybase の EAServer と Web サービ ス ・ ツールキ ッ ト を使 用 し ます。 662 PowerBuilder 第 30 章 Web サービ ス ク ラ イ ア ン ト の構築 Web サービ ス ク ラ イ ア ン ト の構築について PowerBuilder ア プ リ ケーシ ョ ン は、 イ ン タ ーネ ッ ト 経由で ア ク セ ス さ れ る Web サービ ス を利用す る ク ラ イ ア ン ト と し て機能 し ます。 SOAP と WSDL を利用す る と 、 1 つのエ ン テ ィ テ ィ と し て リ モー ト で発行 さ れた関数の コ レ ク シ ョ ン を PowerBuilder アプ リ ケーシ ョ ンに含め る こ と がで き ます。 Web サービ ス は、 アプ リ ケーシ ョ ン ま たはほかの Web サービ ス か ら 送信 さ れた リ ク エ ス ト を受信 し て応答 し ます。 PBSoapClient90J.pbd と PBSoapClient90J.dll SOAP を介 し て Web サービ ス を起動す る には、 デー タ 型のシ リ ア ラ イ ズ と デシ リ ア ラ イ ズ、 お よ び XML ベー ス の SOAP メ ッ セージの構築 と 解析が必要です。 PBSoapClient90J.pbd と PBSoapClient90J.dll を使用 す る と 、Web サービ ス ク ラ イ ア ン ト プ ロ キ シが こ れ ら の タ ス ク を かわ り に実行 し て く れ る ので、 SOAP 仕様やその ス キーマ、 XML ス キーマ 仕様、 ま たは WSDL 仕様 と その ス キーマに関す る 詳 し い知識がな く て も Web サービ ス を利用で き ます。 PBSoapClient90J.pbd を ラ イ ブ ラ リ 探索パスに追加する PowerBuilder を イ ン ス ト ールす る と 、 PBSoapClient90J.dll フ ァ イ ル と PBSoapClient90J.pbd フ ァ イ ルが Shared¥PowerBuilder デ ィ レ ク ト リ に イ ン ス ト ール さ れ ます。Web サービ ス ク ラ イ ア ン ト アプ リ ケーシ ョ ン を作成す る 際に、PBSoapClient90J.dll を別の場所に コ ピーす る 必要はあ り ませんが、 そのアプ リ ケーシ ョ ン の探索パ ス 上のデ ィ レ ク ト リ に ク ラ イ ア ン ト 実行フ ァ イ ル と と も に配布す る 必要があ り ます。 PBSoapClient90J.pbd を アプ リ ケーシ ョ ン探索パ ス に追加す る には、 シ ス テ ム ツ リ ー内の ク ラ イ ア ン ト タ ーゲ ッ ト を右 ク リ ッ ク し 、 ポ ッ プ ア ッ プ メ ニ ュ ーか ら [プ ロ パテ ィ ] を選択 し ます。Shared¥PowerBuilder デ ィ レ ク ト リ に移動 し 、 [フ ァ イ ルの種類] ド ロ ッ プダ ウ ン リ ス ト か ら 「*.pbd」 を選択 し 、 「 PBSoapClient90J.pbd」 を選択 し ます。 PBSoapClient90J.pbd を追加 し た ら 、 以下のオブジ ェ ク ト がシ ス テ ム ツ リ ーに表示 さ れ ます。 オブ ジ ェ ク ト soapconnection soapexception ア プ リ ケーシ ョ ン テ ク ニ ッ ク 説明 SOAP サーバ と の接続に使用 さ れ る soapconnection か ら 送出 さ れた例外の捕捉に使 用される 663 Web サービ ス プ ロキシ オブ ジ ェ ク ト の生成 Web サービ ス プ ロキシ オブ ジ ェ ク ト の生成 Web サービ ス プ ロキ シ プ ロ ジ ェ ク ト の使 用 Web サービ ス プ ロ キ シ を新 し く 作成す る には、 新規作成 ダ イ ア ロ グ ボ ッ ク ス の [プ ロ ジ ェ ク ト ] ページか ら [Web サービ ス プ ロ キ シ ウ ィ ザー ド ] ア イ コ ン を選択 し ます。 Web サービ ス プ ロ キ シ ウ ィ ザー ド で プ ロ キ シ を作成す る こ と に よ り 、PowerScript で Web サービ ス を使用で き る よ う にな り ます。 各ポー ト に対 し て 1 つのプ ロ キ シが作成 さ れま す。 ウ ィ ザー ド で以下の指定を行い ます。 • ア ク セ スす る WSDL フ ァ イ ル • 選択す る WSDL フ ァ イ ル内のサービ ス • 使用す る 1 つま たは複数のポー ト • ポー ト 名に付 く 接頭辞 (プ ロ キ シ名にな る ) • プ ロ キ シ を配布す る PowerBuilder ラ イ ブ ラ リ 新規作成 ダ イ ア ロ グ ボ ッ ク ス の [プ ロ ジ ェ ク ト ] ペー ジ か ら [Web サービ ス プ ロ キ シ] ア イ コ ン を選択す る こ と も で き ま す。 [Web サー ビ ス プ ロ キ シ] ア イ コ ン を選択す る と 、 Web サービ ス のプ ロ ジ ェ ク ト ペ イ ン タ が開 き ます。 こ こ か ら プ ロ ジ ェ ク ト を作成 し 、 オプシ ョ ン を 指定 し 、 プ ロ キ シ ラ イ ブ ラ リ を構築で き ま す。 新規プ ロ ジ ェ ク ト は、 Web サービ ス と 、 プ ロ キ シが生成 さ れ る ポー ト を一覧に し 、 生成 さ れ る プ ロ キ シ オブ ジ ェ ク ト を 格納す る 出力 ラ イ ブ ラ リ の名前 を 指定 し ます。 Web サー ビ ス プ ロ ジ ェ ク ト の作成に ウ ィ ザー ド を使用 し た場合で も ペ イ ン タ を使用 し た場合で も 、 最後の ス テ ッ プ と し て、 ペ イ ン タ バー の [配布] ア イ コ ン を ク リ ッ ク す る か、 メ ニ ュ ー バーか ら [デザ イ ン |プ ロ ジ ェ ク ト の配布] を選択 し て、 プ ロ キ シ オブジ ェ ク ト を構築 し ます。 664 PowerBuilder 第 30 章 Web サービ ス ク ラ イ ア ン ト の構築 生成 さ れたプ ロキシ 生成 さ れたプ ロ キ シはシ ス テ ム ツ リ ーに表示 さ れ ます。プ ロ キ シ ノ ー ド を拡張す る と 、 メ ソ ッ ド のシ グネチ ャ を表示で き ます。 XML メ ソ ッ ド のエ リ アス PowerBuilder は大文字 と 小文字を区別 し ませんが、 XML と SOAP は大 文字 と 小文字を区別 し ます。そ こ で、PowerScript コ ー ド が XML メ ソ ッ ド を正 し く 呼び出せ る よ う に、 プ ロ キ シの各 メ ソ ッ ド はエ リ ア ス を使 用 し ます。 alias for の後に、 対応す る XML メ ソ ッ ド ま たは SOAP メ ソ ッ ド の名前 と シ グネチ ャ が大文字小文字を区別 し て入 り ます。 た と えば、 次の よ う にな り ます。 function real getquote(string ticker) alias for getQuote(xsd:string symbol)# return xsd:float StockPrice@urn:xmethods-delayedquotes@SoapAction デー タ 型マ ッ ピ ング Web サービ ス プロ キシ ジェ ネレ ータ によ り 、XML と PowerBuilder 間で デー タ 型のマ ッ ピ ン グが行われます。 XML のデー タ 型はすべて スキー マ www.w3.org/1999/XMLSchema と スキーマ www.w3.org/2001/XMLSchema に基づいてい ます。 マ ッ ピ ン グは次の表の と お り に行われ ます。 XML のデー タ 型 boolean byte (-128 ~ 127) unsignedByte (0 ~ 255) short ア プ リ ケーシ ョ ン テ ク ニ ッ ク PowerBuilder のデー タ 型 boolean int uint int 665 SOAP サーバへの接続 XML のデー タ 型 unsignedShort int unsignedInt long (-9223372036854775808 ~ 9223372036854775807) 配列の配列 PowerBuilder のデー タ 型 uint long ulong longlong unsignedLong (0 ~ 9223372036854775807) integer (-9223372036854775808 ~ 9223372036854775807) longlong longlong decimal (-999999999999999999 ~ 999999999999999999) decimal float real double string date time dateTime base64 base64Binary hexBinary double string date time datetime blob blob blob PowerBuilder は、 XML と は異な り 、 可変長一次元配列のみサポー ト し ます。WSDL フ ァ イ ルの配列が固定長の一次元であ る場合、PowerBuilder は自動的に こ れを可変長配列に変換 し ます。 WSDL フ ァ イ ルの配列が 多次元配列の場合、 戻 り 値の型は無効にな り 、 使用で き ません。 関数プ ロ ト タ イ プで、PowerBuilder は配列型を PowerBuilder any 型 と し て表示 し ます。 戻 り 値を保持す る 適切な型の配列を宣言す る こ と が必 要です。 SOAP サーバへの接続 ア ク セ スす る Web サービ ス のホ ス ト であ る SOAP サーバに接続す る に は SoapConnection ク ラ ス を使用 し ます。 SoapConnection オブジ ェ ク ト の SetOptions メ ソ ッ ド を使用 し て、HTTPS 接続のユーザ ID やパ ス ワ ー ド な ど のオプシ ョ ン を設定で き ます。 Web サービ ス にア ク セ スす る ク ラ イ ア ン ト プ ロ キ シ イ ン ス タ ン ス を作成す る には、 CreateInstance メ ソ ッ ド を使用 し ます。 666 PowerBuilder 第 30 章 Web サービ ス ク ラ イ ア ン ト の構築 例 以下の ス ク リ プ ト に よ り 、 SOAP サーバ上の Web サービ スへの接続が 作成 さ れ ます。 CreateInstance メ ソ ッ ド で定義 さ れ る エ ン ド ポ イ ン ト を 使 用 し て、 接 続 プ ロ パ テ ィ が 設 定 さ れ ま す。 エ ン ド ポ イ ン ト が CreateInstance メ ソ ッ ド で定義 さ れない場合、 プ ロ キ シに格納 さ れてい る デフ ォ ル ト URL が使用 さ れ ま す。 こ の ス ク リ プ ト では、 SetOptions メ ソ ッ ド に よ り 、 ロ グ フ ァ イ ルが指定 さ れて い ま す。 戻 り 値が メ ッ セージ ボ ッ ク ス に表示 さ れます。 SoapConnection conn // SoapConnection を定義 し ます。 syb_currencyexchangeport proxy_obj // プ ロキシ を宣言 し ま す。 long rVal, lLog real amount // エ ン ド ポ イ ン ト を定義 し ます。 プ ロキシ内のデ フ ォル ト エ ン ド // ポ イ ン ト を使用する場合は、 省略で き ます。 string str_endpoint str_endpoint = "http://services.xmethods.net:80/soap" conn = create SoapConnection // 接続のイ ン ス タ ン ス化 lLog = conn.SetOptions("SoapLog=~"C:¥mySoapLog.log~"") // SOAP のデー タ 交換を記録する ト レース フ ァ イルを設定 し ます。 // string を "" にする と 、 こ の機能は無効にな り ます。 rVal = Conn.CreateInstance(proxy_obj, & "syb_currencyexchangeport", str_endpoint) // プ ロキシ オブ ジ ェ ク ト の作成 try amount = proxy_obj.getrate("us","japan") // サービ スの起動 messagebox(" 現在の為替レー ト ", "1 US ド ル "& + " = " + string(amount) + " 日本円 ") catch ( SoapException e ) messagebox (" エ ラ ー ", "Web サービ ス を起動で き ません。 ") // エ ラ ー処理 end try destroy conn ア プ リ ケーシ ョ ン テ ク ニ ッ ク 667 Web サービ ス メ ソ ッ ド の起動 Web サービ ス メ ソ ッ ド の起動 SoapConnection を使っ て、Soap_proxy オブジ ェ ク ト が作成 さ れ、SetOptions メ ソ ッ ド で設定 し た SOAP 接続オプシ ョ ンが使用 さ れます。 Web サー ビ ス のプ ロ キ シ オブ ジ ェ ク ト が作成 さ れ る と 、 ク ラ イ ア ン ト ア プ リ ケーシ ョ ンは、 その Web サービ ス にア ク セ ス で き る よ う にな り ます。 Web サービ ス メ ソ ッ ド を起動す る には、プ ロ キ シ オブジ ェ ク ト に以下 の情報を含め る こ と が必要です。 • サービ ス のエ ン ド ポ イ ン ト 。 WSDL フ ァ イ ルか ら 取得 • SOAP メ ソ ッ ド 呼び出 し で使用 さ れ る 名前空間定義 • 構造体定義 (必要な場合) • 戻 さ れ る 各構造体配列の イ ン ス タ ン ス 変数。 戻 さ れ る 配列がすべ て any 型であ る ため • 1 つ以上の SOAP メ ソ ッ ド と 、 対応す る エ リ ア ス文字列 Web サービ スの作成 PowerBuilder には、 カ ス タ ム ク ラ ス (非ビ ジ ュ アル) ユーザ オブジ ェ ク ト を開発 し て、 それ ら を EAServer コ ン ポーネ ン ト と し て配布す る た めの ツールがあ り ます。 コ ン ポーネ ン ト は、 Windows お よ び UNIX オ ペレーテ ィ ン グ シ ス テ ム上で動作 し てい る EAServer に配布で き ます。 Jaguar Manager を使用 し て、コ ン ポーネ ン ト に対 し て Java Beans を生成 し ます。 EAServer の Web サービ ス ・ ツールキ ッ ト を使っ て、 Web サービ ス と そ の場所を記述 し て、EAServer コ ン ポーネ ン ト の WSDL フ ァ イ ルを生成 で き ま す。 こ こ で も 、 Web サー ビ ス に対 し て、 ク ラ イ ア ン ト ア プ リ ケーシ ョ ンにア ク セ ス で き る ク ラ イ ア ン ト プ ロ キ シ を作成 し ます。 ク ラ イ ア ン ト プ ロ キ シは、 Web サービ ス や EAServer コ ン ポーネ ン ト を 記述す る WSDL ド キ ュ メ ン ト を使用 し ます。 こ れで、 ク ラ イ ア ン ト ア プ リ ケーシ ョ ンは Web サービ ス を使用で き る よ う にな り ます。 詳細に ついては、 『EAServer プ ロ グ ラ マーズ ・ ガ イ ド 』 マニ ュ アル と EAServer の 『Web サービ ス ・ ツールキ ッ ト ・ ユーザーズ ・ ガ イ ド 』 マニ ュ アル を参照 し て く だ さ い。 668 PowerBuilder 第 30 章 Web サービ ス ク ラ イ ア ン ト の構築 例外処理 Web サー ビ ス の メ ソ ッ ド の実行時に発生す る エ ラ ーは SoapException オ ブ ジ ェ ク ト に変換 さ れ、 呼び出 し た ス ク リ プ ト に送出 さ れ ま す。 PBSoapClient90J.dll に含ま れ る すべての ク ラ ス の メ ソ ッ ド も 、サーバへ の接続が失敗 し た と き や Web サー ビ ス が検索 さ れな か っ た り 作成で き なか っ た と き な ど に、 SoapException オブジ ェ ク ト を送出で き ます。 例外の捕捉 ク ラ イ ア ン ト アプ リ ケーシ ョ ンは、 さ ま ざ ま な方法で通信エ ラ ーを処 理で き ます。 た と えば、 ク ラ イ ア ン ト がサーバに接続 し 、 オブジ ェ ク ト の メ ソ ッ ド を呼び出そ う と し た と き にそのオブジ ェ ク ト が存在 し な か っ た場合は、 サーバ と の接続を解除 し 、 別のサーバに接続 し て操作 を再試行す る 方法があ り ます。あ る いは、ク ラ イ ア ン ト はユーザに メ ッ セージ を表示 し て、 次に起 こ る こ と を制御す る 機会を ユーザに与え る 方法 も あ り ます。 エ ラ ー発生時に ク ラ イ ア ン ト が操作の再開のために新 し いサーバに接 続 し てい る 場合、 新 し いサーバ上で リ モー ト オブジ ェ ク ト を イ ン ス タ ン ス化 し てか ら 、 リ モー ト オブジ ェ ク ト の メ ソ ッ ド を呼び出す必要が あ り ます。 処理 さ れない例外 例外ハン ド ラ がない場合、 ま たは既存の例外ハン ド ラ がその例外を処 理 し ない場合、 アプ リ ケーシ ョ ン オブジ ェ ク ト の SystemError イ ベン ト が実行 さ れ ます。 SystemError イ ベン ト に ス ク リ プ ト が記述 さ れてい ない場合は、 アプ リ ケーシ ョ ン エ ラ ーが起 き て、 アプ リ ケーシ ョ ンは 終了 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 669 例外処理 670 PowerBuilder 第 3 1 章 デー タ ウ ィ ン ド ウ プ ラ グ イ ンの 使い方 こ の章について こ の章では、デー タ ウ ィ ン ド ウ プ ラ グ イ ン を使用 し て Powersoft レ ポー ト (PSR) を開発 し て Web ページに配布す る 方法について説 明 し ます。 内容 は じ めに 項目 デー タ ウ ィ ン ド ウ プ ラ グ イ ンについて Powersoft レ ポー ト (PSR) の保存 HTML ページの作成 Web サーバの設定 ユーザの ワー ク ス テーシ ョ ンの設定 ページ 671 675 676 677 679 こ の章では、HTML と URL について、お よ び Web ブ ラ ウ ザが Web サーバか ら ペー ジ を ど の よ う に取得す る か につい て の知識 を 有 し 、 Web サーバにア ク セ ス 可能な環境で あ る こ と を前提に し てい ます。 デー タ ウ ィ ン ド ウ プ ラ グ イ ンについて デー タ ウ ィ ン ド ウ プ ラ グ イ ン を使用す る と 、 Netscape プ ラ グ イ ン を サポー ト す る ブ ラ ウ ザで表示 さ れ る Powersoft レ ポー ト (PSR) を Web ページに表示で き ます。 PSR フ ァ イ ルには、 レ ポー ト の定義 ( ソ ース と オブジ ェ ク ト ) お よ び PSR フ ァ イ ル作成時のデー タ が含ま れます。 PSR フ ァ イ ルを 作成す る と その中にデー タ が保存 さ れ る ので、 PSR フ ァ イ ルでは デー タ ベー ス 接続は必要はあ り ま せん。 ただ し 、 デー タ は静的な ので更新で き ません。 サポー ト さ れる ブ ラ ウザ ア プ リ ケーシ ョ ン テ ク ニ ッ ク デー タ ウ ィ ン ド ウ プ ラ グ イ ン を使用す る には、 Netscape プ ラ グ イ ン をサポー ト す る Web ブ ラ ウ ザを使 う 必要があ り ます。た と えば、 Netscape ブ ラ ウ ザ、 Microsoft Internet Explorer バージ ョ ン 3 ~ 5.5 Service Pack 1 です。 671 デー タ ウ ィ ン ド ウ プ ラ グ イ ン について Microsoft Internet Explorer 5.5 Service Pack 2 以 降 の バ ー ジ ョ ン は、 Netscape プラ グイ ン を サポート し ていま せん。Enterprise 版の PowerBuilder を使 う 場合、 ActiveX のデー タ ウ ィ ン ド ウ Web コ ン ト ロ ールを使用 し て Internet Explorer に PSR を表示で き ます。 詳細については、 『デー タ ウ ィ ン ド ウ プ ロ グ ラ マーズガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 セキ ュ リ テ ィ デー タ ウ ィ ン ド ウ プ ラ グ イ ン にはセ キ ュ リ テ ィ 上の問題は あ り ま せ ん。 ロ ーカル アプ リ ケーシ ョ ン を実行す る こ と も あ り ま せん。 ま た、 ユーザが レ ポー ト を ロ ーカルに保存す る よ う に明示的に選択 し ない限 り 、 ロ ーカル フ ァ イ ルへの書 き 込み も 行い ません。 デー タ ウ ィ ン ド ウ プ ラ グ イ ンは PSR フ ァ イ ル し か表示 し ません。 PSR フ ァ イ ルは読み込み専用です。 し たが っ て、 セキ ュ リ テ ィ バージ ョ ン のデー タ ウ ィ ン ド ウ プ ラ グ イ ンは不要です。 制約 PSR は リ ッ チテ キ ス ト 提示様式にはで き ません。 データ ウィ ン ド ウ プ ラ グイ ン の機能 デー タ ウ ィ ン ド ウ プ ラ グ イ ンは、 レ ポー ト ペ イ ン タ 、 デー タ ウ ィ ン ド ウ ペ イ ン タ 、 デー タ ウ ィ ン ド ウ コ ン ト ロ ール、 ま たはデー タ ス ト アで プ レ ビ ュ ーお よ び保存 さ れた と き のデー タ と 書式を持つ PSR を表示 し ます。 PSR は、 回転文字、 色付 き 文字、 影付け、 チ ェ ッ ク ボ ッ ク ス 編 集様式や ラ ジオボ タ ン編集様式な ど、 デー タ ウ ィ ン ド ウ オブジ ェ ク ト ま たは レ ポー ト オブジ ェ ク ト のすべての書式を表示 し ます。 デー タ は レ ポー ト であ り 、 デー タ 入力やデー タ ベース ア ク セ ス はあ り ません。 Web ブ ラ ウ ザのポ ッ プア ッ プ メ ニ ュ ーを使用 し て、 ク ラ イ ア ン ト は レ ポー ト を い く つかの形式で印刷ま たは保存で き ます。 レ ポー ト を ロ ー カル PSR フ ァ イ ル と し て保存すれば、 デー タ の検索、 フ ィ ル タ 、 お よ び ソ ー ト のための ツールが揃っ てい る InfoMaker で表示で き ます。デー タ ウ ィ ン ド ウ プ ラ グ イ ンは Netscape プ ラ グ イ ン API を実装 し ます。 デー タ ウ ィ ン ド ウ プ ラ グ イ ン を使用す る には、 こ の API を サポー ト す る ブ ラ ウ ザが必要です。 詳細については、 671 ページの 「サポー ト さ れ る ブ ラ ウ ザ」 を参照 し て く だ さ い。 ク ラ イ ア ン ト と サーバ の対話の詳細 672 表 31-1 に、 デー タ ウ ィ ン ド ウ プ ラ グ イ ン を含む HTML ド キ ュ メ ン ト を ユーザが表示す る 際に、 ク ラ イ ア ン ト と サーバ間で行われ る 処理に ついて詳 し く 示 し ます。 PowerBuilder 第 31 章 デー タ ウ ィ ン ド ウ プ ラ グ イ ンの使い方 表 31-1: デー タ ウ ィ ン ド ウ プ ラ グ イ ンの ク ラ イ ア ン ト / サーバ間 ト ラ ンザク ション 手順 1 ク ラ イ ア ン ト の動作 Web ブ ラ ウ ザがサーバに HTML ド キ ュ メ ン ト を要求する 2 ブ ラ ウ ザは MIME の種類を受 信 し 、 HTML ド キ ュ メ ン ト を受 信する 準備をする ブ ラ ウ ザは HTML ド キ ュ メ ン ト を受信 し 、 それを表示する ブ ラ ウ ザは Embed 要素を認識 し 、 ページ上にプ ラ グ イ ンのた めの領域を確保 し 、 PSR フ ァ イ ルをサーバに要求する ブ ラ ウ ザは MIME の種類を受 信 し 、 PSR フ ァ イ ルを受信する 準備をする Web ブ ラ ウ ザは PSR フ ァ イ ル を受信する ブ ラ ウ ザはそのプ ラ グ イ ン デ ィ レ ク ト リ で、 MIME の種類 (application/data window) に対 応する DLL を検索する Web ブ ラ ウ ザはプ ラ グ イ ン DLL を ロ ー ド し 、 PSR フ ァ イ ルを表示する 3 4 5 6 7 8 サーバの応答 サーバは ド キ ュ メ ン ト の MIME の種類 (text/html) を識別する ヘ ッ ダ を送信する サーバは HTML ド キ ュ メ ン ト を 送信する — サーバは、 PSR の MIME の種類 (application/datawindow) を識別 する ヘ ッ ダ を送信する サーバは PSR フ ァ イ ルを送信す る — — — 要件 デー タ ウ ィ ン ド ウ プ ラ グ イ ン を 含むページ を 参照す る 各 ク ラ イ ア ン ト では、 ロ ーカル マシ ン に イ ン ス ト ール し たデー タ ウ ィ ン ド ウ プ ラ グ イ ン DLL が必要です。 名前 と 位置 デー タ ウ ィ ン ド ウ プ ラ グ イ ンの名前は、 NPDWE90J.DLL です。 PowerBuilder は、 こ の DLL を PowerBuilder 9.0¥Internet Tools¥Plugins デ ィ レ ク ト リ に イ ン ス ト ール し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 673 デー タ ウ ィ ン ド ウ プ ラ グ イ ン について データ ウィ ン ド ウ プ ラ グイ ン のイ ン ス ト ールと 設定 PowerBuilder の イ ン ス ト ール時に標準セ ッ ト ア ッ プ を 選択 し た場合、 デー タ ウ ィ ン ド ウ プ ラ グ イ ン は コ ン ピ ュ ー タ に イ ン ス ト ール さ れ ま せん。 プ ラ グ イ ン を イ ン ス ト ールす る には、 PowerBuilder の カ ス タ ム イ ン ス ト ールを実行 し 、 [ コ ン ポーネ ン ト の選択] ページで [Web プ ラ グ イ ン] チ ェ ッ ク ボ ッ ク ス を オ ン に し ます。 イ ン ス ト ールす る プ ラ グ イ ン と コ ン ト ロ ールを選択す る には、 そのページの [変更] ボ タ ン を ク リ ッ ク し ます。 こ の節では、 プ ラ グ イ ン の イ ン ス ト ール後に行 う 必 要があ る 設定作業について説明 し ます。 デー タ ウ ィ ン ド ウ プ ラ グ イ ンは、 PowerBuilder 9.0¥Internet Tools¥Plugins デ ィ レ ク ト リ に イ ン ス ト ール さ れます。 Netscape が イ ン ス ト ール済みの場合は、 PowerBuilder イ ン ス ト ール プ ロ グ ラ ムに よ っ てプ ラ グ イ ン の コ ピーが Web ブ ラ ウ ザの Plugins デ ィ レ ク ト リ に イ ン ス ト ール さ れ る 場合 も あ り ます。 イ ン ス ト ール先 ブ ラ ウ ザが イ ン ス ト ール さ れていない場合、 ま たは イ ン ス ト ール プ ロ グ ラ ム がブ ラ ウ ザ を見つけ ら れなか っ た場合には、 Netscape を イ ン ス ト ール し て、 プ ラ グ イ ン を ブ ラ ウ ザのプ ラ グ イ ン デ ィ レ ク ト リ に コ ピーす る か移動 し なければな り ません。 Microsoft Internet Explorer の現 行バージ ョ ンは、 プ ラ グ イ ン を サポー ト し てい ません。 データ ウィ ン ド ウ プ ラ グイ ン の開発と 配布 実行方法 デー タ ウ ィ ン ド ウ プ ラ グ イ ンの中に PSR を表示す る ためには、 4 つの 主な作業があ り ます。 ❖ 結果の コ ンポーネ ン ト 674 デー タ ウ ィ ン ド ウ プ ラ グ イ ンの中に PSR を表示するには 1 PSR フ ァ イ ルを保存 し ます。 2 デー タ ウ ィ ン ド ウ プ ラ グ イ ン を埋め込む HTML ページ を作成 し ます。 3 内容の種類 (MIME の種類) を登録 し 、 HTML ページ と PSR フ ァ イ ルを所定のデ ィ レ ク ト リ に コ ピー し て、 Web サーバ を構成 し ま す。 4 すべての ク ラ イ ア ン ト ワー ク ス テーシ ョ ン上にデー タ ウ ィ ン ド ウ プ ラ グ イ ン DLL を イ ン ス ト ール し ます。 セ ッ ト ア ッ プがすべて終了す る と 、 表 31-2 に示す コ ン ポーネ ン ト が サーバお よ び ク ラ イ ア ン ト コ ン ピ ュ ー タ に設定 さ れ ます。 PowerBuilder 第 31 章 デー タ ウ ィ ン ド ウ プ ラ グ イ ンの使い方 表 31-2: データ ウィ ン ド ウ プ ラ グイ ン 用のサーバと ク ラ イ アン ト の環境設定 コ ンピ ュータ サーバ ク ラ イ アン ト 次の作業 コ ンポーネ ン ト MIME の種類 application/datawindow が拡張子 PS で登録 さ れてい る HTML ページに PSR の Embed 要素があ る PSR フ ァ イ ル ブ ラ ウ ザのプ ラ グ イ ン デ ィ レ ク ト リ 内のデー タ ウ ィ ン ド ウ プ ラ グ イ ン DLL こ の章では、 以降、 デー タ ウ ィ ン ド ウ プ ラ グ イ ンに PSR を表示す る た めの以下の 4 つの手順について説明 し ます。 • Powersoft レ ポー ト (PSR) の保存 • HTML ページの作成 • Web サーバの設定 • ユーザの ワー ク ス テーシ ョ ン の設定 Powersoft レ ポー ト (PSR) の保存 PSR フ ァ イ ルを作成す る には、 い く つかの方法があ り ます。 PSR フ ァ イルの作成 ❖ PSR フ ァ イルを作成するには • PSR の リ ソ ース PowerBuilder デー タ ウ ィ ン ド ウ ペ イ ン タ ま たは InfoMaker レ ポー ト ペ イ ン タ で、 以下の操作を行い ます。 • [フ ァ イ ル|名前を付け て フ ァ イ ルを保存] を選択す る 。 フ ァ イ ル名の選択 ダ イ ア ロ グ ボ ッ ク ス に、 保存す る 場所、 フ ァ イ ル名、 お よ びフ ァ イ ルの種類 と し て Powersoft レ ポー ト を指定 する • [フ ァ イ ル|名前を付け て行を保存] を選択す る 。 名前を付け て保存 ダ イ ア ロ グボ ッ ク ス に、 保存す る 場所、 フ ァ イ ル名、 お よ びフ ァ イ ルの種類 と し て Powersoft レ ポー ト を指定す る デー タ ウ ィ ン ド ウ オブジ ェ ク ト ま たは レ ポー ト オブジ ェ ク ト は、ビ ッ ト マ ッ プ オブジ ェ ク ト と カ ス タ ム ポ イ ン タ を表示で き ます。 こ れ ら の 外部 リ ソ ース を、 ク ラ イ ア ン ト ワ ー ク ス テーシ ョ ン で利用で き る よ う に し な ければな り ません。 サーバか ら 自動ではダ ウ ン ロ ー ド さ れ ませ ん。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 675 HTML ページの作成 外部 リ ソ ース のパ ス は、 ク ラ イ ア ン ト ワ ー ク ス テーシ ョ ン で有効でな ければな り ま せん。 デー タ ウ ィ ン ド ウ ペ イ ン タ か レ ポー ト ペ イ ン タ で、 現行デ ィ レ ク ト リ に対す る 相対パ ス を指定で き ます。 絶対パ ス は ユーザの コ ン ピ ュ ー タ に存在 し ない こ と があ り ます。 イ ン ト ラ ネ ッ ト 環境では、 すべて の ユーザが ア ク セ ス で き る ネ ッ ト ワ ー ク ド ラ イ ブに外部 リ ソ ー ス を 保存で き ま す。 Windows 環境では、 ネ ッ ト ワー ク パ ス を使用 し て、 マ ッ プ さ れた ド ラ イ ブ名ではな く ネ ッ ト ワ ー ク ド ラ イ ブ を指定で き ます。 OLE オブ ジ ェ ク ト と カ ス タ ム コ ン ト ロー ル OLE サーバ と カ ス タ ム コ ン ト ロ ールを各 ク ラ イ ア ン ト ワ ー ク ス テー シ ョ ン で イ ン ス ト ール、 登録す る 必要があ り ます。 制約 元のデー タ ウ ィ ン ド ウ か レ ポー ト が リ ッ チ テ キ ス ト 提示様式だ っ た PSR は、 デー タ ウ ィ ン ド ウ プ ラ グ イ ンの中には使え ません。 次の作業 PSR フ ァ イ ルを保存 し た ら 、その PSR フ ァ イ ルを表示す る HTML ペー ジ を作成 し なければな り ません。 HTML ページの作成 Embed 要素を使用 し て、 Web ページに Powersoft レ ポー ト (PSR) を含 め ます。 要素の属性に よ っ て、 レ ポー ト に割 り 当て る 領域 と レ ポー ト フ ァ イ ル名を指定 し ます。 Embed 要素は次の よ う に指定 し ます。 <EMBED src=April_sales.psr WIDTH=370 HEIGHT=320> Embed 要素の属性 Embed 要素は、 プ ラ グ イ ンの HTML 仕様の一部です。 デー タ ウ ィ ン ド ウ プ ラ グ イ ンの場合、 標準 HTML 属性だけ を指定 し ます。 HTML 属性 HTML 属性で、 ク ラ イ ア ン ト にダ ウ ン ロ ー ド す る フ ァ イ ル の名前、 お よ び Web ページ上でプ ラ グ イ ン に確保す る 領域を、 以下の と お り 指定 し ます。 676 PowerBuilder 第 31 章 デー タ ウ ィ ン ド ウ プ ラ グ イ ンの使い方 表 31-3: デー タ ウ ィ ン ド ウ プ ラ グ イ ンの HTML 属性 HTML 属性 SRC 値 ダ ウ ン ロ ー ド さ れ る オブジ ェ ク ト を識別す る ブ ラ ウ ザは、 Embed 要素を処理す る と き に、 サーバに リ ソ ース を要求 し 、 コ ン テ ン ツ タ イ プ を処理す る DLL をプ ラ グ イ ン デ ィ レ ク ト リ か ら 検索する WIDTH HEIGHT デー タ ウ ィ ン ド ウ プ ラ グ イ ン の場合、 オブジ ェ ク ト は PSR フ ァ イ ルであ る 表示す る ウ ィ ン ド ウ の幅。 ピ ク セル値で指定す る 表示す る ウ ィ ン ド ウ の高 さ 。 ピ ク セル値で指定す る サン プ ル ページ こ のサン プル ページは、PSR フ ァ イ ルを表示す る デー タ ウ ィ ン ド ウ プ ラ グ イ ン を含んでい ます。 こ のページ を作成す る HTML コ ー ド は次の と お り です。Embed 要素を 使用 し て、 PSR フ ァ イ ルを指定 し てい ます。 始めの要素 <HTML> ド キュ メ ン ト ヘ ッ ダ <HEAD> <TITLE>On Leave report</TITLE> </HEAD> <BODY> H1 ヘ ッ ダ <H1>On Leave report</H1> パラ グ ラ フ の中の Embed 要素 <P><EMBED src=DWB_att_crossout.psr WIDTH=680 HEIGHT = 350></P> 終わ り の要素 </BODY> </HTML> Web サーバの設定 サーバを設定す る には、 以下の操作を行い ます。 1 MIME の種類の指定 2 サーバへの フ ァ イ ルの配置 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 677 Web サーバの設定 MIME の種類の指定 Web サーバに所定の ソ フ ト ウ ェ ア を使用 し て、 デー タ ウ ィ ン ド ウ プ ラ グ イ ン の MIME の種類 を 登録 し ま す。 PowerBuilder 9 で使用で き る MIME の種類は次の と お り です。 application/datawindow9 MIME の フ ァ イ ル拡張子は PSR です。 サーバのマニ ュ アルに よ っ ては、 MIME の種類ではな く コ ン テ ン ツ タ イ プ と い う 用語を使用 し てい る 場合 も あ り ます。 サーバへの フ ァ イルの 配置 PSR フ ァ イ ル と HTML フ ァ イ ル を サーバ上の所定のデ ィ レ ク ト リ に コ ピー し ます。 表 31-4: サーバ上の PSR フ ァ イル と HTML フ ァ イルの場所 フ ァ イル HTML ページ 場所 HTML ド キ ュ メ ン ト デ ィ レ ク ト リ かサブ ディ レク ト リ Embed 要素の SRC 属性で指定 さ れ る PSR フ ァ イ ル HTML ド キ ュ メ ン ト デ ィ レ ク ト リ か、 ほか の適切なデ ィ レ ク ト リ 実行方法 HTML ページ を、 ページ に リ ン ク す る URL で指定 さ れ る デ ィ レ ク ト リ に コ ピ ーす る PSR フ ァ イ ルを Embed 要素 の属性で指定 し たデ ィ レ ク ト リ に コ ピーす る HTML ページに指定す る URL は、 Web サーバで定義 さ れ る 論理パ ス です。 た と えば、 PSR のシ ス テ ム パ ス は以下の よ う にな り ます。 URL について C:¥WEBSITE¥HTDOCS¥PB¥DWB_ATT_CROSSOUT.PSR htdocs がサーバの ド キ ュ メ ン ト デ ィ レ ク ト リ に定義 さ れれば、 URL の 論理パ ス は、 次の よ う に ド キ ュ メ ン ト デ ィ レ ク ト リ に対す る 相対パ ス にな り ます。 pb/dwb_att_crossout.psr 678 PowerBuilder 第 31 章 デー タ ウ ィ ン ド ウ プ ラ グ イ ンの使い方 ユーザのワー ク ス テーシ ョ ンの設定 PSR の保存、 HTML ページの作成、 お よ びサーバの設定が終了 し た ら 、 次はデー タ ウ ィ ン ド ウ プ ラ グ イ ン を 含むページ を 表示で き る よ う に ク ラ イ ア ン ト ワー ク ス テーシ ョ ン を設定す る 必要があ り ます。 デー タ ウ ィ ン ド ウ プ ラ グ イ ン を含む Web ページ を表示す る ユーザは、 ク ラ イ ア ン ト ワ ー ク ス テーシ ョ ン で イ ン ス ト ール さ れ る ソ フ ト ウ ェ ア を サポー ト す る 必要があ り ます。 ま た、 Web サーバに も 接続 し なけ ればな り ません。 必要な コ ンポーネ ン ト デー タ ウ ィ ン ド ウ プ ラ グ イ ン を含む Web ページ を表示す る には、各 ク ラ イ ア ン ト ワ ー ク ス テーシ ョ ン で表 31-5 に示す コ ン ポーネ ン ト が必 要です。 表 31-5: デー タ ウ ィ ン ド ウ プ ラ グ イ ンの表示に必要な ク ラ イ ア ン ト 要件 コ ンポーネ ン ト イ ン タ ーネ ッ ト 接続か イ ン ト ラ ネ ッ ト 接続 Netscape プ ラ グ イ ン をサポー ト す る Web ブ ラ ウ ザ。 デー タ ウ ィ ン ド ウ プラグイン DLL そのほかの フ ァ イル 手順 企業内で、 ま たは イ ン タ ーネ ッ ト サービ ス プ ロ バ イ ダか ら 利用で き る ブ ラ ウ ザ ベン ダか ら 利用で き る 。 以下の よ う なブ ラ ウ ザ が必要であ る • Netscape Navigator バージ ョ ン 3.x 以降 • Microsoft Internet Explorer バージ ョ ン 3.x ~ 5.5 Service Pack 1。Internet Explorer 5.5 Service Pack 2 以降はプ ラ グ イ ン をサポー ト し ていない こ の DLL が な い 場合 は、 NPDWE90J.DLL フ ァ イ ル を Internet Tools¥Plugins デ ィ レ ク ト リ か ら ブ ラ ウ ザのプ ラ グ イ ン デ ィ レ ク ト リ に コ ピーす る 元のデー タ ウ ィ ン ド ウ オブジ ェ ク ト か レ ポー ト に、 外部 フ ァ イ ルのビ ッ ト マ ッ プ オブジ ェ ク ト かカ ス タ ム ポ イ ン タ が含 ま れ て い た 場合、 外部 フ ァ イ ル を ク ラ イ ア ン ト ワ ー ク ス テーシ ョ ン に コ ピーす る 必要が あ る 。 ク ラ イ ア ン ト ワー ク ス テーシ ョ ンのパ ス は、 PSR に保存 さ れてい る パ ス に対応 し なければな ら ない 元のデー タ ウ ィ ン ド ウ オブ ジ ェ ク ト か レ ポー ト に OLE オブジ ェ ク ト かカ ス タ ム コ ン ト ロ ールが含ま れていた場 合、 OLE サーバかカ ス タ ム コ ン ト ロ ールを ク ラ イ ア ン ト ワ ー ク ス テーシ ョ ン で イ ン ス ト ール、 登録す る 必要が あ る 。 OLE オブ ジ ェ ク ト のパ ス は ク ラ イ ア ン ト ワ ー ク ス テーシ ョ ンで有効でなければな ら ない ア プ リ ケーシ ョ ン テ ク ニ ッ ク 679 ユーザのワー ク ス テーシ ョ ンの設定 Web ページ と PSR の 表示 PSR をデー タ ウ ィ ン ド ウ プ ラ グ イ ン の中に表示 し なが ら 、 以下の操作 を行え ます。 • ス ク ロ ールバーを使用 し て PSR のデー タ を操作す る • PSR の ソ ース が編集可能なデー タ ウ ィ ン ド ウ オブジ ェ ク ト であ っ た場合、 行 と カ ラ ム の値を変更す る 。 ただ し 、 デー タ ベー ス 接続 がないため、 デー タ ベース のデー タ は更新で き ない • PSR を右 ク リ ッ ク し て、 保存、 印刷、 お よ びナビ ゲー ト のポ ッ プ ア ッ プ メ ニ ュ ーを表示す る Web ページの レ ポー ト を ロ ーカル PSR フ ァ イ ル と し て保存すれば、 そ の PSR フ ァ イ ルを InfoMaker で開いてデー タ の検索、 フ ィ ル タ 、 お よ び ソ ー ト が行え ます。 680 PowerBuilder 第 3 2 章 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの使い方 こ の章について こ の章では、 Web ページにプ ラ グ イ ン アプ リ ケーシ ョ ン と し て表 示 さ れ る PowerBuilder アプ リ ケーシ ョ ン の開発、 テ ス ト 、 お よ び 配布の方法について説明 し ます。 内容 は じ めに 項目 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンについて PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの イ ン ス ト ール と 設定 セキ ュ リ テ ィ PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの使い方 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン アプ リ ケーシ ョ ンの開発 と 配布 PowerBuilder アプ リ ケーシ ョ ンの作成 HTML ページの作成 サーバの設定 ユーザの ワー ク ス テーシ ョ ンの設定 ページ 681 688 689 690 691 699 702 703 こ の章では、HTML と URL について、お よ び Web ブ ラ ウ ザが Web サーバか ら ペー ジ を ど の よ う に取得す る か につい て の知識 を 有 し 、 Web サーバにア ク セ ス 可能な環境で あ る こ と を前提に し てい ます。 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン について PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン を使用す る と 、 Netscape プ ラ グ イ ン を サポー ト す る ブ ラ ウ ザで表示 さ れ る PowerBuilder 子 ウ ィ ン ド ウ を Web ページに表示で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 681 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンについて Internet Explorer Microsoft Internet Explorer 5.5 Service Pack 2 以 降 の バ ー ジ ョ ン は、 Netscape プ ラ グ イ ン を サポー ト し てい ま せん。 そのため、 それ ら のブ ラ ウ ザでは、 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン を 使用 し て PSR レ ポー ト を表示す る こ と はで き ません。 機能 PowerBuilder 子 ウ ィ ン ド ウ には、 デー タ ウ ィ ン ド ウ 、 OLE オブジ ェ ク ト 、 ActiveX (OCX) コ ン ト ロ ール、 お よ び ツ リ ー コ ン ト ロ ールな ど の使い慣れた コ ン ト ロ ールがすべて含ま れ ます。 ま た、 子 ウ ィ ン ド ウ か ら ポ ッ プ ア ッ プ ウ ィ ン ド ウ ま たは レ ス ポ ン ス ウ ィ ン ド ウ を開 く こ と も 可能です。 682 PowerBuilder 第 32 章 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの使い方 ユーザが子 ウ ィ ン ド ウ やほかの ウ ィ ン ド ウ の コ ン ト ロ ール と 対話す る と 、 ス タ ン ド ア ロ ン PowerBuilder アプ リ ケーシ ョ ンの コ ン ト ロ ール と ま っ た く 同 じ よ う に、 その イ ベン ト ス ク リ プ ト が実行 さ れます。 プ ラ グ イ ン アプ リ ケーシ ョ ン か ら デー タ ベースへのア ク セ ス は、 ク ラ イ ア ン ト の定義済みデー タ ベー ス 接続 を 使用 し て ロ ー カ ルで実行 さ れ ま す。 アプ リ ケーシ ョ ン内のオブジ ェ ク ト を、1 つま たは複数の PowerBuilder 動的 ラ イ ブ ラ リ (PowerBuilder Dynamic Library : PBD) に含め る こ と が で き ます。 標準バージ ョ ン と セ キ ュ リ テ ィ バージ ョ ン PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン には、 標準バージ ョ ン と セキ ュ リ テ ィ バージ ョ ンの 2 種類があ り ます。 標 準 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンは、 PowerBuilder 子 ウ ィ ン ド ウ を HTML ページに表示 し ます。標準 ウ ィ ン ド ウ プ ラ グ イ ンは、NPPBA90J.DLL で実装 さ れます。 標準 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン セキュ リ ティ PowerBuilder ウィ ンド ウ プラ グイ ン セキュ リ ティ PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンは、標準 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの セ キ ュ リ テ ィ バージ ョ ン です。 セ キ ュ リ テ ィ バージ ョ ン を使用す る と 、 イ ン タ ーネ ッ ト を介 し てダ ウ ン ロ ー ド さ れ る PowerBuilder アプ リ ケーシ ョ ンが ク ラ イ ア ン ト シ ス テ ム を損傷 し た り 、 ク ラ イ ア ン ト ワ ー ク ス テーシ ョ ン上の情報に ア ク セ ス し た り す る こ と が防止 さ れ ま す。 セキ ュ リ テ ィ ウ ィ ン ド ウ プ ラ グ イ ンは、 NPPBS90J.DLL で実装 さ れま す。 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン のセキ ュ リ テ ィ バージ ョ ン を使用 す る と き の留意事項については、 689 ページの 「セキ ュ リ テ ィ PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの使い方」 を参照 し て く だ さ い。 サポー ト さ れる ブ ラ ウ ザ PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン では、 Netscape Navigator バージ ョ ン 3.x 以降の、 Netscape プ ラ グ イ ン を サポー ト す る ブ ラ ウ ザ を使用す る 必要があ り ます。 Microsoft Internet Explorer 5.5 Service Pack 2 以降の バージ ョ ンは、 Netscape プ ラ グ イ ン を サポー ト し てい ません。 セキ ュ リ テ ィ 標準 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンは、 セキ ュ リ テ ィ 機能を実装 し ていないアプ リ ケーシ ョ ン なので、 ロ ーカルの フ ァ イ ルにア ク セ ス し 、 ロ ーカルのアプ リ ケーシ ョ ン を実行で き ます。 こ の よ う な処理は、 制御のない Web 環境では好まれない こ と が多いですが、 ア ク セ ス が制 御 さ れ る 企業 イ ン ト ラ ネ ッ ト では許容 さ れ る 場合 も あ り ます。 セ キ ュ リ テ ィ が重要視 さ れ る サ イ ト の場合は、 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン のセ キ ュ リ テ ィ バージ ョ ン を使用 し て ア プ リ ケーシ ョ ン を構築 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 683 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンについて セキ ュ リ テ ィ モー ド で常に動作する イ ベ ン ト がある PowerBuilder 8 では、 標準 ウ ィ ン ド ウ プ ロ グ ラ ム を使用 し ていた と し て も 、 アプ リ ケーシ ョ ン の Open イ ベン ト お よ び コ ン ト ロ ール用のい く つかの Constructor イ ベン ト がセ キ ュ リ テ ィ モー ド で動作 し ます。ア プ リ ケーシ ョ ン の ロ ジ ッ ク が、 こ れ ら の イ ベン ト での安全性に欠け る 動作 (フ ァ イ ルを開いて書 き 込みを行 う な ど) を実行す る 機能に依存 す る 場合には、 イ ベン ト メ ッ セージが自分に対 し て表示 さ れ る よ う に し て く だ さ い。 こ の イ ベン ト メ ッ セージは、 プ ラ グ イ ン が標準モー ド に戻っ た と き に処理 さ れ ます。 セ キ ュ リ テ ィ PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン の詳細については、 689 ページの 「セキ ュ リ テ ィ PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの使 い方」 を参照 し て く だ さ い。 プ ラ グイ ン と な る ア プ リ ケーシ ョ ン の種類 HTML フ ォーム では、 限 ら れたユーザ イ ン タ フ ェース を介 し た対話処 理 し かで き ません。 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンは、 HTML を 超え る 能力を提供 し ます。 リ ッ チ ユーザ イ ン タ フ ェ ース設計で開発 さ れた アプ リ ケーシ ョ ン ウ ィ ン ド ウ を、 Web ページに表示で き ます。 ク ラ イ ア ン ト ワ ー ク ス テーシ ョ ン で定義 さ れてい る デー タ ソ ー ス に ア ク セ ス で き ま す。 PowerBuilder の分散型 コ ン ピ ュ ーテ ィ ン グ機能を使 用 し て、 サーバ と そのデー タ ソ ース にア ク セ ス で き ます。 例 684 アプ リ ケーシ ョ ンには以下の も のがあ り ます。 • マ ス タ デー タ ウ ィ ン ド ウ と 詳細デー タ ウ ィ ン ド ウ を持つデー タ 解 析ウ ィ ン ド ウ • ユーザに よ る 選択を、 ツ リ ービ ュ ー、 リ ス ト ビ ュ ー、 お よ びピ ク チ ャ リ ス ト ボ ッ ク ス コ ン ト ロ ールか ら 行 う ユーザ イ ン タ フ ェ ー ス の設計 • PowerBuilder の分散型 コ ン ピ ュ ーテ ィ ン グ機能を使用 し てサーバ 上のデー タ を処理す る デー タ 入力フ ォ ーム • ク ラ イ ア ン ト 定義に よ る デー タ ベー ス 接続 (ネ ッ ト ワ ー ク ま たは ロ ーカル) を使用 し て ク ラ イ ア ン ト マシ ン上のデー タ を処理す る デー タ 入力フ ォ ーム • PowerBuilder の OLEControl コ ン ト ロ ールを使用 し て ActiveX コ ン ト ロ ールを表示す る ウ ィ ン ド ウ PowerBuilder 第 32 章 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの使い方 PowerBuilder ウィ ン ド ウ プ ラ グイ ン の機能 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンは、 Web ページ上にあ ら か じ め割 り 当て ら れ た固定領域内に PowerBuilder の子 ウ ィ ン ド ウ を 表示 し ま す。 ユーザはページ上の コ ン ト ロ ール と 対話で き 、 ウ ィ ン ド ウ と その コ ン ト ロ ールの PowerBuilder ス ク リ プ ト はど の PowerBuilder コ ー ド で も 実行で き ます。ユーザが別の Web ページに移 る と 、PowerBuilder ウ ィ ン ド ウ は閉 じ 、 PowerBuilder DLL が メ モ リ か ら ア ン ロ ー ド さ れ ます。 プ ラ グ イ ン を HTML ページに含め る には、HTML Embed 要素を使い ま す。 Embed 要素は PowerBuilder オブジ ェ ク ト を収めた 1 つま たは複数 の PBD の名前、 お よ びページに表示 さ れ る 子 ウ ィ ン ド ウ オブジ ェ ク ト の名前を指定 し ます。 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンは Netscape プ ラ グ イ ン API を実装 し 、 こ の API を サポー ト す る ブ ラ ウ ザが必要です。 詳細は、 683 ペー ジの 「サポー ト さ れ る ブ ラ ウ ザ」 を参照 し て く だ さ い。 ク ラ イ ア ン ト と サーバ の対話の詳細 表 32-1 に、 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン を含む HTML ド キ ュ メ ン ト が表示 さ れ る 際に ク ラ イ ア ン ト と サーバ と の間で行われ る 処理 について詳 し く 示 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 685 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンについて 表 32-1: ウ ィ ン ド ウ プ ラ グ イ ンのク ラ イ ア ン ト / サーバ間 ト ラ ンザク シ ョ ン 手順 1 2 3 4 ク ラ イ ア ン ト の動作 Web ブ ラ ウ ザがサーバに HTML ド キ ュ メ ン ト を要求す る ブ ラ ウ ザは MIME の種類を受 信 し 、 HTML ド キ ュ メ ン ト を 受信す る 準備をす る ブ ラ ウ ザは HTML ド キ ュ メ ン ト を受信 し 、 それを表示する ブ ラ ウ ザは Embed 要素を認識 し 、 ページ上にプ ラ グ イ ンのた めの領域を確保 し 、 PBD フ ァ イ ルをサーバに要求する サーバの応答 サーバは ド キ ュ メ ン ト の MIME の種類 (text/html) を識別する ヘ ッ ダ を送信する サーバは HTML ド キ ュ メ ン ト を 送信する — サーバは、 PBD の MIME の種類 を識別する ヘ ッ ダ を送信する 。 ヘ ッ ダは以下のいずれかであ る • 標準ウ ィ ン ド ウ プ ラ グ イ ン application/vnd.powerbuilder9 • セキ ュ リ テ ィ ウ ィ ン ド ウ プ ラ グ イ ン application/vnd.powerbuilder9-s 5 6 7 8 9 10 11 12 13 686 ブ ラ ウ ザは MIME の種類を受 信 し 、 PBD フ ァ イ ルを受信す る 準備をす る ブ ラ ウ ザは PBD フ ァ イ ルを受 信す る ブ ラ ウ ザは、自分のプ ラ グ イ ン デ ィ レ ク ト リ か ら MIME タ イ プに対応す る DLL を探す。 手 順 4 のサーバの応答を参照 ブ ラ ウ ザはプ ラ グ イ ン DLL を ロー ド する プ ラ グ イ ンが PowerBuilder 配布 DLL を探 し て ロ ー ド す る Embed 要素に LIBRARY 属性が 含まれ る 場合、 ク ラ イ ア ン ト は 指定 さ れた PBD フ ァ イ ルを要 求す る ブ ラ ウ ザは MIME の種類を受 信 し 、 追加 PBD フ ァ イ ルを受 信す る 準備をす る PowerBuilder は Embed 要素で指 定 さ れた子ウ ィ ン ド ウ を表示す る 子 ウ ィ ン ド ウ はその Open ス ク リ プ ト を実行す る サーバは PBD フ ァ イ ルを送信す る — — — — サーバは PBD の MIME の種類を 識別する ヘ ッ ダ を送信する 。 手順 4 のサーバの応答を参照 サーバは PBD フ ァ イ ルを送信す る — — PowerBuilder 第 32 章 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの使い方 手順 14 要件 ク ラ イ ア ン ト の動作 ス ク リ プ ト が CommandParm 関 数を呼び出す場合、 PowerBuilder は Embed 要素の COMMANDPARM 属性の値を ブ ラ ウ ザに問い合わせる サーバの応答 — PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンは、 PowerBuilder 配布 DLL お よ び プ ラ グ イ ン DLL を使用 し て、 PowerBuilder の フル機能を提供 し ます。 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン を含むページ を参照す る 各 ク ラ イ ア ン ト で、 ロ ーカル マシ ン に イ ン ス ト ール さ れ る 以下の ソ フ ト ウ ェ ア をサポー ト す る 必要があ り ます。 • PowerBuilder ラ ン タ イ ム DLL • Web ブ ラ ウ ザのプ ラ グ イ ン デ ィ レ ク ト リ に入っ てい る ウ ィ ン ド ウ プ ラ グ イ ン DLL PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンは、 開発者が ク ラ イ ア ン ト マシ ン のセ ッ ト ア ッ プ を 管理す る イ ン ト ラ ネ ッ ト ア プ リ ケーシ ョ ン で特に 便利です。 サポー ト さ れ る 各プ ラ ッ ト フ ォ ー ム 上での ク ラ イ ア ン ト マ シ ン の設 定の詳細については、 703 ページの 「ユーザの ワ ー ク ス テーシ ョ ン の 設定」 を参照 し て く だ さ い。 名前 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン DLL の名前は、使用 し てい る も の が標準バージ ョ ン かセキ ュ リ テ ィ バージ ョ ンかに よ っ て異な り ます。 表 32-2: PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン DLL コ ンポーネ ン ト 標準 PowerBuilder ウ ィ ン ド ウ プ ラ グ イン セ キ ュ リ テ ィ PowerBuilder ウ ィ ン ド ウ プラグイン ア プ リ ケーシ ョ ン テ ク ニ ッ ク 名前 NPPBA90J.DLL NPPBS90J.DLL 687 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンのイ ン ス ト ール と 設定 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンのイ ン ス ト ール と 設定 PowerBuilder の イ ン ス ト ール時に標準セ ッ ト ア ッ プ を 選択 し た場合、 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンは コ ン ピ ュ ー タ に イ ン ス ト ール さ れ ま せん。 プ ラ グ イ ン を イ ン ス ト ールす る には、 PowerBuilder の カ ス タ ム イ ン ス ト ールを実行 し 、 [ コ ン ポーネ ン ト の選択] ページで [Web プ ラ グ イ ン] チ ェ ッ ク ボ ッ ク ス を オ ン に し ます。 イ ン ス ト ールす る プ ラ グ イ ン と コ ン ト ロ ールを選択す る には、 そのページの [変更] ボ タ ン を ク リ ッ ク し ます。 こ の節では、 プ ラ グ イ ン の イ ン ス ト ール後に行 う 必要があ る 設定作業 について説明 し ます。 イ ン ス ト ール先 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン DLL は、 PowerBuilder9.0 ¥Internet Tools¥Plugins デ ィ レ ク ト リ に イ ン ス ト ール さ れます。Netscape が イ ン ス ト ール済みの場合は、 PowerBuilder イ ン ス ト ール プ ロ グ ラ ム に よ っ てプ ラ グ イ ン の コ ピーが Web ブ ラ ウ ザの Plugins デ ィ レ ク ト リ に イ ン ス ト ール さ れ る 場合 も あ り ます。 ブ ラ ウ ザが イ ン ス ト ール さ れていない場合、 ま たは イ ン ス ト ール プ ロ グ ラ ム がブ ラ ウ ザ を見つけ ら れなか っ た場合には、 Netscape を イ ン ス ト ール し て、 プ ラ グ イ ン を ブ ラ ウ ザの プ ラ グ イ ン デ ィ レ ク ト リ に コ ピーす る か移動 し なければな り ません。 PowerBuilder 配布 DLL 688 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンは、 PowerBuilder ラ ン タ イ ム DLL (PBVM90J.DLL、 PBDWE90J.DLL な ど) の場所を認識 し ていなければ な り ません。 セ ッ ト ア ッ プ プ ロ グ ラ ムはブ ラ ウ ザを検出す る と レ ジ ス ト リ に適切な修正を加え ますが、 セ ッ ト ア ッ プ プ ロ グ ラ ムがブ ラ ウ ザ を検出で き なか っ た場合には、 開発者側で修正を行わな ければな り ま せん。 こ れには 2 つの方法があ り ます。 • Windows レ ジ ス ト リ で、 ブ ラ ウ ザの実行フ ァ イ ルに対す る アプ リ ケーシ ョ ン パ ス キーに PowerBuilder ラ ン タ イ ム DLL のデ ィ レ ク ト リ を追加す る • シ ス テ ム パ ス に PowerBuilder ラ ン タ イ ム DLL のデ ィ レ ク ト リ を 追加す る PowerBuilder 第 32 章 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの使い方 セキ ュ リ テ ィ PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの 使い方 使い方 セ キ ュ リ テ ィ PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン を 使用す る ア プ リ ケーシ ョ ン を開発、 配布す る には、 標準の PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン の場合 と 同 じ 基本手順 (690 ページの 「PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン アプ リ ケーシ ョ ン の開発 と 配布」 を参照) に従い ます。 唯一の相違点は、 セキ ュ リ テ ィ PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン が、 特殊なバージ ョ ン の標準 ウ ィ ン ド ウ プ ラ グ イ ン DLL を使用す る こ と です。 セキ ュ リ テ ィ バージ ョ ン の ウ ィ ン ド ウ プ ラ グ イ ンは、 NPPBS90J.DLL です。 機能上の制約 セキ ュ リ テ ィ PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン を使用す る と 、 ク ラ イ ア ン ト ワー ク ス テーシ ョ ンで実行す る PowerBuilder アプ リ ケーシ ョ ン の機能性がかな り 制約 さ れ、 ク ラ イ ア ン ト シ ス テ ムへの印刷以外の ア ク セ ス は拒否 さ れ ます。 こ のため、 セキ ュ リ テ ィ ウ ィ ン ド ウ プ ラ グ イ ンがすべての状況で有効であ る と は限 り ません。 セキ ュ リ テ ィ PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン を使用 し た場合、 表 32-3 に示す動作が制限 さ れ ます。 表 32-3: セキ ュ リ テ ィ ウ ィ ン ド ウ プ ラ グ イ ンの制約 動作 外部関数 PowerScript 関数 デー タ ベース接続 イ ン タ ーネ ッ ト ア ク セス 電子 メ ール OLE 分散 コ ン ピ ュ ーテ ィ ング ダ イ ナ ミ ッ ク デー タ エ ク スチェ ンジ (DDE) ア プ リ ケーシ ョ ン テ ク ニ ッ ク 制約 外部関数を呼び出す と 実行エ ラ ーが発生する 一定の PowerScript 関数を呼び出す と 実行エ ラ ーが 発生す る デー タ ベー ス に ア ク セ ス す る 関数 を 呼び出す と 実 行エ ラ ーが発生す る セ キ ュ リ テ ィ PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン を使用す る アプ リ ケーシ ョ ンでは、現行の Web サー バに し か イ ン タ ーネ ッ ト 接続で き ない PowerScript の Mail 関数を呼び出す と 実行エ ラ ーが 発生す る PowerScript の OLE 関数を呼び出す と 実行エ ラ ーが 発生す る PowerBuilder ア プ リ ケーシ ョ ン サーバに接続で き ない PowerScript の DDE 関数を呼び出す と 実行エ ラ ーが 発生す る 689 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン ア プ リ ケーシ ョ ンの開発 と 配布 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン ア プ リ ケーシ ョ ン の開発 と 配布 プ ラ グ イ ン アプ リ ケーシ ョ ンの開発には、主な 4 つの作業があ り ます。 基本手順 ❖ 結果の コ ンポーネ ン ト PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン ア プ リ ケーシ ョ ン を作成および配布す るには 1 PowerBuilder アプ リ ケーシ ョ ン を作成、テ ス ト 、お よ び構築 し ます。 2 PowerBuilder アプ リ ケーシ ョ ン ウ ィ ン ド ウ を埋め込む HTML ペー ジ を作成 し ます。 3 内容の種類 (MIME の種類) を登録 し 、 アプ リ ケーシ ョ ンの HTML ページ と PBD フ ァ イ ルを所定のデ ィ レ ク ト リ に コ ピー し て、 Web サーバを構成 し ます。 4 すべての ク ラ イ ア ン ト ワー ク ス テーシ ョ ン上で、標準ま たはセキ ュ リ テ ィ PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン DLL と PowerBuilder 配 布 DLL を イ ン ス ト ール し ます。 セ ッ ト ア ッ プがすべて終了す る と 、 表 32-4 に示す コ ン ポーネ ン ト が サーバお よ び ク ラ イ ア ン ト コ ン ピ ュ ー タ に設定 さ れ ます。 表 32-4: PowerBuilder プ ラ グ イ ン用のサーバ と ク ラ イ ア ン ト の環境設定 コ ンピ ュータ サーバ ク ラ イ アン ト 690 コ ンポーネ ン ト MIME の種類が登録 さ れてい る 登録の方法については、 702 ページの 「MIME の種類の指 定」 を参照 HTML ページに PBD の Embed 要素があ る 1 つ ま たは複数の PBD にア プ リ ケーシ ョ ン オブジ ェ ク ト が収め ら れてい る ブ ラ ウ ザのプ ラ グ イ ン デ ィ レ ク ト リ 内の PowerBuilder プ ラ グ イ ン DLL プ ラ ッ ト フ ォ ーム用の配布キ ッ ト を使用 し て イ ン ス ト ール し た PowerBuilder 配布 DLL シ ス テ ム パ ス に リ ス ト さ れ た PowerBuilder 配布 DLL の ディ レク ト リ デー タ ベース接続 ソ フ ト ウ ェ ア、 OLE サーバ、 カ ス タ ム コ ン ト ロ ールな ど、 プ ラ グ イ ン アプ リ ケーシ ョ ン で必要 と な る そのほかの ソ フ ト ウ ェ ア PowerBuilder 第 32 章 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの使い方 次の手順 こ の章では、 以降、 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン ア プ リ ケー シ ョ ン を開発、配布す る ための以下の 4 つの手順について説明 し ます。 • PowerBuilder アプ リ ケーシ ョ ンの作成 • HTML ページの作成 • サーバの設定 • ユーザの ワー ク ス テーシ ョ ン の設定 PowerBuilder ア プ リ ケーシ ョ ンの作成 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン アプ リ ケーシ ョ ンは、 Web ページ に表示 さ れ る 子 ウ ィ ン ド ウ か ら 始ま り ます。ウ ィ ン ド ウ で、コ ン ト ロ ー ルの表示、 お よ び イ ベン ト の ス ク リ プ ト の記述が行え ます。 ス ク リ プ ト か ら は、 ほかの ウ ィ ン ド ウ を開 く 、 フ ァ イ ルを読み書 き す る 、 ク ラ イ ア ン ト マ シ ン 上のほかのプ ロ グ ラ ム を 実行す る な ど の操作が行え ます。 プ ラ グイ ン ア プ リ ケーシ ョ ン の設計の選択 プ ラ グ イ ン と し て使用す る アプ リ ケーシ ョ ン の設計は、 通常開発す る PowerBuilder ア プ リ ケーシ ョ ン と ほ と ん ど変わ り ま せんが、 以下の点 について、 い く つかの制限事項 と 留意事項があ り ます。 ウ ィ ン ド ウ管理 • ウ ィ ン ド ウ 管理 • オブジ ェ ク ト • ス ク リ プ ト と 変数 • デー タ ア ク セ ス • 外部フ ァ イ ル 初期 ウ ィ ン ド ウ は、 ブ ラ ウ ザ フ レーム内に存在す る 子 ウ ィ ン ド ウ でなければな り ません。 初期子ウ ィ ン ド ウ 以下の こ と が可能です。 • ア プ リ ケーシ ョ ン テ ク ニ ッ ク 子 ウ ィ ン ド ウ で タ イ ト ル バーを使用す る 。 ただ し 、 子 ウ ィ ン ド ウ では、 コ ン ト ロ ール メ ニ ュ ー、 最大化ボ タ ン、 ま たは最小化ボ タ ンは使用 し ない 691 PowerBuilder ア プ リ ケーシ ョ ンの作成 • 子 ウ ィ ン ド ウ か ら 、 ポ ッ プア ッ プ ウ ィ ン ド ウ ま たは レ ス ポ ン ス ウ ィ ン ド ウ を開 く 。 メ イ ン ウ ィ ン ド ウ ま たは MDI ウ ィ ン ド ウ は 開けない 以下の制限があ り ます。 • 子 ウ ィ ン ド ウ の メ ニ ュ ーを配置す る • 初期 ウ ィ ン ド ウ か ら 別の子 ウ ィ ン ド ウ を開 く ウ ィ ン ド ウを閉 じ る ク ラ イ ア ン ト が別の Web ページ を参照す る と 、 現 行の Web ページの子 ウ ィ ン ド ウ は閉 じ ますが、 ほかの ウ ィ ン ド ウ はア プ リ ケーシ ョ ン を閉 じ ない限 り 、 開いてい ます。 こ れ ら の ウ ィ ン ド ウ は、 子 ウ ィ ン ド ウ の Close イ ベン ト ま たは CloseQuery イ ベン ト で閉 じ なければな り ません。 戻 り 値を設定 し て、 CloseQuery イ ベン ト で子 ウ ィ ン ド ウ が閉 じ ない よ う にす る 処理は行わないで く だ さ い。 ブ ラ ウ ザが別のページに移 ら な い よ う に し た り 、 ビ ュ ーか ら ウ ィ ン ド ウ を削除で き ない よ う に し た り す る こ と はで き ません。 ユーザが前のページに戻っ た と き に、 アプ リ ケーシ ョ ンの別の イ ン ス タ ン ス が起動 さ れます。 オブ ジ ェ ク ト プ ラ グ イ ン ア プ リ ケーシ ョ ン は、 PBD の中の すべてのオブジ ェ ク ト にア ク セ ス し ます。 関数、 構造体、 ユーザ オブ ジ ェ ク ト に も ア ク セ ス で き ます。 PBD 内のオブ ジ ェ ク ト シ ス テム オブ ジ ェ ク ト プ ラ グ イ ン アプ リ ケーシ ョ ンは、SQLCA ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト や メ ッ セージ オブジ ェ ク ト な ど、PowerBuilder が イ ン ス タ ン ス を作成す る シ ス テ ム オブジ ェ ク ト にア ク セ ス し ます。 ア プ リ ケーシ ョ ン オブ ジ ェ ク ト Embed 要素のオプシ ョ ンの APPLICATION 属性を使用 し て、 PBD のアプ リ ケーシ ョ ン オブジ ェ ク ト の名前を指定で き ます。 APPLICATION 属性を使用す る と 、 プ ラ グ イ ン アプ リ ケーシ ョ ンはアプ リ ケーシ ョ ン オブジ ェ ク ト の Open イ ベ ン ト と Close イ ベン ト にア ク セ ス で き ます。 APPLICATION 属性を指定 し ない と 、 以下の よ う にな り ます。 692 • プ ラ グ イ ン アプ リ ケーシ ョ ンはアプ リ ケーシ ョ ン オブジ ェ ク ト にア ク セ ス で き な く な り 、 SystemError や Idle な ど の イ ベン ト が利 用で き ない。 アプ リ ケーシ ョ ン オブジ ェ ク ト でグ ロ ーバルに定義 さ れてい る 変数 と 関数を処理で き ない • アプリ ケーショ ン オブジェ ク ト のほかのス ク リ プト は、PowerBuilder でテ ス ト を行 う 際に必要 と な る 。 アプ リ ケーシ ョ ン オブジ ェ ク ト の ス ク リ プ ト で、 アプ リ ケーシ ョ ン のセ ッ ト ア ッ プ を行 う こ と が で き ない PowerBuilder 第 32 章 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの使い方 APPLICATION 属性の指定については、 699 ページの 「Embed 要素の属 性」 を参照 し て く だ さ い。 ス ク リ プ ト と 変数 グローバル変数 Embed 要素の APPLICATION 属性を使用 し て PBD の アプ リ ケーシ ョ ン オブジ ェ ク ト を指定す る と 、プ ラ グ イ ン アプ リ ケー シ ョ ンはアプ リ ケーシ ョ ン で使 う グ ロ ーバル変数 と グ ロ ーバル関数に ア ク セ ス で き ます。 APPLICATION 属性を指定 し ない と 、 プ ラ グ イ ン アプ リ ケーシ ョ ンは グ ロ ーバル変数 を 使え ま せん。 すべて の変数 を イ ン ス タ ン ス、 共有、 ま たは ロ ーカルに定義 し なければな り ません。 APPLICATION 属性の指定については、 699 ページの 「Embed 要素の属 性」 を参照 し て く だ さ い。 PowerBuilder は、 初期子 ウ ィ ン ド ウ の イ ン ス タ ン ス を保持す る 変数を作成 し ないので、 ス ク リ プ ト で名前を使用 し て 初期子 ウ ィ ン ド ウ を参照す る こ と はで き ません。 逆に、 Open 関数の ス ク リ プ ト を記述 し て ウ ィ ン ド ウ の イ ン ス タ ン ス を生成すれば、 その イ ン ス タ ン ス を変数に代入 し て参照で き ます。 初期ウ ィ ン ド ウの参照 し たが っ て、 以下の ス ク リ プ ト は、 ウ ィ ン ド ウ 変数 w_mychild が存在 し ないため、 実行時エ ラ ーにな り ます。 // 以下のス ク リ プ ト は、 実行時エ ラ ー と な り ます。 w_mychild.title = "The initial window" 以下の よ う に ス ク リ プ ト を記述す る と 、 エ ラ ーを回避で き ます。 // 子ウ ィ ン ド ウ自体で this.title = "The initial window" // または title = "The initial window" // 子ウ ィ ン ド ウの コ ン ト ロール内で parent.title = "The initial window" ア プ リ ケーシ ョ ン を セ ッ ト ア ッ プする ス ク リ プ ト DBMS へ の 接 続 を 含 め、 アプ リ ケーシ ョ ン セ ッ ト ア ッ プはすべて子 ウ ィ ン ド ウ で行わなけ ればな り ません。 最初に実行 さ れな ければな ら ない ス ク リ プ ト 可能 イ ベン ト は、 ウ ィ ン ド ウ の中の コ ン ト ロ ールの コ ン ス ト ラ ク タ です。 次 に、 ウ ィ ン ド ウ の Open イ ベン ト が実行 さ れます。 Activate イ ベン ト は子 ウ ィ ン ド ウ では実行 さ れ ません。 し たがっ て、 子 ウ ィ ン ド ウ に ア プ リ ケーシ ョ ン のセ ッ ト ア ッ プ コ ー ド を 置か な いで く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 693 PowerBuilder ア プ リ ケーシ ョ ンの作成 デー タ ア ク セス アプ リ ケーシ ョ ンか ら DBMS にア ク セ スす る 場合、 各 ク ラ イ ア ン ト は デー タ ソ ース に接続 し なければな り ません。 その接続は、 サーバでは な く ク ラ イ ア ン ト マシ ン上で定義 さ れ る 必要があ り ます。デー タ ソ ー ス は ロ ーカル DBMS かネ ッ ト ワー ク DBMS です。 ク ラ イ ア ン ト マシ ン か ら DBMS に接続す る 方法については、 『デー タ ベース と の接続』 マニ ュ アルを参照 し て く だ さ い。 コ ン ト ロ ールの Constructor イ ベン ト は、 ウ ィ ン ド ウ の Open イ ベン ト の前に実行 さ れ ます。 ウ ィ ン ド ウ の Open イ ベン ト で DBMS に接続 し た場合、 Constructor イ ベン ト ではデー タ が得 ら れ ません。 ウ ィ ン ド ウ の Open イ ベン ト で コ ン ト ロ ールのデー タ を取得す る か、Constructor イ ベン ト ま たは ウ ィ ン ド ウ の Open イ ベン ト か ら イ ベン ト を ポ ス ト し て く だ さ い。 外部 リ ソ ースのパス フ ァ イ ルに指定す る パ ス は、 ク ラ イ ア ン ト ワ ー ク ス テーシ ョ ン で有効 でなければな り ません。 アプ リ ケーシ ョ ン で外部フ ァ イ ル と し て画像を使用す る 場合、 その画 像は PowerBuilder オブジ ェ ク ト に指定 さ れたパ ス で取得で き なければ な り ません。外部フ ァ イ ルを使用す る のではな く 、画像 リ ソ ース を PBD に構築す る こ と も で き ま す。 こ れについては、 696 ページの 「動的 ラ イ ブ ラ リ の構築」 を参照 し て く だ さ い。 アプ リ ケーシ ョ ン で ロ ーカル フ ァ イ ルを読み書 き す る 場合、 それ ら の フ ァ イ ルのパ ス は各 ク ラ イ ア ン ト マ シ ン で有効な も ので な ければな り ません。 パ ス で、 マ ッ プ さ れた ド ラ イ ブ名を使用 し てネ ッ ト ワー ク ド ラ イ ブが 参照 さ れてい る 場合、 すべての ク ラ イ ア ン ト がアプ リ ケーシ ョ ン と 同 じ ド ラ イ ブ名を使用す る 必要があ り ます。 ま た、 サーバ名をパ ス で指 定す る こ と も で き ます。 た と えば、 o: が ¥¥marketing¥drive に割 り 当て ら れてい る 場合、 以下の パ ス は ど ち ら も 有効です。 ただ し 、 ド ラ イ ブ名は変更の可能性があ る ので、 サーバ名を指定 し てい る 2 番目のパ ス の方が永続的な利用が可 能です。 O:¥pbapps¥connect.bmp ¥¥marketing¥drive¥pbapps¥connect.bmp ウィ ン ド ウ ペイ ン タ での開始ウィ ン ド ウの定義 PowerBuilder で作成す る ほかの ウ ィ ン ド ウ と 同様に、 起動 ウ ィ ン ド ウ の作成に も ウ ィ ン ド ウ ペ イ ン タ を使い ます。 694 PowerBuilder 第 32 章 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの使い方 ❖ ❖ 起動ウ ィ ン ド ウ (または専用のウ ィ ン ド ウ) を作成するには 1 PowerBuilder で ウ ィ ン ド ウ オブジ ェ ク ト を新規作成 し ます。 2 プ ロ パテ ィ ビ ュ ーの ウ ィ ン ド ウ の [全般] タ ブで、 ウ ィ ン ド ウ の 種類を 「child!」 に設定 し ます。 3 必要であれば、 ほかの コ ン ト ロ ールを追加 し ます。 4 ウ ィ ン ド ウ と コ ン ト ロ ールの イ ベン ト ス ク リ プ ト を記述 し ます。 既存のア プ リ ケーシ ョ ン を プ ラ グ イ ン と し て実行で き る よ う に変換するには 1 最初に表示 さ れ る ウ ィ ン ド ウ の種類を 「child!」 に変更 し ます。 2 Embed 要素の APPLICATION 属性を指定 し ない場合は、 以下の両 方の操作を行い ます。 • グ ロ ーバル変数への参照を削除す る • アプ リ ケーシ ョ ンのセ ッ ト ア ッ プ コ ー ド を、 アプ リ ケーシ ョ ン の Open イ ベン ト ま たは MDI フ レーム イ ベン ト か ら 子 ウ ィ ン ド ウ の Open イ ベン ト に移動 し ます。 APPLICATION 属性の指定については、 699 ページの 「Embed 要素 の属性」 を参照 し て く だ さ い。 3 子ウ ィ ン ド ウについて アプ リ ケーシ ョ ン の設計に よ っ ては、 ほかの ウ ィ ン ド ウ を開 く 方 法を設計 し 直 さ なければな ら ない場合 も あ り ます。 子 ウ ィ ン ド ウ に メ ニ ュ ーを配置す る こ と はで き ません。 子 ウ ィ ン ド ウ はア ク テ ィ ブ ウ ィ ン ド ウ と はみな さ れず、 Activate イ ベン ト は発生 し ません。 子 ウ ィ ン ド ウ には タ イ ト ル バーを表示で き 、 最小化、 最大化、 サ イ ズ変更がで き ます。 プ ラ グ イ ン環境では、 以下の よ う に、 子 ウ ィ ン ド ウ は Web ページ上の WIDTH 属性 と HEIGHT 属性で割 り 当て ら れ る 領域に常に制限 さ れます。 • ウ ィ ン ド ウ を最大化す る と 、WIDTH 属性 と HEIGHT 属性で割 り 当 て ら れた領域内で最大表示 さ れ る • ウ ィ ン ド ウ を最小化す る と 、 ウ ィ ン ド ウ のア イ コ ン と タ イ ト ルが プ ラ グ イ ンに割 り 当て ら れた領域の下端に表示 さ れ る • 子 ウ ィ ン ド ウ のサ イ ズ を変更で き る 場合は、 枠線を ド ラ ッ グ し て ウ ィ ン ド ウ を割 り 当て領域 よ り 小 さ く で き る (割 り 当て領域 よ り 大 き く す る こ と はで き ない) し たが っ て、 子 ウ ィ ン ド ウ の最小化、 最大化、 ま たはサ イ ズ変更は有 効 と はいえ ません。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 695 PowerBuilder ア プ リ ケーシ ョ ンの作成 PowerBuilder でのア プ リ ーショ ン のテ ス ト 作成 し た アプ リ ケーシ ョ ン を ク ラ イ ア ン ト ブ ラ ウ ザで実行す る 前に、 PowerBuilder で子 ウ ィ ン ド ウ を開 く メ イ ン ウ ィ ン ド ウ を定義 し て、 ア プ リ ケーシ ョ ン を テ ス ト で き ます。 ❖ PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン ア プ リ ケーシ ョ ン を テ ス ト する には 1 種類が メ イ ン (デフ ォ ル ト ) の ウ ィ ン ド ウ オブジ ェ ク ト を新規作 成 し ます。 2 プ ラ グ イ ンの起動子 ウ ィ ン ド ウ を開 く Open イ ベン ト の ス ク リ プ ト を記述 し ます。 Open(w_child) 3 4 ウ ィ ン ド ウ ペ イ ン タ で、 ウ ィ ン ド ウ サ イ ズ を以下の よ う に設定す る と 便利です。 • メ イ ン ウ ィ ン ド ウ のサ イ ズは、 子 ウ ィ ン ド ウ を十分に表示で き る サ イ ズにす る • 子 ウ ィ ン ド ウ を左上隅に配置す る 。 こ の よ う に設定す る には、 プ ロ パテ ィ ビ ュ ーの [その他] タ ブの [位置] フ ィ ール ド を 使用す る [プ レ ビ ュ ー] ボ タ ン を ク リ ッ ク す る か、 [フ ァ イ ル|実行 / プ レ ビ ュ ー] を選択 し て、 テ ス ト ウ ィ ン ド ウ を実行 し ます。 PowerBuilder でのデバ ッ グ PowerBuilder デバ ッ ガ を使用す る には、 ウ ィ ン ド ウ だけ を実行す る の ではな く 、 アプ リ ケーシ ョ ン を実行す る 必要があ り ます。 メ イ ン ウ ィ ン ド ウ を開 く ス ク リ プ ト で、 アプ リ ケーシ ョ ン オブジ ェ ク ト を定義 し ます。 次に、 [実行] コ マ ン ド か [デバ ッ グ] コ マ ン ド を使用 し て アプ リ ケーシ ョ ン を テ ス ト で き ます。 動的ラ イ ブ ラ リ の構築 『PowerBuilder ユーザーズ ガ イ ド 』 マ ニ ュ アルでは、 動的 ラ ン タ イ ム ラ イ ブ ラ リ (PBD) を構築す る 方法について説明 し てい ま す。 こ の手 順は、 プ ラ グ イ ン アプ リ ケーシ ョ ン の場合 と 同 じ です。 こ の節では、 プ ラ グ イ ン アプ リ ケーシ ョ ン用の PBD を構築す る ために必要な選択 項目について説明 し ます。 696 PowerBuilder 第 32 章 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの使い方 Web 環境では、 フ ァ イ ル サ イ ズが重要であ る こ と を覚え ておいて く だ さ い。 PBL 内でのオブ ジ ェ ク ト の編成 PowerBuilder リ ソ ー ス (PBR) フ ァ イル の使用 アプ リ ケーシ ョ ン を構築す る 前に、 アプ リ ケーシ ョ ン で使用す る オブ ジ ェ ク ト を ラ イ ブ ラ リ ペ イ ン タ で PBL に編成 し ておかな ければな り ません。 PBL はプ ラ グ イ ン アプ リ ケーシ ョ ン の PBD の ソ ー ス にな り ます。 最適な ラ イ ブ ラ リ を作成す る には、 以下の点に留意 し ます。 • フ ァ イ ル サ イ ズ を最小化す る には、 アプ リ ケーシ ョ ン で使用す る オブジ ェ ク ト のみを入れ る 。 不要なオブジ ェ ク ト は削除す る • 動的に作成 さ れ る オブジ ェ ク ト (デー タ ス ト ア で使用 さ れ る デー タ ウ ィ ン ド ウ オブジ ェ ク ト な ど) ま たはデー タ ウ ィ ン ド ウ の コ ン ト ロ ールに動的に割 り 当て ら れ る オブジ ェ ク ト をすべて含め る • 先祖オブジ ェ ク ト を入れ る コ ン ト ロ ールに よ っ ては、 画像に外部フ ァ イ ルを使用す る 場合 も あ り ます。た と えば、ピ ク チ ャ リ ス ト ボ ッ ク ス コ ン ト ロ ール、ツ リ ービ ュ ー コ ン ト ロ ール、 ピ ク チ ャ コ ン ト ロ ール、 ピ ク チ ャ ボ タ ン コ ン ト ロ ー ル、 ポ イ ン タ 、 デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト の ビ ッ ト マ ッ プ オブ ジ ェ ク ト です。 プ ラ グ イ ン アプ リ ケーシ ョ ン で外部フ ァ イ ルの画像を 使用す る 場合、 ク ラ イ ア ン ト で同 じ 画像が同 じ シ ス テ ム パ ス上にない こ と があ り ます。 ク ラ イ ア ン ト マシ ン に ピ ク チ ャ を イ ン ス ト ールす る かわ り に、 1 つま たは複数の PowerBuilder リ ソ ース (PBR: PowerBuilder Resource) フ ァ イ ルを使用 し て、 PBD に画像を組み込む こ と がで き ます。 画像を組み 込む と PBD はサ イ ズは大 き く な り ますが、 独立 し て機能 し ます。 構築す る 動的 ラ ン タ イ ム ラ イ ブ ラ リ は実行 フ ァ イ ルでは な い た め、 PBR フ ァ イ ルに デー タ ベー ス ア ッ プデー ト オブジ ェ ク ト を含め る 必 要 は あ り ま せ ん。 作 成 後 の PBD に は、 ソ ー ス PBL 内 の す べ て の PowerBuilder オブジ ェ ク ト が含まれ ます。 ネ ッ ト ワー ク 上の画像やそのほかの リ ソ ース PBD に フ ァ イ ルを組み込むかわ り に、 広 く ア ク セ ス さ れ る ネ ッ ト ワ ー ク デ ィ レ ク ト リ に フ ァ イ ルを格納す る こ と も 可能です。 ただ し 、 こ の 場合、 フ ァ イ ルへのパ ス は、 PowerBuilder オブジ ェ ク ト でのパ ス と 同 じ でなければな り ません。 つま り 、 Windows 環境では、 各 ク ラ イ ア ン ト が同 じ ド ラ イ ブ名で ネ ッ ト ワ ー ク ド ラ イ ブ を マ ッ プ し な ければな り ません。 あ る いは、 サーバ名をパ ス で指定す る こ と も で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 697 PowerBuilder ア プ リ ケーシ ョ ンの作成 ❖ PBR フ ァ イルを定義するには 1 〔Shift〕 + 〔F6〕 を押 し て フ ァ イ ル PowerBuilder エデ ィ タ を開 く か、 ほかのテ キ ス ト エデ ィ タ を開 き 、 拡張子 .PBR の新 し い フ ァ イ ル を作成 し ます。 [テ キ ス ト エデ ィ タ ] ア イ コ ンはツールバーに追加 で き ます。 2 画像やほかの リ ソ ー ス を、 各行に一覧表示 し ま す。 パ ス と フ ァ イ ル名を、 オブジ ェ ク ト のプ ロ パテ ィ シー ト か ス ク リ プ ト で指定 さ れ る と お り 正確に表示 し ます。 ショート カッ ト オブジ ェ ク ト のプ ロ パテ ィ ビ ュ ーを表示 し 、 〔Ctrl〕 + 〔C〕 を使用 し て、 フ ァ イ ル名を ク リ ッ プボー ド に コ ピー し 、 エデ ィ タ に貼 り 付け ます。 3 フ ァ イ ルを保存 し ます。 アプ リ ケーシ ョ ンに複数の PBL が含まれ、各 PBL にそれぞれの リ ソ ー ス を 使用す る オブ ジ ェ ク ト が含 ま れて い る 場合は、 各 PBL に対 し て PBR フ ァ イ ルを作成す る 必要があ り ます。PBR フ ァ イ ルは、1 つの PBL 内で使用 さ れ る リ ソ ース の フ ァ イ ル名を リ ス ト し ます。 PBD の構築 ラ イ ブ ラ リ ペ イ ン タ かプ ロ ジ ェ ク ト ペ イ ン タ で ラ ン タ イ ム ラ イ ブ ラ リ (PBD) を構築 し ます。 こ れについては、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 以下の こ と に留意 し て く だ さ い。 プ ラ グ イ ン アプ リ ケーシ ョ ンには、 マシ ン コ ー ド DLL ではな く PBD が必要です。 • マシ ン コ ー ド の選択解除 • PBR フ ァ イルを各 PBD に指定する PBR フ ァ イ ル に リ ス ト し た リ ソ ース を PBL 内のオブジ ェ ク ト で使用す る 場合は、PBR 名を[ ソ ー ス フ ァ イ ル] テ キ ス ト ボ ッ ク ス に入力 し ます。 PBR フ ァ イ ルの定義お よ び ラ ン タ イ ム ラ イ ブ ラ リ (PBD) の構築方法 については、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルで実行フ ァ イ ルの作成に関す る 章を参照 し て く だ さ い。 698 PowerBuilder 第 32 章 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの使い方 HTML ページの作成 プ ラ グ イ ン ア プ リ ケーシ ョ ン の PowerBuilder PBD を作成、 構築 し た ら 、 次にそれを表示す る HTML ページ を作成 し なければな り ません。 PowerBuilder ウ ィ ン ド ウ を Web ページに含むには、 Embed 要素を使い ます。 要素の属性で、 ウ ィ ン ド ウ に割 り 当て る 領域、 PBD の名前、 お よ び PBD の中の子 ウ ィ ン ド ウ の名前を指定 し ます。 Embed 要素は次の よ う に指定 し ます。 <EMBED SRC=plugin_tree.pbd WIDTH=370 HEIGHT=320 WINDOW=w_emp_by_dept> Embed 要素の属性 Embed 要素は、 プ ラ グ イ ン の HTML 仕様の一部です。 HTML でい く つ かの標準属性を定義 し 、 PowerBuilder で追加属性を定義 し ます。 HTML 属性 HTML 属性で、 ク ラ イ ア ン ト にダ ウ ン ロ ー ド す る フ ァ イ ルの名前、 お よ び Web ページ上でプ ラ グ イ ン に確保す る 領域を、 以下の と お り 指定 し ます。 表 32-5: HTML Embed 要素属性 HTML 属性 SRC 値 ダ ウ ン ロ ー ド さ れ る オブジ ェ ク ト を識別す る ブ ラ ウ ザは、 Embed 要素を処理す る と き に、 サーバに リ ソ ース を要求 し 、コ ン テ ン ツ タ イ プ を処理す る DLL を プ ラ グ イ ン デ ィ レ ク ト リ か ら 検索する WIDTH HEIGHT PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン の場合、 オブジ ェ ク ト はアプ リ ケーシ ョ ン を起動す る 子 ウ ィ ン ド ウ を収めた PBD であ る 表示す る ウ ィ ン ド ウ の幅。 ピ ク セル値で指定す る 表示す る ウ ィ ン ド ウ の高 さ 。 ピ ク セル値で指定す る WIDTH 属性 と HEIGHT 属性には、 子 ウ ィ ン ド ウ の幅お よ び高 さ の最 大値を定義 し ます。 子 ウ ィ ン ド ウ のサ イ ズ を変更で き る 場合、 指定の サ イ ズ よ り 小 さ く で き ますが、 大 き く はで き ません。 PowerBuilder 属性 Embed 要素の PowerBuilder 属性で、 アプ リ ケーシ ョ ン を起動す る ウ ィ ン ド ウ オブジ ェ ク ト 、 追加 ラ イ ブ ラ リ 、 アプ リ ケーシ ョ ンに渡すパ ラ メ ー タ 、 お よ びアプ リ ケーシ ョ ン オブジ ェ ク ト の名前を、 以下の と お り 識別 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 699 HTML ページの作成 表 32-6: PowerBuilder Embed 要素属性 PowerBuilder 属性 WINDOW LIBRARY (オプシ ョ ン) 値 PBD 内の子ウ ィ ン ド ウ の ク ラ ス名 ア プ リ ケーシ ョ ン に必要な オブ ジ ェ ク ト を 収め た追加 PBD を指定する URL。PBD の相対 URL で はな く 絶対 URL を指定 し なければな ら ない 複数の LIBRARY 属性を指定で き る 。 アプ リ ケー シ ョ ンに必要な追加の各 PBD に対 し て、 LIBRARY 属性を指定す る 。 SRC に指定 さ れた フ ァ イ ルの LIBRARY 属性は指定 し ない COMMANDPARM (オプシ ョ ン) APPLICATION (オプシ ョ ン) LIBRARY 属性を使用 し た HTML コ ー ド の例につ いては、 701 ページの 「追加属性を持つ Embed 要 素」 を参照 ウ ィ ン ド ウ に渡す文字列。 ウ ィ ン ド ウ内か ら こ の 文字列にア ク セ ス す る には、 CommandParm 関数 を呼び出す COMMANDPARM 属性を使用 し た HTML コ ー ド の例については、 701 ページの 「追加属性を持つ Embed 要素」 を参照 PBD の中のアプ リ ケーシ ョ ン オブジ ェ ク ト の名 前 こ れを使用 し て、プ ラ グ イ ン アプ リ ケーシ ョ ンは アプ リ ケーシ ョ ン オブジ ェ ク ト の Open イ ベン ト と Close イ ベン ト 、 お よ びアプ リ ケーシ ョ ンで使 う グ ロ ーバル変数 と グ ロ ーバル関数に ア ク セ ス でき る APPLICATION 属性 を 使用す る と 、 ア プ リ ケ ー シ ョ ン オブジ ェ ク ト の Open イ ベン ト と Close イ ベ ン ト はデ フ ォ ル ト で実行 さ れ、 上書 き で き な い。WINDOW 属性で指定 さ れた子ウ ィ ン ド ウ は、 アプ リ ケーシ ョ ン オブジ ェ ク ト の Open イ ベン ト では開かない。 も し 開けば、 アプ リ ケーシ ョ ンは 異常終了する APPLICATION 属性 を 使用 し た HTML コ ー ド の 例につい て は、 701 ペー ジ の 「追加属性 を 持つ Embed 要素」 を参照 サン プ ル ページ こ のサ ン プル ページは、 マ ス タ デー タ ウ ィ ン ド ウ コ ン ト ロ ール と 詳 細デー タ ウ ィ ン ド ウ コ ン ト ロ ー ル を 持つ ウ ィ ン ド ウ を 表示す る 、 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン を含んでい ます。 700 PowerBuilder 第 32 章 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの使い方 こ のペー ジ を 作成す る HTML コ ー ド は次の と お り です。 こ こ で は、 Embed 要素を使用 し て PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン を指定 し て い ます。 始めの要素 <HTML> ド キュ メ ン ト ヘ ッ ダ <HEAD> <TITLE>Master-Detail window</TITLE> </HEAD> <BODY> スモール イ メ ージ <IMG SRC="undercon.gif" BORDER=0 HEIGHT=38 WIDTH=40> H1 ヘ ッ ダ <H1>Master-detail in a PB window plug-in</H1> 水平ルール <P><HR></P> パラ グ ラ フ <P> こ のウ ィ ン ド ウは、 PB デモ デー タ ベースにア ク セス し て部門 リ ス ト を表示 し ます。 ユーザが部門の行を ク リ ッ ク する と 、 2 番目のデー タ ウ ィ ン ド ウにその部門の従業員が表示 さ れます。 </P> パラ グ ラ フ の中の Embed 要素 <P><EMBED SRC=plugin_tree.pbd WIDTH=370 HEIGHT=320 WINDOW=w_emp_by_dept> </P> サイ ト のホームページ への リ ン ク <LI>Back to <A HREF="http://www.mycompany.com/index.html">Home Page</A> </LI> 終わ り の要素 </BODY> </HTML> 追加属性を 持つ Embed 要素 プ ラ グ イ ン アプ リ ケーシ ョ ン で追加 ラ イ ブ ラ リ 、COMMANDPARM 文 字列、 お よ び PBD のアプ リ ケーシ ョ ン オブジ ェ ク ト にア ク セ ス す る ための APPLICATION 属性を使用す る 場合、 Embed 要素を以下の と お り 指定 し ます。 <EMBED SRC=plugin_tree.pbd WIDTH=370 HEIGHT=320 WINDOW=w_emp_by_dept LIBRARY=http://www.mycompany.com/pb/extra1.pbd LIBRARY=http://www.mycompany.com/pb/extra2.pbd COMMANDPARM="Eastern region" APPLICATION=plugin_tree> ア プ リ ケーシ ョ ン テ ク ニ ッ ク 701 サーバの設定 サーバの設定 プ ラ グ イ ン アプ リ ケーシ ョ ン を表示す る ための HTML ページ を定義 し た ら 、 次に Web サーバを設定 し ます。 MIME の種類の指定 Web サーバに所定の ソ フ ト ウ ェ ア を使用 し て、 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン の MIME の種類を登録 し ます。 表 32-7 に、 使用で き る MIME の種類を示 し ます。 表 32-7: PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン MIME タ イ プ プラグイ ン 標準 PowerBuilder ウ ィ ン ド ウ プラグイン セキ ュ リ テ ィ PowerBuilder ウ ィ ン ド ウ プラグイン 登録する MIME の種類 application/vnd.powerbuilder9 application/vnd.powerbuilder9-s MIME の フ ァ イ ル拡張子は PBD です。 サーバのマニ ュ アルに よ っ ては、 MIME の種類ではな く 、 内容の種類 と い う 用語を使用す る 場合 も あ り ます。 サーバへの フ ァ イルの 配置 PowerBuilder ラ イ ブ ラ リ と HTML フ ァ イ ルを サーバ上の所定のデ ィ レ ク ト リ に コ ピー し ます。 表 32-8: サーバ上の PBD フ ァ イル と HTML フ ァ イルの場所 フ ァ イル HTML ページ 場所 HTML ド キ ュ メ ン ト ディ レク ト リ Embed 要素の SRC 属 性お よ び LIBRARY 属 性で指定 さ れ る PBD フ ァ イル HTML ド キ ュ メ ン ト デ ィ レ ク ト リ か、 ほか の適切なデ ィ レ ク ト リ 実行方法 HTML ページ を、ページに リ ン ク す る URL で指定 さ れるディ レ ク ト リ にコ ピーす る PBD フ ァ イ ルを Embed 要 素の属性 で指定 し た デ ィ レ ク ト リ に コ ピーす る HTML ページに指定す る URL は、 Web サーバで定義 さ れ る 論理パ ス です。 た と えば、 Windows では、 PBD のシ ス テ ム パ ス は 以下の よ う にな り ます。 URL について C:¥WEBSITE¥HTDOCS¥PB¥PLUGIN_APP.PBD htdocs がサーバの ド キ ュ メ ン ト デ ィ レ ク ト リ に定義 さ れれば、 Embed 要素の SRC 属性 を 指定す る と き 次の相対パ ス を 使え ま す。 こ のパ ス は、 ド キ ュ メ ン ト デ ィ レ ク ト リ に対す る 相対パ ス です。 pb/plugin_app.pbd 702 PowerBuilder 第 32 章 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの使い方 LIBRARY 属性の場合、 PBD に相対 URL を指定 し ないで く だ さ い。 以 下の よ う な絶対 URL を指定 し なければな り ません。 た と えば、 次の よ う にな り ます。 http://www.mycompany.com/pb/plugin_app.pbd ユーザのワー ク ス テーシ ョ ンの設定 プ ラ グ イ ン アプ リ ケーシ ョ ンの構築、 その HTML ページの作成、 お よ びサーバの設定が終了 し た ら 、 次はプ ラ グ イ ン アプ リ ケーシ ョ ン を表 示で き る よ う に ク ラ イ ア ン ト ワ ー ク ス テーシ ョ ン を 設定す る 必要が あ り ます。 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン ア プ リ ケ ー シ ョ ン を 含む Web ページ を 表示す る には、 ク ラ イ ア ン ト ワ ー ク ス テーシ ョ ン で イ ン ス ト ール さ れ る ソ フ ト ウ ェ ア をサポー ト す る 必要があ り ます。 ま た、Web サーバに も 接続 し なければな り ません。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 703 ユーザのワー ク ス テーシ ョ ンの設定 必要なコ ン ポーネン ト PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン ア プ リ ケ ー シ ョ ン を 含む Web ページ を表示す る には、 各 ク ラ イ ア ン ト ワ ー ク ス テーシ ョ ン で 表 329 に示す コ ン ポーネ ン ト が必要です。 表 32-9: PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの表示に必要な ク ラ イ ア ン ト 要件 コ ンポーネ ン ト イ ン タ ーネ ッ ト 接続か イ ン ト ラ ネ ッ ト 接続 Netscape プ ラ グ イ ン を サポー ト す る Web ブ ラ ウザ PowerBuilder 配布 DLL 詳細 企業内で、 ま たは イ ン タ ーネ ッ ト サービ ス プ ロ バ イ ダか ら 利用で き る ブ ラ ウ ザ ベン ダか ら 利用で き る 以下の よ う なブ ラ ウ ザが必要であ る • Netscape Navigator バージ ョ ン 3.x 以降 • Microsoft Internet Explorer バージ ョ ン 3.x 以降 PowerBuilder ラ ン タ イ ム DLL を イ ン ス ト ールす る 。 805 ページの 「PowerBuilder ラ ン タ イ ム フ ァ イ ル」 を参照 PowerBuilder ラ ン タ イ ム DLL は、 アプ リ ケーシ ョ ン デ ィ レ ク ト リ か、 シ ス テ ム パ ス上のデ ィ レ ク ト リ に 置 く 。 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン DLL は、 PowerBuilder ラ ン タ イ ム DLL の場所がわ か ら な け れ ば な ら な い。 そ の た め に は、 PowerBuilder 配布 DLL のデ ィ レ ク ト リ を シ ス テ ム パ ス に追加す る か、 デ ィ レ ク ト リ を ブ ラ ウ ザのア プ リ ケーシ ョ ン パス キーに追加す る (Windows レ ジス ト リ ) 標 準 ま た は セ キ ュ リ こ の DLL がない場合には、 NPPBA90J.DLL フ ァ イ テ ィ PowerBuilder ウ ィ ル (標準) ま たは NPPBS90J.DLL フ ァ イ ル (セキ ュ ン ド ウ プ ラ グ イ ン DLL リ テ ィ ) を Internet Tools¥Plugins デ ィ レ ク ト リ か ら ブ ラ ウ ザの Plugins デ ィ レ ク ト リ に コ ピーする そのほかの フ ァ イ ル 画像 ソ ース を PBD に入れていない場合、 フ ァ イ ル がオブジ ェ ク ト のプ ロ パテ ィ で指定 さ れ る パ ス 上 になければ、 そのパ ス に コ ピーす る プ ラ グ イ ン アプ リ ケーシ ョ ンがデー タ ベース に接 続す る 場合、 DBMS の ク ラ イ ア ン ト ソ フ ト ウ ェ ア を セ ッ ト ア ッ プす る 。 ク ラ イ ア ン ト マ シ ン か ら DBMS に接続す る 方法については、『デー タ ベース と の接続』 マニ ュ アルを参照 704 PowerBuilder 第 32 章 PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの使い方 Web ページ と プ ラ グイ ン ア プ リ ケーシ ョ ン の表示 必要な ソ フ ト ウ ェ ア を イ ン ス ト ール し た ら 、 Web ページ と プ ラ グ イ ン アプ リ ケーシ ョ ン を表示で き ます。 ユーザが Web ページの URL を指定す る と 、 以下の こ と が行われ ます。 • PowerBuilder ウ ィ ン ド ウ に割 り 当て ら れた領域に、ページ上のテ キ ス ト が表示 さ れ る • ク ラ イ ア ン ト がサーバか ら PBD を ダ ウ ン ロ ー ド す る • ブ ラ ウ ザが Web ページ内に子 ウ ィ ン ド ウ を表示す る • ウ ィ ン ド ウ の中の コ ン ト ロ ール と 対話 し 、 イ ベン ト の ス ク リ プ ト を実行す る • ユーザがページ か ら 離れ る と 、 ウ ィ ン ド ウ が閉 じ 、 PowerBuilder DLL が メ モ リ か ら ア ン ロ ー ド さ れ る ア プ リ ケーシ ョ ン テ ク ニ ッ ク 705 ユーザのワー ク ス テーシ ョ ンの設定 706 PowerBuilder 第 3 3 章 PowerBuilder ウ ィ ン ド ウ ActiveX の使い方 こ の章について こ の章では、PowerBuilder ウ ィ ン ド ウ ActiveX の使い方について説 明 し ます。 内容 項目 PowerBuilder ウ ィ ン ド ウ ActiveX について PowerBuilder アプ リ ケーシ ョ ンの作成 HTML ページの作成 PowerBuilder ウ ィ ン ド ウ ActiveX の イ ベン ト サーバの設定 ユーザの ワー ク ス テーシ ョ ンの設定 ページ 707 712 719 732 733 734 PowerBuilder ウ ィ ン ド ウ ActiveX について PowerBuilder ウ ィ ン ド ウ ActiveX を使用す る と 、 ActiveX を サポー ト す る ブ ラ ウ ザ に表示 さ れ る Web ペー ジ に、 PowerBuilder の子 ウ ィ ン ド ウ を表示で き ます。 機能 PowerBuilder ウ ィ ン ド ウ には、 デー タ ウ ィ ン ド ウ 、 OLE オブジ ェ ク ト 、 OCX (ActiveX) コ ン ト ロ ール、 お よ びツ リ ービ ュ ー コ ン ト ロ ールな ど、 通常使用 し てい る すべての コ ン ト ロ ールを表示で き ます。 ま た、 子 ウ ィ ン ド ウ か ら ポ ッ プア ッ プ ウ ィ ン ド ウ ま たは レ ス ポ ン ス ウ ィ ン ド ウ を開 く こ と も 可能です。 ユーザが ウ ィ ン ド ウ 内の コ ン ト ロ ールを操作す る と 、 ス タ ン ド ア ロ ン の PowerBuilder アプ リ ケーシ ョ ン の場合 と 同様、 その コ ン ト ロ ールの イ ベン ト ス ク リ プ ト が実行 さ れます。 ま た、 HTML ペー ジ内に VBScript や JavaScript を記述す る こ と に よ り 、 PowerBuilder 関数を呼び出 し て PowerBuilder イ ベン ト に応答す る 処理を実行で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 707 PowerBuilder ウ ィ ン ド ウ ActiveX について PowerBuilder ウ ィ ン ド ウ ActiveX ア プ リ ケーシ ョ ン か ら のデー タ ベー ス ア ク セ ス は、 ク ラ イ ア ン ト の ロ ーカル定義デー タ ベース接続を使用 し て行われ ます。 アプ リ ケーシ ョ ン内のオブジ ェ ク ト を、1 つま たは複数の PowerBuilder 動的 ラ イ ブ ラ リ (PBD: PowerBuilder Dynamic Library) に含め る こ と が で き ます。 サポー ト さ れる ブ ラ ウ ザ PowerBuilder ウ ィ ン ド ウ ActiveX を利用す る には、 ActiveX を サポー ト す る 、 以下のブ ラ ウ ザが必要です。 • Microsoft Internet Explorer バージ ョ ン 3.x 以降 • NCompass ScriptActive プ ラ グ イ ン を使用す る Netscape Navigator バージ ョ ン 3.x PowerBuilder ウィ ン ド ウ ActiveX で 動作する ア プ リ ケーシ ョ ン の種類 HTML フ ォーム では、 限 ら れたユーザ イ ン タ フ ェース を介 し た対話処 理 し かで き ま せん。 PowerBuilder ウ ィ ン ド ウ ActiveX は、 HTML を超 え る 能力を提供 し ます。 リ ッ チ ユーザ イ ン タ フ ェース設計で開発 さ れ た アプ リ ケーシ ョ ン ウ ィ ン ド ウ を、 Web ページに表示で き ます。 ク ラ イ ア ン ト ワ ー ク ス テーシ ョ ン で定義 さ れてい る デー タ ソ ー ス に ア ク セ ス で き ま す。 PowerBuilder の分散機能を使用 し て、 ア プ リ ケーシ ョ ン サーバ と そのデー タ ソ ース にア ク セ ス で き ます。 例 708 アプ リ ケーシ ョ ンには以下の も のがあ り ます。 • マ ス タ デー タ ウ ィ ン ド ウ と 詳細デー タ ウ ィ ン ド ウ を持つデー タ 解 析ウ ィ ン ド ウ • ユーザに よ る 選択を、 ツ リ ービ ュ ー、 リ ス ト ビ ュ ー、 お よ びピ ク チ ャ リ ス ト ボ ッ ク ス コ ン ト ロ ールか ら 行 う ユーザ イ ン タ フ ェ ー ス の設計 • 分散ア プ リ ケーシ ョ ン でサーバ上のデー タ を処理す る デー タ 入力 フ ォ ーム • ク ラ イ ア ン ト 定義に よ る デー タ ベー ス 接続 (ネ ッ ト ワ ー ク ま たは ロ ーカル) を使用 し て ク ラ イ ア ン ト マシ ン上のデー タ を処理す る デー タ 入力フ ォ ーム • PowerBuilder の OLEControl コ ン ト ロ ールを使用 し て ActiveX コ ン ト ロ ールを表示す る ウ ィ ン ド ウ PowerBuilder 第 33 章 PowerBuilder ウ ィ ン ド ウ ActiveX の使い方 PowerBuilder ウィ ン ド ウ ActiveX の機能 PowerBuilder ウ ィ ン ド ウ ActiveX は、 Web ページ上にあ ら か じ め割 り 当て ら れた固定領域内に PowerBuilder の子 ウ ィ ン ド ウ を表示 し ま す。 ユーザはページ上の コ ン ト ロ ール と 対話で き 、 ウ ィ ン ド ウ と その コ ン ト ロ ールの PowerBuilder ス ク リ プ ト はど の PowerBuilder コ ー ド で も 実 行で き ます。 ユーザが別の Web ページに移 る と 、 PowerBuilder ウ ィ ン ド ウ は閉 じ 、 PowerBuilder DLL が メ モ リ か ら ア ン ロ ー ド さ れ ます。 PowerBuilder ウ ィ ン ド ウ ActiveX は、 HTML Object 要素 を 使用 し て HTML ページに貼 り 付け ら れ ます。 HTML Object 要素は、 PowerBuilder オブジ ェ ク ト 、 HTML ページに表示 さ れ る 子 ウ ィ ン ド ウ の名前、 お よ び PowerBuilder アプ リ ケーシ ョ ン オブジ ェ ク ト (オプシ ョ ン) を含ん だ 1 つま たは複数の PBD を指定 し ます。 セキ ュ リ テ ィ セ キ ュ リ テ ィ が設定 さ れ て い な い ア プ リ ケ ーシ ョ ン では、 ロ ー カ ル フ ァ イ ルへの ア ク セ ス お よ び ロ ーカ ル ア プ リ ケーシ ョ ン の実行が可 能です。 こ の よ う な処理は、 制御のない Web 環境では好まれない こ と が多いですが、 ア ク セ ス が制御 さ れ る 企業 イ ン ト ラ ネ ッ ト では許容 さ れ る 場合 も あ り ま す。 PowerBuilder ウ ィ ン ド ウ ActiveX には、 セ キ ュ リ テ ィ 付 き (PBRXS90.OCX) と セキ ュ リ テ ィ な し (PBRX90.OCX) の 2 種類が あ り ま す。 セ キ ュ リ テ ィ 付 き の場合は厳 し い制約があ り 、 ク ラ イ ア ン ト ワー ク ス テーシ ョ ンへのア ク セ ス が認め ら れてい ません。 セキ ュ リ テ ィ モー ド で常に動作する イ ベン ト がある PowerBuilder では、 標準バージ ョ ン の ウ ィ ン ド ウ ActiveX を使用 し て い た と し て も 、 ア プ リ ケーシ ョ ン の 「Open イ ベ ン ト 」 お よ び コ ン ト ロ ール用のい く つかの 「Constructor イ ベン ト 」 がセキ ュ リ テ ィ モー ド で動作 し ます。 アプ リ ケーシ ョ ン の ロ ジ ッ ク が、 書 き 込み用の フ ァ イ ル オープン な ど、 こ れ ら の イ ベン ト での非セ キ ュ リ テ ィ 活動を実行す る 能力に依存す る 場合には、 イ ベン ト メ ッ セージ を アプ リ ケーシ ョ ン や コ ン ト ロ ールに対 し てポ ス ト す る よ う に し て く だ さ い。 こ の イ ベン ト メ ッ セージは、 ウ ィ ン ド ウ ActiveX が標準モー ド に戻っ た と き に処 理 さ れます。 要件 PowerBuilder ウ ィ ン ド ウ ActiveX は、 ActiveX その も の と PowerBuilder 仮想マシ ン を使用 し て、 PowerBuilder のあ ら ゆ る 機能を提供 し ます。 各 ク ラ イ ア ン ト が PowerBuilder ウ ィ ン ド ウ ActiveX の貼 り 付け ら れた ページ を参照す る には、 以下の支援 ソ フ ト ウ ェ アが ロ ーカル マシ ンに イ ン ス ト ール さ れてい る 必要があ り ます。 • PowerBuilder 仮想マシ ン(PBVM90J.DLLお よ びサポー ト フ ァ イ ル) • PowerBuilder ウ ィ ン ド ウ ActiveX ア プ リ ケーシ ョ ン テ ク ニ ッ ク 709 PowerBuilder ウ ィ ン ド ウ ActiveX について PowerBuilder ウ ィ ン ド ウ ActiveX は、 開発者が ク ラ イ ア ン ト マシ ン の セ ッ ト ア ッ プ を 管理す る イ ン ト ラ ネ ッ ト ア プ リ ケーシ ョ ン で特に便 利です。 PowerBuilder ウィ ン ド ウ ActiveX のイ ン ス ト ールと 設定 PowerBuilder の イ ン ス ト ール時に標準セ ッ ト ア ッ プ を 選択 し た場合、 PowerBuilder ウ ィ ン ド ウ ActiveX コ ン ト ロ ールは コ ン ピ ュ ー タ に イ ン ス ト ール さ れ ません。 ActiveX コ ン ト ロ ールを イ ン ス ト ールす る には、 PowerBuilder のカ ス タ ム イ ン ス ト ールを実行 し 、[ コ ン ポーネ ン ト の選 択] ページ で [Web プ ラ グ イ ン] チ ェ ッ ク ボ ッ ク ス を オ ン に し ま す。 イ ン ス ト ールす る プ ラ グ イ ン と コ ン ト ロ ール を 選択す る には、 そ の ページの [変更] ボ タ ン を ク リ ッ ク し ます。 こ の節では、 ウ ィ ン ド ウ ActiveX の イ ン ス ト ール後に行 う 必要があ る 設定作業について説明 し ます。 イ ン ス ト ール先 PowerBuilder ウ ィ ン ド ウ ActiveX フ ァ イ ル (セ キ ュ リ テ ィ 付 き お よ び セ キ ュ リ テ ィ な し の両バージ ョ ン) は、 オペレーテ ィ ン グ シ ス テ ム と 同 じ シ ス テ ム デ ィ レ ク ト リ に イ ン ス ト ー ル さ れ ま す。 た と え ば、 Windows NT 実行環境では、 こ れ ら の フ ァ イ ルは C:¥WINNT¥System32 に イ ン ス ト ール さ れます。 ActiveX の登録 PowerBuilder ウ ィ ン ド ウ ActiveX で開発を行 う には、 マシ ン に ActiveX を登録 し なければな り ません。PowerBuilder ブ ラ ウ ザを使用す る と 、登 録状況 を チ ェ ッ ク で き ま す。 ブ ラ ウ ザ を 開い て、 [OLE] タ ブ を 選択 し 、 OLE カ ス タ ム コ ン ト ロ ール項目を展開 し ます。 ActiveX が登録 さ れていれば、 ツ リ ー ビ ュ ーの中に PowerBuilder Window Control ま たは PowerBuilder Secure Window Control と し て表示 さ れ ま す。 ク ラ ス 情報 ノ ー ド を展開す る と 、 現在登録 さ れてい る コ ン ト ロ ールのバージ ョ ン を確認で き ます。 ActiveX を マシ ンに登録 し ていない場合には、PowerBuilder 内か ら 登録 す る か、 MS-DOS の regsvr32 コ マ ン ド を使用 し て登録で き ます。 ❖ PowerBuilder 内から ActiveX を登録するには 1 PowerBuilder か ら 新規ま たは既存のアプ リ ケーシ ョ ン を開 き ます。 次に、 新規ま たは既存の ウ ィ ン ド ウ を開 き ます。 2 メ ニ ュ ーか ら [挿入| コ ン ト ロ ール| OLE] を選択 し ます。 オブジ ェ ク ト の挿入 ダ イ ア ロ グボ ッ ク ス が表示 さ れます。 3 710 [ コ ン ト ロ ールの挿入] タ ブ を選択 し て、 [登録] ボ タ ン を ク リ ッ ク し ます。 PowerBuilder 第 33 章 PowerBuilder ウ ィ ン ド ウ ActiveX の使い方 参照 ダ イ ア ロ グ ボ ッ ク ス が表示 さ れ ます。 4 System デ ィ レ ク ト リ 内の OCX の保存場所に移 り 、 PBRX90.OCX か PBRXS90.OCX の ど ち ら か を選択 し て、 [開 く ] を ク リ ッ ク し ま す。 OCX が う ま く 登録 さ れな い と 、 エ ラ ー メ ッ セージ が表示 さ れ ま す。 ❖ MS-DOS の regsvr32 コ マ ン ド を使用 し て ActiveX を登録する には • 引数 と し て OCX の フル パ ス を指定 し て、 MS-DOS の regsvr32.exe コ マ ン ド を実行 し ま す。 た と えば、 次の よ う に ス ク リ プ ト を記述 し ます。 regsvr32.exe C:¥Windows¥System¥pbrx90.ocx PowerBuilder ウィ ン ド ウ ActiveX ア プ リ ケーシ ョ ン の開発と 配布 PowerBuilder ウ ィ ン ド ウ ActiveX アプ リ ケーシ ョ ンの開発には、主な 4 つの作業があ り ます。 ❖ 結果の コ ンポーネ ン ト PowerBuilder ウ ィ ン ド ウ ActiveX ア プ リ ケーシ ョ ンの作成および配布を行 う には 1 PowerBuilder アプ リ ケーシ ョ ン を作成、テ ス ト 、お よ び構築 し ます。 2 PowerBuilder アプリ ケーショ ン ウ ィ ン ド ウ など を 貼り 付ける HTML ページ を作成 し ます。 3 アプ リ ケーシ ョ ン で使用す る HTML ページ と PBD フ ァ イ ルを適 切なデ ィ レ ク ト リ に コ ピー し て、 Web サーバの設定を行い ます。 4 すべての ク ラ イ ア ン ト アプ リ ケーシ ョ ン上で、 PowerBuilder ウ ィ ン ド ウ ActiveX コ ン ト ロ ール と PowerBuilder 配布 DLL を イ ン ス ト ール し ます。 セ ッ ト ア ッ プがすべて終了す る と 、 表 33-1 に示す コ ン ポーネ ン ト が サーバお よ び ク ラ イ ア ン ト コ ン ピ ュ ー タ に設定 さ れ ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 711 PowerBuilder ア プ リ ケーシ ョ ンの作成 表 33-1: PowerBuilder ウ ィ ン ド ウ ActiveX ア プ リ ケーシ ョ ン用のサーバお よび ク ラ イ ア ン ト の環境設定 コ ンピ ュータ サーバ ク ラ イ アン ト コ ンポーネ ン ト ウ ィ ン ド ウ ま た は レ ポ ー ト の Object 要素 を 貼 り 付 け た HTML ページ と PBD フ ァ イ ル イ ン ス ト ールお よ び登録 さ れ た PowerBuilder ウ ィ ン ド ウ ActiveX (オプシ ョ ン) 子 ウ ィ ン ド ウ と ほかの PowerBuilder オブジ ェ ク ト を含んだ 1 つま たは複数の PBD フ ァ イ ル イ ン ス ト ールお よ び登録 さ れ た PowerBuilder ウ ィ ン ド ウ ActiveX プ ラ ッ ト フ ォーム対応の PowerBuilder 配布キ ッ ト を使用 し て イ ン ス ト ール し た PowerBuilder 配布 DLL シ ス テ ム パ ス に記述 さ れた PowerBuilder 配布 DLL のデ ィ レク ト リ Microsoft DLL: MFC42.DLL MSVCRT.DLL URL.DLL URLMON.DLL デー タ ベー ス 接続 ソ フ ト ウ ェ ア、 OLE サーバ、 ActiveX コ ン ト ロ ールな ど、 PowerBuilder ウ ィ ン ド ウ ActiveX ア プ リ ケーシ ョ ン で必要なそのほかのアプ リ ケーシ ョ ン PowerBuilder ア プ リ ケーシ ョ ンの作成 PowerBuilder ウ ィ ン ド ウ ActiveX アプ リ ケーシ ョ ンは、 Web ページに 表示 さ れ る 子 ウ ィ ン ド ウ か ら 起動 し ます。 ウ ィ ン ド ウ 内には、 コ ン ト ロ ールを配置 し て イ ベン ト ス ク リ プ ト を記述で き ます。 ス ク リ プ ト か ら は、 ほかの ウ ィ ン ド ウ を開 く 、 フ ァ イ ルを読み書 き す る 、 ク ラ イ ア ン ト マシ ン上のほかのプ ロ グ ラ ム を実行す る な ど の操作が行え ます。 ア プ リ ケーシ ョ ン のデザイ ン PowerBuilder ウ ィ ン ド ウ ActiveX 用に設計す る アプ リ ケーシ ョ ンは、通 常開発す る PowerBuilder ア プ リ ケ ーシ ョ ン と ほ と ん ど 変わ り ま せん が、 い く つかの制限事項 と 留意事項があ り ます。 こ の節では、 以下の 項目について説明 し ます。 712 PowerBuilder 第 33 章 PowerBuilder ウ ィ ン ド ウ ActiveX の使い方 ウ ィ ン ド ウ管理 • ウ ィ ン ド ウ 管理 • ス ク リ プ ト と 変数 • デー タ ア ク セ ス • 外部フ ァ イ ル 初期 ウ ィ ン ド ウ は、 ブ ラ ウ ザ フ レーム内に存在す る 子 ウ ィ ン ド ウ でなければな り ません。 初期子ウ ィ ン ド ウ 以下の制限があ り ます。 • 子 ウ ィ ン ド ウ の メ ニ ュ ーを配置す る • 初期 ウ ィ ン ド ウ か ら 別の子 ウ ィ ン ド ウ を開 く 以下の こ と が可能です。 • 子 ウ ィ ン ド ウ で タ イ ト ル バーを使用す る 。 ただ し 、 子 ウ ィ ン ド ウ では、 コ ン ト ロ ール メ ニ ュ ー、 最大化ボ タ ン、 ま たは最小化ボ タ ンは使用 し ない • 子 ウ ィ ン ド ウ か ら 、 ポ ッ プア ッ プ ウ ィ ン ド ウ ま たは レ ス ポ ン ス ウ ィ ン ド ウ を開 く 。 メ イ ン ウ ィ ン ド ウ ま たは MDI ウ ィ ン ド ウ は 開けない ウ ィ ン ド ウ を閉 じ る ク ラ イ ア ン ト が別の Web ページ を参照す る と 、 現 行の Web ページの子 ウ ィ ン ド ウ は閉 じ ますが、 ほかの ウ ィ ン ド ウ はア プ リ ケーシ ョ ン か ら 閉 じ ない限 り 、 開いてい ます。 こ れ ら の ウ ィ ン ド ウ は、 子 ウ ィ ン ド ウ の Close イ ベン ト ま たは CloseQuery イ ベン ト で閉 じ なければな り ません。 戻 り 値を設定 し て、 CloseQuery イ ベン ト で子 ウ ィ ン ド ウ が閉 じ ない よ う にす る 処理は行わないで く だ さ い。 ブ ラ ウ ザが別のページに移 ら な い よ う に し た り 、 ビ ュ ーか ら ウ ィ ン ド ウ を削除で き ない よ う に し た り す る こ と はで き ません。 ユーザが前のページに戻っ た と き に、 アプ リ ケーシ ョ ンの別の イ ン ス タ ン ス が起動 さ れます。 オブ ジ ェ ク ト PowerBuilder ウ ィ ン ド ウ ActiveX ア プ リ ケ ー シ ョ ンは、PBD の中のオブジ ェ ク ト すべてにア ク セ ス で き ます。関数、 構造体、 ユーザ オブジ ェ ク ト に も ア ク セ ス で き ます。 PBD 内のオブ ジ ェ ク ト シ ス テム オブ ジ ェ ク ト PowerBuilder ウ ィ ン ド ウ ActiveX ア プ リ ケ ー シ ョ ンは、 SQLCA ト ラ ンザ ク シ ョ ン オブジ ェ ク ト や メ ッ セージ オブ ジ ェ ク ト な ど、 PowerBuilder が イ ン ス タ ン ス を生成す る シ ス テ ム オブ ジ ェ ク ト にア ク セ ス で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 713 PowerBuilder ア プ リ ケーシ ョ ンの作成 PowerBuilder ウ ィ ン ド ウ ActiveX ア プ リ ケーシ ョ ンは、 アプ リ ケーシ ョ ン オブジ ェ ク ト のプ ロ パテ ィ であ る グ ロ ーバル変数にア ク セ ス で き ます。 ア プ リ ケーシ ョ ン オブ ジ ェ ク ト PowerBuilder では、 開発中は現行のアプ リ ケーシ ョ ン オブジ ェ ク ト が 必要ですが、 アプ リ ケーシ ョ ン で使用 さ れ る のは Open イ ベン ト と グ ロ ーバル変数だけです。 アプ リ ケーシ ョ ン オブジ ェ ク ト のほかの ス ク リ プ ト は、 PowerBuilder でテ ス ト を行 う 際に必要 と な り ます。 ス ク リ プ ト と 変数 ア プ リ ケーシ ョ ン を セ ッ ト ア ッ プする ス ク リ プ ト HTML で PBAPPLICATION パ ラ メ ー タ を指定す る と 、 PowerBuilder ウ ィ ン ド ウ ActiveX は子 ウ ィ ン ド ウ を開 く 前に、 アプ リ ケーシ ョ ン の Open イ ベン ト を発生 さ せます。 こ の イ ベン ト を利用 し て、 デー タ ベース接続の構 築お よ びグ ロ ーバル変数の初期化を行 う こ と がで き ます。 HTML で開 く ウ ィ ン ド ウを指定する アプ リ ケーシ ョ ン の Open イ ベン ト で ウ ィ ン ド ウ を開かないで く だ さ い。 HTML で PBAPPLICATION パ ラ メ ー タ を指定 し ない と 、 DBMS への接 続な ど アプ リ ケーシ ョ ン のセ ッ ト ア ッ プ をすべて子 ウ ィ ン ド ウ 内で行 わな ければな り ません。 ス ク リ プ ト が記述可能な イ ベン ト で、 最初に 発生す る のは ウ ィ ン ド ウ の コ ン ト ロ ールの Constructor イ ベン ト で、 次 に発生す る のは、 その ウ ィ ン ド ウ の Open イ ベン ト です。 Activate イ ベン ト は、 子 ウ ィ ン ド ウ に対 し ては発生 し ません。 し たが っ て、 そ こ でアプ リ ケーシ ョ ン のセ ッ ト ア ッ プ を行わないで く だ さ い。 グローバル変数 PowerBuilder ウ ィ ン ド ウ ActiveX ア プ リ ケ ー シ ョ ン は、 グ ロ ーバル変数にア ク セ ス で き ます。 初期ウ ィ ン ド ウの参照 PowerBuilder は、 初期子 ウ ィ ン ド ウ の イ ン ス タ ン ス を保持す る 変数を作成 し ないので、 ス ク リ プ ト で名前を使用 し て 初期子 ウ ィ ン ド ウ を参照す る こ と はで き ません。 逆に、 Open 関数の ス ク リ プ ト を記述 し て ウ ィ ン ド ウ の イ ン ス タ ン ス を生成すれば、 その イ ン ス タ ン ス を変数に代入 し て参照で き ます。 し たが っ て、 以下の ス ク リ プ ト は、 ウ ィ ン ド ウ 変数 w_mychild が存在 し ないため、 実行時エ ラ ーにな り ます。 // 以下のス ク リ プ ト は、 実行時エ ラ ー と な り ます。 w_mychild.title = "The initial window" 次の ス ク リ プ ト はエ ラ ーにな り ません。 // 子ウ ィ ン ド ウ自体で this.title = "The initial window" 714 PowerBuilder 第 33 章 PowerBuilder ウ ィ ン ド ウ ActiveX の使い方 // または title = "The initial window" // 子ウ ィ ン ド ウの コ ン ト ロール内で parent.title = "The initial window" デー タ ア ク セス アプ リ ケーシ ョ ン か ら DBMS にア ク セ スす る 場合、 各 ク ラ イ ア ン ト は デー タ ソ ース に接続 し なければな り ません。 その接続は、 サーバでは な く ク ラ イ ア ン ト マシ ン上で定義 さ れ る 必要があ り ます。デー タ ソ ー ス は、 ロ ーカ ル ま たはネ ッ ト ワ ー ク DBMS の ど ち ら で も か ま い ま せ ん。 ク ラ イ ア ン ト マシ ンか ら DBMS に接続す る 方法については、 『デー タ ベース と の接続』 マニ ュ アルを参照 し て く だ さ い。 ウ ィ ン ド ウ の Open イ ベン ト が発生する 前に、コ ン ト ロ ールの Constructor イ ベン ト が発生 し ます。つま り 、 ウ ィ ン ド ウ の Open イ ベン ト で DBMS に接続 し た場合、Constructor イ ベン ト はデー タ を取得で き ません。ウ ィ ン ド ウ の Open イ ベ ン ト で コ ン ト ロ ー ル の デ ー タ を 取 得 す る か、 Constructor イ ベン ト ま たは ウ ィ ン ド ウ の Open イ ベン ト か ら イ ベン ト を ポ ス ト し て く だ さ い。 外部 リ ソ ースのパス フ ァ イ ルに指定す る パ ス は、 ク ラ イ ア ン ト ワー ク ス テーシ ョ ンで有効 でなければな り ません。 アプ リ ケーシ ョ ン で外部フ ァ イ ル と し て画像を使用す る 場合、 その画 像は PowerBuilder オブジ ェ ク ト に指定 さ れたパ ス で取得で き なければ な り ません。 外部フ ァ イ ルを使用す る かわ り に、 PBD に画像 リ ソ ース を組み込む こ と も 可能です。 アプ リ ケーシ ョ ン で ロ ーカル フ ァ イ ルを読み書 き す る 場合、 それ ら の フ ァ イ ルのパ ス は各 ク ラ イ ア ン ト マ シ ン で有効な も ので な ければな り ません。 Windows 環境で、 ネ ッ ト ワ ー ク ド ラ イ ブ を参照す る パ ス に、 割 り 当て ら れたネ ッ ト ワー ク ド ラ イ ブの ド ラ イ ブ名を使用す る と 、 すべての ク ラ イ ア ン ト でそれ と 同 じ ド ラ イ ブ名を使わなければな り ません。ま た、 サーバ名をパ ス で指定す る こ と も で き ます。 た と えば、 o: が ¥¥marketing¥drive に割 り 当て ら れてい る 場合、 以下の パ ス は ど ち ら も 有効です。 ただ し 、 ド ラ イ ブ名は変更の可能性があ る ので、 サーバ名を指定 し てい る 2 番目のパ ス の方が有効です。 O:¥pbapps¥connect.bmp ¥¥marketing¥drive¥pbapps¥connect.bmp ア プ リ ケーシ ョ ン テ ク ニ ッ ク 715 PowerBuilder ア プ リ ケーシ ョ ンの作成 ウィ ン ド ウ ペイ ン タ での開始ウィ ン ド ウの定義 PowerBuilder 内の ア プ リ ケ ー シ ョ ン 用の開始 ウ ィ ン ド ウ を 作成 し ま す。 ❖ ❖ ア プ リ ケーシ ョ ンの開始ウ ィ ン ド ウ を作成するには 1 PowerBuilder で ウ ィ ン ド ウ オブジ ェ ク ト を新規作成 し ます。 2 プ ロ パテ ィ ビ ュ ーの ウ ィ ン ド ウ の [全般] タ ブで、 ウ ィ ン ド ウ の 種類を 「child!」 に設定 し ます。 3 必要な場合は、 ほかの コ ン ト ロ ールを追加 し ます。 4 ウ ィ ン ド ウ と コ ン ト ロ ールの イ ベン ト ス ク リ プ ト を記述 し ます。 既存のア プ リ ケーシ ョ ン を PowerBuilder ウ ィ ン ド ウ ActiveX と し て実行で き る よ う に変換するには 1 開いてい る ウ ィ ン ド ウ の種類を 「child!」 に変更 し ます。 2 アプ リ ケーシ ョ ンのセ ッ ト ア ッ プ コ ー ド を、 アプ リ ケーシ ョ ン の Open イ ベン ト ま たは MDI フ レーム イ ベン ト か ら 子 ウ ィ ン ド ウ の Open イ ベン ト に移動 し ます。 アプ リ ケーシ ョ ン の設計に よ っ ては、 ほかの ウ ィ ン ド ウ を開 く 方法を 設計 し 直 さ なければな ら ない場合 も あ り ます。 子ウ ィ ン ド ウについて 子 ウ ィ ン ド ウ に メ ニ ュ ーを配置す る こ と はで き ません。 子 ウ ィ ン ド ウ はア ク テ ィ ブ ウ ィ ン ド ウ と はみな さ れず、 Activate イ ベン ト は発生 し ません。 子 ウ ィ ン ド ウ には、 タ イ ト ル バーを設定で き ます。 ま た、 最 小化、 最大化、 お よ びサ イ ズ変更 も 可能です。 た だ し 、 PowerBuilder ウ ィ ン ド ウ ActiveX 環境では、 子 ウ ィ ン ド ウ は、 Web ページ上に指定 さ れた WIDTH 属性 と HEIGHT 属性に よ っ て割 り 当て ら れ る 領域内に 表示 さ れます。 し たがっ て、 以下の よ う に制限 さ れ ます。 • ウ ィ ン ド ウ を最大化す る と 、WIDTH 属性 と HEIGHT 属性で割 り 当 て ら れた領域内で最大表示 さ れ る • ウ ィ ン ド ウ を最小化す る と 、 ウ ィ ン ド ウ のア イ コ ン と タ イ ト ルが ActiveX コ ン ト ロ ールに割 り 当て ら れた領域の下端に表示 さ れ る • 子 ウ ィ ン ド ウ のサ イ ズ を変更で き る 場合は、 枠線を ド ラ ッ グ し て ウ ィ ン ド ウ を割 り 当て領域 よ り 小 さ く で き る (割 り 当て領域 よ り 大 き く す る こ と はで き ない) し たが っ て、 子 ウ ィ ン ド ウ の最小化、 最大化、 ま たはサ イ ズ変更は有 効 と はいえ ません。 716 PowerBuilder 第 33 章 PowerBuilder ウ ィ ン ド ウ ActiveX の使い方 PowerBuilder で のア プ リ ーシ ョ ン のテ ス ト 作成 し た アプ リ ケーシ ョ ン を ク ラ イ ア ン ト ブ ラ ウ ザで実行す る 前に、 PowerBuilder で子 ウ ィ ン ド ウ を開 く メ イ ン ウ ィ ン ド ウ を定義 し て、 ア プ リ ケーシ ョ ン を テ ス ト で き ます。 ❖ PowerBuilder ウ ィ ン ド ウ ActiveX ア プ リ ケーシ ョ ン を テ ス ト するには 1 PowerBuilder の中で、種類が メ イ ン(デフ ォ ル ト )の ウ ィ ン ド ウ オ ブジ ェ ク ト を新規作成 し ます。 2 子 ウ ィ ン ド ウ を開 く ス ク リ プ ト を Open イ ベン ト に記述 し ます。 Open(w_child) 3 4 ウ ィ ン ド ウ ペ イ ン タ で、 ウ ィ ン ド ウ サ イ ズ を以下の よ う に設定す る と 便利です。 • メ イ ン ウ ィ ン ド ウ のサ イ ズは、 子 ウ ィ ン ド ウ を十分に表示で き る サ イ ズにす る • 子 ウ ィ ン ド ウ を 左上隅に配置す る 。 こ の設定は、 プ ロ パテ ィ シー ト の [位置] タ ブで行 う [実行] ア イ コ ン を ク リ ッ ク し て、テ ス ト ウ ィ ン ド ウ を実行 し ます。 PowerBuilder でのデバ ッ グ PowerBuilder デバ ッ ガ を使用す る には、 ウ ィ ン ド ウ だけ を実行す る の ではな く 、 アプ リ ケーシ ョ ン を実行す る 必要があ り ます。 メ イ ン ウ ィ ン ド ウ を開 く ス ク リ プ ト で、 アプ リ ケーシ ョ ン オブジ ェ ク ト を定義 し ます。 その後、 [実行] ま たは [デバ ッ グ] コ マ ン ド を使用 し て アプ リ ケーシ ョ ン を テ ス ト し ます。 PBL 内でのオブ ジ ェ ク ト の編成 Web 環境では、 フ ァ イ ルのサ イ ズが重要です。 ク ラ イ ア ン ト はアプ リ ケーシ ョ ン を実行す る 場合、 そのアプ リ ケーシ ョ ン を ご く 最近実行 し たばか り で キ ュ ッ シ ュ さ れ て い る と き 以外は、 実行の たびに ア プ リ ケーシ ョ ン を ダ ウ ン ロ ー ド し ます。 アプ リ ケーシ ョ ン を構築す る 前に、 ラ イ ブ ラ リ ペ イ ン タ を使用 し て、 ア プ リ ケーシ ョ ン で使用す る 、 PBL 内のオブ ジ ェ ク ト を整理 し ま す。 PBL は、 PowerBuilder ウ ィ ン ド ウ ActiveX アプ リ ケーシ ョ ンの PBD の ソ ー ス に な り ま す。 フ ァ イ ル サ イ ズ を 最小限に抑え る には、 ア プ リ ケーシ ョ ン で使用す る オブジ ェ ク ト だけ を入れ、 不要なオブジ ェ ク ト は削除 し ます。 以下の こ と を行 う 必要があ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 717 PowerBuilder ア プ リ ケーシ ョ ンの作成 PowerBuilder リ ソ ー ス (PBR) フ ァ イル の使用 • デー タ ス ト アで使用 さ れ る デー タ ウ ィ ン ド ウ オブジ ェ ク ト な ど、 動的に作成 さ れ る オブジ ェ ク ト 、 ま たはデー タ ウ ィ ン ド ウ コ ン ト ロ ールお よ びプ ロ キ シ オブジ ェ ク ト に動的に割 り 当て ら れ る オブ ジ ェ ク ト をすべて入れ る • 先祖オブジ ェ ク ト を入れ る コ ン ト ロ ールに よ っ ては、 画像に外部フ ァ イ ルを使用す る 場合 も あ り ます。た と えば、ピ ク チ ャ リ ス ト ボ ッ ク ス コ ン ト ロ ール、ツ リ ービ ュ ー コ ン ト ロ ール、 ピ ク チ ャ コ ン ト ロ ール、 ピ ク チ ャ ボ タ ン コ ン ト ロ ー ル、 ポ イ ン タ 、 デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト の ビ ッ ト マ ッ プ オブ ジ ェ ク ト です。 プ ラ グ イ ン アプ リ ケーシ ョ ン で外部フ ァ イ ルの画像を 使用す る 場合、 ク ラ イ ア ン ト で同 じ 画像が同 じ シ ス テ ム パ ス上にない こ と があ り ます。 ク ラ イ ア ン ト マシ ン に ピ ク チ ャ を イ ン ス ト ールす る かわ り に、 1 つま たは複数の PowerBuilder リ ソ ース (PBR: PowerBuilder Resource) フ ァ イ ルを使用 し て、 PBD に画像を組み込む こ と がで き ます。 画像を組み 込む と PBD はサ イ ズは大 き く な り ますが、 独立 し て機能 し ます。 作成す る のは実行フ ァ イ ルではな く PBD なので、 リ ソ ー ス フ ァ イ ル にデー タ ウ ィ ン ド ウ オブジ ェ ク ト を含め る 必要はあ り ません。 作成後 の PBD には、 ソ ース PBL 内のすべての PowerBuilder オブジ ェ ク ト が 含まれます。 ネ ッ ト ワー ク上の画像やそのほかの リ ソ ース PBD に フ ァ イ ルを組み込むかわ り に、 広 く ア ク セ ス さ れ る ネ ッ ト ワ ー ク デ ィ レ ク ト リ に フ ァ イ ルを格納す る こ と も 可能です。 ただ し 、 こ の 場合、 フ ァ イ ルへのパ ス は、 PowerBuilder オブジ ェ ク ト でのパ ス と 同 じ でなければな り ません。 つま り 、 Windows 環境では、 各 ク ラ イ ア ン ト は、 ネ ッ ト ワー ク ド ラ イ ブが割 り 当て ら れた同 じ ド ラ イ ブ名を使用 し なければな り ません。 パ ス にサーバ名を指定す る こ と も 可能です。 ❖ 718 PBR フ ァ イルを定義するには 1 〔Shift〕 + 〔F6〕 を押 し て フ ァ イ ル エデ ィ タ を開 く か、 ほかのテ キ ス ト エデ ィ タ を開 き 、 拡張子 .PBR の新 し い フ ァ イ ルを作成 し ま す。 2 画像やほかの リ ソ ー ス を、 各行に一覧表示 し ま す。 オブジ ェ ク ト のプ ロ パテ ィ ビ ュ ーま たは ス ク リ プ ト に表示 さ れ る 同 じ 形式でパ ス と フ ァ イ ル名を記述 し ます。 PowerBuilder 第 33 章 PowerBuilder ウ ィ ン ド ウ ActiveX の使い方 ショート カッ ト オブジ ェ ク ト のプ ロ パテ ィ ビ ュ ーを表示 し 、 [編集| コ ピー] (Windows では 〔Ctrl〕 + 〔C〕) を 使用し て、 フ ァ イ ル名を ク リ ッ プ ボー ド に コ ピー し ます。 次に、 こ の フ ァ イ ル名を エデ ィ タ に貼 り 付け ます。 3 フ ァ イ ルを保存 し ます。 アプ リ ケーシ ョ ンに複数の PBL が含ま れ、各 PBL にそれぞれの リ ソ ー ス を 使用す る オブ ジ ェ ク ト が含 ま れて い る 場合は、 各 PBL に対 し て PBR フ ァ イ ルを作成す る 必要があ り ます。PBR フ ァ イ ルは、1 つの PBL 内で使用 さ れ る リ ソ ース の フ ァ イ ル名を リ ス ト し ます。 PBD の構築 ラ イ ブ ラ リ ペ イ ン タ ま たはプ ロ ジ ェ ク ト ペ イ ン タ を使用 し て、動的 ラ イ ブ ラ リ (PBD) を構築 し ます。 構築す る 手順は次の と お り です。 PowerBuilder ウ ィ ン ド ウ ActiveX ア プ リ ケーシ ョ ンには、 マシ ン コ ー ド DLL ではな く PBD が必要です。 • マシ ン コ ー ド の選択解除 • PBR フ ァ イルを各 PBD に指定する PBR フ ァ イ ル に リ ス ト し た リ ソ ース を PBL 内のオブジ ェ ク ト で使用す る 場合は、PBR 名を[ ソ ー ス フ ァ イ ル] テ キ ス ト ボ ッ ク ス に入力 し ます。 PBR フ ァ イ ルの定義お よ び動的 ラ イ ブ ラ リ (PBD) の構築方法につい ては、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルで実行フ ァ イ ルの 作成に関す る 章を参照 し て く だ さ い。 HTML ページの作成 PowerBuilder ウ ィ ン ド ウ ActiveX ア プ リ ケ ー シ ョ ン の PowerBuilder PBD を作成お よ び構築 し た ら 、次はそれを表示す る HTML ページ を作 成す る 必要があ り ます。 Web ページに PowerBuilder ウ ィ ン ド ウ を貼 り 付け る には、 Object 要素 を使い ま す。 要素属性には、 PowerBuilder ウ ィ ン ド ウ ActiveX の ク ラ ス ID、 ウ ィ ン ド ウ に割 り 当て る 領域、PBD 名、お よ び PBD 内の子 ウ ィ ン ド ウ 名を指定 し ます。 Object 要素のサ ンプルを以下に示 し ます。 <OBJECT NAME="PBRX1" WIDTH=225 HEIGHT=83 CLASSID="CLSID:99991304-9999-1000-8000-080009AC61A9"> <PARAM NAME="_Version" VALUE="65536"></PARAM> ア プ リ ケーシ ョ ン テ ク ニ ッ ク 719 HTML ページの作成 <PARAM NAME="_ExtentX" VALUE="5962"></PARAM> <PARAM NAME="_ExtentY" VALUE="2164"></PARAM> <PARAM NAME="_StockProps" VALUE="0"></PARAM> <PARAM NAME="PBWindow" VALUE="w_helloworld"></PARAM> <PARAM NAME="LibList" VALUE="http://www.company.com/rknnt.pbd;"></PARAM> <PARAM NAME="PBApplication" VALUE="rknnt"></PARAM> </OBJECT> Object 要素の属性 Object 要素は、 HTML で ActiveX コ ン ト ロ ールを指定す る と き に一緒 に指定し ま す。こ れによ っ て、いく つかの標準属性を 定義し 、PowerBuilder で追加属性を定義 し ます。 HTML 属性 HTML 属性では、ク ラ ス ID、名前、お よ び Web ページ上で PowerBuilder ウ ィ ン ド ウ ActiveX に割 り 当て る 領域を指定 し ます。 表 33-2: Object 要素の HTML 属性 HTML 属性 NAME CLASSID 値 ス ク リ プ ト で参照 さ れ る 場合ま たはフ ォームの一部 と し て発行 さ れ る 場合のオブジ ェ ク ト 名 登録 さ れ る ActiveX コ ン ト ロ ールの ク ラ ス ID 構文は次の と お り CLSID:class_id CODEBASE WIDTH HEIGHT 720 登録済みの ActiveX コ ン ト ロ ールの ク ラ ス ID 値を検 索す る 場合には、 PowerBuilder ブ ラ ウ ザの [OLE] タ ブ を使用で き る 。OLE カ ス タ ム コ ン ト ロ ール項目を展 開 し 、 次 に PowerBuilder Window Control 項目 ま た は PowerBuilder Secure Window Control 項目を展開す る 。ク ラ ス ID は、 ク ラ ス情報分岐の GUID 項目の値にな る ク ラ イ ア ン ト マ シ ン に PowerBuilder ウ ィ ン ド ウ ActiveX が な い場合に ダ ウ ン ロ ー ド す る OCX ま たは CAB フ ァ イ ルの場所を識別す る URL ク ラ イ ア ン ト マ シ ン には PowerBuilder 仮想マ シ ン が 必要。 ま た、 シ ス テ ム パ ス 上にそのほか必要な DLL が存在 し なければな ら ない 表示する ウ ィ ン ド ウ の幅。 ピ ク セル値で指定す る 表示する ウ ィ ン ド ウ の高 さ 。 ピ ク セル値で指定す る PowerBuilder 第 33 章 PowerBuilder ウ ィ ン ド ウ ActiveX の使い方 WIDTH 属性 と HEIGHT 属性には、 子 ウ ィ ン ド ウ の幅お よ び高 さ の最 大値を定義 し ます。 子 ウ ィ ン ド ウ のサ イ ズ を変更で き る 場合、 指定の サ イ ズ よ り 小 さ く で き ますが、 大 き く はで き ません。 Param 要素 PowerBuilder ウ ィ ン ド ウ ActiveX のプ ロ パテ ィ を指定す る には、 Param 要素な ど を設定 し ま す。 Param 要素に よ っ て、 ア プ リ ケーシ ョ ン を起 動す る ウ ィ ン ド ウ オブジ ェ ク ト 、 アプ リ ケーシ ョ ン オブジ ェ ク ト 、 追 加 ラ イ ブ ラ リ 、 お よ び PowerBuilder ウ ィ ン ド ウ ActiveX に渡す追加パ ラ メ ー タ を識別で き ます。 表 33-3 に、 PowerBuilder 固有の Param 要素 を示 し ます。 表 33-3: PowerBuilder ウ ィ ン ド ウ ActiveX の Param 構成要素 プ ロパテ ィ PBWINDOW LIBLIST PBAPPLICATION (オプシ ョ ン) DISPLAYRUNTIMEM ESSAGES (オプシ ョ ン) COMMANDPARM (オプシ ョ ン) 値 PBD 内の子ウ ィ ン ド ウ の ク ラ ス名 ア プ リ ケーシ ョ ン で必要な PowerBuilder 動的 ラ イ ブ ラ リ (PBD フ ァ イ ル) の リ ス ト 。 複数指定す る 場合はセ ミ コ ロ ン で区切 る PowerBuilder アプ リ ケーシ ョ ン オブジ ェ ク ト Boolean 型の値。 実行時エ ラ ーを表示す る か ど う か を指定す る ウ ィ ン ド ウ に渡す文字列。ウ ィ ン ド ウ内か ら こ の文 字列にア ク セ スす る には、 CommandParm 関数を呼 び出す Object 要素の記述 コ ーデ ィ ン グ 時エ ラ ー を 最小限に抑 え る には、 PowerSite エデ ィ タ 、 ActiveX Control Pad、 Front Page な ど の ActiveX 対応の HTML エデ ィ タ を使用 し て Object 要素やパ ラ メ ー タ を記述 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 721 HTML ページの作成 基本ページ 次のサン プル ページには、 PowerBuilder ウ ィ ン ド ウ ActiveX が貼 り 付 けて あ り ます。 以下は、 こ のページ を作成す る ための HTML コ ー ド です。 Object 要素 を使用 し て、 PowerBuilder ウ ィ ン ド ウ ActiveX を指定 し てい る こ と に 注目 し て く だ さ い。 <HTML> <HEAD> <TITLE>Employee List</TITLE> </HEAD> <BODY> <H1>PowerBuilder window ActiveX</H1> <P> <OBJECT ID="PBRX1" NAME="PBRX1" WIDTH=357 HEIGHT=269 CLASSID="CLSID:99991304-9999-1000-8000-080009AC61A9"> <PARAM NAME="_Version" VALUE="65536"> <PARAM NAME="_ExtentX" VALUE="9440"> <PARAM NAME="_ExtentY" VALUE="7112"> 722 PowerBuilder 第 33 章 PowerBuilder ウ ィ ン ド ウ ActiveX の使い方 <PARAM NAME="_StockProps" VALUE="0"> <PARAM NAME="PBWindow" VALUE="w_emplist"> <PARAM NAME="LibList" VALUE="http://www.company.com/rknnt.pbd;"> <PARAM NAME="PBApplication" VALUE="rknnt"> </OBJECT> </BODY> </HTML> ク ラ イ ア ン ト 側のス ク リ プ ト HTML ペー ジ に JavaScript ま た は VBScript を 追加す る こ と に よ り 、 PowerBuilder ウ ィ ン ド ウ ActiveX 内に表示 さ れ る ウ ィ ン ド ウ と 対話で き ます。 以下の こ と を行 う こ と がで き ます。 • ウ ィ ン ド ウ 内で発生す る イ ベン ト に応答す る ための イ ベン ト ハン ド ラ を記述す る • PowerScript 関数を呼び出 し て、 ポ イ ン タ 情報の取得、 印刷、 再描 画の設定、 お よ び タ イ マー設定を行 う • InvokePBFunction 関数を呼び出 し て、 ユーザ定義 ウ ィ ン ド ウ 関数を 起動す る • TriggerPBEvent 関数を呼び出 し て、 ウ ィ ン ド ウ でユーザ イ ベン ト を 発生 さ せ る ActiveX のプ ロパテ ィ 、 イ ベン ト 、 および関数の表示 ウ ィ ン ド ウ ActiveX を マシ ン に登録 し てい る と き には、PowerBuilder ブ ラ ウ ザの [OLE] タ ブ を使用 し て、 ウ ィ ン ド ウ ActiveX のプ ロ パテ ィ 、 イ ベン ト 、 お よ び関数の リ ス ト を見 る こ と がで き ます。 イ ベン ト ハン ド ラの 記述 HTML ページには、 PowerBuilder ウ ィ ン ド ウ ActiveX を制御す る ため に、 JavaScript ま たは VBScript イ ベン ト ハン ド ラ を記述で き ます。 コ ーデ ィ ング例の前提条件 次の コ ー ド 例は、 HTML ページに Form と い う 名前の buttonForm が含 ま れてい る こ と を想定 し た も のです。 こ の フ ォ ーム には、 複数の入力 要素 と し て、passedFlags、passedXPos、お よ び passedYPos が含まれます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 723 HTML ページの作成 ❖ PowerBuilder ウィ ン ド ウ ActiveX を 制御する JavaScript イ ベン ト ハン ド ラ を記述するには 1 PowerBuilder ウ ィ ン ド ウ ActiveX を HTML ページに挿入 し て、 必 要なすべてのプ ロ パテ ィ を指定 し ます。 <OBJECT NAME="PBRX1" WIDTH=225 HEIGHT=83 CLASSID="CLSID:99991304-9999-1000-8000080009AC61A9"> <PARAM NAME="_Version" VALUE="65536"> <PARAM NAME="_ExtentX" VALUE="5962"> <PARAM NAME="_ExtentY" VALUE="2164"> <PARAM NAME="_StockProps" VALUE="0"> <PARAM NAME="PBWindow" VALUE="w_helloworld"> <PARAM NAME="LibList" VALUE="http://www.company.com/rknnt.pbd;"> <PARAM NAME="PBApplication" VALUE="rknnt"> </OBJECT> 2 HTML ページのヘ ッ ダに、 イ ベン ト が発生 し た と き に呼び出 さ れ る 関数を記述 し ます。 次の関数サン プルは、 Clicked イ ベン ト の引数の表示のみを実行 し ます。 function wasClicked(flags, xpos, ypos) { document.buttonForm.passedFlags.value = flags; document.buttonForm.passedXPos.value = xpos; document.buttonForm.passedYPos.value = ypos; } 3 HTML ページの本体に、 イ ベン ト が発生 し た と き に関数を呼び出 す イ ベン ト ハン ド ラ を記述 し ます。 <SCRIPT LANGUAGE="JavaScript" FOR="PBRX1" Event="Clicked(flags, xpos, ypos)"> <!-wasClicked(flags, xpos, ypos); --> </SCRIPT> コ ーデ ィ ング ス タ イル 次に示す よ う に、 イ ベン ト ハン ド ラ 内にすべての コ ー ド を記述 し て、 関数呼び出 し を省略す る こ と も 可能です。 724 PowerBuilder 第 33 章 PowerBuilder ウ ィ ン ド ウ ActiveX の使い方 ❖ PowerBuilder ウ ィ ン ド ウ ActiveX を制御する VBScript イ ベン ト ハン ド ラ を記述するには 1 PowerBuilder ウ ィ ン ド ウ ActiveX を HTML ページに挿入 し て、 必 要なすべてのプ ロ パテ ィ を指定 し ます。 <OBJECT NAME="PBRX1" WIDTH=225 HEIGHT=83 CLASSID="CLSID:99991304-9999-1000-8000080009AC61A9"> <PARAM NAME="_Version" VALUE="65536"> <PARAM NAME="_ExtentX" VALUE="5962"> <PARAM NAME="_ExtentY" VALUE="2164"> <PARAM NAME="_StockProps" VALUE="0"> <PARAM NAME="PBWindow" VALUE="w_helloworld"> <PARAM NAME="LibList" VALUE="http://www.company.com/rknnt.pbd;"> <PARAM NAME="PBApplication" VALUE="rknnt"> </OBJECT> 2 HTML ページの本体に、 イ ベン ト を処理す る イ ベン ト ハン ド ラ を 記述 し ます。 次の関数サン プルは、 Clicked イ ベン ト の引数の表示のみを実行 し ます。 <SCRIPT LANGUAGE="VBScript"> <!-Sub PBRX1_Clicked(flags, xpos, ypos) document.buttonForm.passedFlags.value = flags document.buttonForm.passedXPos.value = xpos document.buttonForm.passedYPos.value = ypos end sub --> </SCRIPT> PowerScript 関数の呼 び出 し PowerBuilder ウ ィ ン ド ウ ActiveX では、Active コ ン ト ロ ールに表示 さ れ る ウ ィ ン ド ウ 上で、 以下の PowerScript 関数 を 呼び出す こ と がで き ま す。 • PointerX ウ ィ ン ド ウ の左端か ら ポ イ ン タ ま での距離を戻す • PointerY ウ ィ ン ド ウ の上端か ら ポ イ ン タ ま での距離を戻す • Print • SetRedraw • Timer ア プ リ ケーシ ョ ン テ ク ニ ッ ク ウ ィ ン ド ウ を印刷す る 変更が加え ら れ る たびに ウ ィ ン ド ウ を 自動的に再描 画す る か ど う か を切 り 替え る ウ ィ ン ド ウ の Timer イ ベン ト を、 指定 し た間隔で繰 り 返 し 発生 さ せ る 725 HTML ページの作成 こ れ ら の関数の詳細につい ては、 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ アルを参照 し て く だ さ い。 す べ て の ActiveX コ ン ト ロ ー ル と 同 様、 PowerBuilder ウ ィ ン ド ウ ActiveX では、AboutBox 関数を呼び出 し て コ ン ト ロ ールについての情報 を参照で き ます。 コ ーデ ィ ング例の前提条件 次の コ ー ド 例は、 PowerBuilder ウ ィ ン ド ウ の Timer イ ベン ト に よ っ て 呼び出 さ れ る ス ク リ プ ト をすでに作成 し てい る こ と を想定 し た も ので す。 ❖ JavaScript を使用 し て PowerScript 関数を呼び出すには 1 PowerScript 関数を呼び出す関数を記述 し ます。 次の例では、 PowerScript の Timer 関数を呼び出 し ます。 <SCRIPT LANGUAGE="JavaScript"> <!-var cumSeconds = 0; function setPBTimer( f ) { var li_return var li_interval li_interval = parseInt(f.timerInterval.value); li_return = PBRX1.Timer(li_interval); if (li_return != 1) { alert(" タ イ マーの設定に失敗 し ま し た "); } } //--> /SCRIPT 2 その関数を呼び出す関数、 ア ン カー、 ま たはボ タ ン の ス ク リ プ ト を記述 し ます。 次の例では、 フ ォーム上のボ タ ン を使用 し て、 手順 1 で定義 し た、 タ イ マー間隔を リ セ ッ ト す る 関数を呼び出 し ます。 <FORM NAME="clockForm"> <P>Timer Interval: <INPUT TYPE=Text NAME="timerInterval" Size="5"> <P><INPUT TYPE=BUTTON VALUE="Set Timer" ONCLICK="setPBTimer(this.form)"> </FORM> 726 PowerBuilder 第 33 章 PowerBuilder ウ ィ ン ド ウ ActiveX の使い方 ❖ VBScript を使用 し て PowerScript 関数を呼び出すには 1 PowerScript 関数を呼び出す関数を記述 し ます。 次の例では、 PowerScript の Timer 関数を呼び出 し ます。 <SCRIPT LANGUAGE="VBScript"> <!-dim cumSeconds cumSeconds = 0 Sub pbSetTime() dim li_return dim li_interval li_interval = clockForm.timerInterval.value li_return = pbrx1.Timer(li_interval) if li_return 1 THEN msgBox " タ イ マーの設定に失敗 し ま し た " end if end sub //--> </SCRIPT> 2 その関数を呼び出す関数、 ア ン カー、 ま たはボ タ ン の ス ク リ プ ト を記述 し ます。 次の例では、 フ ォ ーム上のボ タ ン を使用 し て、 手順 1 で定義 し た、 タ イ マー間隔を リ セ ッ ト す る 関数を呼び出 し ます。 <FORM NAME="clockForm"> <P>Timer Interval: <INPUT TYPE=Text NAME="timerInterval" Size="5"> <HR> <P>Mirror of PB Time: <INPUT TYPE=Text NAME="pbTime" Size="8"> <HR> <P>INPUT TYPE=BUTTON VALUE="Set Timer" onClick="call pbSetTime()"> </FORM> ユーザ定義関数の呼び 出し PowerBuilder ウ ィ ン ド ウ ActiveX には、 InvokePBFunction 関数があ り ま す。 こ の関数は、 ユーザ定義 ウ ィ ン ド ウ 関数を呼び出 し ます。 VBScript と JavaScript の違い ユーザ定義関数に引数があ る 場合、 JavaScript では、 SetArgElement 関 数を使用 し て引数を指定 し なければな り ません。 つま り 、 InvokePBFunction 関数で明示的に引数を指定す る こ と はで き ません。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 727 HTML ページの作成 ❖ ユーザ定義関数を呼び出す JavaScript を記述するには 1 必要な場合は、 ウ ィ ン ド ウ 関数を定義 し ます。 次の例は、 PowerBuilder ウ ィ ン ド ウ の中で、 パ ラ メ ー タ と し て文字 列を受け取 る 関数 of_arg をすでに定義 し てい る こ と を想定 し た も のです。 2 InvokePBFunction 関数を呼び出す JavaScript 関数を記述 し 、 実際に 呼び出すユーザ定義関数を指定 し ます。 次の例では、 引数を初期化 し 、 ウ ィ ン ド ウ 関数 of_args を呼び出 し ます。 function invokeFunc(f) { var retcd; var rc; var numargs; var theFunc; var theArg; retcd = 0; numargs = 1; theArg = f.textToPB.value; PBRX1.SetArgElement(1, theArg); theFunc = "of_args"; retcd = PBRX1.InvokePBFunction(theFunc, numargs); rc = parseInt(PBRX1.GetLastReturn()); if (rc != 1) { alert(" エ ラ ー。 空の文字列 "); } PBRX1.ResetArgElements(); } 3 JavaScript 関数を呼び出す関数、 ア ン カー、 ま たはフ ォーム ボ タ ン を記述 し ます。 た と えば、 次の よ う にな り ます。 <FORM> <P> こ のテキス ト を PowerBuilder に コ ピー し ます。 <INPUT TYPE=Text NAME="textToPB" SIZE="20"> <P><INPUT TYPE=BUTTON VALUE="Invoke Func" ONCLICK="invokeFunc(this.Form)"> </FORM> JavaScript での引数の定義 JavaScript で記述す る 場合、 関数 と イ ベン ト の引数は、 SetArgElement 関 数を呼び出 し て定義 し ます。 728 PowerBuilder 第 33 章 PowerBuilder ウ ィ ン ド ウ ActiveX の使い方 ❖ ユーザ定義関数を呼び出す VBScript を記述するには 1 必要な場合は、 ウ ィ ン ド ウ 関数を定義 し ます。 次の例は、 PowerBuilder ウ ィ ン ド ウ の中で、 パ ラ メ ー タ と し て文字 列を受け取 る 関数 of_arg をすでに定義 し てい る こ と を想定 し た も のです。 2 InvokePBFunction 関数を呼び出す VBScript 関数を記述 し 、 実際に呼 び出すユーザ定義関数を指定 し ます。 次の例では、 引数を初期化 し 、 ウ ィ ン ド ウ 関数 of_args を呼び出 し ます。 Sub invokeFunction() Dim retcd Dim myForm Dim args(1) Dim rc Dim numargs Dim theFunc Dim rcfromfunc retcd = 0 numargs = 1 rc = 0 theFunc = "of_args" Set myForm = Document.buttonForm args(0) = buttonForm.textToPB.value retcd = PBRX1.InvokePBFunction(theFunc, numargs, args) rc = PBRX1.GetLastReturn() if rc 1 then msgbox " エ ラ ー。 空の文字列 " end if PBRX1.ResetArgElements() end sub 3 関数、 ア ン カー、 ま たは ク リ ッ ク し て JavaScript 関数を呼び出す フ ォ ーム ボ タ ン の ス ク リ プ ト を記述 し ます。 た と えば、 次の よ う にな り ます。 <FORM NAME="buttonForm"> <P><INPUT TYPE=Text NAME="textToPB" SIZE="20"> <P><INPUT TYPE=BUTTON VALUE="Invoke Function" ONCLICK="call invokeFunction()"> /FORM </FORM> ユーザ イ ベ ン ト の呼 び出 し PowerBuilder ウ ィ ン ド ウ ActiveX には、TriggerPBEvent 関数があ り ます。 こ の関数は、 ウ ィ ン ド ウ 上でユーザ イ ベン ト を発生 さ せます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 729 HTML ページの作成 ❖ ユーザ イ ベン ト を発生 さ せる JavaScript を記述するには 1 必要な場合は、 ウ ィ ン ド ウ のユーザ イ ベン ト を定義 し ます。 次の例は、 PowerBuilder ウ ィ ン ド ウ の中で、 パ ラ メ ー タ と し て文字 列を受け取 る ユーザ イ ベン ト ue_arg をすでに定義 し てい る こ と を 想定 し た も のです。 2 ユーザ イ ベン ト を呼び出す関数を記述 し ます。 次の例では、 引数 を初期化 し 、 ウ ィ ン ド ウ 関数 ue_args を呼び出 し ます。 function triggerEvent(f) { var retcd; var rc; var numargs; var theEvent; var theArg; retcd = 0; numargs = 1; theArg = f.textToPB.value; PBRX1.SetArgElement(1, theArg); theEvent = "ue_args"; retcd = PBRX1.TriggerPBEvent(theEvent, numargs); rc = parseInt(PBRX1.GetLastReturn()); if (rc != 1) { alert(" エ ラ ー。 空の文字列 "); } PBRX1.ResetArgElements(); } 3 TriggerPBEvent 関数を呼び出す関数、 ア ン カー、 ま たはフ ォ ーム ボ タ ンの ス ク リ プ ト を記述 し ます。 た と えば、 次の よ う にな り ます。 <FORM> <P><INPUT TYPE=Text NAME="textToPB" SIZE="20"> <P><INPUT TYPE=BUTTON VALUE="Trigger Event" ONCLICK="triggerEvent(this.Form)"> </FORM> ❖ ユーザ イ ベン ト を発生 さ せる VBScript を記述する には 1 必要な場合は、 ウ ィ ン ド ウ のユーザ イ ベン ト を定義 し ます。 次の例は、 PowerBuilder ウ ィ ン ド ウ の中で、 パ ラ メ ー タ と し て文字 列を受け取 る ユーザ イ ベン ト ue_arg をすでに定義 し てい る こ と を 想定 し た も のです。 2 730 ユーザ イ ベン ト を呼び出す関数を記述 し ます。 次の例では、 引数 を初期化 し 、 ウ ィ ン ド ウ 関数 ue_args を呼び出 し ます。 PowerBuilder 第 33 章 PowerBuilder ウ ィ ン ド ウ ActiveX の使い方 Sub TrigEvent( ) Dim retcd Dim myForm Dim args(1) Dim rc Dim numargs Dim theEvent retcd = 0 numargs = 1 rc = 0 theEvent = "ue_args" Set myForm = Document.buttonForm args(0) = buttonForm.textToPB.value retcd = PBRX1.TriggerPBEvent(theEvent, numargs, args) rc = PBRX1.GetLastReturn() if rc 1 then msgbox " エ ラ ー。 空の文字列 " end if PBRX1.ResetArgElements() end sub 3 関数、 ア ン カー、 ま たは ク リ ッ ク し て JavaScript 関数を呼び出す フ ォ ーム ボ タ ン の ス ク リ プ ト を記述 し ます。 た と えば、 次の よ う にな り ます。 <FORM NAME="buttonForm"> <P><INPUT TYPE=Text NAME="textToPB" SIZE="20"> <P><INPUT TYPE=BUTTON VALUE="Trigger Event" ONCLICK="call TrigEvent()"> </FORM> ア プ リ ケーシ ョ ン テ ク ニ ッ ク 731 PowerBuilder ウ ィ ン ド ウ ActiveX のイ ベン ト PowerBuilder ウ ィ ン ド ウ ActiveX のイ ベン ト PowerBuilder ウ ィ ン ド ウ ActiveX は、 子 ウ ィ ン ド ウ 内で発生す る い く つかの イ ベン ト に応答で き ます。 こ れ ら の イ ベン ト は、 ア ウ ト バ ウ ン ド イ ベ ン ト です。 ま ず、 PowerBuilder ウ ィ ン ド ウ 内で発生 し 、 次に PowerBuilder ウ ィ ン ド ウ ActiveX 内で発生 し ま す。 こ れ ら の イ ベン ト に応答す る JavaScript ま たは VB Script コ ー ド を追加で き ます。 表 33-4 に こ れ ら の イ ベン ト を示 し ます。 表 33-4: PowerBuilder ウ ィ ン ド ウ ActiveX のイ ベン ト イ ベン ト Activate Clicked Close Deactivate DoubleClicked Hide Key MouseDown PBMouseMove PBMouseUp RButtonDown Resize Show SystemKey Timer 732 発生する状況 ウ ィ ン ド ウ がア ク テ ィ ブにな る 直前に発生する 有効化 さ れた表示可能オブ ジ ェ ク ト が配置 さ れて い な い、 ウ ィ ン ド ウ 内の領域を ユーザが ク リ ッ ク し た と き に発生す る ウ ィ ン ド ウ が閉 じ ら れ る と き に発生する ウ ィ ン ド ウ が非ア ク テ ィ ブにな っ た と き に発生する 有効化 さ れた表示可能オブ ジ ェ ク ト が配置 さ れて い な い、 ウ ィ ン ド ウ 内の領域を ユーザがダブル ク リ ッ ク し た と き に 発生す る ウ ィ ン ド ウ が非表示にな る 直前に発生する ユ ー ザ が キ ー を 押 し た と き に 挿入 ポ イ ン ト が ラ イ ン エ デ ィ ッ ト になければ発生す る 有効化 さ れた表示可能オブ ジ ェ ク ト が配置 さ れて い な い、 ウ ィ ン ド ウ 内の領域でユーザがマ ウ ス の左ボ タ ン を押 し た と き に発生す る ウ ィ ン ド ウ内でポ イ ン タ が移動 し た と き に発生する 有効化 さ れた表示可能オブ ジ ェ ク ト が配置 さ れて い な い、 ウ ィ ン ド ウ 内の領域でユーザがマ ウ ス の左ボ タ ン を離 し た と き に発生す る 有効化 さ れた表示可能オブ ジ ェ ク ト が配置 さ れて い な い、 ウ ィ ン ド ウ 内の領域でユーザがマ ウ ス の右ボ タ ン を押 し た と き に発生す る ユーザ ま たは ス ク リ プ ト に よ っ て、 ウ ィ ン ド ウ が開かれた と き 、 ま たは ウ ィ ン ド ウ のサ イ ズが変更 さ れた と き に発生 する ス ク リ プ ト が ウ ィ ン ド ウ に対 し て Show 関数を実行 し た と き 、 ウ ィ ン ド ウ が表示 さ れ る 直前に発生する 挿入ポ イ ン ト が ラ イ ン エデ ィ ッ ト にない と き に、 ユーザが 〔Alt〕 ま たは 〔Alt〕 + 別のキーを押す と 発生す る Timer 関数が呼び出 さ れてか ら 指定の秒数が経過 し た と き に発生す る PowerBuilder 第 33 章 PowerBuilder ウ ィ ン ド ウ ActiveX の使い方 サーバの設定 サーバのセ ッ ト ア ッ プでは、 サーバ上に フ ァ イ ルを配置 し ます。 サーバの適切なデ ィ レ ク ト リ に、 PowerBuilder ラ イ ブ ラ リ 、 PowerBuilder ウ ィ ン ド ウ ActiveX モジ ュ ール、 お よ び HTML フ ァ イ ルを コ ピーす る 必要があ り ます。 表 33-5: サーバ上の PBD フ ァ イル と HTML フ ァ イルの場所 フ ァ イル HTML ページ Param 要素の LibList 属 性で指定 し た PBD フ ァ イル PowerBuilder ウ ィ ン ド ウ ActiveX モジ ュ ール ア プ リ ケーシ ョ ン テ ク ニ ッ ク 場所 HTML ド キ ュ メ ン ト デ ィ レ ク ト リ 。HTML ページ を、ページに リ ン ク する URL で指定 さ れ る デ ィ レ ク ト リ に コ ピーす る Web サーバ ア プ リ ケーシ ョ ン の ア プ リ ケーシ ョ ン パ ス ま たはシ ス テ ム パ ス に指定 さ れたデ ィ レ クトリ HTML ド キ ュ メ ン ト の デ ィ レ ク ト リ 、 ま た は Object 要素の CODEBASE 属性に指定 さ れた その ほかのデ ィ レ ク ト リ 733 ユーザのワー ク ス テーシ ョ ンの設定 ユーザのワー ク ス テーシ ョ ンの設定 ユーザが PowerBuilder ウ ィ ン ド ウ ActiveX な ど の貼 り 付け ら れた Web ページ を表示す る には、 ク ラ イ ア ン ト ワ ー ク ス テーシ ョ ンへの支援 ソ フ ト ウ ェ アの イ ン ス ト ール と 、 Web サーバへの接続が必要です。 表 33-6: PowerBuilder ウ ィ ン ド ウ ActiveX を表示する ための ク ラ イ ア ン ト 要件 コ ンポーネ ン ト 詳細 イ ン タ ーネ ッ ト 接続 企業内で、 ま たは イ ン タ ーネ ッ ト サービ ス プ ロ バ イ か イ ン ト ラ ネ ッ ト 接 ダか ら 利用で き る 続 ActiveX を サ ポ ー ト ブ ラ ウ ザ ベ ン ダ か ら 入手で き る 。 Microsoft Internet す る Web ブ ラ ウ ザ Explorer 3.x 以降な ど PowerBuilder ラ ン タ ラ ン タ イ ム フ ァ イ ルを イ ン ス ト ールす る 。805 ページ イ ム DLL の 「PowerBuilder ラ ン タ イ ム フ ァ イ ル」 を参照 PowerBuilder ウ ィ ン ド ウ ActiveX モ ジ ュ ール そのほかの フ ァ イ ル PowerBuilder ラ ン タ イ ム DLL は、 アプ リ ケーシ ョ ン デ ィ レ ク ト リ か、 シ ス テ ム パ ス上のデ ィ レ ク ト リ に 置く 。PowerBuilder ウ ィ ン ド ウ ActiveX は、PowerBuilder 仮想マシ ンお よ びそのほか必要な配布 DLL にア ク セ ス で き なければな ら ない。 こ のため、 PowerBuilder ラ ン タ イ ム DLL 用のデ ィ レ ク ト リ を シ ス テ ム パ ス に 追加する か、ラ ン タ イ ム DLL を Windows¥System デ ィ レ ク ト リ に配置す る PBRX90.OCX フ ァ イ ルを ク ラ イ ア ン ト ワー ク ス テー シ ョ ンに コ ピー し て登録す る 。 ま たは、 Object 要素に CODEBASE 属性を追加す る 。 こ れに よ り 、 ページが ロ ー ド さ れた と き に、ブ ラ ウ ザは こ の フ ァ イ ルを ダ ウ ン ロ ー ド し 、 登録す る 画像 ソ ース を PBD に入れていない場合、 フ ァ イ ルが オブ ジ ェ ク ト のプ ロ パテ ィ で指定 さ れ る パ ス 上にな ければ、 そのパス に コ ピーす る PowerBuilder ウ ィ ン ド ウ ActiveX アプ リ ケーシ ョ ン で デー タ ベー ス に接続す る 場合は、 DBMS に合わせて ク ラ イ ア ン ト ソ フ ト ウ ェ ア を セ ッ ト ア ッ プす る 。 ク ラ イ ア ン ト マシ ンか ら DBMS に接続す る 方法につい ては、 『デー タ ベース と の接続』 マニ ュ アルを参照 734 PowerBuilder 第 33 章 PowerBuilder ウ ィ ン ド ウ ActiveX の使い方 Web ページ と PowerBuilder ウィ ン ド ウ ActiveX ア プ リ ケーシ ョ ン の 表示 必要 な ソ フ ト ウ ェ ア を イ ン ス ト ールす る と 、 ユーザは PowerBuilder ウ ィ ン ド ウ ActiveX アプ リ ケーシ ョ ン が貼 り 付け ら れた Web ページ を 表示で き ます。 ユーザが Web ページの URL を指定す る と 、 以下の こ と が行われ ます。 • PowerBuilder ウ ィ ン ド ウ に割 り 当て ら れた領域に、ページ上のテ キ ス ト が表示 さ れ る • ク ラ イ ア ン ト がサーバか ら PBD を ダ ウ ン ロ ー ド す る • ブ ラ ウ ザが Web ページ内に子 ウ ィ ン ド ウ を表示す る • ウ ィ ン ド ウ の中の コ ン ト ロ ール と 対話 し 、 イ ベン ト の ス ク リ プ ト を実行す る • ユーザが別のページ に移 る と 、 ウ ィ ン ド ウ が閉 じ 、 PowerBuilder DLL や共有 ラ イ ブ ラ リ が メ モ リ か ら ア ン ロ ー ド さ れ る ア プ リ ケーシ ョ ン テ ク ニ ッ ク 735 ユーザのワー ク ス テーシ ョ ンの設定 736 PowerBuilder 第 8 部 全般的な テ ク ニ ッ ク 日本語仕様、 印刷処理、 および Windows のレ ジ ス ト リ を 扱 う テ ク ニ ッ ク について説明 し ます。InfoMaker で使用す る様式 と ア ク シ ョ ンの作成について も説明 し ます。 第 3 4 章 PowerBuilder の日本語仕様 こ の章について こ の章では、 PowerBuilder 9.0 の日本語処理機能について解説 し ま す。 内容 項目 日本語仕様のPowerScript 関数 と デー タ ウ ィ ン ド ウ ペ イ ン タ 関 数 IMEMode プ ロ パテ ィ ページ 739 740 日本語仕様の PowerScript 関数 と デー タ ウ ィ ン ド ウ ペ イ ン タ 関数 日本語仕様の文字列操作 を 行 う PowerScript 関数 と デー タ ウ ィ ン ド ウ ペ イ ン タ 関数 と は以下にあげ る 関数です。 以下の関数は、 1 バ イ ト コ ー ド 、 2 バ イ ト コ ー ド の両方に対応 し ます。 文字列操作は文字単位で行われ ます。 Fillw LeftTrimw LastPosw Leftw Lenw MatchW Midw Posw RightTrimw Replacew Rightw Trimw 以下の関数は、 バ イ ト 単位で文字列操作を行い ます。 LeftC RightC MidC ア プ リ ケーシ ョ ン テ ク ニ ッ ク 739 IMEMode プ ロパテ ィ IME 関数 と は以下にあげ る 関数です。 IME 関数を使用 し て、 IME モー ド の取得や設定、 IME を介入 し て入力 さ れた文字の読みがなが取得で き ます。 IMESetMode IMEGetMode IMEGetCompositionText 文字列操作 を 行 う PowerScript 関数 と IME 関数 に つい て の 詳細は、 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ アル を参照 し て く だ さ い。 デー タ ウ ィ ン ド ウ ペ イ ン タ 関数につい て の詳細は、 『デー タ ウ ィ ン ド ウ リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 注意 マニ ュ アル中の文字数に関す る 記述は、特に こ と わ り がない限 り 、1 文 字を 1 バ イ ト と し て数え た も のです。 対象 と な る 文字列に 2 バ イ ト 文 字が含ま れ る 場合は、 文字数 と バ イ ト 数が一致 し な く な る ので注意が 必要です。 IMEMode プ ロパテ ィ IME 関数 を用い る かわ り に コ ン ト ロ ールの新規プ ロ パテ ィ IMEMode を用いて IME の設定や、 現行の設定値の取得をす る こ と も 可能です。 IMEMode プ ロ パテ ィ をサポー ト り です。 DropDownListBox DropDownPictureListBox EditMask し てい る コ ン ト ロ ールは、以下の と お MultiLineEdit RichTextEdit SingleLineEdit なお、デー タ ウ ィ ン ド ウ では、以下の編集様式が IMEMode プ ロ パテ ィ をサポー ト し てい ます。 エデ ィ ッ ト 編集様式 エデ ィ ッ ト マ ス ク 編集様式 ド ロ ッ プダ ウ ン リ ス ト ボ ク ッ ス編集様式 IMEMode プ ロ パテ ィ の設定は、ウ ィ ン ド ウ ペ イ ン タ 、ユーザ オブジ ェ ク ト ペ イ ン タ 、 デー タ ウ ィ ン ド ウ ペ イ ン タ において、 コ ン ト ロ ールや 編集様式のプ ロ パテ ィ シー ト で設定で き る ほか、 ス ク リ プ ト で実行時 に値の設定や取得を行 う こ と がで き ます。 740 PowerBuilder 第 34 章 PowerBuilder の日本語仕様 IMEMode プ ロ パテ ィ についての詳細は、 『オブジ ェ ク ト と コ ン ト ロ ー ル』 マニ ュ アル と 『デー タ ウ ィ ン ド ウ リ フ ァ レ ン ス 』 マニ ュ アルを参 照 し て く だ さ い。 ペ イ ン タ での IMEMode プ ロ パ テ ィ の設定方法は、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 741 IMEMode プ ロパテ ィ 742 PowerBuilder 第 3 5 章 印刷 こ の章について こ の章では、 PowerScript の組み込み関数を使用 し て、 リ ス ト やレ ポー ト を印刷す る 方法について説明 し ます。 内容 項目 印刷関数 印刷の基礎 ジ ョ ブの印刷 タ ブの使い方 印刷ジ ョ ブの停止 高度な印刷技法 ページ 743 745 745 746 747 748 印刷関数 PowerScript 言語では、 帳票やレ ポー ト の作成のための組み込み関 数を 用意し ていま す。わずか 3 つの関数(PrintOpen、Print、PrintClose) を用い る だけで、 使用プ リ ン タ のデフ ォ ル ト の フ ォ ン ト で表 ( タ ブ ラ ) 形式の レ ポー ト を印刷で き ます。 ほかの関数を用い る と 、複 数のテ キ ス ト フ ォ ン ト 、 文字サ イ ズ、 ス タ イ ルが使用で き る だけ でな く 、罫線やピ ク チ ャ を用いた帳票やレ ポー ト が作成で き ます。 表 35-1 は印刷用の関数の リ ス ト です。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 743 印刷関数 表 35-1: PowerScript 印刷関数 関数 Print PrintBitMap PrintCancel PrintClose PrintDatawindow PrintDefineFont PrintGetPrinter PrintGetPrinters PrintLine PrintOpen PrintOval PrintPage PrintRect PrintRoundRect PrintScreen PrintSend PrintSetFont PrintSetPrinter PrintSetSpacing PrintSetup PrintSetupPrinter PrintText PrintWidth PrintX PrintY 744 説明 Print 関数には 5 種類の構文があ る 。タ ブ を 1 個指定で き る 構文が 3 つ、 タ ブ を 2 個指定で き る 構文が 1 つあ る 指定 さ れた ビ ッ ト マ ッ プ を印刷す る 指定 さ れた印刷ジ ョ ブ を取 り 消す 印刷ジ ョ ブの現行ページ を プ リ ン タ (ま たは ス プー ラ ) に送 り 、 印刷ジ ョ ブ を終了す る 指定 さ れたデー タ ウ ィ ン ド ウ を 印刷ジ ョ ブ と し て印刷 する 印刷ジ ョ ブに使用で き る 8 種類の フ ォ ン ト か ら 1 つの フ ォ ン ト を定義す る 現在のプ リ ン タ 名を取得す る 使用可能なプ リ ン タ の リ ス ト を取得す る 指定の太 さ の線を指定 さ れた位置に印刷す る 印刷ジ ョ ブ を開始 し 、その印刷ジ ョ ブに印刷ジ ョ ブ番号 を割 り 当て る 指定サ イ ズの楕円 (ま たは円) を指定 さ れた位置に印刷 する 現行ページ を印刷 し 、 新 し いページ を設定す る 指定サ イ ズの長方形を指定 さ れた位置に印刷す る 指定サ イ ズ丸長方形を指定 さ れた位置に印刷す る 画面の イ メ ージ を印刷ジ ョ ブの一環 と し て印刷す る 指定 さ れた文字列をプ リ ン タ に直接送信す る 現行フ ォ ン ト に、現行ジ ョ ブの定義済みフ ォ ン ト の 1 つ を設定する 次に呼び出 さ れ る 印刷関数の た めにプ リ ン タ を 使用す る よ う 設定す る 。 こ の関数は開いてい る ジ ョ ブには影響 し ない 行間隔を決定す る 係数を設定す る プ リ ン タ の設定 ダ イ ア ロ グ ボ ッ ク ス を呼び出 し 、 エ ン ド ユーザが行 う 設定をプ リ ン タ ド ラ イ バに対 し て保存 する プ リ ン タ の設定 ダ イ ア ロ グボ ッ ク ス を表示す る 指定テ キ ス ト 文字列を指定 さ れた位置に印刷す る 現行印刷ジ ョ ブの現行フ ォ ン ト で、指定 さ れた文字列の 長 さ (単位 : 1/1000 イ ンチ) を返す 印刷カー ソ ルの X 値を返す 印刷カー ソ ルの Y 値を返す PowerBuilder 第 35 章 印刷 印刷関数についての詳細は、 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ アル を参照 し て く だ さ い。 印刷の基礎 印刷処理は、 すべて印刷領域に基づいて定義 さ れ ます。 印刷領域 と は、 物理的な印刷ページか ら 余白を除いた領域の こ と です。た と えば、ペー ジのサ イ ズが 8.5 × 11 イ ンチで、 上下左右の余白がすべて 1/2 イ ンチ の場合には、 印刷領域は 7.5 × 10 イ ンチ と な り ます。 測定単位 印刷領域の測定単位は 1/1000 イ ン チです。 た と えば、 印刷領域が 7.5 × 10 イ ンチの場合、 その四隅の座標は以下の よ う にな り ます。 左上隅の座標は 0,0 右上隅の座標は 7500,0 左下隅の座標は 0,10000 右下隅の座標は 7500,10000 印刷カ ー ソ ル 印刷処理の際、 PowerBuilder は、 印刷カー ソ ル を使用 し て印刷位置を 制御 し ます。 印刷カー ソ ルは、 印刷が開始 さ れ る 左上隅の座標を保持 し ます。 PowerBuilder は、 PrintBitmap 関数、 PrintLine 関数、 PrintRectangle 関数、 PrintRoundRect 関数以外の印刷処理の後で、 印刷カー ソ ルを (必 要で あれば タ ブ位置 も ) 更新 し ます。 複雑な レ ポー ト の作成時にテ キ ス ト 、 オブ ジ ェ ク ト 、 罫線、 お よ び ピ ク チ ャ の位置 を 指定す る には、 各印刷関数の呼び出 し 時にカー ソ ル位置を指定 し ます。 ジ ョ ブの印刷 印刷ジ ョ ブ を開始す る には、 まず最初に PrintOpen 関数を呼び出す必要 があ り ます。 PrintOpen 関数は、 新 し いページ を メ モ リ 上に定義 し 、 す べて の印刷がプ リ ン タ のデ フ ォ ル ト フ ォ ン ト で行われ る よ う に指定 し て、 整数値を返 し ます。 こ の整数値は、 ほかのすべての関数呼び出 し で印刷ジ ョ ブの識別に用い ら れ る ジ ョ ブ番号です。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 745 タ ブの使い方 PrintOpen 関数の後に 1 つま たは複数のほかの印刷関数を呼び出 し 、 最 後に PrintClose 関数 (ま たは PrintCancel 関数) を呼び出 し て ジ ョ ブ を終 了 し ます。 通常、 PrintOpen 関数 と PrintClose 関数の間には、 タ ブ付 き ま たは タ ブな し で文字列を印刷す る 単純な印刷関数、 あ る いは レ ポー ト に罫線、 オブジ ェ ク ト 、 ピ ク チ ャ ーな ど を加え る 複雑な印刷関数が呼 び出 さ れ ます。 タ イ ト ルの印刷方法 各ページの上部に タ イ ト ルを印刷す る と き には、 印刷 さ れ る 行数を カ ウ ン ト し 、 一定の行数 (た と えば 50) にな っ た ら PrintPage 関数を呼び 出 し 、 カ ウ ン タ を リ セ ッ ト し て タ イ ト ルを印刷す る よ う に し ます。 以下の例は、 単純な印刷 リ ク エ ス ト です。 Int PrintJobNumber // 印刷ジ ョ ブ を開始 し 、 PrintJobNumber に // PrintOpen の戻 り 値の整数を設定 し ます。 PrintJobNumber = PrintOpen() // Atlanta の文字列を印刷 し ます。 Print(PrintJobNumber,"Atlanta") // 印刷ジ ョ ブ を閉 じ ます。 PrintClose(PrintJobNumber) タ ブの使い方 Print 関数には、 い く つかの構文があ り ます。 前出の例の構文では、 印 刷領域の左端か ら 文字列が印刷 さ れ、 次に新 し い行が印刷 さ れ ま す。 Print 関数のほかの構文で 、 タ ブ を用いて印刷処理の前ま たは後、 あ る いは前後で印刷カー ソ ルの位置を指定で き ます。 タ ブ値の指定 タ ブ値は、 1/1000 イ ンチの単位で、 印刷領域の左端か ら の相対位置に よ っ て指定 し ま す。 タ ブ値が Print 関数の呼び出 し 文字列の前にあ り 、 その文字列の後にはない場合、 PowerBuilder は タ ブ を設定 し 、 印刷 し て、 新 し い 行 を 開 始 し ま す。 タ ブ 値 が 文 字 列 の 後 に あ る 場 合、 PowerBuilder は印刷後に タ ブ を設定 し 、 新 し い行を開始せずに次の ス テー ト メ ン ト を待ち ます。 以下の例では、 Job は整数の印刷ジ ョ ブ番号です。 以下の ス テー ト メ ン ト は、 印刷領域の左端か ら 1 イ ンチの位置に タ ブ を設定 し 、 Atlanta と 印刷 し て、 新 し い行を開始 し ます。 746 PowerBuilder 第 35 章 印刷 Print(Job,1000,"Atlanta") 以下の ス テー ト メ ン ト は、 現行印刷位置に Boston と 印刷 し 、 印刷領域 の左端か ら 3 イ ンチの位置に タ ブ を設定 し て、 その次の ス テー ト メ ン ト を待ち ます。 Print(Job,"Boston",3000) 以下の ス テー ト メ ン ト は、 印刷領域の左端か ら 1 イ ンチの位置に タ ブ を設定 し 、 Boston と 印刷 し 、 印刷領域の左端か ら 3 イ ンチの位置に タ ブ を設定 し て、 その次の ス テー ト メ ン ト を待ち ます。 Print(Job,1000,"Boston",3000) タ ブ と 印刷カ ー ソ ル PowerBuilder が タ ブ を設定す る と き には、 印刷カー ソ ルの X 座標に印 刷カー ソ ル値 (指定 さ れた値 と 現行カー ソ ル位置 と の大 き い方の値) を設定 し ます。 し たが っ て、 指定 さ れた値が印刷カー ソ ルの現行 X 座 標 よ り 小 さ い場合には、 カー ソ ルは移動 し ません。 以下に示す最初の Print 文は、 印刷領域の左端か ら 1 イ ンチの位置に タ ブ を設定 し 、 Sybase と 印刷 し ますが、 次の タ ブには移動 し ません (印 刷領域の左端か ら 0.5 イ ン チは、 現行カー ソ ル位置 よ り 左側にあ る た めです) 。 タ ブは最後の引数 と し て指定 さ れたので、 タ ブ を無視 し て も 、 最初の Print 文は新 し い行 を 開始 し ま せん。 2 番目の Print 文は、 Sybase の e の直後に Inc. を印刷 し (つま り Sybase Inc.)、 新 し い 行を開始 し ます。 Print(Job,1000,"Sybase",500) Print(Job," Inc.") 印刷ジ ョ ブの停止 印刷ジ ョ ブ を中断す る には、 以下の 2 つの方法があ り ます。 通常では、 印刷ジ ョ ブの終わ り に PrintClose 関数 を呼び出 し て ジ ョ ブ を終了 し ま す。 も う 1 つは、 PrintoCancel 関数を呼び出 し て ジ ョ ブ を取 り 消す方法 です。 PrintClose 関数の使い 方 PrintClose 関数は、現行ページ を プ リ ン タ ま たはプ リ ン ト ス プー ラ に送 り 、 印刷ジ ョ ブ を終了 し て、 印刷を開始 し た ウ ィ ン ド ウ を ア ク テ ィ ブ 状態に し ます。 PrintClose 関数呼び出 し を実行 し た後では、 そのジ ョ ブ 番号を参照す る 関数呼び出 し がすべて無効 と な り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 747 高度な印刷技法 PrintCancel 関数の使 い方 PrintCancel 関数は、 印刷ジ ョ ブ を終了 し 、 印刷 さ れずに残っ た出力を すべて破棄 し ます。PrintCancel 関数は、処理が終了す る 前にエ ン ド ユー ザに対 し て印刷を取 り 消す手段を提供 し ます。通常 こ の関数は、グ ロ ー バル変数を定義 し て、 印刷ジ ョ ブの処理中にその変数の値を定期的に チ ェ ッ ク す る こ と に よ っ て呼び出 さ れ ます。 StopPrint が Boolean 型のグ ロ ーバル変数であ る も の と し ます。 以下の ス テー ト メ ン ト は、 StopPrint グ ロ ーバル変数を チ ェ ッ ク し 、 StopPrint 変数の値が TRUE にな っ た ら ジ ョ ブ を取 り 消 し ます。 IntJobNbr JobNbr = PrintOpen() // グローバル変数の初期値を設定 し ます。 StopPrint = FALSE // 印刷処理を行います。 Do While ... . . . // グローバル変数を テ ス ト し ます。 // 値が TRUE の場合、 印刷ジ ョ ブ をキ ャ ン セル し ます。 // ス ク リ プ ト の実行を止めます。 If StopPrint then PrintCancel(JobNbr) Return End If Loop 高度な印刷技法 PowerBuilder で複雑な レ ポー ト を作成す る と き には、 こ れ ま でに紹介 し た 以外の関数 も 必要 と な り ま すが、 比較的簡単に作成で き ま す。 PowerScript 関数を使用 し て、 ジ ョ ブに対す る フ ォ ン ト の定義、 フ ォ ン ト 間隔 と 行間隔の指定、 ページ上へのオブジ ェ ク ト の配置、 テ キ ス ト やオブジ ェ ク ト を配置す る 正確な位置の指定を行 う こ と がで き ます。 フ ォ ン ト の定義 と 設定 748 こ れ ま での例では、 プ リ ン タ のデ フ ォ ル ト フ ォ ン ト を 使用 し ま し た が、 各印刷ジ ョ ブにつ き 最大 8 つの フ ォ ン ト を定義す る こ と や、 その ジ ョ ブの実行中に フ ォ ン ト を切 り 替え る こ と が可能です。 PowerBuilder 第 35 章 印刷 さ ら に、 印刷ジ ョ ブの実行中は、 必要に応 じ て何度で も フ ォ ン ト の再 定義がで き ます。 こ のため、 使用プ リ ン タ で使用可能な フ ォ ン ト をす べて、 印刷ジ ョ ブにおいて使用で き ます。 ただ し 、 フ ォ ン ト を再定義 す る と パフ ォ ーマ ン ス が多少低下す る ので、 PrintOpen 関数を呼び出 し た時点で フ ォ ン ト を定義 し 、 印刷ジ ョ ブの実行中に フ ォ ン ト を変更 し ない よ う に し て く だ さ い。 フ ォ ン ト を定義す る には、Integer 型変数に PrintDefineFont 関数が返 し た 値を設定 し 、 次に PrintSetFont 関数を使用 し て フ ォ ン ト を変更 し ます。 JobNum は整数の印刷ジ ョ ブ番号で、 現行プ リ ン タ は Helv と い う フ ォ ン ト を 持 っ て い る も の と し ま す。 以 下 の ス テ ー ト メ ン ト は、 Helv18BU (Helv フ ォ ン ト 、 18 ポ イ ン ト の太字、 下線付 き ) を定義 し て い ま す。 定義は、 JobNum の フ ォ ン ト 2 に保存 さ れて い ま す。 社名は フ ォ ン ト 2 で印刷 さ れます。 例 IntJob, Helv18BU JobNum = PrintOpen() Helv18BU = PrintDefineFont(JobNum,2,"Helv",250,700, & Variable!,Swiss!,FALSE,TRUE) PrintSetFont(JobNum,2) Print(JobNum,"Sybase, Inc.") PrintDefineFont 関数 と PrintSetFont 関数についての詳細は、 『PowerScript リ フ ァ レ ン ス』 マニ ュ アルを参照 し て く だ さ い。 行間隔の設定 Print 関数 を使用す る と 、 行間隔は自動的に設定 さ れ ま す。 た と えば、 18 ポ イ ン ト の フ ォ ン ト で印刷 し て新 し い行を開始す る と 、 印刷カー ソ ルの Y 座標に文字の高 さ の 1.2 倍が加え ら れ ます。 こ の行間隔係数 1.2 は、 固定 さ れてい る わけではあ り ま せん。 行間隔 は、 PrintSetSpacing 関数を使用 し て設定で き ます。 以下の ス テー ト メ ン ト を実行す る と 、 行 と 行が密着 し た 1 行間隔 で印刷 さ れ ます (フ ォ ン ト やプ リ ン タ に よ っ ては、 最 も 低い文字の最 下部 と 最 も 高い文字の最上部が接触す る 可能性があ り ます)。 例 PrintSetSpacing(JobNum,1) 以下の ス テー ト メ ン ト は、 1.5 行間隔で印刷 し ます。 PrintSetSpacing(JobNum,1.5) 以下の ス テー ト メ ン ト は、 2 行間隔で印刷 し ます。 PrintSetSpacing(JobNum,2) ア プ リ ケーシ ョ ン テ ク ニ ッ ク 749 高度な印刷技法 描画オブ ジ ェ ク ト の印 刷 印刷ジ ョ ブでは、 以下の描画オブジ ェ ク ト が使用で き ます。 • 直線 • 長方形 • 丸長方形 • 楕円 • ピ クチャ 印刷ジ ョ ブで描画オブジ ェ ク ト を配置す る と き には、 まず最初に描画 オブジ ェ ク ト を配置 し 、 次にテ キ ス ト を加え ます。 た と えば、 印刷領 域内に長方形を描 き 、 次にその長方形の内部に罫線 と テ キ ス ト を加え ます。 オブジ ェ ク ト は輪郭線だけの よ う に見え ますが、 実際には塗 り つぶ さ れてい ます (空白が入っ てい ます)。 し たがっ て、 オブジ ェ ク ト を テ キ ス ト や別のオブジ ェ ク ト の上に重ねて配置す る と 、 そのテ キ ス ト や別のオブジ ェ ク ト は覆い隠 さ れて し ま い ます。 注意 :PowerBuilder は、 すべてのテ キ ス ト やオブジ ェ ク ト が印刷領域内 に配置 さ れてい る か ど う か を確認 し ません。 印刷領域内にあ る も の を 印刷す る だけです。 以下の ス テー ト メ ン ト は、 1 × 3 イ ンチの長方形を描 き 、 次にその 長方形の内部に会社の住所を印刷 し ます。 長方形はページの上端の中 央に描かれ ます。 例 IntJob JobNum = PrintOpen() PrintRect(JobNum,2500,0,3000,1000,40) Print(JobNum,2525,"") Print(JobNum,2525,"25 Mountain Road") Print(JobNum,2525,"Milton, MA 02186") PrintClose(JobNum) 750 PowerBuilder 第 3 6 章 初期設定 フ ァ イル と Windows レ ジ ス ト リ の管理 こ の章について こ の章では、 PowerBuilder ア プ リ ケーシ ョ ン の環境設定 と デ フ ォ ル ト 設定を管理す る 方法について解説 し ます。 内容 項目 環境設定 と デフ ォ ル ト 設定について 初期設定フ ァ イ ルでの情報の管理 Windows レ ジ ス ト リ での情報の管理 ページ 751 752 753 環境設定 と デ フ ォル ト 設定について PowerBuilder ア プ リ ケーシ ョ ン は、 セ ッ シ ョ ン を ま たが っ て エ ン ド ユーザの環境設定 と デフ ォ ル ト 設定を保存で き ます。た と えば、 アプ リ ケーシ ョ ン はそのアプ リ ケーシ ョ ン の表示 と 動作の形態を 管理す る 設定や、 デー タ ベー ス に接続す る ためにデフ ォ ル ト のパ ラ メ ー タ を格納す る 設定を保持 し てい ま す。 PowerBuilder ア プ リ ケーシ ョ ンは、 初期設定フ ァ イ ルや Windows レ ジ ス ト リ で こ の よ う な情報を管理で き ます。 デー タ ベース接続パラ メ ー タ ト ラ ンザ ク シ ョ ン オブジ ェ ク ト の値は、 通常の場合、 外部フ ァ イ ルか ら 値を取得 し て設定す る 必要があ り ま す。 た と えば、 アプ リ ケーシ ョ ン を開発 し てい る と き は PowerBuilder 初期設定フ ァ イ ル か ら 、 ま た アプ リ ケーシ ョ ン を配布す る と き はアプ リ ケーシ ョ ン 固有の初期設定フ ァ イ ルか ら 値を設定で き ます。 初期設定フ ァ イ ル内のデー タ ベー ス 接続パ ラ メ ー タ についての詳 細は、 186 ページの 「外部フ ァ イ ルか ら の値の読み込み」 を参照 し て く だ さ い。 Windows レ ジ ス ト リ にデー タ ベー ス 接続パ ラ メ ー タ を登録 し た り 取得す る 方法については、 753 ページの 「Windows レ ジ ス ト リ で の情報の管理」 を参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 751 初期設定 フ ァ イルでの情報の管理 ツールバーの設定 PowerBuilder では、 ツールバーの設定に関す る 情報の取得や修正を行 う ための関数が用意 さ れてい ます。 こ れ ら の関数を使用 し て、 現行の ツールバーの設定情報の保存 と 復元がで き ます。 詳細については、 85 ページの 「ツールバー設定の保存 と 復元」 を参照 し て く だ さ い。 保存可能なほかの設定 デー タ ベー ス接続パ ラ メ ー タ と ツールバーの設定情報のほかに、 アプ リ ケーシ ョ ン特有の設定情報を保存で き ま す。 た と えば、 色、 フ ォ ン ト の表示設定やエ ン ド ユーザの環境設定情報な ど を保持で き ます。 初期設定 フ ァ イルでの情報の管理 初期設定 フ ァ イルにア ク セスする関数 PowerBuilder には、 初期設定フ ァ イ ルを使用 し て アプ リ ケーシ ョ ン設 定を管理す る ための関数が用意 さ れてい ます。 表 36-1: PowerBuilder 初期設定フ ァ イル関数 関数 ProfileInt ProfileString SetProfileString 説明 プ ロ フ ァ イ ル フ ァ イ ルの設定値を Integer 型で取得す る プ ロ フ ァ イ ル フ ァ イ ルの設定値を String 型で取得す る プ ロ フ ァ イ ル フ ァ イ ルに値を書き 込む こ れ ら の関数についての詳細は、 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ アルを参照 し て く だ さ い。 レ ジ ス ト リ での ProfileString 関数の使い方については、752 ページの 「初 期設定フ ァ イ ルにア ク セ スす る 関数」 を参照 し て く だ さ い。 APP.INI の書式 以下の例では、 APP.INI と い う 名前のプ ロ フ ァ イ ルで、 アプ リ ケーシ ョ ンの情報を管理 し てい ます。 こ の フ ァ イ ルは、 アプ リ ケーシ ョ ンの表 示形態を管理す る ための環境設定の情報が記述 さ れてい ます。 フ ァ イ ルには、 4 つのカ ラ ー設定が記述 さ れた [Preferences] セ ク シ ョ ンがあ り ます。 [Preferences] WindowColor=Silver BorderColor=Red BackColor=Black TextColor=White 752 PowerBuilder 第 36 章 初期設定 フ ァ イル と Windows レ ジ ス ト リ の管理 以下の ス ク リ プ ト では、 APP.INI フ ァ イ ルのカ ラ ー設定を取得 し ます。 値の取得 wincolor brdcolor bckcolor txtcolor = = = = ProfileString("app.ini", ProfileString("app.ini", ProfileString("app.ini", ProfileString("app.ini", 値の設定 "Preferences", "Preferences", "Preferences", "Preferences", "WindowColor", "") "BorderColor", "") "BackColor", "") "TextColor", "") 以下の ス ク リ プ ト では、 APP.INI フ ァ イ ルにカ ラ ー設定を保存 し ます。 SetProfileString("app.ini", SetProfileString("app.ini", SetProfileString("app.ini", SetProfileString("app.ini", "Preferences", "Preferences", "Preferences", "Preferences", "WindowColor", wincolor) "BorderColor", brdcolor) "BackColor", bckcolor) "TextColor", txtcolor) Windows レ ジ ス ト リ での情報の管理 レ ジ ス ト リ にア ク セス する関数 PowerBuilder には、 Windows レ ジ ス ト リ を使用 し て アプ リ ケーシ ョ ン 設定を管理す る ための関数が用意 さ れてい ます。 表 36-2: PowerBuilder レ ジス ト リ 設定関数 関数 RegistryDelete RegistryGet RegistryKeys RegistrySet RegistryValues 説明 Windows レ ジ ス ト リ のキーま たはキーの値を削除する Windows レ ジ ス ト リ か ら 値のデー タ を取得する Windows レ ジ ス ト リ の キーの 1 つ下位 レ ベルに あ る サブ キーの リ ス ト を取得す る Windows レ ジ ス ト リ に、 キー、 値の名前、 値のデー タ を設 定す る 。 キーま たは値の名前が存在 し ない場合は、 新 し い キーま たは値の名前を作成す る キーに関連付け ら れた値の名前の リ ス ト を取得す る こ れ ら の関数についての詳細は、 『PowerScript リ フ ァ レ ン ス』 マ ニ ュ アルを参照 し て く だ さ い 。 初期設定フ ァ イルを無 効にする ProfileString 関数を使用す る と 、 初期設定フ ァ イ ルか ら ではな く 、 レ ジ ス ト リ か ら 情報を取得で き ます。次の位置に INIFILEMAPPING と い う 名の新 し いキーを作成 し ます。 HKEY_CURRENT_USER¥Software¥Microsoft¥Windows¥CurrentVersion WIN.INI フ ァ イ ルを無効にす る には、 WIN.INI と い う 名の INIFILEMAPPING に次の値を持つサブキーを作成 し ます。 #usr:software¥microsoft¥windows¥currentversion¥extensions ア プ リ ケーシ ョ ン テ ク ニ ッ ク 753 Windows レ ジ ス ト リ での情報の管理 こ の後の例では、 デー タ ベー ス接続パ ラ メ ー タ の情報を管理す る ため に レ ジ ス ト リ を 使 用 し ま す。 接 続 パ ラ メ ー タ は、 レ ジ ス ト リ の HKEY_CURRENT_USER¥Software キ ーの下の MyCo¥MyApp¥database サブキーで管理 さ れてい ます。 レ ジ ス ト リ か らの値の 取得 以下の ス ク リ プ ト は、 デフ ォ ル ト の ト ラ ンザ ク シ ョ ン オブジ ェ ク ト の 値を レ ジ ス ト リ か ら 取得 し ます。 RegistryGet("HKEY_CURRENT_USER¥Software¥MyCo¥MyApp¥database", "dbms", sqlca.DBMS) RegistryGet("HKEY_CURRENT_USER¥Software¥MyCo¥MyApp¥database", "database", sqlca.database) RegistryGet("HKEY_CURRENT_USER¥Software¥MyCo¥MyApp¥database", "userid", sqlca.userid) RegistryGet("HKEY_CURRENT_USER¥Software¥MyCo¥MyApp¥database", "dbpass", sqlca.dbpass) RegistryGet("HKEY_CURRENT_USER¥Software¥MyCo¥MyApp¥database", "logid", sqlca.logid) RegistryGet("HKEY_CURRENT_USER¥Software¥MyCo¥MyApp¥database", "logpass", sqlca.logpass) RegistryGet("HKEY_CURRENT_USER¥Software¥MyCo¥MyApp¥database", “"servername", sqlca.servername) RegistryGet("HKEY_CURRENT_USER¥Software¥MyCo¥MyApp¥database", "dbparm", sqlca.dbparm) レ ジ ス ト リ への値の登 録 & & & & & & & 以下の ス ク リ プ ト は、 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト の値を レ ジ ス ト リ に登録 し ます。 RegistrySet("HKEY_CURRENT_USER¥Software¥MyCo¥MyApp¥database", "dbms", sqlca.DBMS) RegistrySet("HKEY_CURRENT_USER¥Software¥MyCo¥MyApp¥database", "database", sqlca.database) RegistrySet("HKEY_CURRENT_USER¥Software¥MyCo¥MyApp¥database", "userid", sqlca.userid) RegistrySet("HKEY_CURRENT_USER¥Software¥MyCo¥MyApp¥database", "dbpass", sqlca.dbpass) RegistrySet("HKEY_CURRENT_USER¥Software¥MyCo¥MyApp¥database", "logid", sqlca.logid) RegistrySet("HKEY_CURRENT_USER¥Software¥MyCo¥MyApp¥database", "logpass", sqlca.logpass) RegistrySet("HKEY_CURRENT_USER¥Software¥MyCo¥MyApp¥database", "servername", sqlca.servername) RegistrySet("HKEY_CURRENT_USER¥Software¥MyCo¥MyApp¥database", "dbparm", sqlca.dbparm) 754 & & & & & & & & & PowerBuilder 第 3 7 章 InfoMaker の様式 と ア ク シ ョ ンの 作成 こ の章について こ の章では、PowerBuilder で様式を作成 し て InfoMaker ユーザに提 供す る 方法について説明 し ます。 内容 項目 フ ォーム様式について フ ォーム様式内でのデー タ ウ ィ ン ド ウ コ ン ト ロ ールの命名 フ ォーム様式の作成お よ び使用 既存の様式の修正 最初か ら の様式の作成 様式の完成 様式の使い方 ページ 755 759 760 760 762 763 768 フ ォ ーム様式について InfoMaker には、 ユーザが洗練 さ れた フ ォ ー ム を 作成で き る よ う に、 組み込み フ ォ ーム様式が あ り ま す。 PowerBuilder を使用す る と 、 開発者は独自の フ ォーム様式を作成 し て、 InfoMaker ユーザに 提供で き ます。こ の よ う な カ ス タ ム フ ォーム様式を使 う と 、フ ォー ム内で特定の標準を使 う よ う に指定 し て、InfoMaker ユーザに対 し て機能を追加で き ます。 た と えば、 以下の よ う に指定で き ます。 • 各フ ォ ーム内の開発者の組織の ロ ゴ表示 適当な位置に ロ ゴ を配置 し た カ ス タ ム フ ォ ーム様式を作成で きる • 組み込みフ ォ ーム様式で提供 さ れ る ツールバーの再構成 組み込みフ ォ ーム様式を修正 し て カ ス タ ム フ ォ ーム様式 と し て保存で き る • ア プ リ ケーシ ョ ン テ ク ニ ッ ク フ ォーム内での ド ラ ッ グ ア ン ド ド ロ ッ プ 755 フ ォ ーム様式について • フ ォ ーム内での ピ ク チ ャ ボ タ ン、 編集 コ ン ト ロ ール、 お よ びその ほかの コ ン ト ロ ールの配置 PowerBuilder ウ ィ ン ド ウ 内でで き る こ と は、 ほ と ん どすべて カ ス タ ム フ ォ ーム様式内で も で き ます。 フ ォ ーム様式 フ ォ ーム様式が構成 さ れる方法 InfoMaker の ユーザはデー タ を 管理す る のに フ ォ ー ム を 使用 し ま す。 フ ォ ー ム 内でデー タ を 表示、 追加、 削除、 お よ び更新で き ま す。 各 フ ォ ームはフ ォ ーム様式を基礎 と し てお り 、以下の項目を指定 し ます。 • た と えば、 フ リ ーフ ォーム、 グ リ ッ ド 、 ま たはマ ス タ ー / 詳細提示 様式な どデー タ を提示す る 方法 • フ ォ ーム を実行す る と き に使用可能な メ ニ ュ ー と ツールバー • その フ ォ ーム内でユーザが コ マ ン ド ボ タ ン にア タ ッ チで き る ア ク ション PowerBuilder で フ ォ ーム様式を作成 し ます。 フ ォ ーム様式は次の 2 つ の も ので構成 さ れてい ます。 • ウィンドウ • メ ニ ュー 図 37-1: PowerBuilder フ ォ ーム様式 ウ ィ ン ド ウについて ウ ィ ン ド ウ は フ ォ ー ム の土台の役割 を 果 た し ま す。 ウ ィ ン ド ウ には特別な名前を も つ 1 つま たは複数のデー タ ウ ィ ン ド ウ コ ン ト ロ ールが あ り ま す。 フ ォ ー ム 様式の中心 と な る のは こ の デー タ ウ ィ ン ド ウ コ ン ト ロ ールです。 ユーザは こ の特別なデー タ ウ ィ ン ド ウ コ ン ト ロ ールを通 じ て、 デー タ を フ ォ ーム内で表示ま たは変更 し ます。 こ の章では、 こ の特別なデー タ ウ ィ ン ド ウ コ ン ト ロ ールを セ ン ト ラ ル デー タ ウ ィ ン ド ウ コ ン ト ロ ール と 呼ぶ こ と に し ます。セ ン ト ラ ル デー タ ウ ィ ン ド ウ コ ン ト ロ ールには、 サポー ト さ れてい る 名前のセ ッ ト か ら 名前を付けなければな り ません。 セ ン ト ラ ル デー タ ウ ィ ン ド ウ に加え て、 ウ ィ ン ド ウ には PowerBuilder 上の ウ ィ ン ド ウ 内に配置で き る コ マ ン ド ボ タ ン、 ラ ジオボ タ ン、 ユー ザ オブジ ェ ク ト 、 お よ びピ ク チ ャ な どすべての コ ン ト ロ ールを配置で き ます。 756 PowerBuilder 第 37 章 InfoMaker の様式 と ア ク シ ョ ンの作成 メ ニ ュ ーについて フ ォ ーム を実行す る 場合、 メ ニ ュ ーか ら 項目を取 り 除け ます。 メ ニ ュ ーを メ ニ ュ ー ペ イ ン タ で作成 し て、 その フ ォーム様 式が基礎 と し てい る ウ ィ ン ド ウ にその メ ニ ュ ーを関連付け ます。 メ ニ ュ ー を 作成す る 場合、 フ ォ ー ム が実行 さ れて い る と き に ツ ール バー に 表示す る メ ニ ュ ー項目 を 指定 で き ま す。 こ の ツ ール バー は PowerBuilder ツールバー と 同 じ よ う に動作 し ます。 ア ク シ ョ ンについて フ ォ ーム様式には、 フ ォ ーム内で コ マ ン ド ボ タ ン にア タ ッ チで き た り 、 ス ク リ プ ト 内で呼び出せ る ア ク シ ョ ン があ り ま す。 フ ォ ー ム 様式の ウ ィ ン ド ウ 内で定義す る 各パブ リ ッ ク ウ ィ ン ド ウ 関 数を、 その フ ォーム様式のユーザはア ク シ ョ ン と し て使用で き ます。 例 た と えば、 組み込み様式であ る フ リ ーフ ォ ームは以下の も ので構成 さ れてい ます。 • w_pbstyle_freeform ウ ィ ン ド ウ • m_pbstyle_freeform メ ニ ュ ー w_pbstyle_freeform について w_pbstyle_freeform ウ ィ ン ド ウ には dw_freeform と い う 名前のデー タ ウ ィ ン ド ウ コ ン ト ロ ールがあ り ます。 w_pbstyle_freeform には、 そのほかの コ ン ト ロ ールはあ り ません。 デー タ ウ ィ ン ド ウ コ ン ト ロ ールだけです。 PowerBuilder ウ ィ ン ド ウ は ウ ィ ン ド ウ レ ベル関数を多 く 定義 し てい ま す。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 757 フ ォ ーム様式について こ れ ら の ウ ィ ン ド ウ 関数を それぞれ、 フ リ ーフ ォ ーム フ ォ ーム様式の ユーザは、 InfoMaker 内でア ク シ ョ ン と し て使用で き ます。 m_pbstyle_freeform メ ニ ュ ーでは、 フ リ ー フ ォ ーム様式を基礎 と す る フ ォ ーム の実行時に、 メ ニ ュ ー項目お よ び ツールバー項目が使用で き ます。 m_pbstyle_freeform について た と えば、 m_pbstyle_freeform には、 [検索条件の設定] 項目が [行] メ ニ ュ ーにあ り 、 こ の項目はツールバーに も 表示 さ れ ます。 InfoMaker ユーザが フ ォーム を実行す る と き 、フ ォ ーム内で行を検索す る のに使用す る 選択条件を入力す る ために、 [検索条件の指定] を選択 で き ます。 758 PowerBuilder 第 37 章 InfoMaker の様式 と ア ク シ ョ ンの作成 フ ォ ーム様式内でのデータ ウィ ン ド ウ コ ン ト ロ ールの命名 フ ォ ーム様式には、組み込み InfoMaker フ ォーム様式のいずれかのデー タ ウ ィ ン ド ウ コ ン ト ロ ールを基礎 と す る 1 つま たは複数のセ ン ト ラ ル デー タ ウ ィ ン ド ウ コ ン ト ロ ールが含まれてい ます。 こ れ ら のデー タ ウ ィ ン ド ウ コ ン ト ロ ールの動作 を 理解す る 一番良い 方法は、InfoMaker 内で各組み込み様式を使用 し て フ ォ ーム を作成す る こ と です。 そ し て、 フ ォ ーム様式を作成す る と き 、 組み込み様式の中 か ら フ ォ ーム様式内で表示 し たい提示様式の型に一致す る も の を選択 し ます。 た と えば、基本フ リ ーフ ォーム をデー タ 入力フ ォ ーム と す る ためには、 w_pbstyle_freeform にあ る デー タ ウ ィ ン ド ウ コ ン ト ロ ールの dw_freeform を基礎 と し て フ ォ ーム を作成 し ます。 フ ォ ーム様式を作成す る と き は、セ ン ト ラ ル デー タ ウ ィ ン ド ウ コ ン ト ロ ールに以下の名を割 り 当て なければな り ません。 • dw_freeform • dw_grid • dw_master_12many • dw_detail_12many • dw_master_many21 • dw_detail_many21 フ ォ ーム様式内では、表 37-1 の 4 つのデー タ ウ ィ ン ド ウ の組み合わせの 1 つを使用 し なければな り ません。 有効な組み合わせ 表 37-1: PowerBuilder デー タ ウ ィ ン ド ウ コ ン ト ロール 使用するデー タ ウ ィ ン ド ウ コ ン ト ロール名 dw_freeform のみ dw_grid お よ び dw_freeform 基礎 と な る組み込み様式 フ リ ーフ ォーム提示様式 グリ ッド dw_grid はセ ン ト ラ ル デー タ ウ ィ ン ド ウ コ ン ト ロ ール。 dw_freeform は結果集合を共有 し て dw_master_12many お よ び dw_detail_12many dw_master_many21 お よ び dw_detail_many21 ア プ リ ケーシ ョ ン テ ク ニ ッ ク バ ッ ク グ ラ ウ ン ド で動作 し 、フ ォーム内の ど こ で も ユーザは計算フ ィ ール ド を配置で き る マ ス タ ー詳細 /1 対多 マ ス タ ー詳細 / 多対 1 759 フ ォ ーム様式の作成および使用 フ ォ ーム様式の作成および使用 ❖ フ ォ ーム様式を作成および使用するには 1 次の ど ち ら か を実行 し ます。 • 既存の フ ォ ーム様式か ら ウ ィ ン ド ウ と メ ニ ュ ーを コ ピーす る • 新規に ウ ィ ン ド ウ を作成 し て、 サポー ト さ れてい る 名を持つ 1 つか 2 つのデー タ ウ ィ ン ド ウ コ ン ト ロ ールを その中に配置す る 2 ウ ィ ン ド ウ が フ ォ ーム様式の基礎 と し ての役割を果た し てい る こ と を示す特別な コ メ ン ト をつけて保存 し ます。 3 ウ ィ ン ド ウ に コ ン ト ロ ールを追加 し た り 、 メ ニ ュ ーを修正 し た り 、 ア ク シ ョ ン と し て 動作す る ウ ィ ン ド ウ 関数 を 定義 し た り な ど し て、 フ ォ ーム様式を拡張 し ます。 4 フ ォ ー ム 様式中で使用す る すべて のオブ ジ ェ ク ト ( ウ ィ ン ド ウ 、 ユーザ オブジ ェ ク ト 、 お よ び メ ニ ュ ーな ど) を、 InfoMaker ユーザ に対 し て様式 ラ イ ブ ラ リ と し て定義す る ラ イ ブ ラ リ に コ ピー し ま す。 5 InfoMaker ユーザに対する 探索パス を 様式ラ イ ブラ リ に追加し ま す。 InfoMaker ユーザが新たに フ ォーム を作成す る 場合は、 開発者の定 義 し た フ ォ ーム様式が新規フ ォ ーム ダ イ ア ロ グボ ッ ク ス に表示 さ れ ま す。 ユーザは開発者が作成 し た様式を基礎 と し て フ ォ ーム を 作成で き ます。 こ の章の後の箇所では、 こ れ ら の操作手順について説明 し ます。 既存の様式の修正 フ ォ ーム様式を作成す る 一番簡単な方法は、 既存の フ ォ ーム様式を コ ピ ー し て、 作業す る こ と です。 構造 を 調べて多少の変更 を 加え る と 、 短時間で フ ォーム様式の働 き を理解で き ます。 760 PowerBuilder 第 37 章 InfoMaker の様式 と ア ク シ ョ ンの作成 ❖ 既存のフ ォ ーム様式の修正を始めるには 1 PowerBuilder 上で ラ イ ブ ラ リ ペ イ ン タ を開 き ます。 2 フ ォ ーム様式の土台 と し ての役割を果たす ウ ィ ン ド ウ と メ ニ ュ ー を開発者のアプ リ ケーシ ョ ン の ラ イ ブ ラ リ 探索パ ス にあ る ラ イ ブ ラ リ に コ ピー し ます。 組み込みフ ォ ーム様式から 始める 組み込みフ ォ ーム様式の基礎 と し ての役割を果たす ウ ィ ン ド ウ と メ ニュ ーは、 IMSTYLE9.PBL にあり ま す。 こ のフ ァ イ ルは InfoMaker と 同梱 さ れ て InfoMaker 9.0 デ ィ レ ク ト リ に イ ン ス ト ール さ れ ま す。 こ の PBL の コ ピーを作成 し て、 独自の フ ォ ーム様式の基礎 と し て使用す る こ と がで き ます。 3 ウ ィ ン ド ウ ペ イ ン タ 上で ウ ィ ン ド ウ を開 き 、 メ ニ ュ ー バーか ら [フ ァ イ ル|名前を付けて保存] を選択 し て新 し い名で ウ ィ ン ド ウ を保存 し ます。 4 その ウ ィ ン ド ウ に新 し い名を付け ます。 名前は自由に設定で き ま すが、 フ ォ ーム様式を定義す る ウ ィ ン ド ウ 名は InfoMaker ユ ーザ が使用す る すべ て の様式 ラ イ ブ ラ リ に 渡っ て固有の名前をつけ る 必要があ り ます。 5 ウ ィ ン ド ウ に対 し て特別な コ メ ン ト を定義 し ま す (方法について は、 762 ページの 「様式の基礎 と し ての ウ ィ ン ド ウ の識別」 を参照 し て く だ さ い)。 6 [OK] を ク リ ッ ク し て ウ ィ ン ド ウ を保存 し ます。 7 メ ニ ュ ー ペ イ ン タ 上で メ ニ ュ ーを開 き 、 メ ニ ュ ー バーか ら [フ ァ イ ル|名前を付け て保存] を選択 し て メ ニ ュ ーを新 し い名で保存 し ます。 8 新 し い名 と 任意の コ メ ン ト を付け、[OK] を ク リ ッ ク し て メ ニ ュ ー を保存 し ます。 メ ニ ュ ーに対 し ては コ メ ン ト を付け る 必要はあ り ま せんが、 作成 し てい る フ ォ ーム様式内で使用す る と き と 同様に識別で き る よ う に し たほ う が よ いで し ょ う 。 9 ア プ リ ケーシ ョ ン テ ク ニ ッ ク フ ォ ーム様式を拡張 し ます (方法については、 763 ページの 「様式 の完成」 を参照 し て く だ さ い)。 761 最初か ら の様式の作成 様式の基礎と し て のウィ ン ド ウの識別 InfoMaker に、ラ イ ブ ラ リ 内の ウ ィ ン ド ウ が フ ォ ーム様式の基礎 と し て の役割を果た し てい る こ と を認識 さ せ る には、 次のテ キ ス ト Style: で 始 ま る コ メ ン ト を そ の ウ ィ ン ド ウ に対 し て指定 し な ければな り ま せ ん。 Style: 様式を説明する テキス ト Style: に続 く テ キ ス ト は InfoMaker の新規 フ ォ ーム ダ イ ア ロ グ ボ ッ ク ス内の フ ォ ーム様式のア イ コ ンの下に表示 さ れます。 た と えば、 コ メ ン ト 「Style: 作業デー タ 管理」 付 き の w_pbstyle_freeform ウ ィ ン ド ウ を様式 ラ イ ブ ラ リ に保存す る 場合には、InfoMaker ユーザが 新 し い フ ォ ーム を作成す る と き に、 次の よ う な画面が表示 さ れます。 最初に ウ ィ ン ド ウ を 保存す る と き と ラ イ ブ ラ リ ペ イ ン タ 上の ど ち ら の場合 も コ メ ン ト を指定で き ます。 詳細については、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 最初から の様式の作成 フ ォ ーム の動作を一度理解す る と 、 最初か ら フ ォ ーム を作成で き る よ う にな り ます。 ❖ 762 フ ォ ーム様式を最初から 作成するには 1 新 し い ウ ィ ン ド ウ を作成 し ます。 2 その ウ ィ ン ド ウ にデー タ ウ ィ ン ド ウ コ ン ト ロ ールを配置 し ます。 PowerBuilder 第 37 章 InfoMaker の様式 と ア ク シ ョ ンの作成 3 コ ン ト ロ ールのプ ロ パテ ィ ビ ュ ーで、 その コ ン ト ロ ールに特別な 名前を付け ます。 特別な名前の リ ス ト については、 759 ページの 「フ ォーム様式内で のデー タ ウ ィ ン ド ウ コ ン ト ロ ールの命名」 を参照 し て く だ さ い。 4 必要に応 じ て、 コ ン ト ロ ールのプ ロ パテ ィ を変更 し ます。 た と えば、 垂直お よ び水平の ス ク ロ ールバーを追加で き ます。 コ ント ロールにデータ ウィ ンド ウ オブジェ ク ト を 関連付けないでく ださ い。 新 し い フ ォ ーム を作成す る と き に、 InfoMaker ユーザが コ ン ト ロ ー ルのデー タ を指定 し ます。 5 作成す る フ ォ ーム様式が 2 つのデー タ ウ ィ ン ド ウ コ ン ト ロ ールを 使用す る 場合は、 ウ ィ ン ド ウ 上に も う 1 つ デー タ ウ ィ ン ド ウ コ ン ト ロ ール を配置 し て、 その名前を有効な組み合わせに合致 さ せ ま す。 有効な組み合わせの リ ス ト については、 759 ページの 「フ ォーム様 式内でのデー タ ウ ィ ン ド ウ コ ン ト ロ ールの命名」 を参照 し て く だ さ い。 6 ウ ィ ン ド ウ を保存 し て、 コ メ ン ト を指定 し ます。 方法については、 762 ページの 「様式の基礎 と し ての ウ ィ ン ド ウ の 識別」 を参照 し て く だ さ い。 様式の完成 様式を完成す る には、 ウ ィ ン ド ウ と メ ニ ュ ーを拡張 し て必要な処理を 提供す る よ う に し ます。 た と えば、 以下の こ と が可能です。 • セ ン ト ラ ル デー タ ウ ィ ン ド ウ コ ン ト ロ ールに対 し て作業す る • ウ ィ ン ド ウ に コ ン ト ロ ールを追加す る • ア ク シ ョ ン (フ ォ ーム様式にア ク シ ョ ン と し て表示 さ れ る 関数) を 定義す る • メ ニ ュ ー と 関連す る ツールバーを修正す る • ウ ィ ン ド ウ 、 コ ン ト ロ ール、 お よ び メ ニ ュ ー項目用に ス ク リ プ ト を書 く ア プ リ ケーシ ョ ン テ ク ニ ッ ク 763 様式の完成 • ド ラ ッ グ ア ン ド ド ロ ッ プな ど そのほかの機能を ウ ィ ン ド ウ に追 加す る セン ト ラ ル データ ウィ ン ド ウ コ ン ト ロ ールに対する 作業 特別な名前 を も つデー タ ウ ィ ン ド ウ コ ン ト ロ ールは フ ォ ー ム の中心 です。 ユーザが フ ォ ー ム 上でデー タ を 操作す る のは こ れ ら の コ ン ト ロ ールにおいてです。 次の事柄を理解す る 必要があ り ます。 フ リ ー フ ォ ームのデー タ ウ ィ ン ド ウのサイ ズ を指定する方法 • フ ォ ーム上で フ リ ーフ ォ ーム のデー タ ウ ィ ン ド ウ のサ イ ズ を指定 す る 方法 • フ ォ ーム上で コ ン ト ロ ールに対 し てデー タ を検索す る 方法 組み込み様式 と 同 じ よ う に、 作成す る フ ォ ーム様式はすべて、 フ リ ー フ ォ ーム のデー タ ウ ィ ン ド ウ を含んでい ま す。 PowerBuilder の ウ ィ ン ド ウ ペ イ ン タ 上で フ リ ー フ ォ ーム のデー タ ウ ィ ン ド ウ コ ン ト ロ ール に ど の よ う なサ イ ズ を指定す る かに関係な く 、 フ リ ーフ ォ ーム のデー タ ウ ィ ン ド ウ は InfoMaker の フ ォ ーム ペ イ ン タ 上の フ ォ ーム全体を占 め ます。 InfoMaker が フ リ ーフ ォ ーム のデー タ ウ ィ ン ド ウ を拡大 し て、 フ ォ ーム上の ど こ にで も 計算フ ィ ール ド な ど のデー タ を配置で き る よ う に し ます。 こ れは、 PowerBuilder 上で指定す る ウ ィ ン ド ウ の背景色は フ ォ ーム上 では無視 さ れ る と い う こ と です。 セ ン ト ラル デー タ ウィ ンドウ コン ト ロールに対する行の検 索 InfoMaker ユーザが フ ォ ー ム を 実行す る と き 、 InfoMaker は自動的に SQLCA ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト に正 し い値を与え る ので、 開 発者が そ の た め の ス ク リ プ ト を 書 く 必要は あ り ま せん。 セ ン ト ラ ル デー タ ウ ィ ン ド ウ に対 し て行を検索す る のに必要なのは、 コ ン ト ロ ー ルの ト ラ ンザ ク シ ョ ン オブジ ェ ク ト を設定 し て、 行を検索す る こ と だ けです。 た と えば、dw_freeform と い う 名の コ ン ト ロ ールに対 し てデー タ を検索 す る には、 次の よ う に ス ク リ プ ト を書 き ます。 dw_freeform.SetTransObject(SQLCA) dw_freeform.Retrieve() フ ォ ームが開 く と き にデー タ を提示す る には、 その ウ ィ ン ド ウ の Open イ ベン ト 内に こ の ス ク リ プ ト を書いて く だ さ い。 ト ラ ンザ ク シ ョ ン オブジ ェ ク ト の詳細については、 第 12 章 「 ト ラ ン ザ ク シ ョ ン オブジ ェ ク ト の使い方」 を参照 し て く だ さ い。 764 PowerBuilder 第 37 章 InfoMaker の様式 と ア ク シ ョ ンの作成 コ ン ト ロ ールの追加 フ ォ ーム様式の基礎 と し ての役割を果たす ウ ィ ン ド ウ はすべて、 少な く と も 1 つの デー タ ウ ィ ン ド ウ コ ン ト ロ ールを持っ てい ます。それに 加え て、標準の PowerBuilder ウ ィ ン ド ウ に追加で き る コ マ ン ド ボ タ ン、 ユーザ オブジ ェ ク ト 、 テ キ ス ト 、 編集ボ ッ ク ス、 ピ ク チ ャ 、 お よ び描 画オブジ ェ ク ト な ど、そのほかすべての コ ン ト ロ ールを追加で き ます。 フ ォ ーム のユーザは、 開発者が ウ ィ ン ド ウ 内に配置 し た コ ン ト ロ ール を移動で き ますが、 削除はで き ません。 同様に、 ユーザはフ ォ ーム ペ イ ン タ 上で フ ォ ーム に コ ン ト ロ ールを追 加で き ます。ア ク シ ョ ン を関連付けて、コ マ ン ド ボ タ ンお よ びピ ク チ ャ ボ タ ン を作成 し ます。 ア ク シ ョ ン を以下に説明 し ます。 ア ク シ ョ ン の定義 ユーザはカ ス タ ム フ ォ ーム様式を使用 し て作成 さ れた フ ォ ームに、 コ マ ン ド ボ タ ン ま たは ピ ク チ ャ ボ タ ン を追加 し たい場合があ り ます。 開 発者は、 フ ォ ーム様式を作成す る と き 、 フ ォ ーム様式にア ク シ ョ ン を 定義 し て、 追加 し たボ タ ン で可能な動作を指定 し ます。 ユーザがボ タ ン を配置す る と き 、 リ ス ト か ら 行いたいア ク シ ョ ン を選択 し ます。 ア ク シ ョ ンはパブ リ ッ ク な ウ ィ ン ド ウ レベル関数 と し て実装 さ れてい ます。 ❖ ア ク シ ョ ン を定義するには 1 ウ ィ ン ド ウ ペ イ ン タ の ス ク リ プ ト ビ ュ ーで、 メ ニ ュ ーバーか ら [挿入|関数] を選択 し ます。 2 ウ ィ ン ド ウ レベル関数を定義 し ます (方法については、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い)。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 765 様式の完成 ウ ィ ン ド ウ 関数を ア ク シ ョ ン と し て フ ォ ーム ユーザが使用で き る よ う にす る には、 関数をパブ リ ッ ク (public) と し て定義 し て く だ さ い。 定義 し た関数の引数はア ク シ ョ ン のパ ラ メ ー タ と し て使用 さ れ ます。 定義 し た各パブ リ ッ ク ウ ィ ン ド ウ 関数は、 フ ォ ーム ペ イ ン タ のア ク シ ョ ンの選択 ダ イ ア ロ グボ ッ ク ス内でア ク シ ョ ン と し て一覧表示 さ れ ます。 ア ク シ ョ ン と し て使用で き ない関数の定義 フ ォ ーム内で ア ク シ ョ ン と し て使用で き ない ウ ィ ン ド ウ 関数を定 義お よ び使用す る 場合は、 その関数を プ ラ イ ベー ト (private) と し て定義 し て く だ さ い。 メ ニュ ーの使い方 開発者は、 ユーザが フ ォ ーム を実行す る と き に表示 さ れ る メ ニ ュ ー と ツ ールバー を 指定 し ま す。 メ ニ ュ ー ペ イ ン タ で メ ニ ュ ー を 定義 し 、 フ ォ ーム様式の土台 と し て役割を果たす ウ ィ ン ド ウ に関連付け ます。 フ ォ ーム が実行 さ れ る と き 、 定義 し た メ ニ ュ ー内の各 メ ニ ュ ー項目が 表示 さ れ ます。 加え て、 InfoMaker は [ウ ィ ン ド ウ ] お よ び [ヘルプ] メ ニ ュ ーを追加 し て、 InfoMaker 環境下で フ ォ ーム を実行す る と き に、 ユーザが ウ ィ ン ド ウ を 操作 し た り オ ン ラ イ ン ヘルプ を 参照で き る よ う に し ます。 オン ラ イ ン ヘルプの提供 [ヘルプ] 項目を メ ニ ュ ーバー上で定義 し て、 [ヘルプ] ド ロ ッ プダ ウ ン メ ニ ュ ー内で表示 さ れ る メ ニ ュ ー項目を定義で き ます。InfoMaker 上 で フ ォ ーム を実行す る と き には、 こ の [ヘルプ] 項目は表示 さ れ ま せ んが、 実行 フ ァ イ ルか ら フ ォ ーム を実行す る と き には表示 さ れ ま す。 InfoMaker 実行フ ァ イ ルの詳細については、 『InfoMaker ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 ツールバー上の項目 766 MDI ア プ リ ケ ーシ ョ ン の場合 と 同様、 フ ォ ー ム の実行時に、 ツ ール バーに メ ニ ュ ー項目を表示す る よ う に指定で き ます。 PowerBuilder 第 37 章 InfoMaker の様式 と ア ク シ ョ ンの作成 スク リプ ト フ ォ ー ム で 使用す る メ ニ ュ ー に は、 標準 ウ ィ ン ド ウ で 使用す る メ ニ ュ ーに対 し て と 同 じ ス ク リ プ ト 技術を使用 し ます。 通常、 ウ ィ ン ド ウ と その メ ニ ュ ー と の間で通信す る には、 ウ ィ ン ド ウ に対 し てユーザ イ ベン ト を定義 し 、 メ ニ ュ ー オブジ ェ ク ト の親 ウ ィ ン ド ウ プ ロ パテ ィ を使用 し て フ ォーム ウ ィ ン ド ウ に照会 し 、 メ ニ ュ ーか ら その イ ベン ト を発生 さ せ ます。 こ の技術は組み込みフ ォ ーム様式で使用 さ れてい ま す。 詳細情報 メ ニ ュ ー と ユーザ イ ベン ト の使い方の詳細については、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 メ ニ ュ ーに対す る ツ ールバーの関連づけの詳細につい ては、 第 5 章 「MDI アプ リ ケーシ ョ ンの構築」 を参照 し て く だ さ い。 スク リ プ ト の記述 ウ ィ ン ド ウ 、 コ ン ト ロ ール、 お よ び メ ニ ュ ー オブジ ェ ク ト に対す る ス ク リ プ ト は、 標準 ウ ィ ン ド ウ お よ び メ ニ ュ ーに対 し て と 同 じ 方法で書 き ます。デー タ ウ ィ ン ド ウ コ ン ト ロ ールで作業す る 場合は、SQLCA ト ラ ン ザ ク シ ョ ン オブ ジ ェ ク ト のプ ロ パテ ィ を 設定す る 必要は あ り ま せん。 こ れは、 ユーザが フ ォ ーム を実行す る と き に、 InfoMaker が自動 的に設定す る か ら です。 開発者が書 く ス ク リ プ ト を サポー ト す る ために、 ユーザ定義のグ ロ ー バル関数お よ びグ ロ ーバル構造体を定義で き ます。 し か し 、 InfoMaker には ア プ リ ケーシ ョ ン オブ ジ ェ ク ト が な いので、 フ ォ ー ム 様式は グ ロ ーバル変数ま たはグ ロ ーバル外部関数宣言を使用で き ません。 そのほかの機能の追加 フ ォ ームは開発者の必要に応 じ て洗練 さ れた も のにで き ます。 た と え ば、 ド ラ ッ グ ア ン ド ド ロ ッ プ機能を実装 し た り 、 フ ォ ーム で メ ールを 使用で き る よ う に し ます。 ウ ィ ン ド ウ に対 し て作成で き る 機能の詳細については、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 767 様式の使い方 様式の使い方 フ ォ ーム様式を完成、 ま たは少な く と も テ ス ト で き る バージ ョ ン を完 成す る と 、 その フ ォ ーム を使用で き ます。 ❖ InfoMaker ユーザが様式を使用で き る よ う にするには 1 フ ォ ーム様式を定義す る ウ ィ ン ド ウ と メ ニ ュ ーが InfoMaker のア ク セ ス可能な ラ イ ブ ラ リ ( ス タ イ ル ラ イ ブ ラ リ ) 内にあ る こ と を 確認 し ます。 2 ウ ィ ン ド ウ 、 ユーザ オブジ ェ ク ト 、 グ ロ ーバル ユーザ定義関数な ど フ ォ ーム様式内で使用す る そのほかの PowerBuilder オブジ ェ ク ト を同 じ ラ イ ブ ラ リ に追加 し ます。 3 InfoMaker ユーザのパ ス に、 ス タ イ ル ラ イ ブ ラ リ を追加 し ます。 詳細については、 『InfoMaker ユーザーズ ガ イ ド 』 マニ ュ アルを参 照 し て く だ さ い。 カ ス タ ム フ ォ ーム様式を 使用し たフ ォ ームの作成 ス タ イ ル ラ イ ブ ラ リ を使用す る InfoMaker ユーザが新 し い フ ォーム を 作成す る と き には、 新規フ ォ ーム ダ イ ア ロ グ ボ ッ ク ス の [フ ォーム様 式] ボ ッ ク ス上ですべてのカ ス タ ム フ ォーム様式が表示 さ れ ます。 カ ス タ ム様式 と 汎用ア イ コ ン が表示 さ れ ます。 768 PowerBuilder 第 37 章 InfoMaker の様式 と ア ク シ ョ ンの作成 InfoMaker ユーザはデー タ ソ ース と カ ス タ ム様式を選択す る だけで、開 発者の作成 し た フ ォ ーム様式を基礎 と し た フ ォ ーム の作成を開始で き ます。 開発者は作成 し た フ ォ ーム様式について説明を提供 し な ければ な り ません。 継承の理解 ユーザが フ ォ ーム を作成す る と き は、 開発者が フ ォ ーム様式に対 し て 作成 し た ウ ィ ン ド ウ の子孫 ウ ィ ン ド ウ に対 し て作業 し ま す。 つ ま り 、 開発者が PowerBuilder で作成 し た フ ォ ーム様式 ウ ィ ン ド ウ は先祖 ウ ィ ン ド ウ で あ り 、 InfoMaker で使用す る フ ォ ーム ウ ィ ン ド ウ は子孫 ウ ィ ン ド ウ と い う こ と です。フ ォ ーム様式を変更 し た場合、その変更はユー ザがその様式を使用 し て次に作業す る と き に反映 さ れ ます。 た と えば、 フ ォ ーム様式に コ ン ト ロ ールを追加 し た場合、 ユーザが後 にその様式を使用 し て既存の フ ォ ーム を開 く と き にその コ ン ト ロ ール が自動的に表示 さ れ る よ う に設定で き ます。 注意 様式を使用 し てすでに作成 さ れた フ ォ ーム を無効にす る 変更は し ない で く だ さ い。 フ ォ ーム様式の使用の管理 ネ ッ ト ワー ク 上に様式 ラ イ ブ ラ リ を格納 し て、InfoMaker ユーザ全員が 簡単にそれ ら を使用で き る よ う に設定で き ます。 ネ ッ ト ワ ー ク 上に様 式 ラ イ ブ ラ リ を セ ッ ト ア ッ プす る には、 ネ ッ ト ワ ー ク 上で初期設定 フ ァ イ ルを共有 し た状態で行い ます。 共有様式 ラ イ ブ ラ リ を参照す る InfoMaker 初 期 設 定 フ ァ イ ル を ネ ッ ト ワ ー ク 上 に 配 置 し て か ら 、 InfoMaker ユ ーザ が初期設定 フ ァ イ ル に ア ク セ ス で き る よ う に InfoMaker ユーザを設定 し ます。 ❖ 組織全体でス タ イルラ イ ブ ラ リ を使用で き る よ う にするには 1 InfoMaker ユーザがア ク セス でき る ネッ ト ワ ーク 上のディ レ ク ト リ に様式 ラ イ ブ ラ リ を配置 し ます。 2 InfoMaker を開 き 、 ラ イ ブ ラ リ ペ イ ン タ に移動 し 、 探索パ ス にすべ ての様式 ラ イ ブ ラ リ が リ ス ト さ れてい る こ と を確認 し ます。 3 InfoMaker を閉 じ ます。 4 InfoMaker 初期設定フ ァ イ ルを InfoMaker ユーザ全員がア ク セ ス で き る ネ ッ ト ワ ー ク 上のデ ィ レ ク ト リ に コ ピー し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 769 様式の使い方 こ れが共有初期設定フ ァ イ ルです。 こ の フ ァ イ ルは [Application] セ ク シ ョ ンの StyleLib 変数に ス タ イ ル ラ イ ブ ラ リ すべて を記録 し ます。 5 InfoMaker ユーザが共有初期設定フ ァ イ ルにア ク セス でき る よ う に セ ッ ト ア ッ プ し ます。 各 InfoMaker ユーザが InfoMaker 内で共有初期設定フ ァ イ ルの位置 を指定す る 必要があ り ます。 詳細については、 次の 「InfoMaker 上での共有 InfoMaker 初期設定 フ ァ イ ルの位置の指定」 を参照 し て く だ さ い。 一度共有初期設定フ ァ イ ルがユーザの InfoMaker 初期設定フ ァ イ ルで 定義 さ れ る と 、 ユーザの様式 ラ イ ブ ラ リ 探索パ ス はユーザの ロ ーカル InfoMaker 初期設定フ ァ イ ルに加え て、共有初期設定フ ァ イ ルで定義 さ れた様式 ラ イ ブ ラ リ 全部か ら 成 り た ち ます。 ユーザが新 し い フ ォ ーム を作成す る 場合、 様式 ラ イ ブ ラ リ 全部で定義 さ れた フ ォ ーム様式が新 規フ ォーム ダ イ ア ロ グボ ッ ク ス に表示 さ れ ます。 InfoMaker 上での共有 InfoMaker 初期設定 フ ァ イルの位置の指定 各 InfoMaker ユーザは、共有初期設定フ ァ イ ルの位置を InfoMaker に知 ら せ る 必要があ り ます。 ❖ 共有 InfoMaker 初期設定フ ァ イルの位置を指定するには 1 InfoMaker メ ニ ュ ーバーの [ツール|シ ス テ ム オプシ ョ ン] を選択 し ます。 2 [全般] プ ロ パテ ィ ページ内で、 共有 InfoMaker 初期設定フ ァ イ ル へのパ ス を入力 し ます。 3 [OK] を ク リ ッ ク し ます。 InfoMaker は、InfoMaker 初期設定のパス を レ ジ ス ト リ に保存し ます。 組み込み様式の不使用 InfoMaker ユーザが組み込み フ ォ ーム様式 を使用 し ない よ う に し たい 場合 も あ り ます。 つま り 、 開発者の組織のユーザ定義様式を基礎 と す る フ ォ ーム のみを ユーザに使用 さ せたい と い う 場合です。 こ の よ う な 場合、 新規フ ォ ーム ダ イ ア ロ グ ボ ッ ク ス に表示 さ れない よ う に し て、 組み込み様式を使用 し ない よ う に し ます。 ❖ 組み込み様式の表示を禁止するには 1 ネ ッ ト ワ ー ク 上の共有初期設定フ ァ イ ルを前節で説明 し た よ う に 設定 し ます。 2 共有初期設定フ ァ イ ルの [Window] セ ク シ ョ ンに次の行を追加 し ます。 ShowStandardStyles = 0 770 PowerBuilder 第 37 章 InfoMaker の様式 と ア ク シ ョ ンの作成 共有初期設定フ ァ イ ルで こ の行を指定す る と 、 新 し い フ ォ ーム を作成 す る と き に、 ユーザはユーザ定義フ ォ ーム様式か ら のみ選択で き る よ う にな り ます。 InfoMaker はユーザの ロ ーカル InfoMaker 初期設定フ ァ イ ルにあ る ShowStandardStyles 行を無視す る こ と に注意 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 771 様式の使い方 772 PowerBuilder 第 9 部 配布のテ ク ニ ッ ク ア プ リ ケーシ ョ ン を配布す る ためのパ ッ ケージ化の方法 と 、 配布に必要な フ ァ イルについて説明 し ます。 第 3 8 章 配布用ア プ リ ケーシ ョ ンのパ ッ ケー ジ化 こ の章について こ の章では、 完成 し た実行アプ リ ケーシ ョ ン を ユーザに配布す る ための準備方法について説明 し ます。 内容 項目 アプ リ ケーシ ョ ンの配布について 実行可能な アプ リ ケーシ ョ ンの作成 エン ド ユーザへのアプ リ ケーシ ョ ンの配布 ページ 775 776 791 ア プ リ ケーシ ョ ンの配布について PowerBuilder を使用す る と 、 数多 く のアプ リ ケーシ ョ ン アーキ テ ク チ ャ 用に、 アプ リ ケーシ ョ ン を開発お よ び配布で き ます。 従来型の ク ラ イ ア ン ト / サーバ ア プ リ ケーシ ョ ン こ の章の主なね ら いは、 実行 フ ァ イ ル を作成 し て、 単層 ま たは 2 階層の ア プ リ ケーシ ョ ン を 配布用にパ ッ ケージ化す る こ と です。 こ の章の内容は、 コ ンパ イ ル済み コ ー ド を使用す る か疑似 コ ー ド を使用す る か、 動的 ラ イ ブ ラ リ (PBD ま たは DLL) を使用す る か ど う か と その編成方法、 ビ ッ ト マ ッ プやア イ コ ン な ど の リ ソ ー ス を別々に配布す る のか、 それ と も PowerBuilder リ ソ ース フ ァ イ ル (PBR) を使用す る のか、 と い っ た決定をす る 際に役立ち ます。 イ ン タ ーネ ッ ト と 分散ア プ リ ケーシ ョ ン 多層アプ リ ケーシ ョ ン で ク ラ イ ア ン ト を構築す る 場合には、 従来 の ク ラ イ ア ン ト / サーバ アプ リ ケーシ ョ ン の場合 と 同 じ 選択を行 う 必要があ り ます。 EAServer ま たは COM コ ン ポーネ ン ト を作成 し てい る 場合、 あ る いは PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ン ま た は PowerBuilder ウ ィ ン ド ウ ActiveX を使用 し てい る 場合には、 777 ページの 「パ ッ ケージに含 ま れ る 要素」 で後述す る PowerBuilder 動的 ラ イ ブ ラ リ (PBD) と PBR について知 る 必要があ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 775 実行可能なア プ リ ケーシ ョ ンの作成 詳細情報 ク ラ イ ア ン ト / サーバ アプ リ ケーシ ョ ン、 多層アプ リ ケーシ ョ ン、 お よ び Web ア プ リ ケーシ ョ ン で配布 し な ければな ら ない フ ァ イ ルにつ いての詳細は、 第 39 章 「アプ リ ケーシ ョ ン と コ ン ポーネ ン ト の配布」 を参照 し て く だ さ い。 実行可能な ア プ リ ケーシ ョ ンの作成 以下の節では、 パ ッ ケージ化のプ ロ セ ス について詳 し く 説明 し 、 最終 的に作成 さ れ る アプ リ ケーシ ョ ン の さ ま ざ ま な選択事項について、 ア ド バ イ ス を提供 し ます。 以下の こ と について説明 し ます。 • コ ンパ イ ラ の基本事項 • パ ッ ケージに含まれ る 要素 • パ ッ ケージ化モデルの選択 • パ ッ ケージ化モデルの実装 • 実行アプ リ ケーシ ョ ンのテ ス ト コ ン パイ ラ の基本事項 ア プ リ ケーシ ョ ン を計画す る と き 、 基本的な考慮事項の 1 つ と し て、 アプ リ ケーシ ョ ン を生成す る コ ンパ イ ラ 形式があ り ます。PowerBuilder では、 Pcode と マシ ン コ ー ド のいずれか を選択で き ます。 Pcode Pcode (中間 コ ー ド ) は、 PowerBuilder のすべてのプ ラ ッ ト フ ォーム で サポー ト さ れてい る イ ン タ プ リ タ 言語です。 Pcode は、 PowerBuilder が 個々 の オ ブ ジ ェ ク ト を 実行可能 な 状態 で 格納す る 際 に ラ イ ブ ラ リ (PBL フ ァ イ ル) 内で使用す る 形式 と 同 じ 形式です。 Pcode の利点は、 サ イ ズ、 信頼性、 移植性です。 マシ ン コ ー ド PowerBuilder は、 コ ー ド を生成お よ び コ ンパ イ ル し て、 マシ ン コ ー ド の実行フ ァ イ ル ま たは動的 ラ イ ブ ラ リ を作成 し ます。 マシ ン コ ー ド の 最大の利点は、 実行速度の速 さ にあ り ます。 PowerBuilder DLL の呼び出 し はで き ない PowerBuilder マ シ ン コ ー ド DLL を ほかの ア プ リ ケーシ ョ ン か ら 呼び 出す こ と はで き ません。 776 PowerBuilder 第 38 章 配布用ア プ リ ケーシ ョ ンのパ ッ ケージ化 使用する コ ー ド の決定 自分のプ ロ ジ ェ ク ト に と っ て Pcode と マシ ン コ ー ド の ど ち ら が適切か を決め る ためのガ イ ド ラ イ ン を以下に示 し ます。 • 作成 し た ア プ リ ケーシ ョ ン で ス ク リ プ ト 処理 を 集中的に行 う 場合は、 マシ ン コ ー ド を使用す る こ と を検討 し ます。 コ ー ド 内 でループ構造、 浮動小数点演算、 整数演算、 ま たは関数の呼び出 し を使 う 頻度が非常に高い場合は、Pcode よ り も 優れた処理能力を 発揮 し ます。 アプ リ ケーシ ョ ンに前述の よ う な特徴がない場合は、 マシ ン コ ー ド に よ る 処理が Pcode よ り も 目に見え て優れてい る こ と はあ り ません。 作成す る アプ リ ケーシ ョ ン でマシ ン コ ー ド を使 用す る と メ リ ッ ト があ る と 考え ら れ る 場合は、 ベンチマー ク テ ス ト を い く つか実行 し て効果を調べます。 速度 Pcode はマ シ ン コ ー ド よ り 速 く 生成 さ れ ま す。 マ シ ン コ ー ド を 使っ て アプ リ ケーシ ョ ン を配布す る 予定で あ っ て も 、 アプ リ ケー シ ョ ン のテ ス ト 用実行モジ ュ ールをすばや く 作成 し たい と き には Pcode を使用で き ます。 • サイ ズ Pcode を 使 っ て生成 さ れ る フ ァ イ ルは、 マ シ ン コ ー ド を 使っ て生成 さ れ る フ ァ イ ル よ り サ イ ズが小 さ く な り ま す。 フ ァ イ ルのサ イ ズが大 き な問題で あ る コ ン ピ ュ ー タ にアプ リ ケーシ ョ ン を配布す る 場合、 ま たは Web のダ ウ ン ロ ー ド ま たはフ ァ イ ル転送 を使っ て配布す る 場合は、 マシ ン コ ー ド の速度を あ き ら め、 Pcode を選択 し たほ う が よ いで し ょ う 。 例外処理 コ ー ド で例外処理を使用す る 場合は、 マ シ ン コ ー ド DLL を作成す る こ と はで き ません。 マシ ン コ ー ド の作成に使用 さ れ る プ ロ セ ス は、 例 外処理 メ カ ニ ズ ム を サポー ト し てい ません。 例外処理を使用す る コ ー ド か ら マ シ ン コ ー ド DLL を コ ンパ イ ル し よ う と す る と 、 失敗 し 、 エ ラ ー メ ッ セージが表示 さ れます。 パッ ケージ に含ま れる 要素 ど ち ら の コ ン パ イ ラ 形式を選択 し た場合で も 、 PowerBuilder で作成す る アプ リ ケーシ ョ ンは、 以下の要素のいずれか 1 つま たは複数で構成 さ れ ます。 • 実行フ ァ イ ル • 動的 ラ イ ブ ラ リ • リ ソ ース ア プ リ ケーシ ョ ン テ ク ニ ッ ク 777 実行可能なア プ リ ケーシ ョ ンの作成 特定のプ ロ ジ ェ ク ト に必要な要素を決め る には、 まず、 各要素に関す る 知識が必要です。 実行 フ ァ イルについて サーバ コ ン ポーネ ン ト ま たは Web ア プ リ ケーシ ョ ン と し て配布す る のではな く 、 実行フ ァ イ ル と し てユーザに配布す る 単層ま たは 2 階層 のアプ リ ケーシ ョ ン を作成 し てい る 場合には、 必ず実行 (EXE) フ ァ イ ルを作成す る こ と にな り ます。 こ の実行フ ァ イ ルは、 最低で も アプ リ ケーシ ョ ン を タ ーゲ ッ ト プ ラ ッ ト フ ォ ーム でネ イ テ ィ ブに実行す る ための コ ー ド を含みます。 た と え ば、ユーザが配布 さ れた アプ リ ケーシ ョ ン を起動す る と き に、実行フ ァ イ ルのア イ コ ン をデ ス ク ト ッ プでダブル ク リ ッ ク すれば起動で き る こ と を意味 し ます。 そのほかの要素 ア プ リ ケ ーシ ョ ン 用に選択 し た パ ッ ケ ージ化モデル の種類に よ っ て、 実行フ ァ イ ルは以下の要素のいずれか 1 つま たは複 数を含みます。 • アプ リ ケーシ ョ ン の ラ イ ブ ラ リ に入っ てい る コ ン パ イ ル済みオブ ジェ ク ト 配布す る フ ァ イ ルが 1 つで済む よ う に、 すべてのオブジ ェ ク ト を 実行フ ァ イ ルに入れた り 、1 つの実行フ ァ イ ル と 1 つま たは複数の 動的 ラ イ ブ ラ リ にアプ リ ケーシ ョ ン を分割 し た り で き ま す。 詳細 については、 778 ページの 「動的 ラ イ ブ ラ リ について」 を参照 し て く だ さ い。 • アプ リ ケーシ ョ ン用にパ ッ ケージ化 し た任意の動的 ラ イ ブ ラ リ に 含まれ る オブジ ェ ク ト と リ ソ ース を検索す る ために、 PowerBuilder の実行シ ス テ ムが使用す る 実行 ラ イ ブ ラ リ リ ス ト • ビ ッ ト マ ッ プな ど、 アプ リ ケーシ ョ ンが使用す る リ ソ ース 図 38-1: 実行 フ ァ イルの内容 動的 ラ イ ブ ラ リ につい て 778 ア プ リ ケーシ ョ ン 全体 を 1 つの大 き な実行 フ ァ イ ルに収め る 代わ り に、 そのオブジ ェ ク ト の一部ま たはすべて を 1 つま たは複数の動的 ラ イ ブ ラ リ で配布で き ま す。 PowerBuilder が動的 ラ イ ブ ラ リ を実装す る 方法は、 選択す る コ ンパ イ ラ 形式に よ っ て異な り ます。 PowerBuilder 第 38 章 配布用ア プ リ ケーシ ョ ンのパ ッ ケージ化 表 38-1: PowerBuilder 動的ラ イ ブ ラ リ 作成 コ ー ド マシ ン コ ー ド 実装 さ れる動的ラ イ ブ ラ リ DLL フ ァ イ ル (ダ イ ナ ミ ッ ク リ ン ク ラ イ ブ ラ リ ) Pcode マ シ ン コ ー ド の動的 ラ イ ブ ラ リ は、 Windows では 拡張子 .dll が付加 さ れ る 。 こ れ ら の動的 ラ イ ブ ラ リ は、 オペレーテ ィ ン グ環境におけ る 、 ほかの標準的 な共有 ラ イ ブ ラ リ と 同様に動作す る 。 こ れ ら の動的 ラ イ ブ ラ リ は、外部のプ ロ グ ラ ムか ら 呼び出せない 点に注意す る PBD (PowerBuilder 動的 ラ イ ブ ラ リ ) フ ァ イ ル こ れ ら の動的 ラ イ ブ ラ リ は、 実行時に ア プ リ ケー シ ョ ンに リ ン ク さ れ る と い う 点で、DLL フ ァ イ ルに 似てい る 。 ただ し 、 PBD は内部形式が異な る ため、 DLL と は互換性がない 2 種類の動的 ラ イ ブ ラ リ (DLL と PDB) を 1 つのア プ リ ケーシ ョ ン内に混在 さ せ る こ と はで き ない 実行フ ァ イ ル と 同様、 動的 ラ イ ブ ラ リ に格納で き る のは、 オブジ ェ ク ト の ソ ース ではな く 、 コ ンパ イ ル済みのオブジ ェ ク ト だけです。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 779 実行可能なア プ リ ケーシ ョ ンの作成 図 38-2: 動的 ラ イ ブ ラ リ 内の コ ンパイル済みオブ ジ ェ ク ト 実行フ ァ イ ル と は異な り 、 動的 ラ イ ブ ラ リ には ス タ ー ト ア ッ プ コ ー ド が含まれ ません。 動的 ラ イ ブ ラ リ は、 独立 し て実行す る こ と はで き ません。 動的 ラ イ ブ ラ リ は、 アプ リ ケーシ ョ ン を実行 し た と き に、 実行フ ァ イ ル内に必要なオブジ ェ ク ト が見つか ら ない場合 にア ク セ ス さ れ ます。 そのほかの要素 動的 ラ イ ブ ラ リ にはビ ッ ト マ ッ プな ど の リ ソ ース が含ま れ る 場合があ り ます。動的 ラ イ ブ ラ リ のオブジ ェ ク ト に必要な リ ソ ース を、その DLL フ ァ イ ル ま たは PBD フ ァ イ ルに含め る こ と がで き ま す。 こ れに よ っ て、 動的 ラ イ ブ ラ リ を、 再利用可能な、 独立 し たユニ ッ ト にす る こ と がで き ます。 ただ し 、 処理効率の視点か ら 考え る と 、 リ ソ ー ス は実行 フ ァ イ ル内に格納 さ れてい る と き の方が、 実行時に速 く ロ ー ド さ れ ま す。 図 38-3: 動的 ラ イ ブ ラ リ 内の リ ソ ース 動的 ラ イ ブ ラ リ を使 う 理由 表 38-2 に示す よ う に、 動的 ラ イ ブ ラ リ の使 用を推奨す る 理由がい く つかあ り ます。 780 PowerBuilder 第 38 章 配布用ア プ リ ケーシ ョ ンのパ ッ ケージ化 表 38-2: 動的ラ イ ブ ラ リ を使用する理由 理由 モジ ュ ール性 保守性 再利用性 柔軟性 効率性 詳細 ア プ リ ケーシ ョ ン を、 管理の し やすい、 よ り 小 さ く 、 よ り 多 く のモジ ュ ール型フ ァ イ ルに分割で き る ア プ リ ケ ー シ ョ ン コ ン ポー ネ ン ト の個別配布が で き る 。 ユーザにバグ修正フ ァ イ ルを提供す る ために、 影響のあ る 特定の動的 ラ イ ブ ラ リ を配布で き る 動的 ラ イ ブ ラ リ は、 ユーザ間だけでな く 、 アプ リ ケーシ ョ ン間で も 共有で き る ため、 複数のアプ リ ケーシ ョ ン で同 じ コ ン ポーネ ン ト を再利用で き る 文字列変数のみに よ っ て参照 さ れ る ウ ィ ン ド ウ オブジ ェ ク ト な ど、 実行時にアプ リ ケーシ ョ ン に よ っ て動的にのみ参 照 さ れ る オブジ ェ ク ト を提供で き る こ の よ う なオブジ ェ ク ト は、 デー タ ウ ィ ン ド ウ の場合を除 いて、 実行フ ァ イ ルに含め る こ と はで き ない 以下の理由に よ り 、 大規模な アプ リ ケーシ ョ ン で も メ モ リ を効率的に使用で き る • PowerBuilder では、 動的 ラ イ ブ ラ リ 全体を メ モ リ 内に一 度に ロ ー ド し ない。 その代わ り 、 必要に応 じ て、 動的 ラ イ ブ ラ リ か ら 個々のオブジ ェ ク ト を ロ ー ド す る • 実行 フ ァ イ ルのサ イ ズ を 小 さ く 抑え る こ と が で き る た め、 ロ ー ド 時間が速 く 、 扱いやすい 動的 ラ イ ブ ラ リ の利用を決めた ら 、 ど の ラ イ ブ ラ リ (PBL フ ァ イ ル) か ら 作成す る か を、 PowerBuilder に指示す る 必 要があ り ます。 PowerBuilder は、 選択 し た PBL フ ァ イ ルか ら コ ンパ イ ル済みの全オブジ ェ ク ト を、DLL フ ァ イ ル ま たは PBD フ ァ イ ル内に配 置 し ます。 動的ラ イ ブ ラ リ の編成 アプ リ ケーシ ョ ン で一部のオブジ ェ ク ト し か使用 し ない場合は、 余分 なオブジ ェ ク ト を動的 ラ イ ブ ラ リ に含めて も フ ァ イ ルが大 き く な る だ けです。 その解決法は以下の と お り です。 リ ソ ースについて 1 新 し い PBL フ ァ イ ルを作成 し 、 必要なオブジ ェ ク ト だけ を その中 に コ ピーす る 2 動的 ラ イ ブ ラ リ の ソ ース と し て、 作成 し た新 し い PBL フ ァ イ ルを 使用す る ウ ィ ン ド ウ や メ ニ ュ ーな ど の PowerBuilder オブジ ェ ク ト に加え て、 ア プ リ ケーシ ョ ン では さ ま ざ ま な リ ソ ース を使い ます。 リ ソ ー ス の例に は以下の も のがあ り ます。 • ア プ リ ケーシ ョ ン テ ク ニ ッ ク ピ ク チ ャ コ ン ト ロ ール ま たは ピ ク チ ャ ボ タ ン コ ン ト ロ ールで表 示す る ビ ッ ト マ ッ プ 781 実行可能なア プ リ ケーシ ョ ンの作成 • ウ ィ ン ド ウ に割 り 当て る カ ス タ ム ポ イ ン タ リ ソ ー ス を使 う と き は、 PowerBuilder オブジ ェ ク ト と と も に、 アプ リ ケーシ ョ ンの一部 と し て配布す る 必要があ り ます。 PowerBuilder のアプ リ ケーシ ョ ン では、 複数の異な る リ ソ ー ス を使用で き ま す。 表 38-3 は、 リ ソ ー ス を、 使用で き る オブ ジ ェ ク ト ご と に リ ス ト し てい ます。 リ ソ ースの種類 表 38-3: PowerBuilder オブ ジ ェ ク ト および リ ソ ース オブ ジ ェ ク ト ウ ィ ン ド ウ オブジ ェ ク ト と ユーザ オブジ ェ ク ト デー タ ウ ィ ン ド ウ オブ ジェ ク ト MDI アプ リ ケーシ ョ ンに おけ る メ ニ ュ ー オブジ ェ クト 使用 さ れる リ ソ ースの種類 ア イ コ ン (ICO フ ァ イ ル) ピ ク チ ャ (BMP、GIF、JPEG、RLE、お よ び WMF の各フ ァ イ ル) ポ イ ン タ (CUR フ ァ イ ル) ピ ク チ ャ (BMP、GIF、JPEG、RLE、お よ び WMF の各フ ァ イ ル) ピ ク チ ャ (BMP、GIF、JPEG、RLE、お よ び WMF の各フ ァ イ ル) リ ソ ースの配布 ア プ リ ケ ーシ ョ ン と い っ し ょ に配布す る リ ソ ー ス の パ ッ ケージ方法を決め る と き は、以下のアプ ロ ーチか ら 選択で き ます。 • リ ソ ース を実行フ ァ イ ルに含め る PowerBuilder では、 実行フ ァ イ ルの作成時、 その フ ァ イ ルに配置す る オブ ジ ェ ク ト について、 リ ソ ー ス (ア イ コ ン、 ピ ク チ ャ 、 ポ イ ン タ ) を明示的に参照 し てい る か ど う かが自動的に調べ ら れ ます。 次に、その よ う な リ ソ ース をすべて、実行フ ァ イ ル内に直接 コ ピー し ます。 文字列変数な ど を介 し て動的に参照 さ れ る リ ソ ー ス は、 自動的に コ ピ ー さ れ ま せん。 そ の よ う な リ ソ ー ス を 実行 フ ァ イ ル内に コ ピーす る には、 リ ソ ー ス (PBR) フ ァ イ ル を使わな ければな り ま せん。 こ れは単純な テ キ ス ト フ ァ イ ルで、既存の ICO、BMP、GIF、 JPEG、 RLE、 WMF、 お よ び CUR の各フ ァ イ ルを こ の中に一覧表 示 し ます。 PBR フ ァ イ ルが完成 し た ら 、実行フ ァ イ ルを作成す る と き は、PBR フ ァ イ ル を 読み込む よ う PowerBuilder に指示す る こ と に よ っ て、 追加す る リ ソ ー ス を指定 し ま す。 処理効率上の理由で、 ほ と ん ど ま たはすべての リ ソ ー ス を実行フ ァ イ ルに含め る 場合、 PBR フ ァ イ ルには、 動的 ラ イ ブ ラ リ 内のオブジ ェ ク ト に よ っ て使用 さ れ る リ ソ ース も 含め る こ と がで き ます。 782 PowerBuilder 第 38 章 配布用ア プ リ ケーシ ョ ンのパ ッ ケージ化 • リ ソ ース を動的 ラ イ ブ ラ リ に含め る 1 つ ま たは複数の動的 ラ イ ブ ラ リ に リ ソ ー ス を直接含めたい場合 があ り ますが、 PowerBuilder は、 リ ソ ース がその フ ァ イ ル内のオブ ジ ェ ク ト に よ り 明示的に参照 さ れ る と き で も 、 作成 さ れ る 動的 ラ イ ブ ラ リ 内にその リ ソ ー ス を自動的に コ ピー し ま せん。 こ の特定 の DLL フ ァ イ ル ま たは PBD フ ァ イ ル内に ど の リ ソ ー ス を入れ る か を PowerBuilder に対 し て指定す る PBR フ ァ イ ルを作成す る 必要 があ り ます。 リ ソ ース を入れ る 動的 ラ イ ブ ラ リ ご と に、 個別の PBR フ ァ イ ルを 使用 し ま す。 適切で あれば、 こ のア プ ロ ーチ を使っ て、 リ ソ ー ス だけ を含み、 オブジ ェ ク ト を含 ま ない動的 ラ イ ブ ラ リ を生成す る こ と も で き ます。 空の PBL フ ァ イ ルを ソ ース と し て作業を始め る だけです。 • リ ソ ース フ ァ イ ルを個別の フ ァ イ ルで配布す る こ れは、 アプ リ ケーシ ョ ン の配布時に、 ア プ リ ケーシ ョ ン の実行 フ ァ イ ルお よ び動的 ラ イ ブ ラ リ に加え て、 さ ま ざ ま な画像フ ァ イ ル を ユーザに提供す る こ と を意味 し ま す。 多 く の フ ァ イ ルを配布 す る こ と に問題がな ければ、 一部の フ ァ イ ルを修正す る 予定が あ る 場合に便利な方法です。 こ の方法は、 実行時に必要な検索作業が多 く な る ため、 も っ と も 速い方法ではない こ と に注意 し て く だ さ い。 アプ リ ケーシ ョ ン で リ ソ ー ス が必要な と き 、 ア プ リ ケーシ ョ ン は最初に実行フ ァ イ ル を、 次に動的 ラ イ ブ ラ リ を検索 し ま す。 リ ソ ー ス が見つか ら ない 場合、 アプ リ ケーシ ョ ンは別個の フ ァ イ ル内で検索 し ます。 こ れ ら の個々の フ ァ イ ルが ど こ に格納 さ れ て い る か を、 ア プ リ ケーシ ョ ン がわか る よ う に し てお く 必要があ り ま す。 そ う でない 場合は、 対応す る リ ソ ース が表示 さ れ ません。 特定のアプ リ ケーシ ョ ン をパ ッ ケージ化す る と き は、 以上のアプ ロ ー チのいずれか 1 つま たは組み合わせを利用で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 783 実行可能なア プ リ ケーシ ョ ンの作成 PBR フ ァ イルを使っ て、 動的に参照 さ れるデー タ ウ ィ ン ド ウ オブ ジ ェ ク ト を含める 作成中の実行フ ァ イ ルの中に、 アプ リ ケーシ ョ ン が文字列変数を介 し て のみ動的に参照す る デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト を 入れた い場 合があ り ま す。 そのためには、 PowerBuilder に よ っ て実行フ ァ イ ル内 に コ ピー し たい リ ソ ース の名前 と と も に、 そのデー タ ウ ィ ン ド ウ オブ ジ ェ ク ト の名前を、PBR フ ァ イ ル内に一覧表示 し なければな り ません。 動的ラ イ ブ ラ リ を作成する と き は、その必要はあ り ません。PowerBuilder に よ っ て、 ソ ース ラ イ ブ ラ リ (PBL フ ァ イ ル) のすべてのデー タ ウ ィ ン ド ウ オブジ ェ ク ト が、 新 し い DLL フ ァ イ ル ま たは PBD フ ァ イ ル内 に自動的に含ま れます。 PowerBuilder リ ソ ース フ ァ イ ルの作成 PBR フ ァ イ ルは、 リ ソ ース名 (BMP、 CUR、 ICO、 RLE、 WMF フ ァ イ ルな ど) と デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト が一覧で表示 さ れて い る ASCII テ キ ス ト フ ァ イ ルです。 PBR フ ァ イ ルを作成す る には、 テ キ ス ト エデ ィ タ を使用 し ます。各 リ ソ ース の名前を 1 行に 1 つずつ記述 し 、 その リ ス ト に拡張子 PBR を 付け て フ ァ イ ル と し て保存 し ま す。 以下 は、 PBR フ ァ イ ルのサン プルです。 ct_graph.ico document.ico codes.ico button.bmp next1.bmp prior1.bmp ❖ PowerBuilder リ ソ ース フ ァ イルを作成 し て使用する手順 1 テ キ ス ト エデ ィ タ を使用 し て、 アプ リ ケーシ ョ ン で動的に参照 さ れ る リ ソ ー ス フ ァ イ ル を すべて一覧表示す る テ キ ス ト フ ァ イ ル を作成 し ま す (フ ァ イ ルの作成については、 以下を参照 し て く だ さ い)。 動的 ラ イ ブ ラ リ の リ ソ ース フ ァ イ ルを作成す る と き は、 ス ク リ プ ト で動的に割 り 当て ら れた リ ソ ー ス だけでな く 、 動的 ラ イ ブ ラ リ に よ っ て使用 さ れ る すべての リ ソ ース を一覧表示 し ます。 2 784 プ ロ ジ ェ ク ト ペ イ ン タ で、 リ ソ ース フ ァ イ ルを指定 し ます。 動的 ラ イ ブ ラ リ と 同様、 実行フ ァ イ ルに リ ソ ース フ ァ イ ルが添付 さ れ てい る こ と も あ り ます。 PowerBuilder 第 38 章 配布用ア プ リ ケーシ ョ ンのパ ッ ケージ化 PowerBuilder がプ ロ ジ ェ ク ト を構築す る と き は、実行フ ァ イ ル ま た は動的 ラ イ ブ ラ リ の PBR フ ァ イ ルに指定 さ れて い る すべて の リ ソ ー ス を含め ま す。 動的に割 り 当て ら れた リ ソ ー ス を個別に配布 す る 必要はあ り ま せん。 リ ソ ー ス はア プ リ ケーシ ョ ン に含 ま れて い ます。 リ ソ ース を指定する リ ソ ー ス フ ァ イ ルが現行デ ィ レ ク ト リ に あ る 場合は、 以下の よ う に フ ァ イ ルを一覧表示す る だけです。 FROWN.BMP リ ソ ー ス フ ァ イ ルが別のデ ィ レ ク ト リ に あ る 場合は、 以下の よ う に フ ァ イ ルへのパ ス を指定 し ます。 C:¥BITMAPS¥FROWN.BMP PBR フ ァ イル と ス ク リ プ ト のパスの一致 PBR フ ァ イ ルに指定す る フ ァ イ ル名は、 ス ク リ プ ト におけ る リ ソ ース の参照方法 と 正確に一致 し ていなければな り ません。 ス ク リ プ ト 内の参照にパ ス が使用 さ れ る 場合は、 PBR フ ァ イ ルに同 じ パ ス を指定す る 必要があ り ます。 ス ク リ プ ト の リ ソ ース フ ァ イ ルがパ ス で修飾 さ れていない場合は、 PBR フ ァ イ ルで も 修飾 し ない よ う に し ます。 た と えば、 次の よ う な ス ク リ プ ト があ り ます。 p_logo.PictureName = "FROWN.BMP" こ の場合、 PBR フ ァ イ ルは次の よ う に記述す る 必要があ り ます。 FROWN.BMP PBR フ ァ イ ルの記述が下記の よ う に異な る 場合について説明 し ます。 C:¥MYAPP¥FROWN.BMP こ の場合、 ス ク リ プト でパス が指定さ れていないと 、 PowerBuilder は実 行時にリ ソ ース を 見つける こ と はでき ま せん。 こ れは、 PowerBuilder が 実行時には単純な 文字列の比較を 行う た めです。 先ほど の例では、 ス ク リ プト を 実行する と き 、 PowerBuilder は実行フ ァ イ ルに 「FROWN.BMP」 と い う 文字列で指定 さ れてい る オブジ ェ ク ト を探 し ます。 実行フ ァ イ ルでは、 リ ソ ース 「C:¥MYAPP¥FROWN.BMP」 と し て識別 さ れてい る ため、 PowerBuilder はオブジ ェ ク ト を見つけ る こ と がで き ません。 こ の場合、実行時には ピ ク チ ャ が表示 さ れず、ウ ィ ン ド ウ の コ ン ト ロ ー ルは空白にな り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 785 実行可能なア プ リ ケーシ ョ ンの作成 デー タ ウ ィ ン ド ウ オ ブ ジ ェ ク ト を PBR フ ァ イルに含める デー タ ウ ィ ン ド ウ オブジ ェ ク ト を リ ス ト に含め る には、 ラ イ ブ ラ リ 名 (拡張子 PBL) の後にカ ッ コ で囲んだデー タ ウ ィ ン ド ウ オブジ ェ ク ト 名を付け ます。 た と えば、 次の よ う にな り ます。 sales.pbl(d_emplist) 実行 フ ァ イ ル作成時の現行デ ィ レ ク ト リ にデー タ ウ ィ ン ド ウ ラ イ ブ ラ リ がない場合は、 PBR フ ァ イ ルに完全修飾の参照を指定 し ます。 た と えば、 次の よ う にな り ます。 c:¥myapp¥sales.pbl(d_emplist) パッ ケージ 化モ デルの選択 前述 し た と お り 、 実行可能な アプ リ ケーシ ョ ン をパ ッ ケージ化す る に は、 た く さ んのオプシ ョ ン があ り ます。 も っ と も 一般的なパ ッ ケージ 化モデルを以下に示 し ます。 ス タ ン ド ア ロ ンの実行 フ ァ イル こ のモデルでは、 オブジ ェ ク ト と リ ソ ー ス がすべて実行フ ァ イ ル内に 含まれてい る ため、 配布す る フ ァ イ ルは 1 つだけにな り ます。 説明図 図 38-4 に、 こ のモデルの構造のサン プルを示 し ます。 図 38-4: ス タ ン ド ア ロ ン実行モデル こ のモデルは、 小規模で、 簡単な ア プ リ ケーシ ョ ン に適 し てお り 、 管理を それほ ど必要 と し ないアプ リ ケーシ ョ ン の場合には特に適 し て い ま す。 その よ う な プ ロ ジ ェ ク ト に、 こ のモデル を 使用す る と 、 最高の処理効率 と も っ と も 簡単な配布方法が保証 さ れ ます。 用途 実行 フ ァ イル と 外部 リ ソ ース こ のモデルでは、 すべて のオ ブ ジ ェ ク ト と 大部分の リ ソ ー ス が実行 フ ァ イ ルに含ま れてい ますが、特定の リ ソ ース については、別個の フ ァ イ ルを配布 し ます。 説明図 786 図 38-5 に、 こ のモデルの構造のサン プルを示 し ます。 PowerBuilder 第 38 章 配布用ア プ リ ケーシ ョ ンのパ ッ ケージ化 図 38-5: 外部 リ ソ ース を含む実行モデル 用途 こ のモデル も 小規模で、 簡単な ア プ リ ケーシ ョ ン に適 し てい ま すが、 変更の可能性のあ る リ ソ ース の管理を サポー ト し てい る と い う 点で、前のモデル と は異な り ます。つま り 、実行フ ァ イ ルの修正 コ ピー を 配布 し な い で特定の リ ソ ー ス の修正 コ ピ ー を ユーザに配布で き ま す。 こ のモデルを使 う と 、 ほかのアプ リ ケーシ ョ ン と 共有 し なければな ら ない リ ソ ー ス、 ま たは、 大規模で使用頻度の低い リ ソ ース を扱 う こ と も 可能です。 実行フ ァ イル と 動的ラ イブラ リ こ のモデルでは、 アプ リ ケーシ ョ ン を 1 つの実行フ ァ イ ル と 1 つま た は複数の動的 ラ イ ブ ラ リ (DLL ま たは PBD) に分割 し ま す。 ア プ リ ケーシ ョ ン を分割す る と き は、 オブジ ェ ク ト と リ ソ ー ス を さ ま ざ ま な 方法で編成で き ます。 表 38-4 に、 い く つかの方法を示 し ます。 表 38-4: 動的ラ イ ブ ラ リ を含むオブ ジ ェ ク ト と リ ソ ースの編成 編成の対象 オブジェ ク ト リ ソ ース 行え る こ と 実行フ ァ イ ルにオブジ ェ ク ト が含まれない よ う に し 、 すべて のオブジ ェ ク ト を動的 ラ イ ブ ラ リ に配置 し て、 管理を容易に する 。 ま たは、 ア ク セ ス 頻度の高い一部のオブ ジ ェ ク ト を 実行 フ ァ イ ルに 配置 し て、 こ れ ら のオブジ ェ ク ト へのア ク セ ス を最適化 し 、 残 り のオブジ ェ ク ト すべて を動的 ラ イ ブ ラ リ 内に配置する 大部分 ま た はすべて の リ ソ ー ス を、 それ ら を 使用す る オブ ジ ェ ク ト と と も に、 動的 ラ イ ブ ラ リ 内に配置 し て、 再利用を 簡単にする 。 ま たは、 大部分 ま たはすべての リ ソ ー ス を実行 フ ァ イ ルに配置す る 。 こ れに よ っ て、 リ ソ ースへのア ク セ ス が最適化 さ れ る 説明図 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 図 38-6 に、 こ のモデルの構造のサン プルを示 し ます。 787 実行可能なア プ リ ケーシ ョ ンの作成 図 38-6: 動的 ラ イ ブ ラ リ を含む実行モデル こ のモデルは、 ア プ リ ケーシ ョ ン の編成、 配布、 お よ び管理に おいて柔軟に作業を行え る ため、 多 く の大規模なプ ロ ジ ェ ク ト に適 し てい ます。 用途 た と えば、 こ のモデル を使用す る と 、 1 つの動的 ラ イ ブ ラ リ で、 アプ リ ケーシ ョ ン の特定部分に修正を加え る こ と がで き ます。 ただ し 、 ラ イ ブ ラ リ に修正を加え た場合は、 必ずアプ リ ケーシ ョ ン全体を再構築 し 、 すべての動的 ラ イ ブ ラ リ を顧客に配布す る 必要があ り ます。 実行 フ ァ イル、 動的 ラ イ ブ ラ リ 、 および外部 リ ソ ース こ のモデルは、 実行フ ァ イ ル と 動的 ラ イ ブ ラ リ にすべての リ ソ ー ス を 含め る かわ り に、 特定の リ ソ ース について個別の フ ァ イ ルを配布す る と い う 点以外は、 直前のモデル と 同 じ です。 説明図 788 図 38-7 に、 こ のモデルの構造のサン プルを示 し ます。 PowerBuilder 第 38 章 配布用ア プ リ ケーシ ョ ンのパ ッ ケージ化 図 38-7: 動的ラ イ ブ ラ リ と 外部 リ ソ ース を含む実行モデル 用途 こ のモデルは、 大規模な アプ リ ケーシ ョ ンに適 し てお り 、 特に、 特定の リ ソ ース を処理す る ための柔軟性が必要な アプ リ ケーシ ョ ン の 場合に適 し てい ます。 柔軟性が求め ら れ る のは、 以下の よ う な リ ソ ー ス です。 • 修正す る 可能性があ る • ほかのアプ リ ケーシ ョ ン と 共有 し なければな ら ない • 大規模で、 使用頻度が低い パッ ケージ 化モ デルの実装 ア プ リ ケーシ ョ ン につい て適切なパ ッ ケージ化モデル を決定 し た ら 、 PowerBuilder に付属のパ ッ ケージ化機能を利用 し て、 パ ッ ケージ化モ デルを実装で き ます。 こ の作業のほ と ん ど は、 プ ロ ジ ェ ク ト ペ イ ン タ で行い ま す。 プ ロ ジ ェ ク ト ペ イ ン タ を 使用すれば、 実行ア プ リ ケー シ ョ ン と 同様に、 コ ン ポーネ ン ト 、 プ ロ キ シ ラ イ ブ ラ リ 、 HTML フ ァ イ ルが作成で き ます。 実行ア プ リ ケーシ ョ ン 用にプ ロ ジ ェ ク ト ペ イ ン タ を使用する 実行アプ リ ケーシ ョ ン用のプ ロ ジ ェ ク ト ペ イ ン タ は、 以下の操作を可 能にす る こ と に よ っ て、 パ ッ ケージ化ジ ョ ブのすべての局面を編成 し ます。 • ア プ リ ケーシ ョ ン テ ク ニ ッ ク 作成す る 実行フ ァ イ ルを指定 し ます。 789 実行可能なア プ リ ケーシ ョ ンの作成 • 作成す る 動的 ラ イ ブ ラ リ (DLL フ ァ イ ル ま たは PBD フ ァ イ ル) を 指定 し ます。 • 実行フ ァ イ ル ま たは特定の動的 ラ イ ブ ラ リ に含め る リ ソ ー ス を指 定 し ます。 リ ソ ース の取得場所を示す適切な PBR フ ァ イ ルを利用 し ます。 • 生成す る コ ンパ イ ラ 形式 と し て、 マシ ン コ ー ド ま たは Pcode を選 択 し ます。 マシ ン コ ー ド では、 最適化、 ト レース情報、 お よ びエ ラ ー コ ン テ キ ス ト 情報な ど の、 さ ま ざ ま な コ ー ド 生成オプシ ョ ン も 指定で き ます。 • 構築オプシ ョ ン を選択 し ます。 実行アプ リ ケーシ ョ ン の生成時に、 プ ロ ジ ェ ク ト ペ イ ン タ を使っ て アプ リ ケーシ ョ ン のオブジ ェ ク ト の フ ル再構築を行 う か、 イ ン ク リ メ ン タ ル再構築を行 う か ど う か の指定 も 含まれ ます。 • パ ッ ケージ全体を再構築す る と き にいつで も 利用で き る プ ロ ジ ェ ク ト オブジ ェ ク ト と し て、 上記の仕様を保存 し ます。 プ ロ ジ ェ ク ト ペ イ ン タ の使い方の詳細については、『PowerBuilder ユー ザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 個別の動的 ラ イ ブ ラ リ の構築 既存のアプ リ ケーシ ョ ン に修正を加え て も 、 そのすべての動的 ラ イ ブ ラ リ が影響を受け る わけではあ り せん。 シ ス テ ム ツ リ ーま たは ラ イ ブ ラ リ ペ イ ン タ のポ ッ プア ッ プ メ ニ ュ ーか ら 、個別の動的 ラ イ ブ ラ リ を 再構築で き ます。 変更が限定的で、 ほかの PBL の継承オブ ジ ェ ク ト に影響 し な い場合 は、 更新ま たはバグ修正用に個別の PBD を ユーザに配布で き ます。 し か し 、 アプ リ ケーシ ョ ン を修正す る たびに フル再構築 し て、 実行フ ァ イ ル と アプ リ ケーシ ョ ン のすべての動的 ラ イ ブ ラ リ を配布す る こ と を お勧め し ます。 実行ア プ リ ケーシ ョ ン のテ ス ト 実行可能な アプ リ ケーシ ョ ン を作成 し た ら 、 配布す る 前に、 その動作 を テ ス ト し て く だ さ い。 PowerBuilder の開発環境においては、 すでに ア プ リ ケ ーシ ョ ン を 何度 も 実行 し て い る か も し れ ま せん が、 エ ン ド ユーザの立場にな っ て独立 し た実行可能な アプ リ ケーシ ョ ン を実行す る こ と は、 非常に重要な こ と です。 アプ リ ケーシ ョ ン を実行す る 手順は次の と お り です。 790 PowerBuilder 第 38 章 配布用ア プ リ ケーシ ョ ンのパ ッ ケージ化 1 PowerBuilder を終了 し て、通常の操作環境ま たは ウ ィ ン ド ウ 環境に 戻 り ます。 2 アプ リ ケーシ ョ ンが PowerBuilder ラ ン タ イ ム ラ イ ブ ラ リ にア ク セ ス で き る よ う に し ておいて く だ さ い。 そのためには、PowerBuilder 仮想マシ ンお よ びそのほかの ラ ン タ イ ム フ ァ イ ルの位置が PATH 環境変数に設定 さ れてい る こ と 、 ま た は、 アプ リ ケーシ ョ ンの レ ジ ス ト リ エ ン ト リ を作成 し て、 パ ス を 指定で き る こ と を確認 し ます。 3 ア プ リ ケーシ ョ ンの実 行を ト レースする 任意のネ イ テ ィ ブ アプ リ ケーシ ョ ン の場合 と 同 じ よ う に、 アプ リ ケーシ ョ ンの実行フ ァ イ ルを実行 し ます。 問題を見つけやす く す る ため、PowerBuilder では、 ト レース と プ ロ フ ァ イ ルの機能 を提供 し てい ま す。 こ れ ら の機能は開発環境で利用で き 、 実行可能な アプ リ ケーシ ョ ン を実行す る と き に も 利用で き ます。 アプ リ ケーシ ョ ン の実行フ ァ イ ルに問題がな く て も 、 こ の機能を利用 し て、 アプ リ ケーシ ョ ン の動作に関す る 監査証跡を生成す る こ と をお勧め し ます。 実行の ト レース の詳細については、 『PowerBuilder ユーザーズ ガ イ ド 』 マニ ュ アルを参照 し て く だ さ い。 エ ン ド ユーザへのア プ リ ケーシ ョ ンの配布 実行可能な ア プ リ ケ ーシ ョ ン を ユーザに配布す る 場合には、 各種の フ ァ イ ル と プ ロ グ ラ ム をすべて コ ン ピ ュ ー タ やネ ッ ト ワ ー ク 上の適切 な位置に イ ン ス ト ールす る 必要があ り ます。 配布プ ロ セス を自動化 する 配布プ ロ セ ス を自動化す る 場合、 InstallShield な ど の ソ フ ト ウ ェ ア配布 アプ リ ケーシ ョ ン を利用す る こ と も で き ます。 通常、 その よ う な アプ リ ケーシ ョ ン では、 ユーザがアプ リ ケーシ ョ ン を実行す る と き に必要 と な る 実行フ ァ イ ル、 リ ソ ース フ ァ イ ル、 デー タ ソ ース、 お よ び コ ン フ ィ グ レ ー シ ョ ン フ ァ イ ルがすべ て イ ン ス ト ール さ れ ま す。 ま た、 ユーザの初期設定 (INI) フ ァ イ ル と レ ジ ス ト リ も 更新 さ れ ます。 イ ン ス ト ール チェ ッ ク リ ス ト 以下のチ ェ ッ ク リ ス ト を使用す る と 、 必要な も の をすべて イ ン ス ト ー ル し たか ど う か確認で き ます。 読みやす く す る ために、 チ ェ ッ ク リ ス ト は以下の項目に分類 さ れてい ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 791 エ ン ド ユーザへのア プ リ ケーシ ョ ンの配布 環境要素を イ ン ス ト ー ルする • 環境要素を イ ン ス ト ールす る • アプ リ ケーシ ョ ン要素を イ ン ス ト ールす る チ ェ ッ ク リ ス ト 項目 PowerBuilder の ラ ン タ イ ム DLL の イ ン ス ト ール 詳細 PowerBuilder の実行シ ス テ ム を 含む、 すべて の DLL フ ァ イ ルを、 各ユーザの コ ン ピ ュ ー タ に イ ン ス ト ールす る 。 DLL フ ァ イ ルは、 PowerBuilder ア プ リ ケーシ ョ ン を、 開発環境の外で、 独立 し て実行す る ために必要にな る 。 こ れは、 Pcode で 生成 さ れた ア プ リ ケーシ ョ ン だけでな く 、 マ シ ン コ ー ド で生成 さ れた アプ リ ケーシ ョ ンに も 該 当す る ラ ン タ イ ム DLL の イ ン ス ト ールについての詳細 は、 805 ページの 「PowerBuilder ラ ン タ イ ム フ ァ イ ル」 を参照 デー タ ベース イ ン タ フ ェース の イ ン ス ト ール イ ン ス ト ールす る ODBC ド ラ イ バの設定 必要に応 じ たネ ッ ト ワー ク ア ク セ ス の設定 792 管理 リ リ ース の処理。 開発環境で PowerBuilder の管理 リ リ ー ス を使っ てい る 場合は、 その管理 リ リ ース の ラ ン タ イ ム DLL を ユーザに提供 し て お く 必要があ る 各 ユ ー ザ の コ ン ピ ュ ー タ に は、 ODBC イ ン タ フ ェ ー ス お よ びそのほかのネ イ テ ィ ブなデー タ ベース イ ン タ フ ェース な ど、 アプ リ ケーシ ョ ン が必要 と す る デー タ ベース イ ン タ フ ェ ース を イ ン ス ト ールす る 必要 な デー タ ベー ス イ ン タ フ ェ ー ス の イ ン ス ト ールについての詳細は、 第 39 章 「アプ リ ケー シ ョ ン と コ ン ポーネ ン ト の配布」 を参照。 デー タ ベー ス イ ン タ フ ェ ー ス に つ い て の 詳細は、 『デー タ ベース と の接続』 マニ ュ アルを参照 ODBC イ ン タ フ ェ ー スお よ び 1 つま たは複数の ODBC ド ラ イ バを ユーザの コ ン ピ ュ ー タ に イ ン ス ト ールす る 場合、 ODBC ド ラ イ バ も 設定 し な ければな ら ない。 ド ラ イ バの設定作業には、 各 ド ラ イ バ を介 し て ア ク セ ス さ れ る 特定のデー タ ソ ース の定義 も 含まれ る ODBC ド ラ イ バの設定についての詳細は、 『デー タ ベース と の接続』 マニ ュ アルを参照 ア プ リ ケーシ ョ ン がサーバのデー タ ベー ス ま た はそのほかのネ ッ ト ワ ー ク サービ ス にア ク セ ス す る 必要が あ る 場合は、 各ユーザの コ ン ピ ュ ー タ を正 し く 接続 し てお く 必要があ る PowerBuilder 第 38 章 配布用ア プ リ ケーシ ョ ンのパ ッ ケージ化 ア プ リ ケーシ ョ ン要素 を イ ン ス ト ールする チ ェ ッ ク リ ス ト 項目 オペレーテ ィ ン グ シ ス テ ム ま たは ウ ィ ン ド ウ シ ス テ ムの設定 詳細 特定のア プ リ ケーシ ョ ン では、 処理効率上 ま た はそのほかの理由に よ り 、 オペレーテ ィ ン グ シ ス テ ム ま たは ウ ィ ン ド ウ シ ス テ ムの側で特別な 調整が必要にな る 場合が あ る 。 その よ う な ア プ リ ケーシ ョ ン に該当す る 場合は、 各ユーザの コ ン ピ ュ ー タ を調整 し てお く 必要があ る チ ェ ッ ク リ ス ト 項目 実行アプ リ ケーシ ョ ンの コ ピー 詳細 実行アプ リ ケーシ ョ ン を構成す る フ ァ イ ルの コ ピ ーを作成 し 、 それを各ユーザの コ ン ピ ュ ー タ に イ ン ス ト ールす る 。 イ ン ス ト ールす る フ ァ イ ルには、 以下の も のがあ る • 実行 (EXE) フ ァ イ ル • 動的 ラ イ ブ ラ リ (DLL フ ァ イ ルま たは PBD フ ァ イ ル) • 個別に配布する 、 リ ソ ース フ ァ イ ル (ICO、 BMP、 GIF、 JPEG、 RLE、 WMF、 ま たは CUR な ど) 管理 リ リ ー ス の処理。 こ れ ら の フ ァ イ ル を 定 期的に修正す る 計画が あ る 場合は、 それ ら の最 新バージ ョ ン を ネ ッ ト ワ ー ク 上のサーバか ら コ ピ ー し て、 ユーザの コ ン ピ ュ ー タ に コ ピ ーす る プ ロ セ ス を自動化する こ と も で き る 追加フ ァ イ ルの コ ピー こ の ロ ジ ッ ク を アプ リ ケーシ ョ ン内で直接構築 する こ と も 考え ら れ る 。 ま た、 PowerBuilder の ラ ン タ イ ム DLL の更新 フ ァ イ ル を ユーザのコ ン ピ ュ ータ に自動的にコ ピ ーする こ と も 考えら れる ア プ リ ケーシ ョ ン が使用す る 追加 フ ァ イ ルの コ ピ ーを作成 し 、 各ユーザの コ ン ピ ュ ー タ に イ ン ス ト ールする 。 イ ン ス ト ールする フ ァ イ ルには、 以下の も のがあ る • 初期設定 (INI) フ ァ イ ル • ヘルプ (HLP) フ ァ イ ル • ほかに、テ キ ス ト フ ァ イ ルやサ ウ ン ド フ ァ イ ルな ど、 さ ま ざ ま な フ ァ イ ルが考え ら れ る フ ァ イ ルの使用法に よ っ ては、 特定の フ ァ イ ル を ロ ーカルではな く 、 サーバに イ ン ス ト ールす る 場合 も あ る ア プ リ ケーシ ョ ン テ ク ニ ッ ク 793 エ ン ド ユーザへのア プ リ ケーシ ョ ンの配布 チ ェ ッ ク リ ス ト 項目 ア ク セ スす る ロ ーカル デー タ ベース の コ ピー ア ク セ スす る ほかのプ ロ グ ラ ムの イ ン ス ト ール アプ リ ケーシ ョ ンに必要 な フ ァ イ ルを検索で き る よ う にす る 詳細 アプ リ ケーシ ョ ンが ロ ーカル デー タ ベース にア ク セ ス す る 必要が あ る 場合は、 そのデー タ ベー ス を構成す る フ ァ イ ル を コ ピー し 、 各ユーザの コ ン ピ ュ ー タ に イ ン ス ト ールす る その場合は、 適切なデー タ ベース イ ン タ フ ェ ー ス も イ ン ス ト ール し 、 正 し く 設定 し てお く 必要 があ る ア プ リ ケーシ ョ ン が任意の外部プ ロ グ ラ ム にア ク セ ス す る 必要が あ る 場合、 各外部プ ロ グ ラ ム を、 すべてのユーザの コ ン ピ ュ ー タ かサーバに イ ン ス ト ールする ま た、 プ ロ グ ラ ム を正常に動作 さ せ る ために必 要な設定 も 行 う 。 た と えば、 ActiveX コ ン ト ロ ー ルの登録が必要な場合 も あ る 詳細につい て は、 802 ページの 「ActiveX コ ン ト ロ ールの配布」 を 参照 ア プ リ ケーシ ョ ン が使用す る さ ま ざ ま な フ ァ イ ルは、 ア プ リ ケーシ ョ ン が検索で き る パ ス 上に イ ン ス ト ール し てお く 必要があ る • アプ リ ケーシ ョ ン が特定のパ ス に よ っ て フ ァ イ ルを参照す る 場合は、 そのパ ス上に フ ァ イ ルを イ ン ス ト ールす る アプ リ ケーシ ョ ンの値に よ る、 シス テム レジス ト リ の更新 アプ リ ケーシ ョ ンのア イ コ ンの設定 • アプ リ ケーシ ョ ン が名前のみに よ っ て フ ァ イ ルを参照す る 場合は、 現行のパ ス な ど、 アプ リ ケーシ ョ ン が検索で き る パ ス に フ ァ イ ルを イ ン ス ト ールする Windows レ ジ ス ト リ を 利用 し て、 ア プ リ ケ ー シ ョ ン パ ス な ど アプ リ ケーシ ョ ン で必要な情報 を管理す る 場合は、 ア プ リ ケーシ ョ ン の値で レ ジ ス ト リ を更新する ユーザ が ア プ リ ケ ー シ ョ ン を 起動 で き る よ う に、 各ユーザの コ ン ピ ュ ー タ の ウ ィ ン ド ウ シ ス テ ム を使っ て、 実行 フ ァ イ ルのア イ コ ン を希望 の場所に表示する 代替方法 と し て、 ユーザは ウ ィ ン ド ウ シ ス テ ム 下で、 ネ イ テ ィ ブ アプ リ ケーシ ョ ン と 同 じ その ほかの方法で、 ア プ リ ケーシ ョ ン を起動す る こ と もでき る 794 PowerBuilder 第 38 章 配布用ア プ リ ケーシ ョ ンのパ ッ ケージ化 配布済みア プ リ ケーシ ョ ン の起動 ユーザは、 配布 さ れた ア プ リ ケーシ ョ ン を、 ほかの Windows ア プ リ ケーシ ョ ン と 同 じ 方法で実行で き ます。 た と えば、 エ ク ス プ ロ ー ラ で 表示 さ れ る 実行フ ァ イ ルを ダブル ク リ ッ ク し た り 、 アプ リ ケーシ ョ ン のシ ョ ー ト カ ッ ト をデス ク ト ッ プに作成 し て、 そのシ ョ ー ト カ ッ ト ア イ コ ン を ダブル ク リ ッ ク し た り で き ます。 ユーザがシ ョ ー ト カ ッ ト を作成す る 場合は、 [シ ョ ー ト カ ッ ト ] プ ロ パ テ ィ ページの [ リ ン ク 先] テ キ ス ト ボ ッ ク ス で実行フ ァ イ ルへのパ ス が指定 さ れ、 [作業フ ォ ルダ] テ キ ス ト ボ ッ ク ス で Powersoft ラ ン タ イ ム DLL の場所が指定 さ れてい る 必要があ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 795 エ ン ド ユーザへのア プ リ ケーシ ョ ンの配布 796 PowerBuilder 第 3 9 章 ア プ リ ケーシ ョ ン と コ ン ポーネ ン ト の配布 こ の章について こ の章では、 ユーザの コ ン ピ ュ ー タ やサーバにアプ リ ケーシ ョ ン と コ ン ポーネ ン ト を 配布す る 際に必要 な情報につい て説明 し ま す。 PowerBuilder ラ ン タ イ ム フ ァ イ ルのパ ッ ケージ化に使用す る ツールについて説明 し 、 さ ま ざ ま な タ ーゲ ッ ト に対 し て配布が必 要な フ ァ イ ルを リ ス ト 表示 し ます。 こ れ ら の フ ァ イ ル リ ス ト は、新 し いデー タ ベース イ ン タ フ ェ ース が使用可能にな っ た と き な ど、 場合に よ っ ては更新す る 必要があ り ま す。 こ れ ら の変更についての詳細は、 PowerBuilder の使用 し てい る バージ ョ ン の 『 リ リ ース ノ ー ト 』 を参照 し て く だ さ い。 Web タ ーゲ ッ ト の配布についての詳細は、 『Web タ ーゲ ッ ト と JSP タ ーゲ ッ ト での作業』 マニ ュ アルを参照 し て く だ さ い。 内容 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 項目 アプ リ ケーシ ョ ン、 コ ン ポーネ ン ト 、 お よ びサポー ト フ ァ イ ルの配布 PowerBuilder ラ ン タ イ ム パ ッ ケージ ャ PowerBuilder ラ ン タ イ ム フ ァ イ ル デー タ ベース接続 Java サポー ト PowerBuilder エ ク ス テ ン シ ョ ン PDF と XSL-FO のエ ク ス ポー ト デー タ ウ ィ ン ド ウ Web コ ン ト ロ ール ActiveX プ ラ グ イ ン と PowerBuilder ウ ィ ン ド ウ ActiveX コ ン ト ロ ール EAServer 上の PowerBuilder コ ン ポーネ ン ト PowerBuilder COM サーバ PowerBuilder オー ト メ ーシ ョ ン サーバ EAServer 上の Web デー タ ウ ィ ン ド ウ COM+/MTS ま たは IIS 上の Web デー タ ウ ィ ン ド ウ ページ 798 802 805 806 823 825 818 830 831 832 834 834 837 838 797 ア プ リ ケーシ ョ ン、 コ ンポーネ ン ト 、 およびサポー ト フ ァ イルの配布 ア プ リ ケーシ ョ ン、 コ ンポーネ ン ト 、 およびサポー ト フ ァ イルの配布 配布す る アプ リ ケーシ ョ ン の種類に関わ ら ず、 動的 ラ イ ブ ラ リ 、 BMP フ ァ イ ルや ICO フ ァ イ ルの よ う な リ ソ ー ス、 オ ン ラ イ ン ヘルプ フ ァ イ ル、 初期設定フ ァ イ ルな ど の任意のサポー ト フ ァ イ ル も 一緒に配布 し てお く 必要があ り ます。 アプ リ ケーシ ョ ン の種類に よ っ て、 必要な サポー ト フ ァ イ ルのセ ッ ト が違い ます。 配布の計画 第 38 章 「配布用アプ リ ケーシ ョ ンのパ ッ ケージ化」 には、 動的 ラ イ ブ ラ リ 、 Pcode (中間 コ ー ド ) ま たはマシ ン コ ー ド 、 リ ソ ー ス フ ァ イ ル の使い方な ど、 PowerBuilder 実行ア プ リ ケーシ ョ ン を配布す る 際の必 要な決定に役立つ情報が含 ま れてい ます。 ま た、 必要な要素がすべて イ ン ス ト ール さ れてい る か確認す る ためのチ ェ ッ ク リ ス ト も 用意 さ れ てい ます。 Web ア プ リ ケーシ ョ ン ま たは ト ラ ン ザ ク シ ョ ン サーバの コ ン ポーネ ン ト を配布す る 場合には、 上記章の中の PowerBuilder 動的 ラ イ ブ ラ リ (PBD) お よ び PowerBuilder リ ソ ース フ ァ イ ル (PBR) についての情報 を参照 し て く だ さ い。 ま た、 こ のマニ ュ アル ま たは 『デー タ ウ ィ ン ド ウ プ ロ グ ラ マーズ ガ イ ド 』 マニ ュ アルの コ ン ポーネ ン ト やプ ラ グ イ ン に関す る 記述 も 参考に し て く だ さ い。 798 PowerBuilder 第 39 章 ア プ リ ケーシ ョ ン と コ ンポーネ ン ト の配布 表 39-1: コ ンポーネ ン ト と プ ラ グ イ ンに関連する記述 ア プ リ ケーシ ョ ンの種類 EAServer コ ン ポーネ ン ト COM ま たは MTS コ ン ポーネ ン ト デー タ ウ ィ ン ド ウ プ ラ グ イ ン ア プ リ ケーシ ョ ン PowerBuilder ウ ィ ン ド ウ プ ラ グ イン PowerBuilder ウ ィ ン ド ウ ActiveX Web デー タ ウ ィ ン ド ウお よ び デー タ ウ ィ ン ド ウ Web コ ン ト ロ ール ActiveX こ の章での情報の見つ け方 参照先 525 ページの 「EAServer への コ ン ポーネ ン ト の配布」 606 ページの 「PowerBuilder COM サーバ の配布」 第 31 章 「デー タ ウ ィ ン ド ウ プ ラ グ イ ン の使い方」 第 32 章 「PowerBuilder ウ ィ ン ド ウ プ ラ グ イ ンの使い方」 第 33 章 「PowerBuilder ウ ィ ン ド ウ ActiveX の使い方」 『デー タ ウ ィ ン ド ウ プ ロ グ ラ マーズ ガ イ ド 』 マニ ュ アル こ の章は、 イ ン ス ト ール環境作成用サー ド パーテ ィ ソ フ ト ウ ェ ア パ ッ ケージ に よ る イ ン ス ト ール プ ロ グ ラ ム のプ ロ グ ラ ミ ン グ を 支援す る 目的で作成 さ れてい ます。 こ こ では、 各 コ ン ピ ュ ー タ に必要な フ ァ イ ル、 その フ ァ イ ルの保存場所、 イ ン ス ト ール先、 作成 し な ければな ら ない レ ジ ス ト リ 設定を説明 し ま す。 ま た、 PowerBuilder には、 ア プ リ ケーシ ョ ン に必要な フ ァ イ ルのパ ッ ケージ化に役立つツールが用意 さ れてい ます。こ の ツールについての詳細は、802 ページの 「PowerBuilder ラ ン タ イ ム パ ッ ケージ ャ 」 を参照 し て く だ さ い。 ア プ リ ケーシ ョ ン と 一緒に配布す る フ ァ イ ルの情報 を参照す る には、 表 39-2 を参考に し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 799 ア プ リ ケーシ ョ ン、 コ ンポーネ ン ト 、 およびサポー ト フ ァ イルの配布 表 39-2: 配布に必要な PowerBuilder フ ァ イル シナ リ オ すべての PowerBuilder ク ラ イ ア ン ト アプ リ ケーシ ョ ン デー タ ベース サーバ上のデー タ にア ク セ スす る PowerBuilder ク ラ イ ア ン ト ア プ リ ケーシ ョ ン EJB、 SOAP Web サービ ス、 お よ び XML サービ ス用 PowerBuilder ク ラ イ ア ン ト PDF ま たは XSL-FO 形式で デー タ を保存す る PowerBuilder ク ラ イ ア ン ト デー タ ウ ィ ン ド ウ Web コ ン ト ロ ール ActiveX を使用す る Web アプ リ ケーシ ョ ン PowerBuilder プ ラ グ イ ン ま た は ウ ィ ン ド ウ ActiveX を使用 す る Web アプ リ ケーシ ョ ン PowerBuilder 内に作成 さ れ る EAServer コ ン ポーネ ン ト PowerBuilder 内に作成 さ れ る COM/MTS コ ン ポーネ ン ト EAServer と Web デー タ ウ ィ ン ド ウ を使用す る Web アプ リ ケーシ ョ ン PowerDynamo お よ び COM+/MTS と Web デー タ ウ ィ ン ド ウ を使用す る Web アプ リ ケーシ ョ ン ASP お よ び COM+/MTS ま たは IIS と 、 Web デー タ ウ ィ ン ド ウ を使用す る Web アプ リ ケー ション イ ン ス ト ール先パス と 配布先パス 800 参照節 805 ペー ジ の 「PowerBuilder ラ ン タ イ ム フ ァ イ ル」 806 ページの 「デー タ ベース接続」 825 ページの「PowerBuilder エ ク ス テ ン シ ョ ン」 818 ペー ジ の 「PDF と XSL-FO の エ ク ス ポー ト 」 830 ページの 「デー タ ウ ィ ン ド ウ Web コ ン ト ロ ール ActiveX」 831 ページ の 「プ ラ グ イ ン と PowerBuilder ウ ィ ン ド ウ ActiveX コ ン ト ロ ール」 832 ページの 「EAServer 上の PowerBuilder コ ン ポーネ ン ト 」 834 ページの 「PowerBuilder COM サーバ」 837 ページの 「 ト ラ ンザ ク シ ョ ン サーバに 必要な フ ァ イ ル」 837 ページの 「動的ページ サーバに必要な フ ァ イ ル」 839 ページの 「COM+/MTS ま たは IIS サー バで必要な フ ァ イ ル」 840 ページの 「PowerDynamo サーバに必要 な フ ァ イ ル」 839 ページの 「COM+/MTS ま たは IIS サー バで必要な フ ァ イ ル」 841 ページの 「ASP サーバに必要な フ ァ イ ル」 こ の章で、い く つかの表の後に記載 さ れてい る イ ン ス ト ール先パ ス は、 デフ ォ ル ト の イ ン ス ト ール先を選択 し て PowerBuilder を イ ン ス ト ール し た と き に、 フ ァ イ ルが イ ン ス ト ール さ れ る 場所を示 し てい ます。 ア プ リ ケーシ ョ ンの イ ン ス ト ール プ ロ グ ラ ム を構築す る 場合は、 こ の場 所か ら 目的 と す る 場所に フ ァ イ ルを コ ピーで き ます。 PowerBuilder 第 39 章 ア プ リ ケーシ ョ ン と コ ンポーネ ン ト の配布 配布先パ ス は、 作成 し た アプ リ ケーシ ョ ン ま たは コ ン ポーネ ン ト を イ ン ス ト ールす る 際に、 コ ン ピ ュ ー タ 上で こ れ ら の フ ァ イ ル を イ ン ス ト ールす る こ と がで き る 場所を示 し てい ます。 App Path レ ジ ス ト リ キー 表に よ っ ては、 レ ジ ス ト リ エ ン ト リ の リ ス ト が後に記載 さ れて い ま す。 こ の レ ジ ス ト リ エ ン ト リ は、 アプ リ ケーシ ョ ン ま たは コ ン ポーネ ン ト が必要な フ ァ イ ルを見つけ ら れ る よ う に、 イ ン ス ト ール プ ロ グ ラ ム を使用 し て作成す る 必要があ り ます。Windows 上で実行 さ れ る と き 、 アプ リ ケーシ ョ ンは、 以下の場所で以下の順序に従っ てサポー ト フ ァ イ ルを探 し ます。 1 実行フ ァ イ ルが イ ン ス ト ール さ れてい る デ ィ レ ク ト リ 2 Windows シ ス テ ムお よ び Windows デ ィ レ ク ト リ (通常は、 C:¥WINDOWS¥SYSTEM32、 C:¥WINDOS¥SYSTEM、 お よ び C:¥WINDOWS) 3 レ ジ ス ト リ に指定 さ れてい る アプ リ ケーシ ョ ン パ ス 4 シ ス テム パス アプ リ ケーシ ョ ン パ ス は必ず し も 指定す る 必要はあ り ませんが、 指定 す る こ と をお勧め し ます。 ア プ リ ケーシ ョ ン パ スの指定 ア プ リ ケーシ ョ ン がサポー ト フ ァ イ ル を 見つけ る ためのパ ス を 指定 す る には、 イ ン ス ト ール プ ロ グ ラ ム で、 次の レ ジ ス ト リ 位置にアプ リ ケーシ ョ ンのための App Path キーを作成す る 必要があ り ます。 HKEY_LOCAL_MACHINE¥Software¥Microsoft¥Windows¥ CurrentVersion¥App Paths アプ リ ケーシ ョ ンが イ ン ス ト ール さ れ る デ ィ レ ク ト リ の (デフ ォ ル ト ) 文字列値にデー タ 値 を 設定 し 、 共有 フ ァ イ ルの保存場所 を 指定す る Path と い う 新 し い文字列値を作成 し ます。 以下の例は、 Adaptive Server Anywhere を使用す る MYAPP.EXE と い う アプ リ ケーシ ョ ンの一般的な レ ジ ス ト リ エ ン ト リ を示 し ま す。 レ ジ ス ト リ キーは大カ ッ コ で囲 ま れ、後ろに "名前 "=" 値" の形式でキーの文字列値が記述 さ れてい ます。 [HKEY_LOCAL_MACHINE¥SOFTWARE¥Microsoft¥Windows¥ CurrentVersion¥App Paths¥myapp.exe] "Default"="C:¥Program Files¥myapps¥MYAPP.EXE" "Path"="C:¥Program Files¥myapps;C:¥Program Files¥ sybase¥shared¥PowerBuilder;c:¥program files¥sybase¥ SQL Anywhere 8¥win32¥;" ア プ リ ケーシ ョ ン テ ク ニ ッ ク 801 PowerBuilder ラ ン タ イム パ ッ ケージ ャ REG フ ァ イルについて .REG 拡張子を持つレ ジ ス ト リ 更新フ ァ イ ルを使用す る と 、情報を レ ジ ス ト リ に イ ン ポー ト で き ます。 こ の章の レ ジ ス ト リ キーの例で使用 し てい る 形式は、 レ ジ ス ト リ 更新 フ ァ イ ルの形式 と よ く 似て い ま すが、 こ れ ら の例は更新フ ァ イ ル と し ての使用を意図 し た も のではあ り ませ ん。 レ ジ ス ト リ 更新フ ァ イ ルのデー タ 値文字列のパ ス名には、 一般に、 円記号が 1 つではな く 2 つ組み合わ さ れて使用 さ れ、 "Default" 文字列 値はア ッ ト マー ク (@) で表 さ れ ます。 例を参考に し て、 イ ン ス ト ール プ ロ グ ラ ム で追加ま たは更新す る レ ジ ス ト リ キーを決定 し て く だ さ い。 ActiveX コ ン ト ロール の配布 アプ リ ケーシ ョ ンが ActiveX コ ン ト ロ ール、 OLE コ ン ト ロ ール、 ま た は OCX コ ン ト ロ ールを使用す る 場合には、 以下の作業が必要です。 • アプ リ ケーシ ョ ン と 一緒に コ ン ト ロ ール フ ァ イ ルを配布す る • 各 コ ン ト ロ ールを登録 し てお く • 必要な フ ァ イ ルを タ ーゲ ッ ト コ ン ピ ュ ー タ のシ ス テ ム デ ィ レ ク ト リ に配置 し てお く 自己登録を行わない コ ン ト ロ ールを使用す る アプ リ ケーシ ョ ン の場合 は、 セ ッ ト ア ッ プ プ ロ グ ラ ムに よ っ て各ユーザの コ ン ピ ュ ー タ に手動 で登録す る 必要があ り ます。 自己登録を行 う コ ン ト ロ ールか ど う か を 調べ る には、 コ ン ト ロ ールに付属のマ ニ ュ アル を 参照 し て く だ さ い。 開発プ ラ ッ ト フ ォ ーム、 配布プ ラ ッ ト フ ォ ーム、 お よ び配布す る コ ン ト ロ ールの種類に よ っ ては、 配布先 と な る コ ン ピ ュ ー タ の WINDOWS シ ス テ ム デ ィ レ ク ト リ に、 追加の DLL フ ァ イ ル ま た は ラ イ セ ン ス フ ァ イ ルを コ ピーす る 必要があ る 場合 も あ り ます。 PowerBuilder ラ ン タ イ ム パ ッ ケージ ャ PowerBuilder ラ ン タ イ ム パ ッ ケージ ャ は、 アプ リ ケーシ ョ ン が実行時 に 必要 な PowerBuilder フ ァ イ ル を Microsoft Windows イ ン ス ト ー ラ パ ッ ケージ (MSI) フ ァ イ ルにパ ッ ケージ化す る ツールです。 Windows イ ン ス ト ー ラ は、 最新の Microsoft Windows オペ レーテ ィ ン グ シ ス テ ム と と も に イ ン ス ト ール さ れ る 、 イ ン ス ト ールお よ び環境設定サービ ス です。 802 PowerBuilder 第 39 章 ア プ リ ケーシ ョ ン と コ ンポーネ ン ト の配布 ラ ン タ イ ム パ ッ ケ ー ジ ャ を 正 常 に 実 行 す る に は、 シ ス テ ム 上 に Microsoft Windows イ ン ス ト ー ラ が必要です。 Microsoft では、 Windows NT お よ び Windows 2000 上で イ ン ス ト ールお よ びア ッ プグ レー ド を行 う た めに再配布可能な パ ッ ケ ージ を 提供 し て い ま す。 イ ン ス ト ー ラ は、 Windows XP で常に使用で き ます。 最新版 Windows イ ン ス ト ー ラ の入手方法についての詳細は、 Microsoft の Windows イ ン ス ト ー ラ に関する記述 http://www.microsoft.com/japan/ を参照 し て く だ さ い。 ラ ン タ イ ム パ ッ ケージ ャ は、 Windows シ ス テ ムに イ ン ス ト ール さ れた ク ラ イ ア ン ト アプ リ ケーシ ョ ン で使用す る ための も のです。 ラ ン タ イ ム パ ッ ケージ ャ は、 ア プ リ ケーシ ョ ン がデー タ を PDF 形式でエ ク ス ポー ト す る 場合に必要な フ ァ イ ルや、 アプ リ ケーシ ョ ンが デー タ ウ ィ ン ド ウ Web コ ン ト ロ ール ActiveX ま たはプ ラ グ イ ン を使用す る 場合に 必要な フ ァ イ ルをパ ッ ケージ化 し ません。 ラ ン タ イ ム パ ッ ケージ ャ を 使用す る 際には、 事前に 800 ページの表 39-2 内の該当す る 節を参照 し て く だ さ い。 ❖ PowerBuilder ラ ン タ イ ム パ ッ ケージ ャ を使用するには 1 Windows の [ス タ ー ト ] メ ニ ュ ーか ら [プ ロ グ ラ ム| Sybase | PowerBuilder 9.0 | PowerBuilder ラ ン タ イ ム パ ッ ケージ ャ ] を選択 す る か、Shared¥PowerBuilder デ ィ レ ク ト リ の pbpack90J 実行フ ァ イ ルを起動 し ます。 2 生成 さ れた MSI フ ァ イ ルの保存場所を選択 し ます。 3 アプ リ ケーシ ョ ンに必要なデー タ ベース イ ン タ フ ェース を選択 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 803 PowerBuilder ラ ン タ イム パ ッ ケージ ャ 選 択 し た デ ー タ ベ ー ス の DLL が パ ッ ケ ー ジ に 追 加 さ れ ま す。 ODBC の場合、 pbodb90.ini フ ァ イ ル も 追加 さ れ ま す。 JDBC の場 合、 pbjdbc1290.jar と pbjvm90J.dll フ ァ イ ル も 追加 さ れ ます。 Java Runtime Environment (JRE) は追加 さ れ ま せん。 詳細については、 822 ページの 「JDBC デー タ ベース イ ン タ フ ェ ース」 を参照 し て く だ さ い。 DataDirect ド ラ イ バな ど、 そのほかの ODBC ま たは OLE DB フ ァ イ ル を アプ リ ケーシ ョ ン が必要 と す る 場合があ り ま すが、 こ れ ら の フ ァ イ ルは追加 さ れ ま せん。 こ れ ら の フ ァ イ ルの配布方法につ いての詳細は、 808 ページの 「ODBC デー タ ベース ド ラ イ バ と サ ポー ト フ ァ イ ル」 お よ び 820 ページの 「OLE DB デー タ ベース プ ロ バ イ ダ」 を参照 し て く だ さ い。 4 アプ リ ケーシ ョ ンが DataWindow XML エ ク ス ポー ト ま たは イ ン ポー ト を使用す る 場合、 [XML サポー ト ] チ ェ ッ ク ボ ッ ク ス を オ ンに し ます。 ラ ン タ イ ム パ ッ ケージ ャ は、PBXerces90J.DLL と xerces-c_2_1_0.dll をパ ッ ケージに追加 し ます。 5 アプ リ ケーシ ョ ンが、 PowerBuilder Document Object Model が提供 す る XML サービ ス を使用す る 場合や、アプ リ ケーシ ョ ンが EJB ま たは SOAP ク ラ イ ア ン ト (Web サービ ス) であ る 場合は、 それに 該当す る チ ェ ッ ク ボ ッ ク ス を オ ン に し ます。 ラ ン タ イ ム パ ッ ケージ ャ は、必要な DLL フ ァ イ ルお よ び JAR フ ァ イ ルをパ ッ ケージに追加 し ます。PowerBuilder エ ク ス テ ン シ ョ ン に 必要な フ ァ イ ル情報については、 825 ページの 「PowerBuilder エ ク ス テ ン シ ョ ン」 を参照 し て く だ さ い。 6 [生成] を ク リ ッ ク し ます。 ラ ン タ イ ム パ ッ ケ ージ ャ は、 選択 し た コ ン ポーネ ン ト に必要な フ ァ イ ル と 、 以下の PowerBuilder ラ ン タ イ ム DLL を格納 し た MSI フ ァ イ ルを作成 し ます。 libjcc.dll pbdwe90J.dll pbdwr90J.dll pbdwr90J.pbd pbjag90J.dll pbjvm90J.dll pbrtc90J.dll pbtra90J.dll pbvm90J.dll 804 PowerBuilder 第 39 章 ア プ リ ケーシ ョ ン と コ ンポーネ ン ト の配布 MSI フ ァ イ ルは、 あ ら ゆ る Windows プ ラ ッ ト フ ォ ーム上で直接実 行可能な圧縮フ ァ イ ルです。 MSI フ ァ イ ルは、 自己登録 DLL を登 録 し 、 Windows レ ジ ス ト リ に イ ン ス ト ール先のパ ス を追加 し 、 シ ス テ ム の PATH 環境変数を設定 し 、 さ ら に、Windows の コ ン ト ロ ー ル パネルの [アプ リ ケーシ ョ ン の追加 と 削除] ページに情報を追 加 し ま す。 ま た、 サー ド パーテ ィ の イ ン ス ト ール ソ フ ト ウ ェ ア パ ッ ケージの中には MSI フ ァ イ ルを使用で き る も の も あ り ます。 PowerBuilder ラ ン タ イ ム フ ァ イル デー タ ベースの接続性 デー タ ベー ス の接続性に必要 な フ ァ イ ルについ て は、 806 ペー ジ の 「デー タ ベース接続」 に個別に一覧表示 さ れてい ます。 表 39-3 は、 PowerBuilder の主な ラ ン タ イ ム フ ァ イ ルです。 表 39-3: 主な PowerBuilder ラ ン タ イム フ ァ イル 名前 PBVM90J.DLL LIBJCC.DLL PBDWE90J.DLL 必要 と する対象 すべて すべて。 PBVM90J.DLL は、 こ の フ ァ イ ルへの依存 性を持つ デー タ ウ ィ ン ド ウお よ びデー タ ス ト ア 表 39-4 に、 アプ リ ケーシ ョ ン が さ ら に必要 と す る 可能性があ る ラ ン タ イ ム フ ァ イ ルを示 し ます。 た と えば、 PBVM90J.DLL はすべての配布 アプ リ ケーシ ョ ン に必要ですが、 PBRTC90J.DLL は、 リ ッ チテ キ ス ト コ ン ト ロ ール ま たは リ ッ チテ キ ス ト デー タ ウ ィ ン ド ウ オブ ジ ェ ク ト を使用す る アプ リ ケーシ ョ ン でのみ必要にな り ます。 Java サポー ト 対応 PBJVM90J.DLL を使用す る 配布アプ リ ケーシ ョ ンに ついての詳細は、 823 ページの 「Java サポー ト 」 を参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 805 デー タ ベース接続 表 39-4: 追加 PowerBuilder ラ ン タ イム フ ァ イル 名前 PBDWR90J.DLL PBDWR90.PBD PBXerces90J.DLL xerces-c_2_1_0.dll PBJVM90J.DLL PBRTC90J.DLL PBLAB90.INI PBTRA90J.DLL イ ン ス ト ール先パス 必要 と する対象 Web デー タ ウ ィ ン ド ウ のサポー ト デー タ ウ ィ ン ド ウ と デー タ ス ト アの XML サポー ト Java サポー ト リ ッ チ テ キ ス ト サポー ト デー タ ウ ィ ン ド ウ の ラ ベル提示様式の定義済みフ ォー マッ ト デー タ ベース接続の ト レース ¥Program Files¥Sybase¥Shared¥PowerBuilder アプ リ ケーシ ョ ン と 同 じ パ ス、シ ス テ ム パ ス のデ ィ レ ク ト リ 、 ま たは App Path レ ジ ス ト リ キー 配布先パス レジス ト リ エン ト リ 801 ページの 「App Path レ ジ ス ト リ キー」 を参照 し て く だ さ い。 デー タ ベース接続 デー タ ベース にア ク セ ス す る 実行フ ァ イ ル ま たは コ ン ポーネ ン ト を配 布す る 場合、 ユーザは DBMS お よ びアプ リ ケーシ ョ ン が使用す る デー タ ベース にア ク セ スす る 必要があ り ます。 デー タ ベース接続フ ァ イルのイ ン ス ト ール先 別の コ ン ピ ュ ー タ の中間層 コ ン ポーネ ン ト を 使用 し てデー タ ベー ス ト ラ ン ザ ク シ ョ ン を 実行す る ク ラ イ ア ン ト ア プ リ ケ ー シ ョ ン で は、 デー タ ベー ス接続フ ァ イ ルを配布す る 必要はあ り ません。 デー タ ベー ス接続フ ァ イ ルは、 デー タ ベース サーバ と 対話す る コ ン ピ ュ ー タ に配 布 し なければな り ません。 以下の作業を行 う 必要があ り ます。 • 806 必要であれば、 DBMS ラ ン タ イ ム ( ク ラ イ ア ン ト ) フ ァ イ ルを、 ア プ リ ケーシ ョ ン デ ィ レ ク ト リ か シ ス テ ム パ ス 上のデ ィ レ ク ト リ に イ ン ス ト ールす る PowerBuilder 第 39 章 ア プ リ ケーシ ョ ン と コ ンポーネ ン ト の配布 ス タ ン ド ア ロ ン の Adaptive Server Anywhere デー タ ベース を使用す る アプ リ ケーシ ョ ンの場合には、ユーザの コ ン ピ ュ ー タ に Adaptive Server Anywhere ラ ン タ イ ム エデ ィ シ ョ ン フ ァ イ ル を イ ン ス ト ー ル で き ま す。 詳 細 に つ い て は、 817 ペ ー ジ の 「Adaptive Server Anywhere フ ァ イ ル」 を参照 し て く だ さ い。 それ以外の場合は、 ベ ン ダに よ っ て明示 さ れた指示お よ び ラ イ セ ン ス 規約に従っ て く だ さ い。 • アプ リ ケーシ ョ ン が使用す る デー タ ベー ス に各ユーザがア ク セ ス で き る よ う に し てお く ア プ リ ケ ー シ ョ ン が ロ ー カ ル デー タ ベー ス を 使用す る 場合は、 デー タ ベース と ロ グ フ ァ イ ルな ど の関連フ ァ イ ルを ユーザの コ ン ピ ュ ー タ に イ ン ス ト ール し ます。 アプ リ ケーシ ョ ン がデー タ ベース サーバを使用す る 場合は、 ユー ザの コ ン ピ ュ ー タ か ら ア ク セ ス で き る よ う にセ ッ ト ア ッ プ し てお き ます。 こ の作業は、 デー タ ベース管理者が行い ます。 • ユーザの コ ン ピ ュ ー タ 上で ア プ リ ケ ー シ ョ ン が使用す る デー タ ベース イ ン タ フ ェ ース を イ ン ス ト ールす る • アプ リ ケーシ ョ ンが ODBC イ ン タ フ ェース を使用す る 場合は、 819 ページの 「ODBC デー タ ソ ース と ド ラ イ バの環境設定」 の説明に 従っ て、 ODBC デー タ ベース ド ラ イ バ と デー タ ソ ース を設定す る デー タ ベース ド ラ イ バの詳細については、 以下を参照 し て く だ さ い。 • 次の 「ネ イ テ ィ ブ デー タ ベース ド ラ イ バ」 • 808 ページの 「ODBC デー タ ベース ド ラ イ バ と サポー ト フ ァ イ ル」 • 820 ページの 「OLE DB デー タ ベース プ ロ バ イ ダ」 • 822 ページの 「JDBC デー タ ベース イ ン タ フ ェ ース」 ネイ テ ィ ブ データ ベース ド ラ イ バ 表 39-5 は、PowerBuilder で提供 さ れ る ネ イ テ ィ ブ デー タ ベース ド ラ イ バの リ ス ト を示 し ま す。 ア プ リ ケーシ ョ ン ま たは コ ン ポーネ ン ト が、 指定のデー タ ベー ス を使用す る 場合、 コ ン ピ ュ ー タ 上にその フ ァ イ ル が必要です。ネ イ テ ィ ブ デー タ ベース フ ァ イ ル名の最初の 2 つの文字 は PB であ り 、 次の 3 つの文字でデー タ ベース を識別 し 、 最後の 2 つ の文字で PowerBuilder のバージ ョ ン を識別 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 807 デー タ ベース接続 表 39-5: PowerBuilder ネ イ テ ィ ブ デー タ ベース ド ラ イバ 名前 PBIN990J.DLL PBMSS90J.DLL PBO7390J.DLL PBO8490J.DLL PBO9090J.DLL PBSYC90J.DLL PBSYJ90J.DLL イ ン ス ト ール先パス 必要 と する対象 INFORMIX I-Net 9 Micosoft SQL Server 6 お よ び 7 Oracle 7.3 Oracle 8.0.x お よ び Oracle 8i 8.1.x Oracle9i Sybase Adaptive Server Enterprise CT-LIB Sybase Adaptive Server Enterprise CT-LIB(EAServer 配布 の場合のみ) ¥Program Files¥Sybase¥Shared¥PowerBuilder アプ リ ケーシ ョ ン と 同 じ パ ス、シ ス テ ム パ ス のデ ィ レ ク ト リ 、 ま たは App Path レ ジ ス ト リ キー 配布先パス レジス ト リ エン ト リ 801 ページの 「App Path レ ジ ス ト リ キー」 を参照 し て く だ さ い。 PowerBuilder カ ス タ ム ク ラ ス ユーザ オブ ジ ェ ク ト を EAServer に配布す る と き は、SYC ではな く SYJ デー タ ベース イ ン タ フ ェース を 使用 し て Adaptive Server Enterprise デー タ ベース に接続す る 必要があ り ます。PowerBuilder の開発環境で SYJ を使用す る こ と はで き ませんが、 SYJ DB プ ロ フ ァ イ ル設定 ダ イ ア ロ グ ボ ッ ク ス を使用 し て、 該当す る 接続パ ラ メ ー タ を設定す る こ と がで き ます。 その後、 [プ レ ビ ュ ー] タ ブか ら ト ラ ン ザ ク シ ョ ン オブ ジ ェ ク ト の ス ク リ プ ト に構文 を コ ピ ー で き ます。 注意 ODBC データ ベース ド ラ イ バと サポート フ ァ イ ル こ の節では、 PowerBuilder ア プ リ ケーシ ョ ン ま たは InfoMaker ア プ リ ケーシ ョ ンか ら のすべての ODBC デー タ ベース接続に必要な フ ァ イ ル と 、特定のデー タ ベース イ ン タ フ ェ ース ま たは DBMS に必要な フ ァ イ ルを一覧 し ます。 PowerBuilder ODBC イ ン タ フ ェ ース ア プ リ ケ ー シ ョ ン が ODBC を 使用す る 場合は、 以下の PowerBuilder ODBC イ ン タ フ ェース フ ァ イ ルが必要です。 表 39-6: PowerBuilder ODBC イ ン タ フ ェ ース フ ァ イル 名前 PBODB90J.DLL PBODB90.INI 808 説明 PowerBuilder ODBC イ ン タ フ ェース PowerBuilder ODBC 初期設定フ ァ イ ル PowerBuilder 第 39 章 ア プ リ ケーシ ョ ン と コ ンポーネ ン ト の配布 イ ン ス ト ール先パス ¥Program Files¥Sybase¥Shared¥PowerBuilder アプ リ ケーシ ョ ン と 同 じ パ ス、シ ス テ ム パ ス のデ ィ レ ク ト リ 、 ま たは App Path レ ジ ス ト リ キー 配布先パス レジス ト リ エン ト リ 801 ページの 「App Path レ ジ ス ト リ キー」 を参照 して く ださい INI フ ァ イ ル と DLL フ ァ イ ルは、 同 じ デ ィ レ ク ト リ にあ る こ と が必要です。 PBODB90 初期設定フ ァ イ ルを修正 し た場合には、 修正 し たバージ ョ ン を配布 し て く だ さ い。 注意 Microsoft ODBC フ ァ イル 表 39-7 に、 ア プ リ ケ ー シ ョ ン が ODBC を 使 用 す る 場 合 に 必 要 な Microsoft ODBC フ ァ イ ルを一覧 し ます。 表 39-7: Microsoft ODBC フ ァ イル 名前 DS16GT.DLL DS32GT.DLL ODBC32.DLL ODBC32GT.DLL ODBCAD32.EXE ODBCCP32.CPL ODBCCP32.DLL ODBCCR32.DLL ODBCINST.CNT ODBCINST.HLP ODBCINT.DLL ODBCTRAC.DLL イ ン ス ト ール先パス 配布先パス 説明 Microsoft ODBC ド ラ イ バ マネージ ャ 、 DLL、 お よ びヘ ルプ フ ァ イ ル Windows シ ス テ ム デ ィ レ ク ト リ Windows シ ス テ ム デ ィ レ ク ト リ レジス ト リ エン ト リ なし 通常、 Microsoft ODBC ド ラ イ バ マネージ ャ (ODBC32.DLL) と サポー ト フ ァ イ ルは、 すでにユーザの Windows シ ス テ ム デ ィ レ ク ト リ に イ ン ス ト ール さ れてい ます。 必要であれば、 CD の Support デ ィ レ ク ト リ に入っ てい る 再配布可能な MDAC_TYP.EXE セ ッ ト ア ッ プ フ ァ イ ルを使用 し て、 ユーザのシ ス テ ム を更新す る こ と がで き ます。 注意 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 809 デー タ ベース接続 PB DataDirect ODBC ド ラ イバ と サポー ト フ ァ イル 指定 さ れたデー タ ベース イ ン タ フ ェ ース を使用す る 場合は、表 39-8 の PowerBuilder DataDirect ODBC フ ァ イ ルが必要です。 表には、 各デー タ ベー ス イ ン タ フ ェ ー ス に対 し て必要な レ ジ ス ト リ エ ン ト リ を示 し ま す。 文字列値の %SHARED% は、 ド ラ イ バを イ ン ス ト ール し たデ ィ レ ク ト リ のパ ス に置 き 換え ら れ ます。 オプ シ ョ ンのヘルプ フ ァ イル ヘルプ (.HLP お よ び .CNT) フ ァ イ ルは、 ユーザがデー タ ベー ス 管理 作業を行 う 場合のみ、 配布す る 必要があ り ます。 表 39-8: PowerBuilder DataDirect ODBC フ ァ イル 名前 IVPB.LIC PBBAS18*.DLL PBUTL18*.DLL PBTRN18.dll PBDRV18.CNT PBDRV18.HLP PBBTR18.DLL PBBTR18R.DLL PBBTR18S.DLL PBBTR18.CNT PBBTR18.HLP PBFLT18.DLL PBFLT18R.DLL 810 ド ラ イバ と レ ジス ト リ エ ン ト リ すべての PB DataDirect OEM 4.10 ド ラ イ バ。 レ ジ ス ト リ エン ト リ : [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥ODBC Translators] "OEM to ANSI"="Installed" [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥OEM to ANSI] "Translator"="%SHARED%¥¥DataDirect¥¥PBtrn18.dll" "Setup"="%SHARED%¥¥DataDirect¥¥PBtrn18.dll" PB DataDirect OEM 4.10 Btrieve。 レ ジ ス ト リ エン ト リ : [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥ODBC Drivers] "PB DataDirect OEM 4.10 Btrieve (*.dta)"="Installed" [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥PB DataDirect OEM 4.10 Btrieve (*.dta)] "UsageCount"="1" "Driver"="%SHARED%¥¥DataDirect¥¥PBBTR18.DLL" "Setup"="%SHARED%¥¥DataDirect¥¥PBBTR18S.DLL" "APILevel"="1" "ConnectFunctions"="YYY" "DriverODBCVer"="3.51" "FileUsage"="1" "FileExtns"="*.dta" "SQLLevel"="0" "CPTimeout"="60" PowerBuilder 第 39 章 ア プ リ ケーシ ョ ン と コ ンポーネ ン ト の配布 名前 *.UCT PBDB218.DLL PBDB218R.DLL PBDB218S.DLL PBDB218.HLP PBDB218.CNT APPC18IV.DLL BIND18IV.DLL CLRT18IV.DLL COSI18IV.DLL DRDA18IV.DLL LIBUNIC.DLL MEMR18IV.DLL PROT18IV.DLL SOCK18IV.DLL XCPG18IV.DLL XDB2DB2.ERR XDBDRDA.ERR XDBMF.ERR XDBNET.ERR XDBRES.ERR PBDBF18.DLL PBDBF18R.DLL PBFLT18.DLL PBFLT18R.DLL PBDBF18.HLP PBDBF18.CNT ド ラ イバ と レ ジス ト リ エ ン ト リ PB DataDirect OEM 4.10 DB2 Wire Protocol。 レ ジ ス ト リ エン ト リ : [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥ODBC Drivers] "PB DataDirect OEM 4.10 DB2 Wire Protocol"="Installed" [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥PB DataDirect OEM 4.10 DB2 Wire Protocol] "UsageCount"="1" "Driver"="%SHARED%¥¥DataDirect¥¥PBDB218.DLL" "Setup"="%SHARED%¥¥DataDirect¥¥PBDB218S.DLL" "APILevel"="1" "ConnectFunctions"="YYY" "DriverODBCVer"="3.51" "FileUsage"="0" "SQLLevel"="1" "CPTimeout"="60" PB DataDirect OEM 4.10 dBASE。 レ ジ ス ト リ エン ト リ : [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥ODBC Drivers] "PB DataDirect OEM 4.10 dBASEFile (*.dbf)"="Installed" [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥PB DataDirect OEM 4.10 dBASEFile (*.dbf)] "UsageCount"="1" "Driver"="%SHARED%¥¥DataDirect¥¥PBDBF18.DLL" "Setup"="%SHARED%¥¥DataDirect¥¥PBDBF18.DLL" "APILevel"="1" "ConnectFunctions"="YYY" "DriverODBCVer"="3.51" "FileUsage"="1" "FileExtns"="*.dbf" "SQLLevel"="0" "CPTimeout"="60" ア プ リ ケーシ ョ ン テ ク ニ ッ ク 811 デー タ ベース接続 名前 PBXLWB18.DLL PBXLWB18R.DLL PBXLWB18.HLP PBXLWB18.CNT PBFLT18.DLL PBFLT18R.DLL PBINF18.DLL PBINF18R.DLL PBINF18S.DLL PBINFDTC18.DLL PBINF18.HLP PBINF18.CNT 812 ド ラ イバ と レ ジス ト リ エ ン ト リ PB DataDirect OEM 4.10 Excel Workbook。 レ ジ ス ト リ エン ト リ : [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥ODBC Drivers] "PB DataDirect OEM 4.10 ExcelWorkbook (*.xls)"="Installed" [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥PB DataDirect OEM 4.10 ExcelWorkbook (*.xls)] "UsageCount"="1" "Driver"="%SHARED%¥¥DataDirect¥¥PBXLWB18.DLL" "Setup"="%SHARED%¥¥DataDirect¥¥PBXLWB18.DLL" "APILevel"="1" "ConnectFunctions"="YYY" "DriverODBCVer"="3.51" "FileUsage"="2" "FileExtns"="*.xls" "SQLLevel"="0" "CPTimeout"="60" PB DataDirect OEM 4.10 Informix。 レ ジ ス ト リ エン ト リ : [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥ODBC Drivers] "PB DataDirect OEM 4.10 INFORMIX"="Installed" [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥PB DataDirect OEM 4.10 INFORMIX] "UsageCount"="1" "Driver"="%SHARED%¥¥DataDirect¥¥PBINF18.DLL" "Setup"="%SHARED%¥¥DataDirect¥¥PBINF18S.DLL" "APILevel"="1" "ConnectFunctions"="YYY" "DriverODBCVer"="3.51" "FileUsage"="0" "SQLLevel"="1" "CPTimeout"="60" PowerBuilder 第 39 章 ア プ リ ケーシ ョ ン と コ ンポーネ ン ト の配布 名前 PBIFCL18.DLL PBIFCL18R.DLL PBIFCL18S.DLL PBIFCL18.HLP PBIFCL18.CNT ド ラ イバ と レ ジス ト リ エ ン ト リ PB DataDirect OEM 4.10 Informix Wire Protocol。 レ ジ ス ト リ エン ト リ : [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥ODBC Drivers] "PB DataDirect OEM 4.10 INFORMIX Wire Protocol"="Installed" [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥PB DataDirect OEM 4.10 INFORMIX Wire Protocol] "UsageCount"="1" "Driver"="%SHARED%¥¥DataDirect¥¥PBIFCL18.DLL" "Setup"="%SHARED%¥¥DataDirect¥¥PBIFCL18S.DLL" "APILevel"="1" "ConnectFunctions"="YYY" "DriverODBCVer"="3.51" "FileUsage"="0" "SQLLevel"="1" "CPTimeout"="60" PBOR818.DLL PBOR818R.DLL PBOR818S.DLL PBOR8DTC18.DLL PBOR818.HLP PBOR818.CNT PB DataDirect OEM 4.10 Oracle。 レ ジ ス ト リ エン ト リ : PBORA18.DLL PBORA18R.DLL PBORA18S.DLL PBORA18.HLP PBORA18.CNT PB DataDirect OEM 4.10 Oracle Wire Protocol。 レ ジ ス ト リ エン ト リ : [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥ODBC Drivers] "PB DataDirect OEM 4.10 Oracle"="Installed" [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥PB DataDirect OEM 4.10 Oracle] "UsageCount"="1" "Driver"="%SHARED%¥¥DataDirect¥¥PBOR818.DLL" "Setup"="%SHARED%¥¥DataDirect¥¥PBOR818S.DLL" "APILevel"="1" "ConnectFunctions"="YYY" "DriverODBCVer"="3.51" "FileUsage"="0" "SQLLevel"="1" "CPTimeout"="60" [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥ODBC Drivers] "PB DataDirect OEM 4.10 Oracle Wire Protocol"="Installed" [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥PB DataDirect OEM 4.10 Oracle Wire Protocol] "UsageCount"="1" "Driver"="%SHARED%¥¥DataDirect¥¥PBORA18.DLL" "Setup"="%SHARED%¥¥DataDirect¥¥PBORA18S.DLL" "APILevel"="1" "ConnectFunctions"="YYY" "DriverODBCVer"="3.51" "FileUsage"="0" "SQLLevel"="1" "CPTimeout"="60" ア プ リ ケーシ ョ ン テ ク ニ ッ ク 813 デー タ ベース接続 名前 PBIDP18.DLL PBIDP18R.DLL PBIDP18S.DLL PBIDP18.HLP PBIDP18.CNT PBFLT18.DLL PBFLT18R.DLL PBPRO918.DLL PBPRO918R.DLL PBPRO918S.DLL PBPRO918.HLP PBPRO918.CNT 814 ド ラ イバ と レ ジス ト リ エ ン ト リ PB DataDirect OEM 4.10 Paradox。 レ ジ ス ト リ エン ト リ : [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥ODBC Drivers] "PB DataDirect OEM 4.10 ParadoxFile (*.db)"="Installed" [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥PB DataDirect OEM 4.10 ParadoxFile (*.db)] "UsageCount"="1" "Driver"="%SHARED%¥¥DataDirect¥¥PBIDP18.DLL" "Setup"="%SHARED%¥¥DataDirect¥¥PBIDP18S.DLL" "APILevel"="1" "ConnectFunctions"="YYY" "DriverODBCVer"="3.51" "FileUsage"="1" "FileExtns"="*.db" "SQLLevel"="0" "CPTimeout"="60" PB DataDirect OEM 4.10 Progress 9。 レ ジ ス ト リ エン ト リ : [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥ODBC Drivers] "PB DataDirect OEM 4.10 PROGRESS 9"="Installed" [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥PB DataDirect OEM 4.10 PROGRESS 9] "UsageCount"="1" "Driver"="%SHARED%¥¥DataDirect¥¥PBPRO918.DLL" "Setup"="%SHARED%¥¥DataDirect¥¥PBPRO918S.DLL" "APILevel"="1" "ConnectFunctions"="YYN" "DriverODBCVer"="3.51" "FileUsage"="0" "SQLLevel"="0" "CPTimeout"="60" PowerBuilder 第 39 章 ア プ リ ケーシ ョ ン と コ ンポーネ ン ト の配布 名前 PBGUP18.DLL PBGUP18R.DLL PBGUP18S.DLL PBGUP18.HLP PBGUP18.CNT ド ラ イバ と レ ジス ト リ エ ン ト リ PB DataDirect OEM 4.10 SQLBase。 レ ジ ス ト リ エン ト リ : [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥ODBC Drivers] "PB DataDirect OEM 4.10 SQLBase"="Installed" [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥PB DataDirect OEM 4.10 SQLBase] "UsageCount"="1" "Driver"="%SHARED%¥¥DataDirect¥¥PBGUP18.DLL" "Setup"="%SHARED%¥¥DataDirect¥¥PBGUP18S.DLL" "APILevel"="1" "ConnectFunctions"="YYY" "DriverODBCVer"="3.51" "FileUsage"="0" "SQLLevel"="1" "CPTimeout"="60" PBSS618.DLL PBSS618R.DLL PBSS618S.DLL PBSS618.HLP PBSS618.CNT PB DataDirect OEM 4.10 SQL Server 6.5。 レ ジ ス ト リ エン ト リ : PBMSSS18.DLL PBMSSS18R.DLL PBMSSS18S.DLL PBMSSS18.HLP PBMSSS18.CNT DBNETLIB.DLL SQLSRV32.DLL SQLSRV32.RLL SQLUNIRL.DLL SQLSODBC.CHM SQLSODBC.HLP PB DataDirect OEM 4.10 SQL Server Wire Protocol。 レ ジ ス ト リ エン ト リ : [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥ODBC Drivers] "PB DataDirect OEM 4.10 SQL Server 6.5"="Installed" [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥PB DataDirect OEM 4.10 SQL Server 6.5] "UsageCount"="1" "Driver"="%SHARED%¥¥DataDirect¥¥PBSS618.DLL" "Setup"="%SHARED%¥¥DataDirect¥¥PBSS618S.DLL" "APILevel"="1" "ConnectFunctions"="YYY" "DriverODBCVer"="3.51" "FileUsage"="0" "SQLLevel"="1" "CPTimeout"="60" [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥ODBC Drivers] "PB DataDirect OEM 4.10 SQL Server Wire Protocol"="Installed" [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥PB DataDirect OEM 4.10 SQL Server Wire Protocol] "UsageCount"="1" "Driver"="%SHARED%¥¥DataDirect¥¥PBMSSS18.DLL" "Setup"="%SHARED%¥¥DataDirect¥¥PBMSSS18S.DLL" "APILevel"="1" "ConnectFunctions"="YYY" "DriverODBCVer"="3.51" "FileUsage"="0" "SQLLevel"="1" "CPTimeout"="60" ア プ リ ケーシ ョ ン テ ク ニ ッ ク 815 デー タ ベース接続 名前 PBASE18.DLL PBASE18R.DLL PBASE18S.DLL PBASE18.HLP PBASE18.CNT ド ラ イバ と レ ジス ト リ エ ン ト リ PB DataDirect OEM 4.10 Sybase Adaptive Server Enterprise Wire Protocol。レ ジ ス ト リ エン ト リ : [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥ODBC Drivers] "PB DataDirect OEM 4.10 Sybase ASE Wire Protocol" = "Installed" [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥PB DataDirect OEM 4.10 Sybase ASE Wire Protocol] "UsageCount"="1" "Driver"="%SHARED%¥¥DataDirectODBC¥¥PBASE18.DLL" "Setup"="%SHARED%¥¥DataDirectODBC¥¥PBASE18S.DLL" "APILevel"="1" "ConnectFunctions"="YYY" "DriverODBCVer"="3.51" "FileUsage"="0" "SQLLevel"="0" "UsageCount"="1" "CPTimeout"="60" PBTXT18.DLL PBTXT18R.DLL PBTXT18.HLP PBTXT18.CNT PBFLT18.DLL PBFLT18R.DLL PB DataDirect OEM 4.10 Text File。 レ ジ ス ト リ エン ト リ : [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥ODBC Drivers] "PB DataDirect OEM 4.10 TextFile (*.*)"="Installed" [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥PB DataDirect OEM 4.10 TextFile (*.*)] "UsageCount"="1" "Driver"="%SHARED%¥¥DataDirect¥¥PBTXT18.DLL" "Setup"="%SHARED%¥¥DataDirect¥¥PBTXT18.DLL" "APILevel"="1" "ConnectFunctions"="YYY" "DriverODBCVer"="3.51" "FileUsage"="1" "FileExtns"="*.*" "SQLLevel"="0" "CPTimeout"="60" イ ン ス ト ール先パス ¥Program Files¥Sybase¥Shared¥DataDirect アプ リ ケーシ ョ ン と 同 じ パ ス、シ ス テ ム パ ス のデ ィ レ ク ト リ 、 ま たは App Path レ ジ ス ト リ キー 配布先パス レ ジ ス ト リ エ ン ト リ 上記表、801 ページの 「App Path レ ジ ス ト リ キー」 お よ び 819 ページの 「ODBC デー タ ソ ース と ド ラ イ バの環境設定」 を 参照 し て く だ さ い。 816 PowerBuilder 第 39 章 ア プ リ ケーシ ョ ン と コ ンポーネ ン ト の配布 Adaptive Server Anywhere フ ァ イル Adaptive Server Anywhere デー タ ベース を使用す る PowerBuilder アプ リ ケーシ ョ ンの場合には、Adaptive Server Anywhere の ODBC デー タ ベー ス ド ラ イ バだけでな く 、Adaptive Server Anywhere DBMS も 配布す る 必 要があ り ます。ス タ ン ド ア ロ ン のデー タ ベース を使用す る 場合は、ユー ザの コ ン ピ ュ ー タ に Adaptive Server Anywhere デ ス ク ト ッ プ ラ ン タ イ ム シ ス テ ム を配布す る こ と がで き ます。 こ の場合、 追加の ラ イ セ ン ス 料金はかか り ません。 ラ ン タ イ ム シ ス テ ム を使 う こ と に よ っ て、 ユー ザはデー タ ベー ス 内のデー タ の取 り 出 し や変更を行え ますが、 デー タ ベース ス キーマは変更で き ません。 ま た、 ト ラ ンザ ク シ ョ ン ロ グ、 ス ト ア ド プ ロ シージ ャ 、 お よ び ト リ ガはサポー ト し てい ません。 制約 Enterprise Application Studio に は、 開発 プ ロ セ ス で 使用す る Adaptive Server Anywhere が含まれてい ます。 ただ し 、 こ の製品を特許権使用料 な し でユーザに配布す る こ と はで き ません。 デー タ 定義言語 (DDL)、 ト ラ ンザ ク シ ョ ン ロ グ、 ス ト ア ド プ ロ シー ジ ャ 、 ま たは ト リ ガがアプ リ ケーシ ョ ン に必要な場合は、 サ イ ベー ス 社におたずね く だ さ い。 Adaptive Server Anywhere デー タ ベースお よ びアプ リ ケーシ ョ ン の配布 の詳細については、『Adaptive Server Anywhere SQL User's Guide』 マニ ュ アルを参照 し て く だ さ い。 フル イ ン ス ト ール用の、 Adaptive Server Anywhere ド ラ イ バ、 ラ ン タ イ ム エ ン ジ ン、 お よ びサポー ト フ ァ イ ルは、 イ ン ス ト ール デ ィ ス ク の Support デ ィ レ ク ト リ に入っ てい ます。 表 39-9 に、 イ ン ス ト ール プ ロ グ ラ ム で [Runtime Server] を選択 し た と き に イ ン ス ト ール さ れ る フ ァ イ ルを示 し ます。 ま た、 ヘルプ フ ァ イ ル、 SQL Anywhere 5.0/6.0 互換 性 DLL、お よ び Installshield テ ン プ レー ト を イ ン ス ト ールす る こ と も で き ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 817 デー タ ベース接続 表 39-9: Adaptive Server Anywhere フ ァ イル 名前 DBODBC8.DLL DBBACKUP.EXE DBCON8.DLL DBISQLC.EXE DBLGEN8.DLL DBLIB8.DLL DBODTR8.DLL DBTOOL8.DLL DBUNLOAD.EXE DBVALID.EXE RTENG8.EXE DBCTRS8.DLL DBSERV8.DLL イ ン ス ト ール先パス 説明 ASA ODBC ド ラ イ バ ASA バ ッ ク ア ッ プ ユーテ ィ リ テ ィ 接続 ダ イ ア ロ グ ボ ッ ク ス。 開発者が独自のダ イ ア ロ グ を 提供せず、 エ ン ド ユーザが独自のデー タ ソ ー ス を作成す る 場合、 ま たはデー タ ベー ス に接 続す る と き にユーザ ID と パ ス ワ ー ド の入力が必 要な場合、 あ る いはそのほかの目的で接続 ダ イ ア ロ グ を表示する 必要があ る 場合に必要 対話型 SQL ユーテ ィ リ テ ィ 言語固有の文字列 ラ イ ブ ラ リ (EN は英語版 を 示 す) イ ン タ フ ェ ース ラ イ ブ ラ リ ODBC ト ラ ン ス レー タ 。 アプ リ ケーシ ョ ンが OEM か ら ANSI 文字セ ッ ト への変換を使用す る 場合に 必要 ASA デー タ ベース ツール ASA ア ン ロ ー ド ユーテ ィ リ テ ィ ASA 検証ユーテ ィ リ テ ィ 制限つき の ラ ン タ イ ム エン ジ ン パフ ォーマ ン ス ユーテ ィ リ テ ィ サーバ ユーテ ィ リ テ ィ ¥Program Files¥Sybase¥SQL Anywhere 8¥win32 アプ リ ケーシ ョ ン と 同 じ パ ス、シ ス テ ム パ ス のデ ィ レ ク ト リ 、 ま たは App Path レ ジ ス ト リ キー 配布先パス レ ジ ス ト リ エ ン ト リ 801 ページの 「App Path レ ジ ス ト リ キー」 お よ び 次の 「ODBC デー タ ソ ース と ド ラ イ バの環境設定」 を参照 し て く だ さ い。 サポー ト フ ァ イ ルは、 DBODB8.DLL と 同 じ デ ィ レ ク ト リ に イ ン ス ト ール し なければな り ません。 英語版の文字列 ラ イ ブ ラ リ を使用 し ない場合は、 使用言語固有の文字列 ラ イ ブ ラ リ の該当す る バージ ョ ン を配布 し てお く 必要があ り ます。 注意 818 PowerBuilder 第 39 章 ア プ リ ケーシ ョ ン と コ ンポーネ ン ト の配布 ODBC デー タ ソ ース と ド ラ イバの環境設定 ユーザが特定のデー タ ソ ー ス に接続で き る よ う にす る に は、 イ ン ス ト ール プ ロ グ ラ ムに よ っ て、 デー タ ソ ース にア ク セ スす る コ ン ピ ュ ー タ の レ ジ ス ト リ にあ る ODBC.INI キーに、 そのデー タ ソ ー ス の定義を提供す る 必要があ り ます。 ユーザ DSN の場合は HKEY_CURRENT_USER 、 シ ス テ ム DSN の場合は HKEY_LOCAL_MACHINE にな り ます。 デー タ ソ ース定義では、 デー タ ベース ド ラ イ バの名前 と 保存場所だけでな く 、デー タ ベース エ ン ジ ン の起動に必要な コ マ ン ド も 指定 し ま す。 ODBC Data Sources キーの デー タ ソ ース も 、 ODBC.INI に一覧表示す る 必要があ り ます。 ODBC.INI 以下の例では、Adaptive Server Anywhere を使用す る MyApp DB と い う デー タ ソ ース の一般的な レ ジ ス ト リ エ ン ト リ を示 し ます。レ ジ ス ト リ キーは大カ ッ コ で囲ま れ、 後ろに " 名前 "=" 値 " の形式でキーの文字 列値が記述 さ れてい ます。 [HKEY_CURRENT_USER¥SOFTWARE¥ODBC¥ODBC.INI¥MyApp DB] "Driver"="C:¥Program Files¥Sybase¥SQL Anywhere 8¥ win32¥dbodbc8.dll" "Start"="c:¥program files¥sybase¥SQL Anywhere 8¥win32¥ rteng8.exe -c8m" "UID"="dba" "PWD"="sql" "Description"="Database for my application" "DatabaseFile"="C:¥Program Files¥myapps¥myapp.db" "AutoStop"="Yes" [HKEY_CURRENT_USER¥SOFTWARE¥ODBC¥ODBC.INI¥ ODBC Data Sources] "MyApp DB"="Adaptive Server Anywhere 8.0" イ ン ス ト ール プ ロ グ ラ ムは、 HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC の ODBCINST.INI キー に、 配布す る アプ リ ケーシ ョ ン が使用す る 各 ド ラ イ バについて以下の 2 種類のエ ン ト リ を作成す る 必要があ り ます。 ODBCINST.INI • ODBCINST.INI の ODBC DRIVERS キーに ド ラ イ バ名を指定 し た 文字列値 と "Installed" を指定 し たデー タ 値を追加 し ます。 • ODBCINST.INI キーに Driver お よ び Setup と い う 文字列値を使用 し た ド ラ イ バご と の新 し いキーを追加 し ます。 ド ラ イ バに よ っ ては、ODBCINST.INI に さ ら に文字列値が必要な場 合があ り ます。 ODBC デー タ ベー ス ド ラ イ バ フ ァ イ ルがシ ス テ ム パ ス のデ ィ レ ク ト リ 内に保存 さ れていない場合は、 その保存場所 も 実行フ ァ イ ルの App Paths キーに追加す る 必要があ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 819 デー タ ベース接続 ベン ダか ら 提供 さ れた ODBC ド ラ イ バを使用 し てい る 場合は、 ド ラ イ バのセ ッ ト ア ッ プ プ ロ グ ラ ム を使用 し て、 ド ラ イ バを イ ン ス ト ール し て レ ジ ス ト リ エ ン ト リ を作成す る こ と がで き ます。 以下の例は、Adaptive Server Anywhere の一般的な レ ジ ス ト リ エ ン ト リ を示 し ます。 レ ジ ス ト リ キーは大カ ッ コ で囲まれ、 後ろ に " 名前 "=" 値 " の形式でキーの文字列値が記述 さ れてい ます。 [HKEY_LOCAL_MACHINE¥SOFTWARE¥Microsoft¥Windows¥ CurrentVersion¥App Paths¥myapp.exe] "Default"="C:¥Program Files¥myapps¥MYAPP.EXE" "Path"="Program Files¥sybase¥shared¥PowerBuilder; c:¥program files¥sybase¥SQL Anywhere 8¥win32¥; c:¥program files¥sybase¥shared¥DataDirectODBC;" [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥ ODBC Drivers] "Adaptive Server Anywhere 8.0"="Installed" "PB DataDirect OEM 3.60 32-BIT Sybase"="Installed" [HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBCINST.INI¥ Adaptive Server Anywhere 8.0] "Driver"="c:¥program files¥sybase¥SQL Anywhere 8¥ win32¥dbodbc8.dll" "Setup"="c:¥program files¥sybase¥SQL Anywhere 8¥ win32¥dbodbc8.dll" ODBC ド ラ イ バ と デー タ ソ ー ス の レ ジ ス ト リ エ ン ト リ の内容につい ての詳細は、『デー タ ベース と の接続』 マニ ュ アルを参照 し て く だ さ い。 OLE DB データ ベース プ ロ バイ ダ OLE DB を 使用 し てデー タ に ア ク セ ス す る ア プ リ ケーシ ョ ン の場合、 各ユーザの コ ン ピ ュ ー タ に Microsoft の Data Access Components ソ フ ト ウ ェ アが イ ン ス ト ール さ れていない場合は イ ン ス ト ール し な ければな り ません。 必要であれば、CD の Support ディ レ ク ト リ に入っている MDAC_TYP.EXE セ ッ ト ア ッ プ フ ァ イ ルを使用 し て、 ユーザのシ ス テ ム を更新す る こ と がで き ま す。 MDAC_TYP.EXE を実行す る と 、 Microsoft OLE DB プ ロ バ イ ダ、 SQLOLEDB、 お よ び MSDASQL が イ ン ス ト ール さ れ ます。 820 PowerBuilder 第 39 章 ア プ リ ケーシ ョ ン と コ ンポーネ ン ト の配布 指定 さ れた PB DataDirect OLE DB デー タ プ ロ バ イ ダ を使用す る 場合 は、 表 39-10 の フ ァ イ ルが必要です。 別のベン ダか ら 提供 さ れ る OLE DB プ ロ バ イ ダ を使用す る アプ リ ケーシ ョ ンの場合は、ベン ダが指定す る フ ァ イ ルのほかに PBOLE90J.DLL を配布す る 必要があ り ます。 オプ シ ョ ンのヘルプ フ ァ イル ヘルプ (.HLP お よ び .CNT) フ ァ イ ルは、 ユーザがデー タ ベー ス 管理 作業を行 う 場合のみ、 配布す る 必要があ り ます。 表 39-10: PowerBuilder DataDirect OLE DB フ ァ イル 名前 PBOLE90J.DLL 必要 と する対象 すべての OLE DB 接続に必要な PowerBuilder OLE DB イ ン タ フ ェース 401COMUPD.EXE IVODBC.LIC PBADMIN.CNT PBADMIN.EXE PBADMIN.HLP PBADMINR.DLL PBINF09.CNT PBINF09.DLL PBINF09.HLP PBINF09R.DLL PBOR709.CNT PBOR709.DLL PBOR709.HLP PBOR709R.DLL PBOR809.CNT PBOR809.DLL PBOR809.HLP PBOR809R.DLL PBSYB09.CNT PBSYB09.DLL PBSYB09.HLP PBSYB09R.DLL PBXML09.CNT PBXML09.DLL PBXML09.HLP PBXML09R.DLL すべての PB DataDirect OEM 2.70 OLE DB デー タ プ ロ バ イ ダに必要な ラ イ セ ン ス フ ァ イ ル と ヘルプ フ ァ イ ル、 お よ び管理ユーテ ィ リ テ ィ イ ン ス ト ール先パス ア プ リ ケーシ ョ ン テ ク ニ ッ ク PB DataDirect OEM 2.70 Informix 7.x お よ び 9.x PB DataDirect OEM 2.70 Oracle 7 PB DataDirect OEM 2.70 Oracle 8 PB DataDirect OEM 2.70 Sybase Adaptive Server Enterprise PB DataDirect OEM 2.70 XML Program Files¥Sybase¥Shared¥DataDirect 821 デー タ ベース接続 アプ リ ケーシ ョ ン と 同 じ パ ス、シ ス テ ム パ ス のデ ィ レ ク ト リ 、 ま たは App Path レ ジ ス ト リ キー 配布先パス レ ジ ス ト リ エ ン ト リ PBADMINR.DLL、 PBINF009R.DLL、 PBOR709R.DLL、 PBOR809R.DLL、 PBSYB09R.DLL、 お よ び PBXML09R.DLL を共有 DLL と し て登録 し ます。 801 ページの 「App Path レ ジ ス ト リ キー」 も 参照 し て く だ さ い。 JDBC データ ベース イ ン タ フ ェ ース PowerBuilder JDB イ ン タ フ ェ ー ス は、 Sun Java Runtime Environment (JRE) バージ ョ ン 1.2 以降をサポー ト し てい ます。 アプ リ ケーシ ョ ン ま たは コ ン ポーネ ン ト が JDBC 接続を使用す る 場合 は、 使用す る Java VM に対応す る Java パ ッ ケージだけでな く 、 JDB ド ラ イ バ を 配 布 し な け れ ば な り ま せ ん。 Java 仮 想 マ シ ン と 、 Sybase jConnect for JDBC な どベン ダ提供の JDBC 準拠 ド ラ イ バ も 、デー タ ソ ー ス にア ク セ ス す る コ ン ピ ュ ー タ 上に イ ン ス ト ール し て設定す る 必要が あ り ます。 ド ラ イ バが ロ ー ド す る Java VM を指定す る には、JavaVM DBParm を使 用 し ます。 こ の DBParm については、 開発環境 と 配布環境で同 じ 設定 を 指定 し て く だ さ い。 詳細につい て は、 『デー タ ベー ス と の接続』 マ ニ ュ アルを参照 し て く だ さ い。 Java VM の詳細については、次の 「Java サポー ト 」 を参照 し て く だ さ い。 表 39-11: PowerBuilder JDB フ ァ イル 名前 PBJDB90J.DLL pbjdbc1290.jar イ ン ス ト ール先パス 説明 JRE 1.2 以降対応 PowerBuilder JDBC ド ラ イ バ (JDB) PowerBuilder JDB ド ラ イ バ お よ び JRE 1.2 以降対応 Java パ ッ ケージ ¥Program Files¥Sybase¥Shared¥PowerBuilder アプ リ ケーシ ョ ン と 同 じ パ ス、シ ス テ ム パ ス のデ ィ レ ク ト リ 、 ま たは App Path レ ジ ス ト リ キー 配布先パス レ ジ ス ト リ エ ン ト リ CLASSPATH 環境変数には、 PowerBuilder pbjdbc1290.jar フ ァ イ ルを含めておいて く だ さ い。 た と えば、 次の よ う にな り ます。 822 PowerBuilder 第 39 章 ア プ リ ケーシ ョ ン と コ ンポーネ ン ト の配布 [HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Control ¥Session Manager¥Environment] "CLASSPATH"="C:¥Program Files¥sybase¥shared¥ PowerBuilder¥pbjdbc1290.jar;... 832 ページの 「EAServer 上の PowerBuilder コ ン ポーネ ン ト 」 お よ び 837 ページの 「EAServer 上の Web デー タ ウ ィ ン ド ウ 」 を参照 し て く だ さ い。 注意 Java サポー ト Java Runtime Environment (JRE) を使用す る アプ リ ケーシ ョ ン ま たは コ ン ポーネ ン ト と と も に PowerBuilder pbjvm90J.dll フ ァ イ ルを配布 し 、さ ら に タ ーゲ ッ ト コ ン ピ ュ ー タ に JRE を イ ン ス ト ール し てお く 必要が あ り ま す。 JRE は、 JSP タ ーゲ ッ ト 、 EJB ク ラ イ ア ン ト 、 JDBC 接続、 お よ び XSL-FO を使用 し た PDF での保存 を す る 場合に必要に な り ま す。 PowerBuilder と と も に イ ン ス ト ール さ れてい る JRE を、 タ ーゲ ッ ト コ ン ピ ュ ー タ 上の PowerBuilder ラ ン タ イ ム フ ァ イ ル と 同 じ デ ィ レ ク ト リ に コ ピーす る か、 ユーザの PATH シ ス テ ム環境変数で定義 さ れ た場所に保存 さ れてい る 既存の JRE を使用 し ます。 Java VM の検索 PowerBuilder アプ リ ケーシ ョ ンで Java VM が必要にな る と 、PowerBuilder ラ ン タ イ ムは、 ユーザ コ ン ピ ュ ー タ 上で pbjvm90J.dll が イ ン ス ト ール さ れて い る デ ィ レ ク ト リ のサブデ ィ レ ク ト リ 内の jvm.dll フ ァ イ ル を 探 し ます。 jvm.dll フ ァ イ ルは、 JDK 1.4 イ ン ス ト ールの JRE¥bin¥client デ ィ レ ク ト リ と 、 JDK 1.2 お よ び 1.3 イ ン ス ト ールの JRE¥bin¥classic デ ィ レ ク ト リ に イ ン ス ト ール さ れます。 PowerBuilder は、PowerBuilder アプ リ ケーシ ョ ンに よ っ て使用 さ れてい る 現在のパ ス の先頭に jvm.dll の保存場所を追加 し ます。 こ のパ ス は、 ユ ー ザ の PATH シ ス テ ム 環 境 変 数 で 定 義 さ れ て い る パ ス で す。 PowerBuilder は、 Windows レ ジ ス ト リ に保存 さ れてい る 環境変数を変 更 し ません。 jvm.dll を探すために、 PowerBuilder は、 まず pbjvm90J.dll が イ ン ス ト ール さ れてい る 場所を確認 し ます。 pbjvm90J.dll が、 C:¥Sybase¥Shared¥PowerBuilder に イ ン ス ト ール さ れてい る と 仮定 し ま す。 次に、 PowerBuilder は こ の検索プ ロ シージ ャ を使っ て、 現在使用 し てい る パ ス に jvm.dll の保存場所を追加 し ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 823 Java サポー ト 1 C:¥Sybase¥Shared¥PowerBuilder¥ 内でディ リ ク ト リ 構造 JRE¥bin¥client (JDK 1.4 の場合) を検索 し 、 見つか っ た ら こ れをパ ス の先頭に追 加 し ます。 2 見つか ら なか っ た場合、 C:¥Sybase¥Shared¥PowerBuilder¥ 内でデ ィ リ ク ト リ 構造 JDK1.4¥JRE¥bin¥client を検索 し 、 見つか っ た ら こ れ をパ ス の先頭に追加 し ます。 3 見つか ら なか っ た場合、 C:¥Sybase¥Shared¥PowerBuilder¥ 内でデ ィ リ ク ト リ 構造 JRE¥bin¥classic (JDK 1.2 ま たは 1.3 の場合) を検索 し 、 見つか っ た ら こ れをパ ス の先頭に追加 し ます。 4 見つか ら なか っ た場合、 C:¥Sybase¥Shared¥PowerBuilder¥ 内でデ ィ リ ク ト リ 構造 JDK1.3¥JRE¥bin¥classic を検索 し 、見つか っ た ら こ れ をパ ス の先頭に追加 し ます。 上記のディ レ ク ト リ 構造がいずれも 見つから なかっ た場合、PowerBuilder はユーザの PATH 環境変数で定義 さ れた場所に あ る 最初の jvm.dll を 使用 し ます。 jvm.dll が見つか ら ない と 、 Java VM は起動 さ れ ません。 ラ ン タ イム Java VM ク ラ スパス ラ ン タ イム ス タ テ ィ ッ ク レジス ト リ ク ラ スパスの上書き PowerBuilder が Java VM を起動す る と 、 Java VM は内部パ ス と ク ラ ス パ ス情報を使っ て、必要な Java ク ラ ス が常に使用で き る 状態に し ます。 実行時、 Java VM は以下のパ ス を結合 し て作成 さ れた ク ラ ス パ ス を使 用 し ます。 • Java VM の起動時にプ ロ グ ラ ム に よ っ て追加 さ れ る ク ラ ス パ ス。 た と えば、 EJB ク ラ イ ア ン ト ア プ リ ケーシ ョ ン は、 CreateJavaVM メ ソ ッ ド に ク ラ ス パ ス を渡す こ と がで き ます。 • PowerBuilder ラ ン タ イ ム ス タ テ ィ ッ ク レ ジ ス ト リ ク ラ ス パ ス。こ れは、PowerBuilder でアプ リ ケーシ ョ ン を配布す る と き に使用 さ れ る 、Windows レ ジ ス ト リ 内のパ ス に対応す る pbjvm90J.dll フ ァ イ ル に組み込 ま れ る パ ス です。 こ のパ ス には、 Java VM を使用す る 機 能が実行時に必要 と す る ク ラ ス が含まれます。 • シ ス テ ムの CLASSPATH 環境変数 • 現行デ ィ レ ク ト リ 必要に応 じ て、 ス タ テ ィ ッ ク レ ジ ス ト リ 内で ラ ン タ イ ム の使用のため に 定 義 さ れ た JVM 設 定 お よ び プ ロ パ テ ィ を 上 書 き で き ま す。 PowerBuilder は、 次のアルゴ リ ズ ム を使用 し て設定情報を探 し ます。 1 824 JVM に対 し て最初の リ ク エ ス ト が発生す る と 、 PowerBuilder は、 JVM を作成す る 関数に渡す設定情報お よ びプ ロ パテ ィ の レ ジ ス ト リ エ ン ト リ を探 し ます。 PowerBuilder 第 39 章 ア プ リ ケーシ ョ ン と コ ンポーネ ン ト の配布 2 PowerBuilder が設定情報の レ ジ ス ト リ エ ン ト リ を 見つけ た場合、 ス タ テ ィ ッ ク レ ジ ス ト リ のかわ り に こ の レ ジ ス ト リ エ ン ト リ を使 用し ま す。 レ ジス ト リ エン ト リ が見つから ない場合、 PowerBuilder は ス タ テ ィ ッ ク レ ジ ス ト リ を使用 し ます。 3 PowerBuilder が JVM に渡すカ ス タ ム プ ロ パテ ィ の レ ジ ス ト リ エ ン ト リ を見つけた場合、 ス タ テ ィ ッ ク レ ジ ス ト リ のかわ り に こ の レ ジ ス ト リ を使用 し ます。 レ ジ ス ト リ エ ン ト リ が見つか ら ない場 合、 PowerBuilder は ス タ テ ィ ッ ク レ ジ ス ト リ エ ン ト リ を使用 し ま す。 デフ ォ ル ト 設定を上書 き す る には、 HKEY_LOCAL_MACHINE¥Software¥Sybase¥PowerBuilder¥9.0J¥Java キー内に、 PBRTConfig と い う 名前の新 し いキーを作成 し た後、 PBJVMconfig お よ び PBJVMprops の ど ち ら か一方ま たは両方のサブ キーを作成 し た キーに追加 し ます。 ス タ テ ィ ッ ク レ ジ ス ト リ エ ン ト リ を複製す る には、PBIDEConfig キー 内に表示 さ れ る 次のサブキーに同 じ 文字列値を追加 し ます。 サブキー PBJVMconfig PBJVMprops 文字列値名 Count 0 java.compiler 文字列値デー タ 1 -verbose:jni,class なし 環境設定 ま たはプ ロ パテ ィ エ ン ト リ の ど ち ら か一方 ま たは両方 を 上 書 き で き ま す。 エ ン ト リ を 誤 っ て 指定す る と 、 PowerBuilder は ス タ テ ィ ッ ク レ ジ ス ト リ のデフ ォ ル ト 設定に戻 し ます。 ただ し 、 こ れ ら の エ ン ト リ を正 し く 設定 し ない と JVM 内で正 し く 動作 し な く な る ので、 エ ン ト リ を変更す る 際は注意が必要です。 PowerBuilder エ ク ス テ ン シ ョ ン PowerBuilder 9.0 には、 3 つの PowerBuilder エ ク ス テ ン シ ョ ンが備え ら れてい ます。 アプ リ ケーシ ョ ン が こ れ ら のエ ク ス テ ン シ ョ ン を使用す る 場合、 表 39-12 に示すフ ァ イ ルを配布す る 必要があ り ます。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 825 PowerBuilder エ ク ス テ ン シ ョ ン 表 39-12: PowerBuilder の組み込みのエ ク ス テ ン シ ョ ン を使用する場合に 必要な フ ァ イル エ ク ステンシ ョ ン PowerBuilder Document Object Model EJB ク ラ イ ア ン ト Web サービ ス用 SOAP ク ラ イ ア ン ト フ ァ イル PBDOM90J.DLL PBXerces90J.DLL xerces-c_2_1_0.dll pbejbclient90J.dll pbejbclient90J.jar EasySoap.DLL ExPat.dll libeay32.dll ssleay32.dll pbsoapclient90J.dll EJB ク ラ イ ア ン ト に関 し ては、表に示 し た フ ァ イ ルに加え て、EJB サー バの JDK と 互換性のあ る Java Runtime Environment (JRE) を ク ラ イ ア ン ト で使用で き る よ う に し 、 CLASSPATH に追加す る 必要があ り ます。 Sun JRE バージ ョ ン 1.4 が、PowerBuilder CD の Support デ ィ レ ク ト リ に 用意 さ れてい ます。 詳細については、 823 ページの 「Java サポー ト 」 を参照 し て く だ さ い。 注意 EJB ク ラ イ ア ン ト を選択 し た場合、 JRE は、 ラ ン タ イ ム パ ッ ケージ ャ で作成 さ れた MSI フ ァ イ ルには追加 さ れ ません。 826 PowerBuilder 第 39 章 ア プ リ ケーシ ョ ン と コ ンポーネ ン ト の配布 PDF と XSL-FO のエ ク スポー ト PowerBuilder は、 デー タ ウ ィ ン ド ウ のデー タ と 提示様式を 2 つのテ ク ニ ッ ク を使っ て Portable Document Format (PDF) フ ァ イ ル と し て保存 で き ます。PowerBuilder は PDF フ ァ イ ル と し て保存す る 場合に、デフ ォ ル ト で distiller を使用 し ます。PowerBuilder では Apache XML Formatting Objects プ ロ セ ッ サ を 使 用 し て、 PDF ま た は XSL Formatting Objects (XSL-FO) 形式に保存す る こ と も で き ます。 GNU Ghostscript distiller の使い方 SaveAs メ ソ ッ ド を 使 っ て distiller でデー タ を PDF と し て保存す る に は、 まず、 次の手順に従っ て GNU Ghostscript を ダ ウ ン ロ ー ド し 、 コ ン ピ ュ ー タ に イ ン ス ト ールす る 必要があ り ます。 GNU Ghostscript の使用に際 し ては、 GNU General Public License (GPL) の規定に従 う 必要があ り ます。 GNU Ghostscript を コ ン ピ ュ ー タ に イ ン ス ト ールす る 前に、 GPL を 読んで く だ さ い。 GPL は GNU Project Web server http://www.gnu.org/licenses/gpl.html か ら 入手で き ます。 ❖ GNU Ghostscript を イ ン ス ト ールするには 1 ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/gnu の gs705 デ ィ レ ク ト リ にあ る gs705w32.exe、 ま たは gs706 デ ィ レ ク ト リ にあ る gs706w32.exe を コ ン ピ ュ ー タ の一時デ ィ レ ク ト リ にダ ウ ン ロ ー ド し ます。 ミ ラ ー サ イ ト の リ ス ト は、 Ghostscript の Web サ イ ト http://www.ghostscript.com/doc/gnu/gnu705.htm にあ り ます。 2 実行フ ァ イ ルを実行 し て、Ghostscript を シ ス テ ムに イ ン ス ト ール し ます。 デフ ォ ル ト の イ ン ス ト ール デ ィ レ ク ト リ は C:¥gs です。 別のデ ィ レ ク ト リ を選択 し た り 、 Ghostscript コ ン ソ ール と readme フ ァ イ ル へのシ ョ ー ト カ ッ ト を作成す る こ と も で き ます。 フ ァ イルの場所 distill メ ソ ッ ド を使っ てデー タ ウ ィ ン ド ウ オブジ ェ ク ト を PDF と し て 保存す る 場合、PowerBuilder は、次の場所か ら イ ン ス ト ール さ れた GNU Ghostscript を探 し ます。 • Windows レ ジ ス ト リ • pbdwe90J.dll ファ イルの相対パス(通常は Sybase¥Shared¥PowerBuilder) • シ ス テ ム の PATH 環境変数 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 827 PDF と XSL-FO のエ ク スポー ト GNU Ghostscript を gs705w32.exe (Ghostscript 7.05 の場合) ま たは gs706w32.exe (Ghostscript 7.06 の場合) を使っ て イ ン ス ト ール し た場 合は、 Windows レ ジ ス ト リ にパ ス が追加 さ れ ます。 Ghostscript フ ァ イ ルが pbdwe90.dll フ ァ イ ルの相対パ ス に あ る 場合、 Ghostscript は次のデ ィ レ ク ト リ 構造で イ ン ス ト ール さ れてい ます。 dirname¥pbdwe90J.dll dirname¥gs¥gs7.0N dirname¥gs¥fonts dirname は ラ ン タ イ ム DLL を含むデ ィ レ ク ト リ 、 N は Ghostscript のマ イ ナー リ リ ース バージ ョ ン番号です。 すべての フ ォ ン ト を配布す る 必要はないか も し れ ません。 フ ォ ン ト に つ い て の 詳 細 は、 Fonts and font facilities supplied with Ghostscript http://www.ghostscript.com/doc/gnu/7.05/Fonts.htm を参照 し て く だ さ い。 Sybase¥Shared¥PowerBuilder¥drivers に イ ン ス ト ール さ れて い る デ フ ォ ル ト の PostScript プ リ ン タ ド ラ イ バ と 関連フ ァ イ ル も 配布す る 必要が あ り ます。 こ れ ら の フ ァ イ ルはユーザの コ ン ピ ュ ー タ に コ ピーま たは イ ン ス ト ールで き ます。 次のデ ィ レ ク ト リ 構造で配置す る 必要があ り ます。 dirname¥pbdwe90J.dll dirname¥drivers Apache FO プ ロ セッ サの使い方 Apache プ ロ セ ッ サ を使用 し て PDF ま たは XSL-FO 形式で保存す る ア プ リ ケーシ ョ ンの場合には、アプ リ ケーシ ョ ン と と も に fop-0.20.4 デ ィ レ ク ト リ と Java Runtime Environment (JRE) を配布す る 必要があ り ま す。 こ れ ら のデ ィ レ ク ト リ は、 PowerBuilder ラ ン タ イ ム フ ァ イ ル と 同 じ デ ィ レ ク ト リ に配布す る 必要があ り ます。 た と えば、 MyApplication と い う デ ィ レ ク ト リ に ア プ リ ケ ー シ ョ ン と pbvm90J.dll と そ の ほ か の PowerBuilder ラ ン タ イ ム フ ァ イ ルを 配布す る 場合、Apache プ ロ セ ッ サ と JRE を MyApplication¥fop-0.20.4 お よ び MyApplication¥jre に配布 し ます。 ただ し 、 タ ーゲ ッ ト コ ン ピ ュ ー タ 上に JDK を フル イ ン ス ト ー ル し 、 ク ラ ス パ ス に追加 し て あ る 場合は、 その場所に JRE の コ ピーを 置 く 必要はあ り ません。 JRE についての詳細は、 823 ページの 「Java サポー ト 」 を参照 し て く だ さ い。 828 PowerBuilder 第 39 章 ア プ リ ケーシ ョ ン と コ ンポーネ ン ト の配布 Windows DBCS プ ラ ッ ト フ ォ ーム では、 タ ーゲ ッ ト コ ン ピ ュ ー タ の Windows フ ォ ン ト デ ィ レ ク ト リ (C:¥WINDOWS¥fonts な ど) に、 DBCS 文字をサポー ト す る フ ァ イ ル も 配布す る 必要があ り ます。 フ ォ ン ト の設定についての詳細は、 Apache Web http://xml.apache.org/fop/fonts.html を参照 し て く だ さ い。 ア プ リ ケーシ ョ ン テ ク ニ ッ ク 829 デー タ ウ ィ ン ド ウ Web コ ン ト ロール ActiveX デー タ ウ ィ ン ド ウ Web コ ン ト ロール ActiveX デー タ ウ ィ ン ド ウ Web コ ン ト ロ ール ActiveX を使用 し てい る 場合は、 Web サーバに以下の フ ァ イ ルを配布す る 必要があ り ます。 表 39-13: デー タ ウ ィ ン ド ウ Web コ ン ト ロール ActiveX 用の PowerBuilder フ ァ イル 名前 PSDWC90J.CAB 必要 と する対象 すべての Web ActiveX アプ リ ケーシ ョ ン。Open Software Distribution 情報フ ァ イ ル、 Web ActiveX お よ び ト ラ ンザ ク シ