Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2010, 08:31   #1
Belanserg
Новичок
Джуниор
 
Регистрация: 31.05.2009
Сообщений: 2
По умолчанию Календарь на Canvas

Всем доброго. Собственно проблема вот в чем, нашел исходник календаря на год, но не пойму как сделать чтобы выходные дни (Сб, Вс и все числа попадающие на выходной) отображались другим цветом, к примеру красным.

Код:
unit Unit1;

interface

uses
  Windows, SysUtils, Classes, Graphics, Forms;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  months:array[1..12] of byte;
const
  year=2009;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Caption:='Календарь на '+IntToStr(year)+' год';
Form1.Color:=clBlack;
months[1]:=31;
months[2]:=28+ord(IsLeapYear(year));
months[3]:=31;
months[4]:=30;
months[5]:=31;
months[6]:=30;
months[7]:=31;
months[8]:=31;
months[9]:=30;
months[10]:=31;
months[11]:=30;
months[12]:=31;
end;

procedure TForm1.FormPaint(Sender: TObject);
const // Настройки размеров календаря:
  MonthDX=150;
  MonthDY=135;
  DayDX=20;
  DayDY=15;
  MonthH=25;
var
  month, i, day:integer;
  s:string[2];
begin
  with Form1.Canvas do for month:=1 to 12 do begin
    // Вывод названия месяца:
    Font.Color:=clRed;
    Font.Name:='Times';
    Font.Size:=13;
    Font.Style:=[fsBold];
    TextOut((month - 1) mod 3 * MonthDX, (month - 1) div 3 * MonthDY, LongMonthNames[month]);
    Font.Color:=clLime;
    Font.Name:='Courier';
    Font.Size:=9;
    Font.Style:=[];
    // Вывод названий дней недели:
    for day:=1 to 7 do
      TextOut((month - 1) mod 3 * MonthDX, day mod 7*DayDY+(month-1) div 3*MonthDY+MonthH, ShortDayNames[(day + 1) mod 7 + 1]);
    // Определение дня недели первого числа месяца:
    day:=DayOfWeek(EncodeDate(year, month, 1))-2;
    if day < 0 then inc(day, 7);
    // Вывод чисел:
    for i := 1 to months[month] do begin
      str(i: 2, s);
      Font.Color:=clWhite;
      Font.Style:=[];
      TextOut(day div 7*DayDX+(month-1) mod 3*MonthDX+DayDX, day mod 7*DayDY+(month-1) div 3*MonthDY+MonthH, s);
      inc(day);
    end;
  end;
end;
end.

Последний раз редактировалось Stilet; 12.04.2010 в 11:48.
Belanserg вне форума Ответить с цитированием
Старый 12.04.2010, 11:14   #2
Belanserg
Новичок
Джуниор
 
Регистрация: 31.05.2009
Сообщений: 2
По умолчанию

Проблема решена, тема может быть закрыта
Belanserg вне форума Ответить с цитированием
Старый 12.04.2010, 12:13   #3
quit
Я есть!
Форумчанин
 
Аватар для quit
 
Регистрация: 17.02.2008
Сообщений: 318
По умолчанию

Решение проблемы бы выложили, чтобы другие потом не задавались вопросами.
©Учиться, учиться и еще раз учиться!
quit вне форума Ответить с цитированием
Старый 12.04.2010, 13:28   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Решение проблемы бы выложили, чтобы другие потом не задавались вопросами.
дык, всё же прозрачно..
ну, например, проблему можно решить так:
Код:
...
    // Вывод чисел:
    for i := 1 to months[month] do begin
      str(i: 2, s);
      case (day mod 7) of
        0..4:  Font.Color:=clWhite; // понедельник-пятница
        5   :  Font.Color:=clGreen;  // суббота
        6   :  Font.Color:=clYellow;  //  воскресение
      end;
      Font.Style:=[];
      TextOut(day div 7*DayDX+(month-1) mod 3*MonthDX+DayDX, day mod 7*DayDY+(month-1) div 3*MonthDY+MonthH, s);
      inc(day);
    end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.04.2010, 13:31   #5
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Ещё так:
Код:
    for i := 1 to months[month] do
    begin
      str(i:2, s);
      if (DayOfWeek(EncodeDate(year, month, i)) in [1, 7]) then
      begin
       Font.Color := clRed;
       Font.Style := [fsBold];
      end
       else
      begin
       Font.Color:=clWhite;
       Font.Style:=[];
      end;
      TextOut(day div 7*DayDX+(month-1) mod 3*MonthDX+DayDX, day mod 7*DayDY+(month-1) div 3*MonthDY+MonthH, s);
      inc(day);
    end;
Резульат DayOfWeek(const DateTime: TDateTime): Word;
1: Воскресенье
2: Понедельник
3: Вторник
4: Среда
5: Четверг
6: Пятница
7: Суббота
Alter вне форума Ответить с цитированием
Старый 12.04.2010, 14:27   #6
quit
Я есть!
Форумчанин
 
Аватар для quit
 
Регистрация: 17.02.2008
Сообщений: 318
По умолчанию

Serge_Bliznykov, кому то же было не ясно) значит, есть вероятность, что подобный вопрос будут задавать другие
ну, а если человек избавился от проблемы, пусть скажет ее решение...

ps
я как бы написал, чтобы потом темы не плодились.
©Учиться, учиться и еще раз учиться!
quit вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Календарь krikaved Общие вопросы Delphi 2 25.03.2010 22:58
Календарь в VS Faridik Общие вопросы .NET 0 18.02.2010 09:39
Календарь ruavia3 Microsoft Office Excel 6 16.04.2009 15:32
Календарь-органайзер r00xus Компоненты Delphi 4 07.12.2008 14:41