
QuickLib هي مكتبة Delphi/Firemonkey (Windows و Linux و Android و OSX & IOS) و FPC (Windows & Linux) تحتوي على وظائف مثيرة للاهتمام وسريعة لتنفيذ ، تم إنشاؤها لتبسيط تطوير التطبيقات ودعم Platplatform وتحسين الإنتاجية. DELPHI XE8 - DELPHI 12 ATHENS دعمت.
يرجى "نجمة" هذا المشروع في جيثب! لا يكلف شيئًا سوى الرجوع إلى الرمز. 
إذا وجدت هذا المشروع مفيدًا ، فيرجى التفكير في تقديم التبرع.
مجالات الوظيفة:
وصف الوحدات الرئيسية:
التحديثات:
السماح لتطبيق وحدة التحكم بتشغيل وضع وحدة التحكم أو وضع الخدمة مع نفس رمز تبسيط مهام التصحيح.
if not AppService.IsRunningAsService then
begin
...your code running as console
end
else
begin
AppService.ServiceName := ' MyService ' ;
AppService.DisplayName := ' MyServicesvc ' ;
// you can pass an anonymous method to events
AppService.OnStart := procedure
begin
...your start code
end ;
AppService.OnExecute := YourExecuteFunction;
AppService.OnStop := YourStopFunction;
AppService.CheckParams;
end ;يبسط التكرار النقطي مع Azure و Amazon Cloud Storage.
// connect to a Azure blobstorage
QuickAzure := TQuickAzure.Create(AzureAccountName,AzureAccountKey);
// download a blob file to a stream
done := QuickAzure.GetBlob( ' MyContainer ' , ' MyFile.jpg ' ,ResponseInfo,MyStream);
// check if exists a folder
found := ExistFolder( ' MyContainer ' , ' /Public/Documents/Personal ' );
// list blobs starting with a pattern (recursively or not)
for azBlob in ListBlobs( ' MyContainer ' , ' /Public/Documents ' ,Recursive,ResponseInfo) do
begin
if azBlob.Size > 1000 then Showmessage(azBlob. Name );
end ;وظائف نطاق CIDR و IP.
// convert ip string to integer
IPv4ToInt( ' 192.168.1.10 ' );
// get first and last ip of a subnet scope
GetIpRange( ' 192.168.100.0 ' , ' 255.255.255.0 ' ,LowIp,HighIP);الوظائف التي تحتاجها في كثير من الأحيان في كل يوم من المطور.
// coverts UTC time TDateTime to Local date time
UTCToLocalTime(MyUTCTime);
// generate a 10 char length random password with alfanumeric and signs.
RandomPassword( 10 ,[pfIncludeNumbers,pfIncludeSigns]);
// Capitalize every word of a phrase
CapitalizeAll( ' the grey fox ' ); // returns "The Grey Fox"
// Simple TCounter and TTimeCounter for loops
counter := TCounter;
counter.Init( 200 );
timecounter : TTimeCounter;
timecounter.Init( 10000 );
while true do
begin
Inc(n);
{ your procedural process here }
// every 200 steps writes to console
if counter.Check then writeln(Format( ' Processed %d entries ' ,[n]));
// every 10 seconds writes to console
if timecounter.Check then writeln( ' Im working... ' );
end ;الكرونومتر وقياس قطعة رمز بسيطة.
// get elapsed time execution of a code part
Chrono := TChronometer.Create(False);
Chrono.Start;
...code you need benchmark
Chrono.Stop;
// shows elapsed time in LongTime format (2 hour(s) and 10 minute(s))
Showmessage(Chrono.TimeElapsed(True));
// shows elapsed time in ShortTime format (02:10:00)
Showmessage(Chrono.TimeElapsed(False));
// get benchmak info of a process
Chrono := TChronoBenchMark.Create;
Chrono.TotalProcess := 100000 ;
for i := 1 to 10000 do
begin
{ your process here }
Chrono.CurrentProcess := i;
// shows estimated time your process will take in x hour(s), x minute(s) x second(s) format
writeln(Chrono.EstimatedTime(True));
// shows speed: num items per second processed of your process
writeln(Format( ' Items processed %d/sec ' ,[Chrono.Speed]));
end ;
writeln(Chrono.ElapsedTime(False)); // shows total time elapsed in 00:00:00 format اكتب رسائل السجل إلى وحدة التحكم بالألوان والمزيد ...
// define which level of output needed
Console.Verbose := LOG_DEBUG;
// writes line to console in red color
cout( ' Error x ' ,etError);
// writes formatted line in green color
coutFmt( ' Proccess %s finished ' ,[ProccesName],etSuccess);
// writes integer
cout( 12348 );
// Connect a QuickLog and write to disk and screen with one line of code (with independent verbose levels)
MyQuickLog := TQuickLog.Create;
MyQuickLog.Verbose := LOG_ALL;
Console.Verbose := LOG_ONLYERRORS;
Console.Log := MyQuickLog;سجل إلى القرص أو الذاكرة بمستويات مطوّلة وتناوب يوميًا أو أقصى.
// write a header on start with info as running path, appname, debugmode, user, etc...
Log.ShowHeader := True;
// sets log with rotation at 20MB
Log.SetLog( ' .mylog.log ' ,False, 20 );
// write an error message
Log.Add( ' Error x ' ,etError);
// write formatted error message
Log.Add( ' Error is %s ' ,[ErrorStr],etError);قم بتحميل/حفظ تكوين كمفاتيح ملف JSON أو YAML أو Windows. قم بإنشاء فئة Descend من TappConfigjson أو TappConfigyaml أو TappConfigregistry وسيتم حفظها/حفظ الخصائص المنشورة. يمكن إعادة تحميل تكوينات الملفات على تغييرات الملفات.
// create a class heritage
TMyConfig = class (TAppConfigJson)
private
fName : string;
fSurname : string;
fStatus : Integer;
published
property Name : string read fName write fName;
property SurName : string read fSurname write fSurname;
property Status : Integer read fStatus write fStatus;
end ;
// create your config to json file
// Add Quick.Config.Json to your uses
MyConfig := TMyConfig.Create( ' Config.json ' );
MyConfig.Provider.CreateIfNotExists := True;
MyConfig.Provider.ReloadIfFileModified := True;
MyConfig. Name := ' John ' ;
MyConfig.Surname := ' Smith ' ;
// load
MyConfig.Load;
// save
MyConfig.Save;
// create your config to Windows Registry
// Add Quick.Config.Registry to your uses
MyConfig := TMyConfig.Create;
// Define Registry as HKEY_CURRENT_USERSoftwareMyApp
MyConfig.HRoot := HKEY_CURRENT_USER;
MyConfig.MainKey := ' MyApp ' ;
MyConfig. Name := ' John ' ;
MyConfig.Surname := ' Smith ' ;
// load
MyConfig.Load;
// save
MyConfig.Save;
// Create a custom Config with no default provider
TMyConfig = class (TAppConfig)
...your properties
end ;
MyConfig := TMyConfig.Create(TAppConfigJsonProvider.Create( ' .config.json ' );
يراقب ملف للتغييرات ورمي الأحداث.
FileMonitor.Filename := ' .myfile.txt ' ;
// check file changes every 2 seconds
FileMonitor.Interval := 2000 ;
// watch for deleted or modified file events
FileMonitor.Notifies := [mnFileModified, mnFileDeleted)];
FileMonitor.OnFileChange := MyFileChangeFunction;
FileMonitor.Enabled := True;utils للعمل مع كائنات JSON.
// When unit declared in uses, a TObject Helper allows all your objects to be loaded or saved to/from json string
MyObject.FromJson := jsonstring;
MyString := MyObject.ToJson;
// You can clone simple objects with clone function
MyObject1.Clone(MyObject2);أرسل بريدًا إلكترونيًا مع خطين رمز.
// Send email
SMTP := TSMTP.Create( ' mail.domain.com ' , 25 ,False);
SMTP.SendMail( ' [email protected] ' , ' [email protected] ' , ' Email subject ' , ' My message body ' );
// You can define more advanced options
SMTP.SenderName := ' John ' ;
SMTP.From := ' [email protected] ' ;
SMTP.Recipient := ' [email protected],[email protected] ' ;
SMTP.Subject := ' Email subject ' ;
SMTP.AddBodyFromFile := ' .body.html ' ;
SMTP.CC := ' [email protected] ' ;
SMTP.BCC := ' [email protected] ' ;
SMTP.Attachments.Add( ' .notes.txt ' );
SMTP.SendMail;موضوعات آمنة الموضوع.
ttheredqueuecs: نسخة من ttheredqueue مع القسم الحرج.
TthreadObjectList: قائمة كائن آمن مؤشر ترابط.
ttheredqueuelist: قائمة قائمة الانتظار الآمن. Autogrow ومع قسم حرجة.
TanononymousThread: ينشئ مؤشر ترابط مجهول تحديد أساليب تنفيذ و On -Ontermate. استخدم أساليب Execute_sync و OnTerminate_Sync إذا كان الرمز يحتاج إلى تحديث واجهة المستخدم.
// simple anonymousthread
TAnonymousThread.Execute(
procedure
var
i : Integer;
begin
for i := 0 to 10 do cout( ' Working %d ' ,[i],etTrace);
cout( ' executed thread ' ,etSuccess);
end )
.OnTerminate(
procedure
begin
cout( ' terminated thread ' ,etSuccess);
cout( ' PRESS <ENTER> TO EXIT ' ,etInfo);
end )
.Start;Truntask: قم بتشغيل مؤشر ترابط مهمة واحدة تلقائيًا مع سياسات التحكم في الصدع وإعادة المحاولة. يمكن تمرير params وإنشائها في رمز.
TRunTask.Execute(
procedure(task : ITask)
var
stream : TStringStream;
response : IHttpRequestResponse;
begin
stream := TStringStream.Create;
try
response := TJsonHttpClient(task[ ' httpclient ' ].AsObject).Get(task[ ' url ' ]);
task.Result := response.StatusCode;
if response.StatusCode <> 200 then raise Exception.Create(response.StatusText);
finally
stream.Free;
end ;
end )
.SetParameter( ' httpclient ' ,(TJsonHttpClient.Create),True)
.SetParameter( ' url ' , ' https://mydomain.com/testfile ' )
.WaitAndRetry( 5 , 250 , 2 )
.OnRetry(
procedure(task : ITask; aException : Exception; var vStopRetries : Boolean)
begin
// if error 404 don't try to retry request
if task.Result = 404 then vStopRetries := True;
end )
.OnException(
procedure(task : ITask; aException : Exception)
begin
coutFmt( ' Exception downloading (Error: %s / StatusCode: %d)... ' ,[aException.Message,task.Result.AsInteger],etError);
end )
.OnTerminated(
procedure(task : ITask)
begin
if task.Done then coutFmt( ' Download "%s" finished ok ' ,[task[ ' url ' ].AsString],etSuccess)
else coutFmt( ' Download "%s" failed after %d retries ' ,[task[ ' url ' ].AsString,task.NumRetries],etError);
end )
.Run;TbackgroundStasks: مهام الإطلاق في الخلفية ، مما يتيح عدد العمال المتزامنين مع سياسات مراقبة الصدع والمحاولة. استخدم أساليب AddTask_Sync و ONTRELL_SYNC إذا كان الرمز يحتاج إلى تحديث واجهة المستخدم.
backgroundtasks := TBackgroundTasks.Create( 10 );
for i := 1 to 100 do
begin
mytask := TMyTask.Create;
mytask.Id := i;
mytask. Name := ' Task ' + i.ToString;
backgroundtasks.AddTask([mytask],False,
procedure(task : ITask)
begin
cout( ' task %d started ' ,[TMyTask(task.Param[ 0 ].AsObject).Id],etDebug);
TMyTask(task.Param[ 0 ].AsObject).DoJob;
end
).WaitAndRetry([ 250 , 2000 , 10000 ])
).OnException(
procedure(task : ITask; aException : Exception)
begin
cout( ' task %d failed (%s) ' ,[TMyTask(task.Param[ 0 ].AsObject).Id,aException.Message],etError);
end
).OnTerminated(
procedure(task : ITask)
begin
cout( ' task %d finished ' ,[TMyTask(task.Param[ 0 ].AsObject).Id],etDebug);
TMyTask(task.Param[ 0 ].AsObject).Free;
end
).Run;
end ;
backgroundtasks.Start;Tscheduledtasks: بديل عن المؤقت. يمكنك تعيين المهام مع وقت البدء ، وكرر الخيارات وتاريخ انتهاء الصلاحية والفشل وإعادة محاولة التحكم. استخدم AddTask_Sync ، OnTerminate_Sync و OnexPired_Sync إذا كان الرمز يحتاج إلى تحديث واجهة المستخدم. يمكنك تعيين أساليب مجهولة لتنفيذ أحداث التنفيذ والاستثناء والإنهاء والانتهاء.
myjob := TMyJob.Create;
myjob. Name := Format( ' Run at %s and repeat every 1 second until %s ' ,[DateTimeToStr(ScheduledDate),DateTimeToStr(ExpirationDate)]);
scheduledtasks.AddTask( ' Task1 ' ,[myjob],True,
procedure(task : ITask)
begin
cout( ' task "%s" started ' ,[TMyTask(task.Param[ 0 ]). Name ],etDebug);
TMyJob(task.Param[ 0 ]).DoJob;
end
).OnException(
procedure(task : ITask; aException : Exception)
begin
cout( ' task "%s" failed (%s) ' ,[TMyJob(task.Param[ 0 ]). Name ,aException.Message],etError);
end
).OnTerminated(
procedure(task : ITask)
begin
cout( ' task "%s" finished ' ,[TMyJob(task.Param[ 0 ]). Name ],etDebug);
end
).OnExpired(
procedure(task : ITask)
begin
cout( ' task "%s" expired ' ,[TMyJob(task.Param[ 0 ]). Name ],etWarning);
end
).StartAt(ScheduledDate
).RepeatEvery( 1 ,TTimeMeasure.tmSeconds,ExpirationDate);
scheduledtasks.Start;تدير الفشل وإعادة محاولة سياسات ، وتحديد Max Retrens ، ووقت الانتظار Beetwene Beeties و MeCanism استراحة الدائرة.
يدير عمليات Windows.
// kill explorer process
KillProcess( ' explorer.exe ' );
// determine if an application is running
if IsProcessRunning( ' explorer.exe ' ) then Showmessage( ' Explorer is running! ' );
// get username who is running an exe
writeln( ' Explorer.exe open by: ' + GetProcessUser( ' explorer.exe ' );
// gets handle of a window with a 20 seconds timeout
if FindWindowTimeout( ' MainWindow ' , 20 ) then writeln( ' Window detected ' );يدير خدمات Windows.
// detect if a service is installed
if not ServiceIsPresent( ' localhost ' , ' MySvc ' ) then raise Exception.Create( ' Service not installed! ' );
// Start a service
ServiceStart( ' localhost ' , ' MySvc ' );
// Uninstall a service
ServiceUninstall( ' MySvc ' );تنسيق السلسلة.
// Format bytes to MB, GB, TB...
FormatBytes( 50000 ) // shows 50KB
FormatBytes( 90000000 ) // shows 90MB تسلسل كائن من/إلى نص JSON. يمكنك تحديد ما إذا كان سيتم معالجة الجمهور أو المنشور (فقط Delphi ، FPC RTTI يدعم الخصائص المنشورة فقط)
json := ' {"name":"Peter","age":30} ' ;
serializer := TJsonSerializer.Create(TSerializeLevel.slPublishedProperty);
try
serializer.JsonToObject(user,json);
finally
serializer.Free;
end ;حقول خريطة من فصل إلى فئة أخرى. يسمح تعيينات مخصصة بمطابقة الحقول المختلفة وإجراءات التعيين المخصصة لإلقاء/تحويل الحقول يدويًا.
// Map values from User1 to User2
TMapper<TUser2>.Map(User);
// Map custom mappings
AutoMapper := TAutoMapper<TUser,TUser2>.Create;
// option1: you can define auto map different named properties
AutoMapper.CustomMapping.AddMap( ' Cash ' , ' Money ' );
AutoMapper.CustomMapping.AddMap( ' Id ' , ' IdUser ' );
// option2: you can decide to modify each property manually or allow to auto someones
AutoMapper.OnDoMapping := procedure( const aSrcObj : TUser; const aTargetName : string; out Value : TFlexValue)
begin
if aTargetName = ' Money ' then Value := aSrcObj.Cash * 2
else if aTargetName = ' IdUser ' then Value := aSrcObj.Id;
end ;
// option3: you can modify some properties after automapping done
AutoMapper.OnAfterMapping := procedure( const aSrcObj : TUser; aTgtObj : TUser2)
begin
aTgtObj.Money := aSrcObj.Cash * 2 ;
aTgtObj.IdUser := aSrcObj.Id;
end ;
User2 := AutoMapper.Map(User);تستخدم كطبقة DTO ، مع وظائف JSON Serialize ورسم الخرائط.
type
TUser = class (TJsonRecord)
private
fName : string;
fAge : Integer;
published
property Name : string read fName write fName;
property Age : Integer read fAge write fAge;
end ;
var
user, user2 : TUser;
begin
user := TUser.Create;
// show as json string
Writeln(user.ToJson);
// mapping to other class
user.Mapto(User2);
Writeln(user2.ToJson);
// load from file
user.LoadFromFile( ' .user.json ' );
// save to file
user2.SaveToFile( ' .user2.json ' );
end ;قوائم محسّنة مع ميزات الفهرسة أو البحث.
var
users : TIndexedObjectList<TUser>;
begin
users := TIndexedObjectList<TUser>.Create(True);
// create index by property "Name"
users.Indexes.Add( ' Name ' , ' Name ' ,TClassField.cfProperty);
// create index by private field "Id"
users.Indexes.Add( ' Id ' , ' fId ' ,TClassField.cfField);
// get user by "Name" index
writeln(users.Get( ' Name ' , ' Peter ' ).SurName);
end ;يقوم FlexValue بتخزين أي نوع من البيانات والسماح بالتمرير إلى فئة أخرى مع مشغلي متكامل و Autofrees.
var
value : TFlexValue;
str : string;
num : Integer;
begin
value := ' hello ' ;
str := value ;
value := 123 ;
num := value ;
end ;صفائف تحسين.
txarray: صفيف مع طرق مثل stlist.
var
users : TXArray<TUser>;
begin
users.Add(User);
if users.Count:= TIndexedObjectList<TUser>.Create(True);
// create index by property "Name"
users.Indexes.Add( ' Name ' , ' Name ' ,TClassField.cfProperty);
// create index by private field "Id"
users.Indexes.Add( ' Id ' , ' fId ' ,TClassField.cfField);
// get user by "Name" index
writeln(users.Get( ' Name ' , ' Peter ' ).SurName);
end ;TflexArray: صفيف مع طرق مثل Tlist مما يمكن تخزين أنواع القيمة المختلفة في نفس الصفيف.
var
flexarray : TFlexArray;
begin
flexarray.Add( 10 );
flexarray.Add( ' Hello ' );
user := TUser.Create;
try
user. Name := ' Joe ' ;
flexarray.Add(user);
cout( ' Integer Item = %d ' ,[flexarray[ 0 ].AsInteger],etInfo);
cout( ' String Item = %s ' ,[flexarray[ 1 ].AsString],etInfo);
cout( ' Record Item = %s ' ,[TUser(flexarray[ 2 ]). Name ],etInfo);
finally
user.Free;
end ;
end ;TflexPairArray: صفيف مع طرق مثل Tlist مما يمكنه تخزين أنواع القيمة المختلفة في نفس الصفيف ، والبحث باسم العنصر.
var
flexarray : TFlexPairArray;
begin
flexarray.Add( ' onenumber ' , 10 );
flexarray.Add( ' other ' , ' Hello boy! ' );
user := TUser.Create;
try
user. Name := ' Joe ' ;
flexarray.Add( ' myuser ' ,user);
cout( ' Integer Item = %d ' ,[flexarray.GetValue( ' onenumber ' ).AsInteger],etInfo);
cout( ' String Item = %s ' ,[flexarray.GetValue( ' other ' ).AsString],etInfo);
cout( ' Record Item = %s ' ,[TUser(flexarray.GetValue( ' myuser ' )). Name ],etInfo);
finally
user.Free;
end ;
end ;بنية كائن Yaml.
Tyamlobject: كائن yaml هو ومجموعة من أزواج yamlvalue.
// create Yaml object from yaml text
yamlobj.ParseYamlValue(aYaml)
// add a pair
yamlobj.AddPair( ' Name ' , ' Mike ' );
// display as yaml structure
Writeln(yamlobj.ToYaml);Tyamlarray: مجموعة من الكائنات أو العدادات.
yamlarray.AddElement(TYamlPair.Create( ' Age ' , 30 ));
yamlobj.AddPair( ' myarray ' ,yamlarray);Tyamlpair: زوج القيمة. يمكن أن تكون القيمة كائنًا أو صفيفًا أو قياسيًا.
n := yamlobj.GetPair( ' Name ' ). Value as TYamlInteger;كائن التسلسل/إزالة الكائنات من/إلى يامل.
// Serialize
text := YamlSerializer.ObjectToYaml(obj);
// Deserialize
YamlSerializer.YamlToObject(obj,yamltext);تقييم خصائص الكائن أو القيم الفردية باستخدام التعبيرات.
if TExpressionParser.Validate(user,( ' (Age > 30) AND (Dept.Name = "Financial") ' ) then
begin
// do something
end ;
if TExpressionParser.Validate(user,( ' (20 > 30) OR (5 > 3) ' ) then
begin
// do something
end ;يجعل استعلامات LINQ إلى أي TOBJECTLIST و TLIST و TARRAY و TXARRAY ، مما يؤدي إلى تحديد COMPLETY حيث مثل SQL SYNTAX ، والتحديث والطلب على قائمتك. حيث تستخدم البنود مساحات الأسماء لتحديد الخصائص المتداخلة. يمكن لـ LINQ البحث عن عنصر في صفيف خاصية. يتضمن الآن و Tarray Helper لإضافة وإزالة والبحث مع تعبيرات منتظمة في Array.
// Select multi conditional
for user in TLinq<TUser>.From(userslist).Where( ' (Name = ?) OR (SurName = ?) OR (SurName = ?) ' ,[ ' Peter ' , ' Smith ' , ' Huan ' ]).Select do
begin
// do something
end ;
// Select like and update field
TLinq<TUser>.From(userlist).Where( ' SurName Like ? ' ,[ ' %son ' ]).SelectFirst. Name := ' Robert ' ;
// Select top and Order by field
for user in TLinq<TUser>.From(userlist).Where( ' Age > ? ' ,[ 18 ]).SelectTop( 10 ).OrderBy( ' Name ' ) do
begin
// do something
end ;
// update fields by conditional
TLinq<TUser>.From(userlist).Where( ' Name = ? ' ,[ ' Peter ' ]).Update([ ' Name ' ],[ ' Joe ' ]);
// count results
numusers := TLinq<TUser>.From(userlist).Where( ' (Age > ?) AND (Age < ?) ' ,[ 30 , 40 ]).Count;TCUSTOMHTTPSERVER هو HTTPSERVER البسيط مع تطبيقات HTTPREQUEST و HTTPRESPONSE للسماح بتغييرات محرك HTTPSERVER سهلة. يمكنك تمكين صفحات الخطأ المخصصة لإرجاع الصفحات المخصصة وصفحات الأخطاء الديناميكية. Thttpserver هو تطبيق IndyHtpserver ، ولكن يمكنك تحديد خاص بك.
TMyHttpServer = class (THttpServer)
public
procedure ProcessRequest (aRequest: IHttpRequest; aResponse: IHttpResponse); override;
end ;
procedure TMyHttpServer.ProcessRequest (aRequest: IHttpRequest; aResponse: IHttpResponse);
begin
aResponse.ContentText := ' Hello world! ' ;
end ;كائنات مخبأ أو سلاسل مع وقت انتهاء الصلاحية ، لتجنب إنشاء هذه المعلومات في كل مرة مطلوب (استعلامات قاعدة البيانات ، يصعب حساب المعلومات ، إلخ). TmemoryCache يسمح بتخزين الكائنات والسلاسل. الإصدار العام tmemorycache يسمح بتخزين نوع محدد فقط.
// create MemoryCache with 10 seconds purge interval
cache := TMemoryCache.Create( 10 );
// create MemoryCache for a type
cache := TMemoryCache<TMyObj>.Create; // set string to cache without expiration
cache.SetValue( ' mystring ' , ' hello world ' );
// set string to cache with expiration to 10 seconds
cache.SetValue( ' mystring ' , ' this cache will expire in 10 seconds ' ;
// set object to cache
cache.SetValue( ' Obj1 ' ,valueobj); // get string query result
cache.GetValue( ' Query12 ' );
// get integer
cache.TryGetValue<Integer>( ' number ' ,valueint);
// get object
cache.TryGetValue( ' Obj1 ' ,valueobj);removeValue: يزيل كائن من ذاكرة التخزين المؤقت.
مقدمي خدمات ذاكرة التخزين المؤقت:
tcacheserializerjson: يستخدم JSON لتسلسل بيانات ذاكرة التخزين المؤقت.
tcacheCompressorgzip: يستخدم GZIP لضغط بيانات ذاكرة التخزين المؤقت.
tcacheCompressorlzo: يستخدم LZO لضغط بيانات ذاكرة التخزين المؤقت.
// create MemoryCache with 20 seconds purge interval and compression with LZO engine
cache := TMemoryCache.Create( 10 , nil ,TCacheCompressorLZO.Create);يتيح انعكاس مدير التحكم AutoCreate المتواصل أو الكائنات المتواصلة أو تلقائيًا في فئات المنشئ ، لتجنب التبعية.
إنشاء حاوية لإدارة حقن التبعية.
iocContainer := TIocContainer.Create;أنواع التسجيل:
تحتاج إلى تسجيل الأنواع قبل أن تتمكن من حقنها. يمكن تسجيل نوع على أنه Singleton ، عابرة. Singleton : ستكون دورة الحياة مثيلًا واحدًا لجميع الحقن ، على غرار متغير عالمي. عابرة : ستكون دورة الحياة مثيلًا واحدًا لكل حقن. قم بتسجيل نوع واجهة في حاوية عابرة:
iocContainer.RegisterType<IMultService,TMultService>.AsTransient;قم بتسجيل نوع الواجهة كفرد ، وتفويض البناء:
iocContainer.RegisterType<ISumService,TSumService>.AsSingleTon.DelegateTo(
function : TSumService
begin
Result := TSumService.Create;
end
);التسجيل مثيلات:
قم بتسجيل كائن مثيل مسمى على أنه عابر ومفوض البناء:
iocContainer.RegisterInstance<TDivideService>( ' one ' ).AsTransient.DelegateTo(
function : TDivideService
begin
Result := TDivideService.Create(True);
end
);خيارات التسجيل:
تسجيل iOptions (Singleton فقط):
iocContainer.RegisterOptions<TMyOptions>(MyOptions);حل الأنواع:
AbtractFactory: إنشاء فئة تحاول حل جميع المعلمة طريقة الإنشاء مع حقن التبعية.
MyClass := iocContainer.AbstractFactory<TMyBaseClass>(TMyClass);حل تبعية الواجهة:
multservice := iocContainer.Resolve<IMultService>;
result := multservice.Mult( 2 , 4 );حل الحالات:
حل التبعية على سبيل المثال:
divideservice := iocContainer.Resolve<TDivideService>( ' other ' );
result := divideservice.Divide( 100 , 2 );سيتم تحرير مثيلات الواجهة تلقائيًا ، ولكن سيتم تحرير تبعيات المثيلات فقط إذا تم تعريفها على أنها Singleton ، وسيتم تدمير مثيلات عابرة بواسطة الكود.
يمكنك تحديد الأقسام على أنها فئات وتحفظ كإعدادات ملف واحد. يعمل مشابه لخيارات dotnet. يمكن أن يكون ملف الخيارات بتنسيق JSON أو YAML.
حدد فئة الخيار الموروثة من Toptions وسيتم تحميل/حفظ جميع الخصائص المنشورة. قم بإنشاء حاوية خيارات ، مع jsonserializer وإعادة التحميل على التغيير:
Options := TOptionsContainer.Create( ' .options.conf ' ,TJsonOptionsSerializer.Create,True);أضف قسمًا إلى خيارات الحاوية الخاصة بك:
Options.AddSection<TLoggingOptions>( ' Logging ' )تكوين الخيارات:
يمكنك تحديد اسم القسم للحفظ في الملف وتفويض الإعدادات الافتراضية للتكوين والتحقق من صحة القيم:
Options.AddSection<TLoggingOptions>( ' Logging ' ).ConfigureOptions(
procedure(aOptions : TLoggingOptions)
begin
aOptions.Path := ' C: ' ;
end
).ValidateOptions;الخيارات التحقق من صحة:
يتيح خيارات التحقق من صحة التحقق مما إذا كان يتم تعيين إعدادات الخيار بين النطاقات المحددة. يحتاج هذا التحقق من الصحة إلى سمات مخصصة تم تعيينها مسبقًا للخصائص في فئة Toptions الخاصة بك.
TLoggingOptions = class (TOptions)
private
fPath : string;
published
[Required, StringLength( 255 , ' Path too long ' )]
property Path : string read fPath write fPath;
[Range( 0.0 , 5.2 )]
property Level : Double read fLevel write fLevel;
end ;استخدام الخيارات: لاسترداد قسم الخيار:
LoggingOptions := Options.GetSection<TLoggingOptions>;
LoggginOptions.Path := ' C:Path ' ;استخدام iOptions: Ioptions هي واجهة تبعية قابلة للحقن لأعلى. يمكنك التسجيل في ioccontainer.registeroptions لجعل الحقن في أساليب المنشئ.
UIOptions := Options.GetSectionInterface<TUIOptions>. Value ;
UIOptions.WindowColor := clBlue;تحميل/حفظ الخيارات:
تحميل خيارات من إعدادات الملف:
options.Load;حفظ الخيارات لإعدادات الملف:
options.Save;إذا قمت بتعريف إنشاء الحاوية باستخدام معلمة RELOADONCHANGed إلى TRUE ، فكل مرة يتم تغيير إعدادات الملف ، سيتم إعادة تحميل التكوين. إذا كنت بحاجة إلى التحكم في وقت إعادة التحميل ، فيمكنك الاستماع إلى الحدث:
Options.OnFileModified := procedure
begin
cout('Detected config file modification!',etWarning);
end;
حدد مجموعة من الاتصال أو مؤشرات الترابط أو أي كائن تريد التحكم فيه لتجنب موارد اتصالات قواعد البيانات ، عملاء HTTP ، إلخ ...
إنشاء مجموعة عميل HTTP:
pool := TObjectPool<THTTPClient>.Create( 5 , 5000 ,procedure( var aInstance : THTTPClient)
begin
aInstance := THTTPClient.Create;
aInstante.UserAgent := ' MyAgent ' ;
end );احصل على كائن من البلياردو:
httpcli := pool.Get.Item;
statuscode := httpcli.Get( ' https://www.mydomain.com ' ).StatusCode;يحدد القائمة المتبعة وقائمة كائن مع دعم LINQ الموروثة.
myarray := [ ' Joe ' , ' Mat ' , ' Lee ' ];
// search for regex match
cout( ' Search for regex match ' ,ccYellow);
for name in myarray.Where( ' e$ ' ,True).Select do
begin
cout( ' User %s ends with "e" ' ,[ name ],etInfo);
end ;user := ListObj.Where( ' Profile.Name = ? ' ,[ ' Lee ' ]).SelectFirst;ابحث عن التعبير عن مجموعة العناصر:
users := ListObj.Where( ' Roles CONTAINS ? ' ,[ ' SuperAdmin ' ]).Select;البحث المسد:
user := ListObj.Where(function(aUser : TUser) : Boolean
begin
Result := aUser. Name .StartsWith( ' J ' );
end ).SelectFirst;
if user <> nil then cout( ' %s starts with J letter ' ,[user. Name ],etInfo);انظر قسم Quick.linq لعرض المزيد من الوظائف المسموح بها.
استبدال قالب السلسلة باستخدام دالة قاموس أو مندوب. يمكنك تحديد مميزات رمزية مقتبسة.
استبدل تمرير القاموس:
dict := TDictionary<string,string>.Create;
dict.Add( ' User ' , ' John ' );
dict.Add( ' Age ' , ' 20 ' );
dict.Add( ' SurName ' , ' Peterson ' );
mytemplate := ' User {{User}} {{SurName}} are {{Age}} years old. ' ;
template := TStringTemplate.Create( ' {{ ' , ' }} ' ,dict);
Result := template.Replace(mytemplate);استبدال وظيفة المندوب:
mytemplate := ' User {{User}} {{SurName}} are {{Age}} years old. ' ;
template := TStringTemplate.Create( ' {{ ' , ' }} ' ,function( const aToken : string) : string
begin
if token = ' User ' then Result := ' John '
else if token = ' Surname ' then Result := ' Peterson '
else if token = ' Age ' then Result := ' 20 ' ;
end );
Result := template.Replace(mytemplate);Debug Utils للتحقق من الأداء والحصول على نقطة التفتيش والخروج. على وحدة التحكم ، تستخدم تطبيقات وحدة التحكم بشكل افتراضي. يمكنك تمرير مسجل إلى الإخراج في:
TDebugUtils.SetLogger(ilogger);تتبع جزءًا من الكود الخاص بك:
function TCalculator.Subs (a, b: Int64): Int64;
begin
{ $IFDEF DEBUG }
TDebugger.Trace(Self,Format( ' Substract %d - %d ' ,[a,b]));
{ $ENDIF }
Result := a - b;
// simulate working for 200ms
Sleep( 200 );
end ;
// Returns:
// 29-06-2020 23:31:41.391 [TRACE] TCalculator -> Substract 30 - 12حساب الوقت للمعالجة من وظيفة الخروج:
function TCalculator.Sum (a, b: Int64): Int64;
begin
{ $IFDEF DEBUG }
TDebugger.TimeIt(Self, ' Sum ' ,Format( ' Sum %d + %d ' ,[a,b]));
{ $ENDIF }
Result := a + b;
// simulate working for 1 seconds
Sleep( 1000 );
end ;
// Returns:
// 29-06-2020 22:58:45.808 [CHRONO] TCalculator.Sum -> Sum 100 + 50 = 1,00sحساب الوقت للمعالجة من نقطة إلى نقطة والخروج وظيفة:
function TCalculator.Divide (a, b: Int64): Double;
begin
{ $IFDEF DEBUG }
var crono := TDebugger.TimeIt(Self, ' Divide ' ,Format( ' Divide %d / %d ' ,[a,b]));
{ $ENDIF }
Result := a / b;
// simulate working for 500ms
Sleep( 500 );
{ $IFDEF DEBUG }
crono.BreakPoint( ' Only divide ' );
{ $ENDIF }
// simulate working for 1 second
Sleep( 1000 );
{ $IFDEF DEBUG }
crono.BreakPoint( ' Only Sleep ' );
{ $ENDIF }
end ;
// Returns:
// 29-06-2020 23:25:46.223 [CHRONO] TCalculator.Divide -> First point = 500,18ms
// 29-06-2020 23:25:47.224 [CHRONO] TCalculator.Divide -> Second point = 1,00s
// 29-06-2020 23:25:47.225 [CHRONO] TCalculator.Divide -> Divide 10 / 2 = 1,50sاحصل على إشعار عند الدخول والخروج من وظيفة ، وأمرها:
function TCalculator.Mult (a, b: Int64): Int64;
begin
{ $IFDEF DEBUG }
TDebugger.Enter(Self, ' Mult ' ).TimeIt;
{ $ENDIF }
Result := a * b;
// simulate working for 2 seconds
Sleep( 2000 );
end ;
// Returns:
// 29-06-2020 22:58:45.808 [ENTER] >> TCalculator.Mult
// 29-06-2020 22:58:47.810 [EXIT] >> TCalculator.Mult in 2,00s سيكون العمل مع معلمات سطر الأوامر سهلاً باستخدام امتداد سطر الأوامر. تحديد فئة موروثة من tparameters أو tserviceparameters (إذا كنت تعمل مع QuickAppServices) مع وسيطاتك المحتملة كخصائص منشورة:
uses
Quick.Parameters;
type
TCommand = (Copy, Move, Remove);
TMyMode = (mdAdd, mdSelect, mdRemove);
[CommandDescription( ' Simple console application example with Quick.Parameters ' )]
TMyParameter = class (TParameters)
private
fCommand : TCommand;
fHost : string;
fPort : Integer;
fRetries : Integer;
fUseTCP : Boolean;
fConfigFile: string;
fSilent: Boolean;
fMyMode: TMyMode;
fLogErrorsConsole: Boolean;
fLogErrors: Boolean;
fShowReport: Boolean;
published
[ParamCommand( 1 )]
[ParamRequired]
[ParamHelp( ' Command action. ' , ' command-action ' )]
property Command : TCommand read fCommand write fCommand;
[ParamName( ' HostName ' ),ParamRequired]
[ParamHelp( ' Define host to connect. ' , ' host ' )]
property Host : string read fHost write fHost;
[ParamName( ' Port ' , ' p ' )]
[ParamValueIsNextParam]
[ParamHelp( ' Define Port to connect (default 80) ' , ' port ' )]
property Port : Integer read fPort write fPort;
[ParamHelp( ' Number of max retries. ' )]
property Retries : Integer read fRetries write fRetries;
[ParamHelp( ' Path to config. ' , ' path ' )]
[ParamName( ' Config-file ' )]
property ConfigFile : String read fConfigFile write fConfigFile;
[ParamHelp( ' Silent mode. ' )]
property Silent : Boolean read fSilent write fSilent;
[ParamHelp( ' Modes (mdAdd, mdSelect, mdRemove) ' )]
property Mode : TMyMode read fMyMode write fMyMode;
end ;
استخدم المراوغة:
params := TMyParameter.Create;عندما تتصل بـ exe الخاص بك مع -help تحصل على الوثائق. إذا كنت بحاجة إلى التحقق من وجود مفتاح أو قيمة ، فيمكنك القيام بذلك:
if params.Port = 0 then ...
if params.Silent then ...يستخدم QuickParameters سمات مخصصة لتحديد شروط المعلمة الخاصة:
CommandDescription: يحدد النص لوصف تطبيقك في وثائق المساعدة.
ParamCommand (رقم): يحدد الموضع الثابت في سطر الأوامر للمعلمات الفردية.
ParamName (الاسم ، الاسم المستعار): تحديد اسم مختلف للمعلمة. يسمح باستخدام أحرف خاصة غير مسموح بخصائص الفصل (مثل اسم الملف أو config.file). تحدد وسيطة الاسم المستعارة الاختيارية اسم المعلمة بديل (عادةً ما يكون قصيرًا).
ParamHelp (Helptext ، ValuEname): يحدد نص مساعدة سطر الأوامر واسم القيمة في قسم الاستخدام.
Paramswitchchar (علامة): تعريف السلسلة أو char للإشارة إلى التبديل أو المعلمة. إذا لم يتم تعريفه ، سيتم استخدام اندفاعة مزدوجة (-) افتراضيًا.
ParamValueseparator (علامة): تعريف السلسلة أو char لفصل اسم المعلمة عن القيمة (filename = config.json). إذا لم يتم تعريفه ، سيتم استخدام علامة متساوية (=) افتراضيًا.
ParamValueIsNextParam: يحدد معلمة ذات قيمة بدون فاصل قيمة (اسم الملف C: config.ini)
ParamRequired: يحدد معلمة كما هو مطلوب. إذا لم يتم العثور على بارام ، فسيتم إثارة استثناء.
يتحقق QuickParameter تلقائيًا لأنواع القيمة. إذا قمت بتحديد قيمة المعلمة على أنها عدد صحيح ، وقمت بتمرير alfanumeric ، فسيتم إثارة استثناء.
تعليمات تخصيص: يمكنك تحديد تخصيص اللون الخاص بك باستخدام ColorizeHelp. ستستخدم الخاصية الممكّنة ألوانًا مخصصة ، وإلا سيتم استخدام B/W.
Parameters.ColorizeHelp.Enabled := True;
Parameters.ColorizeHelp.CommandName := ccCyan;
Parameters.ColorizeHelp.CommandUsage := ccBlue;عندما تكتشف المعلمات المعلمة المساعدة ، سيتم عرض وثائق المساعدة.
المعلمات. showhelp: يظهر وثائق المساعدة ، يتم إنشاؤها تلقائيًا:
Parameters v.1.0
Usage: Parameters <command-action> <--HostName=<host>> [--Port <port>] [--Retries=<value>]
[--Config-file=<path>] [--UseTCP] [--Silent] [--Mode=<value>]
[--ShowReport] [--Help]
Simple console application example with Quick.Parameters
Arguments:
Command Command action.
--HostName Define host to connect.
--Port, -p Define Port to connect (default 80)
--Retries Number of max retries.
--Config-file Path to config.
--UseTCP Use TCP connection if present.
--Silent Silent mode.
--Mode Modes (mdAdd, mdSelect, mdRemove)
--Help, -h Show this documentation
عمليات التحقق شائعة الاستخدام.
صحة ما قبل وبعد الإشارة إلى الأسلوب بطلاقة. الشرط. يقيس المتغيرات متغيرًا للشروط قبل القيام ببعض العمليات. الشرط. يقييم النتيجة نتيجة متغيرة للشروط بعد القيام ببعض العمليات.
Condition.Requires(num, " num " )
.IsInRange( 1 , 10 , ' value for num is out of range ' ); // throws custom error if not in range
.IsNotGreater( 50 ); // throws ArgumentException if not equal to 128
Condition.Requires(myobj, " myobj " )
.WithExceptionOnFailure(EMyException) // throws specific exception on failure
.IsNotNull() // throws ArgumentNullException if null
.Evaluate(myobj.id > 10 ); // myobj.id must be greater than 10
Condition.Requires(text, " text " )
.IsNotEmpty() // throws ArgumentNullException if empty
.StartsWith( " <html> " ) // throws ArgumentException if not starts with <html>
.EndsWith( " </html> " ) // throws ArgumentException if not ends with </html>
.IsNotLowerCase // thows ArgumentException if not lowercase
.Evaluate(text.Contains( " sometxt " ) or test.Contains( ' othertxt ' )); // throws ArgumentException if not evaluatesهل تريد تعلم دلفي أو تحسين مهاراتك؟ LearnDelphi.org