Bazaprogram.ru

Новости из мира ПК
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Delphi shellexecute параметры

Delphi shellexecute параметры

function ShellExecute(hWnd: HWnd; Operation, FileName, Parameters, Directory: PChar; ShowCmd: Integer): HINST; stdcall;

Функция ShellExecute открывает или выводит на печать указанный файл. Файл может быть исполнимымым файлом или файлом документа. Смотри также ShellExecuteEx.

hwnd — Хендл родительского окна. Определяет родительское окно. Это окно получает любые окна сообщений, которые генерирует приложение. Например, приложение может сообщать об ошибке при помощи окна сообщений. Operation — Указатель на строку, определяющую операцию для выполнения. Строка должна завершаться нулевым символом.
Допустимы следующие значения:

СтрокаОписание
«open»Функция открывает файл, указанный в параметре FileName. Файл может быть как исполнимым файлом, так и файлом документа. Файл может быть папкой, которую нужно открыть.
«print»Функция открывает файл, указанный в параметре FileName. Файл должен быть файлом документа. Если файл является исполнимым файлом, функция открывает файл, как если бы было указано значение «open».
«explore»Функция исследует папку, указанную в параметре FileName, експлорером.
FileName Указатель на строку, определяющую имя файла для открытия или печати, или имя папки для открытия. Строка должна завершаться нулевым символом. Parameters — Указатель на строку параметров исполнимого файла. Если файл, заданный в параметре FileName является исполнимым файлом, то Parameters указывает на строку параметров, передаваемых приложению. Строка должна завершаться нулевым символом. Directory — Указатель на строку, определяющую директорию по умолчанию. Строка должна завершаться нулевым символом. ShowCmd — Определяет как файл будет показываться когда откроется. Если файл, заданный в параметре FileName является исполнимым файлом, то ShowCmd определяет как приложение будет показваться когда оно откроется.
Этот параметр может иметь одно из следующих значений (значения констант определены в модуле Windows):
КонстантаЗначениеОписание
SW_HIDEСкрывает окно приложения и активирует другое окно.
SW_MAXIMIZE3Разворачивает указанное окно на весь экран.
SW_MINIMIZE6Сворачивает указанное окно и активирует следующее по порядку окно.
SW_RESTORE9Активирует и показывает окно. Если окно было свернуто или развернуто на весь экран, Windows восстанавливает окно до енго нормальных размеров и позиции. Приложение должно указывать этот флаг когда восстанавливает свернутое окно.
SW_SHOW5Активирует окно и отображает его в текущем размере и позиции.
SW_SHOWDEFAULT10Устанавливает режим показа основываясь на SW_флаге указанном в структуре STATUPINFO, передаваеммой для функции CreateProcess программой, которая запускает приложение. Приложение должно вызвать ShowWindow с этим флагом для установки начального режима отображения своего окна.
SW_SHOWMAXIMIZED3Активирует окно и отображает его в развернутом виде.
SW_SHOWMINIMIZED2Активирует окно и отображает его в свернутом виде.
SW_SHOWMINNOACTIVE7Отображает окно в свернутом виде. Активное окно остается активным.
SW_SHOWNA8Отображает окно в его текущем состоянии. Активное окно остается активным.
SW_SHOWNOACTIVATE4Отображает окно в его самом последнем размере и позиции. Активное окно остается активным.
SW_SHOWNORMAL1Активирует и отображает окно. Если окно было свернуто или развернуто на весь экран, Windows восстанавливает его начальные размеры и позицию. Приложение должно указывать этот флаг когда впервые отображает свое окно.
Если файл, заданный в параметре FileName является файлом документа, параметр ShowCmd должен быть нулевым.

Если функция прошла успешно, возвращаемое значение представляет хендл экземпляра объекта приложения, которое было запущено или хендл динамического обмена данными (DDE) серверного приложения.

Если функция не прошла, возвращаемое значение представляет значение ошибки, которое меньше или равно 32.
Следующая таблица представляет список этих ошибок (значения констант определены в модуле ShellAPI):

КонстантаЗначениеОписание
Оперативной системе не хватает памяти или ресурсов.
ERROR_FILE_NOT_FOUND2Указаный файл не найден.
ERROR_PATH_NOT_FOUND3Указаный путь не найден.
ERROR_BAD_FORMAT11.EXE файл не рабочий (не Win32 .EXE или ошибка в .EXE образе).
SE_ERR_ACCESSDENIED5Операционная система отказывает в доступе к указаному файлу.
SE_ERR_ASSOCINCOMPLETE27Имя ассоциированного файла не полное или не правильное.
SE_ERR_DDEBUSY30Транзакция динамического обмена данными (DDE transaction) не может быть завершена потому что выпоняются другие DDE транзакции.
SE_ERR_DDEFAIL29Транзакция динамического обмена данными провалилась.
SE_ERR_DDETIMEOUT28Транзакция динамического обмена данными не может быть завершена потому что истекло время ожидания ответа.
SE_ERR_DLLNOTFOUND32Указаная DLL библиотека не найдена.
SE_ERR_FNF2Указаный файл не найден.
SE_ERR_NOASSOC31Нет приложений ассоциированных с данным расширением файла.
SE_ERR_OOM8Не достаточно памяти для завершения операции.
SE_ERR_PNF3Указаный путь не найден.
SE_ERR_SHARE26Нарушение совместного доступа.

Файл, указаный в параметре FileName может быть файлом документа или исполнимым файлом. Если это файл документа, функция ShellExecute открывает его или выводит на печать, основываясь на значении параметра Operation. Если же файл является исполнимым файлом, функция ShellExecute открывает его, даже если в параметре Operation задана печать.

Вы можете использовать ShellExecute чтобы открыть папку или исследовать ее с помощью эксплорера.

Чтобы открыть папку, используйте один из следующих вызывов: или (См. Рис. 1)

Чтобы исследовать папку с помощью эксплорера используйте следующий вызов: (См. Рис. 2)

Если Operationnil, функция открывает файл указаный в параметре FileName. Если Operation — ‘open’ или ‘explore’ функция будет приудительно открывать окно или эксплорер.

Рис.1 Так открываеся папка, если в параметре Operation значение nil или ‘open’
Рис.2 А так открываеся папка,если в параметре Operation значение ‘explore’

И напоследок. В shell32.dll функции ShellExecute нет. Вместо нее имеются функции ShellExecuteA (работает с параметрами в ANSI) и ShellExecuteW (работает с параметрами в unicode):

  • function ShellExecuteA(hWnd: HWnd; Operation, FileName, Parameters, Directory: PAnsiChar; ShowCmd: Integer): HINST; stdcall;
  • function ShellExecuteW(hWnd: HWnd; Operation, FileName, Parameters, Directory: PWideChar; ShowCmd: Integer): HINST; stdcall;

А из модуля ShellApi под именем функции ShellExecute вызывается функция ShellExecuteA. Поэтому, если вы не хотите подключать модуль ShellApi к проекту, а желаете обращаться к shell32.dll напрямую, используйте одну из этих функций.

Процессы, потоки и функции ShellExecute и WinExec

Процессы, потоки и функции ShellExecute и WinExec

Содержание материала

Устройство Windows. Процессы, потоки и функции ShellExecute и WinExec. Часть 1.

По просьбам общественности и была написана эта статья.

Действительно невозможно профессионально разрабатывать многопоточные программы,

не зная, что такое процессы, потоки, нити и синхронизация (надеюсь посвятить этому одну из следующих статей) и,

не представляя, как они работают. В статье за основу взята операционная система Windows 2000.

Так же в этой статье будут подробно рассмотрены различные методы запуска новых процессов (программ).

Главным обстоятельством является то, что почти все современные ОС многозадачны.

ОС Windows 2000 не является исключением, в ней может работать одновременно несколько программ.

Любая программы имеет, по крайней мере, одним программным потоком,

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

Но, не смотря на то, что ОС, называется «многозадачной» в конкретный момент времени

выполняется только один поток. что вы не замечаете, как ОС переключается между потоками.

Не стоит забывать, что, распределяя процессорное время, операционная система Windows,

имеет дело именно с потоками, а не с процессами, которым эти потоки принадлежат.

Запуская программу в Windows, вы создаете процесс.

И в этом нет ничего удивительного, потому что в других операционных системах происходит почти то же самое.

Однако все же процесс в Windows, например, отличается от процесса в Unix.

А все дело в том, что в Windows процесс владеет открытыми файлами, оперативной памятью и другими ресурсами.

Для каждого процесса (программы) Windows выделяет виртуальное адресное пространство объемом 2 Гб.

Для адресации этого пространства используются обычные 32-битные указатели,

которые представляют собой числа от 0 до 2 Г. Но процесс в Windows не исполняется.

Исполняется программный поток. Поток — это последовательность машинных команд, которые Windows

воспринимает, как единое целое (набор регистров процессора).

Поток обладает указателем на команду, которая в данный момент выполняется,

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

Так в чем же разница спросите вы, между процессом и потоком, если запущенная программа имеет только один,

программный поток то разницы практически никакой. Однако поток может создавать другие потоки.

А те потоки могут создавать еще потоки. Два процесса ни могут иметь общие ресурсы,

если не используют специальные механизмы межпроцессорного взаимодействия.

В противоположность этому все потоки, которые принадлежат одному процессу,

имею доступ ко всем ресурсам этого процесса.

Зачем процессу несколько потоков? Потоки могут выполнять какие-то действия параллельно

основной программе (в фоновом режиме). Потоки удобно применять, если нежелательна

блокировка основной программы определенной функцией. Например, в то время, как поток

осуществляет сложные математические вычисления, в главной программе происходит подготовка

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

Если вам нужно запустить новую программу, вам нужно создать новый процесс.

Для этой цели служит системный вызов CreateProcess.

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

однако в некоторых случаях без него не обойтись.

Если же вам надо просто запустить программу или открыть файл,

то для этого подходят мене сложные вызовы.

Легче всего использовать WinExec. Однако Microsoft не рекомендует его использование,

а предлагает пользоваться CreateProcess.

Но для выполнения тех или иных задач он вполне подходит.

Почему же нежелателен вызов WinExec дело все в том, что фактически он содержит обращение

к еще одному устаревшему системному вызову LoadModule, который обращается к CreateProcess

со значениями аргументов по умолчанию. При обращении к WinExec необходимо задать полный путь

к программе или имя EXE файла, расположенного в пути поиска, а также способ

отображения программы (константы SW_HIDE, SW_SHOW и т.д. см. Таблица 2).

Если вызов функции произошел успешно, то WinExec вернет дескриптор новой

программы (который не может быть меньше 32, т.е. если WinExec возвращает число меньше 32,

то вызов привел к ошибке, коды ошибок см. Таблица 1).

0 Системе не хватает ресурсов.

ERROR_BAD_FORMAT Некорректный EXE файл (не Win32 EXE файл или EXE файл поврежден).

ERROR_FILE_NOT_FOUND Указанный файл не найден.

ERROR_PATH_NOT_FOUND Указанный путь не найден.

Еще один простой вызов это — ShellExecute. Этот вызов во многом напоминает WinExec,

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

Например, если вы с помощью ShellExecute вы попробуете запустить файл с расширением .BMP,

то буде запущена программа Paint или любая другая, которая использует для просмотра графических файлов.

В качестве аргументов ShellExecute принимает дескриптор окна (если есть необходимость в сообщениях об ошибках),

строку, такую как open (открыть), print (напечатать) и explore (исследовать), можно в качестве этой строки передать NULL,

тогда файл указанный вами будет открыт (open). Так же ShellExecute необходимо сообщить имя файла и любые параметры

командной строки (чаще всего NULL), и оставшиеся два аргумента это текущий каталог и константа функции

ShowWindow (как и в WinExec см. Таблица 2).

SW_HIDE Окно в скрытом режиме.

SW_MAXIMIZE Окно максимального размера

SW_MINIMIZE Окно находится в свернутом виде, активируется следующее верхнее окно в Z последовательности.

SW_RESTORE Активирует и показывает окно. Если окно свернуто или развернуто, Windows восстанавливает его

к первоначальному размеру и позиции. Приложение должно определить этот флаг при восстановлении свернутого окна.

SW_SHOW Активирует окно и выводит его в текущих размерах и позиции.

SW_SHOWMAXIMIZED Активирует и показывает окно в развернутом виде.

SW_SHOWMINIMIZED Активирует и показывает окно в свернутом виде.

SW_SHOWMINNOACTIVE Отображает окно в свернутом виде. Активное окно остается активным.

SW_SHOWNA Отображает окно в текущем состоянии. Активное окно остается активным.

SW_SHOWNORMAL Активирует и показывает окно. Если окно свернуто или развернуто,

Windows восстанавливает его к первоначальному размеру и позиции.

Приложение должно определить этот флаг при показе окна в первый раз.

Значение, которое возвращает ShellExecute такое же, как и у WinExec. Функцию ShellExecute можно использовать,

например, для открытия корневого каталога диска С:

ShellExecute(hWnd, ‘open’, ‘c:’, nil, nil, SW_SHOWNORMAL);

Вы можете заменить строку «open» на «explore» и в качестве третьего параметра указать любой каталог,

в этом случае указанная вами папка откроется в Проводнике (Explorer).

Так же существует системный вызов ShellExecuteEx, который фактически является полным аналогом

ShellExecute, однако в качестве аргумента он принимает указатель на структуру, поля которой во многом

совпадают с аргументами ShellExecute. Кроме этого после завершения своей работы ShellExecuteEx помещает

в одно из полей этой структуры дескриптор запущенной программы.

Применение этих вызовов довольно просто. Пример программы использующей WinExec и ShellExecute

приведен в листинге 1.

if ShellExecute(h, ‘open’ , ‘readme.txt’ , nil , nil , SW_SHOW) 32 then

ShowMessage( ‘Немогу выполнить ShellExecute !’ )

if WinExec( ‘Notepad c:config.sys’ , SW_SHOW) 32 then

ShowMessage( ‘Немогу выполнить WinExec !’ )

Добавить комментарий

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

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!

Delphi shellexecute параметры

Добрый день. Знаю, что в С++ есть такая функция ShellExecute. А каков ее аналог в Дельфи? Прбовал искать с справке — там только ее описание (без синтаксика и примаров). Если такая же функция есть и в Дельфи (т.е также называется), то что надо добавлять в раздел USES?

P.S. Подскажите ссылку на онлайн справку по программированию (Дельфи, Си++).

Эта функция не относится к встроенным в Delphi.
Ищи в Delphi Help—>Windows SDK

Добавлено 25.06.06, 12:54
Или набери в редакторе Delphi ShellExecute, затем на этой функции — F1

Эта функция не относится к встроенным в Delphi.
Ищи в Delphi Help—>Windows SDK

Добавлено 25.06.06, 12:54
Или набери в редакторе Delphi ShellExecute, затем на этой функции — F1

много примеров в DRKB

Процессы, потоки и функции ShellExecute и WinExec

Устройство Windows. Процессы, потоки и функции ShellExecute и WinExec. Часть 1.
По просьбам общественности и была написана эта статья.
Действительно невозможно профессионально разрабатывать многопоточные программы,
не зная, что такое процессы, потоки, нити и синхронизация (надеюсь посвятить этому одну из следующих статей) и,
не представляя, как они работают. В статье за основу взята операционная система Windows 2000.
Так же в этой статье будут подробно рассмотрены различные методы запуска новых процессов (программ).
Главным обстоятельством является то, что почти все современные ОС многозадачны.
ОС Windows 2000 не является исключением, в ней может работать одновременно несколько программ.
Любая программы имеет, по крайней мере, одним программным потоком,
который в свою очередь может создавать еще несколько потоков и т.д.
Но, не смотря на то, что ОС, называется «многозадачной» в конкретный момент времени
выполняется только один поток. что вы не замечаете, как ОС переключается между потоками.
Не стоит забывать, что, распределяя процессорное время, операционная система Windows,
имеет дело именно с потоками, а не с процессами, которым эти потоки принадлежат.
Запуская программу в Windows, вы создаете процесс.
И в этом нет ничего удивительного, потому что в других операционных системах происходит почти то же самое.
Однако все же процесс в Windows, например, отличается от процесса в Unix.
А все дело в том, что в Windows процесс владеет открытыми файлами, оперативной памятью и другими ресурсами.
Для каждого процесса (программы) Windows выделяет виртуальное адресное пространство объемом 2 Гб.
Для адресации этого пространства используются обычные 32-битные указатели,
которые представляют собой числа от 0 до 2 Г. Но процесс в Windows не исполняется.
Исполняется программный поток. Поток — это последовательность машинных команд, которые Windows
воспринимает, как единое целое (набор регистров процессора).
Поток обладает указателем на команду, которая в данный момент выполняется,
и указателем на стек где хранятся локальные переменные потока.
Так в чем же разница спросите вы, между процессом и потоком, если запущенная программа имеет только один,
программный поток то разницы практически никакой. Однако поток может создавать другие потоки.
А те потоки могут создавать еще потоки. Два процесса ни могут иметь общие ресурсы,
если не используют специальные механизмы межпроцессорного взаимодействия.
В противоположность этому все потоки, которые принадлежат одному процессу,
имею доступ ко всем ресурсам этого процесса.
Зачем процессу несколько потоков? Потоки могут выполнять какие-то действия параллельно
основной программе (в фоновом режиме). Потоки удобно применять, если нежелательна
блокировка основной программы определенной функцией. Например, в то время, как поток
осуществляет сложные математические вычисления, в главной программе происходит подготовка
следующего задания и ввод параметров.
Если вам нужно запустить новую программу, вам нужно создать новый процесс.
Для этой цели служит системный вызов CreateProcess.
Однако использование этого вызова не очень удобно, потому что приходится задавать множество аргументов,
однако в некоторых случаях без него не обойтись.
Если же вам надо просто запустить программу или открыть файл,
то для этого подходят мене сложные вызовы.
Легче всего использовать WinExec. Однако Microsoft не рекомендует его использование,
а предлагает пользоваться CreateProcess.
Но для выполнения тех или иных задач он вполне подходит.
Почему же нежелателен вызов WinExec дело все в том, что фактически он содержит обращение
к еще одному устаревшему системному вызову LoadModule, который обращается к CreateProcess
со значениями аргументов по умолчанию. При обращении к WinExec необходимо задать полный путь
к программе или имя EXE файла, расположенного в пути поиска, а также способ
отображения программы (константы SW_HIDE, SW_SHOW и т.д. см. Таблица 2).
Если вызов функции произошел успешно, то WinExec вернет дескриптор новой
программы (который не может быть меньше 32, т.е. если WinExec возвращает число меньше 32,
то вызов привел к ошибке, коды ошибок см. Таблица 1).
Таблица 1.

0 Системе не хватает ресурсов.
ERROR_BAD_FORMAT Некорректный EXE файл (не Win32 EXE файл или EXE файл поврежден).
ERROR_FILE_NOT_FOUND Указанный файл не найден.
ERROR_PATH_NOT_FOUND Указанный путь не найден.

Еще один простой вызов это — ShellExecute. Этот вызов во многом напоминает WinExec,
однако он поддерживает обработку типов файлов, зарегистрированных в Windows.
Например, если вы с помощью ShellExecute вы попробуете запустить файл с расширением .BMP,
то буде запущена программа Paint или любая другая, которая использует для просмотра графических файлов.
В качестве аргументов ShellExecute принимает дескриптор окна (если есть необходимость в сообщениях об ошибках),
строку, такую как open (открыть), print (напечатать) и explore (исследовать), можно в качестве этой строки передать NULL,
тогда файл указанный вами будет открыт (open). Так же ShellExecute необходимо сообщить имя файла и любые параметры
командной строки (чаще всего NULL), и оставшиеся два аргумента это текущий каталог и константа функции
ShowWindow (как и в WinExec см. Таблица 2).
Таблица 2.

SW_HIDE Окно в скрытом режиме.
SW_MAXIMIZE Окно максимального размера
SW_MINIMIZE Окно находится в свернутом виде, активируется следующее верхнее окно в Z последовательности.
SW_RESTORE Активирует и показывает окно. Если окно свернуто или развернуто, Windows восстанавливает его
к первоначальному размеру и позиции. Приложение должно определить этот флаг при восстановлении свернутого окна.
SW_SHOW Активирует окно и выводит его в текущих размерах и позиции.
SW_SHOWMAXIMIZED Активирует и показывает окно в развернутом виде.
SW_SHOWMINIMIZED Активирует и показывает окно в свернутом виде.
SW_SHOWMINNOACTIVE Отображает окно в свернутом виде. Активное окно остается активным.
SW_SHOWNA Отображает окно в текущем состоянии. Активное окно остается активным.
SW_SHOWNORMAL Активирует и показывает окно. Если окно свернуто или развернуто,
Windows восстанавливает его к первоначальному размеру и позиции.
Приложение должно определить этот флаг при показе окна в первый раз.

Значение, которое возвращает ShellExecute такое же, как и у WinExec. Функцию ShellExecute можно использовать,
например, для открытия корневого каталога диска С:

ShellExecute(hWnd, ‘open’, ‘c:’, nil, nil, SW_SHOWNORMAL);
Вы можете заменить строку «open» на «explore» и в качестве третьего параметра указать любой каталог,
в этом случае указанная вами папка откроется в Проводнике (Explorer).
Так же существует системный вызов ShellExecuteEx, который фактически является полным аналогом
ShellExecute, однако в качестве аргумента он принимает указатель на структуру, поля которой во многом
совпадают с аргументами ShellExecute. Кроме этого после завершения своей работы ShellExecuteEx помещает
в одно из полей этой структуры дескриптор запущенной программы.
Применение этих вызовов довольно просто. Пример программы использующей WinExec и ShellExecute
приведен в листинге 1.

WinAPI (Delphi) » Использование функции


Оглавление

Функция предназначена для запуска внешних приложений, открытия и печати документов.

Вызов функции выглядит следующим образом:

На языке CНа языке Object Pascal (Delphi)

HWND Окно, дескриптор которого передается первым параметром, будет использоваться вызванным приложением в дальнейшем как аргумент при вызове функции MessageBox() . Это его единственный смысл. lpOperation Параметр-строка, который принимает одно из значений: ‘open’ , ‘print’ и ‘explore’ . Наиболее универсальным является первое значение, которое соответствует как запуску приложения, так и открытию документа или, скажем, web-страницы. Значение ‘print’ используется только при открытии документов (не приложений) и соответствует команде «Печать» контекстного меню Проводника Windows. При передаче этого значения документ будет открыт в приложении по умолчанию и напечатан, если приложение это поддерживает. Наконец, ‘explore’ соответствует вызову Проводника, а вместо имени файла передается имя папки, которую нужно открыть. Можно для открытия папки использовать команду ‘open’ . Разница заключается в том, что команда ‘open’ просто открывает папку в отдельном окне, а ‘explore’ открывает такое окно с деревом папок в левой части. lpFileName Самый интересный из параметров. Является собственно командной строкой: именем файла, папки Вариантов значения этого параметра много, мы рассмотрим ниже только некоторые. lpParameters Если в качестве имени файла было передано имя исполнимого файла, то здесь можно перечислить параметры командной строки. На практике никто не запрещает передать все параметры командной строки как часть значения lpFileName . lpDirectory Если имя файлы было задано относительное, то здесь можно указать имя папки, от которой будет производиться поиск этого файла. Если путь был задан абсолютный, то это имя папки, которая при запуске приложения будет текущей. Короче говоря, это то же самое, что параметр «Рабочая папка» в свойствах любого ярлыка Windows. Если путь вообще не задан, то все относительные пути будут трактоваться относительно текущей папки Windows, если там нет такого файла, то будут просмотрены папки из переменной окружения PATH . nShowCmd Для приложений задает положение и размер окна приложения, а для документов здесь нужно Прочие возможные значения можно посмотреть в справке по этой функции или по функции WinAPI ShowWindow() .

Функция возвращает целое число — дескриптор загруженного модуля. Если попытка запуска провалилась, то вместо этого будет возвращен код ошибки. Подробно коды ошибок вы можете прочитать в справке по WinAPI, скажу только, что код ошибки всегда

Ничего сложного здесь нет, но есть один интересный момент, который почему-то не нашел отражения в справке по WinAPI. Дело в том, что вместо имени программы или документа можно указать любой допустимый URL-адрес или имя удаленного компьютера. Собственно, на этом и будет построено дальнейшее изложение. Описанные ниже методы работают в операционных системах с Windows 98 по Windows XP включительно.

Вот, например, фрагмент программы, которая открывает сайт поисковой службы Google™ и инициирует поиск некоторого текста. Переменная WhatToFind содержит искомый текст. Нужно только преобразовать текст, в частности, заменить все пробелы на строку %20 . Неплохо так же заменить все прочие символы, не являющиеся латинскими буквами и цифрами на комбинации вида ‘%код’ , где это шестнадцатеричный код символа. Это сделать очень просто, и рассматривать этот вопрос мы здесь не будем.

Пример (Delphi)

Обычно, если нужно программно инициализировать запуск почтового клиента, используют MAPI или какой-нибудь еще программный интерфейс. Мы поговорим об этом в другой раз, а пока продемонстрируем, как в этом случае можно применить функцию .

Если вместо имени файла в параметр lpFileName записать URL вида mailto:mail@domain.ru , то при вызове функции будет открываться почтовая программа, в которой уже заполнено поле «Кому».

Пример (Delphi)Допустим, мы хотим добавить в окно «О программе» метку TLabel , при щелчке на которой будет запускаться почтовая программа для посылки письма разработчику. Самое простое решение: присвоить свойству Caption значение, совпадающее с адресом разработчика, скажем, ‘mail@domain.ru’ (без ‘mailto:’ ). Теперь в обработчике OnClick можно написать:

Более того, можно открывать почтовую программу с уже заполненными полями «Тема», «Копии» и с уже готовым текстом письма, так что пользователю будет нужно только нажать кнопку «Отправить». Для этого нужно задать lpFileName следующим образом:

mailto:Мнемонический адрес ?subject=Тема&cc=Мнемонический адрес копии &cc2=Мнемонический адрес копии 2 …&body=Текст письма .

В этой строке подчеркиванием выделены те элементы, которые следует заменить реальными данными, прочие нужно записать именно так, как здесь (это элементы синтаксиса, угловые скобки к ним тоже относятся). Знаки ‘?’ разбивают адрес на логические разделы. Слева направо: адрес, тема, копия, текст письма. Каждый раздел является необязательным. Многоточие подразумевает, что после может следовать и т. д.

Как этим можно пользоваться: например, вы хотите, чтобы пользователь мог уведомить вас об ошибке в программе. Обычный пользователь вообще ничего не сообщает разработчику, либо пишет что-то малоинформативное вроде «я тут что-то нажал, а оно упало», еще вытягивать из него подробности. Эффективнее было бы, чтобы программа собрала доступную информацию о системе пользователя (объем памяти, используемая ОС и т. п.), данные о собственной версии и протокол последних нескольких действий и сформировала из этих данных текст письма, которое будет отправлено разработчику. Пользователю останется только добавить свои комментарии и отправить это письмо.

Недостатком такого способа является то, что письмо не сможет быть отправлено, если у пользователя не установлена почтовая программа по умолчанию. Но это также может стать камнем преткновения и при использовании любых функций для работы с почтой (например, MAPI). Единственное решение этой написать свой почтовый клиент, но это не столь тривиальная задача.

Второй недостаток — невозможность добавления прикрепленных файлов. Но тут уже не обойтись простыми решениями, нужно привлекать MAPI или какой-нибудь другой почтовый программный интерфейс.

Как и обещал, расскажу об одном приеме, который позволяет создать контекстно-зависимую справочную систему. «Контекстно-зависимая» означает, что при нажатии клавиши F1 (или какой-нибудь еще) пользователь будет получать подсказку по выделенному элементу интерфейса или по текущему режиму работы приложения.

Мы будем использовать файлы формата CHM (Compiled HTML Help). Для файлов WinHelp существуют более стандартные решения, которые описаны в справке Delphi и книгах.

Для подключения файлов в формате CHM придумано много способов, ActiveX и компоненты Delphi раздел Полезные ссылки / Компоненты Delphi). один крайне простой способ, основанный на применении функции .

Этот способ основан на следующем наблюдении. Если просто открывать chm -файл как документ, то он всегда открывается на первой (главной) странице. Но если непосредственно вызвать программу чтения таких файлов hh.exe из папки Windows, то можно передавать ей в качестве параметра имя файла и имя документа внутри файла (с путем относительно корневой «папки»), разделенные двумя двоеточиями (например, myfile.chm::innerpath/index.html ). Если же на странице еще есть якоря (теги вида ), то можно приписать справа еще и ‘#’ и имя якоря, как в обычной URL-ссылке, так что самый общий вид пути будет

На практике это можно использовать так. Пусть, например, каждому экранному элементу соответствует раздел на какой-то странице. Пометим разделы якорями и запишем имена страниц и якорей в свойство HelpKeyword каждого элемента (что-то вроде HelpKeyword=’index.html#edit1′ ), а его свойство HelpType установим в htKeyword . Теперь напишем такую процедуру:

Пример (Delphi)Пример (Delphi, обработчик формы OnKeyDown)Важно: не забудьте установить в true свойство KeyPreview формы, чтобы она перехватывала нажатия клавиш.

Пример (Delphi, обработчик Application.OnHelp)Нужно где-то в самом начале написать Application.OnHelp := AppShowHelp и присвоить правильное значение свойству Application.HelpFile .

Как видно, функция имеет гораздо более широкую область применения, чем просто запуск приложений и открытие документов.

Конечно, все предложенные решения имеют более ограниченную область применения, чем «традиционные». Так, MAPI предлагает более широкие возможности по отправке почты, а компоненты и ActiveX, ориентированные на работу с форматом CHM, позволяют использовать другие возможности этого формата, например, всплывающие окна. Но описанные здесь приемы вполне работоспособны для решения несложных практических задач или когда нужно быстро реализовать какую-то возможность.

Читать еще:  Css button click
Ссылка на основную публикацию
Adblock
detector