А можно ли не с нуля?

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

artispro
Сообщения: 6
Зарегистрирован: 17 мар 2008, 13:47

Возможно ли в чтобы при 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
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Не совсем понятно, что вам требуется. Зачем вам несколько раз выводить одно и то же в одну и ту же клетку?
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
artispro
Сообщения: 6
Зарегистрирован: 17 мар 2008, 13:47

Полный вопрос состоит вот в чем:
как в строке 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. и т.д.
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

Вообще муть какая-то
что содержится в ячейке строка?

Код: Выделить всё

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...
artispro
Сообщения: 6
Зарегистрирован: 17 мар 2008, 13:47

airyashov, спасибо за ответ.

Может, что-то не понятно я излагаю?

Вы откомпилируйте программу, что в моем примере, тогда поймете, что я имел ввиду.

Вопрос 1:

Есть StringGrid. С помощью таймера подсчитываются секунды и в строке NRow := 1;
начиная с первой колонки записываются. Я должен видеть изменения.
При нажатии на Button1, изменяются значения начиная с 0 и далее 1,2,3,4(т.е. interval := 5000;//5сеунд), а мне нужно, чтобы счет начинался не с 0, а с 1 и далее
2,3,4,5. После этого в следующей колонке этой же строки.
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

всеже не доходит до меня зачем так все сложно
вот это так
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
artispro
Сообщения: 6
Зарегистрирован: 17 мар 2008, 13:47

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-(
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Ну вот нашли мы максимальное значение 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;
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
artispro
Сообщения: 6
Зарегистрирован: 17 мар 2008, 13:47

Хыиуду, спасибо за ответ,

но при повторном запуске программы ошибка на 1 секунду:
в 1 - 1,2,3,4,5.
во 2 - 6,7,8 - exit, далее запускаем, во 2- 9, а 10 уже в следующей ячейке...
Получаем ошибку в 1 секунду.
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

Код: Выделить всё

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;
Ответить