الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Rgb Laboratory

بدأه Abboodd في 14 فبراير 2009 · 9 رد · 816 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

أقدم لكم اليوم البرنامج الذي عملت على برمجته في الأيام القليلة الماضية RGB Laboratory

يعلمك هذا البرنامج مبادئ نظام الألوان RGB مع إمكانيات متنوعة كفصل الأحمر والأخضر والأزرق من لون ما، أو الحصول على التدرج الرمادي لهذا اللون، أو إشباعه بلون آخر، أو عكسه...

مع Timer يقوم بالتنقل بين الألوان لمزيد من التوضيح

بانتظار تقييمكم وملاحظاتكم (رحم الله امرئاً أهدى إلي عيوبي)

والسلام عليكم ورحمة الله

RGB_Laboratory.zip

هذه الجملة خاطئة  :wacko: 


#2

تمام يا عبود الله ينور .. شغلك لا غبار عليه .. لكن ليا بعض الملاحظات الخفيفة في أشياء قد يختلف عليها إثنان

أولا الـ On Error Resume Next .. انا اخدت بالي من مواضعها وفاهمك .. بس مكانش المفروض تستخدمها

حاجه كمان وهي لما تقول On Error GoTo .. المفروض هندلة الـ Error تبقى Standard

اقصد انك في الـ ErrorHandler تستدعي إجراء واحد موحد على المشروع بأكمله .. وهناك تعمل اللى انت عاوزه

حاجه كمان وهي بالنسبة لدوال الـ API .. ليا مبدأ مختلف عنك بعض الشيء

اقصد تعمل مديول لكل مكتبة لواحدها .. مثلا للـ mUser32 و mKernel32 و mShell32 .. اكيد فاهمني

وحاجات تانيه تبقى تفصلها مثلا مديول للريجستري كامل ومديول للتعامل مع الملفات والفولدرات وهكذا .. لما يكون الموضوع كبير

ولكل مديول تكتب فيه الـ Procedures بتاعتك بشكل Standard وتسدعي الإجراء في الـ Form

بدل ما تستدعي الـ Declare Function أو الـ Declare Sub في الـ Form

وده طبعا هيخلي الـ Procedures تكون Public والـ Declarations تكون Private

وياريتك تلم كل مجموعة من الـ Constants في Enum واحد .. وطبعا هيكون Public .. وتعرف معطياتك على الـ Enum ده


' my standard code
End Function
Public Function Test(ByVal lParam As MYEnum)

وفي النهاية الله ينور .. ونتمنالك المزيد من التقدم :)

تم تعديل هذه المشاركة بواسطة mrx_ta7ady في 15 فبراير 2009 في 04:54

اعتذر عن عدم تمكني للمتابعه الدورية في وقتنا الحالي

فليقبل الجميع تقديري واحترامي .. ولكم تحياتي

#3

شكراً على مرورك يا أستاذ تحدي، فلنتناقش في تعليقاتك لنصل إلى الأفضل بإذن الله ;)

اقتباس
أولا الـ On Error Resume Next .. انا اخدت بالي من مواضعها وفاهمك .. بس مكانش المفروض تستخدمها

أظن أنك تعلم السبب الرئيسي لاستعمالي لها، وهو أني في بعض الإضافات (التنكيهات) ليس هناك ضرورة لها لذلك قمت بعمل Resume Next لكي يستمر العمل معها وبدونها دون مشاكل، لم أفهم كثيراً لماذا يجب ألا أستخدمها؟؟؟

اقتباس
حاجه كمان وهي لما تقول On Error GoTo .. المفروض هندلة الـ Error تبقى Standard

اقصد انك في الـ ErrorHandler تستدعي إجراء واحد موحد على المشروع بأكمله .. وهناك تعمل اللى انت عاوزه

فعلاً فكرت في هذا، وأظن أنك أخذت هذه الفكرة من مشروع VBPaint (مشروع رائع، طريقة تنظيم أكواده تكاد تكون أحلى من طريقة عمله)، لكن لا أدري لمَ لم أرتح كثيراً لهذه الفكرة، ربما أستعملها عند عمل تطوير للمشروع ;)

اقتباس
حاجه كمان وهي بالنسبة لدوال الـ API .. ليا مبدأ مختلف عنك بعض الشيء

اقصد تعمل مديول لكل مكتبة لواحدها .. مثلا للـ mUser32 و mKernel32 و mShell32 .. اكيد فاهمني

وحاجات تانيه تبقى تفصلها مثلا مديول للريجستري كامل ومديول للتعامل مع الملفات والفولدرات وهكذا .. لما يكون الموضوع كبير

اسمح لي أن أختلف معك هنا، ففي حالتي هذه، تجد أن عدد الـAPI Declerations قليل جداً، وليس من المعقول أن أفرد Module لكل واحدة، طبعاً يمكنني القيام بهذا عندما يكون المشروع كبيراً، جزاك الله خيراً. وبالنسبة لعمل Module لكل شيء معين، فقد فكرت في هذا وبدأت به، لكني اكتشفت فيما بعد أنه هنا سيسبب لي بعض المتاعب، وإن شاء الله سأعمل على تطبيق هذا في المشاريع القادمة.

اقتباس
ولكل مديول تكتب فيه الـ Procedures بتاعتك بشكل Standard وتسدعي الإجراء في الـ Form

بدل ما تستدعي الـ Declare Function أو الـ Declare Sub في الـ Form

وده طبعا هيخلي الـ Procedures تكون Public والـ Declarations تكون Private

هذه لا يمكنني أن أقول عنها إلا :thumbup: فكرة تنظيمية جميلة، فالذي يفتح الـForm لا يريد أن يرى API في كل مكان، جزاك الله خيراً

اقتباس
وياريتك تلم كل مجموعة من الـ Constants في Enum واحد .. وطبعا هيكون Public .. وتعرف معطياتك على الـ Enum ده

هذه لم أفهمها جيداً، فكل ما عندي هو API Constants فكيف سأقوم بعمل Enumeration عليها؟؟؟؟

اقتباس
وفي النهاية الله ينور .. ونتمنالك المزيد من التقدم

وإياك، جزاك الله خيراً، وأنا أنتظر منك مشروعاً أو درساً أو أي شيء تتحفنا به :thumb_up:

بالنسبة للتعديلات لا تقلق، البرنامج الآن نسخة مبدأية 1.0، قريباً بإذن الله سيكون هناك 1.1 مع كل التعديلات، وإضافات مميزة من حيث الكثرة والقوة بإذن الله

إن كانت هناك أي ملاحظات أو تعليقات أخرى فلا تبخل على أستاذ تحدي، ولا يبخل أي أحد من الإخوة :)

السلام عليكم ورحمة الله

هذه الجملة خاطئة  :wacko: 


#4

صباح الخير أولا .. وتعالى نرجع للـ On Error Resume Next

طبعا انا ارى ان مينفعش تحدث صغيرة او كبيرة دون ان نعلم بها .. يعني مينفعش نكبر دماغنا .. والاعتراض على المبدأ

الحاجه التانيه بتاعت الـ Handler .. فبلاش تغمز وتظن لانى ماعرفش الـ VBPaint ده أصلا :haha: ولا اخدت افكاري من اي مكان غير دماغي

الحاجه التالته انت مفهمتنيش فيها كويس .. لانك مشفتهاش قبل كده :haha: .. ولا VBPaint بقى ولا VBWalad

انا اقصد انك لما يبقى عندك Declare مثلا زي الـ SendMessage أو اي واحد من اللى في الـ mdlAPI إلا ShellExecute


Public Declare Function ReleaseCapture Lib "user32" () As Long
Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Public Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" (ByVal hInstance As Long, ByVal lpCursorName As Long) As Long
Public Declare Function SetCursor Lib "user32" (ByVal hCursor As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

لاحظ معايا كده كلمة Lib يعني Library .. الكلمة المكتوبة بعدها هي إسم ملف المكتبة

كان قصدي انك تجمع الـ Declarations بتاعت الـ User32 بالإجرائات اللى هتعملها إنت

وتضعهم كلهم في Module واحد خاص بالـ User32 .. ويكون اسمه مثلا mUser32

ونفس النظام مع الـShellExecute وحدها وهتكون في Module إسمه mShell32

والعملية دي مش هتكلفك ولا سطر زياده .. ولكن هيكون شغلك Standard .. والمبدأ هنا التنظيم وسهولة الوصول إلى هدفك

وطبعا مع كل مشروع جديد هتضيف إلى الـ Modules اللي عندك مش هتعمل من الأول وجديد

بعد 3 او 4 مشاريع هتلاقي عندك مكتبة لا بأس بها .. وده حل توصلتله انا بعد سهر ليالي

وشواذ القاعدة دي لما يكون عندك موضوع مستقل بذاته كالـ Registry مثلا .. الموضوع كبير

فالأفضل تفصله عن Module الـ advapi32.dll .. طبعا انت عارف إن الإتصال بالـ Registry بيكون عن طريق الـ advapi32.dll

موضوع الـ Constants بقى .. الغرض من وجود Const هو قيمة الـ Const وليس وضعه كـ Const

احنا عارفين الـ SetWindowLong والـ GetWindowLong .. وعارفين المعطى بتاع الـ Index

وطبعا اكيد عارفين الـ Constants المستخدمه لإرسالها في الـ Index .. أنظر أدناه


Const GWL_HINSTANCE = (-6)
Const GWL_HWNDPARENT = (-8)
Const GWL_ID = (-12)
Const GWL_STYLE = (-16)
Const GWL_USERDATA = (-21)
Const GWL_WNDPROC = (-4)
Const GWL_EXSTYLE = (-20)

أما الـ Declarations نفسها .. فانظر أدناه ايضا


Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

أنظر الشكل الجديد وهتفهم كل اللى اقصده .. وطبعا هيكون موجود في Module


Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As GWLiNdexs) As Long

Public Enum GWLiNdexs
GWL_EXSTYLE = (-20)
GWL_HINSTANCE = (-6)
GWL_HWNDPARENT = (-8)
GWL_ID = (-12)
GWL_STYLE = (-16)
GWL_USERDATA = (-21)
GWL_WNDPROC = (-4)
End Enum
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As GWLiNdexs, ByVal dwNewLong As Long) As Long

من غير منزيد في الكلام ونشرح .. انت ايه رأيك دلوقتى ؟؟ اختلفت ؟؟ أسهل ؟؟ أصعب ؟؟

اعتذر عن عدم تمكني للمتابعه الدورية في وقتنا الحالي

فليقبل الجميع تقديري واحترامي .. ولكم تحياتي

#5
اقتباس
صباح الخير أولا .. وتعالى نرجع للـ On Error Resume Next

طبعا انا ارى ان مينفعش تحدث صغيرة او كبيرة دون ان نعلم بها .. يعني مينفعش نكبر دماغنا .. والاعتراض على المبدأ

طبعاً، هنا الإجراءات التي استعملت فيها Resume Next هي الإجراءات التي احتمالات حدوث خطأ فيها شبه معدوم، مثل عدم توفر user32.dll في جهاز ما، عندها الجهاز يكون

فهنا كان يمكن أن أظهر رسالة خطأ مثلاً في حال عدم توفر الإجراء SetCursor لسبب ما، لكن هذا الإجراء لا يؤثر على عمل البرنامج، وهو مجرد إجراء شكلي لتحسين الـUser Interface، فلو وضعت GoTo ErrorHandler وظهرت رسالة خطأ في كل مرة تم استدعاء هذا الإجراء، فالمتسخدم سوف :mad:

يعني إذا فشل هذا الإجراء التحسيني لسبب ما، فلا تهتم وأكمل البرنامج كما هو، وهذا أفضل من إظهار رسالة خطأ، والله أعلم.

اقتباس
الحاجه التانيه بتاعت الـ Handler .. فبلاش تغمز وتظن لانى ماعرفش الـ VBPaint ده أصلا ولا اخدت افكاري من اي مكان غير دماغي

الحاجه التالته انت مفهمتنيش فيها كويس .. لانك مشفتهاش قبل كده .. ولا VBPaint بقى ولا VBWalad

ههههه، حلوة هذه VBWalad :) ، نصيحة ابحث على Google عن VBPaint أو Bastr3Paint برنامج رائع جداً وأفكاره وتنظيمه للكود رائع.

سأقوم بإذن الله في النسخة القادمة بعمل إجراء موحد للـError .

بالنسبة للـAPI فقد فهمت قصدك جيداً، ولكن عندي عدد الـAPI Declerations قليل جداً، ولا يحتاج، ولكن بما أن هذا هو الـStandard فهذه حالة أخرى :)

فكرة الـEnum هذه جميلة، لم أعلم أني أستطيع تطبيق الـEnumerations على API Declerations ، شكراً لك.

شكراً لك على نصائحك، وأنا بانتظار المزيد، كله أصبح في المفكرة، ومع غمزة ;)

هذه الجملة خاطئة  :wacko: 


#6

السلام عليكم ورحمة الله

تم القيام بتعديلات كبيرة على RGB_Laboratory وهذه هي النسخة 1.1 ستعجبكم بإذن الله

لاستعمال البرنامج بفاعلية، عليك تشغيل البرنامج RGB Activator من المفترض أن يعرض لك رسالة نجاح، في حال عرض رسالة بالفشل فهذا يعني أنك لا تملك الصلاحية للكتابة في الريجيستري، يمكنك الاستعانة بمدير النظام عندك لتشغيل البرنامج لك، أو في حالة كنت أنت المدير وظهرت رسالة خطأ، فانقر على RGB Activator بالزر اليميني، واختر Run as administrator.

وهكذا سيعمل RGB_Laboratory 1.1 بفعالية، وستستطيع فتح وحفظ ملفات RGB Files.

من الإضافات الجديدة:

1- تعديل الكود بحيث أصبح أكثر وضوحاً لمن يريد الاطلاع عليه بإذن الله.

2- إضافة امتداد rgb إلى الجهاز بحيث أصبح بإمكانك حفظ الألوان وفتحها من جديد، مع استخدام كلمة سر، .

3- إضافة إمكانية الطباعة.

4- معالجة بعض الأخطاء التي كانت تحصل في البرنامج.

أرجو إبداء الملاحظات، وخصوصاً mrx_Ta7ady :)

رحم الله امرئاً هدى إلي عيوبي، في حال وجود أي خطأ أو ملاحظة أو أي شيء أرجو إخباري لأقوم بإضافته.

وقريباً بإذن الله

سوف تتم برمجة RGB_Laboratory 2.0

والذي سيتم فيه بإذن الله قراءة الألوان من خارج الكمبيوتر بواسطة جهاز Spectrum.

كما أنه لن يكون برنامجاً مستقلاً وحسب، وإنما سيكون مرفقاً مع برنامجين:

OBAA Photo Manager

و

OBAA Photo Editor

فستكون ثلاثة برامج تتفاعل مع بعضها بواسطة إرسال رسائل WINSOCK

سيعجبكم بإذن المولى.

لاتنسوا الملاحظات :)

السلام عليكم ورحمة الله

RGB_Laboratory_1.1.zip

هذه الجملة خاطئة  :wacko: 


#7

تمام والله ينور يا بطل .. وفي انتظار الإصدار 2 ان شاء الله

وبخصوص تعليقي فمش هيزيد عن اللى قلته قبل كده عن الـ On Error

وايضا نفس الكلام بالنسبة للـ mdlAPI وطريقة تنظيمه

واخدت بالي من الـ ErrorHandler وعجبني .. الله ينور

وإجراء الـ ErrorMessage نفسه مش هعلق عليه .. لانه هيكون وفقا لحاجتك وخبرتك انت

يتبقى حاجات بسيطة جدا مثل إستخدام رمز الـ (+) لتجميع قيمة من نوع String ومع الـ Enum

الأفضل إستخدام الـ (+) مع الارقام وإستخدام الـ (&) مع النصوص وإستخدام Or مع الـ Enum

وذلك لانه في حالة إستخدام الـ (+) بين قيمتين احدهما رقمية والآخرى نصية فسيظهر خطأ Mismatch

ولإستخدام الـ (+) مثلا لإرسال قيم موجوده في Enum معين سيتم إضافة القيمة مرتين إذا موجوده من قبل

اما مع Or لن يتم إضافتها وبالنسبة للـ (&) فسيقبل الرقم على انه نص لدمج القيمة الرقمية على النصية

امثلة على ذلك

MsgBox "Error: " & Err.Number & vbNewLine & Err.Description, vbOKOnly Or vbCritical

بدلا من

MsgBox "Error: " + Str(Err.Number) + vbNewLine + Err.Description, vbOKOnly + vbCritical

اعتذر عن عدم تمكني للمتابعه الدورية في وقتنا الحالي

فليقبل الجميع تقديري واحترامي .. ولكم تحياتي

#8

جزاك الله خيراً يا تحدي،

فعلاً مسألة الـEnum هذه كان عندي ظن خاطئ بالنسبة لها، سأعمل على تبديلها بإذن الله.

في حالة + و & فقد قمت بوضع Str(Error.Number) لتجنب Type Mismatch، لكن قد أبدلها في مرة قادمة بإذن الله.

بالنسبة للـmdlAPI ،، فعندي تعليقان، الأول: هل سيزيد وضع الكثير من التصريحات من حجم البرنامج أو يبطئ سرعته؟ والثاني: ألا يسبب وضع الكثير من التصريحات تشويشاً للذي يقرأ الكود؟

جزاك الله خيراً.

هذه الجملة خاطئة  :wacko: 


#9

بالنسبة للتعليق الأول والوقت .. فاي وقت تقصد ؟؟ وما علاقة تصريحات موجوده بزر امر مثلا ؟؟

طبعا الوقت لن يزيد من هذا وغير منطيقي .. ده في اعتقادي الشخصي ;)

والنطقة الثانية اعتقد انها هامة جدا .. ولكن سبق وقولت لك انك تقوم بعمل إجراءات لتنفيذ الوظائف المتعددة

وذلك في الـ Module نفسه وبدلا من إستدعاء التصريح بإسمه

اذا اتبعت مبدأي هذا الذي اسميه توحيد المنبع او توحيد المصدر

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

لانه سينظر في الإجرائات وليس التصريحات التي لا داعي ابدا لحفظها

وطبعا بالنسبة لمشروعك سالف الذكر فلن تجد الفائدة التي اقصدها بالشكل الذي اقصده

وهذا لانك تستخدم تصريحات قليلة والواحد منها يكفي لإجراء وظيفة مكتملة

اما بالنسبة للمشروعات المستقبلية التي تحتاج فيها استخدام اكثر من تصريح لتنفيذ وظيفة واحده

فبالتأكيد ستشعر بالفرق المذهل .. مثلا كا إلتقاط صورة من الشاشة او لظبط حجم صورة معينه مثلا

وايضا حين كتابة اجرائات تحتاج لحجز جزء من الذاكرة مثلا .. وقس على ذلك

ولكن بالطبع ليس للكل ولن يفهمك الجميع .. فقط سيفهم برنامجك من لديه إستعداد للفهم

والاهم من كل ما سبق ان تؤمن بما تعمل وتعطيه قدره المناسب .. ولا اكثر ولا اقل

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

ولكن مع الايام والخبرة سنستكمل سويا ما ناقشناه وستعرف قيمته جيدا بعد التطبيق ان شاء الله

اعتذر عن عدم تمكني للمتابعه الدورية في وقتنا الحالي

فليقبل الجميع تقديري واحترامي .. ولكم تحياتي

#10

أهلاً يا تحدي :)

اقتباس
بالنسبة للتعليق الأول والوقت .. فاي وقت تقصد ؟؟ وما علاقة تصريحات موجوده بزر امر مثلا ؟؟

طبعا الوقت لن يزيد من هذا وغير منطيقي .. ده في اعتقادي الشخصي

أقصد بذلك ضعف أداء البرنامج أو زيادة مساحته على الـHard Disk في حال كون الـModule الذي نضع التصريحات فيه، فيه كل أنواع التصريحات (ما هب ودب :) ) ، لكن لا أظن ذلك، هي مجرد فكرة.

اقتباس
والنطقة الثانية اعتقد انها هامة جدا .. ولكن سبق وقولت لك انك تقوم بعمل إجراءات لتنفيذ الوظائف المتعددة

وذلك في الـ Module نفسه وبدلا من إستدعاء التصريح بإسمه

اذا اتبعت مبدأي هذا الذي اسميه توحيد المنبع او توحيد المصدر

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

لانه سينظر في الإجرائات وليس التصريحات التي لا داعي ابدا لحفظها

وطبعا بالنسبة لمشروعك سالف الذكر فلن تجد الفائدة التي اقصدها بالشكل الذي اقصده

وهذا لانك تستخدم تصريحات قليلة والواحد منها يكفي لإجراء وظيفة مكتملة

اما بالنسبة للمشروعات المستقبلية التي تحتاج فيها استخدام اكثر من تصريح لتنفيذ وظيفة واحده

فبالتأكيد ستشعر بالفرق المذهل .. مثلا كا إلتقاط صورة من الشاشة او لظبط حجم صورة معينه مثلا

وايضا حين كتابة اجرائات تحتاج لحجز جزء من الذاكرة مثلا .. وقس على ذلك

جزاك الله خيراً، بدأت الفكرة تتوضح لدي، لكن كما قلت، في برنامجي هذا قد لا أحتاجه، ولكن ربما في البرامج القادمة ;)

اقتباس
ولكن بالطبع ليس للكل ولن يفهمك الجميع .. فقط سيفهم برنامجك من لديه إستعداد للفهم

فعلاً ! إنها قاعدة: لا يستطيع أحد أن يعلمك، أنت تعلم نفسك :)

اقتباس
والاهم من كل ما سبق ان تؤمن بما تعمل وتعطيه قدره المناسب .. ولا اكثر ولا اقل

بإذن الله تعالى...

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

هكذا سوف أزعل منك :cry:

أخبرني أكثر (If you please) :)

جزاك الله خيراً، أي تعليقات أخرى منك أو من الإخوة أنا في الانتظار، خصوصاً أني سوف أقوم بعرض البرنامج مع برنامجين آخرين (سترونهما بإذن الله) في معرض المعلوماتية في المدرسة، وأنا بحاجة إلى النقد :)

السلام عليكم ورحمة الله

هذه الجملة خاطئة  :wacko: 


مواضيع مشابهة