في نافذة الطباعة اختر «حفظ كملف PDF» كوجهة.
نظم التشغيل 1، الدرس العملي 2
ما يكتبه المصمم (designer) لك، ولماذا النموذج (form) صنف (class)، وكيف تبدأ المشروع بالطريقة الصحيحة.
InitializeComponent وإصلاح مصمم لا يفتحالجزء 1
سريعة البناء، وسرعان ما تضيق بالمشروع
| نوع المشروع | أداة تصميم النافذة | الوضع الحالي |
|---|---|---|
| نماذج ويندوز | السحب والإفلات | منذ أول إصدار من .NET؛ وشائعة في الشركات |
| WPF | لغة الترميز XAML | الخيار المعتاد لتطبيق سطح مكتب جديد |
| UWP | XAML | مرتبطة بإصدارات ويندوز الحديثة؛ ومهملة |
| .NET MAUI | XAML | سطح المكتب والهاتف المحمول؛ وما زالت حديثة |
صمم النموذج بحجم 420 x 235. ماذا يحدث عندما تصغر النافذة، أو تكبر إلى أقصى حد؟


الجزء 2
عرض سريع، ثم نظرة إلى الداخل
First Name45
انقر نقرا مزدوجا على button1: ينشئ Visual Studio الدالة button1_Click
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show($"Hello {textBox1.Text} {textBox2.Text}");
}textBox1 كائن (object) على النموذجText خاصية: ما كتبه المستخدم$"..." هو استيفاء السلاسل النصية (string interpolation): يصبح كل جزء بين القوسين المعقوصين قيمتهيكتب المستخدم Lab وStudent وينقر button1. ماذا تقول الرسالة؟

partial class Form1: النصف الآخر هو Form1.Designer.cs، في الدالة (method) InitializeComponent
this.button1 = new System.Windows.Forms.Button();
// ...
this.button1.Location = new System.Drawing.Point(120, 140);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(100, 30);
this.button1.Text = "button1";
this.button1.Click += new System.EventHandler(this.button1_Click);
// ...
this.progressBar1.Value = 45;
this.Controls.Add(this.button1);نقرت نقرا مزدوجا على النموذج بالخطأ، ثم حذفت الدالة الجديدة Form1_Load من Form1.cs. وما زال سطر الربط في Form1.Designer.cs.
Form1.Designer.cs(129,55): error CS1061: 'Form1' does not contain a definition for 'Form1_Load' and no accessible extension method 'Form1_Load' accepting a first argument of type 'Form1' could be found (are you missing a using directive or an assembly reference?)this.Load += new System.EventHandler(this.Form1_Load);الجزء 3
الوراثة، والخصائص، والكائنات
اضغط F12 على Form، ثم على صنفه الأساسي (base class)، ثم مرة أخرى
WinFormsDemo.Form1
System.Windows.Forms.Form
System.Windows.Forms.ContainerControl
System.Windows.Forms.ScrollableControl
System.Windows.Forms.Control
System.ComponentModel.Component
System.MarshalByRefObject
System.Objectيكتب المستخدم Lab وStudent، ثم ينقر button1 مرة واحدة
public Form1()
{
InitializeComponent();
label2.Text = "Last Name";
label3.Text = "Full Name";
}label2private void button1_Click(object sender, EventArgs e)
{
textBox3.Text = $"{textBox1.Text} {textBox2.Text}";
progressBar1.Value += 10;
}يبدأ الشريط عند 45 وتضيف كل نقرة 10. Minimum تساوي 0، وMaximum تساوي 100.

اكتب Lab وStudent في النافذة الأولى، ثم انقر button1 مرتين
Form1 frm = new Form1();
frm.Show();
frm.Left = this.Left + 430;
الجزء 4
أكثر من نموذج واحد، وأكثر من عناصر التحكم الشائعة
static void Main()
{
ApplicationConfiguration.Initialize();
Application.Run(new MainForm());
}Application.Run(new MainForm()) النموذج الأولpublic Form2(string message)
{
InitializeComponent();
formMessage = message;
messageLabel.Text = formMessage;
}Form2 frm = new Form2("Hello from Form 1");
frm.Show();انقر Open Form 2. ثم اختر File, Exit في النموذج الرئيسي، فينفذ this.Close().


StatusStrip (من Menus & Toolbars) فيه تسمية حالة وشريط تقدم. وتبدأ التسمية بالنص Ready، والشريط عند 0.
private void workButton_Click(object sender, EventArgs e)
{
toolStripProgressBar1.Value += 5;
toolStripStatusLabel1.Text = "Working...";
}
| ما تكتبه | ما تعرضه القائمة | لوحة المفاتيح |
|---|---|---|
&File | File، وتحت F خط | Alt+F تفتحها |
E&xit | Exit، وتحت x خط | X، داخل File |
&Help | Help، وتحت H خط | Alt+H تفتحها |
&About | About، وتحت A خط | A، داخل Help |
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("Created in the OS1 lab");
}
معالج تسجيل على كل حدث، والنموذج يشغل على ويندوز بلوحة المفاتيح والفأرة الحقيقيتين
الجزء 5
ست عادات قبل أن تكتب أي شيفرة
نموذج بحجم 360 x 150 فيه زر بحجم 100 x 30. ضبطنا خط النموذج على 18 نقطة.
| العنصر | 9 pt | 18 pt |
|---|---|---|
| داخل النموذج (ClientSize) | 360 x 150 | 669 x 320 |
| الزر | 100 x 30 | 186 x 64 |
| تسمية تستخدم خط النموذج | 9 pt | 18 pt |
| تسمية لها خطها الخاص بحجم 10 pt | 10 pt | 10 pt |
| الأسلوب القديم (المجري، Hungarian) | أسلوب هذا الدرس |
|---|---|
lblFirstName | firstNameLabel |
txtFirstName | firstNameText |
btnSayHello | sayHelloButton |
lstCity | cityList |
تنقر نقرا مزدوجا على button1، ثم تعيد تسميته إلى sayHelloButton. ما اسم المعالج الآن؟
private void button1_Click(object sender, EventArgs e)
this.sayHelloButton.Click += new System.EventHandler(this.button1_Click);المؤشر في مربع الاسم الأول. إلى أين تنقل كل ضغطة على Tab؟
| عنصر التحكم | TabIndex |
|---|---|
| firstNameText | 1 |
| sayHelloButton | 2 |
| lastNameText | 4 |
| التسميتان | 0 و3 (TabStop تساوي False) |
يكتب المستخدم Lab وStudent
MessageBox.Show($"Hello {firstNameText} {lastNameText}");
namespace GreetingLibrary;
public static class Greeter
{
public static string Greet(string firstName, string lastName)
{
return $"Hello {firstName} {lastName}";
}
}using GreetingLibrary;
Console.WriteLine(Greeter.Greet("Lab", "Student"));
Console.WriteLine(Greeter.Greet("Operating", "Systems"));Hello Lab Student
Hello Operating Systems
private void sayHelloButton_Click(object sender, EventArgs e)
{
string message = Greeter.Greet(
firstNameText.Text, lastNameText.Text);
MessageBox.Show(message);
}button1، ثم أعدت تسميته إلى saveButton. ما اسم المعالج؟txtEmail بأسلوب هذا الدرس.button2_Click فتعطل المصمم. أي سطر يحذف، ومن أي ملف؟الجزء 6
نحو 30 دقيقة؛ أجب أولا، ثم ابن البرنامج وشغله
نحو 6 دقائق
| عنصر التحكم | TabIndex | TabStop |
|---|---|---|
| nameText | 3 | True |
| emailText | 7 | True |
| phoneText | 5 | True |
| newsCheck | 1 | False |
| saveButton | 12 | True |
nameText (قيمة TabIndex له 3، وهي الأصغر بين محطات Tab)phoneText (5)emailText (7)saveButton (12)، ثم Tab 4: العودة إلى nameTextنحو 6 دقائق
this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);Form1.Designer.cs(104,75): error CS1061: 'Form1' does not contain a definition for 'checkBox1_CheckedChanged' ...نحو 6 دقائق
// progressBar1: Maximum = 50, Value = 0
private void button1_Click(object sender, EventArgs e)
{
progressBar1.Value += 15;
}
Value of '60' is not valid for 'Value'نحو 12 دقيقة
Main Form): nameLabel وnameText وwelcomeButtonWelcome): تسمية كبيرة welcomeLabelWelcome, + الاسم + !nameTextStudent؟ وماذا يفعل new WelcomeForm()؟public WelcomeForm(string userName)
{
InitializeComponent();
welcomeLabel.Text = $"Welcome, {userName}!";
}
private void welcomeButton_Click(object sender, EventArgs e)
{
WelcomeForm frm = new WelcomeForm(nameText.Text);
frm.Show();
}
Mahmoud Abas|نماذج ويندوز: الشيفرة خلف النموذج