項目属性一括設定[イベント]

メインメニュー属性設定トップ表定義フォーム|イベント

「イベント」って!!!。

  • イベントの仕組みや発生から処理までその他たくさんありますので、詳しく説明すれば書籍にでもなるような量でしょう。もちろん説明もできませんが、ここで、説明するイベントとは、「 あるきっかけで処理をさせたい内容を記述しておくプログラム」の事で、「イベント全般」でなく、「******.kev」と、限定した説明です。
     
  • 今回はリストの全部は説明できませんが、重要なところだけ簡単に説明します
     
イベントの紹介 ( 41kb ) ダウンロードされた方は見る必要ありません。ただリストが、600行あるだけです。

お断り:「表・フォーム・イベント」ともに、これが最高とか、これしかないということはありません。「ただこれでも動いた」程度にご覧下さい。また、作成のルールは多々あるかと思いますが、どうしても本人の慣れとか癖がでてしまいます。まあ、それはそれでいかな?と、思ってます

イベント作成

  • 通常というより私の作成方法ですが、まずフォームを作成。次にフォームのオブジェクト属性よりイベントタグを選択。イベントファイル名にフォームと同じファイル名を記述して作成します。(フォーム名と同一の方がなにかと便利ですね)
      
  • 2度目以降は、マウス右クリックでイベント定義を選択して修正・追加を行います。
     
  • 変数は、ある程度変数名から内容が想像できる物がいいようです。
    いつも自分が使用する変数は、それはそれでけっこうです。例。ループ変数は、&i と決めてるとか・・・・・
     
  • 「名札 メイン」だけ、置く場所が先頭と決まってるようですが、他のプログラムやルーチンはどの順番でもかまいません。
    仕上がってから整理移動してもいいですね。
     
  • 私の場合、いま作成(編集)してる箇所は常に名札の次にあります。新規追加のプログラムは、また名札の下に作成します。常に割り込みで作成していくとつまり最初に作成した物が一番下にあるわけで、修正の時、上の方に表示されるので楽ですよ。ある程度完成に近づいたら、整理をしますが、この方法はなれ(好み)の問題もありますので、お奨めでなくご紹介だけです。
     

どのような内容にするか?

  • まず、メイン・・・これは本人が必要でなくても勝手にできてしまいますね。通常ここは、変数を定義する場所として使用します
    また、フォームを開くまでの間に行いたい事などもここに書いておくといいでしょう。例。変数読み込みなど
     
  • 対象表の読み込みをする。
    当然ですが、対象表の項目名や条件式を読み込み、現在の定義内容を知ることが必要です。
     
  • 対象表に書き込みをする
    一括登録を行う訳ですから当然書き込み機能は必要です。   
  以上は絶対必要ですね。次に、補助的なプログラム
  • 今回は条件登録文字を変換する必要があります。例:色番号が3は「赤色」、条件式が"正ならば"は「%P%」というように、相互に変換するプログラムです
     
  • また補助として、変数を表示するプログラム。今回は、表の属性をメッセージボックスで表示しています。
     
  • 入力を補助するプログラム。一括登録には関係ないですが、リストから選択入力できたら簡単ですね。
    そして、今回は、ガイドと式をセットにしたリストを使用していますので、そこで、不要部分の削除が必要になってきます。
     
  • その他、コマンドボタンの4行(機能・パラメータ)で書けないものは、プログラムにする必要があります。



それでは説明。

と、いっても600行を総てとは行きませんので・・・ぼつぼつと。

名札 メイン

変数宣言・定数宣言
ここは主に、変数を設定します
今回、色名や条件名を変換する必要がありましたので、定数宣言を行ってます。
定数でも変数でも機能的には(プログラムにミスがなければ)同じですが、他の値を代入する必要が無かったためあえて定数にしました。

定数宣言 文字{&色名="黒,青,赤,紫,緑,水色,黄色,白,チャコールグレイ,ねずみ色,灰色,パールグ・・・・・・"}
定数宣言 文字{&条件意味="正ならば,負ならば,ゼロならば,真ならば,削除行ならば,集計行なら・・・・・・"}
定数宣言 文字{&条件文字="%P%,%N%,%Z%,%A%,%D%,%T%,%TG%,%TL%,%TM%,%TS%,%T1%,%T2%,%・・・・・・"}
 
データパス名 #データパス名,固定=する
これは、必要です。特にプログラムの中で、他のフォルダーを触る様なときは、パス名エラーになってしまいます。
 

手続き定義開始 フォーム::フォーム開始(・・・・・・・)

ここは、あとで、つけた機能です。なにをさせたいか?
最初にフォームを開いたとき・・変数がクリア(または初期化)されてしまうのは、しょうがないのですが、表形式へ移動してまたフォームへ戻ってもそのときクリアされてしまいます。そのためのファイル名だけでも元の変数に値代入しておこうと言うわけです

現在、コマンドボタンの機能は、「表編集」と、なってますが、これを「多重化_表編集」とすれば、変数値は確保できます(というよりクリアされません)。

手続き定義開始 フォーム::レコード移動(・・・・・・・)

ここでは、というより
このプログラム(表)は、他の表を読み込み、属性を定義するだけのプログラムですので、行挿入や削除、まして追加などはありえません。
しかし、カーソルが、終端行(最終行の次の行)にきても、属性設定(入力支援ボタンの利用)が出来てしまいます。誤動作の原因となるため、「if(#終端行)」で、最終行へ移動させています。
top

手続き定義開始 項目読込()

ここでは、表から種々のデータを読み込みます
表全体の属性「#表表示条件( n)」・項目ごとの属性「#項目表示条件( num , n )」・そして、項目の条件式「#項目表示条件( num , 10 )」 を、利用します。表全体の属性はとりあえず変数に代入しておきます。項目の属性は、表の項目へ入れていきます。属性値取得関数
 
if(#項目表示条件(&i,10)<>#u)
ここで、対象表に項目表示条件設定されてるかの判断を行ってます
  
手続き実行 条件分割()
登録されてる条件を、先頭から3個取り出すルーチンです。
 
手続き実行 和訳変換()
もうすこしいい名前がありそうですが。安直な名前しか思い浮かびませんでした。
さて、ここでは先ほどの条件分割で、項目表示条件を3個(内容によりことなる)に分けたものを普通の式に戻します。

条件式例が「%P% CC1 CB2」の場合、「正ならば 文字色1 背景色2」というように
 
  
行追加 [項目名]=&項目名,[データ型]=&データ型,[表示条件]=&表示条件列,・・・・・
ここで、表に追加書き込みを行います。
 
置換 [項項目フォント]=#条件選択(&表項目フォント=[項項目フォント],・・・・・・・
一見何が書いてあるかわからないでしょうね。そうなんです。作る方も・・・です。
>・・・[項項目フォント],""""""+","+""""""+",継承,継承,0,0",1,""""+#対応・・・・
"(ダブルコーテション)の数です。2個連続した「"」を作るのにちょっと苦労しました。そして、書き込みの時は、その2個を書き込む内容が必要なんです。
ところで、本題ですが、この置換はいったい何を行ってるかといいますと、表全体のフォント名の設定と、項目独自のフォント名の設定を比較して、同じなら「{"","",継承,継承,0,0}」というように、書き換えています。

なぜ、そんなことが必要か・・・実は、項目属性や表の属性を関数で取得すると、<継承>となってもフォント名を返してきます。ここで、属性関数で取得した値を対象表に戻すと、本来<継承>だったのに、フォント名が書き込まれてしまいますので、表のフォント名と項目のフォント名が同じ時は<継承>の形に戻したものを書き込むよう事前に修正を行ってます。
 
あとひとつ問題が残っています。実は・・・
項目のフォント名が、<継承>の時は表のフォント名を返します。表のフォント名が<継承>の時は、環境設定のフォント名を返しますが、環境設定のフォント名が取得できません。#環境設定( f )という関数があるようですが、フォント名は対象でないようです。
そこで、表のフォント名は取得出来ますが、環境設定のフォント名が取得出来ないため、書き込み時は表のフォント名は総て「{"","",継承,継承,0,0}」に統一しています。

こんな感じで説明できてるのかな?


手続き定義開始 条件作成()

上記同様、ここも大事なプログラムです。
定義の矛盾や定義漏れ、また色名指定の時RGB形式ではないかのチェックを行います。
 
定義内容の変換(条件式)の場合
式の間違いや、矛盾などはチェックしていません。例 1=2など
まず、設定された式が、桐で準備している条件「正ならば・・〜・・小計6行ならば」かどうかのチェックを行います
>#対応文字列(&条件文字,#対応番号(&条件意味,&条件[&i2]))
#対応番号( str1 , str2 )・・・str2 が、半角コンマで区切られた文字列 str1 の何番目かを返す。
#対応文字列( str , n )・・・半角コンマで区切られた文字列 str から n 番目の部分列を取り出す。

定数宣言で設定された
>定数宣言 文字{&条件文字="%P%,%N%,%Z%,%A%,%D%,%T%,%TG%,%TL%,%TM%,%TS%,%T1%,%T2%,%・・・・・・"}
>定数宣言 文字{&条件意味="正ならば,負ならば,ゼロならば,真ならば,削除行ならば,集計行なら・・・・・・"}
これを使用します
 
このとき、条件式が「負ならば」となってたとします。#対応番号( &条件意味,"負ならば" )を探します
上記の式で2番目というのがわかります。次にこの2番目を利用して、#対応文字列( &条件文字 ,2) により、"%N%" を取り出します。
これで、「負ならば」を「%N%」に置き換えることが出来ます。
 
定義内容の変換(背景色・文字色)の場合
上記同様の計算式を行います。ただ、使用する変数は変わります。
定数宣言 文字{&色名="黒,青,赤,紫,緑,水色,黄色,白,チャコールグレイ,ねずみ色,灰色,パールグ・・・・・・"}
これを使っていろ番号を取得します。
・文字の時は、CC+#文字列(番号)、背景の時は、CB+#文字列(番号)となります
 
定義内容の変換(横位置・縦位置)の場合
これも上記同様です。ただ選択項目が3個しかないためそのまま式に書き込んでます。
横位置の場合・・・"VP"+#文字列(#対応番号("左寄せ,右寄せ,中央揃え",&横位置[&i2]))
縦位置の場合・・・"HP"+#文字列(#対応番号("上詰め,中央揃え,下詰め",&縦位置[&i2]))
 
top

手続き定義開始 条件設定実行()

上記で条件作成で作成された式をいよいよ表へ書き込みます。
まずチェック
条件式作成をここでも呼び出しています。もちろん念のためですが・・・・・
そのほかに、更新する項目にチェックが付いてるか?
そのほかに表全般の属性がクリアされてないかのチェックも一緒に行ってます。
 
一番迷ったのは、条件を登録する項目は決定できても。
 次に、どこに書いてある条件を登録するかです。当然カーソルのある行でしょう。作者の意図する順番に全員が動かすとは限りません。
例:5行目の条件設定式を、1〜3番目の項目設定するとします。5行目にカーソルを置いて、実行ボタンをクリックすると、残念にも「条件を設定する項目がチェックされません」とのメッセージがでます。そこで、あわてて1から3行目までチェックを行います。そして再度実行すると・・・・・
フォーカスは3行目に動いてしまっており、きれいに3行目の条件が書き込まれてしまいます。・・・と、ならないようにご注意を。
 
ところで、余談ではないのですが、
 「表示条件開始」 コマンドをご覧になるとわかりますが、たくさんの設定を記述する必要があります。過去に一度も、使用されたことのない方は、是非一度お試しください。方法は表から履歴を実行し条件保存を実行します。次に履歴.CMDを開いてみてください。「えっっっっっっ!こんなに条件設定するの」というくらい、多いですよ。また、ヘルプをみてもわかりにくいと思いますので是非一度テストを行なわれることをお奨めいたします。
 また、あとひとつ難題が残ってます。実は先ほどの条件の内登録しなかった物は初期値に戻ってしまうと言うことです。弱りましたね
まあ、あまり神経質にならずに進みましょう。
 
表示条件開始〜表示条件終了
実際はここで、表に条件設定をおこなってます。繰り返しの中でとりあえず項目の設定をおこないます。
 
最後に
再度、表示条件開始〜表示条件終了を行います。ここで、表全体の属性を書き込みます

おわかりいただけましたか?「説明を見ると簡単ですね」と、賛同をいただけたら、めでたしめでたし。
top

補助プログラム

これは、特に説明は必要ないかと思います。サーと読み飛ばしてください

手続き定義開始 属性参照()
対象表を定義書き出し後、"項目属性参照.tbl"で表形式で開きます。
 
手続き定義開始 表情報()
対象表のフォント属性他を、表示します。表表情は読み込み時に一緒に取得しています
 
手続き定義開始 sb条件1〜sb条件3::入力支援クローズ(・・・)
条件式を入力支援ボタンのリストから選択した場合のガイド部分の削除を行ってます
 
手続き定義開始 aチェック::マウス左クリック(・・・)
書き込み項目のチェックおよび解除を、行います
 
手続き定義開始 a種別::マウス左クリック(・・・)
項目種別が計算式の項目だけ、チェックを行います
 
手続き定義開始 b複写::マウス左クリック(・・・)
カーソルのある定義内容を変数へ代入します。
  
手続き定義開始 b貼付::マウス左クリック(・・・)
カーソルのある行へ変数から定義内容を貼り付けします。
 
手続き定義開始 消去1〜消去3()
定義内容をクリアします
 
手続き定義開始 sb横位置1〜sb横位置3::入力支援クローズ(・・・)
入力支援ボタンで<継承>を選んだときその値を未定義に置換します
 
手続き定義開始 sb縦位置1〜sb縦位置3::入力支援クローズ(・・・)
入力支援ボタンで<継承>を選んだときその値を未定義に置換します
 
手続き定義開始 フォント情報1〜フォント情報3()
既存の条件設定で、フォント属性が設定されてる場合、その属性をメッセージボックスで表示します
 
top

手続き定義開始 条件分割()

いまだから書けますが条件分割・・・
#項目属性( n,10 )で、取得できます。各条件は半角 ,(コンマ)で区切られています。
もうこれで、#対応文字列で取得できますね・・・と、そんな気分でした。が、無惨にも・・・・・

条件設定例-1.「%P% CC1 CB2,%N% CC3 CB4,%Z% CC5 CB6」
このような場合は、#対応文字列で「%P% CC1 CB2」「,%N% CC3 CB4」「%Z% CC5 CB6」の3個に分けることができます(1)参照。しかし

条件設定例-2.「(#文字位置([項目名],"指定文字")>0 CC1 CB2,%N% CC3 CB4,%Z% CC5 CB6」
同じく、#対応文字列で「(#文字位置([項目名],"指定文字")>0 CC1 CB2」「,%N% CC3 CB4」「%Z% CC5 CB6」と、3個に分けたかったのですが、(2)参照
結果は、「(#文字位置([項目名]」「"指定文字")>0 CC1 CB2」「%N% CC3 CB4」と、なってしまいます。(3)参照

条件設定例-1.「%P% CC1 CB2,%N% CC3 CB4,%Z% CC5 CB6」
(1) %P% CC1 CB2 %N% CC3 CB4 %Z% CC5 CB6
条件設定例-2.「(#文字位置([項目名],"指定文字")>0 CC1 CB2,%N% CC3 CB4,%Z% CC5 CB6」
(2) (#文字位置([項目名],"指定文字")>0 CC1 CB2 %N% CC3 CB4 %Z% CC5 CB6
(3) (#文字位置([項目名] "指定文字")>0 CC1 CB2 %N% CC3 CB4
条件設定最悪の例.「(#部分列([項目名],1,2)=**・・・・・」
  (#部分列([項目名] 1 2

#対応文字列だけでは、条件式の内容によってはうまく行かない場合が、発生します

さいわい、左右の括弧のバランスやコンマの位置、計算式が成り立つかなどのチェックは桐の方で行ってくれますので、わけのわからない式はないと言う条件でイベントの中では簡単なチェックをするだけで対応できました。

方法は、#対応文字列で取得したものを、
>&Lk=#文字数(#文字置換(&条件[&i2],"(",""))・・・・・左の括弧を取り除いた数と
>&Rk=#文字数(#文字置換(&条件[&i2],")",""))・・・・・右の括弧を取り除いた数が
同じになれば一応OK!としています。もし異なれば、さらに次の#対応文字列で取得した式を後ろに加え、再度括弧の計算を行います
もし条件式が「 )( ○○○○○○」このように先頭から、わけのわからぬ式でもOKとなってしまうのが欠点ですが、ここは桐頼みと言うわけで、そんな式はないことを信じます(他人任せです)
 
これで、3個未満はそこまでで、3個以上は3個までの条件を取得しています

手続き定義開始 和訳変換()

条件分割された式は、まだ、「%P% CC1 CB2」このようになってます。これをわかりやすく変換します。条件式作成の反対の処理です。同じような内容ですが、再度説明致します。

定義内容の変換(条件式)の場合
まず、設定された式が、桐で準備している条件「%P%,%N%,%Z%,%A%,%D%,%T%,%TG%,%TL%,・・・・・・"」ないにあるか調べます
もしあったら、その番号を取得して、「正ならば,負ならば,ゼロならば,真ならば,削除行ならば・・・・・」から、意味を取り出します
無かった場合は、そのままの式に両サイドに「( )」を付加します。
  
定義内容の変換(背景色・文字色)の場合
・文字の時は、CC+#文字列(番号)、背景の時は、CB+#文字列(番号)となってますので、それぞれの記号の次の数字(正確には文字)から色名定数「黒,青,赤,紫,緑,水色,黄色,白,チャコールグレイ,ねずみ色,灰色,パールグ・・・・・・」より、対応の色名を取得します
色番号は、「1〜60」の範囲ないです。当然RGB形式には対応していません。また登録されていないはずです。
 
定義内容の変換(横位置・縦位置)の場合
これも上記同様です。ただ選択項目が3個しかないためそのまま式に書き込んでます。
>&横位置[&i2]=#対応文字列("左寄せ,右寄せ,中央揃え",#数値(#部分列(&項目値条件,&項目値横+2,1)))
>&縦位置[&i2]=#対応文字列("上詰め,中央揃え,下詰め",#数値(#部分列(&項目値条件,&項目値縦+2,1)))
 
また、数字の位置(桁)は、「CC・CB」の次にかかれてますが、属性設定の区切りが半角スペースと決まってますのでまとめて2桁取得後#対応文字列でそれぞれ縦・横の位置を計算しています。
 
これを条件数(最大3個)行います。
top
今後の改良点
  1. やはりフォントに対応すべきと思います。他のソフトをかりてフォント名を取得する事はできるのですが、現在の桐だけでは無理ですね
  2. 条件設定はなぜ、3個?。実際試したことはないのですがたぶん10個くらいは出来るのでしょうね?。そんなにたくさん設定する人がいるかどうかは別として
  3. やはり属性を設定したらその場でイメージ表示機能が欲しいのですがスペースの問題も残ってます
  4. 項目名を[項目1][項目2][項目3]のようにつけてあってもうまく変数化できてない部分があります。これは単に私の知識のなさです
ここまでご覧頂きましたかたへ。
どうもつたない文章を最後までご覧頂きまして、ありがとうございます。私は物書きでもなく、プログラム作成を本業としているわけでもない、ただの桐好きユーザーです。説明不足や間違った解釈をしてるところもあるかと思います。ご指摘をいただけましたらさいわいです。
今後ともよろしくお願いいたします 2002.5 【多遊】
top