المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : أفكار و أكواد مفيدة Algorithms


aehbvii
14-05-2007, 09:18 PM
أصدقائى الأعزاء
كثيرا ما يحتاج أحدنا لعمل شئ معين فى برنامجه، و قد لا يعرف فى كثير من الأحيان كيفية عمل هذا الشئ.
و عن نفسى كثيرا ما قابلتنى مثل هذه المواقف، و طبعا كنت بأدوخ على ما أعرف أعملها، كنت بأدور فى الـ MSDN أو على النت أو أفضل أجرب لغاية ما تطلع عينى.
فطبعا من المفيد إن كل واحد مننا عنده كود أو Algorithm لعمل شئ معين فى برنامج - يعنى مش لازم برنامج كامل - يا ريت يضعه هنا علشان الكل يستفيد منه.
أنا اتناقشت مع Hannnny فى الموضوع بتاع الـ API و لقينا إن من الافضل نبدأ موضوع جديد و نسيب موضوع الـ API للـ API.

و بمناسبة الموضوع الجديد أنا عندى بعض المواقع اللى حسيت إنها ممكن تكون مفيدة:

الموقع الأول:
http://www.codeproject.com/
و ده موقع زى ما باين من إسمه عليه أكواد كتير فى كل اللغات
و أنا شخصيا جبت منه الكود اللى يخلى البرنامج بتاعك بالسى شارب مايشتغلش أكتر من مرة فى نفس الوقت ( اللى اتكلمت عنه مع Hannnny) و إن شاء الله هأحطه فى المشاركة التالية

الموقع الثانى:
http://p2p.wrox.com/
و ده منتدى برمجى خاص بدار النشر WROX اللى أكيد كلنا عندنا كتب من إصدارها
و المنتدى ده مستواه عالى جدا و مافيش مرة سألت على حاجة فيه غير و لقيت إجابة

الموقع الثالث:
http://www.wildnoodle.com
و ده موقع لذيذ بيتعمل عليه مسابقات فى concept البرمجة، يعنى مش لازم تكون تعرف البرمجة بلغة معينة، لأ المسابقات فى كيفية التفكير فى حل المشكلة و فى عمل دوال و استدعائها و كده يعنى

يا ريت تكون المواقع دى مفيدة للجميع، و يا ريت كلنا نشارك فى الموضوع لتعم الفائدة

aehbvii
14-05-2007, 09:43 PM
لمنع برنامجك من العمل أكثر من مرة فى نفس الوقت:
يمكنك استعمال الخاصية Length من القيمة الراجعة من الدالة GetProcessByName كما بالمثال التالى:
داخل الدالة main نضع السطر الخاص بتشغيل البرنامج و هو
Application.Run(new Form1());
داخل جملة if التالية
if (System.Diagnostics.Process.GetProcessesByName(Sys tem.Diagnostics.Process.GetCurrentProcess().Proces sName).Length == 1)
فتصبح دالة main بالشكل التالى
static void Main()
{
if (System.Diagnostics.Process.GetProcessesByName(Sys tem.Diagnostics.Process.GetCurrentProcess().Proces sName).Length == 1)
Application.Run(new Form1());
}

شرح الكود:
الدالة GetProcessByName تعيد process بمعرفة اسم هذه الـ process، و هنا نقوم بتشغيل هذه الدالة و إعطائها إسم الـ process الخاصة بالبرنامج الحالى عن طريق GetCurrentProcess().ProcessName
و يعدها نأخذ الـ process المعادة من الدالة و عن طريق الخاصية Length نعرف ما إذا كان البرنامج بتاعنا يعمل بالفعل أم لا، فلو أن Length تساوى 1 فهذا معناه أن البرنامج لا توجد منه غير نسخة واحدة فى الذاكرة و هى النسخة الحالية و بالتالى يتم تنفيذ باقى البرنامج عن طريق السطر
Application.Run(new Form1());
أما لو كانت Length تساوى 2 فهذا معناه أن النسخة الحالية هى النسخة الثانية فى الذاكرة و بالتالى لا يتم تنفيذ البرنامج

الـ reference اللى جبت منه الكود ده:
http://www.codeproject.com/Purgatory/Previous_Instance.asp

طبعا ماحدش فهم حاجة لأنى طول عمرى مش بأعرف أشرح، و لما أجى أفهم حد حاجة أفضل ألف و أدور حوالين الموضوع لغاية ما أنسيه إسمه، لكن عزائى الوحيد إنكم كلكم programmers و أكيد الموضوع بسيط بالنسبة لكم و مش محتاجين شرح واضح

A.B.D
14-05-2007, 10:31 PM
موضوع رائع جزاك الله كل خير ان شاء الله نكبره مع بعض بالأفكار الكويسه

romanza
14-05-2007, 10:50 PM
جزاك الله كل خير على المجهود الجميل ده

aehbvii
14-05-2007, 11:49 PM
جزانا و إياكم
يا رب بس نفيد و نستفيد من بعض

anoos1973
15-05-2007, 01:15 AM
فكرة الكود اللي انت حاطه حلوة جدا بجد ومفيدة اوي
شكرا ليك

TheGhostFish
15-05-2007, 06:10 AM
شرحك ممتاز و بجد بداية حلوة أويييييييييي
بس المهم ما تزهقش و تكمل معانا
:icon30:

SAMEH_3ABDALLAH
15-05-2007, 06:46 PM
حلوة قوى يااستاذ ايهاب جزاك الله كل خير
ودا كود لنفس الموضوع بس مع vb6


if app.PrevInstance =True then exit sub : end


دا بيقفل البرنامج من نفسه يعنى كود بيوضع فى form_load
ولكن فى كود تانى Advanced لكنه api وينفع فى كله

m = FindWindow(vbNullString, "first form")
sendmessage m,&10 ,&0,&0


بالنسبة للدالة دى فانت بتخللى البرنامج المفتوح يقفل اى نسخة تتفتح منه عن طريق ال form title هنا انا قلتلك مش دقيقة عشان كدا
و طبعا الكود الاول يوضع فى sub main وتخللى البرنامج startup من sub main او void main
لان لو داخل الفورم فطبعا كل اما تفتح البرنامج حيقفله والتانى تعمل عليه loop من داخل البرنامج الاساسى
for-next او do- loop او while wend اى حاجة او يشتغل فى timer (بس ماافضلهاش)
وشكرا للموضوع الرائع

aehbvii
15-05-2007, 11:59 PM
المثال باستخدام Visual Studio .NET 2003
نفتح بروجكت Visual C++جديد من نوع MFC Application
نختار Single Document

http://www1.filehost.to/files/2007-05-15_03/223119_7.jpg

نفتح الـ Resource View و نعمل expand لإسم البروجكت ثم expand للـ rc كما بالصورة

http://www1.filehost.to/files/2007-05-15_03/215703_1.jpg

بعدها كليك يمين على Icon ثم نختار Insert Icon من القائمة لعمل أيقونة جديدة لوضعها فى الـ System Tray
ثم نرسم الايقونة التى نريدها
مازلنا فى الـ Resource View، نعمل expand لـ Menu ثم كليك مزدوج على IDR_MAINFRAME

http://www1.filehost.to/files/2007-05-15_03/220431_2.jpg

و ذلك لفتح القائمة الرئيسية للبرنامج لإضافة entry فى القائمة لاستخدامها فى وضع الأيقونة فى الـ System Tray

http://www1.filehost.to/files/2007-05-15_03/220712_3.jpg

نختار الـ entry الجديدة المكتوب فيها Type Here الموجودة داخل قائمة File و نسميها بأى إسم يدل على وظيفتها و ليكن SysTray Icon مثلا (يمكن وضع العلامة & قبل أى حرف فى الإسم ليصبح هو الحرف النشيط)

بعدها نحول على الـ Class View و نعمل expand لإسم البروجكت

http://www1.filehost.to/files/2007-05-15_03/221429_4.jpg

نختار الـ class المسماة CMainFrame، ثم من الـ Properties window نختار Events (علامة الشرارة الكهربية) و نعمل expand لـ ID_FILE_SYSTRAYICON

http://www1.filehost.to/files/2007-05-15_03/222052_5.jpg

نختار Command و نضغط على الزر المجاور و نختار Add> OnFileSystrayicon>

http://www1.filehost.to/files/2007-05-15_03/222420_6.jpg

و ذلك لعمل دالة function جديدة للعنصر الذى أضفناه لقائمة File
نضع الكود التالى داخل الدالة الجديدة void CMainFrame::OnFileSystrayicon()

HWND hWnd = m_hWnd;
HICON hIcon = ::LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1));

NOTIFYICONDATA nid;

nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = 0;
nid.uFlags = NIF_MESSAGE | NIF_ICON;
nid.hIcon = hIcon;
Shell_NotifyIcon(NIM_ADD, &nid);

if (hIcon)
DestroyIcon(hIcon);


نعرف متغير من النوع NOTIFYICONDATA
و نملأ مكوناته كما هو مكتوب بالكود ثم نضيف الأيقونة باستخدام الدالة Shell_NotifyIcon()

بعدها نعمل run للبرنامج و بالهنا و الشفا

http://www3.filehost.to/files/2007-05-15_03/224413_8.jpg

هتلاقى الأيقونة بتاعتك ظهرت فى الـ System Tray

http://www3.filehost.to/files/2007-05-15_03/224650_9.jpg

أتمنى أكون أفدت و لو واحد بس من المجموعة، هأبقى سعيد جدا

فى المشاركات التالية إن شاء الله سأضع كيفية تغيير هذه الأيقونة و كيفية التعامل معها و كيفية مسحها

لتحميل المثال
http://rapidshare.com/files/31511965/test.zip

aehbvii
20-05-2007, 12:32 PM
دلوقتى نيجى لتغيير الايقونة
أول حاجة هنضيف أيقونة جديدة زى ما ضفنا الأولانية.
و نضيف كمان عنصر لقائمة File علشان نغير بيه الأيقونة.
طبعا لما نيجى نعمل برنامج بجد هنخلى الأيقونة تتغير تبعا لحالة البرنامج، أنا بس حاطط هنا عناصر فى القائمة علشان نجرب بيها، هنسمى العنصر الجديد مثلا Change Icon.
هنضيف Event handler للعنصر الجديد زى ما عملنا فى اللى فات، اللى مش فاكر يراجع الموضوع اللى فات
الدالة هيبقى إسمها OnFileChangeicon
هنضيف فيها الكود التالى

HWND hWnd = m_hWnd;
HICON hIcon = ::LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON2));

NOTIFYICONDATA nid;

nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = 0;
nid.uFlags = NIF_ICON;
nid.hIcon = hIcon;
Shell_NotifyIcon(NIM_MODIFY, &nid);

if (hIcon)
DestroyIcon(hIcon);


زى ما إحنا شايفين كود تغيير الأيقونة تقريبا زى الكود بتاع وضع الأيقونة
الفرق الواضح إننا بنستخدم NIM_MODIFY بدلا من NIM_ADD
بعد كده نعمل run للبرنامج و نختار SysTrayIcon

http://www3.filehost.to/files/2007-05-20_02/112559_1.jpg

هتلاقى الأيقونة بتاعتك ظهرت كالعادة

http://www3.filehost.to/files/2007-05-20_02/112654_2.jpg

بعد كده تختار Change Icon

http://www3.filehost.to/files/2007-05-20_02/112835_3.jpg

هنلاقى الايقونة اتغيرت

http://www3.filehost.to/files/2007-05-20_02/113015_4.jpg

يا ريت اللى تقف قدامه أى حاجة يسأل فورا

aehbvii
20-05-2007, 05:38 PM
طيب إحنا دلوقتى بنحط ايقونة للبرنامج منظر كده و خلاص؟
هو أحيانا بتكون الأيقونة فى حد ذاتها مهمة يعنى مثلا بتوريك حالة البرنامج
مثلا مثلا متصل بالنت ولا لأ، الحاجة اللى البرنامج بيعملها خلصت ولا لسه، و كده يعنى
لكن الأيقونة ممكن تبقى كمان interactive يعنى تستجيب لحركات اليوزر كليك يمين مثلا أو دبل كليك
نيجى للحتة اللى فيها شغل بقى
هو الموضوع بسيط جدا زى ما هنشوف دلوقتى
أول حاجة هنيجى فى الدالة OnFileSystrayicon اللى بنحط فيها الأيقونة فى الـ System tray، و هنضيف السطر ده

nid.uCallbackMessage = MYWM_NOTIFYICON;

قبل الدالة Shell_NotifyIcon
و كده يبقى كود الدالة OnFileSystrayicon الكامل كده

void CMainFrame::OnFileSystrayicon()
{
HWND hWnd = m_hWnd;
HICON hIcon = ::LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1));

NOTIFYICONDATA nid;

nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = 0;
nid.uFlags = NIF_MESSAGE | NIF_ICON;
nid.hIcon = hIcon;
nid.uCallbackMessage = MYWM_NOTIFYICON;
Shell_NotifyIcon(NIM_ADD, &nid);

if (hIcon)
DestroyIcon(hIcon);
}


طيب إيه السطر اللى ضفناه ده؟ ده اللى بيقول للـ Windows تبعت الرسالة MYWM_NOTIFYICON للبرنامج لما الأيقونة يحصل لها حاجة.
طيب ده البرنامج مايعرفش يعنى إيه MYWM_NOTIFYICON، يبقى لازم نعرفهاله
نيجى فى أول الملف قبل الـ message map و نضيف السطر ده

const UINT MYWM_NOTIFYICON = 33000;

بعد السطر

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

و ده اللى بيعرف الـ Message اللى اسمها MYWM_NOTIFYICON للبرنامج
بعد كده هنقول للبرنامج لما تيجى له الـ message يعمل إيه
هنيجى جوه الـ message map و قبل السطر ده على طول

END_MESSAGE_MAP()


و نضيف السطر ده

ON_MESSAGE(MYWM_NOTIFYICON, OnMyNotification)

و هنا بنقول للبرنامج لما تيجى لك الـ message اللى اسمها MYWM_NOTIFYICON شغل الدالة اللى اسمها OnMyNotification.

فاضل إيه؟ فاضل نحط الدالة OnMyNotification

هنيجى على الـ Class View و نعمل دبل كليك على الكلاس CMainFrame

http://www1.filehost.to/files/2007-05-20_02/124100_5.jpg

علشان يفتح لنا الملف الـ header اللى فيه تعريف الكلاس CMainFrame، الملف إسمه mainfrm.h
هنضيف سطر تعريف الدالة فى أخر الكلاس خالص يعنى قبل القوس بتاع نهاية الكلاس

afx_msg LRESULT OnMyNotification(WPARAM, LPARAM);

نرجع تانى للملف mainfrm.cpp و نحط جسم الدالة OnMyNotification فى أخر الملف

LRESULT CMainFrame::OnMyNotification(WPARAM wParam, LPARAM lParam)
{
UINT uMouseMsg = (UINT) lParam;

if (uMouseMsg == WM_LBUTTONDBLCLK)
{
AfxMessageBox("Double Click!");
}

else if (uMouseMsg == WM_RBUTTONDOWN)
{
AfxMessageBox("Right Click!");
}

return S_OK;
}


متهيألى الكود واضح
لما اعمل دبل كليك على الأيقونة تطلع لى رسالة تقولى DoubleClick و لما أعمل كليك يمين تطلع رسالة تقول Right Click، طبعا فى البرامج اللى بجد أكيد البرنامج هيعمل حاجات تانية

بس خلاص شغل البرنامج بقى و اظهر الأيقونة و اعمل عليها دبل كليك و كليك يمين و غيرها و جرب كل حاجة

aehbvii
20-05-2007, 06:14 PM
فاضل حاجة واحدة بقى، إنك تشيل الأيقونة لما تحب أو لما البرنامج يقفل
هنضيف عنصر جديد لقائمة File و نسميه Delete Icon
و هنحط للعنصر الجديد الدالة الـ Event Handler بتاعته اللى هيبقى إسمها OnFileDeleteicon
و هنحط فيها الكود التالى

HWND hWnd = m_hWnd;

NOTIFYICONDATA nid;

nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = 0;
Shell_NotifyIcon(NIM_DELETE, &nid);

طبعا انتم خلاص بقيتوا أساتذة فى التعامل مع أيقونة الـ system tray و مش محتاجين شرح
بس عموما واضح إن NIM_DELETE هى المسئولة عن مسح الايقونة
كده لما نختار Delete Icon من قائمة File هنلاقى الأيقونة اختفت
طيب أنا عايز لما أقفل البرنامج الأيقونة تتشال برده
فى الـ Class View هأختار الكلاس بتاعتنا CMainFrame
و بعدين فى الـ Properties هأختار Messages زى الصورة كده

http://www3.filehost.to/files/2007-05-20_03/165918_6.jpg

و بعدين أختار WM_CLOSE و أدوس المثلث اللى جنبها و أختار Add> OnClose>
فى الدالة OnClose هأحط بس سطر ينادى على الدالة بتاعتى OnFileDeleteicon و هيكون مكانها قبل السطر ده

CFrameWnd::OnClose();

يعنى الكود الكلى للدالة OnClose هيبقى كده

void CMainFrame::OnClose()
{
OnFileDeleteicon();

CFrameWnd::OnClose();
}


شغل البرنامج و جرب كل حاجة فيه
كده يبقى الموضوع بتاع الـ System tray icon انتهى، لو حد عنده أى سؤال يا ريت يسأل
و أتمنى يكون فيه حد استفاد منه

لتحميل البرنامج بالكامل
http://rapidshare.com/files/32375411/system_tray_icon.zip

anoos1973
16-06-2007, 07:51 AM
لما بكون عاوز اكتب كود واشيله عندي عشان استخدمه في اكترمن برنامج بعمله في كلاس

طيب هل مكن للكلاس ده اعمل واجهة جرافيك
؟؟؟
بحيث بدل ميبقى الكود بس المستخدماستخدم جرفيكه معاه كعمل تولبار مثلا احطه في كل برامجي

aehbvii
16-06-2007, 08:10 PM
متهيألى قصدك تعمل حاجة زى Ocx كده

maddah
13-10-2007, 12:50 AM
انا كده برد على الموضوع متاخر اوي بس مش مشكله
بص يا انوس الكلاس لما تضفلو gui يبقا كنترول فانت كده ممكن بدال ما تكتبو على انو كلاس تكتبو من الاول على انه كنترول واي خدمه يا باشا