cattoo بتاريخ: 21 أبريل 2007 تقديم بلاغ مشاركة بتاريخ: 21 أبريل 2007 السلام عليكم ورحمة الله وبركاتهانا مبتدئة في تعلم الاوراكل والديفيلوبر وافضل طريقة للفهم وتثبيت المعلومات هي عن طريق تعليم الاخرين.انا انشاء الله اليوم حبدأ هذا الدرس واي استفسار او سؤال او تصحيح ياريت تتكرموا وتعلموني به.طبعا اولا نفتح الفورم بيلدرومن قائمة ملف نختار connect ثم ندخل على scott / tiger.اما من معالج انشاء بلوك data block wizard او عن طريق الرسم اليدوي نرسم ثلاثة text item نعطي لكل منهم اسم برمجي وهو اسم خاص بالمبرمج وغير مرئي من قبل المستخدم ابتدئنا الاسم بالمقطع txt وذلك لسهوله المراجعة لاحقا.الاول:name:txt_deptnocolumn name:deptnoالثاني:name:txt_dnamecolumn name:dnameوالثالث:name:txt_loccolumn name:locنرسم ايضا خمسة ازرار على الفورم.الاول:label:new اي لانشاء سجل جديد.احداث triggers الازرار كلها when-button-pressed اي بعد رسم الزر على الفورم من لوحة الادوات ننقر عليه بالزر الايمن ونختار smart triggers ثم نختار الحدث المطلوب when-button-pressed اي عندما يتم الضغط على الزرزر ادخال سجل جديد: begininsert into dept (deptno,dname,loc)values(:txt_deptno,:txt_dname,:txt_loc);commit;message('a new record has been added');end;[/left] شرح الشفرة:دليل بداية الكود begininsert into dept(deptno,dname,loc)values(:txt_deptno,:txt_dname,:txt_loc);اي ادخل الى حقول الجدول dept وهي رقم القسم deptno ,اسم القسم dname, والموقع loc القيم التالية:قيمة الكائنات المذكورة.فقيمة الكائن المسمىtxt_deptno تذهب للحقل deptno, ووضعت النقاط : امام الاسم لانه كائن في الفورم وليس متغير.وهكذا للبقية مع ضرورة الترتيب.ومن اجل الحفظ للسجل الجديد يجب عمل commit;message(' ');تستخدم لارسال رسالة للمستخدم تفيد ان السجل قد تم انشائة وحفظة بنجاحواخيرا نهاية الكود end;وانشاء الله اتمم بقية الازرار وهي تعديل،حذف,بحث,وخروج 3 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
cattoo بتاريخ: 21 أبريل 2007 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 21 أبريل 2007 بالنسبة للزر الثاني "تعديل" وضيفته هي تعديل سجل موجودوبما ان رقم القسم مفتاح اساسي primary key من الافضل عدم تعديله وذلك لامكانية وجود عدة سجلات في جدول الموظفين مرتبطه بهذا الرقم لذلك عند التعيل سنعمل على تغيير الاسم والموقع فقط.طبعا تبع الحدث when-button-pressedزر التعديل:label:updateالشفرة: begin update dept set dname=:txt_dname,loc=:txt_loc where deptno=:txt_deptno; commit; message('a record has been updated'); end; الشرح:يمكن الاستغنا عن begin , endوهما كم ذكرت للدلالة على بداية ونهاية الكودupdate dept set dname=:txt_dname,loc=:txt_loc where deptno=:txt_deptno;اي عدل الجدول dept وذلك بجعل dname=:txt_dname اي عدل الحقل اسم القسم ليصبح ما هو مكتوب في الكائن txt_dname ,وكذلك بالنسبة للموقع where deptno=:txt_deptnoبشرط ان يكون رقم القسم مساااوي للكائن txt_deptno وذلك حتى لا يقوم بتعديل بيانات الجدول كامل.(عدل السجل الذي يتحقق فيه الشرط المذكور فقط).ثم حفظ التعديل commit;واخيرا نهاية الكود end;وهذه شفرة الزر delete حذف سجل موجود begin delete from dept where deptno=:txt_deptno; commit; message('a record has been deleted'); end; والزر خروجbegin exit_form; end; 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
cattoo بتاريخ: 21 أبريل 2007 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 21 أبريل 2007 وهذا كود انا عملته كاختبار لنفسي بعد ان نقوم بادخال الاسم كاملا في كائن نصي ننقر على زر فيعمل الكود على تقسيم هذا الاسم فيضع الاسم الاول في text item الاول والاسم الاوسط في كائن نصي ثاني والاسم الاخير ان وجد في كائن نصي ثالث.كود اهبل بس استفيدوا من طريقة عمل الدوال فيه. declare n number(2); f number(2); s number(2); fname varchar2(10); sname varchar2(10); lname varchar2(10); begin n:=0; f:=0; s:=0; for i in 1..length(:txt1) loop if substr(:txt1,i,1)=' ' then n:=n+1; if n=1 then fname:=substr(:txt1,1,i); f:=i; elsif n=2 then sname:=substr(:txt1,f,i-f); s:=i; end if; end if; end loop; if n=0 then fname:=substr(:txt1,1,length(:txt1)); elsif n=1 then sname:=substr(:txt1,f,length(:txt1)); elsif n=2 then lname:=substr(:txt1,s,length(:txt1)); end if; :txtn:=n+1; :txtf:=fname; :txts:=sname; :txtl:=lname; end; حيث txt1 هو الكائن الذي استخدمته لكتابة الاسم كاملاtxtf كائن الاسم الاولtxts كائن الاسم الاوسط او الثانيtxtl كائن الاسم الاخيرtxtn كائن يظهر عدد الكلمات/الاسماء في txt1 (اي اذا الاسم ثنائي او ثلاثي ) 4 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Amgad بتاريخ: 21 أبريل 2007 تقديم بلاغ مشاركة بتاريخ: 21 أبريل 2007 الأخت / cattooشكرا لك على المجهود الكبير .. وحبك لتعليم الأخرين ننتظر منك المزيد سؤال بالنسبة لتجزئة الاسم كيف يمكن التعامل مع اسم مثل عبد الرحمن وليس عبدالرحمن -- اى تم اضافة مسافة بين كلمة عبد وكلمة الرحمن شكرا لك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
cattoo بتاريخ: 22 أبريل 2007 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 22 أبريل 2007 شكرا لك اخي Amgad بالنسبة لما سألته فبرنامجي يعتمد على الفراغات في تقسيم الاسماء وفي هذه الحالة سيعتبر "عبد" اسم ,و"الرحمن" اسم اخر. وهذا احتمال لم افكر فيه .لكن شكرا على التنبيه وساحاول معالجة هذا الامر اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
المهباش بتاريخ: 24 أبريل 2007 تقديم بلاغ مشاركة بتاريخ: 24 أبريل 2007 صراحة موضوع أكثر من رائعوأنا صراحة كمبتدئ كنت بحاجة إلى للأكوادشكرا جزيلا .. اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
cattoo بتاريخ: 24 أبريل 2007 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 24 أبريل 2007 اليوم ساحاول وضع شرح بسيط عن كيفية التعامل مع list itemlist item لها ثلاثة انواع: - poplist - Tlist - combo boxيمكننا اختيار اي من هذة الانواع من خواص هذا الكائن ,اي بعد رسم الكائن على الفورم اضغط f4 لتظهر لك نافذة property palette ثم من الخاصية list style اختار النوع المناسب لعملك او دعه كما هو افتراضيا poplist.اذا اردنا اضافة عنصر الى list نستخدم الامر add_list_element('ListName',index,label,value); ListName هو اسم الكائن والذي تم تحديد في الخاصية name من نافذة property palette مثلا: lst_deptnameاو اي اسم ويفضل ابتداء الاسم بالمقطع lst لسهولة قراءة البرنامج ومراجعته لاحقا. ويجب وضع الاسم بين علامتي اقتباس مفردة 'ListName' .index (الفهرس) للدلاله على الموقع/رقم الفهرس الذي تريد اضافة العنصر به.label العنوان الذي سيظهر للمستخدم .value هي القيمة الفعلية لهذا العنصر في قاعدة البيانات(غير ظاهرة للمستخدم).مثال:في حدث when-new-form-instance الذي يمكن الوصول اليه بالضغط على triggers (الذي يقع اسفل اسم moduleوالذي هو افتراضيا module1 ) بالزر الايمن ثم اختيار smart triggers ثم when-new-form-instanceوالذي يعني عند بدء تنفيذ البرنامج(مثل form load في الفيجوال بيسك).نكتب الكود التالي: declare cursor cur_dept is select deptno,dname from dept; dno dept.deptno%type; dnm dept.dname%type; i number; begin set_window_property(forms_mdi_window,window_state,maximize); set_window_property('window1',window_state,maximize); open cur_dept; i:=0; loop fetch cur_dept into dno,dnm; exit when cur_dept%notfound; add_list_element('lst_dept',i,dnm,dno); i:=i+1; end loop; close cur_dept; end; شرح الكود:اولا cursor يعمل عملية الاستعلام عن اسماء الاقسام وارقامها في جدول الاقسامثم تعريف متغيرين dno وعينت له نفس صفات deptno في جدول الاقسام، والمتغير dnm واعطيت له نفس صفات المتغير dname في جدول الاقسام dept. ومتغير ثالث ستتضح مهمته لاحقا في فهرس list item.بدء الكود begin . لابد انكم لاحظتم ان نافذة التنفيذ تتكون من نافذتين اصلا . احدهما لها الاسم forms_mdi_window وهس النافذة الاكبر. والاخرى window1 اذا لم تقم بتغييره من خصائص window (النافذة الداخلية). set_window_property(forms_mdi_window,window_state,maximize); set_window_property('window1',window_state,maximize); في هذا الكود قمنا بتكبير النافذتين maximize ومن الممكن جعلهما او احدهما عادية او مصغرة يتغير maximize الى minimize او normal .open cur_dept فتح cur_dept والذي يحمل اسماء وارقام الاقسام, ثم اسندنا القيمة 0 الى المتغير i وذلك حتى تبدء الاضافة الى list item من البداية (من اول فهرس). loop بداية دوران (الدوران من اجل المرور على كافة السجلات في cur_dept.)fetch cur_dept into dno,dnm; اي قم بجلب محتويات السجل الحالي في cur_dept وضعه في dno,dnm.exit when cur_dept%notfound; وضع شرط للخروج من الدوران عند نهاية السجلات في cur_dept وبدون هذا السطر يحدث دوران لانهائي. ثم اضافة اسم ورقم القسم والذان تم خزنهما في المتغيرين dno,dnm للسجل الحالي الى list_dept في الفهرس i والذي هو في اول سجل =0 ,ثم نقوم باظافة 1 الى i ليصبح i=1 (حتى يتم اظافة اسم ورقم السجل التالي في الفهرس 1 والا سيتم وضعه فوق الاول )، end loop نهاية بلوك الدوران ،ثم close cur_dept اذا لم تقم بوضع هذا السطر لن يتأثر عمل البرنامج وانما سيتم استهلاك الذاكرة(بقاء السجلات في الذاكرة حتى عند عدم الحتجة اليها).نهاية الكود end; 2 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
cattoo بتاريخ: 28 أبريل 2007 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 28 أبريل 2007 تابعلحذف عنصر من القائمة يجب تحديد رقم الفهرس index لهذا العنصر المراد حذفة delete_list_element('ListName',index); مثال:لحذف العنصر الاول في القائمة ,يكون الكود كالتالي: delete_list_element('ListName',1); ولحذف جميع عناصر القائمة نحدد اسم القائمة فقط . clear_list('ListName'); طبعا في البداية وقبل إنشاء List Item يجب معرفة هل نريد أن تكون القيم الظاهرة فيها :• ثابتة (إستاتيكية) Static : وبالتالي فهي تمتلك قيم ثابتة لا يمكن تعديلها ؛• متغيرة (ديناميكية) Dynamic : وبالتالي فهي تمتلك قيم متغيرة تعكس صورة السجلات في قاعدة البيانات وجلب البيانات فيها سيكون بواسطة الإستعلام Query .يمكن تحديد نوع القائمة من خصائصها .حدد القائمة ثم اضغط f4 لتظهر لك نافذة الخصائص، من خاصية element in listانقر على more .فاذا كنت تريد ان تكون القائمة ثابتة اكتب ماتريد من العناصر الثابتة في المربع الذي سيظهر عند النقر على more. والا ان كنت تريدها قائمة ديناميكية اعمل على مسح وتفريغ كل ما هو موجود في المربع المتكون من الضغط على more.اي ان القائمة lst_dept في مثالنا السابق هي قائمة ديناميكية اذ اننا اسعنا بالاستعلام لملئ القائمة باسماء الاقسام وهي متغيرة بتغير جدول الاقسام في قاعدة البيانات scott/tiger.ولم نقم بتعبئتها بقيم ثابتة. 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
cattoo بتاريخ: 10 مايو 2007 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 10 مايو 2007 alert يشابة message فهو يقوم بعرض رسالة للمستخدم للتنبيهفمثلا في زر الحذف يفضل دائما عمل تنبيه للمستخدم فيما اذا اراد حقا الحذف ام لا وذلك للحول ضد ضياع المعلومات.فاذا ضغط المستخدم موافق تم الحذف والا لا يحث شي.لانشاء alert نفتح شاشة navigator من خلال الضغط على مفتاح f3 , حدد alert ثم اضغط موافق ، فتلاحظ ظهور وتكون alert باسم افتراضي ،انقر عليه ثم f4 وعدل في خصائصة :name: alerttitle :تنبيهalert style:stopbutton 1 label:موافقbutton 2 label :الغاء الامرdefault alert button: button 2غيرنا خاصية name الى alert او اي اسم تتذكره , وخاصية title وهي عنوان الرسالة ففجعلناه "تنبيه"،في خاصية alert style :حدد شكله اجعله stop لتظهر علامة الضرب الحمراء اوغيره كما تحب. حدد الازرار التي تريد ظهورها (موافق و الغاء الامر) ، وحدد الزر الافتراضي ( الزر الذي سيتم اختياره من الضغط على enter ) وهو في مثالنا (الزر الثاني "الغاءالامر") وذلك لحماية البيانات من الضغط بالغلط على enter فلا يحدث مسح للبيانات.والان في trigger زر المسح عدل الشفرة لتصبح كالتالي: declare al_id alert; n number; begin set_alert_property('alert',alert_message_text,'هل تريد بالتاكيد حذف سجل '); al_id:=find_alert('alert'); n:=show_alert(al_id); if n=alert_button 1 then delete from dept where deptno=:txt_deptno; commit; else null; end if; end; set_alert_property تعمل على تحديد خاصية message في الرسالة (الرسالة التي ستظهر للمستخدم ).find_alert تبحث عن alert وتضعه في al_id ( لاحظ ان اسم alert بين علامتي اقتباس مفردة)show_alert تعمل على اظهاره (لاحظ ان تم الاشارة اليه بالمتغير الذي وجده ولذلك فهو بدون علامتي الاقتباس) ،حتى يقوم المستخدم باختيار احد الزرين ، ويخزن اختياره في n ,فاذا اختار المستخدم "موافق" وهو alert_button1 تم المسح ، والا alert_button2 لايحث شي null. 2 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
khaledmega بتاريخ: 19 مايو 2007 تقديم بلاغ مشاركة بتاريخ: 19 مايو 2007 السلام عليكم ورحمة اللهمجهود جميل يستحق التقدير ؛ اكملى حتى النهاية ولا تجعلى الملل يتسرب اليك.الكلام ده يبقى جميل اوى لو مع كل درس فورمة مطبق عليها كل الشرح يبقى كده درس متكامل لا يخضع للتخيل .شكرا وربنا معاكيميجا 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
hassan بتاريخ: 23 مايو 2007 تقديم بلاغ مشاركة بتاريخ: 23 مايو 2007 السلام عليكم ورحمة اللهيعطيكي العافية اخت cattooمجهود كبير... وشرح رائعأرجو أن تستمري ... فأنا مبتدئ في موضوع الفورم بعد قرائتي للكتب فإني أحتاج فعلا التطبيقوها انت تضعينا على معظم المواضيع المهمة التي يحتاجها كل نظاماستمري ... وسنتواصل معك بارك الله فيك 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
almary بتاريخ: 1 يونيو 2007 تقديم بلاغ مشاركة بتاريخ: 1 يونيو 2007 جزاك الله خيراً اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
cattoo بتاريخ: 2 يونيو 2007 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 2 يونيو 2007 مثال بسيط لاستخدام Alert واستخدام الدالة Month_between example.zip اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
omar-alreyati بتاريخ: 4 يونيو 2007 تقديم بلاغ مشاركة بتاريخ: 4 يونيو 2007 ما شاء الله عليك ويا ريت لو تستمر هيك والى الامام ان شاء اللهوجزاك الله خيراً اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Rolo بتاريخ: 21 يونيو 2007 تقديم بلاغ مشاركة بتاريخ: 21 يونيو 2007 السلام عليكم ورحمة الله ويركاته يا ريت تستمري يا كاتووووووو في الي بيستفيد من شرحك وبترك الله فيكي,,,,,,,,, اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
amrmoon2010 بتاريخ: 27 يونيو 2007 تقديم بلاغ مشاركة بتاريخ: 27 يونيو 2007 ألف شكر ليكي وجعله الله في ميزان حساناتك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
omar-alreyati بتاريخ: 28 يونيو 2007 تقديم بلاغ مشاركة بتاريخ: 28 يونيو 2007 الاخت العزيزة وين باقي الدروس جزاكِ الله خيراً اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
islam2007 بتاريخ: 28 يونيو 2007 تقديم بلاغ مشاركة بتاريخ: 28 يونيو 2007 ممتااااااااااااااااااااااااااازة ياريت تكملى وتعملى زى ما الاستاذ الجليل خالد ميجا ما قلك وما تخليش الملل يتسلل اليك ؛ واحنا كلنا فى انتظار دروسك وشكرا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
cattoo بتاريخ: 14 يوليو 2007 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 14 يوليو 2007 numeric_systems.zipالسلام عليكم ورحمة الله وبركاته...شكرا لكم .. عن جد رفعتوا معنوياتي والحمدلله انه في احد استفاد ..اليوم اقدم لكم برنامج تحويل بين الانظمة الرقمية يعني من الثنائي الى اي نظام وبين العشري والثماني والسداس عشر .المهم انكم تفهموا طريقة الدوران الشرطي loop وكذلك if,ifelse ،عمل الدالة trunc ،العمليات الحسابية داخل برنامج.البرنامج به اكثر من Canvas كل منها مرتبط ببلوك بيانات خاص به Data Block ,والكل في نافذة Window واحدة وموضح في البرنامج طريقة الانتقال بين الاسطح Canvases .طبعا عند التنفيذ اكتب اي اسم مستخدم/كلمة مرور لان النظام غير مرتبط باي قاعدة بيانات. 1 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
cattoo بتاريخ: 14 يوليو 2007 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 14 يوليو 2007 list.zipالسلام عليكم...درس اليوم بحث باستخدام List عن طريق رقم واسم الموظف ، يعني اذا كتبت رقم في خانة البحث سيكون نتائج البحث الارقام التي تبتدئ بنفس المقطع واذا كتبت اسم ستكون النتائج اسماء التي تبتدئ بنفس المقطع.مثال اذا ادخلت الحرف S في خانة البحث ستحصل على ناتجين scott , smith اما اذا ادخلت sc ستحصل على ناتج واحد مطابق scott ونفس الشي بالنسبة للارقام .اي يختبر فيما اذا ادخلت رقم يبحث عن الارقام المماثلة او اسم ليبحث عن الاسماء المماثلة . اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
ابوهيثم بتاريخ: 30 أكتوبر 2007 تقديم بلاغ مشاركة بتاريخ: 30 أكتوبر 2007 أختي الكريمة أشكرك على هذا المجهود المميز ولكن أتمنى أن تشرحي زر التعديل بصورة مفصلة أكثر مثل مافعلتي في زر الحذف----------------------بالنسبة للزر الثاني "تعديل" وضيفته هي تعديل سجل موجودوبما ان رقم القسم مفتاح اساسي primary key من الافضل عدم تعديله وذلك لامكانية وجود عدة سجلات في جدول الموظفين مرتبطه بهذا الرقم لذلك عند التعيل سنعمل على تغيير الاسم والموقع فقط.طبعا تبع الحدث when-button-pressedزر التعديل:label:updateالشفرة: begin update dept set dname=:txt_dname,loc=:txt_loc where deptno=:txt_deptno; commit; message('a record has been updated'); end; الشرح:يمكن الاستغنا عن begin , endوهما كم ذكرت للدلالة على بداية ونهاية الكودupdate dept set dname=:txt_dname,loc=:txt_loc where deptno=:txt_deptno;اي عدل الجدول dept وذلك بجعل dname=:txt_dname اي عدل الحقل اسم القسم ليصبح ما هو مكتوب في الكائن txt_dname ,وكذلك بالنسبة للموقع where deptno=:txt_deptnoبشرط ان يكون رقم القسم مساااوي للكائن txt_deptno وذلك حتى لا يقوم بتعديل بيانات الجدول كامل.(عدل السجل الذي يتحقق فيه الشرط المذكور فقط).ثم حفظ التعديل commit;واخيرا نهاية الكود end; اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
ra7l بتاريخ: 3 نوفمبر 2007 تقديم بلاغ مشاركة بتاريخ: 3 نوفمبر 2007 شي جميل وراائع .. واصلي عطائك أختي الكريمه ,, بالتوفيق لك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Ahmed Mahdali بتاريخ: 26 فبراير 2008 تقديم بلاغ مشاركة بتاريخ: 26 فبراير 2008 مشكووووووووووووورييييين يعطيكم الف عافيه والله يزيدكم من علمه اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
abo_sobh2008 بتاريخ: 27 فبراير 2008 تقديم بلاغ مشاركة بتاريخ: 27 فبراير 2008 شكرا جزيلا علي السلوب الرائع ورجو الإستمرار في الكتابهجزاكي الله خيرا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Hussein_laser بتاريخ: 2 مارس 2008 تقديم بلاغ مشاركة بتاريخ: 2 مارس 2008 السلام عليكم ورحمة الله وبركاته أخواتى الكرام لقد أستدت منك كثير جداً والحمد لله اشكركم على هذا المجهود الرائعبارك الله فيكم وأعطاكم من حيث كل ما سألتم وأسال الله العلى القدير أن يعلى شأنكم فى الدينا والأخرة بأذن الله تعالىدمت فى رعاية الله اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.