التعامل مع الحافظة ClipBoard

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

الحافظة في البداية هي  مساحة في الذاكرة , يتم حجزها لوضع البيانات المؤقتة للتطبيقات التي تعمل في الوقت الحالي . وهذه البيانات مثل الكلمات التي تم نسخها من خلال أمر “نسخ” في أي محرر نصوص , أو الصورة التي تلتقطها عندما تضغط زر PrintScreen , فهذه كلها يتم تخزينها غالباً في ذاكرة الجهاز .

يمكنك أن ترى ما تحتويه الحافظة من خلال الخطوات التالية :

  1. الآن , اذهب إلى Start ثم Run
  2. اكتب “clipbrd” بدون علامات اقتباس
  3. ستظهر نافذة الحافظة ClipBoard , وسترى فيها آخر ما قمت بنسخه
  4. قم مثلاً بضغط زر PrintScreen ولاحظ ما يحدث

الحافظة في دلفي .

منطقياً .. لاستعمال الحافظة في دلفي يجب علينا أن نعرفها للبرنامج بإضافة الوحدة Clipbrd

الآن , اكتب كلمة ClipBoard ثم ضع بعدها نقطة , ستظهر لك الآن قائمة بخصائص الكائن Clipboard .

التعامل مع الحافظة :

الخاصية التي تحتوي على محتويات الحافظة هي AsText , فمثلاً لنقل محتويات مربع نص إلى مربع آخر :

Clipboard.AsText := Edit1.Text ;

Edit2.Text := Clipboard.AsText ;

ملاحظة : هذه التدوينة مسودة منذ أكثر من 3 سنوات (منذ 2008 :D)

Syntax Error in FROM clause with Access 2010

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

كل عام وانتم بخير ..

بعد عناء طويل أنهيت تحميل ملف من الانترنت , حجمه 7 جيجا بايت . المشكلة أنني فوجئت أن الملف لا يعمل , ويظهر رسالة خطأ غربية تقول ان هناك خطأ في الملف (لكن أين ؟!!!)

حاولت بجميع الطرق الممكنة , لعدة ساعات ولكن دون جدوى .

اكتشفت لاحقاً .. ان اسم المجلد الذي يحتوي على هذا الملف يحوي حرفاً روسياً ! قمت بإعادة تسمية المجلد , والحمد لله عمل بنجاح !

قبل عدة أيام .. كنت اعمل على مشروع قاعدة بيانات , وكان من الأيسر لي تسمية اسماء الجداول بأرقام مع الرمز /

قمت بربط البرنامج بقاعدة البيانات بطريقة صحيحة , ومجربة في برامجي الأخرى , ولكن دائماً ما كانت تظهر رسالة Syntax Error in FROM clause

اعتقدت في البداية أن المشكلة في طريقة الربط , لأنها المرة الأولى التي استعمل فيها Access 2010 , وبعد عدة محاولات تركت العمل على هذا البرنامج

(في الربط مع Access 2003 كنت أستعمل Jet 4.0 OLE DB –في خاصية ConnectionString لأداة ADOTable- , لكن اتضح انه مع Access 2010 اللاحقة accdb- يجب استعمال Office 12.0 Access Database Engine OLE DB)

قبل قليل والحمد لله .. اكتشفت ان الخطأ في المشروع كان في قاعدة البيانات نفسها .. وبالأخص في الرمز / , بمجرد إزالته (وتأكيد اسم الجدول الجديد في ADOTable في برنامجي) عمل بنجاح

الغريب أن Access سمح بوجود هذا الرمز في الجدول , و أداة  ADOTable يظهر اسم الجدول (مع وجود الرمز /) في خاصية Table . هذا هو السبب الذي جعلني أتأخر في تحديد الخطأ وأدى لتعطل مشروعي وإضاعة وقت في تأليف حلول إبداعية 🙂

أردت التنويه لهذه المشكلة , فقد تخفى بعض المبرمجين (خاصة عند العمل لوقت متأخر 😉

0x00000116: VIDEO_TDR_ERROR Solution

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

 Hi all ..

I have encountered a very annoying BSOD (Blue Screen of Death) every time I play StarCraft II (or few other game) , with my Acer Aspire 5750G .

I was surprised when I knew that was because of my video card , since I was sure my laptop is still new ,my video card is not that bad and I could play StarCraft II on Ultra settings before , for a while .

The true cause of this trouble is Overheat , there are few reasons for this :

1. You are using the laptop on the wrong surface , like a Bed or a Carpet . Try using the laptop on a Desk or a Table .
2. Room temperature is very hot , or the laptop’s fan is closed (or filled) for some reason (Dust in most cases) .
3. Working on the laptop for too many hours  .
The main solution for this problem is a cool CoolingPad for the laptop (or a fan at the side of the PC to cool the inner parts) . But what if you don’t have (or can not afford) a CoolingPad right now ?
I have been trying few things , they helped much , and the number of BSOD’s has reduced .

Lower graphics settings : Instead of Ultra or High settings , try using Medium or Low . In some games , it will recommend a specific graphic level for your machine .

Use the laptop for less hours , on good surface and in good temperature . I am sure you tried all of those , and even when I did , it didn’t help , those are just basic solutions .

nVidia Control Panel (Custom) :

– In the control panel (in my case , I have nVidia graphic card) choose “NVidia Control Panel” , or right-click on your desktop and choose “nVidia Control Panel” .
– From the tree at the left side of nVidia control Panel , choose Manage 3D settings .
– Choose “Program Settings” tab .
– From the list , select the game (or the program) that cause the Overheat and the BSOD to appear . (or click add if it is not in the list)
– From the second list , select another graphic card to run the game , try them all until you find one that works . (many laptops support more than 1 graphic card)
Please note : some games have some problems with some graphic cards ! if that’s so , go to the second solution .

nVidia Control Panel (General) :

I began with the custom solution , since this one will affect all the games and programs on your machine .

– From the same nVidia Control Panel , and from the tree on the left , select “Adjust image settings with preview” .
– Select “Use my preference emphasizing” from the 3 options in the “Adjust image settings with preview” page .
– Move the slide bar under the 3rd option to the left , near the word “Performance” .

Those 2 solution may not work in few cases , since some games don’t run correctly with some graphic cards . But I have tried all of them , and the number of BSOD’s has reduced . give it a try it worth it 🙂

And still , the most efficient solution is to buy a CoolingPad , I am planning to buy one soon , and I hope it works permanently (heared Zalman NC2000 is perfect , I hope to find it in Egypt :))

مقدمة إلى المصفوفات في دلفي

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

المصفوفات Arrays , تعتبر من أهم بنى البيانات (Data structures) , و تعتبر أيضاً البنية الأساسية لبقية بنى البيانات (مثل Stack و Queue ..) .

والمصفوفة هي مجموعة من العناصر (البيانات أو المتغيرات) من نفس النوع (مصفوفة متغيرات integer , مصفوفة متغيرات char ..) .

أنواع المصفوفات في دلفي :

هناك نوعان أساسيان من المصفوفات في دلفي :

1- مصفوفات ساكنة Static arrays : وهي التي يكون عددها معروفاً ومحدداً عند تصميم البرنامج أو كتابته , وهذا النوع من المصفوفات لا يمكن تغيير عدد عناصره أثناء تنفيذ البرنامج .

مثلاً مصفوفة تحتوي على درجات 5 طلاب , فهي من النوع الساكن لأن عناصرها محددة مسبقاً ومعروفة .

ويمكن تعريف المصفوفة الساكنة على الشكل التالي :

var ArrayName : array [ElementsNumber] of DataType ;

فمثلاً المصفوفة التالية :

var Marks : array [0..4] of integer

هي مصفوفة اسمها Marks , وعدد عناصرها 5 (من 0 إلى 4) , وعناصرها من النوع الرقمي Integer .

وبعد تعريف المصفوفة , يمكن تعيين قيم عناصرها بالترتيب أو على نحو منفصل

فيمكن مثلاً تعيين درجات الطلاب بالكود التالي :

var i : integer ;
begin
for i := 0 to 4 do
Marks[i] := i ;

في السطر الأول بدأنا حلقة for..do والتي تبدأ من 0 إلى 4 وقيمتها تكون في المتغير i .

في السطر الثاني نعين قيمة الدورة (i) إلى العنصر ذو الترتيب i من المصفوفة Marks .

هنا سيحصل كل عنصر على قيمة = ترتيبه في المصفوفة , فالعنصر الأول (ترتيبه 0) يحصل على القيمة 0 , والعنصر الثاني (ترتيبه 1) يحصل على القيمة 1 وهكذا ..

ملاحظة : يفضل استعمال الدالتين Low و High لتعيين رقم بداية ونهاية حلقة for..do عند التعامل مع المصفوفات , فيصبح الكود :

for i := Low(Marks) to High(Marks) do

حيث تقوم الدالة Low بإرجاع أدنى ترتيب داخل لمصفوفة الممررة إليها , وترجع الدالة High أقصى ترتيب داخل لمصفوفة الممررة إليها .

ومن خلال الكود التالي , يمكن عرض عناصر المصفوفة (في تطبيق Console) :

for i := Low(Marks) to High(Marks) do
WriteLn(Marks[i]) ;
ReadLn ;

من خلال حلقة for..do السابقة , سيتم عرض عناصر المصفوفة بالترتيب في نافذة Console .

يمكن أيضا تعيين قيم عناصر المصفوفة بشكل منفصل على النحو التالي :

Marks[0] := 0 ;
Marks[1] := 1 ;
Marks[2] := 2 ;
...

لكن يلاحظ على هذه الطريقة أنها طويلة (في المصفوفات التي تزيد عناصرها عن 100 عنصر مثلاً) , وأنها متعبة وتستغرق وقتاً طويلاً .

ويصبح الكود النهائي لتطبيق المصفوفات الساكنة :

var
Marks : array[0..4] of integer ;
i : integer ;
begin
try
for i := Low(Marks) to High(Marks) do
Marks[i] := i ;
for i := Low(Marks) to High(Marks) do
WriteLn(Marks[i]) ;
ReadLn ;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.

———————————————-

2- المصفوفات الديناميكة Dynamic Arrays : وهي المصفوفات التي يكون عدد عناصرها مجهولاً عند تصميم أو كتابة البرنامج , ويمكن تعيين عدد عناصرها أثناء تنفيذ البرنامج .

فمثلاً مصفوفة مخصصة لتخزين درجات الطلاب , لكن عدد الطلاب مجهول عند كتابة البرنامج (بالنسبة للمبرمج) , ولكنه معروف للمستخدم عندها يجب استخدام مصفوفة ديناميكية لتمكين المستخدم من تعيين عناصرها أثناء استخدامه للبرنامج .

وتعريف المصفوفة الديناميكية مشابه لتعريف المصفوفة الساكنة , باستثناء تعيين عدد العناصر (لأنه مجهول أصلاً !!) , ويكون على الشكل التالي :

var Marks : array of integer ;

ويمكن تعيين عناصرها من خلال دالة SetLength على النحو التالي :

SetLength(Array, NewLength) ;

فمن خلال الأمر التالي (في تطبيق Console) يمكن تعيين عناصر المصفوفة الديناميكية Marks من خلال إدخال المستخدم :

var
L: Integer ;
begin
ReadLn(L) ;
SetLength(Marks, L) ;

ويمكن تعيين عناصر المصفوفة أيضاً من خلال حلقة (for..do مثلاً) أو بطريقة مفصلة

فيصبح الكود النهائي لتطبيق المصفوفات الديناميكية على الشكل التالي :

var
Marks : array of integer ;
i, L : integer ;
begin
try
WriteLn('Insert the new length :') ;
ReadLn(L) ;
SetLength(Marks, L) ;
for i := Low(Marks) to High(Marks) do
Marks[i] := i ;
for i := Low(Marks) to High(Marks) do
WriteLn(Marks[i]) ;
ReadLn ;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.

ملاحظة : يبدأ ترتيب المصفوفة الديناميكية من الصفر .

الأمثلة :

يمكنك تحميل المثالين المشروحين في هذا الدرس من خلال الرابط التالي :

http://www.4shared.com/file/118918028/dfed408d/Arrays_lesson.html

خوارزمية لحل حسبة برما

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

مقدمة …

من ويكيبيديا، الموسوعة الحرة

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

وفي كثير من الأحيان كانت تذكر هذه المقولة أمامي “انت هتعمل زي حسبة برما !!” 😛 , فلا أعرف ما هي هذه الحسبة ولا ما المقصود بها .

لكنني تذكرتها قبل فترة , وقمت اليوم بتصميم خوارزمية بسيطة جدا لحلها.

الخوارزمية :

Repeat
X = X + 1
Until (X mod 2=1) and (X mod 3=1) and (X mod 4=1) and (X mod 5=1) and (X mod 6=1) and (X mod 7=0)
Print X
End

وعلى الرابط التالي هناك تطبيق بدلفي 2009 يقوم بحل هذه الخوارزمية :

http://www.4shared.com/file/92644583/228a43a4/__online.html

كيف تنشئ خلفيات احترافية , بشكل أي صورة تريدها

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

——————

والله من زمان لم أضع تدوينات عن الدلفي … وعمال اقول ناقصني شيء 😛

اليوم سأعرض في هذه التدوينة , طريقة سهلة وبسييييييطة جدا حتى تقوم بعمل واجهة احترافية “بشكل أي صورة تريدها”

لكن .. ماذا اقصد بـ”بشكل أي صورة تريدها” ؟

حسناً .. هل شاهدت أي برامج واجهتها على شكل دائرة , أو على شكل مشغل MP3 ..الخ

(المهم ان واجهتها ليست الواجهة المستطيلة التقليدية)

وفكرت كيف أقوم بعملها ؟

أنا فكرت 😛 .. أيام الـVB , والرد كان هنا :

http://www.arabteam2000-forum.com/index.php?showtopic=127953&hl=%C7%E1%D5%E6%D1%C9

ولمن ليس لديهم Visual Basic 6 … فإن الكود كان حوالي 63 سطر (انا تركت بعض الأسطر كتعريف الإجراءات وإغلاقها)

لكن في دلفي … الأمر مختلف تماماً , تابع معي لتقوم بعمل برنامج افضل من المثال السابق , وطبعا بدون حرف كود واحد

——————

خطوات العمل :

1- عليك ان تحضر صورة (أي صورة , المهم تكون ذات خلفية بيضاء , والشكل الذي سيكون عليه الفورم غير مربع ,,, دائري مثلاً) . ويمكن الاستعانة بالصورة التالية :

baddrawing

2- الآن نفتح الصورة بالرسام (لأنه بسيط) ونجعل الخلفية باللون الأزرق (ويجب أن تكون قيمه : R=0 / G=0 / B=255 .. أي الأزرق النقي) . ويجب ان يكون لون الخلفية واااااحد + مختلف تماماً عن بقية ألوان الصورة + يكون لون معروف قيمه وليس لون من اختراعك , وذلك حتى يتعرف الدلفي عليه .

ستصبح الصورة بهذا الشكل :

bluebaddrawing

3- نشغل الدلفي الآن .. ونبدأ مشروعاً جديداً من النوع VCL Application .

4- نجعل خاصية BorderStyle للنموذج = bsNone .. أي بدون إطار .

5- من التبويب Additional نضيف الأداة Image إلى النموذج .

6- نعدل الخاصية Top لأداة Image إلى 0 , وخاصية Left إلى 0 أيضاً , وخاصية AutoSize إلى True (الخاصية الأخيرة تجعل أداة Image تتمدد لتأخذ نفس حجم الصورة)

7- من خاصية Picture لأداة Image نضغط على زر (…) الخاص بها , ونختار Load… ونحدد الصورة الجديدة ذات الخلفية الزرقاء (وهي صورة BlueBadDrawing)

8- تلاحظ تمدد أداة Image , لذا سنعدل حجم النموذج إلى 344 للخاصية Height , و 484 للخاصية Width .

9- شغل البرنامج .. ولاحظ اننا لم نقم بعمل التعديلات الرئيسية الآن , لذا ستظهر الخلفية الزرقاء .

10- الأن .. التعديل الأول : قم بتغيير الخاصية TransparentColor للنموذج إلى True .

11- ……… التعديل الثاني: قم بتغيير الخاصية TransparentColorValue إلى clBlue (وهي قيمة الأزرق النقي R=0 / G=0 / B=255)

12- قم الآن بتشغيل البرنامج ..

ألف مبروووووووووووووووووووووووووك , لقد حصلت على نموذج بشكل مميز , وبدون سطر شيفرة واحد .

ملحوظة مهمة جدا جدا جدا :

يجب أن تكون الخلفية نقية (ليست فيها التشوهات التي في صور JPG) , جرب رسم صورة أخرى بصيغة BMP فهذا يعطيك أفضل أداء في دلفي .

كما ان الصورة عندما وضعتها كـJPG لم تعمل في دلفي .

——————

أفكار لم أجربها 😛

– جرب تغيير لون الدائرة الصفراء الصغيرة إلى الأزرق … ولاحظ النتيجة عند تشغيل البرنامج بالصورة المعدلة .

– جرب وضع زر على النموذج يغير صورة أداة Image إلى صور مختلفة أثناء التشغيل .

– قم بتصميم صورك الخاصة لحيوانات , جماجم , طبيعة ..الخ , وجربها .


البرمجة غرضية التوجه في دلفي

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

—————-

مقدمة …

اليوم ان شاء الله تعالى سوف أقوم بشرح وتطبيق المفاهيم الأساسية للبرمجة الكائنية في دلفي , وسأحاول عم تطبيق بسيط فيه بعض مزايا هذه التقنية التي اصبحت من اهم ما يجب على المبرمج معرفته , خصوصاً لو كان مبرمج للغة رائعة مثل دلفي …

—————-

مقدمة إلى OOP …

OOP وتعني Object Oriented Programming (أي البرمجة المسيرة بالكائنات) , وهي مختلفة عن النوع الآخر من البرمجة والذي يسمى بالبرمجة الإجرائية

ما هذه المقدمة المعقدة يا علاء ؟!

1- البرمجة الإجرائية :

عندما تريد عمل برنامج بلغة فجوال بيزك 6 مثلا , فانك تستخدم الدوال والإجراءات , وتناديها عند الحاجة لأداء عملية معينة

2- البرمجة الكائنية :

هنا انت تستخدم الكائنات , وتنادي على الوظائف الخاصة بهذه الكائنات للقيام بالعمليات التي تريدها .

والجزء الأساسي في البرمجة الكائنية هو الوحدة Class والتي تمثل الكائن … لنأخذ المثال التالي :

– نفرض ان لدينا كائن (أو وحدة) اسمه إنسان .

– وهذا الكائن لديه خصائص , مثل الطول والاسم والعمل ..الخ .

– ولديه وظائف وطرق يمكنه تأديتها , مثل الأكل والشرب والنوم ..الخ .

وحتى تنفذ عملية معينة موجود في هذا الكائن عليك النداء عليها من خلال هذا الكائن , كقولك في الحياة اليومية :

“أرجو أن تسقني كوب ماء يا محمد” .. هنا الكائن هو محمد , والوظيفة المستخدمة هي طلب الشرب .

هذا بصورة عامة وسريعة , ولتوضيح الصورة في الذهن أكثر

—————-

المفهوم الأول : الوراثة …

في الحياة اليومية , عندما يتوفى احدهم ويترك مالاً مثلاً .. فان هذا المال كان من خصائصة (Man.Money := 50000) وأورثها إلى كائن آخر … هذا تقريبا هو مفهوم الوراثة في البرمجة الكائنية , أي ان يعطي الكائن الأب (Parent) خصائصه ووظائفه إلى كائن آخر ,,, لكن هنا لن يتوفى كائن ان شاء الله 😛 (الا لو انت استعملت عليه دالة الهدم , وسأتطرق لها فيما بعد إن شاء الله تعالى) .

– مثال :

نعود الى الكائن إنسان السابق (لاحظ انه كائن عام فيه كل الخصائص) , وسنقوم بتوريث كائن اخر وهو “علاء” هذه الخصائص من الكائن الأب .

اذا سيصبح للكائن علاء خاصية الاكل والشرب والنوم ..الخ

—————-

المفهوم الثاني : الكبسلة …

لو كان لديك سر برمجي ما , وتتفوق به في برامجك (حركة في الواجهة أو غيرها…) , فعندما تقوم بعمل برنامج واعطائه للزبون فلن يهتم كيف قمت بعمل هذه الحركة , وإنما فقط كيف يستخدمها … وهذا ما يعرف بالإخفاء أو الكبسلة , أي انك تخفي الكود وتترك فقط طريقة استعماله

—————-

المفهوم الثالث : تعدد الأشكال …

نفترض ان هناك كائنين هما “العامل أ” و “العامل ب” , ولكل منهما نفس الخصائص والطرق .. ولدى كل منهم أسلوب اسمه GetIt , لا ستخراج ناتج معين

لكن العامل أ , يستعمل الاسلوب GetIt لضرب ثلاثة أعداد واخراج الناتج , بينما العامل ب يستخدمه لجمع ثلاثة أعداد واخراج المتوسط , وهذا ما يعرف بتعدد الأشكال , أي ان يكون هناك نفس الاسلوب لكلا الكائنين لكنه يؤدي وظيفة مختلفة

—————-

المفهوم الرابع : التجريد …

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

مثلاً لو انك تقوم بعمل برنامج لادخال البيانات الخاصة بسيارة ما , فلست في حاجة إلى حساب عدد أولاد صاحب السيارة , إنما تركز على اشياء اخرى مثل لوحة السيارة , لونها , الشركة المصنعة ..الخ

—————-

المفهوم الخامس : البناء والهدم …

هي دالتين موجودتين داخل كل كائن :

دالة بناء : لإنشاء الكائن , وحجز مكانه في الذاكرة . وهي دالة Create

دالة هدم : لإزالة الكائن من الذاكرة ومن البرنامج . وهي دالة Free

—————-

التطبيق …

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

—————-

إنشاء وحدة في دلفي …

كما ذكرت سابقاً .. الوحدة في البرمجة الكائنية , هي مثل الخلية في جسم الانسان … فهي وحدة التركيب والوظيفة في بنية البرنامج , لانها تحتوي على الكائنات التي من اجلها سميت OOP بهذا الاسم …

لإنشاء وحدة في دلفي , وبكل بساطة اتبع الخطوات التالية :

– عادة , نضع الكائنات (او كل كائن) في وحدة منفصلة مع خصائصه ووظائفه .. حتى لا يتداخل مع بقية الكود وانما يكتفى بندائه من خلال الوحدة الأساسية ..

لذا ستكون الخطوة الأولى هي إنشاء وحدة جديدة (File –> New –> Unit)

طبعا , سنعمل على Console Application , لأننا لا نحتاج الشغل المرئي هنا …

– الان سنكتب الكود … لكن مهلا ! كود ماذا ؟ لم نحدد بعد ما سنفعل

سنقوم بعمل وحدة اسمها Animal ونتعامل مع هذا الكائن الحيوان 😛 … كمثال بسيط جدا

– سنقوم بكتابة الكود التالي في الوحدة الجديدة :
unit Unit1;
//-
interface
//-
type
Animal = class
//-
Name : String ;
Age : Byte ;
LiveIn : String ;
//-
procedure Speak ;
end;
//-
implementation
//-
{ Animal }
//-
procedure Animal.Speak;
begin
WriteLn('Name : ' + Self.Name) ;
WriteLn(Self.Age ) ;
end;
//-
end.

//———-

نشرح الكود :

Type : وتستخدم للاعلان عن نوع جديد , سجل أو وحدة .

Animal = class : وهنا ننشئ كائن جديد من نوع وحدة .

– بقية الكود متغيرات عادية تمثل خصائص الكائن .

procedure Speak : وظيفة خاصة بالكائن .

Self : تشير إلى الكائن المستعمل , أي انها تشير إلى الكائن الذي تمت مناداة الوظيفة من خلاله

—————-

استعمال الكائن …

نعود الان إلى الوحدة الأساسية لنستعمل الكائن , ونكتب في الوحدة الرئيسية :

program Project1;
//-
{$APPTYPE CONSOLE}
//-
uses
SysUtils,
Unit1 in 'Unit1.pas';
//-
var
Cat : Animal ;
//-
begin
Cat := Animal.Create ;
//-
with Cat do
begin
Name := 'ShoSho' ;
Age  := 3 ;
LiveIn := 'My home' ;
end ;
//-
Cat.Speak ;
//-
Cat.Free ;
//-
ReadLn ;
end.

//———-

نشرح الكود :

Cat : Animal : عرفنا متغير من نوع الكائن الذي أنشأناه للتو .

Cat := Animal.Creat : أنشأنا الكائن ووضعناه داخل المتغير .

– الست أسطر التالية لضبط خصائص الكائن .

Cat.Spreak : استدعاء الإجراء الخاص بعرض قيم خصائص الكائن .

Cat.Free : تفريغ الذاكرة من الكائن بعد استعماله .

—————-

انشاء ابن للكائن Animal …

سننشئ الآن كائناً اسمه LittleAnimal وسيكون ابنا للكائن Animal , وهذا باستخدام الوراثة …

– أضف الكود التالي بعد كلمة “end;” الأولى في الوحدة الخاصة بالكائن :

LittleAnimal = class(Animal)
end ;

//———-

نشرح الكود :

– مرننا اسم الاب الى دالة class , حتى يتم استدعاء خصائص الاب الى الابن

يجب ان نعدل على كود الوحدة الاولى الرئيسية , فيصبح :

program Project1;
//-
{$APPTYPE CONSOLE}
//-
uses
SysUtils,
Unit1 in 'Unit1.pas';
//-
var
Cat : Animal ;
Kitty : LittleAnimal ;
//-
begin
Cat := Animal.Create ;
Kitty := LittleAnimal.Create ;
//-
with Cat do
begin
Name := 'ShoSho' ;
Age  := 3 ;
LiveIn := 'My home' ;
end ;
//-
with Kitty do
begin
Name := 'SeSe' ;
Age  := 1 ;
LiveIn := 'My home' ;
end;
//-
Cat.Speak ;
Kitty.Speak ;
//-
Cat.Free ;
Kitty.Free ;
//-
ReadLn ;
end.

—————-

ملاحظات …

1- لم نهتم بأشياء أخرى غير أساسية كلون الحيوان , أو هل لديه شعر أم لا (التجريد) .

2- وفرنا الوقت باستخدام الوراثة , وستعرف هذا عندما تكتب كائن له كثير من الخصائص , ومن ثم تورثه إلى آخر (الوراثة) .

3- لم نطلع المستخدم على كود إجراء Speak (الكبسلة) .

—————-

أرجو ان يكون الدرس قد افادكم ..