PDA

View Full Version : ساخت تقویم شمسی بدون استفاده از کامپوننت



majid_i68
پنج شنبه 24 بهمن 1392, 22:28 عصر
سلام دوستان




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

linux
جمعه 25 بهمن 1392, 10:07 صبح
باید با gdi+ یکم نقاشی کنید!

majid_i68
جمعه 25 بهمن 1392, 22:28 عصر
چطور تاریخ های سالها و ماها و روزهای آینده رو نشون بدم و هر کدام متناسب با روزها قرار بگیرند

linux
جمعه 25 بهمن 1392, 23:17 عصر
چطور تاریخ های سالها و ماها و روزهای آینده رو نشون بدم و هر کدام متناسب با روزها قرار بگیرند
عزیز دل برادر مشکل شما ربطی به برنامه نویسی نداره!
هفته که هفت روز هست ماه هم سی یا سی و یک روز یا ۲۹ روز. شما یک جدول در نظر بگیر ۷*۵ یعنی ۵ ردیف و ۷ ستون از سمت راست هم شنبه و ... تا جمعه را در نظر بگیر. حتما بلد هستید که چطور بفهمید روز اول ماه x چه روزی هست. فکر کن روز اول ماه دوشنبه هست. پس ردیف اول شنبه و یکشنبه مقدار ندارند ولی مقدار دوشنبه ۱ هست همیطور تا آخر خوب شما بگو اولین روز ماهی اگر ۳ شنبه باشه ۲۵ ماه چند شنبه میشه و در کدام ستون و سطر قرار باید بگیرد؟

majid_i68
جمعه 25 بهمن 1392, 23:47 عصر
ممنونم از توضیحات خوب شما ..

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


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using Regex = System.Text.RegularExpressions.Regex;
using System.Collections;


namespace AppPersian
{
public struct PersianDate : IComparable,
IComparable<PersianDate>,
IComparer,
IComparer<PersianDate>,
ICloneable
{
#region Fields
private static readonly PersianCalendar calendar = new PersianCalendar();

public static readonly PersianDate MinValue = new PersianDate(1, 1, 1);
public static readonly PersianDate MaxValue = new PersianDate(1500, 12, 29, 11, 59, 59);

private string[] weekArray;
private string[] monthsArray;//

private int year;
private int month;
private int day;

private int hour;
private int minute;
private int second;


private DayOfWeek dayOfWeek;
#endregion

#region Ctor




//}

public PersianDate(int year, int month, int day, int hour, int minute, int second)
{

if (!PersianDate.ValidDate(year, month, day, hour, minute, second))
throw new ArgumentException("Date time is not valid");

this.year = year;
this.month = month;
this.day = day;
this.hour = hour;
this.minute = minute;
this.second = second;
weekArray = new string[] { "شنبه", "یکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه" };
monthsArray = new string[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند" };

var dt = calendar.ToDateTime(year, month, day, hour, minute, second, 0);

this.dayOfWeek = calendar.GetDayOfWeek(dt);
}

public PersianDate(int year, int month, int day) : this(year, month <= 0 ? 1 : month, day <= 0 ? 1 : day, 0, 0, 0) { }
#endregion

#region Props
public int Year
{
get { return year; }
//set
//{
// if (!PersianDate.ValidDate(value, month, day, hour, minute, second))
// throw new ArgumentException("Year is out of range");
// year = value;
//}
}

public int Month
{
get { return month; }
//set
//{
// if (!PersianDate.ValidDate(year, value, day, hour, minute, second))
// throw new ArgumentException("Month is out of range");
// month = value;
//}
}

public int Day
{
get { return day; }
//set
//{
// if (!PersianDate.ValidDate(year, month, value, hour, minute, second))
// throw new ArgumentException("Day is out of range");
// day = value;
//}
}

public int Hour
{
get { return hour; }
//set
//{
// if (!PersianDate.ValidDate(year, month, day, value, minute, second))
// throw new ArgumentException("Day is out of range");
// hour = value;
//}
}

public int Minute
{
get { return minute; }
//set
//{
// if (!PersianDate.ValidDate(year, month, day, hour, value, second))
// throw new ArgumentException("Day is out of range");
// minute = value;
//}
}

public int Second
{
get { return second; }
//set
//{
// if (!PersianDate.ValidDate(year, month, day, hour, minute, value))
// throw new ArgumentException("Day is out of range");
// hour = value;
//}
}

public DayOfWeek DayOfWeek
{
get { return dayOfWeek; }
}

public static PersianDate Now
{
get
{
return Parse(DateTime.Now);
}
}
#endregion

#region Methods

#region Static Methods

public static bool ValidDate(int year, int month, int day, int hour, int minute, int second)
{
bool result = true;
try
{
calendar.ToDateTime(year, month, day, hour, minute, second, 0);
}
catch (ArgumentException) { result = false; }
return result;
}

[Obsolete("please use valid date method ValidDate(1388,05,06,04,10,20) ")]
public static bool ValidDate(int year, int month, int day)
{
bool result = true;
try
{
calendar.ToDateTime(year, month, day, 0, 0, 0, 0);
}
catch (ArgumentException) { result = false; }
return result;
}

public static bool ValidDate(PersianDate persianDate)
{
return PersianDate.ValidDate(persianDate.Year, persianDate.Month, persianDate.Day, persianDate.Hour, persianDate.Minute, persianDate.Second);
}

public static int Compare2Date(PersianDate persianDate1, PersianDate persianDate2)
{


if (persianDate1.year > persianDate2.Year) return 1;
else if (persianDate1.year < persianDate2.Year) return -1;

if (persianDate1.month > persianDate2.Month) return 1;
else if (persianDate1.month < persianDate2.Month) return -1;

if (persianDate1.day > persianDate2.Day) return 1;
else if (persianDate1.day < persianDate2.Day) return -1;

if (persianDate1.hour > persianDate2.hour) return 1;
else if (persianDate1.hour < persianDate2.hour) return -1;

if (persianDate1.minute > persianDate2.Minute) return 1;
else if (persianDate1.minute < persianDate2.Minute) return -1;

if (persianDate1.second > persianDate2.Second) return 1;
else if (persianDate1.second < persianDate2.Second) return -1;

return 0;
}

public static PersianDate Parse(DateTime date)
{
PersianDate pd = new PersianDate(
calendar.GetYear(date),
calendar.GetMonth(date),
calendar.GetDayOfMonth(date),
calendar.GetHour(date),
calendar.GetMinute(date),
calendar.GetSecond(date));
pd.dayOfWeek = calendar.GetDayOfWeek(date);
return pd;

}

public static PersianDate Parse(string dateString)
{
return PersianDate.MinValue;


}
#endregion

#region Public Methods
public PersianDate AddHours(int value)
{
try
{
return (PersianDate)(((DateTime)this).AddHours(value));
}
catch (Exception ex) { throw ex; }
}

public PersianDate AddMinutes(int value)
{
try
{
return (PersianDate)(((DateTime)this).AddMinutes(value));
}
catch (Exception ex) { throw ex; }
}

public PersianDate AddSeconds(int value)
{
try
{
return (PersianDate)(((DateTime)this).AddSeconds(value));
}
catch (Exception ex) { throw ex; }
}

public PersianDate AddDays(int value)
{
try
{
return (PersianDate)(((DateTime)this).AddDays(value));
}
catch (Exception ex) { throw ex; }
}

public PersianDate AddMonths(int value)
{
try
{
return (PersianDate)(((DateTime)this).AddMonths(value));
}
catch (Exception ex) { throw ex; }
}

public PersianDate AddYears(int value)
{
try
{
return (PersianDate)(((DateTime)this).AddYears(value));
}
catch (Exception ex) { throw ex; }
}

public int GetDaysInMonth()
{
return calendar.GetDaysInMonth(year, month);
}
public int GetDaysInYear()
{
return calendar.GetDaysInYear(year);
}

#endregion

#region internal Method(s)
internal PersianDate GetLastSaturday()
{
PersianDate date = AddDays(-(day + 1));
return date.AddDays(-(GetWeekNo(date.dayOfWeek) - 1));
}
#endregion

#region Private Method(s)
private int GetWeekNo(DayOfWeek week)
{
switch (week)
{
case DayOfWeek.Saturday:
return 1;
case DayOfWeek.Sunday:
return 2;
case DayOfWeek.Monday:
return 3;
case DayOfWeek.Tuesday:
return 4;
case DayOfWeek.Wednesday:
return 5;
case DayOfWeek.Thursday:
return 6;
case DayOfWeek.Friday:
return 7;
}
return -1;
}
#endregion

#region Override Methods

/// <summary>
/// for example ToString(yyyy-MM-dd hh:mm:ss);
/// </summary>
/// <param name="format"></param>
/// <returns></returns>
public string ToString(string format)
{

format = Regex.Replace(format, "dd", day.ToString("00"));
format = Regex.Replace(format, "MM", month.ToString("00"));
format = Regex.Replace(format, "yyyy", year.ToString("0000"), System.Text.RegularExpressions.RegexOptions.Ignore Case);
format = Regex.Replace(format, "DD", weekArray[GetWeekNo(calendar.GetDayOfWeek((DateTime)this)) - 1]);
format = Regex.Replace(format, "ND", weekArray[GetWeekNo(dayOfWeek) - 1]);
format = Regex.Replace(format, "NM", monthsArray[month - 1]);

format = Regex.Replace(format, "hh", hour.ToString("00"));
format = Regex.Replace(format, "mm", minute.ToString("00"));
format = Regex.Replace(format, "ss", second.ToString("00"));

return format;
}

public override string ToString()
{
return string.Format("{0:D4}/{1:D2}/{2:D2} {3:D2}:{4:D2}:{5:D2}", year, month, day, hour, minute, second);
}

public override bool Equals(object obj)
{
if (obj is PersianDate)
return ((PersianDate)obj) == this;
return false;
}

public override int GetHashCode()
{
return this.ToString().GetHashCode();
}
#endregion

#endregion

#region Operators
public static bool operator ==(PersianDate persianDate1, PersianDate persianDate2)
{


return (
persianDate1.Second == persianDate2.Second &&
(persianDate1.Minute == persianDate2.Minute) &&
(persianDate1.Hour == persianDate2.Hour) &&
(persianDate1.Day == persianDate2.Day) &&
(persianDate1.Month == persianDate2.Month) &&
(persianDate1.Year == persianDate2.Year)

);



}

public static bool operator !=(PersianDate persianDate1, PersianDate persianDate2)
{

return !(
persianDate1.Second == persianDate2.Second &&
(persianDate1.Minute == persianDate2.Minute) &&
(persianDate1.Hour == persianDate2.Hour) &&
(persianDate1.Day == persianDate2.Day) &&
(persianDate1.Month == persianDate2.Month) &&
(persianDate1.Year == persianDate2.Year)
);
}

public static bool operator >(PersianDate persianDate1, PersianDate persianDate2)
{
return PersianDate.Compare2Date(persianDate1, persianDate2) == 1;
}

public static bool operator <(PersianDate persianDate1, PersianDate persianDate2)
{
return PersianDate.Compare2Date(persianDate1, persianDate2) == -1;
}

public static bool operator >=(PersianDate persianDate1, PersianDate persianDate2)
{
int res = PersianDate.Compare2Date(persianDate1, persianDate2);
return res == 1 || res == 0;
}

public static bool operator <=(PersianDate persianDate1, PersianDate persianDate2)
{
int res = PersianDate.Compare2Date(persianDate1, persianDate2);
return res == -1 || res == 0;
}
#endregion

#region Implicit Casting

public static implicit operator DateTime(PersianDate persianDate)
{
if (PersianDate.ValidDate(persianDate))
return calendar.ToDateTime(persianDate.Year, persianDate.Month, persianDate.Day, persianDate.Hour, persianDate.Minute, persianDate.Second, 0);
return DateTime.MinValue;
}

public static implicit operator PersianDate(DateTime date)
{
if (date.Equals(DateTime.MinValue))
return MinValue;
return Parse(date);
}

#endregion

#region IComparable Members

public int CompareTo(object obj)
{
if (!(obj is PersianDate))
new ArgumentException("obj is not PersianDate");

return CompareTo((PersianDate)obj);
}

#endregion

#region IComparable<PersianDate> Members

public int CompareTo(PersianDate other)
{
return PersianDate.Compare2Date(this, other);
}

#endregion

#region IComparer Members

public int Compare(object x, object y)
{
if (!(x is PersianDate))
throw new ArgumentException("x is not PersianDate");
if (!(y is PersianDate))
throw new ArgumentException("y is not PersianDate");

return PersianDate.Compare2Date((PersianDate)x, (PersianDate)y);
}

#endregion

#region IComparer<PersianDate> Members

public int Compare(PersianDate x, PersianDate y)
{
return PersianDate.Compare2Date(x, y);
}

#endregion

#region ICloneable Members

public object Clone()
{
return (PersianDate)this.MemberwiseClone();
}

#endregion

}//end class
}

linux
شنبه 26 بهمن 1392, 00:30 صبح
این کد به شما کمک میکند که تبدیل تاریخ میلادی به شمسی را راحتتر انجام دهید. اگر جواب سوال که پرسیدم را بدهید کلی مشکل برایتان حل خواهد شد

majid_i68
شنبه 26 بهمن 1392, 06:57 صبح
من روز از هفته و روز از سال رو میدونم ..اما برای روز از ماه نمیدونم چیکار کنم... این کلاسی که دادم ظاهرا کامل هست و آماده استفاده .چطور باید ازش استفاده کرد و مقدار رو ازش گرفت..

linux
شنبه 26 بهمن 1392, 07:37 صبح
من روز از هفته و روز از سال رو میدونم ..اما برای روز از ماه نمیدونم چیکار کنم... این کلاسی که دادم ظاهرا کامل هست و آماده استفاده .چطور باید ازش استفاده کرد و مقدار رو ازش گرفت..

از کلاس PersianCalendar می تونید استفاده کنید روز هفته را هم بدست بیارید. اطلاعات بیشتر MSDN

majid_i68
دوشنبه 28 بهمن 1392, 14:36 عصر
کسی نبود از این کلاس استفاده کنه

Mousavmousab
دوشنبه 28 بهمن 1392, 19:37 عصر
سلام
دوست عزیز دانلود این کامپوننت را بزارین ما هم آزمایش کنیم ببینیم چطوریه ؟

rasol_afkham
پنج شنبه 01 اسفند 1392, 19:41 عصر
--------------------------------------------