Форум программистов, компьютерный форум, киберфорум
Наши страницы

Free Pascal

Войти
Регистрация
Восстановить пароль
 
Unregistered45
0 / 0 / 0
Регистрация: 05.12.2015
Сообщений: 32
#1

Мерцание при обновлении экрана в модуле crt - Free Pascal

29.01.2017, 11:16. Просмотров 278. Ответов 10
Метки нет (Все метки)

Здравствуйте, я столкнулся с проблемой.
Я решил сделать ascii-скроллер в консоли при помощи модуля crt. Но вот проблема - практически все мерцает. Что с этим можно сделать? Пытался увеличивать задержку, но это не помогает.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2017, 11:16
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Мерцание при обновлении экрана в модуле crt (Free Pascal):

Как можно с помощью стрелок передвигать созданное окно в модуле Crt? - Pascal
Подскажите как можно с помощью стрелок передвигать созданное окно в модуле Crt. Спасибо!

crt - Вывести фамилию, имя, отчество в центре экрана - Pascal
Точно задания не помню, но вроде бы так: "Вывести фамилию, имя, отчество в центре экрана. Каждое слово разным цветом, а имя вывести...

Ошибка при компиляции CRT> - Free Pascal
Добрый вечер всем. Прошу сильно не бить - начинающий... Компилирую программу (графическое меню из http://volvo71.narod.ru/menus.htm) ...

Несоответствие типов в программе и модуле при использовании множеств - Free Pascal
Нужно было написать программу, которая выбирает определенные числа из множества Х в множество Y (нечетные или делящиеся на 17) . Ввод и...

При создании программы со включенном модулем CRT выводится только 25 строк - Free Pascal
При создании программы со включенном модулем CRT мне выводит только 25 строк, а остальные он стирает. Вопрос такое можно ли как нить...

Изменить размер и положение окна, которое получается при подключении crt - Free Pascal
Как можно изменить размер и положение окна, которое получается при подключении crt? Не того окна, которое window, а окошечка, которое...

10
ФедосеевПавел
Модератор
3265 / 1875 / 754
Регистрация: 01.02.2015
Сообщений: 6,398
29.01.2017, 11:48 #2
Помню, что CRT из FPC как-то с замедлением выводил символы.

Попробуйте другой CRT - WinCRT отсюда - http://math.ubbcluj.ro/~sberinde/wingraph/.
Скачаете архив, перекомпилируете исходники в режиме совместимости Delphi - *.o и *.ppu переместите в вашу рабочую папку с программой.

Добавлено через 2 минуты
Как подключить мышь в graph
1
Unregistered45
0 / 0 / 0
Регистрация: 05.12.2015
Сообщений: 32
29.01.2017, 12:17  [ТС] #3
ФедосеевПавел, при попытке скомприлировать выдает ошибку "this unit must be compiled under win32"
0
ФедосеевПавел
Модератор
3265 / 1875 / 754
Регистрация: 01.02.2015
Сообщений: 6,398
29.01.2017, 13:07 #4
А у вас Win64 и FPC x64?
Попробуйте в WinGraph закомментировать строку 14 {.$FATAL .....}.
1
Unregistered45
0 / 0 / 0
Регистрация: 05.12.2015
Сообщений: 32
29.01.2017, 13:17  [ТС] #5
ФедосеевПавел, скомпилировалось, но при замене uses crt на uses wincrt перестают компилиться все функции модуля crt. А если использовать оба модуля, то все так же мерцает.
0
ФедосеевПавел
Модератор
3265 / 1875 / 754
Регистрация: 01.02.2015
Сообщений: 6,398
29.01.2017, 13:34 #6
В FPC модуль CRT сильно усечён по сравнению с TurboPascal. А какие вы используете функции, которых нет в WinCRT?
0
Unregistered45
0 / 0 / 0
Регистрация: 05.12.2015
Сообщений: 32
29.01.2017, 14:17  [ТС] #7
ФедосеевПавел,
отказывает большинство функций, такие как:
cursoroff, gotxy, textcolor.

Однако, keypressed и clrscr работает(во всяком случает компилятор на них не ругается).
0
ФедосеевПавел
Модератор
3265 / 1875 / 754
Регистрация: 01.02.2015
Сообщений: 6,398
29.01.2017, 15:52 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Видимо, придётся выводить при помощи WinAPI, без применения CRT/WinCRT.
Сделать самостоятельные обёртки над API или сразу работать с API.

Добавлено через 50 минут
Что-то из этой области
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
program TestWinAPI;
 
uses
  Windows;
 
var
  hConsoleOutput: HANDLE; {A handle to the console screen buffer.}
  hConsoleInput:  HANDLE; {A handle to the console screen buffer.}
 
  function InitConsole: boolean;
  begin
    hConsoleOutput := GetStdHandle(STD_OUTPUT_HANDLE);
    hConsoleInput := GetStdHandle(STD_INPUT_HANDLE);
    //    ScreenBuffer :=GetConsoleScreenBuffer
    InitConsole := (hConsoleOutput <> INVALID_HANDLE_VALUE) and
      (hConsoleInput <> INVALID_HANDLE_VALUE);
  end;
 
  function GoToXY(X, Y: SHORT): boolean;
  var
    dwCursorPosition: COORD;
  begin
    dwCursorPosition.X := X;
    dwCursorPosition.Y := Y;
    GoToXY := SetConsoleCursorPosition(hConsoleOutput, dwCursorPosition);
  end;
 
begin
  InitConsole;
  GoToXY(5, 5);
  writeln('text 5 5');
  GoToXY(15, 15);
  writeln('text 15 15');
  readln;
end.
1
Unregistered45
0 / 0 / 0
Регистрация: 05.12.2015
Сообщений: 32
29.01.2017, 17:37  [ТС] #9
Мдя, тут легче консоль в графическом режиме иметировать. В общем, тот былокод по-любому нужно переписать.
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
3749 / 2446 / 1306
Регистрация: 22.11.2013
Сообщений: 6,787
29.01.2017, 18:00 #10
ФедосеевПавел,
можно подумать, в RTL что-то сильно другое
src/packages/rtl-console/src/win/crt.pp
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure GotoXY(X: tcrtcoord; Y: tcrtcoord);
begin
  GotoXY32(X,Y);
end;
 
procedure GotoXY32(X: DWord; Y: DWord);
{ Go to coordinates X,Y in the current window. }
begin
  if (X > 0) and (X <= (WindMaxX - WindMinX + 1)) and
    (Y > 0) and (Y <= (WindMaxY - WindMinY + 1)) then begin
    Inc(X, WindMinX - 1);
    Inc(Y, WindMinY - 1);
    SetScreenCursor(x,y);
  end;
end;
 
procedure SetScreenCursor(x,y : DWord);
var
  CurInfo: TCoord;
begin
  FillChar(Curinfo, SizeOf(Curinfo), 0);
  CurInfo.X := X - 1;
  CurInfo.Y := Y - 1;
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), CurInfo);
end;
Добавлено через 9 минут
PS. Правда, поскольку
Pascal
1
2
3
4
5
type
  COORD = record
    X, Y: SHORT;
  end;
  TCOORD = COORD;
и оба поля назначаются явно, то вызов FillChar(Curinfo, SizeOf(Curinfo), 0); как зайцу стоп-сигнал, только лишняя трата времени.
0
ФедосеевПавел
Модератор
3265 / 1875 / 754
Регистрация: 01.02.2015
Сообщений: 6,398
29.01.2017, 18:16 #11
Да, вижу. Но твёрдо помню случай - собрал программку для решения Sudoku, вывод результатов сделал в консоль разными цветами через CRT - так видел замедленный вывод матрицы 9х9.
0
29.01.2017, 18:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2017, 18:16
Привет! Вот еще темы с ответами:

Неизвестное имя clreol при подключенном модуле crt - PascalABC.NET
unit menu_unit; //------------------------------------------------------------- interface function menu(nazvanie: string; const p:...

Пытаюсь написать программу (типа игры) в модуле CRT, но при запуске вылетает - PascalABC.NET
Собсно, вот код: Program vari_ous; uses CRT; type posX = array of integer; posY = array of integer; var ...

Мерцание экрана при смещении контролов - Visual Basic
При смещении контролов, даже небольшого количества (пример - ниже), возникает мерцание экрана. Если их (контролов) ещё больше, то это...

Мерцание экрана дисплея при работе в Linux - Ubuntu Linux
Привет! При работе в ОС Linux (пробовал несколько дистрибутивов - проблема повторяется), если уменьшить яркость дисплея, становится...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru