Имя: Пароль:
1C
1C 7.7
v7: Позиция в многострочной строке
0 MiracMC
 
11.09.18
14:02
Добрый день.

Есть элемент формы "Строка" с размером "Не ограничено" и галочкой "Многострочный".

При вводе\редактировании текста в этот элемент формы надо понимать позицию курсора. Иными словами точно знать в какой строке и на каком символе он установлен в текущий момент.

Есть решение такой задачи? Такое вообще возможно?

Заранее благодарен за оперативный ответ.

Спасибо.
1 serpentt
 
11.09.18
14:13
"Зачем"?

Что потом хотите сделать, проанализировать и в какой момент.
2 MiracMC
 
11.09.18
14:23
(1) Собственно цель в том что б потом, когда поставили курсов в нужное место, нажать на кнопку на форме и, к примеру, вставить что то заранее заготовленное в текст... спец сивлол, знак табуляции... да что угодно...

просто не всегда Ctr+V помогает...
3 ADirks
 
11.09.18
14:28
(0) я нашёл единственный более-менее вразумительный вариант - вкрутить tiny MCE
например так: http://www.1cpp.ru/forum/YaBB.pl?num=1253809274

пробовал всякие Active-X'ы, так они либо слишком примитивные, либо за деньги
4 Злопчинский
 
11.09.18
14:47
(2) Мутачное решение. Неограниченная строка это как правило НЕФОРМАЛИЗОВАННЫЕ данные. поэтому что куда ставить - похреню это все только для глазок, а не для автоматизированной обработки.
Как вариант В ЛЮБОЕ МЕСТО пишите типа "%Ключ=Значение%"
гже процент - знак-ограничитиель "формализованных" данных. Ключ - какоето предпределенной значение. Значение - содержимое по ключу.
5 Peltik
 
11.09.18
14:48
(2) а почему Ctr+V не всегда помогает?
6 vova1122
 
11.09.18
14:50
можно и штатно сделать, но через большую "Ж..". Имеется готовый теккст (многострочный, однострочный) неважно. Сохранить его во временный текст. Потом в нужном месте вставить например пробел. Потом проанализировать в каком месте текст изменился. И в этом месте заменить пробел на свой заготовленный текст
7 uno-group
 
11.09.18
14:53
Делаете строку не ограниченной длины на форме. и при перемещении по таблице обновляете ее. редактируется соответственно тоже она при окончании редактирования обновляете нужный реквизит в табличной части.
8 MiracMC
 
11.09.18
14:53
(3) Спасибо.. раскуриваю)
(5) как раз вариант с tiny MCE это, по идее, все то что и надо реализовать... задача, по сути, некая верстка текста... примитивная по идее но все же...
(6) тут все равно та же проблема возникнет. не понятно какая позиция поменялась... ну или не пробел а что то другое писать по тексту как "признак курсора"...
9 vova1122
 
11.09.18
14:57
(8) почему непонятно? Имеете старый текст (до редактирования) и новый текст (после вставки пробела). Проблема сравнить посимвольно два текста и найти в какой позиции отличие?
10 Злопчинский
 
11.09.18
14:58
11 ADirks
 
11.09.18
15:02
(10) это для восьмёрки, там проще
12 Peltik
 
11.09.18
15:02
(8)  tiny MCE многабукаф, тут задача проще:

1. Залить в буфер обмена вставляемый текст
2. Имитировать нажатие Ctrl+V

и первое и второе, решается в две строки
13 ADirks
 
11.09.18
15:04
(12) ты забыл п.3:  поставить курсор туда, где он был
речь идёт об интерактивном редактировании

а букаф много, тут не поспоришь
14 uno-group
 
11.09.18
15:05
Вставлять тильду, ё, ** при окончании редактирования заменять их на нужное
15 Peltik
 
11.09.18
15:07
(13) посчитать количество символов во вставляемом тексте и имитировать нажатие клавиши "вправо" N раз :)
16 Peltik
 
11.09.18
15:08
(15) сори "влево", у меня эта, сено-солома :)
17 MiracMC
 
11.09.18
15:28
(3) Вполне рабочее. И применимо для моих целей.
Единственное не удобно, или я пока не понял как... Автор этого чуда сохраняет и открывает html файлы... то есть передать на вход содержимое поля многострочного без превращения его в html не возможно. Ну и обратно только сохранив в html и потом считав его в поле можно хранить..
Но и это можно пережить.

Спасибо!
18 ADirks
 
11.09.18
16:54
(17) немножко кода по этому поводу
в принципе, могу накинуть классов, которые всю эту шляпу обслуживают

///******************************** ADirks 23.12.2013 ************
Функция IsHTML(стр) Экспорт
    Если Найти(стр, "<br />") > 0 Тогда
        Возврат 1;
    ИначеЕсли Найти(стр, "<table") > 0 Тогда
        Возврат 1;
    ИначеЕсли Найти(стр, "<tbody>") > 0 Тогда
        Возврат 1;
    КонецЕсли;
    Возврат 0;
КонецФункции
///******************************** ADirks 23.12.2013 ************

///******************************** ADirks 20.02.2014 ************
Функция LineBreak(н = 1) Export
    стр = "";
    Пока н >= 1 Цикл
        стр = стр + "<br />";
        н = н - 1;
    КонецЦикла;
    Возврат стр;
КонецФункции

Функция HTML_LineBreaks(стр) Export
    Возврат СтрЗаменить(стр, РазделительСтрок, "<br />");
КонецФункции

Функция ToPlainText(Знач стр) Экспорт
    стр = СтрЗаменить(стр, "<br />", РазделительСтрок);
    стр = СтрЗаменить(стр, "&nbsp;", " ");
    стр = СтрЗаменить(стр, "<p>", "");
    стр = СтрЗаменить(стр, "</p>", РазделительСтрок);
    Возврат стр;
КонецФункции
///******************************** ADirks 20.02.2014 ************

///******************************** ADirks 22.11.2016 ************
Функция стрЭкранироватьСпецСимволы(стр) Экспорт
    ScrptCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");
    ScrptCtrl.Language = "jscript";
    ScrptCtrl.AddCode(
    "function quote(str)
    |{
    |    str = str.replace(/\r\n/g, '<br>');
    |    str = str.replace(/\n\r/g, '<br>');
    |    str = str.replace('\r', '<br>');
    |    str = str.replace('\n', '<br>');
    |    str = str.replace('\'', '\\\'');
    |    str = str.replace('\""', '\\\""');
    |    return str;
    |}
    |");

    Возврат ScrptCtrl.CodeObject.quote(стр);
КонецФункции
///******************************** ADirks 22.11.2016 ************

///******************************** ADirks 07.04.2016 ************
Функция AddHeaderAndFooter(стр) Экспорт
    Возврат "<html><head>
    |<META http-equiv=Content-Type content=""text/html; charset=windows-1251"">
    |<title></title>
    |</head>
    |<body>"+стр+"</body>
    |</html>";
КонецФункции
///******************************** ADirks 07.04.2016 ************
19 Salimbek
 
11.09.18
19:51
(3) Я когда-то тоже сталкивался с такой проблемой. Решил стандартным АктивИкс-ом. Результат выкладывал тут: http://www.1cpp.ru/forum/YaBB.pl?num=1207118421/7#7
20 ADirks
 
12.09.18
06:44
(19) вроде бы то что нужно, но в многострочном режиме ведёт себя крайне странно :(
21 Peltik
 
12.09.18
08:10
(20) видимо внешние факторы влияют :)
22 Salimbek
 
12.09.18
08:23
(20) Я попробовал сунуться в тот код, но он у меня отругался, что Forms.TextBox.1 не смог создать. Х.з. что там с тех пор поменялось уже...
23 ADirks
 
12.09.18
08:29
(22) винда поменялась, наверное :)
MS Forms 2.0 (FM20.dll) отсутствует, либо не зарегано, либо версия не 2.0
24 ADirks
 
12.09.18
08:33
(22) + но в твоём коде смотреть особо нечего - ActiveX создали, а дальше он сам. Я только добавил Флешка.MultiLine = -1;
И вот в таком режиме оно вроде как многострочное, но визуальное положение курсора вообще не совпадает с тем, куда текст пишется. И перевод строки по Ctrl-Enter - тоже не то что нужно (хотя это может и настраивается, там свойств много).
25 ADirks
 
12.09.18
08:59
(24) мда... я же говорю, странные они все какие-то ...
фигушки он сам - вставлять буковки то он и не умеет. Удалять - пожалуйста, курсором возить - тоже может, а редактировать - нет. А принудительно в многострочном режиме получается фигня.
26 Salimbek
 
12.09.18
10:04
(25) А... это... Я помню такой трабл. Там дело в том, что я тогда был молод и глуп :-) Т.е. АктивИкс создается на Кнопке - и поэтому события определенные туда просто не прилетают. На создавать на поле ввода и тогда будут и кнопки нажиматься, и буковки прилетать.
27 Salimbek
 
12.09.18
10:09
(23) Ага, у меня с 7.7 где-то сервер с 2003-й стоит, на нем и балуюсь.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс