Listbox_Click, Message.Question, Listbox.Remove

OpenSUSE-KDE-Plasma Gambas 3.19.3 qt5

Een eigenaardig feonomeen: ik laat de gebruiker op de listbox klikken, waarop gevraagd wordt of hij de betreffende listbox lijn (aangeduid door Listbox.index) wil verwijderen. Zo ja, verwijder ik die met Listbox.Remove(Listbox.Index).

Mijn voorbeeld: de listbox (Mode: Single) bevat 1 lijn. Ik klik op knop 1.

Code:

Public Sub lsbxError_Click()
  Dim i As Integer
'  
  i = Message.Question(lsbxError.Index & ": " & lsbxError.Text, "Clear", "Clear All", "Cancel")
  Debug i
  Select i 
    Case 1
      lsbxError.Remove(lsbxError.Index)
    Case 2
      lsbxError.Clear
    Case 3
    ' else do nothing
  End Select
'
End

Na het verwijderen van de lijn krijg ik een nieuwe vraag met een lege tekst en als index -1. Als je nog eens op Clear klikt, krijg je een foutmelding Out of bounds
.. op de lijn van de Remove; het gaat blijkbaar over de index.

Ik merk op (bij meer elementen) dat de listbox na het verwijderen een ander item selecteert (zonder dat ik dat expliciet vraag), dat ik dan ook niet meer kan kiezen voor verwijderen.
Ik kan de fout blijkbaar vermijden door een “unselect” toe te voegen:

Public Sub lsbxError_Click()
  Dim i As Integer
  '
  i = Message.Question(lsbxError.Index & ": " & lsbxError.Text, "Clear", "Clear All", "Cancel")
  Debug i
  Select i 
    Case 1
      lsbxError.Remove(lsbxError.Index)
      lsbxError.UnselectAll()
    Case 2
      lsbxError.Clear
    Case 3
    ' else do nothing
  End Select
'
End

en de “index” fout kan ik vermijden door op voorhand een voorwaarde toe te voegen:

Public Sub lsbxLog_Click()
  Dim i As Integer
  
  Debug lsbxLog.Index
  If lsbxLog.Index >= 0 Then
    i = Message.Question(lsbxLog.Text, "Clear", "Clear All", "Cancel")
    Select i
      Case 1
        lsbxLog.Remove(lsbxLog.Index)
        lsbxLog.UnselectAll()
      Case 2
        lsbxLog.Clear
      Case Else
        ' else do nothing
    End Select
  Endif
  
End
This entry was posted in Gambas3. Bookmark the permalink.