html Alcinoe z Delphi 11.1 Wspieranie Aleksandrii | losLab Software Development Blog

Artykuł techniczny

Alcinoe z Delphi 11.1 Wspieranie Aleksandrii

· Programowanie Delphi

Alcinoe Biblioteka komponentów firmy Zeus64 to otwarta biblioteka komponentów wizualnych i niewizualnych dla Delphi.

Pełny odtwarzacz wideo OpenGL, opakowanie WebRTC Delphi, natywny iOS/Android TEdit, ulepszone sterowanie Firemonkey, przesyłanie wiadomości w chmurze Firebase, logowanie do Androida/ios Facebook SDK, parser Json/Bson, opakowanie ImageMagick, klient MongoDB.

Alcinoe jest kompatybilny z Delphi Rio 10.3.3 i Delphi Sydney 10.4.2
https://github.com/Zeus64/alcinoe

Z Delphi Alexandria 11.1 obsługującym pobieranie MOD (usunięte):

Alcinoe jest teraz w pełni kompatybilny z Delphi Ateny 12.3.

Zainstaluj Alcinoe
Jeśli nie planujesz używać żadnych komponentów wizualnych Alcinoe w czasie projektowania, nie musisz niczego instalować, po prostu dodaj {alcinoe_rootdir}\source w ścieżce wyszukiwania swojego projektu.

Jeśli planujesz używać komponentów wizualnych na etapie projektowania, musisz zainstalować licencję BPL. Uruchom Delphi i przejdź do komponentu > Zainstaluj pakiety… > i wybierz BPL znajdujący się w {alcinoe_rootdir}\lib\bpl\alcinoe\Win32\sydney\Alcinoe_sydney.bpl (jeśli jesteś w Delphi Sydney, wybierz katalog odpowiadający twojej wersji Delphi). Nadal musisz dodać ścieżkę wyszukiwania {alcinoe_rootdir}\source

Alcinoe poprawia także nieco oryginalne kody źródłowe Delphi. W ten sposób będziesz musiał przejść do {alcinoe_rootdir}\embarcadero\sydney\10_4_2 i uruchomić update.bat, aby pobrać i załatać oryginalny kod źródłowy Delphi. W pliku wsadowym zakłada się, że oryginalny kod źródłowy znajduje się w „c:\Program Files (x86)\Embarcadero\Studio\21.0\source” i że na ścieżce znajduje się GIT. Po skopiowaniu i poprawieniu partii kod źródłowy Delphi będzie musiał uwzględnić ten kod źródłowy w ścieżce wyszukiwania projektu.

Aby ukończyć coraz więcej bibliotek, korzystaj z funkcji Java 1.8 (takich jak webRTC, exoplayer itp.). W ten sposób musimy przeprowadzić desugaring (Desugaring pozwala na korzystanie z tych funkcji na starszych urządzeniach poprzez zastąpienie nowych kodów bajtowych i interfejsów API języków starszymi podczas procesu kompilacji). W przypadku d8.bat (zastąpienie dx.bat) odcukrzanie jest domyślnie włączone. Dzięki temu możesz teraz korzystać z większości najnowszych zmian językowych, kierując reklamy na starsze urządzenia. Oczekując na zamianę Embarcadero na D8.bat, musimy uczynić DX.bat „proxy” dla D8.bat. W tym celu po prostu zamień oryginalny DX.bat (mój znajduje się w c:\SDKs\Android\build-tools\30.0.3\d8.bat) na ten znajdujący się w {alcinoe_rootdir}\tools\D8Proxy\dx.bat. więcej szczegółów tutaj: https://quality.embarcadero.com/browse/RSP-24155

Pełny odtwarzacz wideo OpenGL dla FireMonkey
ALVideoPlayer wyrenderuje wideo do TEXTURE. Jest to naprawdę ważne, ponieważ możesz w pełni zintegrować wideo w formie Delphi i możesz umieścić na nim dowolne elementy sterujące, ponieważ obsługuje ono Z-ORDER. Oficjalny odtwarzacz wideo Delphi to po prostu natywne okno odtwarzacza wideo na górze formularza i dlatego nie obsługuje Z-ORDER.

Pod Androidem używam ExoPlayera. ExoPlayer obsługuje funkcje takie jak dynamiczne, adaptacyjne przesyłanie strumieniowe przez HTTP (DASH), HLS, SmoothStreaming i Common Encryption, które nie są obsługiwane przez MediaPlayer. Został zaprojektowany tak, aby można go było łatwo dostosować i rozszerzyć. W systemie iOS używam AVPlayera z obsługą również HLS, tak jak robi to ExoPlayer

odtwarzacz wideo dla FireMonkey odtwarzacz wideo dla FireMonkey odtwarzacz wideo dla FireMonkey

WebRTC Delphi opakowanie
WebRTC (Web Real-Time Communications) to technologia, która umożliwia aplikacjom i stronom internetowym przechwytywanie i opcjonalnie przesyłanie strumieniowe multimediów audio i/lub wideo, a także wymianę dowolnych danych pomiędzy przeglądarkami i aplikacjami mobilnymi bez konieczności pośrednictwa. Zestaw standardów, na który składa się WebRTC, umożliwia wymianę danych i prowadzenie telekonferencji w trybie peer-to-peer, bez konieczności instalowania przez użytkownika wtyczek lub innego oprogramowania firm trzecich.

Komponent TALWebRTC ułatwia dodawanie rozmów wideo i audio do aplikacji, co otwiera zupełnie nowy świat interaktywności

Delphi WebRTC opakowanie

Firemonkey natywny iOS/Android TEdit i TMemo
Ideą jest połączenie kontroli FireMonkey z natywną kontrolą platformy, gdy funkcjonalność takiej kontroli zaczyna być bardzo trudna do wdrożenia (np. przeglądarka internetowa, edycja, notatki, datepicker itp.). Nie chodzi jednak o tworzenie kilku odrębnych formularzy dla kilku platform, jak na przykład oferta http://www.turbococoa.com/ (ale ta opcja jest również w pewnym sensie dobrą alternatywą, decyzja należy do Ciebie)

W Delphi (Berlin) jest już kontrola platformy IOS, która została całkiem dobrze zaimplementowana, ale prawie nie ma kontroli nad platformą Android, więc zaczynam budować natywne kontrolki dla Androida/iOS, takie jak TEdit/TMemo. Kontrole te działają głównie jak niektóre okna umieszczone na górze formularza (więc oczywiście nie ma kolejności Z z kontrolą FireMonkey)

Rysunek Rysunek

Rysunek

Szybkie/podwójnie buforowane elementy sterujące FireMonkey z natywnym rysowaniem
Rectangle
Okrąg
Tekst (można również rysować tekst HTML na iOS/Android/win/macOS)
Glif
itd.
TALRectangle

TALRectangle

Fakt
Malowanie elementów sterujących FireMonkey może być czasami powolne lub, inaczej mówiąc, niewystarczająco szybkie, aby zapewnić płynne przewijanie. Na przykład, jeśli po prostu spojrzysz na podstawowy TRectangle z zaokrąglonymi narożnikami, procedura malowania może zająć około 3 ms! Jeśli więc masz około 20 widocznych TRectangles na ekranie, przemalowanie całego ekranu będzie kosztować około 60 ms (i zwykle nie masz tylko TRectangle, masz też TLabel, TCheckbox itd..). Skoro to już tylko matematyka, poświęć 100 ms na przemalowanie ekranu, więc możesz wykonać tylko około 10 klatek na sekundę (w rzeczywistości będziesz mieć znacznie mniej, nawet), więc przewijanie nie będzie płynne 🙁

Rozwiązanie
Nie chciałem przebudowywać elementów sterujących FireMonkey, jest to dla mnie zbyt duża praca i zamiast tego próbuję znaleźć rozwiązanie pośrednie. To właśnie znajduję, dodając właściwość „podwójnie buforowany” do kontrolek FireMonkey. Zamiast więc odmalowywać (i ponownie malować) kontrolki dla każdego ruchu pojedynczego piksela w polu przewijania, najpierw maluję kontrolkę na „buforze”, który przechowuję bezpośrednio w pamięci GPU (poprzez TTexture), a kiedy system prosi mnie o przemalowanie kontrolek, zamiast ponownie wywoływać algorytm malowania, po prostu przerysowuję bufor TTexture.

Wyniki
Jak już mówiłem, pomalowanie prostego TRectangle z zaokrąglonymi narożnikami zajęło 3 ms. W przypadku mojej właściwości z podwójnym buforowaniem zajmuje to teraz około 0,1 ms! Teraz zwój wygląda o wiele bardziej płynnie!

Rysowanie OpenGL => Zastąpione przez natywne rysowanie iOS/Android
Większość podstawowych kształtów (takich jak TRectangle, TCircle itp.) używa do rysowania openGL. nie jest to zbyt wydajne, na przykład narysowanie koła w openGL tak naprawdę narysuje 50 trójkątów. Wynik ten często jest niskiej jakości: https://quality.embarcadero.com/browse/RSP-15206 W przypadku prostokąta okrągłego jest jeszcze gorzej, ponieważ najpierw musisz obliczyć ścieżkę, a następnie ją narysować (znacznie wolniej niż TCircle)

Innym problemem jest to, że wszystkie losowania zależą od Form.quality. jeśli ustawisz form.quality na wysoką jakość, wszystko, co zrobisz na płótnie, będzie wielopróbkowe, jak na przykład rysowanie obrazu, co może być problematyczne, ponieważ obraz będzie wygładzony. jeśli ustawisz form.quality na wysoką wydajność, wówczas losowanie będzie bardzo trudne (bez wygładzania).

Aby rozwiązać ten problem, buduję bufor mojej kontroli przy użyciu NATIVE ANDROID/IOS API. W ten sposób będziemy mieli wysokiej jakości losowanie przy dużej prędkości, nie będąc zależnymi od form.quality

TALCircle

Ulepszone sterowanie FireMonkey
ScrollBox
TabControl
RangeTrackBar
RangeTrackBar

odtwarzacz wideo dla FireMonkey odtwarzacz wideo dla FireMonkey odtwarzacz wideo dla FireMonkey

Animacja spadania konfetti
ALConfetti to zwykła biblioteka Delphi do tworzenia konfigurowalnej, wydajnej animacji spadania konfetti.

konfetti

Wiadomości w chmurze Firebase
Wieloplatformowa metoda używania Firebase Cloud Messaging (FCM) do odbierania powiadomień push Za pomocą FCM możesz powiadomić aplikację kliencką, że dostępna jest nowa wiadomość e-mail lub inne dane do synchronizacji. Możesz wysyłać powiadomienia, aby ponownie zaangażować i utrzymać użytkowników. W przypadkach użycia, takich jak wiadomości błyskawiczne, wiadomość może przenieść ładunek o rozmiarze do 4 KB do aplikacji klienckiej.

Logowanie do Androida/iOS VKontakte/Facebook SDK
Pakiet SDK VKontakte/Facebook dla Androida umożliwia logowanie się do Twojej aplikacji za pomocą loginu VKontakte/Facebook. Kiedy ludzie logują się do Twojej aplikacji za pomocą VKontakte/Facebook, mogą przyznać uprawnienia Twojej aplikacji, dzięki czemu możesz pobierać informacje lub wykonywać czynności w VKontakte/Facebook w ich imieniu.

Filtry edytora zdjęć dla Androida/iOS
Dzięki TALColorAdjustEffect wspaniałe filtry fotograficzne z funkcją automatycznego poprawiania jednym dotknięciem sprawią, że Twoje zdjęcia będą piękne i wyraziste w ciągu kilku minut!

odtwarzacz wideo dla FireMonkey odtwarzacz wideo dla FireMonkey

Parser Json
TALJsonDocument to parser/zapis Delphi dla formatu danych JSON / BSON. obsługuje parser DOM i SAX (zauważ, że lepszą nazwą mogłoby być SAJ dla Simple API dla JSON zamiast SAX dla Simple API dla XML, ale ponieważ koncepcja SAX jest dobrze znana, zachowam tę nazwę), obsługuje format BSON i używa podobnej składni niż TALXMLDocument / TXMLDocument. TALJsonDocument może również eksportować dane Json/Bson do TALStringList.

Jeśli chodzi o analizowanie niektórych treści (tekstowych), zwykle przewiduje się dwa kierunki. W świecie JSON zazwyczaj musisz dokonać wyboru pomiędzy:

Parser DOM, który tworzy w pamięci strukturę drzewa obiektów odwzorowujących zawartość JSON;
Parser SAX, który odczytuje zawartość JSON, a następnie wywołuje predefiniowane zdarzenia dla każdego elementu treści JSON.
W rzeczywistości parsery DOM używają wewnętrznie parsera SAX do odczytu zawartości JSON. Dlatego też, biorąc pod uwagę nakłady związane z tworzeniem obiektów i inicjowaniem ich właściwości, parsery DOM są zazwyczaj od trzech do pięciu razy wolniejsze niż SAX (i zużywają znacznie więcej pamięci do przechowywania wszystkich węzłów). Jednak parsery DOM są znacznie wydajniejsze w obsłudze danych: gdy tylko zostaną one zmapowane w obiektach natywnych, kod może uzyskać natychmiastowy dostęp do dowolnego węzła, podczas gdy dostęp oparty na SAX będzie musiał ponownie przeczytać całą zawartość JSON.

Większość parserów JSON dostępnych w Delphi wykorzystuje podejście podobne do DOM. Na przykład jednostka DBXJSON dołączona od Delphi 2010 lub biblioteka SuperObject tworzą instancję klasy mapującą każdy węzeł JSON. Aby osiągnąć najlepszą prędkość, TALJsonDocument implementuje parser DOM, a także parser SAX.

TALJsonDocument może również obsługiwać komentarze wewnątrz źródła JSON, które jest rozszerzeniem specyfikacji JSON

Składnia TALJsonDocument jest bardzo podobna do składni TALXMLdocument / TXMLDocument

TALJsonDocument jest dostępny w 2 wariantach: TALJsonDocument, który jest tworzony na górze ansiString (czyli UTF-8) i TALJsonDocumentU, który jest tworzony na górze łańcucha Unicode (czyli UTF-16)

Przykład:

{
_id: 1, // komentarze
imię: { pierwsze: „John”, ostatnie: „Backus” },
urodzenie: nowy Data(‚1999-10-21T21:04:54.234Z”),
wkład: [ „Fortran”, „ALGOL”, „Form Backusa-Naura”, „FP” ],
nagrody: [
{ nagroda: „Narodowy Medal Nauki”,
rok: 1975,
autor: „Narodowa Fundacja Nauki” },
{ nagroda: „Nagroda Turinga”,
rok: 1977,
autor: „ACM” }
],
małżonek: „”,
adres: {},
telefony: []
}
Aby uzyskać dostęp do węzłów dokumentu:

MyJsonDoc.loadFromJson(AJsonStr, Fałsz);
MyJsonDoc.ParseOptions := [poAllowComments]; // aby zezwolić na komentarze wewnątrz źródła JSON
MyJsonDoc.childnodes[‚_id’].int32;
MyJsonDoc.childnodes[„nazwa”].childnodes[„pierwszy”].tekst;
MyJsonDoc.childnodes[„nazwa”].childnodes[„ostatni”].tekst;
MyJsonDoc.childnodes[„narodziny”].datagodzina;
dla i := 0 do MyJsonDoc.childnodes[„wkład”].ChildNodes.count – 1 do
MyJsonDoc.childnodes[‚wkład’].childnodes[i].text;
dla i := 0 do MyJsonDoc.childnodes[‚nagrody’].ChildNodes.count – 1 zaczyna się
MyJsonDoc.childnodes[„nagrody”].childnodes[i].childnodes[„nagroda”].text;
MyJsonDoc.childnodes[„nagrody”].childnodes[i].childnodes[„rok”].text;
MyJsonDoc.childnodes[‚nagrody’].childnodes[i].childnodes[‚by’].text;
koniec;
Lub jeśli nie masz pewności co do istnienia węzłów przed uzyskaniem do nich dostępu lub nie chcesz tego sprawdzać, możesz również:

MyJsonDoc.GetChildNodeValueInt32(‚_id’, 0{domyślnie, jeśli węzeł nie istnieje});
MyJsonDoc.GetChildNodeValueText([„nazwa”, „pierwszy”], „{domyślnie, jeśli węzeł nie istnieje});
MyJsonDoc.GetChildNodeValueDateTime('narodziny', Teraz{domyślnie, jeśli węzeł nie istnieje});
Aby utworzyć węzły dokumentu:

MyJsonDoc.addchild(‚_id”).int32 := 1;
z MyJsonDoc.addchild(‚nazwa”, ntObject) zaczyna się
addchild(‚pierwszy”).text := „John”;
addchild(‚last”).text := „Backus”;
koniec;
MyJsonDoc.addchild(‚narodziny”).dateTime := Teraz;
z MyJsonDoc.addchild('wkład', ntArray) zaczynają się
addchild.text := „Fortran”;
addchild.text := „ALGOL”;
addchild.text := „Formularz Backusa-Naura”;
addchild.text := „FP”;
koniec;
z MyJsonDoc.addchild('nagrody', ntArray) zaczynają się
z addchild(ntObject) zaczyna się
addchild(‚award”).text := „Narodowy Medal Nauki”;
addchild(‚rok”).int32 := 1975;
addchild(‚by”).text := „Narodowa Fundacja Nauki”;
koniec;
z addchild(ntObject) zaczyna się
addchild(‚nagroda”).text := „Nagroda Turinga”;
addchild(‚rok”).int32 := 1977;
addchild(‚by’).text := „ACM”;
koniec;
koniec;
MyJsonDoc.addchild(‚małżonek’);
MyJsonDoc.addchild(‚adres”, ntObject);
MyJsonDoc.addchild('telefony', ntArray);
Możesz także tworzyć/aktualizować węzły w następujący sposób:

MyJsonDoc.SetChildNodeValueInt32(‚_id’, 0);
MyJsonDoc.SetChildNodeValueText([„imię”, „pierwszy”], „Jan”);
MyJsonDoc.SetChildNodeValueDateTime(‚narodziny’, teraz);
Aby załadować i zapisać z BSON:

MyJsonDoc.LoadFromFile(aBSONFileName, False{saxMode}, True{BSON});
MyJsonDoc.SaveToFile(aBSONFileName, False{saxMode}, True{BSON});
Aby przeanalizować dokument JSON w trybie Sax:

MyJsonDoc.onParseText := procedura (Nadawca: TObject;
const Ścieżka: AnsiString;
nazwa stała: AnsiString;
const Argumenty: tablica const;
Podtyp węzła: TALJSONNodeSubType)
rozpocznij
sprawa NodeSubType of
nstFloat: Writeln(Path + „=” + ALFloatToStr(Args[0].VExtended^, ALDefaultFormatSettings));
nstText: Writeln(Ścieżka + „=” + ansiString(Args[0].VAnsiString));
nstObjectID: Writeln(Path + '=' + 'ObjectId("'+ALBinToHex(ansiString(Args[0].VAnsiString))+'")');
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));
nstNull: Writeln(Ścieżka + „=” + „null”);
nstRegEx: Writeln(Ścieżka + „=” + 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^)+’)’);
koniec;
koniec;
MyJsonDoc.LoadFromJSON(AJsonStr, true{saxMode});
Opakowanie ImageMagick dla Delphi
Użyj ImageMagick® do tworzenia, edytowania, komponowania i konwertowania obrazów bitmapowych. Może czytać i zapisywać obrazy w różnych formatach (ponad 200), w tym PNG, JPEG, GIF, HEIC, TIFF, DPX, EXR, WebP, Postscript, PDF i SVG. Użyj ImageMagick do zmiany rozmiaru, odwracania, odbijania lustrzanego, obracania, zniekształcania, przycinania i przekształcania obrazów, dostosowywania kolorów obrazów, stosowania różnych efektów specjalnych lub rysowania tekstu, linii, wielokątów, elips i krzywych Béziera.

Przykład:

var aWand: PMagickWand;
rozpocznij

//Utwórz bibliotekę ImageMagick
alCreateImageMagickLibrary({alcinoe_rootdir} + „\lib\dll\imagemagick\win32\imagemagick”, min(2, System.CPUCount){aThreadLimit});
spróbuj

//utwórz wskaźnik różdżki
aWand := ALImageMagickLib.NewMagickWand;
spróbuj

//załaduj obraz
if ALImageMagickLib.MagickReadImage(aWand, pansiChar(aInputFilename)) <> MagickTrue następnie RaiseLastMagickWandError(aWand);

//Ustaw jakość kompresji
if ALImageMagickLib.MagickSetImageCompressionQuality(aWand,80) <> MagickTrue następnie RaiseLastMagickWandError(aWand);

//autoryzuj obraz
jeśli ALImageMagickLib.MagickAutoOrientImage(aWand) <> MagickTrue to RaiseLastMagickWandError(aWand);

//Zmień rozmiar obrazu za pomocą filtra Lanczos
if ALImageMagickLib.MagickResizeImage(aWand, 640, 480, LanczosFilter) <> MagickTrue następnie RaiseLastMagickWandError(aWand);

//zapisz obraz
ALImageMagickLib.MagickWriteImage(aWand, pansiChar(nazwa pliku wyjściowego));

wreszcie
ALImageMagickLib.DestroyMagickWand(aRóżdżka);
koniec;

wreszcie
alFreeImageMagickLibrary;
koniec;

koniec;

Klient MongoDb
Delphi Klient bazy danych MongoDB. Sterownik Delphi (z pulą połączeń) umożliwiający dostęp do serwera mongoDB. Pula połączeń to pamięć podręczna połączeń z bazą danych, utrzymywana w taki sposób, że połączenia mogą być ponownie wykorzystane, gdy wymagane będą przyszłe żądania do bazy danych. W przypadku tworzenia puli połączeń, po utworzeniu połączenia, jest ono umieszczane w puli i wykorzystywane ponownie, dzięki czemu nie trzeba nawiązywać nowego połączenia. Jeśli wszystkie połączenia są używane, tworzone jest nowe połączenie i dodawane do puli. Pule połączeń skracają także czas oczekiwania użytkownika na nawiązanie połączenia z bazą danych.

Przykład:

aJSONDoc := TALJSONDocument.create;
aMongoDBClient := TAlMongoDBClient.create;
spróbuj
aMongoDBClient.Connect(”, 0);
aMongoDBClient.SelectData(‚test.exemple’,
„{fieldA:123}”, // zapytanie
„{fieldA:1, FieldB:1}”, // selektor pól zwrotnych
aJSONDoc.node);
aMongoDBClient.disconnect;
dla i := 0 do aJSONDoc.node.childnodes.count – 1 do
z aJSONDoc.node.childnodes[i] tak
writeln(aJSONDoc.node.childnodes[i].nazwa węzła + „=” + aJSONDoc.node.childnodes[i].tekst)
wreszcie
aMongoDBClient.free;
aJSONDoc.free;
koniec;
Przykład z pulą połączeń:

aMongoDBConnectionPoolClient := TAlMongoDBConnectionPoolClient.create(aDBHost, aDBPort);
spróbuj

::Wątek1::
aMongoDBConnectionPoolClient.SelectData(‚test.example’,
„{fieldA:123}”, // zapytanie
„{fieldA:1, FieldB:1}”, // selektor pól zwrotnych
aLocalVarJSONDOC.node);

::Wątek2::
aMongoDBConnectionPoolClient.SelectData(‚test.example’,
„{fieldA:999}”, // zapytanie
„{fieldA:1, FieldB:1}”, // selektor pól zwrotnych
aLocalVarJSONDOC.node);

wreszcie
aMongoDBClient.free;
koniec;
Przykładowe monitorowanie ogona:

aMongoDBTailMonitoringThread := TAlMongoDBTailMonitoringThread.Create(
adBHost,
AdBPort,
„test.cappedCollectionExemple”
„{}”, // zapytanie
„{fieldA:1, FieldB:1}”, // selektor pól zwrotnych

Procedura (Nadawca: TObject; JSONRowData: TALJSONNode)
rozpocznij
writeln(„Dodano nowy element w cappedCollectionExemple: „ + JSONRowData.childnodes[„poleA”].tekst);
koniec,

(Nadawca: TObject; Błąd: Wyjątek)
rozpocznij
writeln(Error.message);
koniec);
….
aMongoDBTailMonitoringThread.free;
Klient WebSocket
Klient WebSocket dla Delphi zaimplementowany na platformie WinHTTP. WebSocket to protokół komunikacyjny, który umożliwia otwarcie dwukierunkowej interaktywnej sesji komunikacyjnej pomiędzy przeglądarką użytkownika a serwerem. Dzięki temu możesz wysyłać wiadomości do serwera i otrzymywać odpowiedzi sterowane zdarzeniami bez konieczności odpytywania serwera o odpowiedź.

Szybki TStringList
TALStringList Działa tak samo jak Delphi TStringList z tą różnicą, że umożliwia wyszukiwanie nazwa=wartość przy użyciu algorytmu szybkiego sortowania podczas sortowania listy. Ponadto TALStringList używa algorytmu niezależnego od ustawień regionalnych (opartego na 8-bitowej wartości porządkowej każdego znaku) zamiast AnsiCompareText i AnsiCompareStr używanych przez Delphi TStringList. na koniec sortowanie w TALStringList jest do 10 razy szybsze niż w Delphi TStringList. Również TALStringList nie jest Unicode TStringList, ale 100% Ansi StringList

TALNVStringList (NV dla NameValue) jest taki sam jak TALStringList (użyj także algorytmu szybkiego sortowania), z tą różnicą, że tutaj optymalizacja jest zorientowana na listę nazw/wartości, a nie na listę ciągów znaków.

TALHashedStringList TALHashedStringList jest taki sam jak TALStringList, z tą różnicą, że zamiast algorytmu szybkiego sortowania używa wewnętrznej tablicy mieszającej. Używając TALHashedStringList zamiast TALStringList, możesz poprawić wydajność, gdy lista zawiera dużą liczbę ciągów (w przeciwnym razie, jeśli lista nie zawiera wielu ciągów, wydajność jest niższa niż TALStringList ze względu na koszt obliczenia skrótu)

Program uruchamiający PHP
ALPHPRunnerEngine to prosty, ale użyteczny komponent umożliwiający łatwe użycie php (dowolnej wersji) jako języka skryptowego w aplikacjach Delphi. ALPhpRunnerEngine pozwala na wykonywanie skryptów PHP w ramach programu Delphi bez serwera WWW. ALPHPRunnerEngine używa interfejsu CGI/FastCGI (php-cgi.exe) PHP do komunikacji z silnikiem PHP.

Klient Memcached
Delphi Klient bazy danych memcached.

Co to jest Memcached? Bezpłatny i open source, wysokowydajny system buforowania obiektów w pamięci rozproszonej, o charakterze ogólnym, ale przeznaczony do przyspieszania dynamicznych aplikacji internetowych poprzez zmniejszenie obciążenia bazy danych.

Memcached to przechowywany w pamięci klucz-wartość, przechowujący małe fragmenty dowolnych danych (łańcuchy, obiekty) z wyników wywołań baz danych, wywołań API lub renderowania stron.

Memcached jest prosty, ale potężny. Jego prosta konstrukcja zapewnia szybkie wdrożenie, łatwość programowania i rozwiązuje wiele problemów napotykanych przez duże pamięci podręczne danych.

Komponent GSM
Komponent TAlGSMComm implementuje przesyłanie wiadomości tekstowych SMS za pośrednictwem interfejsu tekstowego zdefiniowanego w Specyfikacji technicznej GSM 07.05, wersja 5.1.0 z grudnia 1996. Istnieje kilka odmian tej specyfikacji, stosowanych w modelach firm Nokia, Siemens, Ericsson itp. We własnym zakresie przetestowaliśmy telefon Nokia 6230, ale modele Nokia 7190, 8890, 6210 i 9110 również powinny działać. Telefony innych producentów również będą działać, o ile zaimplementują interfejs w trybie tekstowym. Około 1/4 obecnych telefonów można podłączyć do komputera PC (przez podczerwień lub kabel szeregowy), około 1/3 z nich działa tylko w trybie tekstowym, 1/3 tylko w trybie PDU, a druga 1/3 obsługuje zarówno tryb tekstowy, jak i PDU. Niektóre telefony (takie jak Nokia 5190) obsługują wiadomości SMS, ale korzystają z zastrzeżonego protokołu, którego TALGSMComm nie obsługuje.

Aby przetestować telefon, podłącz telefon do komputera za pomocą kabla szeregowego lub urządzenia na podczerwień (więcej informacji na temat sposobu połączenia można znaleźć w dokumentacji telefonu). Wpisz „AT” w oknie terminala, aby sprawdzić, czy połączenie zostało nawiązane (powinieneś otrzymać „OK” od telefonu), a następnie wpisz „AT+CMGF=?”. Odpowiedź powinna zawierać „1”, co oznacza, że ​​obsługuje tryb tekstowy. Jeśli oba te testy przejdą pomyślnie, oznacza to, że Twój telefon spełnia podstawowe wymagania.

Klient SQLite3
Zapytaj bazę danych Sqlite3 i uzyskaj wynik w formacie Xml lub w formacie Json/Bson.

I wiele więcej
Biegacz CGI
Klient HTTP (WinInet/WinHTTP)
Klient MySQL
Klient NNTP
Klient POP3
Klient SMTP
Parser Xml

WIN64
Niestety w win64 straciliśmy całe dziedzictwo FastCode. (który był głównie oparty na ASM). Oznacza to, że większość funkcji będzie działać około 2x do 10x wolniej. możesz spróbować uruchomić /demo/ALStringBenchMark/ w win64 i Win32, aby zobaczyć różnicę w szybkości.