![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Даты
LOAD © (2002-10-01 18:44:00)Друзья! Можно ли в Delphy нормально работать с датами? Мне нужно график построить, а по оси X надо, чтобы автоматически промежуток времени делился на несколько частей и эти дни выводились в кажестве подписей. Не соображу, как это сделать...
Zergling (2002-10-04 14:11:00) [1]Type
TVOrientation=
(toHorizontal,toVertikal,toTop,toBottom,toLeft,toRight,toVCentr,toHCentr,toVHCentr);
// Рзмешение текста по центру
Procedure TextOutPos(Dest:TCanvas;X,Y:Integer;Text:String;Orientation:TVOrientation);
var H,W:Integer;
Begin
H:=Dest.TextHeight(Text);
W:=Dest.TextWidth(Text);
Case Orientation of
toVCentr : Y:=Y-H div 2;
toHCentr : X:=X-W div 2;
toVHCentr : Begin Y:=Y-H div 2; X:=X-W div 2; End;
End;
Dest.TextOut(X,Y,Text);
End;
// Вывод линейки времени
Procedure LineTime
// L-Длина линии, Part-на сколько частей поделить
(Dest:TCanvas;X,Y,L:Integer;MinTime,MaxTime:TTime;Part:Word;Orientation:TVOrientation);
var h,m,s,ms:Word;
I:Integer;
Odds:Real;
PartOdds:Real;
TimeStr:String;
Procedure TimePrn(V1,V2:Byte;var Txt:String);
Begin
Txt:=IntToStr(V1)+":"+IntToStr(V2);
End;
Begin
if MaxTime<MinTime then Exit;
Part:=Part-1;
L:=Part*(L div Part);
Odds:=MaxTime-MinTime;
PartOdds:=Odds/Part;
For I:=0 to Part do
Begin
DecodeTime(MinTime+PartOdds*I,h,m,s,ms);
if MaxTime-MinTime>0.0416666666666667 then TimePrn(h,m,TimeStr) else TimePrn(m,s,TimeStr);
Case Orientation of
toHorizontal : TextOutPos(Dest,X+(L div Part*I),Y,TimeStr,toVHCentr);
toVertikal : TextOutPos(Dest,X,Y+(L div Part*I),TimeStr,toVHCentr);
End;
End;
End;
Link (2002-10-04 13:51:00) [2]Нет, я ошибся, всё верно. Я намудрил в другом месте.
Спасибо за помощь!
Link (2002-10-04 12:16:00) [3]Спасибо за помощь.
Но
> Jeer
Я ещё плохо разбираюсь с TDateTime, поэтому не доконца понял, что ты имеешь в виду.
> TTCustomDelphiMaster
Я тоже так сразу подумал, но в том то и проблема, что при MinDate+i*dDelta выводится значение, равное MinDate.
Может я что-то не то делаю?
TTCustomDelphiMaster (2002-10-03 20:42:00) [4]А вон Вы про что...
Тогда делайте так
dDelta = (MaxDate-MinDate)/Ndel;
а потом в цикле выводите на экран
formatdatetime(" ...", MinDate+i*dDelta);
Jeer (2002-10-03 20:08:00) [5]А в чем проблема ?
TDateTime это Double тип.
Формат 1s,15e,52f.
Целая часть - дни, дробная - часть суток с мзр 24*60*60*1000/(2^52) ms
Так и работай с Double.
Link (2002-10-03 19:05:00) [6]Извините, что опять под другим именем (Robot).
Robot (2002-10-03 19:01:00) [7]Я опять возвращаюсь к этому вопросу. Всё равно что-то не то.
> TTCustomDelphiMaster
Я посмотрел F1. Но там описано, как дату расчленять. А мне необходимо:
1. Вычислить промежуток времени (из одной даты вычесть другую)
2. Поделить этот промежуток на установленное число (чтобы знать период времени, который следует позже прибавлять)
3. Прибавлять вычисленный промежуток. И каждый рад выводить получившуюся дату в виде 01.03.02 1:21:33.
Это всё нужно, чтобы на графике по оси X было время.
Мне это просто необходимо. Пожалуйста, кто что знает, поделитесь...
TTCustomDelphiMaster (2002-10-01 20:16:00) [8]F1 - FormatDateTime
Link (2002-10-01 19:57:00) [9]LOAD и Link - это одно лицо.
А может всё-таки объясните: почему нет времени и почему нельзя использовать даты вида 01.03.02 1:25:39 Неужели можно только вида 01.03.02 1:25, как написанов F1?
Link (2002-10-01 19:24:00) [10]
> Smithson
Почитал F1, вроде так:
var
Date:double;
.......
Date:=MakeRep.ADOQuery2.FieldByName("timestamp").AsFloat/2;
Edit3.Text:=DateToStr(Date);
Дано число:
01.03.02 1:21:33
Выдаёт:
30.01.51
А почему нет времени?
А с промежутком: вычитать из большей даты меньшую и делить на нужное число?
Smithson (2002-10-01 19:04:00) [11]DateToStr, StrToDate, DecodeDate, EncodeDate, F1
Link (2002-10-01 19:02:00) [12]Может я что-то не понял..
График-то я напишу, как строится, но мне нужны подписи по оси X.
Промежуток будет задаваться не большой, на несколько минут, просто данные выводятся из базы данных, где каждая запись сохраняется с частотой в одну секунду. Мне нужно, чтобы значения подписей были через равное кол-во времени. А это кол-во времени должно вычисляться программой и прибавляться тоже программой... Как это сделать?
grig_perejaslov (2002-10-01 18:52:00) [13]Написать свой компонент, который будет выводить этот график.
А далее считаешь кол-во лет, месяцов, дней, часов, минут в зависимости от требуемой точности и, сравнивая их, строишь график.