Помощь - Поиск - Пользователи - Календарь
Полная версия: Класс календаря.
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Egor Vladimirovich
Условие. Календарь. Реализовать класс календаря с возможностью получения дня
недели для даты, числа дней в i месяце,начиная с текущего,определение
высокосного года! Как это реализовать в Delphi?
klem4
Посмотри здесь : FAQ: Задачи, связанные с календарем
Egor Vladimirovich
Спс. Там уже смотрел. Нужно реализовать класс. Создать свой модуль)
volvo
Ну, так в чем проблема? Поменяй заголовки процедур функций на методы, и сделай класс...
мисс_граффити
зачем менять? просто в кучу собрать...
Egor Vladimirovich
Подскажите в чем ошибка? Убрал все лишнее из пирмера. Пытаюсь откомпилировать в делфи,появляеться ошибка(


Код
unit kalendar;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;


type
  Tdate = class
   d : byte;      
   m : byte;      
   y : integer;  
  end;

  Tstyle = (grigorian, julian);

function numofday(dat : tdate; style : tstyle) : longint;
function  dayofweek(dat : tdate; style : tstyle) : byte;
function lenofmonth(month : byte; year : word; style : tstyle) : byte;
function isleap(year : integer):boolean;  

type
  TForm1 = class(TForm)
    
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation


{***************************************************************************}

  function numofday;
     var
          stcor : integer;
     begin

          if style = grigorian then
               begin
                    stcor := 2-dat.y div 100+dat.y div 400;
                    if ((dat.y mod 100 = 0) and (dat.y mod 400 <> 0)) and (dat.m <= 2) then stcor := stcor + 1;
               end
                               else
               begin
                    stcor := 0;
               end;

          inc(dat.m);

          if dat.m <= 3 then
               begin
                    dat.m := dat.m+12;
                    dec(dat.y);
               end;
          numofday := (36525*dat.y) div 100 + (306*dat.m) div 10 + stcor + dat.d;
     end;

{***************************************************************************}

  function dayofweek;
     var

          day                 : byte;
          buf                 : longint;
     begin
          buf := numofday(dat, style);
          buf := buf+4;
          day := buf mod 7;
       if day = 0 then day := 7;
          dayofweek := day;
     end;

{***************************************************************************}

function lenofmonth;
     var
          len                 : byte;
     begin
          case month of
               2 : begin
                        if year mod 4 = 0 then len := 29
                                          else len := 28;
                        if (style = grigorian) and (year mod 100 = 0) and (year mod 400 > 0) then len := 28;
                   end;
               4, 6, 9, 11 : len := 30
               else len := 31;
          end;
          lenofmonth := len;
     end;

{***************************************************************************}

function isleap;
     begin
          isleap := (((year mod 4 = 0) and (year mod 100 <> 0)) or (year mod 400 = 0));
     end;


end.
volvo
Цитата
Пытаюсь откомпилировать в делфи,появляеться ошибка(
blink.gif У меня в Delphi 6 все откомпилировалось нормально... Какая у тебя ошибка, и где возникает?
Egor Vladimirovich
Ошибка при компеляции такая "Project1.exe raised exception class EresNotFound with message 'Resource Tform1 not found".Prossec Stoped.Use step or run cont...."
volvo
Ничего подобного... ЭТО - не ошибка компиляции, а ошибка времени выполнения. Ты запустил свою программу, и она выдала тебе это исключение...

Ничего не могу сказать, ибо не знаю, где именно у тебя возникает исключение. Может, в твоем коде? Ни одного слова связанного с модулем Kalendar я не нашел...
Atos
Стоп, Egor Vladimirovich, ты пытаешься откомпилировать один модуль, без проекта? Тогда понятно, почему ошибка - форма-то не создана.
Egor Vladimirovich
Вроде разобрался) Спасибо! Еще один вопрос! Почему при работе выдает ошибку в это куске программы :

~~~~~~~~~~~~~~~~~~~~~
dat.d:=strtoint(edit5.text);
dat.m:=strtoint(edit6.text);
dat.y:=strtoint(edit7.text);
~~~~~~~~~~~~~~~~~~~~~

Но прекрасно работает если присваивать значания самому:
Например:

~~~~~~~~~~~~~~~~~~~~~
dat.d:=18; dat.m:=10; dat.y:=2006;
~~~~~~~~~~~~~~~~~~~~~

Описание Tdate:

~~~~~~~~~~~~~~~~~~~~~
type
Tdate = class
d : byte;
m : byte;
y : integer;
end;
~~~~~~~~~~~~~~~~~~~~~
Гость
Помогите написать свойства( property ) для функций:

function numofday(dat : tdate; style : tstyle) : longint;
function dayofweek(dat : tdate; style : tstyle) : byte;
function lenofmonth(month : byte; year : word; style : tstyle) : byte;
function isleap(year : integer):boolean;
мисс_граффити
Свойства для функций - это как?
Что они делают?
Egor Vladimirovich, КАКУЮ ошибку?
Во время РАБОТЫ или при компиляции?
Egor Vladimirovich
мисс_граффити Свойства для методов например:
function numofday(dat : tdate; style : tstyle) : longint;
а свойство будет выглядеть так
property d:tdate; read d write d;( или как то так,особо разбираюсь)

С предъидущей ошибкой я разобрался... спс


мисс_граффити
так. то ли я в терминологии не понимаю, то ли не я.....
свойства - грубо говоря, это механизмы доступа к полям. так?
свойства отличаются от полей тем, что связаны с некоторыми действиями. Как минимум - просто записью и считыванием из поля. При желании - проверкой корректности ввода и дополнительными фишками (ну например: для класса "фигура" свойство "цвет" может обеспечивать перерисовку на экране).
что может ДЕЛАТЬ (не как выглядеть, а что делать? зачем оно нужно??) свойство для функции (или метода, не суть важно).
Egor Vladimirovich
Собственно во всем разобрался и все сделал,спасибо за помощь!!! Кто хочет может скачать и посмотреть exe файл!!! Пишите свои комментарии!!! smile.gif smile.gif smile.gif smile.gif smile.gif smile.gif
Egor Vladimirovich
Как реализовать процедуру поиска числа дней между 2 датами? дата в формате д.м.г! Помогите!
мисс_граффити
решалось.
см. FAQ
Egor Vladimirovich
Уже посмотрел, нашел только процедуру сравнения 2 дат(одна больше другой и т.д.) А то что мне нужно найти к сожалению не удалось. sad.gif
мисс_граффити
Самая первая задача.
То же самое, только наоборот: по времени и дате вычисляется другая дата.
Egor Vladimirovich
Цитата(мисс_граффити @ 8.11.2006 19:09) *

Самая первая задача.
То же самое, только наоборот: по времени и дате вычисляется другая дата.

В Дельфи,в консоле не смог откомпилировать.Ругаеться на Inc(DayInMonth[2], Byte((CurrYear mod 4) = 0));!!
Как это можно записать по другому???
klem4
И на какую же ошибку система тебе указывает ? У меня откомпилировалось нормально.
мисс_граффити
 DayInMonth[2]:=DayInMonth[2]+Byte((CurrYear mod 4) = 0)

если тоже не откомпилируется - напиши условный оператор.
Egor Vladimirovich
Цитата(мисс_граффити @ 8.11.2006 21:44) *

 DayInMonth[2]:=DayInMonth[2]+Byte((CurrYear mod 4) = 0)

если тоже не откомпилируется - напиши условный оператор.

Вот такая ошибка появляеться [Error] Project2.dpr(33): Left side cannot be assigned to

Я не понимаюююю! Помогите плз,завтра здавать,одной процедурки не хватает! (((
мисс_граффити
if ((CurrYear mod 4) = 0) then
DayInMonth[2]:=DayInMonth[2]+1

то есть если год високосный, делаем в феврале 29 дней.

кстати, по-моему, если год делится на 100, но не делится на 400 (ну например 1900, 1700) - он не високосный.
Egor Vladimirovich
2 мисс графити
откомпилировал,тока че то не разобрался как наоборот сделать( Я помоему дыбил)
Алена
Цитата
по-моему, если год делится на 100, но не делится на 400 (ну например 1900, 1700) - он не високосный.
yes2.gif

If ((CurrYear mod 4) = 0) and
not (((CurrYear mod 100) = 0) and ((CurrYear mod 400) <> 0)) then Inc(DayInMonth[2]);
Egor Vladimirovich
Помогите кто нибудь мне написать процедуру Вычисления количества дней,между 2 датами!!!!!!!!! mega_chok.gif mega_chok.gif
Malice
Цитата(Egor Vladimirovich @ 10.11.2006 11:48) *

Помогите кто нибудь мне написать процедуру Вычисления количества дней,между 2 датами!!!!!!!!! mega_chok.gif mega_chok.gif


Тебе нужна функция, переводящая дату в количество дней начиная с хз какой даты:
function days (y,m,d:integer):longint;
begin
if m<3 then begin dec (y); inc (m,12); end;
days:=round(int (y*365.25)+int ((m+1)*30.601)+d-int(y/100)+int (y/400));
end;

Для вычисления разницы между датами в самый раз.
Гость
Цитата(Malice @ 10.11.2006 13:04) *

Тебе нужна функция, переводящая дату в количество дней начиная с хз какой даты:
function days (y,m,d:integer):longint;
begin
if m<3 then begin dec (y); inc (m,12); end;
days:=round(int (y*365.25)+int ((m+1)*30.601)+d-int(y/100)+int (y/400));
end;

Для вычисления разницы между датами в самый раз.

Просто ОГРОМНОЕ СПАСИБО за помощь!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.