|
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 сделана, и работает нормально. В принципе - нового только то, что решил сделать с помощью Формекса так, что-бы искалось не нажимая ентер в строке или кнопку, просто при вводе символов в строку. В целом - работает. Но, если вводить символы "не спеша", по одному... Стоит начать вводить быстро, начинает косячить - символы задваиваются... Что это - глюк? Попытка асинхронности в Формекс? Можно это как-то обойти? В целом, интересная штука получилась, не хочется от нее отказываться... |
|||
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) там всё норм
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |