Советы по Delphi. Версия 1.4.3 от 1.1.2001 - [4]

Шрифт
Интервал

>function kcMonthDays(nMonth, nYear: Integer): Integer;

>const

> DaysPerMonth: array[1..12] of Integer = (31, 28, 31, 30, 31, 30, 31,31, 30, 31, 30, 31);

>begin

> Result := DaysPerMonth[nMonth];

if (nMonth = 2) and kcIsLeapYear(nYear) then Inc(Result);

>end;


>{***************************************************************************}

>function kcWeekOfYear(dDate: TDateTime): Integer;

>var

> X, nDayCount: Integer;nMonth, nDay, nYear: Word;

>begin

> nDayCount := 0;

> deCodeDate(dDate, nYear, nMonth, nDay);

> For X := 1 to (nMonth - 1) do nDayCount := nDayCount + kcMonthDays(X, nYear);

> nDayCount := nDayCount + nDay;

> Result := ((nDayCount div 7) + 1);

>end;

Разница во времени

Delphi 1

…я не знаю, когда вы выполняете TimeTaken… Вы делали какую-нибудь паузу перед запуском TimeTaken после выполнения SetTimeStart? Если не делали, то удивительно, что tt=Now… Я пробовал ваш код с несколькими незначительными изменениями… и я всегда получал разницу между Now и TimeStart. Но я объявляю tt как TDateTime, а не как Double, и использую событие OnTimer для запуска процедуры TimeTaken. Вы можете проверить это, запустив пример, приведенный ниже.

>{*******************************************************************

>ФАЙЛ : TIMEEX.PAS

>ПРИМЕЧАНИЕ : Создайте форму, содержащую 1 TTimer и 6 TLabel. Установите событие OnTimer у TTimer на TForm.Timer1.Timer

>********************************************************************}

>unit Time;


>interface


>uses

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


>type

> TForm1 = class(TForm)

>  Timer1: TTimer;

>  Label1: TLabel; {Caption : 'Старт :'}

>  Label2: TLabel;

>  Label3: TLabel; {Caption : 'Время : '}

>  Label4: TLabel;

>  Label5: TLabel; {Caption : 'Истекшее время:'}

>  Label6: TLabel;

procedure FormCreate(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

private { Private declarations }

>  TimeStart : TDateTime;

public { Public declarations }

end;


>var

> Form1: TForm1;


>implementation


> {$R *.DFM}


>procedure TForm1.FormCreate(Sender: TObject);

>begin

> TimeStart := Now;

> Label2.Caption := TimeToStr(Now);

>end;


>procedure TForm1.Timer1Timer(Sender: TObject);

>var

> tt : TDateTime;

>begin

> Label4.Caption := TimeToStr(Now);

> tt:= Now - TimeStart;

> Label6.Caption:= TimeToStr(tt);

>end;


>end.

Проблема со временем

Delphi 1

…я нашел Time24Hour в файлах помощи, как вы и советовали. Но…

вот код для EncodeTime в SysUtils.Pas file:

>function DoEncodeTime(Hour, Min, Sec, MSec: Word; var Time: TDateTime): Boolean;

>begin

> Result := False;

if (Hour < 24) and (Min < 60) and (Sec < 60) and (MSec < 1000) then begin

>Time := (LongMul(Hour * 60 + Min, 60000) + Sec * 1000 + MSec) / MSecsPerDay;

>  Result := True;

end;

>end;


>function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;

>begin

> if not DoEncodeTime(Hour, Min, Sec, MSec, Result) then ConvertError(LoadStr(STimeEncodeError));

>end;

Как вы можете видеть, проверка Time24Hour присутствует. Я думал в Browser все будет также. Ничего подобного! Я уж грешным делом подумал, что Time24Hour объявили устаревшим, исключили из поддержки, выбросили частично из кода, но забыли почистить файл помощи. Вы так не думаете?

Переменная времени

Delphi 1

Используйте переменную типа TDateTime.

>procedure TForm1.XXXXXXXClick(Sender: TObject);

>var StartTime, EndTime, ElapsedTime :TDateTime;

>begin

> StartTime := Now;

> {Здесь поместите свой код}

> EndTime := Now;

> ElapsedTime := EndTime - StartTime;

> Label1.Caption := TimeToStr(ElapsedTime);

>end;


>{теперь все это в памяти, но в нашем случае это хорошее место. }

>var

> before,after,elapsed : TDateTime;

> Ehour, Emin, Esec, Emsec : WORD;

>


> before := now;


> some_process();


> after := now;

> elapsed := after - before;


> decodetime(elapsed, Ehour, Emin, Esec, Emsec);

теперь Ehour:Emin:Esec.Emsec будет содержать истекшее время.

Это то, что я хотел. fStartWhen содержит дату/время начала процесса. (fStartWhen := NOW). OneSecond — константа, определенная как 1/24/3600. (Да, эта программа может выполняться для нескольких дней. Но даже самый быстрый P5 может не справиться с большим количеством данных!)

>PROCEDURE TformDBLoad.UpdateTime;

>VAR Delta: TDateTime

>BEGIN

> fLastUpdate := NOW

IF ABS(fStartWhen - fLastUpdate ) < OneSecond THEN EXIT

>Delta := fLastUpdate - fStartWhendoElapsedTime.Caption := FORMAT('%1. дней из %s', [INT(Delta),FORMATDATETIME('hh:nn:ss', FRAC(Delta))])

>END;

Математика

Как научить Delphi делать правильное округление дробных чисел?

Nomadic советует:

Целая коллекция способов -

Для решения этой проблемы мною написана функция, которую можно модифицировать для всех случаев. Смысл заключается в том, что рассматривается строка. После этого все проблемы с округлением снялись.

>Function RoundStr(Zn:Real;kol_zn:Integer):Real;

>{Zn-значение; Kol_Zn-Кол-во знаков после запятой}

>Var

> snl,s,s0,s1,s2:String;

> n,n1:Real;

> nn,i:Integer;

>begin

> s:=FloatToStr(Zn);

if (Pos(',',s)>0) and (Zn>0) and (Length(Copy(s,Pos(',',s)+1,length(s)))>kol_zn) then begin

>s0 := Copy(s,1,Pos(',',s)+kol_zn-1);

>  s1 := Copy(s,1,Pos(',',s)+kol_zn+2);

>  s2 := Copy(s1,Pos(',',s1)+kol_zn,Length(s1));

>  n := StrToInt(s2)/100;nn := Round(n);

if nn >= 10 then begin

>snl := '0,';


Еще от автора Валентин Озеров
Советы по Delphi. Версия 1.0.6

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


Рекомендуем почитать
Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


Геймдизайн. Рецепты успеха лучших компьютерных игр от Super Mario и Doom до Assassin’s Creed и дальше

Что такое ГЕЙМДИЗАЙН? Это не код, графика или звук. Это не создание персонажей или раскрашивание игрового поля. Геймдизайн – это симулятор мечты, набор правил, благодаря которым игра оживает. Как создать игру, которую полюбят, от которой не смогут оторваться? Знаменитый геймдизайнер Тайнан Сильвестр на примере кейсов из самых популярных игр рассказывает как объединить эмоции и впечатления, игровую механику и мотивацию игроков. Познакомитесь с принципами дизайна, которыми пользуются ведущие студии мира! Создайте игровую механику, вызывающую эмоции и обеспечивающую разнообразие.


Перевод в электронный формат, кодированные наборы шрифтов и система Оптического Распознавания Символов для многошрифтовых информационных ресурсов на примере “Летописи журнальных статей”

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


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


Экстремальное программирование. Разработка через тестирование

Возвращение знаменитого бестселлера. Изящный, гибкий и понятный код, который легко модифицировать, который корректно работает и который не подкидывает своим создателям неприятных сюрпризов. Неужели подобное возможно? Чтобы достичь цели, попробуйте тестировать программу еще до того, как она написана. Именно такая парадоксальная идея положена в основу методики TDD (Test-Driven-Development – разработка, основанная на тестировании). Бессмыслица? Не спешите делать скороспелые выводы. Рассматривая применение TDD на примере разработки реального программного кода, автор демонстрирует простоту и мощь этой методики.


Обработка событий в С++

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