アプリ版:「スタンプのみでお礼する」機能のリリースについて

Accessユーザーフォームでコマンドボタンのcaptionについてですが

Aテーブルを基に表記式でフォームを作成し、コマンドボタンを配置します。
この際、コマンドボタンのcaptionをAテーブルのフィールド値を表示したいのですが
可能でしょうか?

フォームを開く際に
Private Sub フォーム_Load()
Me!コマンド1.Caption = Me![フィールド1]
End Sub
とイベントを発生させましたが、全てのボタンのCaptionがAテーブル1行目、
フィールド1の値で表示されてしまいます。
Dlookupを使用しても結果か同じでしたので、
フォームをLoadした時のMe![フィールド1]の値がAテーブル1行目の値であり
その値でCaptionが設定されていであろうことはなんとなくわかるのですが
何をどうすればいいか行き詰ってしまいました。

どんなやり方があるのかお教えください。

A 回答 (8件)

#5です



たびたびすみません。

> 「クリック感」が欲しい・・・
ということの様ですので、
いっそのこと、コマンドボタンはなくしてテキストボックスだけにしてみますか。
(コマンドボタンは飾りだったので)


変更手順)

・コマンドボタンは、削除しておきます。

・テキストボックス「txt1」のプロパティで「立体表示」を「浮き出し」に設定します。
 背景スタイルは「普通」、タブストップは「いいえ」
「txt1」のコントロールソースは [フィールド1] にしておきます。

・「txt1」をコピー&貼り付け後、名前を「txt2」とします。
「txt2」のラベル部分は要らないので削除しておきます。
「txt2」を「txt1」の上に重ね、「txt2」を最前面にしておきます。

・「txt2」のマウスボタンクリック時、
「txt1」のマウスボタン解放時、クリック時に処理を記述していきます。


Private Sub txt2_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  Me.txt1.SpecialEffect = 2
  Me.txt1.SetFocus
End Sub

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

Private Sub txt1_Click()
  Me.txdummy.SetFocus
  DoCmd.OpenForm "起動フォーム名", , , "抽出条件"
End Sub


※ 上側のテキストボックス「txt2」のマウスボタンクリック時に
「txt1」の立体表示を「くぼみ」に変更し、フォーカスを移動します。
フォーカスを得た「txt1」は前面に出てきます。
マウスボタン解放時に立体表示を「浮き出し」に戻します。

その後にクリック時が発生するので、フォーカスをダミーに移動し、フォームを起動します。
フォーカスが他に移ったことにより、「txt2」がまた最前面に出てくることになります。


※※ ここで難点が1つ
テキストボックスの上で、マウスボタンをクリック/離すで、コマンドボタンの様な動きになりますが、
クリックしたまま、その領域を外れて離した時には、へこんだ表示のままとなってしまいます。


※※ なぜコントロールを重ねることをするのか。
コントロールソースが設定されていれば、表示内容は行(レコード)ごとに違くなるのですが、
見栄えに関するものを変更すると全体に影響があるようです。
なので、見栄えを変更した時に操作対象の行(レコード)以外も同じように変わっていることを隠すためにしています。
下に配置して隠していても、フォーカスを得ると前面に出てくることを利用しています。

上記の「txt1」「txt2」を重ねないで操作されるとわかると思います。


2007で動きを確認してみましたが・・・
    • good
    • 0
この回答へのお礼

何度も本当にありがとうございます。

こちらの環境はXP+Access2002or2003になります。
これを最初に書かなかったことでお手間を取らせまして申し訳ありません。

最終案は以下の通りです。
(30246kikuさんの案をほぼコピーですが・・・)
txt1だけ使用、txt2は使わない。
txt1は「浮き出し」

Private Sub txt1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Me.txt1.SpecialEffect = 2
Me.txt1.SetFocus
End Sub

Private Sub txt1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
明細フォームを開く処理
Me.txt1.SpecialEffect = 1 'ここに入れました。
end sub

使い勝手によっては明細フォームのload時に
forms![表形式フォーム]![txt1].SpecialEffect = 1
でもいいかなと。

結局、30246kikuさんの
>まず、コマンドボタンはレコードごとに制御することはできません。
この指摘が全てだと思います。表形式フォームである以上
クリックしたときに一覧フォームのtxt1ボタンが全て「くぼみ」状態になってしまうのは
仕方がないと思います。

考え方からソースアップまで、手取り足取り状態で、、、本当にありがとうございます。
ご本人目の前なら、正座して感謝したいぐらいです。

お礼日時:2010/05/31 11:31

【つづき】



動作を見ての余談)

MouseUp の動作をヘルプで見ると、前述の様な動作は想定していないように見えます。
MouseDown 前に Enter / GotFocus イベントが発生しますが、例えば Enter 時に、
前面/背面の関係を変更すると MouseDown/MouseUp イベントは無くなるようです。
MouseDown 時に前面/背面の関係を変更すると
MouseUp イベントは前面の情報で発生する様ですが、領域を外れてボタンを離した場合には
MouseUp イベントは他のコントロール情報で発生する様です。
前面/背面を変更せずにクリックすると、MousuUp イベントはいくら領域を外れていても
そのテキストボックスの情報として上がるようです。
領域を外れているかは、パラメータで得られる X, Y で判別するしかないようです。

2000/2003では、前記では動きませんでした。


操作方法を変えてもいいのなら、以下の様な方法でも

操作)対象のところをダブルクリックする(遅いダブルクリックでも)

「txt2」の Enter時に、「txt1」を前面へ(1つ目のクリックで)
次に発生するクリック(MouseDown/Up で立体表示変更)で、やりたい処理を、
(MouseUp で領域内にあるか判別して)
「txt1」の MouseUp / Click 時には、「txt2」へフォーカス移動できない様です。
(2000/2003で確認)
なので、同じところをクリックする分には、1回のクリックでボタンの様な動きになります。

確認してみた内容は、以下です。

PPrivate Sub txt1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  Me.txt1.SpecialEffect = 2
End Sub

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

Private Sub txt2_Enter()
  Me.txt1.SpecialEffect = 1
  Me.txt1.SetFocus
End Sub


また、#5ではコマンドボタンの上にテキストボックスを重ねていました。
テキストボックスを小さめにして重ねた時には以下の様な方法もあると思いますが、
コマンドボタン部分をクリックされるとそれなりに動くのですが、
テキストボックスをクリックされた時には、もう一度クリックしないといけません。

Private Sub btn1_Click()
  MsgBox "btn1 Click" ' ☆
End Sub

Private Sub btn1_Enter()
  Me.btn1.Caption = Me.txt1
End Sub

Private Sub txt1_Enter()
  Me.btn1.SetFocus
End Sub


同じ場所でやろうとすることが、無理があるのでしょうか。
ここは素直に、Caption は固定で隣にコマンドボタンを配置した方が楽なのかもしれません。
(私が知らないだけかもしれません)

※※※ 解決されましたら、その方法を記述していただけませんでしょうか。
私も勉強になります。
    • good
    • 0
この回答へのお礼

後日談になりますが・・・本日、最終案にてOKが出ました。
回答者の皆様に読んでいただければ幸いです。

最終案(おさらい)
表形式フォームにテキストボックスtxt1を配置
txt1の立体表示を「浮き出し」に設定

イベントの「マウスボタンクリック時」に
以下組み込み
Private Sub txt1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
'マウスボタンを「くぼみ」にする
Me.txt1.SpecialEffect = 2
Me.txt1.SetFocus
End Sub

イベントの「マウスボタンクリック解放時」に
以下組み込み
Private Sub txt1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
明細フォームを開く処理
Me.txt1.SpecialEffect = 1
end sub

表形式フォームのみでテキストボックスのコントロールをできたほうが
自己完結性が高く、メンテもしやすい。との理由から
明細フォームload時の処理は行わないことになりました。
今後カスタマイズされる可能性はありますが、この部分の基本インターフェースは
これでほぼ完成となりそうです。

皆様のご協力に心から感謝いたします。
ありがとうございました。

お礼日時:2010/06/03 13:28

#6です(2回に分けての投稿になります)



#6の内容は、2007+Vistaで確認していたものになります。
(2000/2003では動かないようです)


コマンドボタンの動きに近付けてみました。(2007でのものになります)

「txt2」を「txt1」のうえに重ねるのは変わりませんが、以下変更しています。

「txt1」の立体表示は「くぼみ」、「txt2」の立体表示は「浮き出し」で設定しておきます。
 背景スタイルは「普通」、タブストップは「いいえ」
 コントロールソースはともに [フィールド1] にしておきます。

フォーカス移動用の「txdummy」は要りません。

マウスボタンの Down/Up は、「txt1」「txt2」以外で使っていないことが前提です。

Private Function funcMouseDown()
  If (Not Me.NewRecord) Then
    Me.txt1.SetFocus
  End If
End Function

Private Function funcMouseUp(bFlg As Boolean)
  If (Me.ActiveControl.Name = "txt1") Then
    Me.txt2.SetFocus ' ★
  End If
  If (bFlg) Then
    MsgBox "txt1 Clickとみなす : " & Me.txt1 ' ☆
  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.txt1.OnMouseUp = "=funcMouseUp(True)"
  Me.txt2.OnMouseDown = "=funcMouseDown()"
End Sub


テキストボックス上でマウスボタンを押し、他の場所で離すと表示は元に戻ります。
(テキストボックス上で押し/離すと ☆ でメッセージが出ます)

☆ のところで、フォームを起動するようにします。


ただ、この方法にも難点が1つ。

テキストボックス上でマウスボタンを押し、他の場所で離すと表示は元に戻ります。
が、また同じところを押し/離しても表示はへこんだままとなります。
この時には、MouseUp イベントが発生していないようです。
この状態でもう一度、押し/離すと正常な処理に戻ります。


これを解消するには、やはりフォーカス移動用にテキストボックス「txdummy」を作って
(タブストップは、いいえで)
★ 部分を、Me.txdummy.SetFocus に変更します。

ヘッダー/フッター部分があるのなら、
  Me.詳細.OnMouseUp = "=funcMouseUp(False)"
と同様に、設定を追加します。


我流でやっていますので、本来はこうだ・・・っていうのがあるのかもしれません。
(たまたま動いているように見えると思っていたほうがよいと思います)

【つづく】
    • good
    • 0

#2です



> ボタンをクリックするとボタンにフォーカスが移り、・・・

テキストボックスで、コマンドボタンを覆ってしまえば良いような。

文字の表示位置は、テキストボックスの上余白等を設定して調整します。



もしくは、コマンドボタンのクリック時に#2の記述を移し、GotFocus 部分を変更します。

Private Sub コマンドボタン_Click()
  Me.txdummy.SetFocus
  DoCmd.OpenForm "起動フォーム名", , , "抽出条件"
End Sub

Private Sub txt1_GotFocus()
  Call コマンドボタン_Click
End Sub
    • good
    • 0

自分の前回回答は試したらダメみたいです。



ボタンでなく、立体テキストボックスに説明データを設定しその表示値を見てテキストボックス自身を押させる等の操作を考えた方がいいように思います。1件目2件目各レコードで違う内容に出来そうですが。

この回答への補足

ご回答ありがとうございます。

確かにテキストボックスを「浮き出し」にしてあげればボタン風の見た目になりますし、
考えはしましたが、やっぱりこう「クリック感」が欲しいじゃないですか(笑)
もう少し足掻いてみます。

補足日時:2010/05/28 18:10
    • good
    • 0

今あるやり方でレコード移動時に行うと開いた時は、全明細が1件目の値のコマンドボタン名、移動させると2件目の値のコマンドボタン名。

ボタンだとフォームの一部です。他コントロールにしてデータとしての動きにしたいですね。影付きのラベルとか。

また、
ボタン部分を詳細に設定していると思いますがボタンだけサブフォームにしても同じでしょうか?。。
1画面1詳細にしておいて細工してレコードは5件分表示とか。

考えてもいいのは思いつかないですね。
こういうのはチェックボックスにして選ばれたものだけ次画面の単票へ、としてます。

この回答への補足

ご回答ありがとうございます。

>1画面1詳細にしておいて細工してレコードは5件分表示とか。
これは考えました。
ただ欠点がひとつ、、、「全てのパソコンのディスプレイは同じサイズではない」
作った後に気が付いてお蔵入りしました(笑)

>こういうのはチェックボックスにして選ばれたものだけ次画面の単票へ、としてます。
ですよね。もしくは普通にボタンを「詳細表示」とかにすればいいのでしょうが
エンドユーザーのレベルにばらつきがあり、
「思ったデータが見られない」
「用語がわからない」
冗談抜きで「ここのクリックは右?左?」状態です。

「可能な限りボタンだけで操作(右クリックだけ)できるようにして欲しい」
という要望で、なるべくなら叶えてあげたいと・・・

心が折れそうですがもう少し足掻いてみます。

補足日時:2010/05/28 17:51
    • good
    • 0

#1です。



雰囲気ですが、わかった様な気がします。
(が、DataNatureは知らないのであしからず、です)

構成的には、#1後半に書いた、現状で単に考えてみると・・・で、出来そうに思います。

追加で、フォーカス移動用のテキストボックス「txdummy」を
極小の大きさ、タブストップいいえで作成しておきます。

コマンドボタンの上に配置したテキストボックス名を「txt1」と仮定した場合、
(フォーカス取得後の例になりますが)

Private Sub txt1_GotFocus()
  Me.txdummy.SetFocus
  DoCmd.OpenForm "起動フォーム名", , , "抽出条件"
End Sub

フォーカスを移動しないと、上に配置したテキストボックスに居座るので、
txdummy へ移動してからフォームを起動します。

コマンドボタンは、ボタンとしての見栄えだけの存在となります。


この設定でそこそこ動きそうな気がしますが、未検証です。

この回答への補足

何度もありがとうございます。

試しましたがちょっとNGでした。イメージに近い動作ではありましたが・・・
ボタンをクリックするとボタンにフォーカスが移り、結果テキストボックスが
ボタンの後に隠れてました。
(私のスキルの問題かも知れませんが・・・)

お知恵出していただきありがとうございます。
やり方自体は考え付かなかった方法でしたので、感謝しております。

補足日時:2010/05/28 18:03
    • good
    • 0

> 表記式でフォームを作成し、コマンドボタンを配置


ということの様ですので、

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

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

何をされたいかによっては、代替え案が浮かぶかもしれません。

その辺りを、詳しく教えていただけませんか。


また、以下はヒントになりませんか。

Accessの表形式のフォームについて
http://oshiete1.goo.ne.jp/qa5477045.html


現状で単に考えてみると、コマンドボタンの上にテキストボックスを重ねます。
コマンドボタンの Caption は、常に空白とします。
テキストボックスのコントロールソースに、[フィールド1] を設定しておきます。
テキストボックスの背景/枠は、透明に。
また、コマンドボタン/テキストボックスのタブストップは「いいえ」に。
テキストボックスの Enter / GotFocus どちらかで、
コマンドボタンクリック時の処理を行えば良さそうに思います。

細かなところの補足をお願いします。
でも、私で解決できるかは???

この回答への補足

ご回答ありがとうございます。
表記式->表形式 誤字読み取って頂き感謝します。

イメージは(分かりにくくて申し訳ないです)
Aテーブル
|フィールド1|フィールド2|フィールド3|
表形式フォーム
Bottun:フィールド1、Textbox:フィールド2、Textbox:フィールド3

Bottunを押すと該当レコードの単票形式フォームを表示、といった感じになります。
これならパソコンが不得意な方でもより直感的な操作が出来るかも・・・
といったところです。
DataNatureというソフトがあり、目標はこれに近いインターフェースを目指すことです。

>まず、コマンドボタンはレコードごとに制御することはできません。
その通りですよね。
なのでなんとかならんかなぁと・・・もう少し悩んでみます。

補足日時:2010/05/27 22:19
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A