Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 821

/ вопрос решён /

Доброго времени суток, уважаемые эксперты!

есть метод перевода времени в секундах(уже точнее в миллисекундах) в часы, минуты и секунды

После строки

Minutes := Trunc(RemainingTime / 60);

все время вылетает, не могу понять, в чем дело? а секунды не считаются соответственно
Подскажите, пожалуйста

Приложение:
  1. procedure SecondsToTime(const TimeInSeconds: Double; var Hours, Minutes: Integer; Seconds: Double);
  2. var
  3. RemainingTime: Double;
  4. TempTime: Integer;
  5. begin
  6. TempTime := Trunc(TimeInSeconds);
  7. Hours := TempTime div 3600;
  8.  
  9. RemainingTime := TimeInSeconds - (Hours * HOURS_TO_SECONDS);
  10. // TempTime := Trunc(RemainingTime);
  11. Minutes := Trunc(RemainingTime / 60);
  12.  
  13. Seconds := 0;
  14. Seconds := TimeInSeconds - (Hours * HOURS_TO_SECONDS) - (Minutes * MINUTES_TO_SECONDS);
  15. end;


Aндрей Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Aндрей (статус: 1-ый класс)
Вопрос отправлен: 16 декабря 2011, 11:57
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 16 декабря 2011, 14:13; участников в обсуждении: 2.
min@y™

min@y™ (статус: Доктор наук), 16 декабря 2011, 13:09 [#1]:

Вот, надёргал тебе с разных проектов несколько кусков. Должно помочь.
function TMainForm.MsecsToTimeStr(const MSecs: Double): string;
var
  H, M, S: Word;
  Sec: Cardinal;
begin
  // Перевод миллисекунд в строку времени
  Sec:= Round(MSecs / 1000);
  H:= Sec div 3600;
  M:= (Sec mod 3600) div 60;
  S:= Sec mod 60;
  Result:= TimeToStr(EncodeTime(H, M, S, 0));
end;
 
 
function TMainForm.SecondsToTimeStr(const ASeconds: Cardinal): string;
var
  H, M, S: Word;
begin
  H:= ASeconds div 3600;
  M:= (ASeconds mod 3600) div 60;
  S:= ASeconds mod 60;
  Result:= TimeToStr(EncodeTime(H, M, S, 0));
end;
 
// Преобразование времени (сотни мкс) в строку
function DevTime2Str(const ATime: Cardinal): string;
var
  h, m, s, ms: Cardinal;
  T: Cardinal;
  Seconds: Extended;
begin
  // 12345678 (сотни мкс) ---> 1234,5678 (сек)
  {T:= ATime div 10; // ---> миллисекунды
  ms:= T mod 1000;
  s:= (T div 1000) mod}
 
  Seconds:= ATime / 10000; // Секунды типа 1234,5678
  T:= Trunc(Seconds);
  h:= T div 3600;
  m:= (T mod 3600) div 60;
  s:= T mod 60;
  ms:= Round(Frac(Seconds) * 1000.0);
 
 
  //Result:= FloatToStrF(Seconds, ffFixed, 15, 4);
  //Result:= Format('%d:%02d:%02d.%03d', [h, m, s, ms]);
  Result:= IntToStrLZ(h, 1) + ':' + IntToStrLZ(m, 2) + ':' + IntToStrLZ(s, 2) + '.' + IntToStrLZ(ms, 3);
end;
 
procedure TMainForm.TimerTimer(Sender: TObject);
var
  RemainTime: Cardinal;
  H, M, S: Word;
begin
  RemainTime:= Seconds - (GetTickCount - BeginTime) div 1000;
  H:= RemainTime div 3600;
  M:= (RemainTime mod 3600) div 60;
  S:= RemainTime mod 60;
 
  ClockLabel.Caption:= IntToStr(H) + ':' + Int2StrLeadingZeroes(M) + ':' + Int2StrLeadingZeroes(S);
 
  if RemainTime = 0
    then begin
           CancelButton.Click();
           ShowMessage('Время вышло!');
         end;
end;
 
procedure TMainForm.UpdateCounter;
var
  TotalSeconds: Cardinal;
  Hours: Cardinal;
  Minutes, Seconds: Word;
begin
  // Обновление счётчика
 
  TotalSeconds:= Cardinal(Trunc(DeviceTime / 1000)); // Всего секунд (целое число)
  // Условие сброса счётчика в 0: 1000000 00 00 - миллион часов ровно = 3 600 000 000 секунд
  if TotalSeconds >= 3600000000 //$D693A400
    then begin
           DeviceTime:= 0.0;
           TotalSeconds:= 0;
         end;
 
  Hours:= TotalSeconds div 3600;
  Minutes:= (TotalSeconds mod 3600) div 60;
  Seconds:= TotalSeconds mod 60;
 
  HoursLCD.Value:= IntToStrLZ(Hours, 6);
  MinsLCD.Value:= IntToStrLZ(Minutes, 2);
  SecsLCD.Value:= IntToStrLZ(Seconds, 2);
  Application.ProcessMessages();
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Aндрей

Aндрей (статус: 1-ый класс), 16 декабря 2011, 14:13 [#2]:

Все, нашел в сигнатуре метода для секунд var забыл прописать, когда менял
SecondsToTime(const TimeInSeconds: Double; var Hours, Minutes: Integer; var Seconds: Double);

16 декабря 2011, 14:13: Статус вопроса изменён на решённый (изменил автор вопроса — Aндрей): Все, нашел в сигнатуре метода для секунд var забыл прописать, когда менял
SecondsToTime(const TimeInSeconds: Double

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:51
Выполнено за 0.03 сек.