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
Не совсем понятно, что вам требуется. Зачем вам несколько раз выводить одно и то же в одну и ту же клетку?
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Полный вопрос состоит вот в чем:
как в строке 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. и т.д.
Вы откомпилируйте программу, что в моем примере, тогда поймете, что я имел ввиду.
Вопрос 1:
Есть StringGrid. С помощью таймера подсчитываются секунды и в строке NRow := 1;
начиная с первой колонки записываются. Я должен видеть изменения.
При нажатии на Button1, изменяются значения начиная с 0 и далее 1,2,3,4(т.е. interval := 5000;//5сеунд), а мне нужно, чтобы счет начинался не с 0, а с 1 и далее
2,3,4,5. После этого в следующей колонке этой же строки.
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;
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;
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
но при повторном запуске программы ошибка на 1 секунду:
в 1 - 1,2,3,4,5.
во 2 - 6,7,8 - exit, далее запускаем, во 2- 9, а 10 уже в следующей ячейке...
Получаем ошибку в 1 секунду.
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;