RADツールの「アップダウンコントロール」を使い方を教えてください。
やりたいことは、エディットボックスに予めセットされた数値をアップ・ダウンしたい。また、アップ・ダウンの幅もプログラムでコントロールできますか。
サンプルなどがありましたら、お教えください。
RADツールで「アップダウンコントロール」の使い方
Re: RADツールで「アップダウンコントロール」の使い方
> RADツールの「アップダウンコントロール」を使い方を教えてください。
> やりたいことは、エディットボックスに予めセットされた数値をアップ・ダウンしたい。
> サンプルなどがありましたら、お教えください。
ABでの使用例なら↓のサイトが参考になるかと思います。
http://abfan.active.client.jp/013.html
> また、アップ・ダウンの幅もプログラムでコントロールできますか。
アップダウンの変化量の設定は、UDN_DELTAPOS通知メッセージを使って行うみたいです。
RADのMainWnd_Notifyイベントを処理する必要があります。
こんな感じになります↓
過去ログや↓のサイトを参考にしてみてください。
http://msdn.microsoft.com/library/defau ... frame=true
http://www.kumei.ne.jp/c_lang/sdk3/sdk_204.htm
> やりたいことは、エディットボックスに予めセットされた数値をアップ・ダウンしたい。
> サンプルなどがありましたら、お教えください。
ABでの使用例なら↓のサイトが参考になるかと思います。
http://abfan.active.client.jp/013.html
> また、アップ・ダウンの幅もプログラムでコントロールできますか。
アップダウンの変化量の設定は、UDN_DELTAPOS通知メッセージを使って行うみたいです。
RADのMainWnd_Notifyイベントを処理する必要があります。
こんな感じになります↓
コード: 全て選択
Sub MainWnd_Notify(ByRef nmHdr As NMHDR)
'UpDownコントロールからの通知
If nmHdr.hwndFrom=GetDlgItem(hMainWnd, UpDown1) Then
'NMUPDOWN構造体を使う
Dim lpnmud As *NMUPDOWN
lpnmud=VarPtr(nmHdr)
'増加・減少量を再設定
If lpnmud->hdr.code=UDN_DELTAPOS Then
If lpnmud->iDelta > 0 Then
lpnmud->iDelta=5
Else
lpnmud->iDelta=-5
End If
End If
End If
End Sub
過去ログや↓のサイトを参考にしてみてください。
http://msdn.microsoft.com/library/defau ... frame=true
http://www.kumei.ne.jp/c_lang/sdk3/sdk_204.htm
引き続きお教えください。
アップダウンコントロールの使い方で、引き続きお教えください。
>ABでの使用例なら↓のサイトが参考になるかと思います。
>http://abfan.active.client.jp/013.html
上記サイトでのサンプルは、メインウインドウ内での処理ですが、同様なアップダウンコントロールをメインウインドウから起動したダイアログウインドウ内で実行する場合の方法をお教えください。
下記プログラムの様に、メインウインドウから起動したダイアログウインドウ内(Setup.sbp)で定義したところ、デバッグモードでの実行時にCreateUpDownControlのところで「スレッド(&H520)でアクセス違反がありました(EPI=&H0040507D)。」と表示され実行が停止してしまいます。
各命令を充分理解せず、使用しており、基本的な間違いをしているかも知れませんが・・・。
お教え願います。
>ABでの使用例なら↓のサイトが参考になるかと思います。
>http://abfan.active.client.jp/013.html
上記サイトでのサンプルは、メインウインドウ内での処理ですが、同様なアップダウンコントロールをメインウインドウから起動したダイアログウインドウ内で実行する場合の方法をお教えください。
下記プログラムの様に、メインウインドウから起動したダイアログウインドウ内(Setup.sbp)で定義したところ、デバッグモードでの実行時にCreateUpDownControlのところで「スレッド(&H520)でアクセス違反がありました(EPI=&H0040507D)。」と表示され実行が停止してしまいます。
各命令を充分理解せず、使用しており、基本的な間違いをしているかも知れませんが・・・。
お教え願います。
コード: 全て選択
Dim hEdit2 As DWord
Dim hUpDown2 As DWord
Const nMax= 3000
Const nMin=-3000
Const UpDown2=2000
Sub Setup_Create(ByRef CreateStruct As CREATESTRUCT)
'全自動UpDownコントロールを自作する----------------------------------------------
hEdit2=GetDlgItem(hSetup,EditBox2)
hUpDown2=CreateUpDownControl(WS_CHILD or WS_BORDER or WS_VISIBLE or _
UDS_ALIGNRIGHT or UDS_ARROWKEYS or UDS_SETBUDDYINT or UDS_WRAP, _
0,0,100,20,hSetup, UpDown2, CreateStruct.hInstance, hEdit2, nMax, nMin, 300)
End Sub
解決しました
デバッグモード実行時に「アクセス違反」で停止の件、下記のとおりCreateUpDownControlの引数「CreateStruct.hInstance」を「0」に変更することにより、正常に動作する様になりました。
但し、CreateStruct.hInstanceが何を表すのか、理解していないため、正しい対応なのか判りません。
説明では「コントロールを作成するモジュールのインスタンスハンドルを指定します」とありますが、どなたか、この引数がなのを表すのかお教え頂ければ、幸いです。
(変更前)
CreateUpDownControl(WS_CHILD or WS_BORDER or WS_VISIBLE or _
UDS_ALIGNRIGHT or UDS_ARROWKEYS or UDS_SETBUDDYINT or UDS_WRAP, _
0,0,100,20,hSetup, UpDown2, CreateStruct.hInstance, hEdit2, nMax, nMin, 300)
(変更後)
CreateUpDownControl(WS_CHILD or WS_BORDER or WS_VISIBLE or _
UDS_ALIGNRIGHT or UDS_ARROWKEYS or UDS_SETBUDDYINT or UDS_WRAP, _
0,0,100,20,hSetup, UpDown2, 0, hEdit2, nMax, nMin, 300)
但し、CreateStruct.hInstanceが何を表すのか、理解していないため、正しい対応なのか判りません。
説明では「コントロールを作成するモジュールのインスタンスハンドルを指定します」とありますが、どなたか、この引数がなのを表すのかお教え頂ければ、幸いです。
(変更前)
CreateUpDownControl(WS_CHILD or WS_BORDER or WS_VISIBLE or _
UDS_ALIGNRIGHT or UDS_ARROWKEYS or UDS_SETBUDDYINT or UDS_WRAP, _
0,0,100,20,hSetup, UpDown2, CreateStruct.hInstance, hEdit2, nMax, nMin, 300)
(変更後)
CreateUpDownControl(WS_CHILD or WS_BORDER or WS_VISIBLE or _
UDS_ALIGNRIGHT or UDS_ARROWKEYS or UDS_SETBUDDYINT or UDS_WRAP, _
0,0,100,20,hSetup, UpDown2, 0, hEdit2, nMax, nMin, 300)
Re: 解決しました
モジュールのインスタンスハンドルはGetModuleHandle(0)や、GetWindowLong(hWnd, GWL_HINSTANCE)を使って取得できます。> 説明では「コントロールを作成するモジュールのインスタンスハンドルを指定します」とありますが、どなたか、この引数がなのを表すのかお教え頂ければ、幸いです。
「インスタンスハンドルとは何なのか」...
これはウィンドウやコントロールを作ったりするときに必要なもの、というような理解で結構だと思います。
というか自分もこれ以上のことはわかりかねます。(^^);
似たようなものに、ウィンドウハンドル、デバイスコンテキストハンドル、GDIオブジェクトハンドルなどがありますね。どれも詳細不明...
どこかのメモリ領域に作られたオブジェクトを指すものと考えればよいでしょう。
一応、補足説明を...> デバッグモード実行時に「アクセス違反」で停止の件、下記のとおりCreateUpDownControlの引数「CreateStruct.hInstance」を「0」に変更することにより、正常に動作する様になりました。
> 但し、CreateStruct.hInstanceが何を表すのか、理解していないため、正しい対応なのか判りません。
RADで作るダイアログは内部的には、Callback.wbp内でCreateWindowEx()関数を使用して作られます。(DialogBox()関数の定義を探してみてください。)
Function DialogBox(hOwnerWnd As DWord, TemplateName As String) As Long
Select Case TemplateName
Case "Setup"
hSetup=CreateWindowEx(&H00000000,"NORMALDLG","Setup",&H00c80000,-1,-1,480,360,hOwnerWnd,0,GetModuleHandle(0),0)
SetWindowLong(hSetup,GWL_WNDPROC,AddressOf(SetupProc))
SendMessage(hSetup,WM_INITDIALOG,0,0)
ShowWindow(hSetup,SW_SHOW)
…
一方、Createイベント(Setup_Create()関数)は同Callback.wbpのEventCall_Setup()関数内でWM_INITDIALOGメッセージを受けて呼ばれているのがわかります。
Function EventCall_Setup(hWnd As DWord, message As DWord, wParam As DWord, lParam As DWord) As DWord
Select Case message
Case WM_INITDIALOG
hSetup=hWnd
Setup_Create(ByVal lParam)
…
このメッセージはDialogBox()関数でダイアログを作成した際に、↓のようにして送っています。
SendMessage(hSetup,WM_INITDIALOG,0,0)
ここで、lParam(第4引数)を見ると0を指定しています。
これがCreateイベントに、
Setup_Create(ByVal lParam)
↓
Sub Setup_Create(ByRef CreateStruct As CREATESTRUCT)
として値渡しされるため、参照型の仮引数であるCreateStructにアクセスしようとすると、無効なアドレス(0x00000000)を参照してアクセス違反になった、ということです。
P.S.
ところでRADで貼り付けられるアップダウン・コントロールではだめなのでしょうか?
回答ありがとうございます。
Tomorrow様
先ずは、ご回答にお礼を申します。
今回、ご教授頂いた内容は、これからじっくり理解して行きます。
未だ、Windowsの理解が浅く充分理解ができませんので・・・。
>ところでRADで貼り付けられるアップダウン・コントロールではだめなのでしょうか?
上記ご指摘に関しては、初期値として”200”を設定し、アップダウンする数値幅を、10づつにしたかったために、自作することにしました。
もし、RADで貼り付けられるアップダウン・コントロールでも同様なことが可能ならば、無駄骨と言うことになりますが・・・。(できるのですか?)
先ずは、ご回答にお礼を申します。
今回、ご教授頂いた内容は、これからじっくり理解して行きます。
未だ、Windowsの理解が浅く充分理解ができませんので・・・。
>ところでRADで貼り付けられるアップダウン・コントロールではだめなのでしょうか?
上記ご指摘に関しては、初期値として”200”を設定し、アップダウンする数値幅を、10づつにしたかったために、自作することにしました。
もし、RADで貼り付けられるアップダウン・コントロールでも同様なことが可能ならば、無駄骨と言うことになりますが・・・。(できるのですか?)
Re: 回答ありがとうございます。
初期値については前に提示したActiveBasicFanのサイトに、> 上記ご指摘に関しては、初期値として”200”を設定し、アップダウンする数値幅を、10づつにしたかったために、自作することにしました。
> もし、RADで貼り付けられるアップダウン・コントロールでも同様なことが可能ならば、無駄骨と言うことになりますが・・・。(できるのですか?)
とあります。初期値は lParam に値を指定して UDM_SETPOS メッセージを送ってあげます。これを指定しないと、起動時にエディットボックスの中には何も表示されません。
コード: 全て選択
'初期値を設定 SendMessage(hUpDown1,UDM_SETPOS,0,0)
数値幅は前投稿で掲載したサンプルで、RADのものでも動きました。
Re: 回答ありがとうございます。
> 初期値については前に提示したActiveBasicFanのサイトに、
> SendMessage(hUpDown1,UDM_SETPOS,0,0)
> とあります。
RADツールで作成した場合は、初期値もRADツール内で指定するものと思い込んでいました。
SendMessage(hUpDown1,UDM_SETPOS,0,0)として、アップダウンコントロールに初期値を送ってあげれば良いのですね。
API初心者の私からすれば、アップダウンコントロールをRADで作るかAPIで作るかの違はあっても、コントロールに対してはAPIによりメッセージを送る必要があり、どちらも自作の印象です。
でも、ABでプログラミングする(APIを使う)と言うことが大分理解できて来ました。
> 数値幅は前投稿で掲載したサンプルで、RADのものでも動きました。
前回ご教授頂いた方法で、一応作りたいツールが実現できました、ありがとうございました。
今回のRADで作成したものでも、確認をしてみます。
> SendMessage(hUpDown1,UDM_SETPOS,0,0)
> とあります。
RADツールで作成した場合は、初期値もRADツール内で指定するものと思い込んでいました。
SendMessage(hUpDown1,UDM_SETPOS,0,0)として、アップダウンコントロールに初期値を送ってあげれば良いのですね。
API初心者の私からすれば、アップダウンコントロールをRADで作るかAPIで作るかの違はあっても、コントロールに対してはAPIによりメッセージを送る必要があり、どちらも自作の印象です。
でも、ABでプログラミングする(APIを使う)と言うことが大分理解できて来ました。
> 数値幅は前投稿で掲載したサンプルで、RADのものでも動きました。
前回ご教授頂いた方法で、一応作りたいツールが実現できました、ありがとうございました。
今回のRADで作成したものでも、確認をしてみます。