9
1

More than 1 year has passed since last update.

Delphi で作った複数のフォームを Python で呼び出す方法

Last updated at Posted at 2022-12-22

はじめに

以前の記事(Delphi Advent Calendar 2022 14日目)で Delphi のフォームを Python から使う方法 を載せましたが、その続きとしてサンプルを元に2つのパターンで動かしてみました。

その一つ目として Delphi で作った複数のフォームを Python で呼び出してみます。

前提条件

Delphi のフォームを Python から使う方法 の記事の前提条件と Delphi FMX for Python, Delphi4PythonExporter のインストールが済んでることとします。詳細はそちらの記事をご確認ください。

補足

基本的に情報が少ないため、模索しながら実施してますので、本来の想定された実装の仕方かどうかは分かりません。また、Python についての知識が乏しいため、使い方が正しいかどうか分かりませんので、その点はご了承ください。

Delphi でフォームを作成して Python で実行

Delphi でフォームを作成

まず Delphi で以下のようなアプリを作りました。画像はいらすとやから拝借しましたが、何でも良いです。
image.png
アプリは単純で、Form1 のボタンをクリックすると Form2 を表示します。
(これを Python で同じ動きになるようにしていきます)

デザインはこんな感じです。予め画像は読込んでおきます。
image.png

Unit1.pas, Unit2.pas のコード
Unit1.pas
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Edit,
  FMX.Objects, FMX.StdCtrls, FMX.Controls.Presentation,
  FMX.Layouts, Unit2;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Layout1: TLayout;
    procedure Button1Click(Sender: TObject);
  private
    { private 宣言 }
  public
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show();
end;

end.
Unit2.pas
unit Unit2;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.Objects, FMX.Controls.Presentation, FMX.Layouts;

type
  TForm2 = class(TForm)
    Image1: TImage;
    Layout1: TLayout;
  private
    { private 宣言 }
  public
    { public 宣言 }
  end;

var
  Form2: TForm2;

implementation

{$R *.fmx}

end

Python 用に出力

これをツールの「Export to Python」→ 「Export Entire Current Project」で Python 用のコードを生成します。

以下のファイルができます
image.png

Project1.py, Unit1.py, Unit2.py のコード
Project1.py
from delphifmx import *
from Unit1 import Form1

def main():
    Application.Initialize()
    Application.Title = 'Sample App'
    Application.MainForm = Form1(Application)
    Application.MainForm.Show()
    Application.Run()
    Application.MainForm.Destroy()

if __name__ == '__main__':
    main()
Unit1.py
import os
from delphifmx import *

class Form1(Form):

    def __init__(self, owner):
        self.Layout1 = None
        self.Button1 = None
        self.Image1 = None
        self.LoadProps(os.path.join(os.path.dirname(os.path.abspath(__file__)), "Unit1.pyfmx"))

    def Button1Click(self, Sender):
        pass
Unit2.py
import os
from delphifmx import *

class Form2(Form):

    def __init__(self, owner):
        self.Layout1 = None
        self.Image1 = None
        self.LoadProps(os.path.join(os.path.dirname(os.path.abspath(__file__)), "Unit2.pyfmx"))

ここで「Export Select Forms」で出力すると Unit1.py と Unit2.py で別々のアプリケーションの形でファイルが生成されます。下記の記述が Form1 と Form2 それぞれに入ります。
image.png
また、今回はフォームを2つ作りましたが、フレームが入っていると、どちらを選んでも Export to Python 機能の仕様でエラーになり出力できないようです。

Python コードを編集

まず上記で生成した Unit1.py を編集します。

・Unit1.py
image.png
Unit2 を呼ぶために import と、ボタンクリックイベントの処理を追加します。

Unit1.py の編集後コード
Unit1.py
import os
from delphifmx import *
from Unit2 import Form2

class Form1(Form):

    def __init__(self, owner):
        self.Layout1 = None
        self.Button1 = None
        self.Image1 = None
        self.LoadProps(os.path.join(os.path.dirname(os.path.abspath(__file__)), "Unit1.pyfmx"))

    def Button1Click(self, Sender):
        Form2(Application).Show()

Python 実行

PyScripter で Unit1.py を開いて実行、または、Unit1.py ファイルをダブルクリックで実行します。
image.png
実行すると Form1 が表示され、ボタン押下で Form2 が表示されることが確認できます。

まとめ

以上のように、Delphi で作成して実行したアプリと、同様な表示・動きが Python から実行できました。
この程度ならば、簡単に Delphi のフォームを Python から使うことができます。
また、本記事では FMX で作成しましたが、VCL でも同様に作成できます。

次回の記事ではもう一つのパターンで、Delphi で作ったフォームを Python で使い、そこから Delphi のメソッドを呼んだり、画像データを表示させたりしたいと思います。

追記
本記事の続きとして、もう一つのパターンの使い方を記載しました。
Python から Delphi のメソッドを使う方法

9
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
1