powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / список с мультивыбором
21 сообщений из 21, страница 1 из 1
список с мультивыбором
    #32768065
Andrey Sk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть списко с мультивыбором. Щелкаем по строкам - выделяем записи, нажимаем кнопку, которая открывает отчет с выделенными записями следующим образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
For Each varItem In Me!Sheet.ItemsSelected
        strWhere = strWhere & Me!Sheet.Column( 0 , varItem) & ","
    Next varItem
    If strWhere <> "" Then
        strWhere = Left(strWhere, Len(strWhere) -  1 )
        stLinkCriteria = "MyKeyField IN (" & strWhere & ")"
        DoCmd.OpenReport stDocName, acViewPreview, , stLinkCriteria
    End If

Вопросы:
1. Каков предел количства записей, запихиваемых в конструкцию stLinkCriteria = "MyKeyField IN (" & strWhere & ")" . Что он есть - в этом я убедился, но вот оценить предел не смог.
2. Как отменить выделение записи в списке при превышении предела. Код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Sub Sheet_BeforeUpdate(Cancel As Integer)
Dim varItem As Variant
    Me!Selected =  0 
    For Each varItem In Me!Sheet.ItemsSelected
        Me!Selected = Me!Selected +  1 
    Next varItem
    If Me!Selected > intRecLimit Then
        Cancel = True
        MsgBox "Больше выделить низзя!"
        SendKeys "{ESC}"
    End If
End Sub
не помог
...
Рейтинг: 0 / 0
список с мультивыбором
    #32768148
The maximum length of the wherecondition argument is 32,768 characters (unlike the Where Condition action argument in the Macro window, whose maximum length is 256 characters).
Хотя, если подумать, то это ж скока всякой-всячины надо засунуть, шобы превысить 32 тыщи символов...
...
Рейтинг: 0 / 0
список с мультивыбором
    #32768219
Andrey Sk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторХотя, если подумать, то это ж скока всякой-всячины надо засунуть, шобы превысить 32 тыщи символов...

Ну так юзер в списке из 1000 строк становится на 1 строку, жмет шифт, на последнюю строку - и готова ошибка

Спасибо, а то в долбанной справке никак не мог найти ответа.

А по второму вопросу есть мнения?
...
Рейтинг: 0 / 0
список с мультивыбором
    #32768231
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Trim тебе поможет
...
Рейтинг: 0 / 0
список с мультивыбором
    #32768262
Andrey Sk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторTrim тебе поможет
Да отсечь-то не проблема - проблема показать это в самом списке - т.е. не дать выделять строки в списке больше, чем надо
...
Рейтинг: 0 / 0
список с мультивыбором
    #32768274
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это ж надо умудриться столько выбрать, что в IN не влезет :)
...
Рейтинг: 0 / 0
список с мультивыбором
    #32768303
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Private Sub Список1_Click()
Debug.Print Список1.ItemsSelected.Count
End Sub


Private Sub Список1_KeyUp(KeyCode As Integer, Shift As Integer)
Debug.Print Список1.ItemsSelected.Count
End Sub

(с выражением лица)
...
Рейтинг: 0 / 0
список с мультивыбором
    #32768316
надо лишь количесво выделенных строк умножить на максимальное количество включаемых в строку символов (первой процедурой в первом посте) и сравнить с 32тыщами...
...
Рейтинг: 0 / 0
список с мультивыбором
    #32768339
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тень Виктошинадо лишь количесво выделенных строк умножить на максимальное количество включаемых в строку символов (первой процедурой в первом посте) и сравнить с 32тыщами...

(за минусом прочих символов запроса)

я так давно уже думаю. (сомневался - может это не тень, а кобольт?)
вчера убедился окончательно - "оно" есть.
а севодни она сама себе имя дала...
...
Рейтинг: 0 / 0
список с мультивыбором
    #32768352
Andrey Sk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Victosha&Co

КАК НЕ ДАТЬ ЮЗЕРУ ВЫДЕЛЯТЬ СТРОК В СПИСКЕ БОЛЬШЕ ЧЕМ n?????
Че тут непонятного в вопросе????
...
Рейтинг: 0 / 0
список с мультивыбором
    #32768364
Фотография Shuhard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey Sk 2Victosha&Co

КАК НЕ ДАТЬ ЮЗЕРУ ВЫДЕЛЯТЬ СТРОК В СПИСКЕ БОЛЬШЕ ЧЕМ n?????
Че тут непонятного в вопросе????
чё орать - не дать выделить нельзя
события нет,можно после выделения выдать предупреждение или оставить по любому алгоритму n строк.
...
Рейтинг: 0 / 0
список с мультивыбором
    #32768394
Andrey Sk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняйте, если что не так

2Shuhard

Верю на слово
...
Рейтинг: 0 / 0
список с мультивыбором
    #32768402
Дааааа, ДААААА, я такое, я большооооое )))))))))))))

з.ы. Тьфу на вас!
...
Рейтинг: 0 / 0
список с мультивыбором
    #32768439
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не дать выделить - можно -
надо задействовать принудительную отмену выделения

Список1.Selected(ItemNumber) = False
управлять этим можно, задействовав промежуточный массив "ранее выбранных номеров строк".

Код писать не буду - в две минуты не напишу.
Если интерес сохранится - ввечеру.
ЗЫ
Ваащето там усе достаточно "прозрачно"
...
Рейтинг: 0 / 0
список с мультивыбором
    #32768593
Andrey Sk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Victosha

Беру свои слова обратно,
Код: plaintext
Список1.Selected(ItemNumber) = False
- то что надо
...
Рейтинг: 0 / 0
список с мультивыбором
    #32769203
Andrey Sk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И в заключение темы:

Допустим мы определили лимит выделенных строк - L

Тогда ставим такой код для отката выделения

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Private Sub Sheet_AfterUpdate()
Dim L As Integer
Dim n As Integer

If Me.Sheet.ItemsSelected.Count > L Then
    MsgBox "Дорогой юзверь, как ни старайся - тебе не удастся выделить в списке больше " & L & " строк"
    Me.Sheet.Selected(Me!Sheet.ListIndex) = False
    n =  1 
    While Me.Sheet.ItemsSelected.Count > L
        Me.Sheet.Selected(Me!Sheet.ListIndex - n) = False
        n = n +  1 
    Wend
End If
End Sub
...
Рейтинг: 0 / 0
список с мультивыбором
    #32769293
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще-то именно подобного сорта код в данном случае лучше поместить на
событие Exit из контрола.
В afterUpdate он не будет работать как ожидается для случая
последовательного выбора методом нажатия клавиши со стрелкой вверх/вниз
при одновременно нажатой клавише шифт.

Еще одна деталь - ListIndex при вышеописанном выделении принимает значение номера строки, с которой начинается подобный "сплошной выбор"...

поэтому свою мысль о "промежуточном хранилище ранее выбранного"
пока оставлю при себе.


(с выражением лица)
...
Рейтинг: 0 / 0
список с мультивыбором
    #32769370
Фотография Shuhard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
де жа вю

/topic/81199&hl=Selected
...
Рейтинг: 0 / 0
список с мультивыбором
    #32769778
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поковырял...
получилось вот что:
1)"мысль" про про массив - в лоб не проходит. И, в целом, больше походит на
глупость...

2) для режима простого выделения достаточно было бы "одиночной проверки
без цикла"

3) для режима со связным выбором - код Andrey Sk или его
вариации - практически единственный разумный выбор (на мой взгляд).
Попытки "улучшить " очевидно усложняют ситуацию и, если и способны
завершиться успехом, то немалой ценой...

Замечания по применению для режима со связным выбором.

По моим наблюдениям, получилось, что перехват надо проводить
в трех событиях: KeyDown, Click и MouseMove (а вот от Exit, так же как и от
afterUpdate предлагаю отказаться... ). При этом первые два "универсальны" по
отношению к режиму выбора. Последний - специфичен именно для связного
выбора.

KeyDown работает в случае "сплошного выделения" стрелками ввер/вниз.

Click работает при одиночных выделениях мышью в обоих режимах и при
клавиатурном выделении пробелом в режиме простого множественного
выбора. Кроме того, в режиме связанного выбора он работает при отпускании
клавиши мыши после массового сплошного выделения мышью, при условии,
что список на момент отпускания клавиши мыши остается текущим активным
контролом для формы.

MouseMove - про него хочется сказать отдельно...

В режиме связного выбора начнем производить массовый выбор следующим способом - нажав левую клавишу мыши и не отпуская ее протянуть вверх или вниз по списку, выделив сплошную область строк. В момент протягивания область выделения в окне списка расширяется, а ItemsSelected.Count
остается неизменным.

а) если далее просто отпустить клавишу мыши - произойдет Click.

б) Если не отпуская клавишу мыши, нажать Tab, то произойдет следующее -
контрол отменно потеряет фокус и тот переместится на следующий контрол.
Формально говоря, и afterUpdate и Exit при этом вызываются. Однако,
поскольку ItemsSelected до отпускания мыши не сформирован, то проверять
по существу нечего. В момент же отпускания мыши происходит
именно "отложенный" MouseMove на уже покинутом контроле.


Сам код у меня получился несущественно модифицированным по сравнению с
предложенным Andrey Sk. На мой взгляд, все это естественно оформляется в
виде класса. Если же настаивать на функции - то получится что-то такое:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
 Function MaxSelectionExeeded(tControl As Access.ListBox, maxNum As Long, _
        Optional ShowMes As Boolean, Optional MesStr As String = "Выбрано слишком много элементов.") As Boolean
        
    Dim tCount As Long
    tCount = tControl.ItemsSelected.Count
      
    If tCount > maxNum Then
      If ShowMes Then
        MsgBox MesStr, vbOKOnly
      End If
      
      Dim inDex As Long, tPos As Long
      
      tPos = tCount -  1 
      With tControl
         For inDex = maxNum +  1  To tCount
            .Selected(.ItemsSelected(tPos)) = False
            tPos = tPos -  1 
         Next
       End With
     MaxSelectionExeeded = True
  End If

End Function


(с выражением лица)
...
Рейтинг: 0 / 0
список с мультивыбором
    #32770406
Andrey Sk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Victosha

Мож книжку напишем в соавторстве ;-))
Списки - вообще мой любимый контрол в аксе, я еще много про них знаю 8-)
...
Рейтинг: 0 / 0
список с мультивыбором
    #32770468
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey Sk 2 Victosha

Мож книжку напишем в соавторстве ;-))
Списки - вообще мой любимый контрол в аксе, я еще много про них знаю 8-)

у меня с простым чтением пробемы, а уж с письмом - совсем никуда.
Так что, напишешь - почитаю с удовольствием.
Могу потестировать при случае чаво ненужного.
Писать не смогу. В общем-то, я ничего не знаю, о чем писать следовало бы...


А что знаешь - это хорошо. Может, расскажешь при случае...

ЗЫ1
В действительности, абсолютно чистого поведения в KeyDown у меня не получилось, а доковыривать под утро уже не было желания...

Да и других вопросов тоже осталось...

было интересно посмотреть - раньше именно это не ковырял...
так что - спасибо.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / список с мультивыбором
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]