イベント初心者講座 その7 または The Compleat Angler For Kiri 桐V8の釣魚大全
「かっこう」掲示板の投稿記事から、主に藤野さんとONnojiの問答集を作りました。何か役に立つ話が見つかるカモ?
トップページに戻る あらすじ その1 その2 その3 その4 その5 その6 その7 その8 その9
別のツリーに続きを作りました - ONnoji 2002年02月23日 22時10分別のツリーに続きを作りました - ONnoji 2002年02月23日
22時10分
藤野さんへ
> 通常住所2でエンターを押すと通常は次行に移動します。
> ここで[氏名]が#未定義だったらフォーカスを[氏名]に戻す
> [〒]が#未定義だったらフォーカスを[〒]に戻す。
> としようと思ったのですが
> 手続き定義開始 t住所2::ソース値更新(
)
> if ([氏名]=#U)
> メソッド呼び出し @t氏名.フォーカス設定(
)
> end
> 手続き定義終了
> このようにしても次行にいってしまいました。
> このときはソース値更新は使わないのですか?
そうです。使わないのでありました。(^^v
[ソース値更新]イベントはよく使うイベントですが、ここでは使いません。
<レコードを追加するということ>
さて、レコードつまり行を登録する時の未入力チェックはどのように説明するか少し迷いました。
現在のフォームは[t住所2]テキストボックスのタブオーダーで[次行]にしていますね。
つまり、[t住所2]の属性の[編集]タブの[改行方向]で"次行"を選んであるわけです。
これを"定義順"に変更すると、[t氏名]が未入力の時に、
[ソース値更新]イベントが発生していることが確かめられると思います。
しかし、現状では[ソース値更新]イベントが発生した後で次の行へ移動してしまいます。
だって、次の行へ移動するように仕組んであるのですから当然ですね。(^^v
> このようにしても次行にいってしまいました。
の理由はこういうことです。
さて、現状ではフォームが開いたら[開始時]オプションで行追加の状態になっています。
だから何の疑問もなく行挿入モードになっているわけですね。
メニューフォームから[住所追加フォーム]を開いたのだから行追加できる。
一見すると当たり前のようなのですが、実はこの[住所追加フォーム]を表示モードにすると…
行の追加をするには[行操作]メニュー → [行追加]を選ばなくてはなりません。
※他にも行を追加する方法はありますが…
要するに[住所追加フォーム]では、
終端行で行挿入モードにならなければ行を追加できないということなのです。
そこで次のような心配があります。
フォームが開いた直後にESCキーを押すなど、なんらかの理由で表示モードに移行してしまうと、
行挿入モードにする方法を知らない人は困るだろうな〜…ウ〜ン、きっと困るはずですね。
それなら、(1)行挿入モードにする方法をユーザに事前に教えたり(つまり学習させておく)、
(2)万一のために、行追加に関するコメントをフォームに作る、など考えられますね。
でも、「コメント:行追加できない時には[行操作]メニュー
→ [行追加]」な〜んて、
フォームに表示するのは少し情けないでしょう。
(1)(2)をよ〜く考えてみると、次のことが前提になっているとことに気が付くと思います。
(a)[住所追加フォーム]はユーザは桐の会話操作を学習している
(b)もしも、操作方法がわからなくなった場合には、その場で会話操作を学習してもらう
つまり、桐の会話操作を学習している、または学習することが前提ということになりますね。
概して我々は「桐を学習した者がユーザである」と思っています。
これは自然な感覚なのですが…だってだってどっぷり桐につかりこんでいますからね〜。(^^v
しかし、「桐を学習していない者がユーザである」場合を考えると背筋が寒くなります。
従って「桐を学習していない人でも操作できるフォーム」というのが正しい目標であるわけです。
しかし、この目標を立てると、
今まで簡単に作れたフォームが、より作るのが面倒なフォームになります。
そのために私は少し迷いました。
しかし、何度も検討した結果、
やはり「桐を学習していない人でも操作できるフォーム」を目標しようと思います。
ですから、これから講義する内容は少し面倒なものに写るかもしれません。
しかし、紛れが少なくなるという利点もあるのです。
つまり、現行の会話操作に依存したフォームに比べると、より機能が単純になる利点があります。
現行の会話操作に依存したフォームは簡単に作れますが、
表示・訂正・行挿入といったモードが存在するために、機能としては複雑なものです。
従って、簡単に作れるが複雑な機能を持ったフォームとご理解いただきたいと思います。
さて、前置きはこのくらいにして…次のようにしてください。
(1)まず、[住所追加フォーム]を再定義状態にして、
[ファイル]メニュー → [名前を付けて保存]を選んで、新しいファイル名を付けて下さい。
こうすると、フォーム定義のまま別のフォームを定義できます。
(2)次に、フォーム定義の[変数管理]で局所変数を登録してください。
変数は10個、すべて[局所]、[文字列]です。
m氏名 mふりがな m性別 m連名1 m連名2 m連名3 m〒 m都道府県 m住所 m住所2
※今回の方法ではふりがなの機能は犠牲になりますが、我慢してください。
(3)フォームの属性の[編集対象表]タブの[参照表]と[編集対象表]を空っぽにしてください。
(4)フォームの属性の[イベント]タブの[イベントファイル]を空っぽにしてください。
(5)テキストボックスのソースをすべて変数にしてください。
[t氏名]のソースは &m氏名 …[t住所2]のソースは
&m住所2 という具合です。
(6)フォームの右下に cmd登録 と cmd閉じる
の二つのコマンドボタンを作成してください。
※機能名は後で指定します。
(7)[開始時]オプションで指定したコマンドボタンの機能名を次のように変更してください。
[1]訂正
[2]なし
[3]なし
[4]なし
(8)タブオーダーを txtMassageLine を除き、すべてのテキストボックスを定義順にしてください。
と新しいNULLフォームここまで作ってください。(^^ゞ
とりあえずフォームできました - 藤野 2002年02月24日
22時52分
今日は10時過ぎに帰宅したので、いまフォームを
作りおわりました、
Re:とりあえずフォームできました - ONnoji
2002年02月24日 23時26分
藤野さんへ
タブオーダーで"定義順"にしていただけましたか?
こうすると[Tab]キーを押すと、[t氏名]から順番に進み[cmd閉じる]まで行って、また[t氏名]へ戻るはずです。
[Shift]+[Tab]では逆順になります。
このようにカード形式のフォームではタブオーダーで"定義順"にすると自然な流れになります。
念のためですが、Windowsでは[Enter]の代わりに[Tab]を使うのが基本です。
それらしい動きになったと思いますが、いかがでしょうか?
さて、(1)cmd登録 は次のように設定してください。
機能名 機能パラメータリスト
[1]表示
[2]手続き実行 cmd登録Click
[3]訂正
[4]なし
(2)新しいイベントファイルを指定して、次の一般手続きを作ってください。
手続き定義開始 cmd登録Click( )
表 "address.tbl" ← これはそちらでお使いの表を指定してください。
行追加 [氏名]=&m氏名,…途中省略…,[m住所2]=&m住所2
終了 表 編集対象表
手続き定義終了
(3)cmd閉じる は次のように設定してください。
機能名 機能パラメータリスト
[1]閉じる
[2]なし
[3]なし
[4]なし
と、いうふうに試してみてください。
リプライをお待ちしています。
フォームできましたU - 藤野 2002年02月25日
20時15分
フォームでました。タブで上手く動きます。
ところで、前のフォームでは回数をグループ設定
都道府県を表引きにしていました。
今回はグループ設定を止めてみました。
都道府県は指定できない項目ですとメッセージが出ます。
グループ項目もそのまま&回数でいいのですか?
都道府県は表引きをやめて、イベント内で処理するのが
いいのでしょうか?
Re:フォームできました2 - ONnoji 2002年02月25日
21時30分
藤野さんへ
> フォームでました。タブで上手く動きます。
なるほど、それはよかったです。ひとまず安心しました。
ところで、cmd登録を実行したときはどうですか?
いろいろとご感想があると思います。
そこのところを次への起点にしたいと思っています。
たくさんご感想を述べていただけると、とても嬉しいです。(^^v
> ところで、前のフォームでは回数をグループ設定
> 都道府県を表引きにしていました。
> 今回はグループ設定を止めてみました。
> 都道府県は指定できない項目ですとメッセージが出ます。
> グループ項目もそのまま&回数でいいのですか?
> 都道府県は表引きをやめて、イベント内で処理するのが
> いいのでしょうか?
カード形式のフォームにグループ項目オブジェクトがあるのですか???
グループ項目のオブジェクトは削除してください。
リプライと、たくさんのご感想をお待ちしています。
Re:フォームできました2 - 藤野 2002年02月25日
22時40分
まず、グループオブジェは削除しました。
さて動かしてみてですが
@ [氏名] 特になし
A[ふりがな] ふりがな項目は使えないということなので
今回はこのまま使用
B[性別] 何も出ないので不便 たぶん入力支援ボタンの
使用で解決できる。(男性,女性)
C[〒]
D[都道府県] ここは#表引きをしたいです
E[住所] 表引きが使いたいです。前の表では#表引だと
其の後に番地が追加できなかったので
Fカードを連続で次のカードに入力させたいとおもいますが・・
箇条書きにしましたが、できたらいいなと思うのはこんなところでしょうか?
よろしくおねがいします。
連続で次のカードに入力 - ONnoji 2002年02月26日
12時02分
藤野さんへ
> まず、グループオブジェは削除しました。
> さて動かしてみてですが
> @ [氏名] 特になし
> A[ふりがな] ふりがな項目は使えないということなので
> 今回はこのまま使用
> B[性別] 何も出ないので不便 たぶん入力支援ボタンの
> 使用で解決できる。(男性,女性)
> C[〒]
> D[都道府県] ここは#表引きをしたいです
> E[住所] 表引きが使いたいです。前の表では#表引だと
> 其の後に番地が追加できなかったので
> Fカードを連続で次のカードに入力させたいとおもいますが・・
> 箇条書きにしましたが、できたらいいなと思うのはこんなところでしょうか?
・入力支援ボタンのこと
入力支援ボタンの属性の[操作ボタン]タブを表示して、タイトルバーの[?]ボタンをクリックして、
マウスポインタを[?+矢印]型にして、[リストの種別]をクリックすると説明が読めます。
入力支援ボタンの[リストの種別]には次のものがあります。
(1)ドロップダウンリスト ← ズバリ、"男性女性"の例が載っていますので参考にしてください。
(2)表引き項目
(3)値集合項目
(4)ファイル名選択
(5)フォルダ選択
(6)式入力
(7)モーダル フォーム
(8)カラー値1/カラー値2
ただし、(2)と(3)は今回のようなNULLフォームでは利用できません。
・表引きのこと。
テキストボックスの t都道府県 と t住所 で表引きがしたいとのことですが、
&編集文字列 = #表引き(#trim(&m郵便,3),=,"address.tbl",[郵便],[住所])
な〜んてすると…「KU1033:使用できない関数です」ですと叱られます。
※#表引き( )関数のhtmヘルプも式入力の説明のどちらにも使ない場所が書いてありませんね。
※ですから、どこでも使えると思うのが普通ですね。桐のヘルプはいつもながら罪作りですね。トホホ。
※#表引き( )関数が使えるのは、項目計算式、項目初期値式、置換の計算式、レポートの計算式くらいだったと思います。
次の例を参考にして t都道府県 と t住所 の[入力前]イベントで郵便番号の検索をしてみてください。
手続き定義開始 t住所::入力前(参照 文字列 &編集文字列)
if ( #trim( &m〒,3 ) <> #u )
表 "表引き.tbl" ← これはそちらでお使いの表を指定してください。
検索 [〒] = #trim( &m〒,3 ) ← これはそちらでお使いの表の項目を指定してください。
if ( .not #eof )
* 確認 "検索成功"
&編集文字列 = [住所] ← これはそちらでお使いの表の項目を指定してください。
else
* 確認 "検索不成功"
end
終了 表 編集対象表
end
手続き定義終了
・連続で次のカードに入力のこと
上で説明した「値集合」や「表引き」みたいなことより、こちらの方が重要です。(^^v
おそらく、コマンドボタン:cmd登録 を実行したときに、
テキストボックスの値がクリアされないことおっしゃっているのではないでしょうか?
実は、これに気が付いていただくことを期待していたのです。(^^ゞ
[登録]ボタンを実行したあと、テキストボックスの値を空っぽにするには次のようにしてください。
(1)一般手続き:cmd登録Click( )にコマンドを1行追加してください
手続き定義開始 cmd登録Click( )
表 "address.tbl" ← これはそちらでお使いの表を指定してください。
行追加 [氏名]=&m氏名,…途中省略…,[住所2]=&m住所2
終了 表 編集対象表
手続き実行 prcVariableDefault( ) ← この行を追加
手続き定義終了
(2)新しい一般手続き:prcVariableDefault(
)を作ってください
手続き定義開始 prcVariableDefault( )
&m氏名=#u,&mふりがな=#u,&m性別=#u,&m連名1=#u,&m連名2=#u,&m連名3=#u,&m〒=#u,&m都道府県=#u,&m住所=#u,&m住所2=#u
メソッド呼び出し @t氏名.フォーカス設定(
)
手続き定義終了
(3)新しいコマンドボタン:cmdクリア を作ってください
機能名 機能パラメータリスト
[1]表示
[2]手続き実行 cmdクリアClick
[3]訂正
[4]なし
(4)新しい一般手続き:cmdクリアClick( )を作ってください
手続き定義開始 cmdクリアClick( )
手続き実行 prcVariableDefault( )
手続き定義終了
さて、[クリア]ボタンは無くても差し支えありませんが、
まとめてクリアしたい場合があるので、その練習というつもりで作ってください。
・命名規則のこと
コマンドボタン:cmd登録 → 一般手続き:cmd登録Click
コマンドボタン:cmdクリア → 一般手続き:cmdクリアClick
というコマンドボタンとコマンドボタンから呼び出される一般手続きの対応関係に注目してください。
こうすると、すぐに両者の関係が理解できますよね。これはONnoji流です。(^^ゞ
また、一般手続き:prcVariableDefault( )では接頭辞"prc"を用いて、
コマンドボタンから呼び出す一般手続き"cmd○×△Click"と区別しています。
これもONnoji流です。(^^ゞ
このように命名法に少し工夫をするだけで、イベント処理(.kev)が読みやすくなるということを理解してください。
さて、ここまで試してみてください。
それから、未入力のチェックにトライしましょう。(^^v
ではリプライと、たくさんのご感想をお待ちしています。
Re:連続で次のカードに入力 - 藤野 2002年02月26日
22時45分
ONnoji さん今晩は
イベントは次のようになりました。
名札 メイン
手続き定義開始 cmd登録Click()
表 ”写真展住所録”
行追加 [氏名]=&m氏名,[ふりがな]=&mふりがな,[性別]=&m性別,[連名1]=&m連名1,[連名2]=&m連名2,[連名3]=&m連名3,[〒]=&m〒,[都道府県]=&m都道府県,[住所]=&m住所,[住所2]=&m住所2
終了 表 編集対象表
手続き実行 prcVariableDefault( )
手続き定義終了
手続き定義開始 cmdクリアClick()
手続き実行 prcVariableDefault( )
手続き定義終了
手続き定義開始 prcVariableDefault( )
&m氏名=#U,&mふりがな=#U,&m性別=#U,&m連名1=#U,&m連名2=#U,&m連名3=#U,&m〒=#U,&m都道府県=#U,&m住所=#U,&m住所2=#U
メソッド呼び出し@t氏名.フォーカス設定()
手続き定義終了
手続き定義開始 t都道府県::入力前(参照 文字列 &編集文字列)
if(#trim(&m〒,3)<>#U)
表 ”yubin”
検索 [〒]=#trim(&m〒,3)
if(.not#eof)
&編集文字列=[都道府県名]
else
end
終了 表 編集対象表
end
手続き定義終了
手続き定義開始 t住所::入力前(参照 文字列 &編集文字列)
if(#trim(&m〒,3)<>#U)
表 ”yubin”
検索 [〒]=#trim(&m〒,3)
if(.not#eof)
&編集文字列=[住所]
else
end
終了 表 編集対象表
end
手続き定義終了
いかがでしょう、上手くうごいています。
さて表引きのところは都道府県と住所(〇〇市〇〇町・・・)
と分けてありますので両方とも入力後イベントを設定してみました。
cmd登録とcmdクリアの動きも良く分かりました。
登録は表に書き込んだあとフォームのtオブジェを#Uですね
クリアを押すとフォームはtオブジェを#Uなるほど。
これがしたかったのです。
途中、悩んだところがありました。表に計算を定義していたため
都道府県のところで項目がありませんと冷たいメッセージがでました
しらべたら#表引きで定義してありました。ここを空欄にしたらバッチリでした。
フォームで変数を使い計算とかすればいいのですね。〒の表引きも
まずyubin(番号簿)を立ち上げてからと思っていたら編集表のきり
かえで、できるのですね。
ここまできたらと思うのが表引の直後カーソルが左にありますが
一番右にしたいのです。そうすれば番地等入力が楽だと思うのですが
〇〇市 まるまる町
↑ ↑表引きと同時にここにカーソル
ここにカーソルが が移動できたらなと思います。
きます
フォームは色々できるのですね。今までと違う桐が見えましたし
自分がやりたかったことにちかくなってきました。
変数て便利ですね、少しづつ理解できてきました。
「字下げ」をしないプログラムは読みにくい
- ONnoji 2002年02月27日 10時32分
藤野さんへ
> ONnoji さん今晩は
> イベントは次のようになりました。
コピーペーストの関係からでしょうか???
「字下げ」をしていないプログラムはとても読みにくいですね。
必ず、「字下げ」する習慣を付けてください。m(__)m
また、if の後ろには少なくとも空白文字を入れるようにしてください。m(__)m
if(#trim(&m〒,3)<>#U)→ if (#trim(&m〒,3)<>#U)
論理演算子の後ろには少なくとも空白文字を入れるようにしてください。m(__)m
if(.not#eof) → if (.not #eof)
※これもコピーペーストの関係からでしょうか???
※それともこの掲示板が悪さしているのでしょうか???
ROMしていただいている人もいらっしゃるので、
見やすく書き直したものを以下に示します。
なお、if...else...end は論理構造が分かりやすくなるように行動ダイアグラム表記を用いました。