過去の桐井戸端BBS (桐ver.9)
31221 一覧表フォームでフォーカス値を取得したい ぽち 2006/02/25-10:53
一覧表フォームでフォーカスされたセルの値を取得する方法はないでしょうか?
いろんな方法を試してみたのですが、フォーカスを横に移動させると取得できない
などの問題があり、頭をかかえています。よろしくお願い致します。

31222 Re:一覧表フォームでフォーカス値を取得 宮城 2006/02/25-11:14
記事番号31221へのコメント
ぽちさん、こんにちは。

>いろんな方法を試してみたのですが、フォーカスを横に移動させると取得できない

フォーカスオブジェクト取得とソース値取得で目的は果たせると思うのですが、
どうなるのですか?

31223 Re:一覧表フォームでフォーカス値を取得 ぽち 2006/02/25-11:41
記事番号31222へのコメント
宮城さん、早速のコメントありがとうございます。
先ほどはあまりにもシンプルに書きすぎましたので、
詳細を遅ればせながら書きます。

実は一覧表フォームで年間予定表を作成しています。
Aさん、Bさん、Cさん、…ほか、10人ぐらいの予定があり、
それぞれ[A]、[B]、[C]、…という項目を作成しています。
一番左の項目には[月日]を入れてあります。

一覧表フォームの[A]、[B]、[C]、…、をすべてスクロールなしで1画面に
収めようとするためのオブジェクトの幅は限られて、
予定によっては、すべて表示されないものがあります。

そこで、一覧表フォームのヘッダ部分にテキストオブジェクトをつくり、
そこに
#cond(#項目番号(#u)=1,[A],#項目番号(#u)=2,[B],#項目番号(#u)=3,[C],…)
と計算式を入れ、現在フォーカスされているセルの文字列を表示しようとしました。

丁度、エクセルの上のバーにフォーカスがあるセルの内容が表示されたり、
桐でも、一覧表テーブルの下の方に大きな画面を表示させることで、
内容を表示させることができるようなイメージです。

ところが、縦移動すると、しっかり内容が表示されるのですが、
横移動すると、全く内容が変わりません。

そこで、イベントなどでいろいろやってみますが、上手くいきません。


追伸:
現在宮城さんの言われた方法でもテスト中ですので、追ってご連絡致します。

31224 Re:一覧表フォームでフォーカス値を取得 ぽち 2006/02/25-11:51
記事番号31223へのコメント
>追伸:
>現在宮城さんの言われた方法でもテスト中ですので、追ってご連絡致します。

イベントファイルにて、

手続き定義開始 フォーム::レコード移動(長整数 &行番号,長整数 &総件数,長整数 &明細番号)
 メソッド呼び出し &this.フォーカスオブジェクト取得(&フォーカス)
 条件 (&フォーカス) メソッド呼び出し &フォーカス.ソース値取得(&フォーカス値, 1)
手続き定義終了

のようにしたところ、同じ項目上で上下にフォーカスが移動する場合はフォーカス値を取得できるのですが、
同じレコード上でフォーカスが左右に移動する場合には取得できませんでした。
これに関してはレコード移動なので当たり前の結果なのですが、横に移動したフォーカスを認識でるようなイベントが見あたりません。

31225 Re:一覧表フォームでフォーカス値を取得 宮城 2006/02/25-12:21
記事番号31224へのコメント
31220に書いといたんですが「フォーカス取得」。(^^;;
あのまんまでダメですか?

> #cond(#項目番号(#u)=1,[A],#項目番号(#u)=2,[B],#項目番号(#u)=3,[C],…)

> ところが、縦移動すると、しっかり内容が表示されるのですが、
> 横移動すると、全く内容が変わりません。

これはやったことなかったけど、訂正状態だといけるけど表示状態ではだめってことじゃないですか?

だとすれば、使えるイベントに制約はありますが、

メソッド呼び出し @フォーム.更新モード設定(2)

とやっちゃう。

31220が素直とは思いますけどね。
31226 Re:一覧表フォームでフォーカス値を取得 宮城 2006/02/25-12:37
記事番号31225へのコメント
>だとすれば、使えるイベントに制約はありますが、
>
>メソッド呼び出し @フォーム.更新モード設定(2)
>
>とやっちゃう。

どうも、それで済む話でもなさそうですね。こういうケースでは
テキスト領域2つ作って挙動を確認したりします。つまりもういっちょうのソースは

#項目番号(#u)

なかなか絶妙な・・・。
31227 Re:一覧表フォームでフォーカス値を取得 今村 誠 2006/02/25-17:10
記事番号31222へのコメント
こんにちは、表示状態でのテストしかしていませんが
表示するテキストは、条件選択でなく下記のようなソースにして

#str(#項目属性(#項目番号(#u),0))

フォームのキーダウンイベントで矢印キーを使っている場合だけで良ければ
下記のイベントでは都合悪いでしょうか。

手続き定義開始 フォーム::キーダウン(長整数 &仮想キーコード,長整数 &スキャンコード,
長整数 &フラグ,参照 長整数 &処理中止)
  var Long{&状態=100}
if(&仮想キーコード>36 .and &仮想キーコード<41) /* ↑↓→←きー*/
  method  @フォーム.表示倍率の設定(&状態)
 end
手続き定義終了

31228 Re:一覧表フォームでフォーカス値を取得 ぽち 2006/02/25-18:08
記事番号31227へのコメント
キーダウンイベントを使って確かにフォーカスした値を取得できたのですが、
フォームがものすごくぶれるのと、処理に時間がかかりすぎるのがなんとも…。
フォームのぶれをなくす方法はないでしょうか?
それから、矢印キーを使わずにマウス操作のみで値を取得したいのですが。

31229 Re:一覧表フォームでフォーカス値を取得 ぽち 2006/02/25-18:13
記事番号31228へのコメント
上記の訂正です。

× 矢印キーを使わずにマウス操作のみで値を取得したいのですが。
  ↓
○ 矢印キーとマウスの両方で取得を希望しています。

31230 Re:フォーム明細行セルの値を取得して表示する アックン 2006/02/25-19:04
記事番号31221へのコメント
ぽちさん、こんにちは。
サンプルをアップしました。(V9-2006(V9-2004 sp3)対応)


・フォーム一覧表オブジェクトでフォーカスしているセルの値を取得する
(a)すでに入力されている値を表示する
(b)入力中の文字列を表示する

(a)すでに入力されている値を表示する方法
縦がレコード移動イベント(フォームオブジェクトのイベントです。)
横がフォーカス取得イベント(明細部の各テキストオブジェクトのイベントです。)

フォーカス取得イベントは、ファミリにできます。(設定手順は必ずヘルプ参照)
両イベントの記述は次の2行だけでよかったと思います。

 method &this.ソース値取得( &STR , 2 )
 method @フォーム.変数変更()

サンプルでは、項目[A]〜[F]をソースとするテキスト以外にフォーカスがあるとき
は、ヘッダのテキストに何も表示しないようにするため、次のように if文を追加しています。

 method @フォーム.フォーカスオブジェクト取得( &focus )
 if( &focus="tA" .or&focus="tB" .or&focus="tC" .or&focus="tD"
.or&focus="tE" .or&focus="tF" )
   method &focus.ソース値取得( &txt , 2 ) ← 2 は 1 でも可。0 は不可。
 else
   &txt = "" , &focus = ""
 end
 method @フォーム.変数変更()

なお、フォーム開始時に最初にフォーカスがあたるオブジェクトによっては、
レコード移動イベントでエラーが発生するようなので、これを回避するために、
フォーム開始イベントで一覧表の最初のオブジェクトにフォーカスを設定しています。

手続き定義開始 フォーム::フォーム開始(長整数 &表番号)
 method @t日付.フォーカス設定()
手続き定義終了

(b)入力中の文字列を表示する方法
明細部の各テキストオブジェクトに、編集文字列変更イベントを設定します。

手続き定義開始 tA::編集文字列変更()  ← tA の場合
 method &focus.編集文字列取得( &txt )
 method @フォーム.変数変更()
手続き定義終了

・おまけ
(c)マウスを乗せたセルの値を表示する方法
マウスは明細部の現在行で横移動しかしないですけど。(サンプルには記述していません。)
明細部各テキストのマウスインアウトイベントで可能です。ファミリーにします。

手続き定義開始 ファミリ_1::マウスインアウト(長整数 &フラグ,長整数 &明細番号)
 if( &フラグ )
   method &this.フォーカス設定()
 end
 method @フォーム.フォーカスオブジェクト取得( &focus )
 if( &focus="tA" .or&focus="tB" .or&focus="tC" .or&focus="tD"
.or&focus="tE" .or&focus="tF" )
   method &focus.ソース値取得( &txt , 2 )
 else
   &txt = "" , &focus = ""
 end
 method @フォーム.変数変更()
手続き定義終了

アックン(=^・^=)

31231 Re:フォーム明細行セルの値を取得して表示する アックン 2006/02/25-19:58
記事番号31230へのコメント
誤)
>両イベントの記述は次の2行・・
> method &this.ソース値取得( &STR , 2 )
> method @フォーム.変数変更()

正)
両イベントの記述は次の3行・・
 method @フォーム.フォーカスオブジェクト取得( &focus )
 method &focus.ソース値取得( &txt , 2 )
 method @フォーム.変数変更()

31232 Re:フォーム明細行セルの値を取得して表示する アックン 2006/02/25-20:06
記事番号31230へのコメント
マウスインアウトは下のように書けば、重複がなくていいです。

 if( &フラグ )
   method &this.フォーカス設定()
 end
 if( &this="tA" .or&focus="tB" .or&focus="tC" .or&focus="tD" .or&focus="tE" .or&focus="tF" )
   method &this.ソース値取得( &txt , 2 )
 else
   &txt = "" , &focus = ""
 end
 method @フォーム.変数変更()

31235 Re:フォーム明細行セルの値を取得して表示する ぽち 2006/02/26-09:41
記事番号31230へのコメント
アックンさん、ありがとうございます。

1. フォーカスを取得する項目にファミリを追加。
2. ファミリにフォーカス取得イベントを設定し、イベント内で変数変更を行う。

で、無事に完成致しました。
ただ、横移動と縦移動でイベントを使い分けなくても大丈夫でした。
ご返信くださった皆様、本当にありがとうございました。

31236 Re:フォーム明細行セルの値を取得して表示する ぽち 2006/02/26-09:54
記事番号31235へのコメント
補足なんですが、フォーカスされた項目値を取得する際に

再描画 + 描画更新

でも問題なくできました。

戻る