Страница 1 из 2

Вопросы по теме книги

СообщениеДобавлено: 09.09.2012 17:13:34
mpeg
Текст книги:
Глава 5.
"...В первых строчках видим служебное сообщение о запуске IDE Free Pascal, – не смотрите туда.
Нам важна последняя строка, где мы видим долгожданный «Привет!».
Полюбовавшись на него, вернитесь в IDE, для чего нажмите любую клавишу.
Хотите повторить удовольствие? Так запустите программу еще пару раз («Ctrl+F9») и полюбуйтесь на результат («Alt+F5»)."

Вопрос знатокам!

В QuikBasic есть очень удобная команда "cls", которая очищает мне экран просмотра выполнения моей программы в Интегри́рованной среде разрабо́тки.
Я ставлю её в вверху каждой учебной программы и... смотрю результаты на экране только самого свежего запуска программы на выполнение.

Как того же добиться в Free Pascal?

Я форматирую текст своих учебных программ в процессе экспериментов методом:
const Line = ’---------------------------’;
Writeln(Line);
, но это помогает слабо.

Хотелось бы оператор узнать который автоматом чистит чёрный экран просмотра от оставшихся строк старых запусков программы на выполнение в среде Free Pascal.

P.S: Надеюсь понятно объяснил суть проблемы... :roll:

Re: Вопросы по теме книги

СообщениеДобавлено: 09.09.2012 18:40:57
Vadim
Нужно подключить модуль Crt и там есть процедура очистки экрана под названием ClrScr.

Re: Вопросы по теме книги

СообщениеДобавлено: 09.09.2012 21:41:15
Oleg_D
Vadim писал(а):Нужно подключить модуль Crt и там есть процедура очистки экрана под названием ClrScr.

К этому добавлю что я сознательно не подключал модуль Crt, как и другие модули, чтобы сохранить переносимость примеров (ведь есть ещё Delphi и PascalABC). Альтернативный способ очистки экрана может быть таким:
Код: Выделить всё
for i:=1 to 25 do Writeln;

Re: Вопросы по теме книги

СообщениеДобавлено: 09.09.2012 22:59:38
tema
Вот из исходников фрипаскаля:
Код: Выделить всё
procedure ClrScr;
var
  DestCoor: TCoord;
  numChars, x : DWord;
begin
  DestCoor.X := WindMinX - 1;
  DestCoor.Y := WindMinY - 1;
  numChars := (WindMaxX - WindMinX + 1);

  repeat
    FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), TextAttr,
      numChars, DestCoor, x);
    FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), #32,
      numChars, DestCoor, x);
    inc(DestCoor.Y);
  until DWord(DestCoor.Y)=WindMaxY;

  GotoXY(1, 1);
end; { proc. ClrScr }

А для юникса чуть по другому:
Код: Выделить всё
Procedure ClrScr;
{
  Clear the current window, and set the cursor on 1,1
}
Var
  CY,i      : Longint;
  oldflush  : boolean;
  blank_with_attribute : TCharAttr;

Begin
  { See if color has changed }
  if OldTextAttr<>TextAttr then
   begin
     i:=TextAttr;
     TextAttr:=OldTextAttr;
     ttyColor(i);
   end;
  oldflush:=ttySetFlush(Flushing);
  if FullWin then
   begin
     if not OutputRedir then
      ttySendStr(#27'[H'#27'[2J');
     CurrX:=1;
     CurrY:=1;
     blank_with_attribute.ch   := ' ';
     blank_with_attribute.attr := TextAttr;
     FillWord(ConsoleBuf^,ScreenWidth*ScreenHeight,word(blank_with_attribute));
   end
  else
   begin
     For Cy:=WindMinY To WindMaxY Do
      DoEmptyLine(Cy,WindMinX,WindMaxX);
     GoToXY(1,1);
   end;
  ttySetFlush(oldflush);
End;

Re: Вопросы по теме книги

СообщениеДобавлено: 10.09.2012 00:15:23
Vapaamies
Oleg_D писал(а):
Код: Выделить всё
for i:=1 to 25 do Writeln;

Если уж на то пошло, то (по аналогии с Delphi):
Код: Выделить всё
Write(StringOfChar(sLineBreak, 25));

Если FreePascal полностью совместим с Delphi по System, должно сработать.

Re: Вопросы по теме книги

СообщениеДобавлено: 10.09.2012 02:50:59
Vadim
Oleg_D писал(а):К этому добавлю что я сознательно не подключал модуль Crt, как и другие модули, чтобы сохранить переносимость примеров (ведь есть ещё Delphi и PascalABC).

А я принципиально не изобретаю велосипед, если есть уже готовое решение, притом кроссплатформенное. ;)

Если кто не занл, для Delphi тоже есть модуль CRT. Можно взять на ихнем сайте. Ссылку не привожу, потому, что там нужно регистрироваться, иначе скачать ничего не дадут.

Re: Вопросы по теме книги

СообщениеДобавлено: 10.09.2012 08:30:17
Oleg_D
Oleg_D писал(а):
Vadim писал(а):Нужно подключить модуль Crt и там есть процедура очистки экрана под названием ClrScr.

К этому добавлю что я сознательно не подключал модуль Crt, как и другие модули, чтобы сохранить переносимость примеров (ведь есть ещё Delphi и PascalABC). Альтернативный способ очистки экрана может быть таким:
Код: Выделить всё
for i:=1 to 25 do Writeln;

А вот ещё один альтернативный способ:
Код: Выделить всё
const Clr = #10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10;
begin
  Writeln(Clr);
  Readln
end.

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

Добавлено спустя 17 минут 48 секунд:
И ещё: при подключении модуля Crt необходимо также указать путь к папке со стандартными модулями. Для неопытного пацана эта миссия иногда может оказаться невыполнимой.

Re: Вопросы по теме книги

СообщениеДобавлено: 10.09.2012 20:09:43
mpeg
Спасибо большое за ответы. :D

Меня устроил такой вариант:

Код: Выделить всё
const Clr = #10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10#10;
begin
  Writeln(Clr);
  Бла - Бла - Бла - здесь моя тестовая учебная программа... :)
end.


Vadim писал(а):Нужно подключить модуль Crt и там есть процедура очистки экрана под названием ClrScr.

Этот вариант что-то не получился у меня.
Вроде подключил всё как положено в гл.59... экран чистится - это без проблем. Но!
Русские буквы в программе заменились на крякозябры.
Пробовал во Free Pascal 2.6.0 :|
----------------------------------------------------
Ещё раз всем спасибо за советы. :D

Re: Вопросы по теме книги

СообщениеДобавлено: 11.09.2012 06:55:19
Paster Fob
Раздел описания модулей объявляется до раздела описания констант.В главной программе сразу после служебного слова begin нужно указать процедуру очистки экрана clrscr.
Код: Выделить всё
uses
  crt;
const
  ....;
type
  .....;
var
  ...;
begin
  clrscr;
  .......
end.

Re: Вопросы по теме книги

СообщениеДобавлено: 11.09.2012 13:34:57
Vadim
mpeg писал(а):Этот вариант что-то не получился у меня.
Вроде подключил всё как положено в гл.59... экран чистится - это без проблем. Но!
Русские буквы в программе заменились на крякозябры.
Пробовал во Free Pascal 2.6.0 :|

Это потому, что винду давно надо на помойку выбросить. У неё для одного языка 47,5 кодировок. :D
Я себя от этого подстраховал, поставив кодировку консоли кв реестре. ;)

Re: Вопросы по теме книги

СообщениеДобавлено: 11.09.2012 17:41:31
mpeg
Я в Turbo Pascal модуль Crt подключил ради эксперимента...
дык... подключения этого модуля сделало невозможным вообще уже в самом тексте программы русскими буквами писать.

Хотя без этого модуля в Turbo Pascal пишу тексты русскими буквами спокойно.
Без проблем компилирую и получаю выполнение с русскими же буквами.

Вывод: не дружит данный модуль с русскими буквами кажется... :D

Re: Вопросы по теме книги

СообщениеДобавлено: 13.09.2012 15:35:25
Paster Fob
Я пытаюсь разобраться с функцией Fillchar описанной в главе 46.С массивами всё ясно,а вот со строками непонятка.
пример:
Код: Выделить всё
var s:string;
    ch:char;
begin
  writeln(sizeof(s));
  readln(ch);
  fillchar(s,sizeof(s),ch);
  writeln(s);
  readln
end.

функция sizeof показывает что в строке 256 байтов(1 нулевой).Но при заполнении этих самых байтов символами строка заполняется только до позиции символа в кодировке почему так?И что происходит с нулевым байтом?

Re: Вопросы по теме книги

СообщениеДобавлено: 13.09.2012 15:58:51
Oleg_D
Paster Fob писал(а):Но при заполнении этих самых байтов символами строка заполняется только до позиции символа в кодировке почему так?И что происходит с нулевым байтом?

Вы сами и ответили, - в нулевой байт тоже попадает заполняющий код. А поскольку он играет особую роль, так и получается. Вообще, процедуру FillChar для строк обычно не применяют, - не имеет особого смысла, особенно для современных динамических строк. В данном случае над воспользоваться циклом.

Re: Вопросы по теме книги

СообщениеДобавлено: 13.09.2012 16:02:12
tema
Код: Выделить всё
  fillchar(s,sizeof(s),ch);
  setlength(s,255);


Добавлено спустя 1 минуту 42 секунды:
Можно и
Код: Выделить всё
  setlength(s,sizeof(s));

Re: Вопросы по теме книги

СообщениеДобавлено: 14.09.2012 03:55:38
Vapaamies
tema писал(а):Можно и
Код: Выделить всё
  setlength(s,sizeof(s));

Сомнительно. Я бы попробовал функцию High вместо SizeOf.