الدرس الرابع عشر إنشاء مفكرتي الخاصة الجزء الثاني
مرحبا بكم في الدرس الرابع عشر من دروس لغة البرمجة c#
في هذا الدرس الثاني من دروس إنشاء مفكرتي الخاصة
سوف نتعلم الكثير من الأمور الجديدة
وقبل البدأ في شرح ملف درس اليوم
دعونا نقوم بشرح مبسط للمتغيرات وعمليات تكرار القيم في لغة c#
امتغيرات
بصورة عامة يمكن كتابة أسماء المتغيرات كما نحب لكن إذا راعاينا النقاط التاليةأولا أن يتكون اسم المتغير من الحروف الإنجليزية كما يجب المراعاة عند استخدام الحروف الكبيرة والصغيرة
ثانيا يجب ألا تبدأ أسماء المتغيرات بأحد الأرقام
ثالثا يجب أن لا يكون اسم المتغير مشابه لأحد الكلمات المستخدمة في لغة c# بصورة إفتراضية
والمتغيرات تنقسم إلى متغيرات نصية ومتغيرات رقمية
والمتغيرات النصية تكتب كما يلي
string a;
نقوم بكتابة كلمة string متبوعة باسم المتغير المراد استخدامه وفي هذه الحالة قمنا بتعيين المتغير a بدون إضافة أي قيمة
وإذا أردنا إضافة قيمة إليه يمكننا كتابته كما يلي
string a = "slam";
فإذا أردنا إضافة أي قيمة للمتغيرات يجب كتابة علامة يساوي بعد اسم المتغير متبوعا بعلامتي تنصيص كما يجب أن لا ننسى كتابة علامة السيميكلون في نهاية أي أمر من الأوامر البرمجية
وفي هذا المثال قمنا بإضافة كلمة slam إلى محتوى المتغير a
ملحوظة عند إضافة قيم للمتغيرات النصية حتى ولو كانت أرقاما فيجب كتابة هذه القيم بين علامتي التنصيص
ونوع المتغير الثاني هو المتغيرات الرقمية
وهي تنقسم بدورها إلى عدة متغيرات كمتغيرات الأرقام الصحيحة والأرقام السالبة والأرقام العشرية ولكننا سوف نكتفي هنا بالتعريف بالمتغيرات الخاصة بالأرقام الصحيحة فقط
وطريقة كتابتها هي كما يلي
int b;
وإذا أردنا إضافة أرقام صحيحة فيمكن كتابتها كما يلي
int b = 102;
كما نلاحظ فطريقة الكتابة مشابهة تماما لطريقة كتابة المتغيرات النصية
ولكننا في حالة المتغيرات للأرقام الصحيحة نستخدم كلمة int قبل اسم المتغير
وأيضا يجب كتابة الأرقام بدون علامتي التنصيص فيجب مراعات هذه النقاط الضرورية
ملحوظة إذا قمنا بكتابة المتغيرات بالصيغة الموضحة أعلاه تكون مدى صلاحية استخدام هذا المتغير محصورة داخل الإطار أو الحزمة التي كتب فيها
أما إذا أردنا كتابة متغير وجعله صالح للأستخدام من أي مكان آخر حتى من خارج الإطار المذكور فقط يجب علينا كتابة المتغير مسبوقة بكلمة public
كما هو موضح في المثال التالي
public string a = "bashir";
عمليات التكرار
للقيام بعملية تكرار لأي من القيم المختلفة هنالك العديد من الطرق في لغة c# لكننا سوف نقوم بالتعريف اليوم بعنصر أو خاصية for المستخدمة في إجراء عمليات التكرارفمثلا إذا أردنا تكرار من واحد إلى عشرة على سبيل المثال فيمكننا كتابتها كما يلي
for (int i = 0; i == 10; I++) { //ثم نقوم بكتابة العملية التي نرغب فيها بين هذين العلامتين }
كما هو موضح أعلاه قمنا بكتابة خاصية for متبوعة بفتح القوس
ثم قمنا بتعيين متغير للأرقام الصحيحة وسميناه المتغير i وجعلنا قيمته الإفتراضية هي 0 لأننا نريد أن نبدأ الحساب من الرقم 0
فمثلا إذا أردنا بداية الحساب من الرقم 3 على سبيل المثال نقوم باستبدال 0 بالرقم 3 فقط
وبعدها قمنا بكتابة اسم المتغير i متبوعا بعلامتي يساوي ثم الرقم 10 ومعنى هذا إذا كانت قيمة المتغيير i تساوي عشرة
ملحوظة إذا أردنا التحقق من صحة القيم المختلفة للمتغيرات فيجب علينا كتابة علامة يساوي مرتين متتاليتين
وعندما نقوم بكتابة علامة يساوي مرة واحدة فهذا يعني أننا نقوم بإضافة القيم المعينة للمتغيرات المختلفة
فيجب الإنتباه والحذر في هذه النقطة المهمة
وأخيرا وقبل قفل القوس قمنا بكتابة اسم المتغير i متبوعا بعلامتي زائد وهذا يعني زيادة العدد 1 لقيمة المتغير i ويتم تكرار هذه الزيادة حتى يبلغ النصاب وفي هذه الحالة هو الرقم 10
وبعد إكمال العملية يتم الخروج من هذه الدائرة كما يمكننا التعامل وكتابة العمليات بين علامتي بداية ونهاية الحزم والدوال المختلفة
هذه نبذة قصيرة وقصيرة جدا حول المتغيرات وعملية التكرار باستخدام عنصر for
وهنالك العديد من طرق الاستخدام الأخرى لذا يجب على الأخوة الرغبين في معرفة المزيد البحث في الشبكة الإلكترونية أو الاتصال بي مباشرة
أما الآن فدعونا مع شرح محتوى الملفات المستخدمة في درس اليوم
ولتحميل المشروع المستخدم في هذا الدرس الرجاء الضغط على رابط
محتوى ملف form1.cs
في هذا الدرس من دروس إنشاء مفكرتي الخاصة قمنا بإضافة خاصيتين مهمتين إلى مفكرتنا
وهما خاصية إنشاء ملف جديد وخاصية فتح الملفات
أما الآن فدعونا ننظر في محتوى هذا الملف
// كتابة الحزم الإفتراضية والضرورية لإنشاء النوافذ والأوامر العامة ملحوظة قد قمنا بإضافة حزمة إفتراضية أخرى خاصة بالتعامل مع الملفات والمجلدات المختلفة
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO; // إضافة حزمة System.IO. وهي حزمة متخصصة بالتعامل مع الملفات والمجلدات من القراءة والحفظ والنسخ والإنشاء. وعندما نريد التعامل مع الملفات والمجلدات بأي شكل من الأشكال يجب كتابة هذه الحزمة
// كتابة اسم المشروع
namespace sample_project
{ // علامة البداية للمشروع
public partial class Form1 : Form // اسم الإطار العام والذي سميناه باسم Form1
{ // علامة البداية للإطار
public static string filename = ""; // تعيين المتغير باسم filename
public static string foldername = ""; // تعيين المتغير باسم foldername
public Form1()
{
InitializeComponent(); // جعل الإطار Form1 في حالة الوضع الإفتراضي
}
//フالأوامر الخاصة التي نرغب في تنفيذها عند بداية البرنامج أي إنشاء حزمة البداية كما ذكرنا في ملف Form1.Designer.cs
private void form1_Load(object sender, EventArgs e)
{
// إضافة أسماء الملفات والمسارات إلى المتغير المركب أو المسلسل cmds عند فتح البرنامج
string[] cmds = System.Environment.GetCommandLineArgs();
// الحصول على اسم ومسار الف الذي ت فتحه من خلال قيم المتغير المركب أو المسلسل cmds
for (int i = 1; i < cmds.Length; i++) // يبدإ حساب قيم المتغير المركب من الرقم 0. وفي هذه الحالة بدأنا التعرف على القيم من الرقم 1. وذلك بأن القيمة الأولى أو قيمة الرقم صفر تكون هذ اسم ملف التشغيل ومساره
{ // علامة بداية عملية التكرار باستخدام الاسم for
foldername = cmds[i].ToString(); // إضافة القيمة الأخيرة للمتغير المركب cdls إلى المتغير العام foldername.
readfile(); // و readfile هي اسم الحزمة أو الدالة الخاصة التي أنشأناها والخاصة بقراءة الملفات. وعند إنشاء أي حزمة خاصة ونريد إستدعائها من أي مكان فقط نقوم بكتابة اسم الحزمة المراد استخدامها متبوعة بعلامتي ();
} // علامة نهاية عملية التكرار
} // نهاية حزمة البداية
// الدالة الخاصة بكتابة الأوامر التي نرغب في تنفيذها عند الخروج من البرنامج وأيضا قد قمنا بتسميتها بف ملف Form1.Designer.cs
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{ // علامة بداية حزمة الخروج من البرنامج
checktext(); // إستدعاء الحزمة الخاصة التي قمنا بإنشائها باسم checktext وذلك للتأكد من حدوث أي تغيير على محتوى مربع التحرير الرئيسي
} // علامة النهاية لحزمة الخروج من البرنامج
// الدالة الخاصة بتنفيذ الأوامر عند الضغط على عنصر الخروج من البرنامج والموجود في القائمة الرئيسية
private void menuNew_Click(object sender, EventArgs e) // نقوم باستخدام هذا السطر لكتابة الدوال الخاصة لتنفيذ الأوامر عند الضغط على القوائم والأزرار المختلفة. يجب علينا كتابة هذا السطر كما هو فقط يجب علينا تغيير اسم الدالة والذي نقوم بتحديده كما موضح في ملف Form1.Designer.cs. واسم الدالة الخاص بأوامر الخروج من البرنامج هو menuEnd_Click
{ // علامة بداية الدالة
checktext(); // قبل فتح ملف جديد يجب علينا التأكد من حدوث تغير على محتوى مربع التحرير أم لا وذلك باستخدام الحزمة الخاصة checktext
text1.Text = ""; // بعد التأكد نقوم بإفراغ مربع التحرير من كامل محتواه
this.Text = "هذه هي مفكرتي"; // نقوم باستبدال عنوان البرنامج بالكلمة التي نريد كما هو موضح بين علامتي التنصيص
text1.Modified = false; // خاصية Modified هي إحدى خصائص مربعات التحرير. وتمكننا من التعرف على حدوث تغيير في مربعات التحرير المختلفة أم لا. فإذا حدث تغيير تكون مفعلة أي true. وإذا لم يحدث أي تغيير تكون معطلة أي false. وفي هذه الحالة يجب جعلها في وضع التعطيل
filename = ""; // إفراغ محتوى المتغير filename
foldername = ""; // إفراغ محتوى المتغير foldername
} // علامة الخروج من الدالة
// الدالة الخاصة بتنفيذ الأوامر عند الضغط على عنصر الخروج من البرنامج والموجود في القائمة الرئيسية
private void menuOpen_Click(object sender, EventArgs e) // نقوم باستخدام هذا السطر لكتابة الدوال الخاصة لتنفيذ الأوامر عند الضغط على القوائم والأزرار المختلفة. يجب علينا كتابة هذا السطر كما هو فقط يجب علينا تغيير اسم الدالة والذي نقوم بتحديده كما موضح في ملف Form1.Designer.cs. واسم الدالة الخاص بأوامر الخروج من البرنامج هو menuEnd_Click
{ // علامة بداية الدالة
checktext(); // قبل فتح ملف جديد يجب علينا التأكد من تغير محتوى مربع التحرير الحالي
//إنشاء مربع حوار عام أي بمعنى هو أحد وظائف النظام. وقمنا بتسميته باسم OpenFileDialog1
OpenFileDialog openFileDialog1 = new OpenFileDialog(); // محوظة يمكن كتابة خصائص مربع فتح الملفات العام كسائر العناصر الأخرى في ملف Form1.Designer.cs
// كتابة عنوان مربع الحوار الخاص بفتح الملفات
openFileDialog1.Title = "قم باختيار اسم الملف";
// تعيين مسار كمسار إفتراضي عند إستدعاء هذا المربع. وفي الوضع الإفتراضي هو غير معين. وفي حالة عدم التعيين يتم حفظ مسار آخر مجلد تم فتحه
// openFileDialog1.InitialDirectory = @"C:\";
// تعيين اسم ملف إفتراضي عند إستدعاء هذا المربع. وفي الوضع الإفتراضي هو غير مفعل. وننصح بعدم تفعيله إلا في بعض الحالات الخاصة
// openFileDialog1.FileName = "قم بكتابة اسم الملف الإفتراضي هنا";
// تعيين إمتدادات الملفات التي نرغب في التعامل معها
openFileDialog1.Filter = "ملفات txt|*.txt|ملفات RTF|*.RTF|كافة الملفات|*.*"; // في هذه قمنا تعيين كل من إمتداد txt و rtf والخيار الثالث خيار لكافة الملفات
// تعيين الإمتداد الإفتراضي عند استدعاء هذا المربع. والوضع الإفتراضي هو أن يتم إختيار العنصر الأول
// openFileDialog1.FilterIndex = 1;
// وقبل الخروج من هذا المربع الحفظ التلقائي لمسار المجلد الحالي. والوضع الإفتراضي هو معطل
openFileDialog1.RestoreDirectory = true; // هذه الخاصية ضرورية وذلك لحف آخر مجلد تم فتحه تلقائيا
// السماح بخاصية إمكانية إختيار أكثر من ملف واحد في نفس الوقت. والوضع الإفتراضي هو معطل
// openFileDialog1.Multiselect = true; // بتفعيل هذه الخاصية نتمكن من إختيار أحثر من ملف في وقت واحد. لكن لقراءة كافة الملفات التي تم إختيارها يجب إضافة الكود الخاص بقراءة أكثر من ملف واحد
// إظهار زر المساعدة عند إستدعاء هذا المربع. والوضع الإفتراضي هو معطل
// openFileDialog1.ShowHelp = true;
// إظهار مربع تحديد لتعيين إمكانية السماح بالقراء والتحرير للملفات أم جعلها صالحة للقراءة فقط بدون تعديل. والوضع الإفتراضي هو معطل
// openFileDialog1.ShowReadOnly = true;
// openFileDialog1.ReadOnlyChecked = true;
// إذا تم إختيار اسم ملف غير موجود يتم إظهار رسالة تحذيرية. والوضع الإفتراضي هو مفعل
//openFileDialog1.CheckFileExists = true;
// إظهار رسالة تحذيرية عند تعيين مسار غير موجود. والوضع الأفتراضي هو مفعل
//openFileDialog1.CheckPathExists = true;
// تفعيل إمكانية التعرف على إمتداد الملفات بصورة تلقائية. والوضع الإفتراضي هو مفعل
openFileDialog1.AddExtension = true;
// عدم فتح الملفات التي تحتوي أسماءها على بعض الرموز التي لا يسمح باستخدامها. والوضع الإفتراضي هو مفعل
//openFileDialog1.ValidateNames = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK) // بعد إختيار الملف المراد فتحه والضغط على زر فتح بنجاح
{ // علامة بداية لعملية إذا الشرطية أي if
if (openFileDialog1.FileName.Length > 9) // التأكد من أن اسم الملف ومساره الذي تم إختيارهما يحتوي على أكثر من 9 حروف.
{ // علامة بداية عملية if
foldername = openFileDialog1.FileName; // إضافة المسار واسم الملف الذي تم إختياره إلى المتغير foldername
readfile(); // وبعد التعرف على اسم ومسار الملف نقوم باستدعاء الحزمة الخاصة التي أنشأناها لقراءة الملفات
} // علامة نهاية عملية if
}
// وبعد إكمال العملية يجب إغلاق هذا المربع
openFileDialog1.Dispose();
} // علامة نهاية حزمة فتح الملفات
void readfile() // الحزمة الخاصة التي أنشأناها لقراءة الملفات
{ // علامة بداية الحزمة
filename = Path.GetFileName(foldername); // باستخدام خاصية Path.GetFileName نتمكن وبكل يسر وسهولة من الحصول على اسم الملف مع إمتداده من المسارات المختلففة للمجلدات. وفي هذه الحالة قمنا بإضافة اسم الملف الذي تم فتح فقط بدون المسار إلى المتغير filename>. وذلك حتى نتمكن من إضافة اسم الملف الذي تم فتحه إلى عنوان البرنامج بدون كامل المسار
//filename = Path.GetFileNameWithoutExtension(foldername); // وبنفس الطريقة ولكن باستخدام خاصية Path.GetFileNameWithoutExtension يمكننا الحصول على اسم الملف فقط بدون الإمتداد
this.Text = filename; // إضافة اسم الملف إلى عنوان البرنامج
// ولأن طريقة قراءة ملفات .rtf مختلفة يجب علينا التعرف على نوع الملف الذي تم إختياره. ويمكننا ذلك باستخدام خاصية EndsWith. ومن خلال هذه الخاصية يمكننا البحث عن آخر كلمة أو حرف
if (foldername.EndsWith(".txt")) // إذا كان آخر المسار الموجود في محتوى المتغير foldername هو .txt أي ملف نصي
{
text1.Text = File.ReadAllText(foldername); // نقوم بقراءة محتوى الملف الذي تم إختياره دفعة واحدة وذلك باستخدام خاصية File.ReadAllText وهي أسرع وسيلة لقراءة الملفات في لغة c#. وبعد قراءة الملف قمنا بإضافة محتوى الملف هذا إلى مربع التحرير
} else if (foldername.EndsWith(".rtf")) // وإذا كان الملف هو ملف rtf
{
text1.LoadFile(foldername); // نقوم بقراءة محتوى الملف وذلك باستخدام خاصية LoadFile وهي لا تستخدم إلا مع مللفات rtf فنرجوا عدم استخدام هذه الخاصية مع أي ملفات أخرى
} else { // أذا كان الملف الذي تم إختياره غير المذكور أعلاه
text1.Text = File.ReadAllText(foldername); // نقوم باستخدام خاصية File.ReadAllText لقراءة الملفات الأخرى
}
text1.SelectionStart = 0; // SelectionStart هي إحدى خصائص مربعات التحرير وهي تؤشر إلى نقطة وجود المؤشر على مربع التحرير. وفي هذه الحالة قمنا بجعل المؤشر في أول حرف في مربع التحرير. ملحوظة حساب مربعات التحرير يبدأ من الرقم 0
text1.Focus(); // تستخدم خاصية Focus لتحديد المؤشر على أي عنصر من عناصر الويندوز. فمثلا إذا كانت لدينا 4 أزرار أو مربعات تحرير فباستخدام خاصية Focus يمكننا تعيين العنصر الذي نرغب في الإنتقال إليه أي بمعنى جعل المؤشر يقف عليه
// الإنتقال بالمؤشر إلى السطر الأو من مربع التحرير
text1.ScrollToCaret(); // ScrollToCaret هي إحدى خصائص مربعات التحرير ومن خلالها يمكننا الإنتقال من مكان لآخر
text1.Modified = false; // جعل خاصية Modified في وضع التعطيل
}
// الدالة الخاصة بتنفيذ الأوامر عند الضغط على عنصر الخروج من البرنامج والموجود في القائمة الرئيسية
private void menuEnd_Click(object sender, EventArgs e) // نقوم باستخدام هذا السطر لكتابة الدوال الخاصة لتنفيذ الأوامر عند الضغط على القوائم والأزرار المختلفة. يجب علينا كتابة هذا السطر كما هو فقط يجب علينا تغيير اسم الدالة والذي نقوم بتحديده كما موضح في ملف Form1.Designer.cs. واسم الدالة الخاص بأوامر الخروج من البرنامج هو menuEnd_Click
{ // علامة بداية الدالة
this.Close(); // خاصية Close وتستخدم لإغلاق النوافذ
this.Dispose(); // خاصية Dispose وتستخدم لإغلاق النوافذ مع حزف جميع إشعارات البرنامج من النظام
} // علامة الخروج من الدالة
public void checktext() // الحزمة الخاصة التي قمنا بإنشائها للتحقق من حدوث تغيير في مربع التحرير أم لا
{
//hالتحقق من حدوث أي تغيير في مربع التحرير text1
if (text1.Modified == true) // إذا كانت خاصية Modified في وضع التفعيل أي بمعنى حدوث تغيير ما على محتوى مربع التحرير
{
//إظهار مربع حوار لمعرفة هل يرغب المستخدم في حفظ المحتوى الحالي أم لا
DialogResult result = MessageBox.Show("قد تم تحديث هذا النص. هل ترغب في حفظ المحتوى الحالي",
"حفظ النص",
MessageBoxButtons.YesNo,
MessageBoxIcon.Exclamation,
MessageBoxDefaultButton.Button1);
//للتعرف على ما تم إختياره
if (result == DialogResult.Yes)
{
// إذا كان الإختيار نعم فسوف نقوم باستدعاء حزمة حفظ الملفات هنا. وهذا ما سوف نتعلمه في الدرس القادم إنشاء الله
return;
}
else if (result == DialogResult.No) // وإذا كان الإختيار بلا فيتم إلغاء الأمر
{
return;
}
}
}
} // علامة نهاية الإطار العام Form1
} //علامة نهاية المشروع
لذا نتمنا مراجعة محتوى هذا الدرس بصورة جيدة حتى يسهل علينا الاستمرار في الدروس القادمة
كما يسرني استقبال أسألتكم وذلك من خلال المنتدى العام أو من خلال مجموعة البريد الإلكتروني
للذهاب إلى صفحة المتدى العام الرجاء الضغط على رابط
وللإشتراك في مجموعة البريد الإلكتروني الرجاء الضغط على
الإشتراك بمجموعة البريد الإلكتروني وإلغاء الإشتراك
ولمعرفة المزيد عن مجموعة البريد الإلكتروني الرجاء الضغط على رابط
معلومات عن مجموعة البريد الإلكتروني
ملحوظة في هذه المرة لم نقم بعرض محتوى ملف form1.designer.cs وذلك لاختصار المساحة والوقت
وفي هذه المرة فقط قمنا بإضافة عنصرين للقائمة الرئيسية هما عنصر إنشاء مجلد جديد وعنصر فتح ملف جديد فنرجوا مراجعتهما بعد تحميل المشروع الخاص بهذا الدرس
والله الموفق والهادي إلى سبيل الرشاد
أخوكم محمد بشير