٨‏/١‏/١٤٢٨ هـ

Delphinized Idea 1 أفكار دلفينية


كيف توقف قائمه النظام في النموذج Form's System menu

كنت افحص احد برامجي التي تعمل تحت multithreading حيث كان هناك عدة نماذج وفي احد النماذج يقوم thread بعرض بعض النتائج وحالة عمل لthread عن طريق دالة التزامن synchronize......كل شي يعمل كما صمم ...جميل ان ترى كل شي يعمل مثل الساعة, تك تك تك


وفجأة عندما ضغطتُ على اسم النموذج عن طريق الفارة يمين وظهرت قائمة النظام. يبداء تأثير أنعكاسي على الthread ويبدا بالتاخر بعرض النتائج وربما يتوقف بالكامل.


وهذا بسبب ان دالة التزامن synchronize تعتمد على عملها بمبداء (الرسائل) messages،وبما ان النموذج في حالة عرض قائمة النظام system menu اذا لوب الرسائل متوقف.


انها مشكلة لم انتبه لها الا من خلال الفحص.

أّذاً ما الحل؟

ربما احد سوف يقول بسيطة...... اوقف عرض القائمة عن طريق []=:borderIconsصحيح ...ولكني انا استعمل bsToolwindow مع زر أغلاق. اي اني اريد النموذج هكذا:

bsToolWindow
Close Button
وبدون biSystemMenu

التجميع او التركيبه هذه لا تعمل مع بعضها . اي لا تستطيع ان تعملها.

الحل الوحيد اللذي استطعت الوصول له هو اني استعمل winproc واعترض الرسالة التى ترسل عندما تضغط على اسم النموذج بزر الفارة يمين. وهي WM_MCRBUTTONDOWN

ومن ثم أقوم بتجاهل هذه الرسالة. حل جميل أليس كذالك؟

بس هناك مشكلة بسيطة؟.....أن جميع الرسائل ترسل الى هذا الروتين ومن ثم تذهب الى الروتين الاصلي اذا كانت الرسالة غير موجودة في winproc (ألاف الرسائل التى ترسلها الوندوز الى البرنامج مثل حركه الفارة على النموذج والضغط على الفارة و و و.............)

أذاً هذا الحل يعمل بس أنا في تصاميمي ابحث عن الاداء ايضاُ؟

ولكن بعد التفكير وجدت حل اخر اسهل . نعم الدلفي بأستطاعتة ان يرسل لك رسالة معينه انت تختارها. مثل WM_NCRBUTTONDOWN


Code








procedure TLogFrm.WMNCRBUTTONDOWN(var message:Tmessage);
begin
with message do
case Msg of
WM_NCRBUTTONDOWN:{Do Nothing};
end;
end;
end;







 
procedure TLogFrm.WMNCRBUTTONDOWN(var message:Tmessage);
begin
{keep this remark}
end;












procedure WMNCRBUTTONDOWN(var message:Tmessage); message WM_NCRBUTTONDOWN;


ليست هناك تعليقات: