Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Ограничение ввода (побочный эффект) / 21 сообщений из 21, страница 1 из 1
04.02.2018, 23:46
    #39596480
GVOV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение ввода (побочный эффект)
С целью организовать ограничение ввода в поле по количеству символов на форуме нашёл решение с примером (из Гетца), которое на первый взгляд полностью подходит для решения вопроса, но столкнулся с неприятным побочным эффектом.
Когда вводить в поле текст то по достижении указанного лимита ввод будет заблокирован, при удалении символов опять доступен до лимита, тут всё отлично. Но вот когда по достижении лимита выйти из поля а потом опять зайти до можно набрать ещё один символ а если ещё раз выйти зайти то кроме того что можно набрать символ но и удалить лишнее уже невозможно.
Можно ли как то допилить пример чтобы после достижения лимита при выходе и повторном входе в поле не давало выходить за лимит?
...
Рейтинг: 0 / 0
05.02.2018, 06:39
    #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
05.02.2018, 12:27
    #39596670
GVOV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение ввода (побочный эффект)
MrShin,

У Вашего решения есть один существенный недостаток. Если вводить символы в средине уже введённой строки то по достижению лимита курсор переходит в конец, а надо чтобы он остановился в месте ввода последнего символа. В "кривом решении" курсор остаётся в том месте где он был в момент достижения лимита. Таким образом можно удобно удалять и добавлять символы в любой части строки не выходя за лимит.
...
Рейтинг: 0 / 0
05.02.2018, 13:17
    #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
05.02.2018, 14:18
    #39596775
GVOV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение ввода (побочный эффект)
MrShin,
Опять проблема. При достижении лимита добавление символов ввод символов не блокируется если стать в средину строки (за счёт удаления последних). Надо чтобы при достижении лимита набрать лишние символы было невозможно а если надо что-то добавить то перед этим только убрав символы в любом месте строки.
...
Рейтинг: 0 / 0
05.02.2018, 14:33
    #39596785
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение ввода (побочный эффект)
А почему не хотите просто маской ввода воспользоваться? Она все это делает.
...
Рейтинг: 0 / 0
05.02.2018, 14:43
    #39596800
GVOV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение ввода (побочный эффект)
MrShinА почему не хотите просто маской ввода воспользоваться? Она все это делает.

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

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

Я бы, вообще, не заморачивался с отслеживанием текста. Дожидался бы действий по сохранению введенного текста и уж после этого занимался бы проверкой длины и правильности ввода. Ну, разве что, показать длину уже введенного текста...
...
Рейтинг: 0 / 0
05.02.2018, 16:08
    #39596879
GVOV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение ввода (побочный эффект)
Rivkin Dmitry,
Этот вариант сейчас работает. Но хотелось бы чтобы пользователь думал об ограничении поля во время его заполнения и когда вышел за лимит сразу тут же подумал об оптимизации и удалил или сократил некоторые слова. Для этого и хочется чтобы поле имело ограничение на ввод и просто не давало ввести больше, а так как больше текст не набирается пользователь сразу начнёт думать об оптимизации, убирая лишнее в строке тем самым образую запас лимита в который внесёт всю нужную информацию. Индикация текста играет вспомогательную роль.
...
Рейтинг: 0 / 0
05.02.2018, 16:10
    #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
05.02.2018, 16:13
    #39596885
GVOV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение ввода (побочный эффект)
MrShinТогда я бы перенес обработку в событие Keypressed. Возвращается просто 0 вместо кода клавиши при достижении лимита. Если не получится самому сделать, отвечу как только доберусь до компа.

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

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

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

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

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

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

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

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

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

Да Ваш вариант намного попроще и перспективней для дальнейшего усовершенстования, но я пока что остался на первом варианте устранив побочный эффект
...
Рейтинг: 0 / 0
09.02.2018, 10:59
    #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
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Ограничение ввода (побочный эффект) / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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