PHP-はじめの一歩(その9)Windowsプログラムの作り方(2)

   プログラミング [2010/11/27]
11/25「PHP-はじめの一歩(その8)Windowsプログラムの作り方」の続きです。
前回で、PHPで作成したスクリプトからexeを作成する方法を説明しました。
今日は、ウィンドウを出して、そこからの操作で「何か」させるプログラムを作るための方法です。

■ウィンドウありプログラムの作成
 Window表示部分も言語使用としてはPHPを使う。
 ただし、エントリになるスクリプトの拡張子は、.phpwである必要がある。
 まずは、サンプルスクリプトを参考にして(ぐぐれば、説明してくれているサイトがあります。)、firstwin.phpwを作ってみましょう。

①シンプルなウィンドウプログラムの作成と仮実行
 bamcompileのフォルダの下にfirstwinフォルダを作成し、以下の内容のfirstwin.phpwを作成します。
------------------
<?php
//******************************************************************************
//PHPで作るWindowプログラム その1
//
//******************************************************************************
//****お決まり。必ず必要なインクルード
include "../../WinBinder/phpcode/include/winbinder.php";

//****ウィンドウ作成
//引数は順に、親ウィンドウのハンドル、作成するウィンドウの種類、
//ウィンドウのタイトル、サイズ(w、h)
$mainwin = wb_create_window(NULL, AppWindow, "ようこそ!", 300, 200);

//****コントロール作成(今回の場合はボタン)
//引数は、親ウィンドウハンドル(前の行のリターン)、コントロールの種類、
//コントロールの配置位置(x、y)、サイズ(w、h)、コントロールのID。
wb_create_control($mainwin, PushButton, "ここを押す", 110, 80, 80, 40, 1);

//****ウィンドウへ"process_main"関数をメッセージハンドラとして割り当てている。
wb_set_handler($mainwin, "process_main");

//****ここでウィンドウ のメインループに入る。
//これより後に、実行文を書いてはいけないそうです。
wb_main_loop();

//******************************************************************************
//メッセージハンドラ
//******************************************************************************
//第1引数にウィンドウのハンドラ、
//第2引数にウィンドウ内のオブジェクトに割り当てられたIDが入る。
function process_main($window, $id)
{
  switch ($id)
  {
    case 1:
      //****ポップアップを生成。
      //第1引数はparentウィンドウ、第2引数は表示テキ スト。
      wb_message_box($window, "メッセージボックスです。");
      break;
    case IDCLOSE:
      //****【x】ボタンが押された場合
      //****ウィンドウを終了する。
      wb_destroy_window($window);
      break;
  }
}
?>
------------------

 セーブしたfirstwin.phpwのアイコンが、WinBinderのアイコンになっていれば、その状態で実行することが可能です。ダブルクリックしてみてください。

 タイトル「ようこそ」の画面が表示されれば、成功です。

 もし、一瞬ウィンドウが表示されているようで、すぐ消える場合は、インクルードしているwinbinder.phpのパスが正しくない可能性があるので、見直してください。

 もっと凝ったものを作成したい場合には、WinBinderに含まれるライブラリ仕様を参照する必要があります。
 「スタート」-「すべてのプログラム」-「WinBinder」-「Welcome to WinBinder」を起動します。右図のウィンドウが表示されます。ウィンドウ中の「WinBinder Manual」をクリックして、関数リファレンスを参照してください。
 その他に、WinBinderをインストールしたフォルダにサンプルがありますので、参考にしてください。
 C:\Pleiades_e35\WinBinder\phpcode\examples

②ウィンドウのデザイン
 画面の大きさやカスタムコントロールの配置を最初からデザインしたい場合は、「スタート」-「すべてのプログラム」-「WinBinder」-「Form Editor」で、FormEditorを起動できます。

 FormEditorの使い方の詳細は割愛します。

 仮に下図のようなウィンドウを作ったとします。(使えるコントロール全部貼ってみました。)
1011271_1.png


 FormEditorのメニュー「File」-「Save project」を選択し、「保存する場所」にfirstwinフォルダを選択して、「ファイル名」(プロジェクト名)も「firstwin」として、作ったデザインをセーブします。
 そうすると、firstwinフォルダに、firstwin.prjとfirstwin.form.phpというファイルが作成されます。
 firstwin.form.phpには、デザインしたウィンドウ/コントロールを生成・表示すための、スクリプト(ソース)が含まれています。firstwin.prjは、そのソースをFormEditorで再編集するときのためのデータです。(注:なので、.form.phpを別のエディタで編集した後に、FormEditorで開いてセーブし直すと、他のエディタで編集した内容は無効になります。)


③デザインの取り込み
 次に、このデザインを先のfirstwin.phpwに取り込みましょう。
 firswin.phpwを以下のように編集することで、取り込み可能です。
------------------
<?php
//******************************************************************************
//PHPで作るWindowプログラム その1
//
//******************************************************************************
//****お決まり。必ず必要なインクルード
include "../../WinBinder/phpcode/include/winbinder.php";

//****ウィンドウ作成
//引数は順に、親ウィンドウのハンドル、作成するウィンドウの種類、
//ウィンドウのタイトル、サイズ(w、h)
//****FEで作成したソースに含まれるため、不要。
//$mainwin = wb_create_window(NULL, AppWindow, "ようこそ!", 300, 200);


//****コントロール作成(今回の場合はボタン)
//引数は、親ウィンドウハンドル(前の行のリターン)、コントロールの種類、
//コントロールの配置位置(x、y)、サイズ(w、h)、コントロールのID。
//****FEで作成したソースに含まれるため、不要。
//wb_create_control($mainwin, PushButton, "ここを押す", 110, 80, 80, 40, 1);

//****フォームエディタ(FE)で作られたソース。
//wb_create_windowと_controlが含まれる
include "firstwin.form.php";


//****ウィンドウへ"process_main"関数をメッセージハンドラとして割り当てている。
//****FEで作成されるメインウィンドウIDは、$winmainなので変更。
//wb_set_handler($mainwin, "process_main");
wb_set_handler($winmain, "process_main");


//****ここでウィンドウ のメインループに入る。
//これより後に、実行文を書いてはいけないそうです。
wb_main_loop();

//******************************************************************************
//メッセージハンドラ
//******************************************************************************
//第1引数にウィンドウのハンドラ、
//第2引数にウィンドウ内のオブジェクトに割り当てられたIDが入る。
function process_main($window, $id)
{
  switch ($id)
  {
    //****FEで作成したボタンコントロールのIDがIDC_PUSHBUTTON1001なので変更。
    //case 1:
    case IDC_PUSHBUTTON1001:
      //****ポップアップを生成。
      //第1引数はparentウィンドウ、第2引数は表示テキスト。

      wb_message_box($window, "メッセージボックスです。");
      break;
    case IDCLOSE:
      //****【x】ボタンが押された場合
      //****ウィンドウを終了する。
      wb_destroy_window($window);
      break;
  }
}
?>
------------------

 .phpwをセーブして、前と同じように、ダブルクリックして実行してみましょう。
 以下の画面が表示されれば成功です。
 [PushButton1]をクリックするとメッセージボックスが表示されるはずです。

⑥コンパイルして単独で動作するEXEを作る
 さあ、いよいよ単独動作(配布)可能なEXEの作成になります。
 難解です。しかもデバッカがないので、ミスしても簡単には修正できません。なぜ、動かないのか調査するのが大変なので、ミスしないように注意してください。

⑥-1 コンパイルパラメタ指定ファイルを作る
 以下の内容をfirstwinフォルダ内にfirstwin.bcpという名前でセーブする。
------------------
MAINFILE firstwin.phpw
OUTFILE firstwin.exe
WINDOWED
COMPRESS
DESTINATION /
EMBED firstwin
EMBED firstwin.form.php
DESTINATION include
EMBED C:\Pleiades_e35\WinBinder\phpcode\include\winbinder.php
EMBED C:\Pleiades_e35\WinBinder\phpcode\include\wb_generic.inc.php
EMBED C:\Pleiades_e35\WinBinder\phpcode\include\wb_resources.inc.php
EMBED C:\Pleiades_e35\WinBinder\phpcode\include\wb_windows.inc.php
EXTENSION C:\Pleiades_e35\WinBinder\binaries\php4\ext\php_winbinder.dll
------------------

・MAINFILE:エントリのある.phpwを指定する。
・OUTFILE:コンパイルした結果のEXE名を指定する。
・WINDOWED:ウィンドウプログラムである場合に指定する。これを指定するとEXE起動時にDOSプロンプトを開かない。ただし、デバック段階では、指定しないと、チープではあるがDOSプロンプトでエラーメッセージを確認することができる場合がある。
・COMPRESS:作成されたEXEを圧縮して小さくする指定。
・DESTINATION:.phpwをコンパイルして実行する場合、もともと動作していた環境(includeしていた.php)を仮想的にEXE内部に配置する必要があるらしい、その仮想フォルダを指定する。
・EMBED:先にDESTINATIONで指定した仮想フォルダに配置する(組み込む)インクルードファイルを指定する。
・EXTENSION:DLLをEXE内に取り込む場合に指定する。少なくともphp_winbinder.dllは必要。


⑥-2 スクリプト内のinclude指定の変更
 DESTINATIONとEMBEDで指定する実行時仮想空間に従ってスクリプトのincludeパスを変更する必要がある。
 つまり、⑥-1の指定の場合、EXE実行時には、
  /(ルート)にfirstwin.phpwとfirstwin.form.phpが配置され、
  /includeにwinbinder.php~wb_windows.inc.phpが配置されている
 という意味になるらしい。
 よって、firstwin.phpw内のincludeの指定では、その仮想のフォルダ指定としなければならない。
------------------


//****お決まり。必ず必要なインクルード
//※絶対パス指定だと、exeにしたとき実行時にもそのパスを参照してしまう。
//include "../../WinBinder/phpcode/include/winbinder.php";
include "include/winbinder.php";


------------------
 他の.phpソースをインルードしてその中のfunctionを実行したいような場合もたぶん同様に、.bcpで指定する必要があるはず。
 ちなみに、その辺の意味を知らずに外部.phpのインクルードを行ったが、うまく行かなかった。

⑥-3 コンパイルする
 「■ウィンドウなしのプログラムを作成してみる」で説明したのと同様に、ディスクトップに作成したBamcompileのショートカットを起動する。表示されるDOSプロンプトで以下のコマンドを実行する。
  例)C:\Pleiades_e35\bamcompile1.21> bamcompile firstwin\firstwin.bcp
------------------
C:\Pleiades_e35\bamcompile1.21> bamcompile firstwin\firstwin.bcp

Bambalam PHP EXE Compiler/Embedder 1.21

Using project file: firstwin\firstwin.bcp
Windowed application
Compress
Mainfile: firstwin.phpw
Outfile: firstwin.exe

Embedding firstwin.bcpEncoding and embedding firstwin.form.php
Encoding and embedding firstwin.phpwEmbedding firstwin.prj
Encoding and embedding include/winbinder.php
Encoding and embedding include/wb_generic.inc.php
Encoding and embedding include/wb_resources.inc.php
Encoding and embedding include/wb_windows.inc.php
Embedding php_winbinder.dll and adding it to extension loader
Compressing final exe..
Compression done

firstwin.exe created successfully!

C:\Pleiades_e35\bamcompile1.21> dir
------------------

 コンパイルが成功したら、dirコマンドを打って見ましょう。
 bamcompile1.21の下に、firstwin.exeが作成されているはずです。

⑥-4 動作確認
 本来、単純に作成されたEXEを実行すればいい話なのですが、この環境の場合はそうはいかないようです。
 開発環境だけで動作するexeが作られる場合があるので、以下のことをやって確認してみてください。
 ・WinBinderのインストール先フォルダの名前を一時的に変更する。
  C:\Pleiades_e35\WinBinder → TWinBinder
 ・作ったプログラムのソースフォルダの名前を一時的に変更する。
  C:\Pleiades_e35\bamcompile1.21\firstwin → Tfirstwin
 その状態で、DOSプロンプトから実行してみてください。
 例)C:\Pleiades_e35\bamcompile1.21> firstwin

 ⑥-1、⑥-2の工程が正しく行われていない場合、.phpwを実行すると正しく動作するのに、⑥-4の確認、あるいは、WinBinderを組み込んでいない他のWindowsPCでは動作しない(全く表示しないし、メッセージも出ません。)現象になりますので、十分ご注意ください。

 PHPスクリプト処理レベルでのエラーがある場合は、DOSプロンプトからコマンド入力で機動した場合、かろうじてメッセージが表示されることがあります。


おー 長かった。
次回は、いよいよ目的のプログラムを作ってみたいと思います。

今日はこの辺で。 m(__)m
スポンサーサイト


コメントの投稿

非公開コメント

カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
プロフィール

さるもすなる

Author:さるもすなる
さるです。別HPサイト「さるもすなる」から侵食してきました。 山菜/きのこ、それとタイトルにしたPPバンド籠のことをメインに徒然に・・・・暇を持て余したさるの手仕事:男手芸のブログってことで。

最新記事
最新コメント
月別アーカイブ
カテゴリ
天気予報

-天気予報コム- -FC2-
本家のHPのトップ
山菜や茸の話です
PPバンドの籠作品と作り方です
投稿をお待ちしております



ブログランキング・にほんブログ村へ にほんブログ村 ハンドメイドブログへ



マニュアルのお申し込み



検索フォーム
リンク
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

QRコード
QR