ページ 11

ドロップダウン リスト

Posted: 2006年4月01日(土) 17:10
by ホタル
はじめまして

RADツールを使っているのですがコンボボックスを使ったドロップダウンリストの作り方が全然わかりません

過去ログを見ても解決できませんでした

どの部分にどのようなプログラムを書いたら良いのか、どなたか教えて下さい
お願いします

Posted: 2006年4月01日(土) 17:47
by GTR
私も、同じことを疑問に思いましたが、下を見て解決してください。

コード: 全て選択

Sub /*コマンドボックスを作っているウィンドウのID*/_Create(ByRef CreateStruct As CREATESTRUCT)
    Dim hCombo As HWND
    hCombo=GetDlgItem(hMission,ComboBox1)
    cb_addString(hCombo,"文字列")
    '0を選択
    SendMessage(hCombo,CB_SETCURSEL,0,NULL)
End Sub
文字列には追加したい文字列を記入、って書いてありましたのでそのまま書きました。それと、Creatメッセージでやりましょう。
もともと、Creatは、ウィンドウが作られたときに送られるコードです。
そこに記入しましょう。
文字列をまだ作りたい、って言う場合は、
cb_addString(hCombo,"
をつぎつぎに足していきましょう。
あまり多く作らないように・・・。
初めて、人に教えました。
わかる範囲での答えです。

Re: ドロップダウン リスト

Posted: 2006年4月01日(土) 17:49
by 7
> はじめまして
初めまして。

> RADツールを使っているのですがコンボボックスを使ったドロップダウンリストの作り方が全然わかりません
この辺り、始めたばかりの頃分かりませんよね。コンボボックス、自分の一番最初の壁でした...。

> どの部分にどのようなプログラムを書いたら良いのか、どなたか教えて下さい
イベントコードの「ウィンドウ作成時」にSendMessage()関数でCB_ADDSTRING,CB_SETCURSELなどのメッセージを送ることでコンボボックスの設定をします。
ActiveBasic付属のヘルプに"cb"と入力するとコンボボックスに関するメッセージを見ることができます。

Posted: 2006年4月01日(土) 17:50
by GTR
すいません。抜いたままなのでこっちのを書いてもらえませんか?

コード: 全て選択

Sub /*コマンドボックスを作っているウィンドウのID*/_Create(ByRef CreateStruct As CREATESTRUCT) 
    Dim hCombo As HWND 
    hCombo=GetDlgItem(h/*コマンドボックスを作っているウィンドウ*/,ComboBox1) 
    cb_addString(hCombo,"文字列") 
    '0を選択 
    SendMessage(hCombo,CB_SETCURSEL,0,NULL) 
End Sub

Re:ドロップダウン リスト

Posted: 2006年4月01日(土) 17:57
by 旅人
はじめまして。
他の方法もあるかと思いますが、私の場合「MainWnd.sbp」内に以下のような形で記述しています。


' ここから下は、イベントプロシージャを記述するための領域になります。

Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
  Dim hCombo As HANDLE
  hCombo = GetDlgItem(hMainWnd,ComboBox1)
  SendMessage(hCombo,CB_ADDSTRING,0,"ABC")
End Sub

これでコンパイルすれば、ID「ComboBox1」に「ABC」の文字が表示されるようになっているはずです。

Posted: 2006年4月01日(土) 18:03
by 7
>

コード: 全て選択

Sub /*コマンドボックスを作っているウィンドウのID*/_Create(ByRef CreateStruct As CREATESTRUCT) 
>     Dim hCombo As HWND 
>     hCombo=GetDlgItem(h/*コマンドボックスを作っているウィンドウ*/,ComboBox1) 
>     cb_addString(hCombo,"文字列") 
>     '0を選択 
>     SendMessage(hCombo,CB_SETCURSEL,0,NULL) 
> End Sub
cb_addString()関数なんてapi_commctrl.sbpで定義されてたかな、なんて思ったら、以前自分が投稿したコードですね。

コード: 全て選択

Function cb_addString(ByVal hWnd As HWND,ByVal lpString As BytePtr) As LRESULT
	cb_addString=SendMessage(hWnd,CB_ADDSTRING,NULL,lpString As LPARAM)
End Function

Function cb_setCursel(ByVal hWnd As HWND,ByVal nIndex As Long) As LRESULT
	cb_setCursel=SendMessage(hWnd,CB_SETCURSEL,nIndex As WPARAM,NULL)
End Function

Posted: 2006年4月01日(土) 18:51
by ホタル
皆さん、たくさんの返信ありがとうございました
おかげでコンボボックスの中に文字を入れることができました

しかし、ドロップダウンができません(▼をクリックしても開きません)
cb_addString(hCombo,"文字")を5個くらい書いたのですが・・・
これについて、もう一度ご解答お願いしますm(_ _)m

Posted: 2006年4月01日(土) 19:10
by 7
> しかし、ドロップダウンができません(▼をクリックしても開きません)
オーナー描写が「なし」になってないや、コンボボックスの高さが適正ではないのかもしれません。
オーナー描写を「なし」にして、コンボボックスの幅を150,高さを200などにしてみて下さい。

Posted: 2006年4月01日(土) 19:35
by ホタル
高さをボックスギリギリにしてたのが原因だったようです
ありがとうございました
本当に助かりました

Posted: 2006年4月01日(土) 20:33
by ホタル
また壁にぶち当たってしまいました
cb_○○○を使うと文法が正しくない的なことを言われるのですが
cb_addstringみたいに一つ一つ定義が必要なのでしょうか?

もし、そうなのならCB_INSERTSTRINGの定義を教えて頂ければ助かります
あと、解説の付けて頂ければ今後の役に立ちます

Posted: 2006年4月01日(土) 22:04
by うぱ
cb_addstringはCB_ADDSTRINGを簡単に扱うために作った自作の関数(?)みたいなものですね。
この場合、

コード: 全て選択


SendMessage(hWnd,CB_ADDSTRING,NULL,lpString) 
の部分だけで追加は可能です。(多少の改良は必要ですが…)
同様に、CB_INSERTSTRINGの場合も、簡単に扱える関数を作ってもいいですが、

コード: 全て選択


SendMessage(hWnd, CB_INSERTSTRING, index, str)
index:何番目のリストに追加するのかを指定します(一番上のリストを0とします)。
str:追加する文字列を指定します。

と、これだけですので、普通に書いてもいいと思います。

Posted: 2006年4月01日(土) 22:18
by ホタル
ありがとうございます

すみません自分があまりにも無知、未熟なもので^^;

Posted: 2006年4月02日(日) 07:24
by 7
遅いかもしれませんけど...。

> cb_○○○を使うと文法が正しくない的なことを言われるのですが
> cb_addstringみたいに一つ一つ定義が必要なのでしょうか?
定義するかは関数があるかないかで決まります。
関数名ですが、"cb_○○○"とする必要はありません。関数の処理を表す名であって処理を決めるものじゃないからです。

> もし、そうなのならCB_INSERTSTRINGの定義を教えて頂ければ助かります
> あと、解説の付けて頂ければ今後の役に立ちます

コード: 全て選択

'コンボボックスのリストの指定した位置に文字列を挿入します。
'nIndex : 何番目のリストに追加するのかを指定します(一番上のリストを0とします)。
'lpString : 追加する文字列を指定します。
Function cb_insertString(ByVal hWnd As HWND,ByVal nIndex As Long,ByVal lpString As BytePtr) As LRESULT
	cb_insertString=SendMessage(hWnd,CB_INSERTSTRING,nIndex,lpString As LPARAM)
End Function
プロジェクト内で一度だけの実行ならSendMessage()関数で直接叩いてもいいんですけど、そうじゃないなら関数にしておくと楽になります。
いちいちウィンドウメッセージ書くの嫌じゃないですか。