ClientHeight及びHeightプロパティに関する問題の修正パッチについて

この文書では、ClientHeight及びHeightプロパティに関する問題の修正パッチについてご説明します。

【ClientHeight,Heightとは?】

まず、ClientHeightとHeightについてご説明します。

Heightはフォーム全体の高さを設定するためのプロパティです。
ClientHeight はフォームのクライアントエリアの高さを指定するプロパティです。
フォームの周りのボーダー部分、タイトルバー、メニューバーがノンクライアントエリアであり、それらを除いたエリアがフォームのクライアントエリアです。

※ノンクライアントエリアは、OSやテーマによって、異なる大きさになります。

【SP5からV12への変更内容詳細】

SP5→V12(EPC859レベル)へのバージョンアップに際し、HeightとClientHeightの振る舞いが変更されました。
変更内容は、まとめると以下の通りになります。

SP5 V12
デザインタブ 実行時 デザインタブ 実行時
Height - A = ClientHeight Height - A = ClientHeight ClientHeight + A = Height ClientHeight + A = Height

A=ノンクライアントエリアの高さ

⇒デザインタブも実行時も、どちらも計算方法が変更されました。これは、Microsoftの考え方(ClientHeight + A = Height)に合わせたものです。

1) 計算式変更の理由

SP5では、Height - A = ClientHeightの計算式の結果、OSまたはテーマによってAの大きさが異なるため、ClientHeightプロパティが設計時より大きくなった場合、実行時にClientフォームが想定外に小さくなり、設計時と異なり、Clientフォーム内にコンポーネントが納まらなくなる可能性が出てくるという問題がありました。

それを解消するために、V12では計算式を ClientHeight + A = Heightに変更しました。
それにより、OSまたはテーマが変わっても(つまり、Aの値が変わっても)、設計時と同じように、Clientフォーム内にコンポーネントがすべて納まるようになりました。

2) 変更による問題を発見

⇒しかしながら、この変更の結果、SP5と違うOS/テーマで開発を行うと、Heightが変わってしまうことが判明しました。
例)
SP5の開発はXPのXPテーマで実施→V12の開発は7の7ベーシックテーマで実施と仮定
(XPのXPテーマでのA=54、Windows7の7ベーシックテーマのA=58とする)

SP5 V12
デザインタブ 実行時 デザインタブ 実行時
Height - A = ClientHeight Height - A = ClientHeight ClientHeight + A = Height ClientHeight + A = Height
538 − 54 = 484 538 − 54 = 484 484 + 58 = 542 484 + 58 = 542
Height = 538 Height = 538 Height = 542 Height = 542
ClientHeight = 484 ClientHeight = 484 ClientHeight = 484 ClientHeight = 484
                                                                                                                          ※ClientHeight = 484はSP5より引継

実行画面イメージ

※SP5と同じOS/テーマで開発を行うのであれば、Aの値が変わらないので、計算式が変わってもClientHeight及びHeightの値はSP5と変わりません(影響がありません)。

【問題の修正】

問題を修正するパッチが発行されました。
パッチでの修正内容は以下の通りです。
- 実行時の計算方法を変更。
- ComponentVersion(2)が使用可能→このプロパティを使用すると、ClientHeightプロパティのみが使用されるように変更。

パッチを適用すると、振る舞いは以下の通りになります。

SP5 V12 備考
デザインタブ 実行時 デザインタブ 実行時
Height - A = ClientHeight Height - A = ClientHeight 表示上は
ClientHeight + A = Height
内部テーブル上は
      Height - A = ClientHeight
Height - A = ClientHeight ソース未修正の間
→SP5と同じ振る舞い
ClientHeight + A = Height ソース修正時にComponentVersion(2)
と記述しない場合
  ClientHeightのみを使用

クライアントエリア→
 ClientHeightだけを見る
フォーム全体→
 ClientHeight + A = Heightで
 動的に計算
ClientHeightのみを使用

クライアントエリア→
 ClientHeightだけを見る
フォーム全体→
 ClientHeight + A = Heightで
 動的に計算
ソース修正時にComponentVersion(2)
と記述した場合
A=ノンクライアントエリアの高さ

⇒パッチ適用後のV12では、ソース未修正の間は、SP5と同じ振る舞いをします。(内部テーブル上の値を使うため、表示上がどうであれ、SP5と同じ振る舞いになります)
⇒何らかのソース修正が入った時、あわせてフォームのBEGIN_COM部分にComponentVersion(2)の記述を入れると、それ以降はClientHeightプロパティだけが使用され、Heightプロパティの値は動的に算出されるようになります。
⇒ComponentVersion(2)の記述を入れ忘れると、デザイン時と実行時の計算式が異なることになり、デザイン時と実行時の画面の大きさに食い違いが発生する可能性があります。

【パッチ適用手順】

1.EPC859HF-101005.zip をLANSA V12のルートディレクトリ(C:\Program Files\LANSA)にコピーしてください。
2.格納した圧縮ファイルを右クリックして、「ここに解凍」のオプションを選択して解凍するか、手動でV12のルートディレクトリに解凍して格納してください。
3.これにより、EPC859HF-101005というフォルダが作成されます。
  このディレクトリには、hotfix.cmdというファイルがあります。このコマンドファイルをダブルクリックして実行してください。
4.これにより、以下のアクションが行われます。
(1)\lansa 及び \x_win95\x_lansa\execute フォルダの配下にBACKUPフォルダを作成
(2)そのフォルダに、置換されるファイルをコピー
(3)適切なパッチのファイルを適切な場所にコピー

◇パッチ適用時の注意点:
◆4.(3)の「適切なパッチのファイルを適切な場所にコピー」するアクションは、以下の理由で失敗する可能性があります。
- パッチがV12以外の、もしくは正しくないEPCレベルのLANSA環境に適用された
- バックアップを取られ置換される対象のファイルが使用中
- LANSA開発環境が使用中
- LANSA web サーバーが使用中

◆コピーが失敗した場合には、DOSプロンプトのメッセージを確認し、問題を修正してください。
例えば、IDEが開いている為にファイルが使用中である場合には、IDEを終了してhotfix.cmdを再実行してください。
◆パッチを適用後に予期せぬ問題が発生した場合には、バックアップフォルダから元のファイルをリストアし、弊社まで問題をご報告ください。

【注意事項】

パッチ適用後、ソースを修正するまでは、SP5と同じ動きをします。
しかしながら、ソースを修正した場合には、その互換性が崩れますので、BEGIN_COMに必ずComponentVersion(2)の記述を追加してください。
これにより、今後はどのOS/テーマで開発・実行を行っても、Client部分が削られてコンポーネントが納まりきらなくなる問題は発生しなくなります。