Die Alcinoe Component Library von Zeus64 ist eine Open-Source-Bibliothek für visuelle und nicht-visuelle Komponenten für Delphi.
Vollständiger OpenGL-Videoplayer, WebRTC-Delphi-Wrapper, natives iOS/Android-TEdit, verbesserte Firemonkey-Steuerelemente, Firebase-Cloud-Messaging, Android/ios-Facebook-SDK-Anmeldung, Json/Bson-Parser, ImageMagick-Wrapper, MongoDB-Client.
Alcinoe ist mit Delphi Rio 10.3.3 und Delphi Sydney 10.4.2 kompatibel
https://github.com/Zeus64/alcinoe
Mit Delphi Alexandria 11.1, das den MOD-Download unterstützt (entfernt):
Alcinoe ist jetzt vollständig kompatibel mit Delphi Athen 12.3.
Installieren Sie Alcinoe
Wenn Sie keine Alcinoe- visuellen Komponenten zur Designzeit verwenden möchten, müssen Sie nichts installieren, sondern fügen Sie einfach {alcinoe_rootdir}\source zum Suchpfad Ihres Projekts hinzu.
Wenn Sie zur Entwurfszeit visuelle Komponenten verwenden möchten, müssen Sie die BPL installieren. Starten Sie Delphi und gehen Sie zu Komponente > Pakete installieren… > und wählen Sie die BPL aus, die sich in {alcinoe_rootdir}\lib\bpl\alcinoe\Win32\sydney\Alcinoe_sydney.bpl befindet (wenn Sie sich in Delphi Sydney befinden, wählen Sie andernfalls das Verzeichnis aus, das Ihrer Delphi-Version entspricht). Sie müssen Ihrem Suchpfad noch {alcinoe_rootdir}\source hinzufügen
Alcinoe verbessert auch ein wenig die ursprünglichen Delphi-Quellcodes. Auf diese Weise müssen Sie zu {alcinoe_rootdir}\embarcadero\sydney\10_4_2 gehen und update.bat ausführen, um den ursprünglichen Delphi-Quellcode abzurufen und zu patchen. Die Batchdatei geht davon aus, dass sich der ursprüngliche Quellcode in „c:\Program Files (x86)\Embarcadero\Studio\21.0\source“ befindet und dass Sie GIT in Ihrem Pfad haben. Nachdem der Stapel kopiert und gepatcht wurde, muss der Delphi-Quellcode diesen Quellcode in Ihren Projektsuchpfad aufnehmen.
Zur Fertigstellung nutzen immer mehr Bibliotheken Java 1.8-Funktionen (wie webRTC, Exoplayer usw.). Auf diese Weise müssen wir Desugaring durchführen (Desugaring ermöglicht Ihnen die Nutzung dieser Funktionen auf älteren Geräten, indem während des Build-Prozesses neue Bytecodes und Sprach-APIs durch ältere ersetzt werden). Bei d8.bat (Ersatz von dx.bat) ist die Entzuckerung standardmäßig aktiviert. So können Sie jetzt die meisten der neuesten Sprachänderungen nutzen und gleichzeitig ältere Geräte ansprechen. Während wir auf den Wechsel von Embarcadero zu D8.bat warten, müssen wir DX.bat zu einem „Proxy“ für D8.bat machen. Ersetzen Sie dazu einfach Ihre ursprüngliche DX.bat (meine befindet sich in c:\SDKs\android\build-tools\30.0.3\d8.bat) durch die in {alcinoe_rootdir}\tools\D8Proxy\dx.bat. Weitere Details finden Sie hier: https://quality.embarcadero.com/browse/RSP-24155
Vollständiger OpenGL-Videoplayer für FireMonkey
ALVideoPlayer rendert ein Video auf einer TEXTUR. Dies ist sehr wichtig, da Sie das Video vollständig in das Delphi-Formular integrieren können und beliebige Steuerelemente darüber platzieren können, da es die Z-Reihenfolge unterstützt. Offizielle Delphi-Videoplayer sind lediglich native Videoplayer-Fenster, die über dem Formular angezeigt werden und somit keine Z-Reihenfolge unterstützen.
Unter Android verwende ich ExoPlayer. ExoPlayer unterstützt Funktionen wie dynamisches adaptives Streaming über HTTP (DASH), HLS, SmoothStreaming und Common Encryption, die von MediaPlayer nicht unterstützt werden. Es ist so konzipiert, dass es einfach angepasst und erweitert werden kann. Unter iOS verwende ich AVPlayer mit Unterstützung auch HLS wie ExoPlayer
Videoplayer für FireMonkey Videoplayer für FireMonkey Videoplayer für FireMonkey
WebRTC Delphi-Wrapper
WebRTC (Web Real-Time Communications) ist eine Technologie, die es Webanwendungen und -seiten ermöglicht, Audio- und/oder Videomedien zu erfassen und optional zu streamen sowie beliebige Daten zwischen Browsern und mobilen Anwendungen auszutauschen, ohne einen Vermittler zu benötigen. Der Satz von Standards, der WebRTC ausmacht, ermöglicht den Datenaustausch und die Durchführung von Videokonferenzen peer-to-peer, ohne dass der Benutzer Plug-ins oder andere Software von Drittanbietern installieren muss.
Mit der TALWebRTC-Komponente können Sie Ihren Anwendungen ganz einfach Video- und Audio-Chat hinzufügen, was eine völlig neue Welt der Interaktivität eröffnet
Delphi WebRTC-Wrapper
Firemonkey natives iOS/Android TEdit und TMemo
Die Idee ist, FireMonkey-Steuerelemente mit nativen Plattform-Steuerelementen zu kombinieren, wenn die Implementierung bestimmter Funktionen in solchen Steuerelementen sehr schwierig wird (z. B. Webbrowser, Textfeld, Memo, Datumsauswahl usw.). Es geht jedoch nicht darum, mehrere unterschiedliche Formulare für verschiedene Plattformen zu erstellen, wie z. B. bei http://www.turbococoa.com/ (obwohl dies auch eine gute Alternative sein kann, es liegt an Ihnen, zu entscheiden).
In Delphi (Berlin) gibt es bereits eine IOS-Plattformsteuerung, die recht gut implementiert wurde, aber nahezu keine Android-Plattformsteuerung, und so fange ich an, native Android/iOS-Steuerungen wie TEdit/TMemo zu erstellen. Diese Steuerelemente funktionieren größtenteils wie einige Fenster, die oben im Formular platziert werden (also natürlich keine Z-Reihenfolge mit FireMonkey-Steuerelement).
Zeichnen Zeichnen
Zeichnung
Schnelle/doppelt gepufferte FireMonkey-Steuerelemente mit nativem Zeichnen
Rechteck
Kreis
Text (Kann auch HTML-Text auf iOS/Android/Windows/macOS anzeigen)
Glyphe
usw.
TALRectangle
TALRectangle
Die Tatsache
Das Rendern von FireMonkey-Steuerelementen kann manchmal langsam sein, oder anders ausgedrückt, nicht schnell genug für ein flüssiges Scrollen. Zum Beispiel kann die Renderprozedur für ein einfaches TRectangle mit abgerundeten Ecken etwa 3 ms dauern! Wenn Sie also etwa 20 sichtbare TRectangles auf Ihrem Bildschirm haben, kostet das Neurendern des gesamten Bildschirms etwa 60 ms (und normalerweise haben Sie nicht nur TRectangle, sondern auch TLabel, TCheckbox usw.). Wenn es 100 ms dauert, den Bildschirm neu zu rendern, können Sie nur etwa 10 Frames pro Sekunde darstellen (in Wirklichkeit werden es noch weniger sein), sodass das Scrollen nicht flüssig ist 🙁
Die Lösung
Ich wollte die FireMonkey-Steuerelemente nicht neu erstellen, das ist für mich zu große Aufgabe, und stattdessen versuche ich, eine Zwischenlösung zu finden. Ich habe diese Lösung gefunden, indem ich eine "doppelt gepufferte" Eigenschaft zu den FireMonkey-Steuerelementen hinzugefügt habe. Anstatt die Steuerelemente für jede einzelne Pixelbewegung des Scrollbereichs immer wieder neu zu rendern, rendere ich das Steuerelement zuerst auf einem "Puffer", den ich direkt im GPU-Speicher speichere (über TTexture), und wenn das System mich auffordert, die Steuerelemente neu zu rendern, rufe ich nicht erneut den Renderalgorithmus auf, sondern zeichne einfach den Puffer TTexture neu.
Die Ergebnisse
Wie bereits erwähnt, dauert das Rendern eines einfachen TRectangle mit abgerundeten Ecken 3 ms. Mit meiner doppelten Pufferung dauert es jetzt nur noch etwa 0,1 ms! Dadurch wirkt das Scrollen viel flüssiger!
OpenGL-Draw => Durch natives iOS/Android-Draw ersetzt
Die meisten grundlegenden Formen (wie TRectangle, TCircle usw.) verwenden OpenGL zum Rendern. Das ist nicht sehr effizient. Um beispielsweise einen Kreis mit OpenGL zu zeichnen, zeichnen Sie tatsächlich 50 Dreiecke. Dies führt oft zu einer schlechten Qualität: https://quality.embarcadero.com/browse/RSP-15206 Bei abgerundeten Rechtecken ist es noch schlimmer, da Sie zuerst den Pfad berechnen und ihn dann zeichnen müssen (was viel langsamer ist als bei TCircle).
Ein weiteres Problem besteht darin, dass alle diese Zeichen von Form.quality abhängen. Wenn Sie „form.quality“ auf „highquality“ setzen, ist alles, was Sie auf der Leinwand tun, Multisample, wie zum Beispiel das Zeichnen eines Bildes, und das könnte problematisch sein, weil das Bild geglättet wird. Wenn Sie form.quality auf highperformance setzen, wird die Zeichnung sehr rau sein (kein Anti-Aliasing).
Um dieses Problem zu beheben, erstelle ich den Puffer meines Steuerelements mithilfe der NATIVE ANDROID/IOS-API. Auf diese Weise erhalten wir eine qualitativ hochwertige Zeichnung auch bei hoher Geschwindigkeit, ohne von der Formqualität abhängig zu sein
TALCircle
Verbesserte FireMonkey-Steuerelemente
ScrollBox
TabControl
RangeTrackBar
RangeTrackBar
Videoplayer für FireMonkey Videoplayer für FireMonkey Videoplayer für FireMonkey
Animation zum Fallen von Konfetti
ALConfetti ist eine einfache Delphi-Bibliothek zum Erstellen einer konfigurierbaren, hochperformanten Konfetti-Animationssequenz.
Konfetti
Firebase-Cloud-Messaging
Eine plattformübergreifende Methode zur Verwendung von Firebase Cloud Messaging (FCM) zum Empfangen von Push-Benachrichtigungen. Mit FCM können Sie eine Client-App benachrichtigen, wenn neue E-Mails oder andere Daten zum Synchronisieren verfügbar sind. Sie können Benachrichtigungsnachrichten senden, um die Nutzerbindung und -bindung zu fördern. Für Anwendungsfälle wie Instant Messaging kann eine Nachricht eine Nutzlast von bis zu 4 KB an eine Client-App übertragen.
Android/iOS VKontakte/Facebook SDK-Anmeldung
Das VKontakte/Facebook SDK für Android ermöglicht es Benutzern, sich mit ihrem VKontakte/Facebook-Konto bei Ihrer App anzumelden. Wenn sich Benutzer mit ihrem VKontakte/Facebook-Konto bei Ihrer App anmelden, können sie Ihrer App Berechtigungen erteilen, damit Sie Informationen abrufen oder Aktionen in ihrem Namen auf VKontakte/Facebook ausführen können.
Fotoeditor-Filter für Android/iOS
Mit TALColorAdjustEffect können Sie mit einem einzigen Klick wunderschöne Fotofilter erstellen, die Ihre Fotos in nur wenigen Minuten zu beeindruckenden und ausdrucksstarken Bildern machen!
Videoplayer für FireMonkey Videoplayer für FireMonkey
Json-Parser
TALJsonDocument ist ein Delphi-Parser/Writer für das JSON/BSON-Datenformat. Es unterstützt DOM- und SAX-Parser (beachten Sie, dass ein besserer Name SAJ für "Simple API for JSON" anstelle von SAX für "Simple API for XML" sein könnte, aber da das SAX-Konzept gut bekannt ist, behalte ich diesen Namen bei), unterstützt das BSON-Format und verwendet eine ähnliche Syntax wie TALXMLDocument / TXMLDocument. TALJsonDocument kann auch JSON-/BSON-Daten in TALStringList exportieren.
Wenn es um das Parsen einiger (Text-)Inhalte geht, werden normalerweise zwei Richtungen in Betracht gezogen. In der JSON-Welt müssen Sie normalerweise eine Wahl treffen zwischen:
Ein DOM-Parser, der eine speicherinterne Baumstruktur von Objekten erstellt, die den JSON-Inhalt abbilden;
Ein SAX-Parser liest den JSON-Inhalt und löst dann für jedes JSON-Element vordefinierte Ereignisse aus.
Tatsächlich verwenden DOM-Parser intern einen SAX-Parser, um den JSON-Inhalt zu lesen. Aufgrund des Overhead bei der Objekterstellung und deren Initialisierung sind DOM-Parser typischerweise drei- bis fünfmal langsamer als SAX (und benötigen deutlich mehr Speicher, um alle Knoten zu speichern). DOM-Parser sind jedoch viel leistungsfähiger für die Datenverarbeitung: Sobald die Daten in native Objekte abgebildet sind, kann der Code ohne Zeitverlust auf jeden Knoten zugreifen, während ein SAX-basierter Zugriff den gesamten JSON-Inhalt erneut lesen muss.
Die meisten in Delphi verfügbaren JSON-Parser verwenden einen DOM-ähnlichen Ansatz. Beispielsweise erstellen die seit Delphi 2010 enthaltene DBXJSON-Einheit oder die SuperObject-Bibliothek eine Klasseninstanz, die jeden JSON-Knoten zuordnet. Um die beste Geschwindigkeit zu erreichen, implementiert TALJsonDocument einen DOM-Parser und auch einen SAX-Parser.
TALJsonDocument kann auch Kommentare innerhalb der JSON-Quelle unterstützen, die eine Erweiterung der JSON-Spezifikationen darstellt
Die Syntax von TALJsonDocument ist der von TALXMLdocument / TXMLDocument sehr ähnlich
TALJsonDocument ist in zwei Varianten verfügbar: TALJsonDocument, das auf dem Anfang von ansiString (also UTF-8) erstellt wird, und TALJsonDocumentU, das auf dem Anfang des Unicode-Strings (also UTF-16) erstellt wird.
Beispiel :
{
_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”,
Jahr: 1975,
von: "National Science Foundation"},
{ Auszeichnung: "Turing Award",
Jahr: 1977,
von: "ACM" }
],
Ehepartner: "",
Adresse: {},
Telefonnummern: []
}
Um auf die Dokumentknoten zuzugreifen:
MyJsonDoc.loadFromJson(AJsonStr, False);
MyJsonDoc.ParseOptions := [poAllowComments]; // um Kommentare im JSON-Quellcode zuzulassen.
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;
für i := 0 bis 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;
Ende;
Oder, wenn Sie sich nicht sicher sind, ob die Knoten existieren, bevor Sie auf sie zugreifen, oder wenn Sie dies nicht überprüfen möchten, können Sie Folgendes tun:
MyJsonDoc.GetChildNodeValueInt32(‘_id’, 0{Standard, wenn kein Knoten vorhanden ist});
MyJsonDoc.GetChildNodeValueText(['name', 'first'], "{default if node not exists}");
MyJsonDoc.GetChildNodeValueDateTime('birth', Now{default if node not exists});
Um die Dokumentknoten zu erstellen:
MyJsonDoc.addchild(‘_id’).int32 := 1;
mit MyJsonDoc.addchild('name', ntObject) begin
addchild('first').text := 'John';
addchild('last').text := 'Backus';
Ende;
MyJsonDoc.addchild('birth').dateTime := Now;
mit MyJsonDoc.addchild('contribs', ntArray) begin
addchild.text := 'Fortran';
addchild.text := 'ALGOL';
addchild.text := 'Backus-Naur Form';
addchild.text := ‘FP’;
Ende;
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’;
Ende;
with addchild(ntObject) do begin
addchild(‘award’).text := ‘Turing Award’;
addchild('year').int32 := 1977;
addchild('by').text := 'ACM';
Ende;
Ende;
MyJsonDoc.addchild('spouse');
MyJsonDoc.addchild('address', ntObject);
MyJsonDoc.addchild('phones', ntArray);
Sie können auch Knoten auf diese Weise erstellen/aktualisieren:
MyJsonDoc.SetChildNodeValueInt32(‘_id’, 0);
MyJsonDoc.SetChildNodeValueText(['name', 'first'], 'John');
MyJsonDoc.SetChildNodeValueDateTime('birth', Now);
Zum Laden und Speichern von BSON:
MyJsonDoc.LoadFromFile(aBSONFileName, False{saxMode}, True{BSON});
MyJsonDoc.SaveToFile(aBSONFileName, False{saxMode}, True{BSON});
Zum Parsen eines JSON-Dokuments im Sax-Modus:
MyJsonDoc.onParseText := procedure (Sender: TObject;
const Path: AnsiString;
const name: AnsiString;
const Args: array of const;
NodeSubType: TALJSONNodeSubType)
beginnen
case NodeSubType of
nstFloat: Writeln(Path + ‘=’ + ALFloatToStr(Args[0].VExtended^, ALDefaultFormatSettings));
nstText: Writeln(Path + ‘=’ + 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(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^)+’)’);
Ende;
Ende;
MyJsonDoc.LoadFromJSON(AJsonStr, true{saxMode});
ImageMagick-Wrapper für Delphi.
Verwenden Sie ImageMagick®, um Bitmap-Bilder zu erstellen, zu bearbeiten, zusammenzustellen oder zu konvertieren. Es kann Bilder in einer Vielzahl von Formaten (über 200) lesen und schreiben, darunter PNG, JPEG, GIF, HEIC, TIFF, DPX, EXR, WebP, Postscript, PDF und SVG. Verwenden Sie ImageMagick, um Bilder zu ändern, zu spiegeln, zu drehen, zu verzerren, zu scheren und zu transformieren, Bildfarben anzupassen, verschiedene Spezialeffekte anzuwenden oder Text, Linien, Polygone, Ellipsen und Bézier-Kurven zu zeichnen.
Beispiel :
var aWand: PMagickWand;
beginnen
//Erstellen Sie die ImageMagick-Bibliothek
alCreateImageMagickLibrary({alcinoe_rootdir} + ‘\lib\dll\imagemagick\win32\imagemagick’, min(2, System.CPUCount){aThreadLimit});
versuchen
//den Zauberstabzeiger erstellen
aWand := ALImageMagickLib.NewMagickWand;
versuchen
//das Bild laden
if ALImageMagickLib.MagickReadImage(aWand, pansiChar(aInputFilename)) <> MagickTrue then RaiseLastMagickWandError(aWand);
//Stellen Sie die Komprimierungsqualität ein
if ALImageMagickLib.MagickSetImageCompressionQuality(aWand,80) <> MagickTrue then RaiseLastMagickWandError(aWand);
//Autorisieren Sie das Bild
if ALImageMagickLib.MagickAutoOrientImage(aWand) <> MagickTrue then RaiseLastMagickWandError(aWand);
//Ändern Sie die Größe des Bildes mit dem Lanczos-Filter
if ALImageMagickLib.MagickResizeImage(aWand, 640, 480, LanczosFilter) <> MagickTrue then RaiseLastMagickWandError(aWand);
//speichere das Bild
ALImageMagickLib.MagickWriteImage(aWand, pansiChar(aOutputFilename));
Endlich
ALImageMagickLib.DestroyMagickWand(aWand);
Ende;
Endlich
alFreeImageMagickLibrary;
Ende;
Ende;
MongoDb-Client
Delphi-Client für die MongoDB-Datenbank. Ein Delphi-Treiber (mit Verbindungspool), um auf einen MongoDB-Server zuzugreifen. Ein Verbindungspool ist ein Cache von Datenbankverbindungen, der so verwaltet wird, dass die Verbindungen wiederverwendet werden können, wenn zukünftige Anfragen an die Datenbank erforderlich sind. Bei der Verwendung eines Verbindungspools wird eine Verbindung nach ihrer Erstellung in den Pool gelegt und wiederverwendet, sodass keine neue Verbindung aufgebaut werden muss. Wenn alle Verbindungen verwendet werden, wird eine neue Verbindung hergestellt und dem Pool hinzugefügt. Verbindungspools reduzieren auch die Zeit, die ein Benutzer benötigt, um eine Verbindung zur Datenbank herzustellen.
Beispiel :
aJSONDoc := TALJSONDocument.create;
aMongoDBClient := TAlMongoDBClient.create;
versuchen
aMongoDBClient.Connect(”, 0);
aMongoDBClient.SelectData('test.exemple',
'{fieldA:123}', // die Abfrage
‘{fieldA:1, fieldB:1}’, // die Felder, die zurückgegeben werden sollen
aJSONDoc.node);
aMongoDBClient.disconnect;
für i := 0 bis aJSONDoc.node.childnodes.count – 1 mache
mit aJSONDoc.node.childnodes[i] mache
schreibe aJSONDoc.node.childnodes[i].nodename + ‘=’ + aJSONDoc.node.childnodes[i].text
Endlich
aMongoDBClient.free;
aJSONDoc.free;
Ende;
Beispiel mit Verbindungspool:
aMongoDBConnectionPoolClient := TAlMongoDBConnectionPoolClient.create(aDBHost, aDBPort);
versuchen
::Thread1::
aMongoDBConnectionPoolClient.SelectData('test.example',
'{fieldA:123}', // die Abfrage
‘{fieldA:1, fieldB:1}’, // die Felder, die zurückgegeben werden sollen
aLocalVarJSONDOC.node);
::Thread2::
aMongoDBConnectionPoolClient.SelectData('test.example',
'{fieldA:999}', // die Abfrage
‘{fieldA:1, fieldB:1}’, // die Felder, die zurückgegeben werden sollen
aLocalVarJSONDOC.node);
Endlich
aMongoDBClient.free;
Ende;
Beispiel für Tail-Monitoring:
aMongoDBTailMonitoringThread := TAlMongoDBTailMonitoringThread.Create(
aDBHost,
aDBPort,
‘test.cappedCollectionExemple’
‘{}’, // die Abfrage
‘{fieldA:1, fieldB:1}’, // die Felder, die zurückgegeben werden sollen
Prozedur (Sender: TObject; JSONRowData: TALJSONNode)
beginnen
writeln(‘Neues Element in cappedCollectionExemple hinzugefügt: ‘ + JSONRowData.childnodes[‘fieldA’].text);
end,
Prozedur (Sender: TObject; Fehler: Ausnahme)
beginnen
writeln(Error.message);
end);
….
aMongoDBTailMonitoringThread.free;
WebSocket-Client
WebSocket-Client für Delphi, implementiert auf Basis von WinHTTP. WebSocket ist ein Kommunikationsprotokoll, das eine bidirektionale, interaktive Kommunikationssitzung zwischen dem Browser des Benutzers und einem Server ermöglicht. Damit können Sie Nachrichten an einen Server senden und ereignisgesteuerte Antworten empfangen, ohne den Server nach einer Antwort abfragen zu müssen.
Schnelle TStringList
TALStringList funktioniert wie die Delphi TStringList, erlaubt aber die Suche nach einem Namen=Wert mithilfe eines Quicksort-Algorithmus, wenn die Liste sortiert ist. Außerdem verwendet TALStringList einen ländereunabhängigen Algorithmus (basierend auf dem 8-Bit-Ordinalwert jedes Zeichens) anstelle von AnsiCompareText und AnsiCompareStr, die von der Delphi TStringList verwendet werden. Am Ende ist die Sortierung in TALStringList bis zu 10-mal schneller als in der Delphi TStringList. Außerdem ist TALStringList keine Unicode-TStringList, sondern eine 100%ige Ansi-StringList.
TALNVStringList (NV für NameValue) ist dasselbe wie TALStringList (verwenden Sie auch einen Quicksort-Algorithmus), außer dass sich die Optimierung hier auf die Namens-/Werteliste statt auf die Zeichenfolgenliste konzentriert.
TALHashedStringList TALHashedStringList ist dasselbe wie TALStringList, außer dass es eine interne Hash-Tabelle anstelle eines Quicksort-Algorithmus verwendet. Durch die Verwendung von TALHashedStringList anstelle von TALStringList können Sie die Leistung verbessern, wenn die Liste eine große Anzahl von Zeichenfolgen enthält (andernfalls ist die Leistung aufgrund der Kosten für die Berechnung des Hashs geringer als bei TALStringList, wenn Ihre Liste nicht viele Zeichenfolgen enthält).
PHP-Läufer
ALPHPRunnerEngine ist ein einfaches, aber nützliches Komponente, um PHP (jede Version) einfach als Skriptsprache in Delphi-Anwendungen zu verwenden. ALPHPRunnerEngine ermöglicht die Ausführung von PHP-Skripten innerhalb des Delphi-Programms, ohne einen Webserver. ALPHPRunnerEngine verwendet die CGI/FastCGI-Schnittstelle (php-cgi.exe) von PHP, um mit der PHP-Engine zu kommunizieren.
Memcached-Client
Delphi-Client für die memcached-Datenbank.
Was ist Memcached? Kostenloses und quelloffenes, leistungsstarkes, verteiltes Speicherobjekt-Caching-System, generisch, aber für die Beschleunigung dynamischer Webanwendungen durch Verringerung der Datenbanklast gedacht.
Memcached ist ein speicherinterner Schlüsselwertspeicher für kleine Teile beliebiger Daten (Strings, Objekte) aus Ergebnissen von Datenbankaufrufen, API-Aufrufen oder Seitenrendering.
Memcached ist einfach, aber leistungsstark. Sein einfaches Design fördert eine schnelle Bereitstellung, einfache Entwicklung und löst viele Probleme, die bei großen Datencaches auftreten.
GSM-Komponente
Die Komponente TAlGSMComm implementiert SMS-Textnachrichten über die textbasierte Schnittstelle, die in der GSM-Technischen Spezifikation 07.05, Version 5.1.0, vom Dezember 1996 definiert ist. Es gibt verschiedene Varianten dieser Spezifikation, die in Nokia-, Siemens-, Ericsson- usw. Modellen verwendet werden. Wir haben das Nokia 6230 intern getestet, aber die Modelle Nokia 7190, 8890, 6210 und 9110 sollten ebenfalls funktionieren. Telefone von anderen Herstellern funktionieren ebenfalls, solange sie die textbasierte Schnittstelle implementieren. Etwa 1/4 der aktuellen Telefone können mit einem PC verbunden werden (über IR oder serielles Kabel), etwa 1/3 davon sind nur textbasiert, 1/3 sind nur im PDU-Modus und die anderen 1/3 unterstützen sowohl Text- als auch PDU-Modus. Einige Telefone (wie das Nokia 5190) unterstützen SMS, verwenden aber ein proprietäres Protokoll, das TALGSMComm nicht unterstützt.
Um Ihr Telefon zu testen, verbinden Sie es über das serielle Kabel oder ein IR-Gerät mit Ihrem PC (weitere Informationen zum Anschließen finden Sie in der Dokumentation Ihres Telefons). Geben Sie „AT“ in ein Terminalfenster ein, um zu überprüfen, ob die Verbindung hergestellt wurde (Sie sollten „OK“ vom Telefon erhalten), und geben Sie dann „AT+CMGF=?“ ein. Die Antwort sollte eine „1“ enthalten, was angibt, dass der Textmodus unterstützt wird. Wenn beide Tests bestanden werden, erfüllt Ihr Telefon die Grundanforderungen.
SQLite3-Client
Abfrage der Sqlite3-Datenbank und Ausgabe des Ergebnisses im XML-Format oder im JSON/BSON-Format.
Und noch viel mehr
CGI-Runner.
HTTP-Client (WinInet/WinHTTP).
MySQL-Client.
NNTP-Client.
POP3-Client.
SMTP-Client.
XML-Parser.
WIN64
Leider haben wir in win64 das gesamte "FastCode"-Erbe verloren (das hauptsächlich auf Assembler basierte). Das bedeutet, dass die meisten Funktionen etwa 2- bis 10-mal langsamer sein werden. Sie können /demo/ALStringBenchMark/ in win64 und Win32 ausführen, um den Geschwindigkeitsunterschied zu sehen.