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

مشاهدة نسخة كاملة : درس فى كل لغات البرمجة ( الدلفي-Delphi )هديه مني لكم .


د/ حـــــرحـــيـر
4/8/1426 هـ, 12:32 صباحاً
نبذة عن ديلفي

من المعروف أن ديلفي هي منتج بورلاند الأكثر مبيعاً للتطوير السريع للتطبيقات RAD (Rapid Application Development) والمستخدم لكتابة تطبيقات ويندوز ، ويمكنك باستخدام الدلفي إنشاء تطبيقات ويندوز بسرعة أكبر وبسهولة أكثر من أي وقت مضى.

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

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








نظرة سريعة على مكونات ديلفي IDE


سنتعرف في هذا القسم على بيئة التطوير المتكاملة للدلفي IDE (Delphi Integrated Development Environment) .


عندما تشغل برنامج الدلفي تظهر لك بيئة التطوير فيه والتي سنتعرف عليها كل على حده








بيئة دلفي مكونة من ثلاثة أقسام :


1- الإطار العلوي :


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











2- مفتش الكائنات : (سنتعرف عليه بالتفصيل في دروس قادمة)


والذي يتم بواسطته تعديل الخصائص والأحداث للمكون وسوف تستخدمه بشكل دائم خلال عملك مع ديلفي وهناك بابين لمفتش الكائنات هما الخصائص Properties والأحداث Events.








مصطلح الخاصة Property يحتوي على خصائص لها قيم تحدد عمل المكون

يتضمن باب الأحداث Events قائمة أحداث المكون . تتشكل الأحداث نتيجة لتفاعل المستخدم مع المكون مثلا عند نقر المكون يتولد حدث يخبرك بأن المكون قد نقر بإمكانك كتابة أوامر تستجيب لهذه الأحداث.




مصطلح الحدث Event هو شيء ما يحصل كنتيجة لتفاعل المكون مع المستخدم أو مع ويندوز.

مصطلح معامل الحدث Event Handler هو مقطع من البرمجة ينفذ استجابة للحدث.








3- منطقة عمل ديلفي







الجزء الثالث هو منطقة عمل ديلفي وعادة ما يظهر مشروعاً جديداً .


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


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

--------------------------------------------------------------------------------


خصائص وأحداث عنصر النافذة

كل مشروع له على الأقل نافذة واحدة Form تمثل النافذة الرئيسة ، كما يمكن أن يكون للمشاريع أكثر من نافذة واحدة. لعنصر النافذة خصائص وأحداث سنتعرض لهما في هذا الدرس .


عند بداية مشروع جديد ينشئ ديلفي نافذة يسميها Form1 بإمكانك إضافة نافذة جديدة من خلال الأمر File|New Form ولكل نافذة وحدة Unit خاص بها يحتوي على برمجة هذه النافذة





ويمكنك الدلفي من التعامل مع النافذة والتعامل مع خصائصها وإضافة أحداث لها من خلال العنصر التالي


والذي سنتعرف الآن على أبرز خصائصة التي يمكننا من التعامل معها








أولا : نتعرف على خصائص عنصر النافذة Properities





ActiveControl : يحدد أي عنصر موضوع على النافذة الرئيسة هو العنصر النشط يمكن التحريك بين العناصر باستخدام الزرTab


AutoScroll : إعطها القيمة True لتظهر وتختفي أشرطة التمرير Scroll bars تلقائياً عند حدوث نقص في مساحة النافذة.


Cruser : يعين شكل مؤشر الفأرة عندما تقع على مساحة النافذة.


Enabled : أعطها القيمة True لكي تستجيب النافذة لأحداث الفأرة ولوحة المفاتيح وعنصر التوقيت Timer وعند إعطائها القيمة False لاتستجيب لاتفعل ذلك إلا إذا كنت تدري ما تفعل .


HerzScrollBar: يظهر شريط التمرير الأفقي للنافذة.


Icon: تحديد أيقونة النافذة ويظهرها على شريط العنوان.


KeyPreview: أعطها القيمة True لكي تتلقى النافذة أغلب أحداث لوحة المفاتيح.


Menu: تستخدم لتحديد قوائم النافذة أحياناً في بعض برامج واجهة المستندات المتعددة Multiple Document Interface واختصاراً MDI كبرنامج مايكروسوفت وورد يمكنك إثناء التشغيل تغيير القوائم.


ObjectMenuItem: يستخدم مع تطبيقات OLE لقواعد البيانات.


PixelsPerInch: يحدد كيف يقوم التطبيق لإنشاء النافذة ليتم قياسها بالنقاط لكل بوصة استخدمه مع Scaled لانشاء نافذة متشابهة في الحجم مع دقة شاشة مختلفة إذاكانت Scaled محددة بالقيمة False فإن PixelsPerInch ليس لها أي تأثير.


Position: تحدد المناهج لحساب حجم ومكان النافذة حسب القيم التالية:

poDefault يعرض النافذة وموضها المصمم.

poDefaultPostOnly يحدد المكان المصمم للنافذة ولكن يحسب حجمها وقت التشغيل (يحدد ويندوز الحجم البدائي لها).

poDefaultSizeOnly يحدد الحجم المصمم للنافذة ولكن يحسب موضعها وقت التشغيل.

poScreenCenter عرض النافذة في وسط الشاشة.

Scaled: تحدد بالقيمة True لاستخدام خاصة PixelsPerInch يقوم بتغيير مقاسات الشاشة وهو هام لضمان ظهور النص بشكل سليم في تحكم النافذة على أنظمة تستخدم خطوط كبيرة ، كما في الويندوز 98 وويندوز NT5.0 والتي يستطيع المستخدم فيها اختيار قياسات الخطوط.


Tag: لايوجد تحديد مسبق يمكنك استخدم Tag لتمرير أي قيمة عدد صحيح تريد أو عدد يفحصه في أثناء التشغيل.


VertScrollBar: يظهر شريط التمرير الرأسي للنافذة.


Visible: تحدد بالقيمة True ليجعل العنصر مرئياً أو False ليخفيه حتى يستدعي البرنامج المنهج Show .


WindowMenu: يستخدم في تطبيقات واجهة المستندات المتعددة MDI تصمم القائمة لعرض عناوين النوافذ المفتوحة حدد هذه الخاصية في بنود تغيير النوافذ.



يتبع...

د/ حـــــرحـــيـر
4/8/1426 هـ, 12:34 صباحاً
انيا : نتعرف على أحداث عنصر النافذة Events





OnActive: يتم استدعائه عندما يقوم البرنامج بالتعامل مع النافذة عندما تنتقل من تطبيق آخر.


OnDblClick: يتم استدعائه عندما يقوم المستخدم بالنقر المزدوج على النافذة.


OnClick: يتم استدعائه عندما يقوم المستخدم بالنقر المفرد على النافذة.


OnClose: يتم استدعائه عندما تغلق النافذة.


OnCloseQuery: يستدعى قبل أن تغلق النافذة مباشرة ، يمكنك استخدام هذا الحدث لمنع فقدان البيانات وسؤال المستخدم عن موافقتهم على حفظ البيانات التي تم تغييرها قبل أن تغلق النافذة أو منع النافذة من الإغلاق.


OnCreate: يستدعى مرة واحدة عند إنشاء النافذة في الذاكرة.


OnDestory: يستدعى قبل تدمير النافذة وهي الفرصة الأخيرة لأداء أي عمل قبل إنهاء التطبيق.


OnDonner, OnBlitzen: تحدث عند حدوث أي حدث مهما كان للنافذة.


OnHide: يستخدم لأداء أعمال عندما تكون النافذة مختفية مثلاً تحريرالذاكرة عندما تكون النافذة في حالة غير مرئية.


OnKeyDown: يستدعى عندما يضغط المستخدم أي مفتاح بما في ذلك مفاتيح التي لها وظائف خاصة استخدم هذا الحدث في حالة ضغط أكثر من مفتاح مثل مفاتيح Alt, Shift, Ctrl مع مفاتيح أخرى يمكن تكرار هذا الحدث قبل رفع الزر ، استخدم القيمة True للخاصة KeyPreview عند استخدام هذا الحدث.


OnKeyPress: يستدعى عندما يضغط المستخدم أي مفتاح غير المفاتيح التي لها وظائف خاصة ، هذا الحدث بعدOnKeyDown وقبل OnKeyUp ، استخدم القيمة True للخاصة KeyPreview عند استخدام هذا الحدث.


OnKeyUp: يستدعى عندما يضغط المستخدم أي مفتاح بما في ذلك مفاتيح التي لها وظائف خاصة يمكن استعمال هذا الحدث مع OnKeyDown فقط لتنظيم نشاط لوحة المفاتيح كما في الألعاب مثلاً، استخدم القيمة True للخاصة KeyPreview عند استخدام هذا الحدث.


OnMouseDown: يحدث عندما يضغط المستخدم على أي زر للفأرة .


OnMouseMove: يحدث عندما يحرك المستخدم مؤشر الفأرة داخل مساحة النافذة يمكنك تحديد فيما إذا ضغط المستخدم على المفاتيح Alt, Shift, Ctrl .


OnMouseUp: يحدث عندما يرفع المستخدم زر الفأرة .


OnPaint: عندما تحتاج محتويات النافذة للتحديث مثلاً عندما يقوم المتخدم بتحريك نافذة أخرى جانباً أو عندما تتغير موقع أو أبعاد النافذة.


OnShow: يستدعى قبل أن تصبح النافذة مرئية ، استخدم هذا الحدث لتنفيذ ما تريد ظهوره عند ظهور النافذة.

المتغيرات في برنامج الدلفي Variable

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


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







var

x:Integer;

y:Integer;









في المثال السابق قمنا بتعريف متغيرين بالذاكرة يحملان الإسمين x,y ويختصان بحفظ بيانات من نوع الأعداد الصحيحة








يمكن التصريح عن قسم Var في عدة أمكنة فيمكن أن يتواجد القسم Var على مستوى الوحدة أو على مستوى الإجرائية أو التابع أو في كليهما حتى أنه من الممكن تواجد عدة أقسام Var في الوحدة الواحدة ، إليك المثال التالي


proceder TForm1.Test;



var



s: string;






begin

s:=’هذا هو برنامجي الأول’;

Label1.Caption:=s

end;


التصريح عن متغير يحجز مكان في الذاكرة الموقتة لتخزين قيمة المتغير أثناء تنفيذ البرنامج .

تخضع أسماء المتغيرات لقواعد ، يمكن استخدام الحرف الصغير والكبير والأرقام والخط السفلي (_) ولايحتوي على مسافات أو محارف خاصة ويجب أن لا يبدأ إسم المتغير برقم ، لاتوجد قيود على طول الإسم ولكن في الواقع سيقوم المترجم بتجاهل ما بعد 255 حرف . وفي الواقع إذا تجاوز طول الإسم عن 20 حرفاً فإن هذا لن يكون مفيداً وعمليا

أمثلة للأسماء المقبولة :

aVaryLongVaribleName:Integer;

my_var1:Integer;

x:=Integer;

ويجب ملاحظة أن لغة باسكال والدلفي ليست حساسة لشكل الحرف كبير كان أو صغير.

--------------------------------------------------------------------------------

الثوابث في برنامج الدلفي Const
سنحاول في هذا الدرس التعرف على الثوابت Constant في برنامج الدلفي بتفصيل أكبر وهي تعد من الكلمات الأساسية في البرنامج .

يحتوي القسم Const على لائحة من المتغيرات المعروفة بثوابت لا يمكن تغييرها


كمثال على ذلك ليكن هناك بعض القيم التي يستخدمها برنامجك مرارا وتكرارا ، يمكنك من أجل هذه القسم وضع متغيرات من نوع Constant لتبيان ذلك نشاهد المثال التالي

Unit Unit2;


Interface





Const


AppCaption =’برنامجي الأول ‘;





Procedure DoSomething;





Implementation





Const


X = 20 ;


Y = 200;





Procedure DoSomthing;


Begin


{أوامر الإجراء DoSomthing تكتب هنا }


End;





End.




في المثال السابق أضفنا القسم Const واحد للثوابت العامة ( التي يمكن للوحدات الأخرى التعامل معها ) وآخر للثوابت التي تستخدمها هذه الوحدة فقط .


بما ان الثابت AppCaption مصرح عنه في القسم InterFace ، فإنه يمكن إستخدامه في أي مكان في الوحدة وفي أي وحدة أخرى واردة في لائحة Uses لهذه الوحدة


ولإن الثوابت y و x مصرح عنها في القسم Implementation فمن الممكن إستخدامها فقط في هذه الوحدة

--------------------------------------------------------------------------------

الكلمات الأساسية Else – If , Then

هناك بعض مظاهر البرمجة المشتركة في كل لغات البرمجة ومنها عبارة الشرط if


تستخدم هذه العبارة لفحص شرط معين وثم تنفذ شيفرة معينة إذا تحقق الشرط True وعدم تنفيذه في حالة عدم تحقق الشرط








var



x:integer;



begin

x:=StrToInt(Edit1.Text)


if x>10 then




Label1.Caption:='عليك أن تدخل عدد من 1 -10';

end;







في المثال السابق يقوم البرنامج بطلب إدخال من المستخدم ويقارن المدخل بشرط بحيث إذا كان الشرط x>10 متحققا وكان العدد المدخل أكبر من عشرة ينفذ البرنامج الجملة بعد الشرط ويطلب بإدخال عدد أصغر من 10











تنفيذ عدة عبارات داخل الشرط





لنفترض أن لديك عدة سطور من البرمجة يجب أن تنفذ عندما يكون الشرط محققاً عندها سوف تحتاج إلى begin..end لتجعل هذه السطور تشكل كتلة واحدة يكون داخلها تنفيذ الشرط إذا كان متحقق


if x>10 then



begin



Label1.Caption:='عليك أن تدخل عدد من 1 -10';



Edit1.text:= '10';



end;








إستخدام الشرط Else





أحياناً تحتاج لعمل تنفيذ ما إذا كان الشرط محققاً ولكن تريد البرنامج بأن يؤدي عملاً آخر إذا كان الشرط غير محقق مثل:


if x=0 then y:=0



else



y:=sin(x);
حلقات التكرار


تستخدم الحلقات لأداء عمل معين بشكل متكرر حتى يتحقق شرط معين.


ويتم إستخدامها في البرامج بشكل واسع



الحلقة التكرارية For


وهي تعد أكثر أنواع الحلقات التكرارية شيوعا


تتطلب هذه الحلقة محددتين القيمةالبدائية والقيمة النهائية إذا كانت الحلقة تصاعدية تستخدم To وإذا كانت تنازلية نستخدم كلمة DownTo .


الصيغة العامة لجملة for التصاعدية هي

for var := initial_value to end_value do



begin

statment;


end;






في المثال السابق حلقة تكرر الشيفرة الممثلة بعبارة statement حتى تصل إلى القيمة النهائية end_value . لا داعي لاستخدام begin , end إذا كان جسم التكرار يتكون من عبارة واحدة. ولكن عندما نريد إضافة العديد من السطور فنحتاج لإستخدام Begin – End

الصيغة العامة لجملة for التنازلية:



for var := initial_value DownTo end_value do

begin

statment;

end;



في المثال السابق كتلة الشيفرة يجب أن تكون initial_value أكبر من end_value وتتناقص قيمة العداد المتغير var واحداً في كل تكرار للحلقة


مثال عملي :


أنشئ مشروعاً جديداً


وأضف له زراً Button1 ومكون المفكرة Memo1 غير الخاصة Caption للزر واجعله " ابدأ " أنشئ الحدث OnClick له ، واكتب معالج الحدث كالتالي








var

I:Integer;


begin



Memo1.Clear;



for I := 0 to 9 do


Memo1.Lines.Add('هذا السطر رقم '+IntToStr(I));



end;






الآن يمكنك تشغيل البرنامج ، إضغط الزر ابدأ وشاهد عمل الحلقة …



الحلقتين التكراريتين While - Repeat


والآن بعد أن رأيت كيف تعمل حلقة for لن يكون صعباً جداً عليك أن تطبق ذات المعنى على حلقتي while , repeat


لنلقي الآن نظرة عليهما الآن.


حلقة while


تختلف حلقة while عن الحلقة For في كونها تحتوي على شرط يفحص عند بداية كل تكرار للحلقة . طالما أن الشرط محقق تستمر الحلقة في التنفيذ ويتوقف التنفيذ للحلقة عندما يكون الشرط غير محقق .


إليك الشكل العام للحلقة while





While cond_expr do

Begin



Statements;



End;


حيث يفحص البرنامج الشرط cond_expr وعند تحقق الشرط فإن البرنامج ينفذ الأوامر بين الأمرين End – Begin ويعود لقراءة الشرط مرة أخرى وهكذا يستمر في تنفيذ التكرار إلى أن يصبح الشرط غير متحقق فيخرج من التكرار


وإذا كان جسم الحلقة مؤلف من عبارة واحدة فليس هناك داعي لإستخدام Begin – End




حلقة Repeat


مثل حلقة while ولكن الحلقة While تقوم بفحص الشرط في بداية الحلقة ولكن في حالة الحلقة Repeat فإن الشرط يفحص في نهاية الحلقة


إليك هذا البرنامج الذي يبين عمل الحلقة Repeat وهو نفس مثال البرنامج للحلقة For مع تعديل سطور البرنامج





ويمكن ملاحضة ان الحلقة repeat تتنفذ على الأقل مرة واحدة ولكن الحلقة While يمكن أن لا تنفذ ولا مرة










Var



I:Integer;


begin


I:=5;



Memo1.Clear;



Repeat



Memo1.Lines.Add('هذا السطر رقم '+IntToStr(I));


Dec(I);


Until I=-1;

end;


الإجرائين Break , Continue


قبل أن ننهي الحديث عن الحلقات يجب أن نتعرف على إجرائين يساعدان على التحكم بتنفيذ البرنامج ضمن الحلقة .


- استخدم الأمر Continue لتجبر البرنامج على الانتقال إلى نهاية الحلقة متجاوزاً كل العبارات التي تليه .


- استخدم الأمر Break لتوقف عمل الحلقة مباشرة ولاتستحدم خارج الحلقات.

--------------------------------------------------------------------------------
يتبع...

د/ حـــــرحـــيـر
4/8/1426 هـ, 12:35 صباحاً
عبارة case

يمكن اعتبار تركيب case كتركيب if موسعة ، إنها تمكنك من تنفيذ عبارة واحدة من عدة كتل برمجة معتمدة على نتيجة تعبير معين


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





للتعرف على الصيغة العامة لتركيب case نشاهد المثال










case var of



val_1 : statement_1;


val_2 : statement_2;



val_3 : statement_3;


;

;


else


statement_else;

end;






عندما يبدأ البرنامج في تنفيذ تركيب case سيمر على قيمة val_1 ويقارن بين الثابت val_1 والمتغير Var إذا وجدهما متساويين سيقوم البرنامج بتنفيذ جميع الأوامر التي تليها حتى يصل إلى نهاية الكتلة ( تحدد الكتلة بالعبارات بين Begin , end في حالة استخدام أكثر من عبارة واحدة كما سبق شرحه ) أما إذا لم يجدهما متساويين فإنة سيتخطاها بجميع العبارات الواردة بعدها وينتقل إلى الثابت الآخر ويكرر المحاولة وهكذا يمر البرنامج عليها كلها فإذا لم يجد الثابت المطلوب منها فإنه سيتخطاها إلى كلمة else وينفذ العبارات الواردة بعدها حتى نهاية التركيب .







ملاحظة مهمة


يجب أن يعطى التعبير ضمن الدالة case قيمة تنتمي إلى نمط مرتب من الأنواع ( Integer,Byte,Word )


بحيث لايمكنك كتابة مايلي مثلاً









case str of



'Own' : {code};



'Two' : {code};

end;








يمكن جعل البرنامج ينفذ كتلة أوامر عند أكثر من قيمة


كما أن إستخدام الدالة else في الإجراء Case يعتبر اختياري ومثال على ذلك




case x of



1: y:=sin(x);



2,3 : y:=cos(x);


4,5,6: y:=x;

منقول للفائدة ...

The Engineer
4/8/1426 هـ, 05:42 صباحاً
جزاك الله خير أخي الكريم
(أعتقد أنه يوجد صور غير منقولة :))

لغة الدلفي لغة جميلة وله عشاقة وله مميزات وعيوبهاً وسأحاول المشاركة بما أعرفة عن هذه اللغة التي لم أجربهاً في حياتي لكن قرأت عنها فقط

يميز هذه اللغة شيئين هما اللذان رفعا مقدار اللغة (عالمياً وليس عربياً:() الشئ الأول هو قابلية العمل على أكثر من نظام تشغيل والذي لم يشاركها في هذا إلا الجافا والسي ومؤخراً تقنية الـ .NET فمثلاً تستطيع عمل نظام مخزون وعمل عميل لهذا النظام Client فمن الممكن يكون لدى الشركة موظفين يعملون على الماك وآخرون على اللنكس والبعض على الويندوز فمن الصعب أن يقوم المبرمج إعادة كتابة الكود لكل بيئة تشغيل ! مع هذه التقنية تستطيع نقل الكود إلى أي بيئة
أما الشئ الثاني والذي هو السهولة فكما تفضلت في الشرح تستطيع تصميم برنامج بالسحب والإفلات بدلاً من استدعاء دوال API للتعامل مع النظام وغيرة من وجع الرأس لم ينافس هذه اللغة في السهولة إلا سيدة السهولة :) لغة الفجوال بيسك حبيبة بيل قيتس :):)

لكن من السلبيات التي ذكرت هي أن حجم الملفات الصادرة عن اللغة والمعمول لها تجميع Compile كبير للغاية بالمقارنة مع مخرجات اللغات الأخرى والسبب يعود إلى أن اللغة ليس لها بيئة خاصة بها ولا ملفات Run-Time أو دعم تشغيل للبرنامج مثل ما للجافا والدوت نت ، فالجافا تطلب منك الـ Virtual Machine أو اللغة الإفتراضية والدوت نت تطبل منك الـ .NET Framework لكن الدلفي ترفق ملفاتها مع البرنامج وهذا يسبب تضخم في الحجم. وأعتقد أن السلبية ليست ذات أهمية لأن الأقراص الصلبة الآن وصلت إلى مساحات كبيرة جداً للمستخدم المنزلي فما بالك بالشركات.

أرجوا إني ما أكون طولت << عندك نية تكمل بعد

تحياتي..:)

د/ حـــــرحـــيـر
4/8/1426 هـ, 12:07 مساءً
جزاك الله خير اخوي وان شاء الله نفيد ونستفيد منك ولا تبخل علينا بمعلوماتك وان بغيت اي معلومات عن اي لغه انا تحت امرك باللي اقدر عليه .