![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание искусственного времени [D7, Win2k]
!Trinix © (2005-06-10 15:28:00)Я создаю игру, как The Sims (подробнее на sgstd.nm.ru), со временем у меня полный порядок, но с датой не выходит. Дата у меня принадлежит к типу TDayOfWeek. Когда время становится 24(00) часа, то настает следующий день, но почему-то день не ихменяется и вообще t.Day равняется 0. Помогите, пожалуйста, вот мой код:
procedure Timer
type
TCanTime = 0..59;
TDayOfWeek = 1..7;
TCurTime = record
Minutes : TCanTime;
Hours : TCanTime;
Day : TDayOfWeek;
end;
var
t : TCurTime;
procedure TForm1.Timer_TimeTimer(Sender: TObject);
begin
t.Minutes := t.Minutes + 1;
if t.Minutes > 58 then begin
t.Minutes := 0;
t.Hours := t.Hours + 1;
end;
if t.Hours > 23 then begin
t.Hours := 0;
if t.Day = 1 then t.Day := 2;
if t.Day = 2 then t.Day := 3;
if t.Day = 3 then t.Day := 4;
if t.Day = 4 then t.Day := 5;
if t.Day = 5 then t.Day := 6;
if t.Day = 6 then t.Day := 7;
if t.Day = 7 then t.Day := 1;
end;
LabelHour.Caption := IntToStr(t.Hours);
LabelMinutes.Caption := IntToStr(t.Minutes);
case t.Day of
1 : LabelDay.Text := 'пон';
2 : LabelDay.Text := 'втр';
3 : LabelDay.Text := 'срд';
4 : LabelDay.Text := 'чтв';
5 : LabelDay.Text := 'пят';
6 : LabelDay.Text := 'суб';
7 : LabelDay.Text := 'вос';
end;
end;
!Trinix (2005-06-10 16:46:00) [1]Спасибо, моя вина - сам недосмотрел с прибавлением дня.
Туплю...:)
Alexander Panov (2005-06-10 16:18:00) [2]
type
THH=0..23;
TMM=0..59;
TDD=1..7;
TSyntheticTime=class
private
FDaysWeek: array[1..7] of String;
FDay: TDD;
FHH: THH;
FMM: TMM;
function GetDay: String;
public
constructor Create(aDay: TDD; aHH: THH; aMM: TMM);
procedure NextTime;
property DayOfWeek: String read GetDay;
property DD: TDD read FDay write FDay;
property HH: THH read FHH write FHH;
property MM: TMM read FMM write FMM;
end;
var
Form1: TForm1;
ST: TSyntheticTime;
constructor TSyntheticTime.Create(aDay: TDD; aHH: THH; aMM: TMM);
begin
FHH := aHH;
FMM := aMM;
FDay := aDay;
FDaysWeek[1] :='пон';
FDaysWeek[2] :='втр';
FDaysWeek[3] :='срд';
FDaysWeek[4] :='чтв';
FDaysWeek[5] :='пят';
FDaysWeek[6] :='суб';
FDaysWeek[7] :='вос';
end;
function TSyntheticTime.GetDay: String;
begin
Result := FDaysWeek[FDay];
end;
procedure TSyntheticTime.NextTime;
begin
if FMM=59 then
begin
FMM := 0;
if FHH=23 then
begin
FHH := 0;
if FDay=7
then FDay := 1
else FDay := FDay+1;
end
else FHH := FHH+1;
end
else FMM := FMM+1;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ST := TSyntheticTime.Create(1,0,0);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Caption := ST.DayOfWeek+' '+ IntToStr(ST.HH)+':'+IntToStr(ST.MM);
ST.NextTime;
end;
Чапаев (2005-06-10 16:17:00) [3]
if Day<High(TDayOfWeek)
then Inc(Day)
else Day:=Low(TDayOfWeek);
default (2005-06-10 15:56:00) [4]TUser © (10.06.05 15:53) [11]
так я это и написал:)
TUser (2005-06-10 15:53:00) [5]> Ega23 © (10.06.05 15:44) [4]
> default © (10.06.05 15:49) [8]
t.Day:=(t.Day mod 7)+1;
Antonn (2005-06-10 15:51:00) [6]incDay не переплюнуть:)
-=XP=- (2005-06-10 15:50:00) [7]P.S. Я Ваш "шедевр" распечатал и на стену повесил. :)
-=XP=- (2005-06-10 15:49:00) [8]Посмотрите в сторону TDateTime и не изобретайте двухколесное транспортное средство.
default (2005-06-10 15:49:00) [9]t.day:= (t.day mod 7) + 1
Ega23 © (10.06.05 15:44) [4]
(6 + 1) mod 7 = 0
а должно давать 7
TUser (2005-06-10 15:47:00) [10]Сорри, не то ляпнул.
TUser (2005-06-10 15:46:00) [11]t.Day:=[4]+1;
Ega23 (2005-06-10 15:44:00) [12]А вообще t.day:=(t.day+1) mod 7;
Ega23 (2005-06-10 15:41:00) [13]2 TUser © (10.06.05 15:40) [1]
Как ты думаешь, что получиться в результате последоватлеьного выполнения вот этих строчек, если t.Day = 1?
Да даже, если t.Day = 2 или t.Day =7
TUser (2005-06-10 15:40:00) [14]Как ты думаешь, что получиться в результате последоватлеьного выполнения вот этих строчек, если t.Day = 1?
> if t.Day = 1 then t.Day := 2;
> if t.Day = 2 then t.Day := 3;
> if t.Day = 3 then t.Day := 4;
> if t.Day = 4 then t.Day := 5;
> if t.Day = 5 then t.Day := 6;
> if t.Day = 6 then t.Day := 7;
> if t.Day = 7 then t.Day := 1;
Подсказка - строчки выполняются действительно последовательно, никакого ветвления или циклов тут нет.
Ega23 (2005-06-10 15:40:00) [15]1. if t.Minutes > 58 then begin Может быть 59?
2.
if t.Day = 1 then t.Day := 2
if t.Day = 2 then t.Day := 3;
if t.Day = 3 then t.Day := 4;
if t.Day = 4 then t.Day := 5;
if t.Day = 5 then t.Day := 6;
if t.Day = 6 then t.Day := 7;
if t.Day = 7 then t.Day := 1;
У тебя t.Day ВСЕГДА будет 1. Почему - подумай.