Технический форум
Вернуться   Технический форум > Программирование > Форум программистов


Ответ
 
Опции темы Опции просмотра
Старый 28.02.2012, 16:49   #21 (permalink)
Артём
votum separatum
 
Аватар для Артём
 
Регистрация: 05.05.2008
Сообщений: 14,603
Записей в дневнике: 52
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 18619
По умолчанию

Спасибо
Артём вне форума   Ответить с цитированием
Старый 28.02.2012, 17:19   #22 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от kreol Посмотреть сообщение
А с графикой в дельфи примерно то же самое что и в паскале. Только работа с канвой...
Да знаю - писал когда-то графические программы в 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.jpg  
Vladimir_S вне форума   Ответить с цитированием
Старый 29.02.2012, 02:02   #23 (permalink)
Eli
TEHNARI.RU
 
Аватар для Eli
 
Регистрация: 31.03.2008
Адрес: Израиль
Сообщений: 18,407
Записей в дневнике: 7
Сказал(а) спасибо: 10
Поблагодарили 1 раз в 1 сообщении
Репутация: 14157
По умолчанию

то есть - это создание граф.. Календаря через программирование?
Eli вне форума   Ответить с цитированием
Старый 29.02.2012, 09:51   #24 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Олег Посмотреть сообщение
то есть - это создание граф.. Календаря через программирование?
Ну да. Суть программы в том, чтобы по номеру года правильно определить день недели 1 января, учесть тип года (високосный/обычный), ну и расположить оптимально.
Хотя, если переводить на Delphi, то графика, скорее всего, и не нужна, достаточно организовать выдачу текстовой информации. Просто в DOS-Паскале в текстовой моде календарь не впихивается в экран (символы слишком большие), вот и пришлось перейти на графическую моду.
Vladimir_S вне форума   Ответить с цитированием
Старый 12.03.2012, 23:29   #25 (permalink)
artos
Member+
 
Регистрация: 08.10.2010
Сообщений: 563
Записей в дневнике: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1337
По умолчанию

Ну вот и подоспела делфи-версия Только вашего алгоритма я не понял немного, делал с нуля, но принцип тот же. Календарь можно сохранить в jpeg-е, напечатать(функция глючит немного пока что), задать цвет, шрифт, язык и отображение праздников.
eaeaiaeadhue3.jpg
Вложения
Тип файла: zip AnyYearCalendar.zip (234.0 Кб, 16 просмотров)
artos вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 12.03.2012, 23:38   #26 (permalink)
Daniellos
Хозяин Медной Горы
 
Аватар для Daniellos
 
Регистрация: 01.08.2011
Адрес: Армавир
Сообщений: 12,159
Записей в дневнике: 8
Сказал(а) спасибо: 751
Поблагодарили 88 раз(а) в 27 сообщениях
Репутация: 57416
По умолчанию

Цитата:
Сообщение от artos Посмотреть сообщение
artos
А где исходник
Daniellos вне форума   Ответить с цитированием
Старый 12.03.2012, 23:56   #27 (permalink)
artos
Member+
 
Регистрация: 08.10.2010
Сообщений: 563
Записей в дневнике: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1337
По умолчанию

Мне просто стыдно выкладывать исходник т.к. код уж очень убогий и абсолютно нечитабельный Ну ладно может кто разберется и оптимизирует...
Вложения
Тип файла: zip исходник AnyYearCalendar.zip (255.8 Кб, 15 просмотров)
artos вне форума   Ответить с цитированием
Старый 15.03.2012, 20:54   #28 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Так, потестировал. Увы - не пойдёт! Неправильно описан Григорианский календарь, алгоритм соответствует скорее Юлианскому. Объясняю.
В Юлианском календаре каждый четвертый год - високосный, т.е. в феврале 29 дней. А вот в принятом сейчас почти во всём мире Григорианском - чуть сложнее: вековые года (1900, 2100, 2200 и т.д) - невисокосные, кроме тех, что кратны 400. Таким образом, 2000, 2400 и т.п. - високосные, как и в Юлианском календаре. Именно поэтому дальнейшего расхождения календарей в 2000 году не произошло. А вот если существующая система сохранится до 2100 года, то после него Рождество переедет с 7 на 8 января, а Старый новый год - с 14 на 15.
Всё это в моей программе как раз учтено, а вот в Вашей - нет.
Ну и еще дефектик. У бедолаг вроде меня, предпочитающих низкое видеоразрешение (600х800) окно календаря не лезет в экран.
Если выберете время поправить - будет очень даже здорово.
Vladimir_S вне форума   Ответить с цитированием
Старый 15.03.2012, 21:08   #29 (permalink)
Daniellos
Хозяин Медной Горы
 
Аватар для Daniellos
 
Регистрация: 01.08.2011
Адрес: Армавир
Сообщений: 12,159
Записей в дневнике: 8
Сказал(а) спасибо: 751
Поблагодарили 88 раз(а) в 27 сообщениях
Репутация: 57416
По умолчанию

Вот подправил... Проверьте...


Ой, не то подправил...
Вложения
Тип файла: zip AnyYearCalendar.zip (226.4 Кб, 16 просмотров)
Daniellos вне форума   Ответить с цитированием
Старый 16.03.2012, 12:40   #30 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Daniellos Посмотреть сообщение
Вот подправил... Проверьте...
Проверил. Никаких изменений не увидел: например, 2100 год как был поставлен високосным, так им и остался, а должен быть обычным. И в экран не лезет...
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 19:16.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.