باز شدن بیش از حد فرم - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

وبـــلاگ هــفت خــط کــد


آموزش های برنامه نویسی
۳۵۹ نفر آنلاین
۱۴۲ عضو و ۲۱۷ مهمان در سایت حاضرند

باز شدن بیش از حد فرم

0 امتیاز

با سلام.من یه کد دارم که یه زمان از کاربر می گیره و تا موقعی که با زمان فعلی برابر نشده هیچ اقدامی انجام نده هر وقت برابر شد تو یه فرم دیگه یه پیغامی نمایش بده(که نمایش دادن پیغام موردی نیس)برای اینکار که مدام چک کنه گذاشتمش تو تایمر ولی وقتی به زمان فعلی می رسه 60 بار فرمو باز می کنه(طول مدت 1 دقیقه نمی خوامم کاربر ثانیه وارد کنه) چی کار کنم که فقط یه بار فرم باز شهاز متغیر کمکی هم (flag) هم استفده کردم نشد ..alarm یه متغیر که اینجوری تعریفش کردم

alarm = DateTime.ParseExact(textBox2.Text, "HH:mm", null);

اینم کدم:  

  private void timer1_Tick(object sender, EventArgs e)
        {
            time = time.AddSeconds(1);
            label1.Text = time.ToString("HH:mm:ss tt");//zamano neshon mide
            label2.Text=date.ToString("dd/MM/yyyy");

            if (alarm.ToShortTimeString() == DateTime.Now.ToShortTimeString())
            {
                timer1.Enabled = false;
                h = 1;
                form2 f2 = new form2();
                a = 0;
                f2.ShowDialog();
                
            }
         
            
        }

 

سوال شده فروردین 1, 1393  بوسیله ی Sher228 (امتیاز 167)   18 33 44
ویرایش شده فروردین 2, 1393 بوسیله ی Sher228

3 پاسخ

+3 امتیاز
 
بهترین پاسخ

سلام.

دلیل اینکه 60 بار فرم رو نشون میده احتمالا بخاطر این هست که intervalرو برابر 1000 میلی ثانیه (1 ثانیه) گذاشتی. در این حالت رویداد Tick هر 1 ثانیه یکبار اجرا میشه که شما داخلش فرم 2 رو new میکنی و نمایش میدی و دلیل اینکه 60 بار صورت میگیره اینه که براساس ساعت و دقیقه چک میکنی و هر دقیقه هم 60 ثانیه هست. مثلا 21:30 رو در نظر بگیر تا زمانیکه ساعت بشه 21:31 دقیقه، 60 بار رویداد Tick شما اجرا میشه.

این نکته رو دقت کنید که درون رویداد Tick باید timer رو غیر فعال کنید.(اول تایمر رو غیرفعال کنید و بعد فرم رو نمایش بدید).
روی سیستم خودم بصورت عملی تست کردم. مشکلی نبود. کدها رو کامل میذارم :

ابتدا توی رویداد Load ، تایمر رو start کنید :

timer1.Start();

حالا درون رویداد Tick ابتدا ساعت رو نمایش بدید و بعد ساعت جاری رو با ساعت مورد نظرتون چک کنید و ...

من فرض کردم فقط بر حسب دقیقه کار میکنی اگر بر حسب ثانیه هست دیگه نیازی به substring نخواهی داشت (در کد زیر متد substring ساعت و دقیقه رو میکشه بیرون).

من یک ساعت فرضی رو قرار دادم ( 13:03). شما به جاش ساعتی رو که از کاربر میگیری قرار بده (فقط یادت باشه حتما فرمتش به همین شکل باشه یعنی دو رقم ساعت، یه دو نقطه : و باز دو رقم دقیقه).

 private void timer1_Tick(object sender, EventArgs e)
        {
            LabelTime.Text = DateTime.Now.Hour.ToString("00:") + DateTime.Now.Minute.ToString("00:") +
                DateTime.Now.Second.ToString("00");
            if (LabelTime.Text.Substring(0, 5) == "13:03")
            {
                timer1.Stop();
                Form2 f2 = new Form2();
                f2.ShowDialog();
            }
        }

 

پاسخ داده شده فروردین 2, 1393 بوسیله ی veniz2008 (امتیاز 2,083)   1 5 21
انتخاب شد فروردین 5, 1393 بوسیله ی BlueBlade
نشد .کدو تو سوال گذاشتم دوباره(ویرایش کردم).البته من یه ساعتم دارم که نمی خوام اون بهم بخوره..
جواب قبلیم رو ویراش کردم و کدهایی رو که توی سیستم خودم تست کردم رو براتون گذاشتم.
موفق باشید.
+1 امتیاز
 
اول
Timer.Enabled=false; 
بعدش
                                 h = 1;
                form2 f2 = new form2();
                f2.ShowDialog();
                a = 0;

 

پاسخ داده شده فروردین 1, 1393 بوسیله ی daniyaltjm (امتیاز 840)   47 88 103
ممنون  ولی کار نمی کنه..
مگه میشه خوب اینطوری اول تایمر رو از کار میندازی و بعدش هم فرمتو نشون میدی دیگه. یعنی فرم هم نشون نمیده دیگه؟
نه همون 60 بارو نشون می ده..
+2 امتیاز

دلیلیش اینه که

toShortTimeString ثانیه رو حذف می کنه.و خروجی به این شکل در میاد مثلا 2:20 PM که باعث میشه به مدت 60 ثانیه این شرط درست باشه

نکته دوم وقتی که شما با

DateTime.Now.ToShortTimeString()

تاریخ رو چک می کنی ممکنه که جتی با رسیدن به زمان مورد نظر این if شرطش درست در نیاد  چون ممکنه برنامه در حال اجرای بقیه قسمت های کد باشه و زمان فعلی رو رد کنه.

شرط if رو به این شکل بنویس

// if(alarm==DateTime.Now)   in eshtebahe be hamoon dalili ke bala goftam         
if (alarm == time)
{
      //...
}

در ضمن به جای این که هر ثانیه 1 بار این شرط رو چک کنی راه بهتر و سریع ترش اینه که یک Timer جدا تعریف کنی که داخل این سوال pspcoder کدش رو گذاشته :

رسیدن به زمان مشخص در #C

پاسخ داده شده فروردین 2, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
...