Добро пожаловать,
Вывод даты в нужном формате
Код function CheckDateFormat(SDate: string): string;
var
IDateChar: string;
x, y: integer;
begin
IDateChar := '.,/';
for y := 1 to length(IDateChar) do
begin
x := pos(IDateChar[y], SDate);
while x > 0 do
begin
Delete(SDate, x, 1);
Insert('-', SDate, x);
x := pos(IDateChar[y], SDate);
end;
end;
CheckDateFormat := SDate;
end;
function DateEncode(SDate:string):longint;
var
year, month, day: longint;
wy, wm, wd: longint;
Dummy: TDateTime;
Check: integer;
begin
DateEncode := -1;
SDate := CheckDateFormat(SDate);
Val(Copy(SDate, 1, pos('-', SDate) - 1), day, check);
Delete(Sdate, 1, pos('-', SDate));
Val(Copy(SDate, 1, pos('-', SDate) - 1), month, check);
Delete(SDate, 1, pos('-', SDate));
Val(SDate, year, check);
wy := year;
wm := month;
wd := day;
try
Dummy := EncodeDate(wy, wm, wd);
except
year := 0;
month := 0;
day := 0;
end;
DateEncode := (year * 10000) + (month * 100) + day;
end;
Вычисление даты Пасхи
Код function Easter(Year: Integer): TDateTime;
{----------------------------------------------------------------}
{ Вычисляет и возвращает день Пасхи определенного года. }
{ Идея принадлежит Mark Lussier, AppVision <MLussier@best.com>. }
{ Скорректировано для предотвращения переполнения целых, если по }
{ ошибке передан год с числом 6554 или более. }
{----------------------------------------------------------------}
var
nMonth, nDay, nMoon, nEpact, nSunday,
nGold, nCent, nCorx, nCorz: Integer;
begin
{ Номер Золотого Года в 19-летнем Metonic-цикле: }
nGold := (Year mod 19) + 1;
{ Вычисляем столетие: }
nCent := (Year div 100) + 1;
{ Количество лет, в течение которых отслеживаются високосные года... }
{ для синхронизации с движением солнца: }
nCorx := (3 * nCent) div 4 - 12;
{ Специальная коррекция для синхронизации Пасхи с орбитой луны: }
nCorz := (8 * nCent + 5) div 25 - 5;
{ Находим воскресенье: }
nSunday := (Longint(5) * Year) div 4 - nCorx - 10;
{ ^ Предохраняем переполнение года за отметку 6554}
{ Устанавливаем Epact - определяем момент полной луны: }
nEpact := (11 * nGold + 20 + nCorz - nCorx) mod 30;
if nEpact < 0 then
nEpact := nEpact + 30;
if ((nEpact = 25) and (nGold > 11)) or (nEpact = 24) then
nEpact := nEpact + 1;
{ Ищем полную луну: }
nMoon := 44 - nEpact;
if nMoon < 21 then
nMoon := nMoon + 30;
{ Позиционируем на воскресенье: }
nMoon := nMoon + 7 - ((nSunday + nMoon) mod 7);
if nMoon > l 31 then
begin
nMonth := 4;
nDay := nMoon - 31;
end
else
begin
nMonth := 3;
nDay := nMoon;
end;
Easter := EncodeDate(Year, nMonth, nDay);
end; {Easter}
Генерация еженедельных списков задач
Мне необходима программа, которая генерировала бы еженедельные списки задач. Программа должна просто показывать количество недель в списке задач и организовывать мероприятия, не совпадающие по времени. В моем текущем планировщике у меня имеется 12 групп и планы на 11 недель.
Мне нужен простой алгоритм, чтобы решить эту проблему. Какие идеи?
Вот рабочий код (но вы должны просто понять алгоритм работы):
Код unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
const
maxTeams = 100;
var
Teams: array[1..maxTeams] of integer;
nTeams, ix, week, savix: integer;
function WriteBox(week: integer): string;
var
str: string;
ix: integer;
begin
Result := Format('Неделя=%d ', [week]);
for ix := 1 to nTeams do
begin
if odd(ix) then
Result := Result + ' '
else
Result := Result + 'v';
Result := Result + IntToStr(Teams[ix]);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
nTeams := StrToInt(Edit1.Text);
if Odd(nTeams) then
inc(nTeams); {должны иметь номера каждой группы}
ListBox1.Clear;
for ix := 1 to nTeams do
Teams[ix] := ix;
ListBox1.Items.Add(WriteBox(1));
for week := 2 to nTeams - 1 do
begin
Teams[1] := Teams[nTeams - 1];
{используем Teams[1] в качестве временного хранилища}
for ix := nTeams downto 2 do
if not Odd(ix) then
begin
savix := Teams[ix];
Teams[ix] := Teams[1];
Teams[1] := savix;
end;
for ix := 3 to nTeams - 1 do
if Odd(ix) then
begin
savix := Teams[ix];
Teams[ix] := Teams[1];
Teams[1] := savix;
end;
Teams[1] := 1; {восстанавливаем известное значение}
ListBox1.Items.Add(WriteBox(week));
end;
end;
end.
Дни в месяце
Код // Колическтво дней в любом месяце любого
// года можно получить с помощью EndOfAMonth
var
YYYY, MM, DD: Word;
D: TDateTime;
begin
DecodeDate(Date, YYYY, MM, DD);
D := EndOfAMonth(YYYY, {Номер месяца});
DecodeDate(D, YYYY, MM, DD); // DD - номер последнего дня в месяце
end;
За какое время было создано изображение
При нажатии на Button1 используется свойство Pixels, а при нажатии на Button2 - ScanLine. В заголовок окна выводится время в миллисекундах, за которое было создано изображение.
Код procedure TForm1.Button1Click(Sender: TObject);
var
t: cardinal;
x, y: integer;
bm: TBitmap;
begin
bm := TBitmap.Create;
bm.PixelFormat := pf24bit;
bm.Width := Form1.ClientWidth;
bm.Height := Form1.ClientHeight;
t := GetTickCount;
for y := 0 to bm.Height - 1 do
for x := 0 to bm.Width - 1 do
bm.Canvas.Pixels[x,y] := RG