Вход | Регистрация
    1  2  3
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Глюк Формекс? Или я чего-то не понял...

v7: Глюк Формекс? Или я чего-то не понял...
Я
   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 сделана, и работает нормально.
В принципе - нового только то, что решил сделать с помощью Формекса так, что-бы искалось не нажимая ентер в строке или кнопку, просто при вводе символов в строку.

В целом - работает. Но, если вводить символы "не спеша", по одному... Стоит начать вводить быстро, начинает косячить - символы задваиваются...
Что это - глюк? Попытка асинхронности в Формекс?
Можно это как-то обойти? В целом, интересная штука получилась, не хочется от нее отказываться...
   MWWRuza
 
201 - 25.05.20 - 23:23
(200) А... Тогда все понятно.
А вообще, в описании ТекстБокса от Акцесс, действительно нет такого свойства.
Но, зато есть в Оутлоке: TextBox.CurLine Property (Outlook Forms Script): https://docs.microsoft.com/ru-ru/office/vba/api/outlook.textbox.curline
Это получается, у МайкроСофта для разных программ одного семейства, разные контролы-? Или просто описание так построено?
   MWWRuza
 
202 - 25.05.20 - 23:31
Работает:

Процедура СтрПоиска_KeyPress(Символ)
    Старт             = КонтролТекста.SelStart;
    ТекстКонтрола         = КонтролТекста.text;
    Начало             = Лев(ТекстКонтрола,Старт);
    КонтролТекста.text        = Начало + Симв(Символ.value) + Сред(ТекстКонтрола,Старт + КонтролТекста.SelLength + 1);
    КонтролТекста.SelStart    = Старт + СтрДлина(Симв(Символ.value));
КонецПроцедуры

По сути, то-же самое, что и у меня в (196), только в  одну строку написано.
   MWWRuza
 
203 - 25.05.20 - 23:36
И +(202) Наверное можно и это упростить:

КонтролТекста.SelStart    = Старт + СтрДлина(Симв(Символ.value));

до
КонтролТекста.SelStart    = Старт + 1;

Все равно длина строки вводимого символа всегда 1 будет, так, как событие будет срабатывать после ввода каждого символа.
   Ёпрст
 
204 - 25.05.20 - 23:37
осталось копи-пасте
   Ёпрст
 
205 - 25.05.20 - 23:38
прикрутить
   MWWRuza
 
206 - 25.05.20 - 23:45
Ага. Но, это уже если только из чисто "спортивного интереса" - я с трудом представляю, зачем такое в реальных задачах может понадобится.

Но, хотя... Я сильно ошибаюсь, задача есть - далеко ходить не надо, моя "сокращалка" из поста(165). Вдруг захотят слова местами поменять в контролах - вот тут, копи/паст и пригодился бы...
   MWWRuza
 
207 - 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();
    КонецЕсли;
КонецПроцедуры
   Salimbek
 
209 - 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- такого нема у этого активикса
   Salimbek
 
212 - 27.05.20 - 16:38
(211) Посмотрел - действительно, все работает.
Надо в код из (153) добавить такую процедуру:

//Контрол, который используется для АктивИкса - СтрПоиска. Поэтому событие СтрПоиска + _Change

//АтрФормы.УстановитьАтрибут(..., "СтрПоиска")
Процедура СтрПоиска_Change()
    //Тут, внимание, используется ПЕРЕМЕННАЯ , которая используется для АктивИкса в ПослеОткрытии

    //СтПоиска    = АтрФормы.СоздатьЭУ("VBCCR16.RichTextBox");

    Сообщить("Прилетело изменение: "+СтПоиска.Text);
КонецПроцедуры// СтрПоиска_Change



и можно выкинуть все обработки нажатий, отжатий и прочего.
   Злопчинский
 
213 - 27.05.20 - 16:39
(212) ждем вменяемого окнчательного кода/пакета
   MWWRuza
 
214 - 27.05.20 - 17:31
(213) Вот: https://cloud.mail.ru/public/9WYj/2V7uAqXy7

Работает с любым ТекстБоксом, хоть MS, хоть RichTextBox, определяет автоматом - пытается создать объект MS, не получилось - пытается создать РичТекстБокс. Дальше, соответственно работает.
Работают все три клавиши копи/паста - Ctrl(X,C,V).
В общем можно сказать, окончательный вариант...

Не хватает только копи/паста из контекстного меню - по правой кнопке мыши... Попробовал - не получилось, мозгов не хватило... Может Ёпрст на досуге идейку подкинет, как такое можно реализовать :-)
   MWWRuza
 
215 - 27.05.20 - 17:36
+(214) Событие клика правой кнопкой мыши ловлю:

Процедура СтрПоиска_MouseDown(Button, Shift, X, Y)
    Если Button = 2 Тогда
//        КонтролТекста.ShortcutMenuBar = 1; 

    КонецЕсли;   
КонецПроцедуры

А как само меню открыть - так и не понял...
   MWWRuza
 
216 - 27.05.20 - 21:24
(212) В вот фигушки :-(
В тестовой обработке - работает, все отлично. Попробовал перенести в рабочую конфигурацию - ни в какую...
Не отрабатывает событие СтрПоиска_KeyPress(Символ). Ну вообще, как и нет его... При этом - СтрПоиска_Change() - работает...
Проверил тысячу раз, думал, может что-то с именами накосячил... Нет, все правильно. А не работает! Целый час убил, пока искал "черную кошку в темной комнате"... А оказалось, как всегда - ее там просто нет! Все у меня правильно.
А не работает - потому, что форма в модальном режиме открывается. Ну, так надо по концепции конфигурации. Не могу я ее открывать не модально. Ив 7.7 нет такого параметра, как в восьмерке "режим открытия формы - блокировать все окна". Только модально. Так, что - придется код из топки доставать, как бы этого и не хотелось...
   MWWRuza
 
217 - 27.05.20 - 21:44
+(216) СтрПоиска_KeyUp - в модальном режиме тоже не отрабатывает...
   Salimbek
 
218 - 27.05.20 - 22:03
(216) А зачем тебе СтрПоиска_KeyPress ?
   MWWRuza
 
219 - 27.05.20 - 22:17
(218) А без нее, только стрелки, делет и бакспейс работают. Символы не вводятся. В случае контрола от МайкроСофт. В (176) и дальше обсуждали. В случае РичБокса - все и так работает.
   Salimbek
 
220 - 27.05.20 - 22:40
(219) А... понял. Попробуй зайти с другого краю.

Дело в том, что мы создаем АктивИкс на Кнопке - а она не любит ввод символов, потому как она кнопка. А если надо вводить что-то  - то лучше удали эту Кнопку. Затем на этом же месте создай на форме текстовое поле ввода с тем же именем СтрПоиска и на нем создавай АктивИкс.
   Salimbek
 
221 - 27.05.20 - 22:41
+(220) Т.е. просто тупо удаляешь кнопку, пихаешь на это место другой элемент и запускаешь... Код трогать не надо. Может поможет.
   Salimbek
 
222 - 27.05.20 - 22:48
Хотя, нет :-(

Там можно только поле Текст использовать. И вот тогда совсем перестают кнопки прилетать...
   MWWRuza
 
223 - 27.05.20 - 23:04
В общем, для модальных окон, я думаю, надо сделать некий "гибрид". Событие изменения текста в строке, ловить с помощью СтрПоиска_Change(), и из нее запускать поиск или что еще надо, раз она работает. Всякие делеты, бакспейсы, стрелки - будут и так работать, ничего для этого делать не надо. А символы ловить с помощью ПриНажатииКнопкиКлавиатуры, как изначально было. Оно в модальном режиме без проблем работает. Все равно код упрощается значительно.
   Ёпрст
 
224 - 27.05.20 - 23:56
(223) формекс у тебя какой хоть версии ?
На счет контекстного меню, можно или тот же активикс типа менюитем использовать, или формековское меню из списка значений
   Ёпрст
 
225 - 28.05.20 - 01:44
Хотя не.. просто не используй поделие от мелкомягких и усё.
   MWWRuza
 
226 - 28.05.20 - 09:27
(225) Да я уже подумал об этом... Надо "в углу покопаться", был вроде какой-то системник с установленной виндой. Надо его в домашнюю сетку прицепить, и поэкспериментировать на нем.
Просто после того, как поймал "глюк" с падением 1С, при использовании контрола РичТекст, как-то стремно не протестировав в рабочии конфигурации такое встраивать... Конечно, принудительное создание нужного объекта, это дает возможность протестировать и на компе с мс офисом, но, для чистоты эксперимента, окончательное тестирование лучше делать на "чистом" компе, где никогда не было ничего от мс, не считая самой винды. У клиента, где я первый раз с этим столкнулся уже установлен РанТайм от Акцеса, там уже эксперимент не будет чистым...
   MWWRuza
 
227 - 28.05.20 - 23:08
+(226) В процедуре "ПриЗакрытии()" добавка вот такой строки: "АтрФормы.Destroy();", вроде вылечивает от падений... При чем, и для MS, и для Рич...
   MWWRuza
 
228 - 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 тыс и более
 
 Рекламное место пустует
   MWWRuza
 
231 - 11.06.20 - 16:16
+(228) Звук возникает после завершения вот этой процедуры:

Процедура СтрПоиска_KeyPress(Символ)
    Если MSContr = 1 Тогда
        Старт                     = СтрБыстрПоиска.SelStart;
        ТекстКонтрола             = СтрБыстрПоиска.text;
        Начало                     = Лев(ТекстКонтрола,Старт);
        СтрБыстрПоиска.text        = Начало + Симв(Символ.value) + Сред(ТекстКонтрола,Старт + СтрБыстрПоиска.SelLength + 1);
        СтрБыстрПоиска.SelStart    = Старт + СтрДлина(Симв(Символ.value));
    КонецЕсли;
КонецПроцедуры

В отладчике смотрел, как последним шагом проходит "КонецПроцедуры", так "блямс" из динамиков...
   MWWRuza
 
232 - 11.06.20 - 16:18
(230) Проверял на ~80 000, работает нормально, без тормозов, по крайней мере на моем компе Коре i5, 32 бита, соответственно ОЗУ 3 с копейками...
   Злопчинский
 
233 - 11.06.20 - 16:22
(232) ну когда окончательно все вычистишь - попрошу очередной "последний" инсталл...
.
и вообще кузяво сделать чтобы фокус вполе ввода не ставить.
прсото набираешь буквы - и считаем что это идет быстрый поиск...
это подойдет для простых форм с одной ТЧ списка
   MWWRuza
 
234 - 11.06.20 - 16:49
(233) прсото набираешь буквы - и считаем что это идет быстрый поиск...

Хм... А если нужно просто в списке искать, штатным методом, по первым буквам?
Можно просто фокус в поле поиска ставить при открытии формы, хотя, толку от этого будет не много... Но все равно надо подумать.
   victuan1
 
235 - 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) там - нет, а в этой ветке - есть чего-то дополнительное. много всего, но я не понял что принципиально неудовлетворило автора в твоей публикации
   MWWRuza
 
240 - 15.06.20 - 21:43
(239) Да все удовлетворило... Поздно увидел, когда уже свой велосипед изобрел... Теперь, уже лень переделывать, все и так работает. Из видимых минусов - только "блямконье" в колонках, остальное все полностью, на все 100% устраивает.
   victuan1
 
241 - 16.06.20 - 08:09
(235) А по-моему, там только по Энтеру начинается поиск? Т.е. он не "живой" как тут?
   Ёпрст
 
242 - 16.06.20 - 09:12
(241) там всё норм
  1  2  3

Список тем форума
Рекламное место пустует  Рекламное место пустует
Читай всё полезное и впитывай, а нападки игнорируй. Здесь так принято. aka AMIGO
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.