Форум программистов, компьютерный форум, киберфорум
Наши страницы
Free Pascal
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Unregistered45
0 / 0 / 0
Регистрация: 05.12.2015
Сообщений: 32
#1

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

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

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

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

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

Ошибка при компиляции CRT>
Добрый вечер всем. Прошу сильно не бить - начинающий... Компилирую программу...

Как управлять стрелочками при вводе числа Crt Pascal
Как написать кнопочки, которыми нужно управлять с клавы ( как на скрине)?...

Изменить размер и положение окна, которое получается при подключении crt
Как можно изменить размер и положение окна, которое получается при подключении...

10
ФедосеевПавел
Модератор
3603 / 1986 / 825
Регистрация: 01.02.2015
Сообщений: 6,616
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
ФедосеевПавел
Модератор
3603 / 1986 / 825
Регистрация: 01.02.2015
Сообщений: 6,616
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
ФедосеевПавел
Модератор
3603 / 1986 / 825
Регистрация: 01.02.2015
Сообщений: 6,616
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
ФедосеевПавел
Модератор
3603 / 1986 / 825
Регистрация: 01.02.2015
Сообщений: 6,616
29.01.2017, 15:52 #8
Лучший ответ Сообщение было отмечено Unregistered45 как решение

Решение

Видимо, придётся выводить при помощи 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
3815 / 2496 / 2055
Регистрация: 22.11.2013
Сообщений: 6,947
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
ФедосеевПавел
Модератор
3603 / 1986 / 825
Регистрация: 01.02.2015
Сообщений: 6,616
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

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

Несоответствие типов в программе и модуле при использовании множеств
Нужно было написать программу, которая выбирает определенные числа из множества...

Неизвестное имя clreol при подключенном модуле crt
unit menu_unit;...


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

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

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