powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Ограничение ввода (побочный эффект)
21 сообщений из 21, страница 1 из 1
Ограничение ввода (побочный эффект)
    #39596480
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С целью организовать ограничение ввода в поле по количеству символов на форуме нашёл решение с примером (из Гетца), которое на первый взгляд полностью подходит для решения вопроса, но столкнулся с неприятным побочным эффектом.
Когда вводить в поле текст то по достижении указанного лимита ввод будет заблокирован, при удалении символов опять доступен до лимита, тут всё отлично. Но вот когда по достижении лимита выйти из поля а потом опять зайти до можно набрать ещё один символ а если ещё раз выйти зайти то кроме того что можно набрать символ но и удалить лишнее уже невозможно.
Можно ли как то допилить пример чтобы после достижения лимита при выходе и повторном входе в поле не давало выходить за лимит?
...
Рейтинг: 0 / 0
Ограничение ввода (побочный эффект)
    #39596511
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какое-то кривое решение. Оно не защитит и от вставки текста любой длины из буфера обмена.
Проще и надежнее так:
Код: vbnet
1.
2.
3.
4.
5.
6.
Public Sub adhLimitChars(txt As TextBox, lngLimit As Long)
    If Len(txt.Text) > lngLimit Then
        txt.Text = Left(txt.Text, lngLimit)
        txt.SelStart = lngLimit
    End If
End Sub
...
Рейтинг: 0 / 0
Ограничение ввода (побочный эффект)
    #39596670
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MrShin,

У Вашего решения есть один существенный недостаток. Если вводить символы в средине уже введённой строки то по достижению лимита курсор переходит в конец, а надо чтобы он остановился в месте ввода последнего символа. В "кривом решении" курсор остаётся в том месте где он был в момент достижения лимита. Таким образом можно удобно удалять и добавлять символы в любой части строки не выходя за лимит.
...
Рейтинг: 0 / 0
Ограничение ввода (побочный эффект)
    #39596709
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не проблема
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Public Sub adhLimitChars(txt As TextBox, lngLimit As Long)
    Dim lngPos As Long
    If Len(txt.Text) > lngLimit Then
        lngPos = IIf(txt.SelStart > lngLimit, lngLimit, txt.SelStart)
        txt.Text = Left(txt.Text, lngLimit)
        txt.SelStart = lngPos
    End If
End Sub
...
Рейтинг: 0 / 0
Ограничение ввода (побочный эффект)
    #39596775
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MrShin,
Опять проблема. При достижении лимита добавление символов ввод символов не блокируется если стать в средину строки (за счёт удаления последних). Надо чтобы при достижении лимита набрать лишние символы было невозможно а если надо что-то добавить то перед этим только убрав символы в любом месте строки.
...
Рейтинг: 0 / 0
Ограничение ввода (побочный эффект)
    #39596785
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему не хотите просто маской ввода воспользоваться? Она все это делает.
...
Рейтинг: 0 / 0
Ограничение ввода (побочный эффект)
    #39596800
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MrShinА почему не хотите просто маской ввода воспользоваться? Она все это делает.

Маска не очень удобна в конкретном случае:
1. Количество символов может быть ниже лимита, а маска подразумевает ещё ввод (пользователи нервничают видя подчёркивание маски путая его с символами)
2. Проблемно вставить символы внутри строки (удаляются другие символы)
3. Желательно иметь индикатор оставшихся символов

Этому техзаданию отлично подходит "кривое решение" за исключением момента описанного в первом сообщении.
...
Рейтинг: 0 / 0
Ограничение ввода (побочный эффект)
    #39596821
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда я бы перенес обработку в событие Keypressed. Возвращается просто 0 вместо кода клавиши при достижении лимита. Если не получится самому сделать, отвечу как только доберусь до компа.
...
Рейтинг: 0 / 0
Ограничение ввода (побочный эффект)
    #39596828
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GVOV,

Я бы, вообще, не заморачивался с отслеживанием текста. Дожидался бы действий по сохранению введенного текста и уж после этого занимался бы проверкой длины и правильности ввода. Ну, разве что, показать длину уже введенного текста...
...
Рейтинг: 0 / 0
Ограничение ввода (побочный эффект)
    #39596879
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Rivkin Dmitry,
Этот вариант сейчас работает. Но хотелось бы чтобы пользователь думал об ограничении поля во время его заполнения и когда вышел за лимит сразу тут же подумал об оптимизации и удалил или сократил некоторые слова. Для этого и хочется чтобы поле имело ограничение на ввод и просто не давало ввести больше, а так как больше текст не набирается пользователь сразу начнёт думать об оптимизации, убирая лишнее в строке тем самым образую запас лимита в который внесёт всю нужную информацию. Индикация текста играет вспомогательную роль.
...
Рейтинг: 0 / 0
Ограничение ввода (побочный эффект)
    #39596882
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GVOV,

Для предотвращения ввода внутри строки нужно добавить такой обработчик:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Sub txtTest_KeyPress(KeyAscii As Integer)
    If Len(txtTest.Text) >= Me.txtValue Then
        Select Case KeyAscii
        Case 8
        Case Else
            Beep
            KeyAscii = 0
        End Select
    End If
End Sub


При этом оставить то, что уже есть на Change. В этом случае до вызова adhLimitChars будет доходить только при вставке данных из буфера обмена, включая вставку с помощью мыши. Если это не требуется, можно убрать эту функцию вообще.
...
Рейтинг: 0 / 0
Ограничение ввода (побочный эффект)
    #39596885
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MrShinТогда я бы перенес обработку в событие Keypressed. Возвращается просто 0 вместо кода клавиши при достижении лимита. Если не получится самому сделать, отвечу как только доберусь до компа.

В таком подходе предвижу проблемы при обработке удаления символов, выделения текста и набора вместо него нового.
Исходный пример эти проблемы как бы решает кроме того что не обрабатывает первый символ при повторном входе.

Никто не может натолкнуть на мысль, отталкиваясь от исходного примера?
...
Рейтинг: 0 / 0
Ограничение ввода (побочный эффект)
    #39596898
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GVOVЭтот вариант сейчас работает. Но хотелось бы чтобы пользователь думал об ограничении поля во время его заполнения и когда вышел за лимит сразу тут же подумал об оптимизации и удалил или сократил некоторые слова

Да просто при превышении длины делай цвет текста (или надписи поля) красным, уверяю - будут думать и сокращать... только нужно наверно отслеживать длину Me.Pole1. Text
...
Рейтинг: 0 / 0
Ограничение ввода (побочный эффект)
    #39596899
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И наверно в Chenge
...
Рейтинг: 0 / 0
Ограничение ввода (побочный эффект)
    #39596962
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vmag,

Вариант неплохой. Даже в чём то более универсальный чем мой изначальный так как можно выйти за лимит набрав всю нужную информацию (и получить красный свет) а потом ужимать до того состояния пока влезет (и цвет станет нормальным). А при сохранении не давать сохранить пока не будет приведено в соответствие. Осталось только придумать какой-то универсальный ненавязчивый информативный индикатор.

Спасибо за наводку!
...
Рейтинг: 0 / 0
Ограничение ввода (побочный эффект)
    #39596963
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MrShin,
С KeyPress как будто получилось убрать побочный эффект.

Всем большое спасибо за помощь!!!
...
Рейтинг: 0 / 0
Ограничение ввода (побочный эффект)
    #39597203
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GVOVВ таком подходе предвижу проблемы при обработке удаления символов, выделения текста и набора вместо него нового.
Да вроде нет никаких проблем

GVOVНикто не может натолкнуть на мысль, отталкиваясь от исходного примера?
Вот, честно говоря, не знаю как допилить исходный пример для устранения проблемы с повторным входом и, особенно, со вставкой из буфера обмена, потому и предложил другой подход. Да и вообще, API функциями лучше пользоваться в крайних случаях, когда без них ну никак не обойтись, а тут все решается штатными средствами.
...
Рейтинг: 0 / 0
Ограничение ввода (побочный эффект)
    #39598706
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно глянуть на последнюю получившуюся версию?
...
Рейтинг: 0 / 0
Ограничение ввода (побочный эффект)
    #39598775
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joss,

Ну глянь (то, что я предлагал)...
Первый вариант как-то мудреней и требует костылей...
...
Рейтинг: 0 / 0
Ограничение ввода (побочный эффект)
    #39598855
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vmagJoss,

Ну глянь (то, что я предлагал)...
Первый вариант как-то мудреней и требует костылей...

Да Ваш вариант намного попроще и перспективней для дальнейшего усовершенстования, но я пока что остался на первом варианте устранив побочный эффект
...
Рейтинг: 0 / 0
Ограничение ввода (побочный эффект)
    #39599532
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, посмотрел. Вариант vmag легче встроить в программу. Вариант GVOV более наворочен.
Чем может грозить использование API? Тем что программа может не пойти на 64-х разрядном Access. И описание API у Вас должно будет выглядеть вот так. Так он заработает на любой версии Access

Код: 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.
#If VBA7 Then
'  Code is running in the new VBA7 editor
     #If Win64 Then
     '  Code is running in 64-bit version of Microsoft Office
        Declare PtrSafe Function SendMessage _
         Lib "user32" Alias "SendMessageA" _
         (ByVal hwnd As LongPtr, ByVal wMsg As Long, _
         ByVal wParam As LongPtr, lParam As Any) As LongPtr
        
        Declare PtrSafe Function GetFocus _
         Lib "user32" () As LongPtr
    #Else
     '  Code is running in 32-bit version of Microsoft Office
        Private Declare PtrSafe Function SendMessageLong _
         Lib "user32" Alias "SendMessageA" _
         (ByVal hwnd As Long, ByVal wMsg As Long, _
         ByVal wParam As Long, lngValue As Long) As Long
        
        Private Declare PtrSafe Function GetFocus _
         Lib "user32" () As Long
     #End If
#Else
' Code is running in VBA version 6 or earlier
    Private Declare Function SendMessageLong _
     Lib "user32" Alias "SendMessageA" _
     (ByVal hwnd As Long, ByVal wMsg As Long, _
     ByVal wParam As Long, lngValue As Long) As Long
    
    Private Declare Function GetFocus _
     Lib "user32" () As Long
#End If
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Ограничение ввода (побочный эффект)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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