ふにゃるんv2

もとは、http://d.hatena.ne.jp/Wacky/

P4D(Python for Delphi)の Delphi モジュールを使用する際の注意

http://d.hatena.ne.jp/Wacky/20060326 にて、PythonスクリプトからVCLを直接操作する方法を、最後に方にメモしていました。
PythonDelphiのコラボレーションって結構面白いと思ったので、少し弄ってみました。


そうしたら、以下の問題がある事がわかりました。

  • Delphiモジュールを使用する際、視覚スタイルの適用に注意すべし
  • Delphi側が、視覚スタイルに対応したバージョン(Delphi7以上)でないと、Python2.4は自動で視覚スタイルが適用されてしまう為、リソースリークが発生する
  • 未対応バージョン(Delphi6)でPython2.4で使用するなら、視覚スタイルを適用しているmanifestを外す必要がある


まぁ、ぶっちゃけて言えば、

  • Python2.4でP4DのDelphiモジュールを使用したければ、Delphi7以上を使用するのが無難

って事です。


「何言ってんのか わからんわ、ゴラァ!」という方の為に実証を。
以下の環境を仮定します。


んで、

  1. "C:\Program Files\PythonForDelphi\Modules\Delphi\Delphi.dpr"を開いてコンパイル
  2. Delphi.pyd が生成されるので、Python2.4のDLLsフォルダにコピー

で、Delphiモジュールがセットアップされます。


で、おもむろに、以下のコードを実行します。
まぁ、元のTestApp.pyにボタンを追加しただけです。

#!/bin/env python
# -*- encoding: shift-jis -*-
from Delphi import *

class MainForm(Form):
    def __init__(self, Owner):
        self.Caption = "A Delphi Form..."
        self.SetBounds(10, 10, 500, 400)
        
        self.lblHello = Label(self)
        self.lblHello.SetProps(Parent=self, Caption="test")
        self.lblHello.SetBounds(10, 10, 300, 24)
        
        self.lblUser = Button(self)
        self.lblUser.SetProps(Parent=self)
        self.lblUser.SetBounds(10, 20, 100, 24)
        
        self.OnClose = self.MainFormClose
    
    def MainFormClose(self, Sender, Action):
        Action.Value = caFree

def main():
    Application.Initialize()
    Application.Title = "MyDelphiApp"
    f = MainForm(Application)
    f.Show()
    FreeConsole()
    Application.Run()
    Application.Terminate()

if __name__ == "__main__":
    ret = main()


実行すると、以下の画面が出てきます。
P4D1
P4D1 posted from フォト蔵


ここまではOKです。
が、閉じると、以下のエラーが発生します。

---------------------------
python.exe - アプリケーション エラー
---------------------------
例外 不明なソフトウェア例外 (0x0eedfade) がアプリケーションの 0x7c81eb33 で発生しました。
---------------------------
OK   
---------------------------

色々弄っていると、uxtheme.dllで止まっているケースが多かったです。
uxtheme.dllって、ぐぐるとわかるんですが、視覚スタイルを統括するDLLなんですよね。


何で〜止まる〜のかな〜と思って色々調べていたら、以下に突き当たりました。


もしかしたら、視覚スタイルを切ってやれば、動くかな〜と思いつつ、Python2.4のルートフォルダを眺めると、"python.exe.manifest"ってファイルがある事に気付きました。
("python.exe.manifest"は、python.exeに対して外部から視覚スタイルを適用する為のファイルなんですね。詳しくはMSDNをば)
早速、リネームしてmanifestファイルによる視覚スタイルの適用を外します。


んで、実行。
P4D2
P4D2 posted from フォト蔵
従来のクラシックスタイルになっています。

で、閉じても何のエラーも起きません。やったぁ。

すみません。
色々とやってたら、どうも中でエラーが起きているかも知れないなぁ?という気がしてきました。


というのも、閉じた時、「ドン」というエラー音が発生しているんですね。
まぁ、エラーメッセージが出ないので普通に使う分には問題ないとは思いますが。


とりあえず、Delphi7以上が推奨かも知れません。
(Delphi6だと無償のpersonal版が手に入るので、結構ベストチョイスとは思うんですけどねぇ)

ところで

さっきからドラッグ&ドロップを実現しようと四苦八苦しているんですけど、出来ません。


WM_DROPFILES メッセージを受け取る為のプロシージャを登録したいんですが、カスタムクラスの作り方がわかんない〜。


もう諦めて、Delphiでちゃっちゃとインタフェース作ろうかなぁ…。