Visual Basic 6.0 translation

Monday, April 9, 2012

Visual Basic Online Course - File Handling

بسم الله الرحمن الرحيم

التعامل مع الملفات من خلال الفيجوال بيزك

معلومه
Bit 8 بت = 1 بايت أو حرف Byte\Character
عدد من البايت أو الحروف = 1 حقل أو متغير نصى Field\String
عدد من المتغيرات النصيه أو الحقول  = 1 سجل Record
عدد من السجلات  = 1 ملف File
عدد من الملفات = 1 قاعدة بيانات DataBase .
و فيما يتعلق بالفيجوال بيزك 6 فان هناك 3 طرق للتعامل مع الملفات و هى :
  • الطريقه النصيه أو التتابعيه Sequential Mode \ Text Mode
  • الطريقه العشوائيه للوصول Random Access Mode
  • الطريقة الثنائيه Binary Mode .
بالنسبه للطريقه النصيه (التتابعيه) فان البيانات Data تخزن و تسترجع على شكل حروف Characters.
أما بالنسبه للأرقام فإنها تخزن و تسترجع على شكل قيم من جدول Ascii .
مثال : عند محاولة تخزين و استرجاع الرقم 17 فانه يخزن و يسترجع على أساس قيمته من جدول Ascii وهو [55 49] .

بالنسيه للطريقه الثنائيه (Binary) فان البيانات Data تكتب و تسترجع على على شكل أرقام .
فالنسبه للرقم 17 فإنه يخزن بشكله و قيمته [17] و الحروف تخزن بقيمتها الرقميه من جدول Ascii .

يظهر فرق كبير بين الملفات النصيه التتابعيه Sequentials و الملفات الثنائيه Binary حيث الملفات التتابعيه و كما فى اسمها فانه يتم القراءه و الكتابه فى الملفات النصيه Text Files بطريقه Sequential أو تتابعيه أى أنه لا يمكن القراءه من "نقطه" معينه من ملف . و الريقه الوحيده لعمل ذلك هى أن تقرأ جميع البيانات حتى تصل الى "النقطه" التى تريد القراءه من بدايتها أو الكتابه من بدايتها .
و لعل أفضل مثال لفهم الملفات التتابعيه هو شريط الكاسيت Cassette Tape حيث انه اذا أردت سماع الشريط من المنتصف (نقطه معينه) فانه يجب عليك سماع الشريط حتى تصل الى المنتصف و بالمثل الـ CD و الـ DVD .
بينما الملفات الثنائيه Binary فانه يمكنك القراءه و الكتابه من أى مكان تريد فى الملف أى أنه يمكنك بداية القراءه أو الكتابه من\الى ملف بداية من النقطه الـ 54 بايت .
الملفات التتابعيه Sequential Files

لكى تفتح ملف بالطريقه التتابعيه فانك تكتب الكود التالى :
Open <FileName> For <Mode> As <#FileNo>
حيث :
FileName هو مسار الملف + اسمه + امتداده مثلا (C:\my_txt\txtfile.txt)
Mode و قد يكون InPut أو OutPut أو Append .
FileNo#  و هو الـ Handle للملف و هو أى رقم من 1 الى 255 يسبقه الرمز # "بمعنى : كما نعرف جيدا أو كما درست فان التعامل مع الكائنات فى بيئة الفيجوال بيزك يكون الـ  Hanlde هو اسم الكائن أو خاصية Name أما عند التعامل مع الويندوز من خلال الفيجوال بيزك فان الـ Handle هو رقم Long للكائن" و هذا ما يمثله FileNo# هو رقم الملف المفتوح كما يعرفه الويندوز" .
و جميع التعاملات مع الملف تتم من خلال الـ Handle .
و يتم فتح الملف التتابعى Sequential بـ 3 طريق كما ذكرنا و هى :
InPut : فتح الملف للقراءه منه.
OutPut : فتح الملف للكتابه فيه .
Append : فتح الملف للكتابه فيه.
اذا كان لدينا ملف باسم Contacts.txt مسجل به بيانات (الاسم) و (رقم الموبيل) مثلا فلكى نستطيع قراءة هذه البيانات فى الفيجوال بيزك :
Open "C:\Contacts.txt" For Input As #1
و بعد الانتهاء من القراءه أو الكتابه يجب اغلاق الملف بالأمر Close أو Close #FileNo حيث اذا لم نذكر FileNo# فان الامر ينطبق على جميع الملفات المفتوحه و لاحظ "اغلاق الملف Hanle Of File أو الـ FileNo# هو شىء ضرورى كى لا تخسر أى بيانات قمت بحفظها فى الملف عند التعامل مع مكتبة الـ IO .

و لنفترض أن ملف Contacts.txt يحتوى على البيانات التاليه :
"Ahmed" , 01002851540
"Mohammed" , 01220982833
"Alaa" , 01119282810
لكى نستطيع قراءة هذه البيانات من الملف Contacts.txt بالطريقه التتابعيه فانه سيتم من خلال قراءة كل سطر على حدى و تخزين السطر فى متغير نصى .. كالتالى :
Dim tmp As String
Open "C:\Contacts.txt" For Input As #1
Line Input #1, tmp
Close #1
MsgBox tmp
ستكون النتيجه فى الـ Message Box كالاتى :

"Ahmed" , 01002851540

حيث قام أمر Line Input بتخزين الملف حتى أول نقطة نهاية (نهاية السطر الأول) فى المتغير tmp .
اذا قمنا باضافة أمر Line Input اخر تحت الأمر الأول فى الكود السابق ستكون النتيجه كالاتى فى الـ Message Box :
"Mohammed" , 01220982833
و بالتالى اذا اردنا القراءة حتى ثانى نقطة نهاية فاننا نكتب الأمر مرتين و هكذا .

الأن سنكتب كود قراءة ملف نصى بالكامل و عرض النتيجه فى Message Box :


Dim Tmp,Contents As String


Open "C:\Contacts.txt" For Input As #1
While EOF(1) =0
Line Input #1, Tmp
Contents = Contents + vbCrLf + Tmp
Wend
Close #1
MsgBox Contents



و ستكون النتيجه عباره عن جميع محتويات الملف معروضه فى الـ Message Box حيث بين كل نقطة نهاية سطر (أو Enter من كايبورد فى الملف) يحدث بالمثل فى الـ Message Box عن طريق vbCrLf و التى تعنى سطر جديد فى عرض البيانات و التى تعمل عمل Enter .

و الداله ()Eof فى الفيجوال بيزك 6 تحدد ماذا كان المؤشر (فى هذه الحاله من داخل الملف النصى) قد وصل الى نهاية الملف أم لا و الصفر فى الداله eof = False و هو يساوى False عموما فى جميع التعاملات مع البيانات من نوع Boolean و (1) تعنى True فيمكنك كتابة أيهما .



لاحظ الاتى : الأمر Line Input لم يفرق بين البيانات النصيه String و هى الأسماء و البيانات الرقميه Intgers و هى أرقام التليفونات .
الان نتعرف على الكتابه فى ملف باستخدام Sequential Mode عن طريق الأمر Write بالخاصيه OutPut و Append .

النظام OutPut : يكتب فى الملف و اذا لم يكن الملف موجود يقوم بانشاه و اذا كان موجود يقوم بتحديثه و الكتابه على محتوياته و بالتالى حذف المحتويات القديمه .

النظام Append : يفعل كل ما يفعله النظام OutPut ماعدا أنه اذا كان الملف المراد الكتابه عليه موجود بالفعل فانه يمكنه (عن طريق المبرمج) اضافة المحتويات الجديده الى الملف فى نهاية الملف .

بعكس الأمر Line Input المستخدم فى قراة الملفات فان الكتابه نستخدم فيها أمران هما Write  و Print .. و يكون شكل الكود كالاتى :
Open "C:\Contacts.txt" For Output As #1
Print #1, "Ahmed Lives In Egypt", 20
Write #1, "Mohammed Lives In Syria", 23
Close #1
End
اذا قمت بتطبيق الكود السابق فانك ستفتح الملف Contacts.txt و لن تجد البيانات السابقه و لكنك ستجد سطرين جديدين هما :
"Ahmed lives in Egypt" , 20
Mohammed lives in Syria           23
استخدام Print : عند استخدام الأمر Print فان ما يحدث فى البرنامج هو بالضبط ما يحدث فى عند التعامل مع الملف مباشرة حيث لم يأخذ فى الاعتبار علامات "" و لا الـ , فقط النص و الأرقام .

استخدام الأمر Write : قام بكتابة العلامات و فرق بين الحقلين بـ علامة , و هو مثل أداء الامر Input فى القراءه و بالتالى اذا أردت قراة ملف بالضبط كما قمت بكتابته فانك تستخدم للكتابه Write و للقراة Input و يمكنك استخدام Print و لكن ستحتاج أكواد اضافيه .

و لكى تقوم بالكتابه فى سطر واحد فان الكود يكون كالتالى :
Write #1,100,"ABC, 1
اما اذا اردت الكتابه سطر بعد سطر فان الكود يكون كالتالى :
Write #1 , 122
Write #1, "ABC"
Write #1, 1
يقوم الأمر Print باضافة مافات Spaces الى النص تختلف بحجم النص نفسه و يصعب التكهن بعددها و كيفية حسابها بعكس Write الذى يفرق بين السجلات "النصوص و الارقام" و ايضا يمكن معرفة طول الملف بالتحديد .

الان نتعرف على الدوال المستخدمه للتعامل مع الملفات فى الفيجوال بيزك ضمن اطار دراسة طريقة Sequential Files أو القراءه التتابعيه .

1) دالة FreeFile : و ظيفتها هى حجز رقم Handle جديد فى الـ Memory للملف المفتوح بمعنى أنه يمكنك استبدال FileNum# بــ FreeFile فى الكود و هو من 1 الى 255 .
Open FileName For Input As FreeFile
و هذا يجنبك تكرار Handle الملف المفتوح فى الذاكره .

2) دالة EOF : وظيفتها تعود بقيمة Boolean تحدد ما اذا الملف المفتوح بالطريقه التتابعيه Sequential وصل لنهايته أم لا .
EOF(File Number) .

3) دالة FileLen : وظيفتها تعود بقيمة Long تساوى طول الملف المفتوح بوحدة قياس نوعها Bytes .
FileLen(Path To File)
و هى تستخدم لمعرفة طول ملف لم يتم فتحه بالأمر Open .

4) دالة LOF : وظيفتها تعود بقيمة Long تحدد طول الملف بوحدة قياس Bytes .
LOF(Path To File)
و هى تستخدم مثل الداله السابقه و لكن مع ملف تم بالفعل فتحة بالامر Open .

5) دالة Seek : وظيفتها تعود بقيمة نوعها Long بوجدة Bytes لملف مفتوح بالأمر Open لتحديد (القراءه\الكتابه) الحاليه لهذا الملف .
Seek(File Number)
تستخدم لمعرفة مكان (القراءه \ الكتابه) بالبايتس Bytes الذى عليه الدور .

أمثله عمليه على Sequential Files

1) معرفة عدد سطور ملف :
Dim counter As Long, tmp As String

counter = 0
Open "C:\Contacts.txt" For Input As #1
While Not EOF(1)
Line Input #1, tmp
counter = counter + 1
Wend
Close #1
MsgBox counter ' Outputs the Number of Lines in a File.
2) حذف سجل من ملف :
قم بانشاء ملف Contacts.txt به القيم التاليه :
"Sanchit", "Karve"

"ABCD", "PQRS"
"Steve", "Jackson"
"XYZ", "DEF"
 
Dim delFirstName As String ' String that contains Record to be Deleted

Dim fName As String, lName as String
delFirstName = "Sanchit"
Open "c:\Contacts.txt" For Input As #1
Open "c:\Contacts.tmp" For Output As #2
While Not EOF(1)

Input #1, fName, lName
If fName <> delFirstName Then
Write #2, fName, lName
End If
Wend
Close #1, #2
Kill ("c:\Contacts.txt") ' Deletes the Original File
Name "c:\Contacts.tmp" As "c:\Contacts.txt" ' Renames the New File


و الى هنا نكون قد انتهينا من الموضوع Sequential Files و انتظروا الجزء الثانى و الثالث Binary Files و Random Files .



كلمه أخيره : اذا كنت تريد حفظ معلومات ستعتمد عليها فى البرنامج كل مره تقوم بفتحه و هذه المعلومات عن برنامجك و هى معلومات ثابته (الطول - النوع - متكرره) أنصحك باحدى طريق التعامل مع الملفات .... أما اذا كانت المعلومات متغيره الطول و النوع و لا يعتمد عليها البرنامج كثيرا (مثل بيانات المستخدم - تسجل مره واحده فقط فى أول مره) فأنصحك باستخدام الـ Regitery .
evry1.net/VB6/

Friday, April 6, 2012

Visual Basic Online Course - Color Picker

بسم الله الرحمن الرحيم
شرح مثال Color Picker Source Code
لمن يرغب فى تعلم الدوال الموجوده فى الفيجوال بيزك VB 6.0 Built-In Functions 




بداية Color Picker هى أداة انتقاء اللون من على سطح أداه أو أى شىء معروض فى الويندوز , و الميزه هنا أننا سنقوم بدراسة و التعرف على دوال جديده حيث يعتبر هذا المثال دليل عملى عليها. و أيضا يعتبر هذا الدرس تطبيق جيد جدا لموضوع Graphics For Visual Basic 6.0 و الذى تم الانتهاء من جميع أجزاءه بالكامل .

سنبدأ بشكل الفورم و هى كما بالصورة التاليه :
Form Design

PictureBox - Label1 - Label2 - Label3 - Timer1
و الفكره كالتالى :
كلما تحرك مؤشر الماوس فى مكان ما فاننا سنعرف احداثيات هذا المكان فى (Label1 - Label2) و رقم لون المكان RGB فى (Label3) و اللون نفسه فى (PictureBox) عن طريق الـ Timer .

الأن الأكواد :

Visual Basic 6.0 Color Picker For Windows Project Code


الشـــــــــــــــــرح

الأكواد السابقه يمكنك Copy  و Paste على Form مباشرة بعد اضافة الأدوات المذكوره أعلاه .

الدوال المذكوره فى الـ Code :

1) الداله  GetCursorPos :
هى من دوال الـ VB 6.0 نوعها Windows Api Call Function أى أنها تربط بين بيئة الـ VB 6.0 و بيئة الـ Windows و وظيفتها قراءة مكان مؤشر الماوس و كلا من (X - Y) الموجودان فى نص الداله هما احداثيات للشاشة Monitor و ليس للـ Form و يتم تخزين قيمتهم فى متغيران يقوم الـ vb 6.0 بتمرير هذان المتغيران كـ LpPoint .
قيمة الداله تكون (0) - اذا حدث خطأ ما .... و تعود قيمة الداله (1) - اذا نجحت فى مهمتها .
معاملات الداله Parameters هى lpPoint - لاستقبال قيمتى (X - Y) للشاشة ....
و فى مثالنا هذا قمنا بعمل Type باسم PointApi يحتوى على كلا من X - Y ....
ثم قمنا بتخزين قيمة الـ PointApi فى المتغير PosXY تمهيدا للتعويض عنه
2) الداله GetPixel :
هى من دوال الـ VB 6.0 نوعها Windows Api Call Function أى أنها تربط بين بيئة الـ VB 6.0 و بيئة الـ Windows و وظيفتها أنها تعود بقيمة لون Pixel لـ Hdc لأى أداه مثل PictureBox .
معاملات الداله Parameters هى hDc و هو اختصار لـ Handle of Device Context و هو ببساطه Hanlde و الـ Handle هو رقم Integer مميز (نوعه Long فى بيئة ويندوز نوعها 32-Bit) و يستخدم الـ Handle للوصول الى Form أو شاشة تقارير و يمكنك استخدام hWnd لعمل ذلك - بالرجوع الى hDc ما هو Device Context ؟؟!
هو ما تتعامل معه بيئة تشغيل الويندوز من أدوات عرض System Display عن طريق تخصيص Context لكل Device أو تخصيص بيئه أو قرين لكل جهاز أو أداة عرض مثل الـ Printer و الـ Form و الـ PictureBox فى برنامجك أو مشروعك فى الـ VB 6.0 و يمكنك استخدام hDc للاشارة الى رقم مميز(قرينه) لأداة عرض معينه لكائن (لاحظ PictureBox مثلا هى كائن Object و فى نفس الوقت هى أداة عرض Display Device) و يعود hDc بقيمة تمرر الى تطبيقات الـ Windows - Windows Api Call -------- باللغه العربيه العاميه (خاصية الـ hDc لـ PictureBox باسم Pic1 على VB 6.0 Form هى الاسم المتعارف عليه عندما تريد أن تتحدث مع نظام التشغيل شخصيا أما اذا أردت التحدث مع الـ VB 6.0 يمكنك استخدام خاصية الـ Name للـ PictureBox و التى ستكون Pic1) ..... تمام ؟!
ايضا الـ hDc تتغير أثناء عمل البرنامج لذا لا تخزنها فى متغير (من علامات المبرمج الفاهم) و لكن قم باستدعائها كل مره تحتاج اليها .
ايضا عند تثبيت أو وضع قيمة AutoDraw = True فان الـ hDc تتغير مباشرة و تتحول الى Handle ولكن للـ Presistent Graphics الى تصبح الـ hDc خاصية للصورة نفسها و العكس غير صحيح فان تغيير قيمة AutoDraw الى False لا يترتب عليه عدم تغيير قيمة hDc أثناء عمل البرنامج  .
فى شاشة الخصائص : اذا جعلت قيمة HasDc = False فان الويندوز يقوم بتعيين قيمة للـ hDc جديده فى كل مره تتغير عن طلب hDc للأداه أو الـ Device أى أنه لن تتمكن من التعامل مع hDc لهذا الجهاز من خلال برنامجك .
و وجود هذه الخاصيه فى الداله GetPixel ضرورى لأن GetPixel من دوال الويندوز Windows Api Call Function و لأن الماوس Mouse من أجهزة Device الويندوز فان المترتب عليه Pixel يجب أن يعرفه الويندوز و لكى تتحدث مع الويندوز يجب عليك تستخدم hDc مع الاداه التى تريد أن تحدث الويندوز Windows عنها !
المعاملان X - Y هما احداثيات الشاشة Monitor .
و فى المثال المرفوع عن دالة GetPixel Function فان الداله تنجح فى معرفة لون الـ Pixel التى يقف عليه المؤشر و لكن داخل الـ PictureBox فقط ...
الأن نحن نعرف احداثيات الـ Mouse اينما ذهب على الشاشة Monitor عن طريق دالة GetCursorPos و ايضا لون الـ Pixel فى نفس الاحداثيات عن طريق الدالة GetPixel ..... و لكن نحن نريد معرفة لون الـ Pixel فى احداثيات الشاشة كلها و ليس داخل Device أو PictureBox مثلا , لذا سنقوم بعمل منطقه Device Context افتراضى سنقوم بجعل قيمته تساوى أو تلازم أو تقترن بقيمة الشاشة Display Device بالكامل و ذلك باستخدام الداله CreateDc و الداله DeleteDc ....

3) الداله CreateDC :
هى من دوال الـ VB 6.0 نوعها Windows Api Call Function أى أنها تربط بين بيئة الـ VB 6.0 و بيئة الـ Windows و وظيفتها كما ذكرنا سابقا هو عمل Device Context أو DC و هنا فى هذا المثال سيكون لاداة العرض الـ Monitor أو الشاشة Display و Display هو اسم الشاشة الذى يعرفه الـويندوز Windows NT .
معاملات الداله Parameters و هى lpDriverName و هو متغير نصى يترك قيمته Null الا فى حالة التعامل مع الشاشة Monitor نكتب اسمها Display و ايضا فى حالة التعامل مع الطابعه Printer نكتب WinSpool .... معامل lpDeviceName و هو اسم الـ Device و سيترك فارغ vbNullString .... معامل lpOutPut و هو متغير محجوز القيمة و القيمة المحجوزه له هى vbNullString .... معامل lpInitData مجموعه من المعلومات حول الـ Device المراد تشغيله و فى مثالنا هذا تكون (&0) و يمكن ايضا vbNullString .


و فى مثالنا قمنا أولا بعمل دالة (ليست ضمن دوال Windows Api) و لكنها (User-Defined) أى أننا نحن من انشأناها و هى الداله GetPixelColor  حيث قمنا بتعريف متغير DC نوعه Long سيستخدم فى تخزين قيمة الداله CreateDC ثم قمنا بعمل CreateDC للشاشة أو Display Device المراد تعيين قيمة Context له و خزناها بالفعل فى المتغير DC .
الان المتغير DC يرمز الى الشاشة ...
لذا قمنا بكتابة الدالة GetPixel و عوضنا هنا عن الـ hDc بـ DC الذى هو الأن Handle To Device Context أو المراد معرفة الـ Pixel عليه .
ملحوظه : فى الشرح ستجد رمز مثل (;amp&) قم بحذف الى (;amp) كلها.
 4) الداله DeleteDC :
هى من دوال الـ VB 6.0 نوعها Windows Api Call Function أى و تستخدم مع الداله CreateDC حيث تقوم بحذف الـ Device Context الذى تم انشاءة من قبل الداله السابقه .
و معاملها الوحيد هو الـ HDC
و يجب على البرنامج فى كل مره ينشأ DC أن يقوم بحذفه و ذلك حفاظا على الموارد من الميمورى أو حتى لا يتم تحميل الذاكره بأكبر من طاقتها .
و هذه الداله لا تستخدم الا مع الداله CreateDC فهى لا تستخدم مع GetDC بل نستخدم ReleaseDC .

5) الداله  LongToRGB:
ليست من دوال الفيجوال بيزك و نوعها User-Defined أى أنه تم تصميمها عن طريق مبرمج .
و هى داله نصيه أى انها تعود بقيمه String و لها معامل واحد هو Icolor نوعه Long .
و وظيفة هذه الداله هو تحويل القيم Long لكل من الثلاث ألون الرئيسيه Red - Green - Blue الى قيمة ألوان يستطيع الفيجوال بيزك التعرف عليها بسهوله .... لماذا ؟!!
- الاجابة ببساطه أن ألوان الفيجوال بيزك 6 قيمتها أو مترجمه الى Long Integer و هى أصلا Hex و ألوان الويندوز قيمتها sRGB .
و نحن نريد عرض قيمة RGB لأى لون يقع عليه مؤشر الماوس بالشكل التالى :
RGB (000, 000 , 000)
أو
RGB (iRed, iGreen, iBlue)
و كل خانه من الثلاث خانات تمثل أحد الألوان الثلاثه الرئيسيه التى يتكون منها لون RGB و فكرة الـ RGB لمن لا يعرف تنصب فى أن جميع الألوان يمكن انتاجها من خلط الثلاث ألوان (الاحمر - و الاخضر - والأزرق) بنسب متباينه فعلى سبيل المثال اللون (اللبنى Cyan) كود الـ HEX الخاص به هو 00FFFF # او كود الـ RGB الخاص به هو 255 255 000 و كود الـ HEX الخاص بالفيجوال بيزك هو HFFFF00& بدون مسافات أى ان فى الفيجوال بيزك 6 فقط تم وضع علامة H& قبل كود الـ HEX و الثلاث قيم السابقه تمثل اللون Cyan أو اللبنى  ... و لاحظ :
كود ألوان الفيجوال بيزك الموجود بالخواص مكتوب بالعكس أى أنه مكتوب بصيغة BBGGRR
نعود للمثال .
الأن و مما سبق سنحتاج الى عكس صيغة كود الفيجوال بيزك الممثل للون و سنبدأ ب RED

و لأن قيمة الـ iRed محصورة بين 0 و 255 أى 256 رقم فان اللون iRed أو الرقم Long الممثل فى iRed سيكون باقى قسمة Icolor على 256 فمثلا اذا كان (192) سيكون iRed = 192 Mod 256 أى أن iRed = 192 .... هذا ما يسمى بالهندسه العكسيه .... و سأضرب مثال بسيط جدا لفهم هذا الأمر :

نفرض أن قيم من 0 الى 9 (10 قيم) بدلا من 0 الى 255 (256 قيمه) . كيف تقدم أو تعطى قيمه وحيده بحيث يمكنك ايجاد عكس تركيبتها و بنفس القيمه النهائيه ؟!
لا يمكنك ببساطه وضع القيم بجانب بعضها (8 + 3 + 1 = 12) لأن فى هذه الحاله سيكون من المستحيل ارجاع الـ 12 الى (8 + 3 + 1) .
و لكن يمكنك ارجاع القيم الى أصلها . و الأصل هنا يعتمد كليا على المدى و بالنسبه لمثالنا المبسط فالأصل هو 10 لأن هناك 10 قيم تبدا من 0 . حيث الأحمر هو 0 و الأخضر هو 1 و الأزرق هو 2.
القاعده
 [Value*(Base ^ Position)]
الأحمر (8) = ( 8 * 10^0) = 8
الأخضر (3) = ( 3 * 10 ^1) = 30
الأزرق (1) = ( 1 * 10^2) = 100
اذا 8 + 30 + 100 = 138 و الـ 138 يمكن اعادتها الى أصل مكوناتها مره أخرى (ممكن فقط بالنظر اليها) و لكن باستخدام العمليات الرياضيه يتم كالاتى :
القاعده
[CombinedVal / (Base^Position)] Mod Base = OriginalVal
1) 138 / (10^0) Mod 10 = 8 (Red)
2) 138 / (10^1) Mod 10 = 13 (Green)
3) 138 / (10^2) Mod 10 = 1 (Blue)

و هذا ما تفعله الداله ارجاع القيم الى أصلها .
لنأخذ مثال عملى : لدينا لون خلفية TextBox فى فيجوال بيزك 6 فى أى برنامج كمثال لونه أصفر و كوده HEX هو

و وضعنا Command1 على الفورم و كتبنا
MsgBox Clng(Text1.BackColor)
ستكون النتيجه 65535 و هى القيمه Long لكود الـ Hex و اذا وضعنا TextBox أخرى و كتبنا فى الـ Command1 :
Text2.BackColor = Clng(Text1.BackColor)
سنجد أنها فعلا بالمثل .
و الأن لنحول هذا القيمه الـ Long الى RGB كما فى المثال المبسط أعلاه :
الاحمر = 65535 Mod الـ 256 = 255
الاخضر = (65535 \ 256) Mod الـ 256 = 0
الأزرق = (65535 \ 65535) = 1
اذا كود الـ RGB هو 001 000 255 ..... يمكنك الـتأكد من الفوتوشوب اذا أردت !
و فى النهايه نضع شكل العرض كما نريده كالتالى Red : RRR Green : GGG Blue : BBB :

6) الداله  GetPixelColor :
و هى User-Defined
وظيفتها الرجوع بلون الـ Pixel .
المعاملات (x - y) مكان الـ Pixel و (HexCode) اختيارى نوعه Boolean حيث أن اللون سيعود HEX .
و فى هذه الداله يتم تعيين الشاشة Monitor كأجاة عرض افتراضيه فى البرنامج من خلال CreateDC و الداله CreateDC تعود بقيمه Long يتم تخزينها فى المتغير DC As Long .... تذكر فى الداله السابقه نريد معرفة الـ RGB للـ المتغير Icolor نوعه Long و بالتالى نريد Long يمثل لون الـ Pixel و هو ما تعود به الداله و المتمثل فى الـ DC .
ثم بعد الانتهاء من استخدام الـ DC نقوم بحذفه DeleteDC .

الحدث Form_Load : نقوم بتشغيل الـ Timer حيث المده = 1
الحدث Form_Resize : نقوم بتثبيت مكان الـ Labels أسفل الـ Form
الحدث Timer1_Timer : نقوم بتحميل الدوال الى الأدوات بحيث :
الداله GetCursorPos لمعرفة مكان مؤشر الماوس و تخزين المكان فى المتغير PosXY
Label1 : المكان x
Label2 : المكان y
Label3 : لون المكان Pixel الموجود عليه المؤشر
و بهذا نكون قد انتهينا بمشيئة الله و توفيقه .... أى سؤال ؟!
رابط المشروع MediaFire.Com



Tuesday, April 3, 2012

Visual Basic Online Course - Enum

بسم الله الرحمن الرحيم

و Enum هى اختصار لـ Enumeration أو اللوائح أو القوائم و يتم كتابة كود الـ Enum فى موديول Module أو General Declaration كالتالى :
Enum MyEnum
-
-
-
-
End Enum
أو
Public Enum MyEnum
-
-
-
End Enum
باستخدام Access Modifiers أو بدون .

- يقدم الفيجوال بيزك 6 قوائم جاهزة مثل vbDayOfWeek و يمثل أسماء أيام الأسبوع و يمكنك تجربة ذلك فى مشروع جديد فى الفورم Form_Load اكتب vbDayOfWeek ثم (.) ستجد قائمة بها اسماء أيام الأسبوع .

- اذا يستخدم الـ Enum فى عمل قائمة عرض بثوابت أسميه و ثوابت اسميه مثل أسماء أيام الأسبوع و نوعها String و يمكنك عمل Enum لثوابت Long و Integer و أى نوع من أنواع البيانات DataType .

- و فى الـ Enum يتم ترتيب الثوابت بحسب ترتيب كتابتها فى الكود حيث اذا اردت عرض أسماء ايام الأسبوع بالترتيب فى برنامجك فيجب عليك عمل كود الـ Enum بالترتيب الذى تود العرض به .... كالتالى :





- يعامل الفيجوال بيزك جميع عناصر الـ Enum على أنها Long Integer و اذا قمت بتخصيص علامع عشريه لثابت من ثوابت الـ Enum فان الفيجوال بيزك يقوم بتقريبها الى أقرب رقم صحيح .

- و لتفادى رسالة الخطأ Reference Ambiguous Name يمكنك كتابة رقم الثابت الاسمى Constant كما فى المثال السابق .

- ثم يمكنك تخزين قيمة الثوابت فى متغيرات لاستخدامها فى البرنامج كالتالى :



مصادر :

مع تحياتى Evry1falls


Monday, April 2, 2012

Visual Basic Online Course - Excel 2003 Part 7

بسم الله الرحمن الرحيم


فى الدرس السابق تعرفنا على موضوعات هامه فى مجال التعامل مع الـ Excel.
درس اليوم ان شاء الله تعالى يتناول مشروع عملى شامل أغلب النقاط التى تواجه مبرمج فى التعامل مع الـ Excel .

الجـــــــــزء السابع - مشروع عملى  

رابط المشروع MediaFire.com


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



Visual Basic Online Course

vb6 (63) Application Development (45) Visual Basic Online Course (45) Online Visual Basic Course (44) Visual Basic Help (44) Visual Basic Programming (42) IT Jobs (39) VB6 developer (38) Visual Basic Course (38) Visual Basic 6.0 (26) Microsoft Visual Basic 6.0 (25) VB6.0 (24) Visual Basic Programmers (24) vb 6.0 (24) visual basic programming tutorial (19) Third lesson (16) Source code download for Visual Basic 6.0 (14) Source code for Visual Basic 6.0 (10) visual basic tutorial (9) Visual Basic 6 (5) Visual Basic Courses (5) Lesson 3 (4) VB 0.6 - TreeView control (4) VB 0.6 With TreeView Control (4) VB6 Course (3) Create ActiveX (2) How to automate MS-Access from Visual Basic 6.0 (2) Add controls at runtime (1) Back up your Database (1) Change ActiveX icon (1) Change screen resolution (1) Create FTP (1) Crystal Reports 4.6 (1) Crystl32.ocx could not be loaded (1) DataGrid Columns re-size (1) Date Calculation (1) DateAdd Function (1) DateDiff function (1) FTP (1) Marquee Title Bar (1) Marquee VB 6.0 TitleBar (1) Method 'Action' of object 'CrystalCtrl' Failed (1) Microsoft Access with Visual Basic 6.0 (1) OpenSchema method (1) Save File Using CommonDilog (1) Track Database path (1) VB 0.6 - Registry (1) VB 0.6 With Registry Editor (1) VB 6.0 Access (1) VB 6.0 OOP (1) VB6 Access2003 ADO Like % (1) VB6 Add Date (1) VB6 Add Time (1) VB6 Date calculation (1) VB6 Subtract Date (1) Visual Basic Remote (1) Win7 (1) Windows7 (1) ms access networking details (1) remote Visual Basic DB (1) rounded and transparent forms (1) vb 0.6 style (1) vb 6.0 Remote Database (1)