كنت اشتغل على برنامج يحتوي على عدة نماذج ،وفي Thread يقوم بعرض حاله عمل الthread في احد النماذج عن طريق الدالة التزامن synchronize. الى هنا كل شي يعمل كما هو مصصم له. لا توجد اي مشكلة.
ولكن عندما تقوم بالضغط على مفتاح الفارة اليمين على اسم النموذج لعرض قائمه النظام. يحدث تاثير انعكاسي على ال Thread ويبدى يتأخر او يتوقف احياناً.
وهذا بسبب ان دالة Synchronize تعتمد في عملها على مبداْ (الرسائل) messages وبما ان النموذج في حالة عرض قائمة النظام اذا لوب الرسائل متوقف.؟؟؟
حقا انها مشكلة لم أنتبه لها؟
اذا ما الحل؟. :blink:
ربما يقول احدهم بسيطة؟ اوقف عرض قائمة النظام biSystemMenu من BorderIcons . صحيح ولكن المشكلة اني استعمل bsToolWindow مع زرار اغلاق ؟ اي اني اريد النموذج هكذا
bsToolWindow
Close Button
بدون biSystemMenu
التجميع هذا لا يعمل مع بعضه؟ اي لن تحصل عليه ابدا؟ :huh:
الحل الوحيد اللذي استطعت الوصول له ان استعمل WinProc
واوقف عمل الرسالة وهي WM_NCRBUTTONDOWN التى ترسلها الوندوز عند الضغط على منطقة اسم النموذج بزرار الفارة اليمين
ثم اقوم بتجاهل هذه الرسالة. حل جميل اليس كذالك؟ :D
بس هناك مشكلة بسيطة... ..وهي ان جميع الرسائل ترسل الى هذا الروتين ومن ثم تذهب الى الروتين الاصلي اذا كانت الرسالة غير موجوده في هذا الروتين.( الاف المسجات سوف تصل الى هذا الروتين مثل حركه الفارة او اي شي مثل الضغط على زرار على النموذج وهكذا....) أذا هذا الحل يعمل بس انا ايضا بتصاميمى انظر اى الاداء. B)
بس هناك حل اخر! :) نعم دلفي له مقدرة انه يرسلك رسال معينة.انت تختارها مثل WM_NCRBUTTONDOWN
procedure TLogFrm.WMNCRBUTTONDOWN(var message:Tmessage);
begin
with message do
case Msg of
WM_NCRBUTTONDOWN:{Do Nothing}
end;
end;او هكذا
procedure TLogFrm.WMNCRBUTTONDOWN(var message:Tmessage);
begin
{Do Nothing}
end;يجب ان تترك الملاحظة والا سوف يلغي الكومبايلر الروتين بكامله .
وهذا اعلانها في Public
procedure WMNCRBUTTONDOWN(var message:Tmessage); message WM_NCRBUTTONDOWN;
وهكذا نرى أن الحل كان جدا بسيط....
ارجوا ان يكون الشرح مفيد
وشكرا