2015-09-30 3 views
-3

У меня есть следующая функция, за которую я должен верить, должен округлить время до ближайших 15 минут.Круглый период времени до ближайших 15 минут

function TdmData.RoundTime(T: TTime): TTime; 
var h, m, s, ms : Word; 
begin 
    DecodeTime(T, h, m, s, ms); 
    m := (m div 15) * 15; 
    s := 0; 
    Result := EncodeTime(h, m, s, ms); 
end; 

Чтобы проверить функцию я поставил TButton и TEdit на форму и на нажатия кнопки я:

begin 
    Edit1.Text := RoundTime('12:08:27'); 
end; 

Я получаю сообщение об ошибке при компиляции: «Несовместимые типы TTIME и строка '

Любая помощь с этим будет замечательной.

Спасибо,

+0

'' 12: 08: 27'' имеет тип 'string' – fantaghirocco

+1

Ну, строка не является« TTime ». Ваш код не будет округлен до ближайшего, а обрезается. Там нет такой вещи, как 'TString', и это расстраивает, когда люди составляют сообщения об ошибках. Рассмотрим переход от строки к времени. –

+4

[В Delphi: как мне пройти TDateTime до ближайшей секунды, минуты, пяти минут и т. Д.?] (Http://stackoverflow.com/questions/4122218/in-delphi-how-do-i-round-a- tdatetime-to-closest-second-minute-five-minute-etc) – fantaghirocco

ответ

4

ошибка, которая вызывает сбой компиляции является то, что вы передаете string к функции, которая нуждается в TTime в качестве параметра.
Как только это исправлено, Edit1.Text нужен тип string, но ваша функция возвращает TTime.

Используя StrToTime и TimeToStr, вы можете получить желаемое преобразование от и до типа string.

Ваша функция может быть вызвана следующим образом:

begin 
    Edit1.Text := TimeToStr(RoundTime(StrToTime('12:08:27')); 
end; 

Кража ответа на gabr user «S - In Delphi: How do I round a TDateTime to closest second, minute, five-minute etc? - вы можете получить дату, округленную до произвольного ближайшего значения, присвоенного параметру interval:

function RoundToNearest(time, interval: TDateTime): TDateTime; 
var 
    time_sec, int_sec, rounded_sec: int64; 
begin 
    time_sec := Round(time * SecsPerDay); 
    int_sec := Round(interval * SecsPerDay); 
    rounded_sec := (time_sec div int_sec) * int_sec; 
    if ((rounded_sec + int_sec - time_sec) - (time_sec - rounded_sec)) > 0 then 
    rounded_sec := rounded_sec + time_sec + int_sec; 
    Result := rounded_sec/SecsPerDay; 
end; 

 

begin 
    Edit1.Text := TimeToStr(RoundToNearest(StrToTime('12:08:27'), StrToTime('0:0:15'))); 
end; 

 Смежные вопросы

  • Нет связанных вопросов^_^