Vcl Style Memory Overflow Fix
#1
السلام عليكم و رحمة الله و بركاته
------------------------------------------------
عند استخدام مكتبة ال Vcl Style و تغيير الستايل وقت التنفيذ .. تبين أنه هناك زيادة في الذاكرة المستخدمة من قبل التطبيق - للأمانة لست من اكتشف المشكلة : ( لقد اكتشفها الأخ onexite ) -
على كل حال بدأت فور علمي بالمشكلة بمحاولة لحلها :
أول المحاولات كانت فاشلة تماما ثم بعد ربع ساعة وجدت أن المشكلة تكمن في اجراء TStyleManager.SetStyle : عند تغيير شكل البرنامج لا يتم تحرير الستايل السابق , حتى ولو قمت بتحريره يدويا كما فعل الأخ onexite ..
PHP كود :
procedure freestyles();
var 
sname:string;
begin
//ShowMessage(TStyleManager.ActiveStyle.Name);
for sName in  TStyleManager.StyleNames  do   //
if (sName<>'Windows') and (sname<>TStyleManager.ActiveStyle.Namethen
TStyleManager
.Style[sName].Free;
end
السبب في عدم التحرير : هو أنه عندما نقوم بمناداة النداء freestyles يتم تحرير ال Object الخاصة بالستايل , ولا يتم تحرير الذاكرة المحجوزة ل ال Data الخاصة بالستايل ..
بعد معرفتي للسبب أعدت كتابة الدالة SetStyle و قمت بتحرير ال Data الخاصة بالستايل :لقد اشتغلت على أكمل وجه , لكن في نهاية المطاف تبين أنه يوجد MemoryLeaks و التي أخذت مني ثلاث ساعات لحلها !!
عندما قررا و ضع الموضوع ظهرت مشكلة أخرى :
عند استخدام الخاصية Style الخاصة بال StyleManager للقراءة ..تحدث نفس المشكلة : زيادة في حجم الذاكرة المستخدمة للتطبيق ..
على كل حال بفضل من الله استطعت تجاوز هذه المشكلة
لقد كتبت كلاس مساعد لل TStyleManager يقوم بتصحيح هذه المشاكل :
يحتوي الكلاس على الدالة SetStyle معدلة تعمل بدون خلق زيادة في الذاكرة .. لكنها بطيئة نوعا ما لتغيير الواجهة , لهذا السبب بدأت بالتحليل مرة أحرى و وجدت طريقة أفضل الدالة SafeSetStyle .
الدالة SafeSetStyle : دالة تسمح بتغيير الستايل بدون زيادة في حجم الذاكرة ..
+
أعدت كتابة الروتين الخاص بالخاصية Style : الآن تستطيع الوصول للخاصية بدون الخوف من مشاكل الزيادة في الذاكرة أو Memory Overflow .

------------------------------------------------------------------
الآن لحل كل هذه المشاكل يتوجب عليك اضافة الوحدة uFixMemOverflowVclStyle الى مشروعك فقط !!
يستحسن أن تضيفها بعد الوحدتين : Vcl.Styles, Vcl.Themes
PHP كود :
uses
Vcl
.StylesVcl.Themes,
  
uFixMemOverflowVclStyle
لقد أرفقت لكم شرح فلاشي للمشكلة + مثال للمشكلة + مثال لطريقة حل المشكلة .
حمل المرفق من هنا :
كود :
https://dl.dropboxusercontent.com/u/99625333/Delphi/Vcl%20Style_Memory_Overflow_Fix.rar
سأقوم باعلام ال QC فور تفرغي .. لان المشكلة لا يمكن التغافل عنها .
Open Your Source .. Open Your Mind
#2
عمل ممتاز
بخصوص التحميل من القرص ؟ الا يوجد شيء من هذا القبيل
PHP كود :
StyleManager.SafeSetStyle(StyleManager.LoadFromFile(filename)); 
#3
التحديث :
+اضافة دالة جديدة :
الدالة SafeSetStyleFromFile لتحميل ملف من القرص الصلب
تمرر للدالة برمتر بمسار الملف كاملا ..

PHP كود :
https://dl.dropboxusercontent.com/u/99625333/Delphi/uFixMemOverflowVclStyle.pas 
Open Your Source .. Open Your Mind
#4
smp3 كتب :[color=blue]التحديث :
+اضافة دالة جديدة : الدالة safesetstylefromfile لتحميل ملف من القرص الصلب
تعمل جيدا ...
شكرا لك


التنقل السريع :


مستخدمين يتصفحوا هذا الموضوع: 1 ضيف