考えた末に
PPバンド籠 [2010/12/30]
先日のさぶい手提げ籠を、だまーーーって眺めてたら、閃きました。
「さぶい!」だけで面白みが無かったので、こんなイタズラをしてみました。

「細かくて伝わらない」ナントカかしら。説明は省きます。
夏っぽいかしらー。
来年どこかで活躍してるといいんだけど。
「さぶい!」だけで面白みが無かったので、こんなイタズラをしてみました。

「細かくて伝わらない」ナントカかしら。説明は省きます。
夏っぽいかしらー。
来年どこかで活躍してるといいんだけど。
スポンサーサイト
さぶいカゴ
PPバンド籠 [2010/12/28]
「これ、どお?」「・・・・・・さぶっ」
メーカさんから頂いた新品バンドが たーくさん あるので、「そろそろ使わないと」と思って、試しに手提げ籠を作ってみたのですが、完全に「時期はずれ」な色合いになってしまいました。
プールとか海に水着とかをいれて持ってくときとかならいいんでしょうか。
作ったけど評判はあまりよくないので、さっそくサンプル(販売)にしちゃいます。
南国に旅行される方、いかがですか~。
他の作りおいてあった試作品も、そろそろ置き場所に困ってきたので、引き取り手募集中です。
http://sarumosunaru.starfree.jp/ppecofrm.html
では、今日はこの辺で。m(__)m
失敗作の手直し
PPバンド籠 [2010/12/25]
以前作ったPPバンンド籠の失敗作として放置してあったものを手直ししました。
(まあ、どれも似たり寄ったりでそんなに失敗/成功の区別ないようなものですが・・・。)
石畳編みショルダーは最初はそうも思わなかったのですが、肩に掛けてみたらズリ落ちるようになったました。
肩に掛けの部分をいつもの取っ手と同じように筒状に作ってしまったからです。

初級編2マニュアルの題材として、作り直しをしたとき、幅の広いバンドタイプに編むことができたので、
そのやり方をフィードバックしました。
もう一点が、クーラーボックス風バスケットの試作品で、これはかつてないくらいにイビツに仕上がってました。
入れようと思っていた発砲スチロール箱は入らないわ、蓋を付けたらフニャフニャだわ、取って付けたらガタガタで自立しないわ、何より見た目がよくなかった。

見るのもイヤだったのですが、捨てるのには忍びなくて。
まずは、取ってを外し、フタも外して・・・・
(1)フタの縁に針金を入れました。
=>これで少しビシっとします。
(2)フタの取り付けは、同じ幅のバンドではなく、半分の幅のバンドで本体に付けました。
=>これで開閉が楽になります。
(3)取っ手は止めにして、「ワッカ」のみ左右に取り付けました。
=>片手で持ち歩くのを断念したということ。
(4)編み目模様と風車風の後付けの模様を前回の「クーラーボックス風バスケット」同様に付けました。
=>んー ちょっとだけ見栄えが良くなったのではないかと。


どーでしょう。
フタは片側づつ開閉できます。持ち手のつもりのワッカも倒せます。
紙オムツ入れとか、タオル入れになりませんかにー。
今日は、この辺で。m(__)m
(まあ、どれも似たり寄ったりでそんなに失敗/成功の区別ないようなものですが・・・。)
石畳編みショルダーは最初はそうも思わなかったのですが、肩に掛けてみたらズリ落ちるようになったました。
肩に掛けの部分をいつもの取っ手と同じように筒状に作ってしまったからです。

初級編2マニュアルの題材として、作り直しをしたとき、幅の広いバンドタイプに編むことができたので、
そのやり方をフィードバックしました。
もう一点が、クーラーボックス風バスケットの試作品で、これはかつてないくらいにイビツに仕上がってました。
入れようと思っていた発砲スチロール箱は入らないわ、蓋を付けたらフニャフニャだわ、取って付けたらガタガタで自立しないわ、何より見た目がよくなかった。

見るのもイヤだったのですが、捨てるのには忍びなくて。
まずは、取ってを外し、フタも外して・・・・
(1)フタの縁に針金を入れました。
=>これで少しビシっとします。
(2)フタの取り付けは、同じ幅のバンドではなく、半分の幅のバンドで本体に付けました。
=>これで開閉が楽になります。
(3)取っ手は止めにして、「ワッカ」のみ左右に取り付けました。
=>片手で持ち歩くのを断念したということ。
(4)編み目模様と風車風の後付けの模様を前回の「クーラーボックス風バスケット」同様に付けました。
=>んー ちょっとだけ見栄えが良くなったのではないかと。


どーでしょう。
フタは片側づつ開閉できます。持ち手のつもりのワッカも倒せます。
紙オムツ入れとか、タオル入れになりませんかにー。
今日は、この辺で。m(__)m
ご注文の品
PPバンド籠 [2010/12/21]
まだ取っ手が付いてませんが、「サンプル籠」です。

いつもどおり、ゴミ(廃バンド)から作っています。
このタイプ、残数0なのに申し込みが来たのは、これで2度目。
網代編み系が割りとよく見えるんでしょうか、ご希望が多いような・・・。
ただ、全く同じものを作るのは、いつにもまして、ちょっと気合が要ります。
でも、お役にたてるのなら、「よろこんでー」なんてね。
今度これの色違いか、斜めバージョンを作ってみようかと思っているところ。
冬だし、そんなにやることもない・・・・のでね。
m(__)m

いつもどおり、ゴミ(廃バンド)から作っています。
このタイプ、残数0なのに申し込みが来たのは、これで2度目。
網代編み系が割りとよく見えるんでしょうか、ご希望が多いような・・・。
ただ、全く同じものを作るのは、いつにもまして、ちょっと気合が要ります。
でも、お役にたてるのなら、「よろこんでー」なんてね。
今度これの色違いか、斜めバージョンを作ってみようかと思っているところ。
冬だし、そんなにやることもない・・・・のでね。
m(__)m
ダヤ子(こんな子に育てた覚えは・・・)
ねこ [2010/12/19]
「んぁ、なにジロジロ見てんだよ。」

「なんか、文句あんのか~。」

「いてこましたろか、くぉら~。!!」

2ヶ月前はこんなんだったのに・・・・。

今は気を使って、撮ってもこの程度。


最近のダヤ子でした。チョビヒゲまでは生やかしてますが、女の子です。
m(__)m

「なんか、文句あんのか~。」

「いてこましたろか、くぉら~。!!」

2ヶ月前はこんなんだったのに・・・・。

今は気を使って、撮ってもこの程度。


最近のダヤ子でした。チョビヒゲまでは生やかしてますが、女の子です。
m(__)m
ZIP書庫内のリストを出力する
プログラミング [2010/12/18]
またまた、PHP(スクリプト言語)でのプログラム作りの話です。
PPバンド籠製作の話でここを訪問された方には、関係ない話で、申し訳ございません。
とあるとき、「ZIP形式のファイルの中身をリスト(紙)に出して、圧縮前の一覧とファイルのサイズや更新日付を確認する」必要性が、出ました。(オマンマのタネの方の用事です。)
よく考えたら、どっかに解凍して比較すれば済む話なんだけど、あったら便利かなーと思って。
それに、隠しファイルになって、圧縮元にゴミデータが紛れてるようなときに、探し当てることもできるし。
(まあ、チョンボしなければ、ぜーんぜん必要ないんですけど。)
で、そんなフリーツールを探して見ました。急いでるときに1時間ほど。
でも、ぴったり来るのが見つからない。無いのかなー。
そのときは、「無い」からあきらめて、仮で解凍して確認することで、決着?させました。
ふと、PHPにリファレンスを眺めてたら、ZIPを作ったり、解凍したりする関数が準備されてるじゃないですか。
「へー作れるんだ」と思ったのが運の尽き。
作り始めたら、ハマッた。
・・・・・・・・・・・・
でも、何とか動くところまで、持ってきました。
この間、覚えたばかりのWinBinderも使って、それっぽいツールを完成させました。
もし、おんなじように、そんなシチュエーションに会われた方がいたら・・・・どうぞ。
HPにソースも含めて公開しました。exeもダウンロードできます。exeのサイズはデカイです。
こちらのページの最後にリンクしてます。
m(__)m
PPバンド籠製作の話でここを訪問された方には、関係ない話で、申し訳ございません。
とあるとき、「ZIP形式のファイルの中身をリスト(紙)に出して、圧縮前の一覧とファイルのサイズや更新日付を確認する」必要性が、出ました。(オマンマのタネの方の用事です。)
よく考えたら、どっかに解凍して比較すれば済む話なんだけど、あったら便利かなーと思って。
それに、隠しファイルになって、圧縮元にゴミデータが紛れてるようなときに、探し当てることもできるし。
(まあ、チョンボしなければ、ぜーんぜん必要ないんですけど。)
で、そんなフリーツールを探して見ました。急いでるときに1時間ほど。
でも、ぴったり来るのが見つからない。無いのかなー。
そのときは、「無い」からあきらめて、仮で解凍して確認することで、決着?させました。
ふと、PHPにリファレンスを眺めてたら、ZIPを作ったり、解凍したりする関数が準備されてるじゃないですか。
「へー作れるんだ」と思ったのが運の尽き。
作り始めたら、ハマッた。
・・・・・・・・・・・・
でも、何とか動くところまで、持ってきました。
この間、覚えたばかりのWinBinderも使って、それっぽいツールを完成させました。
もし、おんなじように、そんなシチュエーションに会われた方がいたら・・・・どうぞ。
HPにソースも含めて公開しました。exeもダウンロードできます。exeのサイズはデカイです。
こちらのページの最後にリンクしてます。
m(__)m
五芒星の編み目
PPバンド籠 [2010/12/12]
いやー、都から数日ぶりに帰ってきたら、車が軽く雪に埋もれてました。
さるの棲む地方も本当に冬になってしまいました。
雨が降ってなかったら、「今年こそはハタハタを釣るぞー」と意気込んで帰ってきたのですが、腰砕け。
根性無しなので、止めました。
「お久にぶり」のPPバンド編みネタです。
「科学体験クラブ府中」というサイトにPPバンドでセパタクローのボールの作り方が掲載されてます。
そのベースが五角形(星型)の編み方なのですが、それをカゴ型にできないか、思案してます。
最初の星型は、六つ目編みの変形みたいな感じだから、すぐできるんですが、
その後が続きません。
んーーーーーー。
定規で図形を描いてみて・・・・・、少しなんか見えたかも。
写真のような単純な星型の「続き」では、無理そうです。

何か形にできるかなー。
閃いたときは、またご紹介いたしましょう。
さるの棲む地方も本当に冬になってしまいました。
雨が降ってなかったら、「今年こそはハタハタを釣るぞー」と意気込んで帰ってきたのですが、腰砕け。
根性無しなので、止めました。
「お久にぶり」のPPバンド編みネタです。
「科学体験クラブ府中」というサイトにPPバンドでセパタクローのボールの作り方が掲載されてます。
そのベースが五角形(星型)の編み方なのですが、それをカゴ型にできないか、思案してます。
最初の星型は、六つ目編みの変形みたいな感じだから、すぐできるんですが、
その後が続きません。
んーーーーーー。
定規で図形を描いてみて・・・・・、少しなんか見えたかも。
写真のような単純な星型の「続き」では、無理そうです。

何か形にできるかなー。
閃いたときは、またご紹介いたしましょう。
PHP-はじめの一歩(その13)Windowsプログラムの作り方(6)
プログラミング [2010/12/04]
いやー「PHP-はじめの一歩」こんなに長くなるとは、思っていませんでした。
すでに半月以上経ってますね。そろそろ終わりにしないと・・ですね。
PHPで作るWindowsアプリの最後です。たぶん今まででも一番ダラダラと説明します。
まずは、「削除」。
行の「削除」のことを忘れていたので、ボタンの追加からです。
ppecomakelist.form.phpの方を変更します。(FEで作成しましたが、既に別のエディタで修正してしまっているので、FEは使えません。)以下の行の追加です。
---------------
if(!defined('IDC_BTDEL')) define('IDC_BTDEL', 1007);
:
wb_create_control($winmain, PushButton, '削除', 440, 220, 50, 25, IDC_BTDEL, 0x00000000, 0, 0);
---------------
上記を追加するにあたって、他のボタンの配置や、コントロールIDなんかも直す必要もあります。
「必ず」と言う訳ではありません。
それで、処理の方は、window_processファンクションに以下を追加しました。
---------------
//****削除ボタンをクリックされたら
case IDC_BTDEL:
//リストボックスの選択された行の番号を取得する。
$curitem = wb_get_selected(wb_get_control($window,IDC_LSSAMPLES));
//wb_message_box($window, "current item=".$curitem);
//行番号が0でなければ削除作業
if ($curitem > 0 && $curitem <= $Line_cnt)
{
//その行を詰める
$i = $curitem - 1;
while ($i < ($Line_cnt-1))
{
$AryList[$i] = $AryList[$i+1];
$i++;
}
$AryList[$Line_cnt-1] = null;
$Line_cnt--;
//リストボックスの行の表示
RenewListBox($window);
//カレント行の再設定
if ($curitem > $Line_cnt) $curitem = $Line_cnt;
wb_set_selected(wb_get_control($window,IDC_LSSAMPLES), $curitem);
}
break;
---------------
で、もって最後に「保存」ボタンの処理を追加します。
---------------
//****保存ボタンをクリックされたら
case IDC_BTSAVE:
//エディットからファイルパス名を取得
$tsvfile = wb_get_text(wb_get_control($window,IDC_EDFILENAME));
//wb_message_box($window, "input file name=".$tsvfile);
//ファイルパスをチェックする。
if ($tsvfile == "" || $tsvfile == null)
{
wb_message_box($window, "保存先ファイルパスを指定してください。",
MY_NAME, WBC_WARNING);
wb_set_focus(wb_get_control($window, IDC_BTSELECT));
break;
}
//ファイルに配列データを書き出す。
SetTsvFile($window, $tsvfile);
break;
---------------
実際のファイル書き込みファンクションは以下のような感じです。
---------------
//******************************************************************************
//ファイル書き出し
// $window ウィンドウオブジェクト
// $tsvfile TSVファイル名
//******************************************************************************
function SetTsvFile($window, $tsvfile)
{
global $AryList; //タブ区切りデータ保存配列
global $Line_cnt; //レコード数
//****出力先ファイルをオープン
//wb_message_box($window, file_exists($tsvfile));
if (file_exists($tsvfile))
{
//****ファイルが既にある場合
//wb_message_box($window, is_file($tsvfile));
if (is_file($tsvfile))
{
$okng = wb_message_box($window, "既にあるファイルに上書きしますか?",
MY_NAME, WBC_OKCANCEL);
if ($okng == false) return;
}
//****ディレクトリだったりしたら
else
{
wb_message_box($window, "出力先にディレクトリ名が指定されています。",
MY_NAME, WBC_WARNING);
return;
}
}
$tsvfp = fopen($tsvfile, "w");
if ($tsvfp == false)
{
wb_message_box($window, "データファイルのオープンに失敗しました。",
MY_NAME, WBC_WARNING);
}
//****オープン成功
else
{
//****1行づつ出力
for ($i=0; $i<$Line_cnt; $i++)
{
$output_dat = implode("\t", $AryList[$i]) . "\r\n"; //配列をTSV行に変換
//wb_message_box($window, $output_dat);
fwrite($tsvfp, $output_dat);
} //end for:write line
fclose($tsvfp);
} //end else:file opened
wb_message_box($window, "ファイルに出力しました。", MY_NAME, WBC_INFO);
return;
} //end fuction
---------------
その他、エラー時のメッセージの追加などで、プログラミングは終了。
ここで、思ったとおりに動くか確認して。
●いよいよコンパイル
まずは、フォルダの中を整理します。
①FEが編集用の.prjを作成しているで、サブフォルダに移動。
②3つのソースファイルは、別のサブフォルダに移動します。
③winbinder.phpのインクルードパスを変更します。
④さらに、Bamcompile用のppecomakelist.bcpを作成します。
⑤そのppecomakelist.bcpを指定してBamcompileを起動するバッチファイルも作成します。
⑥また、作成する.exeにアイコンを割り当てたいので、アイコンも準備します。
フォルダファイル構成は、以下のようにしました。①②
---------------
<Bamcompile1.21>
<ppecomakelist>
compile.bat ・・・⑤
ppecomakelist.bcp ・・・④
<src>
ppecomakelist.phpw ・・・③
ppecomakelist.form.php
ppecoitemedit.form.php
<res>
ppecomakelist.prj
ppecoitemedit.prj
sarumosunaru.ico ・・・⑥
<WinBinder>
:
:
---------------
まずは、ここで動作を確認します。
上記の構成にしたあとでは、ppecomakelist.phpwの中でインクルードしているwinbinder.phpのパスが変わっているので注意が必要。
さらに、.exeにしたときの仮想パスにそのインクルードパスを再度変更します。(この時点でWinBinderのスクリプトとしては動作しなくなります。)③
---------------
//****お決まり。必ず必要なインクルード
//include "../../../WinBinder/phpcode/include/winbinder.php";
include "include/winbinder.php";
---------------
Bamcompile用のppecomakelist.bcpを作成します。以下のような感じ。④
---------------
MAINFILE ppecomakelist.phpw
OUTFILE ppecomakelist.exe
WINDOWED
COMPRESS
DESTINATION /
EMBED src
DESTINATION include
EMBED ..\..\WinBinder\phpcode\include\winbinder.php
EMBED ..\..\WinBinder\phpcode\include\wb_generic.inc.php
EMBED ..\..\WinBinder\phpcode\include\wb_resources.inc.php
EMBED ..\..\WinBinder\phpcode\include\wb_windows.inc.php
EXTENSION ..\..\WinBinder\binaries\php4\ext\php_winbinder.dll
---------------
上記を使ってコンパイルするためのバッチファイル(compile.bat)は以下のような感じ。⑤
---------------
..\bamcompile ppecomakelist.bcp -i:res\sarumosunaru.ico
pause
---------------
ここまでやったら、バッチファイルをダブルクリックしてコンパイルを実行させます。
以下のようなメッセージが出たら、コンパイル成功。
---------------
Bambalam PHP EXE Compiler/Embedder 1.21
Using project file: ppecomakelist.bcp
Windowed application
Compress
Mainfile: ppecomakelist.phpw
Outfile: ppecomakelist.exe
Icon: res\sarumosunaru.ico
Encoding and embedding ppecoitemedit.form.php
Encoding and embedding ppecomakelist.form.php
Encoding and embedding ppecomakelist.phpw
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
Updating icon...done
Compressing final exe..
Compression done
ppecomakelist.exe created successfully!
C:\Pleiades_e35\Bamcompile1.21\ppecomakelist>pause
続行するには何かキーを押してください . . .
---------------
ppecomakelist.exe が出来てます。念のため動作を確認します。

EXEのサイズを見ると615Kもある。
php_winbinder.dllも取り込んでいるんでしょうからしょうがないですかね。
これで、当初予定の以下3つの仕掛け全部が完成です。
(Ⅰ)自分のPC上で、タブ区切り形式のデータを作る(編集更新する)ためのプログラム
(Ⅱ)上記のプログラムで作成したタブ区切りデータを読み込んで、一覧ページを表示するためのPHPスクリプト
(Ⅲ)一覧ページ上の「申し込み」ボタンが押されたときに、「申し込み」ページを表示し、必要事項を入力して「送信」とやったら、さるにその内容の連絡を送るPHPスクリプト
せっかく、ここまでやったので、HPにこの内容を昇格させようと思います。
遠からず、http://nga78n.web.fc2.com/cgiintro.htmにソースダウンロード可能なように載せます。
ご興味がある方は、参考になさってください。(参考にはならないか・・・・)
すでに半月以上経ってますね。そろそろ終わりにしないと・・ですね。
PHPで作るWindowsアプリの最後です。たぶん今まででも一番ダラダラと説明します。
まずは、「削除」。
行の「削除」のことを忘れていたので、ボタンの追加からです。
ppecomakelist.form.phpの方を変更します。(FEで作成しましたが、既に別のエディタで修正してしまっているので、FEは使えません。)以下の行の追加です。
---------------
if(!defined('IDC_BTDEL')) define('IDC_BTDEL', 1007);
:
wb_create_control($winmain, PushButton, '削除', 440, 220, 50, 25, IDC_BTDEL, 0x00000000, 0, 0);
---------------
上記を追加するにあたって、他のボタンの配置や、コントロールIDなんかも直す必要もあります。
「必ず」と言う訳ではありません。
それで、処理の方は、window_processファンクションに以下を追加しました。
---------------
//****削除ボタンをクリックされたら
case IDC_BTDEL:
//リストボックスの選択された行の番号を取得する。
$curitem = wb_get_selected(wb_get_control($window,IDC_LSSAMPLES));
//wb_message_box($window, "current item=".$curitem);
//行番号が0でなければ削除作業
if ($curitem > 0 && $curitem <= $Line_cnt)
{
//その行を詰める
$i = $curitem - 1;
while ($i < ($Line_cnt-1))
{
$AryList[$i] = $AryList[$i+1];
$i++;
}
$AryList[$Line_cnt-1] = null;
$Line_cnt--;
//リストボックスの行の表示
RenewListBox($window);
//カレント行の再設定
if ($curitem > $Line_cnt) $curitem = $Line_cnt;
wb_set_selected(wb_get_control($window,IDC_LSSAMPLES), $curitem);
}
break;
---------------
で、もって最後に「保存」ボタンの処理を追加します。
---------------
//****保存ボタンをクリックされたら
case IDC_BTSAVE:
//エディットからファイルパス名を取得
$tsvfile = wb_get_text(wb_get_control($window,IDC_EDFILENAME));
//wb_message_box($window, "input file name=".$tsvfile);
//ファイルパスをチェックする。
if ($tsvfile == "" || $tsvfile == null)
{
wb_message_box($window, "保存先ファイルパスを指定してください。",
MY_NAME, WBC_WARNING);
wb_set_focus(wb_get_control($window, IDC_BTSELECT));
break;
}
//ファイルに配列データを書き出す。
SetTsvFile($window, $tsvfile);
break;
---------------
実際のファイル書き込みファンクションは以下のような感じです。
---------------
//******************************************************************************
//ファイル書き出し
// $window ウィンドウオブジェクト
// $tsvfile TSVファイル名
//******************************************************************************
function SetTsvFile($window, $tsvfile)
{
global $AryList; //タブ区切りデータ保存配列
global $Line_cnt; //レコード数
//****出力先ファイルをオープン
//wb_message_box($window, file_exists($tsvfile));
if (file_exists($tsvfile))
{
//****ファイルが既にある場合
//wb_message_box($window, is_file($tsvfile));
if (is_file($tsvfile))
{
$okng = wb_message_box($window, "既にあるファイルに上書きしますか?",
MY_NAME, WBC_OKCANCEL);
if ($okng == false) return;
}
//****ディレクトリだったりしたら
else
{
wb_message_box($window, "出力先にディレクトリ名が指定されています。",
MY_NAME, WBC_WARNING);
return;
}
}
$tsvfp = fopen($tsvfile, "w");
if ($tsvfp == false)
{
wb_message_box($window, "データファイルのオープンに失敗しました。",
MY_NAME, WBC_WARNING);
}
//****オープン成功
else
{
//****1行づつ出力
for ($i=0; $i<$Line_cnt; $i++)
{
$output_dat = implode("\t", $AryList[$i]) . "\r\n"; //配列をTSV行に変換
//wb_message_box($window, $output_dat);
fwrite($tsvfp, $output_dat);
} //end for:write line
fclose($tsvfp);
} //end else:file opened
wb_message_box($window, "ファイルに出力しました。", MY_NAME, WBC_INFO);
return;
} //end fuction
---------------
その他、エラー時のメッセージの追加などで、プログラミングは終了。
ここで、思ったとおりに動くか確認して。
●いよいよコンパイル
まずは、フォルダの中を整理します。
①FEが編集用の.prjを作成しているで、サブフォルダに移動。
②3つのソースファイルは、別のサブフォルダに移動します。
③winbinder.phpのインクルードパスを変更します。
④さらに、Bamcompile用のppecomakelist.bcpを作成します。
⑤そのppecomakelist.bcpを指定してBamcompileを起動するバッチファイルも作成します。
⑥また、作成する.exeにアイコンを割り当てたいので、アイコンも準備します。
フォルダファイル構成は、以下のようにしました。①②
---------------
<Bamcompile1.21>
<ppecomakelist>
compile.bat ・・・⑤
ppecomakelist.bcp ・・・④
<src>
ppecomakelist.phpw ・・・③
ppecomakelist.form.php
ppecoitemedit.form.php
<res>
ppecomakelist.prj
ppecoitemedit.prj
sarumosunaru.ico ・・・⑥
<WinBinder>
:
:
---------------
まずは、ここで動作を確認します。
上記の構成にしたあとでは、ppecomakelist.phpwの中でインクルードしているwinbinder.phpのパスが変わっているので注意が必要。
さらに、.exeにしたときの仮想パスにそのインクルードパスを再度変更します。(この時点でWinBinderのスクリプトとしては動作しなくなります。)③
---------------
//****お決まり。必ず必要なインクルード
//include "../../../WinBinder/phpcode/include/winbinder.php";
include "include/winbinder.php";
---------------
Bamcompile用のppecomakelist.bcpを作成します。以下のような感じ。④
---------------
MAINFILE ppecomakelist.phpw
OUTFILE ppecomakelist.exe
WINDOWED
COMPRESS
DESTINATION /
EMBED src
DESTINATION include
EMBED ..\..\WinBinder\phpcode\include\winbinder.php
EMBED ..\..\WinBinder\phpcode\include\wb_generic.inc.php
EMBED ..\..\WinBinder\phpcode\include\wb_resources.inc.php
EMBED ..\..\WinBinder\phpcode\include\wb_windows.inc.php
EXTENSION ..\..\WinBinder\binaries\php4\ext\php_winbinder.dll
---------------
上記を使ってコンパイルするためのバッチファイル(compile.bat)は以下のような感じ。⑤
---------------
..\bamcompile ppecomakelist.bcp -i:res\sarumosunaru.ico
pause
---------------
ここまでやったら、バッチファイルをダブルクリックしてコンパイルを実行させます。
以下のようなメッセージが出たら、コンパイル成功。
---------------
Bambalam PHP EXE Compiler/Embedder 1.21
Using project file: ppecomakelist.bcp
Windowed application
Compress
Mainfile: ppecomakelist.phpw
Outfile: ppecomakelist.exe
Icon: res\sarumosunaru.ico
Encoding and embedding ppecoitemedit.form.php
Encoding and embedding ppecomakelist.form.php
Encoding and embedding ppecomakelist.phpw
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
Updating icon...done
Compressing final exe..
Compression done
ppecomakelist.exe created successfully!
C:\Pleiades_e35\Bamcompile1.21\ppecomakelist>pause
続行するには何かキーを押してください . . .
---------------
ppecomakelist.exe が出来てます。念のため動作を確認します。

EXEのサイズを見ると615Kもある。
php_winbinder.dllも取り込んでいるんでしょうからしょうがないですかね。
これで、当初予定の以下3つの仕掛け全部が完成です。
(Ⅰ)自分のPC上で、タブ区切り形式のデータを作る(編集更新する)ためのプログラム
(Ⅱ)上記のプログラムで作成したタブ区切りデータを読み込んで、一覧ページを表示するためのPHPスクリプト
(Ⅲ)一覧ページ上の「申し込み」ボタンが押されたときに、「申し込み」ページを表示し、必要事項を入力して「送信」とやったら、さるにその内容の連絡を送るPHPスクリプト
せっかく、ここまでやったので、HPにこの内容を昇格させようと思います。
遠からず、http://nga78n.web.fc2.com/cgiintro.htmにソースダウンロード可能なように載せます。
ご興味がある方は、参考になさってください。(参考にはならないか・・・・)
PHP-はじめの一歩(その12)Windowsプログラムの作り方(5)
プログラミング [2010/12/03]
昨日の続きです。
ここで、昨日の説明で不足がありました。
ダイアログを生成した後に、メッセージハンドラを設定しているのですが、その例を示すのを忘れてました。
それが以下です。
---------------
//**********************************************************
//ダイアログメッセージハンドラ
// $window ウィンドウオブジェクト
// $id コントロールID
//**********************************************************
function process_dlg($window, $id, $ctrl, $param1, $param2)
{
switch($id)
{
//****【x】ボタンが押されたら
case IDCLOSE:
wb_destroy_window($window);
break;
}
}
---------------
で、今日はここにダイアログ上の「追加」「更新」ボタンを押したときの処理を追加します。
こんな感じの処理になります。
---------------
//**********************************************************
//ダイアログメッセージハンドラ
// $window ウィンドウオブジェクト
// $id コントロールID
//**********************************************************
function process_dlg($window, $id, $ctrl, $param1, $param2)
{
global $AryList; //タブ区切りデータ保存配列
global $Line_cnt; //レコード数
global $CurLItem; //リストボックスのカレント行番号
global $MWindow; //メインウィンドウID
switch($id)
{
//****追加ボタンが押されたら
case IDC_BTADD:
//「番号」を取り出す。
$sample_no = wb_get_text(wb_get_control($window, IDC_EDNO));
if ($sample_no == "" || $sample_no == null)
{
//「番号」が指定されていないときは、エラーメッセージを出す。
wb_message_box($window, "番号は、必ず指定してください。",
MY_NAME, WBC_WARNING);
wb_set_focus(wb_get_control($window, IDC_EDNO));
break;
}
//その他の入力項目を取り出して、配列にセットする。
$AryList[$Line_cnt] = array();
ReadEditCtrl($window, $Line_cnt);
//行数を更新。リストボックスのカレント行を最終行にセット。
$Line_cnt++;
$CurLItem = $Line_cnt;
//メインウィンドウのリストボックス更新する。
RenewListBox($MWindow);
wb_set_selected(wb_get_control($MWindow,IDC_LSSAMPLES), $CurLItem);
//編集ダイアログを閉じる。
wb_destroy_window($window);
break;
//****更新ボタンが押されたら
case IDC_BTUPDATE:
//「番号」を取り出す。
$sample_no = wb_get_text(wb_get_control($window, IDC_EDNO));
if ($sample_no == "" || $sample_no == null)
{
//「番号」が指定されていないときは、エラーメッセージを出す。
wb_message_box($window, "番号は、必ず指定してください。",
MY_NAME, WBC_WARNING);
wb_set_focus(wb_get_control($window, IDC_EDNO));
break;
}
//その他の入力項目を取り出して、配列にセットする。
ReadEditCtrl($window, $CurLItem-1);
//メインウィンドウのリストボックス更新する。
RenewListBox($MWindow);
wb_set_selected(wb_get_control($MWindow,IDC_LSSAMPLES), $CurLItem);
//編集ダイアログを閉じる。
wb_destroy_window($window);
break;
//****【x】ボタンが押されたら
case IDCLOSE:
wb_destroy_window($window);
break;
} //end switch
} //end function
//***********************************************************
//編集ダイアログから読み込み
// $window ウィンドウオブジェクト
// $line_no データ格納先の配列番号
//***********************************************************
function ReadEditCtrl($window, $line_no)
{
global $AryList; //タブ区切りデータ保存配列
$AryList[$line_no][0] = wb_get_text(wb_get_control($window, IDC_EDNO));
$AryList[$line_no][1] = wb_get_text(wb_get_control($window, IDC_EDFILE));
$AryList[$line_no][2] = wb_get_text(wb_get_control($window, IDC_EDFILEBIG));
$AryList[$line_no][3] = wb_get_text(wb_get_control($window, IDC_EDNAME));
$AryList[$line_no][4] = wb_get_text(wb_get_control($window, IDC_EDSIZEH));
$AryList[$line_no][5] = wb_get_text(wb_get_control($window, IDC_EDSIZEW));
$AryList[$line_no][6] = wb_get_text(wb_get_control($window, IDC_EDSIZED));
$AryList[$line_no][7] = wb_get_text(wb_get_control($window, IDC_EDRSTCNT));
$AryList[$line_no][8] = wb_get_text(wb_get_control($window, IDC_EDMKCNT));
$ng_flg = wb_get_value(wb_get_control($window, IDC_RDBANDNO));
if ($ng_flg == true) $AryList[$line_no][9] = "0";
else $AryList[$line_no][9] = "1";
$AryList[$line_no][10] = wb_get_text(wb_get_control($window, IDC_EDCOMMENT));
$AryList[$line_no][11] = wb_get_text(wb_get_control($window, IDC_EDPRICE));
}
---------------
さあ残りは・・・・「保存」「削除」エラー時の処理などです。
今日はこの辺で。 m(__)m
ダイアログを生成した後に、メッセージハンドラを設定しているのですが、その例を示すのを忘れてました。
それが以下です。
---------------
//**********************************************************
//ダイアログメッセージハンドラ
// $window ウィンドウオブジェクト
// $id コントロールID
//**********************************************************
function process_dlg($window, $id, $ctrl, $param1, $param2)
{
switch($id)
{
//****【x】ボタンが押されたら
case IDCLOSE:
wb_destroy_window($window);
break;
}
}
---------------
で、今日はここにダイアログ上の「追加」「更新」ボタンを押したときの処理を追加します。
こんな感じの処理になります。
---------------
//**********************************************************
//ダイアログメッセージハンドラ
// $window ウィンドウオブジェクト
// $id コントロールID
//**********************************************************
function process_dlg($window, $id, $ctrl, $param1, $param2)
{
global $AryList; //タブ区切りデータ保存配列
global $Line_cnt; //レコード数
global $CurLItem; //リストボックスのカレント行番号
global $MWindow; //メインウィンドウID
switch($id)
{
//****追加ボタンが押されたら
case IDC_BTADD:
//「番号」を取り出す。
$sample_no = wb_get_text(wb_get_control($window, IDC_EDNO));
if ($sample_no == "" || $sample_no == null)
{
//「番号」が指定されていないときは、エラーメッセージを出す。
wb_message_box($window, "番号は、必ず指定してください。",
MY_NAME, WBC_WARNING);
wb_set_focus(wb_get_control($window, IDC_EDNO));
break;
}
//その他の入力項目を取り出して、配列にセットする。
$AryList[$Line_cnt] = array();
ReadEditCtrl($window, $Line_cnt);
//行数を更新。リストボックスのカレント行を最終行にセット。
$Line_cnt++;
$CurLItem = $Line_cnt;
//メインウィンドウのリストボックス更新する。
RenewListBox($MWindow);
wb_set_selected(wb_get_control($MWindow,IDC_LSSAMPLES), $CurLItem);
//編集ダイアログを閉じる。
wb_destroy_window($window);
break;
//****更新ボタンが押されたら
case IDC_BTUPDATE:
//「番号」を取り出す。
$sample_no = wb_get_text(wb_get_control($window, IDC_EDNO));
if ($sample_no == "" || $sample_no == null)
{
//「番号」が指定されていないときは、エラーメッセージを出す。
wb_message_box($window, "番号は、必ず指定してください。",
MY_NAME, WBC_WARNING);
wb_set_focus(wb_get_control($window, IDC_EDNO));
break;
}
//その他の入力項目を取り出して、配列にセットする。
ReadEditCtrl($window, $CurLItem-1);
//メインウィンドウのリストボックス更新する。
RenewListBox($MWindow);
wb_set_selected(wb_get_control($MWindow,IDC_LSSAMPLES), $CurLItem);
//編集ダイアログを閉じる。
wb_destroy_window($window);
break;
//****【x】ボタンが押されたら
case IDCLOSE:
wb_destroy_window($window);
break;
} //end switch
} //end function
//***********************************************************
//編集ダイアログから読み込み
// $window ウィンドウオブジェクト
// $line_no データ格納先の配列番号
//***********************************************************
function ReadEditCtrl($window, $line_no)
{
global $AryList; //タブ区切りデータ保存配列
$AryList[$line_no][0] = wb_get_text(wb_get_control($window, IDC_EDNO));
$AryList[$line_no][1] = wb_get_text(wb_get_control($window, IDC_EDFILE));
$AryList[$line_no][2] = wb_get_text(wb_get_control($window, IDC_EDFILEBIG));
$AryList[$line_no][3] = wb_get_text(wb_get_control($window, IDC_EDNAME));
$AryList[$line_no][4] = wb_get_text(wb_get_control($window, IDC_EDSIZEH));
$AryList[$line_no][5] = wb_get_text(wb_get_control($window, IDC_EDSIZEW));
$AryList[$line_no][6] = wb_get_text(wb_get_control($window, IDC_EDSIZED));
$AryList[$line_no][7] = wb_get_text(wb_get_control($window, IDC_EDRSTCNT));
$AryList[$line_no][8] = wb_get_text(wb_get_control($window, IDC_EDMKCNT));
$ng_flg = wb_get_value(wb_get_control($window, IDC_RDBANDNO));
if ($ng_flg == true) $AryList[$line_no][9] = "0";
else $AryList[$line_no][9] = "1";
$AryList[$line_no][10] = wb_get_text(wb_get_control($window, IDC_EDCOMMENT));
$AryList[$line_no][11] = wb_get_text(wb_get_control($window, IDC_EDPRICE));
}
---------------
さあ残りは・・・・「保存」「削除」エラー時の処理などです。
今日はこの辺で。 m(__)m
PHP-はじめの一歩(その11)Windowsプログラムの作り方(4)
プログラミング [2010/12/01]
このブログに<textarea>を使ってPHPソースを記述しようとしましたが、「自動改行タグ入力」機能が解除できくて・・・・
あきらめました。相変わらずのベタ打ちです。
さて、前回の続きです。なので「前略」で書きます。
▼フォームに配置した「UP」「DOWN」の動作は、
リストボックスの中にリストしたタブ区切りデータのレコードの順番を変えるためにあります。
その前に、前回、「開く」のときに実行するリストボックスに書くレコード(行)の一部を表示する処理をサブルーチン化します。
---------------------------
//****************************************************
//リストボックスの行の表示
// $window ウィンドウオブジェクト
// $tsvfile TSVファイル名
//****************************************************
function RenewListBox($window)
{
global $AryList;
global $Line_cnt;
//レコード内の番号とサンプル名を結合した文字列を作り、配列にする。
$ary_capt = array();
$ary_capt[$i] = "新規";
for ($i=0; $i<$Line_cnt; $i++)
{
$ary_capt[$i+1] = $AryList[$i][0] . " " . $AryList[$i][3];
//wb_message_box($window, "made list caption=".$ary_capt[$i+1]);
}
//作った文字列をリストにセットする。
wb_set_text(wb_get_control($window,IDC_LSSAMPLES), $ary_capt);
} //end finction
----------------
サブルーチン化するに当たって、一旦ファイルから読みこんで配列にセットしたデータは、編集して書き戻すまでとっておく必要があるため、配列と行数をグローバル変数にしました。
簡単に言えば、エントリルーチン(function xxxx{}外)で確保した変数を、ファンクション(function xxxx{})内で、「global 変数名;」とやればいいだけです。
それと、リストボックス内の1行目を新規登録用に「新規」と表示するようにしています。
準備ができたところで、process_main(メッセージハンドラ?)内に以下の処理を加えます。
▼「開く」「UP」「DOWN」ボタンが押されたときのための処理です。
----------------
//****開くボタンをクリックされたら
case IDC_BTOPEN:
//エディットからファイルパス名を取得
$tsvfile = wb_get_text(wb_get_control($window,IDC_EDFILENAME));
//wb_message_box($window, "input file name=".$tsvfile);
//ファイルからデータを読み込んで配列にセットする。
$AryList = GetTsvFile($window, $tsvfile);
//読み込んだ行数を求める。
$Line_cnt = count($AryList);
//wb_message_box($window, "line count=".$Line_cnt);
//リストボックスの行の表示
RenewListBox($window);
break;
//****UPボタンをクリックされたら
case IDC_BTUP:
//リストボックスの選択された行の番号を取得する。
$curitem = wb_get_selected(wb_get_control($window,IDC_LSSAMPLES));
//wb_message_box($window, "current item=".$curitem);
//行番号が1より大きかったら、一つ前の行と入れ替えを行う。
$ary_swapwork = array();
if ($curitem > 1)
{
//一行前と入れ替え
$ary_swapwork = $AryList[$curitem-1];
$AryList[$curitem-1] = $AryList[$curitem-2];
$AryList[$curitem-2] = $ary_swapwork;
//リストボックスの行の表示
RenewListBox($window);
//カレント行の再設定
wb_set_selected(wb_get_control($window,IDC_LSSAMPLES), $curitem-1);
}
break;
//****DOWNボタンをクリックされたら
case IDC_BTDOWN:
//リストボックスの選択された行の番号を取得する。
$curitem = wb_get_selected(wb_get_control($window,IDC_LSSAMPLES));
//wb_message_box($window, "current item=".$curitem);
//行番号が1以上最終行未満なら、一つ後ろ行と入れ替えを行う。
$ary_swapwork = array();
if ($curitem > 0 && $curitem < $Line_cnt)
{
//一行前と入れ替え
$ary_swapwork = $AryList[$curitem-1];
$AryList[$curitem-1] = $AryList[$curitem];
$AryList[$curitem] = $ary_swapwork;
//リストボックスの行の表示
RenewListBox($window);
//カレント行の再設定
wb_set_selected(wb_get_control($window,IDC_LSSAMPLES), $curitem+1);
}
break;
----------------
ここまでは、順調でした。
▼リストボックス内のレコード(行)をダブルクリックしたら、
そのレコードの内容を表示する編集用ダイアログを表示します。
まずは、ダブルクリックをリストボックスで受け取れるようにするためには、このウィンドウ自体を生成する場合のstyleに変更を加える必要がありました。
FEで作成したppecomakelist.form.php内
----------------
$winmain = wb_create_window(null, AppWindow, 'PPバンド籠サンプルリスト編集', WBC_CENTER, WBC_CENTER, 531, 381, 0x00000000, 0);
----------------
を
----------------
$winmain = wb_create_window(null, AppWindow, 'PPバンド籠サンプルリスト編集', WBC_CENTER, WBC_CENTER, 531, 381, WBC_NOTIFY, WBC_DBLCLICK);
----------------
に変更します。
ちなみに、WBC_NOTIFYはFEでも指定可能ですが、WBC_DBLCLICKはFEでは設定できないみたいです。
次に、メッセージハンドラのprocess_mainの引数を増やします。
----------------
function process_main($window, $id)
----------------
を
----------------
function process_main($window, $id, $ctrl=0, $param1=0, $param2=0)
----------------
に変更します。
それで、実際のリスト項目のダブルクリック処理は、
----------------
//****リスト項目をダブルクリックされたら
case IDC_LSSAMPLES:
if ($param1 == WBC_DBLCLICK)
{
//wb_message_box($window, "double click!!".$ctrl.":".$param1.":".$param2);
//ダブルクリックされたリスト番号を取得する。
$CurRec = wb_get_selected(wb_get_control($window,IDC_LSSAMPLES));
if ($CurRec > $Line_cnt) $CurRec = 0;
//編集ダイアログを表示する。
//××FEで作成したwb_create_windowは、親ウィンドウが常に
//××ディスクトップになるため以下のformは必ず修正が必要
include "ppecoitemedit.form.php";
wb_set_handler($winmain, "process_dlg");
//「新規」以外なら、レコードの内容を表示
if ($CurRec > 0)
{
$curitem = $CurRec - 1;
wb_set_text(wb_get_control($winmain, IDC_EDNO), $AryList[$curitem][0]);
wb_set_text(wb_get_control($winmain, IDC_EDNAME), $AryList[$curitem][3]);
wb_set_text(wb_get_control($winmain, IDC_EDFILE), $AryList[$curitem][1]);
wb_set_text(wb_get_control($winmain, IDC_EDFILEBIG), $AryList[$curitem][2]);
wb_set_text(wb_get_control($winmain, IDC_EDSIZEH), $AryList[$curitem][4]);
wb_set_text(wb_get_control($winmain, IDC_EDSIZEW), $AryList[$curitem][5]);
wb_set_text(wb_get_control($winmain, IDC_EDSIZED), $AryList[$curitem][6]);
wb_set_text(wb_get_control($winmain, IDC_EDRSTCNT), $AryList[$curitem][7]);
wb_set_text(wb_get_control($winmain, IDC_EDMKCNT), $AryList[$curitem][8]);
if ($AryList[$curitem][9] == 1)
wb_set_value(wb_get_control($winmain, IDC_RDBANDYES), true);
else
wb_set_value(wb_get_control($winmain, IDC_RDBANDNO), true);
//wb_message_box($window, "get value IDC_RDBANDNO=".$AryList[$curitem][9]
// ."->".wb_get_value(wb_get_control($winmain, IDC_RDBANDNO)));
wb_set_text(wb_get_control($winmain, IDC_EDCOMMENT), $AryList[$curitem][10]);
wb_set_text(wb_get_control($winmain, IDC_EDPRICE), $AryList[$curitem][11]);
}
wb_set_focus(wb_get_control($winmain, IDC_EDNO));
}
//××この処理で単独クリックでメッセージボックスを開いてしまうと
//××ダブルクリックにならない。
//else wb_message_box($window, "??? list-box!:".$ctrl.":".$param1.":".$param2);
break;
----------------
ここで失敗したのが、クリックとダブルクリックが$param1の値で区別できるのかを確かめようとして、
if ($param1 == WBC_DBLCLICK) のときと、そうじゃないときでメッセージボックスを出すようにして試験して見ました。でもどうしてもダブルクリック側のメッセージボックスが出てきません。
つまり最初の1クリック目でメッセージボックスを出してしまうので、ダブルクリックが成立しなくなっていたのですが、そのことに気づくのに結構時間が掛かりました。
その次の躓きが、ダイアログが表示できない問題です。
これは、FEで作成すると、作成されたソースは、ディスクトップを親として作成されているため、こちらのフォームソースも編集しなければ、ならないということです。
FEで作成したppecoitemedit.form.php内
----------------
$winmain = wb_create_window(null, ModalDialog, 'サンプル項目編集', WBC_CENTER, WBC_CENTER, 567, 338, 0x00000000, 0);
----------------
を
----------------
$winmain = wb_create_window($window, ModalDialog, 'サンプル項目編集', WBC_CENTER, WBC_CENTER, 567, 338, 0x00000000, 0);
----------------
に変更します。
これで、空の編集フォーム(モーダルダイアログ)は表示できるようになりました。
次が、選択されたリスト項目のレコード内容を編集フォームに表示する処理です。(if ($CurRec > 0)以降。)
ここでは、RadioButtonの選択設定がwb_set_selectedでできると思っていたら、wb_set_valueだったということで躓きました。
最後に、ダイアログを生成してデータをセットしただけだと、マウスでクリックするまで、編集に取り掛かれないので、初期状態として、最初の「番号」項目にフォーカスをwb_set_focusでセットしています。
この時点で、表示した編集用ダイアログの各コントロールのTabOrderがアッチコッチになっているのに気が付きました。FEでTabOrderはどうも指定できないらしく。
試したところでは、コントロールをcreateした順番に割り当たるようです。
なので、ppecoitemedit.form.phpを再度編集して、TabOrderとしたい順にwb_create_controlの行の順番を変更しました。
でこんな感じの絵が出ます。

あと少しかなー。
でもやっぱり、お手軽なんだけど、デバッガが使えない?のがとっても残念。
今日は、この辺で。 m(__)m
あきらめました。相変わらずのベタ打ちです。
さて、前回の続きです。なので「前略」で書きます。
▼フォームに配置した「UP」「DOWN」の動作は、
リストボックスの中にリストしたタブ区切りデータのレコードの順番を変えるためにあります。
その前に、前回、「開く」のときに実行するリストボックスに書くレコード(行)の一部を表示する処理をサブルーチン化します。
---------------------------
//****************************************************
//リストボックスの行の表示
// $window ウィンドウオブジェクト
// $tsvfile TSVファイル名
//****************************************************
function RenewListBox($window)
{
global $AryList;
global $Line_cnt;
//レコード内の番号とサンプル名を結合した文字列を作り、配列にする。
$ary_capt = array();
$ary_capt[$i] = "新規";
for ($i=0; $i<$Line_cnt; $i++)
{
$ary_capt[$i+1] = $AryList[$i][0] . " " . $AryList[$i][3];
//wb_message_box($window, "made list caption=".$ary_capt[$i+1]);
}
//作った文字列をリストにセットする。
wb_set_text(wb_get_control($window,IDC_LSSAMPLES), $ary_capt);
} //end finction
----------------
サブルーチン化するに当たって、一旦ファイルから読みこんで配列にセットしたデータは、編集して書き戻すまでとっておく必要があるため、配列と行数をグローバル変数にしました。
簡単に言えば、エントリルーチン(function xxxx{}外)で確保した変数を、ファンクション(function xxxx{})内で、「global 変数名;」とやればいいだけです。
それと、リストボックス内の1行目を新規登録用に「新規」と表示するようにしています。
準備ができたところで、process_main(メッセージハンドラ?)内に以下の処理を加えます。
▼「開く」「UP」「DOWN」ボタンが押されたときのための処理です。
----------------
//****開くボタンをクリックされたら
case IDC_BTOPEN:
//エディットからファイルパス名を取得
$tsvfile = wb_get_text(wb_get_control($window,IDC_EDFILENAME));
//wb_message_box($window, "input file name=".$tsvfile);
//ファイルからデータを読み込んで配列にセットする。
$AryList = GetTsvFile($window, $tsvfile);
//読み込んだ行数を求める。
$Line_cnt = count($AryList);
//wb_message_box($window, "line count=".$Line_cnt);
//リストボックスの行の表示
RenewListBox($window);
break;
//****UPボタンをクリックされたら
case IDC_BTUP:
//リストボックスの選択された行の番号を取得する。
$curitem = wb_get_selected(wb_get_control($window,IDC_LSSAMPLES));
//wb_message_box($window, "current item=".$curitem);
//行番号が1より大きかったら、一つ前の行と入れ替えを行う。
$ary_swapwork = array();
if ($curitem > 1)
{
//一行前と入れ替え
$ary_swapwork = $AryList[$curitem-1];
$AryList[$curitem-1] = $AryList[$curitem-2];
$AryList[$curitem-2] = $ary_swapwork;
//リストボックスの行の表示
RenewListBox($window);
//カレント行の再設定
wb_set_selected(wb_get_control($window,IDC_LSSAMPLES), $curitem-1);
}
break;
//****DOWNボタンをクリックされたら
case IDC_BTDOWN:
//リストボックスの選択された行の番号を取得する。
$curitem = wb_get_selected(wb_get_control($window,IDC_LSSAMPLES));
//wb_message_box($window, "current item=".$curitem);
//行番号が1以上最終行未満なら、一つ後ろ行と入れ替えを行う。
$ary_swapwork = array();
if ($curitem > 0 && $curitem < $Line_cnt)
{
//一行前と入れ替え
$ary_swapwork = $AryList[$curitem-1];
$AryList[$curitem-1] = $AryList[$curitem];
$AryList[$curitem] = $ary_swapwork;
//リストボックスの行の表示
RenewListBox($window);
//カレント行の再設定
wb_set_selected(wb_get_control($window,IDC_LSSAMPLES), $curitem+1);
}
break;
----------------
ここまでは、順調でした。
▼リストボックス内のレコード(行)をダブルクリックしたら、
そのレコードの内容を表示する編集用ダイアログを表示します。
まずは、ダブルクリックをリストボックスで受け取れるようにするためには、このウィンドウ自体を生成する場合のstyleに変更を加える必要がありました。
FEで作成したppecomakelist.form.php内
----------------
$winmain = wb_create_window(null, AppWindow, 'PPバンド籠サンプルリスト編集', WBC_CENTER, WBC_CENTER, 531, 381, 0x00000000, 0);
----------------
を
----------------
$winmain = wb_create_window(null, AppWindow, 'PPバンド籠サンプルリスト編集', WBC_CENTER, WBC_CENTER, 531, 381, WBC_NOTIFY, WBC_DBLCLICK);
----------------
に変更します。
ちなみに、WBC_NOTIFYはFEでも指定可能ですが、WBC_DBLCLICKはFEでは設定できないみたいです。
次に、メッセージハンドラのprocess_mainの引数を増やします。
----------------
function process_main($window, $id)
----------------
を
----------------
function process_main($window, $id, $ctrl=0, $param1=0, $param2=0)
----------------
に変更します。
それで、実際のリスト項目のダブルクリック処理は、
----------------
//****リスト項目をダブルクリックされたら
case IDC_LSSAMPLES:
if ($param1 == WBC_DBLCLICK)
{
//wb_message_box($window, "double click!!".$ctrl.":".$param1.":".$param2);
//ダブルクリックされたリスト番号を取得する。
$CurRec = wb_get_selected(wb_get_control($window,IDC_LSSAMPLES));
if ($CurRec > $Line_cnt) $CurRec = 0;
//編集ダイアログを表示する。
//××FEで作成したwb_create_windowは、親ウィンドウが常に
//××ディスクトップになるため以下のformは必ず修正が必要
include "ppecoitemedit.form.php";
wb_set_handler($winmain, "process_dlg");
//「新規」以外なら、レコードの内容を表示
if ($CurRec > 0)
{
$curitem = $CurRec - 1;
wb_set_text(wb_get_control($winmain, IDC_EDNO), $AryList[$curitem][0]);
wb_set_text(wb_get_control($winmain, IDC_EDNAME), $AryList[$curitem][3]);
wb_set_text(wb_get_control($winmain, IDC_EDFILE), $AryList[$curitem][1]);
wb_set_text(wb_get_control($winmain, IDC_EDFILEBIG), $AryList[$curitem][2]);
wb_set_text(wb_get_control($winmain, IDC_EDSIZEH), $AryList[$curitem][4]);
wb_set_text(wb_get_control($winmain, IDC_EDSIZEW), $AryList[$curitem][5]);
wb_set_text(wb_get_control($winmain, IDC_EDSIZED), $AryList[$curitem][6]);
wb_set_text(wb_get_control($winmain, IDC_EDRSTCNT), $AryList[$curitem][7]);
wb_set_text(wb_get_control($winmain, IDC_EDMKCNT), $AryList[$curitem][8]);
if ($AryList[$curitem][9] == 1)
wb_set_value(wb_get_control($winmain, IDC_RDBANDYES), true);
else
wb_set_value(wb_get_control($winmain, IDC_RDBANDNO), true);
//wb_message_box($window, "get value IDC_RDBANDNO=".$AryList[$curitem][9]
// ."->".wb_get_value(wb_get_control($winmain, IDC_RDBANDNO)));
wb_set_text(wb_get_control($winmain, IDC_EDCOMMENT), $AryList[$curitem][10]);
wb_set_text(wb_get_control($winmain, IDC_EDPRICE), $AryList[$curitem][11]);
}
wb_set_focus(wb_get_control($winmain, IDC_EDNO));
}
//××この処理で単独クリックでメッセージボックスを開いてしまうと
//××ダブルクリックにならない。
//else wb_message_box($window, "??? list-box!:".$ctrl.":".$param1.":".$param2);
break;
----------------
ここで失敗したのが、クリックとダブルクリックが$param1の値で区別できるのかを確かめようとして、
if ($param1 == WBC_DBLCLICK) のときと、そうじゃないときでメッセージボックスを出すようにして試験して見ました。でもどうしてもダブルクリック側のメッセージボックスが出てきません。
つまり最初の1クリック目でメッセージボックスを出してしまうので、ダブルクリックが成立しなくなっていたのですが、そのことに気づくのに結構時間が掛かりました。
その次の躓きが、ダイアログが表示できない問題です。
これは、FEで作成すると、作成されたソースは、ディスクトップを親として作成されているため、こちらのフォームソースも編集しなければ、ならないということです。
FEで作成したppecoitemedit.form.php内
----------------
$winmain = wb_create_window(null, ModalDialog, 'サンプル項目編集', WBC_CENTER, WBC_CENTER, 567, 338, 0x00000000, 0);
----------------
を
----------------
$winmain = wb_create_window($window, ModalDialog, 'サンプル項目編集', WBC_CENTER, WBC_CENTER, 567, 338, 0x00000000, 0);
----------------
に変更します。
これで、空の編集フォーム(モーダルダイアログ)は表示できるようになりました。
次が、選択されたリスト項目のレコード内容を編集フォームに表示する処理です。(if ($CurRec > 0)以降。)
ここでは、RadioButtonの選択設定がwb_set_selectedでできると思っていたら、wb_set_valueだったということで躓きました。
最後に、ダイアログを生成してデータをセットしただけだと、マウスでクリックするまで、編集に取り掛かれないので、初期状態として、最初の「番号」項目にフォーカスをwb_set_focusでセットしています。
この時点で、表示した編集用ダイアログの各コントロールのTabOrderがアッチコッチになっているのに気が付きました。FEでTabOrderはどうも指定できないらしく。
試したところでは、コントロールをcreateした順番に割り当たるようです。
なので、ppecoitemedit.form.phpを再度編集して、TabOrderとしたい順にwb_create_controlの行の順番を変更しました。
でこんな感じの絵が出ます。

あと少しかなー。
でもやっぱり、お手軽なんだけど、デバッガが使えない?のがとっても残念。
今日は、この辺で。 m(__)m