powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как реализовать выбор в поле со списком, если список большой
18 сообщений из 43, страница 2 из 2
Как реализовать выбор в поле со списком, если список большой
    #39298305
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тремя сообщениями выше )))
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39298310
Фотография Tarasios
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Decabrist, так я дал своё видение реализации ответа на ваш вопрос. Или надо с конкретным работающим примером?
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39298320
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не нужно, я понял. Мне кажется со списками будет все громоздко. Особенно если подобных полей не одно.
Вообще хотелось какую-то вариативность. Хочет пользователь - набирает в поле сочетание символов, по этим символам содержимое поля фильтруется. Я так уже делал когда-то. Не знает что ищет - желает посмотреть - правый клик мышкой по полю со списком, меню, открываем форму со всеми значениями (присоединенными к полю со списком) так как они записаны в базе. Скроллит, находит что нужно, тыкает - форма закрывается, а значение остается в поле со списком. Ну или не находит и добавляет новую запись, которая затем и отображается в поле со списком.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39298321
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По последнему варианту хрен знает как это правильно сделать, не понятно как передавать значение из формы в форму так что бы потом проблем не было, но реализовать так хотелось бы.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39298322
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TarasiosИменно элемент список, а не поле со списком
А чем лучше просто список выпадающего списка? Только место занимает. Я давно использую для выбора из огромных списков со сложными названиями класс для комбобокса, который реализует гуглоподобный поиск при вводе: начинаем набирать текст в комбобоксе, после заданного минимального числа символов (обычно 2) включается таймер, и как только пользователь превысил заданную паузу, список автоматически раскрывается, показывая только элементы, содержащие введенные символы. Далее, если пользователь ввел пробел и продолжил ввод, то поиск идет уже по двум элементам и так далее. Если в списке остался только один элемент, то он может быть выбран автоматически, в зависимости от настроек класса. Быстродействие такого способа очень хорошее - даже на разделенной базе с бэкэнодом на сетевом диске при общем количестве элементов порядка 10000 задержек практически не заметно.

Если нужно, могу поделиться классом, цепляется двумя командами к любому комбобоксу. Ну и запрос для комбобокса должен быть сделан по определенным правилам.

Если пользователь вообще не знает, с чего начать при выборе данных, может просто раскрыть полный список и посмотреть, что там, но это не удобно для очень больших списков, поэтому можно реализовать своего рода помощь начинающему: по даблклику на комбобоксе открываем справочную форму с базовыми элементами, после выбора одного или нескольких базовых элементов подставляем в комбобокс ключевые элементы и раскрываем список, он будет содержать строки только с выбранными ключевыми элементами
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39298327
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Decabristне понятно как передавать значение из формы в форму так что бы потом проблем не было
А какие проблемы с передачей?

Я использую для передачи параметров между формами OpenArgs для передачи входящих параметров, где параметры идут в виде списка "ключ1=значение1|ключ2=значение2", принимающая форма открывается в виде модального диалога. Если в коде предполагается открывать диалог более одного раза, то создаю функцию, если один раз, то просто напрямую. Обратная передача параметров - диалог не закрывается, а делается невидимым, выполнение кода продолжается после команды открытия формы, там мы считываем возвращаемые параметры из полей формы или из созданных там свойств и закрываем диалог.

Ссылку на открывающую форму в открываемую при необходимости также передаю через текст в OpenArgs - в виде текстового пути "форма>подформа>подформа". Это, правда, не работает с формами, открытыми как инстанс.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39298331
Фотография Tarasios
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShin, интересный подход. Может даже, он идеален. И если выложите в доступ, буду благодарен. Но может выявиться некое противоречие: если мы исходим из того, что пользователь - не мы с вами, а является типичной бухгалтершей (условно), стремление которой к изучению новых методик стремится к нулю (а может - и сама способность к изучению), то такой подход может оказаться для неё слишком сложен. Это же изучить и осознать, что надо начинать набирать часть слова (а его ещё и вспомнить ведь надо, а там тысячи позиций), потом нажать пробел, потом опять буковки тыкать... А потом тыкать на найденное значение... А ещё ведь есть альтернативный способ поиска, скроллингом, а это ещё позиции знаний, которые надо изучить ;) Уверен, что вам встречалось множество таких юзеров, с реакций на необходимость что то менять и учить - даже если для вас это элементарно - от простых слёз до откровенного саботажа ;) Тут уже вопрос к психологам, но факт есть факт: подавляющее кол-во людей все силы готовы потратить на защиту от изменений своего маленького и привычного мирка, даже если эти изменения ничтожны и реально им на пользу пойдут ;)
Потому то я где то и ратую за реализацию замены длинного списка с пусть даже с хитрым поиском - на последовательный выбор по иерархии (Группа, подгруппа, позиция): максимум примитивизма, простейший алгоритм действий, максимум защиты от левых движений пользователя. В каждом блоке - выбор из небольшого списка (если получается все равно слишком много позиций в одной категории - значит, надо ещё больше дробить, добавлять кол-во веток иерархии).
Во всяком случае, такой метод много раз испытан и вопросов не возникает. Ну разве что некоторые привыкли к пользованию классическим "деревом".
ПыСы: пока не протестируешь всё на "бибизянках", то есть - юзерах, и не получишь их отзывы - любое самое идеальное решение - является просто предметом академического спора программеров ;)
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39298454
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пример. Описание в заголовке класса. Окно таймера используется для того, чтобы не использовать таймер основного окна, т.к. он может быть занят другими задачами.

Приложениями, использующими этот контрол пользуются операторы, далекие от ИТ, типа бухгалтерии или склада, проблем с освоением не возникало, достаточно сказать в двух словах как пользоваться или подсказку для контрола заполнить
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39315287
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пришлось на некоторое время прерваться..
MrShin А какие проблемы с передачей?

Я использую для передачи параметров между формами OpenArgs для передачи входящих параметров, где параметры идут в виде списка "ключ1=значение1|ключ2=значение2", принимающая форма открывается в виде модального диалога.


К сожалению я в программировании не силен. Программирую что-то когда необходимость вынуждает. С этим параметром не работал ни разу, и пока не очень представляю как его использовать в моем случае.
Еще судя по вашему описанию - вы подразумеваете нечто другое. Принимающей формой у меня является как раз инициирующая запрос форма. Т.е. например имеем на форме комбобокс на которые повешено 100500 значений. Работать с таким "списком" нормально не возможно. Отчасти это решаемо путем фильтрации списка при вводе символов пользователем, но если пользователь не знает что ищет - это не решение проблемы.
Необходимо по какому то действию (двойной щелчек на контроле) - вывести форму со списком всех значений, а так же с элементами управления, фильтрации, группировки и т.п. Здесь ничего сложного не вижу - по событию (двойной клик мышкой) DoCmd.OpenForm.
А вот дальше мне не понятно. Ну нашел пользователь нужную ему запись - ткнул на нее... как сделать так что бы эта запись отобразилась теперь на первой, инициирующей форме в комбобоксе?
Вообще нужно ли для этой операции создавать полностью отдельную форму? Я надеялся использовать независимо существующую форму для просмотра и редактирования списка.
Ваш пример с комбобоксом скачал и проверил, у меня выдает ошибку и требует переделать код под 64х битную систему.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39315310
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока сделал так:
Инициирующая форма с комбобоксом, по двойному клику мышкой на контроле:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Sub cmbComponent_DblClick(Cancel As Integer)

DoCmd.OpenForm "frmComponent", acNormal, , , acFormReadOnly, acDialog

If CurrentProject.AllForms("frmComponent").IsLoaded Then
   Me.cmbComponent.Value = Forms!frmComponent!subComponent.Form!fldComponent.Value
   DoCmd.Close acForm, "frmComponent"
Else
 
End If

End Sub



Форма со списком элементов комбобокса по двойному клику мышкой на контролах всех полей (знаю что криво, но лучше пока не придумал, так что бы клик срабатывал на всей записи в любом поле единой процедурой не получается):

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Private Sub fldComponent_DblClick(Cancel As Integer)
 Forms!frmComponent.Form.Visible = False

End Sub

Private Sub strDescription_DblClick(Cancel As Integer)
 Forms!frmComponent.Form.Visible = False

End Sub

Private Sub strName_DblClick(Cancel As Integer)
 Forms!frmComponent.Form.Visible = False

End Sub

Private Sub strProperty_DblClick(Cancel As Integer)
 Forms!frmComponent.Form.Visible = False

End Sub



Как бы еще добавить в код проверку открыта ли форма в виде диалога, или самостоятельно. Так что бы при открытии самостоятельной формы никаких действий по скрытию формы не производить.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39315347
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristНу нашел пользователь нужную ему запись - ткнул на нее... как сделать так что бы эта запись отобразилась теперь на первой, инициирующей форме в комбобоксе?
Я обычно для модальных диалогов, которые должны возвращать одно или несколько значений использую функции, подобные той, что приведена ниже. В основной форме по двойному щелчку вызываем эту функцию, если она вернула истину, то присваиваем измененную переменную комбобоксу. В диалоге вместо закрытия скрываем его, закрывается он уже в функции, после получения необходимых данных из диалога:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Public Function SelectDatasetDialog(ByRef strDSFileName As String) As Boolean
' функция возвращает истину, если был сделан выбор. Выбранные данные возвращаются через аргументы, переданные по ссылке
Dim blnRet As Boolean

On Error Resume Next
'на всякий случай закрываем окно, если оно случайно осталось открытым и невидимым
DoCmd.Close acForm, "frm_DatasetSelect"
On Error GoTo ErrorHandler

blnRet = False
DoCmd.OpenForm "frm_DatasetSelect", , , , , acDialog
'сюда управление возвращается, как тольк диалог делается невидимым
If Nz(Form_frm_DatasetSelect.txtFileName, "") = "" Then ' - проверяем поле, которое содержит основные данные - если пустое, значит отменили диалог без выбора
    'cancel clicked
    GoTo ExitHere
End If
' получаем еще данные для возврата
strDSFileName = Form_frm_DatasetSelect.txtFileName

blnRet = True

ExitHere:
    On Error Resume Next
    SelectDatasetDialog = blnRet
    ' теперь закрываем диалог окончательно
    DoCmd.Close acForm, "frm_DatasetSelect"
    Exit Function

ErrorHandler:
Select Case Err
Case 0
    Resume Next
Case Else
    LogError Err.Number, Err.Description, Erl, "SelectDatasetDialog", "bas_Utilites"
    Resume ExitHere
End Select
End Function
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39315351
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristКак бы еще добавить в код проверку открыта ли форма в виде диалога, или самостоятельно.
Проверьте, есть ли Parent у формы. Есл есть, то она открыта как субформа:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Public Function IsFormStandalone(frm As Form) As Boolean
    Dim frmParent As Form
    
    IsFormStandalone = False
    
    On Error Resume Next
    Set frmParent = frm.Parent
    If Err.Number = 2452 Then
        On Error GoTo ErrorHandler
        Err.Clear
        IsFormStandalone = True
    ElseIf Err.Number <> 0 Then
        GoTo ErrorHandler
    End If
End Function
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39315365
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristВаш пример с комбобоксом скачал и проверил, у меня выдает ошибку и требует переделать код под 64х битную систему.
Добавил поддержку 64 бит
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39315372
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MrShin,

Я правильно понял форма открытая как acDialog уже является подчиненной, и имеет родительскую (Parent) форму?
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39315384
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо!
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39315400
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristЯ правильно понял форма открытая как acDialog уже является подчиненной, и имеет родительскую (Parent) форму?
Нет, это отдельная форма, acDialog обеспечивает только модальность этого окна.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39315406
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е. в данном случае проверить в каком режиме открыта форма нельзя?
В принципе не вопрос, я могу сделать копию существующей формы со списком модифицировать ее в части взаимодействия с вызывающей формой и использовать эту копию в данной конкретной ситуации. Приложение очень маленькое, путаницы в дальнейшем быть не должно. Но такой подход, думается, не корректен.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39315443
КВВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DecabristА вот дальше мне не понятно. Ну нашел пользователь нужную ему запись - ткнул на нее... как сделать так что бы эта запись отобразилась теперь на первой, инициирующей форме в комбобоксе?Вот, увидев впервые на работе, подумал, что ленточные формы с окошком на каждом поле с выбором вида фильтра (начинается, кончается, входит, равно, не равно...) и самого значения фильтра, а также с галочками сортировки по каждому полю - простая и чрезмерная угодливость заказчику. А на практике, где ежемесячно сотни тысяч записей, где данными пользуются разные службы и подразделения, оказалось совсем даже удачно. Конечно же, предусмотрены рабочие формы для имеющих права редактирования, отчеты по отобранным значениям, экспорт в Excell, просмотр самого фильтра в текстовом виде и т.д. и т.п. И комбобоксы оказались совсем ненужными по сравнению с этими окошками.
...
Рейтинг: 0 / 0
18 сообщений из 43, страница 2 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как реализовать выбор в поле со списком, если список большой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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