[リストへもどる]
一括表示

投稿時間:2003/04/13(Sun) 15:09
投稿者名:のび
Eメール:
URL :
タイトル:
リストビューの削除処理
DBの検索結果を表示する際にリストビューを使用しています。
リストビューのリストアイテムの削除処理が遅くて困ってます。
1万を超える処理では単純な追加・削除だけみても処理時間が圧倒的に違うようなので向いてないのかと
思っていますが、客からはリストビューでお願いと言われてるので変更もできません。
削除処理を少しでも速くする方法ってありませんか?


'-------------------
dim i as long
dim xListItems as ListItems
set xListItems=lvwTarget

'追加
lvwList.Visible = False
for i=0 to 10000
xListItems.Add ,,i
Next i
lvwList.Visible = True

'削除
lvwList.Visible = False
for i=0 to 10000
xListItems.Remove (1)
Next i
lvwList.Visible = True

投稿時間:2003/04/13(Sun) 21:59
投稿者名:Starfish
Eメール:
URL :
タイトル:
Re: リストビューの削除処理
> 削除処理を少しでも速くする方法ってありませんか?

>'削除
>lvwList.Visible = False
>for i=0 to 10000
> xListItems.Remove (1)
>Next i
>lvwList.Visible = True

 全件削除なら、Clearメソッドを使いましょう。
 1件削除なら、このサンプルでは気になりませんが
複数件を削除するなら、Clearしてから追加したほうが
早い場合もあると思います。

投稿時間:2003/04/13(Sun) 22:14
投稿者名:peta
Eメール:
URL :
タイトル:
Re: リストビューの削除処理
> DBの検索結果を表示する際にリストビューを使用しています。
> リストビューのリストアイテムの削除処理が遅くて困ってます。
> 1万を超える処理では単純な追加・削除だけみても処理時間が圧倒的に違うようなので向いてないのかと
> 思っていますが、客からはリストビューでお願いと言われてるので変更もできません。
> 削除処理を少しでも速くする方法ってありませんか?


少し速くなる程度ですが。

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
        (ByVal hwnd As Long, ByVal wMsg As Long, _
         ByVal wParam As Long, lParam As Any) As Long

Private Const LVM_FIRST = &H1000&
Private Const LVM_DELETEALLITEMS = (LVM_FIRST + 9)

    Call SendMessage(ListView1.hwnd, LVM_DELETEALLITEMS, 0, ByVal 0&)


削除よりも登録の方が遅いでしょう。
できれば、表示項目数だけデータを保持する様なOCXを探すか自作できれば
いいんですが。

投稿時間:2003/04/13(Sun) 23:49
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: リストビューの削除処理
> DBの検索結果を表示する際にリストビューを使用しています。
> リストビューのリストアイテムの削除処理が遅くて困ってます。
> 1万を超える処理では単純な追加・削除だけみても処理時間が圧倒的に違うようなので向いてないのかと

その件数になると、仮想リストビューを用いるという手法もあります。
http://www.microsoft.com/japan/developer/library/vccore/_core_virtual_list_controls.htm

ただ、処理がAPI主体になるので、扱いが面倒ではありますが…。

投稿時間:2003/04/14(Mon) 00:22
投稿者名:NAO★
Eメール:
URL :
タイトル:
Re: リストビューの削除処理
私も以前似たような質問をしたことがあります。
Visual C++だと「仮想リストビュー」という機能がつかえます。

VBでも使えないかなとおもって検索してみたら、次のようなページを見つけました。
「VB Using Virtual List Views」
http://msdn.microsoft.com/library/en-us/mmc/mmc/vb_using_virtual_list_views.asp?frame=true

英語なので、よくわかりませんが、これが使えるかもしれません

投稿時間:2003/04/14(Mon) 00:57
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^2: リストビューの削除処理
> VBでも使えないかなとおもって検索してみたら、次のようなページを見つけました。
> 「VB Using Virtual List Views」
> http://msdn.microsoft.com/library/en-us/mmc/mmc/vb_using_virtual_list_views.asp?frame=true

こんなサンプルもあります。こちらでは、ListViewをユーザーコントロール化して、
仮想リストの各種通知メッセージを、VBのイベントに変換してあります。
http://www.mvps.org/vbvision/Sample_Projects.htm#Virtual_ListView_Demo

たとえばこのサンプルの場合は、Form_Load等で
   UVirtualListView1.SetItemCount 10000000
と書くだけで、一千万件のデータを瞬時に表示することができます。
(実際のデータ表示は、ItemInfoCallback イベント中にて行います)

ListViewがスクロールするなどして、新たなデータを表示する必要が生じた際に
ItemInfoCallbackイベントが発生するように作られているので、

Private Sub UVirtualListView1_ItemInfoCallback( _
        ByVal iItem As Long, ByVal iSubitem As Long, _
        ByVal fMask As Long, sText As String, hImage As Long)

    Select Case iSubitem
     Case 0
        sText = "項目 " & Format$(iItem, "#,0")
     Case 1
        sText = "サブアイテム 1"
     Case 2
        sText = "サブアイテム 2"
    End Select
End Sub

のようなコードを書いておく事で、データを表示させることができます。

投稿時間:2003/04/14(Mon) 01:00
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^3: リストビューの削除処理
> > VBでも使えないかなとおもって検索してみたら、次のようなページを見つけました。
> > 「VB Using Virtual List Views」
> > http://msdn.microsoft.com/library/en-us/mmc/mmc/vb_using_virtual_list_views.asp?frame=true
> こんなサンプルもあります。こちらでは、ListViewをユーザーコントロール化して、
> 仮想リストの各種通知メッセージを、VBのイベントに変換してあります。
> http://www.mvps.org/vbvision/Sample_Projects.htm#Virtual_ListView_Demo

なお、このサンプルコード(Virtual ListView Demo.zip)では、コード中にサブクラス化を用いていますので、
デバッグ前に、Microsoftのオーナーズエリア、または先のサイトから Debug ObjectのDLL(Dbgwproc.dll)を
入手して、それを参照設定しておいてください。

もしくは、実行前にDbgwproc.dllへの参照設定を外しておき、かつ、プロジェクトのプロパティで
条件付コンパイル定数を指定しないようにしても、プログラムを試す事ができます。


# このDbgwproc.dllの件に付いては、先のサイトやサンプル中にも
# 書かれていますが…一応念のために補足しておきます。

投稿時間:2003/04/14(Mon) 00:38
投稿者名:のび
Eメール:
URL :
タイトル:
レスありがとうございます
クリアして再作成、APIで削除、仮想リストビューとそれぞれ試してみます。
ありがとうございました。