اذهب إلى المحتوى

البحث في الموقع

المحتوى عن 'صفوف'.

  • ابحث بالكلمات المفتاحية

    أضف وسومًا وافصل بينها بفواصل ","
  • ابحث باسم الكاتب

نوع المحتوى


التصنيفات

  • الإدارة والقيادة
  • التخطيط وسير العمل
  • التمويل
  • فريق العمل
  • دراسة حالات
  • التعامل مع العملاء
  • التعهيد الخارجي
  • السلوك التنظيمي في المؤسسات
  • عالم الأعمال
  • التجارة والتجارة الإلكترونية
  • نصائح وإرشادات
  • مقالات ريادة أعمال عامة

التصنيفات

  • مقالات برمجة عامة
  • مقالات برمجة متقدمة
  • PHP
    • Laravel
    • ووردبريس
  • جافاسكربت
    • لغة TypeScript
    • Node.js
    • React
    • Vue.js
    • Angular
    • jQuery
    • Cordova
  • HTML
  • CSS
    • Sass
    • إطار عمل Bootstrap
  • SQL
  • لغة C#‎
    • ‎.NET
    • منصة Xamarin
  • لغة C++‎
  • لغة C
  • بايثون
    • Flask
    • Django
  • لغة روبي
    • إطار العمل Ruby on Rails
  • لغة Go
  • لغة جافا
  • لغة Kotlin
  • لغة Rust
  • برمجة أندرويد
  • لغة R
  • الذكاء الاصطناعي
  • صناعة الألعاب
  • سير العمل
    • Git
  • الأنظمة والأنظمة المدمجة

التصنيفات

  • تصميم تجربة المستخدم UX
  • تصميم واجهة المستخدم UI
  • الرسوميات
    • إنكسكيب
    • أدوبي إليستريتور
  • التصميم الجرافيكي
    • أدوبي فوتوشوب
    • أدوبي إن ديزاين
    • جيمب GIMP
    • كريتا Krita
  • التصميم ثلاثي الأبعاد
    • 3Ds Max
    • Blender
  • نصائح وإرشادات
  • مقالات تصميم عامة

التصنيفات

  • مقالات DevOps عامة
  • خوادم
    • الويب HTTP
    • البريد الإلكتروني
    • قواعد البيانات
    • DNS
    • Samba
  • الحوسبة السحابية
    • Docker
  • إدارة الإعدادات والنشر
    • Chef
    • Puppet
    • Ansible
  • لينكس
    • ريدهات (Red Hat)
  • خواديم ويندوز
  • FreeBSD
  • حماية
    • الجدران النارية
    • VPN
    • SSH
  • شبكات
    • سيسكو (Cisco)

التصنيفات

  • التسويق بالأداء
    • أدوات تحليل الزوار
  • تهيئة محركات البحث SEO
  • الشبكات الاجتماعية
  • التسويق بالبريد الالكتروني
  • التسويق الضمني
  • استسراع النمو
  • المبيعات
  • تجارب ونصائح
  • مبادئ علم التسويق

التصنيفات

  • مقالات عمل حر عامة
  • إدارة مالية
  • الإنتاجية
  • تجارب
  • مشاريع جانبية
  • التعامل مع العملاء
  • الحفاظ على الصحة
  • التسويق الذاتي
  • العمل الحر المهني
    • العمل بالترجمة
    • العمل كمساعد افتراضي
    • العمل بكتابة المحتوى

التصنيفات

  • الإنتاجية وسير العمل
    • مايكروسوفت أوفيس
    • ليبر أوفيس
    • جوجل درايف
    • شيربوينت
    • Evernote
    • Trello
  • تطبيقات الويب
    • ووردبريس
    • ماجنتو
    • بريستاشوب
    • أوبن كارت
    • دروبال
  • الترجمة بمساعدة الحاسوب
    • omegaT
    • memoQ
    • Trados
    • Memsource
  • برامج تخطيط موارد المؤسسات ERP
    • تطبيقات أودو odoo
  • أنظمة تشغيل الحواسيب والهواتف
    • ويندوز
    • لينكس
  • مقالات عامة

التصنيفات

  • آخر التحديثات

أسئلة وأجوبة

  • الأقسام
    • أسئلة البرمجة
    • أسئلة ريادة الأعمال
    • أسئلة العمل الحر
    • أسئلة التسويق والمبيعات
    • أسئلة التصميم
    • أسئلة DevOps
    • أسئلة البرامج والتطبيقات

التصنيفات

  • كتب ريادة الأعمال
  • كتب العمل الحر
  • كتب تسويق ومبيعات
  • كتب برمجة
  • كتب تصميم
  • كتب DevOps

ابحث في

ابحث عن


تاريخ الإنشاء

  • بداية

    نهاية


آخر تحديث

  • بداية

    نهاية


رشح النتائج حسب

تاريخ الانضمام

  • بداية

    نهاية


المجموعة


النبذة الشخصية

تم العثور على 7 نتائج

  1. سنشرح اليوم أداة من الأدوات المفيدة التي يوفرها مايكروسوفت اكسل؛ والمُتعلّقة بتجميد/تثبيت الأجزاء عند العمل على جداول بيانات كبيرة لتسهيل رؤية أجزاء مختلفة من المصنف في نفس الوقت. يقصد بـ "تجميد الأجزاء" تثبيت جزء معين من ورقة العمل وإبقائه مرئيًا حتى بعد التمرير بأشرطة التمرير الجانبية أو السفلية. وهذا الخاصية مفيدة في أوراق العمل التي تحتوي على جداول بيانات كبيرة. يمكنك مثلا تجميد صف أو عمود العناوين لجدول معين والاحتفاظ بها ثابتة عند التمرير: لتجميد صف (كصف العناوين مثلا)، اذهب إلى تبويب عرض View، واختر تجميد الصف العلوي Freeze Top Row من زر تجميد الأجزاء Freeze Panes: ولتجميد عمود (كعمود العناوين مثلا)، اذهب إلى تبويب عرض، واختر تجميد العمود الأول Freeze First Column من زر تجميد الأجزاء Freeze Panes: لاحظ أنّك عندما تقوم بتجميد العمود الأول يتم إلغاء تجميد الصف العلوي تلقائيا. مع ذلك يمكنك تجميد الصفوف والأعمدة معا في نفس الوقت. لإلغاء تجميد الصف/العمود اختر إلغاء تجميد الأجزاء Unfreeze Panes من زر تجميد الأجزاء Freeze Panes: خيارات التجميديمكنك تجميد الصفوف والأعمدة معا وتجميد عدد من الصفوف وعدد من الأعمدة، وليس صف أو عمود واحد فحسب. لتجميد الصف والعمود في نفس الوقت، حدد الخلية التي تقع أسفل الصف الذي تريد تجميده مباشرة، وبجانب العمود الذي تريد تجميده مباشرة ثم اختر تجميد الأجزاء Freeze Panes من زر تجميد الأجزاء Freeze Panes. في هذا المثال سنحدد الخلية B2، لأنها الخلية التي تجاور الصف 1 مباشرة وتجاور العمود A مباشرة: وبهذه الطريقة سيتم تثبيت كل من الصف والعمود عند التمرير إلى الأسفل أو إلى الجانب. إذا كنت ترغب بتجميد عدد من الصفوف، وعدد من الأعمدة بشرط أن تكون متجاورة، حدد الخلية التي تقع تحت مجموعة الصفوف مباشرة وبجانب مجموعة الأعمدة مباشرة، ثم اختر تجميد الأجزاء Freeze Panes من زر تجميد الأجزاء Freeze Panes. في هذا المثال سنقوم بتجميد الصفين 1 و2، والعمودين A وB، ولذلك سنحدد الخلية C3: ولتجميد عدد من الصفوف دون تجميد الأعمدة حدد أول خلية في العمود A تحت مجموعة الصفوف مباشرة، (وهي الخلية A3 في هذا المثال) ثم اختر تجميد الأجزاء Freeze Panes من زر تجميد الأجزاء: استخدم نفس الطريقة إذا كنت ترغب بتجميد مجموعة من الأعمدة دون تجميد الصفوف. حدد خلية في الصف 1 والتي تجاور مجموعة الأعمدة مباشرة (وهي الخلية D1 في هذا المثال لأننا سنقوم بتجميد الأعمدة الثلاثة الأولى) ثم اختر تجميد الأجزاء Freeze Panes من زر تجميد الأجزاء: وبذلك سيتم تجميد جميع الأعمدة إلى يسار العمود C دون تجميد الصفوف، لأنه لا يوجد صف فوق الصف الأول. يجب أن تأخذ في الاعتبار أنّ زر تجميد الأجزاء يصبح غير مفعلا أثناء تحرير الخلايا، أو عند استخدام طريقة العرض تخطيط الصفحة Page Layout. وكذلك، يمكنك طباعة صفوف أو أعمدة بشكل متكرر في جميع الصفحات وبطريقة مشابهة لطريقة تجميد الأجزاء. على سبيل المثال؛ إذا كنت ترغب بتكرار الصفين العلويين لورقة العمل في جميع الصفحات عند طباعتها، اذهب إلى تبويب تخطيط الصفحة Page Layout وانقر طباعة العناوين Print Titles. في مربع الحوار إعداد الصفحة Page Setup ضع المؤشر في حقل Rows to repeat at top، ومن ورقة العمل حدد الصفوف التي تريد تكرارها، ثم انقر معاينة الطباعة Print Preview وستشاهد أن الصفوف التي قمت بتحديدها ستظهر في الجزء العلوي لجميع الصفحات:
  2. إن تطبيق جداول بيانات جوجل هو عبارة عن تطبيق ويب وأحد مجموعة تطبيقات جوجل درايف المكتبية التي تضم تطبيقت مستندات جوجل وتطبيق العروض التقديمية وغيرها، ويعتبر هذا التطبيق شبيه لبرنامج مايكروسوفت إكسل وبرنامج ليبر أوفيس كالك. وعلى الرغم من أنه لا يقدم جميع ميزات إكسل وكالك المتقدمة، إلا أنه من السهل إنشاء جداول بيانات وتعديلها سواء كانت بسيطة أم معقدّة. إن استخدام تطبيقات جداول بيانات جوجل ليس مقتصرًا على المحاسبين ومستخدمي جداول البيانات المعقدة والمطورين، بل يمكن استخدامها لإنشاء جداول بيانات بسيطة لأمور حياتية يومية كجدول مهام عمل يومية أو حسابات البقالة أو أي شيء آخر يمكنك التفكير فيه، تعد جداول البيانات طريقة رائعة لتنظيم المعلومات. ولإنشاء مستند جدول بيانات جوجل جديد توجه إلى صفحة جوجل درايف الخاصة بك ثم انقر على زر (جديد) أعلى يمين الصفحة ومن القائمة المنبثقة اختر (جدول بيانات Google). وسيتم الآن فتح التطبيق على كامل الصفحة حيث سيظهر بمظهر مشابه إلى حد كبير برامج الإكسل والكالك، حيث شريط القوائم في الأعلى يليه شريط الأدوات الرئيسي ثم حقل جدول بيانات فارغ مع شريط ورقات العمل أسفله. بداية سيكون اتجاه العمل في التطبيق من اليسار لليمين بشكل افتراضي، يمكنك تعديله ليصبح من اليمين إلى اليسار عبر زر في شريط الأدوات أو من القائمة تنسيق > الاتجاه > ورقة من اليمين إلى اليسار ويمكن إعادة اتجاه العمل بذات الطريقة. تم ترميز الأعمدة بالأحرف اللاتينية A, B, C,…. الخ فيما تم ترميز الصفوف بالأرقام 1, 2, 3, …. الخ. ويسمى المستطيل الواحد ضمن هذا الجدول بالخلية، ولكل خلية عنوان وعنوانها هو تقاطع حرف العمود مع رقم الصف التي تتوضع فيه الخلية فعلى سبيل المثال (كما في الصورة التالية) عنوان الخلية التي في الصورة هو B5 وذلك لوجودها ضمن العمود B والصف 5. وكما تعلمنا في درس مستندات جوجل فإن تسمية المستند في جداول بيانات جوجل يتم بنفس الطريقة حيث يكفي النقر على العنوان أعلى صفحة التطبيق ليسمح لنا بتعديل الإسم ومن ثم نكتب الاسم الذي نريده ونضغط Enter أو ننقر بالفأرة في أي مكان آخر ليتم تطبيق التسمية الجديدة على الملف. وكبقية تطبيقات جوجل المكتبية فلا حاجة لحفظ المستند ولا يوجد في الأصل خيار لحفظ المستند إذ أن مستندات جوجل في مختلف التطبيقات تقوم بحفظ التغييرات مباشرة وبشكل تلقائي، ويتم حفظ المستندات المختلفة الناتجة عن تطبيقات جوجل هذه ضمن سحابة جوجل درايف الخاصة بك ولتغيير موضع حفظ المستند ضمن المجلدات التي أنشأتها سابقًا أو قد تود إنشاءها مباشرة في جوجل درايف عليك النقر على أيقونة المجلد الرمادي بجانب عنوان المستند لتحدد الموقع الذي تريد نقل المستند إليه. بالإمكان فتح ملفات برنامج مايكروسوفت إكسل وليبر أوفيس كالك عبر هذا التطبيق عبر القائمة ملف > فتح ومن ثم ستفتح لنا نافذة تسمح لنا باختيار أحد الملفات الموجودة ضمن سحابة جوجل درايف الخاصة بنا وكذلك يمكننا تحميل الملف من حاسوبنا عبر سحبه إلى مساحة التحميل أو البحث عنه يدويًا ليتم حفظ الملف تلقائيًا في سحابة جوجل درايف الخاصة بنا ومن ثم فتحه ضمن التطبيق. وللتعرف أكثر على واجهة التطبيق سنقوم بتسمية عناصر هذه الواجهة: اسم المستند أيقونة جداول بيانات جوجل وتذهب بك عند النقر عليها إلى صفحة البداية للتطبيق والتي تحوي جميع المستندات التي تم إنشاؤها باستخدام التطبيق شريط القوائم التنبيه إلى حفظ المستند بشكل تلقائي باستمرار (لن يتم حفظ المستند تلقائيًا في حال العمل بدون اتصال بالإنترنت) أزرار المشاركة والتعليقات شريط الأدوات والتنسيقات شريط الصيغ والدوال الأعمدة الصفوف الخلية شريط أوراق العمل هذه نظرة أولية على تطبيق جداول بيانات جوجل وسنتابع في الدروس القادمة تفاصيل أكثر حول كيفية استخدام المزايا المختلفة لهذا التطبيق.
  3. الصفوف Tuple الصّفوف نوع من البيانات التسلسليّة تماما مثل القوائم، لكنّ الصفوف غير قابلة للتغيير، يتألّف صفّ من مجموعة من القيّم نفصل بينها بفاصلة "," ولإنشاء صفّ نقوم بإسناد مجموعة من القيّم إلى متغيّر حيث نفصل بين القيم بفاصلة كما في المثال التّالي: >>> a = (1, 2, 3) >>> a[0] 1 ويُمكن أيضاً إنشاء صفّ بدون أقواس: >>> a = 1, 2, 3 >>> a[0] 1 خاصيّة قياس عدد العناصر len وتشريح الصّف ممكن أيضا، وتُطبّق هذه الخاصيّات كما فعلنا مع القوائم في الدّرس السّابق. >>> len(a) 3 >>> a[1:] 2, 3 وبما أن الأقواس تُستعمل للجمع كذلك، فيجب أن تنشئ صفّا من قيمة واحدة مع فاصلة زائدة. >>> a = (1) >> a 1 >>> b = (1,) >>> b (1,) >>> b[0] 1 ويُمكن جمع صفّين في صفّ واحد بحيث يحتوي الصّفّ الجديد على كلّ من عناصر الصفّ الأول والثّاني، فمثلا في البرنامج التّالي قُمنا بالجمع بين الصّف a و الصف b وأسندنا قيمهما إلى الصف c: >>> a = (1,2,3) >>> a (1,2,3) >>> b = ('Hsoub Academy', 'Abdelhadi') >>> b ('Hsoub Academy', 'Abdelhadi') >>> c = a+b >>> c (1, 2, 3, 'Hsoub Academy', 'Abdelhadi') يُمكن أن تحتوي الصفوف على مُختلف أنواع البيانات كذلك (الأرقام، السّلاسل النّصيّة، القيم المنطقيّة…)، ويُمكن -كما الحال مع القوائم- للعناصر النّصيّة أن تكون بين علامتي تنصيص مزدوجتين. انظر المثال: # هذا مثال على إمكانية إسناد قيم من أنواع مختلفة >>> a = ('Hsoub Academy', 'Python', 3, 10, True) >>> a ('Hsoub Academy', 'Python', 3, 10, True) # يمكنك كذلك إنشاء قائمة تحتوي على سلاسل نصيّة بين علامتي تنصيص مُزدوجتين >>> a = ("Hsoub Academy", "Python", 3, 10, True) >>> a ('Hsoub Academy', 'Python', 3, 10, True) إذا أردت إنشاء صفّ يحتوي على قيمة مُكرّرة عدّة مرّات فيُمكنك إنشاء صف من عنصر واحد ثمّ إجراء عمليّة ضرب بعدد المرّات الذي تريده: >>> ('Academy',) * 5 ('Academy', 'Academy', 'Academy', 'Academy', 'Academy') عند كتابة عدّة قيم والفصل بينها بفاصلة دون إحاطة العناصر بأي علامات تجميع كالأقواس وعلامتي []، فإنّها تكون صفوفا بشكل افتراضي، انظر المثال: >>> print 'Hsoub academy', 5, False, 'Abdelhadi' Hsoub academy 5 False Abdelhadi >>> a, b = 1, 2; >>> print "Value of a and b : ", a,b Value of a and b : 1 2 العمليات على الصفوف تُوفّر لنا بايثون عدّة دوال للتّعامل مع الصّفوف وقد ذكرنا الدّالة len وكيفية استخدامها أعلاه. وقد حان الوقت للحديث عن بعض الدوال الأخرى المُساعدة في التّعامل مع الصّفوف: دالة cmp للمُقارنة بين صفين، إذا كان الصّفان مُتساويان فالنّتيجة تكون 0 أمّا إذا كانا مُختلفين فالنّتيجة تطبع القيمة 1 أو القيمة -1 حسب الاختلاف: >>> a = (1, 2, 3) >>> b = (1, 2, 3) >>> cmp(a, b) 0 >>> a = (1, 2, 3) >>> b = (1, 2) >>> cmp(a, b) 1 >>> a = (1, 2, 3) >>> b = (1, 2) >>> cmp(b, a) -1 دالة max لإرجاع أكبر قيمة في صفّ: >>> a = ('Hsoub Academy', 'Abdelhadi') >>> max(a) 'Hsoub Academy' >>> b = (1, 2, 3) >>> max(b) 3 دالة min لإرجاع أصغر قيمة في صفّ: >>> a = ('Hsoub Academy', 'Abdelhadi') >>> min(a) 'Abdelhadi' >>> b = (1,2, 3) >>> min(b) 1 المجموعات Sets المجموعات عبارة عن جمع غير منظّم لقيّم فريدة، بحيث لا تُكرّر قيمة أكثر من مرّة. يُمكن إنشاء مجموعة فارغة وإضافة العناصر لها بالتّابع add، مع مُلاحظة أنّ التّابع add لا يقبل سوى عنصر واحد في كلّ مرة: >>> x = set() >>> x.add(1) >>> x set([1]) >>> x.add(2) >>> x set([1, 2]) >>> x.add("Hsoub Academy") >>> x set(['Hsoub Academy', 1, 2]) ولإضافة عدّة عناصر مرّة واحدة فعليك الاعتماد على التّابع update مع ملاحظة أنّ العناصر المُضافة يجب أن تكون داخل علامتي []: >>> x = set() >>> x.update([1, 3, 5, "Hsoub Academy"]) >>> x set(['Hsoub Academy', 1, 3, 5]) ولحذف عنصر من مجموعة ما، فيُمكنك الاستعانة بالتّابع remove بحيث تُمرّر العنصر الذي ترغب بحذفه: >>> x = set(['Hsoub Academy', 1, 3, 5]) >>> x.remove("Hsoub Academy") >>> x set([1, 3, 5]) أمّا إذا كنت ترغب بحذف جميع عناصر مجموعة ما، فالتّابع clear سيتكفّل بالأمر: >>> x = set(['Hsoub Academy', 1, 3, 5]) >>> x set(['Hsoub Academy', 1, 3, 5]) >>> x.clear() >>> x set([]) ويُمكنك نسخ مجموعة وإسناد المنسوخ إلى مجموعة أخرى بالتّابع copy، في المثال التّالي قمنا بنسخ المجموعة x وأسندنا المنسوخ إلى المجموعة y : >>> x = set(['Hsoub Academy', 1, 3, 5]) >>> x set(['Hsoub Academy', 1, 3, 5]) >>> y = x.copy() >>> y set(['Hsoub Academy', 1, 3, 5]) ويُمكن إنشاء مجموعة بقيّم مُتعدّدة، لاحظ في المثال التّالي أنّ النّاتج مجموعة تحتوي على عناصر فريدة (حُذِف العنصر 1 لأنّه مُكرّر): >>> x = set([3, 1, 2, 1]) set([1, 2, 3]) وهناك طريقة جديدة لإنشاء المجموعات في بايثون 2.7: >>> x = {3, 1, 2, 1} set([1, 2, 3]) ويُمكن أن تُضيف قيمة إلى مجموعة، وذلك بالدّالة add. >>> x = set([1, 2, 3]) >>> x.add(4) >>> x set([1, 2, 3, 4]) يُمكن الجمع بين مجموعتين بالمُعامل | بحيث تكون المجموعة الجديدة مُحتويّة على كلّ من عناصر المجموعتين، في المثال التّالي ننشئ أولا المجموعة x ثمّ ننشئ المجموعة y وبعد ذلك نقوم بتوحيد المجموعتين ونُسند النّتيجة إلى المجموعة x_y : >>> x = set(['Hsoub Academy', 1, 3, 5]) >>> x set(['Hsoub Academy', 1, 3, 5]) >>> y = set(["Dyouri", "Abdelhadi"]) >>> y set(['Dyouri', 'Abdelhadi']) >>> x_y = x | y >>> x_y set([1, 3, 5, 'Abdelhadi', 'Hsoub Academy', 'Dyouri']) وكما في القوائم، يُمكنك أن تتحقّق من وجود قيمة من عدمه بالعامل in، وهذه العمليّة تكون أسرع في المجموعات من القوائم ولكنك لن تستطيع أن ترى فرقا كبيرا إلّا إذا كان عدد العناصر كبيرًا. >>> x = set([1, 2, 3]) >>> 1 in x True >>> 5 in x False القواميس القواميس تُشبه القوائم، الفرق أنّك تستطيع فهرسة العناصر داخل القواميس بأي نوع من القيم، ففي القوائم يُمكنك الوصول إلى القيم فقط عبر الأعداد الصّحيحة مثل []x أما في القواميس فتستطيع الوصول إلى قيّم عبر المفاتيح كالتّالي: أولا ننشئ قاموسا، بحيث تملك كلّ قيمة مفتاحا معيّنا، كمثال المفتاح x يحمل القيمة 1: >>> a = {'x': 1, 'y': 2, 'z': 3} ويُمكنك الوصول إلى القيّم عبر المفاتيح (عوضا عن الأرقام في كما في القوائم): >>> a['x'] 1 >>> a['z'] 3 يُمكنك كذلك إنشاء قاموس فارغ وإسناد المفاتيح والقيّم بعد ذلك: >>> b = {} >>> b['x'] = 2 >>> b[2] = 'foo' >>> b[(1, 2)] = 3 >>> b {(1, 2): 3, 'x': 2, 2: 'foo'} يُمكن تعديل قيمة مفتاح بالطّريقة التّالية: >>> a = {'x': 1, 'y': 2, 'z': 3} >>> a {'y': 2, 'x': 1, 'z': 3} >>> a['y'] = 'Hsoub Academy' >>> a {'y': 'Hsoub Academy', 'x': 1, 'z': 3} في المثال أعلاه غيّرنا قيمة المفتاح y من القيمة 2 إلى القيمة Hsoub Academy. ويُمكن إضافة مفاتيح وقيم جديدة كذلك: >>> a = {'x': 1, 'y': 2, 'z': 3} >>> a {'y': 2, 'x': 1, 'z': 3} >>> a['w'] = 'Hsoub Academy' >>> a {'y': 2, 'x': 1, 'z': 3, 'w': 'Hsoub Academy'} يُمكنك حذف العناصر باستخدام del كالتّالي: >>> a = {'x': 1, 'y': 2, 'z': 3} >>> del a['x'] >>> a {'y': 2, 'z': 3} ويُمكنك حذف جميع مُكوّنات قاموس بالتّابع clear كالتّالي: >>> a = {'x': 1, 'y': 2, 'z': 3} >>> a {'y': 2, 'x': 1, 'z': 3} >>> a.clear() >>> a {} ويُمكن كذلك حذف القاموس بأكمله: >>> a = {'x': 1, 'y': 2, 'z': 3} >>> a {'y': 2, 'x': 1, 'z': 3} >>> del a >>> a Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'a' is not defined في المثال أعلاه، حاولنا أن نصل إلى القاموس a بعد حذفه لذلك أرجع المُفسّرُ خطأ مفاده بأنّ a غير موجود. الدّالة keys تُرجع جميع المفاتيح الموجودة في قاموس، وبالطّريقة نفسها يُمكن إرجاع جميع قيّم قاموس ما باستعمال values ، أمّا إن أردت إرجاع القيم والمفاتيح الموجودة في قاموس فيُمكنك استعمال items : >>> a.keys() ['x', 'y', 'z'] >>> a.values() [1, 2, 3] >>> a.items() [('x', 1), ('y', 2), ('z', 3)] ويُمكن استعمال حلقة for للتّقدّم في القاموس واستخراج القيّم والمفاتيح: >>> for key in a: ... print key ... x y z >>> for key, value in a.items(): ... print key, value ... x 1 y 2 z 3 يُمكن التحقق من تواجد مفتاح على قاموس باستخدام عامل in أو دالة has_key. >>> 'x' in a True >>> 'p' in a False >>> a.has_key('x') True >>> a.has_key('p') False يُمكن كذلك الاعتماد على كلّ من get و setdefault بحيث الأولى تقوم بعرض قيمة مفتاح إذا كان موجودا وإذا لم يكن موجودا فترجع القيمة الافتراضيّة والتّي توضع كعامل Parameter ثان. انظر المثال لتفهم قصدي: >>> d = {'x': 1, 'y': 2, 'z': 3} >>> d.get('x', 5) 1 لقد أرجع السّطر السّابق القيمة (1) رغم أنّنا حدّدنا قيمة افتراضيّة (5) وذلك لأن المفتاح موجود ويحمل قيمة مُسبقا. >>> d.get('p', 5) 5 في المثال أعلاه، أرجعت الدّالة get القيمة (5) وذلك لأنّ المفتاح p غير موجود أصلاً. و setdefaul تقوم بوضع قيمة افتراضيّة لمفتاح إذا لم يكن موجودا. >>> d.setdefault('x', 0) 1 >>> d {'x': 1, 'y': 2, 'z': 3} >>> d.setdefault('p', 0) 0 >>> d {'y': 2, 'x': 1, 'z': 3, 'p': 0} يُمكن استخدام القواميس لتمثيل السّلاسل النّصيّة عبر المفاتيح، حيث يُستبدَلُ المفتاح بقيمته: >>> 'hello %(name)s' % {'name': 'python'} 'hello python' >>> 'Chapter %(index)d: %(name)s' % {'index': 2, 'name': 'Data Structures'} 'Chapter 2: Data Structures' ملاحظة حول المفاتيح لا يمكن أن تُسند لمفتاح واحد أكثر من قيمة، إذا حاولت أن تُسند قيمتين لأكثر من مفتاح، فإنّ آخر قيمة تكون قيمة المفتاح في النّهاية: >>> a = {'FirstName': 'Abd', 'LastName':'Dyouri', 'Job':'Writer', 'FirstName':'Abdelhadi'} >>> a {'LastName': 'Dyouri', 'Job': 'Writer', 'FirstName': 'Abdelhadi'} >>> a['FirstName'] 'Abdelhadi' يُمكن الجمع بين قاموسين في قاموس واحد بالتّابع update، مع تمرير القاموس الثّاني، في المثال التّالي، أنشأنا قاموسا a ثمّ أنشأنا القاموس b، بعد ذلك حدّثنا القاموس a واضعين فيه مُكونات القاموس b فأصبح في الأخير يحمل جميع مكونات القاموسين : >>> a = {'FirstName': 'Abd', 'LastName':'Dyouri', 'Job':'Writer', 'FirstName':'Abdelhadi'} >>> a {'LastName': 'Dyouri', 'Job': 'Writer', 'FirstName': 'Abdelhadi'} >>> b = {'Website':'Hsoub Academy', 'Language':'Arabic'} >>> b {'Website': 'Hsoub Academy', 'Language': 'Arabic'} >>> a.update(b) >>> a {'Website': 'Hsoub Academy', 'LastName': 'Dyouri', 'Job': 'Writer', 'Language': 'Arabic', 'FirstName': 'Abdelhadi'} تطبيق حول القواميس لننشئ تطبيقا بسيطا لتحويل الأرقام إلى كلمات في لغة بايثون، بحيث يكون لكلّ رقم كلمة تُقابله، افتح ملفّا واحفظه باسم dict.py واكتب فيه الشيفرات التّالية، اقرأ التّعليقات لتفهم الشّيفرة: # -*- coding: utf-8 -*- # طباعة اسم التّطبيق print 'Dictionary Version 1.0.0' # تعريف القاموس وتعيين القيم له dict = { 1:'One', 2:'Two', 3:'Three', 4:'Four', 5:'Five' } # الدّوران حول قيم ومفاتيح القاموس وطباعتها for key in dict: print key , 'in English is :' , dict[key] مُخرجات التطبيق (بعد حفظ الملفّ وتنفيذه) ستكون كالتّالي: Dictionary Version 1.0.0 1 in English is : One 2 in English is : Two 3 in English is : Three 4 in English is : Four 5 in English is : Five يُمكنك أن تعدّل في الشّيفرة كما تشاء، ويُمكنك إضافة المزيد من القيم، الأمر يعود لك. تمارين تمرين 1 اجمع قيم الصّفين التّاليين وضعها في صفّ باسم c: a = ('One','Two','Three') b = ('Hsoub Academy', 'Abdelhadi') تمرين 2 أحذف القيمة HTML من المجموعة x في الشّيفرة التّاليّة: x = set(['Ruby', 'Python', 'HTML', 'Perl']) تمرين 3 قم بتطبيق تعلّماتك لتنشئ برنامجا يعرض كلّ دولة عربية واختصارها، مثلا دولة المغرب اختصارها MA ومصر اختصارها EGY. بحيث تكون نتيجة البرنامج شيئا يبدو كالتّالي: Morocco: MA Egypt: EGY ترجمة -وبتصرف- للكتاب Python Practice Book لصاحبه Anand Chitipothu.
  4. تعرّفنا في الدرس السابق على Calc، معالج البيانات والجداول الحسابية منLibreOffice، وتطرقنا إلى أهم الوظائف والخصائص التي يوفرها، كتخزين البيانات، تحليلها، وإجراء العمليات الحسابية البسيطة والمعقدة عليها. كما تعرفنا على أقسام واجهة البرنامج وكيفية إنشاء، فتح، وحفظ جداول البيانات عليه. سنتعلم في هذا الدرس كيف نتعامل مع جدول البيانات وما يتكون منه من أوراق، صفوف، أعمدة، وخلايا. التنقل ضمن جدول البيانات يوفر كالك مجموعة طرق للتنقل ضمن جدول البيانات، من خلية إلى خلية، ومن ورقة إلى ورقة، ويمكنك اختيار الطريقة التي تناسبك. التنقل بين الخلايا لإجراء أي تغيير داخل جدول البيانات، كإدخال البيانات أو كتابة الصيغ، النسخ واللصق، أو حتى التنقل بين الخلايا، يجب أولًا أن نحدد خلية معينة. ويمكننا أن نستدل على الخلية المحددة من خلال حدودها، فإذا كان الحد عريضًا وباللون الأسود فهذا يعني أنها محددة ومفعلة، والشيء نفسه ينطبق على نطاق الخلايا، إذ ستُظلّل الخلايا المحددة ضمن النطاق باللون الأزرق. نتنقل بعد تحديد الخلية بين الخلايا بإحدى الطرق التالية: باستخدام الفأرة: للانتقال إلى خلية معينة وتحديدها، ببساطة انقر مرة واحدة بزر الفأرة الأيسر على تلك الخلية. باستخدام مرجع الخلية: قم أولًا بمسح اسم/مرجع الخلية من مربع الاسم في شريط الصيغة، ثم اكتب اسم الخلية التي تريد تحديدها في المربع واضغط على مفتاح Enter من لوحة المفاتيح. هذه الطريقة مفيدة على وجه الخصوص عندما ترغب في تحديد خلية بعيدة ليست ضمن نطاق شاشتك (كالخلية Z150 مثلًا)، وفي هذه الحالة لن تضطر إلى التمرير نزولًا وإلى اليسار للوصول على الخلية. باستخدام لوحة المفاتيح: لوحة المفاتيح هي أسهل وأسرع طريقة للتنقل بين الخلايا. يمكنك استخدام المفتاح Enter للانتقال إلى الأسفل إلى الصف التالي في العمود، والمفتاحين Enter + Shift للعودة إلى الأعلى إلى الصف السابق في العمود. اضغط على المفتاح Tab للانتقال إلى الخلية التالية إلى اليمين من الخلية المحددة، وللانتقال إلى اليسار من الخلية المحددة اضغط على المفتاحين Tab + Shift. كما يمكنك استخدام مفاتيح الأسهم للانتقال إلى اليمين، اليسار، الأعلى، أو الأسفل. باستخدام مربع الحوار Navigator: انقر على أيقونة المتصفح من الشريط الجانبي أو اضغط على مفتاح F5 لفتح مربع الحوار _ المتصفّح Navigator_، ثم اكتب عنوان العمود ورقم الصف للخلية التي تريد الانتقال إليها في حقلي العمود Column والصّف Raw__ على التوالي، وأخيرًا اضغط على Enter للانتقال إلى تلك الخلية. التنقل بين أوراق العمل تكون كل ورقة في جدول البيانات مستقلة عن الأوراق الأخرى، بالرغم من ذلك يمكن ربط مراجع الخلايا بين ورقة وأخرى عند كتابة الصيغ. لذا توجد أكثر من طريقة للتنقل بين الأوراق لاختصار الوقت عند كتابة الصيغ: باستخدام مربع الحوار المتصفّح Navigator: افتح مربع الحوار _ المتصفّح Navigator_ بنفس الطريقة المذكورة أعلاه، ثم انقر نقرا مزدوجًا على أي ورقة من تلك المدرجة تحت مجموعة أوراق. باستخدام لوحة المفاتيح: عند الضغط على مفتاحي الاختصار Ctrl + Page Down سيتم الانتقال إلى الورقة التالية، وعند الضغط على مفتاحي الاختصار Ctrl + Page Up سيتم الرجوع إلى الورقة السابقة. ملحوظة: يوجد الزران Page Down وPage Up عادة إلى جانب الأسهم في لوحة المفاتيح ويُستخدمان لتمرير المعروض على الشاشة بمسافة صفحة كاملة، بدلا من سطر كما تفعل الأسهم التي تشير إلى الأعلى أو الأسفل. باستخدام الفأرة: ببساطة، انقر على لسان تبويب الورقة في الجزء السفلي من جدول البيانات لتحديد الورقة المرغوبة. ملاحظة: إذا كان عدد الأوراق كبيرًا جدًا، ولا يمكن أن تظهر تبويبات الأوراق كلّها في الشريط السفلي من جدول البيانات، فيمكنك استخدام الأسهم على الشريط نفسه للتنقل بين الأوراق. تحديد العناصر ضمن جدول البيانات تحديد الخلايا كما أسلفنا الذكر، لا يمكن إجراء أي تغيير على الخلية ما لم نقم بتحديدها أولًا، ويمكن أن نحدد خلية مفردة، أو نطاق خلايا متجاورة أو متفرقة. لتحديد خلية واحدة ضمن الورقة، انقر على الخلية مرة واحدة بزر الفأرة الأيسر، وللتحقق من أنّك حددت الخلية المرغوبة، انظر إلى مربع الاسم الذي سيعرض لك مرجع الخلية المحددة. ولتحديد نطاق الخلايا باستخدام الفأرة، انقر بزر الفأرة الأيسر على الخلية التي ترغب في أن تكون بداية النطاق، ثم اسحب الفأرة وافلتها عند الخلية التي ترغب في أن تكون نهاية النطاق. أما إذا كنت تريد استخدام لوحة المفاتيح، فانقر أولًا على الخلية التي ستكون إحدى زوايا النطاق، اضغط على مفتاح Shift، ومع الاستمرار بالضغط انقر على الخلية التي ستكون الزاوية الأخرى المقابلة في النطاق. هذه الطريقة هي لتحديد نطاق من الخلايا المتجاورة، أمّا لتحديد نطاق من الخلايا غير المتجاورة، فعليك أولًا تحديد خلية أو نطاق خلايا بإحدى الطرق المذكورة أعلاه، اضغط على مفتاح Ctrl، ومع الاستمرار بالضغط حدد الخلية أو نطاق الخلايا التي تريد إضافتها إلى التحديد الأول. وبإمكانك تكرار التحديد بهذه الطريقة أكثر من مرة. تحديد الأعمدة والصفوف لتحديد صف أو عمود مفرد، انقر بزر الفأرة الأيسر على عنوان ذلك الصف أو العمود. لتحديد مجموعة متجاورة من الصفوف أو الأعمدة، حدد العمود/الصف الأول في المجموعة، اضغط على مفتاح Shift، ومع الاستمرار بالضغط حدد العمود/الصف الأخير في المجموعة. أمّا إذا كانت مجموعة الأعمدة أو الصفوف غير متجاورة، ففي هذه الحالة انقر على العمود/الصف الأول في المجموعة، اضغط على مفتاح Ctrl، ومع الاستمرار بالضغط حدد الأعمدة أو الصفوف الأخرى، علمًا أنّه يمكن تحديد أعمدة وصفوف غير متجاورة معًا وفي نفس الوقت. وأخيرًا، لتحديد الورقة برّمتها، بما فيها من صفوف وأعمدة وخلايا، انقر على المربع الصغير الذي يقع عند تقاطع عناوين الأعمدة والصفوف. تحديد الأوراق لتحديد ورقة مفردة، انقر على لسان تبويب تلك الورقة في الجزء السفلي من مساحة العمل، ويمكن أن نستدل على الورقة المحددة من لون لسان التبويب الذي يتحول إلى الأبيض عند تحديدها. ولتحديد مجموعة أوراق متجاورة، انقر على لسان تبويب الورقة الأولى، اضغط على مفتاح Shift، ومع الاستمرار بالضغط انقر على لسان تبويب الورقة الأخيرة. وهذا الخيار مفيد عندما ترغب في تطبيق تغييرات معينة على عدد من الأوراق دفعة واحدة. أمّا لتحديد مجموعة من الأوراق غير المتجاورة، انقر على لسان تبويب الورقة الأولى، اضغط على مفتاح Ctrl، ومع الاستمرار بالضغط، انقر على ألسنة تبويب الأوراق الأخرى. وأخيرًا، لتحديد كل الأوراق في جدول البيانات، انقر بزر الفأرة الأيمن على لسان تبويب إحدى الأوراق واختر تحديد كافة الأوراق Select All Sheets. إدراج وحذف الأعمدة/الصفوف إذا احتجت عند العمل على جداول كالك إلى إدراج صف بين صفين من البيانات، حدد الصف الذي ترغب في إدراج الصف الجديد عنده، ثم انقر بزر الفأرة الأيمن على عنوانه واختر أدرج صفوف لأعلى أو أدرج صفوف لأسفل. طبّق نفس الخطوات لإدراج عمود جديد، بتحديد العمود والنقر على عنوانه بزر الفأرة الأيمن ثم اختيار أدرج أعمدة لليسار أو أدرج أعمدة لليمين. وبالمثل، يمكنك حذف الصف/العمود بتحديده ثم النقر على عنوانه بزر الفأرة الأيمن واختيار حذف صفوف/حذف أعمدة. ملاحظة: بإمكانك حذف مجموعة صفوف/أعمدة متفرقة بالضغط على المفتاح Ctrl أثناء تحديدها ومن ثم حذفها بالطريقة المذكورة أعلاه. إدراج، نقل/نسخ، وحذف الأوراق لإدراج ورقة جديدة، انقر على لسان تبويب إحدى أوراق جدول البيانات، أو على أيّ جزء فارغ في منطقة تبويبات الأوراق، ثم اختر إدراج ورقة. سيُفتح مربع الحوار إدراج ورقة، ومنه يمكنك تحديد موضع الورقة التي تريد إدراجها (قبل أو بعد الورقة الحالية)، تحديد عدد الأوراق التي تريد إدراجها، وتسميتها. عدّل الخيارات ثم انقر على حسنًا. إذا رغبت في نقل الورقة أو نسخها من جدول بيانات إلى آخر، انقر على لسان تبويب الورقة بزر الفأرة الأيمن واختر انقل الورقة أو انسخها. حدّد من مربع الحوار نقل/نسخ الورقة الإجراء الذي تريد القيام به، نقل Move، أو نسخ Copy. حدّد من قائمة المكان Location جدول البيانات الذي تريد نقل الورقة إليه. يمكنك نقلها إلى جدول بيانات مفتوح حاليًا، أو إلى جدول بيانات جديد. بعد ذلك حدد موضع الورقة من قسم إدراج قبل Insert before ثم أدخل اسم الورقة في حقل _ اسم جديد New name_ وانقر على حسنًا. لحذف ورقة ما من جدول البيانات، انقر على لسان التبويب الخاص بها بزر الفأرة الأيمن واختر احذف الورقة، علمًا أنّه بإمكانك حذف أكثر من ورقة بالضغط على مفتاح Ctrl أثناء التحديد، ومن ثم حذفها بنفس الطريقة سالفة الذكر. بهذا نكون قد وصلنا إلى نهاية الدرس. في الدرس القادم سنتعرف على كيفية إدخال البيانات على جداول كالك. ترجمة- بتصرّف - لدليل المستخدم الخاص بالحزمة المكتبية LibreOffice.
  5. سنتعرّف في هذا الدرس على الجداول في تطبيق مستندات جوجل ولنتعّرف عليها بشكل أفضل سنقوم بتطبيق عملي عبر إنشاء سيرة ذاتية باستخدام الجداول. لإدراج جدول في المستند إذهب إلى القائمة إدراج > جدول أو من القائمة جدول > إدراج جدول وبذات الطريقة المتبعة في برامج الوورد والرايتر يمكنك سحب مؤشر الفأرة فوق شكل الجدول المُصغّر ضمن القائمة لاختيار عدد الصفوف والأعمدة المراد إدراجها ضمن الجدول. في تطبيقنا العملي هذا سنقوم مبدئيًّا بإدراج جدول مؤلف من أربعة أعمدة وعشرة صفوف. سيظهر لنا الجدول بعرض صفوف يصل كامل عرض المستند وارتفاع أعمدة افتراضي يعادل سطرًا كتابيًا واحدًا. وللجدول حدود داخلية وخارجية متماثلة بحجم 1 نقطة. سنكتب الآن اسم صاحب السيرة الذاتية في الخلية الأولى وسيكون على سبيل المثال محمد محمد. يمكننا تطبيق تنسيقات النص المختلفة على الإسم وبما أنه محور هذا المستند فيجب أن يكون عريضًا (غامق) وبحجم أكبر قليلًا. وفي الخلية التي تحتها سندرج صورة صاحب السيرة الذاتية عبر القائمة إدراج > صورة ثم حمّل الصورة التي في حاسوبك أو الموجودة ضمن سحابة جوجل الخاصة بك أو من أي من الطرق المتوفرة لإدراج الصور. في مثالنا هذا سنقوم لاحقًا بتعديل لون خلفية الخلية لذلك من الأفضل استخدام صورة بتنسيق PNG ذات الخلفية الشفافة. يمكننا تعديل حجم الصورة في حال كانت أكبر من اللازم عبر تحديدها واستخدام أدوات تعديل الحجم في إطار الصورة. سننتقل إلى فقرة تحديد المعلومات الشخصية، وسنترك الصف الأول فارغًا وننتقل إلى الصف الثاني من العمود الثاني. سنكتب جملة المعلومات الشخصية. كما نشاهد في الصورة السابقة فإن ارتفاع الصف الثاني كبير وذلك لوجود الصورة الشخصية في الخلية الأولى من هذا الصف ولحل هذه المسألة سنقوم بدمج مجموعة خلايا لتتسع لمساحة الصورة وتُبقي على ارتفاع خلية المعلومات الشخصية طبيعيًا. حدّد خلية الصورة مع ثلاث خلايا تحتها ثم انقر بالزر الأيمن للفأرة عليها واختر دمج الخلايا ليتم دمج هذه الخلايا الأربعة في خلية واحدة، وهكذا تتم عملية دمج الخلايا حيث يتوجب علينا أولًا تحديد الخلايا الواجب دمجها ثم النقر عليها بالزر الأيمن للفأرة ومن ثم اختيار الخيار دمج الخلايا. أصبح ارتفاع خلية المعلومات الشخصية طبيعيًا وسنتابع الآن. سنضع المعلومات الشخصية في الخلية التي تحت خلية عنوان الفقرة. بعد أن كتبنا المعلومات الشخصية في الخلية نلاحظ أن ارتفاع الخلية يزداد بازدياد عدد الأسطر ولكن عرض الخلية ثابت وهو ليس كافيًا لهذه المعلومات لذلك سنقوم بدمج هذه الخلية مع الخلية التي بجوارها إلى الجهة اليسرى من ذات الصف. سنضيف باقي المعلومات بذات الطريقة في الخلايا التالية بحيث نضع عنوان الفقرة في خلية منفصلة والتفاصيل في الخلية التي تحتها مباشرة. في حال أردنا إضافة معلومات أخرى فيمكننا إضافة صفوف إضافية أو حتى أعمدة إضافية عبر النقر على الجدول بالزر الأيمن للفأرة واختيار الخيارات الخاصة بالإضافة. في درسنا هذا سنكتفي بهذه المعلومات وسنقوم بحذف الصفوف الأخيرة مع ترك صف واحد فقط في الأسفل. حدّد الصفوف المراد حذفها وانقر بالزر الأيمن واختر حذف صفين . سنقوم بتنسيق الخلايا لإنهاء تصميم السيرة الذاتية. حدّد العمود الأول كاملًا ثم انقر على أيقونة لون الخلفية في شريط الأدوات واختر لونًا لخلفية هذه الخلايا. الآن حدّد خلايا عناوين الفقرات مع الخلايا المجاورة لها من جهة اليسار ثم امنحها نفس لون الخلفية. حدّد الآن النصوص ضمن الخلايا التي عدلنا لون خلفيتها واحدًا تلو الآخر، وطبّق عليه تنسيق ألوان بحيث يكون لون التمييز مطابقًا للون خلفية الخلية، وبما أننا اخترنا لونًا داكنًا للخلفية سيتوجب علينا اختيار لون فاتح للنص. قم بتنسيق النصوص كما يجب، بحيث تكون عناوين الفقرات غامقة وأكبر حجمًا وكذلك عناوين المسمّيات ضمن التفاصيل. سنقوم الآن بإلقاء نظرة على خصائص الجدول حيث سنقوم بإزالة الحدود والأطر للجدول. انقر بالزر الأيمن على الجدول واختر خصائص الجدول. أول خيار في الخصائص هو إطار الجدول حيث نستطيع تغيير لونه وحجمه، وفي تصميمنا لا نحتاج لهذا الإطار، لذلك سننقر على أيقونة الحجم ونختار القيمة صفر. وباقي الخيارات هي للون خلفية الخلية حيث يمكنك تحديده من هنا ايضًا و تحديد المحاذاة الرأسية للخلية إن كانت للأعلى أو الوسط أو الأسفل وترتيب العمود من اليمين لليسار أو العكس وأبعاد الصف أو العمود بوحدة القياس الافتراضية أو يمكنك تركها بدون تفعيل لتحصل على أبعاد افتراضية بحسب حجم البيانات بداخل الخلايا كما نستطيع تحديد محاذاة الجدول وتحديد المسافة البادئة.بعد إلغاء (الإطار) سنحصل على الصفحة التالية. يبدو تصميم السيرة الذاتية جيدًا. طبعًا ستحتاج في الحالة الواقعية إلى إضافة معلومات أكثر، كوسائل الاتصال المتوفرة ومستوى القدرات والإمكانات واللغات وغيرها، ويمكنكم القيام بذلك واختبار قدراتكم في إنشاء وتخصيص وتعديل الجداول في تطبيق مستندات جوجل. وبما أن هذه سيرة ذاتية سيتم طباعتها أو إرسالها إلى جهة معينة فمن الأفضل حفظها بهيئة PDF من خلال القائمة ملف > تنزيل بتنسيق > مستند PDF (بتنسيق .pdf) وبذلك سيتم تحميل ملف PDF جاهز إلى حاسوبك لطباعته أو إرساله إلى الجهة المعنية. الصورة الشخصية للسيرة الذاتية (الأفتار) محفوظة الحقوق لـ Freepik
  6. التعامل مع جداول البيانات المختلفة يتطلب مرونة في التحكّم بطرق عرض هذه الجداول. ففي بعض الأحيان يكون الجدول كبيرًا جدًا ويصعب تتبع ومقارنة البيانات الموزّعة في أماكن متباعدة عليه، وفي أحيان أخرى تستلزم كتابة الصيغ تحديد قيم مدخلة على أوراق متفرقة، لذا سنغطي في هذا الدرس بعض الخصائص والخيارات التي يوفرها كالك لتسهيل عرض جداول البيانات والعمل عليها. تغيير طريقة عرض جدول البيانات بإمكانك استخدام خاصية التقريب Zoom (التكبير والتصغير) لعرض عدد أقل أو أكبر من الخلايا في النافذة عندما تعمل على جداول البيانات. انقر على زر (+) في شريط الحالة لعرض الخلايا بحجم أكبر وعدد أقل، أو على زر (-) لعرضها بحجم أصغر وعدد أكبر: يتوفر أيضًا خياران للتحكم بطريقة العرض بشكل سريع، أحدهما لتصغير الخلايا إلى الحد الذي تُعرض فيه الصفحة (وليس الورقة) كاملة، والآخر لتكبير الخلايا إلى أن يتناسب عرض الصفحة مع عرض النافذة. ويمكنك تطبيق ذلك بالنقر بزر الفأرة الأيمن على نسبة التقريب في شريط الحالة واختيار صفحة كاملة أو عرض الصفحة على التوالي: ويمكنك العودة بشكل سريع إلى طريقة العرض الاعتيادية بالنقر على الخيار المنظور الأمثل Optimal View من نفس القائمة. من الخيارات الأخرى المتوفرة لتغيير طريقة عرض الجدول هو إخفاء خطوط الشبكة، وهي الحدود الفاصلة بين الخلايا، علمًا أنّ هذه الحدود وهمية ولا تظهر أثناء الطباعة. يمكنك القيام بذلك بالذهاب إلى قائمة عرض وإلغاء تأشير الخيار خطوط الشبكة للورقة في حال كنت تفضل العمل على مساحة بيضاء فارغة: يمكن أيضًا إخفاء عناوين الأعمدة والصفوف بإلغاء تأشير الخيار ترويسة الأعمدة والصفوف من قائمة عرض: من نفس القائمة بإمكانك تأشير الخيار إظهار الصيغة لعرض الصيغ في الخلايا بدلًا من الناتج، وهذا الخيار مفيد إذا كنت تريد مراجعة صيغة معينة، حيث سيكون العثور عليها سهلًا بهذه الطريقة بدلًا من النقر على الخلايا وقراءة الصيغ في شريط الصيغة: للعودة إلى الوضع الافتراضي وعرض النتيجة بدلًا من الصيغة، قم بإلغاء تأشير الخيار إظهار الصيغة. تجميد الصفوف والأعمدة التجميد يعني قفل عدد من الصفوف في أعلى جدول البيانات أو عدد من الأعمدة في الجهة اليمنى من جدول البيانات أو كليهما معًا، مما يتيح إبقاء هذه الصفوف والأعمدة ثابتة في أماكنها حتى عند التمرير نزولًا أو إلى اليسار، كما توضّح الصورة أدناه: هذه الخاصية مفيدة عند استعراض جداول البيانات الكبيرة، والتي يتجاوز طولها وعرضها حجم النافذة، فتسهل مقارنة البيانات في الصفوف والأعمدة. لتجميد العمود الأول فقط أو الصف الأول فقط، اذهب إلى عرض> جمّد الخلايا> جمّد العمود الأول/جمد الصف الأول: أما إذا رغبت في تجميد عمود وصف في نفس الوقت، أو أكثر من عمود وأكثر من صف، قم بتحديد الخلية التي تقع مباشرة تحت الصف الذي تريد تجميده ومباشرة على يسار العمود الذي تريد تجميده، ثم اذهب إلى عرض> جمّد الخلايا> جمّد الصفوف والأعمدة: على سبيل المثال، لتجميد الصف الأول والثاني والعمود A وB، نحدد الخلية C3 لأنها تقع بعد العمود B والصف 2 مباشرة: عندما نطبق أمر التجميد، سيظهر خط أسود اللون (أفقي أو عمودي، أو الإثنين معًا) يشير إلى حدود التجميد: لإلغاء تجميد الصفوف والأعمدة، اذهب إلى عرض> جمّد الخلايا، ثم قم بإلغاء تأشير الخيار جمّد الصفوف والأعمدة. تقسيم النافذة يمكن أن نغير طريقة عرض جدول البيانات باستخدام خاصية تقسيم النافذة أيضًا. فهذه الخاصية تتيح تقسيم النافذة أفقيًا، عموديًا، أو بالاتجاهين معًا، مما يسمح بعرض ما يصل إلى 4 أجزاء من جدول البيانات في نفس الوقت. خاصية تقسيم النافذة مفيدة في جداول البيانات الكبيرة على وجه الخصوص. على سبيل المثال، إذا أدرت كتابة صيغة في خلية، وهذه الصيغة تعتمد على قيم البيانات في ثلاث خلايا أخرى متفرقة في أنحاء المستند الكبير، في هذه الحالة يمكنك عرض الخلية التي تريد كتابة الصيغة فيها في أحد أقسام النافذة، والخلايا المتبقية في الأقسام الأخرى، الأمر الذي يجعل تحديد الخلايا أثناء كتابة الصيغة أسرع وأسهل من الطرق الأخرى. لتقسيم النافذة أفقيًا أو عموديًا، انقر على عنوان الصف الذي يقع تحت الصفوف التي تريد تقسيم النافذة أفقيًا عندها، أو انقر على عنوان العمود الذي يقع على اليسار من الأعمدة التي تريد تقسيم النافذة عموديًا عندها، ثم اذهب إلى عرض> اقسم النافذة: على سبيل المثال، إذا رغبنا في تقسيم النافذة عند الصف 6، ننقر على عنوان الصف 7 ثم نذهب إلى عرض> اقسم النافذة: الفرق بين التجميد وتقسيم النافذة هو أنّه في الأخير لا يتم تثبيت جزء معين من جدول البيانات، وإنّما تبقى الصفوف والأعمدة قابلة للتحريك، وكأننا قمنا بفتح جدول البيانات مرتين في نفس النافذة (كما موضح في الصورة أعلاه). أمّا لتقسيم الشاشة أفقيًا وعموديًا في نفس الوقت، قم بتحديد الخلية التي تقع مباشرة تحت الصف الذي تريد تقسيم الشاشة عنده، ومباشرة على يسار العمود الذي تريد تقسيم الشاشة عنده، ثم اذهب إلى عرض> اقسم النافذة. على سبيل المثال، إذا رغبنا في تقسيم الشاشة بعد الصف 4 وبعد العمود D، نحدد الخلية E5 ثم نطبق أمر التقسيم: سيتم تقسيم النافذة إلى أربعة أجزاء، وكل منها يكون قابل للتحريك بشكل مستقل عن الأجزاء الأخرى. لإزالة التقسيم، اذهب إلى قائمة عرض ثم قم بإلغاء تأشير الخيار اقسم النافذة. أو اسحب خطوط التقسيم إلى الأعلى أو اليسار لإزالتها: فتح أكثر من نافذة لنفس جدول البيانات فتح أكثر من نافذة لنفس الجدول البيانات من الخيارات المفيدة عند كتابة الصيغ التي تتضمن مدخلات موزّعة على أكثر من ورقة. مثلا، إذا رغبنا في إنشاء صيغة جمع في الورقة الأولى لجمع القيم المدخلة في الورقة الثانية، نقوم بفتح نافذة جديدة لنفس جدول البيانات، ونعرض الورقة الأولى في إحدى النوافذ، والورقة الثانية في النافذة الأخرى ثم نبدأ بإنشاء الصيغة. للقيام بذلك، اذهب إلى نافذة> نافذة جديدة: بعد ذلك قم بترتيب النافذتين بشكل أفقي أو عمودي ضمن حدود الشاشة، علمًا أنّه بإمكانك فتح العدد الذي تريده من النوافذ: يختلف فتح النوافذ الجديدة عن خاصية تقسيم الشاشة في أنّ الخيار الأخير يُطبّق على الورقة فقط وليس على جدول البيانات برمّته؛ أي يتم تقسيم الورقة الواحدة إلى 4 أقسام كحد أقصى وسيكون بإمكاننا عرض أماكن مختلفة من الورقة في نفس الوقت على أن تكون ضمن تلك الورقة فقط. تغيير اتجاه الورقة الاتجاه الافتراضي للأوراق في النسخة العربية من كالك هو من اليمين إلى اليسار، فإذا كنت تفضل العمل على الأوراق باتجاه من اليسار إلى اليمين، انقر بزر الفأرة الأيمن على لسان تبويب الورقة التي تريد تغيير اتجاهها ثم قم بإلغاء تأشير الخيار الورقة من اليمين إلى اليسار: سيتم قلب الورقة وتحويل عناوين الصفوف إلى جهة اليسار وبدء عناوين الأعمدة من اليسار إلى اليمين أيضًا، علمًا أنّ هذا الخيار يطبق على الورقة الحالية فقط وليس على أوراق جدول البيانات الأخرى، إذ سيكون عليك تغيير اتجاهها كل ورقة على حدة. ترجمة-وبتصرّف-لدليل المستخدم الخاص بالحزمة المكتبية LibreOffice
  7. رؤوس الجداول الثابتة ليست بالأمر الجديد في مواقع الويب. على عكس الورق، حيث يستطيع القارئ نقل نظره بسرعة إلى أعلى الشاشة ليعرف في أي عمود هو، لكن أبعاد الشاشة تجعل من قراءة الجداول الطويلة أمر صعبا. رؤوس الجداول الثابتة، كما يشير اسمها، تبقى ثابتة في أعلى الجدول حتى وإن نزلنا أكثر في الجدول. يساعد الأمر في إبقاء أسماء الأعمدة دوما في متناول اليد، حتى لا يجبر المستخدم على الرجوع إلى أعلى الجدول كل مرة من أجل النظرة ثم الرجوع مجددا. يوجد العديد من سكربتات وإضافات jQuery التي تعمل بطريقة فعالة وخالية من الأخطاء، فهم ليسوا الحل المثالي لجميع المشاكل الممكنة، ففي بعض الحالات، على الجداول أن تتبع قواعد هيكلة لم تحسب لها الإضافات حساب، كالجداول التي تسمح بإظهار مؤشر التحرك (scroll bar) عندما لا تكفي المساحة لإظاهر الجدول. هذا المقال لن يكون الحل المثالي لجميع المواقف، ولكنه سيكون حلا لأغلب المشاكل الشائعة. حل باستخدام CSS فحسب عبر position: sticky؟تملك CSS حلا مناسبا لهذه المشكلة وهو عبر استخدام postion: sticky. لكن للأسف، الحل غير مدعوم في chrome رغم أنه كان مدعوما سابقا، إلا أنّ فريق التطوير قام بإلغاء الخاصية تماما منه إلى أجل غير معلوم. ولأننا لا نستطيع التضحية بكل مستخدمي متصفح chrome فعلينا إيجاد حل بديل للمشكلة. حل عبر استخدام jQueryحل jQuery هو بسيط جدا، لكن قبل أن نبدأ باستخدام، علينا أن نلقي نظرة على كيف يكون جدول ما صحيحا من حيث الهيكلة: <table> <thead> <tr> <th></th> <!-- more columns are possible --> </tr> </thead> <tbody> <tr> <td></td> <!-- more columns are possible --> </tr> <!-- more rows are possible --> </tbody> <tfoot><!-- هذا الجزء اختياري --> <tr> <td></td> </tr> </tfoot> </table>ما الذي نحاول تحقيقه؟سنحاول جعل السكربت يدعم أغلب المشاكل الشائعة والتي هي: الاستخدام الأساسي: رأس الجدول يكون ثابتا.رؤوس الجداول الأفقية والعمودية.الجداول العريضة:العمود الأفقي: إذا كان هنالك العديد من الأعمدة التي لا يمكن إظهارها في عرض الصفحة، فسنستخدم عمودا جانبيا ثابتا.الصف العمودي: وهو الاستخدام الأساسي، أن يكون الرأس العلوي ثابتا عند النزول بالجدول.كلا العمودين: حيث نثبت كل من العمود والصف.CSS من أجل البدءرغم أننا سنستخدم حلاّ عبر جافاسكربت، فإن CSS ضرورية من أجل تنفيذ الأمر: .sticky-wrap { overflow-x: auto; position: relative; margin-bottom: 1.5em; width: 100%; } .sticky-wrap .sticky-thead, .sticky-wrap .sticky-col, .sticky-wrap .sticky-intersect { opacity: 0; position: absolute; top: 0; left: 0; transition: all .125s ease-in-out; z-index: 50; width: auto; /* Prevent table from stretching to full size */ } .sticky-wrap .sticky-thead { box-shadow: 0 0.25em 0.1em -0.1em rgba(0,0,0,.125); z-index: 100; width: 100%; /* Force stretch */ } .sticky-wrap .sticky-intersect { opacity: 1; z-index: 150; } .sticky-wrap .sticky-intersect th { background-color: #666; color: #eee; } .sticky-wrap td, .sticky-wrap th { box-sizing: border-box; }ملاحظة: من المهم جدا نقل كل CSS الخاصة بوسم <table> إلى sticky-wrap. هذا حتى يتاح لنا التحكم بها مباشرة عبر jQuery. لنقل أنك تملك CSS التالي: table { margin: 0 auto 1.5em; width: 75%; }كل ما عليك فعله ببساطة هو نقلها إلى sticky-wrap. : .sticky-wrap { overflow-x: auto; /* Allows wide tables to overflow its containing parent */ position: relative; margin: 0 auto 1.5em; width: 75%; }استخدام جافاسكربتسوف نقوم بتنفيذ دالتنا على كل جدول موجود في الصفحة، الأهم من هذا سنتفقد إن كان الجدول يملك <thead> وإن كان هذا الأخير يحتوي على الأقل على <th> واحد. إن لم تتحق الشروط، فستتجاهل دالتنا هذا الجدول. $(function () { // هنا نقوم باختيار جميع الجداول في الصفحة // لكنك حر بتحديد الجداول التي تريدها $('table').each(function () { if($(this).find('thead').length > 0 && $(this).find('th').length > 0) { // بقية السكربت تكون هنا } }); });الخطوة 1: نسخ عنصر <thead>// تحديد المتغيرات وبعض الاختصارات var $t = $(this), $w = $(window), $thead = $(this).find('thead').clone(), $col = $(this).find('thead, tbody').clone();الخطوة 2: تغليف الجدول ونسخهمن أجل دعم الحالات التي يكون فيها الجدول أعرض من ماهو مسموح (أي عندما يكون عندما عدد كبير من الأعمدة، أو أعمدة طويلة، فنحوي الجدول في <div> حتى نسمح لك بأن يكون scrollable على المحور الأفقي: // احتواء الجدول $t .addClass('sticky-enabled') .css({ margin: 0, width: '100%'; }) .wrap('<div class="sticky-wrap" />'); // تفقد إن كنا قد حددنا بأن يكون الجدول قابلا للتمرير (scroll) على المحور الأفقي if($t.hasClass('overflow-y')) $t.removeClass('overflow-y').parent().addClass('overflow-y'); // صنع رأس جدول جديد بصنف .stiky-head $t.after('<table class="sticky-head" />') // إذا كان <tbody> يحتوي على <th> فنقوم بصنع عمود جديدة ليكون الخانة أعلى الجدول if($t.find('tbody th').length > 0) { $t.after('<table class="sticky-col" /><table class="sticky-intersect" />'); } // اختصارات var $stickyHead = $(this).siblings('.sticky-thead'), $stickyCol = $(this).siblings('.sticky-col'), $stickyInsct = $(this).siblings('.sticky-intersect'), $stickyWrap = $(this).parent('.sticky-wrap');الخطوة 3: وضع محتوى الجداول المنسوخةما سنقوم به الآن هو أخذ المحتوى المنسوخ من الجدول الأصلي ووضعه في الجداول الجديدة التي ستكون ملتصقة: رأس الجدول الجديد سيستلم كامل المحتوى من عنصر <thead> المنسوخ.الأعمدة الملتصقة ستستلم المحتوى من أول عنصر <th> من <thead> وكل عناصر <th> المتبقية من <tbody>.اندماج العمود مع الصف (أيّ الخانة المشتركة بين العمود والصف) ستأخذ محتوى من خلال أعلى خانة على يمين الجدول (بافتراض أننا نتعامل مع الصفحة على أساس RTL).// StickyHead يحصل على المحتوى من <thead> $stickyHead.append($thead); $stickyCol .append($col) .find('thead th:gt(0)').remove() .end() .find('tbody td').remove(); // StickyIntersect يحصل على المحتوى من <th> في <thead> $stickyInsct.html('<thead><tr><th>'+$t.find('thead th:first-child').html()+'</th></tr></thead>');الخطوة 4: الدوالهنا يأتي أهم جزء من السكربت الخاص بنا، سنحدد أيّ دوال يجب أن تنفذ من أجل أن يعمل السكربت بشكل صحيح: دالة من أجل تحديد عرض عناصر <th> في رأس الجدول المنسوخ، بما أننا نسخنا عنصر <thead> فحسب، فعرض رأس الصفحة المنسوخ الكلي لن يكون عرض رأس الصفحة الفعلي، لأن عرض <tbody> لم يتم إضافته حيث لا نعلم هل سيؤثر على رأس الصفحة أو لا.دالة من أجل تحديد مكان رأس الصفحة الثابت حتى نقوم بتحديث بُعد رأس الصفحة المنسوخ الأفقي، الذي قمنا بتحديد position: absolute عندما نبدأ بتمرير شريط التقدم داخل الجدول.دالة من أجل تحديد مكان العمود الجانبي الثابت ولها نفس حالة تثبيت رأس الصفحة.دالة من أجل حساب المساحة المتبقية وسنقوم بشرح هذه الدالة لاحقا بشكل أعمق. // Function 1: setWidths() // Purpose: To set width of individually cloned element var setWidths = function () { $t .find('thead th').each(function (i) { $stickyHead.find('th').eq(i).width($(this).width()); }) .end() .find('tr').each(function (i) { $stickyCol.find('tr').eq(i).height($(this).height()); }); // Set width of sticky table head $stickyHead.width($t.width()); // Set width of sticky table col $stickyCol.find('th').add($stickyInsct.find('th')).width($t.find('thead th').width()) }, // Function 2: repositionStickyHead() // Purpose: To position the cloned sticky header (always present) appropriately repositionStickyHead = function () { // Return value of calculated allowance var allowance = calcAllowance(); // Check if wrapper parent is overflowing along the y-axis if($t.height() > $stickyWrap.height()) { // If it is overflowing // Position sticky header based on wrapper's scrollTop() if($stickyWrap.scrollTop() > 0) { // When top of wrapping parent is out of view $stickyHead.add($stickyInsct).css({ opacity: 1, top: $stickyWrap.scrollTop() }); } else { // When top of wrapping parent is in view $stickyHead.add($stickyInsct).css({ opacity: 0, top: 0 }); } } else { // If it is not overflowing (basic layout) // Position sticky header based on viewport scrollTop() if($w.scrollTop() > $t.offset().top && $w.scrollTop() < $t.offset().top + $t.outerHeight() - allowance) { // When top of viewport is within the table, and we set an allowance later // Action: Show sticky header and intersect, and set top to the right value $stickyHead.add($sticktInsct).css({ opacity: 1, top: $w.scrollTop() - $t.offset().top }); } else { // When top of viewport is above or below table // Action: Hide sticky header and intersect $sticky.add($stickInsct).css({ opacity: 0, top: 0 }); } } }, // Function 3: repositionStickyCol() // Purpose: To position the cloned sticky column (if present) appropriately repositionStickyCol = function () { if($stickyWrap.scrollLeft() > 0) { // When left of wrapping parent is out of view // Show sticky column and intersect $stickyCol.add($stickyInsct).css({ opacity: 1, left: $stickyWrap.scrollLeft() }); } else { // When left of wrapping parent is in view // Hide sticky column but not the intersect // Reset left position $stickyCol .css({ opacity: 0 }) .add($stickyInsct).css({ left: 0 }); } }, // Function 4: calcAllowance() // Purpose: Return value of calculated allowance calcAllowance = function () { var a = 0; // Get sum of height of last three rows $t.find('tbody tr:lt(3)').each(function () { a += $(this).height(); }); // Set fail safe limit (last three row might be too tall) // Set arbitrary limit at 0.25 of viewport height, or you can use an arbitrary pixel value if(a > $w.height()*0.25) { a = $w.height()*0.25; } // Add height of sticky header itself a += $sticky.height(); return a; }; }والآن سنقوم بشرح ما قمنا به في الدالة الرابعة، نحن لا نريد من رأس الجدول أن يلحقنا إلى أسفل الجدول، فالأمر غير ضروري وقد يغطي لنا آخر سطر من الجدول، لذا من الضروري إبقاء مساحة فارغة في الأسفل. حسب ما جربت، فقد اكتشفت أننا لا نحتاج لرأس الجدول عندما نصل لأخر 3 سطور من الجدول لأن تركيزنا انتقل على المحتوى الآن. $t.find('tbody tr:lt(4)').each(function () { allowance += $(this).height(); });الخطوة 5: ربط كل شيءوالآن قد انتهينا من تعريف كل الدوال اللازمة، كل ما تبقى هو ربط المتفقدات أو (Event handlers) مع عنصر(window)$. عندما يجهز الـDOM نقوم بالحسابات الأولية للعرض.عندما تحمل كامل المعلومات نقوم بحساب الأبعاد مرة أخرى، هذه الخطوة مهمة لأن جدولك قد يحتوي على أشياء تحمل بعد الـ DOM مثل الصور وخطوط الويب.عندما يتم التمرير في الحاوي الرئيسي ولكن هذا سيحدث في حالة كان المحتوى أكبر من عرض الحاوي، حينها نريد إعادة تغيير مكان العمود الرئيسي.عندما يتم تصغير نافذة المتصفح نريد إعادة حساب العرض.عندم يتم النزول في المتصفح نريد أن نغير مكان رأس الجدول.يمكن تلخيص ما قلناه للتو في الكود التالي. يجدر الذكر أن أحداث التصغير والتمرير يتم التحكم بهما باستخدام إضافة throttle+debounce. // #1: DOMعندما يجهز الـ setWidths(); // #2: نراقب الحاوي في حال حدوث تمرير فيه $t.parent('.sticky-wrap').scroll($.throttle(250, function() { repositionStickyHead(); repositionStickyCol(); })); // الآن نربط ما قمنا بعنصر $(window) $w // #3: عندما يتم تحميل كامل المحتويات .load(setWidths) // #4: عندما يتم تصغير النافذة // قمنا باستخدام throttle هنا حتى لا يتم إطلاق الحدث أكثر من مرة (في الوضع الافتراضي يتم إطلاق الحدث من أجل كل جزء يتم تصغيره، هنا ننتظر حتى ينتهي التصغير كاملا ثم نطلق) .resize($.throttle(250, function () { setWidths(); repositionStickyHead(); repositionStickyCol(); }) // #5: عندما يتم النزول في النافذة // استخدمنا throttle حتى لا يتم إطلاق الدالة كثيرا .scroll($.throttle(250, repositionStickyHead);وانتيهنا، كان هذا كل شيء! النقاشنحن نعرف أن لاشيء كامل، لذا سنناقش الطرق الأخرى التي تملك محاسن على هذه الطريقة ومساوئها ولم استخدمنا هذه الطريقة. استخدام position: fixedاستخدام هذه الطريقة قد يبدو مغريا لسبيين: لا يوجد حاجة لحسابات من أجل رأس الجدول، لأن العنصر المثبت (fixed) يقع خارج الصفحة الفعلية وسيبقى ثابتا في مكانه.نتجنب البطء في الحسابات هذا لأن العناصر الثابتة تلاحق الجدول ولا تثبت معه، لأننا نقوم بالحساب في فترات ثابتة (عبر throttle) وبالتالي سيظهر أن العنصر الثابت غير متجاوب وبالتالي غير طبيعي.لكن المشكلة في هذه الطريقة هي أننا نزيل العنصر من رونق الصفحة، ففي حالة تجاوز عرض الجدول العرض المسموح وأصبح من الضروري إضافة scroll فإن رأس لن يلحق المحتوى على المحور الأفقي لأنه ثابت في الصفحة. وهذا سبب كبير لا يسمح لنا باستخدام أغلب إضافات jQuery التي تقدم هذه الخواص. وكتبت هذه الدورة من أجل إصلاح هذا الأمر بالتحديد. استخدام position: stickyالخاصية الجديدة مناسبة للأمر، في الواقع لقد بنيت من أجل هذا الأمر في الحسبان، المشكلة فيها أنها غير مدعومة من متصفح chrome (سبق وكانت مدعومة ولكن أزيل الدعم كليا) وبذلك تفقد كل الزوار من هذا المتصفح. مثال حي:See the Pen avovoo by Hsoub Academy (@HsoubAcademy) on CodePen. ترجمة -وبتصرف- للمقال: Sticky Table Headers & Columns لصاحبه Terry Mun.
×
×
  • أضف...