EnglishРусский  

   hello

   square

   easymath

   runini

   easyhtml

   calendar

   samefiles

   Продолжение следует

Реклама

Инсталлятор CreateInstall
Бесплатные и коммерческие инсталляторы

calendar

Закрепим наше знакомство с text функциями.

Пример 1

Создать календарь в виде HTML файла на указанный пользователем год.

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

congetstr( "Enter a year: ", year )
out @ calendar( uint( year ))
out.write( "calendar.htm" )
shell( "calendar.htm" )

В text функции calendar описываем переменную типа datetime и устанавливаем ей дату 1 января указанного года. Далее выводим заголовок HTML файла и приступаем к формированию календаря.

text  calendar( uint year )
\{ datetime  stime
   stime.setdate( 1, 1, year )
}<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE>Calendar for year \(stime.year)</TITLE>
<STYLE TYPE="text/css">
<!--
BODY {background: #FFF; font-family: Verdana;}
H1 {text-align: center; margin: 5px;}
TABLE {border: 0; border-spacing: 7px;}
TD {padding: 3px; border: 1px solid; text-align: center;}
#copy {font-size: smaller; text-align: center;}
-->
</STYLE>
</HEAD>
<BODY><H1>\(stime.year)</H1>
<TABLE ALIGN=CENTER>

Календарь разделим на три столбца и четыре строки. Переменная firstday будет хранить номер первого дня недели для текущего пользователя. dayofweek будет содержать номер дня недели для текущей даты. Названия месяцев на языке пользователя получим с помощью функции nameofmonth.

firstday = firstdayofweek()
dayofweek = stime.dayofweek
fornum i = 0, 4
{
   @"\l<TR>"
   fornum j = 1, 4
   {
      month = i * 3 + j
      @"\l<TD>\(nameofmonth( stemp,  month ))
<PRE>"
      ...
   }   
}

Для получения сокращенных названий дней недели воспользуемся функцией abbrnameofday. Так как для календаря используем вывод с одинаковой шириной всех символов, то нам необходимо добавлять недостающие пробелы. На каждый день отведем ширину в четыре символа.

fornum k = firstday, firstday + 7
{
   @"  \( abbrnameofday( stemp, k ).setlen( 2 ))"
}
@"  \l"
@"    ".repeat( ( 7 + dayofweek - firstday ) % 7 )

При выводе дней месяца выделяем красным воскресные дни - это когда dayofweek равен 0. Также следим за переносом строки после вывода последнего дня недели и в переменной lines сохраняем количество выведенных строк.

uint day = 1
uint lines
while day <= daysinmonth( year, month )
{
   if !dayofweek : @"<FONT COLOR=red>"
   @str( day++ ).fillspacel( 4 )
   if !dayofweek : @"</FONT>"

   dayofweek = ( dayofweek + 1 ) % 7
   if dayofweek == firstday 
   {
      @"  \l"
      lines++
   }
}

В заключении последнюю строку дополняем пробелами и выводим недостающие строки для того, чтобы все месяцы у нас имели одинаковую высоту.

@"    ".repeat( ( 7 + firstday - dayofweek ) % 7 )

while lines++ < 7 :  @"  \l"
@"</PRE>"

Пример вышел немного трудноватым для понимания из-за большого количества текста на языке HTML и дополнительного форматирования. С другой стороны, результат программы получился вполне приемлемый.

Исходники

Редактировать