Delphi. Мои компоненты. Компонент idHTTPClient. Отправка файлов по HTTP протоколу чанками, удаление файлов, отображение через базу данных

28

Данный компонент для загрузки на сервер файлов, отображения файлов, удаления, поиска, сортировки и так далее. Пользователь, в некотором документе хочет добавить файл – открывается клиент этого компонента – он видит те файлы, которые он уже загрузил ранее, и может загрузить ещё.  Компонент работает поверх базы MySQL. В итоге пользователь вставляет файл в документ. Само событие вставки я пока не сделал, но там ничего сложного, это уже как поставить флаг, когда забрался на Эльбрус.

Самое сложное здесь было реализация отправки файлов чанками в разных потоках. Я ограничил максимально возможное одновременное число отправляемых файлов в потоках пятью. Размер чанка установил в 4 мб. Размер загружаемого файла никак не ограничивал. Тестировал с 2,7 Гб, все успешно.

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

Клиент

31

29

Сервер

26

Исходники

Continue reading

Delphi. Простейший способ измерить время

21

Добавляем TTImer в программу

Фиксируем начальное время и запускаем таймер в OnCreate или на какой-то кнопке

Обработка таймера

Люблю быстрые и простые решения

Delphi. Алгоритмы. Создание уникального имени через добавление номера в конце в скобках. Например SomeFile(1), SomeFile(2) и др.

20

Итак, пусть у нас в некоторой директории находится файл SomeFile, сделаем так, чтобы при добавлении следующего файла с именем SomeFile, в директории оказался файл SomeFile(1), SomeFile(2), SomeFile(3). При отсутствии этого файла в директорию копируется просто файл. Данная задача возникла в результате разработки решения для передачи файлов по HTTP протоколу. Нужно было сделать так, чтобы при каждой передаче файл в обязательном порядке копировался и сохранялся под новым именем в любом случае, даже если он там уже есть. Не перезаписывал существующий, а создавал новый, с каким-то другим именем.

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

Основная функция

Здесь у нас список имен, с которыми нужно сравнивать, это имена из директории. А также само имя, которое должно быть уникальным.

Эта функция опирается на следующую – добавление номера в скобки на конце Continue reading

Delphi. idHTTP.Get и русские символы

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

делал это через idHTTP.Get, но все русские символы либо обрезались либо уходили в виде ????????, уже сталкивался с этой проблемой, поэтому решил просто использовать System.NetEncoding следующим образом

uses

 

Обратите внимание, кодирую только URI, то есть всегда должна быть часть

http://somehost:someport/ Continue reading

Delphi. DBGrid. Как пробежаться и собрать значения определенного поля выделенных записей?

DBGrid включаем в режим multiSelect. На примере сбора поля ID из базы данных

12


 

 

Delphi. FireDAC. Проверка на NULL и запись NULL значений в базу данных

Проверка на NULL

Запись NULL значений, согласно инструкции

 

 

Delphi. MySQL. Реализуем поиск вхождений, регистрозависимый поиск, поиск точной фразы.

7

Сделать это довольно просто, опираясь на запросы SQL, которые я рассмотрел в предыдущем посте. Вот что у нас получится

2

А если поиск ничего не обнаружил, получим следующее

3

Итак, оформим такую панель поиска

1

Всего будет 3 типа поиска

-Поиск вхождений

-Точное соответствие

-Регистронезависимый поиск

Будем собирать ID записей, при нажатии на “Найти” будем ставить курсор на первую запись в найденной выборке, либо сообщать, что ничего не найдено.

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

Перво-наперво создадим запросы, по аналогии с тем, как это мы делали в прошлом посте

Поиск вхождений

Continue reading

MySQL. Регистрозависимость поиска и поиск вхождений

Пусть у нас есть 2 строки в базе mysql

106

Регистро зависимый поиск

107

Регистро Независимый поиск

108

Поиск вхождений (регистро независимый)

110

Delphi. MySQL. Ошибка Type mismatch for field ‘name’, expecting: String actual: WideString

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

Такая ошибка появилась у меня в результате работы с базой MySQL с кодировкой UTF8 и FDConnection, также с кодировкой UTF8, но передаваемым не напрямую, а через другой модуль. У меня была проблема с тем, что кириллица не отображалась корректно в FDTable и мне пришлось искать решение какое-то время.

Решение №1

В ручную создать новые поля типа WideString в FDTable или FDQuery (смотря с чем работаете) взамен тех, у которых тип String. Например так

13

 

14

После того как я в ручную создал эти поля и удалил те, которые String – все стало как нужно.

ПолуРешение №2 (оно только очистит поля)

Но в этом случае придется пересоздавать поля