コンボボックスの変化に伴うリストボックス
コンボボックスの変化に伴うリストボックス
題の通りです
コンボボックスが"test"の場合、リストボックスには"test"と表示し、
コンボボックスの内容が"test2"だった場合、リストボックスには"Error"と。
こういう風に表示を変えることで苦戦しています。
だれか教えていただけないでしょうか?
コンボボックスが"test"の場合、リストボックスには"test"と表示し、
コンボボックスの内容が"test2"だった場合、リストボックスには"Error"と。
こういう風に表示を変えることで苦戦しています。
だれか教えていただけないでしょうか?
Re: コンボボックスの変化に伴うリストボックス
たしか前にlstrcmp()関数について書いたと思うんですけど、覚えてますか?雷電さん さんが書きました:コンボボックスが"test"の場合、リストボックスには"test"と表示し、
コンボボックスの内容が"test2"だった場合、リストボックスには"Error"と。
文字列同士を大文字/小文字の区別をして比較する関数なんですけど。
自分ならlstrcmp()関数で実装してしまいます。
随分と遠回りな提案ですけど、まず、日本語をコードに直すことを意識してはどうでしょう?
「コンボボックスに入力されている文字列が "test" だった場合」という文章をコードに直すとします。
コンボボックス = GetDlgItem(hMainWnd,ComboBox1)
入力されている文字列 = GetWindowText(コンボボックス,lpStr,length) ' 適当
"test"であるかどうか = If lstrcmp("test",lpStr)=0 Then
"test"だった場合 = SendMessage(リストボックス,LB_ADDSTRING,0,"test" As LPARAM)
※あぁ...分かりにくい表現かも...
といったような感じになると思います。
文字列を比較するにはlstrcmp, lstrcmpi, CompareStringなどがあります。
リストボックスに文字列を設定したいなら、LB_RESETCONTENTで項目をサクりファイスしてから、LB_ADDSTRINGで項目を追加してやることで可能です。
あ。リストボックスって、もしかしてコンボボックスの中にあるリストボックス(?)のことですか?
横槍失礼します。
RADのイベントにも無し・・・。過去ログもすぐにはヒットせず。あれれ?
えっと。
コンボボックスの選択内容が変わったときにはメッセージ
CBN_SELCHANGE
がMainWndProc()に送られます。
あとはGetWindowText()なりなんなりで、煮るなり焼くなり好きにしてくださいw
以下、参考までに。
※リストボックスもエディットボックスも、それぞれ「コンボボックスの~」って意味です。
それくらいはヘルプに載っているだろう、と思いましたが載ってませんね(汗)。> コンボボックスの選択されている内容が変わったとき、つまりはそのイベントコーディングの仕方がわからないんです。
RADのイベントにも無し・・・。過去ログもすぐにはヒットせず。あれれ?
えっと。
コンボボックスの選択内容が変わったときにはメッセージ
CBN_SELCHANGE
がMainWndProc()に送られます。
あとはGetWindowText()なりなんなりで、煮るなり焼くなり好きにしてくださいw
以下、参考までに。
※リストボックスもエディットボックスも、それぞれ「コンボボックスの~」って意味です。
WisdomSoft様より転載 さんが書きました:CBN_CLOSEUP リストボックスが閉じられた
CBN_DBLCLK リストボックスの項目をダブルクリック
CBN_DROPDOWN リストボックスが表示されようとしている
CBN_EDITCHANGE エディットでテキストが変更された可能性がある
CBN_EDITUPDATE エディットのテキストが変更され
エディットを表示しようとしている
CBN_ERRSPACE 十分なメモリを割り当てられない
CBN_KILLFOCUS キーボードフォーカスを失った
CBN_SELCHANGE リストボックスの選択の変更
CBN_SELENDCANCEL アイテムを選択したが、その時に他のコントロールを選択
または、ダイアログボックスを閉じた
CBN_SELENDOK アイテムを選択し、リストを閉じる
CBN_SETFOCUS キーボードフォーカスを得た
淡幻星さんの言うとおりにやってみましたが、うまくいきません。
コードを一応載せておきます。
Createとさっき言われていたCBN_SELCHANGEのメッセージです。
何か間違っているのでしょうか?
コードを一応載せておきます。
Createとさっき言われていたCBN_SELCHANGEのメッセージです。
コード: 全て選択
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim Combo As HWND
Combo=GetDlgItem(hMainWnd,ComboBox1)
SendMessage(Combo,CB_ADDSTRING,0,"test")
SendMessage(Combo,CB_ADDSTRING,0,"test1")
SendMessage(Combo,CB_ADDSTRING,0,"test2")
SendMessage(Combo,CB_ADDSTRING,0,"test3")
End Sub
Sub MainWnd_CBN_SELCHANGE()
Dim Combo1 As String
Dim List As HWND
GetDlgItem(hMainWnd,ListBox1)
GetDlgItemTextStr(hMainWnd,ComboBox1,Combo1)
If lstrcmp("test",Combo1)= Then
SendMessage(List,LB_RESETCONTENT,0,0)
SendMessage(List,LB_ADDSTRING,0,"test")
ElseIf lstrcmp("test1",Combo1) Then
SendMessage(List,LB_RESETCONTENT,0,0)
SendMessage(List,LB_ADDSTRING,0,"test1")
ElseIf lstrcmp("test2",Combo1) Then
SendMessage(List,LB_RESETCONTENT,0,0)
SendMessage(List,LB_ADDSTRING,0,"test2")
ElseIf lstrcmp("test3",Combo1) Then
SendMessage(List,LB_RESETCONTENT,0,0)
SendMessage(List,LB_ADDSTRING,0,"test3")
Else
SendMessage(List,LB_RESETCONTENT,0,0)
SendMessage(List,LB_ADDSTRING,0,"error")
End If
End Sub
コンボボックスの選択の変更が検出できていない、と言う意味でよろしいのでしょうか?うまくいきません。
その場合、念のため確認しますが、
MainWndProc()の部分 [ここをクリックすると内容が表示されます]
はどうなっておりますでしょうか?
コード: 全て選択
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
例えばこのようになってますでしょうか? [ここをクリックすると内容が表示されます]
もしなってない場合は、「追加が~」の部分を追記してください。コード: 全て選択
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
'追加が必要なのはここから---
Select Case dwMsg
Case CBN_SELCHANGE
MainWnd_CBN_SELCHANGE()
MainWndProc = 0
ExitFunction
End Select
'ここまでです------------------
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
(すみませんが、今回は理由と説明は省かせていただきます)
それから、Sub MainWnd_CBN_SELCHANGE()の中の
コード: 全て選択
GetDlgItem(hMainWnd,ListBox1)
コード: 全て選択
List = GetDlgItem(hMainWnd,ListBox1)
選択されている項目が変わった時(CBN_SELCHANGEですね)、コンボボックスにCB_GETLBTEXTを送信して選択されている項目の文字列を取得すればいいのではないでしょうか。雷電さん さんが書きました:何か間違っているのでしょうか?
GetWindowText()関数で取得できる文字列はコンボボックスのエディットコントロールに入力されている文字列なので...。
こんな感じでどうでしょう? [ここをクリックすると内容が表示されます]
コード: 全て選択
Function ComboBox_GetCurSel(ByVal hCombo As HWND) As Long
ComboBox_GetCurSel=SendMessage(hCombo,CB_GETCURSEL,0,0) As Long
End Function
Function ComboBox_GetLBTextLen(ByVal hCombo As HWND,ByVal nIndex As Long) As Long
ComboBox_GetLBTextLen=SendMessage(hCombo,CB_GETLBTEXTLEN,nIndex,0) As Long
End Function
Function ComboBox_GetLBText(ByVal hCombo As HWND,ByVal nIndex As Long,ByVal lpStringBuf As LPSTR) As Long
ComboBox_GetLBText=SendMessage(hCombo,CB_GETLBTEXT,nIndex,lpStringBuf As LPARAM) As Long
End Function
Sub MainWnd_CBN_SELCHANGE()
Dim hCombo As HWND
Dim lpStr As LPSTR
Dim nIndex As Long
hCombo=GetDlgItem(hMainWnd,ComboBox1)
nIndex=ComboBox_GetCurSel(hCombo)
If nIndex<>CB_ERR Then
lpStr=malloc(ComboBox_GetLBTextLen(hCombo,nIndex)+1)
ComboBox_GetLBText(hCombo,nIndex,lpStr)
Select Case 0
Case lstrcmp("test",lpStr)
SendMessage(List,LB_RESETCONTENT,0,0)
SendMessage(List,LB_ADDSTRING,0,"test")
Case lstrcmp("test1",lpStr)
SendMessage(List,LB_RESETCONTENT,0,0)
SendMessage(List,LB_ADDSTRING,0,"test1")
Case lstrcmp("test2",lpStr)
SendMessage(List,LB_RESETCONTENT,0,0)
SendMessage(List,LB_ADDSTRING,0,"test2")
Case lstrcmp("test3",lpStr)
SendMessage(List,LB_RESETCONTENT,0,0)
SendMessage(List,LB_ADDSTRING,0,"test3")
Case Else
SendMessage(List,LB_RESETCONTENT,0,0)
SendMessage(List,LB_ADDSTRING,0,"error")
End Select
/*
' 別にlstrcmp()関数要らなかったという罠...。
Select Case MakeStr(lpStr)
Case "test"
SendMessage(List,LB_RESETCONTENT,0,0)
SendMessage(List,LB_ADDSTRING,0,"test")
Case "test1"
SendMessage(List,LB_RESETCONTENT,0,0)
SendMessage(List,LB_ADDSTRING,0,"test1")
Case "test2"
SendMessage(List,LB_RESETCONTENT,0,0)
SendMessage(List,LB_ADDSTRING,0,"test2")
Case "test3"
SendMessage(List,LB_RESETCONTENT,0,0)
SendMessage(List,LB_ADDSTRING,0,"test3")
Case Else
SendMessage(List,LB_RESETCONTENT,0,0)
SendMessage(List,LB_ADDSTRING,0,"error")
End Select
*/
free(lpStr)
End If
End Sub
≫雷電さん
すいません。質問の意味が分かりません・・・m(_ _)m
しかし、どうも私が思いっきり勘違いしていた可能性が出てきたので(汗)。
えっと、
CBN_SELCHANGE を全部 CBN_EDITCHANGE って書き換えてみてください。
これで上手くいったとしたら、大変申し訳ないですm(_ _)m
それでもだめな場合は、一つ一つ確認していきましょう。
闇雲にデバック実行を繰り返しても意味は無いです。
1、コンボボックスの選択が変化したことは検出できていますか?
2、リストボックスへSendMessageで文字列を挿入する際、
返り値はどうなっていますか?成功していますか?
この2点を順に調べてください。
≫7さん
コンボボックスで、
リストボックス内のアイテムを選択すれば、
エディットボックスにそのアイテムがセットされるので、
GetWindowText()でも問題ないのではないでしょうか?
・・・これが私が勘違いしていたっぽい場所でして。
雷電さんの求めているものは
選択が決定された状態の検出であって、
選択中の変更(決定前)の検出ではないように思いました。
だとすると、私が混乱を助長してしまったことになりますね_| ̄|○
すいません。質問の意味が分かりません・・・m(_ _)m
しかし、どうも私が思いっきり勘違いしていた可能性が出てきたので(汗)。
えっと、
CBN_SELCHANGE を全部 CBN_EDITCHANGE って書き換えてみてください。
これで上手くいったとしたら、大変申し訳ないですm(_ _)m
それでもだめな場合は、一つ一つ確認していきましょう。
闇雲にデバック実行を繰り返しても意味は無いです。
1、コンボボックスの選択が変化したことは検出できていますか?
2、リストボックスへSendMessageで文字列を挿入する際、
返り値はどうなっていますか?成功していますか?
この2点を順に調べてください。
≫7さん
コンボボックスで、
リストボックス内のアイテムを選択すれば、
エディットボックスにそのアイテムがセットされるので、
GetWindowText()でも問題ないのではないでしょうか?
・・・これが私が勘違いしていたっぽい場所でして。
雷電さんの求めているものは
選択が決定された状態の検出であって、
選択中の変更(決定前)の検出ではないように思いました。
だとすると、私が混乱を助長してしまったことになりますね_| ̄|○
別にGetWindowText()関数でもできるんですけど、たしか取得できない時があったんですよ。雷電さん さんが書きました:GetWindowText()関数ではできないみたいですが、実践コードモジュールの方にあったイグトランスさんが作っていたファンクションを使えば文字列取得可能です。やってみてください。
こうなってると取得できないっていう条件は忘れてしまったんですけど...。
CB_GETCURSELの戻り値がCB_ERRじゃない場合、CB_GETLBTEXTで項目の文字列を取得、戻り値がCB_ERRだった場合、GetWindowText()関数で取得していたんです。
ちょっと取得できない条件ってのを探しました...。淡幻星さん さんが書きました:コンボボックスで、
リストボックス内のアイテムを選択すれば、
エディットボックスにそのアイテムがセットされるので、
GetWindowText()でも問題ないのではないでしょうか?
ん?っていうコード [ここをクリックすると内容が表示されます]
コード: 全て選択
' 選択が変更された時
Sub MainWnd_ComboBox1_SelChange()
Dim hCombo As HWND
Dim lpStr As LPSTR
Dim length As Long
hCombo=GetDlgItem(hMainWnd,ComboBox1)
' 選択が変更される前の項目の文字列を取得してしまう。
' つまり、期待する文字列と取得する文字列はボタンを掛け間違えた時のようにズレてる。
length=GetWindowTextLength(hCombo)+1
lpStr=malloc(length)
GetWindowText(hCombo,lpStr,length)
OutputDebugString(lpStr)
free(lpStr)
End Sub
正しいコード [ここをクリックすると内容が表示されます]
コード: 全て選択
' 選択が変更された時
Sub MainWnd_ComboBox1_SelChange()
Dim hCombo As HWND
Dim lpStr As LPSTR
Dim nIndex As Long
Dim length As Long
hCombo=GetDlgItem(hMainWnd,ComboBox1)
nIndex=ComboBox_GetCurSel(hCombo)
If nIndex<>CB_ERR Then
length=ComboBox_GetLBTextLen(hCombo,nIndex)+1
lpStr=calloc(length)
ComboBox_GetLBText(hCombo,nIndex,lpStr)
Else
' 「選択が変更された時」にはこのコードは要らない。
length=GetWindowTextLength(hCombo)+1
lpStr=calloc(length)
GetWindowText(hCombo,lpStr,length)
End If
OutputDebugString(lpStr)
' ゼロフリーはしちゃいけないのか?
' 追記。とりあえず、If文で回避。
If lpStr Then free(lpStr)
End Sub