• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Определение даты Пасхи

А с графикой в дельфи примерно то же самое что и в паскале. Только работа с канвой...
Да знаю - писал когда-то графические программы в Delphi... вот только обленился и всё перезабыл. Ну ладно, вот текст программы-календаря. Пояснение: модуль GrfStart - самописный, он, помимо еще кое-каких мелочей, содержит процедуру INITIALIZE, в которой прописаны всякие там параметры графических драйверов, пути и собственно сама процедура InitGfaph.
Код:
USES GRAPH, GrfStart, CRT;
CONST
 NumDays:ARRAY[1..2,1..12] of WORD=((31,28,31,30,31,30,31,31,30,31,30,31),
                                    (31,29,31,30,31,30,31,31,30,31,30,31));
 Ds:ARRAY[1..7] of STRING=('Mo',
                           'Tu',
                           'We',
                           'Th',
                           'Fr',
                           'Sa',
                           'Su');
 Months:ARRAY[1..12] of STRING=('JANUARU',
                                'FEBRUARY',
                                'MARCH',
                                'APRIL',
                                'MAY',
                                'JUNE',
                                'JULY',
                                'AUGUST',
                                'SEPTEMBER',
                                'OCTOBER',
                                'NOVEMBER',
                                'DECEMBER');
 DY=12;
 DX=20;

VAR
 D400,M400,D100,M100,D4,M4,SumDays1,SumDays,Mo:LongInt;
 i,line,day,month,CurYear,X0,Y0,Xcur,Ycur:WORD;
 YearType,Cl,WeekDay,WeDa:ShortInt;

Function Int2Str(L : LongInt) : string;
{ Converts an integer to a string for use with OutText, OutTextXY }
var
  S : string;
begin
  Str(L, S);
  Int2Str := S;
end; { Int2Str }

PROCEDURE WD(CY,CM,CD:LongInt;VAR YT,DW:ShortInt);
BEGIN
 D400:=(CY-1) div 400;
 M400:=(CY-1) mod 400;
 D100:=M400 div 100;
 M100:=M400 mod 100;
 D4:=M100 div 4;
 M4:=M100 mod 4;
 SumDays1:=D400*146097+D100*36524+D4*1461+M4*365;
 SumDays:=SumDays1;

 M400:=CY mod 400;
 M100:=M400 mod 100;
 M4:=M100 mod 4;

 IF (M400=0) OR ((M100>0) AND (M4=0)) THEN YT:=2 ELSE YT:=1;
 FOR Month:=1 TO CM-1 DO
  SumDays:=SumDays+NumDays[YearType,Month];
 SumDays:=SumDays+CD;
 DW:=SumDays mod 7;
END;

BEGIN
 WRITE('Enter the year: '); Readln(CurYear);
 INITIALIZE;
 ClearDevice;
 SetTextStyle(TriplexScriptFont, HorizDir, 7);
 SetTextJustify(CenterText, TopText);
 SetColor(LightCyan);
 OutTextXY(320,10,Int2Str(CurYear));
 SetTextStyle(DefaultFont, HorizDir, 1);
 SetTextJustify(LeftText,TopText);
 FOR Line:=1 TO 3 DO
  FOR Day:=1 TO 7 DO
   BEGIN
    IF (Day=6) OR (Day=7) THEN SetColor(LightRed) ELSE SetColor(Yellow);
    X0:=30;
    Y0:=100+(Line-1)*120+Day*DY;
    OutTextXY(X0,Y0,Ds[Day]);
    X0:=610;
    OutTextXY(X0,Y0,Ds[Day]);
   END;
 FOR Mo:=1 TO 12 DO
  BEGIN
   SetTextStyle(DefaultFont, HorizDir, 1);
   SetTextJustify(CenterText,BottomText);
   SetColor(LightGreen);
   IF Mo<5 THEN
    BEGIN
     X0:=80+(Mo-1)*140;
     Y0:=100;
     OutTextXY(X0+50,Y0+4,Months[Mo]);
    END  ELSE
   IF Mo<9 THEN
    BEGIN
     X0:=80+(Mo-5)*140;
     Y0:=220;
     OutTextXY(X0+50,Y0+4,Months[Mo]);
    END  ELSE
    BEGIN
     X0:=80+(Mo-9)*140;
     Y0:=340;
     OutTextXY(X0+50,Y0+4,Months[Mo]);
    END;
   SetTextStyle(DefaultFont, HorizDir, 1);
   SetTextJustify(RightText,TopText);
   WD(CurYear,Mo,1,YearType,WeekDay);
   IF WeekDay=0 THEN WeDa:=1 ELSE WeDa:=8-WeekDay;
   FOR i:=1 TO NumDays[YearType,Mo] DO
    BEGIN
     IF i<=WeDa THEN Xcur:=0 ELSE Xcur:=(((i-1-WeDa) div 7)+1)*DX;
     IF i<=WeDa THEN Ycur:=(7-(WeDa-i))*DY ELSE Ycur:=((i-WeDa) mod 7)*DY;
     IF Ycur=0 THEN Ycur:=7*DY;
     IF (Ycur div DY = 6) OR (Ycur div DY = 7) THEN SetColor(LightRed)
       ELSE SetColor(Yellow);
     OUTTEXTXY(Xcur+X0,Ycur+Y0,Int2Str(i));
    END;
  END;
 ReadKey;
 CloseGraph;
END.
 

Вложения

  • ANY_YE01.webp
    ANY_YE01.webp
    45.6 KB · Просмотры: 104
то есть - это создание граф.. Календаря через программирование?
 
то есть - это создание граф.. Календаря через программирование?
Ну да. Суть программы в том, чтобы по номеру года правильно определить день недели 1 января, учесть тип года (високосный/обычный), ну и расположить оптимально.
Хотя, если переводить на Delphi, то графика, скорее всего, и не нужна, достаточно организовать выдачу текстовой информации. Просто в DOS-Паскале в текстовой моде календарь не впихивается в экран (символы слишком большие), вот и пришлось перейти на графическую моду.
 
Ну вот и подоспела делфи-версия:) Только вашего алгоритма я не понял немного, делал с нуля, но принцип тот же. Календарь можно сохранить в jpeg-е, напечатать(функция глючит немного пока что), задать цвет, шрифт, язык и отображение праздников.
календарь3.webp
 

Вложения

Мне просто стыдно выкладывать исходник т.к. код уж очень убогий и абсолютно нечитабельный:) Ну ладно может кто разберется и оптимизирует...
 

Вложения

Так, потестировал. Увы - не пойдёт! Неправильно описан Григорианский календарь, алгоритм соответствует скорее Юлианскому. Объясняю.
В Юлианском календаре каждый четвертый год - високосный, т.е. в феврале 29 дней. А вот в принятом сейчас почти во всём мире Григорианском - чуть сложнее: вековые года (1900, 2100, 2200 и т.д) - невисокосные, кроме тех, что кратны 400. Таким образом, 2000, 2400 и т.п. - високосные, как и в Юлианском календаре. Именно поэтому дальнейшего расхождения календарей в 2000 году не произошло. А вот если существующая система сохранится до 2100 года, то после него Рождество переедет с 7 на 8 января, а Старый новый год - с 14 на 15.
Всё это в моей программе как раз учтено, а вот в Вашей - нет.
Ну и еще дефектик. У бедолаг вроде меня, предпочитающих низкое видеоразрешение (600х800) окно календаря не лезет в экран.
Если выберете время поправить - будет очень даже здорово.
 
Вот подправил... Проверьте...


Ой, не то подправил... :tehnari_ru_942:
 

Вложения

Вот подправил... Проверьте...
Проверил. Никаких изменений не увидел: например, 2100 год как был поставлен високосным, так им и остался, а должен быть обычным. И в экран не лезет...
 
В Юлианском календаре каждый четвертый год - високосный, т.е. в феврале 29 дней. А вот в принятом сейчас почти во всём мире Григорианском - чуть сложнее: вековые года (1900, 2100, 2200 и т.д) - невисокосные, кроме тех, что кратны 400. Таким образом, 2000, 2400 и т.п. - високосные, как и в Юлианском календаре. Именно поэтому дальнейшего расхождения календарей в 2000 году не произошло. А вот если существующая система сохранится до 2100 года, то после него Рождество переедет с 7 на 8 января, а Старый новый год - с 14 на 15.
Если б я всё это знал... :) Ну ладно, будем исправлять. А вот с разрешением сложновато. Это получается надо пропорционально все размеры менять? Установить какой-нибудь общий коэфицент для прорисовки каждой части календаря и изменять его в зависимости от разрешения?
 
Этот можно вот так вот запросто написать .ехе программу? :tehnari_ru_211:
Преклоняю перед вами колени!
Программка для расчета Пасхи порадовала. А вот календарь закрывается, при нажатии на кнопки. Хотя может это аваст чудит... :)
 
А вот с разрешением сложновато. Это получается надо пропорционально все размеры менять? Установить какой-нибудь общий коэфицент для прорисовки каждой части календаря и изменять его в зависимости от разрешения?
Да уж это как получится.:)
 
Назад
Сверху