by 淡幻星 » 2005年12月20日(火) 20:43
ListViewにSendMessage(hList,LVM_SORTITEMS,0,0)を送ると、一番左のカラムの部分でソートが行われると思うのですが、これを2番目以降のカラムの部分でソートを行いたいのですが、0の部分を1とかに変更しても"変わらない・エラーが発生してしまい"、方法が分からず困っています。
ソート用の関数を自前で定義する必要があるみたいですね。
私もよく知らない&現在AB環境が無いのでサンプルを作れないですが、
http://www.kumei.ne.jp/c_lang/sdk2/sdk_110.htm
が参考になるかと思います。C/C++言語の解説ページ(「猫でも分かる~」)ですが、
使っている構造体はABでも大抵定義されていると思いますので、
なんとか移植できるかと…。
で、リストビューの任意カラムでのソートは私も知りたいので、
AB用のリストビューソートライブラリにまとめてもらえると嬉しいです♪(マテ。
ははは、自分でやれって罠?(爆)。
まぁせめても、ってことで、
たぶんABには定義されて無いだろうListView_SortItemsマクロを書いてみました。
コード: 全て選択
'// commctrl.hより抜粋
'#define ListView_SortItems(hwndLV, _pfnCompare, _lPrm) \
' (BOOL)SNDMSG((hwndLV), LVM_SORTITEMS, (WPARAM)(LPARAM)(_lPrm), \
' (LPARAM)(PFNLVCOMPARE)(_pfnCompare))
Sub ListView_SortItems( hWnd As DWord, pfnCompare As DWord, lParamSort As Long )
SendMessage( hWnd, LVM_SORTITEMS, lParamSort, pfnCompare )
EndSub
pfnCompareはソートを受け持つ関数へのポインタになるので
AddressOfで得る必要があります、たぶん。
その関数の組み方しだいで、昇順やら降順やら好きなようにソートできそうですね。
もう一つ。
たぶんABでは定義されていない(少なくともVer.3.13では)リストビュー関連の構造体やらマクロなど。
こちらをクリック [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
'参考
'http://hira.hopto.org/absample1.htm#ListView
'http://www.kumei.ne.jp/c_lang/sdk2/sdk_198.htm
'拡張リストビューのチェックボックスの有無を調べるのに必要
Const LVIS_STATEIMAGEMASK = &hF000
Function ListView_GetCheckState( hListV As Long, nIndex As Long )
ListView_GetCheckState = ( SendMessage( hListV, LVM_GETITEMSTATE, nIndex, LVIS_STATEIMAGEMASK) >> 12) - 1
EndFunction
'上記とは逆に、チェックをつける/外すを受け持つ。
Sub ListView_SetCheckState( hListV As DWord, nIndex As Long, fCheck As Long )
Dim lvitem As LVITEM
With lvitem
.stateMask = LVIS_STATEIMAGEMASK
.state = (fCheck + 1) << 12
End with
SendMessage( hListV, LVM_SETITEMSTATE, nIndex, VarPtr(lvitem) )
EndSub
'リストビュー用LV_COLUMN構造体
Type LV_COLUMN
mask As Long
fmt As Long
cx As Long
pszText As String
cchTextMax As Long
iSubItem As Long
End Type
'リストビュー用LV_ITEM構造体
Type LV_ITEM
mask As Long
iItem As Long
iSubItem As Long
state As Long
stateMask As Long
pszText As BytePtr
cchTextMax As Long
iImage As Long
lParam As Long
End Type
'リストビュー用LV_DISPINFO構造体
Type LV_DISPINFO
hdr As NMHDR
item As LV_ITEM
End Type
'アイテムを追加。
'Text=一番左の列に表示する文字列、hWnd=ListViewコントロールのハンドル、
'Index=アイテムの番号(通常は上から0,1,2…と通し番号にすればOK)
Sub AddListVItem( hWnd As Long, nIndex As Long, pText As BytePtr )
Dim lvitem As LV_ITEM
lvitem.mask = LVIF_TEXT
lvitem.iItem = nIndex
lvitem.pszText = pText
lvitem.iSubItem = 0
SendMessage( hWnd , LVM_INSERTITEM, NULL, VarPtr( lvitem ) )
End Sub
'サブアイテムを設定。
'Text=設定する文字列、hWnd=ListViewコントロールのハンドル、Index=アイテムの番号、IndexSub=列番号(一番左の列が0、2列目が1…)
Sub SetListVItem( hWnd As Long, nIndex As Long, nIndexSub As Long, pText As BytePtr )
Dim lvitem As LV_ITEM
lvitem.mask = LVIF_TEXT
lvitem.iItem = nIndex
lvitem.pszText = pText
lvitem.iSubItem = nIndexSub
SendMessage( hWnd , LVM_SETITEM, NULL, VarPtr( lvitem ) )
End Sub
'アイテムを追加する(サブもメインも関係なくw)
Sub AddListViewItem( hWnd As Long, nIndex As Long, nIndexSub As Long, pText As BytePtr )
If( nIndexSub=0 )Then
AddListVItem( hWnd, nIndex, pText )
Else
SetListVItem( hWnd, nIndex, nIndexSub, pText )
EndIf
EndSub
'アイテムを削除。
'hWnd=ListViewコントロールのハンドル、Index=アイテムの番号
Sub DelListItem( hWnd As Long, nIndex As Long )
SendMessage( hWnd, LVM_DELETEITEM, nIndex, 0 )
End Sub
'全アイテムを削除。
'hWnd=ListViewコントロールのハンドル
Sub DelAllListItem( hWnd As Long )
SendMessage( hWnd, LVM_DELETEALLITEMS, NULL, NULL )
End Sub
'カラムを削除。
'hWnd=ListViewコントロールのハンドル、Index=カラムの番号。但し0(一番左のカラム)を指定することはできない。
Sub DelColumn( hWnd As Long, nIndex As Long)
SendMessage( hWnd, LVM_DELETECOLUMN, nIndex, NULL )
End Sub
'選択されているアイテムの番号を取得。
'hWnd=ListViewコントロールのハンドル
Function FindSelListItem( hWnd As Long ) As Long
FindSelListItem=SendMessage( hWnd, LVM_GETITEMCOUNT, -1, 2 )
'&H100C
End Function
[quote]ListViewにSendMessage(hList,LVM_SORTITEMS,0,0)を送ると、一番左のカラムの部分でソートが行われると思うのですが、これを2番目以降のカラムの部分でソートを行いたいのですが、0の部分を1とかに変更しても"変わらない・エラーが発生してしまい"、方法が分からず困っています。[/quote]
ソート用の関数を自前で定義する必要があるみたいですね。
私もよく知らない&現在AB環境が無いのでサンプルを作れないですが、
http://www.kumei.ne.jp/c_lang/sdk2/sdk_110.htm
が参考になるかと思います。C/C++言語の解説ページ(「猫でも分かる~」)ですが、
使っている構造体はABでも大抵定義されていると思いますので、
なんとか移植できるかと…。
で、リストビューの任意カラムでのソートは私も知りたいので、
AB用のリストビューソートライブラリにまとめてもらえると嬉しいです♪(マテ。
ははは、自分でやれって罠?(爆)。
まぁせめても、ってことで、
たぶんABには定義されて無いだろうListView_SortItemsマクロを書いてみました。
[code]'// commctrl.hより抜粋
'#define ListView_SortItems(hwndLV, _pfnCompare, _lPrm) \
' (BOOL)SNDMSG((hwndLV), LVM_SORTITEMS, (WPARAM)(LPARAM)(_lPrm), \
' (LPARAM)(PFNLVCOMPARE)(_pfnCompare))
Sub ListView_SortItems( hWnd As DWord, pfnCompare As DWord, lParamSort As Long )
SendMessage( hWnd, LVM_SORTITEMS, lParamSort, pfnCompare )
EndSub[/code]pfnCompareはソートを受け持つ関数へのポインタになるので
AddressOfで得る必要があります、たぶん。
その関数の組み方しだいで、昇順やら降順やら好きなようにソートできそうですね。
もう一つ。
たぶんABでは定義されていない(少なくともVer.3.13では)リストビュー関連の構造体やらマクロなど。
[hide=こちらをクリック][code]'参考
'http://hira.hopto.org/absample1.htm#ListView
'http://www.kumei.ne.jp/c_lang/sdk2/sdk_198.htm
'拡張リストビューのチェックボックスの有無を調べるのに必要
Const LVIS_STATEIMAGEMASK = &hF000
Function ListView_GetCheckState( hListV As Long, nIndex As Long )
ListView_GetCheckState = ( SendMessage( hListV, LVM_GETITEMSTATE, nIndex, LVIS_STATEIMAGEMASK) >> 12) - 1
EndFunction
'上記とは逆に、チェックをつける/外すを受け持つ。
Sub ListView_SetCheckState( hListV As DWord, nIndex As Long, fCheck As Long )
Dim lvitem As LVITEM
With lvitem
.stateMask = LVIS_STATEIMAGEMASK
.state = (fCheck + 1) << 12
End with
SendMessage( hListV, LVM_SETITEMSTATE, nIndex, VarPtr(lvitem) )
EndSub
'リストビュー用LV_COLUMN構造体
Type LV_COLUMN
mask As Long
fmt As Long
cx As Long
pszText As String
cchTextMax As Long
iSubItem As Long
End Type
'リストビュー用LV_ITEM構造体
Type LV_ITEM
mask As Long
iItem As Long
iSubItem As Long
state As Long
stateMask As Long
pszText As BytePtr
cchTextMax As Long
iImage As Long
lParam As Long
End Type
'リストビュー用LV_DISPINFO構造体
Type LV_DISPINFO
hdr As NMHDR
item As LV_ITEM
End Type
'アイテムを追加。
'Text=一番左の列に表示する文字列、hWnd=ListViewコントロールのハンドル、
'Index=アイテムの番号(通常は上から0,1,2…と通し番号にすればOK)
Sub AddListVItem( hWnd As Long, nIndex As Long, pText As BytePtr )
Dim lvitem As LV_ITEM
lvitem.mask = LVIF_TEXT
lvitem.iItem = nIndex
lvitem.pszText = pText
lvitem.iSubItem = 0
SendMessage( hWnd , LVM_INSERTITEM, NULL, VarPtr( lvitem ) )
End Sub
'サブアイテムを設定。
'Text=設定する文字列、hWnd=ListViewコントロールのハンドル、Index=アイテムの番号、IndexSub=列番号(一番左の列が0、2列目が1…)
Sub SetListVItem( hWnd As Long, nIndex As Long, nIndexSub As Long, pText As BytePtr )
Dim lvitem As LV_ITEM
lvitem.mask = LVIF_TEXT
lvitem.iItem = nIndex
lvitem.pszText = pText
lvitem.iSubItem = nIndexSub
SendMessage( hWnd , LVM_SETITEM, NULL, VarPtr( lvitem ) )
End Sub
'アイテムを追加する(サブもメインも関係なくw)
Sub AddListViewItem( hWnd As Long, nIndex As Long, nIndexSub As Long, pText As BytePtr )
If( nIndexSub=0 )Then
AddListVItem( hWnd, nIndex, pText )
Else
SetListVItem( hWnd, nIndex, nIndexSub, pText )
EndIf
EndSub
'アイテムを削除。
'hWnd=ListViewコントロールのハンドル、Index=アイテムの番号
Sub DelListItem( hWnd As Long, nIndex As Long )
SendMessage( hWnd, LVM_DELETEITEM, nIndex, 0 )
End Sub
'全アイテムを削除。
'hWnd=ListViewコントロールのハンドル
Sub DelAllListItem( hWnd As Long )
SendMessage( hWnd, LVM_DELETEALLITEMS, NULL, NULL )
End Sub
'カラムを削除。
'hWnd=ListViewコントロールのハンドル、Index=カラムの番号。但し0(一番左のカラム)を指定することはできない。
Sub DelColumn( hWnd As Long, nIndex As Long)
SendMessage( hWnd, LVM_DELETECOLUMN, nIndex, NULL )
End Sub
'選択されているアイテムの番号を取得。
'hWnd=ListViewコントロールのハンドル
Function FindSelListItem( hWnd As Long ) As Long
FindSelListItem=SendMessage( hWnd, LVM_GETITEMCOUNT, -1, 2 )
'&H100C
End Function[/code][/hide]