|
v7: Глюк Формекс? Или я чего-то не понял... | ☑ | ||
---|---|---|---|---|
0
MWWRuza
гуру
18.05.20
✎
14:15
|
Добрый день!
Чего-то эта тема Полнотекстовый поиск по одному полю. Как можно реализовать? (полнотекстовый поиск) навеяла... Не то, что-бы оно нужно, но... Захотелось. Вот что получилось, видеоролик: https://cloud.mail.ru/public/ZvVh/58WQVKN7H Вот текст в обработке: Перем ПодстрокаПоиска; Перем СтрДоИзм; Процедура ПриНажатииКнопкиКлавиатуры(КодКлавиши, Альт, Шифт, Контрол, Символ, ФлСт) Если ФлСт = 0 Тогда Возврат; КонецЕсли; Если Форма.АктивныйЭлемент() = "СтрПоиска" Тогда Если КодКлавиши = 13 Тогда СтатусВозврата(0); Возврат; ИначеЕсли КодКлавиши = 8 Тогда ДлинаСтрокиПоиска = СтрДлина(СокрЛП(СтрПоиска)); Если Прав(СтрДоИзм, 1) = " " Тогда ДлинаСтрокиПоиска = ДлинаСтрокиПоиска + 1; КонецЕсли; Если ДлинаСтрокиПоиска < 2 Тогда НоваяСтрокаПоиска = ""; Иначе НоваяСтрокаПоиска = Лев(СтрПоиска, ДлинаСтрокиПоиска - 1); КонецЕсли; ПодстрокаПоиска = НоваяСтрокаПоиска; ИначеЕсли Символ = " " Тогда ПодстрокаПоиска = ПодстрокаПоиска + Символ; ВведПробел = 1; Иначе ПодстрокаПоиска = ПодстрокаПоиска + Символ; КонецЕсли; СтрПоиска = ПодстрокаПоиска; СтрДоИзм = ПодстрокаПоиска; // Сообщить(ПодстрокаПоиска); Форма.ИнфСтрПоиска.Заголовок(ПодстрокаПоиска); Рез = ПопробоватьНайти(); Если Рез = 0 Тогда РезПоиска.УдалитьСтроки(); СпШкВыбТовара.УдалитьСтроки(); КонецЕсли; КонецЕсли; КонецПроцедуры Функция ПопробоватьНайти() у меня была и раньше, она на SQL-Lite сделана, и работает нормально. В принципе - нового только то, что решил сделать с помощью Формекса так, что-бы искалось не нажимая ентер в строке или кнопку, просто при вводе символов в строку. В целом - работает. Но, если вводить символы "не спеша", по одному... Стоит начать вводить быстро, начинает косячить - символы задваиваются... Что это - глюк? Попытка асинхронности в Формекс? Можно это как-то обойти? В целом, интересная штука получилась, не хочется от нее отказываться... |
|||
1
Arbuz
18.05.20
✎
14:46
|
ПопробоватьНайти() надо делать не из ПриНажатииКнопкиКлавиатуры(), а по формексовскому таймеру с интервалом мс 300, (пере)запуская который при изменении ПодстрокаПоиска
|
|||
2
MWWRuza
гуру
18.05.20
✎
14:54
|
(1) Костыль конечно, но, можно попробовать... Должно прокатить.
|
|||
3
Arbuz
18.05.20
✎
15:21
|
посмотрел, у меня не в таком, но похожем случае стоит 220мс, это порог 4,5 симв/сек. и это никакой не костыль, это pipelining performance enhancements - целая теория конвейеризации вычислений.
|
|||
4
АЛьФ
18.05.20
✎
16:01
|
Все значимые действия лучше делать в "при отжатии".
|
|||
5
MWWRuza
гуру
18.05.20
✎
20:17
|
(4) Переделал. Видимых отличий не заметил, но, пусть будет, раз так правильнее...
(1)(3) Сделал... Закомментировал вызов ПопробоватьНайти() в процедуре ПриОтжатииКнопкиКлавиатуры(), добавил предопределенную процедуру: Процедура ПослеОткрытия() Расш = СоздатьОбъект("РасширениеФормы"); Расш.ОбработкаОжидания("ПопробоватьНайти",300); КонецПроцедуры Пока, для пробы не реализовывал сравнение - изменилась строка или нет... Все равно "двоит" символы при быстром вводе... Как и ничего не менял... Функцию поменял на процедуру: Процедура ПопробоватьНайти() НаимПоиск = СокрЛП(СтрПоиска); Рез = НайтиТоварSqlLite(НаимПоиск); ДостКнопкиПривязатьШК(); КонецПроцедуры Стоит закомментировать строку "Рез = НайтиТоварSqlLite(НаимПоиск);", вызывающую поиск товара - "двоить" перестает, работает, как и задумывалось, только, естественно ничего не ищет... Может я чего-то не вижу, что-нибудь сам накосячил, где-нибудь имена пересекаются? Вообще, это должно работать? |
|||
6
Злопчинский
18.05.20
✎
20:23
|
смотри может где-то лишняя перерисовка формы
|
|||
7
MWWRuza
гуру
18.05.20
✎
20:32
|
(6) Да х.з.... Вроде нет ничего такого... Сейчас попробую комментировать строки в функции поиска, что-бы определиться - косяки от самого запроса или от обработки его результатов...
|
|||
8
MWWRuza
гуру
18.05.20
✎
21:55
|
(4) Выяснилось еще ода проблема... ПриОтжатии, если удерживать клавишу "БакСпейс"(код клавиши 8), что-бы удалить несколько символоа за раз, отрабатывает как одно событие... Когда ПриНажатии, такого нет, передается последовательность нажатий по количеству символов...
Вот, если непонятно объяснил, видео: https://cloud.mail.ru/public/3TR1/Bg7mf9pgw ИМХО, ПриНажатии более правильно работает... |
|||
9
MWWRuza
гуру
18.05.20
✎
22:37
|
По сабжу... Если ничего не находится, то и символы не задваиваются.
Например - если ввести "йцукенгшщзхъ", т.е. верхнюю строку клавиатуры, быстро, как только мне пальцы позволяют, никаких задвоений нет... Если вводить что-то реальное, например "сигареты", то, начиная со второго символа, начинает "двоить" - получается ПодСтрока поиска "сиигареты", а в поле ввода - нормально, "сигареты"... При чем, делает чаще всего только одно задвоение - по тому, что после первого-же задвоения, в базе товар перестает находиться... Хотя, если попытаться набрать "синие"(ну, видимо есть такие сигареты), то после набора "си", он задваивает букву "и", выдает "сии", и находит товар - потому, как встречается в наименованиях слово "России"(это не сигареты - "Минеральная вода родники России"), и начинает двоить следующий... Фигня какая-то... Вообще не понятно, куда копать... |
|||
10
Salimbek
19.05.20
✎
07:35
|
(9) А пошаговая отладка чего говорит?
Хотя лично я делал такое на ActiveX-контроле, потому что проще было с событиями. Нашел, тут: http://www.1cpp.ru/forum/YaBB.pl?num=1207118421 в последнем сообщении Сначала тоже думал делать как у тебя, но, вот, например, поведение юзера - выделяю часть неправильно введенного текста мышкой и нажимаю Del или Бакспейс - ожидаю, что удалится именно эта часть. |
|||
11
Salimbek
19.05.20
✎
07:48
|
+(10) И еще вот такая тема нашлась: http://www.1cpp.ru/forum/YaBB.pl?num=1152157445/30
|
|||
12
MWWRuza
гуру
19.05.20
✎
09:05
|
(10) Отладка... А отладка ничего не говорит, так, как при отладке вводишь символы медленно, и все работает правильно...
Вставил сразу в начало процедуры такое: Сообщить(Символ + " " + СтрДлина(Символ)); Вот, скриншот: https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-309.jpg Вижу, что символы прилетают не задвоенные, одиночные(я думал - Формекс два символа в одном событии выдает, а нет), нормально... Но, с повторами, типа событие возникает дважды, при одном физическом нажатии. И при отжатии - то-же самое... (10) Нашел, тут: http://www.1cpp.ru/forum/YaBB.pl?num=1207118421 в последнем сообщении. Скачал, спасибо, сейчас буду разбираться... |
|||
13
Djelf
19.05.20
✎
09:21
|
(5) Ты не туда таймер повесил. Его нужно взводить хоть в ПриНажатии, хоть в ПриОтжатии.
При повторном взводе он не сработает, а будет отложен до того момента пока кнопки не нажимаются. Ну и естественно сбрасывать при начале поиска в sqlite. |
|||
14
Salimbek
19.05.20
✎
09:41
|
(12) Странно, такое ощущение, что у тебя само вызывается где-то повторно, типа через sendkeys или тупой повторный вызов процедуры. Возможно стоит пересмотреть процедуру "НайтиТоварSqlLite"
|
|||
15
MWWRuza
гуру
19.05.20
✎
09:46
|
(13) Сейчас попробую...
(14) Возможно стоит пересмотреть процедуру "НайтиТоварSqlLite" Да ничего там особенного нет, стандартная, как в демо-примере от этой компоненты: Функция НайтиТоварSqlLite(Наим) // Тз = СоздатьОбъект("ТаблицаЗначений"); // Отладка Перем Запрос; Попытка БазаДанных = СоздатьОбъект("SQLiteBase"); Исключение ЗагрузитьВнешнююКомпоненту("1sqlite.dll"); БазаДанных = СоздатьОбъект("SQLiteBase"); КонецПопытки; Если ПустоеЗначение(Наим) = 1 Тогда Возврат 0; КонецЕсли; РазбиваемаяСтрока = СтрЗаменить(РазбиваемаяСтрока,"'","''"); РазбиваемаяСтрока = СтрЗаменить(СокрЛП(Наим)," ",РазделительСтрок); БазаДанных.Открыть(":memory:"); Запрос = БазаДанных.НовыйЗапрос(); Запрос.ВыполнитьЗапрос("create virtual table Товары using dbeng(Справочник.Номенклатура)"); Текст = "SELECT |code Код, |id [Товар :Справочник.Номенклатура] |FROM Товары |WHERE isfolder=2 and ismark <> '*'"; Для Индекс = 1 По СтрКоличествоСтрок(РазбиваемаяСтрока) Цикл Слово = СтрПолучитьСтроку(РазбиваемаяСтрока,Индекс); Если ПустоеЗначение(Слово) = 0 Тогда Текст = Текст + " |AND descr LIKE '%" + Слово + "%'"; КонецЕсли; КонецЦикла; Попытка Тз = Запрос.ВыполнитьЗапрос(Текст); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; РезПоиска.УдалитьСтроки(); Если Тз.КоличествоСтрок() > 0 Тогда Тз.ВыбратьСтроки(); Пока Тз.ПолучитьСтроку() = 1 Цикл РезПоиска.НоваяСтрока(); БазЕд = Тз.Товар.БазоваяЕдиница; Тов = Тз.Товар; РезПоиска.ШКБаз = СокрЛП(БазЕд.ШтрихКод); РезПоиска.Наименование = СокрЛП(Тз.Товар); РезПоиска.Ед = СокрЛП(БазЕд.ОКЕИ); РезПоиска.Цена = глВернутьЦенуПоТипу(БазЕд, Константа.ТипЗакЦены, РабочаяДата()); РезПоиска.Ост = ПолТекОст(Тов); РезПоиска.НайдТов = Тов; КонецЦикла; Возврат 1; Иначе СпШкВыбТовара.УдалитьСтроки(); Возврат 0; КонецЕсли; // Возврат 1; // Отладка КонецФункции |
|||
16
Salimbek
19.05.20
✎
09:59
|
А если закомментировать часть команд в этой функции - так же двоит? Или это происходит начиная с какого-то тайминга?
Кстати да, я бы сделал так: твою сформированную строку отправлял за пределы процедуры "ПриНажатии" через ВызватьВнешнееСобытие И уже в обработке внешнего события производил поиск или что-там еще |
|||
17
Salimbek
19.05.20
✎
10:01
|
+(16) Имеется в виду это: http://www.1cpp.ru/docum/html/FormEx.html#asyncevent
|
|||
18
MWWRuza
гуру
19.05.20
✎
10:03
|
(16) Пробовал еще вчера... Как только добавляю в процедуру ПриНажатии ВнешнееСобытие, сразу двоить начинает. Даже если это событие не обрабатываю, и ничего не ищу...
|
|||
19
MWWRuza
гуру
19.05.20
✎
10:06
|
+(18) Тут похоже проблема не в поиске, а в том, что вообще "что-то делается" сразу за событием ПриНажатии/отжатии... И даже вызов таймера, тот-же эффект вызывает...
|
|||
20
MWWRuza
гуру
19.05.20
✎
10:15
|
(19) А вообще - нет. Если в таймере закомментировать вызов поиска, то не двоит...
(13) Сейчас вот так сделал: Процедура ПослеОткрытия() Расш = СоздатьОбъект("РасширениеФормы"); КонецПроцедуры В процедуре ПриНажатии, закомментировал все, что касается поиска, оставил только форматирование строки. Добавил вызов таймера из: Процедура ПриОтжатииКнопкиКлавиатуры() Расш.ОбработкаОжидания("ПопробоватьНайти",300); КонецПроцедуры Эффект = 0. Все то-же самое, один в один... Так-же работает правильно при вводе "не спеша", и так-же двоит, когда вводишь нормально. |
|||
21
MWWRuza
гуру
19.05.20
✎
10:16
|
+(20) Да, в попробовать найти:
Процедура ПопробоватьНайти() Расш.ОбработкаОжидания("ПопробоватьНайти", 0); НаимПоиск = СокрЛП(СтрПоиска); Рез = НайтиТоварSqlLite(НаимПоиск); ДостКнопкиПривязатьШК(); КонецПроцедуры |
|||
22
Djelf
19.05.20
✎
10:21
|
(15) Ну что же ты так то? Конечно нужно запрос пересмотреть, чтобы тз не перебирать.
На самом деле значительно веселее такой поиск на sqlitedataprovider + ТабличноеПоле 1С++ (20) Трассируй в самой обработке вызовы поиска. При наборе символов поиска быть не должно. Он же не асинхронный... |
|||
23
Djelf
19.05.20
✎
10:24
|
+(22) А еще лучше сначала загнать в память sqlite всю номенклатуру, со всеми нужными реквизитами и дергать из памяти.
|
|||
24
Djelf
19.05.20
✎
10:29
|
Держи быстрый поиск в тп https://cloud.mail.ru/public/UW9g/4p4YkHUry
|
|||
25
Salimbek
19.05.20
✎
10:55
|
(18) Если время есть, то я могу потестировать после обеда. По идее - такого быть не должно, даже любопытно...
|
|||
26
MWWRuza
гуру
19.05.20
✎
11:05
|
(24) Красиво, спасибо. Но, в "чистом виде" не пойдет, она не ищет когда фрагменты слов не по порядку набираешь(ну, это я думаю можно дописать). Но, все равно прикольно, изучу работу с табличным полем, я когда-то уже что-то делал на нем, давно, не помню уже...
(25) Да времени сейчас - хоть отбавляй :-) Мне тоже кажется, что не должно. Самому уже не столько с "прикладной точки" это хочется доделать, а просто хочется понять, почему не работает... Сейчас соберу отдельно, внешней обработкой, и выложу сюда... |
|||
27
Djelf
19.05.20
✎
11:08
|
(26) У тебя в коде (15) алгоритм поиска уже есть. Замени эти 6 строчек и будет не по порядку искать.
|
|||
28
MWWRuza
гуру
19.05.20
✎
11:17
|
(27) Да это понятно...
|
|||
29
Djelf
19.05.20
✎
11:49
|
(28) А можно и pcre подключить... https://cloud.mail.ru/public/5JnR/2guHn6364
|
|||
30
Злопчинский
19.05.20
✎
12:29
|
отрыли стюардессу...
|
|||
31
Salimbek
19.05.20
✎
12:35
|
(0) Потестил в твоем варианте - тоже в какой-то момент выдало задвоение символов на пустом месте.
Убрал вот эту странность: СтрПоиска = ПодстрокаПоиска; И никаких задвоений не стало... |
|||
32
Djelf
19.05.20
✎
12:50
|
(30) Эээээ.... Погоди пока выкапывать! Я только начал разогреваться ;)
Поиск с помощью fts3 https://cloud.mail.ru/public/3ihK/2W9oLtGqm
|
|||
33
Salimbek
19.05.20
✎
13:07
|
(32) Это немного другой поиск:
Например, запрос LIKE находит также строки, которые содержат такие термины как "linuxophobe" или "EnterpriseLinux". В нашем случае этого не происходит только потому, что Энроновская коллекция E-Mail не содержит таких термов. А запрос MATCH на таблице FTS3 выбирает только те строки, которые содержат "linux" как отдельный токен. Отсель: http://xbb.uz/db/SQLite-FTS3-i-FTS4/ |
|||
34
Djelf
19.05.20
✎
13:27
|
(33) Это да, поиск токена должен начинаться с определенных букв, но он не обязан ими заканчиваться.
А поскольку наименование достаточно стандартизировано, запрос 'тем* пи*' выведет адекватные результаты. Можно и StrMatch еще прикрутить (не собирал как расширение для sqlite). |
|||
35
Arbuz
19.05.20
✎
13:33
|
(32) а оно с SQLITE_ENABLE_ICU?
|
|||
36
Djelf
19.05.20
✎
14:03
|
(35) Нет, но он с токинайзером unicode61. icu - жирная штука...
|
|||
37
Arbuz
19.05.20
✎
14:09
|
(36) харош! а вилдкарды везде работают? не нашёл в доках упоминания вообще. ну там '*ное пи*' или 'пив?' ?
|
|||
38
Djelf
19.05.20
✎
14:18
|
(37) Нет, я же написал в (34), поиск только с самого начала токена ну и '*' - все символы до конца. Плата за скорость.
Но никто же не мешает вложенный fts запрос еще раз обработать. Есть вот такая штука: http://xbb.uz/db/SQLite-FTS3-i-FTS4/5-Tokenajzery.html Я fts`ом сам не пользуюсь, поэтому плотно эту тему не изучал. |
|||
39
Arbuz
19.05.20
✎
14:28
|
(38) ага увидел, в оригинальных доках, почему-то на русском проглядел. вообщем нужно тому у кого большие объёмы текста и нужен именно полнотекстовый поиск по термам. причём в dbf особого смысла нет, только в скулайтной базе. в нашем случае strmatch как расширение 1sqlite выглядит куда как интересней.
|
|||
40
Ёпрст
19.05.20
✎
15:09
|
Интересно, сколько еще времени надо, чтоб они открыли для себя turbomd.dll и turbomd.vbs ?
|
|||
41
Ёпрст
19.05.20
✎
15:10
|
И.. хреново, что в снеговике этого нема (
|
|||
42
MWWRuza
гуру
19.05.20
✎
15:20
|
Стоило отъехать на три часа, вернулся - а вы тут уже в такие дебри полезли...
Вот, моя обработка, выдернутая из конфы в отдельный файл: https://cloud.mail.ru/public/3f2Y/3n5ZrojRy должна работать на любой конфе, где есть справочник "Номенклатура". Ну, естественно ВК должны быть доступны. Работает точно так-же, как исходная, в конфе. (31) Убрал вот эту странность: А вот это, можно чуть разжевать? Без этого СтрПоиска будет пустой всегда... Или я не понял, что значит "убрал" - ? Как-то по другому сделал? |
|||
43
Arbuz
19.05.20
✎
15:21
|
(40) эээ... причём здесь turbomd? может svcsvc и strmatch?
|
|||
44
Ёпрст
19.05.20
✎
15:26
|
(42) вот это нахрен писать не надо:
>>>>create virtual table Товары using dbeng сто лет в обед есть подключение таблиц автоматом (43) кровь из глаз смотреть, как закрывают 1с-ину и пересохраняют конфу |
|||
45
Злопчинский
19.05.20
✎
15:34
|
(42) ну положил бы в зип все ВК заодно.
а то на домашнем у меня толком окружения нет, чтобы проверить |
|||
46
MWWRuza
гуру
19.05.20
✎
15:36
|
(43) кровь из глаз смотреть, как закрывают 1с-ину и пересохраняют конфу
Ну, это в мой огород камень, точнее в критику моего видео... На самом деле, база мизерная, "экспериментальная", на домашнем компе... По этому - пофик, она сохраняется пару секунд, использовать в данном случае турбо мд... Ну, можно конечно, но смысл? |
|||
47
MWWRuza
гуру
19.05.20
✎
15:44
|
(45) Вот: https://cloud.mail.ru/public/2CjJ/ABwdT3yd6
Там еще 1CPP.dll, она не используется, но грузится, так, по инерции, из ГМ конфы скопировал... |
|||
48
MWWRuza
гуру
19.05.20
✎
15:49
|
+(47) Можно закомментировать в обработке, для чистоты эксперимента...
|
|||
49
Arbuz
19.05.20
✎
15:58
|
(47) ох ты и наворотил. вангую проблема в обработке бакспэйса ;) там адъ
пока не начнёшь стирать - всё ведь норм? |
|||
50
Злопчинский
19.05.20
✎
15:58
|
(47) Открыл.
выделно поле ввода, бэкспейс - поле очистилось, содержимое поля подставилось в инфо "отладка", бяка |
|||
51
Злопчинский
19.05.20
✎
16:00
|
ой, не бэкспейсом. а делом
|
|||
52
MWWRuza
гуру
19.05.20
✎
16:02
|
(49) Нет. БакСпейс тут ни при чем. Просто начинаешь быстро набирать текст, и начинает двоить... Когда не спеша, "одним пальцем", по букве - все нормально.
(51) Делет я пока не обрабатывал, руки не дошли... Это не сложно сделать, если остальное заработает... |
|||
53
Злопчинский
19.05.20
✎
16:07
|
Криво "склеивается" строка "отладка". висят старые поисковые символы, при обнулении проля ввода - не очищается
|
|||
54
Ёпрст
19.05.20
✎
16:09
|
(0) короче, через штатный контрол нормально не слепишь, даже отлавливая нажатия/отжатия клавиш.
Ибо "обновление" атрибута не "совпадает" с нажатием клавиш, он часть тупо игнорит. Максимум, своя переменная в принажатии и уже её значения показывать на форме, делая фсо=0. А так, любой активикс, типа текстбокс от мелкомягких, там такой проблемы нет, не надо ничего ловить (клавиши) там и так есть штатный отлов того, что в контроле. |
|||
55
Злопчинский
19.05.20
✎
16:10
|
1. У меня при быстром наборе вообще поиск не происходит -.
2. у тебя криво отрабатывает "показ" отладки, вообще не клеится с тем что я ввожу в поле |
|||
56
Salimbek
19.05.20
✎
16:11
|
(42) Ну вот смотри - у тебя есть поле ввода, куда буквы и так попадут, потому как мы их нажимаем. Но в этот момент, ты это поле переприсваиваешь, и, видимо, ловишь момент, когда поле перерисовалось и оно уже нажатую кнопку ловит как необработанную и потому принимает во второй раз.
Вместо этого - я предлагаю обрабатывать в твоем коде _только_ нажатия, и строить у себя "в памяти" в ПодстрокаПоиска аналог того, что в поле ввода и так само появится. Для этого достаточно 1) убрать то самое присваивание; 2) Вместо использования СтрПоиска использовать ПодстрокаПоиска |
|||
57
MWWRuza
гуру
19.05.20
✎
16:13
|
(53) При каком "обнулении" - ? Если выделяешь, и дел жмешь - то да, смотри выше. Если БакСпейсом - то все нормально, при условии, что вводил медленно и СтрПоиска соответствует тому, что отладка выводит.
|
|||
58
Злопчинский
19.05.20
✎
16:14
|
(56) "Но в этот момент, ты это поле переприсваиваешь, и, видимо, ловишь момент, когда поле перерисовалось"
- как он это словит? поле перерисуется только после того как с ФСО=1 закончится "приНажатии". |
|||
59
Злопчинский
19.05.20
✎
16:15
|
а так - да, я у себя держал текстовую переменную и достраивал ее при нажатии кнопок. но у меян это попроще было, для NCL/ там вариантивности ввода не много.
|
|||
60
Злопчинский
19.05.20
✎
16:15
|
(57) да пофиг как.
если поле ввода - пустое - то по логике и "отладка" д.б. пусто. а у тебя этого нет. |
|||
61
Salimbek
19.05.20
✎
16:16
|
(58) Дык, в коде (0) ФлСт в 1 то нигде и не присваивается )))
|
|||
62
MWWRuza
гуру
19.05.20
✎
16:16
|
(55) Показ отладки - это Форма.ИнфСтрПоиска.Заголовок(СтрПоиска); Просто должно тупо выводить на форму содержимое поля ввода. А оно выводится не верно почему-то...
|
|||
63
Злопчинский
19.05.20
✎
16:17
|
я не вникал что да как...
при нажатии (или отжатии) фиксируем символ. добавляем его к "подстрокепоиска", выполняем поиск. выходим из "принажатии". имеем результат поиска по "подстроке поиска", в поле ввода - фиксируется введенный символ . так что, не работает? |
|||
64
MWWRuza
гуру
19.05.20
✎
16:19
|
(56)(63) Сейчас попробую...
|
|||
65
Злопчинский
19.05.20
✎
16:20
|
(62) "Просто должно тупо выводить на форму содержимое поля ввода."
не будет оно так выводить. штатное поле ввода "фиксируется" (введенное значение) только после энтера/ухода фокуса с поля ввода. то есть ввод должен быть закончен. |
|||
66
Злопчинский
19.05.20
✎
16:21
|
поэтому - введенные символы штатно из поля ввода ты можешь получить только после окончания ввода.
если этого недостаточно - то отслеживаешь нажимаемые символы и строишь "паралельную" строку. .так я себе представляю |
|||
67
Ёпрст
19.05.20
✎
16:25
|
Так, хотя бы.. курсора, правда не видно и хрен с ним
|
|||
68
Salimbek
19.05.20
✎
16:26
|
(65) В ветке из (11) http://www.1cpp.ru/forum/YaBB.pl?num=1152157445
был прикольный вариант: Сервис.ЭмулироватьКлавиатуру("{ENTER}", 0, ); Система = СоздатьОбъект("Система"); Система.РазрешитьАктивацию(); Система.Активизировать("Реквизит"); Сервис.ЭмулироватьКлавиатуру("{END}", 0, ); Правда это надо обернуть в ЗащитаОтАльфа пример, вроде бы тут: http://www.1cpp.ru/forum/YaBB.pl?num=1152157445/23#23 |
|||
69
MWWRuza
гуру
19.05.20
✎
16:27
|
(64) Попробовал. Работает, но, точно-так же...
(66) .так себе представляю Я тоже. Поэтому у меня и была строка: СтрПоиска = ПодстрокаПоиска; Подстрока - искуственно сформированная, содержимое СтрПоиска пытаюсь на нее менять. |
|||
70
Djelf
19.05.20
✎
16:27
|
(39) Да не вопрос. Слепил: https://cloud.mail.ru/public/4pym/4S9Y59T1f
Давно хотел такое попробовать. Это и ВК для 1С, без регистрации в реестре и одновременно плагин под sqlite3. Как ВК оно совместно со старой strmatc.dll А в sqlite3 так:
Обработка на 1С ~3c, на sqlite 300мс ;) |
|||
71
Злопчинский
19.05.20
✎
16:36
|
(69) "СтрПоиска = ПодстрокаПоиска"
- нахера? поиск отработал. подстрока поиска сформированан ДО выхода из "Принажатии. после выхода СтПоиска - сформируется штатно отработкой введенного символа. нахрен априсваивать-то? |
|||
72
MWWRuza
гуру
19.05.20
✎
16:43
|
(67) Да, так не двоит... По крайней мере, с моей скоростью печати, мне не удалось получить такой эффект.
Курсор, правда, всегда в начале строки визуально... но отрабатывает так, как будто он в конце стоит :-) |
|||
73
MWWRuza
гуру
19.05.20
✎
17:02
|
(71) нахрен априсваивать-то?
Да уже убрал... Но, сути не поменяло - все равно не правильно выводит на форму содержимое поля ввода. |
|||
74
Salimbek
19.05.20
✎
17:02
|
(72) Потому что у него установлено ФлСт=0;
И присваивание строки, а у тебя в (0) и обработка нажатия символов, и ФлСт - не было, потому символы пролетали в поле ввода, и это поле ты переприсваивал. |
|||
75
Salimbek
19.05.20
✎
17:03
|
Кстати, попробовал я свою обработку из (10) запустить и не заработало - похоже ей нужен установленный офис для Forms.TextBox.1
|
|||
76
Злопчинский
19.05.20
✎
17:04
|
(74) ;-)
|
|||
77
MWWRuza
гуру
19.05.20
✎
17:06
|
(67) А что мешает в процедуре "ПриНажатииКнопкиКлавиатуры" перед строкой "ПопробоватьНайти();" вернуть флаг ФлСт в единицу - ? Попробовал, вроде не двоит и курсор на месте.
PS В принципе - делет обработать, и вполне себе рабочая фиговина получилась :-))) |
|||
78
Злопчинский
19.05.20
✎
17:08
|
я правда нихера не понял. в чем проблема была. как обычно - в коде?
|
|||
79
MWWRuza
гуру
19.05.20
✎
17:08
|
(78) в ДНК :-)
|
|||
80
Злопчинский
19.05.20
✎
17:09
|
||||
81
MWWRuza
гуру
19.05.20
✎
17:12
|
(54) (0) короче, через штатный контрол нормально не слепишь, даже отлавливая нажатия/отжатия клавиш.
Ну, вот, а ты говорил... Совместными усилиями слепили из г***а конфетку :-))) |
|||
82
Ёпрст
19.05.20
✎
17:13
|
(81) не.. у тебя тут просто искусственная "задержка" нажатия из-за поиска, если его выкинешь, то штатный контрол не успевает обработать все нажатия кнопки
|
|||
83
Ёпрст
19.05.20
✎
17:14
|
он часть нажатий теряет
|
|||
84
MWWRuza
гуру
19.05.20
✎
17:18
|
Ну, понятно... Но, работает, даже без поиска, когда его комментируешь.
|
|||
85
MWWRuza
гуру
19.05.20
✎
17:21
|
+(84) Это надо жо** копиркой вытирать(это я анекдот про секретаря-машинистку вспомнил :-) ), что-бы штатный контрол не успел отработать... Это-ж сколько знаков в секунду надо печатать...
|
|||
86
Злопчинский
19.05.20
✎
17:37
|
(82) это как? ни разу не встречал чтобы штатный контрол терял нажатия...
??? |
|||
87
Volodja
19.05.20
✎
19:09
|
(70)
База.РазрешитьЗагрузкуРасширений(1); SELECT load_extension('strmatch.dll'); ошибка not authorized. Как включить возможность выполнения load_extension? версия 1sqlite 3.25.1.23 |
|||
88
MWWRuza
гуру
19.05.20
✎
19:25
|
Вот, рабочий вариант обработки, может кому-то пригодится "для дальнейших изысканий": https://cloud.mail.ru/public/4uvv/E8xmF1GwJ
Добавил орлаботку "Delete", правда, только полная очистка строки поиска. Сделать, что-бы очищался выделенный фрагмент строки - проблематично... Может когда-нибудь, под настроение, поразбираюсь... Или кто-то, кому не лень - доведет до ума... Пока, и так сойдет, вполне прилично работает. |
|||
89
MWWRuza
гуру
19.05.20
✎
19:30
|
+(88) Там, в контоле, удаляешь часть строки, а из кода видна как исходная, до удаления... Надо или "ентер" эмулировать, или с флагом СтандартнойОбработки играть, так, "с наскоку" победить не получилось.
|
|||
90
Volodja
19.05.20
✎
19:34
|
(89) А через обработку ожидания это реализовать разве не получится. Вызывать обработчик скажем через 100ms
|
|||
91
Volodja
19.05.20
✎
19:38
|
(89) и клавиатуру опрашивать не придется
|
|||
92
MWWRuza
гуру
19.05.20
✎
19:42
|
(91) Вызывать обработчик скажем через 100ms
Обработчик чего? В поле, до нажатия ентер, старые данные, до удаления части строки делетом... |
|||
93
Djelf
19.05.20
✎
19:42
|
(87) Для начала нужен ответ от SELECT sqlite_version(), потом уже каталоги и т.п.
Я просто кинул в 1С/BIN и оно там завелось. |
|||
94
Volodja
19.05.20
✎
19:45
|
(92) Таймер
|
|||
95
Volodja
19.05.20
✎
19:48
|
(94)
ОбработкаОжидания(<?>,) Синтаксис: ОбработкаОжидания(<Имя>,<Интервал>) Назначение: Вызывает глобальную процедуру с заданным интервалом в милисекундах. ПРИМЕР: Сервис = СоздатьОбъект(''Сервис''); Сервис.ОбработкаОжидания(''глПолучитьНовыеЗаявки'',100); |
|||
96
Volodja
19.05.20
✎
19:52
|
(93) sqlite_version() выдал 3.25.1
|
|||
97
Volodja
19.05.20
✎
19:58
|
(93) кинул strmatch в \bin
Крах системы |
|||
98
Volodja
19.05.20
✎
19:59
|
т.е. приложения
|
|||
99
Volodja
19.05.20
✎
20:00
|
Вылет на
БазаДанных.РазрешитьЗагрузкуРасширений(1); |
|||
100
MWWRuza
гуру
19.05.20
✎
20:09
|
(95) Я знаю, как обработчик ожидания подключать...
Вопрос - что по нему вызывать, если в поле, не смотря на то, что мы видим на экране, содержатся "старые" данные, до редактирования, пока ентером не подтвердишь. |
|||
101
MWWRuza
гуру
20.05.20
✎
08:56
|
(88) Сделать, что-бы очищался выделенный фрагмент строки - проблематично...
В общем, покрутил я и так и этак, и пришел к выводу - проще вообще "отключить" Делете - СтатусВозврата(0)... Вполне можно и без него прожить, Пользоваться только БакСпейсом. Все равно, конечно остается "кривизна", если мышкой курсор поставят в середину строки, и начнут БакСпейс жмакать... В строке удаляется как и должно, слева от курсора, а в подстроке - с конца... Ну, тут, похоже уже "малой кровью" не обойтись. Ничего, к этому можно и приспособиться. |
|||
102
Volodja
20.05.20
✎
09:38
|
(88)
а (10) не пробовал. вроде отрабатывает как надо |
|||
103
MWWRuza
гуру
20.05.20
✎
10:05
|
(102) а (10) не пробовал. вроде отрабатывает как надо
Попробовал... Но, честно говорю - не разобрался. Сама идея понятна - на форме рисуем кнопку, и назначаем на нее АктивеИкс TextBox... Запускаю. Редактирую текст... А дальше что? Что должно происходить? Как ловить события изменения текста в этом элементе? Добавить в эту кнопку вызов процедуры? Не работает... Просто никогда с таким не сталкивался, объясните дураку... |
|||
104
MWWRuza
гуру
20.05.20
✎
10:11
|
+(103) А вообше, начинаю понимать... Отладчиком посмотрел - в сыойство ДопХа получаю позицию курсора... Прикольно...
Дальше, надо будет поковыряться... |
|||
105
MWWRuza
гуру
20.05.20
✎
11:09
|
+(104) Ну, в принципе - разобрался. Вот: https://cloud.mail.ru/public/4t6x/fnNTK75fx
К исходной добавлена обработка БакСпейса, Делете, с любого места, в том числе и выделенного фрагмента. Действительно работает... |
|||
106
Djelf
20.05.20
✎
11:11
|
(99) Спасибо, воспроизвел!
Чтобы не было краха, сначала Базу нужно открыть.
Как нибудь попозже добавлю на это проверку. |
|||
107
MWWRuza
гуру
20.05.20
✎
11:19
|
(75) Кстати, попробовал я свою обработку из (10) запустить и не заработало - похоже ей нужен установленный офис для Forms.TextBox.1
Таааккк... Новая проблема? У 90% моих клиентов - ОпенОфис... Что, не заработает? |
|||
108
Djelf
20.05.20
✎
11:23
|
(107) Есть шикарная альтернатива MS`овским контролам http://www.vbforums.com/showthread.php?841929-VB6-ActiveX-CommonControls-(Replacement-of-the-MS-common-controls)
|
|||
109
Salimbek
20.05.20
✎
11:30
|
(107) А х.з. смотреть надо - какие контролы могут быть доступны. Я вот обработку из (10) сейчас у себя тоже нигде запустить и потестить не могу :-)
Что касаемо "Как ловить события изменения текста в этом элементе?" По стандарту 1С++, когда создаешь АктивИкс, то потом: При возникновении события вызывается процедура модуля формы с именем: <ИдентификаторЭлементаДиалога>_<Событие> т.е. если элемент диалога, на котором строится АктивИкс, у меня в обработке назван: ФФлеш, значит я могу обрабатывать событие: ФФлеш_TextChanged Надо просто создать процедуру у себя в модуле с нужным количеством переменных |
|||
110
Volodja
20.05.20
✎
11:33
|
Вот так твою обработку изменил. Вроде лучше стало. Но иногда прилетает что-то левое
Перем ВремяНажатия; .... Процедура ПриНажатииКнопкиКлавиатуры(КодКлавиши, Альт, Шифт, Контрол, Символ, ФлСт) Интервал=(_GetPerformanceCounter()-ВремяНажатия); Если Интервал<120 Тогда //Слишком быстро пришел. Мусор Возврат; КонецЕсли; //Сообщить(Интервал); ВремяНажатия=_GetPerformanceCounter(); |
|||
111
Salimbek
20.05.20
✎
11:34
|
(108) Интересно, можно будет посмотреть. Жаль только, что нету чего-нибудь такого, что не надо устанавливать
|
|||
112
Salimbek
20.05.20
✎
11:35
|
+(109) Подробнее про АктивИкс в 1С++ тут: http://www.1cpp.ru/docum/icpp/html/ActiveX.html
|
|||
113
MWWRuza
гуру
20.05.20
✎
11:36
|
(108) А у меня, почему-то не открывается ссылка...
|
|||
114
Salimbek
20.05.20
✎
11:38
|
(113) У меня из сети предприятия тоже не открылась. А с другого сервака - без проблем, вот на ГитХаб там есть ссылка:
https://github.com/Kr00l/VBCCR/tree/master/ActiveX%20Control%20Version |
|||
115
Djelf
20.05.20
✎
11:38
|
(113) А сам http://www.vbforums.com открывается? Если нет то OperaVPN в помощь.
|
|||
116
Djelf
20.05.20
✎
11:45
|
(111) Что делать, ActiveX. Cтавить придется. Можно, конечно в ВК завернуть, но там адское количество методов.
Смотреть особенно нечего, заявлена совместность с MS`овсекими по методам. Кое что не работает из-за того что 7ке использует 4ю версия Microsoft.Windows.Common-Controls, а для полноценной работы нужна 6я. |
|||
117
MWWRuza
гуру
20.05.20
✎
11:46
|
(115) Ну, да, не открывается... Буду разбираться...
А кстати, РанТайм, Проблему не решит? "Access 2007 Runtime — это бесплатная программа, которую можно использовать для распространения созданных вами приложений Access 2007 пользователям, на компьютерах которых не установлена программа Access 2007 Наличие лицензии на офис не требуется" Теоретически - должно... Вот только попробовать не на чем, на своем компе полноценный офис установлен... |
|||
118
Volodja
20.05.20
✎
11:51
|
(106)
Спасибо. Все работает. |
|||
119
MWWRuza
гуру
20.05.20
✎
11:58
|
(112) Я правильно понял, что на компах без Офиса, достаточно с помощью RegSvr32 зарегить библиотеку VBCCR16.OCX - ? Или еще чего-то надо?
|
|||
120
Djelf
20.05.20
✎
12:01
|
(119) Держи https://cloud.mail.ru/public/3py9/2Ku9HRRBJ
Экспериментировал слегка над этой штукой. |
|||
121
Djelf
20.05.20
✎
12:05
|
+(120) vbccr16.als https://cloud.mail.ru/public/3p3u/41SaPCWfW
|
|||
122
MWWRuza
гуру
20.05.20
✎
12:22
|
// Флешка = АтрФормы.СоздатьЭУ("Forms.TextBox.1");
Флешка = АтрФормы.СоздатьЭУ("VBCCR16.RichTextBox"); Так работает... |
|||
123
MWWRuza
гуру
20.05.20
✎
12:24
|
(120) Спасибо, интересные эксперименты... Буду разбираться.
|
|||
124
MWWRuza
гуру
20.05.20
✎
12:26
|
Остается попробовать на компе без Офиса. Но, по идее - должно заработать. Тут же явное указание, какой объект создавать... И, если библиотека будет зарегистрирована в системе, то, чего-бы ему не заработать :-)
|
|||
125
MWWRuza
гуру
20.05.20
✎
15:47
|
Финальный вариант: https://cloud.mail.ru/public/gZmd/256P4zcod
Ну, тут уж даже и не знаю, чего еще можно улучшить... АктивеИкс пытается грузить МайкроСофтовский, если не получается - пытается загрузить альтернативный, из(114). Обрабатываются делет, бакспейс, пробел. По табу, переходит на таблицу результатов, если что-то нашлось, если нет - игнорируется. В общем - супер! Спасибо всем, кто участвовал! :-) |
|||
126
serpentt
20.05.20
✎
16:36
|
БэкСпэйс не отрабатывает с частью выделенного текста, т.е. Выделил часть текста, нажал БэксПэйс.... выделенный текст не удаляется, а удаляется первый символ перед курсором.
|
|||
127
Злопчинский
20.05.20
✎
16:54
|
(125) я так и не понял зачем какие-то офисные контролы/аналоги..? просветит вкратце?
|
|||
128
Djelf
20.05.20
✎
18:02
|
(127) 1С`овский контрол не меняет своего содержимого, пока не нажмешь enter.
Поэтому костыли на костылях и работает криво. ActivX - меняет. Аналог ActivX`а MS бесплатный, но если уже есть ActivX от MS, то аналог можно не ставить. |
|||
129
Djelf
20.05.20
✎
18:30
|
Еще чуток ускорил. Стало ~140мс на 5к строк (было 300 мс).
Добавил в архив ссылки на первоисточники, и краткое описание. strmatch.dll https://cloud.mail.ru/public/4th1/qavXTDgwv Это гибридная библиотека: ВК для 1С 7.7 без регистрации в реестре и для любой винды и одновременно плагин для sqlite3 v.3.0.3 З.Ы. возможно еще на 20-30% ускорить, но это будет не быстро. |
|||
130
MWWRuza
гуру
20.05.20
✎
19:50
|
(126) Ага.. Спасибо, мне чего-то не пришло в голову, что так будет кто-то делать. Сейчас посмотрю, думаю, можно поправить...
(127) А ты попробуй, прикольно работает. Просто набираешь в строке текст, оно само ищется, без нажатия на ентер или какую-то дополнительную кнопку. А без "офисного контрола", все работает и так... Но, невозможно определить позицию курсора и длину выделенного фрагмента строки. Поэтому, кривенько работает. А так - вполне прилично. |
|||
131
MWWRuza
гуру
20.05.20
✎
20:29
|
(126) Вот, будет время - потестируйте, может еще что-то вылезет: https://cloud.mail.ru/public/zRPA/256eeZBYt
|
|||
132
MWWRuza
гуру
20.05.20
✎
21:06
|
(129) У меня хоть и маленькие базы, думаю, я не почувствую разницу. Но... Все равно интересно.
Что-то не понял, если не регистрируется в реестре, то откуда она должна грузиться? Сейчас вот так: БазаДанных.Открыть(":memory:"); БазаДанных.РазрешитьЗагрузкуРасширений(1); Запрос = БазаДанных.НовыйЗапрос(); Запрос.ВыполнитьЗапрос("SELECT load_extension('strmatch.dll')"); Текст = "SELECT |code Код ***************************** Получаю ошибку: Запрос.ВыполнитьЗапрос("SELECT load_extension('strmatch.dll')"); {D:\BASA_1C\СЕДОВ\MAGAZIN\EXTFORMS\ПРОБАПОИСКАПРИВВОДЕАКТИВИКС_2.ERT(44)}: Не найден указанный модуль. Что я не так делаю? |
|||
133
MWWRuza
гуру
20.05.20
✎
21:07
|
Дллка, в каталоге базы лежит...
|
|||
134
Злопчинский
20.05.20
✎
21:08
|
(131) фу бяка, снова огрызок а не пакет полный
|
|||
135
MWWRuza
гуру
20.05.20
✎
21:08
|
Может ее надо загрузить, как внешнюю компоненту?
|
|||
136
MWWRuza
гуру
20.05.20
✎
21:11
|
(134) Все, что выкладывал вчера, ничего нового... Я надеюсь, MS-офис у тебя установлен? Если вдруг нет(не верю!) то в (114) ссылка на "заменитель".
|
|||
137
MWWRuza
гуру
20.05.20
✎
21:18
|
1CPP.dll - если вчера, грузил "по инерции", и она была по большому счету не нужна, то для сегодняшней - обязательна.
FormEx.dll 1sqlite.dll То, про что я в (132) писал - в выложенную ерт-шку не вошло, естественно, это я пока у себя экспериментирую... |
|||
138
Злопчинский
20.05.20
✎
22:20
|
(136) нафига мне на компе нелицензионный офис? нет конечно, не юзаю дома. вместо него няшный WPS
|
|||
139
MWWRuza
гуру
20.05.20
✎
22:43
|
(138) :-)))
Вот, полный набор библиотек: https://cloud.mail.ru/public/2E4V/21kET26ob VBCCR16.OCX надо зарегистрировать с помощью RegSvr32 |
|||
140
MWWRuza
гуру
21.05.20
✎
08:09
|
+(132) По поводу скорости работы... На маленькой базе(~ 7 000+ позиций) работает мгновенно, тормозов вообще не заметил.
А вот на базе где ~50 000+ наименований, первое обращение(после ввода первой буквы в поле), задержка примерно 1.5 секунды. Потом, работает мгновенно, все последующие буквы вводятся вообще без задержек. Видимо, первый раз задержка потому, что база грузится в память, а потом поиск происходит уже по загруженной базе, и тут уже тормозов нет... Ну, в целом, даже на такой базе - вполне терпимо. |
|||
141
MWWRuza
гуру
21.05.20
✎
08:41
|
(130) (126) Ага.. Спасибо, мне чего-то не пришло в голову, что так будет кто-то делать. Сейчас посмотрю, думаю, можно поправить...
Еще нашел... Стрелки право/лево обработать надо, и наверное хоме/енд... |
|||
142
MWWRuza
гуру
21.05.20
✎
08:46
|
+(141) А хотя, нет... И так все работает во внешней обработке... Это я чего-то накосячил, когда в основную конфу доработку переносил.. Почему-то при нажатии на стрелки, курсор остается на месте а рамки групп выделяются жирным шрифтом... Буду разбираться.
|
|||
143
Djelf
21.05.20
✎
08:52
|
(132) Я из bin гружу. Т.е. оттуда откуда грузится и sqlite.
|
|||
144
serpentt
21.05.20
✎
08:55
|
(141) Вроде работает..
|
|||
145
Злопчинский
21.05.20
✎
09:25
|
(139) ну как отладишь все в виде отдельной обработки - то и выложи отдельным полным готовым пакетом. а то я уже запутался в "версиях".. ;-)
|
|||
146
Djelf
21.05.20
✎
09:59
|
+(132) Либо указывать полный путь, но тогда обязательно указать имя колонки "SELECT load_extension('r:\strmatch.dll') as ret;"
|
|||
147
MWWRuza
гуру
21.05.20
✎
10:05
|
(143) Да, положил в BIN, заработала...
Но, особой разницы в скорости не заметил... Думаю, тут просто мне надо ограничить длину строки поиска, например минимум 3 символа. Иначе, он вываливает в РезПоиска чуть-ли не весь справочник, по одной, первой букве. Тут, скорее в этом проблема, а не в загрузке базы в память. Что касается загрузки расширения... Работает конечно, когда ВК в BIN лежит. Но, это как-то не по стандарту: Книга знаний: Загрузка внешних компонент 1С: проблемы и решения "Где 1С ищет внешнюю компоненту? Если при загрузке внешней компоненты вы не указываете полный путь, такой как E:\Events\Events.dll или сетевой путь наподобие \\ВашСервер\ПапкаГдеЛежатВК\Events.dll, то 1С ищет внешние компоненты -относительно папки 1Cv7\BIN (КаталогПрограммы()) -относительно каталога информационной базы (КаталогИБ())" Относительно каталога ИБ не ищет... |
|||
148
Djelf
21.05.20
✎
10:11
|
(147) Ты не путай ВК и sqlite. Это гибридная библиотека с двумя разными точками входа и с разными api.
Как ВК она работает точно так же как всегда. А как плагин к sqlite по другому. sqlite без указания пути ищет через переменную patch, как туда bin попадает я не в курсе, но каталога базы точно там нет. Поэтому если нужно грузить плагин в sqlite из каталога базы, путь нужно указывать явно. |
|||
149
Djelf
21.05.20
✎
10:13
|
(147) Туда не 3 буквы нужно вводить, а целиком всю строку, которую ты сопоставляешь. http://catalog.mista.ru/public/237186/
|
|||
150
MWWRuza
гуру
21.05.20
✎
10:29
|
(149) Это я понял, просто что-бы меньше грузить программу лишним поиском, я хочу ограничить длину поисковой строки снизу, что-бы пока, в самом начале, не введешь хотя-бы три символа, никакого поиска не происходило... А то начинаешь набирать с пустой строки - и после первого символа он вываливает весь справочник, где в наименованиях есть этот символ...
|
|||
151
Djelf
21.05.20
✎
10:33
|
(150) Это же нечеткий поиск. Это совершенно другой принцип. Он не предназначен для поиска по двум-трем буквам.
Туда нужно подавать всю строку, которую ты ищешь. Эта строка упрощается до фонетических значений, всякий мусор оттуда выкидывается. Строки с которыми сравнивается исходная строка, обрабатываются аналогично. Дальше идет хитрый алгоритм сравнения и вычислений рейтинга совпадения. |
|||
152
MWWRuza
гуру
21.05.20
✎
10:37
|
+(150) Сделал. Задержка после ввода первого символа в поисковой строке на большой базе - исчезла. Сейчас работает так: Начинаешь с пустой строки набирать "с", ничего не происходит, "и", ничего, "р" - вываливается весь список сигарет, мгновенно. Дальше, можно пробел поставить и вводить следующие символы для конкретизации, какие именно мы сигареты ищем.
(151) Я читал про исходную компоненту нечеткого поиска, еще вчера... Но, пока не разбирался - кроме ее загрузки, наверно надо еще какие-то параметры указывать? Я пока ничего в запросе не менял, кроме загрузки расширения... |
|||
153
MWWRuza
гуру
21.05.20
✎
10:57
|
(145) Вот, со всеми компонентами, последний рабочий вариант: https://cloud.mail.ru/public/2KMC/4MERDS444 Пока без расширения нечеткого поиска. Это отдельная тема... Там не все так просто.
|
|||
154
Djelf
21.05.20
✎
10:59
|
(153) Нечеткий поиск это отдельный метод. На, попробуй https://cloud.mail.ru/public/maPd/3vERiuLeL и ткни "Искать в базе".
|
|||
155
MWWRuza
гуру
21.05.20
✎
11:34
|
(154) Попробовал, правда пришлось по убирать все АкивеИксы и т.п., иначе строку не ввести...
Вот что получается: https://cloud.mail.ru/public/2huH/3Pev4VbuX Я так понял, что "Рейтинг", это типа "уровень похожести" :-) И как в реальной задаче понимать, начиная с какого рейтинга выводить в результат? В данном примере, со 116 по 254 - туда-сюда, все, что ниже - вообще не похоже... |
|||
156
Djelf
21.05.20
✎
11:42
|
(155) Покрути, посмотри. Я эту штуку не использовал, потому что с sqlite она не работала ;)
Возможно стоит отсечь нули, и/или limit 100, маловероятно что не найдется в первых 100 записей. А если в 100 записей не найдется, то можно переходить на твой алгоритм и уже рыть базу более тщательно. Там не уровень похожести, а непонятные попугаи, автор ВК не отранжировал в %. |
|||
157
MWWRuza
гуру
21.05.20
✎
11:49
|
Понятно... Будет настроение - поиграюсь, штука интересная.
Но, пока, для реальной задачи - свой алгоритм оставляю, вроде работает правильно, и понятно для конечных пользователей будет. Грузить расширение, в моем случае, как я понимаю, смысла не имеет - никакого ускорения не будет, только память занимать лишней библиотекой, правильно - ? |
|||
158
Djelf
21.05.20
✎
12:14
|
(157) Вроде читал где в описании, что sqlite саму библиотеку выгружает из памяти, когда она не используется.
Ну а так да, зачем грузить что-то неиспользуемое? |
|||
159
MWWRuza
гуру
21.05.20
✎
12:34
|
(158)Вроде читал где в описании, что sqlite саму библиотеку выгружает из памяти, когда она не используется.
Я чето-такое тоже видел. Поэтому и гружу ее при каждом запросе заново... |
|||
160
MWWRuza
гуру
24.05.20
✎
23:38
|
(119) (112) Я правильно понял, что на компах без Офиса, достаточно с помощью RegSvr32 зарегить библиотеку VBCCR16.OCX
Гладко было на бумаге, да забыли про овраги... Оказалось - не так все просто :-( Сегодня поставил реальному клиенту, у которого нет MS офиса. Заработало, сразу, все вводится, ищется и т.д... Ровно до закрытия формы где есть ЭУ АктивеИкс. 1Ска падает... Почему - не понятно. Возможно, надо что-то прибивать перед закрытием формы, может еще что, х.з... Экспериментировать не стал, поставил МайкроСофтовский RunTime Acess-2007, благо он бесплатный, и все заработало отлично, падать перестало, так, как стали работать ТекстБоксы от МС. С АктивеИкс, создаваемым с помощью альтернативной компоненты, надо разбираться, как правильно ее уничтожать, или выгружать из памяти при закрытии формы... |
|||
161
Злопчинский
25.05.20
✎
00:06
|
Если про рейтинг в StrMatch - то там не процент похожести, а безразмерная величина, чем она больше - тем больше похожесть. Причем чем длинее стравниваемы строки тем индекс похожести больше. Отранжировать в проценты можно взяв индекс похожести самой строки с собой. кстати, автор говорит, что в общем случае даже "100%" похлжесть не свидетельствует о совпадении строк. Я стрматс юзал часто и долго, особых проблем нет, все работанет на мой взягля дочень хорошо. можно варитровать вес чисел. Чем длинее сравниваемые строки - тем легче искать похожие. мой опыт говорит что если нет в первых 40-50 позиуиях - то значит скорее всего нет вообще. в подавляющем колве случаев искомая позиция находилась на первом экране похожих, чаще - в верхней половине списка из 10 позиций. путем эвристик можно доевтси практически до попадания 1-в-1. Трудности с поиском короткизх строк. чем короче - тем труднее. есть еще некоторые тонкости - надро посмотреть алгоритмы реализации, там бывают моменты когда индекс похожести не выдается из-за неверного применения. Самое нагрузочное - это сформировать кэш. А так, на этой компоненте я людя запускал магазин игрушек, бытовую технику, большой оборот торговли дисками с кино и музыкой где в прайсах трэш и угар и магазин радиодеталей - с ним было сложнее всего, так как "названия" очень короткие пришлось подключасть отраслевые эвристики. если сранвение впили в скулай это нечеткое это вообще красотулечка должна получиться... И еще - если с ее помощб привязывать позиции/новые прайсы - то привязку следует проверять не только со своей номнегнклатурой, но и с уже привязанными другими прайсам - там похожесть может быть больше.
|
|||
162
Злопчинский
25.05.20
✎
00:07
|
(160) "очему - не понятно. Возможно, надо что-то прибивать перед закрытием формы, может еще что, х.з... " - не решил.. костылестроитель.. ;-)
|
|||
163
MWWRuza
гуру
25.05.20
✎
09:15
|
(162) не решил.. костылестроитель.. ;-)
Ну дык... Куда-же в семерке без них... https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-313.jpg |
|||
164
Salimbek
25.05.20
✎
09:52
|
(160) Попробовал твою обработку из (153) - без проблем и открывается и при закрытии 1С-ка не крашится.
|
|||
165
MWWRuza
гуру
25.05.20
✎
10:43
|
(160) У меня - тоже. У клиента крашится. Судя по всему, потому, что у нее из продуктов MS только винда. Офис там ЛибреОффис.
У меня в обработке, в попытке создается элемент управления "Forms.TextBox.1". В случае неудачи, создается "VBCCR16.RichTextBox". Дальше, работает тот, который удалось создать. И почему-то во втором случае, при закрытии формы 1С крашится. PS Правда, у меня в той форме, что у клиента - там не один ЭУ, а целых 17 штук, в массиве... Может по этому? Но, ЭУ от MS при этом работает, ничего не падает. Вот, где используется такой "изврат": https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-314.jpg |
|||
166
Ёпрст
25.05.20
✎
10:45
|
Посмотрел (153)... Полный ПЭ.
Весть код в топку. |
|||
167
Ёпрст
25.05.20
✎
10:57
|
На счет крашится, це очевидно, нефик делать переменные ( Перем = ) с именем идентификаторов формы.
И.. весь код в 153 превращается в :
|
|||
168
MWWRuza
гуру
25.05.20
✎
11:24
|
(167) нефик делать переменные ( Перем = ) с именем идентификаторов формы.
А где у меня такое? Элемент управления - "СтрПоиска", а переменная - "СтПоиска", без буквы "р". Остальное - ща гляну... |
|||
169
MWWRuza
гуру
25.05.20
✎
11:30
|
(167) И.. весь код в 153 превращается в :
Ии... Не работает, символы не вводятся в строку поиска, так, как нажатия клавиш не обрабатываются, и текст в строке не меняется. |
|||
170
Ёпрст
25.05.20
✎
12:19
|
(169) работает для ричтекста, для мелкософта используй свой метод
|
|||
171
Ёпрст
25.05.20
✎
12:19
|
Мне лень офис ставить
|
|||
172
Ёпрст
25.05.20
✎
12:20
|
И ПриНажатии клавиши и весб тот бред в нем, не нужен
|
|||
173
MWWRuza
гуру
25.05.20
✎
12:33
|
(172) А... Теперь понял. У меня-то дома мелкомягкий офис стоит.
Ссейчас попробую принудительно грузить альтернативу, и посмотрю... |
|||
174
MWWRuza
гуру
25.05.20
✎
12:49
|
+(173) Да, сделал так:
// Попытка // КонтролТекста = АтрФормы.СоздатьЭУ("Forms.TextBox.1"); // Исключение КонтролТекста = АтрФормы.СоздатьЭУ("VBCCR16.RichTextBox"); // КонецПопытки; и все работает без дополнительной кучи кода... Спасибо. С контролом от MS, так не прокатывает, нужно все очевидные, стандартные действия "пешком" обрабатывать :-( Остается попробовать на клиентском компе, на предмет "падения" 1С, но, это только вечером, там сейчас люди работают... |
|||
175
Ёпрст
25.05.20
✎
12:55
|
(174) посмотри свойства контрола и какие там события . Напиши процу, там типа TextAlignChanged или еще чего
|
|||
176
Ёпрст
25.05.20
✎
12:59
|
Хотя не.. це же мелкомягкие, так добавь еще
|
|||
177
MWWRuza
гуру
25.05.20
✎
13:26
|
(176) Не, СтрПоиска_onChange() не отрабатывает с MS. Надо читать, разбираться. Не все так просто.
В строке поиска делет и бакспейс работают, стрелки курсор перемещают, а новые символы не вводятся :-( |
|||
178
MWWRuza
гуру
25.05.20
✎
13:47
|
Кто вообще должен вызывать эту процедуру "СтрПоиска_onChange()" - ? Не понимаю... Тут: https://docs.microsoft.com/ru-ru/office/vba/api/access.textbox читал, ясности не добавило... Или это надо про АктивеИкс читать?
|
|||
179
Злопчинский
25.05.20
✎
14:00
|
может, все-таки на 8-ку.. а, коллеки?
|
|||
180
Ёпрст
25.05.20
✎
14:01
|
Посмотрел, там тоже событие Event Change()
Так что, Процедура СтрПоиска_Change() должно работать и с TextBox |
|||
181
Ёпрст
25.05.20
✎
14:04
|
(177) Куда чего не долетает ? Там фиолетово, какие ты кнопки нажимаешь, в Change() смотрится Text у контрола и всё
|
|||
182
Ёпрст
25.05.20
✎
14:33
|
Короче, если Forms.TextBox.1 то так
Процедура СтрПоиска_Change() Сообщить(КонтролТекста.Text); ПопробоватьНайти(); КонецПроцедуры Процедура СтрПоиска_KeyPress(Символ) КонтролТекста.Text = КонтролТекста.Text+Симв(Символ.value); КонецПроцедуры |
|||
183
MWWRuza
гуру
25.05.20
✎
16:13
|
(182) Супер! Так работает. Спасибо. Действительно "весь код в топку"... Это ты еще не видел, чего я нагородил в форме сокращения наименования, где 17 контролов... Там, через массивы сделано, гимор еще тот...
|
|||
184
Ёпрст
25.05.20
✎
17:55
|
(182) единственное, надо свойство контрола поглядеть, на предмет копи-пасте.
Там просто либо флаг есть соответствующий, либо это "ручками" пишется. |
|||
185
Ёпрст
25.05.20
✎
17:56
|
Ну и у ричтекста тоже есть событие KeyPress, его надо игнорить, да и прилетает там не тоже самое что и для текстбокса
|
|||
186
Ёпрст
25.05.20
✎
17:59
|
И..если не пользовать активикс вообще, а только штатный контрол, можно воткнуть "защиту от АЛьФа"
тип того:
|
|||
187
Ёпрст
25.05.20
✎
18:00
|
это убережет от "двойных нажатий"
|
|||
188
MWWRuza
гуру
25.05.20
✎
18:54
|
Ясно...
А просветите плиз, из какой вообще оперы эта синтаксическая конструкция: "СтрПоиска_KeyPress(Символ)" - ? Ну, понятно, "СпрПоиска" - имя контрола. "Keypress" - имя события. А почему между ними "жесткий пробел", нижнее подчеркивание? Это из какого языка? Мне стыдно, но я дожил до своих лет, а кроме 1С больше никаких ЯП не изучил... Ну, Дельфи немного, но, там я тоже такого не встречал... |
|||
189
Ёпрст
25.05.20
✎
19:00
|
||||
190
Ёпрст
25.05.20
✎
19:02
|
Ну и ежели свои классы писать, как наследник от активикса, там по-другому будет вызов событий внутри класса, без "идентификатора-контрола"
|
|||
191
Ёпрст
25.05.20
✎
19:03
|
ежели че, все доки тут
http://www.1cpp.ru/docum/ |
|||
192
MWWRuza
гуру
25.05.20
✎
19:18
|
Спасибо, понял... Как я только без als от этой ВК жил... Я хоть пока и не собираюсь писать свои классы(вроде нет таких задач, хватает стандартных), но даже со штатными функциями удобнее разбираться когда есть куда заглянуть.
|
|||
193
MWWRuza
гуру
25.05.20
✎
21:17
|
(183) Супер! Так работает.
Поспешил обрадоваться тому, что кода почти нет, а все работает... Работает, да не совсем правильно. Ставишь курсор в любое место имеющейся строки, начинаешь вводить текст, а он в конец строки добавляется, и плевать ему на позицию курсора... Получается, нужно определять позицию курсора, делить на текст "до" и "после", и вставлять новые символы "между" этими частями. А это опять приведет к усложнению текста процедуры, практически до того, от чего начинал. Ну, не совсем - делет, бакспейс и стрелки вправо/влево без лишних действий в модуле программы обрабатываются правильно. А вот со вводом символов, в процедуре "СтрПоиска_KeyPress(Символ)" все равно мудрить надо. Но, это только МелкоМягкого контрола касается - RichTextBox работает нормально без каких-либо дополнительных обработок нажатий клавиш... |
|||
194
MWWRuza
гуру
25.05.20
✎
22:10
|
+(193) Может какое свойство для этого есть? Тут: https://docs.microsoft.com/ru-ru/office/vba/api/access.textbox все пересмотрел, ничего похожего не вижу... Вот этим: https://docs.microsoft.com/ru-ru/office/vba/api/access.textbox.selstart можно определить позицию курсора, но как ему объяснить, что это: КонтролТекста.Text + Симв(Символ.value) надо делать не в конец строки, а с позиции курсора, вставкой со сдвигом оставшейся части строки, не понятно...
|
|||
195
Злопчинский
25.05.20
✎
22:24
|
(194) да ну нах такие сложности. проще очистить поле и заново набрать. втсавлять в середину - раз из ста...
|
|||
196
MWWRuza
гуру
25.05.20
✎
22:44
|
Да в принципе - вот так работает:
Процедура СтрПоиска_KeyPress(Символ) // КонтролТекста.Text = КонтролТекста.Text + Симв(Символ.value); Если (ПустаяСтрока(Символ) = 0) или (Символ = " ") Тогда ДопХа = КонтролТекста.SelStart; ДлинаВыделения = КонтролТекста.SelLength; ПодстрокаПоиска = КонтролТекста.Text; Начало = Лев(ПодстрокаПоиска, ДопХа); Финиш = Сред(ПодстрокаПоиска, ДопХа + ДлинаВыделения + 1); КонтролТекста.Text = Начало + Симв(Символ.value) + Финиш; КонтролТекста.SelStart = ДопХа + 1; КонецЕсли; КонецПроцедуры Хоть это и возврат к коду, который Ёпрст отправил в топку, но, это только малая часть того, что было "нагорожено" - только добавление символов обрабатывается, все остальные клавиши - автоматом. У меня было еще полсотни строк для обработки курсора, делета, бакспейса... |
|||
197
Ёпрст
25.05.20
✎
22:49
|
(193) М-магия
Процедура СтрПоиска_KeyPress(Символ) Старт = КонтролТекста.SelStart; ТекстКонтрола = КонтролТекста.text; Начало = Лев(ТекстКонтрола,Старт+КонтролТекста.CurLine); КонтролТекста.text=Начало+Симв(Символ.value)+Сред(ТекстКонтрола,Старт+КонтролТекста.SelLength+1+КонтролТекста.CurLine); КонтролТекста.SelStart=Старт+СтрДлина(Симв(Символ.value)); КонецПроцедуры |
|||
198
MWWRuza
гуру
25.05.20
✎
23:06
|
Ага... Работает :-)
Только такого свойства "CurLine" у ТекстБокса нет... Он его похоже от "Microsoft Forms" наследует... Но, вообще, все равно не понятно... При чем здесь номер строки и позиция курсора в строке? Из описания: Задает текущую строку элемента управления. Примечания Текущей строкой элемента управления является та, в которой находится точка вставки. Первая строка имеет номер 0. Свойство CurLine применяется только для элементов управления с фокусом. Но работает! Точно магия :-) |
|||
199
Ёпрст
25.05.20
✎
23:12
|
(198)
всё есть Property CurLine As Long Member of MSForms.TextBox |
|||
200
Ёпрст
25.05.20
✎
23:15
|
этот кусок от MultiLine = true в коде у меня завалялся.. можешь и выкинуть
|
|||
201
MWWRuza
гуру
25.05.20
✎
23:23
|
(200) А... Тогда все понятно.
А вообще, в описании ТекстБокса от Акцесс, действительно нет такого свойства. Но, зато есть в Оутлоке: TextBox.CurLine Property (Outlook Forms Script): https://docs.microsoft.com/ru-ru/office/vba/api/outlook.textbox.curline Это получается, у МайкроСофта для разных программ одного семейства, разные контролы-? Или просто описание так построено? |
|||
202
MWWRuza
гуру
25.05.20
✎
23:31
|
Работает:
Процедура СтрПоиска_KeyPress(Символ) Старт = КонтролТекста.SelStart; ТекстКонтрола = КонтролТекста.text; Начало = Лев(ТекстКонтрола,Старт); КонтролТекста.text = Начало + Симв(Символ.value) + Сред(ТекстКонтрола,Старт + КонтролТекста.SelLength + 1); КонтролТекста.SelStart = Старт + СтрДлина(Симв(Символ.value)); КонецПроцедуры По сути, то-же самое, что и у меня в (196), только в одну строку написано. |
|||
203
MWWRuza
гуру
25.05.20
✎
23:36
|
И +(202) Наверное можно и это упростить:
КонтролТекста.SelStart = Старт + СтрДлина(Симв(Символ.value)); до КонтролТекста.SelStart = Старт + 1; Все равно длина строки вводимого символа всегда 1 будет, так, как событие будет срабатывать после ввода каждого символа. |
|||
204
Ёпрст
25.05.20
✎
23:37
|
осталось копи-пасте
|
|||
205
Ёпрст
25.05.20
✎
23:38
|
прикрутить
|
|||
206
MWWRuza
гуру
25.05.20
✎
23:45
|
Ага. Но, это уже если только из чисто "спортивного интереса" - я с трудом представляю, зачем такое в реальных задачах может понадобится.
Но, хотя... Я сильно ошибаюсь, задача есть - далеко ходить не надо, моя "сокращалка" из поста(165). Вдруг захотят слова местами поменять в контролах - вот тут, копи/паст и пригодился бы... |
|||
207
MWWRuza
гуру
25.05.20
✎
23:50
|
Можно через это попробовать:
БуферОбмена Класс БуферОбмена / Clipboard Класс позволяет работать с системным буфером обмена. Версия: Метод работает на релизе 2.5 и позже. Методы Получить / Get Синтаксис: Строка Получить() Описание: Получает текст из системного буфера обмена. Установить / Set Синтаксис: void Установить(Строка Текст) Параметры: Текст - тип: Строка. Новый текст для буфера обмена. Описание: Сохраняет текст в системного буфере обмена. |
|||
208
Ёпрст
26.05.20
✎
00:11
|
Не.. всё проще
Процедура СтрПоиска_KeyUp(Клавиша,Шифт) Если (Клавиша.value = 67) И (Шифт=2) Тогда Если КонтролТекста.SelLength>0 Тогда КонтролТекста.Copy(); КонецЕсли; ИначеЕсли (Клавиша.value = 86) И (Шифт=2) Тогда КонтролТекста.Paste(); КонецЕсли; КонецПроцедуры |
|||
209
Salimbek
26.05.20
✎
00:30
|
(180) "Посмотрел, там тоже событие Event Change()"
Я в (109) искал вроде бы события этого контрола, и нашел TextChanged() тут: https://metanit.com/sharp/windowsforms/4.3.php и тут: https://stackoverflow.com/questions/12354753/textbox-textchanged-and-ctrl-a |
|||
210
Ёпрст
26.05.20
✎
09:30
|
(209) Я смотрю по-старинке, через vba
|
|||
211
Ёпрст
26.05.20
✎
09:32
|
Там все события\методы\свойства соответствуют. TextChanged- такого нема у этого активикса
|
|||
212
Salimbek
27.05.20
✎
16:38
|
(211) Посмотрел - действительно, все работает.
Надо в код из (153) добавить такую процедуру: //Контрол, который используется для АктивИкса - СтрПоиска. Поэтому событие СтрПоиска + _Change //АтрФормы.УстановитьАтрибут(..., "СтрПоиска") Процедура СтрПоиска_Change() //Тут, внимание, используется ПЕРЕМЕННАЯ , которая используется для АктивИкса в ПослеОткрытии //СтПоиска = АтрФормы.СоздатьЭУ("VBCCR16.RichTextBox"); Сообщить("Прилетело изменение: "+СтПоиска.Text); КонецПроцедуры // СтрПоиска_Change и можно выкинуть все обработки нажатий, отжатий и прочего. |
|||
213
Злопчинский
27.05.20
✎
16:39
|
(212) ждем вменяемого окнчательного кода/пакета
|
|||
214
MWWRuza
гуру
27.05.20
✎
17:31
|
(213) Вот: https://cloud.mail.ru/public/9WYj/2V7uAqXy7
Работает с любым ТекстБоксом, хоть MS, хоть RichTextBox, определяет автоматом - пытается создать объект MS, не получилось - пытается создать РичТекстБокс. Дальше, соответственно работает. Работают все три клавиши копи/паста - Ctrl(X,C,V). В общем можно сказать, окончательный вариант... Не хватает только копи/паста из контекстного меню - по правой кнопке мыши... Попробовал - не получилось, мозгов не хватило... Может Ёпрст на досуге идейку подкинет, как такое можно реализовать :-) |
|||
215
MWWRuza
гуру
27.05.20
✎
17:36
|
+(214) Событие клика правой кнопкой мыши ловлю:
Процедура СтрПоиска_MouseDown(Button, Shift, X, Y) Если Button = 2 Тогда // КонтролТекста.ShortcutMenuBar = 1; КонецЕсли; КонецПроцедуры А как само меню открыть - так и не понял... |
|||
216
MWWRuza
гуру
27.05.20
✎
21:24
|
(212) В вот фигушки :-(
В тестовой обработке - работает, все отлично. Попробовал перенести в рабочую конфигурацию - ни в какую... Не отрабатывает событие СтрПоиска_KeyPress(Символ). Ну вообще, как и нет его... При этом - СтрПоиска_Change() - работает... Проверил тысячу раз, думал, может что-то с именами накосячил... Нет, все правильно. А не работает! Целый час убил, пока искал "черную кошку в темной комнате"... А оказалось, как всегда - ее там просто нет! Все у меня правильно. А не работает - потому, что форма в модальном режиме открывается. Ну, так надо по концепции конфигурации. Не могу я ее открывать не модально. Ив 7.7 нет такого параметра, как в восьмерке "режим открытия формы - блокировать все окна". Только модально. Так, что - придется код из топки доставать, как бы этого и не хотелось... |
|||
217
MWWRuza
гуру
27.05.20
✎
21:44
|
+(216) СтрПоиска_KeyUp - в модальном режиме тоже не отрабатывает...
|
|||
218
Salimbek
27.05.20
✎
22:03
|
(216) А зачем тебе СтрПоиска_KeyPress ?
|
|||
219
MWWRuza
гуру
27.05.20
✎
22:17
|
(218) А без нее, только стрелки, делет и бакспейс работают. Символы не вводятся. В случае контрола от МайкроСофт. В (176) и дальше обсуждали. В случае РичБокса - все и так работает.
|
|||
220
Salimbek
27.05.20
✎
22:40
|
(219) А... понял. Попробуй зайти с другого краю.
Дело в том, что мы создаем АктивИкс на Кнопке - а она не любит ввод символов, потому как она кнопка. А если надо вводить что-то - то лучше удали эту Кнопку. Затем на этом же месте создай на форме текстовое поле ввода с тем же именем СтрПоиска и на нем создавай АктивИкс. |
|||
221
Salimbek
27.05.20
✎
22:41
|
+(220) Т.е. просто тупо удаляешь кнопку, пихаешь на это место другой элемент и запускаешь... Код трогать не надо. Может поможет.
|
|||
222
Salimbek
27.05.20
✎
22:48
|
Хотя, нет :-(
Там можно только поле Текст использовать. И вот тогда совсем перестают кнопки прилетать... |
|||
223
MWWRuza
гуру
27.05.20
✎
23:04
|
В общем, для модальных окон, я думаю, надо сделать некий "гибрид". Событие изменения текста в строке, ловить с помощью СтрПоиска_Change(), и из нее запускать поиск или что еще надо, раз она работает. Всякие делеты, бакспейсы, стрелки - будут и так работать, ничего для этого делать не надо. А символы ловить с помощью ПриНажатииКнопкиКлавиатуры, как изначально было. Оно в модальном режиме без проблем работает. Все равно код упрощается значительно.
|
|||
224
Ёпрст
27.05.20
✎
23:56
|
(223) формекс у тебя какой хоть версии ?
На счет контекстного меню, можно или тот же активикс типа менюитем использовать, или формековское меню из списка значений |
|||
225
Ёпрст
28.05.20
✎
01:44
|
Хотя не.. просто не используй поделие от мелкомягких и усё.
|
|||
226
MWWRuza
гуру
28.05.20
✎
09:27
|
(225) Да я уже подумал об этом... Надо "в углу покопаться", был вроде какой-то системник с установленной виндой. Надо его в домашнюю сетку прицепить, и поэкспериментировать на нем.
Просто после того, как поймал "глюк" с падением 1С, при использовании контрола РичТекст, как-то стремно не протестировав в рабочии конфигурации такое встраивать... Конечно, принудительное создание нужного объекта, это дает возможность протестировать и на компе с мс офисом, но, для чистоты эксперимента, окончательное тестирование лучше делать на "чистом" компе, где никогда не было ничего от мс, не считая самой винды. У клиента, где я первый раз с этим столкнулся уже установлен РанТайм от Акцеса, там уже эксперимент не будет чистым... |
|||
227
MWWRuza
гуру
28.05.20
✎
23:08
|
+(226) В процедуре "ПриЗакрытии()" добавка вот такой строки: "АтрФормы.Destroy();", вроде вылечивает от падений... При чем, и для MS, и для Рич...
|
|||
228
MWWRuza
гуру
11.06.20
✎
16:09
|
Хм... Сегодня случайно заметил, что при вводе букв(именно символов, стрелки, пробел, бакспейс и делет сюда не попадают), динамики(колонки) компа издают громкое "блямс" на каждую букву, типа сигнал ошибки... По большому счету - да пофик, все равно почти ни у кого звука на рабочих станциях нет... Но, вдруг... Можно как-то подавить этот эффект?
Вот, со звуком: https://cloud.mail.ru/public/u3yr/2mTfafKeL |
|||
229
Злопчинский
11.06.20
✎
16:14
|
(228) кузявенько выглядит.
|
|||
230
Злопчинский
11.06.20
✎
16:15
|
справочник большой?
а то моему "лавочнику" как раз бы пригодился, у него в спр.номенклатуры 20 тыс и более |
|||
231
MWWRuza
гуру
11.06.20
✎
16:16
|
+(228) Звук возникает после завершения вот этой процедуры:
Процедура СтрПоиска_KeyPress(Символ) Если MSContr = 1 Тогда Старт = СтрБыстрПоиска.SelStart; ТекстКонтрола = СтрБыстрПоиска.text; Начало = Лев(ТекстКонтрола,Старт); СтрБыстрПоиска.text = Начало + Симв(Символ.value) + Сред(ТекстКонтрола,Старт + СтрБыстрПоиска.SelLength + 1); СтрБыстрПоиска.SelStart = Старт + СтрДлина(Симв(Символ.value)); КонецЕсли; КонецПроцедуры В отладчике смотрел, как последним шагом проходит "КонецПроцедуры", так "блямс" из динамиков... |
|||
232
MWWRuza
гуру
11.06.20
✎
16:18
|
(230) Проверял на ~80 000, работает нормально, без тормозов, по крайней мере на моем компе Коре i5, 32 бита, соответственно ОЗУ 3 с копейками...
|
|||
233
Злопчинский
11.06.20
✎
16:22
|
(232) ну когда окончательно все вычистишь - попрошу очередной "последний" инсталл...
. и вообще кузяво сделать чтобы фокус вполе ввода не ставить. прсото набираешь буквы - и считаем что это идет быстрый поиск... это подойдет для простых форм с одной ТЧ списка |
|||
234
MWWRuza
гуру
11.06.20
✎
16:49
|
(233) прсото набираешь буквы - и считаем что это идет быстрый поиск...
Хм... А если нужно просто в списке искать, штатным методом, по первым буквам? Можно просто фокус в поле поиска ставить при открытии формы, хотя, толку от этого будет не много... Но все равно надо подумать. |
|||
235
victuan1
15.06.20
✎
05:04
|
А вот здесь http://catalog.mista.ru/public/141197/ не то же самое по сути реализовано?
|
|||
236
Злопчинский
15.06.20
✎
10:26
|
(235) угу, только здесь автор еще всякой хрени дополнительно впилил
|
|||
237
Ёпрст
15.06.20
✎
10:42
|
(236) да нет там "хрени", там просто универсальный метод, подключил класс и готово - работает во всех формах.
|
|||
238
Ёпрст
15.06.20
✎
10:43
|
Были какие-то недочеты, не вспомню ужо
|
|||
239
Злопчинский
15.06.20
✎
20:44
|
(237) там - нет, а в этой ветке - есть чего-то дополнительное. много всего, но я не понял что принципиально неудовлетворило автора в твоей публикации
|
|||
240
MWWRuza
гуру
15.06.20
✎
21:43
|
(239) Да все удовлетворило... Поздно увидел, когда уже свой велосипед изобрел... Теперь, уже лень переделывать, все и так работает. Из видимых минусов - только "блямконье" в колонках, остальное все полностью, на все 100% устраивает.
|
|||
241
victuan1
16.06.20
✎
08:09
|
(235) А по-моему, там только по Энтеру начинается поиск? Т.е. он не "живой" как тут?
|
|||
242
Ёпрст
16.06.20
✎
09:12
|
(241) там всё норм
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |