Форум программистов, компьютерный форум, киберфорум
Офисные программы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
6 / 6 / 0
Регистрация: 18.01.2012
Сообщений: 14

Создание глобальной функции в code.js для plugin - "Офис Р7"

15.01.2025, 23:13. Показов 902. Ответов 4

Студворк — интернет-сервис помощи студентам
В работе использую "Офис Р7" на Alt Linux. Написал плагин для создания письма в соответствии с корпоративными стандартами (требованиями). Листинг получился длинный - письма бывают разные. Из-за множества однотипных (повторяющихся) цепочек операций есть возможность сократить файл code.js создав отдельную функцию ГЛОБАЛЬУЮ для создания параграфа с текстом и параметрами. Но есть проблема: Она работает только если написана внутри обработчика нажатия кнопки this.callComand function() { ... }; . А таких кнопок у моего плвгина множество, вот и приходится в каждый обработчик вносить функцию создания параграфа.
ВОПРОС: Как правильно описать функцию так, чтобы она была доступна из каждого обработчика события?
Если можно, подскажите как должна быть описана такая функция!
В интернете накопал и Попробовал следующие варианты описания функции, которые не дали желаемый результат:
JavaScript
1
2
3
4
5
functiom() { ... };
window.function() { ... };
window.myFunction = function() { ... };
global.function() { ... };
Api.function() { ...};
... а потом за описанием идёт обработчик нажатия кнопки:
JavaScript
1
2
window.Asc.plugin.init = function () { 
      this.callCommand(function() {...
здесь далее вызывается функцмя.

При вызове такой функции выводит ошибку, что она неопределена. Умом понимаю, что проблема с доступом к функции, т.к. если фенкция написана внутри обработчика всё работает "как часы".
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.01.2025, 23:13
Ответы с готовыми решениями:

Создание глобальной базы данных для игры на сокетах. (без доменов и своих сайтов)
Всем привет! Тестировал идею своей игры, примерно понял как надо делать. Но игра с такой тематикой становится неинтересной без онлайна и...

Создание Диалоговых окон в ResEdit для Code::Blocks
Здравствуйте! Скачал данную программку, пытаюсь создать файл, но она выдает вот что: Подскажите как ей пользоваться?

Создание глобальной переменной
Использую code igniter. Как создать переменную? Такую же как например base_url();

4
6 / 6 / 0
Регистрация: 18.01.2012
Сообщений: 14
16.01.2025, 22:18  [ТС]
Хочу привести копию скрипта для пояснения вышеописанной проблемы.
Здесь в примере я удалил бОльшую часть параметров для уменьшения длины кода.

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
window.myGlobalFunction = function() {
    console.log('This is a global function');
};
 
window.Asc.plugin.init = function() {
    console.log('Start plugin Ver.2 ______________________');
    
    var button_1_1 = document.getElementById('btn-1.1');
    var button_1_2 = document.getElementById('btn-1.2');
    var button_1_3 = document.getElementById('btn-1.3');
  // и так далее ...
 
    button_1_1.addEventListener("click", function(){    /** МОРДОВИЯ **/
        this.callCommand(function() {
            // Начало исполняемого скрипта № 1.1
            console.log('Run code to make Letter to "RM"');
            
            /** Задаём стили параграфов для ВСЕГО ДОКУМЕНТА **/
            var oDocument = Api.GetDocument();
            var oTextPr = oDocument.GetDefaultTextPr();
            oTextPr.SetFontFamily("Times New Roman");
            oTextPr.SetFontSize(28);
            oTextPr.SetColor( 1,  1,   1, false);   // Цвет шрифта ЧЁРН.
            oTextPr.SetShd("clear", 255, 255, 255); // Цвет фона БЕЛЫЙ
            oTextPr.SetSpacing(0);                  // МежБуквенное рас.
            
            /** ФУНКЦИЯ СОЗДАНИЯ ТЕКСТОВОГО БЛОКА **/
            function addTextBox(tab,content,inLeft,inRight,js) {
                content.forEach(function(textLine) {
                    var oParagraph = Api.CreateParagraph();
                    if (tab == true) oParagraph.AddTabStop();       // Табуляция
                    oParagraph.AddText(textLine);
                    oParagraph.SetIndLeft(inLeft);                  //  Левый отступ абз.
                    oParagraph.SetIndRight(inRight);                // Правый отступ абз.
                    oParagraph.SetJc(js);                           // Выравнивание текста
                                        // "center", "lift", "right", "both" - по ширине
                    oDocument.InsertContent([oParagraph])
                });
            };
            //
            /** АДРЕСНЫЙ БЛОК **/
            var content_address = ['', '', '', '', '',
                'Заместителю Министра энергетики ...',
                '',
                'Н. Н. Николаеву', ''
            ];
            addTextBox(false,content_address, 6000,0, 1,"left");
            //
            /** ТЕМА ПИСЬМА **/
            var content_title = ['', 'О направлении информации'];
            addTextBox(false,content_title, 0,6000, 1,"left");
            //
            /** ОБРАЩЕНИЕ К АДРЕСАТУ **/
            var content_name_ = ['','','Уважаемый Николай Николаевич!', '',];
            addTextBox(false,content_name_, 0,0, 1,"center");
            //
            /** ОСНОВНОЙ ТЕКСТ ПИСЬМА **/
            var content_letter = [
                'На Ваш запрос от 10.11.2024 № 12.10/123-56765 "О проведении заседания ... направляю информацию ... .',
                'В совещании будет участвовать заместитель директора ... .',
                'Замечаний и предложений в протокол не имею.'];
            addTextBox(true,content_letter, 0,0, 1,"both");
            //
            /** ПРИЛОЖЕНИЕ К ПИСЬМУ **/
            var content_addlist = ['', '', 'Приложение:   Информация к докладу на 2-х листах, в 1 экз.', '', '', ''];
            addTextBox(false,content_addlist, 0,0, 1,"left");
            //
            /** ПОДПИСЬ **/
            var content_selfsign = ['Директор                               И. О. Фамилия'];
            addTextBox(false,content_selfsign, 0,0, 1,"left");
            //
            /** ПОДВАЛ **/
            var content_selfsign = ['', '', '', '', 'Исп. Фамилия И.О.','(8422) 12-34-56'];
            addTextBox(false,content_selfsign, 0,0, 1,"left");
            //
            /** УСТАНОВКА ПОЛЕЙ ДЛЯ ВСЕГО ДОКУМЕНТА **/
            var oSection = oDocument.GetFinalSection();
            oSection.SetPageMargins(1700, 1420, 710, 1136); /** 3,0 2,5 1,25 2,0 **/
            // Конец исполяемого скрипта № 1.1
        }, true);
    }.bind(this));
 
 
    button_1_2.addEventListener("click", function(){    /** МАРИЙ ЭЛ **/
        this.callCommand(function() {
            // Начало исполняемого скрипта № 1.2
            // ...
            console.log('Run code to make Letter to "RME"');
 
                        /** ФУНКЦИЯ СОЗДАНИЯ ТЕКСТОВОГО БЛОКА **/
                        // ... Для второй кнопи приходится повторить эту функцию здесь ...
 
            /** УСТАНОВКА ПОЛЕЙ ДЛЯ ВСЕГО ДОКУМЕНТА **/
            var oSection = oDocument.GetFinalSection();
            oSection.SetPageMargins(1420, 1420, 710, 1136);
            // ...
            // Конец исполяемого скрипта № 1.2
        }, true);
    }.bind(this));
 
 
    button_1_3.addEventListener("click", function(){     /** ЧУВАШИЯ **/
        this.callCommand(function() {
            // Начало исполняемого скрипта № 1.3
 
            // .. И опять вынужден повторять эту функцию ...
                        /** ФУНКЦИЯ СОЗДАНИЯ ТЕКСТОВОГО БЛОКА **/
      
            // Конец исполяемого скрипта № 1.3
        }, true);
    }.bind(this));
 
  // И далее, ещё некоторое количество Обработчиков нажатия ДРУГИХ кнопок для писем.
 
/**    КАК СДЕЛАТЬ ФУНКЦИЮ СОЗДАНИЯ ТЕКСТОВОГО БЛОКА ГЛОБАЛЬНОЙ ????       *//
};
ГЛАВНОЕ! Мой скрипт работает, но он слишком длинный и есть мысли сократить его применяя глобальные функции к однотипным блокам, т.к. многие текстовые блоки в письмах одинаковые.

p.s. Там сверху описана "Глобальная функция".
При выполнении скрипта на неё никто не ругается, но я не могу к ней обратиться из обработчика события нажатия кнопки, т.к. в консоле появляется сообщение, что: undefined myGlobalFunction - неопределена. И выполнение останавливается .


HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>Word PLUGIN Window</title>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    
    <style type="text/css">
        html, body {
            margin: 0px;
            padding: 0px;
            /* overflow: hidden; */
            width:100%;
            height:100%;
        }
    </style>                                          
    <script type="text/javascript" src="../v1/plugins.js"></script>
    <script type="text/javascript" src="../v1/plugins-ui.js"></script>
    <link rel="stylesheet"  href="../v1/plugins.css">
    <script type="text/javascript" src="./Word_code.js"></script>
</head>
 
<body>
    <table style="width: 100%;">
        <tr><td>
            <button id="btn-1.1" style="width:99%;"> Министру .... Н.Н.</button>
            <button id="btn-1.2" style="width:99%;"> Пред.Комитета .... В.Н.</button>
            <button id="btn-1.3" style="width:99%;"> Республика Чувашия</button>
        </td></tr>
    </table>
</body>
</html>
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
    "name" : "Word_PLUGIN",
    "guid" : "asc.{19720326-AA95-8842-8542-F00000000111}",
 
    "variations" : [
        {
            "url"       : "Word_index.html",
            "icons"     : ["icon/Word_V-2.0_.png"],
 
            "isViewer"          : true,
            "EditorsSupport"    : [ "word" ],
 
            "isVisual"      : true,
            "isModal"       : false,
            "isInsideMode"  : true,
 
            "initDataType"  : "html",
            "initData"      : "",
            "isUpdateOleOnResize"   : false,
            "buttons"       : []
        }
    ]
}
0
 Аватар для MallSerg
120 / 50 / 12
Регистрация: 16.11.2018
Сообщений: 217
16.01.2025, 23:27
Возможно отладчик те поможет
https://support.r7-office.ru/d... g-windows/
0
6 / 6 / 0
Регистрация: 18.01.2012
Сообщений: 14
18.01.2025, 16:39  [ТС]
Цитата Сообщение от MallSerg Посмотреть сообщение
Возможно отладчик те поможет
https://support.r7-office.ru/d... g-windows/
Да. Этот способ запуска позволяет увидеть всю активность.
Только у мкея LINUX
Bash
1
/opt/r7-office/desktopeditors/DesktopEditors» ––ascdesktop-support-debug-info
Но результат - то же.
Я, как раз, в этой консоле и смог увидеть, что моя Глобальная функция - не определена.

Вопрос в том, что я неправильно сделал при описании Глобальной фукции и как это исправить.
0
6 / 6 / 0
Регистрация: 18.01.2012
Сообщений: 14
06.02.2025, 21:50  [ТС]
Прошло уже много времени и задача остаётся нерешённой.
Всё оказалось намного проще, чем кажется на первый взгяд. В плагине для "Офис-Р7" существует два состояния:
  1. Мы находимся в Приложении (в редакторе).
  2. Мы находимся в Документе (в файле).

Между этими двумя состояниями НЕТ ВОЗМОЖНОСТИ ПЕРЕДАВАТЬ ФУНКЦИИ. Это факт и с эти нужно смириться.

В первом состоянии нам доступно окно плагина, а точнее элементы окна: поля, кнопки, надписи (по id="...") и другие элементы приложения, например LocalStorage.
Во втором состоянии будет доступен сам документ с его элементами (параграфы, надписи, форматы, шрифты и т.п. А доступ к окну плагина и LocalStorage будет отсутствовать.

Важно! Состояние может быть "или 1, или 2". Одновременно оба сразу быть не могут.

Отсюда вывод: Функция, созданная в состоянии "Приложение" не может быть передана ( и использована) в состоянии "Документ".

Стоит упомянуть, что передать из "Приложения" в "Документ" можно только специальный объект Asс.sсоpe

Таким образом двигаясь по скрипту "code_.js" в "Приложении" - формируем данные, затем по кнопке плагина переключаемся в "Документ". Попадаем в обработчик событий, продолжаем двигаться по скрипту - вставляем данные в документ. Выходим из обработчика, т.е. возвращаемся в "Приложение". И так можно повторять многократно.

Этот переход из одного состояния в другое - явно ни где ни кем не описывается, но он есть!

Поняв это, мне удалось решить эту проблему, а точнее, найти обходной путь.

Всем добра.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.02.2025, 21:50
Помогаю со студенческими работами здесь

Создание глобальной переменной
Добрый день, столкнулся с такой проблемой. Создаю чат - бот для вк, чтобы соединить двоих собеседников использую функцию connect, в которой...

Создание глобальной переменной
Доброго времени суток, форумчане! После ввода пароля в поле стартовой формы Аксесс 2003, при ее выгрузке запросом...

Создание глобальной переменной
Добрый день! Помогите, пожалуйста, с такой ситуацией: Есть записанный макрос в определенном файле, который вызывает форму. Название...

Создание глобальной матрицы из локальных
Необходимо создать глобальную матрицу. Нужно осуществить подобную операцию в маткаде.

Объявление и создание глобальной структуры в dll
объявление я сделал в .h файле но так как структуру нужно создать то вопрос в каком файле это делать и где(проект win32, Visual studio...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Создаем RESTful API на Golang с Fiber
golander 04.06.2025
Я перепробовал десятки фреймворков для создания RESTful API за последние годы, и когда впервые столкнулся с Fiber, понял, что это совсем другой уровень. Нет, я не собираюсь рассказывать сказки о. . .
Как работать с куки в ASP.NET Core
UnmanagedCoder 04.06.2025
Когда я впервые начал работать с куки в ASP. NET Core, меня поразило, насколько отличается работа с ними от классического ASP. NET. В Core все стало более декомпозированным - больше нет удобного. . .
Рисование коллайдеров физического движка Box2D-WASM v3 на Three.js
8Observer8 04.06.2025
Erin Catto (автор Box2D) переписал с нуля Box2D v2 с С++ на Си и появилась версия Box2D v3. Birch-san собрал Box2D v3 в WebAssembly (WASM), чтобы можно было использовать Box2D v3 на JavaScript. В. . .
Worker Threads и многопоточность в Node.js
Reangularity 03.06.2025
Если вы когда-нибудь посещали собеседования на позицию Node. js разработчика, почти наверняка слышали заезженную фразу: "Node. js - однопоточная платформа". Звучит как неоспоримый факт, который. . .
Event-Driven CQRS на C# с паттерном Outbox
stackOverflow 03.06.2025
В традиционной модели происходит примерно следующее: вы получаете команду, обрабатываете ее, сохраняете результат в базу данных и затем пытаетесь опубликовать событие в брокер сообщений. Но что если. . .
OwenLogic: перенос сетевых переменных в панель Weintek (EasyBuilder Pro)
ФедосеевПавел 03.06.2025
ВВЕДЕНИЕ ПЕРЕД ЭКСПЕРИМЕНТАМИ - СОЗДАЙТЕ РЕЗЕРВНЫЕ КОПИИ ПРОЕКТОВ На момент написания статьи (02 июня 2025 г. ) самыми актуальными версиями ПО являются: OwenLogic v. 2. 10. 366 EasyBuilder Pro. . .
Dev-c++5.11 Покорение вершины
russiannick 02.06.2025
С утра преследовала одна мысль - вот бы выучить С++. Сказано-сделано. Окончив смену, скачал в интернете бестселлер Дэвиса Dev-C++ для чайников. Книга оказалась интересной и я скачал среду, на примере. . .
Тестирование Pull Request в Kubernetes с GitHub Actions и GKE
Mr. Docker 02.06.2025
Мы все знаем, что тестирование на локальной машине или в изолированном CI-окружении — это не совсем то же самое, что тестирование в реальном кластере Kubernetes. Контекстно-зависимые ошибки, проблемы. . .
Оптимизация CMake для ускорения сборки
bytestream 02.06.2025
Вы когда-нибудь ловили себя на мысле, что пока ваш проект компилируется, можно успеть сварить кофе, прочитать главу книги или даже сбегать в соседний офис? Если да, то добро пожаловать в клуб. . .
JS String.prototype.localeCo­mpare()
mr_dramm 02.06.2025
скопировано из этой темы чтобы не потерялось. localeCompare без указания локали для сравнения строк под капотом использует Intl. Collator , который работает согласно Unicode Collation Algorithm. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »