удаление из списка определенного элемента

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Xaker_S
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 09.04.2003 (Ср) 3:28
Откуда: Severomorsk

удаление из списка определенного элемента

Сообщение Xaker_S » 25.04.2003 (Пт) 8:28

:( Как удалить из списка элемент с определенным содержимым?
Т.е. к примеру дан список:
Иванов
Петров
Сидоров
Щелкаем по кнопке и к примеру Петров удаляется.
Можно конечно использовать индекс чтобы удалить, но это неподходит-
список не статический. Т.е. надо проверить есть ли в списке Петров,
узнать его индекс, а потом удалить.
Как сделать?

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 25.04.2003 (Пт) 8:38

дан список:
Иванов
Петров
Сидоров

допустим нужно удалить Петрова
Код: Выделить всё
Sub Del(Name As String)
    Dim i As Integer
    For i = 0 To lst.ListCount - 1
        If lst.List(i) = Name Then
            lst.RemoveItem(i)
            Exit For
        End If
    Next i
End Sub

использование
Код: Выделить всё
Del "Петров"

lst - это контрол ListBox
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

Xaker_S
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 09.04.2003 (Ср) 3:28
Откуда: Severomorsk

Сообщение Xaker_S » 25.04.2003 (Пт) 10:14

8) Ща попробую. Спасибо

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.04.2003 (Пт) 13:53

Если у списка свойство .Sorted=True, то можно использовать бинарный поиск, это гораздо быстрее, чем перебор.
Кроме того, можно использовать API, отсылать сообщение LB_FINDSTRING.
Lasciate ogni speranza, voi ch'entrate.

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 25.04.2003 (Пт) 14:05

alibek писал(а):Если у списка свойство .Sorted=True, то можно использовать бинарный поиск, это гораздо быстрее, чем перебор.
Кроме того, можно использовать API, отсылать сообщение LB_FINDSTRING.

перебор было первое что пришло в голову, да и самое простое (хоть и не самое эффективное).
а вот про LB_FINDSTRING можно кодом, если не затруднит?
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.04.2003 (Пт) 14:17

Ну например так:
Код: Выделить всё
Public Enum WindowMessageConstants
  cbFindString = &H14C&
  lbFindString = &H18F&
End Enum

Public Declare Function SendMessage Lib "user32" _
  Alias "SendMessageA" ( _
   ByVal hWnd As Long, _
   ByVal wMsg As WindowMessageConstants, _
   ByVal wParam As Long, _
   lParam As Any) _
  As Long

Function FindByValue(ListControl As Control, Optional ByVal Value As String) As Long
Dim I As Long, msg As Long
If TypeOf ListControl Is ComboBox Then
  msg = WindowMessageConstants.cbFindString
  If Value = vbNullString Then Value = ListControl.Text
ElseIf TypeOf ListControl Is ListBox Then
  msg = WindowMessageConstants.lbFindString
Else
  Exit Function
End If
I = SendMessage(ListControl.hWnd, msg, -1&, ByVal Value)
FindByValue = I+1
End Function


Данный код подходит и для ListBox и для ComboBox. После вызова функция сообщает индекс элемента, базирующийся с единицы, т.е. чтобы использовать на обычном ListBox, следует применять List1.ListIndex = FindByValue(List1, "Петров")-1

И еще одно. Если список сортирован (.Sorted=True), то возвращается индекс наиболее соответствующего элемента, при .Sorted=False поиск проводится по полному значению. Т.е. если всегда нужно ПОЛНОЕ соответствие, то код следует усложнить, т.е. включить в него строчку
Код: Выделить всё
If ListControl.List(I)<>Value Then I=0
Lasciate ogni speranza, voi ch'entrate.

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 25.04.2003 (Пт) 15:36

2alibek: большой senx.
только поясни для тех кто в танке, если список сортированный и внем такие элементы
    Ку-Ку
    Кувшин
    Курица
    Фильм

и в функцию передается в качестве строки поиска "Фи"(т.е. часть слова), то она мне вернет индекс последнего элемента ("Фильм"). я правильно понял?
А если список не сортирован, и сделать тоже самое (передать часть слова), тоже самое получится? или нет?
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.04.2003 (Пт) 15:41

Если список сортированный, то ищется подобная строка (отвечающая Like Text*). Если список не сортированный, то ищется точное соответствие (= Text). Но лучше проверь, я точно не помню :)
Lasciate ogni speranza, voi ch'entrate.

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 25.04.2003 (Пт) 15:46

alibek писал(а):Если список сортированный, то ищется подобная строка (отвечающая Like Text*). Если список не сортированный, то ищется точное соответствие (= Text). Но лучше проверь, я точно не помню :)

чтож еще раз огромное человеческое.
проверим... появилась идейка (автозаполнение). хотя этих реализаций наверной куча целая.... но свое как-то лучше. как говорится, если хочешь чтобы все работало хорошо, сделай это сам :)
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 25.04.2003 (Пт) 16:18

alibek писал(а):Если список сортированный, то ищется подобная строка (отвечающая Like Text*). Если список не сортированный, то ищется точное соответствие (= Text). Но лучше проверь, я точно не помню :)

Одинаково ищет в обоих случаях.

Cyrax писал(а):появилась идейка (автозаполнение).

Ага, механизьма хорошая. Вот такая вот заготовочка. Есно, должны присутствовать декларации от alibek.

Код: Выделить всё
Private LastComboKeyAscii As Long

Private Sub Combo1_Change()
   
    Dim i%, p%
   
    Select Case LastComboKeyAscii
    Case 8, 46
    Case Else
        With Combo1
            i = FindByValue(Combo1, .Text)
            If (i) Then
                p = .SelStart
                .ListIndex = i - 1
                .SelStart = p
                .SelLength = Len(.Text) - p
            End If
        End With
    End Select
   
    LastComboKeyAscii = 0
   
End Sub

Private Sub Combo1_KeyDown(KeyCode As Integer, Shift As Integer)
    LastComboKeyAscii = KeyCode
End Sub


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Mail.ru [бот] и гости: 92

    TopList