مقالة تقنية

السينوي مع دعم دلفي 11.1 الإسكندرية

· برمجة Delphi

مكتبة Alcinoe Component Library من Zeus64 هي مكتبة مفتوحة المصدر للمكونات المرئية وغير المرئية لـ Delphi.

مشغل فيديو OpenGL كامل، واجهة WebRTC لـ Delphi، مكون TEdit أصلي لنظامي iOS/Android، تحسينات على عناصر FireMonkey، خدمة Firebase cloud messaging، تسجيل الدخول باستخدام Facebook SDK لنظامي 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 وانتقل إلى component > Install Packages… واختر ملف 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 باستخدام هذه الميزات على الأجهزة القديمة عن طريق استبدال التعليمات البرمجية والواجهات البرمجية الجديدة ببدائل أقدم أثناء عملية البناء). مع 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 بعرض فيديو على شكل TEXTURE. هذا مهم جدًا لأنه يمكنك دمج الفيديو بالكامل في نموذج Delphi ويمكنك وضع أي عناصر تحكم تريدها فوقه لأنه يدعم ترتيب Z. مشغلات الفيديو الرسمية لـ Delphi هي ببساطة نافذة مشغل فيديو أصلية فوق النموذج وبالتالي لا تدعم ترتيب Z.

تحت نظام Android، أستخدم ExoPlayer. يدعم ExoPlayer ميزات مثل البث التكيفي الديناميكي عبر HTTP (DASH) و HLS و SmoothStreaming والتشفير الشائع، والتي لا يدعمها MediaPlayer. تم تصميمه ليكون سهل التخصيص والتوسيع. تحت نظام iOS، أستخدم AVPlayer مع دعم HLS مثل ExoPlayer.

مشغل فيديو لـ FireMonkey مشغل فيديو لـ FireMonkey مشغل فيديو لـ FireMonkey

واجهة WebRTC لـ Delphi.
WebRTC (اتصالات الوقت الفعلي عبر الويب) هي تقنية تتيح لتطبيقات ومواقع الويب التقاط وبث الصوت والفيديو، بالإضافة إلى تبادل البيانات بين المتصفحات وتطبيقات الهاتف المحمول دون الحاجة إلى وسيط. مجموعة المعايير التي تشكل WebRTC تجعل من الممكن مشاركة البيانات وإجراء المؤتمرات عن طريق الاتصال المباشر، دون الحاجة إلى تثبيت أي مكونات إضافية أو برامج تابعة لجهات خارجية.

المكون TALWebRTC يجعل من السهل إضافة الدردشة الصوتية والمرئية إلى تطبيقاتك، مما يفتح عالمًا جديدًا من التفاعلية.

واجهة WebRTC لـ Delphi.

عناصر تحكم Firemonkey الأصلية لنظامي التشغيل iOS وAndroid، TEdit وTMemo.
الفكرة هي دمج عناصر تحكم FireMonkey مع عناصر تحكم خاصة بالنظام الأساسي عندما يصبح تنفيذ وظائف معينة في عناصر تحكم FireMonkey أمرًا صعبًا للغاية (مثل متصفح الويب، ومربع النص، والملاحظات، ومحدد التاريخ، وما إلى ذلك). ولكن الهدف ليس إنشاء نماذج منفصلة لكل نظام أساسي، كما هو الحال في http://www.turbococoa.com/ (ولكن هذا الخيار هو أيضًا بديل جيد في بعض النواحي، الأمر متروك لك لتقرر).

في Delphi (berlin)، هناك بالفعل عناصر تحكم خاصة بمنصة iOS تم تنفيذها بشكل جيد، ولكن لا توجد سوى عدد قليل جدًا من عناصر التحكم الخاصة بمنصة Android، لذلك بدأت في إنشاء عناصر تحكم أصلية لنظامي Android وiOS مثل TEdit/TMemo. تعمل هذه العناصر بشكل أساسي مثل بعض النوافذ التي توضع فوق النموذج (لذلك لا يوجد ترتيب Z مع عناصر تحكم FireMonkey).

Drawing Drawing

Drawing

عناصر تحكم FireMonkey سريعة/ذات تخزين مؤقت مزدوج مع رسم أصلي.
مستطيل.
دائرة.
نص (يمكن أيضًا رسم نص HTML على iOS/Android/Windows/macOS).
رمز.
إلخ.
TALRectangle

TALRectangle

الحقيقة
قد يكون رسم عناصر تحكم FireMonkey أبطأ في بعض الأحيان، أو بعبارة أخرى، ليس سريعًا بما يكفي لتحقيق تجربة تمرير سلسة. على سبيل المثال، إذا نظرت فقط إلى عنصر TRectangle الأساسي مع زوايا مستديرة، فقد يستغرق إجراء الرسم حوالي 3 مللي ثانية! لذا، إذا كان لديك حوالي 20 عنصر TRectangle مرئيًا على الشاشة، فسيستغرق إعادة رسم الشاشة بأكملها حوالي 60 مللي ثانية (وعادةً لا يكون لديك فقط عناصر TRectangle، بل أيضًا TLabel و TCheckbox وما إلى ذلك). بعد ذلك، الأمر مجرد حساب بسيط: يستغرق الأمر 100 مللي ثانية لإعادة رسم الشاشة بأكملها، لذا يمكنك عرض حوالي 10 إطارات في الثانية فقط (وفي الواقع، سيكون لديك أقل من ذلك بكثير)، وبالتالي لا يمكن أن تكون عملية التمرير سلسة 🙁

الحل
لم أكن أرغب في إعادة بناء عناصر تحكم FireMonkey، فهي مهمة ضخمة جدًا بالنسبة لي، وبدلاً من ذلك، حاولت إيجاد حل وسيط. لقد وجدت هذا من خلال إضافة خاصية "المخزن المؤقت المزدوج" إلى عناصر تحكم FireMonkey. بدلًا من إعادة رسم عناصر التحكم مرارًا وتكرارًا لكل حركة بكسل صغيرة في مربع التمرير، أقوم أولاً برسم عنصر التحكم في "مخزن مؤقت" أقوم بتخزينه مباشرة في ذاكرة وحدة معالجة الرسومات (من خلال TTexture)، وعندما يطلب النظام مني إعادة رسم عناصر التحكم، بدلًا من استدعاء خوارزمية الرسم مرة أخرى، أقوم ببساطة بإعادة رسم مخزن TTexture.

النتائج
كما قلت من قبل، يستغرق الأمر 3 مللي ثانية فقط لرسم عنصر TRectangle بسيط مع زوايا مستديرة. مع خاصية المخزن المؤقت المزدوج الخاصة بي، يستغرق الأمر الآن حوالي 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، فسيكون الرسم خشنًا جدًا (بدون إزالة التعرج).

لحل هذه المشكلة، قمت ببناء المخزن المؤقت للتحكم الخاص بي باستخدام واجهات برمجة تطبيقات ANDROID/IOS الأصلية. بهذه الطريقة، سنحصل على رسم عالي الجودة وسرعة عالية دون الاعتماد على form.quality.

TALCircle

تحسينات على عناصر تحكم FireMonkey.
ScrollBox
TabControl
RangeTrackBar
RangeTrackBar

مشغل فيديو لـ FireMonkey مشغل فيديو لـ FireMonkey مشغل فيديو لـ FireMonkey

تأثير تساقط الحرفية
ALConfetti هي مكتبة Delphi بسيطة لإنشاء تأثير تساقط الحرفية عالي الأداء وقابل للتكوين.

حرفية

خدمة Firebase السحابية
طريقة متعددة المنصات لاستخدام Firebase Cloud Messaging (FCM) لتلقي الإشعارات. باستخدام FCM، يمكنك إعلام تطبيق العميل بتوفر رسائل بريد إلكتروني أو بيانات أخرى للمزامنة. يمكنك إرسال رسائل إعلامية لزيادة تفاعل المستخدمين والاحتفاظ بهم. بالنسبة لحالات الاستخدام مثل المراسلة الفورية، يمكن للرسالة نقل حمولة تصل إلى 4 كيلوبايت إلى تطبيق العميل.

تسجيل الدخول عبر حزم تطوير البرمجيات (SDK) الخاصة بـ VKontakte/Facebook لنظامي Android وiOS.
تتيح حزمة تطوير البرمجيات (SDK) الخاصة بـ VKontakte/Facebook لنظام Android للمستخدمين تسجيل الدخول إلى تطبيقك باستخدام VKontakte/Facebook. عند تسجيل الدخول إلى تطبيقك باستخدام VKontakte/Facebook، يمكن للمستخدمين منح تطبيقك أذونات لاسترداد معلومات أو تنفيذ إجراءات نيابة عنهم على VKontakte/Facebook.

فلاتر تحرير الصور لنظامي Android وiOS.
مع TALColorAdjustEffect، يمكنك الحصول على فلاتر صور رائعة مع تحسين تلقائي بنقرة واحدة، مما يجعل صورك جميلة ومعبرة في دقائق معدودة!

مشغل فيديو لـ FireMonkey.

محلل JSON.
TALJsonDocument هو محلل/كاتب لـ Delphi لتنسيق البيانات JSON/BSON. يدعم محلل 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 أكثر قوة في التعامل مع البيانات: بمجرد تعيينها في كائنات أصلية، يمكن للتعليمات البرمجية الوصول إلى أي عقدة بسرعة دون الحاجة إلى إعادة قراءة محتوى JSON بأكمله، بينما يتطلب الوصول القائم على 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” },
{ الجائزة: "Turing Award"،
السنة: 1977،
الجهة المانحة: "ACM" }
],
الزوج/الزوجة: ""،
العنوان: {}،
أرقام الهواتف: []
}
للوصول إلى عقد المستند:

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;
مع MyJsonDoc.addchild('name', ntObject) قم بما يلي:
addchild('first').text := 'John';
addchild('last').text := 'Backus';
end;
MyJsonDoc.addchild('birth').dateTime := Now;
مع MyJsonDoc.addchild('contribs', ntArray) قم بما يلي:
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
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^)+’)’);
end;
end;
MyJsonDoc.LoadFromJSON(AJsonStr, true{saxMode}).
واجهة ImageMagick لـ Delphi.
استخدم ImageMagick® لإنشاء أو تحرير أو دمج أو تحويل صور بتية. يمكنه قراءة وكتابة الصور بتنسيقات متنوعة (أكثر من 200) بما في ذلك PNG وJPEG وGIF وHEIC وTIFF وDPX وEXR وWebP وPostscript وPDF وSVG. استخدم ImageMagick لتغيير حجم الصور، وقلبها، وعكسها، وتدويرها، وتشويحها، وتحويلها، وتعديل ألوان الصور، وتطبيق تأثيرات خاصة متنوعة، أو رسم نصوص وخطوط ومضلعات وإهليلجات ومنحنيات Bézier.

مثال:

var aWand: PMagickWand;
ابدأ

//إنشاء مكتبة 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، فقم برفع آخر خطأ لـ MagickWand.

//قم بتعديل حجم الصورة تلقائيًا.
إذا كانت ALImageMagickLib.MagickAutoOrientImage(aWand) لا تساوي MagickTrue، فقم برفع آخر خطأ لـ MagickWand.

//قم بتغيير حجم الصورة باستخدام مرشح Lanczos.
إذا كانت ALImageMagickLib.MagickResizeImage(aWand, 640, 480, LanczosFilter) لا تساوي MagickTrue، فقم برفع آخر خطأ لـ MagickWand.

//احفظ الصورة.
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;
مثال لمراقبة سجلات:

aMongoDBTailMonitoringThread := TAlMongoDBTailMonitoringThread.Create(
aDBHost,
aDBPort,
‘test.cappedCollectionExemple’
‘{}’, // الاستعلام
‘{fieldA:1, fieldB:1}’, // حقول الإرجاع

الإجراء (Sender: TObject; JSONRowData: TALJSONNode)
ابدأ
اكتب ('تمت إضافة عنصر جديد في cappedCollectionExemple: ' + JSONRowData.childnodes['fieldA'].text);
انتهى

الإجراء (Sender: TObject; Error: Exception)
ابدأ
اكتب (Error.message);
انتهى);
….
aMongoDBTailMonitoringThread.free;
عميل WebSocket
عميل WebSocket لـ Delphi تم تنفيذه باستخدام WinHTTP. WebSocket هو بروتوكول اتصال يسمح بفتح جلسة اتصال تفاعلية ثنائية الاتجاه بين متصفح المستخدم وخادم. باستخدام هذا، يمكنك إرسال رسائل إلى خادم وتلقي استجابات تعتمد على الأحداث دون الحاجة إلى استعلام الخادم للحصول على رد.

Fast TStringList
يعمل TALStringList بنفس طريقة TStringList في Delphi، باستثناء أنه يسمح بالبحث عن اسم=قيمة باستخدام خوارزمية الفرز السريع عندما تكون القائمة مرتبة. بالإضافة إلى ذلك، يستخدم TALStringList خوارزمية مستقلة عن اللغة (تعتمد على القيمة الترتيبية لـ 8 بت لكل حرف) بدلاً من AnsiCompareText و AnsiCompareStr المستخدمة في TStringList في Delphi. في النهاية، يكون الفرز في TALStringList أسرع بما يصل إلى 10 مرات من TStringList في Delphi. أيضًا، TALStringList ليست TStringList Unicode، بل هي TStringList Ansi بنسبة 100٪.

TALNVStringList (NV اختصار لـ NameValue) هو نفسه TALStringList (يستخدم أيضًا خوارزمية الفرز السريع)، باستثناء أن التحسين هنا موجه لقوائم الاسم/القيمة بدلاً من قوائم السلاسل.

TALHashedStringList: TALHashedStringList هو نفسه TALStringList، باستثناء أنه يستخدم جدول تجزئة داخلي بدلاً من خوارزمية الفرز السريع. باستخدام TALHashedStringList بدلاً من TALStringList، يمكنك تحسين الأداء عندما تحتوي القائمة على عدد كبير من السلاسل (أما إذا كانت القائمة لا تحتوي على الكثير من السلاسل، فإن الأداء يكون أقل من TALStringList بسبب تكلفة حساب التجزئة).

PHP runner
ALPHPRunnerEngine هو مكون بسيط ولكنه مفيد لاستخدام لغة PHP (أي إصدار) بسهولة كلغة برمجة في تطبيقات Delphi. يتيح ALPHPRunnerEngine تنفيذ نصوص PHP داخل برنامج Delphi دون الحاجة إلى خادم ويب. يستخدم ALPHPRunnerEngine واجهة CGI/FastCGI الخاصة بـ PHP للتواصل مع محرك PHP.

عميل Memcached.
عميل Delphi لقاعدة بيانات memcached.

ما هو Memcached؟ نظام تخزين مؤقت للكائنات في الذاكرة مفتوح المصدر وعالي الأداء، وهو نظام عام ولكنه مصمم للاستخدام في تسريع تطبيقات الويب الديناميكية عن طريق تخفيف الحمل على قاعدة البيانات.

Memcached هو مخزن قيم ومفاتيح في الذاكرة لتخزين أجزاء صغيرة من البيانات العشوائية (سلاسل، كائنات) من نتائج استعلامات قاعدة البيانات أو استدعاءات واجهات برمجة التطبيقات أو عرض الصفحات.

Memcached بسيط ولكنه قوي. يسمح تصميمه البسيط بالنشر السريع وسهولة التطوير ويحل العديد من المشكلات التي تواجه أنظمة التخزين المؤقت للبيانات الكبيرة.

مكون GSM.
يقوم المكون TAlGSMComm بتنفيذ الرسائل النصية عبر واجهة النص المحدد في المواصفة الفنية لـ 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 الأخرى تدعم كلا الوضعين. تدعم بعض الهواتف (مثل Nokia 5190) الرسائل النصية، ولكنها تستخدم بروتوكولًا خاصًا، وهو ما لا يدعمه 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 لمقارنة سرعة التنفيذ.