PDA

View Full Version : سوال: روش فعال ماندن timer بعد از رفتن به فورم دیگر



esmael_g
پنج شنبه 17 بهمن 1398, 23:14 عصر
با سلام و درود مشکل از اینجا شروع میشه فرض کنید یه تایمر داریم برای محاسبه کردن ( حالا هر چیزی باشه ) وقتی که به صفحه دیگه ای از برنامه می رم بر می گردم تایمر غیر فعال شده خلاصه انگاری تازه می خوام از اول شروع کنم
لطفا اگه راهی هست که بعد از رفتن به from های دیگه تایمر غیر فعال نشه ممنون میشم توضیح بدید که چجوری هست خیلی گشتم به نتیجه نرسیدم

تشکر

Mahmoud.Afrad
جمعه 18 بهمن 1398, 00:37 صبح
چجور برمیگردی؟ کد بزار.
اختمالا یک نمونه جدید از فرم دارای تایمر میسازی.

the king
جمعه 18 بهمن 1398, 00:56 صبح
با سلام و درود مشکل از اینجا شروع میشه فرض کنید یه تایمر داریم برای محاسبه کردن ( حالا هر چیزی باشه ) وقتی که به صفحه دیگه ای از برنامه می رم بر می گردم تایمر غیر فعال شده خلاصه انگاری تازه می خوام از اول شروع کنم
لطفا اگه راهی هست که بعد از رفتن به from های دیگه تایمر غیر فعال نشه ممنون میشم توضیح بدید که چجوری هست خیلی گشتم به نتیجه نرسیدم

تشکر
وقتی فرم جدید رو بصورت Modal باز می کنید (با ShowDialog)، روال پاسخگویی به رخداد های اون فرم قبلی متوقف میشه و تیک Timer هم که میخواد به همین طریق به پنجره فرم قبلی اطلاع داده بشه به همین ترتیب از کار می افته.
راه حل زیاد دارید. مثلا اون تایمر رو در یک نخ جدید اجرا کنید که مستقل از نخ فرم هاتون باشه، که اصلا برایش مطرح نباشه که چه فرمی فعال ئه.
یا اینکه فرم بعدی رو بصورت Modal باز نکنید، یعنی Show کنید، نه ShowDialog تا رخداد های فرم قبلی همچنان به روال عادی دریافت بشن.
اگه برای ساختن نخ در انجمن Task و BackgroundWorker و Thread رو جستجو کنید مثال زیاد پیدا می کنید.

the king
جمعه 18 بهمن 1398, 01:14 صبح
چجور برمیگردی؟ کد بزار.
اختمالا یک نمونه جدید از فرم دارای تایمر میسازی.
ظاهرا میان فرم شون رو ShowDialog میکنن و در ادامه میخوان Timer ای رو Enabled کنن تا کاری رو براشون در این فاصله انجام بده. می بینند که بعد بسته شدن فرم تازه سطر بعدی کد اجرا میشه و تازه میخواد Timer شروع به کار کنه.

esmael_g
جمعه 18 بهمن 1398, 09:30 صبح
ممنون از همگی اما بزارید بیشتر توضیح بدم
می خوام تایمر که فعال در بک گرند برنامه همچنان فعال بمونه مثال در صفحه اول یک تایمر دارم کار خاصی نمی کنه فقط داره فرضا ( شمارنده هست ) وقتی به صفحه دوم میرم و بازم به صفحه اول برمی گردم ( رفتن به صفحات به صورت تب هست البته تب رو به صورت کاستوم و اختصاصی خودم ساختم ) یعنی از تب کنترل خوب ویژوال استفاده نکردم
وقتی به تب دوم می رم و بعد بر می گردم تایمر صفحه اول غیر فعال شده

می خوام تایمر همچنان به کارش ادامه بده تا زمانی که خودم رو دکمه توفق کلیک کنم

فرمودید یه نخ بسازید دنبالشو می گیرم به شدت اگر شما هم چند لینک دارید که بتونه کمکی در این زمینه به من بکنه ممنون میشم راهنمایی کنید

یک نکته نمی خوام از ShowDialog استفاده کنم چون به صورت تب مانند ساختم قرار هر تب در جایی که براش تعریف کردم باز بشه نه اینکه هر کدوم به صورت جداگانه باز شن


Setting frm = new Setting();
Control[] Control = frm.Controls.Find("textBox1", false);
if (Control.Length != 0)
{
TextBox textBox = (TextBox)Control[0];
price = Convert.ToDouble(textBox.Text) / 3600;
timer += 1;
sec += 1;
if (sec > 59)
{
min += 1;
sec = 0;
if (min > 59)
{
hour += 1;
min = 0;
}
}
label4.Text = hour + ":" + min + ":" + sec;

label3.Text = Convert.ToString(Convert.ToInt32(price * (timer / 1)));
}

else
{
timer1.Enabled = false;
MessageBox.Show("نمی توانید فیلد قیمت را خالی بگذارید لطفا مجددا سعی نکنید ", "اخطار", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
کد های فوق شروع و محاسبه تایمر رو نشون میده

( فیلد قیمت تو یه صفحه دیگه هست که به این صفحه دسترسی دادم کاربر قیمت رو در صفحه دوم وارد می کنه در این صفحه هم ست میشه )


الان دقیقا می خوام این کد ها به صورت همیشگی فعال باشه تا زمانی که کاربر رو دکمه stop کلیک کنه

the king
جمعه 18 بهمن 1398, 11:38 صبح
ممنون از همگی اما بزارید بیشتر توضیح بدم
می خوام تایمر که فعال در بک گرند برنامه همچنان فعال بمونه مثال در صفحه اول یک تایمر دارم کار خاصی نمی کنه فقط داره فرضا ( شمارنده هست ) وقتی به صفحه دوم میرم و بازم به صفحه اول برمی گردم ( رفتن به صفحات به صورت تب هست البته تب رو به صورت کاستوم و اختصاصی خودم ساختم ) یعنی از تب کنترل خوب ویژوال استفاده نکردم
وقتی به تب دوم می رم و بعد بر می گردم تایمر صفحه اول غیر فعال شده

می خوام تایمر همچنان به کارش ادامه بده تا زمانی که خودم رو دکمه توفق کلیک کنم

فرمودید یه نخ بسازید دنبالشو می گیرم به شدت اگر شما هم چند لینک دارید که بتونه کمکی در این زمینه به من بکنه ممنون میشم راهنمایی کنید

یک نکته نمی خوام از ShowDialog استفاده کنم چون به صورت تب مانند ساختم قرار هر تب در جایی که براش تعریف کردم باز بشه نه اینکه هر کدوم به صورت جداگانه باز شن


Setting frm = new Setting();
Control[] Control = frm.Controls.Find("textBox1", false);
if (Control.Length != 0)
{
TextBox textBox = (TextBox)Control[0];
price = Convert.ToDouble(textBox.Text) / 3600;
timer += 1;
sec += 1;
if (sec > 59)
{
min += 1;
sec = 0;
if (min > 59)
{
hour += 1;
min = 0;
}
}
label4.Text = hour + ":" + min + ":" + sec;

label3.Text = Convert.ToString(Convert.ToInt32(price * (timer / 1)));
}

else
{
timer1.Enabled = false;
MessageBox.Show("نمی توانید فیلد قیمت را خالی بگذارید لطفا مجددا سعی نکنید ", "اخطار", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
کد های فوق شروع و محاسبه تایمر رو نشون میده

( فیلد قیمت تو یه صفحه دیگه هست که به این صفحه دسترسی دادم کاربر قیمت رو در صفحه دوم وارد می کنه در این صفحه هم ست میشه )


الان دقیقا می خوام این کد ها به صورت همیشگی فعال باشه تا زمانی که کاربر رو دکمه stop کلیک کنه
با توضیحاتی که دادید همون کاری رو انجام میدید که مدیر بخش (https://barnamenevis.org/member.php?71297-Mahmoud-Afrad) فرمودند، هر بار وارد یک Tab ای میشید برای اون Tab با new فرم جدیدی میسازید.
برای بازدید اول که از اون Tab دارید می کنید ساختن شیء ایرادی نداره، ولی وقتی قبلا اون رو باز کرده بودید و بازگشت به یک Tab دارید، باید از همون شیء قبلی استفاده میکردید، نه اینکه مجددا قرم بسازید.
شما وقتی از Tab ای به اون Tab قبلی بر میگردید، همون شی فرم قبلی رو نشون نمیدید، یک شیء جدید ازش میسازید، ظاهرش شبیه اش هست ولی همون قبلی نیست، جدید ئه.
یک لیستی یا آرایه ای یا دیکشنری ای داشته باشید که وقتی بین Tab ها جابجا میشید هر فرمی که ایجادش می کنید رو داخلش ثبت کنید.
برای این ثبتش کنید که وقتی میخواهید به فلان Tab برید چک نکرده یک فرم جدید نسازید، اول ببینید قبلا از اون فرم شیء ساخته اید یا نه. اگر در آرایه یا لیست یا دیکشنری مقدارش بود، اون رو نمایش بدید، فرم جدید نسازید.

کد Program.cs رو در پنجره Solution Explorer باز کنید و اونجا در ابتدای کلاس Program فیلد Forms رو تعریف کنید تا از همه فرم ها بهش دسترسی داشته باشید. دیکشنری بودنش کمک می کنه که در پیدا کردن یک فرم خاص بین مجموعه لازم نشه یکی یکی اعضاء رو بررسی کنید و از روی اسم فرم سریع پیداش کنید :

static class Program
{

public static Dictionary<string, Form> Forms = new Dictionary<string, Form>();



حالا شما بجای اینکه چک نکرده از Setting شیء بسازید اول چک می کنید که قبلا این شیء رو ساختید یا نه :

Setting frm;
if (Program.Forms.ContainsKey("Setting"))
{
frm = (Setting)Program.Forms["Setting"];
}
else
{
frm = new Setting();
Program.Forms.Add("Setting", frm);
}
Control[] Control = frm.Controls.Find("textBox1", false);
.
.
.


و روال بستن فرم هایی مثل Setting رو هم به مخفی شدن تغییر بدید تا مخفی بشه. اینطوری می توانیم یک شیء فرم رو بارها و بارها ببندیم و مجددا نشون بدیم :

private void Setting_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;
Hide();
}
}

esmael_g
جمعه 18 بهمن 1398, 12:10 عصر
موارد رو انجام دادم اما ظاهرا باید برنامه رو بزارم تا کامل متوجه روش کارش بشید
دو روزه شب روزم شده یکی تا الان همچین مدل برنامه ای نداشتم خودتون یه نگاه بندازید فک کنم کامل متوجه بشید منظورم رو


وقتی از تب کامپیوتر فرضا به تب گیم نت میرم شمارنده تایمر داخل کامپیوتر غیر فعال میشه ( داخل انجمن , گوگل , یوتوب , انجمن های خارجی ) همه رو گشتم اما هیچ کدوم اینی که من می خواستم رو داخلشون نداشتن دیگه واقعا بد جوری ناراحت کنندس
http://uupload.ir/view/067_gigigaming.rar/
(http://uupload.ir/view/067_gigigaming.rar/)

the king
جمعه 18 بهمن 1398, 12:58 عصر
موارد رو انجام دادم اما ظاهرا باید برنامه رو بزارم تا کامل متوجه روش کارش بشید
دو روزه شب روزم شده یکی تا الان همچین مدل برنامه ای نداشتم خودتون یه نگاه بندازید فک کنم کامل متوجه بشید منظورم رو


وقتی از تب کامپیوتر فرضا به تب گیم نت میرم شمارنده تایمر داخل کامپیوتر غیر فعال میشه ( داخل انجمن , گوگل , یوتوب , انجمن های خارجی ) همه رو گشتم اما هیچ کدوم اینی که من می خواستم رو داخلشون نداشتن دیگه واقعا بد جوری ناراحت کنندس
http://uupload.ir/view/067_gigigaming.rar/
(http://uupload.ir/view/067_gigigaming.rar/)

ببینید چی نوشتید :

private void button2_Click(object sender, EventArgs e)
{
childformS(new PcGame.PcMain());
}

این کد کاری نداره که قبلا PcMain ای ساخته بودید یا نه. هر بار سراغش برید یک نسخه جدیدش رو میسازه.

این کدها رو تغییر دادم :

private void button2_Click(object sender, EventArgs e)
{
PcGame.PcMain frm;
if (Program.Forms.ContainsKey("PcGame.PcMain"))
{
frm = (PcGame.PcMain)Program.Forms["PcGame.PcMain"];
}
else
{
frm = new PcGame.PcMain();
Program.Forms.Add("PcGame.PcMain", frm);
}
childformS(frm);
}

private void Setting_Click(object sender, EventArgs e)
{
Setting frm;
if (Program.Forms.ContainsKey("Setting"))
{
frm = (Setting)Program.Forms["Setting"];
}
else
{
frm = new Setting();
Program.Forms.Add("Setting", frm);
}
childformS(frm);
}



private void childformS(Form childForm)
{
if (activeForm != null)
activeForm.Hide();
activeForm = childForm;
if (openChildFrom.Controls.Contains(childForm) == false)
{
childForm.TopLevel = false;
childForm.FormBorderStyle = FormBorderStyle.None;
childForm.Dock = DockStyle.Fill;
openChildFrom.Controls.Add(childForm);
}
openChildFrom.Tag = childForm;
childForm.BringToFront();
childForm.Show();

}

esmael_g
جمعه 18 بهمن 1398, 13:03 عصر
دادش گلم واقعا ممنون بخدا افسردگی گرفته بودم می دونید درست می فرمایید هر بار دستور که برای باز کردن صفحه بچه بود از اول باز می کردم اخه حقیقتا من برنامه های که صفحاتش نیاز به باز شدن مجدد داشته باشه رو تا الان نساختم و اکثرا وقتی یه صفحه رو باز می کردم کارم شروع میشد صفحه و وقتی به صفحه دیگه ای می رفتم دیگه نیازی بهش نداشتم تا اینکه به این مورد برخوردم بخدا نجاتم دادید هر جور هم بهش فکر می کردم مغزم بدتر می ترکید از بس نمی دونستم باید چیکارش کنم خیلی آقایید بوالا بدبختانه تو نت هم چیزی نبود که بتونم روش حساب باز کنم

esmael_g
جمعه 18 بهمن 1398, 19:58 عصر
با سلام مجدد بعد از اینکه مشکل تایمر حل شد حالا یه مشکل جدید دارم که هر کاری کردم حل نمی شه

ببینید مقدار رو من از صفحه دوم ( در برنامه موجوده ) همون setting دارم به تایمر می دم یعنی کاربر در صفحه دوم داره قیمت رو میده در صفحه اصلی تایمر محاسبه رو انجام میده تا اینجا درست همچی هم حله اما مشکل اینجاست
وقتی start می کنم تایمر رو که کار می کنی stop هم نگهش می داره اما برای ریست چیکار کنم این بین مشکل ساز هست اومدم تو دکمه ریست
timer1.Enabled = false;
Setting frm;
if (Program.Forms.ContainsKey("Setting"))
{
frm = (Setting)Program.Forms["Setting"];
}
else
{
frm = new Setting();
Program.Forms.Add("Setting", frm);
}
Control[] Control = frm.Controls.Find("textBox1", false);

if (Control.Length != 0)

{
TextBox textBox = (TextBox)Control[0];
textBox.Text = "";
}

این شکلی عمل کردم بار اول ریست می کنه و خالی میشه اما برای بار دوم وقتی تایمر رو ریست می کنم فرضا اگه ثانیه دوم باشه ( البته رو هر ثانیه باشه همینه )‌
تایمر رو ریست کنی استارت که بزنی بازم از همون ثانیه شروع می کنه یعنی راهی باشه که بدون تغییر در setting و تغییر در مقدار داده شده به برنامه تایمر رو ریست کرد که مجددا از اول شروع به کار کنه

و یه مورد دیگه برای ثبت مقدار عددی در textbox داخل setting از این کد استفاده کردم

private void button1_Click_2(object sender, EventArgs e)
{
GiGiGaming.Properties.Settings.Default.A = textBox1.Text;
GiGiGaming.Properties.Settings.Default.Save();
}

در رویداد کلیک ثت و درون خود تیکس باکس هم یه متغییر که بیاد مقدار رو بگیره به این شکل

private void textsystem2_TextChanged(object sender, EventArgs e)
{
int number2 = Convert.ToInt32( textBox1.Text);
}


ممنون میشم از دوستان اگه می تونن راهنماییم کنن بخدا گیرم بدجور این موارد رو هم هیچ جا ندیدم تا ازش منبعی دریافت کنم بازم ببخشید

the king
جمعه 18 بهمن 1398, 20:47 عصر
با سلام مجدد بعد از اینکه مشکل تایمر حل شد حالا یه مشکل جدید دارم که هر کاری کردم حل نمی شه

ممنون میشم از دوستان اگه می تونن راهنماییم کنن بخدا گیرم بدجور این موارد رو هم هیچ جا ندیدم تا ازش منبعی دریافت کنم بازم ببخشید
چند تا نکته هست، نکته اول، تایمر از نظر زمانی اصلا کنترل دقیقی نیست، هم بخاطر سیستم زمان بندی اش و هم بخاطر صف انتظار پیام های پنجره. شما Interval اش رو تنظیم می کنید ولی دقیقا در اون فواصل زمانی مشخص شده تیک نمیزنه.
پس زمان رو بر حسب زمان شروع یعنی زمان Start اندازه بگیرید نه تعداد تیک ها.
نکته دوم اینه که برای جستجوی یک کنترل روی فرم Setting نیازی به Controls.Find ندارید. Modifiers کنترل مورد نظرتون رو public کنید تا راحت با نامش بهش دسترسی داشته باشید.
نکته سوم اینه که متوجه نشدم اون GiGiGaming.Properties.Settings.Default.A با مشکل تون چه ارتباطی داره. احتمالا میخواهید اولین بار که فرم باز میشه مقدار رو از GiGiGaming.Properties.Settings.Default.A بخونید در textBox1.Text قرارش بدید. یعنی در رخداد Form.Load اش.
نکته چهارم اینه که شما میخواستید textBox.TextLength رو بررسی کنید تا متن داخل اش خالی نباشه، اما بجاش Control.Length != 0 رو بررسی کردید که همیشه 1 ئه.

شما اجزاء یک ساعت رو تعریف کرده بودید :

public partial class PcMain : Form
{
double price;
int sec;
int min;
int hour;
int timer;


حذفشون می کنیم و با زمان جایگزینش می کنیم، public static تا از بیرون کلاس اون فرم راحت تغییرش بدیم :

public partial class PcMain : Form
{
private double price;
public static DateTime StartTime = DateTime.MinValue;


و شیوه نمایش اش هم این بود :

timer += 1;
sec += 1;
if (sec > 59)
{
min += 1;
sec = 0;
if (min > 59)
{
hour += 1;
min = 0;
}
}
label4.Text = hour + ":" + min + ":" + sec;

label3.Text = Convert.ToString(Convert.ToInt32(price * (timer / 1)));


که تغییرش می دهیم :

if (StartTime == DateTime.MinValue)
{
StartTime = DateTime.Now;
}
var elapsed = DateTime.Now.Subtract(StartTime);
label4.Text = elapsed.Hours + ":" + elapsed.Minutes + ":" + elapsed.Seconds;

label3.Text = Convert.ToString(Convert.ToInt32(price * elapsed.TotalSeconds));


حالا هر زمان خواستید تایمر رو ریست کنید، کافیه StartTime رو قرار بدید روی زمان فعلی :

private void button3_Click(object sender, EventArgs e)
{
StartTime = DateTime.Now;
var elapsed = DateTime.Now.Subtract(StartTime);
label4.Text = elapsed.Hours + ":" + elapsed.Minutes + ":" + elapsed.Seconds;
}


از بیرون اون فرم PcMain هم به این StartTime دسترسی دارید :

PcGame.PcMain.StartTime = DateTime.Now;


و اون مساله دسترسی به کنترل های روی فرم، فرم Setting رو در حالت طراحی باز کنید، روی textBox1 کلیک کنید و در پنجره Properties اون مشخصه Modifiers اش رو قرار بدید روی Public
حالا بجای این کد :

Control[] Control = frm.Controls.Find("textBox1", false);
if (Control.Length != 0)
{
TextBox textBox = (TextBox)Control[0];
price = Convert.ToDouble(textBox.Text) / 3600;


از اسمش استفاده کنید :

if (frm.textBox1.TextLength != 0)
{
price = Convert.ToDouble(frm.textBox1.Text) / 3600;

esmael_g
جمعه 18 بهمن 1398, 21:07 عصر
موارد فوق درست شد ولی الان مشکل اینه قیمت که تایمر اول که همین مورد که حلشده محاسبه می کنه خیلی بیشتره برای مثال تایمر سیستم دوم در ثانیه 17 عدد 135 و سیستم دوم ( همونی که خودم نوشتم عدد 118 رو محاسبه می کنه ) و اگه ماشین حساب دست بگیریم می بینیم دومی درست محاسبه کرده در حالی که اولی خیلی جلو افتاده یه چیز عجیب الان متوجه شدم وقتی رو ریست مدام کلیک می کنم رو ثانیه اول یه بار عدد 7 رو میاره یه بار 2 رو میاره یه بار 5 رو انگار نه انگار بهش عدد اولیه دادم


ویرایش ::: داداش حل شد مشکل از من بود از کدم از بس درش چرخیده بودم یه عدد اضافه بهش دادم حل ممنونم بازم شرمنده سرتو درد آوردم

فقط اون مشکل رندوم انتخاب کردن عدد در ثانیه اول رو هنوز داره ببین وقتی اولین اجرا رو می زنم درسته خوب کاملا درست اما وقتی ریست رو می زنم دیگه از تنظیم خارج میشه

the king
جمعه 18 بهمن 1398, 21:25 عصر
فقط اون مشکل رندوم انتخاب کردن عدد در ثانیه اول رو هنوز داره ببین وقتی اولین اجرا رو می زنم درسته خوب کاملا درست اما وقتی ریست رو می زنم دیگه از تنظیم خارج میشه
پیشنهاد می کنم که مقدار Interval رو کم کنید، شما روی 1000 قرارش داده بودید چون با تیک ها می خواستید ثانیه ها رو بشمرید، الان که برای نمایش زمان فعلی استفاده میشه بهتره مقداری مثل 100 الی 200 باشه تا سریع نسبت به تغییرات زمانی واکنش نشون بده.

esmael_g
شنبه 19 بهمن 1398, 08:32 صبح
پیشنهاد می کنم که مقدار Interval رو کم کنید، شما روی 1000 قرارش داده بودید چون با تیک ها می خواستید ثانیه ها رو بشمرید، الان که برای نمایش زمان فعلی استفاده میشه بهتره مقداری مثل 100 الی 200 باشه تا سریع نسبت به تغییرات زمانی واکنش نشون بده.

سلام و روز خوش این مورد رو دیروز انجام دادم و دقیق تر شد تایمر و شمارنده اما امروز با یه مشکل جدید برخورد کردم تایمر هم استارت میشه هم ریست اما وقتی رو دکمه توقف می زنم متوقف میشه فرضا رو ثانیه ده ولی وقتی ( فرض کنیم ده ثانیه صبر می کنم ) دوباره استارت رو می زنم به ثانیه 20 پرش می کنه یعنی عملا تایمر هنوزم به کار خودش ادامه داده نه اینکه بیاد توقف پیدا کنه

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

ظاهرا مواردی مثل
time.enable=false;
timer.stop();
این موارد کارساز نیست

خواهشا کمکی بکنید چون تایمر با زمان کار می کنه وقتی تایمر رو متوقف می کنم زمان توقف نداره datetime قابلیت ایست نداره کامل غیر فعال میشه اما توقف نداره تا جایی که دانشش رو داشتم هر مدلی که می دونستم رو تست کردم اما جواب گو نبود لطفا اگه می دونید کمک کنید

ژیار رحیمی
شنبه 19 بهمن 1398, 13:34 عصر
با سلام و درود مشکل از اینجا شروع میشه فرض کنید یه تایمر داریم برای محاسبه کردن ( حالا هر چیزی باشه ) وقتی که به صفحه دیگه ای از برنامه می رم بر می گردم تایمر غیر فعال شده خلاصه انگاری تازه می خوام از اول شروع کنم
لطفا اگه راهی هست که بعد از رفتن به from های دیگه تایمر غیر فعال نشه ممنون میشم توضیح بدید که چجوری هست خیلی گشتم به نتیجه نرسیدم

تشکر

سلام
برای محاسبه مبلغ از تایمر استفاده نمیکنن.روش پیاده سازی شما اشتباه هست هر چند با کمک دوستان تا جایی پیش رفتید.روش های بهتری هم هست اگر شما توضیح بدید که میخواید چه چیزی رو پیاده سازی کنید دوستان راه های بهتری رو به شما پیشنهاد میدهند.

esmael_g
شنبه 19 بهمن 1398, 13:59 عصر
سلام
برای محاسبه مبلغ از تایمر استفاده نمیکنن.روش پیاده سازی شما اشتباه هست هر چند با کمک دوستان تا جایی پیش رفتید.روش های بهتری هم هست اگر شما توضیح بدید که میخواید چه چیزی رو پیاده سازی کنید دوستان راه های بهتری رو به شما پیشنهاد میدهند.

سلام
ببینید سادس نرم افزار کافی نتی هست که قرار برحسب تایمی که مشتری می شینه قیمت رو محاسبه می کنه
قیمت رو مدیریت خودش به نرم افزار میده ( البته در یک صفحه دیگه )
ببینید قیمت وقتی مدیریت به نرم افزار داد باید ثابت بشه بمونه

در این میان استارت که زده شده باید عملیان محاسبه انجام بشه که میشه
عملیات ریست هم پیش میره اما وقتی دکمه توقف رو میزنم دو حالت بیشتر نمی تونم به برنامه بدم
حالت اول توقف می کنه به ظاهر اما در واقعیت داره ادامه میده به کارش و وقتی استارت رو بزنیم هر چند ثانیه که توقف رو زده بودیم بهش اضاقه میشه انگار نه انگار توقف زده بودیم
حالت دوم هم که توقف می کنه اما کلا صفرش می کنه نه اینکه کلا متوقف بشه امیدوارم توضیحاتم کافی باشه اگر جاییش رو متوجه نشدید لطفا بگید

لطفا اگه ممکنه کمک کنید هر گوشه رو که می گیرم یه گوشش باز میشه

the king
شنبه 19 بهمن 1398, 15:27 عصر
سلام و روز خوش این مورد رو دیروز انجام دادم و دقیق تر شد تایمر و شمارنده اما امروز با یه مشکل جدید برخورد کردم تایمر هم استارت میشه هم ریست اما وقتی رو دکمه توقف می زنم متوقف میشه فرضا رو ثانیه ده ولی وقتی ( فرض کنیم ده ثانیه صبر می کنم ) دوباره استارت رو می زنم به ثانیه 20 پرش می کنه یعنی عملا تایمر هنوزم به کار خودش ادامه داده نه اینکه بیاد توقف پیدا کنه

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

ظاهرا مواردی مثل
time.enable=false;
timer.stop();
این موارد کارساز نیست

خواهشا کمکی بکنید چون تایمر با زمان کار می کنه وقتی تایمر رو متوقف می کنم زمان توقف نداره datetime قابلیت ایست نداره کامل غیر فعال میشه اما توقف نداره تا جایی که دانشش رو داشتم هر مدلی که می دونستم رو تست کردم اما جواب گو نبود لطفا اگه می دونید کمک کنید

یک پیشنهاد ساده دارم. شما یک متغیر ElapsedTime برای نگهداری زمان ذخیره شده در نظر بگیرید :

public partial class PcMain : Form
{
private double price;
public static DateTime StartTime = DateTime.MinValue;
public static TimeSpan ElapsedTime;


و وقتی تایمر رو متوقف کردید زمان سپری شده رو داخلش ثبت کنید :

private void button2_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
ElapsedTime = DateTime.Now.Subtract(StartTime);
}


و وقتی تایمر رو مجددا راه می اندازید اون زمان رو در زمان شروع اعمال کنید :

private void button1_Click(object sender, EventArgs e)
{
StartTime = DateTime.Now.Subtract(ElapsedTime);
timer1.Enabled = true;
}

esmael_g
شنبه 19 بهمن 1398, 15:59 عصر
یک پیشنهاد ساده دارم. شما یک متغیر ElapsedTime برای نگهداری زمان ذخیره شده در نظر بگیرید :

public partial class PcMain : Form
{
private double price;
public static DateTime StartTime = DateTime.MinValue;
public static TimeSpan ElapsedTime;


و وقتی تایمر رو متوقف کردید زمان سپری شده رو داخلش ثبت کنید :

private void button2_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
ElapsedTime = DateTime.Now.Subtract(StartTime);
}


و وقتی تایمر رو مجددا راه می اندازید اون زمان رو در زمان شروع اعمال کنید :

private void button1_Click(object sender, EventArgs e)
{
StartTime = DateTime.Now.Subtract(ElapsedTime);
timer1.Enabled = true;
}


از بقیه اساتید هم ممنونم اما جناب بزارید من از راه دورم شده دستتون رو ببوسم ایشالله هرچی بخوایی خدا بهتون بده خداییش وجودتون برام مثل یه پشتیبانی قوی بود اینم با کمک شما حل شد ایشالله که دیگه مشکلی برام پیش نیاد تو این بین
بازم ازتون ممنونم تشکر