نوشته شده توسط
esmael_g
با سلام مجدد بعد از اینکه مشکل تایمر حل شد حالا یه مشکل جدید دارم که هر کاری کردم حل نمی شه
ممنون میشم از دوستان اگه می تونن راهنماییم کنن بخدا گیرم بدجور این موارد رو هم هیچ جا ندیدم تا ازش منبعی دریافت کنم بازم ببخشید
چند تا نکته هست، نکته اول، تایمر از نظر زمانی اصلا کنترل دقیقی نیست، هم بخاطر سیستم زمان بندی اش و هم بخاطر صف انتظار پیام های پنجره. شما 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;