過去の桐井戸端BBS (桐ver.9)
28006 コマンドボタンにフォーカスがあるオブジェクトが日時型だったらコマンドを実行するイベントを作りたい さくら 2004/10/21-21:33
さくらです。またお世話になります。

フォームにいくつかのテキストボックスがあります。
日時型や数値型です。
コマンドボタンにフォーカスがあるオブジェクトが日時型だったらコマンドを実行するイベントを作りたいのです。

メソッド呼び出し  戻り値 = &key,&focus.プロパティ属性(属性名)
でよろしいかと思っていますがプロパティ属性()の括弧の中の属性名の指定法がよくわかりません。

恥ずかしいのですが
メソッド呼び出し  戻り値 = &key,&focus.プロパティ属性(日時)
などと指定しても・・・

よろしくお願いします。

28007 Re:オブジェクトの属性を参照 うにん 2004/10/21-23:11
記事番号28006へのコメント
>フォームにいくつかのテキストボックスがあります。
>日時型や数値型です。

テキストボックスに入るのはあくまでも「文字列」だけで、ソースの計算式によってデータ型が決まります。
ソースが項目名なら#項目属性(#項目番号(取得したソースから得た項目名),2)で取得できそうですが、
変数や計算式の場合は自前で管理するしかないような気がします。

28008 データ型の判別は「オブジェクト操作」コマンドです 悲しげ 2004/10/21-23:50
記事番号28006へのコメント
「プロパティ属性」メソッドは「指定したオブジェクトに該当する属性があるかどうか。
また、その属性が変更可能であるかどうか」を調べるだけのことです。
当該テキストのデータ型が何かを調べるのは、「オブジェクト操作」コマンドです。(^^;)

一例としては、
(1)まず全てのテキストにファミリを設定。
(2)その某ファミリに「フォーカス取得」イベントを設定。
(3)その上でkevの記述例
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
手続き定義開始 某ファミリ::フォーカス取得(文字列 &喪失オブジェクト名)
 変数宣言 自動,文字列{&ソース}
 オブジェクト操作 &ソース=&this.データ型
 if(&ソース="日時")
  確認 "これは日時型ですね"
  (あるいは何らかの処理)
 else
  確認 "日時型じゃないですね"
  (あるいは何らかの処理)
 end
手続き定義終了
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

ただ、日時型テキストとそれ以外で異なる処理をさせるのではなく、
単に日時型の場合だけ何らかの処理をさせたいのであれば、
日時型であるかどうかをフォーカス取得後に判断させる必要もなく、
(1)日時型のテキストのみにファミリを設定。
(2)その某ファミリに「フォーカス取得」イベントを設定。
(3)その上でkevの記述例
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
手続き定義開始 某ファミリ::フォーカス取得(文字列 &喪失オブジェクト名)
 確認 "日時にフォーカスあり"
 (あるいは何らかの処理)
手続き定義終了
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
だけでもいいような気が・・・・・。(^^;)


28009 Re:オブジェクトの属性を参照 佐田 守弘 2004/10/22-00:58
記事番号28006へのコメント
さくらさん
質問文からは、何がしたいか理解できないので、外しているかも知れませんが、
ひとまず分る範囲で述べます。

その前に、
 >コマンドボタンにフォーカスがあるオブジェクトが日時型だったらコマンド
 >を実行するイベントを作りたいのです。
は、「コマンドボタンがフォーカスを取得したら」という意味で書いておられるのでしょうか。
もしその意味であるとしたら、コマンドボタンはソース値を持ちませんから、
それが日時型であるかどうかは意味を持ちません。
それとも、コマンドボタンとテキストオブジェクトを並べて作っているとか。
あるいは、コマンドボタンと書いているのはテキストオブジェクトの誤記であるとか。

仮に、「フォーカスを取得したテキストオブジェクトのソース値が日時型だったら、
コマンドを実行するイベントを作りたい。」という意味で書いているとして
話を進めます(多分に外しているかと思いますが)。

●日時型であるかどうかの判断が必要かどうか
これは#28008で悲しげさんも書いておられますが、日時型のテキストオブジェクトだけにイベントを設定すれば済む話です。
しかも、1つの表に日時型の項目が多数ある事は考えにくく、仮に複数あったとしても、
それらに共通の同じ処理を行う事は、ますます考えにくいのです。
多分、実行するコマンドはそれぞれのテキストオブジェクト毎にちがうであろうと思うので、
ファミリも使わず、個別にイベントを設定すれば済むのではないでしょうか。

●どの様なコマンドを実行するのか
実行したいことは様々ですが、大きく分けて、表データを修正したり印刷出力をする様なコマンドか、
単に何かを表示するだけのコマンドかに分けられます。
もし前者であったら、フォーカス取得イベントで実行するのは大変に危ない話ですね。
マウスカーソルがちょっと通っただけで表の値が書き換えられたり、
印刷が始まってしまう等が起きます。
フォーカス取得イベントは、あくまでも表示の変更程度の処理だけに使うべきです。
また表示の変更であっても、データ入力を行うフォームでは使わない方が何かと無難です。

佐田守弘(KS-00119)
28010 Re:オブジェクトの属性を参照 さくら 2004/10/22-07:43
記事番号28006へのコメント
お世話になります。
うにんさん 悲しげさん 佐田さんありがとうございます。
皆さんが理解できる説明をできなくて申し訳ありません。

[品名] [購入日] [数量] の項目で構成される表を編集するフォーム上に品名(文字) 購入日(日時) 数量(数値)の
3つのテキストオブジェクトとコマンドボタンがあります。

行訂正、項目訂正、表示 の状態に係らずフォーカスが購入日オブジェクトにある場合に限り
コマンドボタンをクリックすると[購入日]に変数に格納した任意の日付を入力したいのです。

今のところ
コマンドボタンの「マウス左クリック」イベントに以下の処理を記述しています。

変数宣言 文字列{ &focus }
変数宣言 日時{ &購入日付 }
メソッド呼び出し @フォーム.更新モード設定(0)
メソッド呼び出し @フォーム.フォーカスオブジェクト取得( &focus )
メソッド呼び出し @フォーム.更新モード設定(8)
項目値代入 &focus=&購入日付


フォーカスが購入日テキストオブジェクトにある場合は問題ないのですが
日付を入力するつもりで他の品名や数量のテキストオブジェクトにフォーカスがある時に問題ありなのです。

さらに日付の項目が複数、それに伴ってフォームのテキストオブジェクトも複数あるので
私には複雑になっています。
[品名1] [品名1の購入日] [品名1の数量] [品名2] [品名2の購入日] [品名2の数量] 
に対するテキストオブジェクトもフォーム上にあるという感じです。

お騒がせいたして申し訳ありません。
28011 Re:オブジェクトの属性を参照 アックン 2004/10/22-10:03
記事番号28010へのコメント
さくらさん、こんにちは。
詳しくは他の方が回答してくれると思うので、簡単に書いておきます。

方法1:
>メソッド呼び出し @フォーム.フォーカスオブジェクト取得( &focus )
の次行にif文を入れて、
&focusが t_品名1の購入日や t_品名2の購入日 だったら項目値を代入し、
他のオブジェクトだったら何もしない。

方法2:
t_品名1の購入日、t_品名2の購入日 がフォーカス取得したら、
オブジェクト操作コマンドで、コマンドボタンのフォーカス許可不許可を変更する。
コマンドボタンの表示が薄くなってフォーカスをあてられないようにするわけです。
この方法だと、変更したら元に戻すタイミングもいるので、以外とややこしくて思ったようにいかないときがあります。

他にも方法がある思うし、あとはおまかせします。 >おる

アックン(=^・^=)
28012 Re:データ型の判別は「オブジェクト操作」コマンドです うにん 2004/10/22-12:37
記事番号28008へのコメント
> オブジェクト操作 &ソース=&this.データ型

あれ〜?データ型なんてプロパティはありませんよね?
#未定義のデータ型は?ってことになります。

>ただ、日時型テキストとそれ以外で異なる処理をさせるのではなく、単に
>日時型の場合だけ何らかの処理をさせたいのであれば、日時型であるかど
>うかをフォーカス取得後に判断させる必要もなく、

フォーカスを取得するのはコマンドボタンなので、これの

>手続き定義開始 某ファミリ::フォーカス取得(文字列 &喪失オブジェクト名)
> 確認 "日時にフォーカスあり"
> (あるいは何らかの処理)
>手続き定義終了

&喪失オブジェクト名のソースが日時型のときに処理をしたいのでしょう。

28013 Re:データ型の判別は「オブジェクト操作」コマンドです うにん 2004/10/22-12:48
記事番号28012へのコメント

>> オブジェクト操作 &ソース=&this.データ型
>
>あれ〜?データ型なんてプロパティはありませんよね?

すいません、ありました。
データタブに「ソース」と「編集属性式」しかなかったのですが、いつのまにか
「データ型」と「入力支援ボタン」がでてきました。なんだったんだろ。
ちなみに例によって「データ」のとこは半角です。

>#未定義のデータ型は?ってことになります。

#未定義か""でした^^;;

28014 Re:オブジェクトの属性を参照 悲しげ 2004/10/22-13:04
記事番号28011へのコメント
フォーカスが行っただけで処理が実行されてしまうのは、
佐田さんが仰るようにちょっと危険だし、そのために逐一の確認もするのだとしたら、
何だかいかにもウザイ感じがするので(^^;)、アックンの云う「方法2」がいいとこかな、
と私としては思ったりします。

と云う訳で一例ですが、

手続き定義開始 某ファミリ::フォーカス取得(文字列 &喪失オブジェクト名)
 変数宣言 自動,文字列{&ソース}
 オブジェクト操作 &ソース=&this.データ型
 if(&ソース="日時")
  オブジェクト操作 @b牡丹1.フォーカスの設定="キー操作禁止"\
          ,@b牡丹2.フォーカスの設定="キー操作禁止"\
          ,@b牡丹3.フォーカスの設定="使用不可表示"
 else
  オブジェクト操作 @b牡丹1.フォーカスの設定="使用不可表示"\
          ,@b牡丹2.フォーカスの設定="使用不可表示"\
          ,@b牡丹3.フォーカスの設定="キー操作禁止"
 end
手続き定義終了

その上で、使用可能なボタンだけ必要に応じてクリックして
必要なイベントを実行させるってのはどうでしょう?

>この方法だと、変更したら元に戻すタイミングもいるので、以外と
>ややこしくて思ったようにいかないときがあります。

かも。試してないけど。(^^;)


28018 Re:オブジェクトの属性を参照 さくら 2004/10/23-06:17
記事番号28014へのコメント
おはようございます。さくらです。

コメントをいただいた皆さん。
たいへんありがとうございました。
コマンドボタンの属性(使用不可と自動)を変更することができました。
私のような単純な者は簡単に考えてしまいますが、いろいろな状況を想定していかなければならないと今回思いました。

今後とも宜しくご指導願えたらと思います。

戻る