|
Вопрос # 5 821/ вопрос решён / |
|
Доброго времени суток, уважаемые эксперты!
есть метод перевода времени в секундах(уже точнее в миллисекундах) в часы, минуты и секунды
После строки
Minutes := Trunc(RemainingTime / 60);
все время вылетает, не могу понять, в чем дело? а секунды не считаются соответственно
Подскажите, пожалуйста
Приложение: Переключить в обычный режим- procedure SecondsToTime(const TimeInSeconds: Double; var Hours, Minutes: Integer; Seconds: Double);
- var
- RemainingTime: Double;
- TempTime: Integer;
- begin
- TempTime := Trunc(TimeInSeconds);
- Hours := TempTime div 3600;
-
- RemainingTime := TimeInSeconds - (Hours * HOURS_TO_SECONDS);
- // TempTime := Trunc(RemainingTime);
- Minutes := Trunc(RemainingTime / 60);
-
- Seconds := 0;
- Seconds := TimeInSeconds - (Hours * HOURS_TO_SECONDS) - (Minutes * MINUTES_TO_SECONDS);
- end;
 |
Вопрос задал: Aндрей (статус: 1-ый класс)
Вопрос отправлен: 16 декабря 2011, 11:57
Состояние вопроса: решён, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 16 декабря 2011, 14:13; участников в обсуждении: 2.
|
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ндрей (статус: 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
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|