KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Валентин Озеров, "Советы по Delphi. Версия 1.4.3 от 1.1.2001" бесплатно, без регистрации.
Перейти на страницу:

Вычисление даты Пасхи II

Delphi 1

function easter (year: integer): tdatetime;

{----------------------------------------------------------------}

{ Вычисляет и возвращает день Пасхи определенного года.          }

{ Идея принадлежит Mark Lussier, AppVision < [email protected]>.  }

{ Скорректировано для предотвращения переполнения целых, если по }

{ ошибке передан год с числом 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 &gtl 31 then

 begin

  nMonth := 4;

  nDay := nMoon – 31;

 end

 else

 begin

  nMonth := 3;

  nDay := nMoon;

 end;

 Easter := EncodeDate(Year, nMonth, nDay);

end; {easter}

Преобразование даты в количество секунд

Delphi 1

EncodeDate возвращает объект TDateTime, который просто является double-числом. Для получения количества миллисекунд с даты 1/1/0001, умножьте результат на 86400000.0 Но чтобы избежать переполнения, лучше пользоваться более поздней датой.

Преобразование даты в неделю

Delphi 1

procedure TForm1.Button1Click(Sender: TObject);

var  frstDay,toDay : TDateTime; week : Integer;

begin

 frstDay := StrToDate('1/1/96');

 toDay := StrToDate(Edit1.Text);

 week := Trunc((toDay - frstDay) / 7) + 1;

 Label1.Caption := IntToStr(week);

end;

Преобразование даты

Delphi 1

procedure TForm1.Button1Click(Sender: TObject);

var

 st,formatsave : string;

 DT : TDateTime;

begin

 st := Edit1.text; // '1996-06-03 00.00.00'

 formatsave := ShortDateFormat;

 ShortDateFormat := 'yyyy.mm.dd hh.mm.ss';

 while pos ('-', st) > 0 do st [pos ('-', st)] := '.';

 DT := StrToDateTime(st);

 ShortDateFormat := formatsave;

 Label1.Caption := DateTimeToStr(DT);

end;

Преобразование даты — добавление столетия

Delphi 1

LongDate := FormatDateTime('ddmmyyyy', StrToDate(ShortDate));

Данный код преобразует дату, переданную в формате, определенном в виде короткой даты в Панели Управления (типа DD/MM/YY) в формат, заданный в строке Format (в нашем примере DDMMYYYY).

Если DD/MM/YY — входное поле, а DDMMYYYY — поле базы данных, то приведенный выше код может сослужить пользователю хорошую службу, если он вдруг захочет использовать другой формат даты, с его соответствующим переопределением в Панели Управления.

(Естественно, YYYYMMDD для поля базы данных при обычных обстоятельствах будет лучше чем DDMMYYYY, поскольку в настоящее время используется метод последовательной сортировки).

Приведение даты

Delphi 1

procedure TForm1.MaskEdit1Exit(Sender: TObject);

var

 y, m, d : word;

begin

 decodedate(strtodate(maskedit1.text) +  11, y, m, d);

 maskedit2.text := inttostr(m) + '/' + inttostr(d) + '/' + inttostr(y);

end;

Даты и недели

Delphi 1

У меня есть программа, которая делает примерно то, что вы хотите. Она сообщает для даты текущую неделю и день недели. Вам необходимо лишь реализовать вычисление предела для дат недели. Кроме того, формат в этом коде для дат задан в виде "06/25/1996".

Вы должны создать форму с именем "Forma", компонентом TEdit с именем "Edit1", четырьмя метками и кнопкой с именем "GetWeekBtn". Убедитесь в том, что обработчиком события формы OnCreate является метод FormCreate.

Надеюсь, что помог вам.

unit Forma;


interface


uses

 SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,Forms, Dialogs, StdCtrls;


type

 TForma1 = class(TForm)

  Edit1: TEdit;

  Label1: TLabel;

  Label2: TLabel;

  Label3: TLabel;

  GetWeekBtn: TButton;

  Label4: TLabel;

  procedure GetWeekBtnClick(Sender: TObject);

  procedure FormCreate(Sender: TObject);

 private { Private declarations }

  Function HowManyDays(pYear,pMonth,pDay:word):integer;

 public { Public declarations }

 end;


var

 Forma1: TForma1;


implementation


 {$R *.DFM}

Uses Inifiles;


procedure TForma1.FormCreate(Sender: TObject);

 var WinIni:TInifile;

begin

 WinIni:=TIniFile.Create('WIN.INI');

 WinIni.WriteString('intl','sShortDate','MM/dd/yyyy');

 WinIni.Free;

end;


Function TForma1.HowManyDays(pYear,pMonth,pDay:word):integer;

 var Sum:integer;

 pYearAux:word;

begin

 Sum:=0;

 if pMonth>1  then Sum:=Sum+31;

 if pMonth>2  then Sum:=Sum+28;

 if pMonth>3  then Sum:=Sum+31;

 if pMonth>4  then Sum:=Sum+30;

 if pMonth>5  then Sum:=Sum+31;

 if pMonth>6  then Sum:=Sum+30;

 if pMonth>7  then Sum:=Sum+31;

 if pMonth>8  then Sum:=Sum+31;

 if pMonth>9  then Sum:=Sum+30;

 if pMonth>10 then Sum:=Sum+31;

 if pMonth>11 then Sum:=Sum+30;

 Sum:=Sum + pDay;

 if ((pYear - (pYear div 4)*4)=3D0) and (pMonth>2) then inc(Sum);

 HowManyDays:=Sum;

end;   { HowManyDays }


procedure TForma1.GetWeekBtnClick(Sender: TObject);

var

 ADate: TDateTime;EditAux:String;

 Week,year,month,day:Word;

begin

 EditAux:=Edit1.Text;

 ADate := StrToDate(EditAux);

 Label1.Caption := DateToStr(ADate);

 DecodeDate(Adate,Year,Month,Day);

 Case DayOfWeek(ADate) of

1: Label4.Caption:='Воскресенье';

 2: Label4.Caption:='Понедельник';

 3: Label4.Caption:='Вторник';

 4: Label4.Caption:='Среда';

 5: Label4.Caption:='Четверг';

 6: Label4.Caption:='Пятница';

 7: Label4.Caption:='Суббота';

 end

Week:=(HowManyDays(year,month,day) div 7) +1;

 Label3.Caption:='Неделя No. '+IntToStr(Week);

end;


end.

Количество дней между двумя датами I

Delphi 1

ПЕРЕМЕННЫЕ:

Year1, Month1, Day1,

Year2, Month2, Day2,

YearResult, MonthResult, DayResult: Word;

TDay1, TDay2, DateDiff: TDateTime;

КОД:

TDay1 := EncodeDate(Year1, Month1, Day1);

TDay2 := EncodeDate(Year2, Month2, Day2);

DateDiff := TDay2 – TDay1; {предположим, что TDay2 позднее, чем TDay1}

DecodeDate(DateDiff, YearResult, MonthResult, DayResult);

DateDiff имеет тип LongInt (хотя и является объектом TDateTime), и содержит количество дней между датами.

Количество дней между двумя датами II

Delphi 1

Для DateDiff:

Вы смотрели на функцию DecodeDate? Это не точно именно то, что вам нужно, но на ее основе можно сделать вашу функцию именно с нужной вам функциональностью.

Для величины Present:

function PresentValue(const cashflows : array of double;    { отсортированные транзакции, начальный индекс - cashflows[0] }

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*