Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лекции delphi 1часть

.pdf
Скачиваний:
64
Добавлен:
16.03.2015
Размер:
814.86 Кб
Скачать

имя и полный путь файла, выбранного в диалоге. Для удобства дальнейшего использования рекомендуется задавать каталог, открываемый при первом появлении диалога (свойство InitialDir), и формировать фильтр имени файла.

Свойство Filter можно задать в Инспекторе объектов или программно. На этапе проектирования следует щёлкнуть по кнопке в строке Filter и в открывшемся редакторе записать название типа файла (слева) и маску (справа). Если требуется отображать файлы нескольких типов, то придётся сформировать соответствующее количество строк. При задании фильтра программно все сведения записывают одной строкой, в которой в качестве разделителя между фильтрами, описанием файла и маской используется вертикальная черта. Если для одного описания приводится несколько масок, то они разделяются символом «;».

У компонента SaveDialog следует задать свойство DefaultExt, определяющее расширение, добавляемое по умолчанию к имени файла. Иногда целесообразно в свойстве

FileName записать имя файла. Например:

OpenDialog1.Filter:='Текстовые txt|*.txt|Файлы Pas|*.pas';

SaveDialog1.DefaultExt:='txt'; SaveDialog1.Filter:= OpenDialog1.Filter; if SaveDialog1.Execute

then Memo1.Lines.SaveToFile(SaveDialog1.FileName);

if OpenDialog1.Execute

then begin

st:= OpenDialog1.FileName;

Memo2.Lines.LoadFromFile(st);

Memo3.Lines.SaveToFile(st);

end;

Для тонкой настройки параметров и внешнего вида окна используется составное свойство Options. По умолчанию все параметры имеют значение False. Для ввода имени с клавиатуры предусмотрен компонент Edit, который можно заменить на ComboBox,

присвоив свойству FileEditStyle значение fsComboBox вместо fsEdit. Если используется комбинированный список, то с ним можно связать протокол выбора имён (свойство

HistoryList). Пополнять этот список надо программно.

Специализированные диалоги открытия и сохранения графических файлов

OpenPictureDialog и SavePictureDialog отличаются от OpenDialog и SaveDialog удобной возможностью просматривать изображения и заданным значением свойства Filter. Причём в фильтре по умолчанию перечислены все разрешённые форматы. При необходимости

откорректировать фильтр на этапе проектирования очень просто: достаточно удалить

лишние строки.

OpenPictureDialog1.Filter:='Графические файлы bmp|*.bmp|'+

'Все файлы|*.bmp;*.jpg;*.jpeg;*.ico;*.emf;*.wmf';

OpenPictureDialog1.InitialDir:= 'F:\A_Slide';

if OpenPictureDialog1.Execute then

Image1.Picture.LoadFromFile(OpenPictureDialog1.fileName);

3.5.3.Использование модального окна

Поведение модальной формы определяется свойством ModalResult. Это свойство доступно только во время выполнения приложения. При открытии формы методом

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

Требуемое значение ModalResult можно задать программно в обработчиках событий для компонентов модальной формы. Однако проще воспользоваться свойством

ModalResult кнопок Button и BitBtn. В кнопках BitBtn это свойство имеет значение,

соответствующее назначению кнопки. Для кнопки Button свойству ModalResult можно задать нужное значение. При использовании кнопки для закрытия окна её свойство

ModalResult определяет, какое значение будет иметь одноимённое свойство формы.

Для облегчения трактовки результата в Delphi объявлены именованные константы

(см. таблицу 1). Чаще требуемые значения свойства ModalResult для кнопок задаются на этапе проектирования. Однако в некоторых случаях целесообразно установить значения во время работы приложения. Например, чтобы запретить закрытие модального окна.

Таблица 1

Значения свойства ModalResult

Число

Константа

Значение

 

Примечание

 

 

 

 

 

 

 

0

mrNone

 

 

 

 

 

 

 

 

 

1

mrOk

idOk

 

Закрытие кнопкой OK

 

 

 

 

 

 

2

mrCancel

idCancel

 

Закрытие

кнопкой

 

 

 

Cancel или методом Close

 

 

 

или

кнопкой в

строке

 

 

 

заголовка окна

 

 

 

 

 

 

 

3

mrAbort

idAbort

 

Закрытие

кнопкой

 

 

 

Abort

 

 

 

 

 

 

 

4

mrRetry

idRetry

 

Закрытие

кнопкой

 

 

 

 

 

 

 

 

 

Retry

 

 

 

 

 

 

5

mrIgnor

idIgnor

Закрытие

кнопкой

 

 

 

Ignor

 

 

 

 

 

6

mrYes

idYes

Закрытие кнопкой Yes

 

 

 

 

7

mrNo

idNo

Закрытие кнопкой No

 

 

 

 

8

mrAll

mrNo+1

Закрытие кнопкой All

 

 

 

 

 

9

mrNoToAll

mrAll+1

Закрытие

кнопкой

 

 

 

NoToAll

 

 

 

 

 

 

10

mrYesToAll

NoToAll+1

Закрытие

кнопкой

 

 

 

YesToAll

 

 

 

 

 

 

При закрытии модального окна функция ShowModal возвращает значение свойства

ModalResult. Таким образом, для оценки действия пользователя можно прочитать значение свойства формы ModalResult или воспользоваться результатом, возвращаемым функцией ShowModal.

При разработке приложения следует учитывать, что закрытию формы методом Close

соответствует значение mrCancel свойства ModalResult. Скрытие формы методом Hide не изменяет значения ModalResult.

Последовательность действий при создании окна диалога:

1)создать новую форму, присвоить ей имя (например, MyDlg), задать значения свойств и сохранить в файле;

2)используя команду File|Use Unit, связать с нужной формой приложения;

3)в обработчик события для пункта меню или кнопки включить команду,

выводящую окно на экран: MyDlg.ShowModal;

4) проанализировать результат диалога. Например, применить конструкцию if MyDlg.ModalResult=mrOk then <операторы> else <операторы>;

Альтернативный вариант предполагает совмещение пунктов 3 и 4 путём использования конструкции:

if MyDlg.ShowModal then <операторы> else <операторы>;

Метод ShowModal выводит на экран модальное окно, а при его закрытии возвращает результат диалога.

if MyDlg.ShowModal=mrOk

then begin

label1.Caption:=MyDlg.Edit1.Text;

label2.Caption:=MyDlg.Edit2.Text;

end

else begin

MyDlg.Edit1.Text:=st1;

MyDlg.Edit2.Text:=st2;

end;

3.5.4.Использование заготовок

Применение имеющихся в репозитории заготовок позволяет ускорить разработку

приложений. Чтобы воспользоваться заготовкой (шаблоном), необходимо:

выполнить команду File|New|Other, перейти на страницу Dialogs;

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

нажать кнопку OK. Появится соответствующая форма, и сведения о ней система Delphi

включит в файл проекта;

при необходимости разместить на форме дополнительные компоненты и изменить значения свойств имеющихся;

сохранить форму;

подсоединить диалоговую панель к нужной форме приложения;

вывести окно диалога на экран командой ShowModal;

обработать результат диалога.

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

Например, добавим в проект окно диалога для ввода пароля PasswordDlg. Пароль будем запрашивать при попытке выполнить одну из команд меню.

procedure TForm1.Dialog1Click(Sender: TObject); begin

if PasswordDlg.ShowModal=mrok then

if PasswordDlg.Password.Text='Shaker' then Form3.Show; end;

3.6. Графика

3.6.1.Поддержка графики в Windows

Вывод графики в Windows осуществляется с помощью функций Graphics Device Interface (GDI). Функции GDI используют как сама операционная система, так и программы, функционирующие под управлением Windows.

Функции, реализованные в GDI, являются аппаратно-независимыми. Они взаимодействуют с устройством через специальную программу, называемую драйвером

устройства. Такой подход позволяет приложению и операционной системе работать на компьютерах с различным периферийным оборудованием. При появлении новых моделей видеокарт, принтеров, плоттеров необходимо подключить новый драйвер. Функции GDI

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

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

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

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

3.6.2.Восстановление изображений

Windows-приложение делит экран компьютера с другими приложениями.

Совместное использование экрана обеспечивают прямоугольные окна. Во время выполнения приложения видимая часть окна может изменяться: перекрываться другими окнами, разворачиваться на весь экран и т.п. Это требует постоянного контроля за состоянием экрана и правильного восстановления утрачиваемых частей изображения.

Операционная система не хранит копий выводимых на экран окон, но запоминает координаты разрушаемых частей окна в системной области, называемой областью обновления. Периодически у каждого окна проверяется область обновления, и если она оказывается не пустой, то приложению-владельцу посылается сообщение с требованием перерисовать окно. Приложение передаёт соответствующее сообщение форме. Форма восстанавливает утраченные части окна собственными средствами. С точки зрения формы сообщение о перерисовке – это системное событие, а формирование изображения – реакция на него. Для ускорения графического вывода Windows реализует отсечение. В

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

поместив в него вызов метода Invalidate.

Метод Invalidate определяет всю рабочую область формы как подлежащую обновлению. После вызова метода Invalidate форма не будет перерисована сразу.

Перерисовка произойдёт при очередном событии OnPaint. Если надо перерисовать форму немедленно, то следует вызвать метод Refresh.

3.6.3.Вывод графической информации в Delphi

Для построения изображений в Delphi была введена иерархия графических классов и разработаны компоненты. Средства Delphi избавляют программиста от непродуктивных потерь времени на управление ресурсами графической системы и облегчают вывод графической информации. Однако сохранена возможность работы непосредственно с функциями GDI и разрешено комбинировать использование компонентов с процедурами и функциями графической системы Windows. Для обращения к функциям GDI все графические объекты имеют целочисленное свойство Handle.

Средства Delphi позволяют выводить заранее подготовленные изображения и рисовать из программы. Первый способ не требует программирования и прекрасно подходит для вывода статических изображений. Он основан на использовании компонентов Image и Shape. Второй способ требует определённых навыков программирования, но предоставляет больше возможностей для динамического создания изображений. Он основан на использовании доступного программно свойства Canvas.

Построение изображения выполняется в обработчике события OnPaint.

3.6.4.Классы и компоненты для работы с графикой

Для работы с графикой определены классы TGraphic, TPicture, TGraphicObject, TCanvas.

TGraphic – это абстрактный класс для инкапсуляции различных графических форматов, поддерживаемых Windows. Наследниками этого класса являются TBitmap, TIcon, TMetafile.

Класс TPicture представляет собой полнофункциональный класс, содержащий всё необходимое для работы с готовыми изображениями, является контейнером для класса

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

Свойство Graphic класса TPicture указывает на тип используемого графического изображения.

Классы TGraphic и TPicture содержат ограниченное количество поддерживаемых ими форматов, однако на базе TGraphic можно создавать новые классы, которые будут поддерживать другие графические форматы.

Абстрактный класс TGraphicObject является родительским по отношению к классам

TFont, TBrush, TPen. Классы TFont, TBrush, TPen используются только в качестве свойств других классов.

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

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

3.6.5.Программное рисование

Класс TCanvas инкапсулирует основные операции модуля GDI. Canvas – это поверхность рисования (холст, канва). Форма и все визуальные управляющие компоненты

Delphi обладают свойством Canvas. Конструктор Create создаёт экземпляр класса TCanvas

со свойствами: Brush, Pen, Font, CopyMode, ClipRect, PenPos, Pixels.

Brush, Pen и Font называютcя инструментами для рисования.

Свойство ClipRect (только для чтения) задаёт координаты отсекающего прямоугольника. За пределами этой прямоугольной области изображение не строится.

Свойство CopyMode устанавливает режим копирования. Значение свойства cmSrcCopy

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

Свойство PenPos – это текущая позиция карандаша – невидимый маркер, который задаётся горизонтальной PenPos.x и вертикальной PenPos.y координатами. Pixels[X,Y: integer]:color представляет собой массив, содержащий цвета пикселей. Для доступа к отдельному пикселю достаточно указать его координаты.

При построении графических изображений часто используются классы TPoint и TRect, задающие координаты точки и прямоугольную область:

TPoint=record

x:Longint;

y: Longint; end;

TRect=record

Case integer of

0:(Left,Top,Right,Bottom:integer); 1:(TopLeft, BottomRight: TPoint);

end;

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

выходящих из одной точки.

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

Рис.3. Построение изображения с использованием рекурсии У «регулярного» дерева на каждом шаге длины отрезков и углы одинаковы. Во

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

Фрагмент кода, реализующего «регулярное» дерево, приведён ниже. Процедура

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

procedure Branch1(x,y,l,f,df,l_min:integer; r:real); const u=0.01745;

var

x1,x2,y1,y2,f1,f2:integer;

t1,t2:real;

begin

t1:=f-df;

x1:=x+round(l*cos(t1*u));

y1:=y+round(l*sin(t1*u));

t2:=f+df;

x2:=x+round(l*cos(t2*u));

y2:=y+round(l*sin(t2*u));

with Form1.PaintBox1 do

begin

canvas.moveTo(x1,y1);

canvas.lineTo(x,y);

canvas.lineTo(x2,y2);

l:=round(l*r);

if l>l_min then

begin

f1:=f-df;

branch1(x1,y1,l,f1,df,l_min,r); //Рекурсивный вызов процедуры

f2:=f+df;

branch1(x2,y2,l,f2,df,l_min,r);//Рекурсивный вызов процедуры

end;

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

branch1(150,250,50,-90,10,5,0.8);

end;

3.7. Обработка исключительных ситуаций в Delphi

Исключительная ситуация – это некоторое ошибочное состояние, возникающее во время выполнения программы. Исключительные ситуации (исключения) могут возникать по самым разным причинам, например из-за невозможности выполнить преобразование,

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

В Delphi предусмотрен глобальный обработчик исключительных ситуаций и могут быть задействованы локальные обработчики. Глобальная обработка исключений реализуется через объект Application. Глобальная обработка обеспечивает пользователя информацией об ошибке, но не устраняет причины.

Локальная обработка исключительных ситуаций позволяет при возникновении ошибки перейти к специально подготовленному коду программы. Такой подход реализуется с помощью языковых конструкций, которые как бы «охраняют» фрагмент кода программы и определяют обработчики ошибок, которые будут вызываться, если в защищённом участке кода что-то пойдет не так, как предполагалось.

Для обозначения начала защищенного участка кода используется служебное слово try, завершается конструкция словом end. Существует два типа защищенных участков: try...except и try...finally, которые имеют похожий синтаксис, но отличаются по назначению. Первый тип используется для обработки исключительных ситуаций. Его синтаксис:

try

{Операторы, выполнение которых может вызвать ошибку}

except

{Операторы, которые должны быть выполнены в случае ошибки}

end;

Конструкция try...except применяется для перехвата исключительной ситуации и позволяет восстановить работоспособность программы. Секция except может быть разбита на несколько частей on...do для обработки разных классов исключений. После конструкций on...do может быть помещён раздел else, который относится ко всему блоку.

По логике работы группа конструкций on...do напоминает оператор case. К исключениям,

не имеющим своих локальных обработчиков, применяется механизм глобальной обработки через объект Application.

try

{Операторы, выполнение которых может вызвать ошибку}

except

{ Операторы, которые должны быть выполнены в случае ошибки} on Exception1 do ...;

on Exception2 do ...;

...

else

...

end;

Рассмотрим следующий пример. В поля Edit1 и Edit2 записываются целые числа.

При щелчке по кнопке Button1 выполняется перевод введённых строк в числовой формат,

первое число делится на второе и результат выводится в Edit3. Затем в Memo1

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

Внимание! При тестировании приложений желательно пользоваться созданным exe-файлом. Запускать приложения из Delphi можно, но при этом надо учитывать, что при возникновании исключительной ситуации, прежде всего, сработает система защиты Delphi. При появлении системного сообщения его надо прочитать, окно сообщения закрыть и выполнить команду Run для продолжения работы.

procedure TForm1.Button1Click(Sender: TObject);

Var a,b:integer;

rez:extended;