リストビューの文字列取得

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: リストビューの文字列取得

by M.S. » 2007年5月06日(日) 20:13

皆さん、どうもありがとうございました。
おかげで望んでいた動作ができるようになりました。

解決しました

by yata » 2007年5月03日(木) 18:00

7さん お手数をおかけしてすみませんでした。
表示 プロジェクトオプション Win32Apiタブで コモンコントロールを使用する にチェックは入っていました。
もしかしたらと思って、プロシージャ全体をリリースコンパイルしたところ
Function ListView_GetNextItem(ByVal hWnd As HWND,ByVal iStart As Long,ByVal flags As DWord) As Long
ListView_GetNextItem = SendMessage(hWnd,LVM_GETNEXTITEM,iStart As WPARAM,flags As LPARAM) As Long

End Function
で、エラー無しでコンパイルできました。MainWnd.sbpだけコンパイルしたからエラーになったのかな?
とにかく修正がexeファイルに上書きされてちゃんと動いています。
重ね重ね有難うございました。

Re: 初心者の質問ですが

by 7 » 2007年5月03日(木) 14:46

> "NMLVDISPINFO" 無効な識別子です
> "NMLISTVIEW" 無効な識別子です
おそらく関数の修正は全く関係ないと思います。
プロジェクトオプションの「コモン コントロールを使用する」にチェックは入っているでしょうか?
チェックを入れると件の構造体を定義してくれるので無効な識別子とはなりません。

それでも解決しない場合はコードを載せた方が良いかもしれませんが、トピ主(M.S.)さんの質問とちょっと離れた話題になってきたので...。う~ん。

初心者の質問ですが

by yata » 2007年5月03日(木) 13:41

7 さん 下の様に修正したら、エラーになってしまいました。
Function ListView_GetNextItem(ByVal hWnd As HWND,ByVal iStart As Long,ByVal flags As DWord) As Long
ListView_GetNextItem=SendMessage(hWnd,LVM_GETNEXTITEM,iStart As WPARAM,flags As LPARAM) As Long
End Function

"NMLVDISPINFO" 無効な識別子です
"NMLISTVIEW" 無効な識別子です
この部分です
Sub MainWnd_ListView1_EndLabelEdit(ByRef nmLVDispInfo As NMLVDISPINFO)
Sub MainWnd_ListView1_DblClick(ByRef nmListView As NMLISTVIEW)

修正前のコードは
Function ListView_GetNextItem(ByVal hWnd As HWND,ByVal iStart As Long,ByVal flags As DWord) As Long
SendMessage(hWnd,LVM_GETNEXTITEM,iStart As WPARAM,flags As LPARAM)
End Function
でうまくいっていたと思うのですが、エラーになっているので残っているexeファイルは修正前のままですのでうまく動いています。でも、リリースコンパイルしてしまったため、動いているコードが分からなくなってしまいました。

拡張子wrk のファイルが変更されているようですが、関係あるかどうか私には分かりません。
プログラムの全てのコードをここに載せたほうがよいでしょうか

Re: 初心者の質問ですが

by 7 » 2007年5月03日(木) 00:11

> 大分前に7さんから頂いたこのコードでファイルを開くプログラムを作ったのですが、
> Function内のReturnを取って使っていますが、取ってはいけませんか?
「このコード」とはListView_GetNextItem関数のことでしょうか?

コード: 全て選択

Function ListView_GetNextItem(ByVal hWnd As HWND,ByVal iStart As Long,ByVal flags As DWord) As Long
    Return SendMessage(hWnd,LVM_GETNEXTITEM,iStart As WPARAM,flags As LPARAM) As Long
End Function
この関数は特定の項目のインデックス値を返す関数なので戻り値に代入しなければ使い物になりません。
だからReturnを取って使っては意味がないです...。

Returnが使えない環境なら以下のように修正してください。

コード: 全て選択

Function ListView_GetNextItem(ByVal hWnd As HWND,ByVal iStart As Long,ByVal flags As DWord) As Long
    ListView_GetNextItem=SendMessage(hWnd,LVM_GETNEXTITEM,iStart As WPARAM,flags As LPARAM) As Long
End Function

初心者の質問ですが

by yata » 2007年5月02日(水) 22:41

大分前に7さんから頂いたこのコードでファイルを開くプログラムを作ったのですが、
Function内のReturnを取って使っていますが、取ってはいけませんか?

Re: リストビューの文字列取得

by 7 » 2007年4月30日(月) 10:45

> 一応試したコードを載せておきます。
>
>

コード: 全て選択

dim hList as HWND
> 
> Function ListView_GetNextItem(ByVal hWnd As HWND,ByVal iStart As Long,ByVal flags As DWord) As Long
>     Return SendMessage(hWnd,LVM_GETNEXTITEM,iStart As WPARAM,flags As LPARAM) As Long
> End Function
> 
> 	hList=GetDlgItem(hMainWnd,ListView1) 'Createイベント内
> 
> Sub MainWnd_ListView1_DblClick(ByRef nmListView As NMLISTVIEW)
> 	dim buf1[MaxPath_LV] as Byte
> 	dim buf2[MaxPath_LV] as Byte
> 	dim buf[255] as Byte
> 
> 	' 選択されている項目の位置を持つ
> 	Dim nSelect As Long
> 
> 	' 項目が選択されていない場合、-1が返ります
> 	nSelect=ListView_GetNextItem(GetDlgItem(hMainWnd,ListView1),-1,LVNI_ALL Or LVNI_SELECTED)
> 
> 	if nSelect<>-1 then
> 		ListView_GetItemText(hList,0,0,buf1,MaxPath_LV)
> 		ListView_GetItemText(hList,0,1,buf2,MaxPath_LV)
> 	Elseif nSelect=-1 then
> 		ListView_GetItemText(hList,lvItem.iItem,0,buf1,MaxPath_LV)
> 		ListView_GetItemText(hList,lvItem.iItem,1,buf2,MaxPath_LV)
> 	End If
> 
> 	wsprintf(buf,"%s%s",buf2,buf1)
> 	MessageBox(hMainWnd,buf,0,MB_OK)
> End Sub
項目が選択されているなら 0 の項目を取得、項目が選択されていないなら選択されている項目を取得になってます...。
If文が逆なんではないかと思います。
※lvItem.iItem に値が格納されていないのでインデックスは必ず 0 になります

項目が選択されていない場合、メッセージボックスで注意するだけにしました。勝手に。 単純に選択されている項目のデータを取得したいなら選択されている項目のインデックスをListView_GetItemText関数の第二引数に指定します。

LVITEM構造体の iItem メンバを指定したい場合、iItem にインデックスを格納してからでないといけません。 戻り値の意味や扱い方、指定すべきデータなど覚えるのに苦労しますよねぇ...。

by M.S. » 2007年4月30日(月) 01:43

一ヶ月も放置してしまって申し訳ありません!m(__)m
> 少しMS様にお聞きしたいことが
>
> このコードって選択項目があればその項目のアイテムとサブアイテムを表示して
> 選択項目がなければインデックス0のアイテムとサブアイテムを表示するって事でしょうか?
>
> それとも選択項目があればインデックス0のアイテムとサブアイテムを表示して
> 選択項目がなければカーソル位置のアイテムとサブアイテムを表示するって事でしょうか?
聞かれてる内容がよくわからないのですが、
兎に角ダブルクリックしたときにカーソル位置のアイテムとサブアイテムを取得したいのです。
> 元のコードを見ていて気づいたことが一つ
>
> NMLISTVIEW構造体のiSubItemメンバは常にマウスカーソルがある位置のサブアイテムインデックスを格納しているんですが
> iItemメンバはアイテムの選択可能範囲(選択した時に青くなる所)外だと-1が格納されています
>
> この辺は大丈夫でしょうか
いえ、大丈夫じゃありません…

by trio » 2007年3月23日(金) 00:46

元のコードを見ていて気づいたことが一つ

NMLISTVIEW構造体のiSubItemメンバは常にマウスカーソルがある位置のサブアイテムインデックスを格納しているんですが
iItemメンバはアイテムの選択可能範囲(選択した時に青くなる所)外だと-1が格納されています

この辺は大丈夫でしょうか

by ゲスト » 2007年3月23日(金) 00:20

少しMS様にお聞きしたいことが

このコードって選択項目があればその項目のアイテムとサブアイテムを表示して
選択項目がなければインデックス0のアイテムとサブアイテムを表示するって事でしょうか?

それとも選択項目があればインデックス0のアイテムとサブアイテムを表示して
選択項目がなければカーソル位置のアイテムとサブアイテムを表示するって事でしょうか?

by trio » 2007年3月22日(木) 23:59

違ってますね
アイテムとサブアイテムの文字列の取得でしたか

失礼しました

Re: リストビューの文字列取得

by Mario2 » 2007年3月22日(木) 23:06

何か違ってるような感じがして、修正を加えてみました。こちらで試してみてはどうでしょう。これでも動かなかったらすいません。

by trio » 2007年3月22日(木) 22:51

サンプルを挙げます
これを改造すればMS様が望まれている動作も可能だと思われますがどうでしょうか
呼び出しがボタンからになっているのは
リストビューでダブルクリックしていたら選択が反転してしまって面倒だったためです

Re: リストビューの文字列取得

by M.S. » 2007年3月22日(木) 19:30

返信が1ヶ月も遅れてしまって、申し訳ありません。

7 さんと、Mario2 さんのコードを両方試しましたが、思うようにできません…orz

一応試したコードを載せておきます。

コード: 全て選択

dim hList as HWND

Function ListView_GetNextItem(ByVal hWnd As HWND,ByVal iStart As Long,ByVal flags As DWord) As Long
    Return SendMessage(hWnd,LVM_GETNEXTITEM,iStart As WPARAM,flags As LPARAM) As Long
End Function

	hList=GetDlgItem(hMainWnd,ListView1) 'Createイベント内

Sub MainWnd_ListView1_DblClick(ByRef nmListView As NMLISTVIEW)
	dim buf1[MaxPath_LV] as Byte
	dim buf2[MaxPath_LV] as Byte
	dim buf[255] as Byte

	' 選択されている項目の位置を持つ
	Dim nSelect As Long

	' 項目が選択されていない場合、-1が返ります
	nSelect=ListView_GetNextItem(GetDlgItem(hMainWnd,ListView1),-1,LVNI_ALL Or LVNI_SELECTED)

	if nSelect<>-1 then
		ListView_GetItemText(hList,0,0,buf1,MaxPath_LV)
		ListView_GetItemText(hList,0,1,buf2,MaxPath_LV)
	Elseif nSelect=-1 then
		ListView_GetItemText(hList,lvItem.iItem,0,buf1,MaxPath_LV)
		ListView_GetItemText(hList,lvItem.iItem,1,buf2,MaxPath_LV)
	End If

	wsprintf(buf,"%s%s",buf2,buf1)
	MessageBox(hMainWnd,buf,0,MB_OK)
End Sub
もう僕はお手上げです…

Re: リストビューの文字列取得

by Mario2 » 2007年2月18日(日) 11:15

>「コントロール内でマウスの左ボタンがダブルクリックされたとき」のイベント
が"MainWnd_ListView1_DblClick"であれば、(hListにリストビューのハンドル(?)が入っているとします)
ListView_GetItemText(hList,0,0,buf1,MaxPath_LV)

ListView_GetItemText(hList,nmListView.iItem,0,buf1,MaxPath_LV)
とすれば取得できたと思います。
横の2列目以降は
ListView_GetItemText(hList,nmListView.iItem,nmListView.iSubItem,buf1,MaxPath_LV)
とすれば動きそうな感じがしますが、試していないので上手くいかないかもしれません。

ページトップ