Как открыть приложение через delphi
Ознакомившись с теорией предмета изучения, перейдем к практическому его освоению. В этой главе вы узнаете, из чего состоит Delphi, какие программы с ее помощью можно делать, и, собственно, создадите первую программу в среде Delphi!
Состав Delphi и требования к системе
Прежде, чем приступать к работе с какой-либо программой, было бы полезно ознакомиться с ее требованиями к компьютеру. Разумеется, требования у разных версий Delphi разнятся, постепенно повышаясь от версии к версии. В частности, в рассматриваемой нами Delphi 7 рекомендуется процессор не ниже Pentium II и не менее 256 Мбайт оперативной памяти. Более ранние версии требовали меньший объем памяти, однако для комфортной работы я в любом случае рекомендовал бы не менее 256 Мбайт, а для Delphi 7 и выше, да еще и под управлением ОС Windows XP, не помешало бы иметь 512 Мбайт ОЗУ.
Что касается требований к операционной системе, то хотя формально Delphi может работать на любой 32-разрядной версии Windows, я бы настоятельно рекомендовал использовать Windows из линии NT, т.е. Windows 2000 или XP. Дело в том, что Windows 9x, из-за своего 16-разрядного наследия, имеет серьезные ограничения на количество доступных системных ресурсов, вне зависимости от того, насколько мощный ПК вы используете. Кроме того, Windows 9x не может эффективно задействовать даже относительно большие - свыше 128 Мбайт - объемы оперативной памяти. Я уже не говорю о том, что в Windows 9x не поддерживаются ни многопоточность, ни набирающие в последнее время популярность двуядерные процессоры, а производители аппаратных компонентов ПК давно уже забросили оптимизацию драйверов для данного семейства ОС. Результатом всего этого является низкая производительность на современных компьютерах и вполне ощутимый риск "повесить" систему в процессе работы над сложным и ресурсоемким приложением.
Еще один важный вопрос - это монитор. Опять-таки, формально достаточно любого SVGA-монитора. Но работать в среде Delphi при разрешении экрана ниже, чем 1024 на 768 точек, крайне затруднительно: учтите, что вам постоянно надо видеть как элементы управления самой Delphi, так и собственное (разрабатываемое) приложение. Для комфортной работы я бы рекомендовал качественный 19" монитор с рабочим разрешением 1280 на 1024 точки. Причем, если это будет обычный монитор на ЭЛТ (или даже ЖК, но с аналоговым подключением), то вам понадобится еще и качественная видеокарта, способная обеспечить кристально четкую, без "замыливания" картинку. Для ЭЛТ-мониторов также важно обеспечивать поддержку указанного разрешения при частоте регенерации изображения не ниже 85 Гц.
ПРИМЕЧАНИЕ
Помните, что программирование - это напряженная работа с текстом. И если ваша связка "видеокарта-кабель-монитор" не может выдать четкий текст и (или) отсутствие видимого мерцания в нужном вам разрешении, то со временем вы рискуете испортить себе зрение.
Определившись с компьютером, перейдем к установке. В процессе установки про-грамма спросит вас, для каких версий тех или иных третьесторонних приложений следует устанавливать компоненты. Прежде всего, это версии MS Office, для одной из них вы сможете установить набор компонент, обеспечивающих взаимодействие между приложениями office и Delphi. Если вы устанавливаете старшую версию Del-phi (Client/Server, Enterprise, Architect), то вас спросят еще и о том, для каких версий баз данных следует установить компоненты. Наконец, в процессе установки, помимо самой Delphi будут установлено множество дополнительных программ, в основном, связанных с базами данных. Причем некоторые из них (например, сервер InterBase или виртуальная Java-машина) вообще устанавливаются отдельно, хотя и в процессе общего хода инсталляции.
По завершению процесса установки в программном меню Windows будет сформирована группа Borland Delphi, в которой, помимо самой Delphi, будут находиться ярлыки всех вспомогательных компонент среды. В частности, там будут находиться ярлыки для следующих программ:
- Image editor - простой графический редактор для рисования иконок и курсоров. За время, прошедшее с момента последнего обновления (в 1996 году), морально устарел, но может пригодиться, если нет ничего другого;
- WinSight - позволяет просматривать отладочную информацию в любых работающих приложениях;
- BDE Administrator - позволяет настраивать базы данных;
- Data Pump - позволяет переносить данных между БД;
- Database Explorer или SQL Explorer - средство просмотра БД;
- SQL Monitor (только старшие версии) - позволяет отслеживать обращения приложений к SQL-серверу.
Кроме того, в этой группе будет находиться подгруппа Help, а в ней, среди множества справочных файлов, - еще одна, с еще большим их количеством - MS SDK Help Files. Так вот, все эти файлы вам придется регулярно использовать, причем положение усугубляется не только их количеством и объемами, но и тем, что в русском варианте их не существует. Таким образом, знание английского языка будет вам хорошим подспорьем при изучении как Delphi, так и программирования вообще.
СОВЕТ
Если вы не знаете английского, но владеете немецким или французским, то вы можете установить версию Delphi на том языке, который знаете лучше. Русских версий Delphi, равно как и других серьезных средств разработки, нет, никогда не было, и, увы, даже не предвидится.
Таким образом, мы вкратце ознакомились с составом среды Delphi. Отдельные вспо-могательные приложения, при необходимости, мы еще рассмотрим, ну а сейчас пора приступать к изучению главной составляющей - самой среды Delphi.
Интегрированная среда разработки
Интегрированная среда разработки Delphi (Delphi IDE) является многооконной системой. Она включает в себя все необходимое для быстрой разработки Windows-приложений, и может гибко настраиваться.
Тем не менее, как и всякая другая программа, Delphi имеет некоторый стандартный, предусмотренный разработчиками вид, в котором она предстает вам при первом запуске. В таком "стандартном" варианте среда Delphi имеет 6 окон (рис. 2.1). Это: главное окно (Delphi 7 - Project1), окно дерева объектов (Object TreeView), окно инспектора объектов (Object Inspector), окно конструктора форм (Form1), а так же совмещенное окно редактора кода и проводника кода (на заднем плане, под Form1). При этом окно проводника пристыковано к левому краю окна редактора. Впрочем, ничего не мешает отсоединить проводник от редактора, или, наоборот, состыковать все окна, кроме главного и конструктора форм, в одном окне, или объединить их по какому-либо иному принципу.
Рис. 2.1. Вид Delphi 7 IDE по умолчанию
К вопросу об удобстве следует отметить, что предлагаемая разработчиками компоновка годится, в принципе, для любого экранного разрешения. Но если у вас имеется возможность установить разрешение экрана в значение 1280 на 1024 точки, то вы можете скомпоновать все кнопки главного окна в одной строке, а все освободившееся внизу место выделить для палитры компонентов (рис. 2.2).
Рис. 2.2. "Оптимизированный" вид главного окна Delphi
Такой шаг позволит иметь перед глазами гораздо большее количество категорий компонент, что положительно сказывается на продуктивности работы. В принципе, это можно сделать и при более низком разрешении, однако при этом частью кнопок на панелях инструментов придется пожертвовать.
Содержание и предназначение панелей инструментов, имеющихся в начальном виде, следующее:
- Debug - отладка. Позволяет запустить программу (Run), приостановить ее выполнение (Pause), а так же выполнять построчное выполнение программы;
- Standard - стандартные. Служит для таких операций, как сохранение, созда-ние, добавление и удаление файлов;
- View - вид. Используется для быстрого нахождения форм и файлов проекта;
- Desktops - рабочая среда. С помощью этих инструментов можно переклю-чаться между различными настройками рабочей среды Delphi;
- Custom - произвольная. Изначально содержит одну-единственную кнопку - для вызова справки;
- Component palette - палитра компонентов. Содержит все доступные для разработки приложений компоненты.
Отметим, что все инструментальные панели настраиваются: кнопки можно перемещать между панелями, добавлять на них новые, или же удалять. Для обычных панелей (Standard, View, Debug) это делается точно таким же образом, как во многих других современных Windows-приложениях (например, как в Word, т.е. при помощи окна настройки - Customize).
Что касается самой большой панели - палитры компонентов, то для ее настройки следует использовать специальное окном свойств палитры (рис. 2.3). Это окно доступно через пункт Configure Palette из меню Component. Однако учтите, что при настройке важно знать как предназначение компонент, так и понимать принципы их организации, поэтому максимум, что можно себе позволить для начала - это поменять местами группы, перетаскивая их в списке страниц (Pages).
Рис. 2.3. Настройка палитры компонентов требует знания VCL
ПРИМЕЧАНИЕ
Следует учитывать, что поскольку палитра компонентов является ничем иным, как визуальным представлением VCL, то ее вид и состав могут меняться в зависимости от того, какие модули подключены, устанавливались или нет дополнительные компоненты или их наборы, и т.д. В любом случае, в начале изучения Delphi, экспериментов в этой области лучше не производить.
Все компоненты сгруппированы по вкладкам, число и состав которых несколько разнятся в зависимости от версии и варианта поставки. Так, в Delphi 7 Enterprise имеется 33 вкладки, содержащие компоненты, принадлежащие к той или иной группе VCL (табл. 2.1).
Часть урока для новичков
Перед непосредственным написанием программ необходимо усвоить правилами работы над разрабатываемым проектом.
Проект Delphi
Главный файл проекта, изначально называется PROJECT1.DPR. Если необходимо переименовать название проекта, нужно перезаписать этот файл, выбрав в меню File команду Save Project As: При задании имени следует придерживаться правил задания имен в Object Pascal. Имя не должно содержать пробелов (используйте в таком случае знак подчеркивания), должно начинаться с буквы (цифры допустимы, но со второй позиции), не должно содержать других символов, кроме букв и цифр. Под каким именем вы сохраняете проект, под таким именем и будет создаваться исполняемый EXE файл, который вы всегда сможете самостоятельно переименовать.
Модуль программы, который автоматически появляется в начале работы Unit1. Файл называется UNIT1.PAS по умолчанию, но его можно назвать любым другим именем, вроде MAIN.PAS. Это делается аналогично переименованию названия проекта. Необходимо выбрать в меню File команду Save As: Сохраняется активный модуль в редакторе кода.
Файл главной формы, который по умолчанию называется UNIT1.DFM, используется для сохранения информации о внешнем виде формы (окна разрабатываемого приложения). При переименовании названия модуля автоматически меняет свое название.
Файл PROJECT1.RES изначально содержит иконку для проекта. Создается автоматически. Имеет одноименное название с названием проекта.
Файл PROJECT1.DSK содержит информацию о состоянии рабочего пространства. Состояние окон во время разработки приложения.
Исполняемый EXE файл, который создается в процессе компиляции проекта.
Разумеется, если сохранить проект под другим именем, то изменят название и файлы с расширением RES и DSK.
После компиляции программы получаются файлы с расширениями:
DCU - скомпилированные модули PAS для последующей быстрой компиляции некоторые файлы не перезаписываются
EXE - исполняемый файл
DP - backup файлы редактора. Автоматически создаются и содержат информацию, перед последним сохранением.
Коротко про пункты главного меню Delphi
Пункт меню "File"
Первая секция дает возможность управления проектом в целом. Создать новый: (проект, форму, модуль, отчет и т.д.). Создать новый проект. Создать новую форму (окно).
Вторая секция позволяет открывать с диска файлы проекта.
Третья позволяет сохранять открытые файлы на диске. Здесь можно закрыть активный файл в редакторе кода или закрыть весь проект.
Четвертая позволяет подключать в текущий модуль другие в открытом проекте.
Пятая управляет печатью.
Шестая секция - выход из Delphi.
Каждая строка пункта меню "File", как и другого пункта, объяснена в справке. Выберите меню "File", подведите под интересующий вас пункт и нажмите F1.
Большинство из пунктов первой секции очевидны. "New Application" начинает новый проект, "Open Project" открывает существующий проект и т.д. Вложенный список "Reopen" позволяет открыть файл или проект, который недавно открывался.
При создании нового модуля Delphi дает ему имя по-умолчанию. Вы можете изменить это имя на что-нибудь более предпочтительное, чтобы название подходило к функциональным принадлежностям данного модуля (например, MAIN.PAS) с помощью пункта для первого сохранения "Save" или для последующего изменения названия "Save As:".
"Save File" сохраняет только редактируемый файл, но не весь проект. Для сохранения всех файлов проекта пользуйтесь "Save All". Вообще всегда удобнее пользоваться пунктом меню сохранить все, чем сохранять файлы по отдельности, тем более, что сохраняются только измененные.
"Close" закрывает файл из окна редактора. Если файл был изменен произойдет запрос сохранений перед закрытием.
"Close All" закрывает все открытые файлы проекта.
Пункт меню "Edit"
"Edit" содержит команды "Undo" и "Redo", которые могут быть очень полезны при работе в редакторе для устранения последствий при неправильных действиях, например, если случайно удален нужный фрагмент текста или удален компонент из проектировшика форм.
Команды "Cut", "Copy", "Paste" и "Delete" - как во всех остальных приложениях Windows, но их можно применять не только к тексту, но и к визуальным компонентам. Например, если необходимо размножить необходимый компонент на форме. Принцип действия первой и второй секции человеку, работающему в Windows, думаю ясен. Третья секция предназначена для работы с редактором формы. Не буду полность описывать ее содержание. Расскажу только о некоторых. "Bring to Front" - установить выбранный компонент на уровень выше; "Send to Back" - компонент на уровень ниже; "Align. " - выравнивание компонентов, совместное позиционирование; "Size" - точные размеры компонента; "Tab Order" - порядок перехода по элементам формы с помощью кнопки Tab.
Сохранение проекта
Как известно, чтобы в последствии открывать свой проект для дальнейшего корректирования и управления необходимо его сохранить на диске.
Первый шаг - создать поддиректорию для программы. Лучше всего создать директорию, где будут храниться все ваши программы и в ней - создать поддиректорию для данной конкретной программы. Например, вы можете создать директорию LESSONS и внутри нее директории, связанные с тем или иным уроком LES4, которые содержали бы программы, над которыми мы работали.
После создания поддиректории Bя хранения вашей программы желательно выбрать пункт меню "File" "Save All". Сохранить нужно будет два файла. Первый - модуль (unit), над которым Вы работали, второй - главный файл проекта. Здесь и далее сколько окон (форм) в вашем проекте, столько и модулей.
Открытие проекта
Для открытия проекта необходимо выбрать пункт меню файл "Open Project" и выбрать название интересующего вас проекта DPR. При этом открываются как сам проект, так и становятся доступными все привязанные к нему файлы.
Если вы хотите открыть для редактирования отдельный модуль, или модуль формы, необходимо выбрать пункт "Open" и выбрать файл PAS. В этом режиме будет доступно для редактирования только форма и модуль. Чтобы запустить это окно на выполнение сначала открывайте проект.
Часть урока для продвинутых программистов
Запуск других приложений из вашего
Существует две наиболее часто применяемых функций. WinExec и ShellExecute.
Функция WinExec
WinExec, оставлена для совместимости с ранними версиями Windows, но я рекомендую для обычного запуска программы с командной строкой использовать эту. У нее мало параметров запуска.
Используемый модуль - Windows.
Описание: WinExec (FileName: PChar; CmdShow: Cardinal) : Cardinal;
где: FileName - путь, имя запускаемого приложения, параметры командной строки. Все указывается в одной строке;
CmdShow - стиль окна. Показывает, в каком состоянии будет отображаться окно при запуске.
Параметры отображения окна CmdShow:
Для не-Windows приложений определяет состояние окна файл PIF, если таковой имеется в наличии. Если необходимо закрывать окно после завершения работы такого приложения необходимо создать PIF ярлык к нему в том же каталоге с таким же названием и поставить галочку "Закрывать окно по завершению сеанса работы". Все дополнительные параметры запуска устанавливаются там же.
Возвращаемые значения функции WinExec:
Если имя выполняемого файла в параметре FileName не содержит пути директории, Windows производит поиск выполняемого файла в такой последовательности:
1. Каталог из которого приложение было запущено. Это рабочий каталог
2. Системный каталог Windows (обычно C:\WINDOWS\SYSTEM).
3. Каталог Windows.
4. Директории, указанные в переменной операционной среды в среде PATH. Узнать о каталогах этой переменной можно, введя PATH в командной строке сеанса MS-DOS.
Пример использования функции WinExec в программе:
Функция ShellExecute
Функция ShellExecute не только запускает программы, а открывает, редактирует или печатает файл, с учетом зарегестрированного типа, а также открывает указанную папку проводником. Возвращает Handle ссылку на открытое окно.
Используемый модуль ShellAPI. Его нужно не забыть указать в разделе Uses.
Описание: ShellExecute (hWnd: HWND; Operation: PChar; FileName: PChar; Parametrs: PChar; Directory: PChar; CmdShow: Integer): HINST;
Operation - производимая операция. Open - открыть, print - напечатать, explore - открыть папку. По умолчанию open, если указать nil.
FileName - имя файла или документа, интернет ссылка, e-mail адрес.
Parametrs - параметры, передаваемые приложению в командной строке.
Directory - каталог по умолчанию.
CmdShow - стиль окна. Показывает, в каком состоянии будет отображаться окно при запуске. Подробно рассказано выше.
Вместо параметров Operation, Parametrs и Directory можно ставить nil. Они являются не обязательными параметрами для запуска.
В случае успешного запуска возвращает Handle окна, в случае неудачи возвращает код ошибки меньше или равное 32. Список возможных ошибок можно прочитать в справке по этой команде.
Пример использования команды ShellExecute в программе:
ShellExecute (Form1.Handle, nil, PChar (Application.ExeName), nil, nil, SW_RESTORE); //запуск второй копии этой программы
ShellExecute (Form1.Handle, nil, 'c:\1.doc', nil, nil, SW_RESTORE); //открыть документ
Здравствуй уважаемый новичок! В этом уроке мы познакомимся с Delphi 7 и научимся компилировать программу.
Итак, если вы приняли решение изучать язык программирования Delphi, то сразу без предисловий перейдем к делу.
Программа Delphi 7 состоит из четырех основных окон:
Главное окно (Рис 1).
Инспектор объектов (Рис 2). | Окно Form (Рис 3). |
Редактор кода (Рис 4).
Главное окно – окно управления проектом и средой разработки. Здесь же находятся вкладки с компонентами (Рис 1).
Инспектор объектов – окно, в котором задаются свойства различным компонентам (Рис 2).
Окно Form – визуальное окно программы. (Рис 3)
Редактор кода – окно, в которое мы будем записывать код (Рис 4).
Давайте уже напишем нашу первую программу!
Нажмите на зеленый треугольник в главном окне.
После нажатия на зеленый треугольник, наша программа начнет компилироваться (создаваться), то есть компилятор проверит окно редактора кода на наличие ошибок, но так как мы в окно редактора кода еще ничего не писали, то ошибок возникнуть не должно. После компиляции, Delphi запустит нашу программу для тестирования.
Вот что мы увидим:
Теперь закройте скомпилированную программу и мы продолжаем знакомство с Delphi. В главном окне можно увидеть палитру компонентов. На рисунке она обведена красным прямоугольником.
Между компонентами можно переключаться, щелкая по вкладкам. Каждая вкладка имеет свои уникальные компоненты. Так же, если у вас не помещаются все вкладки в палитру компонентов, то появляются так называемые ушки, для перелистывания вкладок в ту или иную сторону. На вкладке Standard самым первым стоит значок курсора (к нему проведена зеленая линия), это не компонент. Он нужен для отмены выбора компонента. Вот например, вы выбрали какой-то компонент и для того, чтобы отменить свой выбор, нужно просто щелкнуть по этому значку курсора. Существуют не только стандартные компоненты Delphi, но и создаваемые любителями. О том как устанавливать компоненты мы поговорим в следующих уроках.
А теперь добавим на форму компонент под названием Button (кнопка). Он находится в на вкладке Standard. Нажмите на него, а потом нажмите где-нибудь на форме.
Получится вот так:
Готово! Кнопка на форме! Перейдем в инспектор объектов.
На вкладке Properties отображены все свойства компонента, в данном случае свойства нашей кнопки.
На вкладке Events отображены все события компонента, в данном случае опять же свойства нашей кнопки.
Изменим свойство Caption (заголовок). Вместо Button1 напишем Выход:
Вы можете поэкспериментировать с другими свойствами, изменяя их значения. Например попробуйте изменить свойства Width и height (ширина и высота), left и top (расстояние слева и сверху внутри формы), Cursor (выберите любой курсор из списка и после компиляции при наведении на кнопку будет отображаться выбранный вами курсор).
Маленько отвлеклись от курса. Продолжаем. На форме изменилось название кнопки. Теперь перейдем на вкладку Events и кликнем 2 раза напротив надписи OnClick:
Если все сделано правильно, то автоматически станет активным окно редактора кода, в него мы и будем вписывать действие, которое случится при клике на кнопку.
Кликая 2 раза по событию OnClick, мы вставили процедуру, такую некую заготовку. Думаю, по названию кнопки вы догадались, что при нажатии на нее программа закроется. Нам надо осуществить это действие. Пишем команду close между ключевыми словами begin и end. Все команды в Delphi заканчиваются точкой с запятой, по этому между ключевыми словами должен быть код close; Вообще в Delphi, все команды пишутся между ключевыми словами begin и end, то есть начинаем и заканчиваем.
После всех манипуляций получилось вот такое чудо: Компилируем нашу программу, нажимая на зеленый треугольник или на клавишу F9. Кстати, для того, чтобы просто скомпилировать программу и проверить код на ошибки, не запуская программу потом для тестирования, нужно нажать Ctrl + F9.
По умолчанию программа компилируется в папке C:\Program Files\Borland\Delphi7\Projects. Давайте сохраним проект в другую папку. Нажимаем в меню главного окна File->Save Project As… и выбираем папку для сохранения. Сейчас в папке находится только проект, для того чтобы там появился exe-файл, нужно еще раз скомпилировать программу.
Теперь давайте закроем наш проект, а потом снова откроем. Нажимаем в главном окне File->Close All, если вы не сохранили проект или после сохранения где-то его изменили, то у вас вылезет окно с запросом на сохранение проекта, нажмите на кнопку Save и сохраните проект.
Далее в главном окне нажимаем File->Open Project. и открываем проект. У меня проект называется Project1.dpr, если вы при сохранении изменяли название, то соответственно открывайте то, что сохранили :)
Что бы создать новый проект, нажмите File->New->Application.
В библиотеках RTL, FCL, LCL есть разные способы выполнить внешнюю программу.
Метод | Библиотека | Платформы | Одной строкой? | Особенности |
---|---|---|---|---|
ExecuteProcess | RTL | кроссплатформенный | Да | Очень ограничен, синхронен |
ShellExecute | WinAPI | Только MS Windows | Да | Много. Может запускать программы с правами администратора |
fpsystem, fpexecve | Unix | Unix only | ||
TProcess | FCL | кроссплатформенный | Нет | Все |
RunCommand | FCL | кроссплатформенный Требуется FPC 2.6.2+ | Да | Покрывает стандартное использование TProcess |
OpenDocument | LCL | кроссплатформенный | Да | Только открывает документ. Документ будет открыт стандартной программой |
Если вы использовали ShellExecute и/или WinExec в Delphi, то вы можете начать использовать TProcess как альтернативу в FPC/Lazarus (это верно и в случае использования Lazarus на Linux, потому что TProcess является кроссплатформенным компонентом).
Примечание: FPC/Lazarus поддерживает ShellExecute и WinExec, но только в среде Win32. Если вы пишете кросс-платформенную программу, то лучшим путем будет использование TProcess!
(Process.)RunCommand
В FPC 2.6.2, некоторые вспомогательные функции для TProcess были добавлены в модуль process основанный на обертке использованной в fpcup. Эти функции могут быть для базового и среднего уровня использования и могот захватить вывод как одной строки, так и огромного количества выводимой информации.
Перегруженный вариант функции может возвращать код выхода программы. RunCommandInDir запускает программу в заданной папке.
SysUtils.ExecuteProcess
Простейший путь, если вам не нужно общение с процессом - это просто использовать вызов
При использовании этого метода, приложение "повисает" до тех пор, пока вызванная программа не завершится. Это может быть полезно если пользователь должен сделать что-то перед использованием вашего приложения. Если вы хотите обойти это ограничение, то более полезный кроссплатформенный способ - это TProcess, или если ваша целевая платформа только Windows, то используйте ShellExecute.
Примечание: FPC/Lazarus поддерживают CreateProcess, ShellExecute и/или WinExec, только на Win32/64. Если ваша программа кроссплатформенная, используйте RunCommand или TProcess.
Примечание: WinExec использует 16-битные вызовы и давно устарел. Новые версии FPC при его использовании генерируют предупреждение.
ShellExecute - стандартная функция MS Windows (ShellApi.h) с хорошей документацией на MSDN (читайте документацию, если вам кажется, что функция ненадежна).
Также есть WideChar функции - ShellExecuteExW , ShellExecuteExA в режиме AnsiChar.
В качестве fMask можно ипользовать SEE_MASK_DOENVSUBST, SEE_MASK_FLAG_NO_UI или SEE_MASK_NOCLOSEPROCESS и тд Если в Delphi вы используете ShellExecute для открытия документов, например документ Word или ссылки, то присмотритесь к open* (OpenURL и т.д.) модуле lclintf.
Использование ShellExecuteEx с повышенными (правами администратора) правами
Если вы хотите использовать программу с повышенными (правами администратора) правами, используйте runas как альтернативу ShellExecuteEx:
Unix fpsystem, fpexecve и shell
Эти функции являются платформозависимыми.
Учтите, что Unix.Shell версии 1.0.x устарел и удален из trunk. Используйте fpsystem.
TProcess
Вы можете использовать TProcess для запуска внешних программ. Самыми полезными вещами при этом будут:
- Платформонезависимость
- Способность читать из stdout и писать в stdin.
Примечание: TProcess не оболочка! И не терминал! Вы не можете напрямую исполнять скрипты или перенаправлять вывод используя такие операторы, как "
Важно: Вы должны определять полный путь к исполняемому файлу. Например '/bin/cp' вместо 'cp'. Если программа находится где-либо в переменной PATH, то вы можете использовать функцию FindDefaultExecutablePath из модуля LCL FileUtil.
Простейший пример
Многие типичные случаи были подготовлены в функциях Runcommand. Прежде, чем начать копировать и вставлять приведенные ниже примеры, сначала проверьте их.
Простой пример
Вот оно! Теперь вы научились запускать внешнюю программу изнутри вашей собственной.
Прим.перев.: на момент правки статьи (fpc 3.0.4) свойство CommandLine (как и ApplicationName) согласно документации объявлены deprecated. Вместо них рекомендуется использовать свойства Parameters и Executable соответственно.
Примечание: для пользователей Windows - если путь к исполняемому файлу включает символы пробела, табуляции или перевода строки, то он должен заключаться в двойные кавычки (например, "c:\Program Files\Git\bin\git.exe"). Это же правило справедливо в случае, если такой путь указывается в аргументах командной строки (в свойстве Parameters).
Примечание: строковый агрумент, добавляемый в Parameters, не должен содержать пробелы.
Усовершенствованный пример (но пока не правильный)
Это все замечательно, но как я могу получить вывод программы, которую я запустил? Что ж, давайте немного расширим наш пример и сделаем так: этот пример прост, поэтому вы можете извлечь из него уроки. Пожалуйста, не используйте этот пример в рабочем коде, а используйте код из раздела Чтение больших объемов вывода
Чтение больших объемов вывода
В предыдущем примере мы ждали завершения запущенной программы. После этого мы считывали все, что программа записала в выходной поток. Но ведь может оказаться и так, что программа выведет много данных, канал заполнится и вывод остановится, при этом запустившая программа ждет завершения запущенной программы, которая в свою очередь не может завершить работу, пока не выведет все данные. Возникает коллизия, dead-lock.
Поэтому следующий пример не будет использовать опцию poWaitOnExit и будет читать данные при запущенной программе. Вывод записывается в поток, который можно позже использовать для чтения его содержимого в TStringList.
Если вы хотите считывать выходные данные из внешнего процесса, вы должны адаптировать этот код для повседневного использования.
Прим.перев.: можно выводить данные сразу в какой-нибудь memoOutput на основе (решения, предложенного пользователем KpjComp):
Обратите внимание, что вышеперечисленное также может быть достигнуто с использованием RunCommand:
Использование ввода и вывода TProcess
Смотри демо пример на Lazarus-CCR SVN.
Некоторые подсказки при использовании TProcess
Если вы создаете кроссплатформенную программу, вы можете изменять командную строку применительно к каждой ОС использую директивы "" и "".
Показ комплекта приложений на переднем плане в macOS
Вы можете запустить application bundle(пакет приложения) через TProcess, вызвав исполняемый файл внутри пакета. Например:
Это запустит Calendar, но окно будет позади текущего приложения. Чтобы получить приложение на переднем плане, вы можете использовать утилиту open с параметром -n:
Если вашему приложению нужны параметры, вы можете передать open параметр --args, после чего все параметры будут переданы приложению:
Запуск отдельной программы
Обычно программа, запускаемая вашим приложением, является дочерним процессом и уничтожается, когда ваше приложение уничтожается. Если вы хотите запустить автономную программу, которая продолжает работать [после завершения вашего приложения], вы можете использовать следующее:
Пример "общения" с процессом aspell
Внутри исходного кода pasdoc вы можете найти два модуля, которые выполняют проверку орфографии, "общаясь" с запущенным процессом aspell через каналы:
- Модуль PasDoc_ProcessLineTalk.pas реализует класс TProcessLineTalk, потомок TProcess, который может быть легко использован для общения с любым процессом построчно.
- Модуль PasDoc_Aspell.pas реализует класс TAspellProcess, который выполняет проверку орфографии с использованием базового экземпляра TProcessLineTalk для выполнения aspell и связи с запущенным процессом aspell.
Оба модуля довольно независимы от остальных исходников pasdoc, поэтому они могут служить реальными примерами использования TProcess для запуска и связи по каналам с другой программой.
Замена операторов командной оболочки, таких как "| < >"
Иногда у вас есть желание выполнить более сложную команду, которая передает свои данные другой команде или файлу. Что-то вроде
Запуск таких команд с TProcess не будет работать. То есть:
Почему использование специальных операторов для перенаправления вывода не работает
Вы можете перенаправлять вывод команды другой команде, используя экземпляр TProcess для каждой команды.
Вот и все. Теперь вы можете перенаправлять вывод из одной программы в другую.
Заметки
Этот пример может показаться излишним, поскольку можно запускать «сложные» команды, используя оболочку с TProcess, например:
Но наш пример более кроссплатформенный, так как он не нуждается в модификации для работы в Windows или Linux и т.д. "sh" может существовать или не существовать на вашей платформе и обычно доступен только на платформах *nix. Кроме того, у нас больше гибкости в нашем примере, так как вы можете читать и записывать из/в ввода, вывода и stderr каждого процесса в отдельности, что может быть очень выгодно для вашего проекта.
Перенаправление ввода и вывода и запуск под Root
Распространенная проблема в Unix(macOS) и Linux заключается в том, что вы хотите выполнить какую-либо программу под учетной записью root (или, в более общем случае, под другой учетной записью пользователя). В качестве примера можно привести команду ping.
Если вы можете использовать sudo для этого, вы можете приспособить следующий пример, адаптированный из примера, опубликованного andyman на форуме ([1]). Этот пример запускает ls в каталоге /root , но, конечно, может быть адаптирован.
Лучший способ сделать это - использовать пакет policykit, который должен быть доступен во всех последних версиях Linux. Подробности смотрите в ветке форума.
Другие мысли: Без сомнения, было бы целесообразно проверить, запрашивает ли sudo пароль. Это можно последовательно проверить, установив переменную окружения SUDO_PROMPT в ту, которую мы наблюдаем при чтении стандартного вывода TProcess, чтобы избежать проблемы, связанной с тем, что приглашение будет различным для разных локалей. Установка переменной среды приводит к тому, что значения по умолчанию очищаются (наследуются от нашего процесса), поэтому мы должны при необходимости скопировать окружение из нашей программы.
Использование fdisk с sudo в Linux
В следующем примере показано, как запустить fdisk на компьютере с Linux с помощью команды sudo для получения прав root.
Примечание: это только пример, и он не рассчитан на большой результат
Параметры, содержащие пробелы (замена кавычек оболочки Shell)
В оболочке Linux можно записать в кавычки следующие аргументы:
И GDB получит 3 аргумента (в дополнение к первому аргументу, который является полным путем к исполняемому файлу):
- --batch
- --eval-command=info symbol 0x0000DDDD
- полный путь к myprogram
TProcess также может передавать параметры, содержащие пробелы, но использует другой стиль квотирования. Вместо того, чтобы заключать в кавычки только часть параметра, заключите в кавычки все из них. Вот так:
И также не забудьте передать только полный путь.
Смотрите также эту дискуссию об этом: здесь
Альтернативные решения с помощью LCLIntf
Иногда вам не нужно явно вызывать внешнюю программу, чтобы получить необходимую вам функциональность. Вместо того, чтобы открывать приложение и указывать документ для него, просто попросите ОС открыть документ, позволив ей использовать приложение по умолчанию, связанное с этим типом файла. Ниже приведены некоторые примеры.
Открытие документа в приложении по умолчанию
В некоторых ситуациях вам нужно открыть какой-либо документ/файл с использованием приложения по умолчанию, а не выполнить определенную программу. Это зависит от запущенной операционной системы. Lazarus предоставляет платформ-независимую процедуру OpenDocument, которая будет делать это за вас. Ваше приложение продолжит работу, не дожидаясь закрытия процесса документа.
Читайте также: