
نوشته شده توسط
You-See
ورودی و خروجی برای سادگی رشته گرفته شده. خیلی از مواقع در دیتابیس ها و البته گزارشات دسترسی به نوع استاندارد وجود نداره. البته اگر هم داشته باشه برای تبدیل به شمسی باز باید روز و ماه و سالش در بیاد. کار با رشته ساده تره، اما می تونستیم مثلا با نوع Word هم کار کنیم. اساس کار یک سری تبدیلات بر اساس اعداده، ورودی و خروجی چندان اهمیتی نداره، تو سرعت هم به چشم نمیاد

توضیح دادی، رفاقتمون سر جاش ولی از اونجایی که توی مسائل فنی خیلی جدی هستم توضیحاتت نتونست من رو قانع کنه.
چون شرایط مختلفی وجود داره حداقل برای تبدیل میلادی به شمسی ورودی باید به صورت TDateTime باشه و بجای استفاده از پردازش رشته برای بدست آوردن ماه، سال، و روز باید حتماً و حتماً از توابع داخل یونیت DateUtils که شامل توابع YearOf و MonthOf و DayOf هست استفاده بشه و استفاده از کد به کار رفته زیر اصلاً درست نیست:
function Date_IsValidDate(Dt: string; DateBase: TDateBase): boolean;var
DD, MM, YY: integer;
begin
if length(Dt) <> 10 then
begin
Result := false;
exit;
end;
DD := StrToInt(Copy(Dt, 9, 2));
MM := StrToInt(Copy(Dt, 6, 2));
YY := StrToInt(Copy(Dt, 1, 4));
// ...
end;
در حالت کلی برای انجام این تبدیلات استفاده از پردازش رشته و استفاده از تابع Copy و نظایر آن اشتباه ترین کار ممکن است. مثلاً در کد بالا فرض کن که تاریخ به صورت 2012/6/1 باشه و پشت ماه و روز عدد 0 نباشه. خوب حالا چه مشکلی به وجود میاد؟!
درسته در بالا طول 10 چک شده ولی چرا موقعی که صفر پشت ماه یا روز نوشته نشه تابع نباید درست کار کنه؟ واقعاً چرا؟