スポンサーサイト

   スポンサー広告 [--/--/--]
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


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の行の順番を変更しました。

でこんな感じの絵が出ます。
1012011_1.jpg

あと少しかなー。
でもやっぱり、お手軽なんだけど、デバッガが使えない?のがとっても残念。

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


コメントの投稿

非公開コメント

カレンダー
03 | 2017/04 | 05
- - - - - - 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
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。