06-09-2013, 10:33 PM
السلام عليكم و رحمة الله و بركاته
------------------------------------------------
عند استخدام مكتبة ال Vcl Style و تغيير الستايل وقت التنفيذ .. تبين أنه هناك زيادة في الذاكرة المستخدمة من قبل التطبيق - للأمانة لست من اكتشف المشكلة : ( لقد اكتشفها الأخ onexite ) -
على كل حال بدأت فور علمي بالمشكلة بمحاولة لحلها :
أول المحاولات كانت فاشلة تماما ثم بعد ربع ساعة وجدت أن المشكلة تكمن في اجراء TStyleManager.SetStyle : عند تغيير شكل البرنامج لا يتم تحرير الستايل السابق , حتى ولو قمت بتحريره يدويا كما فعل الأخ onexite ..
السبب في عدم التحرير : هو أنه عندما نقوم بمناداة النداء freestyles يتم تحرير ال Object الخاصة بالستايل , ولا يتم تحرير الذاكرة المحجوزة ل ال Data الخاصة بالستايل ..
بعد معرفتي للسبب أعدت كتابة الدالة SetStyle و قمت بتحرير ال Data الخاصة بالستايل :لقد اشتغلت على أكمل وجه , لكن في نهاية المطاف تبين أنه يوجد MemoryLeaks و التي أخذت مني ثلاث ساعات لحلها !!
عندما قررا و ضع الموضوع ظهرت مشكلة أخرى :
عند استخدام الخاصية Style الخاصة بال StyleManager للقراءة ..تحدث نفس المشكلة : زيادة في حجم الذاكرة المستخدمة للتطبيق ..
على كل حال بفضل من الله استطعت تجاوز هذه المشكلة
لقد كتبت كلاس مساعد لل TStyleManager يقوم بتصحيح هذه المشاكل :
يحتوي الكلاس على الدالة SetStyle معدلة تعمل بدون خلق زيادة في الذاكرة .. لكنها بطيئة نوعا ما لتغيير الواجهة , لهذا السبب بدأت بالتحليل مرة أحرى و وجدت طريقة أفضل الدالة SafeSetStyle .
الدالة SafeSetStyle : دالة تسمح بتغيير الستايل بدون زيادة في حجم الذاكرة ..
+
أعدت كتابة الروتين الخاص بالخاصية Style : الآن تستطيع الوصول للخاصية بدون الخوف من مشاكل الزيادة في الذاكرة أو Memory Overflow .
------------------------------------------------------------------
الآن لحل كل هذه المشاكل يتوجب عليك اضافة الوحدة uFixMemOverflowVclStyle الى مشروعك فقط !!
يستحسن أن تضيفها بعد الوحدتين : Vcl.Styles, Vcl.Themes
لقد أرفقت لكم شرح فلاشي للمشكلة + مثال للمشكلة + مثال لطريقة حل المشكلة .
حمل المرفق من هنا :
سأقوم باعلام ال QC فور تفرغي .. لان المشكلة لا يمكن التغافل عنها .
------------------------------------------------
عند استخدام مكتبة ال 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.Name) then
TStyleManager.Style[sName].Free;
end;
بعد معرفتي للسبب أعدت كتابة الدالة SetStyle و قمت بتحرير ال Data الخاصة بالستايل :لقد اشتغلت على أكمل وجه , لكن في نهاية المطاف تبين أنه يوجد MemoryLeaks و التي أخذت مني ثلاث ساعات لحلها !!
عندما قررا و ضع الموضوع ظهرت مشكلة أخرى :
عند استخدام الخاصية Style الخاصة بال StyleManager للقراءة ..تحدث نفس المشكلة : زيادة في حجم الذاكرة المستخدمة للتطبيق ..
على كل حال بفضل من الله استطعت تجاوز هذه المشكلة
لقد كتبت كلاس مساعد لل TStyleManager يقوم بتصحيح هذه المشاكل :
يحتوي الكلاس على الدالة SetStyle معدلة تعمل بدون خلق زيادة في الذاكرة .. لكنها بطيئة نوعا ما لتغيير الواجهة , لهذا السبب بدأت بالتحليل مرة أحرى و وجدت طريقة أفضل الدالة SafeSetStyle .
الدالة SafeSetStyle : دالة تسمح بتغيير الستايل بدون زيادة في حجم الذاكرة ..
+
أعدت كتابة الروتين الخاص بالخاصية Style : الآن تستطيع الوصول للخاصية بدون الخوف من مشاكل الزيادة في الذاكرة أو Memory Overflow .
------------------------------------------------------------------
الآن لحل كل هذه المشاكل يتوجب عليك اضافة الوحدة uFixMemOverflowVclStyle الى مشروعك فقط !!
يستحسن أن تضيفها بعد الوحدتين : Vcl.Styles, Vcl.Themes
PHP كود :
uses
Vcl.Styles, Vcl.Themes,
uFixMemOverflowVclStyle;
حمل المرفق من هنا :
كود :
https://dl.dropboxusercontent.com/u/99625333/Delphi/Vcl%20Style_Memory_Overflow_Fix.rar
Open Your Source .. Open Your Mind