Alcinoe Component Library от Zeus64 - это бесплатная библиотека визуальных и невидимых компонентов для Delphi.
Полноценный видеоплеер OpenGL, обертка WebRTC для Delphi, нативные компоненты TEdit для iOS/Android, улучшенные элементы управления FireMonkey, облачные сообщения Firebase, SDK для входа через Facebook для Android/iOS, парсеры Json/Bson, обертка ImageMagick, клиент MongoDB.
Alcinoe совместим с Delphi Rio 10.3.3 и Delphi Sydney 10.4.2.
https://github.com/Zeus64/alcinoe
С Delphi Alexandria 11.1 появилась поддержка загрузки MOD (удалено).
Alcinoe теперь полностью совместим с Delphi Athens 12.3..
Установите Alcinoe.
Если вы не планируете использовать какие-либо визуальные компоненты Alcinoe во время разработки, вам не нужно устанавливать ничего, просто добавьте {alcinoe_rootdir}\source в путь поиска вашего проекта.
Если вы планируете использовать визуальные компоненты во время разработки, вам необходимо установить BPL. Запустите Delphi и перейдите в "компоненты" > "Установить пакеты...", и выберите BPL, расположенный в {alcinoe_rootdir}\lib\bpl\alcinoe\Win32\sydney\Alcinoe_sydney.bpl (если вы используете Delphi Sydney, иначе выберите каталог, соответствующий вашей версии Delphi). Вам все равно нужно добавить {alcinoe_rootdir}\source в путь поиска вашего проекта.
Alcinoe также немного улучшает исходный код Delphi. Для этого вам нужно перейти в {alcinoe_rootdir}\embarcadero\sydney\10_4_2 и запустить update.bat, чтобы получить и обновить исходный код Delphi. Этот пакетный файл предполагает, что исходный код находится в "c:\Program Files (x86)\Embarcadero\Studio\21.0\source" и что у вас установлен GIT в пути. После копирования и обновления исходного кода Delphi, вам нужно добавить этот исходный код в путь поиска вашего проекта.
Для использования все большего количества библиотек используется Java 1.8 (например, webRTC, exoplayer и т.д.). Поэтому необходимо выполнить "desugaring" (Desugaring позволяет использовать эти функции на старых устройствах, заменяя новые байт-коды и API языка на более старые во время процесса сборки). С помощью d8.bat (замена dx.bat) desugaring включен по умолчанию. Таким образом, вы можете использовать большинство последних изменений языка, ориентируясь на старые устройства. В ожидании того, что Embarcadero заменит dx.bat на D8.bat, мы должны сделать DX.bat "прокси" для D8.bat. Для этого просто замените ваш оригинальный DX.bat (у меня он находится в c:\SDKs\android\build-tools\30.0.3\d8.bat) на файл, расположенный в {alcinoe_rootdir}\tools\D8Proxy\dx.bat. Подробности здесь: https://quality.embarcadero.com/browse/RSP-24155
Полноценный видеоплеер OpenGL для FireMonkey.
ALVideoPlayer отображает видео на ТЕКСТУРЕ. Это очень важно, потому что вы можете полностью интегрировать видео в форму Delphi и размещать любые элементы управления поверх него, так как поддерживается Z-ORDER. Официальные видеоплееры Delphi - это просто нативные окна видеоплеера поверх формы, и они не поддерживают Z-ORDER.
Под Android я использую ExoPlayer. ExoPlayer поддерживает такие функции, как динамическая адаптивная потоковая передача по HTTP (DASH), HLS, SmoothStreaming и Common Encryption, которые не поддерживаются MediaPlayer. Он разработан для простоты настройки и расширения. Под iOS я использую AVPlayer, который также поддерживает HLS, как и ExoPlayer.
видеоплеер для FireMonkey видеоплеер для FireMonkey видеоплеер для FireMonkey
Обертка WebRTC для Delphi.
WebRTC (Web Real-Time Communications) - это технология, которая позволяет веб-приложениям и сайтам захватывать и, при необходимости, передавать аудио- и/или видеоданные, а также обмениваться произвольными данными между браузерами и мобильными приложениями без необходимости использования промежуточного сервера. Набор стандартов, составляющих WebRTC, позволяет обмениваться данными и проводить видеоконференции напрямую, без необходимости установки плагинов или другого стороннего программного обеспечения.
Компонент TALWebRTC упрощает добавление видео- и аудиочата в ваши приложения, что открывает совершенно новые возможности для взаимодействия.
Обертка WebRTC для Delphi.
Нативные для iOS/Android элементы управления TEdit и TMemo для FireMonkey.
Идея заключается в том, чтобы сочетать элементы управления FireMonkey с нативными элементами управления платформы, когда реализация определенной функциональности в таких элементах управления становится очень сложной (например, webbrowser, edit, memo, datepicker и т.д.). Однако это не означает создание нескольких отдельных форм для разных платформ, как, например, предлагает http://www.turbococoa.com/ (хотя этот вариант также является хорошей альтернативой, выбор за вами).
В Delphi (berlin) уже существует нативный элемент управления для платформы iOS, который был довольно хорошо реализован, но практически отсутствуют нативные элементы управления для платформы Android, поэтому я начал создавать нативные элементы управления для Android/iOS, такие как TEdit/TMemo. Эти элементы управления работают в основном как окна, расположенные поверх формы (следовательно, без возможности изменения порядка Z с элементами управления FireMonkey).
Рисование
Рисование
Быстрые элементы управления FireMonkey с двойной буферизацией и нативной отрисовкой.
Прямоугольник
Круг
Текст (Также можно отображать HTML-текст на iOS/Android/Windows/macOS)
Глиф
и т.д.
TALRectangle
TALRectangle
Тот факт
Отрисовка элементов управления FireMonkey иногда может быть медленной, или, другими словами, недостаточно быстрой для плавной прокрутки. Например, если просто посмотреть на базовый TRectangle с закругленными углами, процедура отрисовки может занимать около 3 мс! Таким образом, если на экране отображается около 20 видимых TRectangle, то для полной перерисовки экрана потребуется около 60 мс (и обычно там не только TRectangle, но и TLabel, TCheckbox и т.д.). После этого просто математика: требуется 100 мс для перерисовки экрана, поэтому можно отобразить только около 10 кадров в секунду (в реальности будет еще меньше), поэтому прокрутка не может быть плавной 🙁
Решение
Я не хотел переписывать элементы управления FireMonkey, это слишком большая работа для меня, и вместо этого я попытался найти промежуточное решение. Я нашел его, добавив свойство "double-buffered" к элементам управления FireMonkey. Вместо того, чтобы постоянно перерисовывать элементы управления для каждого пикселя движения полосы прокрутки, я сначала рисую элемент управления в "буфере", который сохраняется непосредственно в памяти GPU (через TTexture), и когда система запрашивает перерисовку элементов управления, вместо повторного вызова алгоритма отрисовки я просто перерисовываю буфер TTexture.
Результаты
Как я говорил раньше, отрисовка простого TRectangle с закругленными углами занимает 3 мс. С моим свойством "double-buffered" это теперь занимает около 0,1 мс! Теперь прокрутка выглядит намного плавнее!
OpenGL draw => Заменено на нативные функции отрисовки iOS/Android.
Большинство базовых фигур (например, TRectangle, TCircle и т.д.) используют OpenGL для отрисовки, что не очень эффективно; например, для отрисовки круга с помощью OpenGL фактически рисуется 50 треугольников. Это часто приводит к низкому качеству: https://quality.embarcadero.com/browse/RSP-15206. Для roundrect ситуация еще хуже, так как сначала необходимо вычислить путь, а затем отрисовать его (значительно медленнее, чем TCircle).
Другая проблема заключается в том, что все эти функции отрисовки зависят от Form.quality. Если вы установите form.quality в highquality, то все действия, выполняемые на холсте, будут использовать мультисэмплинг, например, при рисовании изображения, что может быть проблематично, поскольку изображение будет иметь сглаживание. Если вы установите form.quality в highperformance, отрисовка будет очень грубой (без сглаживания).
Для решения этой проблемы я использую НАТИВНЫЕ API Android/iOS для создания буфера моего элемента управления. Таким образом, мы получим высококачественную отрисовку при высокой скорости, не зависящую от form.quality.
TALCircle
Улучшенные элементы управления FireMonkey.
ScrollBox
TabControl
RangeTrackBar
RangeTrackBar
видеоплеер для FireMonkey видеоплеер для FireMonkey видеоплеер для FireMonkey
Анимация падающих конфетти
ALConfetti - это библиотека Delphi для создания настраиваемой, высокопроизводительной анимации падающих конфетти.
конфетти
Firebase cloud messaging
Метод работы с Firebase Cloud Messaging (FCM) для получения push-уведомлений. С помощью FCM можно уведомлять клиентское приложение о доступности новых электронных писем или других данных для синхронизации. Можно отправлять уведомления для повышения вовлеченности и удержания пользователей. Для таких сценариев, как мгновенные сообщения, сообщение может передавать полезную нагрузку объемом до 4 КБ клиентскому приложению.
Вход через VKontakte/Facebook SDK для Android/iOS.
VKontakte/Facebook SDK для Android позволяет пользователям входить в ваше приложение с помощью авторизации через VKontakte/Facebook. При входе в ваше приложение через VKontakte/Facebook пользователи могут предоставлять разрешения вашему приложению, чтобы вы могли получать информацию или выполнять действия от их имени в VKontakte/Facebook.
Фильтры для редактора фотографий для Android/iOS.
С TALColorAdjustEffect вы можете создавать потрясающие фотофильтры с автоматической настройкой в один клик, чтобы ваши фотографии выглядели красиво и выразительно всего за несколько минут!
Видеоплеер для FireMonkey.
Парсер JSON.
TALJsonDocument - это парсер/генератор для формата данных JSON / BSON в Delphi. Он поддерживает DOM и SAX парсер (стоит отметить, что более подходящим названием могло бы быть SAJ - Simple API for JSON, вместо SAX - Simple API for XML, но, поскольку концепция SAX хорошо известна, я сохранил это название), поддерживает формат BSON и использует аналогичный синтаксис, что и TALXMLDocument / TXMLDocument. TALJsonDocument также может экспортировать данные JSON / Bson в TALStringList.
При работе с парсингом какого-либо (текстового) контента обычно предусматриваются два направления. В мире JSON обычно приходится делать выбор между:
Анализатор DOM, который создает структуру объектов в памяти, отображающую содержимое JSON.
Анализатор SAX, который читает содержимое JSON и затем вызывает предопределенные события для каждого элемента содержимого JSON.
Фактически, анализаторы DOM используют внутри себя анализатор SAX для чтения содержимого JSON. Поэтому, из-за накладных расходов на создание объектов и инициализацию их свойств, анализаторы DOM обычно в три-пять раз медленнее, чем анализаторы SAX (и используют гораздо больше памяти для хранения всех узлов). Однако, анализаторы DOM гораздо мощнее для обработки данных: как только данные отображаются в нативные объекты, код может получить доступ к любому узлу без задержек, в то время как доступ на основе SAX потребует повторного чтения всего содержимого JSON.
Большинство JSON-анализаторов, доступных в Delphi, используют подход, похожий на DOM. Например, модуль DBXJSON, включенный начиная с Delphi 2010, или библиотека SuperObject создают экземпляр класса, отображающий каждый узел JSON. Для достижения максимальной скорости, TALJsonDocument реализует как анализатор DOM, так и анализатор SAX.
TALJsonDocument также может поддерживать комментарии внутри исходного кода JSON, что является расширением спецификации JSON.
Синтаксис TALJsonDocument очень похож на синтаксис TALXMLDocument / TXMLDocument.
TALJsonDocument доступен в двух вариантах: TALJsonDocument, созданный на основе ansiString (то есть UTF-8), и TALJsonDocumentU, созданный на основе строки Unicode (то есть UTF-16).
Пример:
{
_id: 1, // comments
name: { first: “John”, last: “Backus” },
birth: new Date('1999-10-21T21:04:54.234Z'),
contribs: [ “Fortran”, “ALGOL”, “Backus-Naur Form”, “FP” ],
awards: [
{ award: “National Medal of Science”,
year: 1975,
by: “National Science Foundation” },
{ award: “Turing Award”,
year: 1977,
by: “ACM” }
],
spouse: “”,
address: {},
phones: []
}
Для доступа к узлам документа:
MyJsonDoc.loadFromJson(AJsonStr, False);
MyJsonDoc.ParseOptions := [poAllowComments]; // для разрешения комментариев внутри исходного JSON-файла.
MyJsonDoc.childnodes['_id'].int32;
MyJsonDoc.childnodes['name'].childnodes['first'].text;
MyJsonDoc.childnodes['name'].childnodes['last'].text;
MyJsonDoc.childnodes['birth'].datetime;
for i := 0 to MyJsonDoc.childnodes['contribs'].ChildNodes.count – 1 do
MyJsonDoc.childnodes['contribs'].childnodes[i].text;
for i := 0 to MyJsonDoc.childnodes['awards'].ChildNodes.count – 1 do begin
MyJsonDoc.childnodes['awards'].childnodes[i].childnodes['award'].text;
MyJsonDoc.childnodes['awards'].childnodes[i].childnodes['year'].text;
MyJsonDoc.childnodes['awards'].childnodes[i].childnodes['by'].text;
end;
Или, если вы не уверены в существовании узлов перед обращением к ним, или не хотите проверять их, вы также можете сделать следующее:
MyJsonDoc.GetChildNodeValueInt32(' _id', 0 {значение по умолчанию, если узел не существует});
MyJsonDoc.GetChildNodeValueText(['name', 'first'], "" {значение по умолчанию, если узел не существует});
MyJsonDoc.GetChildNodeValueDateTime('birth', Now {значение по умолчанию, если узел не существует});
Для создания узлов документа:
MyJsonDoc.addchild('_id').int32 := 1;
with MyJsonDoc.addchild('name', ntObject) do begin
addchild('first').text := 'John';
addchild('last').text := 'Backus';
end;
MyJsonDoc.addchild('birth').dateTime := Now;
with MyJsonDoc.addchild('contribs', ntArray) do begin
addchild.text := ‘Fortran’;
addchild.text := ‘ALGOL’;
addchild.text := ‘Backus-Naur Form’;
addchild.text := ‘FP’;
end;
with MyJsonDoc.addchild(‘awards’, ntArray) do begin
with addchild(ntObject) do begin
addchild(‘award’).text := ‘National Medal of Science’;
addchild('year').int32 := 1975;
addchild('by').text := 'National Science Foundation';
end;
with addchild(ntObject) do begin
addchild('award').text := 'Turing Award';
addchild('year').int32 := 1977;
addchild('by').text := 'ACM';
end;
end;
MyJsonDoc.addchild('spouse');
MyJsonDoc.addchild('address', ntObject);
MyJsonDoc.addchild('phones', ntArray);
Вы также можете создавать/обновлять узлы следующим образом:
MyJsonDoc.SetChildNodeValueInt32('_id', 0);
MyJsonDoc.SetChildNodeValueText(['name', 'first'], 'John');
MyJsonDoc.SetChildNodeValueDateTime('birth', Now);
Для загрузки и сохранения в формате BSON:
MyJsonDoc.LoadFromFile(aBSONFileName, False{saxMode}, True{BSON});
MyJsonDoc.SaveToFile(aBSONFileName, False{saxMode}, True{BSON});
Для разбора JSON-документа в режиме SAX:
MyJsonDoc.onParseText := procedure (Sender: TObject;
const Path: AnsiString;
const name: AnsiString;
const Args: array of const;
NodeSubType: TALJSONNodeSubType) - NodeSubType: TALJSONNodeSubType)
begin
case NodeSubType of - case NodeSubType of
nstFloat: Writeln(Path + ‘=’ + ALFloatToStr(Args[0].VExtended^, ALDefaultFormatSettings)); - nstFloat: Writeln(Path + ‘=’ + ALFloatToStr(Args[0].VExtended^, ALDefaultFormatSettings));
nstText: Writeln(Path + ‘=’ + ansiString(Args[0].VAnsiString)); - nstText: Writeln(Path + ‘=’ + ansiString(Args[0].VAnsiString));
nstObjectID: Writeln(Path + ‘=’ + ‘ObjectId(“‘+ALBinToHex(ansiString(Args[0].VAnsiString))+'”)’); - nstObjectID: Writeln(Path + ‘=’ + ‘ObjectId(“‘+ALBinToHex(ansiString(Args[0].VAnsiString))+'”)’);
nstBoolean: Writeln(Path + ‘=’ + ALBoolToStr(Args[0].VBoolean,’true’,’false’)); - nstBoolean: Writeln(Path + ‘=’ + ALBoolToStr(Args[0].VBoolean,’true’,’false’));
nstDateTime: Writeln(Path + ‘=’ + ALFormatDateTime(”’ISODate(“”yyyy”-”mm”-”dd”T”hh”:”nn”:”ss”.”zzz”Z”)”’, Args[0].VExtended^, ALDefaultFormatSettings)); - nstDateTime: Writeln(Path + ‘=’ + ALFormatDateTime(”’ISODate(“”yyyy”-”mm”-”dd”T”hh”:”nn”:”ss”.”zzz”Z”)”’, Args[0].VExtended^, ALDefaultFormatSettings));
nstNull: Writeln(Path + ‘=’ + ‘null’);
nstRegEx: Writeln(Path + ‘=’ + ansiString(Args[0].VAnsiString));
nstBinary: Writeln(Path + ‘=’ + ‘BinData(‘+inttostr(Args[1].VInteger)+’, “‘+ansiString(ALBase64EncodeStringNoCRLF(ansiString(Args[0].VAnsiString)))+'”)’);
nstJavascript: Writeln(Path + ‘=’ + ansiString(Args[0].VAnsiString));
nstInt32: Writeln(Path + ‘=’ + ‘NumberInt(‘+inttostr(Args[0].VInteger)+’)’);
nstTimestamp: Writeln(Path + ‘=’ + ‘Timestamp(‘+inttostr(int64(cardinal(Args[0].VInteger)))+’, ‘+inttostr(int64(cardinal(Args[1].VInteger)))+’)’);
nstInt64: Writeln(Path + ‘=’ + ‘NumberLong(‘+inttostr(Args[0].VInt64^)+’)’);
end;
end;
MyJsonDoc.LoadFromJSON(AJsonStr, true{saxMode});
Обертка ImageMagick для Delphi.
Используйте ImageMagick® для создания, редактирования, объединения или преобразования растровых изображений. Он может читать и записывать изображения в различных форматах (более 200), включая PNG, JPEG, GIF, HEIC, TIFF, DPX, EXR, WebP, Postscript, PDF и SVG. Используйте ImageMagick для изменения размера, отражения, зеркального отображения, поворота, искажения, сдвига и преобразования изображений, настройки цветов изображений, применения различных специальных эффектов или рисования текста, линий, полигонов, эллипсов и кривых Безье.
Пример:
var aWand: PMagickWand;
begin
//Создание библиотеки ImageMagick.
alCreateImageMagickLibrary({alcinoe_rootdir} + ‘\lib\dll\imagemagick\win32\imagemagick’, min(2, System.CPUCount){aThreadLimit});
try
//создание указателя на объект Wand
aWand := ALImageMagickLib.NewMagickWand;
try
//загрузка изображения
if ALImageMagickLib.MagickReadImage(aWand, pansiChar(aInputFilename)) <> MagickTrue then RaiseLastMagickWandError(aWand);
//установка качества сжатия
Если ALImageMagickLib.MagickSetImageCompressionQuality(aWand, 80) не равно MagickTrue, то вызовите RaiseLastMagickWandError(aWand).
//автоматически настроить изображение
Если ALImageMagickLib.MagickAutoOrientImage(aWand) не равно MagickTrue, то вызовите RaiseLastMagickWandError(aWand).
//Изменить размер изображения с использованием фильтра Lanczos
Если ALImageMagickLib.MagickResizeImage(aWand, 640, 480, LanczosFilter) не равно MagickTrue, то вызовите RaiseLastMagickWandError(aWand).
//сохранить изображение
ALImageMagickLib.MagickWriteImage(aWand, pansiChar(aOutputFilename)).
finally
ALImageMagickLib.DestroyMagickWand(aWand);
end;
finally
alFreeImageMagickLibrary;
end;
end;
Клиент MongoDb
Клиент Delphi для базы данных MongoDB. Драйвер Delphi (с пулом соединений) для доступа к серверу mongoDB. Пул соединений - это кэш соединений с базой данных, который поддерживается для повторного использования соединений при будущих запросах к базе данных. В пуле соединений, после создания соединения, оно помещается в пул и используется повторно, чтобы не приходилось устанавливать новое соединение. Если все соединения используются, создается новое соединение и добавляется в пул. Пул соединений также сокращает время, которое пользователю требуется для установления соединения с базой данных.
Пример:
aJSONDoc := TALJSONDocument.create;
aMongoDBClient := TAlMongoDBClient.create;
try
aMongoDBClient.Connect("", 0);
aMongoDBClient.SelectData('test.exemple',
'{fieldA:123}', // запрос
‘{fieldA:1, fieldB:1}’, // поля для возврата
aJSONDoc.node);
aMongoDBClient.disconnect;
for i := 0 to aJSONDoc.node.childnodes.count – 1 do
with aJSONDoc.node.childnodes[i] do
writeln(aJSONDoc.node.childnodes[i].nodename + ‘=’ + aJSONDoc.node.childnodes[i].text)
finally
aMongoDBClient.free;
aJSONDoc.free;
end;
Пример с пулом соединений:
aMongoDBConnectionPoolClient := TAlMongoDBConnectionPoolClient.create(aDBHost, aDBPort);
try
::Thread1::
aMongoDBConnectionPoolClient.SelectData('test.example',
'{fieldA:123}', // запрос
‘{fieldA:1, fieldB:1}’, // поля для возврата
aLocalVarJSONDOC.node);
::Thread2::
aMongoDBConnectionPoolClient.SelectData('test.example',
'{fieldA:999}', // the query
‘{fieldA:1, fieldB:1}’, // поля для возврата
aLocalVarJSONDOC.node);
finally
aMongoDBClient.free;
end;
Пример мониторинга tail:
aMongoDBTailMonitoringThread := TAlMongoDBTailMonitoringThread.Create(
aDBHost,
aDBPort,
‘test.cappedCollectionExemple’
‘{}’, // запрос
‘{fieldA:1, fieldB:1}’, // поля для возврата
Процедура (Sender: TObject; JSONRowData: TALJSONNode)
begin
writeln('Новый элемент добавлен в cappedCollectionExemple: ' + JSONRowData.childnodes['fieldA'].text);
end,
процедура (Sender: TObject; Error: Exception)
begin
writeln(Error.message);
end);
….
aMongoDBTailMonitoringThread.free;
Клиент WebSocket
Клиент WebSocket для Delphi, реализованный на основе WinHTTP. WebSocket - это протокол связи, который позволяет установить двухстороннюю интерактивную сессию связи между браузером пользователя и сервером. Это позволяет отправлять сообщения на сервер и получать ответы, основанные на событиях, без необходимости постоянно опрашивать сервер.
Быстрый TStringList
TALStringList работает так же, как TStringList в Delphi, за исключением того, что он позволяет искать пары "имя=значение" с использованием алгоритма быстрой сортировки, когда список отсортирован. Кроме того, TALStringList использует алгоритм, не зависящий от локали (основанный на 8-битном порядковом значении каждого символа), вместо AnsiCompareText и AnsiCompareStr, используемых в TStringList в Delphi. В результате, сортировка в TALStringList может быть в 10 раз быстрее, чем в TStringList в Delphi. Также TALStringList - это не TStringList для Unicode, а 100% TStringList для ANSI.
TALNVStringList (NV для "имя-значение") аналогичен TALStringList (также использует алгоритм быстрой сортировки), за исключением того, что оптимизация здесь направлена на списки "имя/значение", а не на списки строк.
TALHashedStringList TALHashedStringList аналогичен TALStringList, за исключением того, что он использует внутреннюю хеш-таблицу вместо алгоритма быстрой сортировки. Использование TALHashedStringList вместо TALStringList может повысить производительность, когда список содержит большое количество строк (в противном случае, если в списке не так много строк, производительность будет ниже, чем у TALStringList, из-за затрат на вычисление хеша).
PHP runner
ALPHPRunnerEngine - это простой, но полезный компонент, который позволяет легко использовать PHP (любую версию) в качестве языка сценариев в приложениях Delphi. ALPHPRunnerEngine позволяет выполнять PHP-скрипты внутри программы Delphi без использования веб-сервера. ALPHPRunnerEngine использует интерфейс CGI/FastCGI (php-cgi.exe) PHP для взаимодействия с движком PHP.
Memcached Client
Delphi Client для базы данных memcached.
Что такое Memcached? Это бесплатная и открытая, высокопроизводительная, распределенная система кэширования объектов в памяти, универсальная, но предназначенная для ускорения динамических веб-приложений за счет снижения нагрузки на базу данных.
Memcached - это хранилище данных типа "ключ-значение" в памяти для небольших фрагментов произвольных данных (строк, объектов) из результатов запросов к базе данных, вызовов API или рендеринга страниц.
Memcached - это простое, но мощное решение. Его простая конструкция способствует быстрой развертыванию, простоте разработки и решает многие проблемы, с которыми сталкиваются большие системы кэширования данных.
GSM компонент
Компонент TAlGSMComm реализует отправку SMS-сообщений через текстовый интерфейс, определенный в технической спецификации GSM 07.05, версия 5.1.0, от декабря 1996 года. Существуют различные версии этой спецификации, используемые в моделях Nokia, Siemens, Ericsson и т.д. Мы протестировали Nokia 6230, но модели Nokia 7190, 8890, 6210 и 9110 также должны работать. Телефоны других производителей также будут работать, если они реализуют текстовый интерфейс. Примерно 1/4 современных телефонов могут быть подключены к компьютеру (через ИК-порт или последовательный порт), примерно 1/3 из них поддерживают только текстовый режим, 1/3 - только режим PDU, а остальные 1/3 поддерживают оба режима: текст и PDU. Некоторые телефоны (например, Nokia 5190) поддерживают SMS, но используют проприетарный протокол, который TALGSMComm не поддерживает.
Чтобы протестировать ваш телефон, подключите его к компьютеру через последовательный кабель или устройство ИК-порта (обратитесь к документации вашего телефона для получения подробной информации о подключении). Введите "AT" в окно терминала, чтобы проверить, установлено ли соединение (вы должны получить "OK" от телефона), затем введите "AT+CMGF=?". Ответ должен содержать "1", что указывает на поддержку текстового режима. Если оба этих теста пройдены, то ваш телефон соответствует базовым требованиям.
Клиент SQLite3
Запрос к базе данных SQLite3 и получение результата в формате XML или в формате JSON/BSON.
И многое другое.
CGI-интерпретатор.
HTTP-клиент (WinInet/WinHTTP).
Клиент MySQL.
NNTP-клиент.
POP3 клиент
SMTP клиент
XML парсер
WIN64
К сожалению, в win64 мы потеряли все наследие FastCode (которое в основном было основано на ассемблере). Это означает, что большинство функций будут примерно в 2-10 раз медленнее. Вы можете попробовать запустить /demo/ALStringBenchMark/ в win64 и Win32, чтобы увидеть разницу в скорости.