Последняя версия DataExpress 26.8.17

Изображение Скачать | Изображение Что нового? | Демо

Каталог расширений

# Название Описание Автор
1 "DX Хранилище файлов" - модуль работы с файлами "DX Хранилище файлов" - загрузка/выгрузка, хранение, сканирование и манипуляции с одним или группой файлов.

Документация
jurist23rus
2 AdvancedTables - частичное редактирование таблиц и запросов, и не только Модуль расширений позволяет совместить редактирование записи в окне и в табличной части форм и запросов.

Модуль состоит из следующих действий:
  1. Частичное редактирование табличной части формы.
  2. Частичное редактирование запроса.
  3. Нумерация строк в таблице.
  4. Нумерация строк в запросе.
  5. Отметить записи в таблице для удаления.
admin
3 ALLOW_SYMVOLS. (Проверка текста на допустимые символы) Функция проверяет текст на содержание в нем допустимых символов.
Разрешенные символы.epas.zip

Примечание: после установки расширения функция появится в группе "Текст".
Гocть
4 AutoLabels - расширение для лентяев Добрый день!
Все, кто начинал новую базу с чистого листа, наверняка начинают со структуры базы, раскидывая поля по формам и не заботясь, на начальном этапе, о внешнем виде. Павел позаботился о нас и сделал отображение имен компонентов на самих компонентах.
Designer.png

Но, при тестировании базы, видим такое:
NoLabels.png

Мне пришло в голову написать расширение, которое будет автоматически расставлять метки полей. У меня сложился стиль, что метки я ставлю сразу над полем чуть меньшим шрифтом. Получилось довольно симпатично.
AutoLabels.png

Не думаю, что стоит оставлять это расширение в "боевой" базе, но для отладки и понимания как это может выглядеть -- самое то. Якоря поддерживаются, но надо тестить...

Версия 2.0
1. Теперь расширение для MainForm и работает по всем формам.
2. Не добавляются метки к скрытым полям.
3. Поддержка мониторов Hi-DPI. Теперь метки не сползают.
4. Работает с RecID полями.
5. Если первый или последний символ имени поля - пробел, метка не создается.
6. Добавлена обработка флажков. Если надпись на флажке отсутствует, то вставляется имя флажка. Не нужно == внесите в надпись пробел.

Пример базы:
AUTOLABELS.zip

Расширение:
AutoLabels_2.0.epas
Runenkov
5 AutosizeGrid-авторастягивание столбцов (AutoFillColumns ) Простенькое расширение. Включает свойство grid-а AutoFillColumns. Работает в таблицах и запросах. Выбрать таблицу (для таблицы формы - оставить пустой), и номер столбца для фиксации ширины 1..ХХ. Если столбец не указан, то все столбцы растягиваются одинаково.
P.S. admin как-то обещался добавить в стандартные настройки грида.
drts
6 DX Loger - модуль логирования действий пользователя DX Loger - это комплекс, состоящий из взаимодействующих и программно связанных друг с другом форм и модуля расширений, в совокупности предназначенный для организации системы логирования (журнализирования) определённых действий пользователя и фиксации изменений в журнале событий.

Автор: jurist23rus
Последняя версия: 3.3f от 20.06.2023 (fix admin)

Документация
jurist23rus
7 DX PLUS Множество полезных вещей. Расширение включает в себя следующие действия:
Действия кнопки
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. Кнопка на панели инструментов.
admin
8 DX Хранилище файлов альтернативный вариант FileKeeper
Автор: Pozharskiy1991
Версия: 0.1


Описание
Расширение FileKeeper добавляет на форму кнопки для работы с файловым хранилищем. Позволяет прикреплять файлы к записям, открывать хранилище, вести учёт файлов и управлять ими.

Расширение является развитием идеи, заложенной в действии «DX Хранилище файлов».


Возможности
  • Добавление одного или нескольких файлов к записи
  • Открытие хранилища с просмотром всех файлов записи
  • Счётчик файлов на кнопке (включается/отключается)
  • Диалог переименования файла перед добавлением
  • Проверка дубликатов (по имени и дате изменения)
  • Автоматическое создание уникальных имён при конфликтах
  • Удаление исходных файлов после копирования (опционально)
  • Фильтрация файлов по расширениям
  • Динамический путь: базовая папка + подпапка (выражение)
  • Безопасные имена: недопустимые символы заменяются на "_"
  • Папка по умолчанию: "Хранилище файлов" в рабочей директории
  • Обновление запросов после операций с файлами
  • Сохранение позиции в запросе
  • Поддержка представлений vtGridOnly
  • Автоматическое удаление файлов при отмене редактирования


Как это работает
  1. Добавьте действие «Настройка хранилища файлов» на форму
  2. В таблице «Кнопки хранилища» укажите кнопки и их действия:
    • Добавить файл — кнопка для добавления файлов
    • Открыть хранилище — кнопка для просмотра хранилища
    • Счётчик — показывать ли количество файлов (Да/Нет)
  3. Настройте путь к папке назначения:
    • Базовая папка — основная папка для хранения (если не указана — создаётся «Хранилище файлов» в рабочей директории)
    • Подпапка (выражение) — динамическая часть пути, например: [Год]\[Месяц] или [Контрагент]
  4. При необходимости задайте выражение для имени файла
  5. Настройте дополнительные параметры (удаление исходников, диалог переименования, фильтр расширений и др.)


Настройка

Основные параметры:
  • Кнопки хранилища — таблица с кнопками и их действиями
    • Действие — «Добавить файл» или «Открыть хранилище»
    • Кнопка — компонент TdxButton на форме
    • Счётчик — показывать количество файлов на кнопке (Да/Нет)
  • Описание записи в хранилище — выражение для поля «Описание записи»

Путь к папке назначения:
  • Базовая папка — выбирается вручную через диалог. Если не указана — создаётся папка «Хранилище файлов» в рабочей директории программы.
  • Подпапка (выражение) — динамическая часть пути. Недопустимые символы заменяются на "_".

Имя файла:
  • Имя нового файла (выражение) — можно задать фиксированное имя или выражение (например, [Номер] + "_" + [Дата])
  • Исходное расширение — добавлять расширение исходного файла к новому имени

Дополнительные настройки:
  • Удалять исходные файлы — удалять файлы после копирования
  • Диалог изменения имени файла — показывать диалог для изменения имени файла перед добавлением
  • Список расширений — фильтр файлов, например: *.jpg;*.png;*.pdf
  • Разрешить дубликаты — разрешать добавление файлов с одинаковыми именами
  • Редактировать запись при нажатии — автоматически переводить запись в режим редактирования

Обновление запросов:
  • Запрос для обновления — выбирается запрос для автоматического обновления после операций с файлами
  • Сохранять позицию в запросе — после обновления позиция восстанавливается


Примеры выражений

Для подпапки:
  • [Год] — 2026
  • [Год] + "\" + [Месяц] — 2026\Январь
  • [Контрагент] — ООО_Ромашка (кавычки заменятся на _)
  • [ТипДокумента] + "\" + [Номер] — Договоры\Д-001

Для имени файла:
  • [Номер] + "_" + [Дата] — Д-001_2026-01-15
  • "Договор_" + [Номер] — Договор_001


Особенности
  • Безопасные пути и имена — все пути и имена файлов очищаются от недопустимых символов (\ / : * ? " < > |)
  • Уникальные имена — при конфликте имён автоматически создаётся уникальное имя (файл(1).txt)
  • Проверка дубликатов — сравнение по имени файла и дате изменения
  • Защита от занятости — проверка на занятость файла другим процессом
  • Удаление при отмене — файлы автоматически удаляются при отмене редактирования записи
  • Обновление запросов — выбранный запрос обновляется после добавления файлов или закрытия хранилища
  • vtGridOnly — поддержка представлений формы vtGridOnly


Примечания
  • Каждая кнопка может использоваться только один раз (проверка на дубликаты)
  • Если базовая папка не указана — используется «Хранилище файлов» в рабочей директории
  • Недопустимые символы в путях и именах заменяются на "_"
  • Файлы без расширения сохраняются с исходным именем без расширения
  • При копировании сохраняется дата изменения файла
  • В базе данных должна быть форма FileStore из демо версии или из расширения "DX Хранилище файлов". Можно добавить объединением проекта.
Pozharskiy1991
9 EncodeDecodeURL - кодирование и декодирование символов неразрешенных в веб-адресе в шестнадцатеричный формат В составе две функции и действие для кнопки. Позволяет кодировать в символы для строки браузера любые символы.
Вторая функция позволяет декодировать обратно.
Сначала для кодирования использовал встроенную функцию EncodeURLElements но она преобразует https:// тоже, а это не удобно. Поэтому добавил свою функцию.

EncodeDecodeURL_1.0.zip
cordek
10 EvalExp - Модуль вычисления функций, произвольно внесенных пользователем Иногда бывает нужно провести произвольные вычисления, поэтому вот функция, которая получает на вход в виде текста другие функции и обрабатывает их. Можно и поля формы указывать, поля объектов и т.д. обрабатывается всё в контексте текущей формы.
Позволяет выполнить произвольные функции. Заполнять функции надо также, как в редакторе выражений и в контексте текущей формы. Результатом будет строка, поэтому если необходимо сохранить в поле текст, дата или время, то используйте соответствующие функции для преобразования CNUM, CDATE, CTIME.
Может пригодится для произвольных расчетов, когда вариантов расчета много а плодить поля на форме не хочется. Все функции для расчетов можно просто сохранить в базе, и при необходимости выбирать нужную. Можно даже задействовать DB функции.
В общем большой простор для творчества.
cordek
11 Form template Название: Form template (SaveFieldValues)
Версия: 1.0
Автор: Pozharskiy1991

Описание:
Расширение позволяет сохранять текущие значения полей ввода на форме и быстро их восстанавливать. Управление осуществляется через три кнопки: "Сохранить поля", "Применить поля", "Сбросить поля". Надписи на кнопках настраиваются в UI расширения.

Возможности:
• Сохранение значений всех полей ввода на форме
• Применение сохранённых значений одним нажатием
• Сброс настроек (удаление сохранённых значений)
• Отдельные настройки для каждого пользователя
• Настройки сохраняются в INI файлы в папке FieldSettings

Использование:
1. Добавьте действие "Сохранение значений полей" в настройках базы данных (Target=main)
2. Настройте надписи для кнопок (или оставьте значения по умолчанию)
3. При необходимости укажите путь к папке для сохранения настроек
4. Перезапустите базу данных
5. На любой форме создайте кнопки с указанными надписями

Примечания:
• Поддерживаются компоненты: TdxEdit, TdxCalcEdit, TdxDateEdit, TdxTimeEdit, TdxCounter, TdxMemo, TdxCheckBox, TdxComboBox, TdxLookupComboBox
• Если путь не указан, настройки сохраняются в папку FieldSettings рядом с программой
• Настройки сохраняются отдельно для каждого пользователя базы данных
Pozharskiy1991
12 georgiy-QueryColumns: ширина и видимость столбцов в запросах Расширение для управления шириной и видимостью столбцов в запросах.

В выражениях добавляет раздел "Столбцы запросов" с функциями:

- получить ширину столбца

Code: Выделить всё

COLUMN_GETWIDTH('Название запроса', 'Название столбца')

- задать ширину столбца (отрицательное значение вызовет ошибку)

Code: Выделить всё

COLUMN_SETWIDTH('Название запроса', 'Название столбца', 200)

- прибавить положительное/отрицательное значение к текущей ширине столбца (при попытке ухода ниже нуля значение ширины устанавливается 0)

Code: Выделить всё

COLUMN_ADDWIDTH('Название запроса', 'Название столбца', 20)
COLUMN_ADDWIDTH('Название запроса', 'Название столбца', -10)

- получить видимость столбца (0 - невидим, 1 - видим)

Code: Выделить всё

COLUMN_ISVISIBLE('Название запроса', 'Название столбца')

- задать видимость столбца (у установленных ещё дизайнере скрытых столбцов ширина 0, поэтому при включении видимости их невидно, пока дополнительно не будет задана ширина больше 0)

Code: Выделить всё

COLUMN_SETVISIBLE('Название запроса', 'Название столбца', 0)
COLUMN_SETVISIBLE('Название запроса', 'Название столбца', 1)

- переключить видимость столбца (видимый -> невидимый, и наоборот)

Code: Выделить всё

COLUMN_TOGGLEVISIBLE('Название запроса', 'Название столбца')


georgiy-QueryColumns.epas


Пример:
СТОЛБЦЫ.zip
georgiy_
13 georgiy-Wiz_Debug: помощь в отладке скриптов и действий Модуль, упрощающий отладку.

Способы применения:

1) Включить в свой модуль {$I georgiy-Wiz_Debug}.
После чего можно использовать:
- порог вывода сообщений отладки (константы: _TRACE; _DEBUG; _INFO; _SUCCESS; _FAIL; _WARN; _ERROR;_CRITICAL; _NOTHING)
- функции:
- -Dbg(level, mode, msg): level - порог вывода сообщения, mode - текущий порог, ниже которого сообщения выводиться не будут, msg - текст сообщения
- - DbgT(mode, msg): сообщение уровня _TRACE
- - DbgD(mode, msg): сообщение уровня _DEBUG
- - DbgI(mode, msg): сообщение уровня _INFO
- - DbgS(mode, msg): сообщение уровня _SUCCESS
- - DbgF(mode, msg): сообщение уровня _FAIL
- - DbgW(mode, msg): сообщение уровня _WARN
- - DbgE(mode, msg): сообщение уровня _ERROR
- - DbgC(mode, msg): сообщение уровня _CRITICAL
- - DbgSep(s, n): сепаратор - n раз повторенный символ s
- - GetType(v): название типа переменной
- - GetName(obj): название класса

2) В разделе функций WIZ/Дебаг можно использовать функцию WIZ_DBG('Сообщение')

3) В действиях базы данных, формы и кнопки WIZ/Дебаг -> Вывести отладочное сообщение. В вычисляемом поле указывается сообщение, чекбокс включает и отключает вывод сообщения (чтобы не удалять и не добавлять каждый раз в зависимости от надобности).

Пример в модуле формы:

Code: Выделить всё

{$I georgiy-Wiz_Debug}

procedure Form_Create;
var
  mode: Integer;
  arr: array of integer;
begin

  mode := _ERROR;

  DbgSep('=', 30);

  Dbg(_TRACE, mode, 'Dbg trace');
  Dbg(_DEBUG, mode, 'Dbg debug');
  Dbg(_INFO, mode, 'Dbg info');
  Dbg(_SUCCESS, mode, 'Dbg success');
  Dbg(_FAIL, mode, 'Dbg fail');
  Dbg(_WARN, mode, 'Dbg warn');
  Dbg(_ERROR, mode, 'Dbg error');
  Dbg(_CRITICAL, mode, 'Dbg critical');

  DbgSep('*', 20);

  DbgT(mode, 'Dbg trace');
  DbgD(mode, 'Dbg debug');
  DbgI(mode, 'Dbg info');
  DbgS(mode, 'Dbg success');
  DbgF(mode, 'Dbg fail');
  DbgW(mode, 'Dbg warn');
  DbgE(mode, 'Dbg error');
  DbgC(mode, 'Dbg critical');

  DbgSep('+', 20);
  DbgC(mode, GetType(arr));
  DbgC(mode, GetNAme(Self));

end;


Результат:

Code: Выделить всё

===============================
[11:09:04] ERROR     Dbg error
[11:09:04] CRITICAL  Dbg critical
*********************
[11:09:04] ERROR     Dbg error
[11:09:04] CRITICAL  Dbg critical
+++++++++++++++++++++
[11:09:04] CRITICAL  array
[11:09:04] CRITICAL  TdxForm


Результат функции и действий:

Code: Выделить всё

[11:13:58] USER      Привет
[11:13:58] USER      Текст текст


georgiy-Wiz_Debug.epas
georgiy_
14 georgiy-Wiz_Text: функции для работы с текстом Модуль, содержащий функции для работы с текстом. Для работы требует установки модуля georgiy-Wiz_Debug >= v1.2.0. https://forum.mydataexpress.ru/viewtopic.php?f=16&t=5697

Добавляет в раздел функций WIZ/Текст:
- WIZ_REPEAT('*', n) - возвращает строку, повторенную n раз.
- WIZ_START_WITH('август', 'ав') - проверяет, начинается ли строка с подстроки. Результат 1 - да, 0 - нет.
- WIZ_END_WITH('август', 'ст') - проверяет, заканчивается ли строка подстрокой. Результат 1 - да, 0 - нет.
- WIZ_SLICE('привет', x, y) - возвращает строку-срез с позиции x по y включительно, нумерация с 1.
- WIZ_SLICE_N('привет', x, n) - возвращает строку-срез с позиции x длиной n, нумерация с 1.
- WIZ_CUT('привет', x, y) - возвращает строку, с удаленными из строки символы с позиции x по y включительно, нумерация с 1.
- WIZ_CUT_N('привет', x, n) - возвращает строку, с удаленными из строки символы с позиции x длиной n, нумерация с 1.
- WIZ_COUNT('чайка у причала', 'ча') - возвращает число повторений подстроки в строке.
- WIZ_LTRIM(' чайник ') - возвращает строку, удаляет слева все пробелы и переносы строк.
- WIZ_RTRIM(' чайник ') - возвращает строку, удаляет справа все пробелы и переносы строк.
- WIZ_TRIM(' чайник ') - возвращает строку, удаляет слева и справа все пробелы и переносы строк.
- WIZ_NO_SPACE(' чай ник ') - возвращает строку, удаляет все пробелы из строки.
- WIZ_NO_DBL_SPACE(' чай ник ') - возвращает строку, удаляет все более чем 1 подряд идущие пробелы (т.е. в результате не будет более чем одного пробела подряд).
- WIZ_NO_NEWLINE('чайник') - возвращает строку, заменяет все переносы строк на пробелы.

Пустые поля/Null - будут считаться пустой строкой или 0 в соответствующих аргументах функций.

georgiy-Wiz_Text.epas
georgiy_
15 georgiy-Wiz: управление компонентами georgiy-Wiz v1.0.0 – Управление компонентами формы

Раздел «Компоненты»

1. В редакторе выражений в функции добавляет раздел WIZ
• Получить координату X компонента (относительно родительского).
WIZ_GET_X('Компонент')
• Получить координату Y компонента (относительно родительского).
WIZ_GET_Y('Компонент')
• Получить ширину компонента.
WIZ_GET_WIDTH('Компонент')
• Получить высоту компонента.
WIZ_GET_HEIGHT('Компонент')
• Переместить компонент формы в указанные координаты (внутрь родительского компонента, опционально). Указать пустую строку '', для смены родителя на Форму.
WIZ_MOVE_TO_XY('Компонент', 'Родитель', 10, 50)
WIZ_MOVE_TO_XY('Компонент', '', -10, -20)
• Изменить ширину и высоту компонента. Отрицательные значения заменятся на 0.
WIZ_RESIZE('Компонент', 100, 35)
• Получить видимость компонента. 0 - невидим, 1 - видим.
WIZ_GET_VISIBLE('Компонент')
• Изменить видимость компонента. 0 - невидим, остальные числа - видим.
WIZ_SET_VISIBLE('Компонент', 1)
• Инвертировать видимость компонента.
WIZ_TOGGLE_VISIBLE('Компонент')
• Получить доступность компонента. 0 - недоступен, 1 - доступен.
WIZ_GET_ENABLED('Компонент')
• Изменить доступность компонента. 0 - недоступен, остальные числа - доступен.
WIZ_SET_ENABLED ('Компонент', 1)
• Инвертировать доступность компонента.
WIZ_TOGGLE_ENABLED('Компонент')

2. В редакторе действий формы добавляет раздел WIZ/Компоненты
• Переместить компонент в XY (действие формы)
Переместить компонент формы в указанные координаты (внутрь родительского компонента, опционально)
• Изменить размер компонента (действие формы)
Изменить размер компонента. Отрицательные значения заменятся на 0.
• Показать/скрыть компоненты (действие формы)
Изменить видимость компонентов. Вначале выполняется скрытие, потом показ, потом инверсия видимости. (На основе трех соответствующих таблиц).
• Активировать/деактивировать компоненты (действие формы)
Изменить доступность компонентов. Вначале выполняется деактивация, потом активация, потом инверсия доступности. (На основе трех соответствующих таблиц).
• Добавить подсказки для компонентов (действие формы)

3. В редакторе действий кнопки добавляет раздел WIZ/Компоненты
• Переместить компонент в XY
Переместить компонент формы в указанные координаты (внутрь родительского компонента, опционально)
• Изменить размер компонента
Изменить размер компонента. Отрицательные значения заменятся на 0.
• Показать/скрыть компоненты
Изменить видимость компонентов. Вначале выполняется скрытие, потом показ, потом инверсия видимости. (На основе трех соответствующих таблиц).
• Активировать/деактивировать компоненты
Изменить доступность компонентов. Вначале выполняется деактивация, потом активация, потом инверсия доступности. (На основе трех соответствующих таблиц).
• Добавить подсказки для компонентов

Раздел «События»

1. В редакторе выражений в функции добавляет раздел WIZ
• Кликнуть по кнопке указанной формы.
WIZ_CLICK('Загловок формы', 'Кнопка')

2. В редакторе действий формы добавляет раздел WIZ/События
• Кликнуть кнопку при смене закладки (действие формы)
(При создании Формы создает TdxLabel с именем dxLabel_OnTabChanged_ + название панели закладок TdxPageControl, в текст TdxLabel вписывает название кнопки. При смене вкладки считывает название кнопки и кликает ее.)
• Кликнуть кнопку при наведении мыши (действие формы) (на компонент формы)
(Аналогичный механизм, TdxLabel с dxLabel_OnMouseEnter_+ название компонента)
• Кликнуть кнопку при покидании мыши (действие формы) (компонента формы)
(Аналогичный механизм, TdxLabel с dxLabel_OnMouseLeave_+ название компонента)
• Кликнуть кнопку при клике на компонент (действие формы)
(Аналогичный механизм, TdxLabel с dxLabel_OnClick_+ название компонента)
• Кликнуть кнопку при двойном клике на компонент (действие формы)
(Аналогичный механизм, TdxLabel с dxLabel_OnDblClick_+ название компонента)

3. В редакторе действий кнопки добавляет раздел WIZ/ События
• Кликнуть кнопку на любой форме

Раздел «Поля»

1. В редакторе действий формы добавляет раздел WIZ/Поля
• Обновлять Заметки (действие формы)
Обновлять Заметки при изменении. Например, поле используется как фильтр запроса. По умолчанию фильтр не будет срабатывать, пока не будет изменен фокус на другой компонент. При использовании же этого действия запрос будет обновляться при любом изменении в поле.
• Пересчитать Заметки после изменения записи запроса (действие формы)
Пересчитывает выражения Заметок при изменении выделенной записи в запросе. Нужно, когда выражение ссылается на данные из столбца выделенной записи. (При создании Формы создает TdxLabel с именем dxLabel_OnQueryAfterScrol_ + название запроса TdxQueryGrid, в текст TdxLabel вписывает список названий TdxMemo. При смене выделения считывает названия TdxMemo и пересчитывает выражения.)

Раздел «Закладки»

1. В редакторе выражений в функции добавляет раздел WIZ
• Получить название активной закладки на панели закладок любой формы.
WIZ_GET_TAB('Загловок формы', 'Панель закладок')
• Активировать закладку на панели закладок любой формы.
WIZ_SET_TAB('Загловок формы', 'Закладка')

2. В редакторе действий кнопки добавляет раздел WIZ/Панели закладок
• Активировать закладку на любой форме

Раздел «Запросы»

1. В редакторе выражений в функции добавляет раздел WIZ
• Получить ширину столбца в запросе
WIZ_QCOL_GET_WIDTH('Название запроса', 'Название столбца')
• Установить ширину столбца в запросе. Отрицательное значение будет заменено на 0.
WIZ_QCOL_SET_WIDTH('Название запроса', 'Название столбца', 200)
• Прибавить положительное или отрицательное значение к текущей ширине столбца. Если получается отрицательная ширина, то она заменяется на 0.
WIZ_QCOL_ADD_WIDTH('Название запроса', 'Название столбца', -10)
• Видим ли столбец в запросе. 1 - видим, 0 - невидим.
WIZ_QCOL_GET_VISIBLE('Название запроса', 'Название столбца')
• Отобразить/скрыть столбец. 0 - невидим, остальные числа - видим.
WIZ_QCOL_SET_VISIBLE('Название запроса', 'Название столбца', 0)
• Переключить видимость столбца. (У изначально скрытых в дизайнере столбцов при включении видимости ширина равна 0, поэтому их не видно).
WIZ_QCOL_TOGGLE_VISIBLE('Название запроса', 'Название столбца')
• Отобразить указанные столбцы. Указанные столбцы станут видимыми и отобразятся в указанном порядке, остальные станут невидимыми. Изначально скрытые в дизайнере столбцы имеют ширину 0, поэтому дополнительно им нужно задать ширину, чтобы их стало видно. Если передан Null в названия столбцов - нет действий.
WIZ_QCOL_SHOW('Название запроса', 'Название столбца 1;Название столбца 2')
• Получить индекс столбца в запросе. Индексация начинается с 1.
WIZ_QCOL_GET_INDEX('Название запроса', 'Название столбца')
• Переместить столбец и вставить на указанный индекс. Индексация начинается с 1. Если индекс меньше 1, то переместить на первую позицию. Если индекс больше количества столбцов, то переместить на максимальную позицию. (Не забывать, что скрытые столбцы считаются!)
WIZ_QCOL_SET_INDEX('Название запроса', 'Название столбца', 2)
• Получить значения выделенной записи в указанном столбце в виде строки. Если записей или значение Null - вернуть Null.
WIZ_QCOL_GET_STR_VALUE('Название запроса', 'Название столбца')
• Получить значения в указанном столбце в виде строки значений через указанный разделитель. Если записей нет - вернуть Null.
WIZ_QCOL_GET_STR_VALUES('Название запроса', 'Название столбца', ';')

2. В редакторе действий кнопки добавляет раздел WIZ/Запросы
• Показать/скрыть столбцы запроса
Изменить видимость столбцов запроса. Вначале выполняется скрытие, потом показ, потом инверсия видимости. (На основе трех соответствующих таблиц).
• Изменить ширину столбцов в запросе
Изменить ширину столбцов в запросе. Отрицательные значения ширины будут заменены на 0.
• Изменить порядок столбцов в запросе
Изменить порядок столбцов в запросе. Выбранные столбцы будут отображены в указанном порядке. Изначально скрытые в дизайнере столбцы имеют ширину 0, поэтому не будут видны при отображении, пока не будет установлена положительная ширина.

P.S. кроме Заголовка формы, Названия запроса, Названия столбца, все прочие названия - это кодовые названия компонентов (смотреть в дизайнере).

georgiy-Wiz.epas
georgiy_
16 Html-форматирование текста в таблице Форматирование текста в ячейке в соответствии с html-подобной разметкой.

В поле или в выражении должна присутствовать html-разметка, которая определяет цвет, стиль и размер текста.

Исходный шрифт, цвет фона, выравнивание текста определяется по настройкам столбца. Перенос текста зависит от настроек табличной части.

Форматирование текста задается при помощи открывающих и закрывающих тегов. Все теги, кроме BR, имеют закрывающий тег. Примеры:

Code: Выделить всё

Привет, <b>МИР!!!</b>
<fn:Times New Roman><fs:15>Какой-то текст</fs></fn>


Для работы расширения требуется файл htmltextlib.dll (во вложении). Скопируйте его в папку программы.
admin
17 HTTP_GET - Функция для выполнения простого web-запроса Функция: "HTTP_GET". Функция для выполнения HTTP-запроса методом GET (все параметры в URL).
Группа: "Интернет"

Может пригодится во многих случаях, где веб-сервисы отвечают на запрос простым текстом (plain). Коллекция таких сервисов с примерами использования будет пополняться ниже.

Примеры:

Code: Выделить всё

setfield('Результат',
HTTP_GET(
text('https://bitly.su/api/?
api=baa733ebb140b5e38f825e0407e64f4b7572f203
&url=[URL]
&format=text'))
)   

Результат: https://bitly.su/xhzd

Примечание: API ключ регистрируем свой. Это бесплатно.

Code: Выделить всё

setfield('Результат',
   HTTP_GET('https://base.mydataxpress.ru/myip/')
)   

Результат: Ваш внешний IP адрес интернет

Code: Выделить всё

setfield('Результат',
   HTTP_GET('https://mydataexpress.ru/latest_version.php')
)   

Результат: ДД.ММ.ГГГГ

...

Примечание:
Запрос выполняется в синхронном режиме и при задержках в ответах от запрашиваемых сервисов или с медленным интернетом могут происходит подвисания интерфейса программы.



[ Скачать ]


Develop-Soft
18 IDDT Идентификатор по времени и дате. Простенький код для получения уникального ключа из даты и времени.

Code: Выделить всё

{@function
OrigName=IDDT
Name=IDDT
Args=dt
Result=n
Group=Идентификаторы
Description=Функция преобразует дату и время в ключ для сравнения.
<br>
<br>IDDT ([Поле Даты],[Поле Времени]) результат число
<br>Из 09.08.2018 21:28:22 получим 20180809212822
@}

function IDDT (DT,TM:variant):int64;
var
mn,yr,dy,df,tf:string;
begin
if (DT = null) or (TM = null ) then exit;
df:=StringReplace(datetostr(DT),'.','',[rfReplaceAll]);
tf:=StringReplace(timetostr(TM),':','',[rfReplaceAll]);
delete(df,3,6);
dy:=df;
df:=StringReplace(datetostr(DT),'.','',[rfReplaceAll]);
delete(df,1,4);
yr:=df;
df:=StringReplace(datetostr(DT),'.','',[rfReplaceAll]);
delete(df,1,2);
delete(df,3,4);
mn:=df;
result:=strtoint64(yr+mn+dy+tf);
end;


Теперь уже знаю про таймштамп.
SirWolf
19 ImgAsImageName - интерактивная кнопка Первый раз пишу на форуме сделал такое расширение, может кому пригодиться.

Основная функция модуля ImgAsImageName.

Сделать dxImage интерактивной:

При наведении курсора изменяет изображение
При уходе курсора возвращает изображение.
При нажатии выполняет клик по указанной кнопке.
Модуль связывает картинку с визуальной реакцией на курсор и с действием кнопки, упрощая
создание интерактивных элементов на форме.
K_A_SPER
20 j-функции j-функции
Автор: Jurist23rus

DX Loger - служит для организации системы логирования (журнализирования) определённых действий пользователя в журнале событий вашей базы данных.
DX Хранилище файлов - модуль работы с файлами в базе данных.
Форматирование даты и времени - модуль содержит функции для представления даты и времени в нужном формате.

Модуль:j-modul
Версия: 7.1 от 27 октября 2017 г.
Описание: содержит функции.
Объединяет в одну строку значения столбца таблицы. Аналог штатной функции Merge, но в отличие от последней
позволяет фильтровать результат.

Code: Выделить всё

MergeIf ('ИмяДочернейФормы', 'ИмяПоля', ';', '[ИмяПоля]<>null')

Обновляет запрос расположенный на форме.

Code: Выделить всё

QueryUpdate ('ИмяЗапроса')

Возвращает модуль числа. Самостоятельно, без вмешательства пользователя, определяет тип передаваемых функции данных, будь то число, строка или null, производит конвертирование в нужный формат и вычисления.

Code: Выделить всё

ABC ([Любое поле])

Можно забыть об этом:
nz (ABС ([Числовое поле]), 0)
ABC (cnum ([Текстовое поле]))
Функция сама сделает преобразования.

j_module v7.1.zip


Модуль: AutoCloseForm
Версия: 3.1 от 14 июля 2017 г.
Описание: содержит функцию AutoCloseForm.
Автоматически закрывает форму через установленный промежуток времени.

Code: Выделить всё

AutoCloseForm (120, 30, 'OffTimer')

AutoCloseForm v3.1.zip

AutoCloseForm v3.2.zip

Версия 3.2:
- в данной версии функция не сохраняет сделанных на форме изменений данных, а отменяет их, так как сохранение данных, в некоторых случаях приводило к ошибке.
Для тех кому важно сохранение данных, при закрытии функцией формы и на форме нет пустых обязательных полей как в этом примере может продолжать пользоваться версией 3.1

Версия 3.1:
- попытка закрыть предупреждающее окно комбинацией клавиш Alt+F4 не прервёт работу функции и будет равносильно нажатию второй кнопки в окне, то есть произойдёт отключение таймера либо его перезапуск, в зависимости от заданных параметров.
- оптимизирован и модернизирован код (внешне это никак не видно, но в будущем исключит возможные ошибки совместимости с другими функциями или скриптами).

Версия 3:
-полная поддержка запросов, в том числе с таблицей на нем;
- поддерживает работу до 5 запросов на форме (больше делать не стал, не вижу смысла);
-при использовании в дочерней форме выводит сообщение в штатное окно ошибок функции (красный пятачок на форме) не нарушая работу программы (защита от тех кто не читает справку);
- ввёл третий параметр, позволяющий менять назначение кнопки на окне сообщения: кнопка может выключать таймер или откладывать его (на усмотрение разработчика базы).


Модуль: ExportToExcel
Версия: 1.1 от 19 ноября 2017 г.
Описание: содержит функцию ExportToExcel + действие для кнопки.
Экспортирует данные формы в Excel

Code: Выделить всё

ExpotToExcel ('', 'Поле1;Поле2;Поле3', '')

ExportToExcel v1.2.zip


v.1.0 - для DX версий до 12 ноября 2017 г., то есть версий без "активных кнопок"
v.1.1 - содержит графическую оболочку в виде действия в кнопке (см. скриншот), её можно устанавливать только на DX от 12 ноября 2017 г. и более поздние выпуски.

2017-11-19_22-09-09.png
jurist23rus
21 kok80_SummInStatusBar сумма значений поля в строке состояния При выборе нескольких строк формы в режиме таблица выводится количество выбранных строк и сумма значений полей в строке состояния.
Настройка для каждой формы отдельно. Количество знаков после запятой берется из настроек поля.
kok80
22 kok80-ExportToExcel (LibreOffice calc) kok80-ExportToExcel ver 3.2
возможности (выбираются в действиях при запуске):
- экспорт в Excel/LibreOffice calc/автовыбор при запуске базы
- кнопку на панель главной формы(экспорт активной формы)
- кнопку на панель всех запросов
- в контекстное меню всех форм
- в контекстное меню всех форм: выделенные строки
- в контекстное меню всех запросов
- в контекстное меню всех запросов: выделенные строки
- в контекстное меню всех сводных таблиц
- мультивыбор во всех формах
- мультивыбор во всех запросах
- текстовой формат в Excel для текстовых полей (строка 0001 будет экспортироваться 0001, а не 1)

в действиях формы:
- Форма - сделать мультивыбор
- Запросы формы - сделать мультивыбор (выбрать нужные запросы)

Если подключить модуль как внешний {$I kok80-ExportToExcel}, то можно использовать

Code: Выделить всё

procedure GridToExcel(sender:TObject)

в качестве sender понимает TdxForm, TdxQueryGrid, TdxSQLQuery, TdxPivotGrid.

Экспорт осуществляется через буфер обмена, если в буфере был текст-он восстанавливается после экспорта.


Демо


kok80-ExportToExcel 3.1 Изображение Скачать
kok80
23 kok80-LOG kok80-log

выводит в LOG-форму действия пользователей (создание, удаление, изменение записей, вход, выход из базы, время начала и конца работы).

Для работы необходимо выбрать форму для LOG (добавить в вашу базу новую форму).
На нее поместить поля (можно не помещать ненужные, не будут заполняться):
UserID - ID юзера, тип компонента ЧИСЛО
FormID - ID формы, тип компонента ЧИСЛО
ComponentID - ID компонента, тип компонента ЧИСЛО
FormRecID - RecID формы события, тип компонента ЧИСЛО
Action - код действия, тип компонента ЧИСЛО
ValueInt - поле для хранения всех нетекстовых данных, тип компонента ЧИСЛО.
ValueStr - поле для хранения текстовых данных (необходимую длину определяете сами, если значение длиннее - будет обрезаться), тип компонента ТЕКСТ
Дата - дата события, тип компонента ДАТА
Время - время события, тип компонента ВРЕМЯ

В действиях при запуске существующие поля формы привязываем к полям в настройках.
Другие настройки:
- ограничить вывод лога, количество строк.
- интервал в мин бездействия юзера для log [не работал]: интервал в минутах, создается таймер, который проверяет работал ли юзер (вызывались ли события OnAfterScroll, EditWindow.OnShow). Если указать 0 или пусто - активность юзера не будет отслеживаться и выводиться в LOG.
- cкрыть из popup меню формы LOG юзеров с кодами: сюда указываем коды юзеров, которые не будут добавлены в контекстное меню на форме LOG (например, давно уволенные). Посмотреть номера через контекстное меню на форме LOG.
- в контекстное меню Grid формы: в контестное меню форм добавляет пункт LOG.

На нужных формах выбираем нужные поля в "Действия формы"

Особенности:
Добаляется действие KOK80_log, можно повесить на любую кнопку.
Все данные кроме текстовых значений при изменении полей хранятся в виде чисел. На выбранной форме LOG в контекстное меню добавляются расшифровки и пункты для слежения за активностью юзера.
На самой форме LOG: Порядок и состав форм, выводящихся в расшифрованный LOG, соответствуют сортировке и фильтру формы (если хотите LOG по порядку изменений - делайте сортировку по полю RecID или дата/время).
В создаваемой таблице LOG в контектное меню добавлен пункт "экспорт в EXCEL" - работает только при установленном расширении kok80-ExportToExcel версии 4.0 и выше.

В планах сделать расшифровку LOG кликабельной, при измении размера окна изменять ширину текстового LOG поля.

В DEMO базе пароль 1.
kok80
24 kok80-ObjectAndQueryOnDBLClick Устанавливает OnDBLClick на все объекты, поля объектов, запросы на всех формах: при двойном клике открывается исходная форма в режиме редактирования, если позволяют права доступа, вне зависимости от состояния (чтение/редактирование) исходной формы. В DataExpress, если исходная форма в режиме только для чтения, все формы из нее тоже открываются в режиме только для чтения (для объекта нет в контекстном меню "изменить").
Для запросов предыдущий обработчик OnDBLClick вызывается только в случае ошибки или нескольких источников-форм в запросе (иначе бы 2 раза подряд открывалась исходная форма).

Как всегда, писал для себя, но пожелания и баг репорты приветствуются.
kok80
25 kok80-QueryDublicate Кнопка дублировать на панели и в контекстном меню всех запросов базы. kok80
26 kok80-поиск ссылок Поиск ссылок на форму по всем объектам базы из контекстного меню grid формы и запроса.
Поддерживает рекурсию (поиск ссылок в найденных формах).
возможность выбора нескольких значений для поиска ссылок
замена во всех найденных ссылках значений на другое
добавлена поддержка расширений kok80-ExportToExcel (выгрузка найденных ссылок в xls) и kok80-poisk (при выборе значения для замены)

Пароль в примере - 1
kok80
27 Kroks-функции KROKS-функции
Автор: Kroks
Описание: добавляет новую функцию.
K_ZAGOLOVOK_OKNA - выводит в заголовок окна редактирования записи заданный текст.
K_KIR_LAT - транслитерация кириллицы в латиницу.
jurist23rus
28 Metadata - Метаданные и структура таблиц Выводит метаданные форм в Debug. Может вывести просто в текст или HTML, также поддерживает несколько текстовых форматов описаний баз данных: PlantUML, DBML, DOT, Mermaid.js - которые можно использовать для визуализации связей в соответствующих сервисах.
https://www.plantuml.com/plantuml для PlantUML
https://dbdiagram.io/d для DBML>
https://www.devtoolsdaily.com/graphviz для Graphviz / Dot
https://www.mermaidchart.com для Mermaid.js

Визуализация может работать плохо при большом количестве таблиц, но в принципе можно попробовать в текстовом режиме убрать лишние связи и оставить нужные. Полезно будет для составления документации, а также если вы накидали много таблиц и объекты, а теперь с трудом ориентируетесь.

metadata5.zip


Делать веб-версию не вижу смысла
cordek
29 NSORT. Функция "естественной" (как в Windows) сортировки значений списка. Может использоваться для сортировки списка файлов и каталогов, IP-адресов, результатов, полученных из встроенных и других функций, прочих произвольных списков.

Изображение Изображение
Параметры:

1. [текст] Текст с разделитем CR+LF (#13#10, newline - комбинация возврата каретки и символа новой строки.).

Результат:

Отсортированный текст с исходным разделителем.

Пример:

Code: Выделить всё

NSORT(
'Текст 1
Текст 10
Текст 2
Текст 20
Текст 3
...')

Результат:

Code: Выделить всё

Текст 1
Текст 2
Текст 3
Текст 10
Текст 20
...


Примечание:

Использует медленный алгоритм и НЕ рекомендуется для сортировки больших (>1000 строк) текстов.

[ Скачать ]
Develop-Soft
30 RecordEditor - функции работы с данными RecordEditor
Автор: jurist23rus
Версия: 2.4
Последнее обновление: 14 июня 2021 г.
В этом модуле содержится действие для кнопки «Закрыть текущую форму» и функции:

OpenRec - открывает для редактирования (в отдельном окне) указанную запись указанной родительской формы.

AddRec - добавляет новую запись в указанной родительской форме.

TAddRec - добавляет новую запись в таблицу.

TDeleteRec - удаляет записи в таблице согласно заданному фильтру.

DeleteRec - удаляет записи родительской формы согласно заданному фильтру.

DbMergeA - соединяет значения нескольких полей в одну строку.

CreateRec - создаёт запись в родительской форме и заполняет поля формы заданными значениями.

EditingRec - вносит изменения, согласно заданным параметрам, в указанное поле, указанной записи, указанной родительской формы

Скачать | Веб-версия
jurist23rus
31 RegExp_kok80 Немного извращений.

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

function RegExp_Execute(pattern, aIncomming: string):integer;
Поиск соответствующих шаблону вхождений в строке-оригинале. Возвращает количество найденных подстрок. Коллекцию найденных подстрок сохраняет во внутреннюю переменную. Требуеся последующий вызов RegExp_free.

function RegExp_MatchesCount:integer;
возвращает число совпадений после вызова RegExp_Execute

function RegExp_get(MatchNum: integer):string;
Из коллекции найденных строк возвращает строку с номером MatchNum

function RegExp_getSubstr(MatchNum,SubMatchNum: integer):string;
Из коллекции найденных строк возвращает подстроку SubMatchNum строки MatchNum

function RegExp_loop(x1,x2:integer; expression:string):variant;
Выполняет выражение expression в цикле от x1 до x2. В expression можно указывать %x - заменяется на номер цикла.

procedure RegExp_free
Очищает внутренние переменные после вызова RegExp_Execute

function Preg_match(pattern, aIncomming: string):string;
Поиск соответствующих шаблону вхождений в строке-оригинале. Возвращает первую найденную строку. Не требуется вызов RegExp_free.

function ButtonControl_click(Name: string):string;
Нажимает кнопку (может такое уже есть, но я не нашел)



В примере: при изменении красных полей, зависимые с формулами пересчитываются.
При нажатии кнопки происходит заполнение таблицы из Memo.

ps писал для личных целей, может у кого будут какие мысли, как это можно использовать во вблаго человечества.
Как вариант - загружать в диалоге текстовой файл, и инфо из него по регулярным выражениям заносить в таблицу, импорт CSV и т.д.
kok80
32 Smart-сканер Назначение: Иструмент для многостраничного сканирования документов,
сборки их в PDF-файлы и автоматической регистрации в системном хранилище FileStore.<br>

1. Архитектура и движок
1. WIA (Windows Image Acquisition): Используется для прямого захвата изображений с локальных (USB) сканеров.
2. NAPS2 Console Engine: Используется для работы с сетевыми МФУ через заранее настроенные TWAIN-профили. Это гарантирует стабильную связь в локальных сетях и Wi-Fi.
3. PowerShell PDF Engine: Модуль не требует установки сторонних PDF-библиотек. Сборка осуществляется встроенным в Windows движком печати через виртуальный принтер "Microsoft Print to PDF".

2. Режимы работы
1. Локальное сканирование (WIA)
Когда использовать: Для простых USB-сканеров.
Плюс: Не требует сторонних утилит, работает мгновенно через стандартный диалог Windows.

2. Сетевое сканирование (NAPS2 Profiles)<br>
Когда использовать: Для сетевых МФУ, Wi-Fi сканеров и работы через RDP.

2. Интеграция с FileStore

Требования для внедрения
ОС: Windows 10 или 11 (наличие компонента "Microsoft Print to PDF").
Софт: Установленный NAPS2 (в папку по умолчанию) для сетевого режима.
Права: Наличие прав на запись в папку C:\Temp\Scan\ (создается автоматически) и целевую папку архива.
xxDeMoXxx
33 SpinEdit из компонента ЧИСЛО Так как меня тут не заметили, пришлось ваять расширение.
Добавляет к компоненту ЧИСЛО кнопки UP/DOWN, нажатие на которые в режиме редактирования формы увеличивает/уменьшает значение выбранного числового поля. Работает только если отключена стандартная кнопка компонента ЧИСЛО в контекстном меню компонента.

08.05.20 v 1.1 Добавил управление колёсиком мыши.

Демо


drts
34 SQL отрисовка произвольного запроса Действие кнопки. Отрисовка произвольной строки SQL, позволяет использовать скорость и функционал чистого SQL. Таблицу выводит на TdxPivotGrid.

Для замены название столбиков используем формат Name@@Название (Name - название что будет запрошено в SQL, Название - будет назван столбик при отрисовке). Строку запроса (выражение) можно фирмировать функцией concat. Пример строки прикрепил.

Code: Выделить всё

concat(
                    "select
                    Name@@Название,
                    Nalich@@Наличие,
                    Ozh@@Ожидание,
                    Neobh@@Необходимость,
                    Docup@@Докупаем,
                    RealDocup@@ДокупMin,
                    CEILING(iif(mod(RealDocup,Miin)=0,RealDocup,round(RealDocup/Miin,0)*Miin + Miin)) as RnDocup@@ДокупСреднее,
                    price@@Цена,
                    CEILING(iif(mod(RealDocup,Miin)=0,RealDocup,round(RealDocup/Miin,0)*Miin + Miin))*price as sm@@Сумма,
                    Miin@@Min
                    from

                   (
                    select
                    Name,
                    nl as Nalich,
                    nd as Neobh,
                    iif(nd-nl-Ozh>0, nd-nl-Ozh, 0) as Docup,
                    price,
                    Miin,
                    iif(iif(nd-nl-Ozh>0, nd-nl, 0)>0 and iif(nd-nl-Ozh>0, nd-nl, 0)<Miin, Miin, iif(nd-nl-Ozh>0, nd-nl-Ozh, 0)) as RealDocup,
                    Ozh
                    from

                    (
                    select
                    tov.id as idd,
                    tov.[Название] as name,
                    k.[Компонент] as nm,

                    (select coalesce(s.[Мин. заказ],1)
                     from [Свойства по складам] s
                     left join [Группа товара] g ON (g.id=s.[Группа])
                     where s.pid=tov.id and g.[Склад]=1
                     ) as Miin,

                    (select first 1
                    coalesce(s.[Цена поставка],1)
                    from [Свойства по складам] s left join [Группа товара] g ON (g.id=s.[Группа])
                    where s.pid=tov.id and g.[Склад]=1
                    ) as price,

                    (select coalesce(sum(t.[Количество]),0)
                    from
                    [Наличие] t
                    left join [Склад] sk ON (t.[Склад]=sk.id)
                    where
                    t.[Количество]>0 and t.[id_товара]=k.[Компонент] "
                    ,iif([Фирма]<>null, concat(' and t.[Фирма]=',[Фирма]),'')
                    ,iif([Склад]<>null, concat(' and t.[Склад]=',[Склад]),' and sk.[Мой склад]=1 '), ") as nl,

                    sum(k.[К-во на уп. в ед. по ум.]*d.[Количество]) as nd,

                    (select coalesce(sum(pg.[Количество ожидаем]),0)
                    from
                    [Заказ поставка] p
                    left join [Товар в заказе поставка] pg ON (p.id=pg.pid)
                    where p.[проводить]=0 and pg.[id_товара]=k.[Компонент] and p.[удален]<>1 "
                    ,iif([Фирма]<>null, concat(' and p.[Фирма]=',[Фирма]) ,'') ,"
                    ) as Ozh  ","" //ожидаем товар на складе
                    ,"
                    from
                    [Рецепт] r
                    left join [Компонент рецепта] k ON (r.id=k.pid)
                    left join [Товар] tov ON (tov.id=k.[Компонент])
                    left join [Дата и кол производства] d ON (r.id=d.[Рецепт])
                    where
                    d.[активно]=1
                    and
                    d.[Дата]<'",[:Дата],"'
                    group by
                    nm,name,idd,Miin
                    ) dum
                    where 1=1 ",
                    iif([только необходимость]=1,' and nd-nl>0',''),
                    ") dum "
        )
Иван
35 Альтернативная (настраиваемая) печать Действие позволяет выбрать другую форму для печати или задать её имя в выражении, необходимо задать также id записи.
Если форма и id не заняты, то печать будет из текущей формы.
Шаблон также ставится в виде выражения, как и путь для сохранения готового документа. В результате выполнения действие возвращает путь к сформированному (напечатанному) файлу. Можно потом использовать имя файла, например сохранить куда-нибудь.
Возможны ошибки, если запись форму будет не в состоянии редактирования.
Вообще можно печатать и не открывая на редактирование, но мне нужно именно открывать.
Предлагайте еще функции, про которые забыл.
cordek
36 Аналог расширения Управление видимостью/доступностью компонентов Здравствуйте!
Написал свой аналог расширения «Управление видимостью/доступностью компонентов», который делает почти то же самое, но с другой логикой. Выбранные компоненты становятся недоступными (невидимыми/нередактирумыми), если условие истинно. В расширении, также можно одновременно задать несколько условий. Например, в форме «Клиенты», в зависимости от статуса клиента (ЮЛ – юридическое лицо, ФЛ - физическое лицо, ИП – индивидуальный предприниматель) некоторые поля должны быть недоступными для заполнения. В частности, при статусе ЮЛ – поле «День рождения», при статусе ФЛ - поля «КПП» и «ОГРН», при статусе ИП – поле «КПП». Сделать это при помощи расширения «Управление видимостью/доступностью компонентов» мне не удалось. Как бы я не старался задать условие и порядок действий в форме, все время какое-нибудь поле становилось то доступным то наоборот недоступным, не так, как это было мне надо.
dm2002_2002
37 Боковая панель навигации Маленький эксперимент с интерфейсом.

1. Модуль Боковая панель навигации v1.0
Автоматически генерирует интерактивную левую панель навигации.
Ключевые возможности:
1. Двухрежимный интерфейс: автоматическое разворачивание оверлея при наведении мыши и сворачивание в компактную миниатюру с иконками-эмодзи
2. Поддержка древовидной структуры: группировка элементов в раскрывающиеся списки-«аккордеоны» с каскадным динамическим пересчетом вертикальных координат Top.
3. Интеграция выражений: возможность привязать к любой кнопке навигации исполняемое выражение (параметр выражения). При клике по кнопке скриптовый движок вычисляет индекс элемента в глобальном реестре PanelData и выполняет выражение.
4. Высокая плотность UI: адаптивное позиционирование элементов, автоматическое резервирование экранного пространства и центрирование миниатюр.

2. Функции боковой панели

Содержит функции для боковой панели</br>
1. фУНКЦИЯ ПЕРЕХОДА НА ВКЛАДКУ</br>
2. ФУНКЦИЯ ОТКРЫТИЯ ФОРМЫ (АДАПТИРОВАННАЯ LabelAsLinkBlue)
https://forum.mydataexpress.ru/viewtopic.php?f=16&t=3198&p=46250&hilit=Label#p27988
3. фУНКЦИЯ КЛИКА КНОПКИ</br>
4. ФУНКЦИЯ ВЫПОЛНЕНИЯ СКРИПТА
5. ФУНКЦИЯ ЗАПОЛНЕНИЯ ПОЛЕЙ ФОРМЫ
6. Функция создания записи, заполнение полей, обновление запроса отрытой формы
7. Функция поиска компонента на активной форме
8. Функция проверки активной форме и активной вкладке на форме
9. Функция всплывающего окна с компонентами (адаптированная "Всплывающее окно настроек 1.5")
https://forum.mydataexpress.ru/viewtopic.php?f=16&t=3728&p=47642&hilit=Всплывающее+окно+настроек+1.5#p32436
xxDeMoXxx
38 Валидация - Проверка обязательных полей
Снимок экрана 2026-08-17 183330.png



Тип: действие формы (настольная версия)
Автор: Qwen3.8 (нейросеть, AI-ассистент)
Версия: 1.4


Расширение разработано нейросетью по моему промпту. Поддержку не планирую. Используем на свой страх и риск. Хотите доработать — берите исходник и ковыряйте сами. Вопросы можно задавать в теме — вдруг сообщество подскажет.


Что делает

Заменяет стандартное поведение свойства «Обязательное» при сохранении записи:

  • незаполненные обязательные поля подсвечиваются розовым;
  • при сохранении с одним пустым полем — стандартная проверка со штатным всплывающим сообщением;
  • при двух и более — в правом нижнем углу главного окна появляется плавающее окно со списком незаполненных полей;
  • клик по строке списка — переход к полю: раскрываются вложенные закладки (PageControl), устанавливается фокус, поле дважды «мигает»;
  • заполнили поле — строка исчезает из списка; заполнили последнее — окно закрывается;
  • окно компактное: белый фон, шрифт формы (размер ограничен 8–12), высота до 600 px, дальше — прокрутка, отступы от краёв окна 20 px;
  • события подключаются цепочкой: старые обработчики (в т. ч. других расширений) сохраняются и вызываются — ничего не ломается;
  • флажок «Безопасный режим» в настройках действия — встроенная проверка «Обязательное» не отключается (для совместимости с расширениями, которые читают это свойство);
  • защита от дублей: при повторном подключении действия к одной форме выводится подсказка.

Установка

  • Файл — Расширения — Импорт модуля.
  • В дизайнере на нужной форме в свойстве «Действия формы» добавьте действие «Проверка обязательных» (группа «Валидация»).
  • При необходимости отметьте флажок «Безопасный режим».
  • Сохраните проект, выйдите из дизайнера и проверьте.

Как работает (вкратце)

При создании формы действие собирает все поля со свойством «Обязательное» и хранит список в Params формы. В обычном режиме встроенная проверка отключается, контроль выполняется в OnValidate: 1 пустое поле — штатный попап, 2 и более — окно со списком. В безопасном режиме встроенная проверка не трогается: расширение лишь добавляет розовую подсветку и окно навигации.


Версия содержит ошибки
Проверка обязательных.epas


>>> Скачать <<<

 
avk
39 Ввести на основании Ввести на основании - действие кнопки.
Создает новый документ на основании текущего, заполняет поля и копирует данные подчиненных форм (таблиц).


Изображение



[ Скачать ]

Похожие расширения: "Заполнить по"


Develop-Soft
40 Веб-печать Действие кнопки: "Веб-печать". Выводит указанный контент в браузере посредством встроенного в программе http-сервера.

Изображение

Опции и параметры:

Контент для вывода - текстовое содержимое для вывода в браузер. По-умолчанию любой тип передаваемого содержимого отправляется браузеру как html (кодировка utf-8). В выражении могут участвовать поля формы, поля и вычисляeмые поля запроса, переменные (getvar), функции, возвращающие текст или преобразованные к типу "текст".

Порт - числовое значение в диапазоне 80-65535 (по-умолчанию 8800). При конфликте выбранного порта с существующим открытым портов в системе - выдается соответствующее сообщение и порт необходимо сменить.

Открыть в программе/браузере - принудительно устанавливает указанное приложение для открытия страницы. По-умолчанию пустое и открывает контент через сопоставленный с интернет-страницами браузер в системе.
Можно указать коротко: chrome, opera, firefox, iexplore

Примечание:

- Способ вывода предпочтителен в случаях, когда нежелательно оставлять следы и мусор в файловой системе (браузеру передается поток напрямую). Позволяет использовать теги и код JavaScript, которые при печати не пропускает стандартный html-шаблон.
- После отдачи контента браузеру сервер останавливается и нажатие кнопки "обновить" в браузере не даст никакого результата. Для повторного открытия необходимо еще раз нажать кнопку с действием.
- Вывод картинок не поддерживается.




Скачать демо
Develop-Soft
41 Видимость или доступность поле + лейба Ранее на форуме выкладывал версию этого модуля, чутка доработал к полноценному формату.

Обновление 1.5
Добавлено совместимость с модулем MultiStretchFields версии >=1.8.
Иван
42 Виртуальный запрос на основе TKGrid (исключает Out of Memory) Создает виртуальный запрос поверх запроса. При использовании расширения можно просто выбрать запросы которые нужно создавать. Позволяет обойти Out of Memory при большом количестве записей в БД.

Поддерживает все функциональные свойства обычного запроса (кроме функций, пока что). Выводит нужное количество записей.
Можно добавить на форме список в котором указывать сколько записей выводить иначе выводит количество что входит в видимый запрос.

Есть возможность выбрать открывать на двойной клик источник каждого поля или основной источник запроса 'Не открывать формы объектов'.
Если при записи выражения для выделения цвета ячейки добавить комментарий //font то будет менять цвет не фон, а текст.
Возможность искать по всем полям нужные данные добавив на форме поле для поиска (игнорирует поля даты и времени).
Можно добавит на форме чекбокс для возможности Искать без учета регистра.
Искать по конкретному столбику, для этого в таблице добавлен пустая строка вводя текст в которую и обновляя запрос будет проведена фильтрация.
Поля даты и времени подстраивают дату если она введена с ошибкой (пример: если ввести 12 то выдает 12.06.2020).
Возможность искать выражениями (Пример: >10 & < 100). Поле поиска на форме и поиск по столбику могут работать вместе выводя результат по всем запросам. Для удобства работы добавлено функции getq (аналог get), и sumq аналог sum с ограничением: по вычисляемым полям выводит сумму всех отрисованных строк).

Ограничения:
1. В выходном фильтре нельзя использовать вычисляемые поля.
2. В выходном фильтре в правой части выражений игнорируются выражения с вычисляемыми полями если нужно получать их данные (пример: если будет выражение [Клиент поле запроса]=iif([:Клиент]<>'', [:Клиент], [Клиент поле запроса]) оно будет включено в фильтр если [:Клиент]<>'' и проигнорировано если [:Клиент]=''.
3. Нет возможности сортировки вычисляемых полей.
4. Нет возможности искать по вычисляемым полям через строку поиска запрашивая данные из БД.

2-е расширение идет комплектом QueryTreeTK. Позволяет создавать дерево групп. Если на форме будет найдено совпадение по форме что добавлена как источник дерева и поля в запросе то будет по нему фильтровать записи. Через установку переменных getvar('Источник дерева название формы'|'Название поля') можно получить доступ к полям формы групп и фильтровать выводимые группы дерева при клике на ноду другого дерева (если на форме объект то в переменную запишет текст объекта). Смотрите описание модуля QueryTreeTK.

Версия 1.4:
- исправлено ошибку разбора сложных выражений фильтров внешних и внутренних.
- добавлены функции (включая баланс).

Демо база в виде ссылки. Добавлено 500 тыс. записей несколько вычисляемых полей, деревьев групп, раскраска ячеек.
Демо

Если у вас какая либо ошибка при использовании пишите в комментарии.
Иван
43 Всплывающие подсказки заголовков запроса Позволяет показывать всплывающие подсказки заголовков запроса.
Может показывать текст заголовка, не уместившийся в ширину, либо предустановленную подсказку.
Стандартного функционала не нашел. Требовалось сделать себе, оформил в расширение.
Megabyte
44 Встроенный браузер Встроенный браузер CEF (Chromium Embedded Framework).
Как пользоваться:
1. Добавить в действия при запуске "Менеджер браузеров".
2. Добавить на форму группу.
3. Добавить действие формы "Встроить браузер" и выбрать группу.

Функционал:
1. Простая панель инструментов с кнопками назад, вперед, стоп, обновить, домой и адресной строкой.
2. Закачка файлов.
3. Включение/отключение панели инструментов, загрузки файлов, перехов по ссылкам.
4. Отображение страницы по URL из текстового поля.
5. Автоматическое скачивание необходимых файлов с mydataexpress.ru. Размер скачиваемых файлов более 140 МБ. Распакованные - более 300 МБ.

Версия CEF 130.1.16.
admin
45 Выбор данных из окна списка Подобно стандартной функции "Шопинг" действие открывает форму в окне списка, из которого можно выбирать данные (товары, услуги и т. п.) и вставлять в таблицу текущей формы. Дважды щелкните по записи или нажмите ENTER, чтобы добавить данные в таблицу. Пример использования есть здесь (база REGISTERDEMO) в кнопках "Выбрать товар". admin
46 Выбор объекта из окна отчета Альтернатива выбору объекта из выпадающего списка или окна списка. Выбор объекта осуществляется из окна отчета. Плюсом является более гибкая настройки отбора. admin
47 Вывод списка форм в ComboBox Привет всем!
Выкладываю расширение, выводящее в компонент списка список всех форм базы. Вдруг кому пригодится...
Runenkov
48 Выравнивание содержимого полей Действие устанавливает положение содержимого колонок таблицы (подчиненной таблицы) и полей формы (подчиненной формы) cправа, слева, по центру.

Примечание: можно устанавливать разные положения одного и того же поля в таблице и форме, если внести его в таблицу параметров двумя отдельными строками и установить соотвествующие флаги.

Например:

Code: Выделить всё

Поле    Выравнивание  В таблице   В форме
----    ------------  ---------   -------
Номер   По центру        ☑          ☐
Номер   Справа           ☐          ☑


Выравнивание содержимого полей.zip
Гocть
49 Вычисляемые надписи в дополнительном статусбаре формы Ну наконец-то доделал свое расширение, учтя, надеюсь, все свои ошибки и желания :)
Данное расширение добавляет вычисляемые надписи в статус бар окна, в котором отображается таблица формы.
Подключать требуется непосредственно к форме справочника или документа.
Позволяет выводить сколько угодно вычисляемых надписей, в дополнительные статусбары,
по отношению к выделенной записи в табличном представлении формы.
Так же, теперь, это расширение, можно подключать к одной форме несколько раз, в итоге будет создано несколько
полей с надписями, например для разделения цен и остатков в разных панелях.
К примеру можно выводить остаток по товару, цену и др. вычисляемые поля.

Но осталось пара вопросов, скорее к автору.
1) Это конечно не критично, но хотелось бы как-то это обойти.
На скринах видно, что при отображении в таблице формы, и если открыть эту-же форму через объект, то меняется сортировка надписей и самих статус баров, не считаю это багом, но буду рад совету как это обойти в расширении.
2) При поиске элемента массива по форме, ранее Вы рекомендовали отключать текущий элемент(переменная Disabled:boolean), если не сложно подскажите когда это надо использовать а когда нет.
Заранее благодарен.
Vofka18
50 Гео-функции МОДУЛЬ НЕ РАБОТАЕТ!

Список функций модуля:

GET_COORDINATES - функция поиска координат на Яндекс-карте по полному или частично введенному адресу.
(требуется интернет-подключение)


FIND_PT_IN_POLYGON - функция для проверки вхождения одной координаты в полигон, состоящий из массива координат. Может применяться для поиска объекта в заданной зоне(зонах).

GET_POLYGON_CENTER - функция поиска приблизительного центра в массиве из множества координат. Может использоваться в качестве указателя при открытии карты в брауере.

VIEW_ON_YMAP - функция открывает в браузере Яндекс-карту и ставит отметку на объект или в точку координат
(автоопределение передаваемого параметра: координаты, адрес, организация).


Более подробное описание имеется внутри функций.

Модуль:
GeoFuncs_v0.1.zip

Демо-база:
GEO_DEMO.zip

Расширения списком
YurAnt
51 Главное меню Состав модуля:

Функция: CLICK_MENU
- Функция ищет пункт меню главного окна по указанному пути и выполняет клик.

Действие: "Кликнуть пункт меню".
Выполняет аналогичное CLICK_MENU действие.

Пример пути для функции/действия: Файл|Подключиться, Сервис|Экспорт данных

Изображение

Демо



Клик в главном меню.zip
Develop-Soft
52 Глобальные константы БД Небольшое расширение позволяет запоминать определенные константы, для дальнейшего использования,
при расчетах в базе данных.
Например хранить наименование организации, величину наценки на продукцию, и т.д.
Обращаться к константам нужно через GETVAR('Наименование переменной').
Выражение может вернуть любой тип.
Подключается в действие при запуске.
Vofka18
53 групповое изменение / удаление записей формы / запроса Писал для себя, пожелания и бегрепорты приветствуются.

1) делает возможность выбора нескольких записей формы (CTRL + мышка, SHIFT+стрелки)
2) групповое изменение записей формы и запросов ("изменить" - срабатывает при выборе >1 записи)
3) групповое удаление записей формы и запросов

работает только в формах в режиме ТАБЛИЦА
настраивается для каждой формы отдельно (действия формы)

Порядок изменения:
открывает первую выбранную запись формы
все компоненты блокируются, кроме выбранных в настройках (и групповых: группа, закладки)
выбранные в настройках поля подсвечиваются желтым (TdxComboBox не меняет цвет при "только значения из списка")
поля становятся зелеными при изменении значения
при нажатии "Ok" измененные значения применяются к выбранным записям формы

Демо

Изображение


kok80-ChangeGroupFields1.4.zip [ Изображение Скачать ]
kok80
54 Дата и время сервера Расширение добавляет функции для получения даты и времени сервера
SRV_TIME
SRV_DATE

добавил веб-версию
Дата и время сервера.zip
cordek
55 Действие "Показать сообщение" но только свое Модуль расширения Smart-конструктор динамических диалогов
Возможности:
• Адаптивная верстка с авто-расчетом высоты текста (без наложений).
• Поддержка многострочного текста через newline и автоматический перенос слов.
• Умная видимость: каждый элемент формы и кнопка могут скрываться по условию.
• Проверка обязательных полей с автоматической подкраской и фокусировкой к обязательному пустому полю.
• Настраиваемые разделители, стили текста (жирный/красный) и иконки кнопок.
xxDeMoXxx
56 Действие и функция для отображения редактора выражений Сделал небольшое действие для отображения редактора выражений.
в действии для кнопки можно выбрать поле, в котором записано выражение и написать имя формы, в контексте которой должно выполняться выражение(форма может быть главная или подчиненная).
В функции можно прописать поле, в котором записано выражение, или само выражение, и также написать имя формы, в контексте которой должно выполняться выражение (форма может быть главная или подчиненная).

Code: Выделить всё

ShowExprEditorFunction([Формула],'Форма1')
ShowExprEditorFunction('Формула','Форма1')
ShowExprEditorFunction('"Block("+[Формула]+")"','Форма1')

Открыть редактор выражений.epas


когда используете действие для кнопки, необходимо самим добавлять в нужное поле Result функции.

Полученные выражения можно потом использовать для вычислений через функцию EvalExp([Формула]) или Text('{'+[Формула]+'}')
cordek
57 Дерево для запроса Модуль дает возможность представить данные запроса в виде дерева и использовать его как фильтр для другого запроса. Подробности читайте в справке по действию. Действие называется "Дерево для запроса", группа "Компоненты".

1.3. Исправлена ошибка, возникающая при выборе узла дерева, содержащего кавычки.
1.2. Дерево не учитывало выходной фильтр запроса-источника.
1.1. Исправлена работа с запросами с выборкой из нескольких источников.
1.0. Первая версия.

QueryTree 1.2.zip

QueryTree 1.1.zip

QueryTree 1.0.zip
admin
58 Дерево для запроса альтернативная версия Действие формы. Добавляет дерево к запросу. Берется за основу дерево формы. Испытывал в режиме "Простая форма". Функционал как у дерева формы.
Screenshot_1.jpg


Исправленная версия 1.1
Исправленные ошибки:
  • Были конфликты, если расширение применялось на нескольких формах. Исправлено.
Дерево запроса 1.1.epas


Дерево запроса.epas
Megabyte
59 Диаграмма Ганта Диаграмма Ганта отображает данные в виде боксов (полос) на шкале времени. Масштаб может регулироваться от месяцев до часов. Каждый бокс на диаграмме несет в себе следующую информацию: дата и время начала, дата и время окончания, цвет, текст, всплывающую подсказку, название группы. Данные для диаграммы берутся из запроса.

Для работы расширения требуется файл GantChartLib10.dll, который загружается автоматически с сайта mydataexpress.ru и сохраняется в папке программы. Диаграмма отображается в выбранном компоненте "Группа", заполняя всю ее область, включая заголовок.

Обязательные для заполнения параметры отмечены звездочкой. В разделе "Временной интервал диаграммы" вы можете указать поля формы, которые будут задавать минимальное и максимальное время, отображаемое на диаграмме. Обычно эти поля служат фильтром для запроса. Если поля не указаны, то временной интервал будет соответствовать минимальному времени начала и максимальному времени окончания из данных запроса.

Управления диаграммой осуществляется при помощи мыши. Вы можете прокручивать диаграмму, перемещая мышь с зажатой левой кнопкой. Колесиком мыши можно прокручивать диаграмму по вертикали. Масштаб настраивается колесиком мыши с зажатой клавишей Ctrl.

Вы можете указать поле цвета, которым будет окрашиваться соответствующие боксы. Поле должно содержать название цвета (clRed, clGreen, clBlue, clSilver и т. д.) или шестнадцатиричное значение цвета ($0000FF, $00FF00, $FF0000, $CCCCCC, $C0F911 и т. д.). Это может быть поле формы или вычисляемое поле запроса.

Данные на диаграмме отображаются в порядке, определяемым запросом. Боксы могут быть сгруппированы, а могут располагаться по одному в каждой строке (параметр "Группировать боксы").
admin
60 Динамическое изменение заголовков закладок Сделан на основе модуля Управление компонентом "Закладки"(PageControl) от Vofka18
https://forum.mydataexpress.ru/viewtopic.php?f=16&t=4485&p=45364&hilit=ЗАкладки#p39857

Возможности:
1. Вывод в заголовки вкладок любых данных (текст, счетчики, значения полей) через выражения.<br>
2. Автоматическое запоминание последней открытой вкладки для каждой записи.<br>
3. Мгновенное обновление при переключении или изменении данных на форме.
xxDeMoXxx
61 Длительная операция с прогрессом Название: Длительная операция с прогресс-баром
Автор: RS47
Версия: 1.0

Описание:
Демонстрационное расширение, показывающее работу текстового прогресс-бара при выполнении длительных операций.

Возможности:
• 5 стилей прогресс-бара (Классический, Блочный, Стрелки, Проценты, Текстовый)
• Настраиваемая длительность (1-300 секунд)
• Кнопка "Отмена" для прерывания операции
• Отображение процентов и счётчика шагов

Использование:
1. Добавьте действие "Длительная операция с прогрессом" на кнопку
2. Выберите длительность и стиль прогресс-бара
3. Нажмите OK — запустится операция
4. При необходимости нажмите "Отмена"

Примечание: Таймер обновляет прогресс каждую секунду.
Pozharskiy1991
62 Дополнительные кнопки списка Расширение добавляет пункт в контекстное меню списка для программного нажатия кнопок на форме. Позволяет вызывать любые кнопки (TdxButton) текущей формы через удобное подменю.

Возможности

- Гибкая настройка - список кнопок задаётся в настройках расширения
- Поддержка имен и подписей - можно указывать как имя компонента (btnSave), так и текст на кнопке (Сохранить)
- Автоматическая фильтрация - в меню отображаются только кнопки, существующие на текущей форме
- Управление активностью - можно временно отключать кнопки без удаления из списка
- Подсказки - при наведении на пункт меню отображается подсказка (если задана)
- Тихая работа - расширение не показывает лишних сообщений при запуске

Как это работает

1. Вы настраиваете список кнопок в расширении (один раз)
2. В контекстном меню любого грида появляется пункт "Нажать кнопку"
3. При наведении открывается подменю со списком доступных кнопок текущей формы
4. Выбираете нужную кнопку - она программно нажимается

Настройка

1. Активируйте действие "Добавить пункт 'Нажать кнопку' в меню"
2. В поле "Текст пункта меню" укажите желаемое название (по умолчанию "Нажать кнопку")
3. В таблице "Список кнопок для нажатия" добавьте нужные кнопки:
- Активна - чекбокс, показывает/скрывает кнопку в меню
- Имя или подпись кнопки - имя компонента (btnSave) или текст на кнопке (Сохранить)
- Подсказка - необязательный текст, отображается при наведении
4. При необходимости включите "Показывать сообщения об ошибках" для отладки

Примечания

- Расширение работает только с кнопками типа TdxButton
- Для каждой формы формируется свой набор кнопок (только существующие)

Известные ограничения

- Не поддерживаются кнопки на панели инструментов (TToolButton)
- Поиск кнопки происходит по точному совпадению имени или подписи
Pozharskiy1991
63 Доступ и безопасность
Состав модуля:

~~~ Функции выражений ~~~

CHECK_PASSWORD - Проверяет пароль текущего пользователя. Можно использовать для временной блокировки без закрытия програмы или "уточнения" доступа к отдельным формам и компонентам (проверка присутствия легитимного пользователя).

CHECK_USER_PASSWORD - Проверяет пароль указанного пользователя. Можно использовать для повышения прав доступа текущему пользователю без закрытия программы или "уточнения" доступа к отдельным формам и компонентам, недоступных текущему пользователю.
~~~ Действия ~~~

Вызывает окно смены пароля для текущего пользователя.
Изображение Изображение
Не рекомендуется: Баловаться с паролем единственного разработчика!

~~~

Примечание: функция модуля CheckSpecifiedUserPassword готова к употреблению в других модулях (например для создания авторизации на http-сервере).

Доступ и безопасность_v0.2.2.zip
Develop-Soft
64 Дублирование записи (действие для кнопки) Дублирует запись таблицы. В отличие от штатной кнопки таблицы "Дублировать",при установке соответствующей опции может открыть окно редактирования новой записи. Например, чтобы изменить значения каких-то полей перед сохранением записи.
2018-03-19_21-38-40.png

2018-03-19_21-36-29.png
jurist23rus
65 Замена кнопок в таблицах и запросах Расширение позволяет привязать к стандартным кнопкам и пунктам меню таблиц и запросов свою кнопку. Возможности расширения:
1. Замена стандартных кнопок и пунктов меню на свои.
2. Скрытие кнопок и пунктов меню.
3. Добавление своих пунктов меню.
4. Замена кнопки объекта.
5. Скрытие кнопки "Закрыть" в окне редактирования.
admin
66 Заполнить по Расширение для вставки данных из указанной формы в текущую.
Похожие расширения: "Ввести на основании"
admin
67 Заполнить таблицу в другой форме. Для личных нужд делал такое вот.
Целью было акшен на кнопку, который бы лез в форму с таблицей и заполнял нужные ячейки в ней.
Аналог небольшого логирования действий.
Используется для контроля распечатки договоров у конкретного пациента. (Какой, когда, кем)

Code: Выделить всё

{@module
Author=SirWolf
Version=1.0
Description=Действие для кнопки "Создать новую запись в таблице в заданной форме".
@}

{@action
Id=EAF40FBA-6918-447A-A7B7-6D4C4CFABCEF
OrigName=AddNewGridRecord
Name=Создать новую запись в таблице
Group=Действия компонентов

UI=<ui>
<form name="Form_name" caption="Выберите Форму" required="1"/>
<expr name="Filter_name" caption="ID" required="1"/>

<divider caption="Параметры вставки"/>

  <childform name="src1" caption="Таблица источника" source="Form_name" />

  <grid name="fields1" caption="Заполнение полей таблицы">
    <field name="srcfield" caption="Поля таблицы" source="src1" filter="text;number;date;time;" required="1"/>
    <expr name="ins_expr" caption="выражение:"required="1"/>
  </grid>
 </ui>

Description= Создаёт новую запись в в таблице в заданной форме.<br><br>
@}

procedure AddNewGridRecord (const Form,Filter,Tbl:string;Values: TVariantArray2d);
var
  Fm: TdxForm;
  i,RecIdFrm:Integer;
begin
  RecIdFrm:= EvalExpr(Filter,self);
  if RecIdFrm = null then exit;
   Fm := TdxForm.Create(Form);
   Fm.OpenRecord(RecIdFrm);
    Fm.Edit;
  with fm.Forms[Tbl] do
      begin
        Edit;
        Append;
          for i:=0 to High(Values) do
            begin
            fields [Values[i][0]] := EvalExpr(Values[i][1],self);
            end;
        Post;
      end;
  Fm.Post
  Fm.Free;
end;   

Буду рад если поможете дописать проверки, дополнения, правки.
SirWolf
68 Заполнить таблицу на основании Примерный аналог функции "Ввести на основании". Данный модуль позволяет создавать новые записи и заполнять их, в том числе и таблицы, на основании данных текущей формы. Для упрощения работы и меньшего количества настроек, модуль разбит на несколько действий для кнопки.
Возможности:
- Заполнять форму и таблицу формы, из текущей формы и таблицы.
- Заполнять форму и таблицу(запрос) формы, из текущей формы и таблицы.
- Заполнять форму и таблицу формы, из текущей формы и таблицы(запроса).
- Заполнять форму и таблицу(запрос) формы, из текущей формы и таблицы(запроса).
- Добавить только одну запись в стороннюю форму или ее таблицу или запрос.
Модуль пока тестирую, возможно будут корректировки и исправления.
Функции постарался описать максимально подробно.
21.04.2023 ~ обновил вложение - мелкие исправления
Vofka18
69 Запуск Web сервера одновременно с desktop Dataexpress Не уверен что кому то пригодится, но оставлю тут :)
Данное расширение, позволяет:
- Запускать Web-сервер, в локальной сети, одновременно с десктопной версией программы.
- Сконфигурировать сервер (обновить файл конфигурации).
- Сгенерировать html файл для поиска сервера в локальной сети, если IP адрес неизвестен, или меняется.
Файл dx.html будет сгенерирован в папку с файлом базы данных. Открыв данный файл на любом устройстве в локальной сети, сервер будет находить автоматически (без указания IP).

Отдельная благодарность пользователю Develop-Soft, за разработку html кода!!!

Немного о настройках:

Исполняемый файл сервера: Файл сервера dxwebsrv.exe.В пути можно использовать только символы латинского алфавита, цифры и символ _ (По крайней мере у меня сервер не работает если в пути присутствуют русские буквы)
Скрыть консоль сервера: При запущенном сервере окно командной строки будет скрыто.
Порт: Желательно указать отличный от стандартных. Например 8800 или 12345
Подсеть, для поиска сервера: Подсеть, в которой нужно искать сервер. Например "192.168.1.", допускается указать например полный ip адрес текущей машины (учитывается только первые три цифры), например 192.168.1.123 не вызовет ошибки. Если поле оставить пустым файл dx.html не будет сгенерирован.
Vofka18
70 Запуск файлов в системе (ShellExecute) Оставлю здесь чтоб не терять :)
Данное расширение является просто оберткой для функции ShellExecute.
Функция ShellExecute открывает или выводит на печать указанный файл.
Файл может быть исполнимым файлом или файлом документа.
Vofka18
71 Извлечь поле записи по двойному клику Расширение позволяет извлечь значение поля из подчинённой таблицы или запроса по двойному клику.
Извлеченный результат можно записать в текстовое поле или запустить выражение.
Можно использовать для выбора записи, открытия сайта или файла, если в таблице/запросе есть поле со ссылкой к ресурсу.
Или иным образом запрограммировать с помощью выражений.

Пример:
UI.png

пример1_1.png

пример1_2.png

Выше в примере выполняется выбор и удаления товара из списка выбранных.
Поле для заполнения является заметка "ID выбранных".
Так же есть пример открытия сайта по клику, можно посмотреть в DEMO базе.

Демо:
DEMO.zip


Расширение:
Извлечь поле записи по двойному клику.epas
shavkat
72 Изменение функций кнопок модального окна Доброго времени суток. Данная тема является продолжением https://forum.mydataexpress.ru/viewtopic.php?f=33&t=5393.
Удалось собрать небольшой модуль для замены названия кнопок Ок и Отмена.
Изначально использовался скрипт формы:

Code: Выделить всё

procedure ShowButtons(sender :TObject);
begin
  self.EditWindow.buttons.OkButton.show;
  self.EditWindow.buttons.CancelButton.show;
  self.EditWindow.buttons.CloseButton.show; //скрывается после сохранения записи
  self.EditWindow.buttons.HelpButton.show;
end;

//Нажимает указанную кнопку при нажатие на кнопку ОК
procedure ClickBt1 (sender :TObject);
begin
dxButton1.Click;
end;
//Нажимает указанную кнопку при нажатие на кнопку Отмена
procedure ClickBt2 (sender :TObject);
begin
dxButton2.Click;
end;



procedure Form_Create;
begin
self.EditWindow.OnShow:=@ ShowButtons;
self.EditWindow.Buttons.OkButton.ModalResult := mrNone //отключает от кнопки "ОК" закрытие окна
self.EditWindow.Buttons.CancelButton.ModalResult := mrNone //отключает от кнопки "Отмена" закрытие окна
Self.EditWindow.Buttons.OkButton.Caption:='Нажать кнопку 1 (без сохранения)'; //Изменяет надпись вместо "Кнопки ОК"
Self.EditWindow.Buttons.CancelButton.Caption:='Нажать кнопку 2 (С сохранение)'; //Изменяет надпись вместо "Кнопки отмена"
self.EditWindow.Buttons.OkButton.onClick :=@ ClickBt1; // Получаем действие для нажатия кнопки ОК
self.EditWindow.Buttons.CancelButton.onClick :=@ ClickBt2; // Получаем действие для нажатия кнопки Отмена
end;

Но никак не получается реализовать видимость кнопок "Ок, Отмена, Закрыть, Помощь." и не получается назначит действия по клику на другую кнопку
xxDeMoXxx
73 Иконки главного меню Действие запуска. Устанавливает иконки для главного меню программы.

Изображение Изображение

Действие не имеет настроек.
Для статичных пунктов меню назначаются соответствующие тематические иконки.
Динамическим пунктам меню назначается одна и та же иконка-"заполнитель".

Примечание: "опционально" иконки назначены и для пунктов меню дизайнера
Изображение

В планах:
- Добавить пунктам горячие клавиши (где отсутствуют)
- (Возможно) изменить названия некоторых МП на более понятные (например: вместо "Подключиться" = "Менеждер подключений")
- Добавить хинты (подсказки).
(Возможно) перестроить пункты меню. Добавить новые.


Демо

Develop-Soft
74 Импорт данных из CSV и Excel Импорт данных из Excel, CSV и других текстовых файлов, где значения отделены друг от друга точкой с запятой. Вы выбираете файл для импорта, программа считывает данные и показывает их вам в табличном виде. Проверьте данные и, если все в порядке, можете их импортировать. Если в данных найдены ошибки, то они выделяются красным цветом. Данные считаются ошибочными, если тип данных не соответствует типу поля или имеют неправильный формат. Строки с ошибками и пустые строки не импортируются.

Расширение умеет удалять из числовых данных пробелы, понимает многострочные значения, значения в двойных кавычках (двойные кавычки используются, чтобы символы переноса строки и разделитель данных считались частью значения). Также расширение умеет обновлять данные при импорте. Т. е. программа ищет по определенным полям данные и если они есть, то данные обновляются, в ином случае данные добавляются.

Расширение состоит из двух действий для кнопок: импорт в форму и импорт в таблицу.

Для работы расширения требуется версия DataExpress не ниже 31.01.2019.

1.2 - Добавлен импорт из Excel.
1.1 - Внесены правки для совместимости с DataExpress от 31.03.2019.
1.0 - Первая версия.

ImportData 1.1.zip
ImportData 1.0.zip
admin
75 Импорт платежных поручений из банковской выписки формата 1c.txt 1. Импорт платежных поручений из банковской выписки формата 1c.txt
2. Функция получает значение параметра из "плоской" текстовой таблицы, в данном случае ищет в тексте фамилию
Автор: Develop-Soft
al.kn
76 Импорт файлов CSV и подобных Хочу поделиться своим расширением для импорта файлов CSV и других, в которых данные отделяются символом разделителем.
За основу было взято одноименное расширение автора, но в итоге от него осталось пару строк кода... Хоть они и предназначены для одного и того же, но принципиально отличаются.
ВАЖНО: перед использованием расширения в рабочей базе, обязательно сделайте бэкап!!!
Первым и наверно основным(для меня) отличием является то, что перед импортом данных, их можно обработать в выражениях. Для этого предусмотрены функции в категории "импорт данных CSV", также можно использовать встроенные в DX функции.
Например: обрезать текст, выбрать только его часть и т.д.
В выражениях нельзя обращаться к полям формы по типу ['Имя поля']. Я не отключил кнопку "Вставить поле формы", только для того, чтобы подсматривать наименования полей объектов(вскоре наверно этого не будет в выражениях).
Еще одно отличие - это использование набора данных tdxForm(надеюсь правильно выразился), т.е. в нем не используются SQL запросы. Это значительно снизило скорость импорта, но при такой конфигурации, при импорте срабатывают все вычисляемые поля на формах в которые импортируются данные(мне это было нужно, поэтому так :D ). Скоростью модуль действительно не блещет, но для небольших объемов данных вполне приемлемо (1100 строк примерно за 40сек.)
Также предусмотрен собственный DEBUG, в него выводятся информация про импортируемые данные.
Расширение подключается к кнопке с минимумом настроек, все остальные действия проводятся внутри окна расширения.
На форме почти все элементы кликабельны, и выводят подсказки о своем функционале и назначении. Я постарался максимально все расписать, но может что-то и упустил...
При использовании данного модуля, следует быть внимательным, т.к. из-за наличия вычисляемых выражений, и свободы пользователя, не все ошибки можно обработать и предусмотреть.
Но основной задачей была именно гибкость настройки импортируемых данных(т.к. часто приходится вносить в базу разные данные от многих поставщиков, и у каждого свой формат документов и т.д.).
Во вложении архив с файлом расширения, тестовой базой, тестовыми данными, и папка с настройками расширения(она создастся автоматически при первом запуске на новой БД). Архив нужно распаковать вместе с папкой "importProfiles", она должна находится рядом с файлом *.FDB.
Ну пожалуй пока все, в дальнейшем может дополню описание.
27.07.22- Обновил расширение (во вложении), исправил небольшую ошибку в функции COL().
Vofka18
77 Индивидуальные настройки условий видимости/доступности полей Автор: Pozharskiy1991
Версия: 1.1


Описание
  • Расширение PropConds является развитием идеи, заложенной в действии «Управление видимостью/доступностью компонентов».
  • Главное отличие: в стандартном действии условие было общим для всех компонентов. Теперь для каждого компонента можно задать своё индивидуальное условие.


Возможности
  • Индивидуальные условия — для каждого компонента своё условие
  • Три режима управления:
    • Видимость — компонент отображается на форме
    • Доступность — компонент доступен для взаимодействия
    • Редактирование — компонент доступен только для чтения
  • Защита от ошибок — проверка на дубликаты компонентов в таблице
  • Корректная очистка памяти — полная выгрузка данных при закрытии формы (v1.1)
  • Безопасное восстановление — оригинальные обработчики восстанавливаются при уничтожении формы (v1.1)


Как это работает
  1. Добавьте действие на форму
  2. В таблице «Компоненты» перечислите компоненты, которыми нужно управлять
  3. Для каждого компонента укажите:
    • Сам компонент
    • Условие (выражение на языке DataExpress)
    • Свойство для управления (Видимость/Доступность/Редактирование)
  4. При переключении записей, изменении полей или сохранении данных условия пересчитываются
  5. Компонент становится видимым/доступным/редактируемым, если условие истинно


Настройка

Основные параметры:
  • Компонент — выберите компонент на форме
  • Условие — выражение, определяющее состояние. Пример: [Статус]='Активен'
  • Управление свойством — выберите: Доступность, Видимость или Редактирование

Дополнительные настройки:
  • Реагировать на события добавления/изменения записи — при включении расширение будет обрабатывать условия при вставке и редактировании


Примеры условий
  • [Сумма] > 0 — компонент активен/видим, когда сумма больше нуля
  • [Статус] = 'Новый' — компонент активен/видим для новых записей
  • EDITREC() — компонент доступен только при редактировании
  • NEWREC() — компонент доступен только при создании новой записи
  • NOT EDITREC() — компонент доступен только при просмотре (не в режиме редактирования)


Примеры использования (сценарии)
  • Скрывать кнопку «Удалить», пока запись не сохранена: NOT NEWREC()
  • Делать поле «Сумма» доступным только для чтения, если документ проведён: [Статус] <> 'Проведён'
  • Отображать дополнительные поля только для определённой категории: [Категория] = 'Элитная'


Особенности работы с компонентами
  • TdxFile (файловое поле) — управление доступностью через скрытие пунктов контекстного меню (кроме пункта «Открыть»)
  • TdxDBImage (изображение) — аналогично TdxFile, управление через контекстное меню
  • TdxTabSheet (закладка) — при скрытии активной закладки автоматически переключается на первую видимую; если все скрыты — скрывается весь PageControl


Примечания
  • Каждый компонент можно настроить только один раз (проверка на дубликаты)
  • Расширение срабатывает при переходе на запись, изменении поля, сохранении или отмене
  • Флажок «Реагировать на события» включает обработку при вставке и редактировании
  • Компонент видим/доступен/редактируем, если условие истинно
  • При использовании свойства «Редактирование» учитывайте, что не все компоненты поддерживают режим ReadOnly


Известные ограничения
Невозможно управлять свойством «Редактирование» для компонентов:
TdxPageControl, TdxTabSheet, TdxGroupBox, TdxButton, TdxLabel, TdxObjectField, TdxImage, TdxGrid, TdxQueryGrid, TdxShape, TdxPivotGrid, TdxChart


Установка
Код расширения прилагается. Для установки скопируйте его в новое действие в вашей базе данных.
Pozharskiy1991
78 Информация о подключении Действие запуска. Добавляет в главное меню кнопку для отображения информации о подключении и версии сервера.
Изображение
Гocть
79 Клик по кнопке из действия кнопки Не нашел в DX plus пришлось добавить отдельно. Действие нужно, чтобы кликнуть кнопку из другой или той же самой кнопки. Это плюс, для тех кто хочет зациклить действия как и я. Добавил также веб модуль.
Для тех, кто не ленив, можете добавить действия в свой экземпляр DX plus
Предупреждаю, что перед зацикливанием действий надо предусмотреть условие выхода, а то выйдет ошибка.
Прикладываю пример зацикливания с этим действием и кликом по изменению поля.
cordek
80 Кнопка "Печать" в форме, аналог кнопки печать в главном меню Автор: Develop-Soft,
выпадающий список печатных форм как на кнопке печать в главном меню
al.kn
81 Кнопка ОК
Vofka18 писал(а):Когда-то делал себе, чтоб не путаться в скриптах, расширение для кнопки, из одной строчки кода :) По сути програмно кликает по кнопке "Ок"
al.kn
82 Кнопка очистки поля Действие формы добавляет в перечисленные поля кнопку очистки. admin
83 Кнопка панели инструментов открывающая простую форму Здравствуйте!

В DX_PLUS есть решение, но оно работает через кнопку на другой форме, которая ссылается на форму и запускает её через тулбар.
Создал гибридное решение на основе двух событий из DX_PLUS.

Добавляет кнопку на панель инструментов главного окна. Кнопка на панели "нажимает" некоторую кнопку на указанной форме. Предполагается, что кнопка находится на простой форме, хотя это и не обязательно. Просто указываем простую форму и запускаем прямо из тулбара.

Вызов формы из тулбара.epas
albereznyuk
84 Комбинация клавиш на кнопку (горячие клавиши) Действие при запуске.

Действие назначает на кнопку комбинацию клавиш.

Особенности работы:
  • Действие работает в любом представлении формы.
  • Клавиши работают только в пределах активной формы.
  • Если представление формы "Только таблица", то клавиши работают только в окне редактирования.
admin
85 Конвертация файлов MS Word и Excel Расширение конвертирует файлы Word и Excel в другие форматы доступные приложениям.
Аналогично возможности приложений, Файл -> Сохранить как.
Для работы действий необходимо наличие установленных приложений Word и Excel.

Описание действий:
Действие конвертации Word.png

Действие конвертации Excel.png


Файл расширения:
Конвертация файлов MS Word и Excel.epas
shavkat
86 Конструктор меню из кнопок Действие формы: "Конструктор меню". Создает меню из кнопок расположенных в указанной "Группе".

Изображение Изображение

Настраиваемые опции:

[Кнопка вызова меню] (обязательная) - любая из кнопок формы, при нажатии на которую будет открываться создаваемое меню.
[Группа кнопок для создания пунктов меню]
(обязательная) - "Группа", внутри которой будут расположены кнопки (пункты меню). При открытии формы в рабочем режиме группа будет программно скрыта а из находящихся в ней кнопок будет создано меню, раскрывающееся по нажатию "Кнопки вызова меню".

В создаваемые пункты меню из кнопок "переезжают": заголовки, иконки, свойства "доступность" и "видимость", событие клика (вычисления/действия/скрипты, завязанные на кнопки выполняются при нажатии на соответствующий пункт меню).

Для создания горизонтального разделителя меню достаточно добавить отдельную кнопку между пунктами и указать текст кнопки "-" (дефис).

Порядок пунктов меню определяет вертикальное расположение кнопок (в расчет берется верхний край кнопки - свойство "top"). Для изменения порядка достаточно в дизайнере передвинуть кнопки выше/ниже относительно друг друга и пункты меню будут выстроены соответственно.

Рецепт видимости/доступности пунктов меню по условию:
1). Скачиваем и устанавливаем расширение "Управление видимостью/доступностью компонентов" отсюда.
2). В него прописываем условие скрытия и ниже в таблице компонентов добавляем требуемые кнопки из группы, участвующие в построении меню. В настройках расширения "Управление видимостью/доступностью компонентов" можно указать любое свойство (Видимость, Доступность) - реакция меню будет соответсвующей.

Примечание:
На одной форме может быть неограниченное подключение действия (по одному на кнопку со связанной группой кнопок)
Вторичное меню (субменю) не поддерживается (и не планируется)




Демо

[ Скачать ]
Develop-Soft
87 Короткие ссылки Функция для укорачивания url с помощью сервиса clck.ru

Code: Выделить всё

https://www.google.com/maps/place/Даниловский+р-н,+Москва,+Россия/@55.7071373,37.6016495,13z/data=!3m1!4b1!4m5!3m4!1s0x46b54b4869e4867d:0x87d973c36502b375!8m2!3d55.7054831!4d37.6377914
= https://clck.ru/D9ttb

Модуль расширений:
Короткие ссылки.zip
Гocть
88 Красим Кнопки и Надписи Небольшое расширение для обводки кнопок и надписей.
Выбираем компонент, цвет обводки и величину обводки.
Screenshot_1.png

Обновил до 1.2. Добавил покрас всего что только под руку попадет))))
Обновил до 1.4
- Выбор цвета
- Толщина обводки
1.png
SirWolf
89 Математические функции Расширение реализует математические функции, отсутствующие в стандартном наборе.
Реализованные математические функции, включая тригонометрические, логарифмические и другие, сгруппированы по категориям:


Тригонометрические функции (радианы)
1. Sinr(a) — синус угла `a` в радианах .
2. Cosr(a) — косинус угла `a` в радианах.
3. Tgr(a) — тангенс угла `a` в радианах (через `Sin/Cos`).
4. Ctr(a) — котангенс угла `a` в радианах (через `Cos/Sin`).
5. Asin(x) — арксинус числа `x` (результат в радианах).
6. Acos(x) — арккосинус числа `x` (результат в радианах).
7. Atan(x) — арктангенс числа `x` (результат в радианах) .
8. Atan2(y, x) — арктангенс `y/x` с учётом квадранта (результат в радианах).
9. Actan(x) — арккотангенс числа `x` (через `Atan2(1, x)`) .


Тригонометрические функции (градусы)
1. Sind(a) — синус угла `a` в градусах (преобразуется в радианы: `a * π/180`).
2. Cosd(a) — косинус угла `a` в градусах.
3. Tgd(a) — тангенс угла `a` в градусах (через `Sind/Cosd`).
4. Ctd(a) — котангенс угла `a` в градусах (через `Cosd/Sind`).


Логарифмы и экспоненты
1. Ln(x) — натуральный логарифм (`x > 0`). - Если использовали предыдущее расширение с логарифмом, уберите его
2. Log10(x) — десятичный логарифм (`x > 0`).
3. Log(base, x) — логарифм `x` по основанию `base` (`base > 0`, `base ≠ 1`, `x > 0`).
4. Exp(x) — экспонента (`e^x`) [[2]][[3]].


Вспомогательные функции
1. Pi — возвращает значение числа π (3.1415926535897932385).

Часть функций работает через SQL, поэтому может работать не корректно на прямом подключении к базе
Математика_1.0.zip
cordek
90 Математические функции - натуральный логарифм Написал небольшую функцию для вычисления натурального логарифма методом разложения рядов.
планирую потом дополнять другими математическими функциями, которые пока отсутствуют в стоке:
Синус
Косинус
и т.п.
cordek
91 Модуль DaData Изображение
Быстрый ввод адресов, компаний, банков с помощью подсказок онлайн-сервиса DaData.ru

Модуль:
DaData.epas.zip

Тестовая БД:
DaData_example.zip
Внимание! Изменены имена функций!
(после установки этой версии необходимо сменить имена в самой базе)

Модуль:
DaData_1.5.zip

Тестовая БД:
DaData_example_1.5.zip

Демо

API-ключ в примере - тестовый. Новый ключ вы можете бесплатно получить после регистрации в сервисе DaData.

Примечание:
1. Сохранена совместимость со старыми названиями функций (достаточно установки модуля поверх старой БД).
с версии 1.5 имена изменены для удобочитаемости... :|
2. Plug&Play: "Автономная" работа через WinAPI (отдельная библиотека libcurl.dll не требуется).
3. На linux-версии DX работать не будет, т.к. используется OLE.
4. На linux под wine по идее заработать должен, т.к. wine очень хитёр... работает.
5.Ввиду специфичности и простоты самодельного xml-парсера возможно некорректное отображение результатов запросов вызываемых с тегированными параметрами (DA_FUNC..('param1.param2...') ) . Полноценное решение выложу немного позже. Пофиксено.

1. Выборка искомого объекта из списка нескольких результатов (в отдельном всплывающем окне или выпадающем списке).
2. Прочёс API DaData на предмет расширения функциональности модуля.
3. При необходимости - расширение функциональности модуля для работы с платными API-функциями DaData.
Расширения списком
YurAnt
92 Модуль drts drts
Автор: drts
Версия: 2.0 от 30.08.2017 г.
Описание: содержит функции
Функция добавляет в контекстное меню пункт для копирования произвольного текста в буфер обмена.
Пример:

Code: Выделить всё

dr_CopyStrToClipboard('Цена изделия:'+ [Цена]+' руб.','Копировать цену изделия',1)

Функция добавляет в контекстное меню пункт для копирования значения указанных полей.
Пример:

Code: Выделить всё

dr_CopyToClipboard('Запрос', '"Поле 1","Поле 2","Поле 3"','Скопировать данные полей в буфер',1)

Функция добавляет в контекстное меню пункт для копирования значения полей выделенной строки.
Пример:

Code: Выделить всё

dr_CopyAllToClipboard('Запрос1', 'Скопировать данные строки в буфер',0)

Функция позволяет включить выделение строки в таблице.
Действие аналогично

Code: Выделить всё

self.grid.options:=self.grid.options+[dgRowSelect];
в скрипте.
Пример:

Code: Выделить всё

dr_GridRowSelect('Запрос1')

scr.png

Функция позволяет включить отображение всплывающей подсказки в ячейке таблицы, если текст не полностью помещается в ней.
scr1.png

Пример:

Code: Выделить всё

dr_GridShowHint('Запрос88')

В этом модуле содержится функция для добавления в окно TListWindow, панели динамического фильтра. При вводе текста в поле поиска фильтр динамически обновляется.
scr3.png

Пример:

Code: Выделить всё

dr_FilterPanel('Объект 1','Поле3')

Для организации поиска одновременно по нескольким полям придется в форме, поиск данных которой осуществляется сделать еще одно поле, где в выражениях и значении по умолчанию создать :

Code: Выделить всё

//[дата_изменения],[Децимал],[Название],[Описание]
nz([Децимал],'')+nz([Название],'')+nz([Описание],'')

поле потом можно скрыть.

В этом модуле содержится функция для добавления панель главного окна поля динамического фильтра. При вводе текста в поле поиска фильтр динамически обновляется.
scr4.png

Пример:

Code: Выделить всё

dr_FilterMainPanel('Поле')

Для организации поиска одновременно по нескольким полям придется в форме, поиск данных которой осуществляется сделать еще одно поле, где в выражениях и значении по умолчанию создать :

Code: Выделить всё

//[дата_изменения],[Децимал],[Название],[Описание]
nz([Децимал],'')+nz([Название],'')+nz([Описание],'')

поле потом можно скрыть.

функция для добавления в заголовок приложения названия БД и имя пользователя
Пример:

Code: Выделить всё

dr_AppName

функция для добавления в заголовок приложения произвольного названия БД.
Пример:

Code: Выделить всё

dr_AppAnyName('текст')

2.0
v1.99 - Исправил ошибку, связанную с передачей фокуса полю поиска.
v1.95 - Добавил кнопку для очистки фильтра в функции dr_FilterPanel, dr_FilterMainPanel
v1.91 - Исправил ошибки, не позволяющие многократное применение функций
v1.83b - Исправил небольшие ошибки.
v1.82 - Добавил функцию добавляющую возможность динамической фильтрации в таблице формы из панели главного окна. Изменил механизм добавления фильтра.
v1.7 - Добавил функцию копирования произвольного текста в буфер обмена.
v1.6 - изменил название глобальных переменных и функций на уникальные (добавил индекс dr_), исправил ошибку из-за которой не срабатывали одновременно функции по параметрам таблицы.
v1.5 - добавил возможность применения функций к запросу, заменил true/false на 1/0, объединил с другими своими модулями
v1.4 - убрал аргумент у функции dr_GridRowSelect за ненадобностью
v1.3 - Добавил функцию включения отображения подсказки ячейки
v1.21 - Исправил досадную ошибку в dr_CopyAllToClipboard (при попытке копирования значения пустого поля возникала ошибка)
v1.2 - добавил функции копирования всей строки dr_CopyAllToClipboard и функцию включения опции таблицы dr_GridRowSelect
v1.1 - появилась возможность указывать несколько полей для копирования

Вопросы можно задавать тут
drts
93 Модуль EX_EXEC EX_EXEC
Автор: Admin
Описание: добавляет новую функцию
EX_EXEC - запускает приложение или открывает файл/ссылку в сопоставленном приложении. Поддерживает указание параметров запускаемого приложения.
ex_exec.zip


Версия с доработками YurAnt для DX от 12.11.2017 г.:

Описание доработки:
Совмещены функции выражений + действие:
24.11.17: Оптимизировано "действие" (ранее при отсутствии параметров открывался проводник Windows, теперь ничего не происходит)
exec_act.epas.zip

Совершить исходящий вызов с компьютера на номер телефона:
Варианты команды:
tel:+79000000000
'tel:'+[Клиент|Телефон]
'tel:'+get('Запрос_Контакты','Телефон')
ДЕМО


...в процессе заполнения...


Изображение


ДЕМО
YurAnt
94 Модуль neitri NEITRI
Автор: Neitri
Версия: 0.15.1 от 1 декабря 2018 г.
Новое в версии: устранен конфликт IntToHex
Описание: содержит набор новых функций.
ObjectVisible - Функция для управления видимостью объектов. Если условие истинно, указанный объект отображается иначе будет скрыт.
True - Возвращает значение Истина.

Code: Выделить всё

IIF(TRUE,'Сумма','Итог')
Результат: Всегда будет возвращать 'Сумма'.
False - Возвращает значение Ложь.

Code: Выделить всё

IIF(FALSE,'Сумма','Итог')
Результат: Всегда будет возвращать 'Итог'.
TabOff - Функция для отключения перехода на объект по нажатию кнопки Tab.
FindObject - Поиск объекта по имени поля.

Code: Выделить всё

FINDOBJECT('Сумма')
Результат: dxCalcEdit1
SkipReadOnly - Отключает переход на поля компонентов, которые недоступны для редактирования.
ReportSave - Печать шаблона в файл.

Code: Выделить всё

REPORTSAVE('Счет.doc','Счет'+CSTR(RECNO(имя формы))+'.doc',True)

v0.04
OUTLOOKMAILSEND,THUNDERBIRDMAILSEND,MAILSEND - Отправка почты через Outlook, Thunderbird или автоматически определенный клиентом.

Code: Выделить всё

MAILSEND('user1@mail.com'+newline+'user2@mail.com', 'test', 'Приветствую. '+newline+'Тестовое письмо'+newline+'С уважением, автор.', 'C:\file1.txt'+newline+'C:\file2.txt'+newline+'file3.txt', false)

OUTLOOKMAILSENDEX,THUNDERBIRDMAILSENDEX,MAILSENDEX - Расширенный режим отправки почты через Outlook, Thunderbird или автоматически определенный клиентом.

Code: Выделить всё

MAILSENDEX('user1@mail.com'+newline+'user2@mail.com', 'cc@mail.ru', 'bcc@mail.ru', 'test', 'Приветствую. '+newline+'Тестовое письмо'+newline+'С уважением, автор.', 'C:\file1.txt'+newline+'C:\file2.txt'+newline+'file3.txt', false)

v0.05 - *REPORTSAVE - автоматическая подстановка расширения выходного файла и проверка существования файла шаблона.
v0.06 - QUOTESL и QUOTES экранирование спецсимволов в тексте для надписи и html кода.

Code: Выделить всё

QUOTESL('ТОО "Рога & Копыта"')   /* ТОО "Рога && Копыта" */
QUOTES('ТОО "Рога&Копыта"')   /* ТОО &quot;Рога&amp;Копыта&quot; */

v0.07 - *REPORTSAVE - используется штатный диалог вывода ошибок, всегда создавался файл '.doc'
v0.08 - RAWURLENCODE - Кодирование строки в URL

Code: Выделить всё

RAWURLENCODE('Проверка!')

9.04.2017Перезалил версию 0.08

v0.09 Изменен вызов ExpandFileName

v0.10 Исправлена ошибка в выражении ObjectVisible

v0.11 Добавлено выражение TIMESBETWEEN

v0.12 Добавлены выражения DLGOPENFILE, DLGSAVEFILE - возвращают путь к файлу, DLGSELECTDIR - путь к каталогу

Code: Выделить всё

DLGOPENFILE('Выбирте файл',[Текст1],'D:\','Word|*.doc;*.docx')
DLGSAVEFILE('Выбирте файл',[Текст1],'D:\','Word|*.doc;*.docx')
DLGSELECTDIR('Выбирте каталог','D:\')


v0.13 Добавлены выражения SECONDSTOTIMESTR, MINUTESTOTIMESTR - количество секунд или минут конвертирует в строку времени.

v0.14 Добавлены выражения SETMAINICONFILE, SETFORMICONFILE - Загрузка иконки в главного окна или в окно формы.

v0.15 Добавлено выражение OBJECTENABLE - Функция для управления доступностью объектов. Совместно с YurAnt.

v0.15.1 Исправлено дублирование IntToHex


Актуальная версия (01.12.2018):
neitri_v0.15.1.zip

neitri_v0.15.zip

neitri_v0.14.zip

neitri_v0.13.zip

neitri_v0.12.zip

neitri_v0.08.zip
neitri
95 Модуль ProgressBar для DataExpress Реализация WINAPI ProgressBar для DataExpress.
TProgressBar сделан на основе TParamList.
W2Fuqk6Iy4.gif

Создание
function PB_Create(Parent: TCustomControl): TProgressBar;
Parent - TCustomControl в котором будет нарисован TProgressBar.

ВНИМАНИЕ. TProgressBar нельзя создать до/во время создания окна (FormCreate/OnCreate), в котором ProgressBar будет размещен.

Пример:

Code: Выделить всё

var
ProgressBar: TProgressBar;

procedure EditWindow_OnShow(Sender: TObject);
begin
  ProgressBar := PB_Create(self.EditWindow);
end;

procedure Form_Create;
begin
  self.EditWindow.OnShow :=@ EditWindow_OnShow
end;


Уничтожение
procedure PB_Destroy(var: TProgressBar);
После уничтожения TProgressBar = nil.

ВНИМАНИЕ. Уничтожать TProgressBar до уничтожения окна в котором он расположен.

Пример:

Code: Выделить всё

var
ProgressBar: TProgressBar;

procedure EditWindow_OnHide(Sender: TObject);
begin
  PB_Destroy(ProgressBar)
end;

procedure Form_Create;
begin
  self.EditWindow.OnHide :=@ EditWindow_OnHide
end; 


Свойства TProgressBar хранятся в параметре по умолчанию Values.

Пример чтения свойства:

Code: Выделить всё

TProgressBar['Свойство']


Пример записи свойства:

Code: Выделить всё

TProgressBar['Свойство'] := Значение

Список свойств:
Height: Integer - Высота
Left: Integer - Расстояние слева
MarqueeInterval: Integer - Время в миллисекундах между обновлениями анимации, при выбранном стиле pbstMarquee.
Min: Integer - Минимальное позиция прогресса
Max: Integer - Максимальная позиция прогресса
Position: Integer - Текущая позиция прогресса
State: TProgressBarState - Состояние TProgressBar, может принимать значения: pbsNormal, pbsError или pbsPaused.
  • pbsNormal - Стандартное состояние
  • pbsError - Состояние ошибки
  • pbsPaused - Состояние приостановки
Step: Integer - Шаг позиции прогресса при выполнении 'StepIt'
Style: TProgressBarStyle - Может принимать значения pbstNormal или pbstMarquee.
  • pbstNormal - Отображает значения позиции прогресса
  • pbstMarquee - Отображает бесконечную анимацию прогресса
Top: Integer - Расстояние сверху
Orientation: TOrientation - Ориентация продвижения TProgressBar, может принимать значения pbHorizontal или pbVertical.
  • pbHorizontal - Горизонтальное продвижение
  • pbVertical - Вертикальное продвижение
Visible: Boolean - Видимость TProgressBar
Width: Integer - Ширина


Аналог процедур TProgressBar, вызываются путем чтения и записи свойств.

Процедуры без входных параметров:
  • StepIt - продвигает позицию на шаг свойства "Step"
  • Show - Делает компонент видимым
  • Hide - Делает компонент невидимым
Пример:

Code: Выделить всё

TProgressBar['StepIt']
TProgressBar['Show']
TProgressBar['Hide']


Процедуры с входными параметрами:
  • SetBounds: [X, Y, w, h] - Устанавливает границы TProgressBar, где:
    • X: Integer - Расстояние слева
    • Y: Integer - Расстояние сверху
    • w: Integer - Ширина TProgressBar
    • h: Integer - Высота TProgressBar
  • SetRange: [Min, Max] - Устанавливает минимальную и максимальную позицию TProgressBar, где:
    • Min: Integer - Минимальное значение позиции
    • Max: Integer - Максимальное значение позиции
  • StepBy: Integer - Продвигает позицию на указанное значение
Пример:

Code: Выделить всё

TProgressBar['SetBounds'] := [10, 10, 180, 30]
TProgressBar['SetRange'] := [0, 100]
TProgressBar['StepBy'] := 15


ProgressBar может не работать на некоторых версиях Windows.

Демо

Camellia
96 Модуль SMART Автор: Admin
Описание: добавляет несколько новых функций
SMART_FocusColor - подсвечивает активное поле. Есть возможность задать цвет подсветки.
SMART_SetFieldValue - устанавливает значение в указанном поле в тех записях формы, которые выбрал запрос.
SMART_PivotToXls - Экспортирует сводную таблицу в Эксель.
jurist23rus
97 Модуль y_module y_module
Автор: YurAnt
Версия: v0.4
Список функций:

1. KURS_UE - получает курс валют (евро, доллар) на указанную дату из сервиса центробанка (cbr.ru)
Зависимость: плагин ds_inet.dll (будет дополняться новыми интернет-функциями. Пожелания приветствуются)
По умолчанию "из коробки" функция ищет плагин в папке с программой. (external 'KursUE@ds_inet.dll';)
Для удобства путь можно изменить путь на свой (например ПапкаDX\lib) и указать его в epas - external 'KursUE@lib\ds_inet.dll';

2. EKFOR [color=#808080](EnterKeyForOpenRec)
Функция подменяет клавишу Space на Enter для открытия формы редактирования в режиме "Только таблица".
Отдельная благодарность neitri и drts за активную помощь в создании функции
[/color]

3. QR_CODE_GEN
Функция генерирует QR-код из заданного текста и помещает в компонент "Изображение".
Зависимости: интернет и доступность сервиса http://goqr.me/
Изображение
Отдельная благодарность neitri за активную помощь в создании функции Изображение .

Скачать:
qr_code_online_generator.epas.zip

4. BtnMLCaption
Функция позволяет установить произвольный многострочный текст для "Кнопки".
Изображение
BtnMLCaption.epas.zip


Содержимое комплекта:
    y_module.epas
    ds_inet.dll
    KURS_UE_EXAMPLE.FDB
    y_module.zip


---

5. Клик - действие. Эмулирует клик левой кнопкой мыши на указанном компоненте.
Клик.zip
YurAnt
98 Модуль для работы с Telegram Bot API (Совместная разработка). Ввиду закрытости проекта решил создать отдельную ветку.
В данной теме приглашаю всех желающих (кодеров и не только) к совместному обсуждению и разработке расширения для работы с ботом Telegram через его API. Из за недостатка времени и недолгого знакомства с этими технологиями, пока сделал небольшой эскиз.
Цель: создать полностью автономный отдельный модуль, исключительно с применением PascalScript и системных функций Windows без использования сторонних библиотек и "невидимых" vpn/прокси. На его базе планируется создать пользовательскую обертку, максимально доступную для понимания и максимально простого внедрения в проекты.

Что сделано на сегодняшний день:
1. Подключение к сервису. Сделал асинхронный коннект с проверкой ответа в цикле, который не вешает программу. Прокси пока указывается вручную в параметре SetProxy.
2. Отправка сообщений боту, запрос информации о чате, запрос информации о боте (ответы пока в чистом json)

Что требуется/планируется:
1. Придумать метод перебора прокси из списка.
2. Внедрить long polling запросы.
3. Написать функцию конвертер JSON Unicode для текста вида \u04030\u04a0\\\ (кириллица).

Code: Выделить всё

function ConvStr(const InText: string): string;
var
  i, op: Integer;
  t, n: string;
  WChar:WideChar;
begin
  i := 1;
  op := 1;
  while Utf8Pos('\u', InText,i) <> 0 do
  begin
    i := Utf8Pos('\u', InText, i);
    t := t + Utf8Copy(InText, op, i - op);
    i:=i+2;
    n := Utf8Copy(InText, i, 4);
    op := i + 4;
    WChar:=(StrToInt('$'+n) as WideChar)
    t := t + WChar;
    Application.ProcessMessages;
  end;
  t := t + Utf8Copy(InText, op, Length(InText));
  Result := t;
end;

4. На базе JSON-парсера разработать TG-фреймворк с набором функций из API для удобства доступа к объектам.
5. Разработка внутреннего API и пользовательской обертки.

Коды:

Code: Выделить всё

type
  TJsonNumber = Double;
  TJsonString = WideString;
  TJsonChar = WideChar;
  TJsonWord = (JWUnknown, JWTrue, JWFalse, JWNull);
  TJsonValueKind = (JVKUnknown, JVKNumber, JVKString, JVKWord, JVKArray, JVKObject);
  TJsonValue = record
    Kind: TJsonValueKind;
    Index: Integer;
  end;
  TJsonArray = array of TJsonValue;
  TJsonPair = record
    Key: TJsonString;
    Value: TJsonValue;
  end;
  TJsonObject = array of TJsonPair;
  TJsonParserOutput = record
    Numbers: array of TJsonNumber;
    Strings: array of TJsonString;
    Words: array of TJsonWord;
    Arrays: array of TJsonArray;
    Objects: array of TJsonObject; // The root object is the first one
    Errors: array of TJsonString;
  end;
  TJsonParser = record
    At: Integer; // The index of the current character
    Ch: TJsonChar; // The current character
    Text: TJsonString;
    Output: TJsonParserOutput;
  end;
  TJsonValueParser = function (var JsonParser: TJsonParser): TJsonValue;

// Call error when something is wrong.
procedure Error(var JsonParser: TJsonParser; Msg: TJsonString);
var
  ErrorMsg: TJsonString;
  N: Integer;
begin
  ErrorMsg := Format('Error: "%s". Position: %d. Text: "%s"', [Msg, JsonParser.At, JsonParser.Text]);
  N := Length(JsonParser.Output.Errors);
  SetLength(JsonParser.Output.Errors, N + 1);
  JsonParser.Output.Errors[N] := ErrorMsg;
end;

function Next(var JsonParser: TJsonParser; C: TJsonChar): TJsonChar;
begin
  Result := #0;
  // If a non-#0 C parameter is provided, verify that it matches the current character.
  if (C <> #0) and (C <> JsonParser.Ch) then
  begin
    Error(JsonParser, 'Expected "' + C + '" instead of "' + JsonParser.Ch + '"');
    Exit;
  end;
  // Get the next character. When there are no more characters, return #0.
  if JsonParser.At > Length(JsonParser.Text) then
  begin
    JsonParser.Ch := #0;
    Exit;
  end;
  JsonParser.Ch := JsonParser.Text[JsonParser.At];
  Inc(JsonParser.At);
  Result := JsonParser.Ch;
end;

// Parse a number value.
function Number(var JsonParser: TJsonParser): Double;
var
  S: WideString;
begin
  Result := 0;
  S := '';
  if JsonParser.Ch = '-' then
  begin
    S := '-';
    Next(JsonParser, '-');
  end;
  while (JsonParser.Ch >= '0') and (JsonParser.Ch <= '9') do
  begin
    S := S + JsonParser.Ch;
    Next(JsonParser, #0);
  end;
  if JsonParser.Ch = '.' then
  begin
    S := S + '.';
    while (Next(JsonParser, #0) <> #0) and (JsonParser.Ch >= '0') and (JsonParser.Ch <= '9') do
      S := S + JsonParser.Ch;
  end;
  if (JsonParser.Ch = 'e') or (JsonParser.Ch = 'E') then
  begin
    S := S + JsonParser.Ch;
    Next(JSonParser, #0);
    if (JsonParser.Ch = '-') or (JsonParser.Ch = '+') then
    begin
      S := S + JsonParser.Ch;
      Next(JsonParser, #0);
    end;
    while (JsonParser.Ch >= '0') and (JsonParser.Ch <= '9') do
    begin
      S := S + JsonParser.Ch;
      Next(JsonParser, #0);
    end;
  end;
  if S = '' then
    Error(JsonParser, 'Bad number')
  else
    Result := StrToFloat(S);
end;

// Parse a string value.
function String_(var JsonParser: TJsonParser): TJsonString;
var
  HexDigit, HexValue: Integer;
  I: Integer;
  SpecChar: TJsonChar;
begin
  Result := '';
  // When parsing for string values, we must look for " and \ characters.
  if JsonParser.Ch = '"' then
  begin
    while Next(JsonParser, #0) <> #0 do
    begin
      if JsonParser.Ch = '"' then
      begin
        Next(JsonParser, #0);
        Exit;
      end;
      if JsonParser.Ch = '\' then
      begin
        Next(JsonParser, #0);
        if JsonParser.Ch = 'u' then
        begin
          HexValue := 0;
          for I := 1 to 4 do
          begin
            HexDigit := StrToInt('0x' + Next(JsonParser, #0));
            HexValue := HexValue * 16 + HexDigit;
          end;
          Result := Result + Chr(HexValue);
        end
        else
        begin
          case JsonParser.Ch of
            '"': SpecChar := '"';
            '\': SpecChar := '\';
            '/': SpecChar := '/';
            'b': SpecChar := #8;
            'f': SpecChar := #12;
            'n': SpecChar := #10;
            'r': SpecChar := #13;
            't': SpecChar := #9;
          else
            Break;
          end;
        end;
      end
      else
        Result := Result + JsonParser.Ch;
    end;
  end;
  Error(JsonParser, 'Bad string');
end;

// Skip whitespace.
procedure White(var JsonParser: TJsonParser);
begin
  while (JsonParser.Ch <> #0) and (JsonParser.Ch <= ' ') do
    Next(JsonParser, #0);
end;

// true, false, or null.
function Word_(var JsonParser: TJsonParser): TJsonWord;
begin
  Result := JWUnknown;
  case JsonParser.Ch of
    't':
    begin
      Next(JsonParser, 't');
      Next(JsonParser, 'r');
      Next(JsonParser, 'u');
      Next(JsonParser, 'e');
      Result := JWTrue;
      Exit;
    end;
    'f':
    begin
      Next(JsonParser, 'f');
      Next(JsonParser, 'a');
      Next(JsonParser, 'l');
      Next(JsonParser, 's');
      Next(JsonParser, 'e');
      Result := JWFalse;
      Exit;
    end;
    'n':
    begin
      Next(JsonParser, 'n');
      Next(JsonParser, 'u');
      Next(JsonParser, 'l');
      Next(JsonParser, 'l');
      Result := JWNull;
      Exit;
    end;
  end;
  Error(JsonParser, 'Unexpected "' + JsonParser.Ch + '"');
end;

// Parse an array value.
function Array_(var JsonParser: TJsonParser; Value: TJsonValueParser): TJsonArray;
var
  N: Integer;
begin
  SetLength(Result, 0); // Empty array
  N := 0;
  if JsonParser.Ch = '[' then
  begin
    Next(JsonParser, '[');
    White(JsonParser);
    if JsonParser.Ch = ']' then
    begin
      Next(JsonParser, ']');
      Exit; // Return empty array
    end;
    while JsonParser.Ch <> #0 do
    begin
      Inc(N);
      SetLength(Result, N);
      Result[N - 1] := Value(JsonParser);
      White(JsonParser);
      if JsonParser.Ch = ']' then
      begin
        Next(JsonParser, ']');
        Exit;
      end;
      Next(JsonParser, ',');
      White(JsonParser);
    end;
  end;
  Error(JsonParser, 'Bad array');
end;

// Parse an object value.
function Object_(var JsonParser: TJsonParser; Value: TJsonValueParser): TJsonObject;
var
  Key: TJsonString;
  I, N: Integer;
begin
  SetLength(Result, 0); // Empty object
  N := 0;
  if JsonParser.Ch = '{' then
  begin
    Next(JsonParser, '{');
    White(JsonParser);
    if JsonParser.Ch = '}' then
    begin
      Next(JsonParser, '}');
      Exit; // Return empty object
    end;
    while JsonParser.Ch <> #0 do
    begin
      Key := String_(JsonParser);
      White(JsonParser);
      Next(JsonParser, ':');
      for I := 0 to N - 1 do
      begin
        if Key = Result[I].Key then
          Error(JsonParser, 'Duplicate key "' + Key + '"');
      end;
      Inc(N);
      SetLength(Result, N);
      Result[N - 1].Key := Key;
      Result[N - 1].Value := Value(JsonParser);
      White(JsonParser);
      if JsonParser.Ch = '}' then
      begin
        Next(JsonParser, '}');
        Exit;
      end;
      Next(JsonParser, ',');
      White(JsonParser);
    end;
  end;
  Error(JsonParser, 'Bad object');
end;

// Parse a JSON value. It could be a number, a string, a word, an array, or an object.
function Value(var JsonParser: TJsonParser): TJsonValue;
var
  N: Integer;
begin
  Result.Kind := JVKUnknown;
  Result.Index := -1;
  White(JsonParser);
  case JsonParser.Ch of
    '-', '0'..'9':
    begin
      N := Length(JsonParser.Output.Numbers);
      SetLength(JsonParser.Output.Numbers, N + 1);
      JsonParser.Output.Numbers[N] := Number(JsonParser);
      Result.Kind := JVKNumber;
      Result.Index := N;
    end;
    '"':
    begin
      N := Length(JsonParser.Output.Strings);
      SetLength(JsonParser.Output.Strings, N + 1);
      JsonParser.Output.Strings[N] := String_(JsonParser);
      Result.Kind := JVKString;
      Result.Index := N;
    end;
    't', 'f', 'n':
    begin
      N := Length(JsonParser.Output.Words);
      SetLength(JsonParser.Output.Words, N + 1);
      JsonParser.Output.Words[N] := Word_(JsonParser);
      Result.Kind := JVKWord;
      Result.Index := N;
    end;
    '[':
    begin
      N := Length(JsonParser.Output.Arrays);
      SetLength(JsonParser.Output.Arrays, N + 1);
      JsonParser.Output.Arrays[N] := Array_(JsonParser, @Value);
      Result.Kind := JVKArray;
      Result.Index := N;
    end;
    '{':
    begin
      N := Length(JsonParser.Output.Objects);
      SetLength(JsonParser.Output.Objects, N + 1);
      JsonParser.Output.Objects[N] := Object_(JsonParser, @Value);
      Result.Kind := JVKObject;
      Result.Index := N;
    end;
  else
    Error(JsonParser, 'Bad JSON value');
  end;
end;

procedure ParseJson(var JsonParser: TJsonParser; const Source: WideString);
begin
  if Source = '' then
    Exit;
  JsonParser.At := 1;
  JsonParser.Ch := ' ';
  JsonParser.Text := Source;
  Value(JsonParser);
  White(JsonParser);
  if JsonParser.Ch <> #0 then
    Error(JsonParser, 'Syntax error');
end;

procedure ClearJsonParser(var JsonParser: TJsonParser);
begin
  JsonParser.At := 0;
  JsonParser.Ch := #0;
  JsonParser.Text := '';
  SetLength(JsonParser.Output.Numbers, 0);
  SetLength(JsonParser.Output.Strings, 0);
  SetLength(JsonParser.Output.Words, 0);
  SetLength(JsonParser.Output.Arrays, 0);
  SetLength(JsonParser.Output.Objects, 0);
  SetLength(JsonParser.Output.Errors, 0);
end;

function IndentString(Indent: Integer): TJsonString;
var
  I: Integer;
begin
  for I := 1 to 4 * Indent do
    Result := Result + ' ';
end;

procedure PrintJsonObject(const Output: TJsonParserOutput; Index, Indent: Integer; Lines: TStringList; CommaAfter: TJsonString); forward;

procedure PrintJsonArray(const Output: TJsonParserOutput; Index, Indent: Integer; Lines: TStringList; CommaAfter: TJsonString);
var
  IS0, IS1: TJsonString;
  I: Integer;
  V: TJsonValue;
  S, Comma: TJsonString;
begin
  IS0 := IndentString(Indent);
  IS1 := IndentString(Indent + 1);
  Lines.Add(IS0 + '[');
  for I := 0 to Length(Output.Arrays[Index]) - 1 do
  begin
    if I < Length(Output.Arrays[Index]) - 1 then
      Comma := ','
    else
      Comma := '';
    V := Output.Arrays[Index][I];
    case V.Kind of
      JVKUnknown: Lines.Add(IS1 + '?kind?' + Comma);
      JVKNumber: Lines.Add(Format('%s%g' + Comma, [IS1, Output.Numbers[V.Index]]));
      JVKString: Lines.Add(IS1 + '"' + Output.Strings[V.Index] + '"' + Comma);
      JVKWord:
      begin
        case Output.Words[V.Index] of
          JWUnknown: S := '?word?';
          JWTrue: S := 'true';
          JWFalse: S := 'false';
          JWNull: S := 'null';
        end;
        Lines.Add(IS1 + S + Comma);
      end;
      JVKArray: PrintJsonArray(Output, V.Index, Indent + 1, Lines, Comma);
      JVKObject: PrintJsonObject(Output, V.Index, Indent + 1, Lines, Comma);
    end;
  end;
  Lines.Add(IS0 + ']' + CommaAfter);
end;

procedure PrintJsonObject(const Output: TJsonParserOutput; Index, Indent: Integer; Lines: TStringList; CommaAfter: TJsonString);
var
  IS0, IS1: TJsonString;
  I: Integer;
  K: TJsonString;
  V: TJsonValue;
  S, Comma: TJsonString;
begin
  IS0 := IndentString(Indent);
  IS1 := IndentString(Indent + 1);
  Lines.Add(IS0 + '{');
  for I := 0 to Length(Output.Objects[Index]) - 1 do
  begin
    if I < Length(Output.Objects[Index]) - 1 then
      Comma := ','
    else
      Comma := '';
    K := '"' + Output.Objects[Index][I].Key + '"';
    V := Output.Objects[Index][I].Value;
    case V.Kind of
      JVKUnknown: Lines.Add(IS1 + K + ': ?kind?' + Comma);
      JVKNumber: Lines.Add(Format('%s: %g' + Comma, [IS1 + K, Output.Numbers[V.Index]]));
      JVKString: Lines.Add(IS1 + K + ': "' + Output.Strings[V.Index] + '"' + Comma);
      JVKWord:
      begin
        case Output.Words[V.Index] of
          JWUnknown: S := '?word?';
          JWTrue: S := 'true';
          JWFalse: S := 'false';
          JWNull: S := 'null';
        end;
        Lines.Add(IS1 + K + ': ' + S + Comma);
      end;
      JVKArray:
      begin
        Lines.Add(IS1 + K + ':');
        PrintJsonArray(Output, V.Index, Indent + 1, Lines, Comma);
      end;
      JVKObject:
      begin
        Lines.Add(IS1 + K + ':');
        PrintJsonObject(Output, V.Index, Indent + 1, Lines, Comma);
      end;
    end;
  end;
  Lines.Add(IS0 + '}' + CommaAfter);
end;

procedure PrintJsonParserOutput(const Output: TJsonParserOutput; Lines: TStringList);
begin
  PrintJsonObject(Output, 0, 0, Lines, '');
end;

////////////////////////////////////////////////////////////////////////////////
///////////////////////        TELEGRAM BOT      ///////////////////////////////
////////////////////////////////////////////////////////////////////////////////


function GetQueryStatus(const InStr:TJSonString):variant;
var  JP: TJsonParser;
S:string;
i,j:integer;
Kind:TJsonValueKind;
Res:variant;
begin
  try
  ClearJsonParser(JP);
  ParseJson(JP, InStr);
  for J := 0 to Length(JP.Output.Errors) - 1 do
  debug(JP.Output.Errors[J]);
  for i:=0 to length(JP.Output.Objects[0])-1 do
  if JP.Output.Objects[0][i].Key = 'ok' then
  if JP.Output.Objects[0][i].Value.Kind = JVKWord then
    begin
    if JP.Output.Words[JP.Output.Objects[0][i].Value.Index] =
    JWUnknown then res:=word;
    if JP.Output.Words[JP.Output.Objects[0][i].Value.Index] =
    JWTrue then res:=true;
    if JP.Output.Words[JP.Output.Objects[0][i].Value.Index] =
    JWFalse then res:=false;
    if JP.Output.Words[JP.Output.Objects[0][i].Value.Index] =
    JWNull then res:=null;
    end;
    except
    debug('JsonParser: '+ExceptionToString(ExceptionType,ExceptionParam));
    exit;
    end;
    result:=res;
end;

Code: Выделить всё

{$i koldev_jsonparser}


//  \u0000 to S  // ЧТО ТО В ЭТОЙ ФУНКЦИИ НЕ ТО!!! Переполняет память.
function ConvStr(const InText: string): string;
var
  i, op: Integer;
  c: Char;
  t, n: string;
begin
  i := 1;
  op := 1;
  while Utf8Pos('\u', InText,i) <> 0 do
  begin
   i := Utf8Pos('\u', InText, i);
   t := t + Utf8Copy(InText, op, i - op);
   i:=i+2;
   n := Utf8Copy(InText, i, 4);
   n:=Utf8ToWinCP(n)
   op := i + 4;
   c := Chr(StrToInt('$' + n)-848);
   t := t + WinCPToUtf8(c);
   n:='';
  end;
  t := t + Utf8Copy(InText, op, Length(InText));
  Result := t;
end;

        // Попытка сделать свой костыль.
const cyr_chars =
'\u0430 = а; \u0410 = А;'+
'\u0431 = б; \u0411 = Б;'+
'\u0432 = в; \u0412 = В;'+
'\u0433 = г; \u0413 = Г;'+
'\u0434 = д; \u0414 = Д;'+
'\u0435 = е; \u0415 = Е;'+
'\u0451 = ё; \u0401 = Ё;'+
'\u0436 = ж; \u0416 = Ж;'+
'\u0437 = з; \u0417 = З;'+
'\u0438 = и; \u0418 = И;'+
'\u0439 = й; \u0419 = Й;'+
'\u043a = к; \u041a = К;'+
'\u043b = л; \u041b = Л;'+
'\u043c = м; \u041c = М;'+
'\u043d = н; \u041d = Н;'+
'\u043e = о; \u041e = О;'+
'\u043f = п; \u041f = П;'+
'\u0440 = р; \u0420 = Р;'+
'\u0441 = с; \u0421 = С;'+
'\u0442 = т; \u0422 = Т;'+
'\u0443 = у; \u0423 = У;'+
'\u0444 = ф; \u0424 = Ф;'+
'\u0445 = х; \u0425 = Х;'+
'\u0446 = ц; \u0426 = Ц;'+
'\u0447 = ч; \u0427 = Ч;'+
'\u0448 = ш; \u0428 = Ш;'+
'\u0449 = щ; \u0429 = Щ;'+
'\u044a = ъ; \u042a = Ъ;'+
'\u044b = ы; \u042b = Ы;'+
'\u044c = ь; \u042c = Ь;'+
'\u044d = э; \u042d = Э;'+
'\u044e = ю; \u042e = Ю;'+
'\u044f = я; \u042f = Я;';

function J2Decode(InTxt:string):string;
var txt,s,s1,lw,rw:string;
SL:TStrings;
i:integer;
begin
if InTxt='' then exit;
SL:=TstringList.Create;
SplitStr(cyr_chars,';',SL);
for i:=0 to SL.Count-1 do
begin
  s1:=Trim(SL[i]);
  lw:=Trim(Utf8Copy(s1,1,Utf8Pos('=',s1,1)-1));
  rw:=Trim(Utf8Copy(s1,Utf8Pos('=',s1,1)+1,Length(s1)-Utf8Pos('=',s1,1)));
  txt:=Utf8StringReplace(txt, lw, rw,[rfReplaceAll])

end;
result:=txt;
SL.Free;
end;

function ReplaceAll(Text,OldTxt,NewTxt:String):string;
begin
result:=Utf8StringReplace(Text,OldTxt,NewTxt,[rfReplaceAll])
end;

procedure Sleep(ms:cardinal);
external 'Sleep@kernel32 stdcall';


{---------------------------------------------------------------}

const
Token = '677398564:AAFPeLGgGs2x7tLaC-ahvZwzCnu_f_RXZfE';

var HttpReq,xDoc:variant;
T:TTimer;

procedure CreateHTTP(Sender: TObject);
begin
try
//HttpReq:=CreateOleObject('MSXML2.ServerXMLHTTP'); // доработать автоопределение.
HttpReq:=CreateOleObject('WinHttp.WinHttpRequest.5.1');

HttpReq.SetTimeouts(5000,5000,5000,5000); // доработать в параметры
HttpReq.setProxy(2,'125.141.200.39');  // доработать перебор.
except
debug(ExceptionToString(ExceptionType,ExceptionParam));
end;
end;

procedure SetCursorPos;
begin
dxMemo1.SetFocus;
dxMemo1.SelStart:=Length(dxMemo1.Text)-20;
end;

function SendRequest(utl:string):string;
var S:string;
i,rs:integer;
wfr:boolean;
begin
Self['Поле приема']:=''
S:=ReplaceAll(VarToStr(utl),#13#10,'%0A');
S:=ReplaceAll(S,#42,'%2A');
HttpReq.open('post',S, true);
HttpReq.send;
i:=1;
dxLabel1.Caption:='Выполняется запрос.'

repeat
wfr:=HttpReq.WaitForResponse(5);
inc(i)
Sleep(50);
dxLabel1.Caption:='Выполняется запрос.'+StringOfChar(#46,i);
application.ProcessMessages;
 until
((wfr=true) or (i>10))

{  repeat
    rs:=HttpReq.ReadyState;
    inc(i)
    Sleep(100);
    dxLabel1.Caption:='Выполняется запрос.'+StringOfChar(#46,i);
    application.ProcessMessages;
  until
((HttpReq.ReadyState=4) or (i>100));
}
result:=
//J2Decode(
HttpReq.ResponseText
//)
;
dxLabel1.Caption:='ОК'
end;


procedure CloseHTTP(Sender:TObject);
begin HttpReq:=Unassigned; end;

{***************************************************************************}


///////////////

function ParseUpdates(InStr:string):string;
var
  Source, Lines: TStringList;
  JsonParser: TJsonParser;
  I, J: Integer;
  S,SS:string;
begin
try
    Source := TStringList.Create;
    Source.Text:=InStr;
    ClearJsonParser(JsonParser);
    ParseJson(JsonParser, Source.Text);
    Source.Free;
    for J := 0 to Length(JsonParser.Output.Errors) - 1 do
      debug(JsonParser.Output.Errors[J]);
    Lines := TStringList.Create;
    for i:=0 to GetArrayLength(JsonParser.Output.Strings)-1 do
    begin
    if i=0 then
    Lines.Add(JsonParser.Output.Strings[0])
    else
     if i>0 then
      if Trim(JsonParser.Output.Strings[i-1])='private' then
    Lines.Add(JsonParser.Output.Strings[i])
    end;
    result:=Lines.Text;
    Lines.Free;
except
debug(ExceptionParam)
end; end;


//////////////

procedure getUpdates(Sender:TObject);
begin
dxMemo1.Text:=
//ParseUpdates(
//j2decode(
SendRequest('https://api.telegram.org/bot'+Token+'/getUpdates')
//)
//)
SetCursorPos;
end;

procedure getUpdates2(Sender:TObject);
begin
dxMemo1.Text:=
j2decode(
SendRequest('https://api.telegram.org/bot'+Token+'/getUpdates')
)
SetCursorPos;
end;


procedure SendMessage(Sender:TObject);
var QueryResponse:string;
begin
try
QueryResponse := SendRequest('https://api.telegram.org/bot'+Token+'/sendMessage?chat_id=671190259&text='+
VarToStr(Self['Поле отправки']));
if GetQueryStatus(QueryResponse) then
begin
dxMemo1.Text:='ОК: ' + #13#10#13#10 + QueryResponse;
SetCursorPos;
end;
except
dxMemo1.Text:=ExceptionParam;
end;
end;

procedure DeleteMessage(Sender:TObject);
begin
dxMemo1.Text:=
SendRequest('https://api.telegram.org/bot'+Token+'/DeleteMessage?chat_id=671190259&message_id='+
VarToStr(Self['id сообщения']))
SetCursorPos;
end;

procedure getMe(Sender:TObject);
var QueryResponse:string;
begin
QueryResponse := SendRequest('https://api.telegram.org/bot'+Token+'/getMe');
if GetQueryStatus(QueryResponse) then
begin
dxMemo1.Text:='ОК: ' + #13#10#13#10 + QueryResponse;
SetCursorPos;
end
 else
dxMemo1.Text:='Что то пошло не так';
end;

procedure Test(Sender:TObject);
begin
debug(J2Decode('u0442\u0435 u0441\u043b\u0435'))
end;

procedure  GetStatus(Sender:TObject);
begin
try

if not (VarIsNull(HttpReq)) then
if not (VarIsNull(HttpReq.Status)) then
//debug(HttpReq.Status);
getUpdates(Sender);

except
debug(ExceptionParam)
end;
end;


procedure Form_Create;
var s:string;
begin
//T:=TTimer.Create(Self);
//T.Interval:=5000;
//T.OnTimer:=@GetStatus;
dxLabel1.Caption:=''
Self.OnAfterOpen:=@CreateHTTP;
dxButton1.OnClick:=@getUpdates;// getUpdates;
dxButton2.OnClick:=@SendMessage;
dxButton3.OnClick:=@getMe;
end;

procedure Form_Destroy;
begin
CloseHTTP(Self)
end;

Тестовая база

Логика работы бота (работы бота :lol: ):
Судя по данным от клиентов:
auth.jpg

как и предполагал, from.id и chat.id это уникальный идентификатор пользователя и переписки с ботом одновременно.
Логику вижу примерно такую:
1. Пользователь отсылает боту любое сообщение,
чтобы это не превратилось в "ddos атаку" бот это "терпит" попыток 20 30, потом "заваливает" пользователя по его id командой kickChatMember (на некоторое время или до 31.12.9999 г.)
2. Для порядка программа на любой запрос незнакомого пользователя отвечает предложением выполнить команду /запрос на регистрацию
3. Пользователь нажимает /запрос на регистрацию и пошел процесс "знакомства".
4. После команды регистрации бот видит что пользователя с таким ID нет в "регистратуре" и "заводит на него новую карточку", туда же вносит %FirstName%, %LastName%, %WhoInThisLife% и так далее, но вся эта информация дополнительная, а главный ID. Именно по ID с у бота пользователем будет происходить общение весь срок "дружбы", независимо от устройства с которого тот выходит. После запроса на регистрацию при следующих повторных попытках бот также проверяет регистратуру и отвечает абону: "В курсе уже! Жди!"

На этом "прелюдия" завершена. Далее процесс может продолжить только Великий Админ, который ведет пользователей базы. Он открывает форму, с названием, скажем "запросы на регистрацию", видит запись с новым запросом и ставит свой резолюшн в виде галочки "разрешить дружбу".

Регистрация завершена. В дальнейшем пользователь может общаться с ботом в рамках выданных ему прав, но об этом позже.

Удаление пользователя может происходить двумя способами:

1. Админ устанавливает флажок "удален" и флаг "разрешить дружбу" снимается. Это можно пригодиться в том случае, когда желательно сохранить данные для (возможного) последующего использования.
2. Физическое удаление записи с пользователем, если его данные более не требуются.

В обоих случаях опционально можно применить правило "анти ddos", описанное выше.


Возможные проблемы и варианты их решения:
Да, такое бывает. В этом случае бот (если он обучен работать с записями и таблицами бд) при обращении к базе получит отворот и дальше неизвестно чем все закончится.
То есть при условиях, что база сетевая + запрос отправленный боту связан с обращением к базе + база отвалилась, прежде всего он должен попробовать ее опросить и в случае отказа, вернуть ошибку подключения и возможно предпринять какие то действия по спасению ситуации.

Если база сетевая:

Code: Выделить всё

if (GetCurrentDatabase[2] <> ':') then


Пробуем проверить соединение запросом чего нибудь от сервера:

Code: Выделить всё

function CheckDBConnect:boolean;
begin
  try
      result:=SQLSelect('select version from dx_version').Field[0].AsBoolean;
  except
      result:=false;
  end;
end; 


Если коннект оказался успешным, продолжаем штатную работу, иначе

:| непонятно что иначе. Можно попробовать выполнить перезапуск:

Code: Выделить всё

ShellExecute('open', Application.ExeName, GetCurrentDatabase (+ параметры), '',10)


и "убить себя" Application.Terminate, предварительно отправив клиенту "предсмертную записку" с сообщением о попытке "реинкарнации" в "новом теле".

Конечно такой способ прокатит, только если бот полностью автоматически стартует при запуске иначе после самоубийства он просто попадет в преисподнюю.
Если бот стартует в другом запущенном экземпляре программы, то соответственно у него начнется "раздвоение личности":Изображение
Гocть
99 Модуль напоминаний о событиях Решил поделиться своим творением, писал для своих нужд. Сразу оговорюсь, на гуру программирования я не тяну, поэтому тапками не бить, а советам буду рад. :)
Итак, Данное расширение подключается в действиях при запуске, предварительно нужно создать форму для хранения напоминаний (пример на скрине).
В выражениях добавятся соответствующие функции, для добавления напоминаний через выражения.

В версии 2.2 добавлен еще один параметр (предпоследний, если по порядку). это параметр "user" если передать в него пустую строку, то функционал расширения не изменится от предыдущей версии. А если в него передать имя юзера, то оно запишится в напоминание.
Обратите внимание, что в расширении отсутствует проверка, на наличие указанного пользавателя, т.е.
если указать не существующее имя пользавателя, то напоминание не сработает никогда.

31.05.2023 Reminder v3.0 - исправил конфликт с другими расширениями, при старте программы. Также оптимизировал процедуру обновления уведомлений (создавалось много лишних экземпляров формы)
01.06.2023 Reminder v3.1 - Исправил ошибку неопределенного поля цикличных событий.
28.05.2024 Reminder v3.2 - Исправил редактирование записи, при установленном фильтре формы.

Демо

Vofka18
100 Модуль отправки смс-сообщений через API для сервиса SMS.RU Переделан "Универсальный модуль для HTTP запросов (GET, POST, DELETE) (SendHttpRequest)"
https://forum.mydataexpress.ru/viewtopic.php?f=16&t=5323&hilit=HTTP
для отправки СМС сообщений через сервис SMS.Ru
Необходима регистрация на сайте SMS.RU https://sms.ru
xxDeMoXxx
101 Модуль форматирования полей "Число" и "Дата" Последняя версия: 2.2 от 31.08.18 г.

Модуль служит для организации визуального форматирования чисел в полях типа «Число» и упрощения ввода данных в поля «Дата».

РЕПОЗИТОРИЙ
jurist23rus
102 Модуль Чекко Модуль для получения данных о компании и ИП с сервиса Чекко. Аналог DaData.
В данный версии модуля только это реализовано.
https://checko.ru/

Пример запроса данных:
вместо <API-key> нужно вставить собственный ключ, который можно получить в личном кабинете сайта.

Code: Выделить всё

iif(CHECKO_FIRM_GET('<API-key>', [ИНН]) = 'По запросу ничего не найдено',
    msgbox('Внимание',concat('По запросу: ',[ИНН], ' ничего не найдено')),
    null
)   


Пример получения полного наименования компании:

Code: Выделить всё

iif(nz(getvar('checko.data.ИНН'), '') = [ИНН],
    GetVar('checko.data.НаимПолн'),
    null
)   


Данные хранятся в переменных, до знака = это имя переменной, а после знака = его значение.
Получить данные через GetVar('checko.data.Статус.Код')
Снимок экрана 2025-03-22 191318.png

Все получаемые данный можно найти по ссылкам
По компании: https://checko.ru/integration/api/company
По ИП: https://checko.ru/integration/api/entrepreneur


Модуль:
API Чекко.epas
shavkat
103 Мультивыгрузка файлов MultiFileDownload
Автор: Pozharskiy1991

Описание
Расширение позволяет пакетно выгружать все файлы из выбранного поля запроса в указанную папку. Автоматически обрабатывает дубликаты и сортирует файлы по расширениям в отдельные подпапки.

Возможности
  • Пакетная выгрузка — все файлы из запроса сохраняются одной операцией
  • Сортировка по расширениям — автоматическое создание подпапок для каждого типа файлов (pdf, jpg, docx и т.д.)
  • Обработка дубликатов — автоматическое переименование файлов с одинаковыми именами (добавление индекса в скобках)
  • Гибкие настройки — выбор папки, пропуск дубликатов, открытие папки после завершения
  • Интерактивный выбор папки — если папка не указана в настройках, при выполнении откроется диалог выбора
  • Информативный отчет — подробная статистика по завершении операции

Как это работает
  • Вы выбираете запрос-источник на форме, содержащий файлы
  • Указываете поле с файлом (тип "Файл") в этом запросе
  • Настраиваете параметры выгрузки (папка, сортировка по расширениям, дубликаты)
  • Расширение проходит по всем записям запроса и копирует файлы
  • Файлы с одинаковыми именами автоматически переименовываются
  • При включенной сортировке файлы распределяются по подпапкам в зависимости от расширения
  • По завершении выводится отчет со статистикой

Настройка
  • Активируйте действие "Пакетная загрузка файлов" на кнопке формы
  • В поле "Запрос-источник" выберите запрос с файлами
  • В поле "Поле с файлом" укажите поле типа "Файл"
  • В поле "Папка для сохранения" выберите целевую папку (необязательно — если не указать, при выполнении откроется диалог выбора)

Настройте дополнительные параметры:
  • Сортировать по расширениям файлов — создает подпапки для каждого типа файлов
  • Пропускать файлы с одинаковыми именами — при включении дубликаты не сохраняются
  • Открыть папку после сохранения — автоматически открывает папку с файлами

Примечания
  • Расширение работает только с запросами (TdxQueryGrid)
  • Поле с файлом должно иметь тип "Файл"
  • Поддерживаются все типы файлов (без ограничений)
  • Файлы без расширения сохраняются в папку no_extension
  • При копировании файлов сохраняется дата изменения
  • Если папка для сохранения не указана в настройках, при выполнении открывается диалог выбора папки

Известные ограничения
  • Не работает с полями типа "Файл" в обычных формах (только запросы)
  • Не поддерживает выгрузку файлов из подчиненных форм
  • При включенной опции "Пропускать дубликаты" сравнение происходит по полному имени файла
Pozharskiy1991
104 Нажимаем нужную кнопку запроса Довольно простой, но меня выручает во многих ситуациях. Раньше этот скрипт обсуждался уже. Сейчас допилил под свои нужды. Может быть кому-то пригодиться.

Code: Выделить всё

 {@action
Id=D854ACB6-91B9-4294-9740-2312CB8E9009
OrigName=SW_GridBtnClick
Name=Нажатие кнопки запроса
Group=Admin
UI=
<ui>
 <query name="_mycmp" caption="Выберите запрос"/>
 <list name="_myList" caption="Выберите кнопку" Items="Добавить;Редактировать;Удалить;Перейти;Обновить"/>
 <checkbox  name="lastExpr" caption="Перейти к последней записи"/>
</ui>
Description=Нажатие необходимой кнопки в запросе.
@}



procedure SW_GridBtnClick(QueryName:variant;It:string;Lex:boolean);
var
   QGrid:TdxQueryGrid;
   Qi:integer;
   begin
if It = 'Добавить' then Qi:=0
  Else
if It = 'Редактировать' then Qi:=1
  Else
if It = 'Удалить' then Qi:=2
  Else
if It = 'Перейти' then Qi:=4
  Else
if It = 'Обновить' then Qi:=6;
    QGrid:=Self.Queries[QueryName];
    QGrid.PopupMenu.Items[Qi].Click;
if Lex = true then QGrid.movelast;
end;
SirWolf
105 Настройка панели кнопок в главном окне Действие запуска. Позволяет выполнить кастомные настройки панели кнопок
главного окна программы.


Изображение

Возможности и опции текущей версии:

Опция позволяет изменить размер иконок до размера, указанного в списке.
Изображение
Устанавливает внутренний отступ от иконки до края кнопки и в сумме с размером иконки определяет итоговый размер кнопки на панели.
(Т.е расчет: иконка = 16px + отступ = 4px (*2) = 24px)
Изображение
Скрывает кнопки навигации для всех форм, кроме "Только форма" (т.к. в этом режиме они логически необходимы)
Изображение
Перемещает панель кнопок в форму. Примерный вид:
Изображение
Устанавливает фоновый цвет панели. Доступны цвета:
  • Системный (по-умолчанию)
  • Белый
  • Серебряный
  • Желтый
  • Кремовый
Изображение
При включенной опции панель кнопок очерчивается границей по периметру.
Изображение
new:
Опция позволяет указать путь к папке с иконками. (При указании каталога - игнорируются встроенные иконки и папка должна содержать весь набор!) Имена иконок должны соответствовать определенным индексам (пример набора иконок в приложенном архиве). Рекомендуется устанавливать размер иконок соответствующим разрешению либо кратным числу 2 (например иконки размером 32px желательно уменьшать до 16, а иконки 48px - до 24 или 12px соответственно).
Изображение

Примечание: панель кнопок в режиме "Простая форма" при подключенном расширении скрывается и опция "показать" отсутствует за ненадобностью...

В следующих версиях:
- Встроенные наборы иконок.
- Установка собственных иконок из файла
- Кнопка "Скопировать"
- (может быть) Управление видом фильтра при его изменении, кнопка сброса фильтра


---
Пожелания, предложения?
Develop-Soft
106 Обновление текущей формы Добавляет в расширение DX PLUS действие для кнопки - обновление текущей формы.
Обновление текущей формы.epas
VdoVin
107 Обработка массивов Модуль обработки текстовых массивов.

Функции:

A_ROUNDTO выполняет округление числа (текстового массива чисел, с разделителем ";") до указанного количества знаков после запятой.
A_DATE выполняет преобразование даты (текстового массива дат, разделенных точкой с запятой ";") вида 2018-11-27 в 27.11.2018
Изображение
Обе функции рекомендуются для обработки данных запроса, полученных методом "Соединить" и "Соединить все" (создается вычисляемое поле, в нем применяется функция, реальное поле скрывается в настройках).

Пример использования

Скачать:
Обработка массивов.zip
Гocть
108 Округление в большую сторону Маленькое расширение. Добавляет функцию округления с тремя вариантами: вверх, вниз и по математике.
Можно подключать, как внешний модуль и использовать в своих скриптах.
Megabyte
109 Онлайн переводчик Доброго вечера!

Наткнулся на интересный сервис перевода, сделал под него расширение.
Пользуйтесь!
Runenkov
110 Открыть ссылку на сайт в настольной и веб-версии Сделал небольшое расширение - действие для кнопки, которое открывает ссылку на сайт.

но надо доработать переход в веб-версии, потому что открывается ссылка в этой же вкладке
cordek
111 Открыть форму запроса (контекстное меню) Расширение позволяет открывать формы запроса если в запрос можно вывести ID записи формы.

Действие формы создает кнопку в контекстном меню запроса для открытия указанной формы с возможность задания условия видимости и доступа кнопки. Также можно назначить открытие формы по двойному клику.

Описание и пример действия:
Описание действия открытия записи в запросе.png


Пример отображения в контекстном меню:
Контекстное меню запроса.png


Файл с расширением:
Открыть форму запроса (контекстное меню).epas
shavkat
112 Отправка письма на e-mail Расширение для отправки письма на e-mail.
По введенным параметрам создается и запускается скрипт отправки на PowerShell.
Возможности:
- отправлять нескольким получателям и отдельная отправка.
- указание получателей копии и скрытой копии.
- отправка нескольких вложенных файлов с последующим удалением.
- вывод прогресса в консоли PowerShell и вывод окна ожидания.

Полное описание действия:
Описание действия.png


Расширение:
Отправка письма на e-mail.epas
shavkat
113 Отрицательные числа красным цветом Действие формы. Устанавливает для всех числовых полей текущей формы (родительской или подчиненной) условное форматирование: "отрицательные числа красным шрифтом".
Раскраска при использовании этого модуля работать НЕ будет!
screen.JPG

Отрицательное красным.epas.zip

версия с исправлением от 27.08.2018
Гocть
114 Очень простые расширения от Kiss'a
TabVis.zip
Управление компонентом "Закладки" на форме.
- (группа: Компоненты форм)
TabVis - Скрывает Закладку, если условие ЛОЖЬ, Показывает обратно, если условие ИСТИНА
Параметр 1 - Текст - Имя компонента (конкретной закладки)
Параметр 2 - Условие
TabVis('dxTabSheet1',[Число]=1)
-
TabAct - Активирует Закладку, если условие ИСТИНА
Параметр 1 - Текст - Имя компонента "Закладки"
Параметр 2 - Текст - Имя компонента (конкретной закладки)
Параметр 3 - Условие
TabAct('dxPageControl1','dxTabSheet1',[Число]=1)
-
Random.zip
Генератор случайных чисел.
- (группа: Математика)
Rand - Возвращает случайное число
Параметр 1 - Число - От
Параметр 2 - Число - До
Rand(1,10)
-
FileEXT.zip
Извлекает из пути к файлу его расширение.
- (группа: Текст)
FExt - Возвращает расширение файла
Параметр 1 - Текст - Путь к файлу
FExt('D:\Моя.любимая_песя.mp3')
Результат - текст - .mp3
-
ЗЫ. Все эти функции просто выведены из движка без наворотов и проверок. Я не мастер писать скрипты (извинити-простити), но эти расширялки как-то пригодились и до сих пор работают)) Может пригодятся еще кому-нибудь.
Kiss
115 Очистка фильтра формы по нажатию кнопки Действие (action) - очистка фильтра формы по нажатию кнопки
Автор: drts
Версия: 1.0 от 12.03.2018 г.
Добавляет действие в группу поиск и фильтрация, позволяющее очистить все установленные фильтры в форме (включая дочерние)
drts
116 Перевод времени в миллисекунды Недавно нужно было решить нестандартную задачу, связанную с спортивными соревнованиями.
Была написана такая функция, для перевода строки формата "00:00:00.00 в миллисекунды.
SirWolf
117 Переворот строки Простая функция, которая переворачивает строку слева направо, единственная особенность, то что она написана ChatGPT
Переворот строки.epas

Думаю, это может открыть дополнительные возможности, тем кто не умеет в программирование, а хочется писать что то эдакое.
rausNT
118 Периодический нумератор Действие формы.
Нумератор с настраиваемыми параметрами в пределах: Год; Квартал; Месяц; Неделя; День или сквозная нумерация (также срабатывает, если не указана дата). Имеется опция блокировки полей "Номер" и "Дата" (защита от изменений и ввода "задним числом")

Периодический нумератор_v0.2.zip


Периодический нумератор (0.1).zip
Develop-Soft
119 Печать с постобработкой (на основе готового расширения от Dataexpress) Расширение сделано на основе:
https://forum.mydataexpress.ru/viewtopic.php?f=16&t=3598
Механизм объединения скопирован из исходного расширения.

Действие кнопки, позволяет сформировать документ и провести объединение ячеек. Отличие от исходного в том, что расширение не подключается при печати, а печать и постобработка происходит сразу.
Word 2021 некорректно работал с исходным расширением.
Megabyte
120 Плоское файловое хранилище (filestore2) Является альтернативой "Хранилища файлов".
Отличается плоской структурой хранения, один файл - одна запись. Для получения списка файлов, надо делать запрос. Пример во вложении.
Служит для группового или одиночного добавления файлов в базу данных.
Открывает окно выбора файлов для загрузки в базу. Выбранные файлы
добавляются в базу данных и находятся в форме FileStore2 (во вложенном примере).
Можно использовать после действия альтернативная печать, прописав result в выражении "Путь к файлу"
Дополнительно действие ищет электронную подпись. Если подписать файл открепляемой электронной подписью, то формируется файл "имя файла.расширение".sig, если такой файл есть, действие подгрузит его в отдельное поле и поставит галочку "Подписано" (смотрите пример формы FileStore2)
cordek
121 Поиск и отображение дубликатов записей Находит и показывает дубликаты записей (повторяющиеся записи) на форме. В настройках кнопки нужно выбрать поле, по которому будет происходить поиск. jurist23rus
122 Поиск по всем полям во всех формах Изображение

Возможности:

1) фильтр по всем видимым в Grid формы полям (выбрать поля для поиска или для исключения из поиска можно в "действия формы" )
2) значения фильтра формы учитываются
3) ESC-очистить поле поиска, Ctrl+F в grid формы-фокус в окно поиска
4) сохранение истории поиска для каждой формы отдельно
5) нажатие правой кнопкой мышки на "X" - сброс фильтра формы и поиск
6) настройка задержки старта поиска после ввода (актуально при больших объемах информации или медленном соединении с базой)
7) кнопка вниз на поле поиска - переход на grid формы, кнопка вверх в grid формы при выделенной первой строке - переход в поле поиска
8) на простой форме: значения поиска записывается в переменную kok80.QueryFilter (название переменной можно задать в настройках), форма обновляется.
Пример использования в фильтре запроса на простой форме: [?!адрес]==GetVar("kok80.QueryFilter")
9) Поиск в окне списка объекта
10) Поиск в запросах

Установка:
после импорта модуля выполнить: дизайнер - действия при запуске - вставить действие - поиск

Известные ошибки/недоработки:
- в дереве при выборе неверхней node отображает пустой результат поиска
ps здесь всегда ссылка на последнюю версию:

kok80-poisk3.00.zip [ Изображение Скачать ]

................................
Демо


Замечания, предложения ?

...
kok80
123 Постпечатная обработка в Word Модуль позволяет выполнять дополнительную обработку сформированного в процессе печати документа Word. Для обработки документа программа подключается к открытому документу по технологии OLE. Для работы модуля необходим установленный Microsoft Word. От вас требуется только подключить действие формы и настроить параметры, все остальное сделает за вас программа.

1. Объединить одинаковые ячейки в Word - действие формы. Объединяет ячейки с одинаковым текстом по вертикали. Объединение может зависеть от соседних ячеек в строке или быть независимым. В параметрах указываете идентификатор таблицы - любое слово или символ в первой ячейке таблицы. Идентификатор должен располагаться перед основным текстом ячейки и отделяться пробелом. Все таблицы с данным идентификатором будут обработаны. Также в параметрах указываются номера столбцов, в которых будут объединятся ячейки. Более подробную информацию о настройке вы можете прочитать в редакторе действий.
admin
124 Прибавление рабочих дней Сделал функцию, которая ищет дату через n-рабочих дней
Для работы нужно создать форму calendar, в которой будут выходные дни.
данные скачивал отсюда https://xmlcalendar.ru/index.php?country=ru
В примере указано как загружать из csv


Пример
ADDWORKDAY5.zip


Расширение
ADDWORKDAY5.epas.zip


Данные с выходными днями
Выходные дни.zip


В этой теме постараюсь выкладывать соответствующие файлы с выходными днями на каждый год.
cordek
125 Приложение "DX Модули" Это отдельное приложение, основная цель которого собрать все модули в одном месте для удобства их использования и поддержки.

Возможности:
- установка, удаление и обновление модулей для вашей базы данных, парой кликов мыши.
- тут же можно почитать описание модуля или перейти на страницу модуля (как правило, это форум)
- разработчики модулей могут достаточно легко добавлять новые модули или их новые версии в программу

- для добавления (обновления) модуля нужна простая регистрация (только адрес электронной почты и любой логин) - это сделано, чтобы контролировать манипуляции с модулями. Пользовательская работа с модулями (установка, обновление, удаление) не требует никаких регистраций.
- любой модуль должен содержать раздел {@module ... @}
- для идентификации модуля нужно указывать его ModuleID (это обычный GUID) в разделе {@module ... @};
Например:

Code: Выделить всё

{@module
Author=Павел Дуборкин
Version=1.3
Description=Видимость/доступность компонентов по условию.
ModuleID=e14082d7-d5f9-4256-bd55-716e93582457
@}


Только для Windows, от Vista и выше.


Для установки нужно перейти по ссылке и следовать инструкциям.
- установка корректно работает только из штатных браузеров Windows (Internet Explorer, Edge).
(В Opera точно будет ошибка, в остальных не проверял)
- при установке будет дополнительно поставлен Net Framework 4.7.2, иначе работать не будет.
- запуск через ярлык на рабочем столе или в меню пуск;
- удаление через системную утилиту "Установка и удаление программ".
jurist23rus
126 Проверка в чем работает пользователь, веб-сервер или настольное приложение Для удобства кастомизации интерфейса сделал функцию WEBVIEW
функция возвращает true или false в зависимости от того открыта база через веб-сервер или нет.
Может пригодиться для настройки разных интерфейсов форм с помощью действия Видимость компонентов по условию.
Если выводим надпись, то код такой

Code: Выделить всё

IIF(WEBVIEW, 'Веб-сервер', 'Настолка')


Если используем действие Видимость компонентов по условию, то просто пишем в условии WEBVIEW
cordek
127 Проигрывание звука и озвучивание текста Windows Расширение «Мультимедиа»: Фоновый звук (WAV) и Синтез речи (SAPI)

Предлагаю простенькое готовое расширение для DataExpress, которое добавляет две функции для взаимодействия с пользователем с помощью звуков и голоса. Обе функции работают в фоновом режиме (асинхронно) — программа не подвисает во время воспроизведения, и пользователь может сразу продолжать работу.

Основные фишки модуля:
  • Умные относительные пути — функции не привязаны к конкретному диску или папке (базу можно носить на флешке).
  • Всеядный синтаксис слэшей — модуль сам исправляет прямые веб-слэши / на обратные виндовые \.
  • Синтез речи без файлов — робот говорит любой переданный текст встроенным голосом Windows (SAPI), искать и скачивать аудиофайлы больше не нужно.
  • Защита от сбоев — если в операционной системе вырезан голосовой движок, программа не выдаст ошибку, а просто пропустит шаг.


Как использовать в проекте:

После добавления расширения функции появятся в Дизайнере выражений в группе «Мультимедиа».
Их можно использовать в действиях кнопок без написания кода формы или вызывать по условию.

Примеры вызовов:

Code: Выделить всё

// Проиграть файл ding.wav из папки tools, которая лежит рядом с DataExpress.exe
PLAY_SOUND('/tools/ding.wav')

// Озвучить событие голосом робота (используется стандартный русский голос Windows)
SAY_TEXT('Появилась новая информация')



Код расширения:

Code: Выделить всё

{@module
Author=
Version=1.0
Description=<b>Модуль Мультимедиа</b><p>Добавляет в систему функции фонового воспроизведения звуковых файлов (WAV) с автоматической обработкой относительных путей и голосового оповещения через встроенный синтезатор речи Windows (SAPI).
@}
{@function
OrigName=PLAY_SOUND
Name=PLAY_SOUND
Args=v
Result=
Group=Мультимедиа
Description=Процедура проигрывания звука с поддержкой относительных и абсолютных путей.<p><b>Параметры:</b> путь к имени аудиофайла (можно использовать / или \)<p><b>Пример:</b><p><code>PLAY_SOUND('/tools/ding.wav')</code><p><code>PLAY_SOUND('C:\Windows\Media\tada.wav')</code>
@}
function PlaySound(pszSound: PChar; hmod: WORD; fdwSound: integer): boolean;
external 'PlaySoundA@winmm.dll stdcall';
var GlobalVoice: Variant;
procedure PLAY_SOUND(v: variant);
var
  FullPath: String;
  i: Integer;
begin
  if (v = Null) or (VarToStr(v) = '') then Exit;
  FullPath := VarToStr(v);
  for i := 1 to Length(FullPath) do
    if FullPath[i] = '/' then FullPath[i] := '\';
  if (Length(FullPath) > 0) and (FullPath = '\') then
    Delete(FullPath, 1, 1);
  if Pos(':', FullPath) = 0 then
    FullPath := ExtractFilePath(Application.ExeName) + FullPath;
  PlaySound(PChar(FullPath), 0, 1);
end;
{@function
OrigName=SAY_TEXT
Name=SAY_TEXT
Args=v
Result=
Group=Мультимедиа
Description=Голосовое оповещение (синтез речи Windows). Робот произнесет переданный текст.<p><b>Параметры:</b> Текст для озвучки<p><b>Пример:</b><p><code>SAY_TEXT('Появилась новая информация')</code>
@}
procedure SAY_TEXT(v: variant);
begin
  if (v = Null) or (VarToStr(v) = '') then Exit;
  try
    if VarIsEmpty(GlobalVoice) then
      GlobalVoice := CreateOleObject('SAPI.SpVoice');
    GlobalVoice.Speak(VarToStr(v), 1);
  except
  end;
end;
mobmk
128 Пропорциональное распределение суммы по таблице Данное расширение распределяет заданную сумму, пропорционально суммам таблицы.
Может прибавлять и отнимать долю, от текущего значения таблицы.
Применяется для пропорционального распределения скидки или наценки на товар.
Результат вычисления можно выводить в отдельное поле таблицы, либо взаимодействовать с полем суммы например сразу прибавлять или отнимать значение.
На что нужно обратить внимание:
- Числовые поля должны быть достаточной точности (кол-во знаков после запятой).
- Если поле перезаписывается, с функцией прибавить или отнять, то предусмотреть повторное нажатие кнопки.(например используя флажок "Скидка предоставлена").
Функция подключается к действиям кнопки, раздел "Инструменты".
22.05.2023 - Мелкие правки, прокоментировал код.
Vofka18
129 Просмотр данных в браузере Модуль позволяет просматривать данные в браузере на любом устройстве. Состоит из двух действий при запуске.

1. Запуск веб-сервера.
Действие запускает веб-сервер, обеспечивает работу остальных действий модуля, отображает стартовую страницу. Стартовая страница содержит ссылки на отображаемые в браузере запросы.
Порт - порт, используемый веб-сервером. По умолчанию 80. Убедитесь, что порт разрешен брандмауэром.
Стартовая страница - произвольный текст, который должен быть введен в адресной строке браузера для доступа к странице. Например, если значение равно: /MyData/index.html, то адрес может выглядеть так: http://127.0.0.1/MyData/index.html.
Заголовок отображается на стартовой странице.

2. Просмотр запроса в браузере на мобильном устройстве.
Расширение позволяет просматривать данные запроса в браузере. Страницы адаптированы для просмотра на мобильном устройстве: смартфоне или планшете. Данные отображаются в открытой части и закрытой (в подробностях). Чтобы посмотреть подробности, коснитесь изображения глаза. Если дважды тапнуть по экрану, появится панель итогов и кнопки для доступа к фильтру и перехода на стартовую страницу. Если повторить действие, то панель и кнопки исчезнут. Чтобы отфильтровать данные, нажмите кнопку фильтра. Введите параметры и нажмите кнопку "Применить". Вместо разделителей даты, времени и дробной части числа можно вводить пробел.

При первом обращении к странице создается сессия. Если в течении 15 минут не было обращений к серверу, то сессия закрывается. При следующем открытии сессии фильтр будет иметь значения по умолчанию.

Путь - произвольная строка, которая вводится в адресной строке браузера для доступа к запросу. К примеру если значение равно: mydata, то строка в браузере может выглядеть так: http://127.0.0.1/mydata. Путь не должен содержать вопросительный знак.
Форма - форма, где расположен запрос.
Запрос - запрос, данные которого будут отображены в браузере.
Максимальное количество записей - число записей, отображаемых в браузере. Если фактическое количество записей больше, то в конце списка будет соответствующая надпись.
Поля запроса - поля запроса, отображаемые в видимой части.
Поля в подробностях - поля запроса, отображаемые в скрытой части.
Поля итогов - поля формы, значения которых будут показаны, если дважды тапнуть по экрану.
Поля фильтра - поля формы, используемые для фильтрации запроса и отображаемое на странице фильтра.
Обязательное - поле фильтра может быть обязательное для ввода.

Изображение Изображение Изображение Изображение

1.1 - внесены правки для совместимости с DataExpress от 31.03.2019.
1.0 - первая версия

WebExt.zip
admin
130 Работа с закладками Несколько расширений для работы с закладками.
- Применяется на форму, позволяет скрыть панель с закладками.
- Применяется на кнопку, позволяя назначить нужную закладку.
SirWolf
131 Работа с произвольным SQL запросом в таблице Вот здесь находится расширение Отрисовка произвольного SQL запроса SQL отрисовка произвольного запроса
Однако бывает необходимость подредактировать данные SQL запроса, а также распечатать.
Хорошим вариантом, было бы запись результатов в таблица (dxGrid), чтобы можно было как редактировать, так и печатать стандартными средствами.

Моих сил пока хватило только на явную запись значений в поле таблицы. То есть взял поле таблицы table['1'], записал в него sql.field[1]
и так далее/
Явно это не то, чего хотелось бы.
Желательно было бы создавать поля и записывать автоматически.
cordek
132 Работа с регистрами 1. Копировать в регистр
Расширение копирует данные формы и ее подчиненные данные в другую форму, называемую регистром. Это позволяет решать некоторые задачи, в которых имеется три уровня подчиненности данных: Операция->Изделие->Комплектующее, Меню->Блюдо->Продукты, Операция->Услуги->Работы, материалы и т. д. Возможности запросов ограничены, они могут извлекать данные только из двух уровней подчиненности: формы и таблицы. Но если в таблице есть объекты, которые имеют какой-то состав (например, изделие состоит из комплектующих), то запрос не может получить этот состав. Для этого приходилось связывать формы запросами и использовать свойство объекта "Заполнить таблицу". Вместо этого можно просто копировать нужные для анализа данные в отдельную форму и использовать простые запросы для получения результатов. При этом интерфейс программы заметно упростится, т. к. будет избавлен от лишних элементов.

2. Записать в регистр остатков
Реализация хранения итогов в форме, называемой регистром остатков. С помощью этого действия вы сможете, к примеру, вычислять остатки товаров на текущий момент. Это альтернатива вычислению остатков с помощью запроса. Запросу приходится каждый раз просматривать таблицы, чтобы вычислить остатки. Если данных много, это может занимать некоторое время. В регистре остатки уже рассчитаны и их получение происходит практически мгновенно. Расчет остатков происходит при сохранении и удалении записей. Действие ищет в регистре соответствующую запись и меняет в ней числовое поле: увеличивает или уменьшает значение в зависимости от выбранной операции. Если запись не найдена, то она добавляется. Действие может предупреждать об отрицательных остатках. Предупреждение отображается в окне вывода.
admin
133 Раскраска выбранным цветом 1. Действие формы "Выбрать цвет из списка". Добавляется возможность выбрать цвет из списка. В табличной части формы цвет отображается в ячейке или окрашивается вся строка.
2. Действие формы "Раскрасить запрос". Отображение выбранных цветов в запросе.
admin
134 Раскраска компонентов по условию Надеюсь многим будет полезно расширение. Возможно некоторые будут рады так же как я :D xxDeMoXxx
135 Распознавание документов (Doc Recognizer) Позволяет пользователю упростить задачу внесения сведений в базу данных, путём распознавания сканов (фотографий) документов. Модуль знает несколько шаблонных документов, например, паспорт или водительское удостоверение (список постоянно дополняется), в которых он самостоятельно находит нужные сведения и записывает их базу данных. Для документов с фотографией, (например, паспорт) возможна обрезка фото и вставка его в поле формы «Изображение».

С последним обновлением можно распознавать любой документ и выбирать из него именованные сущности (даты, адреса, наименования, людей, всякие реквизиты типа ИНН и прочее).

Короткое демонстрационное видео

Скачать само расширение и демонстрационную базу данных, ознакомиться с документацией WIKI

Сервис закрыт для общего пользования. Те кто хочет продолжить пользоваться обращайтесь в личку или на почту mail@dataexpress.wiki.
jurist23rus
136 Расчетная форма Реализация функционала, как в этом видео. Есть некая форма, в которой пользователь свободно редактирует какие-то параметры (например работы/услуги) и в таблице считается итог. admin
137 Расширение "Управление окном списка объекта" Доброго времени суток!
Данное расширение позволяет управлять окном списка объекта.
В расширении задаются видимые поля в окне списка, а также нужная сортировка.
dm2002_2002
138 Расширение Label в стиль ссылки + выражение при клике Расширение формы. Подсвечивает список Label в стиль ссылки голубым цветом, выводит подчеркивание и изменение цвета при наведении. Возможность прикрепить выражение при клике. Если есть уже прикрепленные скрипты к данной лейбе они будут выполнены. Третий параметр указывает выполнять сначала скрипт или выражение в расширении.

Обновлена версия 1.1: исправлена ошибка при многоразовом закрытии открытии набора данных и одновременном вызове формы в разных окнах.

В комплект к данному расширению добавлю функцию Переход на форму (из любого типа ViewType), в комплекте может быть создано полноценное меню на форме.
Иван
139 Расширение Main сброс подвисшей записи Расширение Main. Снимает блокировку записи из таблицы dx_lock если на нее переходит тот же пользователь или запись в режиме блокировки более 15 минут и на нее переходит какой либо пользователь. Иван
140 Расширение SQL Tree + календарь Добрый день. Пишу расширение меню поиска методом формирования SQL запроса со всеми параметрами, для случая больших БД (добавление всевозможных фильтров, полей поиска, чекбоксов, деревьев групп и т.д.). Есть ошибка которую никак не могу отловить. Если на форме "календарь" открыть один раз форму то все хорошо. При повторном открытии возникает ошибка, скрин прикрепил. Ошибка возникает если установлена галочка для создания деревьев групп. Если только календарь создавать то ошибки нет. Возможно подскажете где искать.

В базу было добавлено 500 тыс. записей для проверки скорости работы потому добавляю ссылкой на дропбокс.

По ссылке рабочий вариант расширения на демо базе уже без ошибок. Как нормально описание сделаю выложу отдельно. Пока что на примере думаю кому нужно разберутся.
.....................................................................
Обновлена версия модуля в примере от 15.04.2020

(совместим с пред версией, можно просто заменить текст скрипта и заполнить те поля что появились (добавлено возможность выбора полей в таблице, ранее они должны были быть таким же названием что и поле источник и их не выбирали))
https://www.dropbox.com/s/oid8dhv0fa9me ... O.rar?dl=0

Добавлено дополнительные возможности фильтрации (в SQL прописывая дополнительный фильтр для полей сравнений), исправлено ошибки, ускорена работа, добавлено детальное описание большинства пунктов.
Иван
141 Расширение активен один чекбокс списка Выбираете список чекбоксов. Кликая на один из них другие будет занулять.
Если указано Один всегда активен и установлен флажок во втором параметре одного из чекбоксов списка то если убрать галочки со всех чекбоксов он становится активным и не доступным для клика пока не будет выбран один из других чекбоксов.

Версия 1.1: исправлено совместимость с модулем видимость и доступность.
Иван
142 Расширение всплывающее окно настроек формы Всплывающее окно настроек. Выбираете надпись/кнопку при клике на которую будет всплывать окно настроек содержащее
выбранный TdxGroupBox. Если указать "Высота формы равна TdxGroupBox.Top + 50" как true при показе окна формы ее размер будет уменьшен по верхней грани группы TdxGroupBox (актуально если размещаем группу внизу формы под всеми элементами).
При нажатии на кнопку/надпись TdxGroupBox будет показывать на всплывающем окне.

Версия 1.1: Исправлены ошибки.

Версия 1.4: Исправлены ошибки. Добавлена совместимость с расширением обновления запросов на закладках
Блокировка доступа к настройкам можно снять:
1. установить влажок не использовать блокировку в настройках самого расширения.
2. задано глобальный парамс MainWindow.Params['Открывать настройки'] истина.
3. задан локальный парамс формы self.Params['Открывать настройки'] истина.
4. указано выражение в настройках расширения и оно равно истина.
Иван
143 Расширение генератор штрихкода и QR-кода Расширение для кнопки. Создан на основе библиотеки что поддерживает все типы штрихкода zint_win32_2.8.0. Расширение работает автономно. Код написан по примеру функции "Генератор QR-кода offline". Добавлено ряд настроек внешнего вида.

При первом запуске будет создана утилита [Каталог-DataExpress]\ext\Barcode\BarcodeZint.exe. В процессе генерации изображения будет создан временный файл картинки в папке temp пользователя Windows. После его загрузки в базу он будет удален.

В зависимости от настроек генерирует необходимый формат штрихкода. Несколько основных уже прописаны в выборе списка при настройке (если ничего не выбирать будет генерировать CODE 128). Другой тип (помимо тех что уже прописаны в настройки расширения) можно прописать в кастумном поле2 числом, посмотрев номер отвечающий нужному типу (добавлено в описание расширения).

Версия 1.2 - исправлено дублирование штрихкода в случае размещения на одной форме несколько картинок и кнопок с подключенным расширением.

Версия 1.3 - исправлена ошибка возможности настройки расширения после обновления версии ДХ.

Версия 1.4 - исправлена ошибка создания кастумных типов штрихкодов.

Demo
https://www.dropbox.com/s/4ja6ihx22uu7b5i/DEMO_Barcode.FDB?dl=0
Иван
144 Расширение для работы с виртуальными таблицами Всем доброго времени суток.
Данное расширение (представленного в демо), еще не закончено и не доработано, поэтому не спешите его добавлять к работающим проектам БД.
Выкладываю его, в большей части, на правах обсуждения, решения, которое в нем применено. Т.к. чем дольше я его разрабатывал, тем больше сомнений меня посещало(а будет ли польза? а не будет ли вреда? и в целом имеет ли смысл?).
Ну теперь к сути. Данное расширение подключается в действии при запуске. После чего появится кнопка в панели инструментов (или также настройки можно отобразить через подключение к обычной кнопке).
Далее можно перейти к настройкам.
В окне настроек есть поле для ввода SQL запроса(синтаксис толко SQL). В это поле можно ввести любой запрос, или можно скопировать текст запроса из готовых на форме(выбрать форму->выбрать запрос).
Далее выполняем запрос, заполняем данные в таблице справа, и нажимаем сохранить таблицу. Будет создана виртуальная таблица(далее ВТ) в базе данных. Вот тут я не совсем компетентен... Как это понял я: Виртуальные таблицы, это таблицы с "постоянно открытым набором данных". При внесении изменений в формах, которые участвуют в отборе для ВТ, данные в ВТ меняются автоматически (на стороне сервера), т.е. в ней данные всегда актуальны, чем я и подкупился...
Взаимодействовать с ВТ можно через SQLExecute.
Само же расширение позволяет написать запрос для получения значения для каждого поля ВТ, и далее в выражении можно использовать функцию GETVAL_VT, в которую нужно передать определенные параметры(там есть описание), и на их основании будет сформирован запрос к ВТ и получен результат.
Собственно вопрос к знатокам и не только:
1) Не будет ли больше вреда чем пользы от такого подхода?
2) Может я где-то не с той стороны зашел (прислушаюсь к советам, по изменению логики работы).
3) Хотелось бы услышать мнение, стоит ли его далее кодить? Найдется ли ему практическое применение? А то я уже если честно сомневаюсь...

Ну и в завершении хочу отметить, что ВТ не удаляются из БД после перезапуска, поэтому если надо удалить расширение, следуйте инструкции в кнопке на панели инструментов.
Vofka18
145 Расширение для хранения файлов Расширение не претендует на профессиональное, т.к. по факту хранит файлы в папках на диске, поэтому их может быть очень много... Но предусмотрены функции очистки и архивирования файлов. И в дальнейшем чтобы восстановить файлы, нужно просто распаковать архив в папку хранилища.
Данное расширение, позволяет прикреплять к форме любые файлы. Файлы хранятся только на диске
в указаной папке.
В первую очередь нужно подключить действие "При запуске", оно является действием настроек, далее нужно подключить
соответствующие действия (действия формы) в формах
(к которым планируете прикреплять файлы), и кнопках(для экспорта файлов) если необходимо.
Также добавятся некоторые функции в выражениях, для работы с данным расширением.
Поддерживается "перетягивание файлов на форму".
В принципе в нем нет ничего особенного, по факту просто аналог ctrl-C/ctrl-V, в более удобном представлении.
Тестирую данное расширение пару месяцев, но досконально все функции еще не проверил (их много получилось).
В целом в расширении старался максимально подробно все прокомментировать в описаниях функций.
Если будут проблемы в работе , постараюсь их оперативно исправить.

Обновил файл расширения, исправил несоответствия настроек при экспорте файлов через отдельную кнопку.
Vofka18
146 Расширение замена закладок на ссылки Скрывает группу закладок создавая на месте закладок ссылки. Иван
147 Расширение заставка Доброго времени суток!
Пример того, как можно сделать заставку к своей базе.
dm2002_2002
148 Расширение Меню компонента + регистр радиокнопок + видимость и доступность Расширение для создания выпадающего меню для любого компонента формы из произвольным уровнем вложенности. Работает в любом типе FormView. Основные возможности: создать кнопки и радиокнопки. Добавление картинок из галереи. Записать выражение при клике на кнопку или изменении значения радио кнопки. Возможно добавить быстрые клавиши (если для двух меню на одной форме выбрать одинаковую комбинацию будет выполнена первая в списке). Чекбокс "Скрипт" - выполнить скрипт или действие что уже прикреплено, иначе будет занулено. Актуально если прописываем название уже существующей в меню кнопки. Если заполнить все поля после таблиц "регистр", значения радиокнопок будет сохранятся в регистр для конкретного пользователя и при открытии формы их подставлять. При изменении значений радио кнопок значения будут перезаписаны в регистре.

Версия 1.1: исправлена ошибка кастумной сортировки.

Версия 1.2:
- добавлено возможность создать меню радиокнопок соответствующих столбикам запросов или таблиц, включать или отключать их видимость переключая радиокнопку (чекбокс: добавить в меню видимость колонок по значению радиокнопки.).
- значения видимости пишет регистр.
- в меню добавляет только те пункты меню что по умолчанию оставлены видимыми при настройке.
- видимость кнопок меню по значения выражения. Работает только на запросах.
- к видимости и доступности компонентов формы по значению радиокнопки добавлено Только чтение.

Версия 1.3:
- исправлена ошибка совместимости.
Иван
149 Расширение обновление запросов при переходе на закладку Расширение формы. Что бы ускорить открытие формы запросы на вкладках ставите в
ручное обновление (кроме первой на которой будет открывать по умолчанию). Расширение обновляет запросы на активной закладке при переходе. Можно выбрать отображать анимацию обновления или нет. Если на закладке несколько запросов анимация будет показана на одном запросе.

Версия 1.4: исправлена ошибка при многоразовом закрытии открытии набора данных и одновременном вызове формы в разных окнах. Ускорена работа. Обновляет все запросы на закладке.

Версия 1.5: добавлено возможность работы на простой форме. При переходе по записям в режиме таблица + форма активна первая закладка. Картинки декодирует из строки один раз при первом обновлении.

Версия 1.6: исправлена ошибка обработчика OnStateChange.

Версия 1.7:Обновляет все запросы где установлено ручное обновление (на активных закладках) в асинхронном режиме по таймеру. Так же работает для групп закладок на закладках в неограниченной вложенности.

Для разработчиков: Если используете расширение где запрос на закладке размещен на кастумном TWindow то родителя self для TWindow нужно в расширении записать в параметр MyTWindow.Params.objects['parent_form']:= QT.selfT; (Пример в расширении Настройки CustomizationLbl 1.4)
Иван
150 Расширение окно просмотра Доброго времени суток!
Расширение позволяет просматривать при нажатии клавиш Shift+F2 значения поля в отдельном окне.
Если форма находится в режиме редактирования или новой записи, а просматриваемое поле - текст или заметка, то значение поля можно редактировать.
dm2002_2002
151 Расширение открывать формы для запроса нескольких источников Расширение открывает выбранную в настройках расширения форму при клике на выбранный столбик. Для открытия необходимо указать какие поля на форме и в запросе сравнить что бы найти целевую запись.

Доработка: Версия 1.1:
Открывает форму не на одиночный, а на двойной клик.

Доработка: Версия 1.2:
Устранены ошибки совместимости.

Доработка: Версия 1.3:
Для открытия разных форм на один столбик добавлено 3 параметра (если они заполнены то параметры 1, 2, 3 можно не заполнять) -
5й - столбик запроса где добавлено текстовое поле на форме в котором записано название формы.
6й - столбик в запросе где добавлено текстовое поле на форме в котором записано название поля по котором искать.
7й - столбик в запросе где добавлено поле 6, с него получаем значение для сравнения.
Если они заполнены то на один столбик можно прикрепить разные формы и будет
открывать по названию формы и поля в запросе сравнивая значение поля формы со значением с указанным полем запроса.
Для этого на каждой форме нужно создать поля где будет записано название формы и поля с которым нужно работать запросу и их добавить в запрос для каждого источника где нужно открывать разные формы на один столбик.

Доработка: Версия 1.4:
Исправлены ошибки совместимости. Ускорена работа. Добавлено отлов ошибок.
Иван
152 Расширение резиновое поле (несколько полей) Расширение для работы с большими текстами или экономии на размере записей если диапазон длины текста может быть от очень мелкого до огромного. Для работы расширения на форме нужно поле dxMemo, таблица и в ней dxMemo. Эти объекты добавляем в расширение. Указывая размер dxMemo на форме 100 символов и такой же размер в таблице (можно указать и больше но нет особого смысла), при сохранении записи в таблицу будет писать записи по 100 символов пока не запишет весь текст. При открытии формы будет создано виртуальное TMemo и в него скопирует суммарный текст всех записей таблицы. Дальше мы фактически работаем в нем). На форме можно создать произвольное количество таких полей.

Если задать один/оба предпоследние параметры в настройках (ширина и высота) то при клике на Memo будет изменение ширины и/или высоты. При повторном клике вне области Memo размер будет возвращен. Пока мы редактируем с ресайзом другие поля добавленные в расширения будут недоступны для редактирования.
При сохранении записи в поле dxMemo будет записан текст по размеру равному количеству символов что можно в него записать (для удобства просмотра в запросах). Если текст не был изменен то записи в таблице не будет перезаписывать, это особенно ощутимо на записях свыше нескольких сотен тыс. символов.
Галочка скрыть таблицы - скрывает таблицы для пользователя.

Работа со всеми типа TipeView (кроме простой формы, только форма).

Обновление 1.4:
- Если нужно записать из скрипта текст в поле мемо на котором подключено расширение, передаем его в Params с именем равным имени поля_put.
- Если нужно добавить текст к уже существующему имя поля_add .
- Если нужно вернуть текст записанный в мемо - имя мемо_get.

(если сохраняя запись существует один из Params описанных выше будет брать данные из них, после этого зануляет).
Пример:

Code: Выделить всё

T.OpenRecord(114);
T.Edit;
T.Params['Заметка60_add']:= LongStr; // добавили текст к уже существующему
T.Validate; // вызывает процедуру записи  LongStr в таблицу прикрепленную к мемо
T.Post;
NewLongStr:= T.Params['Заметка60_get']; // забрали результат
T.Free;


Модуль написан по примеру кода пользователя Гость Пример: "Резиновое" текстовое поле.

Обновление 1.5:
По примеру модуля добавлена Вставка текста в место нахождения курсора на виртуальных полях.

Обновление 1.6:
Добавлена возможность получения доступа к тексту мемо используя Getvar(имяполя_get). Для срабатывания вычислений необходимо на форме
добавить dxLabel и выбрать его в расширении (который считает количество символов). Именно при вычислении количества символов одновременно происходит перезапись Getvar и
вычисление всех полей где есть Getvar(имяполя_get).

Обновление 1.7:
Свойства вставки текста в место курсора:
Не обязательно выбирать мемо куда будет проивзедена вставка текста (если не выбрано то вставка будет произведена в мемо на котором произвели клик, кликом на родителя мемо (форму или группу) снимаем выделение). Если все же выбрано мемо куда вставлять текст, то оно будет использовано как поле по умолчанию если нет выбранного поля для вставки. Вставка производится в место курсора или замена выделенного текста.

Добавлено ряд свойств, настройку которых можно проводить на родительском мемо поле: ReadOnly, BorderStyle, NumbersOnly, PopupMenu, ShowHint, Color.

Обновление 1.8:
Добавлено совместимость управления видимостью и доступностью посредством модуля EnableOrVisible версии >=1.5.


Обновление 1.9:
Добавлено откат вперед назад по Ctrl + Z/Ctrl + Y (1000 последних изменений поля конкретной записи), выделить все Ctrl + A.
Добавлено меню для управления текстом и cрабатывание копирования текста кнопками.
Иван
153 Расширение связанные объекты (ширина, высота) Расширение позволяет связать две таблицы, запросы или произвольные объекты для изменения размера второго при изменении первого. Работает аналогично тому как растягивать форму. При наведении курсора на область изменения появится соответствующий курсор, при зажатой левой кнопке мышки можно тянуть куда нужно. Если выбрать синхронное изменение то при увеличении первого будет увеличен на столько же второй, если указать асинхронно при изменении первого будет уменьшен второй. Можно указать виртуальный объект (например дерево) что были созданы на объекте, тогда их размер будет аналогично регулироваться. На демо базе расширение добавлено на форму товарооборот. Иван
154 Расширение уникальность поля таблицы несохраненной записи Проверка валидации на уникальность поля в несохраненной подчиненной записи несохраненной/сохраненной формы по отношению к другим записям на данной форме в данной таблице. Нужно добавлять на форме таблицы как расширение формы. Иван
155 Расширение файловая система HTTP + LOCAL Добавлено обновление 1.2:
а. введена функция для считывания CMD ipconfig, а именно получения IP, шлюз, маска сети ПК на котором запускаем клиент. Если данные соответствуют серверу возвращает true.
б. добавлена возможность заполнять свойства сервера в настройках расширений.
в. для работы в сложных сетях добавлено свойство IPlocal (локальный IP ПК в вашей сети на котором запущен сервер). Для работы необходимо создать на сервере в папке установки ДХ файл метку с именем равным IP (пример: 99.999.999.99.txt). Смотрите пример БД.

Расширение состоит из двух модулей, один для сервера, второй для клиента. Так же дополнительно форма с описанием (+ она хранит картинки для кнопок меню запроса). И сама форма файлов. Прикрепил пример БД.

Сервер FilesServerHTTP (действие при запуске)

Cистема отправки/получения/удаления/обновления файлов на сервере через протокол HTTP.

Начало работы:
a. Заполняем аргументы оверрайд функций свойств сервера (смотрите 'Функции файловой системы' в редакторе скриптов, если эти функции заполнены то их параметры и будет использовать расширение во всех формах даже если заполнены соответствующие поля в настройках расширения) или заполняем настройки
в самом расширении (в этом случае нужно заполнять каждое расширение отдельно вручную, но это дает возможность использовать разные сервера для разных форм).

Следующие Функции делают оверрайд над заполненными параметрами в настройках расширений.
SDefBase - корневая папка на сервере для хранилища файлов. Выше нее будут создаваться все папки хранилища.
SDefIP - статический IP или ddns.
SDefIPlocal - IP сервера в вашей сети (может совпадать с IP если не используете роутер).
SDefMask - маска сети сервера.
SDefG - Gateway шлюз сервера.
SDefAPIKey - ключ доступа (произвольный пароль, числа и буквы, без пробелов).
SDefPort - порт (он должен быть свободен и доступен на сервере, иначе выдаст предупреждение). Если сервер включен через роутер, что скорее всего так и есть, нужно сделать проброс порта.
ApiKey - ключ доступ.

b. Расширение будет запущено на клиенте что включен на ПК с параметрами:
а. Соответствуют параметры IP, маска сети, шлюз настройкам сервера и в папке ДХ существует файл метка с именем равным IP (пример: 99.999.999.99.txt).

б. Клиент DX запустил пользователь под именем FileServer (нужно создать вручную). В БД примере уже создано.

Если вы работаете не на ПК сервера то будет включена версия клиента для работы по HTTP иначе версия LOCAL (модуль FilesClientHTTP). Функционал варианта работы LOCAL аналогичен, только работа будет не по сети. Актуально для работы с большими объемами файлов. LOCAL работает независимо от HTTP сервера, данные про подключение ему нужно только для понимания когда запускаться. Для работы LOCAL нужно просто заполнить функции оверрайд или заполнить поля в настройках расширения. Если нет интернета оно все ровно будет локально работать.

Передает файлы стримом в один поток по одному файлу по очереди без какого либо шифрования, подключение по паролю (заполняем функцию SDefAPIKey или поле в настройках расширения), скорость зависит только от скорости вашего интернет соединения. Если операция не удалась вам выдаст сообщение, если включен дебаг то покажет почему именно (дебаг можно отключить в настройках).
В папке с установленным DX в файл ErrorDXF\FilesServerHTTPlog_дата.txt пишет все ошибки, если вы отключили показ debug в настройках расширения то можно посмотреть ошибку в этом файле. Если возникакет ошибка при записи файла проверьте права доступа пользователя к данной папке.
Дополнительная форма 'Описание для файла' хранит в себе картинки для меню и используется при вводе описания файла или изменении имени файла.
При пересылке по HTTP текста он кодируется заменой на дозволенные символы, при получении на сервере раскодируется назад. Итого запрещенных символов в текстах нет.

Клиент FilesClientHTTP (установка на каждую форму + копируем туда запрос)

Файл идентифицирует: установленной в расширении корневой папкой хранения на сервере, именем, названием формы и идентификатором формы recID.

Модуль работает в двух режимах:

А. Работа на сервере LOCAL
Расширение будет запущено если параметры IPlocal, маска сети или шлюз не соответствует серверу или не найден файл-метка.
Работа с файлами проходит локально на ПК, актуально для работы с большими файлами.
По имени файла или описанию нет ограничений по символам (в именах - кроме тех что в принципе не могут быть пропущены Windows).

Б. Работа по HTTP

Расширение будет запущено если параметры IPlocal, маска сети, шлюз соответствует серверу и на ПК существует файл метка. Работа с файлами проходит по протоколу HTTP.
При скачивании файла на клиент он будет сохранен в папке 'Имя пользователя_файлы'\форма\idrec в локальной директории установки DX. Если файл удален после просмотра и папка пуста она будет удалена.

Большинство возможностей аналогичны для HTTP и LOCAL.
Возможности:

1. скачать для просмотра файл из сервера (для скачивания и просмотра - двойной клик по записи в запросе). Для версии работы на сервере просто открывает файл для просмотра.
2. открыть папку с файлами с выделенным целевым файлом. Если удаленная работа и файл еще не скачан будет предложено его скачать.
3. добавить файлы в хранилище сервера создав соответствующую запись в БД (бросая на форму или кнопкой).
4. создавать в БД записи о файлах что были вручную добавлены на сервере (можно выбрать при настройке. Действие происходит при открытии формы из запросом. Если у вас не стабильный интернет лучше отключить иначе будет подтормаживать).
6. добавить описание до 100 символов, нет запрещенных символов (если в настройках расширения выбран чекбокс на форме для активации всплывающего окна описания.
Если при это на форме описания файла поставить галочку 'Применить ко всем файлам' то описание будет добавлено ко всем добавленным за раз файлам).
7. удалить файлы (при этом в настройках расширения можно выбрать удалять файлы безвозвратно или создавать перейменованную версию что не видит (по умолчанию) запрос, но их можно просмотреть нажав в меню запроса 'Отображать удаленные файлы'). Удалить уже помеченные на удаление через ДХ нельзя, для этого добавлен фильтр.
Если на локальном ПК есть уже скачанная версия будет предложено удалить ее после удаления серверной версии.
8. обновить версию файла на сервере (HTTP работа). Если вы скачали себе для работы файл то нажав в меню 'Обновить файл на сервере' он будет перезаписан на сервер.
При этом при настройке расширения можно выбрать создавать перейменованную версию или удалять старую версию файла).
9. изменить описание к файлу.
10. изменить имя файла (до 150 символов, ограничения по символам Windows).
11. просмотреть локально существующие файлы. Если в запросе подсвечивает имя файла желтым значит на данном ПК он существует и он может быть просмотрен).
12. если нужно переместить папку хранилища с файлами просто скопируйте ее куда нужно вручную и пропишите новую директорию корневой папки в функцию SDefBase или в настройки расширения.
Иван
156 Расширение, вычисляемые поля в таблице формы Решил выложить, немного спорное свое расширение, но может кому пригодится.
Расширение может замедлить работу базы

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

Для функционирования расширения, необходимо создать поля соответствующего типа данных
которые будете в них выводить (или использовать существующие, в этом случае реальные значения полей
будут перерисованы!
).
Далее можно настроить табличную часть стандартным образом(выравнивание и стиль текста
наследуется из настроек таблицы).
Расширение подключается к форме. В настройках расширения выбираете нужные поля "Вычисляемые поля" и пишите выражение, результат которого будет отображен в таблице.

С раскраской ячеек все аналогично, единственное что нужно отметить, обращение к текущему
полю производится стандартно по имени компонента. (но данные в форму не заносятся, т.е. вычисления
производятся налету при отрисовке таблицы).
ВАЖНО: Т.к. все расчеты производятся в момент отрисовки, сложные выражения
будут тормозить систему!!!

Все расчеты заносятся в буфер и вычисляются однократно, для текущего вида. Далее выводятся из буферов(StringList).
Данные из буфера очищаются при выходе из режима редактирования записи формы (события cancel и post), при этом
пересчитывается только редактируемая запись. А также полная очистка буферов происходит
при показе окна списка или смены вкладки программы(переход с другой формы на текущую) или
уничтожения данной формы (FormDestroy).
Также можно очистить все буферы, вызвав функцию Clear_Bufers из выражений.
Пользуйтесь с осторожностью и пониманием.
Пример использования во вложении: форма "товары".
15.11.22 - обновил вложение Вычисляемые поля формы2.0.epas, исправил конфликт в событиях.
Vofka18
157 Расширение: Срок действия базы Доброго времени суток!

Появилась необходимость ограничить время работы базы. Написал простенькое расширение для MainFm
Runenkov
158 Резервное копирование базы Расширение добавляет кнопку резервного копирования базы на панель инструментов. База архивируется при помощи утилиты 7zip, которая автоматически скачивается с сайта http://mydataexpress.ru. Базы архивируются в определенную папку. Имена архивов имеют вид: дата_время_база.7z. Тип действия: действие при запуске.

2.1 (актуальная)
1. Исправлена ошибка копирования шаблонов, если в пути есть символы кириллицы.

2.0
1. Резервное копирование , восстановление и сжатие сетевой базы данных утилитой gbak.
2. Резервное копирование при закрытии базы.
3. Добавление задачи в планировщик заданий.
Backups.7z

1.0
Backups 1.0.zip
admin
159 Резиновые столбцы в запросах Растягивает по ширине указанные столбцы в запросах. Цепляем на форму и указываем запросы и столбцы для авторастягивания anderslonss
160 Сборная солянка различных действий Доброго времени суток!

Выкладываю расширение из различных действий, которые часто использую в свои базах. Часть действий я написал сам, часть взял у других авторов. Расширение содержит следующие действия:

ДЕЙСТВИЯ ДЛЯ БАЗЫ:
- Скрыть тулбар;

ДЕЙСТВИЯ ДЛЯ ФОРМЫ:
- Кнопка очистки в поле;
- Всплывающие подсказки;
- Клик перед удалением записи;
- Клик левой кнопкой мыши;
- Двойной клик на компоненте;

ДЕЙСТВИЯ ДЛЯ КНОПОК:
- Закрыть программу;
- Закрыть текущую форму;
- Пересчет текущей формы;
- Очистка фильтра формы;
- Открывает нужную форму в отдельном окне;
- Запустить приложение/файл;
- Нажатие кнопки запроса;
- Дублировать запись таблицы;
- Выбрать объект из отчета;
- Получение правильных имен у объектов базы;
- Получение скрипта для примечаний форм;
- Получение скрипта для примечаний полей;
- Обновить текущую форму;
- Обновить дерево у формы;
- Нажатие нужной кнопки;
- Печать с условиями;
- Вставка текста;
- Нажимаем кнопку у dxLookupComboBox;
dm2002_2002
161 Системный трей
Vofka18 писал(а):Попробуйте так.


Скрутил расширение по вашим сообщениям для удобства, как раз искал как это реализовать)
Иван
162 Сканирование штрих-кодов Сканируете штрих-код сканером штрих-кодов и автоматически жмется кнопка с нужными действиями. Штрих-код получаете функцией BarCode. Работает с любым представлением формы. В представлении "только таблица" работает в окне редактирования. Поддерживается только сканеры в режиме эмуляции клавиатуры с включенным режимом Windows Mode Control+X. Для определения начала и окончания сканирования задается префикс и суффикс Ctrl+клавиша. Можно сканировать простые штрих-коды и коды DataMatrix. admin
163 Скрытые/служебные поля формы Расширение позволяет скрывать группу на форме, в которую можно добавить служебные поля.
Скрываемая группа должна быть расположена ниже всех остальных (видимых) элементов формы.
Добавляется, как действие формы.
Megabyte
164 Скрыть меню Файл и Помощь Простое расширение, скрывающее стандартные пункты меню "Файл" и "Помощь", оставляя видимым только пункт "О программе". Тип действия - при запуске. admin
165 Скрыть тулбар. Простой акшен для скрытия верхнего или нижнего тулбара. Цеплять на форму.

Code: Выделить всё

{@action
Id=A602C679-A37B-4B45-B03C-38664891E217
Target=form
OrigName=StartHideToolbar
Name=Скрыть тулбар.
Group=Интерфейс
UI=
<ui>
 <checkbox  name="HideBeginU" caption="Скрыть верхний тулбар при старте"/>
 <checkbox  name="HideBeginD" caption="Скрыть нижний тулбар при старте"/>
</ui>
Description=Скрывает верхний или нижний тулбары
@}

procedure StartHideToolbar(HideBeginU,HideBeginD:boolean);

begin
if  (HideBeginU = true) then  MainWindow.Toolbar.Visible := not HideBeginU;
if  (HideBeginD = true) then  MainWindow.StatusBar.Visible := not HideBeginD;
end;


Code: Выделить всё

{@action
Id=4BC5175C-FA7C-406B-A325-EE980EF71EC8
Target=main
OrigName=HideToolbar
Name=Скрыть тулбар.
Group=Интерфейс
UI=
<ui>
 <divider caption="Действие не имеет настроек"/>
</ui>
Description=Скрывает верхний тулбар при активной "простой форме".
@}

var OldMainWindow_pages_OnChange: TNotifyEvent;

function GetActiveForm:TDxForm;
begin
  result:=MainWindow.FormViews[MainWindow.Pages.ActivePageIndex].Form;
end;

procedure MainWindow_pages_OnChange(sender: Tobject);
begin
    if OldMainWindow_pages_OnChange<>nil then
    OldMainWindow_pages_OnChange(sender);
    MainWindow.Toolbar.Visible := (GetActiveForm.ViewType <> vtSimpleForm);
end;

procedure HideToolbar;
begin
  OldMainWindow_pages_OnChange:=MainWindow.pages.OnChange;
  MainWindow.pages.OnChange:=@MainWindow_pages_OnChange;
end;
SirWolf
166 Соединить поле выделенных записей Добрый вечер. Решил поделиться с расширением, может кому понадобится.
Расширение соединяет поле выделенных записей в подчинённой таблице или запросе.
В этом же расширение есть действие при запуске "Мультивыбор", код был взят из расширения kok80-ExportToExcel

Сам лично использую для выбора почт, файлов для рассылок и для выбора каких-либо записей.
Пример:
UI.png

пример1.png

пример2.png


В данном примере поля для заполнения является заметка "ID выделенных", поле соединения "ID".
Демо:
DEMO.zip


Расширение:
Соединить поле выделенных записей.epas

Соединить поле выделенных записей.zip
shavkat
167 Сокращатель ссылок (u.to) Функция: "U_TO". Сокращает длинный URL посредством одноименного сервиса.
Группа: "Интернет"

Пример: U_TO('https://forum.mydataexpress.ru')

Результат: https://u.to/V5gKFg

Примечание:
Сервис не предоставляет открытого API для полноценного с ним взаимодействия, посему функция реализована "альтернативным" способом (то есть - ее стабильная работа не гарантируется).
На каком-то "превышении лимита" начинает себя пиарить просит "немного подождать":
Изображение


[ Скачать ]

Develop-Soft
168 Сохранение позиции в запросе. Достаточно простое расширение для запоминание позиции запроса перед выполнением след действия, а потом перехода на нужную позицию.
Мне помогло решить проблему, когда позиция находилась в центре запроса, а после редактирования и обновления она исчезала, запрос сбрасывало на начальную позицию.

Code: Выделить всё

var
RecNo:integer;
{@action
Id=0DB6E6B3-7F06-43E7-80ED-0CB13C0E26D1
OrigName=SW_KeepPos
Name=Сохранение позиции запроса
Group=Запросы
UI=
<ui>
 <query name="_mycmp" caption="Выберите запрос"/>
</ui>
Description=используется для сохранения позиции строки в запросе.
@}


procedure SW_KeepPos(QN:variant);
var
   Q:TdxQueryGrid;
   begin
   Q:=Self.Queries[QN];
   RecNo:=Q.RecNo;
end;

{@action
Id=35CA1266-3964-4A21-8ADA-73E8527C96F5
OrigName=SW_GoPos
Name=Переход к позиции запроса
Group=Запросы
UI=
<ui>
 <query name="_mycmp" caption="Выберите запрос"/>
 <number name="linecount" caption="На сколько сдвинуть" required="1"/>
</ui>
Description=Используется для перехода к нужной строке в запросе. Предварительно используйте "Сохранение позиции запроса"
Для сдвига позиции используйте числовое поле. +1 сдвинет на одну позицию после выполнения.
@}
procedure SW_GoPos(QN:variant; linecount:integer);
var
   Q:TdxQueryGrid;
   ln:integer;
   begin
   Q:=Self.Queries[QN];
   ln:=Linecount;
   Q.MoveTo(RecNo+ln);
end;



QueryPosition.epas
SirWolf
169 Сохранение ширины и порядка колонок grid формы Каждый user может сам под себя настроить ширину и порядок колонок:
просто меняете ширину и/или позицию колонки, при следующем запуске всё восстанавливается
kok80
170 Сохранение ширины столбцов
SaveColumnWidths_v1.0.epas
Основное назначение: Модуль автоматически сохраняет и восстанавливает ширину колонок для компонентов dxGrid и dxQueryGrid, используя базу данных Firebird для хранения настроек.
С привязкой к форме, гриду, колонке и текущему пользователю.

версия 1.0 от 14.04.2026

Действия кода:

Инициализация таблицы - Проверяем существование таблицы в Firebird, создаёт её при необходимости и добавляем необходимые столбцы.

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

Восстановление ширины колонок - При открытии формы загружаем сохранённую ширину колонок из базы данных и применяем их к соответствующим гридам.

Управление настройками пользователей - Поддерживает индивидуальные настройки для каждого пользователя, а также общие настройки по умолчанию.

Обработка событий формы - Перехватывает событие OnDestroy формы для автоматического сохранения настроек перед закрытием.

Сброс настроек - Есть функции сброса сохранённой ширины для текущего пользователя или всех пользователей.

Технические особенности:

Использует SQL-запросы UPDATE OR INSERT для обновления/вставки записей
Поддерживает фильтрацию гридов через список разрешённых имён
Есть режим отладки с логированием действий
Обрабатывает ошибки SQL-операций без прерывания работы
В Модуле реализовано три действия: основное действие для формы, для активации функционала, и две кнопочные функции для сброса настроек.

.
mobmk
171 Список полей формы для компонета список Сделал расширение для получения списка компонентов формы с именем поля или отображаемой надписью.
Список будет отображаться в компоненте список.

Хотелось бы ещё настроить, чтобы имя формы можно было задавать в соседнем поле, но такая магия пока не срабатывает.

Список полей формы.epas
cordek
172 Сумма прописью на английском Доброго дня!

Возможно, кому-то пригодится...

TotalByWords.zip
Runenkov
173 Телеграм бот для DataExpress ИзображениеТелеграм бот для DataExpress.

Как всегда вопросы, пожелания, предложения и конструктивная критика приветствуются.


Если есть необходимость заставить бота создавать записи в базе, то это можно сделать с помощью функции CreateRec. Поиск и вывод информации из базы удобнее делать с помощью DBMERGEA.

МОДУЛЬ

Эмоциональные посты типа: "О ужас ничего не работает. Всё пропало." - мне не интересны и по факту это просто флуд. Если вам нечего сказать по существу темы - проходите мимо.

Еще раз. Я не против критики, если она по делу. Я против "пугалок" и "страшилок".
jurist23rus
174 Телеграм-Макс-бот Интеграция ботов Телеграм и Макс с базой данных. Бот программируется при помощи выражений.

Для работы расширения требуется веб-сервер, https и домен.

Подробности в инструкции.

Посмотреть как это работает можно в демонстрационной базе.
Логин: Пользователь
Пароль: 1

Строка подключения для десктоп-версии: base.mydataexpress.ru:tg_demo

TelegramBot 1.7.zip

TELEGRAMBOT 1.7.dxp

Инструкция.zip

TELEGRAMBOT.dxp
admin
175 Транслитерация кириллицы. Иногда нужна транслитерация, особенно имён-фамилий. Пользуюсь этим расширением.

Расширение возвращает надписи кириллицей на латинице в версии Волапюк, ИКАО (для проездных документов, например загранпаспортов) и на туркменской латинице.

Translit.epas

Демо:
TRANSLIT.zip
Runenkov
176 Убрать нули без потери точности dxCalcEdit Расширение для визуального представления на форме чисел без лишних ноликов без потери точности. Все вычисления
что были прописаны на полях или в скриптах будут срабатывать, изменится только вид полей при открытии формы. Смотрите скрины до и после.

Особенности
На двойной пробел в пустом поле выдаст ноль + запятая для дальнейшего ввода цифры.
Совместим с другими модулями видимости и доступности компонентов.
Можно указать отображать ноль или null независимо от этого свойства в поле dxCalcEdit.
Чексбокс: показать поля правее - ознакомительная функция,
позволяет посмотреть виртуальные TEdit поля и выбранные числовые поля формы порознь.


Обновление 1.1:
Изменено метод вовлечения полей: подхватывает все числовые поля на форме.
Возвожмность менять число скролом. Если ставить курсор после запятой будет менять соответствующую степень числа.
Свойство видимости кнопки берет из свойства числового поля.
Свойство Nul в 0 берет из свойства числового поля.
Иван
177 Удаление из строки повторяющихся элементов текста Функция RepeatRemr(текст, разделитель) удаляет повторяющиеся элементы текста, которые разделены разделителем, например «;»
P.S. Делал для себя, может кому сгодиться.
RetCat
178 Универсальный модуль HTTP сервера для API Решил поэкспериментировать с ИИ
И сделать модули для запуска сервера с универсальным HTTP API
То есть он должен автоматически распознавать поля на форме и выдавать результат запроса в json, а также добавлять в форму записи, заполняя их из json, отыскивая нужные поля
Пример базы пока в работе, модули пока сырые, не оттестированы.
Веб модуль должен быть в WEBMAIN, доступ к нему происходит через настройку serviceid
Модуль для десктопа надо прикреплять к какой-то форме, которая у определенного пользователя стартует при запуске.
HTTP API Server.zip
cordek
179 Универсальный модуль для HTTP запросов (GET, POST, DELETE) Модуль для работы с API через HTTP-запросы.
Отправляет HTTP-запрос с указанным методом, URL, заголовками и параметрами, и получает ответ в формате JSON. Результат сохраняется в специальной переменной "request_result".
Можно прикрепить в форме или кнопке.
JSON из ответа парсится и сохраняется во внутренних переменных в соответствии с узлами объектов json.
Списки нумеруются от 0
<b>Пример для DADATA.RU :</b> метод 'POST' URL запроса <br><br>
'https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/party','Content-Type=application/json,Accept=application/json'<br><br>
'API-ключ'<br><br>
Имя параметра - query<br><br>
Значение параметра [ИНН]<br><br>

Расширение имеет и веб версию
HTTP запросы.zip


Пример с Dadata.ru
DaData_example2.zip
cordek
180 Управление видимостью/доступностью компонентов Действие формы. Обеспечивает доступность/видимость компонентов по условию. admin
181 Управление закладками форм Действие запуска. Позволяет выполнить кастомные настройки закладок форм и расширить функционал
управления закладками.


(работает с версией DataExpress от 15.03.2020 и новее)

Изображение

Возможности и опции:
Изображение

Управление:
    1. Добавить пункт "Закрыть все" в меню закладок.
    Добавляет в меню закладок дополнительный пункт, нажатием на который можно закрыть все закладки (кроме добавленных в исключения)

    2. Закрытие нажатием колесика мыши
    Активирует возможность закрытия закладки указанным способом (закладки, добавленные в исключения - не закрываются).

    3. Разрешить перетаскивание
    Опция позволяет перетаскивать мышью закладки относительно друг друга.

    4. Запретить закрытие
    Блокирует от закрытия любым способом закладки указанные в списке.

Внешний вид:
    5. Высота закладки в пикселях
    Числовое значение высоты закладок (в пикселях). Установлено ограничение в диапазоне 16..64.

    6. Название шрифта
    Можно указать кастомный шрифт (он должен присутствовать в системе, в противном случае, а также при пустом значении - будет установлен шрифт по-умолчанию)

    7. Размер шрифта
    Устанавливает размер шрифта (при пустом значении - будет установлен шрифт по-умолчанию).

    8. Стиль шрифта:
    • Жирный
    • Наклонный
    • Подчеркнутый

    9. Иконки закладок/форм:
    Устанавливает выбранные из галереи иконки для закладки и окна формы редактирования (если установлен режим отображения "только таблица).

Демо | [ Скачать ]

Develop-Soft
182 Управление компонентом "Закладки"(PageControl) Данный модуль позволяет ставить метки на вкладки компонента "Закладки", по условию.
Также есть возможность подключать действие к форме несколько раз, для разных компонентов "Закладок".

"Метка" может быть иконкой из галереи или просто пометка символом "*" в начале заголовка вкладки.
Нумерация вкладок начинается с ноля.

"Запомнить вкладку в поле" С помощью данной опции можно указать числовое поле на форме,
в котором будет сохраняться текущая вкладка компонента закладок, для текущей записи.
Естественно запись формы должна быть сохранена.
Также числовое поле (выбранное в данной опции) будет скрыто от пользователя.
Vofka18
183 Управление пользователями базы данных Управление пользователями базы данных. Любая форма может стать хранилищем логинов и паролей к вашей базе данных. Данное расширение упрощает работу с большим количеством пользователей. Есть действия для массового создания и удаления пользователей из БД, а также функция генерации паролей. Более подробную информацию вы можете найти в настройках действия.

UserMan 1.3.zip

UserManWeb 1.3.zip
admin
184 Установка значения по умолчанию Здравствуйте!
Делал для себя расширение, может кому то пригодится.
При использования расширения нужно выбрать какой-нибудь флажок, который будет использоваться по умолчанию.
При установке в нем значения true данный флажок во всех остальных записях будет иметь значение false.
dm2002_2002
185 Фильтр дерева объекта Действия формы.
Фильтрует дерево в окне списка объекта исходя из фильтра объекта.
Работает при условии присутствия в дереве ОДНОГО поля с источником типа ОБЪЕКТ.

Будут показаны только те узлы, для которых есть записи.

Могут присутствовать ошибки, тестировал на дереве с иерархией.

Фильтр дерева объекта v1.1.epas
Megabyte
186 Форматирование даты и времени Устанавливается как и любой другой модуль расширений. Что это такое и как установить можно прочесть тут. Содержит функции:

FormatDate ('строка форматирования', [Дата]) - преобразует дату в строку с определённым форматированием.
y = Год из 2-х последних цифр
yy = Год из 2-х последних цифр
yyyy = Год из 4-х цифр
m = Номер месяца без 0
mm = Номер месяца как 2 цифры
mmm = Месяц используя ShortDayNames (Янв)
mmmm = Месяц используя LongDayNames (Январь)
d = Число без 0
dd = Число как 2 цифры
ddd = Число используя ShortDayNames (Воск)
dddd = Число используя LongDayNames (Воскресенье)
ddddd = Число в ShortDateFormat
dddddd = Число в LongDateFormat

FormatDate ('dddddd', [Дата]) //Возвращает: 09 Февраля 2000
FormatDate ('dddd d mmmm yyyy', [Дата]) //Возвращает: Среда 9 Февраля 2000
FormatDate ('ddd d mmm yyyy', [Дата]) //Возвращает: Ср 9 Фев 2000


FormatTime ('строка форматирования', [Время]) - преобразует время в строку с определённым форматированием.
h = Час без 0
hh = Час как 2 цифры
n = Минуты без 0
nn = Минуты как 2 цифры
s = Секунды без 0
ss = Секунды как 2 цифры
z = Миллисекунды без 0
zzz = Миллисекунды как 2 цифры
t = Используя ShortTimeFormat
tt = Используя LongTimeFormat

FormatTime ('t', [Время]) //Возвращает: 01:02
FormatTime ('tt', [Время]) //Возвращает: 01:02:03
FormatTime ('hh:mm:ss.zzz', [Время]) //Возвращает: 01:02:03.004
FormatTime ('h:m:s.z', [Время]) //Возвращает: 1:2:3.4
jurist23rus
187 Функция ABSVALUE() абсолютное значение Здравствуйте!

На форуме уже есть решение, но сделал более замороченное решение.
Может пригодится.

AbsValue([Сумма])


ABS.epas
albereznyuk
188 Функция FreeDaysCount() считает субботы и воскресения в диапазоне дат Представляю Вашему вниманию функцию FreeDaysCount()
Основная задача - посчитать количество суббот и воскресений в заданном диапазоне дат.

FREEDAYSCOUNT([Начальная дата],[Конечная дата])
Параметры: дата1, дата2.
Результат: число.

Пример:

FREEDAYSCOUNT(CDATE('01.07.2021'), CDATE('31.07.2021'))

Результат: 9

Не имеет значения в каком порядке указаны даты, т. е. первой может идти конечная дата, а затем начальная.

Пример использования:
FreeDaysCount.zip

Функция:
FreeDaysCount.epas


В примере показана возможность работать с календарём праздничных дней, которые пользователь может определить самостоятельно. А вот переносы дней на субботы или воскресения видимо можно реализовать средствами DX.
albereznyuk
189 Функция вставки произвольного символа в указанную позицию Здравствуйте!
Может кому-то пригодится

Функция вставки произвольного символа/текста в указанную позицию, вместо символа можно вставлять и поле с текстовым значением.

CustomInsert('202601', '-', 5)

Параметры: текст, символ вставки, позиция

Результат: 2026-01

CustomInsert('12345', '-', 3) → 12-345
CustomInsert('Привет', ' ', 4) → Прив ет
CustomInsert('Текст', ' текст2 ', 6) → Текст текст2

CustomInsert.epas
albereznyuk
190 Функция закрытия приложения Функция закрытия приложения в случае отсутствия файла конфигурации. Расширение файла конфигурации значения не имеет.

Code: Выделить всё

////////////////////////////////////
{@module
    Author= Ronshif
    Version=1.0
    Description=Закрытие приложения при отсутствии
                      файла конфигурации.
    @}
    {@function
    OrigName=CheckDirFile
    Name=CheckDirFile
    Args=s
    Result=n
    Group=Инструменты
    Description=Результат - Целое число<br>
    Параметр - 'Имя Файла' string  <br>
    ========================================<br>
    Результат - Целое число. Если результат > 0, приложение закрывается. <br>
    Функция проверяет - наличие конфигурационного файла приложения,<br>
    имя которого передано в параметре в одинарных кавычках.<br><br>
    Пример:
            <center>CheckDirFile('MyConfigFile')</center><br>
    Применение: ТОЛЬКО в модуле Main проекта<br>
    //===
    <code>MAIN<br>
    .....<br>
    procedure Database_Open;<br>
    begin<br>
     EvalExpr('CheckDirFile("MyFile.json")',nil);<br>
    end;</code><br>
@}

function CheckDirFile(fname: String): Integer;
var
  erri: LongInt;
begin
   Result := 0;
   if Trim(fname) = '' then Exit;
  ///
  if FileExists(Trim(fname)) then
  begin
   Application.ProcessMessages;
   Exit;
  end else begin
    ///
    erri := MessageDlg('Ошибка запуска приложения', LineEnding +
    'Файл конфигурации ' + LineEnding + '-------------------' + LineEnding +
    '"'+ Trim(fname) +'"'+ LineEnding + '-------------------' + LineEnding +
    'Не найден!', mtWarning, [mbOk]);
    ///
    Result := erri;
     ///
     MainWindow.Hide;
     MainWindow.Close;
     Application.Terminate;
     /////
  end;
end;
///////////////////////////////////////

Работать должна только в модуле Main проекта. Пример:

Code: Выделить всё

Main
......
procedure Database_Open;
begin
   EvalExpr('CheckDirFile("develop.json")',nil); просто пример
end;
RONSHIF
191 Функция кастумный диалог Эта функция открывает кастумный диалог.
DialogFunc ('вопрос','варианты кнопок через точку с запятой;отмена;добавить;ваш вариант');
Результат выдает в формате порядкового номера нажатой кнопки от 1-го до n.
Если кнопку не нажимали, закрыли окно, результат 0.
Иван
192 функция отправки почты через JS Сделал отправку электронной почты через JS. Используется библиотека Windows
функция позволяет отправлять письма с разных ящиков, все настройки можно задавать в явном виде (текст), либо брать из полей базы.

В планах добавить как модуль действие для кнопки.
Добавить отправку многострочного текста.
Добавить отправку файла
Добавить отправку файлов

JS_send_email 0.1
реализован в виде функции. Позволяет писать письма только из одной строки.
cordek
193 Экспорт данных в csv Всем доброго времени. Для собственных нужд был разработан модуль экспорта данных в csv.
Модуль был основан по образу и подобию от Vofka18 https://forum.mydataexpress.ru/viewtopic.php?f=16&t=4322.
Не судите строго. Первый опыт.
Может кому пригодится.
Из доп функций:
в таблице можно произвести некоторые вычисления, которые не используют другие поля (это которые [Поле]). В основном используются функции DATE, TIME, USER. функции которые что-то возвращают. Эти изменения можно отправить на экспорт или внести в базу, а можно и внести в базу и отправить на экспорт.
Обработка идет через SQL Select. Скорость хорошая.


Export_CSV_File.epas
doosss
194 Экспорт текста в XML Расширение для 'экспорта текста в XML.

В своей базе в заметке сделал выражение и результат через данное расширение экспортирую в XML.

Использовал наработки с форума. Из двух вариантов решений собрал сборную солянку.

Функция сохраняет текст в файл c расширением XML.

TO_XML_FILE('Сохраняемый_текст')

Параметры:
(Текст)
Фрагмент текста, который требуется сохранить в файл.

Пример:
TO_XML_FILE([Заметка1])
VdoVin