Страница 1 из 2
А можно ли не с нуля?
Добавлено: 17 мар 2008, 13:53
artispro
Возможно ли в чтобы при Interval=5000, в 1 ячейке считалось до 5, во второй - до 10 и т.д.
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled := true;
StartTime := GetTickCount;
interval := 5000;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
NCol,NRow,i : integer;
begin
NCol := ((GetTickCount - StartTime) div interval)+1;
NRow := 1;
for i := 1 to StringGrid1.ColCount - 1 do begin
StringGrid1.Cells[NCol,NRow] := IntToStr((GetTickCount - StartTime) div 1000);
end;
end
Re: А можно ли не с нуля?
Добавлено: 18 мар 2008, 11:33
Хыиуду
Не совсем понятно, что вам требуется. Зачем вам несколько раз выводить одно и то же в одну и ту же клетку?
Re: А можно ли не с нуля?
Добавлено: 19 мар 2008, 10:36
artispro
Полный вопрос состоит вот в чем:
как в строке StringGrid’а, найдя максимальное значение элемента, продолжить счет с этого значения до следующего, заранее известного?
Значения изменяются в ячейке № 1: от 1 до 5, №2: от 6 до 10, №3: от 11 до 15
№1 №2 №3
5 9
На форме: StringGrid, Timer(у которого Interval=5sec.), Button.
Через Interval=5sec, Timer продолжает счет в следующей ячейке.
Найдя, что ячейка №2 имеет максимальное значение элемента(например - 9), нужно досчитать до 10
т.е.:
J: integer;//максимальное найденное значение элемента массива
Interval:= 10-J//= 1
и продолжить счет в ячейке №3.
В примере была ошибка:
procedure TForm1.Timer1Timer(Sender: TObject);
var
NCol,NRow,i : integer;
begin
NCol := ((GetTickCount - StartTime) div interval)+1;
NRow := 1;
StringGrid1.Cells[NCol,NRow] := IntToStr((GetTickCount - StartTime) div 1000);
end.
Если выполнить, то счет все время начинается с 0., т.е. в ячейке №1 отображаются 0,1,2,3,4, дальше в ячейке №2 5,6,7,8,9. Мне нужно в ячейке №1 1,2,3,4,5(5 остается ячейке №1), дальше в ячейке №2 5,6,7,8,9,10. и т.д.
Re: А можно ли не с нуля?
Добавлено: 19 мар 2008, 12:19
airyashov
Вообще муть какая-то
что содержится в ячейке строка?
Код: Выделить всё
TForm1 *Form1;
long StartTime, interval, NCol=1;
void __fastcall TForm1::Time(TObject *Sender)
{
long NRow,i;
NRow = 1;
StringGrid1->Cells[NCol][NRow] =IntToStr(((long)GetTickCount()-StartTime)/1000);//};
NCol++;
if (NCol>StringGrid1->ColCount) NCol=1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
interval = 1000;
Timer1->Enabled = true;
StartTime = (long)GetTickCount();
}
//---------------------------------------------------------------------------
задание до конца не ясно, этот код пишет последовательно в ячейки 1,5,10,15...
Re: А можно ли не с нуля?
Добавлено: 19 мар 2008, 12:50
artispro
airyashov, спасибо за ответ.
Может, что-то не понятно я излагаю?
Вы откомпилируйте программу, что в моем примере, тогда поймете, что я имел ввиду.
Вопрос 1:
Есть StringGrid. С помощью таймера подсчитываются секунды и в строке NRow := 1;
начиная с первой колонки записываются. Я должен видеть изменения.
При нажатии на Button1, изменяются значения начиная с 0 и далее 1,2,3,4(т.е. interval := 5000;//5сеунд), а мне нужно, чтобы счет начинался не с 0, а с 1 и далее
2,3,4,5. После этого в следующей колонке этой же строки.
Re: А можно ли не с нуля?
Добавлено: 19 мар 2008, 14:28
airyashov
всеже не доходит до меня зачем так все сложно
вот это так
1=1,2,3,4,5
2=6,7,8,9,10
3=11,..
Код: Выделить всё
var
Form1: TForm1;
StartTime:Integer;
NCol,NRow,Sec : integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled := true;
NCol:=1;
NRow:=1;
Sec:=1
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
NCol:=Sec div 5+1;
if Sec mod 5=0 then StringGrid1.Cells[NCol-1,NRow] := IntToStr(Sec) else StringGrid1.Cells[NCol,NRow] := IntToStr(Sec);
Inc(Sec);
end;
интервал таймера 1000
Re: А можно ли не с нуля?
Добавлено: 19 мар 2008, 16:42
artispro
airyashov, спасибо за простое решение 1-го вопроса. А все простое-гениальное.;-)
2 вопрос - сложнее: как в строке StringGrid’а, найдя максимальное значение элемента, продолжить счет с этого значения до следующего, заранее известного?
Значения изменяются в ячейке
№ 1: 1,2,3,4,5
№2: 6,7,8 стоп. Вот в этой(например) ячейке, при новом запуске программы(завтра), продолжить счет 9,10 и перейти в следующую ячейку.
Я сравниваю так:
// ----- поиск максимального элемента -----------
procedure TForm1.Button2Click(Sender: TObject);
var
i : integer;
m : array[1..40] of integer; // массив
NJ: integer;//Номер максимального элемента массива
// J: integer;//максимальное значение элемента массива
begin
Timer1.Enabled := true;
// считаем, что если ячейка пустая, то соответствующий ей элемент массива равен нулю
for i :=1 to 40 do
if Length(StringGrid1.Cells[i, 1])<>0 then
m := StrToInt(StringGrid1.Cells[i,1])
else
m := 0;
// поиск максимального элемента
max := 0; // первый элемент
for i := 1 to 40 do
if m > m[max] then max := i;
// вывод результата
J:=m[max];
Label3.Caption := '№ колонки:'+ IntToStr(max);
Label4.Caption := 'Масимальное значение:'+ IntToStr(J);
end;
а как дальше не соображу 8-(
Re: А можно ли не с нуля?
Добавлено: 20 мар 2008, 14:23
Хыиуду
Ну вот нашли мы максимальное значение max. Потом на таймер повесить
Код: Выделить всё
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Sec1:=Sec+max;
NCol:=Sec1 div 5+1;
if Sec mod 5=0 then StringGrid1.Cells[NCol-1,NRow] := IntToStr(Sec1) else StringGrid1.Cells[NCol,NRow] := IntToStr(Sec1);
Inc(Sec);
end;
Re: А можно ли не с нуля?
Добавлено: 20 мар 2008, 15:18
artispro
Хыиуду, спасибо за ответ,
но при повторном запуске программы ошибка на 1 секунду:
в 1 - 1,2,3,4,5.
во 2 - 6,7,8 - exit, далее запускаем, во 2- 9, а 10 уже в следующей ячейке...
Получаем ошибку в 1 секунду.
Re: А можно ли не с нуля?
Добавлено: 20 мар 2008, 16:10
airyashov
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
Timer1.Enabled := true;
NCol:=1;
NRow:=1;
Sec:=1;
for i:=1 to StringGrid1.ColCount-1 do
begin
if StringGrid1.Cells[i,NRow]<>'' then
if StrToInt(StringGrid1.Cells[i,NRow])>Sec then begin NCol:=i; Sec:=strtoint(StringGrid1.Cells[i,NRow]); end;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
NCol:=Sec div 5+1;
if Sec mod 5=0 then StringGrid1.Cells[NCol-1,NRow] := IntToStr(Sec) else StringGrid1.Cells[NCol,NRow] := IntToStr(Sec);
Inc(Sec);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled:=False;
end;