misc.log

日常茶飯事とお仕事と

VB6.0 Error 35605 このアイテムのコントロールは削除されています

VB6.0のアプリにて、エラー番号 35605のエラー「このアイテムのコントロールは削除されています」が発生、Webでとりあえずエラー番号を検索してみましたが、海外サイトにいくつか情報があるくらいであまり該当しそうなケースが無い。

仕方ないのでどうやったら発生するかを見てみました。エラーが出ている箇所はどうやらListViewへのデータ設定部分のようだったので、ListViewで再現を試してみたところ、下記のようなコードで現象が出ました。

    Dim colHeader As ColumnHeader
    Dim eachItem As ListItem
    With Me.listViewData
        .BorderStyle = ccFixedSingle
        .View = lvwReport '表示形式を詳細レポートに
        Set colHeader = .ColumnHeaders.Add(, , "", 0)
        Set colHeader = .ColumnHeaders.Add(, , "番号", 800, lvwColumnRight)
        Set colHeader = .ColumnHeaders.Add(, , "案件名", 3050, lvwColumnCenter)
    End With
    
    '実ソースをまねたListViewへのデータ設定処理(1行、サブアイテム2個だけ)
    Set eachItem = Me.listViewData.ListItems.Add(, , "")
    'サブアイテムに値を設定
    eachItem.SubItems(1) = "00001"
    eachItem.SubItems(2) = "ABCDEFG"
    
    'eachItemがListItemを参照したまま、ListItemをクリア(要するに、参照されてるのに
    '参照先を消してしまう)
    listViewData.ListItems.Clear
    
    '消えているデータを、eachItem経由で参照しようとする
    '(ここでエラーが起きる)
    eachItem.Selected = True

実際の処理をまねたサンプルなので、何やってんだ?的な処理があるのはご容赦を。

普通に存在しないListItemを参照すると、インデックスが有効範囲にありません、的なエラーになります。しかし、ListItemを参照するオブジェクトを用意し、参照先だけを消した状態(要するに参照しているが先に実体が無い)にして改めてListItemを取り扱おうとするとこのエラーが発生するようです。

問題は…そういうケースに一致しそうなパターンが無いんですよね。やたらとDoEventsが入っているプログラムなので、処置途中でボタンなどが追っかけで押されて多重処理(参照中にListView自体がクリアされてしまう、など)かとも思ったのですが、ちょっとそういうケースもオペレーション的になさそうで……行き詰まってます。