FC2ブログ

スポンサーサイト 


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--/--

Category: スポンサー広告

TB: --  /  CM: --

top △

帳票フォームでテキストボックス動作・見栄えを個別に 


旧記事掲載:2010/06/07

過去に回答したものに
「帳票フォームでコマンドボタンのCaptionにフィールド値を表示したい」っていうのがありました。

コマンドボタンはレコードごとに制御することはできません。
(コマンドボタンは連結設定するコントロールソースを持ちません)

詳細部分にコマンドボタンを配置しても、1つの設定=全部の設定 になります。


というのが、第一での回答になると思います。


本記事では、テキストボックスでコマンドボタンの動きを真似てみるものになります。
回答したものを含めて、以下の様なメニューを用意しました。(基本フォームは横にあるものになります)

kEnt95_Menu   kEnt95

2007で、おっ、動いた・・・・っていうもの
2000/2003/2007共通で使えそうなもの
サンプルの大半は、テキストボックスを重ねてボタン感を表現しようとしていますが、
条件付き書式を使って見ましょう(立体感はありませんが)・・・というのを「F4」で紹介します。

Accessとは、こう使うものだ・・・等、教育を受けたことはないので、本来どうあるべきか・・・は、わかりません。

やってみて、動いて、使えそうならそれを使う、っていうスタンスです。
 
テーブル「T1」が以下の様になっているとします。
フィールド: an、FA、FB、FC
an はオートナンバー、その他はテキスト型

フォームは、テーブル「T1」を元にウィザードで表形式として作成します。
(フォームは帳票フォームになります)

これを元に、それぞれの確認パターンのフォームを作っていきます。
大半のフォームでは、テキストボックス「FA」の上にテキストボックス「txt1」を重ねることをします。
この重なりを利用して見栄えを作っていきます。
「FA」「txt1」どちらが見えているかわかりやすいように、「FA」に違う背景色を設定しておきます。


フォーム「F1」「F1_1」の作成)
(2007で動いてしまったもの:2000/2003では意図した動きはしません)

テキストボックス「FA」のプロパティで以下を設定します。
立体表示: くぼみ
背景色: #D1EAF0 (水色)
タブストップ: いいえ

この「FA」をコピー&貼り付けして、名前を「txt1」に変更します。
「txt1」を「FA」の真上に配置し、以下プロパティを変更します。
立体表示: 浮き出し
背景色: #FFFFFF (白色)
タブストップ: いいえ

「F1_1」には追加で、ヘッダー部分にフォーカス移動用のテキストボックス「txdummy」を配置します。
タブストップ: いいえ
で、極小にしておきます。

フォーム「F1」に記述したVBA)
Private Function funcMouseDown()
  If (Not Me.NewRecord) Then
    Me.FA.SetFocus
  End If
End Function

Private Function funcMouseUp(bFlg As Boolean)
  If (Me.ActiveControl.Name = "FA") Then
    Me.txt1.SetFocus ' ★
    ' F1_1 では上記1行を以下1行に書き換え
    ' Me.txdummy.SetFocus ' ★
  End If
  If (bFlg) Then
    MsgBox "FA Clickとみなす : " & Me.FA ' ☆
  End If
End Function

Private Sub Form_Load()
  Dim ctl As Control

  On Error Resume Next
  For Each ctl In Me.Controls
    ctl.OnMouseUp = "=funcMouseUp(False)"
  Next
  Me.OnMouseUp = "=funcMouseUp(False)"
  Me.詳細.OnMouseUp = "=funcMouseUp(False)"
  Me.フォームヘッダー.OnMouseUp = "=funcMouseUp(False)"
  Me.フォームフッター.OnMouseUp = "=funcMouseUp(False)"
  Me.FA.OnMouseUp = "=funcMouseUp(True)"
  Me.txt1.OnMouseDown = "=funcMouseDown()"
End Sub

Private Sub Form_Close()
  DoCmd.OpenForm "F_MENU"
End Sub

 
MouseDown/Up イベントを利用し、重なったコントロールの前後関係を入れ替え、
ボタンの様にクリックされたことをくぼみで表現しようとしたものになります。
MouseDown前に Enter / GotFocus イベントが発生しますが、その段階で入れ替えすると
MouseDown/Up イベントが無くなるようなので、押された/離した、を受け取るには
MouseDown時に前後関係入れ替え、MouseUpを待つ・・・と考えてみました。
2000/2003 では、どのタイミングで前後関係を変更しようとも、MouseUpは拾えないようです。
ヘルプ何かをみると、MouseDown/Up は対で扱われるように読み取れますが、
(2007では)上記タイミングで発生する MouseUp は単独で発生しているように見えます。
なので、誰から発生した MouseUp なのかを知るために、全コントロールの MouseUp を拾います。
重ね合わせた下の「FA」から MouseUp が発生するということは、
「FA」が前面に表示されているから!! なので、Clickしたことにしています。

★部分の変更は、
「F1」にて「txt1」をクリックすると処理後、領域外でボタンを離すと前後関係は修復されます。が、
この時、もう一度同じところをクリックすると、へこんだままの状態になります。
MouseUpが拾えてません(発生していないようです:変なタイミングで前後入れ替えていたから?)
そこで、「F1_1」では、
「txt1」「FA」の関係を始めからやり直す意味で「txdummy」へフォーカス移動します。
これにより、続けてクリックしてもポコポコと動きます。


2000/2003でも動かしたいとなると、操作に一手間加えます。
クリックしたいところを1度選んで(クリックして)、さらにクリックします。

これが「F2」系になります。

ボタンの動きとしては、マウスボタンを押して、領域を外れてボタンを離すと、何もなかった・・・
こういう動きをテキストボックスで行おうとすると、MouseDown/Up を利用し、
さらにMouseUpでマウスボタンを離した位置は領域内か判別します。
領域内にあった時には、クリックしたとみなします。
これが「F2」になります。

「F2_1」では、テキストボックスの Click 時イベントをそのまま使います。
この Click 時イベントは、MouseUp がどこで発生しても動作するので、ボタンの動きとはなりません。
(領域外で離してもクリックした、になります)

「F2_2」は、「F2」をコピーし、
重ねていたテキストボックス「FA」「txt1」をずらして配置したものになります。
下側に配置した「FA」の背景色を変えているので、動きはわかりやすいと思います。
背景色が付いたところでマウスボタンを押すと、色が付いた部分がへこみます。
このへこみは全体の見栄えになるので、
クリックした対象以外でへこんでいることを隠すために重ねたことがわかると思います。
(重ねてもフォーカスを得ると前面に出てきます)


「F2」へのVBA記述内容)
Private Sub FA_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  Me.FA.SpecialEffect = 2
End Sub

Private Sub FA_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  Me.FA.SpecialEffect = 1
  If ((X < 0) Or (Y < 0)) Then Exit Sub
  If ((X > Me.FA.Width) Or (Y > Me.FA.Height)) Then Exit Sub
  MsgBox "FA Click : " & Me.FA ' ☆
End Sub

Private Sub txt1_Enter()
  If (Not Me.NewRecord) Then
    Me.FA.SpecialEffect = 1
    Me.FA.SetFocus
  End If
End Sub

Private Sub Form_Close()
  DoCmd.OpenForm "F_MENU"
End Sub

 
「F2_1」へのVBA記述内容)
Private Sub FA_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  Me.FA.SpecialEffect = 2
End Sub

Private Sub FA_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  Me.FA.SpecialEffect = 1
End Sub

Private Sub FA_Click()
  MsgBox "FA Click : " & Me.FA ' ☆
End Sub

Private Sub txt1_Enter()
  If (Not Me.NewRecord) Then
    Me.FA.SpecialEffect = 1
    Me.FA.SetFocus
  End If
End Sub

Private Sub Form_Close()
  DoCmd.OpenForm "F_MENU"
End Sub

 
※ 「F2_2」の記述は、「F2」と同じです。
また、ずらす場合、下側を少し大きくして、余白を設定して・・・
ってやってみましたが、余白部分のクリックでイベントが拾えない、とかありました。
追いかけてみてませんが、何かあるのでしょうか?


MouseDown/Up ではなく、クリックした時点の Enter イベントでのボタンの見栄えを考えてみました。
フォームのタイマー時イベントを使用します。
これが「F3」になります。

タブストップをいいえにしているので、Enter 発生=クリック でしょう・・・から、
「txt1」の Enter 時に、後の「FA」にフォーカス移動させ、TimerInterval を設定します。
タイマー時イベントでは、
クリック時の処理を行い、フォーカスをダミー用「txdummy」へ移動させ、
重ねた前後関係の修復を行います。
でも少し動作に違和感が・・・・・・

「F3」へのVBA記述内容)
Private Sub Form_Timer()
  Me.TimerInterval = 0
  MsgBox "FA Click : " & Me.FA ' ☆
  Me.txdummy.SetFocus
End Sub

Private Sub txt1_Enter()
  If (Not Me.NewRecord) Then
    Me.FA.SetFocus
    Me.TimerInterval = 200
  End If
End Sub

Private Sub Form_Close()
  DoCmd.OpenForm "F_MENU"
End Sub

 
ここまでのフォームでは、ボタンの動作見栄え(クリックしたらへこむ)を真似ようとしてきましたが、
見栄えはいいや・・・。
クリックした時に色だけでも変更して、クリックしましたよ・・・って見せれれば・・・
背景色をVBAで変更する=全体への変更 という意味になるので、
対象のテキストボックス「FA」のみへ設定したい・・・
そういう場合には、条件付き書式が使えるのでは???

ということで、この「F4」では、重ねていた「txt1」は使いません。
単に、テーブル「T1」を元にウィザードで表形式として作成したものへ、追加変更していきます。
条件付き書式用に、
どのレコードを処理しているか格納するテキストボックス「txdummy」を非表示でヘッダー部に配置します。
レコードを一意に特定するものに、オートナンバー「an」を使います。
「FA」への条件付き書式設定は、式として [an]=[txdummy] で背景を赤に。

MouseDown 時に、Me.txdummy = Me.an とし、
MouseUp 時に、Me.txdummy = Null とします。
この値の代入だけでは、条件付き書式処理が動いてくれないので、Me.Recalc で再計算させます。

MouseUp の時には、領域内で離したか判別しています。

「F4」へのVBA記述内容)
Private Sub FA_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  Me.txdummy = Me.an
  Me.Recalc
End Sub

Private Sub FA_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  Me.txdummy = Null
  Me.Recalc
  If ((X < 0) Or (Y < 0)) Then Exit Sub
  If ((X > Me.FA.Width) Or (Y > Me.FA.Height)) Then Exit Sub
  MsgBox "FA Click : " & Me.FA ' ☆
End Sub

Private Sub Form_Close()
  DoCmd.OpenForm "F_MENU"
End Sub

 

サンプルは以下
 バージョン 20002003 (2002)2007
 ファイル kEnt95_2000.zipkEnt95_2003.zipkEnt95_2007.zip
 サイズ 38,77339,31642,701
※ ファイルは zip 形式
※ 2007 以外は、2007 保存時に変換 & 各バージョンで動作確認 & 最適化

関連記事

2011/07/10

Category: サンプルかな

TB: 0  /  CM: 0

top △

この記事に対するコメント

top △

コメントの投稿

Secret

top △

トラックバック

トラックバックURL
→http://kikutips.blog13.fc2.com/tb.php/95-3ff66140
この記事にトラックバックする(FC2ブログユーザー)

top △


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。