C#. HelloWorld. I love you C#

Попрактикуемся в C#. Традиционный Hello world

8

 

Delphi. UniGUI. Делаем витрину (showcase) 2 часть

97

В прошлом посте мы сделали подготовочку. Структуру базы данных, определили основные сущности программы, создали под них таблицы в базе и модули в прекрасной IDE Delphi.

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

Общий вид витрины

90

Выделение товара

91

Добавление товара

94

Перелистнем на следующую страницу

93

Изменим размер формы – как видно товары перестроились в зависимости от новой ширины.

95

Исходники

Continue reading

Delphi. Uploading to Keep2Share. Half Successfull Atempt…

Поступил ко мне небольшой заказ на автоматизацию заливки файлов на файлообменник Keep2Share.cc Всего было у меня 2 попытки делания данного проекта. Сначала опишу неудачную попытку, а в другом посте удачную. Задача стояла таким образом, чтобы сделать заливку напрямую из Delphi программы на сервере Keep2Share.cc

К счастью, у Keep2Share.cc есть API.  Это API работает прекрасно со скриптами PHP,  о чем приводится пример на той же странице с API.

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

Согласно API все транзакции проходят в JSON формате, я научился получать токен авторизации, отправлять тестовый запрос, а вот загружать файл не научился, хотя удалось получить от сервера всю необходимую информацию для отправки файла на сервер. Проблема оказалась в том, что я не смог до конца корректно перевести CURL запрос в INDY. cURL я так понимаю это библиотека, аналогичная InDY, только для C подобных языков.

Получение токена авторизации

77 Continue reading

Delphi. Как подменить и зашифровать произвольный url в браузере, загрузив контент на свой хостинг ?

Данная задача возникла в связи с тем, что понадобилось зашифровать url. Решил её частично. То есть, для простых сайтов без горы скриптов – все будет работать идеально. С горой скриптов все будет работать почти идеально, если сервер сайта наш и там можно будет разрешить кроссдоменные запросы. Это почти – означает тонкую работу со скриптами. Вообще, как я понял, такие трюки запрещены в целях безопасности. Но задачу решать как-то надо было.

Способ №1 – независимый

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

-скачать HTML код страницы с сервера-источника

-подменить все относительные пути (href и src action) на абсолютные, указав сервер-источник

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

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

Ограничение №1

Ограничение этого способа в том, что мы прячем только одну страницу. Если на ней есть ссылки, то сервер-источник будет обнаружен при переходе на неё. Но для задачи шифрования одной ссылки – этого вполне достаточно.

Ограничение №2

Ещё одно ограничение, если страница на скриптах фрэймворка, то такой подход тоже может не работать полностью. Тут нужно думать над каждым случаем отдельно.

Ограничение №3

Кросс-доменнные запросы как известно запрещены,

В частности, я работал с сайтом на Yii и при отправке Submit получил ошибку в отладчике браузера

но если есть доступ на сервер, то с помщью php мы можем прописать в скрипте сервера, к которому обращаемся, строку в самом начале файла, разрешающую кроссдоменные запросы

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

 

ШАГ № 1 – Загрузим произвольный сайт на своем сервере

8 Continue reading

Delphi. FireMonkey. Первое приложение под Android – “Позвони маме”

9

В Delphi, насколько я вижу, под Android можно писать на Firemonkey – и тогда мы получим нативное приложение. А можно писать при помощи UniGUI фрэймворка и тогда мы получим приложение работающее через браузер, основанное на популярной библиотеке jQueryMobile.

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

Ещё один плюс – приложение может быть полностью автономным, не зависящим от сети. Если, скажем использовать базу данных SQLite для каких то небольших приложений.

Также лично для меня, человека работающего с mySQL есть ещё один финт в работе с FireMonkey – напрямую, я оказывается не могу подключиться, в связи с ограничениями в FireDAC – библиотекой доступа к данным, выход – либо переход на другие компоненты либо через DataSnap.

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

Минус этого подхода в том, что у нас практически нет доступа к железу. Но если этого не требуется, а для большинства задач этого достаточно – то всё в порядке. Также хорошо то, что вся мощь javascript библиотек будет под рукой и её можно будет использовать как напрямую, так и через язык Delphi. Другое ограничение – постоянный доступ к сети, но с этим проблем вроде бы нет в современном мире.

Есть ещё и третий подход)) Соединить первый и второй подходы – а именно – завернуть UniGUI приложение в FireMonkey. То есть, если, скажем нам нужно разместить наше приложение в магазине PlayMarket – мы просто берем TWebBrowser и прописываем в нём ссылку на наше приложение на UniGUI в сети. Continue reading

Delphi. TRichView. Как записать контрол в базу и прочитать его оттуда?

Код для примера, без обработки ошибок. Предполагается, что подключение у нас уже создано в отдельном модуле и на форме добавлен компонент FDQuery. Также в базе создано BLOB поле.

Запись в базу через поток MemoryStream

Чтение из базы через поток MemoryStream

Какие тонкие места могут быть?

-Опущу здесь обработку ошибок.

-Во-первых memory stream, если данных будет слишком много, memorystream может не справиться, возможно лучше будет использовать filestream.

-Во-вторых BLOB поле. Чтобы сервер БД не падал, лучше заранее побеспокоиться о максимально возможном значении BLOB поля

5

Delphi. TRichView. Сохранение добавленных картинок в определенную директорию

25

Для меня работа с картинками, в TRichView не была очевидна, поэтому пару дней пришлось поразбираться с тонкостями и нюансами. Мне был интересен аспект сохранения картинок при экспорте в HTML формат (например, методы SaveHTMLEx и SaveHTMLToStreamEx).

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

Я также пробовал искать возможность сохранения картинки “как есть”, то есть имя + расширение, например, FileName.gif, но пока до конца не разобрался. Вот здесь находится полезный пост на эту тему. В принципе, я даже написал тестовый код, но проблема в том, что я не знал, в какой момент его нужно добавить, по идее, в момент If OpenDialog.execute… Continue reading

Delphi. Как открыть папку и узнать об ошибке, если что?

На многих форумах на вопрос – как открыть папку дают примерно такой ответ, а вот так…

На примере папки files, лежащей в директории приложения

Но если немного почитать MSDN и различные умные блоги, то получится вот так…

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