リストビューでの不具合についてお伺いします
Posted: 2008年4月08日(火) 14:15
前回RS232Cで受信したデータをリストビューに表示するようにしましたが、
そこで次のような問題が起きています。
最初は意図したとおりに表示されるのですが、データを削除し再び受信し、
データを表示させると、lstrcpy で設定したデータが、その直前に記載したデ
ータにも反映されてしまいます。2回目以降 全てこの様な状態です。
abfanに掲載されているコードを元に同じ様な事をさせたところ同様な結果と
なりました。それを見てください。
どのようにすれば回避できるのか、お教え願えないでしょうか。
A B C A B C
A0 B0 C0 → A0 C0 C0
A1 B1 C1 → A1 C1 C1
A2 B2 C2 → A2 C2 C2
↑ ↑
最初 2回目以降
A0~B2は .pszText = "A0"
C0~C2は lstrcpy(.pszText, Dt0) の様に設定しています。
そこで次のような問題が起きています。
最初は意図したとおりに表示されるのですが、データを削除し再び受信し、
データを表示させると、lstrcpy で設定したデータが、その直前に記載したデ
ータにも反映されてしまいます。2回目以降 全てこの様な状態です。
abfanに掲載されているコードを元に同じ様な事をさせたところ同様な結果と
なりました。それを見てください。
どのようにすれば回避できるのか、お教え願えないでしょうか。
A B C A B C
A0 B0 C0 → A0 C0 C0
A1 B1 C1 → A1 C1 C1
A2 B2 C2 → A2 C2 C2
↑ ↑
最初 2回目以降
A0~B2は .pszText = "A0"
C0~C2は lstrcpy(.pszText, Dt0) の様に設定しています。
コード: 全て選択
' ----------------------------------------------------------------------------
' イベント プロシージャ
' ----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' メモ - 以下の領域を、変数、構造体、定数、関数を宣言するための、
' グローバル領域として利用することができます。
' ----------------------------------ここから----------------------------------
Dim hList As Long 'リストビューのハンドル
' ----------------------------------ここまで----------------------------------
Sub MainWnd_Destroy()
T_ListView_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub MainWnd_CB_EXIT_Click()
MainWnd_Destroy()
End Sub
Sub MainWnd_Resize(SizeType As Long, cx As Integer, cy As Integer)
Dim rc As RECT
GetClientRect(hMainWnd,rc) 'クライアント領域のサイズを取得
hList=GetDlgItem(hMainWnd,ListView1) 'ListView1のウィンドウ ハンドルを取得
MoveWindow(hList, 0, 30, rc.right, rc.bottom - 30, 0) 'hListの大きさを変更する
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim clm As LVCOLUMN
hList=GetDlgItem(hMainWnd,ListView1) 'リストビューのハンドルを取得
SendMessage(hList,LVM_SETEXTENDEDLISTVIEWSTYLE,0, _
LVS_EX_FULLROWSELECT or LVS_EX_GRIDLINES) 'リストビューの拡張スタイルを設定
With clm
.mask = LVCF_FMT or LVCF_WIDTH or LVCF_TEXT
.fmt = LVCFMT_CENTER
.pszText = "A" : .cx = 80 'カラムの設定
SendMessage(hList,LVM_INSERTCOLUMN,0,VarPtr(clm))
.pszText = "B" : .cx = 80
SendMessage(hList,LVM_INSERTCOLUMN,1,VarPtr(clm))
.pszText = "C" : .cx = 80
SendMessage(hList,LVM_INSERTCOLUMN,2,VarPtr(clm))
End With
End Sub
Sub MainWnd_CB_ADD_Click()
Dim itm As LVITEM
Dim Dt0[5] As Byte, Dt1[5] As Byte, Dt2[5] As Byte
lstrcpy(Dt0, "C0")
lstrcpy(Dt1, "C1")
lstrcpy(Dt2, "C2")
With itm
.mask = LVIF_TEXT
.iItem = 0 : .iSubItem = 0 : .pszText = "A0" 'アイテムを追加 1行目
SendMessage(hList,LVM_INSERTITEM,0,VarPtr(itm))
.iItem = 0 : .iSubItem = 1 : .pszText = "B0"
MessageBox(0,.pszText,"pszText",MB_OK) '確認の為
SendMessage(hList,LVM_SETITEM,0,VarPtr(itm))
.iItem = 0 : .iSubItem = 2 : lstrcpy(.pszText, Dt0)
SendMessage(hList,LVM_SETITEM,0,VarPtr(itm))
.iItem = 1 : .iSubItem = 0 : .pszText = "A1" 'アイテムを追加 2行目
SendMessage(hList,LVM_INSERTITEM,0,VarPtr(itm))
.iItem = 1 : .iSubItem = 1 : .pszText = "B1"
SendMessage(hList,LVM_SETITEM,0,VarPtr(itm))
.iItem = 1 : .iSubItem = 2 : lstrcpy(.pszText, Dt1)
SendMessage(hList,LVM_SETITEM,0,VarPtr(itm))
.iItem = 2 : .iSubItem = 0 : .pszText = "A2" 'アイテムを追加 3行目
SendMessage(hList,LVM_INSERTITEM,0,VarPtr(itm))
.iItem = 2 : .iSubItem = 1 : .pszText = "B2"
SendMessage(hList,LVM_SETITEM,0,VarPtr(itm))
.iItem = 2 : .iSubItem = 2 : lstrcpy(.pszText, Dt2)
SendMessage(hList,LVM_SETITEM,0,VarPtr(itm))
End With
End Sub
'ラベルの編集が終わった時の処理
Sub MainWnd_ListView1_EndLabelEdit(ByRef nmLVDispInfo As NMLVDISPINFO)
SendMessage(hList,LVM_SETITEM,0,VarPtr(nmLVDispInfo.item)) '結果の書き戻し
End Sub
Sub MainWnd_CommandButton1_Click()
ListView_DeleteAllItems(GetDlgItem(hMainWnd,ListView1)) 'アイテムを削除
End Sub