Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Rich Editor для 1С (число прочтений - 11988 )
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Rich Editor для 1С
18. Октября 2008 :: 12:23
Печать  
Полюбуйтесь...
  

RichEditor_001.7z ( 8 KB | Загрузки )
Наверх
 
IP записан
 
EugenVitla
Junior Member
**
Отсутствует


школьнег

Сообщений: 82
Местоположение: Москва
Зарегистрирован: 21. Марта 2008
Пол: Мужской
Re: Rich Editor для 1С
Ответ #1 - 18. Октября 2008 :: 13:04
Печать  
добрый способ Улыбка но 10 метров оперативы... ради одного экземпляра... жаба душит  Ужас
  
Наверх
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Rich Editor для 1С
Ответ #2 - 18. Октября 2008 :: 13:15
Печать  
Зато отбражает все, что отображает Интернет Експлорер.
Одну проблему осталось решить - кнопку ввод, по-видимому, перехватывает 1С.
  
Наверх
 
IP записан
 
EugenVitla
Junior Member
**
Отсутствует


школьнег

Сообщений: 82
Местоположение: Москва
Зарегистрирован: 21. Марта 2008
Пол: Мужской
Re: Rich Editor для 1С
Ответ #3 - 18. Октября 2008 :: 20:34
Печать  
была у меня уже маза однажды, зимой где-то... сделать что-то типа "главной страницы" по образу и подобию того, что в СКАТе от noprogrammer. а потом подумал - зачем мне веб-интерфейс к 1Сине? так и забросил это дело.
Однако IE в роли RichText - расточительно Подмигивание
  
Наверх
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Rich Editor для 1С
Ответ #4 - 20. Октября 2008 :: 07:17
Печать  
У меня появилось пара проблем. Может кто поможет?
Сделал класс, к-й при создании объекта превращает атрибут формы в RichEditor.
Код
Выбрать все
Процедура Create(_Конт, _ИмяАтрибута, _ИмяИсточника = "") Экспорт
	Конт1 = _Конт;
	ИмяАтрибута = _ИмяАтрибута;
	__Перехватчик.ПерехватитьСобытияГК(Конт1, Конт);
	_Форма = СоздатьОбъект("Форма");
	ЭУ = _Форма.СоздатьЭлементУправленияНаФорме(Конт1.Форма, СоздатьОбъект("АктивИкс"), ИмяАтрибута);
	Если ПустоеЗначение(_ИмяИсточника) = 0 Тогда
		Источник = СоздатьОбъект("АтрибутФормы");
		Источник.УстановитьАтрибут(Конт1.Форма, _ИмяИсточника);
	КонецЕсли;

	ЭУ.СоздатьЭУ("Shell.Explorer.2");
	browser = ЭУ.Объект;
	browser.Navigate("about:blank");
КонецПроцедуры 


С помощью Перехватчика и перехватываю события формы, на к-й RichEditor был создан.
Код
Выбрать все
Процедура Событие_axWBrowser_DocumentComplete() Экспорт
	Если ПустоеЗначение(Источник) = 0 Тогда
		Source(Источник.Значение);
		Editable(1);
	КонецЕсли;
КонецПроцедуры 


Т.е. созданный на форме активикс посылает этой самой форме сообщение axWBrowser_DocumentComplete() к-е класс перехватывает.
Вопрос первый:
События от активикса имеют вид ИмяАктивикса_ИмяСобытия(). Проблема в том, что я заранне не знаю ИмяАктивикса - на каждой форме он может быть разным. На одной форме может быть несколько активиксов. В приведенном примере имя активкса у меня задано жестко "axWBrowser". Но это не универсально. Есть ли способ перехватывать ВСЕ событияЮ даже не зная их имен?
Вопрос второй:
Когда меняется содержимое актвикса (хтмл код), я обновляю реквизит формы новым значением, чтобы признак модифицированности формы имзенился и при ее закрытии изменения были сохранены.
Код
Выбрать все
Процедура Событие_ПриНажатииКнопкиКлавиатуры(код, _а, _ш, _к, Символ, ФСО) Экспорт
	__Перехватчик.ВыполнитьОригинальноеСобытиеГК(Конт1, "ПриНажатииКнопкиКлавиатуры", код, _а, _ш, _к, Символ, ФСО);
	Если Конт1.Форма.АктивныйЭлемент() = ИмяАтрибута Тогда
		Источник.Значение = Source();
		Конт1.Форма.Обновить(1);
	КонецЕсли;
КонецПроцедуры 


Если не делать Конт1.Форма.Обновить(1) тогда признак модифицированности не меняется.
Значение Источника после записи по какой-то причине сбрасывается на начальное.  Печаль
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Rich Editor для 1С
Ответ #5 - 20. Октября 2008 :: 07:35
Печать  
Есть несколько способов решения.
1. Запретить юзать произвольные имена атрибутов формы для данного Активикс. Типа разработчик должен за этим следить.
2. Можно формировать динамический класс-обработчик перехвата ГК на лету Улыбка на базе сведений об атрибуте формы и т.д.
3. Ну и нужно вспомнить, что класс-наследник АктивИкс может получать событие от АктиИкс непосредственно.
В этом случае в имени события нет имени атрибута.
Читаем доку Улыбка

П.1 и 2. на самом деле не нужны Улыбка
П.3 изучить и внедрить.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Rich Editor для 1С
Ответ #6 - 20. Октября 2008 :: 08:07
Печать  
Насчет п.3
Как быть с вызовом оригинальных событий? Нет подводных камней?


>класс-наследник АктивИкс может получать событие от АктиИкс непосредственно.
В этом случае будут получатсья только события АктивИкс? А ПриНажатииКнопки... и другие события формы? Мне, в частности, нужно отловить события клавиатуры и мыши над моим АктвиИкс
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Rich Editor для 1С
Ответ #7 - 20. Октября 2008 :: 08:33
Печать  
blindvic писал(а) 20. Октября 2008 :: 08:07:
Насчет п.3
Как быть с вызовом оригинальных событий? Нет подводных камней?
>класс-наследник АктивИкс может получать событие от АктиИкс непосредственно.
В этом случае будут получатсья только события АктивИкс? А ПриНажатииКнопки... и другие события формы? Мне, в частности, нужно отловить события клавиатуры и мыши над моим АктвиИкс

1. Да, в этом случае будут получаться только события АктивИкс.
Но ты на этот же объект можешь возложить обязанности обработчика перехвата, т.е. также, как и сейчас.
Т.е. здесь нужно скомбинировать 2 подхода - АктивИкс + Перехватчик.

2. Каких оригинальных событий?
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Rich Editor для 1С
Ответ #8 - 20. Октября 2008 :: 09:12
Печать  
>2. Каких оригинальных событий?
В смысле, если форма на к-й находится АктивИкс тоже захочет обработать его события...
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Rich Editor для 1С
Ответ #9 - 20. Октября 2008 :: 09:16
Печать  
Либо ты создаешь объект-наследник от встроенного класса "АктивИкс" и сам создаешь элемент управления и получаешь события в свой объект,
либо форма создает элемент управления сама и сама обрабатывает.
Во втором случае - есть префикс события по имени атрибута, во втором нету.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Rich Editor для 1С
Ответ #10 - 20. Октября 2008 :: 10:06
Печать  
Кажись, получилось. Кому интересно:
defcls:
Код
Выбрать все
класс RichEditor:АктивИкс = defclsRichEditor@MD{}; 


defclsRichEditor:
Код
Выбрать все
Перем Конт; // контекст данного объекта
Перем Конт1; // контекст, на к-м находится браузер
Перем browser, Источник, ИмяАтрибута;
Перем DocumentComplete;

//****************************************************************************
Функция Source(Text = -1) Экспорт
	Попытка
		Если ТипЗначенияСтр(Text) = "Строка" Тогда
			browser.Document.body.innerHTML = Text;
		КонецЕсли;
		Возврат browser.Document.body.innerHTML;
	Исключение;
	КонецПопытки;
КонецФункции

//****************************************************************************
Процедура Editable(Editable) Экспорт
	Попытка
		browser.Document.parentWindow.execScript("document.body.contentEditable=" + ?(Editable = 0, "false", "true"));
	Исключение;
	КонецПопытки;
КонецПроцедуры

//****************************************************************************
Процедура execCommand(cmd) Экспорт
	Попытка
		browser.Document.parentWindow.execScript("document.execCommand('" + cmd + "', null, null);");
	Исключение;
	КонецПопытки;
КонецПроцедуры

//****************************************************************************
Процедура Create(_Конт, _ИмяАтрибута, _ИмяИсточника = "") Экспорт
	Конт1 = _Конт;
	ИмяАтрибута = _ИмяАтрибута;
	__Перехватчик.ПерехватитьСобытияГК(Конт1, Конт);
	Атрибут = СоздатьОбъект("АтрибутФормы");
	Атрибут.УстановитьАтрибут(Конт1.Форма, _ИмяАтрибута);
	_Форма = СоздатьОбъект("Форма");
	ЭУ = _Форма.СоздатьЭлементУправленияНаФорме(Конт1.Форма, Конт, ИмяАтрибута);
	ЭУ.СоздатьЭУ("Shell.Explorer.2");
	Если ПустоеЗначение(_ИмяИсточника) = 0 Тогда
		Источник = СоздатьОбъект("АтрибутФормы");
		Источник.УстановитьАтрибут(Конт1.Форма, _ИмяИсточника);
	КонецЕсли;

	browser = ЭУ.Объект;
	browser.Navigate("about:blank");
КонецПроцедуры

//****************************************************************************
Процедура Конструктор()
	Конт = глВзятьКонтекст(Контекст);
КонецПроцедуры //Конструктор

******************
// перехватываемые события
******************
Процедура DocumentComplete() Экспорт
	Если DocumentComplete <> 1 Тогда
		Source(Источник.Значение);
		Editable(1);
		browser.Document.body.style.margin = "3px";
		DocumentComplete = 1;
	КонецЕсли;
КонецПроцедуры

//****************************************************************************
Процедура Событие_ПриНажатииКнопкиКлавиатуры(код, _а, _ш, _к, Символ, ФСО) Экспорт // предопределенная процедура компоненты FormEx
	Если Конт1.Форма.АктивныйЭлемент() = ИмяАтрибута Тогда
		//Сообщить("На активикс нажата клавиша " + код);
		Если код = 13 Тогда // ввод
			Попытка
				 null, '<br/>');"); // inserthtml doesn't work in IE
				HTML('<br/>')");
				ФСО = 0;
			Исключение;
			КонецПопытки;
		КонецЕсли;
	КонецЕсли;
	__Перехватчик.ВыполнитьОригинальноеСобытиеГК(Конт1, "ПриНажатииКнопкиКлавиатуры", код, _а, _ш, _к, Символ, ФСО);
	//Если Источник.Значение <> Source() Тогда
		Источник.Значение = Source();
		Конт1.Форма.Обновить(1);
	//КонецЕсли;
КонецПроцедуры
 

  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Rich Editor для 1С
Ответ #11 - 20. Октября 2008 :: 10:09
Печать  
Остался второй вопрос:
Код
Выбрать все
Источник.Значение = Source(); 


не вызывает модифицированность формы
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Rich Editor для 1С
Ответ #12 - 20. Октября 2008 :: 10:20
Печать  
Непонятно, что за Источник, Значение, Source() Улыбка
Наверное, без тестового примера не помогу.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Rich Editor для 1С
Ответ #13 - 20. Октября 2008 :: 11:27
Печать  
Source() - получить исходный текст страницы
Источник - АтрибутФормы в с-км связан (в к-м хранится) этот текст.
Т.е. при изменении в РичЕдиторе, хочу изменить и значение реквизита справочника/документа в к-м текст страинцы должен храниться.

ЗЫ долго текстовый пример делать... Попозже сделаю, если понадобится
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Rich Editor для 1С
Ответ #14 - 20. Октября 2008 :: 11:51
Печать  
EugenVitla писал(а) 18. Октября 2008 :: 13:04:
добрый способ Улыбка но 10 метров оперативы... ради одного экземпляра... жаба душит  Ужас

Я открыл одновременно 3 формы с этим самым РичЕдитором - прирост памяти для 2 и 3-го - около 300 кб.
Может я неправильно смотрю...
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать