[PowerServer Tips] ウィンドウリサイズに連動したコントロールリサイズ
プロダクトサポート部の Takeda です。
PowerServerは、PowerBuilderで開発したアプリケーションをWeb/Mobileアプリとして動作させることを可能にしますが、実はさまざまな拡張機能も提供されています。 今回は、これらの中からAppeon Resize Objectについて解説したいと思います。
Appeon Resize Object 概要
Appeon Resize Objectは、アプリのウィンドウリサイズに連動してウィンドウ内のコントロールを簡単にリサイズできるオブジェクトで、Web/Mobileアプリ*で動作します。 コントロール毎にリサイズルールを指定すれば、ウィンドウサイズの変更に合わせてコントロールを再配置、拡大/縮小できるので、さまざまな画面サイズがあるモバイル端末向けのアプリ開発には最適なオブジェクトです。
* 実はPowerBuilderアプリでも動作するようです。ただし、リサイズ時の動作がWeb/Mobileアプリと違うところも見られるので、注意してください。
Appeon Resize Objectの適用方法
Appeon Resize Objectは、PowerServerをインストールしたディレクトリ*配下のdevelopTempFile\appeon_workarounds にある appeon_workarounds.pbl に含まれています。 このPBLをアプリケーションのライブラリリストに追加すれば、Appeon Resize Objectを利用することができます。
* IISにPowerServerをデフォルト設定でインストールした場合は、 C:\inetpub\wwwroot\appeon 配下にあります。
次にAppeon Resize Objectを使用したいWindowオブジェクトへ、以下のコードを記述します。
Windowオブジェクトの[インスタンス変数の宣言]
// オブジェクト変数宣言 eon_appeon_resize io_resize
Appeon Resize Objectのオブジェクト変数を宣言します。 この変数は、ウィンドウ内のさまざまなイベントで使用するため、インスタンス変数として宣言します。
Windowオブジェクトの[openイベント]
// オブジェクトの作成 io_resize = CREATE eon_appeon_resize // オブジェクトの初期化 io_resize.of_init( THIS, true )
Appeon Resize Objectを作成し、of_init()関数でウィンドウに含まれているすべてのコントロールをリサイズ対象として登録します。 of_init()の第2引数は、Boolean型でfalseの場合にはウィンドウおよびウィンドウ内のコントロールのみを初期化の対象とし、trueの場合はユーザーオブジェクトやタブコントロールも含んで初期化します。
Windowオブジェクトの[resizeイベント]
// ウィンドウに含まれるすべてのコントロールリサイズの実行 io_resize.of_resize( THIS, newwidth, newheight, true )
ウィンドウのリサイズイベントが発生したときに、Appeon Resize Objectのof_resize()関数をコールします。 of_resize()関数の第2/3引数は、resizeイベントの引数newwidth/newheightをそのまま指定します。 第4引数はBoolean型でof_init()関数の第2引数と同じくリサイズする範囲を指定できます。
Windowオブジェクトの[closeイベント]
// オブジェクトの破棄 DESTROY io_resize
ウィンドウを閉じた時に、openイベントで作成したオブジェクト変数を破棄します。
これでウィンドウリサイズに連動してコントロールをリサイズする準備ができました。 このままでもPowerServerにアプリをデプロイすれば、ウィンドウのリサイズに連動してコントロールがリサイズされることを確認できます。 なお、Appeon Resize Objectをユーザーオブジェクトで使用する場合は、open/closeイベントではなくconstructor/destructorイベントに記述してください。
【注意】Appeon Resize Objectのof_init()関数は、各コントロールのタグプロパティにリサイズに必要な情報を登録します。 このため、タグプロパティを利用しているアプリでAppeon Resize Objectを使用する場合は、of_gettag()関数を使用して元のタグ情報を取得するように変更してください。
自動リサイズを制御する関数
自動リサイズ動作は、Appeon Resize Objectの関数でアプリ内から制御できます。
すべての自動リサイズを停止/再開するには、of_pause() / of_recover()関数を使用します。
of_pause()関数リファレンス
構文: of_pause() 引数: なし 戻り値: なし
of_recover()関数リファレンス
構文: of_recover() 引数: なし 戻り値: なし
また、コントロール単位で自動リサイズを停止/再開するには、of_stop() / of_start()関数を使用します。
of_stop()関数リファレンス
構文: of_stop( windowobject awo ) 引数: awo - コントロールまたはオブジェクトの識別子 戻り値: なし
of_start()関数リファレンス
構文: of_start( windowobject awo ) 引数: awo - コントロールまたはオブジェクトの識別子 戻り値: なし
これらの関数はAppeon Resize Objectを作成した後であれば、任意のタイミングで実行できます。 モバイルアプリでは自動リサイズを有効にして、PB(EXE)やWebでの実行時はリサイズさせないなど、動作条件による自動リサイズ制御を行うことが可能です。
リサイズルールの指定
Appeon Resize Objectの適用だけでは、すべてのコントロールがウィンドウサイズに比例して拡大/縮小します。 これらを制御するには、of_setflag()関数を使用してコントロール毎にリサイズルールを設定します。
of_setflag()関数リファレンス
構文: of_setflag( windowobject awo, string as_flag ) 引数: awo - コントロールまたはオブジェクトの識別子 as_flag - リサイズルールを数字4桁の文字列で指定 1桁目:X座標の変化 (0 - 変化しない / 1 - 比例して変化 / 2 - 右に水平移動) 2桁目:Y座標の変化 (0 - 変化しない / 1 - 比例して変化 / 2 - 下に垂直移動) 3桁目:幅の変化 (0 - 変化しない / 1 - 比例して変化 / 2 - 右に伸びる / 3 - 左に伸びる / 4 - 右端まで伸びる / 5 - 左端まで伸びる) 4桁目:高さの変化 (0 - 変化しない / 1 - 比例して変化 / 2 - 下に伸びる / 3 - 上に伸びる / 4 - 下端まで伸びる / 5 - 上端まで伸びる) 戻り値: なし
of_setflag()関数でリサイズルールを指定しない場合は、”1111″(すべて比例して変化)としてリサイズされます。
また、データウィンドウコントロールやフォントサイズについては、of_fontresize() / of_zoom()関数を使って画面全体のリサイズルールとして指定します。
of_fontresize()関数リファレンス
構文: of_fontresize( boolean ab_resize, integer ai_type ) 引数: ab_resize - フォントサイズ変更 true - 変更する / false - 変更しない as_flag - 変更ルール 1 - 高さに合わせて変更 / 2 - 幅に合わせて変更 / 3 - 高さと幅の小さい方の比率で変更 4 - 高さと幅の大きい方の比率で変更 戻り値: なし
of_zoom()関数リファレンス
構文: of_fontresize( boolean ab_zoom, integer ai_type [, decimal adec_rate] ) 引数: ab_zoom - データウィンドウのリサイズ true - リサイズする / false - リサイズしない as_flag - 変更ルール 1 - 高さに比例して変更 / 2 - 幅に比例して変更 / 3 - 高さと幅の小さい方の比率で変更 4 - 高さと幅の大きい方の比率で変更 adec_rate - 最大変更率 デフォルトは3(300%)です。 戻り値: なし
これらのリサイズルール指定は、Windowオブジェクトのopenイベントで指定したof_init()関数の実行後に行います。 以下の例を参考にリサイズルールを指定してください。
例:Windowオブジェクトの[openイベント]
// オブジェクトの作成
io_resize = CREATE eon_appeon_resize
// オブジェクトの初期化
io_resize.of_init( THIS, true )
// Fontは変更しない
io_resize.of_fontresize( false, 0 )
// データウィンドウは幅に比例してMax200%まで拡大/縮小する
io_resize.of_zoom( true, 2, 2 )
// st_1は座標も大きさも変化しない
io_resize.of_setflag( st_1, "0000" )
// sle_1は幅変更時のみ右に伸ばす
io_resize.of_setflag( sle_1, "0020" )
:
:
Appeon Resize Objectは、PowerServerを利用したマルチプラットフォームアプリ開発に非常に有効なオブジェクトです。 of_setflag()関数によるリサイズルール指定は、慣れないと難しく感じるかもしれません。 また、元々の画面レイアウトによってはリサイズルールを決めること自体が難しい場合もあるかもしれませんが、ここで紹介したようにPBLの追加と既存コードへの追記のみで適用できます。 ぜひ、実際の動作でAppeon Resize Objectの簡単さを実感してください。