السلام عليكم أخواني وأخواتي
اريد كود لتنفيذ خطوة معينة وبعد انتهاء هذه الخطوة يتم تنفيذ الخطوة الثانية
السلام عليكم أخواني وأخواتي
اريد كود لتنفيذ خطوة معينة وبعد انتهاء هذه الخطوة يتم تنفيذ الخطوة الثانية
تم تعديل هذه المشاركة بواسطة Bedford في 10 نوفمبر 2013 في 19:48
محاولة ممكن تقيدك
1 - تضيف تايمر إلى البرنامج
2 - تعرف متغير على حسب الزياده
مثل int i +=1
3- تسوي if شرط (i>=20)
4 - إذا نفذ الشرط يغير في قيمة Location للكرة رقم واحد
يستمر في تحريك الصورة واحد إلى ان ينفد الشرط
5 - يغير غي قيمة Location للكرة رقم 2
إلى حد معين اعمل شرط آخر للايقاف الكرة الثانية
ملاحظ ضع المتغير i مكان القيمة في Location
ثم أعمل في الزر timer1.Enabled = true
أعذرني لعدم كتابة الكود كامل لتداخل الكتابة الانجليزية ولا اعرف كيف أضافة الأكواد البرمجية مثل التي يسويها الأخوه في هذا المنتدى في حد يقدر يشرح لي طريق أضافة الكود ؟
شكراً لك عزيزي
اذا اردت كتابة الكود فاضغط على زر كود <>
شكراً لك
أكتب في التايمر بدون private void تنشأ تلقائي
int n1 = 0;
int n2 = 0;
private void timer1_Tick(object sender, EventArgs e)
{
if (n1 <= 90)
{
this.pictureBox1.Location = new System.Drawing.Point(15 + n1, 54);
n1 += 1;
}
else if (129+n2 <= 243)
{
this.pictureBox2.Location = new System.Drawing.Point(129 + n2, 54);
n2 += 1;
}
else
{
timer1.Enabled = false;
}
}ثم أكتب في الزر
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
}لتحكم في السرعه من خلال
1- n+=2
2- من خصائص التايمر Inttrval حيث 1000 يعادل ثانية
الطريقة الأمثل. هي باستخدام الأحداث Events حيث تقوم بتعريف حدث مثلا complete ويتم تفعيل هذا الحدث بأي وقت تريد. وليكن عن انتهاء حركة الكرة الأولى.
• • •
[ ربيّ احفظ سوريا الحبيبة]

ممكن كود بسيط لتوضيح المعلومه
جميل جداً
أنا الأن عملت عدد اثنين تايمر
اريد تشغيل التايمر الأول وبعد الأنتهاء من تشغيله يشتغل التايمر الثاني في نفس الزر.
وجزاكم الله ألف خير
بسم الله الرحمن الرحيم.
أخوتي الأكارم، هناك العديد من الطرق لتنفيذ هذه الخوارزمية، ولكن الطريقة الأفضل هي الأحداث والتي تعطي نتائج دقيقة.
سنقوم بعمل مثال بسيط نفس المثال المطروح، حيث سنقوم بتحريك كرتين أفقيا، نبدأ بالكرة الأولى وعند الوصول للحافة نقوم بتحريك الكرة الثانية، وسوف ندعم المثال بعرض الخطوات التي يقوم بها البرنامج بالتسلسل.
أولاً: نقوم بتصميم الواجهة بحيث تحوي على المكونات التالية:
1. Panel نقوم بتسميتها Board ونضع خاصية BoarderStyle = SingleFixed، وهي التي سنرسم عليها الكرات ونحركها.
2. Button ونسميه btnStart وهو الذي سيبدأ بالحركة فور الضغط عليه.
3. ListBox نسميها lstEvents وهي التي سنسجل عليها الحدث الجاري على الواجهة.
"ستجد الكود كامل بنهاية الموضوع، بالإضافة للمشروع كامل للتحميل."
فرضية العمل أنه لكل كرة من الكرات Timer خاص بها لتحريكها، بالطبع إذا كان لدينا عدد معين من الكرات فالأفضل عمل مكون جديد يحوي بداخله على Timer خاص به. إذا في مثالنا سنقوم بتعريف timer1, timer2. وسنقوم بتعريف مستطيلين لرسم الكرة ضمنهم Rectangle1, Rectangle2. واخيراً نقوم بتعريف حدثين FirstLevelComplete, SecondLevelComplete
public event EventHandler FirstLevelComplete;
public event EventHandler SecondLevelComplete;
private Rectangle Ellipse1 = new Rectangle(0, 100, 50, 50);
private Rectangle Ellipse2 = new Rectangle(0, 200, 50, 50);
private Timer timer1;
private Timer timer2;، لكل كرة حدث، يعمل كل حدث بمجرد انتهاء حركة الكرة إلى وصولوها إلى الحافة.
الأن ضمن Constructor الخاص بالواجهة نقوم بتهيئة المتغيرات كالتالي:
public Form1()
{
InitializeComponent();
timer1 = new Timer();
timer1.Interval = 1;
timer1.Tick += timer1_Tick;
timer2 = new Timer();
timer2.Interval = 1;
timer2.Tick += timer2_Tick;
this.FirstLevelComplete += Form1_FirstLevelComplete;
this.SecondLevelComplete += Form1_SecondLevelComplete;
}السطرين الأخريين عبارة عن ربط كل حدث بميثود خاصة به للعمل على أساسها، فيكون لدينا الميثودتين التاليتين:
void Form1_FirstLevelComplete(object sender, EventArgs e)
{
}
void Form1_SecondLevelComplete(object sender, EventArgs e)
{
}وأحداث الـ Timers ستكون عبارة عن زيادة موضع X لكل كرة وإعادة الرسم على Panel، وللرسم عليها نقوم بالضغط عليها مرتين فيفتح لدينا الحدث الخاص بالرسم Board_Paint نتأكد من هذا الإسم لكونه خاص بالرسم ونضع بداخلة كود الرسم لكرتين كالتالي:
private void Board_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawEllipse(Pens.Red, Ellipse1);
e.Graphics.DrawEllipse(Pens.Blue, Ellipse2);
}حيث قمنا برسم الكرة الأولى بلون أحمر، والكرة الثانية بلون أزرق.
ما علينا عمله الأن هو تشغيل حدث timer1، عند الضغط على زر Start، ضمن هذا الحدث سنقوم بزيادة موضع X للكرة الأولى وإعادة الرسم مما يعطينا انطباع بالحركة، ويستمر عمل هذا الحدث ما دامت الكرة لم تصل إلى حافة لوحة الرسم Board، وعند وصول الكرة الأولى إلى الحافة نكون قد انتهينا من تحريكها، فهو الوقت لطلب الحدث الخاص بإنتهاء عمل الكرة الأولى FirstLevelComplete، في الحدث نستطيع تشغيل timer2 الخاص بتحريك الكرة الثانية، والذي سيعمل بنفس العمل من حيث تحريك موضع X للكرة الثانية وعند الإنتهاء من الحركة نطلب الحدث الخاص بإنتهاء العمل للكرة الثانية SecondLevelComplete، نستطيع وضع ما نشاء ضمن هذا الحدث، مثلاً ان نخبر المستخدم أن العمل تم، وهكذا أصبح لدينا فصل في مستوى عمل البرنامج.
الحدث الخاص بالضغط على الزر Start:
private void btnStart_Click(object sender, EventArgs e)
{
timer1.Start();
}الحدث الخاص ب timer1:
void timer1_Tick(object sender, EventArgs e)
{
if (Ellipse1.X < Board.Width - 50)
{
Ellipse1.X += 10;
}
else
{
if (FirstLevelComplete != null)
FirstLevelComplete(this, new EventArgs());
timer1.Stop();
}
Board.Invalidate();
}الحدث الخاص بإنتهاء عمل الكرة الأولى:
void Form1_FirstLevelComplete(object sender, EventArgs e)
{
timer2.Start();
}الحدث الخاص ب timer2:
void timer2_Tick(object sender, EventArgs e)
{
if (Ellipse2.X < Board.Width - 50)
{
Ellipse2.X += 10;
}
else
{
if (SecondLevelComplete != null)
SecondLevelComplete(this, new EventArgs());
timer2.Stop();
}
Board.Invalidate();
}أما بالنسبة للحدث الخاص بإنتهاء العمل للكرة الثانية، فالخيار عائد لك في ما تود اخراجه للمستخدم.
الكود كامل:
public partial class Form1 : Form
{
public event EventHandler FirstLevelComplete;
public event EventHandler SecondLevelComplete;
private Rectangle Ellipse1 = new Rectangle(0, 100, 50, 50);
private Rectangle Ellipse2 = new Rectangle(0, 200, 50, 50);
private Timer timer1;
private Timer timer2;
public Form1()
{
InitializeComponent();
timer1 = new Timer();
timer1.Interval = 1;
timer1.Tick += timer1_Tick;
timer2 = new Timer();
timer2.Interval = 1;
timer2.Tick += timer2_Tick;
this.FirstLevelComplete += Form1_FirstLevelComplete;
this.SecondLevelComplete += Form1_SecondLevelComplete;
}
void Form1_FirstLevelComplete(object sender, EventArgs e)
{
timer2.Start();
}
void Form1_SecondLevelComplete(object sender, EventArgs e)
{
}
void timer1_Tick(object sender, EventArgs e)
{
if (Ellipse1.X < Board.Width - 50)
{
Ellipse1.X += 10;
}
else
{
if (FirstLevelComplete != null)
FirstLevelComplete(this, new EventArgs());
timer1.Stop();
}
Board.Invalidate();
}
void timer2_Tick(object sender, EventArgs e)
{
if (Ellipse2.X < Board.Width - 50)
{
Ellipse2.X += 10;
}
else
{
if (SecondLevelComplete != null)
SecondLevelComplete(this, new EventArgs());
timer2.Stop();
}
Board.Invalidate();
}
private void Board_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawEllipse(Pens.Red, Ellipse1);
e.Graphics.DrawEllipse(Pens.Blue, Ellipse2);
}
private void btnStart_Click(object sender, EventArgs e)
{
timer1.Start();
}
}ستجد في المشروع المرفق، كيف يتم تسجيل الأحداث التي مرت على فترة حياة البرنامج، وإليك هذا الصورة التوضيحية:

في هذه الصورة نجد أنه تم وصول الكرة الأولى إلى النهاية، وتم تسجيل أحداث بدء عملها وانتهاءها، وأن الكرة الثانية بمنتصف الطريق تقريبا ولم نتتهي من عملها بعد، وفي حال إنتهاء عملها سيتم إضافة عنصر جديد إلى ListBox لتخبرنا أن عملها أنتهى.
تحميل المشروع من هنا:
http://www.4shared.com/rar/OA2nUTPE/TwoTimers.html
بالتوفيق، وإذا كان هناك أية أسئلة، فأنا موجود إن شاء الله تعالى.
• • •
[ ربيّ احفظ سوريا الحبيبة]

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