PDA

View Full Version : نمایش ساعت و تاریخ در همه فرم ها با یک تایمر



elderado
چهارشنبه 18 مرداد 1391, 18:55 عصر
باسلام و خسته نباشید
دوستان چطور میشه با اضافه کردن یه تایمر به برنامه توی همه ی فرم ها ساعت و تاریخ رو از همون تایمر گرفت و نمایش داد؟

barnamenevisjavan
پنج شنبه 19 مرداد 1391, 00:31 صبح
توی سی شارپ نمیدونم ولی من توی وی بی دات نت به این صورت میتونم به اشیای فرم های دیگه دسترسی پیدا کنم و خوب معلومه کافیه روی اون یکی فرم ها یه لیبل بزاریم و این طوری کد بنویسیم:

form2.label1.text=timestring
form3.label1.text=timestring

توجه کن که من با کد
formx.object
به اشیای فرم های دیگه دسترسی پیدا میکنم که توی کد بالا formx نام فرم هستش و object هم نام شی(میتونه textbox/label/و... باشه)
شما میتونی این کد رو توی همون فرم یک بنویسی تبدیل به کد سی شارپش با خودت

the king
پنج شنبه 19 مرداد 1391, 00:40 صبح
باسلام و خسته نباشید
دوستان چطور میشه با اضافه کردن یه تایمر به برنامه توی همه ی فرم ها ساعت و تاریخ رو از همون تایمر گرفت و نمایش داد؟

یک تایمر که نه چون هر فرمی که تایمر داخلش قرار دهید تایمر خودش میشه و کاری به بقیه فرم ها نداره، اما شما حداقل دو شیوه رو
می توانید پیاده کنید :
1) کلاسی فرضا با نام MyForm بسازید که از Form ارث بری کنه و داخل کلاس اش یک Timer اختصاصی اونجور که می خواهید داشته باشه، بعد باید
در کل پروژه تون کد کلاس های فرم رو یک تغییر کوچک بدهید تا بجای Form از MyForm ارث بری کنند. اینطوری بصورت خودکار همه فرم هایتان
برای خودشان تایمری دارند و ساعت و تاریخ رو نشان می دهند، اما هر کدوم مستقل از سایر فرمها.

2) در یکی از فرم هایتان تایمری بسازید و داخل کدی اضافه کنید که در سایر فرم هایی که الان باز هستند ساعت و تاریخ رو نشون بده.
این روش یک عیب بزرگ داره، وقتی اون فرم شما به هر دلیلی بسته بشه و شیء اش نابوده بشه یا روال اون فرم به دلیلی مثلا بخاطر ShowDialog
شدن یک فرم دیگه متوقف بشه، دیگه تایمری در کار نیست و نمایش تاریخ در سایر فرم ها متوقف میشه.

روش اول به ظاهر بهتره فقط این زحمت رو داره که هر وقت فرمی جدیدی رو ساختید یک سطر از کد اش رو تغییر دهید تا از MyForm ارث بری کنه.
فرضا این کلاس MyForm ئه که باید در پروژه تان ایجاد اش کنید :

public class MyForm : System.Windows.Forms.Form
{
System.Windows.Forms.Timer _timer;

protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
_timer = new System.Windows.Forms.Timer();
_timer.Interval = 200;
_timer.Tick += new EventHandler(_timer_Tick);
_timer.Enabled = true;
}

void _timer_Tick(object sender, EventArgs e)
{
this.Text = DateTime.Now.ToString();
}
}


و اگه فرم Form2 تان اینه :

public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
.
.
.
}


این بخشی که از Form ارث بری می کنه رو تغییر دهید تا از MyForm ارث بری کنه :

public partial class Form2 : MyForm
{

اینکار رو باید در مورد همه فرم هایتان انجام بدهید.

حالا اگه کدتون رو اجرا کنید تاریخ و ساعت رو در عنوان فرم نشون میده.

elderado
پنج شنبه 19 مرداد 1391, 03:01 صبح
با تشکر فراوون از عزیزانی که به این تاپیک جواب دادن
کاری که میخواستم رو انجام دادم و مشکلم حل شد
ولی من متوجه نشدم بعضی از کد هایی که جناب the king نوشتن چیکار میکنن اگه لطف کنین زحمت توضیح این رو هم بکشید خیلی ممنون میشم
و یه سوال دیگه درباره نمایش تایمر
میشه فرمت نمایش تاریخ رو تغییر داد؟ در حالت دیفالت سال/روز/ماه نمایش داده میشه.آیا میشه کاری کرد که اینجوری نمایش بده؟ سال/ماه/روز
و آیا میشه کاری کرد که فقط تایم رو نمایش بدیم؟

mohammad.ardeshiri
پنج شنبه 19 مرداد 1391, 03:14 صبح
میشه این کدهارو توضیح بدین
base.OnLoad(e);
_timer = new System.Windows.Forms.Timer();
_timer.Interval = 200;
_timer.Tick += new EventHandler(_timer_Tick);
_timer.Enabled = true;

the king
پنج شنبه 19 مرداد 1391, 03:26 صبح
میشه این کدهارو توضیح بدین
base.OnLoad(e);
_timer = new System.Windows.Forms.Timer();
_timer.Interval = 200;
_timer.Tick += new EventHandler(_timer_Tick);
_timer.Enabled = true;

یکسری رخداد های استاندارد در Net. هستند مثل Load شدن فرم که یک متد مثل OnLoad براشون هست که با On شروع می شوند
و اگه اون متد رو اجرا کنید اون رخداد فراخوانی میشه. من این متد OnLoad رو override کردم تا کدی که داخلش می نویسم موقعی که
فرم Load میشه اجرا بشه. base.OnLoad کاری است که در کلاس Form انجام می شده. من نمی خواهم مانع اجرا شدنش
بشوم چون اگر اینکار رو بکنم اصلا رخداد Load فرم اتفاق نمی افته، من صرفا می خواهم کاری علاوه بر کار اصلی انجام بشه.
به همین جهت باید خودم base.OnLoad رو داخل کد فراخوانی بکنم تا اول اون انجام بشه و بعد کدی که خودم بهش اضافه می کنم.

کار اضافه ای که انجام میدم اینه، ساختن یک Timer جدید برای فرم :

_timer = new System.Windows.Forms.Timer();

تنظیم کردن Interval اش که هر 200 میلی ثانیه یکبار تیک Timer رخ بده :

_timer.Interval = 200;


وصل کردن متد timer_Tick_ به Timer تا با هر تیک اون متد اجرا بشه :

_timer.Tick += new EventHandler(_timer_Tick);


و فعال کردن تایمر :

_timer.Enabled = true;

elderado
پنج شنبه 19 مرداد 1391, 03:44 صبح
با عرض تشکر دوباره
این کد ها که اجرا میشه ساعت و تاریخ جای عنوان فرم رو میگیره
میشه تاریخ و ساعت رو جای دیگه از فرم قرار داد؟
من درباره تبدیل تاریخ میلادی به شمسی توی سایت گشتم ، مطالب زیادی هم بود ولی سطح بالا توضیح داده شده بود و چیزی نفهمیدم
میشه این کار و با این وضعی که الان هست و کد هایی که نوشتیم توضیح بدین که چیکار باید بکنیم؟

mohammad.ardeshiri
پنج شنبه 19 مرداد 1391, 03:47 صبح
داخل textbox برای اینکه در عنوان قرار نگیره خط آخر ننویس به جاش
Textbox1.tex = DateTime.Now.ToString();

elderado
پنج شنبه 19 مرداد 1391, 03:53 صبح
خب اینکه کد نمایش همون تایم و تاریخ توی یک تکست باکسه ممنون از جواب
برای تبدیل به تاریخ شمسی چیکار باید کرد؟

the king
پنج شنبه 19 مرداد 1391, 04:40 صبح
خب اینکه کد نمایش همون تایم و تاریخ توی یک تکست باکسه ممنون از جواب
برای تبدیل به تاریخ شمسی چیکار باید کرد؟
از اونجایی که کلاس MyForm هیچ کنترل اضافه ای چه textBox1 و چه label1 نداره اگر بخواهید تاریخ و ساعت رو
در جای خاصی روی فرم نمایش دهید یا باید در خود فرم (رخداد Paint) اینکار رو بکنید و یا همانطور که timer_
رو ساختیم، یک کنترل جدید رو داخل همون کلاس MyForm برای نمایش تاریخ و ساعت بسازید.


public class MyForm : System.Windows.Forms.Form
{
System.Windows.Forms.Timer _timer;

protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
_timer = new System.Windows.Forms.Timer();
_timer.Interval = 200;
_timer.Tick += new EventHandler(_timer_Tick);
_timer.Enabled = true;
}

protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawString(DateToPersian(DateTime.Now), this.Font, System.Drawing.Brushes.Black, 20, 20);
e.Graphics.DrawString(DateTime.Now.ToString("hh:mm:ss tt"), this.Font, System.Drawing.Brushes.Black, 20, 50);
}

private string DateToPersian(DateTime d)
{
System.Globalization.PersianCalendar persian
= new System.Globalization.PersianCalendar();
return string.Format("{0}/{1:00}/{2:00}"
, persian.GetYear(d), persian.GetMonth(d), persian.GetDayOfMonth(d));
}

void _timer_Tick(object sender, EventArgs e)
{
this.Invalidate(false);
}
}


رجوع شود به :
مشکل در جمع تاریخ سیستم (http://barnamenevis.org/showthread.php?349621)