Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.06;
Скачать: CL | DM;

Вниз

Внимание, розыск! IncDay   Найти похожие ветки 

 
AlexKniga ©   (2005-05-18 11:57) [0]

Ищется шедевр програмизькой мысли функция IncDay. Она раньше лежала в кладовке. Счас нигде не найти. У кого сохранилась, выложите, сиё должно остаться в анналах.

А вспомнилась оня в связи с веткой про StringToPChar
http://delphimaster.net/view/14-1116315976/


 
Ega23 ©   (2005-05-18 11:58) [1]


function TfmMain.IncDay(const DateTime: TDateTime;  NumberOfDays: Integer): TDateTime;
{Функция предназначена для изменения даты (DateTime) путем добавления  количества дней (NumberOfDays). Значение NumberOfDays может быть отрицательным.}
var
 Y, M, D, CountDays: Word;
 N: Integer;
 Sign, NoBreak: Boolean;
begin
 Sign := NumberOfDays >= 0;
 DecodeDate(DateTime, Y, M, D);
 N := NumberOfDays;
 NoBreak := True;
 if Sign then   //Прибавить
 begin
   while(NoBreak) do
   begin //Количество дней в месяце
     CountDays := MonthDays[IsLeapYear(Y), M];
     if (N + D) <= CountDays then //Если в пределах данного месяца
     begin
       Inc(D, N);
       NoBreak := False;
     end
     else
     begin
       if M < 12 then
         Inc(M, 1)
       else
       begin
         M := 1;
         Inc(Y, 1);
       end;
       N := N - (CountDays - D);
       D := 0;
     end;
   end;
 end
 else  //Отнять
 begin
   N := -N;
   while(NoBreak) do
   begin
     if D > N then  //Если в пределах данного месяца
     begin
       Dec(D, N);
       NoBreak := False;
     end
     else
     begin
       if M > 1 then
         Dec(M, 1)
       else
       begin
         M := 12;
         Dec(Y, 1);
       end;
       //Количество дней в месяце
       CountDays := MonthDays[IsLeapYear(Y), M];
       N := N - D;
       D := CountDays;
     end;
   end;  
 end;
 Result := EncodeDate(Y, M, D);
 //Установить время из старой даты
 ReplaceTime(Result, DateTime);
end;


 
Ega23 ©   (2005-05-18 11:59) [2]

Моя любимая функция. Уже года 3 на стенке висит  :о)


 
Kerk ©   (2005-05-18 12:02) [3]

ГЕНИАЛЬНО!!! БРАВО!! НЕ УСТАЮ ВОСХИЩАТЬСЯ!! :))


 
TUser ©   (2005-05-18 12:04) [4]

А автор у этого произведения есть?


 
Ega23 ©   (2005-05-18 12:04) [5]

Кстати, там вроде кгде-то ашипка была. Кто-то на работе говорил, что ашипку углядел. Искать лень.


 
Ega23 ©   (2005-05-18 12:06) [6]

Удалено модератором
Примечание: AutoModerator


 
P.N.P. ©   (2005-05-18 12:11) [7]

По-моему здесь ашипка, на первый взгляд

...
      N := N - (CountDays - D);
      D := 0;
...


 
Sha ©   (2005-05-18 12:47) [8]

> Ega23 ©   (18.05.05 11:59) [2]
У меня тоже висела, пока не украли :)

> P.N.P. ©   (18.05.05 12:11) [7]
Вроде нет тут никакой ошибки.


 
P.N.P. ©   (2005-05-18 12:59) [9]

А, точно, не заметил, что там в цикле Inc(D, N);


 
AlexKniga ©   (2005-05-18 13:03) [10]

Ega23 ©   (18.05.05 11:58) [1]
Большое спасибо!

TUser ©   (18.05.05 12:04) [4]
А автор у этого произведения есть?
В кладовке написано dmi, по-моему, это старый ник Дмитрий О..


 
Palladin ©   (2005-05-18 13:42) [11]

Во блин... Тоже распечатаю...


 
nikkie ©   (2005-05-18 14:19) [12]

>В кладовке написано dmi, по-моему, это старый ник Дмитрий О.
если я правильно помню, то, судя по исходникам автошемы, дима не отличается любовью к форматированию кода. :)


 
Digitman ©   (2005-05-18 14:31) [13]


> AlexKniga ©   (18.05.05 13:03) [10]


Result := DateTime + NumberOfDays;


 
Bronco ©   (2005-05-18 14:33) [14]


> Digitman ©   (18.05.05 14:31) [13]

Такое позорно даже на стенку вешать :-)))


 
Ega23 ©   (2005-05-18 14:36) [15]

2 Digitman ©   (18.05.05 14:31) [13]
Result := DateTime + NumberOfDays;

непрекольно  :о)


 
Digitman ©   (2005-05-18 14:37) [16]


> Bronco ©   (18.05.05 14:33) [14]
> Такое позорно даже на стенку вешать


угу)

кнопка закроет собой весь текст)

да и в кладовку не менее позорно такое кидать - мало там хлама, так еще одной хренью больше станет)


 
GrayHairs ©   (2005-05-18 15:23) [17]

пример использования

function DaysInPeriod(DateTime1,
 DateTime2: TDateTime): integer;
var i:integer;
   CurrentDate, LastDate:TDateTime;
begin
 i:=1;
 if DateTime1 < DateTime2
 then
 begin
   CurrentDate:=DateTime1;
   LastDate:=DateTime2;
 end
 else
 begin
   CurrentDate:=DateTime2;
   LastDate:=DateTime1;
 end;

 CurrentDate:=DateTime1;
 While CurrentDate < LastDate do begin
   CurrentDate:=IncDay(CurrentDate, i);
   inc(i);
 end;

 Result:=i;
end;


 
P.N.P. ©   (2005-05-18 15:25) [18]

>GrayHairs ©   (18.05.05 15:23) [17]
Что это было?


 
Sha ©   (2005-05-18 15:35) [19]

Есть в этой функции девственная нетронутая красота...
Она чарует как пробуждение природы,
неуловима как легкое дуновение ветерка...
Шедевр невозможно сравнить со стандартом, шаблоном.
Ручной работе великого мастера чуждо ремесло.


 
GrayHairs ©   (2005-05-18 15:36) [20]

Пример. Использование IncDay для вычисления дней в периоде, заданном двумя датами. С ошибкой в 18 строке.


 
P.N.P. ©   (2005-05-18 15:40) [21]

> GrayHairs ©   (18.05.05 15:36) [20]
Функция DaysBetween() ни о чем не говорит ? :))))


 
Danilka ©   (2005-05-18 15:42) [22]

[17] GrayHairs ©   (18.05.05 15:23)
Хм. Как-то странно вы ее используете, еёж на стену вешают..


 
Bronco ©   (2005-05-18 15:46) [23]


> P.N.P. ©   (18.05.05 15:40) [21]


> Функция DaysBetween() ни о чем не говорит ? :))))

Это юмор такой.
Панов давеча начал шутить, а народ никак не остановится.


 
GrayHairs ©   (2005-05-18 15:49) [24]

DaysBetween? Так что IncDay вообще не пользовать? Пусть две будут.


 
P.N.P. ©   (2005-05-18 15:51) [25]

Да, что-то у меня не то творится с чуством юмора к концу раб. дня :)



Страницы: 1 вся ветка

Текущий архив: 2005.06.06;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.111 c
11-1098482343
Nix
2004-10-23 01:59
2005.06.06
KOLEcmListEdit


14-1116339170
kull
2005-05-17 18:12
2005.06.06
Как портировать try..finally в C++ ?


14-1116605048
Kerk
2005-05-20 20:04
2005.06.06
через 2 минуты будет 20:05 20.05.2005 по москве:)))))))


3-1115128555
Taurus
2005-05-03 17:55
2005.06.06
Определение объекта на форме


5-1087272276
Sun bittern
2004-06-15 08:04
2005.06.06
Проблема с событием OnPaint :(