PDA

View Full Version : سوال: یه مشکل عجیب با label



morika
چهارشنبه 31 شهریور 1389, 16:54 عصر
سلام
راستش من به یه مشکل برخوردم که اصلا نمی دونم چی هست.
این کد رو نگاه کنید:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Label3.Text = "درحال بررسی"
If My.Computer.Network.IsAvailable Then
My.Computer.Network.DownloadFile("ftp://ftp.gigfa.com/htdocs/APconfig/version", "C:\Windows\System32\version", "gigfa_6053617", "*******")
My.Computer.FileSystem.DeleteFile("C:\Windows\System32\APconfig\version")
My.Computer.FileSystem.MoveFile("C:\Windows\System32\version", "C:\Windows\System32\APconfig\version")

Else
Label3.Text = "بروز رسانی جدید در دسترس نیست"
End If
End Sub
تو کد بالا وقتی رو دکمه کلیک میشه قسمت قرمز اجرا نمی شه ولی قسمت سبز اجرا میشه؟ چرا؟

kebriya
چهارشنبه 31 شهریور 1389, 17:09 عصر
کد قرمز رنگ هم اجرا میشه ولی چون دستور ifجوابش false است قسمت else اجرا میشه و دوباره متن label3 تغییر میکنه و شما فکر میکنید که کد قرمز رنگ اجرا نشده

reza6384
چهارشنبه 31 شهریور 1389, 17:42 عصر
این چیزی که میگید غیر ممکنه، از Break Point استفاده کنید ، اگر اون خط کد داخل بلوک if بود شاید به خاطر شرط اجرا نمیشد، اما چون شرطی وجود نداره حتما باید اجرا بشه.

morika
چهارشنبه 31 شهریور 1389, 18:33 عصر
این چیزی که میگید غیر ممکنه، از Break Point استفاده کنید ، اگر اون خط کد داخل بلوک if بود شاید به خاطر شرط اجرا نمیشد، اما چون شرطی وجود نداره حتما باید اجرا بشه.
راستش اگه عنوان این تاپیک رو ببینید متوجه می شید که من چی می گم. این کدی که من اینجا گذاشتم دقیقا عین کدی هست که تو برنامم نوشتم. خط قرمز اصلا داخل if نیست. تعجب منم از همینه. چون هر بلایی سر if بیاد اول از همه لیبل باید تکسش بشه "در حال بررسی" بعد شرط اجرا بشه. اما برنامه وقتی اجرا میشه. وقتی شما رو دکمه کلیک می کنی لیبل خالی میمونه و بعداز اجرا شدن شرط می نیویسه "بروزرسانی در دسترس نیست"

kebriya
چهارشنبه 31 شهریور 1389, 18:47 عصر
منظور منو نگرفتی. ببین خط اول حتما اجرا میشه ولی دستور داخل else اجازه نمایش نمیده واسه اینکه منظورمو بگیری دستور داخل else را غیرفعال کن تا ببینی که خط اول اجرا میشه.

xminxmin
چهارشنبه 31 شهریور 1389, 19:53 عصر
دوست من این کد رو قرار بده توی برنامه


Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Label3.Text = "درحال بررسی"

Application.DoEvents()

If My.Computer.Network.IsAvailable Then
My.Computer.Network.DownloadFile("ftp://ftp.gigfa.com/htdocs/APconfig/version", "C:\Windows\System32\version", "gigfa_6053617", "*******")
My.Computer.FileSystem.DeleteFile("C:\Windows\System32\APconfig\version")
My.Computer.FileSystem.MoveFile("C:\Windows\System32\version", "C:\Windows\System32\APconfig\version")

Else
Label3.Text = "بروز رسانی جدید در دسترس نیست"
End If
End Sub

morika
چهارشنبه 31 شهریور 1389, 21:01 عصر
منظور منو نگرفتی. ببین خط اول حتما اجرا میشه ولی دستور داخل else اجازه نمایش نمیده واسه اینکه منظورمو بگیری دستور داخل else را غیرفعال کن تا ببینی که خط اول اجرا میشه.
دوست عزیز راه حل شما کارگر نیست. می دونید چرا؟ چون زمانی که دستور if اجرا میشه تا برسه به else یه مدت زمان نسبتا طولانی رو طی می کنه. پس قبل از اینکه به Else برسه خیلی فرصت داره که لیبل رو طبق خواسته من تنظیم کنه
--------------------

دوست من این کد رو قرار بده توی برنامه


Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Label3.Text = "درحال بررسی"

Application.DoEvents()

If My.Computer.Network.IsAvailable Then
My.Computer.Network.DownloadFile("ftp://ftp.gigfa.com/htdocs/APconfig/version", "C:\Windows\System32\version", "gigfa_6053617", "*******")
My.Computer.FileSystem.DeleteFile("C:\Windows\System32\APconfig\version")
My.Computer.FileSystem.MoveFile("C:\Windows\System32\version", "C:\Windows\System32\APconfig\version")

Else
Label3.Text = "بروز رسانی جدید در دسترس نیست"
End If
End Sub

آقا دست شما درد نکنه کار کرد. ولی میشه واسه منو بقیه دوستان توضیح بدی قضیه چی بود و چرا با این کدی که شما دادی مشکل حل شد؟

Rezahak
چهارشنبه 31 شهریور 1389, 21:07 عصر
باید از application.doevents استفاده کنید کلا label کنترل کند و مشکل داری است
در تمام کنترلهایی که message ها پشت آنها گیر می افتند این دستور باعث می شود message ها flush شوند

xminxmin
چهارشنبه 31 شهریور 1389, 21:52 عصر
سلام عرض ادب


باید از application.doevents استفاده کنید کلا label کنترل کند و مشکل داری است

اصلا اينطور نيست! يه كنترل كاملا مفيد و بدون نقصه!



ی میشه واسه منو بقیه دوستان توضیح بدی قضیه چی بود و چرا با این کدی که شما دادی مشکل حل شد؟


خيلي آسونه! :چشمک:
دستور DoEvents كارش همينه!
از معني اش هم ميشه فهميد.
Do = انجام بده
Events = رويدادها
يه طورايي كاربرد سيستم عاملي داره. (Application)
هنگام پردازش برنامه و مخصوصا مشغول بودن پردازشگر به يه سري اعمال نسبتا سنگين ديگه يه سري از دستورات و رويدادها از كار مي افتند.
بطور مثال در برخي از اعمال ديگه دكمه Cancel به درستي كار نمي كنه!:عصبانی++:
به عبارتي سيستم انقدر سرش شلوغه كه ترجيح مي ده به كاري كه اكنون داره انجام ميده برسه تا توجه كنه به رويدادها و كارهاي جانبي كه همون موقع اتفاق مي افته!
با اين دستور سيستم رو مجبور ميكنيم كه به رويدادهاي اتفاق افتاده در حين پردازش توجه كنه و انجامشون بده!
همين!:لبخندساده:

reza6384
جمعه 02 مهر 1389, 20:13 عصر
آقا منم دقیقاً اومدم همین رو بگم که دیدم دوست عزیزمون گفتند، بله، باید از Application.Doevents استفاده کنید، چون زمانی که کلید زده میشه تا زمانی که رها میشه این ها اتفاق می افته و بروز شدن لیبل انجام نمیشه. در ضمن، اگر از Break Point و Add Watch استفاده کنید میبینید که اون خط کد قرمز اجرا میشه و اگر Label3.Text رو Add Watch میکردید میدیدید که Text آون هم تغییر میکنه، ولی در فرم نمایش داده نمیشه.