Delphi. UniGUI. Deploy от А до Я (Версия 2)

45

Я уже писал о размещении (deploy) проекта на внешних серверах в одноименной статье ранее. Но тогда я только начинал разбираться с фрэймфорком UniGUI, а сейчас более менее все устаканилось в голове, поэтому этот пост наверное будет почти тем же самым, но более структурным, упорядоченным причесанным.

Какие виды файлов генерирует UniGUI?

Это важный вопрос, потому что от того какой файл будет на выходе будет зависеть стиль деплоя. Я знаю о как минимум 3 вариантах выходных файлов – это

EXE

DLL (запускается через IIS)

Windows Service

Для разработки предпочтительнее использовать EXE файлы, когда приложение уже сформировано, лучше, на мой взгляд использовать IIS, потому как это профессиональный и проверенный веб-сервер. EXE файл тоже можно сделать профессиональным, так как в нем уже содержится idHTTPServer, но это другая более кастомная и тонкая работа что ли. Но обо всем по порядку.

Я здесь разберу только случаи для EXE и DLL, так как они наиболее частые в практике использования программистами Delphi UniGUI.

Как сделать Delpoy EXE файла?

Тут все очень просто. Компилируем в EXE, переносим его на машину, которая у нас будет работать сервером, и далее обращаемся в стиле

IP машины : порт

Например,

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

В случае с localhost это будет выглядеть так…

8077 это порт по умолчанию для приложения UniGUI


Как сделать Delpoy DLL файла?

Здесь всё намного интереснее! Итак, на выходе у нас есть DLL, и нам нужно прикрутить её к IIS серверу, чтобы это всё запускалось, скажем как

Continue reading

Delphi. UniGUI. Правильная архитектура приложения на примере создания соединения с базой данных MySQL с помощью FireDAC

44

Интересное обсуждение у меня сложилось на форуме UniGUI, когда я не смог передать ссылку на объект так как я это делаю обычно, в Delphi (через свойства или через параметр Sender). Вот ссылка на само обсуждение

http://forums.unigui.com/index.php?/topic/7556-how-to-give-correct-link-to-created-instance

Итак, в UniGUI есть 3 типа объектов

UniServer Module ( создается 1 раз и работает все время, пока работает приложение)

http://www.unigui.com/doc/online_help/server_module.htm

UniMainModule (создается 1 раз и работает в течение сессии – о том, что такое сессия в UniGUI можно узнать в другом моем посте – и это не тоже самое, что сессия в PHP )

http://www.unigui.com/doc/online_help/main_module.htm

Все остальное – работает от создания до закрытия. Например формы. Создали – она держится в памяти – закрыли – уносит все данные с собой. В этом смысле UniMainModule это вроде как глобальный юнит, к которому можно обратиться, например как UniMainModule.doSomething, и также к UniServerModule.doSomething.

Как выяснилось на форуме, данные форм лучше хранить в зеркальных структурах в UniMainModule, так как просто этот объект живет дольше и не убивается при закрытии формы.

Разберем пример соединения с базой данных

Continue reading

Delphi. UniGUI. Режим StandAlone Server / ISAPI Module

36

Я уже писал об этом преобразовании. Суть в том, что разрабатывать приложение удобно как StandAlone Server. Минимум действий для запуска программы и её отладки. Запустил EXE файл сервера, открыл браузер, набрал localhost: 8077 и вот она, твоя программа.

Отлаженную же программу многие оформляют как dll, и запускают под IIS как ISAPI модуль. Я ещё напишу об этом более подробно.

Суть в том, что нужен такой режим, который бы позволял компилировать в EXE файл или dll файл простым переключением. И такой режим в UniGUI есть.

Видите на рисунке ниже StandAlone Server / ISAPI Module ? Я обычно выбираю при разработке именно его, так как EXE крайне удобен и прост при самой разработке, но когда продукт готов, я просто переключаю на dll способами, описанными ниже.

19 Continue reading

Delphi. UniGUI. Делаем авторизацию через СМС. Часть 2 – база данных и логика программы

5

Результат у меня получился таким

33

34

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

Delphi. UniGUI. Делаем авторизацию через СМС. Часть 1 – проверка номера телефона

25

В одном моем проекте 99% клиентов из России, Казахстана и Украины. И вот взбрело мне в голову сделать авторизацию через смс. Нашёл шлюз, отправил пару тестовых смс, стал двигаться дальше и уперся в проверку номера телефона. Сначала думал делать через MaskEdit, но почитав про него в интернете понял, что это не самый лучший вариант, а какой же лучший? Через простой TEdit, ну в моем случае, через TUniEdit, что почти тоже самое, за исключением того, что программа под WEB. Итак, посмотрим как это легко и быстро сделать в Delphi. Вот что у нас получится.

26

Вот что будет, если с номером что-то не так…

27

28

Итак, я создал отдельный модуль для проверки номера телефона Continue reading

Delphi. Как правильно удалять несколько элементов из TStringList, TObjectList и вообще из списков?

21

Как правильно удалять несколько элементов из TStringList, TObjectList и вообще из списков?

И вот такой алгоритмик ошибочен так как постоянно меняется Count и индексы элементов, пробовал через repeat и while, но там похожая ситуация. Как вариант проходить одним циклом, копировать элементы в другой StringList, потом искать их методом IndexOf, но это только если элементы уникальны. Либо запоминать адреса переменных, это уже будет работать для всех переменных, но это, блин как-то синхрофазотронно)))
В общем, чувствую, простая задача, а выхода пока не вижу.

Обратился я на форум и там мне помогли. А решение-то было 1 одну строку. Continue reading

Delphi. Когда использовать read / write а когда get set ?

20

Озаботился тут этим вопросом теоретического интереса ради и получил для себя удивительный ответ!

Как известно есть 2 способа задать свойства объекту

А вот и интересный ответ Continue reading

Delphi. Отправляем смс через шлюз или как классно когда все сделано за Вас)

18

Понадобилось сделать смс рассылки. Был порадован массой готовых решений для Delphi. Остановился на https://smsc.ru/

Вот мой небольшой пример

19

Цифры здесь означают

(<id>, <количество sms>, <стоимость>, <баланс>) в случае успешной отправки
// либо (<id>, -<код ошибки>) в случае ошибки

Вот цифра 0 здесь означает обычное смс

Я задал вопрос оператору и получил вот такой ответ

Flash-sms – это смс, текст которой сразу выводится на экран телефона/смартфона пользователя вместо записи в память устройства

Ещё примеры из источника

 

API и примеры выложены прямо на сайте. Скопирую сюда, пока не убрали))

 

Источник https://smsc.ru/api/delphi/ Continue reading

Delphi. JSON. Парсинг сложных объектов с System.JSON

16

Вот что у нас получится
15

Секрет в том, как я понял, чтобы подбираться к нужным нам элементам JSON последовательно. Изначально парсим исходный объект, далее, если он содержит в себе другие объекты или массивы, то подбираемся к нему через распарсенный изначальный объект. Вот как это будет выглядеть. Continue reading

Delphi. Делаем мультизагрузку файлов чанками по HTTP протоколу (с idHTTP на idHTTPServer)

4

Загрузку чанками одного файла с idHTTP на idHTTPServer я уже организовал ранее, в данной статье посмотрим как можно организовать мультизагрузку (в данном случае последовательную). Пользователь выбирает N файлов и файлы поочередно начинают грузиться на сервер чанками.

10

9

В данном примере реализована последовательная загрузка файлов через единый компонент idHTTP. Пример нетривиальный, и я не вижу возможности описать все в одном посте, поэтому просто выложу исходники и дам некоторые комментарии. В принципе, можно переписать код на параллельную загрузку, размножив idHTTP, но я предпочел оставить так, чтобы не перегружать сервер, чтобы в один момент времени при загрузке, с ним работал один поток от одного клиента. А то, если сделать мультизагрузку с одновременным открытием потоков на сервере, и каждый клиент захочет загружать по 150 файлов, то что из этого выйдет? Явно возможна перегрузка сервера по памяти. Хотя там и можно выставить ограничение на самом сервере, но тогда будут ошибки на клиенте, в общем, на мой взгляд – последовательно загружать лучше! Код выполняет минимальный функционал и является примером, думаю, все ограничения можно легко добавить, разобравшись в нём. В текущих исходниках код отправляем файлы чанками по 4 мб или целиком если меньше этого размера. Ограничение на максимальный размер файла не установлено, логи операций ведутся на клиенте.

Continue reading