Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Л 11.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
198.14 Кб
Скачать

Функция ShellExecute

Функция ShellExecute не только запускает программы, а открывает, редактирует или печатает файл, с учетом зарегестрированного типа, а также открывает указанную папку проводником. Возвращает Handle ссылку на открытое окно.

Используемый модуль ShellAPI. Его нужно не забыть указать в разделе Uses.

Описание: ShellExecute (hWnd: HWND; Operation: PChar; FileName: PChar; Parametrs: PChar; Directory: PChar; CmdShow: Integer): HINST;

где: hWnd – Handle родительского окна, в который будут передаваться сообщения запускаемого приложения. Можно указывать Handle-ссылку окна вашего приложения.

Operation – производимая операция. Open – открыть, print – напечатать, explore – открыть папку. По умолчанию open, если указать nil.

FileName – имя файла или документа, интернет ссылка, e-mail адрес.

Parametrs – параметры, передаваемые приложению в командной строке.

Directory – каталог по умолчанию.

CmdShow – стиль окна. Показывает, в каком состоянии будет отображаться окно при запуске. Подробно рассказано выше.

Вместо параметров Operation, Parametrs и Directory можно ставить nil. Они являются не обязательными параметрами для запуска.

В случае успешного запуска возвращает Handle окна, в случае неудачи возвращает код ошибки меньше или равное 32. Список возможных ошибок можно прочитать в справке по этой команде.

Пример использования команды ShellExecute в программе:

ShellExecute (Form1.Handle, nil, 'http://programming.dax.ru', nil, nil, SW_RESTORE); //запуск нашей странички

ShellExecute (Form1.Handle, nil, PChar (Application.ExeName), nil, nil, SW_RESTORE); //запуск второй копии этой программы

ShellExecute (Form1.Handle, nil, 'iexplore', 'http://programming.dax.ru', nil, SW_RESTORE); //запуск в отдельном окне

ShellExecute (Form1.Handle, nil, 'mailto:semen@krovatka.net?subject=delphi', nil, nil, SW_RESTORE); //написать мне письмо

ShellExecute (Form1.Handle, nil, 'c:\1.doc', nil, nil, SW_RESTORE); //открыть документ

Для использования функции ShellExecute прежде всего добавляем ShellAPI в секцию uses нашего кода (иначе компилятор ругнется на эту функцию).

uses:

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls, ShellAPI;

Далее помещаем на форме Label, и делаем в нем надпись синей и подчеркнутой (как это и принято для гиперссылки). Делаем двойной щелчок мышью на нашем Label1 для перехода в окно кода.

В обработчике пишем следующий код:

procedure TForm1.Label1Click(Sender: TObject);

begin

ShellExecute(Form1.Handle, 'open', 'http://www.ya.ru',

nil, nil, SW_SHOWNORMAL)

end;

Запускаем программу, щелкаем на нашей гиперссылке и оказываем на сайте. Все как и ожидалось.

Характеристики экрана

Получение характеристик экрана. В каждом приложении присутствует объект Screen типа TScreen. Его не надо специально объявлять - он и так доступен.

Вот так, например, с помощью объекта Screen можно выяснить текущие размеры экрана:

var

Width, Height: Integer;

...

begin

Width:=Screen.Width;

Height:=Screen.Height;

ShowMessage('Ширина экрана: ' + IntToStr(Width) +

', Высота экрана: ' + IntToStr(Height));

Это можно использовать, например, для расположения формы точно по центру экрана.

Хотя это можно сделать и более простым способом:

procedure TForm1.FormCreate(Sender: TObject);

begin

Form1.Left:=(Screen.Width - Form1.Width) div 2;

Form1.Top:=(Screen.Height - Form1.Height) div 2;

end;

Все свойства объекта Screen доступны только для чтения. Кроме того, они не доступны на этапе разработки программы - вы можете их использовать только на этапе выполнения.

Работа с потоками

Изучим основы работы с потоками. На этом занятии мы с вами познакомимся с потоками на примере простого приложения. Заметим сразу, что это занятие представляет из себя только первое знакомство - дело в том, что многие просто не знают, как использовать потоки или боятся их. Но на самом деле ничего страшного или особо сложного в потоках нет.

Запускайте Delphi. Итак, наша программа будет представлять из себя форму с двумя edit и кнопкой. Добавьте их на форму.

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

Добавьте в программу еще один модуль (File, New, Unit).

Внесите в окно кода нового модуля следующий код:

unit Unit2;

interface

uses

Classes;

type

TMyThread = class(TThread) //Новый класс

private

answer:Integer;

protected

procedure ShowResult;

procedure Execute; override;

end;

implementation

uses

SysUtils, Unit1;

//Процедура для вывода информации из потока

procedure TMyThread.ShowResult;

begin

Form1.Edit1.Text:=IntToStr(answer);

end;

//Длинная процедура

procedure TMyThread.Execute;

var

i:Integer;

begin

for i:=1 to 10000 do

begin

answer:=answer+1;

Synchronize(ShowResult);

end;

end;

end.

Немного комментария по коду. В нашем модуле мы вводим новый класс TMyThread как потомок TThread. В экземпляре нашего класса и будет выполнятся отдельный поток программы. В классе есть процедура ShowResult для вывода информации из работающего потока в основной поток (форму) нашей программы. Кроме того, в классе есть наша версия метода Execute из родительского класса TThread. Обратите внимание, что в нашей реализации Execute мы пишем: Synchronize(ShowResult);

Тем самым наш поток что-то отправляет в основной поток программы (в данном случае значение переменной answer). Делаем мы это посредством вызова Synchronize, в котором в качестве параметра указываем имя нужной процедуры.

Теперь переходим к нашему основному модулю Unit1.

Во-первых, добавьте в секцию uses ссылку на Unit2:

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Unit2;

Во-вторых, напишите обработчик для нажатия кнопки:

procedure TForm1.Button1Click(Sender: TObject);

var

MyThread: TMyThread;

begin

MyThread:=TMyThread.Create(False);

end;

Тут мы создаем второй поток для нашего приложения. Параметр False означает, что метод Execute для нашего потока вызовется немедленно.

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

12

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]