ListBox: (2) fmMultiSelectExtended - как?

Программирование на Visual Basic for Applications
Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

ListBox: (2) fmMultiSelectExtended - как?

Сообщение Bagathur » 24.08.2006 (Чт) 12:58

Сижу вот уже второй день листаю справку по Listbox Control с его Properties и Methods, но так и не понял как с ним работать при 3ьем типе мультиселекта.
Вроде написано что вместо .value и .text используется .selected, но как это применить в коде? В случае когда выделен только один элемент вроде что-то получается, правда не совсем то, чего я хочу, но когда выделено несколько элементов - просто беда.
Написано что выделенные данные воспринимаются как массив - но как их записывать в другой массив, где уже есть значения? и как удалять все выделенные элементы?
С мультиселект Single работало .RemoveItem Index, а что использовать здесь? Ту же команду с циклом по извлечению Index для каждого из элементов, которые Selected? Или есть есть одна команда применимая сразу ко всем выделенным элементам?
'Til the blood on your hans is the blood of the King!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 24.08.2006 (Чт) 14:22

Вся разница будет заключаться в том, что выделенные элементы от невыделенных можно отличить при помощи свойства Selected. Его то и надо использовать для получения выделенных элементов
Весь мир матрица, а мы в нем потоки байтов!

Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 24.08.2006 (Чт) 16:49

А нет какой нибудь команды типа
For AllSelected Add To Array или AllSelected: if vbNormal then Open? :)
Неужели чтобы работать с выделенными элементами списка необходимо перебирать их все, проверяя свойство Selected, и только потом производить действия?
'Til the blood on your hans is the blood of the King!

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

Сообщение alibek » 24.08.2006 (Чт) 16:58

Да, ты понял правильно. Именно так и нужно.
Только я не понял, зачем нужно перебирать элементы и только потом делать что-нибудь.
Перебирай и сразу же делай.
Lasciate ogni speranza, voi ch'entrate.

Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 25.08.2006 (Пт) 2:07

Есть ли однострочная простая команда, которая сразу возвращает номер выделенного элемента (для 0 случая селекта)? Или, возможно, сразу его удаляет?
Сейчас делаю по алгоритму "запомнить значение выделенного элемента - сравнить весь список с выделенным - при совпадении запомнить номер (номера) - удалить элемент списка с запомненным номером".
'Til the blood on your hans is the blood of the King!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 25.08.2006 (Пт) 7:07

Тебе нужно удалить выделенные элементы или что?

Если сделать нужно именно это, то по циклу проверяй каждый элемент на его выделенность (Selected(Index) = True) и, если он выделен, сразу же и удаляй. Есть нюанс. Цикл нужно начинать с последнего элемента и идти к перрвому.
Весь мир матрица, а мы в нем потоки байтов!

Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 25.08.2006 (Пт) 8:00

Цикл нужно начинать с последнего элемента и идти к перрвому.

Я мб и ньюб, но даже я это знаю! :)
Сталкивался уже пару раз с тем, что в цикле
For i=0 To (ListBox.Listcount-1)
при удалении элементов внутри цикла в один прекрасный момент получается так, что i > Listcount, а момент когда i = Listcount пропущен.
Я просто думал что есть какая-то команда для работы одновременно со ВСЕМИ выделенными элементами multiselect.
'Til the blood on your hans is the blood of the King!

Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 25.08.2006 (Пт) 9:43

Я понял, что мне было нужно: Listbox.Listindex! Жаль что я только что узнал о том, что это такое.
Код: Выделить всё
i = -1
Do While i < (ПутиФайлов.ListCount - 1)
i = i + 1
Select Case xwFiles
   Case 1
If Right(ПутиФайлов.List(i, 0), 4) <> ".doc" Then
ПутиФайлов.RemoveItem i
i = i - 1
End If
  (...)
   End Select
Loop

Так я "убегаю" от ошибки когда i уже больше Listcount, но ещё не было ему равно.
'Til the blood on your hans is the blood of the King!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 25.08.2006 (Пт) 10:54

а не проще так:

Код: Выделить всё
For i = ListBox.Listcount-1 To 0  Step -1
' типа код
Next i

?
Весь мир матрица, а мы в нем потоки байтов!

Bagathur
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2006 (Чт) 12:36
Откуда: Moscow

Сообщение Bagathur » 25.08.2006 (Пт) 11:05

Проще, но хуже, потому что не сам придумал, а авторских прав нету 8)
Спасибо, Випер.
'Til the blood on your hans is the blood of the King!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 25.08.2006 (Пт) 11:23

Bagathur писал(а):Проще, но хуже, потому что не сам придумал, а авторских прав нету 8)
Спасибо, Випер.


ну поставвь копирайт! :D типа Viper©
Весь мир матрица, а мы в нем потоки байтов!


Вернуться в VBA

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

Сейчас этот форум просматривают: Google-бот и гости: 56

    TopList