Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249

Возможно ли в паскале (точнее, в Crt) сохранение всего видимого текста с консоли напрямую

27.06.2015, 21:02. Показов 1591. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно организовать меню примерно как в самом Free Pascal-е, ну можно попроще. И с работающими функциями. Как организовать меню отдельно я представляю - организовывала обычное таким вот образом:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
unit menu_unit; // не ругайте код, я таки студент, да и код старый))
//-------------------------------------------------------------
interface
 
function menu(nazvanie: string; const p: array of string): integer;
//-------------------------------------------------------------
implementation
uses
   crt;
 
function menu(nazvanie: string; const p: array of string): integer;
var
   i, tek: integer;
   ch: char;
begin
   textbackground(black);
   textcolor(lightgray);
   tek := 0;
 
   repeat
   clrscr;
   writeln(nazvanie);
   for i := 0 to high(p) do
      if i = tek then
      begin
         textbackground(lightgray);
         textcolor(black);
         write(p[i]);
         clreol;
         textbackground(black);
         textcolor(lightgray);
         writeln;
      end
      else
         writeln(p[i]);
   writeln;
 
   ch := readkey;
   if ch <> #0 then
      continue;
   ch := readkey;
   if ch = #80 then
      tek := (tek + 1) mod length(p)
   else if ch = #72 then
      tek := (length(p) + tek - 1) mod length(p);
   until ch = #13;
 
   menu := tek;
end;
//-------------------------------------------------------------
begin end.
Так что можно сделать таким же образом, только с gotoxy и соответствующими изменениями.
Но при открытии подменю будет стираться часть текста с рабочей области.
Этот текст можно сохранить только дублируя в файл? (я только это решение вижу) Или есть способ его как-то побыстрее сохранить?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.06.2015, 21:02
Ответы с готовыми решениями:

Сохранение текста из консоли в файл
Здравствуйте! Как сделать, чтобы в консоле вводить текст и он сохранялся в файл, и чтоб из этого файла можно было вывести то, что в...

Определение ширины видимого текста
как можно определить ширину текста, который виден в TImage или в TPaintBox?

Обрезание видимого текста по ширине ячейки
как сделать что бы при пустой правой ячейке текст(не физически, а визуально) в первой ячейки обрезался по ширине своей ячейке?

11
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
27.06.2015, 21:09
Не очень понял, но посмотрите эту тему.
Написать программу сортировки элементов массива по возрастанию или убыванию
1
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
27.06.2015, 21:17  [ТС]
У меня кириллица не прокатывает, но да, это то примерно то что я собиралась делать (только я хотела усложнить ради красоты)
Но там через clrscr работает, я собственно так и собиралась сначала, но было интересно можно ли сделать так чтобы подпункт меню открыли, закрыли (не выбрали, а просто завернули обратно) а текст, который был на экране, так там и остался нетронутым. Ну ниче, думаю таких сложностей все равно не требуется.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4494 / 1669
Регистрация: 01.02.2015
Сообщений: 13,907
Записей в блоге: 12
27.06.2015, 21:39
1. Если не ошибаюсь, то в TurboVision и его клонах (FreeVision из FPC), реализовывались объекты "окна", в которых было поле "содержимое окна" - динамический массив (или матрица, или TStringList - не помню). По мере необходимости восстановления пересчитывался регион восстановления и его содержимое бралось из поля. Т.е. бралось не из файла, а из памяти.

2. Можно воспользоваться FV (FreeVision - поставляется с FPC, IDE которого построена на FV), но придётся потратить время (много) на изучение редко применяемого и заброшенного пакета. Там отдалённо похоже на Delphi и Lazarus, но всё (размеры, расположение и прочее) подбирается вручную.

3. Можно попробовать и так:
1) Некоторый регион на экране отведён только для меню.
2) В этом регионе показывается меню.
3) При необходимости показа подменю, сохраняется состояние текущего меню, регион очищается, выводится подменю.
4) При возврате в основное меню, очищается регион, в соответствии с сохранённым ранее состоянием (выделение одного из пунктов) выводится меню.

Добавлено через 1 минуту
Упс. Мне нужно было обновиться перед отправкой...
0
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
27.06.2015, 21:46  [ТС]
Да, сложновато. Думаю, лучше не усложнять до такой степени, вряд ли студентик которому я делаю до такого додумался бы.
0
Эксперт Pascal/Delphi
2388 / 1300 / 1492
Регистрация: 29.08.2014
Сообщений: 4,665
30.06.2015, 10:22
на Windows как-то так:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
uses windows,crt;
var
  hStdout,hNewScreenBuffer:Handle;
  Security: TSecurityAttributes;
  srctReadRect,srctWriteRect:TSMALL_RECT;
  coordBufSize,coordBufCoord:TCOORD;
  chiBuffer:array of TCHAR_INFO;
  Info: TConsoleScreenBufferInfo;
  i,j:integer;
  a:array of string; //элементы меню
function menu(Items:array of string;x1,y1,x2,y2,color:integer):integer; //меню
var
  i,j,k:integer;
  c:char;
begin
  cursoroff;
  window(1,1,80,25);
  textbackground(Color);
  textcolor(White);
  for i:=1 to x2-x1+1 do begin
    gotoxy(x1-1+i,y1-1);write('-');
    gotoxy(x1-1+i,y2+1);write('-');
  end;
  for i:=1 to y2-y1+1 do begin
    gotoxy(x1-1,y1-1+i);write('|');
    gotoxy(x2+1,y2-i+1);write('|');
  end;
  gotoxy(x1-1,y1-1);write('+');
  gotoxy(x1-1,y2+1);write('+');
  gotoxy(x2+1,y1-1);write('+');
  gotoxy(x2+1,y2+1);write('+');
  window(x1,y1,x2,y2);
  clrscr;
  i:=0;
  k:=x2-x1;
  repeat
    for j:=low(Items) to High(Items) do begin
      if j=i then begin
        textbackground(LightBlue);
        textcolor(LightRed);
      end else begin
        textbackground(color);
        textcolor(White);
       end;
       gotoxy(k div 2-length(Items[j]) div 2,1+j);
     write(Items[j]);
    end;
    c:=readkey;
    if c=#0 then begin
      c:=readkey;
      case ord(c) of
        72: if i>low(Items)  then i:=i-1 else i:=high(Items);
        80: if i<High(Items) then i:=i+1 else i:=low(Items);
      end;
    end;
  until c=#13;
  cursoron;
  menu:=i;
end;
 
procedure MScreen(B:boolean);//если true - записываем экран, false - восстанавливает 
//списано с MSDN  [url]https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms685032(v=vs.85).aspx[/url]
begin
  FillChar(Security, SizeOf(Security), 0);
  hStdout:=GetStdHandle(STD_OUTPUT_HANDLE);
  GetConsoleScreenBufferInfo(hStdout, @Info);
  hNewScreenBuffer:=CreateConsoleScreenBuffer(
    GENERIC_READ or
    GENERIC_WRITE,
    FILE_SHARE_READ or
    FILE_SHARE_WRITE,
    Security,
    CONSOLE_TEXTMODE_BUFFER,
    nil);
    if (hStdout=INVALID_HANDLE_VALUE) or
       (hNewScreenBuffer=INVALID_HANDLE_VALUE) then
       begin
         writeln('CreateConsoleScreenBuffer failed - ',GetLastError);
         halt(1);
       end;
     if (not SetConsoleActiveScreenBuffer(hNewScreenBuffer)) then
     begin
       writeln('SetConsoleActiveScreenBuffer failed - ', GetLastError);
        halt(1);
     end;
   srctReadRect.Top:=0;    
   srctReadRect.Left:=0;
   srctReadRect.Bottom:=Info.dwSize.Y; 
   srctReadRect.Right:=Info.dwSize.X;
   srctWriteRect.Top:=0;    
   srctWriteRect.Left:=0;
   srctWriteRect.Bottom:=Info.dwSize.Y;
   srctWriteRect.Right:=Info.dwSize.X;
   coordBufSize.Y:=Info.dwSize.Y;
   coordBufSize.X:=Info.dwSize.X;
   coordBufCoord.X:=0;
   coordBufCoord.Y:=0;
   if b then begin
     setlength(chiBuffer,Info.dwSize.Y*Info.dwSize.X);
   if not ReadConsoleOutput(
     hStdout,
     @chiBuffer[0],
     coordBufSize,
     coordBufCoord,
     srctReadRect) then
     begin
       writeln('ReadConsoleOutput failed -',GetLastError);
       halt(1);
     end;
  end else
  if not  WriteConsoleOutput(
    hStdOut,
    @chiBuffer[0],
    coordBufSize,
    coordBufCoord,
    srctWriteRect) then
    begin
      writeln('WriteConsoleOutput failed - ',GetLastError);
      halt(1);
    end;
   if (not SetConsoleActiveScreenBuffer(hStdout)) then
     begin
       writeln('SetConsoleActiveScreenBuffer failed - ', GetLastError);
        halt(1);
     end;
end;
procedure musor; //просто генератор мусора на экране тут может быть какой-то текст
var
  i,j:integer;
begin
  randomize;
  for i:=1 to 25 do
  for j:=1 to 80 do begin
    textcolor(random(16));
    textbackground(random(16));
    gotoxy(j,i);
    write(chr(random(200)+32));
  end;
end;
begin
  musor;//заполняем мусором
  mscreen(true);//сохраняем копию в буфере
  repeat until keypressed;  //ждем нажатия на кнопку
  setlength(a,3);//три пункта меню
  a[0]:='Item 1';a[1]:='Item 2';a[2]:='Exit';//собственно они
  repeat until menu(a,30,10,50,15,green)=2; //меню
  mscreen(false); //восстанавливаем экран
 
end.
0
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
30.06.2015, 10:43  [ТС]
Цитата Сообщение от Керра Посмотреть сообщение
Думаю, лучше не усложнять до такой степени
увеличиваем сообщение до трех символов чтобы его было возможно отправить...
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
30.06.2015, 11:21
Керра,
модуль Video, переменная VideoBuf.
Документация на модуль: http://freepascal.org/docs-htm... index.html
0
Эксперт Pascal/Delphi
2388 / 1300 / 1492
Регистрация: 29.08.2014
Сообщений: 4,665
30.06.2015, 11:35
bormant, так Video же с Crt не работает
по крайней мере там по ссылке так написано
Remark: The video unit should not be used together with the crt unit. Doing so will result in very strange behaviour, possibly program crashes.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
30.06.2015, 12:01
Правильно, не работает, вывод несложно сделать самостоятельно, процедуру Str() и функции ...ToStr() никто не отнимал :-) А дальше MoveStr() из Drivers, TView.WriteBuf(), TView.WriteLine() из Views, то есть вообще иная парадигма ;-)

В DOS было просто:
Pascal
1
2
var
  screen: array [0..24,0..79] of record c: Char; a: Byte; end absolute $B800:0;
и можно было читать/писать напрямую :-)
0
30.06.2015, 12:18

Не по теме:

Мне что-то кажется что Керра сама не рада что спросила...

0
30.06.2015, 12:48  [ТС]

Не по теме:

Мдя...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.06.2015, 12:48
Помогаю со студенческими работами здесь

Удаление видимого элемента на странице, но при этом сохранение данных в этом элементе
Функция, которая вызывается на сайте должна удалить видимый элемент input, но при этом должны сохраниться данные, которые были в этом...

Возможно-ли обратиться напрямую к ножкам RJ-45 (Ethernet)?
Например с помощью класса SerialPort можно обратиться (подать или считать состояние) к ножкам ком-порта CD, CTS, DSR, DTR, RTS с помощью...

Возможно ли, работая в консоли хрома, сохранять информацию, помимо логов консоли (console.log), куда-нибудь ещё?
Всем, привет :) Подскажите пожалуйста, возможно ли на js, работая в консоли хрома, сохранять текстовую инфу по мимо логов консоли...

ASUS N53tk питание напрямую к маме. Возможно?
Доброго времени суток! Досталась плата от ASUS N53tk с начинкой. Ноут был залит. Привезли без корпуса и без платы DC JACK, она...

Возможно ли к материнской плате ноутбука припаять напрямую зарядное устройство?
здравствуйте все,подскажите кто разбирается,возможно ли к материнской плате ноутбука(asusk54hr)припаять напрямую зарядное устройство,штекер...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru