خطوة خطوة لإنشاء TNA (إيقونة بجنب الساعة) مع إضافة قائمة PopupMenu وتلميح منطادي
#17
نواصل...
خطوات إضافية: البرنامج مكتمل ويمكن إضافة خيارات أخرى، مثل جعل البرنامج يظهر في أحد المنطقتين دون الأخرى، عرض خيار للمستخدم فيما إذا كان يرغب بتصغير البرنامج عند غلقه...
الخطوة الأولى: يمكن أن نجعل البرنامج يظهر في أحد المكانين، إما في علبة شريط المهام أو في شريط المهام نفسه، ولأجل ذلك نقوم بما يلي:
أولا: من الأحسن أن نجعل إجراء منفرد يعرض الأيقونة، ثم نضيفه إلى FormCreate أو نترك هذا الأخير فارغا:
PHP كود :
private
    
procedure ShowMyTNA; 
نستعمل Ctrl+Alt+C ونكتب:
PHP كود :
procedure TForm1.ShowMyTNA;
begin
  with MyTNA 
do
    
begin
      cbSize 
:= SizeOf(TNotifyIconData);
      
MyTNA.uID := 0;
      
uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
      
Wnd := Handle;//
      
uCallbackMessage := WM_APP +1;
      
hIcon := Application.Icon.Handle;
      
szTip := 'Delphi 4 arab';
    
end;
  
Shell_NotifyIcon(NIM_ADD, @MyTNA);
end; 
* يمكن إضافة زر يعرض الأيقونة إلى جنب ساعة الويندوز، ويخفيها من شريط المهام، ونجعله غير مفعل إذا كانت الأيقونة تظهر، ويفعل هو الآخر زر عرض التلميح، فنضع زر ونكتب في حدث النقر عليه:
PHP كود :
procedure TForm1.BtnShowTNAClick(Sender: TObject);
begin
  ShowMyTNA
;//عرض الأيقونة
  
BtnShowTNA.Enabled := False;//تعطيل زر عرض الأيقونة
  
BtnShowHint.Enabled := True;//تفعيل زر عرض الأيقونة
  
ShowWindow(Application.Handle, SW_HIDE) //إخفاء البرنامج من شريط  المهام
end; 

ويلزم لأجل هذا التغيير، تغيير زر عرض النموذج الذي وضعناه في القائمة المنسدلة، بالشكل التالي:
PHP كود :
procedure TForm1.N1Click(Sender: TObject);
begin
  Show
;//عرض النموذج
  
FormDestroy(Sender);//إخفاء الأيقونة، وذلك باستدعاء الأوامر التي تحدث عند إعدام النموذج
  
BtnShowTNA.Enabled := True;//تفعيل زر عرض الأيقونة
  
BtnShowHint.Enabled := False;//تعطيل زر عرض التلميح مرة أخرى
  
ShowWindow(Application.Handle, SW_SHOW)//عرض اسم البرنامج في شريط المهام
end; 
الخطوة الثانية: إضافة مكون من النوع TCheckBox ثم نعدل في الإجراء الذي يتلقى الأحداث بإضافة حدث غلق النموذج ونغير فيه بما يلي:
PHP كود :
procedure TForm1.WMSyscommand(var msg: TWmSysCommand);
begin
  
if msg.CmdType and $FFF0 = SC_MINIMIZE then
    begin
      Hide
;
      
BtnShowTNA.Click;
    
end else
    
begin
      
if msg.CmdType and $FFF0 = SC_CLOSE then// إذا تلقى حدث غلق النموذج
        
if ChkBxCloseOnExit.Checked then//التحقق من أن الخيار "إخفاء عند الغلق" مفعل 
          
begin
            ShowMyTNA
;//عرض الأيقونة
            
Hide;//إخفاء النموذج
          
end else Close//وإن لم يكن مفعل ...فيقوم الإجراء بغلق النموذج
        
else inherited;//وإن لم يتلقى الإجراء حدث تصغير ولا حدث الغلق...فسيرث الأحداث الأخرى 
    
end
end
; 
آخر إضافة: يمكن إضافة تلميح منطادي عند محاولة غلق النموذج (في حين خيار "تصغير عند الغلق" مفعل) ينبه المستعمل على أن البرنامج لم يغلق، ولا يزال يشتغل (يضاف هذا الأمر في الإجراء الذي يتقلى أحداث التلميح):
PHP كود :
...
      if 
msg.CmdType and $FFF0 = SC_CLOSE then
        
if ChkBxCloseOnExit.Checked then
          begin
            ShowMyTNA
;
            
ShowBalloonTips('لا يزال البرنامج مفتوحا', 'تنبيه');
            
Hide;
... 
ملاحظات:
- inherited ترث الأحداث الأصلية، وفي حالتنا هذه غيرنا في حدث التصغير وفي حدث الغلق وبقي حدث تكبير النموذج وحدث تغيير حجم النموذج.
- أحيانا يفقد البرنامج التركيز (Focus) ولا يتلقى حينها أوامر لوحة المفاتيح (يحدث ذلك أحيانا عند تكبير النموذج) لاسترجاع التركير على البرنامج نستعمل الأمر BringToFront وأحيانا لا تنفعل فنستخدم:
SetForegroundWindow(Handle);

أتمنى أن يكون الموضوع نال إعجابكم وأشبع حاجتكم
وكما ذكرنا سابقا أنه توجد مكونات كثيرة تقوم بهذا العمل (كما أشار إلى ذلك بعض الأعضاء)، وأن الإصدارات الحديثة للدلفي تأتي معها مثل هذه المكونات، لكننا كما بينا أننا نريد أن نقوم بذلك بأنفسنا برمجيا لعدة أسباب منها: أن نتعلم كيفية التعامل دوال Api، والتحكم فيها وعرضها بالشكل الذي نريد، جعل البرنامج أكثر خفة بإضافة العناصر التي نحتاجها فقط (وهذا مهم بالنسبة لأي مبرمج محترف لأنه يعتبر 10 Kb إضافية لوزن البرنامج شيء ثقيل)...

المثال النهائي مع الكود سورس في المرفقات.

هذا والله سبحانه وتعالى أعلم، وصلى الله على سيدنا محمد.
والسلام عليكم ورحمة الله.


الملفات المرفقة
.rar   TutoTNA.rar (الحجم : 168.23 ك ب / التحميلات : 299)
الرد


الردود في هذا الموضوع
خطوة خطوة لإنشاء TNA (إيقونة بجنب الساعة) مع إضافة قائمة PopupMenu وتلميح منطادي - بواسطة kachwahed - 11-01-2009, 12:09 PM

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


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم