Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ цифровой секундомер в графике

Автор: striker 7.06.2009 15:11

http://forum.sources.ru/index.php?showtopic=272151&st=0&#entry2263928

Сворачивается экран Паскаля (турбо)
присваивание detect'а не помогает

Автор: volvo 7.06.2009 15:47

Так... А теперь - подробнее, что значит "экран сворачивается"? Программа завершается? Ты ее как запускал? Попробуй запусти прямо из IDE, по крайней мере получишь информацию о причинах такого поведения. Повторяю, только что проверил под TP, у меня - ничего не сворачивается, отображается заданное время...

Добавь анализ graphresult, может у тебя с инициализацией графики что-то не то?

В любом случае, указание строки, на которой прерывается выполнение программы, и сообщения, возникающего при этом, очень поможет, потому что мне повторить ошибку не удалось, поэтому исправить ее я тоже не могу (я вообще слабо представляю, где здесь что-нибудь может вылетать, если честно)...

Автор: striker 7.06.2009 17:44

Сворачивается окно TurboPascal
а это видно, что отображается. Разворачиваешь окно - мелькает и сворачивается

Автор: volvo 7.06.2009 17:53

В таком случае - это не проблема Паскаля. У тебя что-то с ОСью не то, если окна просто так сворачиваются...

Автор: Krjuger 7.06.2009 19:37

Striker, а у вас случаем не Vista стоит?)))

Автор: striker 7.06.2009 19:51

нет smile.gif
Он с эксплорером открытым сворачивается

Вот попытался совместить с программой из соседней темы - всё, запутался. Суть та же, вывод другой

Так ли я время преобразую?

Код
uses crt,dos,graph;
const
  size = 50;
  fore = lightred;
  back = darkgray;

type
  indicator = 1 .. 7;
  i_set = set of indicator;
  rec = record
    xs, ys, xf, yf: integer;
  end;
  arr_digits = array['0' .. '9'] of i_set;
  arr_lines = array[1 .. 7] of rec;

const
  digits: arr_digits = (
    [1, 2, 3, 4, 5, 6],
    [3, 4],
    [2, 3, 5, 6, 7],
    [2, 3, 4, 5, 7],
    [1, 3, 4, 7],
    [1, 2, 4, 5, 7],
    [1, 2, 4, 5, 6, 7],
    [2, 3, 4],
    [1, 2, 3, 4, 5, 6, 7],
    [1, 2, 3, 4, 5, 7]
  );
  lines: arr_lines = (
    (xs:0; ys:0; xf:0; yf:size),
    (xs:0; ys:0; xf:size; yf:0),
    (xs:size; ys:0; xf:size; yf:size),
    (xs:size; ys:size; xf:size; yf:2*size),
    (xs:size; ys:2*size; xf:0; yf:2*size),
    (xs:0; ys:2*size; xf:0; yf:size),
    (xs:0; ys:size; xf:size; yf:size)
  );

var
  xpos, ypos: integer;

procedure put_indicator(list: i_set);
var i: indicator;
begin
  for i := low(indicator) to high(indicator) do begin
    if i in list then setcolor(fore) else setcolor(back);
    with lines[i] do
      line(xpos + xs, ypos + ys, xpos + xf, ypos + yf);
  end;
  inc(xpos, size + 10);
end;
procedure print(s: string);
var i: integer;
begin
  for i := 1 to length(s) do begin
    case s[i] of
      '0' .. '9':
        put_indicator(digits[s[i]]);
      '-':
        put_indicator([7]);
    end;
  end;
end;

Function GetTime: LongInt;
Var
  h, m, s, ms: Word;
  R: longint;
begin
  Dos.GetTime(h, m, s, ms);
  GetTime := ms + 100 * (s + 60 * (longint(m) + 60 * h));
end;

var g_driver, g_mode,i: integer;
stop:boolean;
curr_time:longint;

s:string;
begin
  initgraph(g_driver, g_mode, '');


    xpos := 150; ypos := 150;

  setwritemode(xorput);

  i := 0; stop := false;
  repeat
  repeat

    curr_time := GetTime;
    while GetTime - curr_time < 100 do; { просто ждем 1 секунду }
    if keypressed then begin
      stop := true; while keypressed do readkey;
    end;
  str(curr_time,s);
   print(s);
     inc(i);
  until stop;
  stop:=false;
  readln;
  until keypressed;
  readln;
  closegraph;
   { <--- Вот так же передашь текущее время в виде строки в процедуру print }

  readln;
  closegraph;
end.


Автор: volvo 7.06.2009 20:17

Опять за свое... Я ж показал тебе, как надо делать основной цикл. Ты ВЫЙТИ-то из своей программы пробовал хоть когда-нибудь? То, что она у тебя "сворачивается" - не повод заставлять ДРУГИХ, у кого она НЕ сворачивается, удалять процесс...

Цитата
Так ли я время преобразую?
А это смотря что хочешь получить... Если число секунд, прошедших с момента запуска - то вот так:

begin
initgraph(g_driver, g_mode, '');

i := 0;
repeat
stop := false;
repeat

curr_time := GetTime;
while GetTime - curr_time < 100 do;

xpos := 150; ypos := 150;
str(i, s);
cleardevice;
print(s);

if keypressed then begin
stop := true; while keypressed do readkey;
end;
inc(i);
until stop;
while not keypressed do;
finished := readkey = #27;
until finished;
closegraph;
end.
Проверено на ТП, запусти, если у тебя опять "сворачивается" - прогоняй антивирусы, делай с системой, что хочешь - проблема именно в ней...

Автор: striker 7.06.2009 20:34

Извини, спасибо smile.gif
Только ещё лучше бы чтобы на минуты тоже переходило если больше 60 секунд
И сразу 4 серых поля было, как такое сделать?

Автор: striker 9.06.2009 2:14

volvo, помоги пожалуйста

Автор: volvo 9.06.2009 2:48

Так лучше?


Прикрепленные файлы
Прикрепленный файл  n_sec.pas ( 2.42 килобайт ) Кол-во скачиваний: 257

Автор: striker 10.06.2009 20:32

ага, спасибо огромное