VBAForm2Tkinter 1.4.1
VBAForm2PowerShell 1.2.0
リリースしました。
修正内容(1.3.2 / 1.1.2からの修正点のため1.3.3~1.4.0 / 1.1.3~1.1.4の修正内容も含んでいます)
リポジトリはこちらです
https://github.com/GUI-Conversion-Tools/VBAForm2Tkinter
https://github.com/GUI-Conversion-Tools/VBAForm2PowerShell
新機能追加
-
ListView対応
色・フォント設定の他、設定したアイテム、MultiSelectプロパティ、列ごとのAlignment設定を反映します -
TreeView対応
フォント設定、設定したノード、ノードごとの展開状態、スクロールバーの表示設定を反映します - 新規プロパティの対応
以下のプロパティ設定が変換先のコードに反映されるようになりました
.PasswordChar(TextBox),.ScrollBars(TextBox),.WordWrap(TextBox),.Locked(TextBox,ListBox,ComboBox),.MultiSelect(ListBox)
.Style(ComboBox,MultiPage),.TabOrientation(MultiPage),.PictureAlignment/.PictureSizeMode(Image) - (Tkinter版のみ)
ListBoxにスクロールバーを追加 - (Tkinter版のみ) 実行時設定可能な引数に
uniqueStyleNameを追加
デフォルトTrue
この引数をFalseにするとttkウィジェットのスタイル名にランダム生成の一意の値の付与をしなくなります
これを追加した理由と詳細は後述するバグ修正の箇所を参照してください
共通バグ修正、リファクタリング内容
-
MultiPage内のPageの変数重複問題を解消
Pageの変換先変数名に親MultiPageの名前を付与するようにしました
例:Page1→MultiPage1_Page1
Pageはコントロール名の重複が他のMultiPageと可能ですが、
それが原因で複数MultiPageを配置した際に変換先で中の子コントロールが正しいMultiPage内に配置されない問題が発生していました - ユーザーフォームの最上位ウィンドウのオブジェクト取得ロジックに誤りがあったのを修正
従来はオブジェクト名=型名ならそれが最上位と判定していたが
その場合Frameを"Frame"という名前にすると誤判定されてしまうため
コントロールの深さが0かつ、MSForms.UserForm型と合致しないと最上位ウィンドウとは判定しないように変更しています
(GetFormControlDepth(ctrl) = 0 And TypeOf ctrl Is MSForms.UserForm) - ソースコード内の定数のマジックナンバーを廃止し、直接記述に変更
例えばコード内のマジックナンバーを以下のような表記に改めました
1→fmBorderStyleSingle
0→fmBorderStyleNone - マウスカーソル設定ロジックの変更
変換後にデフォルトカーソルの場合にTkinterならNone, PowerShellなら$nullをマウスカーソル設定に代入してたのを、マウスカーソルの設定コード自体を省略するように変更しました - サイズ計算用のWindows APIを廃止
1.4.0 / 1.2.0以降、コードからGetSysColor以外のWindows APIを廃止し、Point→Pixelのサイズ計算ロジックは純粋なVBAのみで記述しています
タイトルバーを除いた領域のサイズ取得のため従来はGetClientRectとGetWindowRectの差分で計算していたのを.InsideHeight/.InsideWidthプロパティを使用し直接取得しています
他にもロジックを見直し、従来のようにDPIを取得して計算に使用する必要もなくなりました
また新しいロジックで確認した結果Windowsのウィンドウ描画が96dpi基準のため、DPIが変更になっても生成されるサイズはVBAで表示したさいの物理的なサイズと変わらないことを確認しています
これに伴い、README.mdからDPIの異なるモニターが混在した場合に正常に動かないという記述を削除しました -
CheckBox,OptionButton,ToggleButtonのテキストの上下位置表示を修正
テキスト表示位置がLabelと同じ上寄り表示になっていましたが、VBAの表示と同様中央寄りにしました
Tkinter
Left →anchor="w", Center →anchor="center", Right →anchor="e"
(従来は"nw","n","ne")
PowerShell
Left →.TextAlign = "MiddleLeft", Center →.TextAlign = "MiddleCenter", Right →.TextAlign = "MiddleRight"
(従来は"Left","Center","Right") - MultiPageのページ部分の色反映が正常に行われないバグを修正
VBAのユーザーフォームの仕様上、UserForm,Label,Frameのデフォルト色、またMultiPageについては、システムカラーの&H8000000F&を直接反映するため、Windows2000やWindows XPのクラッシックテーマでユーザーフォームを表示した場合と
Windows XPのLunaテーマおよびWindows 10/11で表示した場合では色が異なります
このプログラムでは変換を実行した際の環境の色に合わせ、システムカラーに対応するRGBコードを生成する仕様になっています
そのさい、MultiPageのPage部分の色を適切に設定していなかったためWindows XPのクラッシックテーマ下で変換を行い、そのファイルをWindows 11で実行すると
同じシステムカラーのFrameとMultiPageのPage部分の色が異なるという現象が発生しました(Frameはクラッシックテーマの色なのにPageはWindows 11のシステムカラーの色になるという不統一が発生)
これはMultiPage下のコントロールの透明表示設定にも影響が出ていました
Page部分にも色設定を付与するようにしたので、修正後はクラッシックテーマの環境で変換したファイルはすべてクラッシックテーマの色になるようになっています
Tkinter版のみの修正点
- 複数フォームの変換のさいスタイル名の重複が容易に発生してしまい、色設定などが正常に反映されなくなるので以下の対策を実施
1.useCls:=Trueの場合、動的にクラス名を取得しスタイル名の先頭に付加するようにしました
2.スタイル名にuuidの上8桁を付与するようにし、一意の値が確保されるようにしました、これは実行時引数のuniqueStyleNameをFalseにすることで無効化できます
※クラス名が先頭に付与されるため、Falseにしても同一pyファイル内で複数フォームで名前が重複することはないですが、pyファイルを分けてモジュール化したりするとクラス名も重複可能なので重複は起こりえます - スタイル名の複雑化に伴い、変換先のコード内で一度設定したスタイルを参照する場合に
.cget("style")を使用し動的に参照するように変更 -
MultiPageのタブ部分のテキストのフォント設定が反映されなかったバグを修正
これはtkのウィジェットとttkのウィジェットでフォント設定のコードが異なる場合があるのを見落としていたのが原因です
PowerShell版のみの修正点
-
$ErrorActionPreference = 'Stop'をスクリプトの先頭に付加するように変更
PowerShellはエラーが発生しても実行が止まらない言語なので一度エラーが出ると連鎖でエラーが出てしまいエラーの原因特定が難しくなる原因になっていました
$ErrorActionPreference = 'Stop'があると他の言語と同様、一度エラー発生でスクリプトが止まる仕様になります - batファイルとして生成した場合の実行方法を変更
従来はbatファイル内に記述したPowerShellコードをInvoke-Expressionで実行していたのをScriptBlockでの実行に変更しました、これにより安全性、安定性が向上しています
また、UNCパスでのエラー対策にカレントディレクトリの移動処理を挟んでいる点は変わらないですが、直接コードに埋め込みから環境変数での参照に変更することで
エスケープが必要な文字がPathに含まれていることによりエラーが発生する現象を修正しました
その他、bat部分の記述をシンプルにしました -
ToggleButtonを透過色にした場合の挙動を修正
ToggleButton(PowerShellのWinFormsでは.Appearance = "Button"のCheckBox)ですが.BackColor = "Transparent"に設定すると選択状態になった場合に透明状態が反映されないことがわかりました、これはWinFormsの仕様のようです
対策としてToggleButtonは.BackStyle=fmBackStyleTransparentの場合親の.BackColorを引き継ぐ仕様に変更しました
今後のアップデート予定
1.4.x / 1.2.x
1.5.0 / 1.3.0
Imageコントロール内に設定した画像の反映
1.6.0 / 1.4.0 以降
コントロールの内部的に設定されたZオーダーの反映