Советы по 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

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


Рекомендуем почитать
Язык PL/SQL

В учебно-методическом пособии рассматриваются основы языка программирования PL/SQL, реализованного в системе управления базами данных Oracle Database Server. Приводятся сведения о поддерживаемых типах данных, структуре программ PL/SQL и выполнении SQL-предложений в них. Отдельно рассмотрено создание хранимых в базах данных Oracle программ PL/SQL – процедур, функций, пакетов и триггеров.


Программирование на Visual C++. Архив рассылки

РАССЫЛКА ЯВЛЯЕТСЯ ЧАСТЬЮ ПРОЕКТА RSDN, НА САЙТЕ КОТОРОГО ВСЕГДА МОЖНО НАЙТИ ВСЮ НЕОБХОДИМУЮ РАЗРАБОТЧИКУ ИНФОРМАЦИЮ, СТАТЬИ, ФОРУМЫ, РЕСУРСЫ, ПОЛНЫЙ АРХИВ ПРЕДЫДУЩИХ ВЫПУСКОВ РАССЫЛКИ И МНОГОЕ ДРУГОЕ.


Введение в Direct3D8

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


Пишем драйвер Windows на ассемблере

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


Язык программирования С# 2005 и платформа .NET 2.0.

В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования C# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL. В книге рассматривается формат сборок .NET, библиотеки базовых классов .NET. файловый ввод-вывод, возможности удаленного доступа, конструкция приложений Windows Forms, доступ к базам данных с помощью ADO.NET, создание Web-приложений ASP.NET и Web-служб XML.


Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса

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