RADツールで「アップダウンコントロール」の使い方

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
けんた

RADツールで「アップダウンコントロール」の使い方

#1 投稿記事 by けんた »

RADツールの「アップダウンコントロール」を使い方を教えてください。
やりたいことは、エディットボックスに予めセットされた数値をアップ・ダウンしたい。また、アップ・ダウンの幅もプログラムでコントロールできますか。
サンプルなどがありましたら、お教えください。
Tomorrow
記事: 72
登録日時: 2005年6月04日(土) 10:09

Re: RADツールで「アップダウンコントロール」の使い方

#2 投稿記事 by Tomorrow »

> RADツールの「アップダウンコントロール」を使い方を教えてください。
> やりたいことは、エディットボックスに予めセットされた数値をアップ・ダウンしたい。
> サンプルなどがありましたら、お教えください。

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
けんた

#3 投稿記事 by けんた »

Tomorrowさま

回答ありがとうございます。
また、サンプルプログラムまで教えて頂き助かります。
早速試してみます。

尚、お礼が遅くなり、申し訳ございませんでした。
けんた

引き続きお教えください。

#4 投稿記事 by けんた »

アップダウンコントロールの使い方で、引き続きお教えください。

>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
けんた

解決しました

#5 投稿記事 by けんた »

デバッグモード実行時に「アクセス違反」で停止の件、下記のとおり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)
Tomorrow
記事: 72
登録日時: 2005年6月04日(土) 10:09

Re: 解決しました

#6 投稿記事 by Tomorrow »

> 説明では「コントロールを作成するモジュールのインスタンスハンドルを指定します」とありますが、どなたか、この引数がなのを表すのかお教え頂ければ、幸いです。
モジュールのインスタンスハンドルは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で貼り付けられるアップダウン・コントロールではだめなのでしょうか?
けんた

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

#7 投稿記事 by けんた »

Tomorrow様

先ずは、ご回答にお礼を申します。
今回、ご教授頂いた内容は、これからじっくり理解して行きます。
未だ、Windowsの理解が浅く充分理解ができませんので・・・。

>ところでRADで貼り付けられるアップダウン・コントロールではだめなのでしょうか?

上記ご指摘に関しては、初期値として”200”を設定し、アップダウンする数値幅を、10づつにしたかったために、自作することにしました。
もし、RADで貼り付けられるアップダウン・コントロールでも同様なことが可能ならば、無駄骨と言うことになりますが・・・。(できるのですか?)
Tomorrow
記事: 72
登録日時: 2005年6月04日(土) 10:09

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

#8 投稿記事 by Tomorrow »

> 上記ご指摘に関しては、初期値として”200”を設定し、アップダウンする数値幅を、10づつにしたかったために、自作することにしました。
> もし、RADで貼り付けられるアップダウン・コントロールでも同様なことが可能ならば、無駄骨と言うことになりますが・・・。(できるのですか?)
初期値については前に提示したActiveBasicFanのサイトに、
初期値は lParam に値を指定して UDM_SETPOS メッセージを送ってあげます。これを指定しないと、起動時にエディットボックスの中には何も表示されません。

コード: 全て選択

'初期値を設定
SendMessage(hUpDown1,UDM_SETPOS,0,0)
とあります。

数値幅は前投稿で掲載したサンプルで、RADのものでも動きました。
けんた

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

#9 投稿記事 by けんた »

> 初期値については前に提示したActiveBasicFanのサイトに、
> SendMessage(hUpDown1,UDM_SETPOS,0,0)
> とあります。

RADツールで作成した場合は、初期値もRADツール内で指定するものと思い込んでいました。
SendMessage(hUpDown1,UDM_SETPOS,0,0)として、アップダウンコントロールに初期値を送ってあげれば良いのですね。
API初心者の私からすれば、アップダウンコントロールをRADで作るかAPIで作るかの違はあっても、コントロールに対してはAPIによりメッセージを送る必要があり、どちらも自作の印象です。
でも、ABでプログラミングする(APIを使う)と言うことが大分理解できて来ました。

> 数値幅は前投稿で掲載したサンプルで、RADのものでも動きました。

前回ご教授頂いた方法で、一応作りたいツールが実現できました、ありがとうございました。
今回のRADで作成したものでも、確認をしてみます。
返信する