Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 8 лет назад пользователемЕлизавета Репнина
1 1 Часть 3 Создание приложений Windows Введение. Особенности программирования «под Windows» Управление техническими средствами осуществляется через API (Application Program Interface) – набор из нескольких тысяч функций, выполняющих все системно-зависимые действия, такие как выделение памяти, вывод на экран и т.д. Функции API сгруппированы в DLL (Dynamic Link Library).
2 2 Принцип событийного управления Приложение – набор подпрограмм, вызываемых при наступлении некоторого события, которым считается любое изменение в системе, касающееся данного приложения. Каждому приложению на экране соответствует окно. Окно – самостоятельно существующий объект, параметры которого хранятся в специальной структуре данных, а поведение определяется обработчиками сообщений, составляющими оконную функцию.
3 3 Структура приложения Минимально любое приложение Windows состоит из двух частей: основной программы и оконной функции. Появившиеся в очереди сообщения выбираются циклом обработки сообщений и передаются через Windows соответствующей оконной функции приложения. Для выполнения действий обработчики сообщений обращаются к функциям API.
4 4 Обработка сообщения от клавиатуры
5 5 Завершение приложения
6 6 Глава 8 Программирование в среде Delphi с использованием библиотеки VCL 8.1 События Delphi и их обработчики Обработчики сообщений Windows предусмотрены у объектов класса TForm и классов управляющих компонентов, таких как кнопки, редакторы и т. п. Обработка выполняется следующим образом: 1. В системе происходит событие, например, пользователь пере- двинул мышь или нажал на клавишу клавиатуры, в результате генерируется сообщение об этом событии – сообщение Windows. 2. Сообщение Windows диспетчируется конкретному приложению. 3. В приложении сообщение передается активному компоненту (окну или управляющему элементу). 4. Метод обработки сообщения Windows компонента инициирует заранее предусмотренные события Delphi. 5. Если в приложении предусмотрен соответствующий обработчик события Delphi, то он вызывается, если нет – то продолжается обработка сообщения Windows.
7 7 События Delphi Обработчики сообщений Windows, встроенные в классы компонентов VCL, инициируют множество событий Delphi. Например, обработчик события клавиатуры WM_CHAR класса TForm инициирует три события Delphi. Событие Delphi Сообщение Windows
8 8 Для каждого обработчика событий предусмотрен заголовок и определенный список передаваемых ему параметров. а) procedure TForm1.FormActivate(Sender:TObject); Параметр Sender – отправитель (инициатор события). б) procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); Параметр Key – символ ANSI. в) procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); Параметры: Key – виртуальный код, Shift – управляющие клав. г) procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); Обработчики событий Delphi Имя компонента Имя события Delphi
9 9 Основное окно приложения строится на базе класса TForm. При входе в Delphi предоставляется заготовка приложения, которая «умеет» (содержит определенные обработчики сообщений Windows) выполнять стандартные действия. Свойства: Caption – заголовок окна (по умолчанию Form1); FormStyle – вид формы(обычное, родительское, дочернее, неперекрываемое); Width, Height, Top, Left – размеры и местоположение; Color – цвет фона; Font – характеристики шрифта; Cursor – форма курсора мыши и т. д. Методы: Show – показать; Hide – спрятать; Close – закрыть; ShowModal – показать в модальном режиме и т. д. 8.2 Класс формы TForm TForm TForm1 Компоненты Обработчики событий
10 10 а) при изменении состояния формы: OnCreate – в начальной стадии создания формы - используется при необходимости задания параметров (цвет или размер); OnActivate – при получении формой фокуса ввода (окно становится активным и ему адресуется весь ввод с клавиатуры); OnShow – когда форма (окно) становится видимой; OnPaint – при необходимости нарисовать или перерисовать форму; OnResize - при изменении размеров формы на экране; OnDeactivate – при потере формой фокуса ввода (окно становится неактивным); OnHide – при удалении формы с экрана (окно становится невидимым); OnCloseQuery – при попытке закрыть форму - обычно используется для создания запроса-подтверждения необходимости закрытия окна; OnClose – при закрытии формы; OnDestroy – при уничтожении формы; События Delphi обрабатываемые объектами класса TForm
11 11 б) от клавиатуры и мыши: OnKeyPressed – при нажатии клавиш, которым соответствует код ASCII; OnKeyDoun, OnKeyUp – при нажатии и отпускании любых клавишI; OnClick, OnDblClick – при обычном и двойном нажатии клавиш мыши; OnMouseMove – при перемещении мыши (многократно); OnMouseDown, OnMouseUp – при нажатии и отпускании клавиш мыши; в) при перетаскивании объекта мышью: OnDragDrop – в момент опускания объекта на форму; OnDragOver – в процессе перетаскивания объекта над формой (многократно); г) другие; OnHelp – при вызове подсказки; OnChange – при изменении содержимого компонент. События Delphi для класса TForm (2)
12 12 1. Метка (класс TLabel) Метка – окно с текстом и может использоваться для формирования на форме некоторых надписей или подписей. Основные свойства: Caption – заголовок – текст, выводимый в окне компонента. Name – имя компонента в программе. Visible – определяет видимость компонента. Alignment – определяет способ выравнивания текста в окне компонента: taCenter - по центру; taLeftJustify - по левой границе; taRightJustify - по правой границе. Font – определяет шрифт текста. Color – определяет цвета текста и фона в окне. WordWrap – определяет, разбивать или нет текст на строки. Transparent – определяет, виден ли рисунок фона через окно. 8.3 Основные визуальные компоненты и средства визуализации сообщений пользователю
13 13 2. Строчный редактор (класс TEdit) Компонент представляет собой окно, обычно выделенное цветом, которое может использоваться, например, для организации ввода информации. Основные свойства: Text – строка текста. ReadOnly – определяет возможность ввода информации в окно. Name – имя компонента в программе. Visible – определяет видимость компонента. Enable – доступность компонента. Основные методы: Clear – очистка поля Text. SetFocus – установка фокуса ввода. Основные события: OnKeyPressed – нажатие алфавитно-цифровой клавиши. Основные визуальные компоненты (2)
14 14 3. Кнопка Компонент представляет собой окно, в котором размещается название кнопки. Используется для инициирования каких-либо действий. Основные свойства: Caption - название кнопки. Name – имя компонента в программе. Visible – определяет видимость компонента. Enable – доступность компонента. Default – определяет, генерируется ли событие OnClick для данной кнопки при нажатии клавиши Enter. Cancel – аналогично, но для клавиши Esc. Основные события: OnClick – «щелчок» мышкой в зоне компонента. Основные методы: SetFocus – установка фокуса ввода. Основные визуальные компоненты (3)
15 15 1 Метод MessageBox (класс TApplication) function MessageBox(Text, Caption: PChar; Flags:Longint=MB_OK):Integer; Пример: Application.MessageBox('Строка пуста', 'Error',mb_Ok); Возвращает код ответа. 2 Функция MessageDlg function MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Word; Пример: MessageDlg('Поле пусто',mtError, [mbOk],0); Средства визуализации сообщений пользователю
16 16 Вычисление квадрата заданного числа Form1: Name:=MainForm; Caption:='Возведение числа в квадрат'; Label1: Name:='InputLabel'; Caption:='Введите число'; Label2: Name:=OutPutLabel; Caption:='Квадрат числа равен:'; Edit1: Name:=InputEdit; Edit2: Name:=OutPutEdit; Enable:=false; ReadOnly:=true; Button1: Name:=NextButton; Caption:='Следующее'; Button2: Name:=ExitButton; Caption:='Выход';
17 17 Формы интерфейса
18 18 Диаграмма состояний интерфейса Нормальное состояние
19 19 Объектная декомпозиция
20 20 Определение обрабатываемых событий по диаграмме состояний интерфейса С1 – активация формы; С2 – ввод Enter; С3 – нажатие кнопки Выход; С4 – нажатие кнопки Следующее; С5 – нажатие кнопки OK
21 21 Диаграмма классов приложения
22 22 Program Ex8_01; Uses Forms, MainUnit in 'MainUnit.pas' {MainForm}; {$R *.RES} begin Application.Initialize; Application.CreateForm(TMainForm, MainForm); Application.Run; end. Файл проекта
23 23 Unit MainUnit; interface Uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; Type TMainForm = class(TForm) Bevel1: TBevel; NextButton, ExitButton: TButton; InputLabel, OutPutLabel: TLabel; InPutEdit, OutPutEdit: TEdit; procedure FormActivate(Sender: TObject); procedure InPutEditKeyPress(Sender: TObject; var Key: Char); procedure NextButtonClick(Sender: TObject); procedure ExitButtonClick(Sender: TObject); private { Private declarations } public { Public declarations } end; Файл MainUnit
24 24 var MainForm: TMainForm; implementation {$R *.DFM} procedure TMainForm.FormActivate(Sender: TObject); begin NextButton.Enabled:=false; InPutEdit.ReadOnly:=false; InPutEdit.Clear; InPutEdit.Enabled:=true; InPutEdit.SetFocus; OutPutLabel.Visible:=false; OutPutEdit.Visible:=false; end; Файл MainUnit (2)
25 25 procedure TMainForm.InPutEditKeyPress(Sender: TObject; var Key: Char); var x:real;Code:integer; begin If Key=#13 then begin Key:=#0; Val(InPutEdit.Text,x,Code); if Code=0 then begin InputEdit.ReadOnly:=true; InputEdit.Enabled:=false; OutPutLabel.Visible:=true; OutPutEdit.Visible:=true; OutPutEdit.Text:=floattostr(sqr(x)); NextButton.Enabled:=true; NextButton.SetFocus; end Файл MainUnit (3)
26 26 else begin MessageDlg('Недопустимые символы.',mtError, [mbOk], 0); end end; procedure TMainForm.NextButtonClick(Sender: TObject); begin FormActivate(NextButton); end; procedure TMainForm.ExitButtonClick(Sender: TObject); begin Close; end; end. Файл MainUnit (4)
27 27 Дополнительные скалярные типы данных а) целый Cardinal без знака 4 байта б) логические ByteBool 1 байт WordBool 2 байта LongBool 4 байта в) символьные ANSIChar 1 байт (ANSI) WideChar 2 байта (Unicode) г) вещественные – денежный: Currency байт 8.4 Более сложные элементы Delphi Pascal true – любое число, кроме 0
28 28 Тип «Дата-время» д) TDateTime - Double – целая часть – число дней с , дробная – часть дня Пример: Для работы используются следующие подпрограммы: 1) function Now:TDateTime – возвращает текущую дату и время; 2) function Date:TDateTime – возвращает текущую дату; 3) function Time:TDateTime – возвращает текущее время; 4) function DateTimeToStr(D:TDateTime):String – преобразует дату и время в строку символов; 5) function DateToStr(D:TDateTime):String – преобразует дату в строку символов; 6) function TimeToStr(D:TDateTime):String – преобразует время в строку символов;
29 29 Тип «Дата-время» 7) function StrToDate(S:String):TDateTime – преобразует строку в дату, разделитель – символ, указанный при настройке Windows, формат: день.месяц[.год]; 8) function StrToTime(S:String):TDateTime – преобразует строку во время, разделитель – символ, указанный при настройке Windows, формат: часы.минуты[.секунды][ am или pt]; 9) function StrToDateTme(S:String):TDateTime – преобразует строку в дату-время, разделители – символы, указанный при настройке Windows, формат: день.месяц[.год] часы:минуты[.секунды][ am или pt]; 10) procedure DecodeDate(D:TDateTime:Var Year,Month,Day:Word) – декодирует дату; 11) procedure DecodeTime(D:TDateTime: Var Hour,Min,Sec,MSec:Word) – декодирует время;
30 30 Строковые типы a) ShortString – до 255 символов, 0-й байт – длина строки; б) AnsiString – указатель на строку ANSI символов, WideString – указатель на строку символов Unicode: в) String: {$H+} == ANSIString ; {$H-} == ShortString ; Исключение! String[ ] – всегда ShortString Для перечисленных строк определены операции конкатенации и сравнения, а также специальные функции в System и SysUtils г) PChar – указатель на массив символов, завершающийся нулем. Строки совместимы: :=
31 31 Дополнительные процедуры и функции 1) function ANSILowerCase(const S:String):String – заменяет прописные буквы на строчные; 2) function ANSIUpperCase(const S:String):String – заменяет строчные буквы на прописные; 3) function StrToInt(S:String):Integer – преобразует строку в целое число; 4) function StrToIntDef(S:String; Default:Integer):Integer – то же + возвращает код ошибки; 5) function StrTo IntRange(S:String; Min..Max:LongInt):LongInt – то же + генерирует исключение ERangeError, если не входит в диапазон; 6) function StrToFloat(S:String):Extended – преобразует строку в вещественное число, в качестве разделителя использует символ, указанный при настройке Windows;
32 32 Дополнительные процедуры и функции (2) 7) function IntToStr(V:Integer):String – преобразует целое число в строку символов; 8) function IntToHex(V:Integer; Digits:Integer):String – преобразует целое число в строку шестнадцатеричных символов, минимальной длиныDigits; 9) function FloatToStr(V:Extended):String – преобразует вещественное число в строку символов.
33 33 1. Изменены некоторые служебные слова и названия процедур: Text TextFile Assign AssignFile Close CloseFile Файлы
34 34 Процедурный тип данных 1) При объявлении указателя на метод добавляют of object Пример: Type metodproc = procedure(Sender:TObject) of object; 2) Переменным процедурного типа можно присвоить nil и проверять их значение при необходимости Пример: if Assigned(p2) then p2(x,y);
35 35 {$Jx} – управляет способом объявления инициализированных переменных: + – для объявления инициализированной переменной используются типизированные константы, например: Const x:single=5.1; {x – фактически переменная} - – можно объявлять инициализированной переменной, например: Var x:single=5.1; {x – фактически переменная} {$Bx} – управляет способом вычисления логических выражений: + – полное: function NumRead:integer; … if (NumberRead>0) and (NumberRead>0) then … -– укороченное: if (i>=Low(Arr))and(i<=High(Arr))and(Arr[i]<0) then … 8.5 Опции компилятора
36 36 {$Xx} – разрешение расширенного синтаксиса: - вызова функций как процедур; - поддержка pChar; {$Px} – использование открытых параметров(+); {$Hx} – использование в качестве String ShortString(-) или AnsiStrings(+); {$Rx} – контроль(+) индексов массивов и строк; {$Ix} – контроль(+) операций ввода/вывода; {$Qx} – контроль переполнения(+) при выполнении операций над целыми числами Опции компилятора (2)
37 События Мыши 1 Событие «Нажатие кнопки мыши над компонентом окна приложения»: procedure MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); где Button:TMouseButton - определяет, какая кнопка нажата: type TMouseButton = (mbLeft, mbRight, mbMiddle); - соответственно, левая, правая или средняя кнопки. Shift:TShiftState - определяет нажатые управляющих клавиш клавиатуры и мыши: type TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble); X, Y: Integer - координаты мыши относительно компонента.
38 38 События Мыши (2) 2 Событие «Движение мыши»: procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 3 Событие «Отпускание клавиши мыши»: procedure MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
39 39 Управление экраном в текстовом режиме
40 40 Управление экраном в графическом режиме Windows работает в графическом режиме.
41 Создание графических изображений Изображения в Windows создаются с помощью типов: точка, прямоугольник; и компонентов: перо, которое используется для рисования линий; кисть, которая используется для закрашивания замкнутых фигур; шрифт, который используется при выводе надписей; холст, на котором выполняются изображения.
42 42 Точка и прямоугольник Точка – тип, позволяющий определить точку на экране: type TPoint = record X: Longint; Y: Longint; end; Прямоугольник – тип, используемый для задания прямоугольника: type TRect = record case Integer of 0: (Left, Top, Right, Bottom: Integer); 1: (TopLeft, BottomRight: TPoint); end;
43 43 Компонент перо (класс TPen ) C помощью класса TPen создается объект Перо, служащий для вычерчивания линий, контуров и т. п. Свойства: Color:TColor – цвет вычерчиваемых линий; Width:Integer – толщина линии в пикселях экрана; Style:TPenStyle – стиль линий – учитывается только для толщины 1 пиксель: psSolid, psDash, psDot, psDashDot, psDashDotDot, psClear, psInsideFrame; Mode:TPenMode – способ взаимодействия линий с фоном, например, pmBlack – только черные линии, pmWhite – только белые линии, pmNop – линии не видны на фоне, pmNot – инверсия фона и т.д..
44 44 Компонент Кисть (класс TBrush ) Объекты класса TBrush служат для заполнения внутренего пространства. Свойства: Color:TColor – цвет кисти: clAqua (прозрачный), clBlack, clBlue, clDkGray, clFuchsia, clGray, clGreen, clLime (салатовый), clLtGray, clMaroon (каштановый), clNavy (синий), clOlive, clPurple (фиолетовый), clRed, clSilver (серебряный), clTeal, clWhite, clYellow Style:TBrushStyle – стиль кисти, например: bsSolid, bsClear, bsHorizontal, bsVertical, bsFDiagonal,bsBDiagonal, bsCross, bsDiagCross; BitMap:TBitMap – растровое изображение, которое будет использоваться кистью для заполнения, если свойство определено, то цвет и стиль игнорируются.
45 45 Компонент Шрифт (класс TFont ) Объект класса TFont – определяет шрифт, которым выводится текст. Свойства: Charset:TFontCharSet – набор символов: RUSSIANCHARSET – русский, OEM_CHARSET – текст MS DOS; Name:TFontName – имя шрифта, по умолчанию – MS Sans Serif; Color:TColor – цвет; Height:Integer – высота в пикселях; Size:Integer – высота в пунктах (1/7 дюйма); Pitch:TFontPitch – способ расположения букв в тексте: fpFixed – моноширный текст, fpVariable – пропорциональный текст, fpDefault – ширина шрифта по умолчанию; Style:TFontStyle – стиль шрифта – комбинация из: fsBold – полужирный, fsItalic – курсив, fsUnderline – подчеркнутый, fsStrikeOut – перечеркнутый.
46 46 Компонент Канва (класс TCanvas) Класс создает Канву – холст для рисования. Свойства: Brush:TBrush – кисть; Pen:TPen – перо; Font:TFont – шрифт; PenPos:TPoint – определяет текущее положение пера над холстом в пискелях относительно левого верхнего угла; CopyMode:TCopyMode – способ взаимодействия растрового изображения с цветом фона, используется при копировании части канвы на другую методом CopyRect: cmBlackness – заполнение черным цветом, cmDestInvert – заполнение инверсным фоном, cmSrcCopy – копирует изображение источника на канву и т.д.; Pixels[X,Y:Integer]:TColor – массив пикселей канвы.
47 47 Основные методы класса TCanvas procedure MoveTo(X,Y:Integer) – перемещает перо в указанную точку; procedure LineTo(X,Y:Integer) – чертит линию из текущей точки в заданную; procedure Rectangle(X1, Y1, X2, Y2: Integer) – рисует и закрашивает кистью прямоугольник; procedure Polyline(Points:array of TPoint) – рисует ломаную линию; type TPoint = record X,Y:Longint; end; procedure Polygon(Points: array of TPoint) – рисует и закрашивает кистью многоугольник; procedure Ellipse(X1, Y1, X2, Y2: Integer) – рисует эллипс в заданном прямоугольнике и закрашивает кистью; procedure FrameRect(const Rect:TRect) – очерчивает границы прямоугольника текущей кистью без заполнения; X, Y X1,Y1 X2,Y2
48 48 Основные методы класса TCanvas (2) procedure Arc(X1,Y1,X2,Y2,X3,Y3, X4,Y4:integer) – чертит дугу эллипса в прямоугольнике (X1,Y1,X2,Y2), направление – против часовой стрелки; procedure Chord(X1,Y1,X2,Y2,X3,Y3, X4,Y4:integer ) – чертит сегмент эллипса в прямоугольнике (X1,Y1,X2,Y2), направление – против часовой стрелки; procedure Pie(X1,Y1,X2,Y2,X3,Y3, X4,Y4:integer ) – чертит сектор эллипса в прямоугольнике (X1,Y1,X2,Y2), направление – против часовой стрелки; procedure RoundRect(X1,Y1,X2,Y2, X3,Y3:integer ) – чертит и заполняет прямоугольник с закругленными краями. X1,Y1 X3,Y3 X2,Y2 X4,Y4 Центр X1,Y1 X3,Y3 X2,Y2 X4,Y4 Центр X1,Y1 X3,Y3 X2,Y2 X4,Y4 Центр X1,Y1 X2,Y2 X3,Y3
49 49 Основные методы класса TCanvas (3) procedure FillRect(const Rect: TRect) – закрашивает кистью прямоугольник, включая левую и верхнюю границы. type TRect = record case Integer of 0: (Left, Top, Right, Bottom: Integer); 1: (TopLeft, BottomRight: TPoint); end; procedure FloodFill(X,Y:Integer;Color:TColor; FillStyle:TFillStyle) – type TFillStyle = (fsSurface,fsBorder); FillStyle=fsBorder - заливка области с границей цвета Color; FillStyle=fsSurface - заливка области цвета Color цветом, определенным кистью.
50 50 Основные методы класса TCanvas (4) procedure TextOut(X,Y:Integer; const Text:string) – вывод строки текста шрифтом TFont в прямоугольник с верхним левым. углом в точке (X,Y); function TextExtent(Const Text:String):TSize – возвращает ширину и высоту прямоугольника, охватывающего текстовую строку Text ; function TextWidth(Const Text:string):Integer – возвращает ширину прямоугольника, охватывающего текстовую строку; ТЕКСТ X,Y
51 51 Компонент Образ (класс TImage) Образ – окно для работы с графикой. Свойства: AutoSize:Boolean – автоматическое изменение размера компонента в зависимости от размера картинки (при загрузке рисунка); Stretch:Boolean – автоматическое масштабирование рисунка при изменении размеров компонента; Picture:TPicture – свойство-объект картинка (двоичный образ, пиктограмма, графический метафайл); класс включает методы: procedure LoadFromFile(const FileName: string); – загрузка картинки из файла; procedure SaveToFile(const FileName: string); – сохранение картинки в файле. Canvas:TCanvas – холст; Brush:TBrush – кисть; Pen:TPen – перо; Font:TFont – шрифт.
52 52 Рисование прямоугольников (Ex8_2)
53 53 Модуль MainUnit unit MainUnit; interface Uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TMainForm = class(TForm) Image: TImage; ExitButton: TButton; procedure FormActivate(Sender: TObject); procedure ImageMouseDown(Sender: TObject; Button:TMouseButton; Shift:TShiftState; X,Y:Integer); procedure ImageMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); procedure ImageMouseUp(Sender: TObject; Button:TMouseButton;Shift: TShiftState;X,Y: Integer); procedure ExitButtonClick(Sender: TObject); end;
54 54 Модуль MainUnit (2) var MainForm: TMainForm; implementation Var Rect:TRect;first:boolean; {$R *.DFM} procedure TMainForm.FormActivate(Sender: TObject); begin Image.Canvas.Brush.Color:=clWhite; end; procedure TMainForm.ImageMouseDown(Sender: TObject; Button:TMouseButton;Shift:TShiftState;X,Y:Integer); begin if Button=mbLeft then begin Rect.Left:=x; Rect.Top:=y; first:=true; end;
55 55 Модуль MainUnit (3) procedure TMainForm.ImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if ssLeft in Shift then begin if first then first:=not first else begin Image.Canvas.Pen.Color:=clWhite; Image.Canvas.Rectangle(Rect.Left,Rect.Top, Rect.Right,Rect.Bottom); end; Rect.Right:=X; Rect.Bottom:=Y; Image.Canvas.Pen.Color:=clBlack; Image.Canvas.Rectangle(Rect.Left,Rect.Top, Rect.Right,Rect.Bottom); end;
56 56 Модуль MainUnit (4) procedure TMainForm.ImageMouseUp(Sender: TObject; Button: TMouseButton;Shift:TShiftState;X,Y:Integer); begin if Button=mbLeft then begin Image.Canvas.Pen.Color:=clWhite; Image.Canvas.Rectangle(Rect.Left,Rect.Top, Rect.Right,Rect.Bottom); Rect.Right:=X; Rect.Bottom:=Y; Image.Canvas.Brush.Color:=clRed; Image.Canvas.FillRect(Rect); Image.Canvas.Brush.Color:=clWhite; Image.Canvas.Pen.Color:=clBlack; end; procedure TMainForm.ExitButtonClick(Sender: TObject); begin Close; end; end.
57 57 Построение графика функции
58 58 Отображение графика функции на экран xm ym mx= , my = , xk - x1 |ymax - ymin| kxi = (xi-x1) mx +x1+xs, kyi = (ymax-yi)*my +y1+xs.
59 59 Модуль Graphic unit Graphic; Interface Uses ExtCtrls,Graphics; Type Fn=Function(X:single):single; Procedure Run(xn, xk:single; n:integer; F:Fn; x1,y1,x2,y2:integer; Image:TImage); Implementation Procedure Run; Var arr:array[1..200] of record x,y:integer; end; x, y, dx, dxl, dyl, Fmin, Fmax, i, mx, my:single; {масштабы} xm, ym, {размер области} xs, ys:integer; {нижняя левая точка графика} s:string[10];
60
60 Модуль Graphic (2) Begin Image.Canvas.Pen.Color:=clGreen; Image.Canvas.Rectangle(x1,y1,x2,y2); {рамка} xm:=x2-x1+1; ym:=y2-y1+1; {область графика} dx:=(xk-xn)/n; {шаг просчета точек} x:=xn; y:=F(x); Fmin:=y; Fmax:=y; for i:=2 to n do begin x:=x+dx; y:=F(x); if y>Fmax then Fmax:=y; if y
61 61 Модуль Graphic (3) Image.Canvas.Pen.Color:=clRed; Image.Canvas.Pen.Width:=3; x:=xn; for i:=1 to n do begin arr[i].x:=round((x-xn)*mx)+x1+xs; arr[i].y:=round((Fmin-f(x))*my)+y1+ys; x:=x+dx; end; Image.Canvas.MoveTo(arr[1].x,arr[1].y); for i:=2 to n do Image.Canvas.LineTo(arr[i].x,arr[i].y);
62 62 Модуль Graphic (4) x:=xn; dxl:=(xk-xn)/5; Image.Canvas.Pen.Width:=1; Image.Canvas.Pen.Color:=clBlue; repeat Str(x:5:2,s); Image.Canvas.TextOut(round((x-xn)*mx)+x1+xs-13, ys+y1+5,s); Image.Canvas.MoveTo(round((x-xn)*mx)+x1+xs, ym+y1-xs); Image.Canvas.LineTo(round((x-xn)*mx)+x1+xs, y1+xs); x:=x+dxl; until x>xk ;
63 63 Модуль Graphic (5) y:=Fmin; dyl:=(fmax-fmin)/5; repeat Str(y:5:2,s); Image.Canvas.TextOut(x1+5, round(-(y-Fmin)*my)+ys+y1-6,s); Image.Canvas.MoveTo(x1+xs, round(-(y-Fmin)*my)+y1+ys); Image.Canvas.LineTo(xm+x1-xs, round(-(y-Fmin)*my)+y1+ys); y:=y+dyl; until y>Fmax ; end; End.
64 64 Секция реализации модуля MainUnit implementation uses Graphic; {$R *.dfm} Function f(x:single):single; far; Begin Result:=abs(0.64*sin(x*2)); End; procedure TMainForm.FormActivate(Sender: TObject); begin Image.Canvas.Brush.Color:=clWhite; end; procedure TMainForm.BeginButtonClick(Sender: TObject); begin Run(-0.9,0.9,100,f,0,0,400,300,Image);end; procedure TMainForm.ExitButtonClick(Sender: TObject); begin Close; end; end.
65 65 DLL – модуль, компонуемый во время выполнения программы. Находится в памяти, пока счетчик использования > 0. DLL может содержать только процедуры и функции. Структура DLL: Library ; Exports Begin End. Секция реализации содержит описание подпрограмм. Секция экспортирования используется для описания экспортируемых процедур и функций. Секция инициализации – выполняется при загрузке в память. 8.8 Динамически подключаемые библиотеки Если в dll описана процедура или функция, которая в качестве параметров или возвращаемого результат передает строку ANSIString или WideString, то и библиотека и проект должны подключать интерфейс модуля разделения памяти, который должен указываться первым: Uses ShareMem,...;
66 66 Описание подпрограмм в секции реализации может включать указание о способе передачи параметров: pascal – передача по правилам Pascal; register – передача по правилам Pascal с использованием регистров; cdecl – передача по правилам C; stdcall – передача по правилам Windows. Пример: function A(x:Integer;D:real):double;pascal; Способы передачи параметров
67 67 Export [index [ ][name ][resident],…; Псевдоним используется, если имя совпадает с именем программы. Индексы используют для ускорения поиска подпрограммы. Resident означает, что информация о местонахождении программы должна сохраняться в таблице системы – ускоряет поиск подпрограммы. Пример: Export Max, Min index 1, Bin name Binery; Объявление экспортируемых подпрограмм
68 68 Импортируемые подпрограммы должны быть описаны в модуле. Импорт возможен: 1) по имени: procedure ;external ; 2) по индексу: procedure ;external index ; 3) по псевдониму: procedure ;external name ; Желательно создавать модули импорта. Импорт процедур и функций
69
69 Library Vector; Function VectMax(Vect:array of integer):Integer; Var i:Word; Begin Result:=Vect[0]; for i:=1 to High(Vect) do if Result
70 70 Unit Main; Interface Uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, Grids; Type TMainForm = class(TForm) InputButton, MaxButton, MinButton : TButton; V: TStringGrid; MaxEdit, MinEdit: TEdit; procedure InputButtonClick(Sender: TObject); procedure MaxButtonClick(Sender: TObject); procedure MinButtonClick(Sender: TObject); end; Программа проверки
71 71 Var MainForm: TMainForm; Implementation Uses Import; {$R *.dfm} Var A:array[1..5] of Integer; procedure TMainForm.InputButtonClick(Sender: TObject); Var i:word; begin for i:=1 to 5 do A[i]:= StrtoInt(V.Cells[i-1,0]); end; procedure TMainForm.MaxButtonClick(Sender: TObject); begin MaxEdit.Text:=IntToStr(VectMax(A)); end; procedure TMainForm.MinButtonClick(Sender: TObject); begin MinEdit.Text:=IntToStr(VectMin(A)); end; end. Программа проверки (2)
72 72 unit Import; interface function VectMax(Vect:array of Integer):Integer; function VectMin(Vect:array of Integer):Integer; implementation function VectMax; external 'Vector.dll'; function VectMin; external 'Vector.dll'; end. Модуль импорта
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.