Difference between revisions of "Console Mode Pascal/ru"

From Free Pascal wiki
Jump to navigationJump to search
 
(9 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
{{Console Mode Pascal}}
 
{{Console Mode Pascal}}
  
== Программирование консольного режима в Pascal ==
+
== Программирование в консольном режиме Pascal ==
by [[User:Kirkpatc]]
 
  
Многие программы написаны на Pascal задолго до появления графических интерфейсов пользователя (GUI) и интегрированных оболочек разработки (IDE), ныне ставших модными. Однако начинающим программировать на Pascal желательно попробовать основные инструментальные средства языка. Часто бывает необходимо писать консольные или текстовые приложения для выполнения сложных системных управляющих задач.  
+
Многие из нас писали [[Program| программы]] на [[Pascal|Паскале]] задолго до того, как вошли  в моду [[Graphical User Interface|Графический интерфейс пользователя]] (GUI) и [[IDE|Интегрированные среды разработки (IDE)]]. Многие другие являются новичками в программировании на Pascal, и им необходимо уметь опробовать основные инструменты языка. Третьим нужны [[Command-line interface|консольные]] приложения или приложения [[Text User Interface|текстового режима]] для выполнения сложных задач управления системой.
  
Lazarus является идеальной средой для изучения Pascal и разработки программ текстового режима. Может использоваться вся функциональность интегрированной оболочки разработчика, включая редактор исходных текстов с подцветкой синтаксиса, доступ к библиотекам, инструменты сложного поиска и кодов завершения, проверку синтаксиса. Если форма с визуальными компонентами не нужна, редактор исходных текстов Lazarus – хорошая среда для разработки программы. В процессе разработки можно компилировать и выполнять программу, не покидая редактор.
+
=== Программирование в консольном режиме без Lazarus ===
 +
Хотя многие предпочитают использовать [[Lazarus IDE]] для написания программ в режиме консоли, вы также можете написать их с помощью любого текстового редактора и скомпилировать их самостоятельно, вызвав [[Compiler|компилятор]] [[FPC]], например так для программы в example.pas:
 +
<syntaxhighlight lang="bash">
 +
fpc example.pas
 +
</syntaxhighlight>
  
Для запуска программы консольного режима необходимо в основном меню выбрать Проект -> Создать Проект, затем выбрать '''Программа''', '''Консольное приложение''' или '''Программа пользователя'''. IDE не будет генерировать дополнительных файлов для полного графического приложения, и не откроет окно Инспектора Объектов, но откроет редактор исходного текста со скелетом структуры программы и будет ожидать ввода текста программы.
+
Также доступен текстовый режим IDE ''fp'' (немного похожий на старый [[Turbo Pascal]]).В следующих разделах мы сосредоточимся на программировании с помощью [[Lazarus]].
  
=== Программа пользователя ===
+
=== Программирование в консольном режиме с помощью Lazarus ===
 +
Lazarus предоставляет идеальную среду для изучения Паскаля и разработки программ в текстовом режиме. Можно использовать все функции интегрированной среды разработки, включая редактор исходного кода с ее [[Syntax highlighting| подсветкой синтаксиса]], доступом к библиотекам, сложными инструментамиы поиска и завершения кода, а также проверкой синтаксиса. Если вам не нужна [[TForm |Form]] с ее визуальными компонентами, можно и без нее, но редактор исходного кода Lazarus по-прежнему остается отличной средой для разработки программ. Вы можете компилировать и запускать свою программу во время разработки, не выходя из редактора.
  
Очень маленькая программа на pascal. Выбирается, если нужно сделать все самостоятельно, или выполнить быструю проверку, а затем удалить файлы.
+
Чтобы запустить программу в режиме консоли, перейдите в главное меню и выберите Project -> New Project(Проект - новый проект), а затем выберите '''Program'''(Программа) или '''Console Application'''(Консольное приложение). Среда IDE не будет генерировать все дополнительные файлы, связанные с полным графическим приложением, и не откроет окно инспектора объектов, но откроет редактор исходного кода со структурой скелетной программы и будет ожидать ввода вашего программирования.
  
=== Программа ===
+
{{Note| В Windows приложение с графическим интерфейсом пользователя не имеет консоли и, следовательно, не может выполнить '''writeln''' или '''readln'''. Вы получите ошибку ''File not open''(Файл не открыт). Снимите галочку в разделе ''Project Options / Compiler Options / Linking / Target specific options / Win32 GUI application''(Параметры проекта / Параметры компилятора / Связывание / Частные параметры цели / Приложение Win32 GUI), чтобы создать консольное приложение. Начиная с Lazarus IDE 1.4 она находится в разделе ''Project(menu) / Project Options / Compiler Options / Config and Target / Target specific options / Win32 GUI application''(Проект (меню) / Параметры проекта / Параметры компилятора / Настройка и целевая платформа / Частные параметры цели / Приложение Win32 GUI).}}
  
Похоже на "Программа пользователя", но IDE задействован чуть больше. Например, если добавить другой модуль, IDE автоматически добавит его имя в секцию uses. Это действие определяется в опциях проекта. Можно перемещаться в любое время между режимами 'Программа' и 'Программа пользователя'.
+
{{Note|Lazarus имеет некоторые функции для программ командной строки, такие как [[CopyFile |copyfile]]. Чтобы использовать их, добавьте требование к проекту для LazUtils (Project / Project Inspector / Required Packages --> "Add" --> New Requirement --> choose "LazUtils" --> OK), которое не будет задействовать весь LCL. Затем добавьте соответствующий модуль в раздел uses.}}
 +
 
 +
==== Тип проекта: Console Application (Консольное приложение) ====
 +
 
 +
Выбор этого типа проекта в Lazarus создает программу с новым классом, производным от TCustomApplication. TCustomApplication предоставляет много всяких штучек и упрощает программирование утилит командной строки. Например, проверка параметров командной строки, написание справки, проверка [[Command_line_parameters_and_environment_variables#Environment_variables| переменных окружения]] и обработка [[Exceptions| исключений]]. Все программы [[LCL]] используют это автоматически.
 +
 
 +
==== Тип проекта: Program (Программа) ====
 +
 
 +
В качестве демо мы напишем очень минималистичную программу на Паскале. В среде IDE выберите тип проекта Program(Программа), и пусть среда IDE вам немного поможет. Например, когда вы добавляете еще один [[Unit |модуль]], IDE автоматически добавит имя модуля в раздел программы [[Uses| uses]]. Это поведение определяется в параметрах проекта. Таким образом, вы можете переключаться между 'Program'(Программой) и 'Custom Program'(Пользовательской программой) в любое время.
  
 
Пример для начинающих:
 
Пример для начинающих:
<pre>
+
<syntaxhighlight  lang="Pascal">
 
program Project1;
 
program Project1;
 
{$mode objfpc}{$H+}
 
{$mode objfpc}{$H+}
Line 26: Line 38:
 
   cthreads,
 
   cthreads,
 
   {$ENDIF}{$ENDIF}
 
   {$ENDIF}{$ENDIF}
   Classes
+
   Classes;
  { you can add units after this };
 
 
begin
 
begin
   writeln('Hello World!');
+
   WriteLn('Hello World!');
   readln;
+
   ReadLn;
end.
+
end.</syntaxhighlight>
</pre>
+
 
 +
=== Pascal scripts ===
 +
Кроме того, можно писать сценарии, которые динамически компилируются с помощью [[InstantFPC]], кроссплатформенного решения для запуска (небольших) программ Pascal в виде сценариев. Шебанг <pre>#!/usr/bin/env instantfpc</pre> позволяет запускать скрипт как отдельную программу.
 +
 
 +
{{Note|Хотя он используется для запуска сценариев Pascal, InstantFPC использует обычный Object Pascal, а не язык сценариев PascalScript. Таким образом, "'''PascalScript'''" и '''Pascal script''' - это не одно и то же.}}
 +
 
 +
== Запуск программы ==
 +
==== Компиляция ====
 +
 
 +
Когда вы закончите свою программу (или фрагмент программы), вы можете скомпилировать и запустить ее, выбрав Run -> Build(Выполнить -> Сборка)(или Quick Compile(Быстрая компиляция)) в главном меню или щелкнув значок зеленого треугольника («Выполнить») [[Image: Start.png]] на панели кнопок. Любые сообщения компилятора (предупреждения, отчеты о ходе выполнения или сообщения об ошибках) появятся в окне сообщения, и, надеюсь, в конечном итоге будет сообщение, которое скажет
 +
 
 +
'Project "Project1" successfully built. (Проект "Project1" успешно собран.) :).
 +
 
 +
А где программа-то ?? !!
 +
 
 +
Если вы еще не сохранили программу, то среда IDE поместит ее во «временный» каталог (например, /tmp в Linux, C:\temp в Windows, см. Environment Options / Files / Directory (Параметры среды / Файлы / Каталог) для собранных тестовых проектов).
 +
 
 +
Если вы уже сохранили проект, значит, программа была создана в том же каталоге, где вы сохранили файл project1.lpi.
 +
 
 +
==== Запуск в консоли ====
 +
Вы можете запустить программу, перейдя в окно консоли (терминала), затем с помощью '''cd''' перейдя в каталог и введя имя программы. В Unix/Linux, если она находится в текущем каталоге, вам придется начать с <code>./</code>, поскольку программа, вероятно, не будет найдена в PATH.
 +
 
 +
Пример для Linux/Unix, где программа хранится в /tmp:
 +
<syntaxhighlight lang="bash">
 +
cd /tmp
 +
./Project1
 +
</syntaxhighlight>
 +
Однако может быть очень неудобно продолжать переходить из редактора Lazarus в окно терминала и обратно. К счастью, есть механизм, позволяющий открывать окно терминала из среды Lazarus.
 +
 
 +
==== Запуск в IDE ====
 +
Во внутренней консоли: показывается в окне вывода терминала.
 +
 
 +
При перенаправлении вывода.
 +
 
 +
В главном меню выберите Run -> Run Parameters(Выполнить -> Параметры запуска), затем установите флажок "Use launching application"(Использовать запускаемое приложение). В первый раз, когда вы сделаете это и попробуете последовательность Compile / Run (Собрать / Запустить), вы, вероятно, получите отлуп:
 +
 
 +
'xterm: Can't execvp /usr/share/lazarus//tools/runwait.sh: Permission denied'.
 +
 
 +
Если это произошло, вам необходимо изменить права доступа к соответствующему файлу (например, с помощью chmod +x <имя файла> или с помощью утилиты Windows для изменения разрешений); возможно, вам придется сделать это как root. После этого каждый раз, когда вы будете запускать свою программу, будет появляться окно консоли, в котором будут отображаться все ваши текстовые операции ввода-вывода (readln, Writeln и т. Д.).
 +
 
 +
После того, как ваша программа завершит выполнение, на экране появится сообщение «Нажмите Enter». Таким образом, любой вывод, сгенерированный вашей программой, останется на экране до тех пор, пока вы не прочтете его; после того, как вы нажмете «Enter», окно консоли закроется.
 +
 
 +
К сожалению, этот метод не позволяет использовать встроенный отладчик.
  
=== Консольное приложение ===
+
==== Запуск в IDE с перенаправлением вывода ====
  
Здесь создается программа с новым классом, производным от TCustomApplication. TCustomApplication обеспечивает хорошую основу и делает программирование утилит командной строки довольно простым. Например, проверку опций командной строки, написание справки, проверку переменных окружения и обработку исключений. Все программы LCL автоматически это используют.
+
Если вы хотите увидеть, что написано в stdout, и также хотите использовать встроенный отладчик, stdout можно перенаправить в файл следующим кодом:
 +
<syntaxhighlight  lang="Pascal">
 +
uses
 +
  baseunix;
  
== Компиляция ==
+
var
 +
  OutputFile: text;
  
По завершении написания программы (или ее фрагмента), ее можно откомпилировать и выполнить, выбрав Запуск -> Запуск из основного меню, или нажав зеленый треугольник  (Запуск) на кнопочной панели. Все сообщения компилятора (предупреждения, промежуточные отчеты и сообщения об ошибках) будут появляться в окне сообщений, а в конечном итоге должно появиться сообщение
+
begin   
 +
  Assign(OutputFile, 'Output.txt');
 +
  if FileExists(Filename) then begin
 +
    Append(OutputFile);
 +
  end
 +
  else begin
 +
    Rewrite(OutputFile);  { открываем файл для записи, уничтожая содержимое, если таковое имеется }
 +
  end;
  
'Project "Project1" successfully built.:)'.
+
  ResultCode := fpdup(OutputFile, output);
  
== Запуск ==
+
  if ResultCode < 0 then begin
 +
    raise Exception.CreateFmt('Обман не удался: %s', [ResultCode]);
 +
  end;
 +
  Close(OutputFile);
 +
end.</syntaxhighlight>
 +
Затем файл output.txt можно просмотреть с помощью команды 'tail -f output.txt' или просмотреть с помощью редактора, если 'tail' недоступен в вашей [[Operating System|ОС]].
  
Но где находится программа??!!
+
В качестве альтернативы, используя Lazarus 0.9.31 или выше (только в Linux): в меню "View"(Вид) в разделе "Debug Windows"(Отладка Windows) есть запись для "console output"(консольный вывод) для просмотра стандартного вывода.
  
Если Вы ее еще ''не'' сохраняли, то IDE поместил ее во ''временную'' папку (т.е. /tmp под linux, C:\temp под windows, см. Настройки среды / Files / Directory, чтобы проверить настройки проектов).
+
== Unicode (UTF8) вывод ==
 +
Если вы хотите, чтобы ваша программа в режиме консоли отображала вывод Unicode ([[UTF-8|UTF8]]) в Windows Vista и более поздних версиях (а также, возможно, в более ранних версиях), вы можете использовать команду '''SetConsoleOutputCP''' для задания консоли набор символов UTF8.
  
Если проект был сохранен, то созданная программа находится в той же папке, где и файл project1.lpi.
+
{{Note | вам нужно будет убедиться, что шрифт консоли может отображать буквы, которые вы хотите вывести (например, греческий, кириллица, корейский).}}
  
Выполнять программу можно из окна консоли (терминала), применив '''cd''' для перехода в нужную папку, и напечатав имя программы (в Unix/Linux, в текущей папке нужно напечатать
+
{{Note | вам нужно будет включить модуль Windows.}}
  
./Project1 ,
+
См. [[Unicode_Support_in_Lazarus/ru|Поддержка Unicode LCL]] для получения более подробной информации о поддержке Unicode в Lazarus и FPC.
  
если эта папка не находится в стандартном PATH). Однако довольно неудобно постоянно прыгать из редактора Lazarus в окно терминала и обратно. К счастью, имеется механизм, позволяющий открывать окно терминала из среды Lazarus.
+
Пример программы:
 +
<syntaxhighlight  lang="Pascal">
 +
program uniconsole;
  
== Запуск из IDE ==
+
{$mode objfpc}{$H+}
 +
{$APPTYPE CONSOLE}
  
Из оснвного меню нужно выбрать Запуск -> Параметры запуска, затем пометить флажок "Использовать приложение для запуска". Сделав это, попробуйте запустить последовательность Компиляция/Запуск, но возможно, появится нехорошее сообщение
+
uses
 +
  {$IFDEF UNIX}
 +
    {$IFDEF UseCThreads}
 +
    cthreads,
 +
    {$ENDIF}
 +
  {Диспетчер широких строк, необходимый для поддержки широких строк}
 +
  cwstring,
 +
  {$ENDIF}
 +
  {$IFDEF WINDOWS}
 +
  Windows, {для setconsoleoutputcp}
 +
  {$ENDIF}
 +
  Classes
 +
  ;
  
"xterm: Can't execvp /usr/share/lazarus//tools/runwait.sh: Permission denied". 
+
var
 +
UTF8TestString: string;
  
В этом случае необходимо изменить разрешения для соответствующего файла (например, chmod +x filename, или при помощи утилиты Windows, изменяющей разрешения); для этого необходимы права администратора. После этого при запуске программы появится окно консоли и тексты ввода/вывода в нем.
+
begin
   
+
{$IFDEF WINDOWS}
По завершении выполнения программы на экране появится сообщение "Press enter". Таким образом диалоги созданной программы останутся на экране, чтобы можно было их прочитать; по нажатии 'enter' окно консоли закроется.
+
SetConsoleOutputCP(CP_UTF8);
 +
{$ENDIF}
 +
UTF8TestString:= 'rosé, водка and ούζο';
 +
writeln ('plain: ' + UTF8TestString);
 +
{Видимо для этого нам не нужен UTF8ToConsole
 +
Фактически, UTF8ToConsole для меня ничего не сделал.}
 +
end.
 +
</syntaxhighlight>
  
 
== Примеры ==
 
== Примеры ==
  
Можно испытать работу редактора Lasarus, попробовав все примеры из обычной книги по языку Pascal, или написав собственный. Наиболее полезные - те, что выполняют системные команды или запускают другие программы (написанные на Pascal, C или Perl, или сценарии оболочки).
+
Вы можете использовать редактор Lazarus, чтобы опробовать все примеры из стандартных учебников Паскаля, или можете написать свой собственный. Некоторые из наиболее полезных процедур - это процедуры для выполнения системных команд или для запуска других программ (написанных на Паскале, C или Perl, либо в сценариях оболочки или пакетных сценариях).
  
 
=== Выполнение команд оболочки ===
 
=== Выполнение команд оболочки ===
 +
<syntaxhighlight lang="Pascal">
 +
program TryShell;
 +
uses
 +
  Classes, Unix;
 +
var
 +
  S: LongInt;
 +
begin
 +
  S := fpsystem('/bin/ls -la *.p*'); //отображает .pp, .pas, .php, .png и т.д. в текущем каталоге
 +
  WriteLn('Program exited with status : ', S)
 +
end.</syntaxhighlight>
  
Приведен пример для ''Custom Program'' или ''Program'':
 
  
<pre>
+
==== Пример: обновить FPC и Lazarus ====
Program TryShell;
+
 
uses classes, unix;
+
Могут быть выполнены более сложные команды. Например, если вы уже проверили репозитории SVN для FPC и Lazarus (см. [[Buildfaq]]), вы можете поддерживать свои исходные файлы FPC и Lazarus в актуальном состоянии, извлекая их из репозитория SVN с помощью следующей последовательности вызовов :
var S: longint;
+
 
begin
 
  S := fpsystem ('/bin/ls -la *.p*'); //lists .pp, .pas, .php, .png etc in current directory
 
  writeln ('Program exited with status : ', S)
 
end.
 
</pre>
 
  
 
=== Пример: корректировка fpc и lazarus ===
 
=== Пример: корректировка fpc и lazarus ===
Line 90: Line 187:
 
Могут выполняться более сложные команды. Например, после посещения хранилища SVN с новейшими версиями FPC и Lazarus (см. [[buildfaq]]) можно иметь исходные версии FPC и Lazarus новейшими, путем взятия из хранилища SVN следующей последовательностью вызовов:
 
Могут выполняться более сложные команды. Например, после посещения хранилища SVN с новейшими версиями FPC и Lazarus (см. [[buildfaq]]) можно иметь исходные версии FPC и Lazarus новейшими, путем взятия из хранилища SVN следующей последовательностью вызовов:
  
<pre>
+
<syntaxhighlight lang="Pascal">
Program LazUpdate;
+
program LazUpdate;
uses classes, unix;
+
uses
var s : longint;
+
  Classes, Unix;
 +
var  
 +
  S: LongInt;
 
begin  
 
begin  
   S := fpsystem ('cd /usr/local/src/fpc/devel/fpc ; make clean');
+
   S := fpsystem('cd /usr/local/src/fpc/devel/fpc       ; make clean');
   S := fpsystem ('cd /usr/local/src/fpc/devel/lazarus ; make clean');
+
   S := fpsystem('cd /usr/local/src/fpc/devel/lazarus ; make clean');
   S := fpsystem ('cd /usr/local/src/fpc/devel ; svn update fpc >& ~/cvscheckout.log');
+
   S := fpsystem('cd /usr/local/src/fpc/devel             ; svn update fpc       >& ~/cvscheckout.log');
   S := fpsystem ('cd /usr/local/src/fpc/devel ; svn update lazarus >& ~/cvslaz.log');
+
   S := fpsystem('cd /usr/local/src/fpc/devel             ; svn update lazarus >& ~/cvslaz.log'       );
end.
+
end.</syntaxhighlight>
</pre>
 
  
Заметьте, что порядок команд
+
Обратите внимание, что выдача команды
  
fpsystem ('cd /somedirectory')
+
<syntaxhighlight lang="Pascal">fpsystem('cd /somedirectory');</syntaxhighlight>
сопровождаемая
+
с последующим
fpsystem ('что-то делающей в этой папке')
+
<syntaxhighlight lang="Pascal">fpsystem ('сделать что-нибудь в этом подкаталоге');</syntaxhighlight>
не сработает, поскольку после каждого вызова функции fpsystem выполняемая программа возвращается в папку, из которой она запускалась; поэтому нужно в строку вызова оболочки ставить множество операторов.
+
не работает, потому что после каждого вызова [[Function | функции]] '''fpsystem()''' выполнение программы возвращается в каталог, в котором она была запущена; поэтому нам нужно включить несколько операторов в каждую строку в наши вызовы оболочки через '''fpsystem()'''. [Скорее так: он всегда начинается.]
  
Конечно, не стоит вводить каждую команду отдельной строкой Pascal; лучше создать сценарий наподобие приведенному ниже (из [[buildfaq]]):
+
Необязательно вводить каждую команду как отдельную строку Паскаля; можно создать файл сценария '''bash''' следующим образом (из [[buildfaq]]):
<pre>
+
<syntaxhighlight lang="bash">
 
#!/bin/sh
 
#!/bin/sh
 
cd /usr/local/src/fpc/devel
 
cd /usr/local/src/fpc/devel
Line 121: Line 219:
 
svn up fpc >& ~/cvscheckout.log
 
svn up fpc >& ~/cvscheckout.log
 
svn up lazarus >& ~/cvslaz.log  
 
svn up lazarus >& ~/cvslaz.log  
</pre>
+
</syntaxhighlight>
 
 
Его имя - updatelaz.sh, и он вызывается из программы Pascal так:
 
  
<pre>
+
Назовите файл '''updatelaz.sh''', а затем вызовите его из программы на Паскале для его непосредственного выполнения вместо использования '''bash''' следующим образом:
Program LazUpdate1;
+
<syntaxhighlight lang="Pascal">
uses classes, unix;
+
(* Это может быть скомпилировано или использовано как скрипт Паскаля. *)
var S : longint;  
+
program LazUpdate1;
 +
uses  
 +
  Classes, Unix;
 +
var  
 +
  S: LongInt;  
 
begin
 
begin
   S := fpsystem ('updatelaz.sh')
+
   S := fpsystem('updatelaz.sh')
end.
+
end.</syntaxhighlight>
</pre>
 
  
 
== Примечание для пользователей Windows ==
 
== Примечание для пользователей Windows ==
 
Традиционно при написании консольных программ в Windows используется кодировка cp866. Если не принять специальных мер, то при написании консольной программы в IDE в консоли вместо русских букв будут выводиться кракозябры. Чтобы получился нормальный русский текст, в окне кода программы нужно нажать правую кнопку мыши и выбрать в контекстном меню "Параметры файла -> Кодировка -> CP866".
 
Традиционно при написании консольных программ в Windows используется кодировка cp866. Если не принять специальных мер, то при написании консольной программы в IDE в консоли вместо русских букв будут выводиться кракозябры. Чтобы получился нормальный русский текст, в окне кода программы нужно нажать правую кнопку мыши и выбрать в контекстном меню "Параметры файла -> Кодировка -> CP866".
  
== Параметры командной строки ==
+
==См.также==
  
См. [[Command line parameters and environment variables]].
+
* [[Command line parameters and environment variables|Параметры командной строки и переменные среды]]
 +
* [[Executing_External_Programs/ru|Выполнение внешних программ]]
 +
* [[Debugger_Console_App| Отладка консольных приложений]]
 +
* [[InstantFPC]]

Latest revision as of 23:06, 21 June 2021

Deutsch (de) English (en) español (es) suomi (fi) magyar (hu) 日本語 (ja) русский (ru) slovenčina (sk)

Программирование в консольном режиме Pascal

Многие из нас писали программы на Паскале задолго до того, как вошли в моду Графический интерфейс пользователя (GUI) и Интегрированные среды разработки (IDE). Многие другие являются новичками в программировании на Pascal, и им необходимо уметь опробовать основные инструменты языка. Третьим нужны консольные приложения или приложения текстового режима для выполнения сложных задач управления системой.

Программирование в консольном режиме без Lazarus

Хотя многие предпочитают использовать Lazarus IDE для написания программ в режиме консоли, вы также можете написать их с помощью любого текстового редактора и скомпилировать их самостоятельно, вызвав компилятор FPC, например так для программы в example.pas:

fpc example.pas

Также доступен текстовый режим IDE fp (немного похожий на старый Turbo Pascal).В следующих разделах мы сосредоточимся на программировании с помощью Lazarus.

Программирование в консольном режиме с помощью Lazarus

Lazarus предоставляет идеальную среду для изучения Паскаля и разработки программ в текстовом режиме. Можно использовать все функции интегрированной среды разработки, включая редактор исходного кода с ее подсветкой синтаксиса, доступом к библиотекам, сложными инструментамиы поиска и завершения кода, а также проверкой синтаксиса. Если вам не нужна Form с ее визуальными компонентами, можно и без нее, но редактор исходного кода Lazarus по-прежнему остается отличной средой для разработки программ. Вы можете компилировать и запускать свою программу во время разработки, не выходя из редактора.

Чтобы запустить программу в режиме консоли, перейдите в главное меню и выберите Project -> New Project(Проект - новый проект), а затем выберите Program(Программа) или Console Application(Консольное приложение). Среда IDE не будет генерировать все дополнительные файлы, связанные с полным графическим приложением, и не откроет окно инспектора объектов, но откроет редактор исходного кода со структурой скелетной программы и будет ожидать ввода вашего программирования.

Light bulb  Примечание: В Windows приложение с графическим интерфейсом пользователя не имеет консоли и, следовательно, не может выполнить writeln или readln. Вы получите ошибку File not open(Файл не открыт). Снимите галочку в разделе Project Options / Compiler Options / Linking / Target specific options / Win32 GUI application(Параметры проекта / Параметры компилятора / Связывание / Частные параметры цели / Приложение Win32 GUI), чтобы создать консольное приложение. Начиная с Lazarus IDE 1.4 она находится в разделе Project(menu) / Project Options / Compiler Options / Config and Target / Target specific options / Win32 GUI application(Проект (меню) / Параметры проекта / Параметры компилятора / Настройка и целевая платформа / Частные параметры цели / Приложение Win32 GUI).
Light bulb  Примечание: Lazarus имеет некоторые функции для программ командной строки, такие как copyfile. Чтобы использовать их, добавьте требование к проекту для LazUtils (Project / Project Inspector / Required Packages --> "Add" --> New Requirement --> choose "LazUtils" --> OK), которое не будет задействовать весь LCL. Затем добавьте соответствующий модуль в раздел uses.

Тип проекта: Console Application (Консольное приложение)

Выбор этого типа проекта в Lazarus создает программу с новым классом, производным от TCustomApplication. TCustomApplication предоставляет много всяких штучек и упрощает программирование утилит командной строки. Например, проверка параметров командной строки, написание справки, проверка переменных окружения и обработка исключений. Все программы LCL используют это автоматически.

Тип проекта: Program (Программа)

В качестве демо мы напишем очень минималистичную программу на Паскале. В среде IDE выберите тип проекта Program(Программа), и пусть среда IDE вам немного поможет. Например, когда вы добавляете еще один модуль, IDE автоматически добавит имя модуля в раздел программы uses. Это поведение определяется в параметрах проекта. Таким образом, вы можете переключаться между 'Program'(Программой) и 'Custom Program'(Пользовательской программой) в любое время.

Пример для начинающих:

program Project1;
{$mode objfpc}{$H+}
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes;
begin
  WriteLn('Hello World!');
  ReadLn;
end.

Pascal scripts

Кроме того, можно писать сценарии, которые динамически компилируются с помощью InstantFPC, кроссплатформенного решения для запуска (небольших) программ Pascal в виде сценариев. Шебанг

#!/usr/bin/env instantfpc

позволяет запускать скрипт как отдельную программу.

Light bulb  Примечание: Хотя он используется для запуска сценариев Pascal, InstantFPC использует обычный Object Pascal, а не язык сценариев PascalScript. Таким образом, "PascalScript" и Pascal script - это не одно и то же.

Запуск программы

Компиляция

Когда вы закончите свою программу (или фрагмент программы), вы можете скомпилировать и запустить ее, выбрав Run -> Build(Выполнить -> Сборка)(или Quick Compile(Быстрая компиляция)) в главном меню или щелкнув значок зеленого треугольника («Выполнить») Start.png на панели кнопок. Любые сообщения компилятора (предупреждения, отчеты о ходе выполнения или сообщения об ошибках) появятся в окне сообщения, и, надеюсь, в конечном итоге будет сообщение, которое скажет

'Project "Project1" successfully built. (Проект "Project1" успешно собран.) :).

А где программа-то ?? !!

Если вы еще не сохранили программу, то среда IDE поместит ее во «временный» каталог (например, /tmp в Linux, C:\temp в Windows, см. Environment Options / Files / Directory (Параметры среды / Файлы / Каталог) для собранных тестовых проектов).

Если вы уже сохранили проект, значит, программа была создана в том же каталоге, где вы сохранили файл project1.lpi.

Запуск в консоли

Вы можете запустить программу, перейдя в окно консоли (терминала), затем с помощью cd перейдя в каталог и введя имя программы. В Unix/Linux, если она находится в текущем каталоге, вам придется начать с ./, поскольку программа, вероятно, не будет найдена в PATH.

Пример для Linux/Unix, где программа хранится в /tmp:

cd /tmp 
./Project1

Однако может быть очень неудобно продолжать переходить из редактора Lazarus в окно терминала и обратно. К счастью, есть механизм, позволяющий открывать окно терминала из среды Lazarus.

Запуск в IDE

Во внутренней консоли: показывается в окне вывода терминала.

При перенаправлении вывода.

В главном меню выберите Run -> Run Parameters(Выполнить -> Параметры запуска), затем установите флажок "Use launching application"(Использовать запускаемое приложение). В первый раз, когда вы сделаете это и попробуете последовательность Compile / Run (Собрать / Запустить), вы, вероятно, получите отлуп:

'xterm: Can't execvp /usr/share/lazarus//tools/runwait.sh: Permission denied'.

Если это произошло, вам необходимо изменить права доступа к соответствующему файлу (например, с помощью chmod +x <имя файла> или с помощью утилиты Windows для изменения разрешений); возможно, вам придется сделать это как root. После этого каждый раз, когда вы будете запускать свою программу, будет появляться окно консоли, в котором будут отображаться все ваши текстовые операции ввода-вывода (readln, Writeln и т. Д.).

После того, как ваша программа завершит выполнение, на экране появится сообщение «Нажмите Enter». Таким образом, любой вывод, сгенерированный вашей программой, останется на экране до тех пор, пока вы не прочтете его; после того, как вы нажмете «Enter», окно консоли закроется.

К сожалению, этот метод не позволяет использовать встроенный отладчик.

Запуск в IDE с перенаправлением вывода

Если вы хотите увидеть, что написано в stdout, и также хотите использовать встроенный отладчик, stdout можно перенаправить в файл следующим кодом:

uses
  baseunix; 

var
  OutputFile: text;

begin     
  Assign(OutputFile, 'Output.txt');
  if FileExists(Filename) then begin
    Append(OutputFile);
  end
  else begin
    Rewrite(OutputFile);   { открываем файл для записи, уничтожая содержимое, если таковое имеется }
  end;

  ResultCode := fpdup(OutputFile, output);

  if ResultCode < 0 then begin
    raise Exception.CreateFmt('Обман не удался: %s', [ResultCode]);
  end;
  Close(OutputFile);
end.

Затем файл output.txt можно просмотреть с помощью команды 'tail -f output.txt' или просмотреть с помощью редактора, если 'tail' недоступен в вашей ОС.

В качестве альтернативы, используя Lazarus 0.9.31 или выше (только в Linux): в меню "View"(Вид) в разделе "Debug Windows"(Отладка Windows) есть запись для "console output"(консольный вывод) для просмотра стандартного вывода.

Unicode (UTF8) вывод

Если вы хотите, чтобы ваша программа в режиме консоли отображала вывод Unicode (UTF8) в Windows Vista и более поздних версиях (а также, возможно, в более ранних версиях), вы можете использовать команду SetConsoleOutputCP для задания консоли набор символов UTF8.

Light bulb  Примечание: вам нужно будет убедиться, что шрифт консоли может отображать буквы, которые вы хотите вывести (например, греческий, кириллица, корейский).
Light bulb  Примечание: вам нужно будет включить модуль Windows.

См. Поддержка Unicode LCL для получения более подробной информации о поддержке Unicode в Lazarus и FPC.

Пример программы:

program uniconsole;

{$mode objfpc}{$H+}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
    {$IFDEF UseCThreads}
    cthreads,
    {$ENDIF}
  {Диспетчер широких строк, необходимый для поддержки широких строк}
  cwstring,
  {$ENDIF}
  {$IFDEF WINDOWS}
  Windows, {для setconsoleoutputcp}
  {$ENDIF}
  Classes
  ;

var
UTF8TestString: string;

begin
{$IFDEF WINDOWS}
SetConsoleOutputCP(CP_UTF8);
{$ENDIF}
UTF8TestString:= 'rosé, водка and ούζο';
writeln ('plain: ' + UTF8TestString);
{Видимо для этого нам не нужен UTF8ToConsole
Фактически, UTF8ToConsole для меня ничего не сделал.}
end.

Примеры

Вы можете использовать редактор Lazarus, чтобы опробовать все примеры из стандартных учебников Паскаля, или можете написать свой собственный. Некоторые из наиболее полезных процедур - это процедуры для выполнения системных команд или для запуска других программ (написанных на Паскале, C или Perl, либо в сценариях оболочки или пакетных сценариях).

Выполнение команд оболочки

program TryShell;
uses 
  Classes, Unix;
var 
  S: LongInt;
begin
  S := fpsystem('/bin/ls -la *.p*'); //отображает .pp, .pas, .php, .png и т.д. в текущем каталоге
  WriteLn('Program exited with status : ', S)
end.


Пример: обновить FPC и Lazarus

Могут быть выполнены более сложные команды. Например, если вы уже проверили репозитории SVN для FPC и Lazarus (см. Buildfaq), вы можете поддерживать свои исходные файлы FPC и Lazarus в актуальном состоянии, извлекая их из репозитория SVN с помощью следующей последовательности вызовов :


Пример: корректировка fpc и lazarus

Могут выполняться более сложные команды. Например, после посещения хранилища SVN с новейшими версиями FPC и Lazarus (см. buildfaq) можно иметь исходные версии FPC и Lazarus новейшими, путем взятия из хранилища SVN следующей последовательностью вызовов:

program LazUpdate;
uses
  Classes, Unix;
var 
  S: LongInt;
begin 
  S := fpsystem('cd /usr/local/src/fpc/devel/fpc        ; make clean');
  S := fpsystem('cd /usr/local/src/fpc/devel/lazarus  ; make clean');
  S := fpsystem('cd /usr/local/src/fpc/devel             ; svn update fpc       >& ~/cvscheckout.log');
  S := fpsystem('cd /usr/local/src/fpc/devel             ; svn update lazarus >& ~/cvslaz.log'        );
end.

Обратите внимание, что выдача команды

fpsystem('cd /somedirectory');

с последующим

fpsystem ('сделать что-нибудь в этом подкаталоге');

не работает, потому что после каждого вызова функции fpsystem() выполнение программы возвращается в каталог, в котором она была запущена; поэтому нам нужно включить несколько операторов в каждую строку в наши вызовы оболочки через fpsystem(). [Скорее так: он всегда начинается.]

Необязательно вводить каждую команду как отдельную строку Паскаля; можно создать файл сценария bash следующим образом (из buildfaq):

#!/bin/sh
cd /usr/local/src/fpc/devel
cd fpc
make clean
cd ..
cd lazarus
make clean
cd ..
svn up fpc >& ~/cvscheckout.log
svn up lazarus >& ~/cvslaz.log

Назовите файл updatelaz.sh, а затем вызовите его из программы на Паскале для его непосредственного выполнения вместо использования bash следующим образом:

(* Это может быть скомпилировано или использовано как скрипт Паскаля. *)
program LazUpdate1;
uses 
  Classes, Unix;
var 
  S: LongInt; 
begin
  S := fpsystem('updatelaz.sh')
end.

Примечание для пользователей Windows

Традиционно при написании консольных программ в Windows используется кодировка cp866. Если не принять специальных мер, то при написании консольной программы в IDE в консоли вместо русских букв будут выводиться кракозябры. Чтобы получился нормальный русский текст, в окне кода программы нужно нажать правую кнопку мыши и выбрать в контекстном меню "Параметры файла -> Кодировка -> CP866".

См.также