КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Interface. PDerevo=ADerevo Derevo=record
Type PDerevo=ADerevo Derevo=record Key:word; Info: string; Left,Right: Pderevo; End;. В заключение рассмотрим такую задачу. Пусть требуется построить очередь для данных, содержащихся в текстовом файле a. txt. Можно записать:
Здесь указатель pbegin является идентификатором начала очереди, поэтому ему еще до начала цикла выделяется память (New (Pbegin);). Указатель pend необходим для запоминания последнего элемента очереди. Вспомогательный указатель р позволяет обеспечить циклические вычисления. Цикл построен так, что указатель Pend постоянно продвигается по списку, обеспечивая добавление очередного элемента в конец очереди.
ПРИМЕР ПРИЛОЖЕНИЯ 19 Среда Delphi содержит встроенный класс TList, с помощью которого можно создавать однонаправленные списки. Этот класс предназначен для организации списка указателей на размещенные в адресном пространстве какие-либо структуры данных и обеспечивает эффективную работу с элементами списка. Доступ к отдельному элементу списка осуществляется посредством индексированного свойства ItemsfIndex]. Нумерация элементов начинается с нуля. Элементы списка можно добавлять в его конец с помощью метода Add или в середину, используя метод Insert. Можно реализовать сортировку элементов с помощью метода Sort. Однако, так как заранее состав структуры, на которую указывают указатели списка, неизвестен, необходимо методу Sort передавать адрес разрабатываемой программистом процедуры попарного сравнения каких-либо полей, входящих, в состав структуры отдельного элемента списка. Список создается посредством стандартного конструктора Create. Соответственно необходимо обеспечить его удаление в приложении с помощью деструктора Free. Интерфейс и возможности приложения можно увидеть, изучая вариант решения данного примера (рис. 44). Окружности рисуют, используя обработчик ImagelMouseDown. В примере 19 реализуется запись в список TList некоторой структуры данных, представляющей собой следующий тип (Туре), используемый для рисования окружностей: pMyList = ^AList; AList = record numP: Integer; xP,yP:integer; r:integer; Col: TColor; end;. Здесь numP - номер окружности; xp, yP - координаты центра окружности; r-радиус; Col - цвет. Данное приложение состоит из трех модулей: основная форма, вспомогательная форма для ввода цвета рисования и третья форма, служащая для поиска и рисования заданного элемента. Ниже приводится текст программы основного модуля. unit Unit1ist; interface uses Windows, Messages, SysUtils, Variants, Classes,Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Buttons,UnitSearch; type TForm1 = class (TForm) Edit1: TEdit; Label1: TLabel; Label2: TLabel; Imagel: Tlmage; Button1: TButton; Bevel1: TBevel; Button2: TButton; Button3: TButton; BitBtn1: TBitBtn; Bevel2: TBevel; Button4:TButton; ProcedureFormCreate( Sender:TObject) procedureFormClose (Sender:TObject;var Action: TCloseAction); procedure Edit1KeyPress {Sender: TObject; var Key: Char); procedure ImagelMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Button1Click (Sender: TObject); procedure Button2Click (Sender: TObject); procedure Button3Click (Sender: TObject); procedure Button4Click (Sender: TObject); public
MyList: TList; end; PMyList = ^AList; AList = record numP: Integer; xP,yP:integer; r:integer; Col: TColor; end; var Form1: TForm1; ARecord: PMyList; kZap:integer=0; implementation uses UnitColor; {$R *.dfm} procedure TForm1.FormCreate (Sender: TObject); begin MyList:= TList.Create; Imagel.Canvas.Pen.Width:= 2; end; procedure TForm1.PormClose (Sender:TObject; var Action: TCloseAction); begin Dispose(ARecord); MyList.Free; end; procedure TForm1.Edit1KeyPress (Sender: TObject; var Key: Char); begin if not {key in ['O'..'9',#8]) thenkey:=#0; end; procedure TForm1.ImagelMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin New{ARecord); ARecord^.xP:= x; ARecord^.yP:= y; if length{Edit1.Text)=0 then Edit1.Text:='0'; ARecord^.R:= StrToInt(Edit1.Text); inc(kZap); ARecord^.numP:=kZap; Form2. ShowModal; ARecordA.Col:=Form2.NewColor; MyList.Add (ARecord); with Imagel.Canvas, ARecord* do begin Pen.Color:= ARecord^.Col; Ellipse (xP - R, yP - R, xP + R, ур + R); TextOut(xP-Font.Size div 2, yP+Font.Height div 2, IntToStr(numP)); end; end; procedure TForm1.Button1Click (Sender: TObject); begin Imagel.Canvas.Brush.Color:=clWhite; Imagel.Canvas.Rectangle(0,0, Imagel.width,Imagel.Height); end; function CompareX(Iteml, Item2: Pointer): Integer; begin Result:=PMyList(Iteml)^.xP-PMyList(Item2)^.xP; end; procedure TForm1.Button2Click(Sender: TObject); var i:integer; begin MyList.Sort(OCompareX); for i:= 0 to (MyList.Count - 1) do begin ARecord:=MyList.Items[i]; ARecord^.numP:=i+l; end; end; procedure TForm1.Button3Click(Sender: TObject); var i:integer; begin for i.:= 0 to (MyList.Count - 1) do begin ARecord:= MyList.Items[i]; with imagel.Canvas, ARecord^ do begin Pen.Color:= Col; Ellipse (xP - R, yP - R, xP + R, yP + R); TextOut(xP-Font.Size div 2, yP+Font.Height div 2, IntToStr(numP)); end; end; end; procedure TForm1.Button4Click(Sender: TObject); begin Form3.Show; end; end. В основном модуле строится список, который может быть отсортирован по координате хР. Все элементы отсортированного списка вновь нумеруются в соответствии с увеличением значений координаты хР. Далее приводится программный код второго модуля. В этом модуле используется новый компонент TColorBox, который обеспечивает ввод требуемого цвета. unit UnitColor; uses Windows, Messages, SysUtils, Variants, Classes,Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls; type TForm2 = class(TForm) ColorBox1: TColorBox; Label1: TLabel; procedure ColorBox1Change(Sender: TObject); public NewColor:TColor; end; var Form2: TForm2; implementation ($R *.dfm} procedure TForm2.ColorBox1Change (Sender: TObject); begin NewColor:=ColorBox1.Selected; close; end; end. Интерфейс второй формы представлен на рис. 45. После выбора цвета осуществляется автоматический возврат в основную форму.
Рис. 45 Программный код третьего модуля приводится ниже. unit UnitSearch; interface uses Windows, Messages, SysUtils, Variants, Classes,Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls; type TForm3 = class(TForm) Label1: TLabel; Edit1: TEdit; BitBtn1: TBitBtn; Button1: TButton; Bevell: TBevel; Bevel2: TBevel; procedure Edit1KeyPress (Sender: TObject; var Key: Char) procedure Button1Clidt (Sender: TObject); end; var Form3: TForm3; implementation uses Unit1ist, UnitColor; {$R *.dfm} procedure TForm3.Edit1KeyPress (Sender: TObject; var Key: Char); begin if length(Edit1.Text)*0 then Edit1.Text:='0'; if not (key in ['0'..'9',#8]) then key:=#0; end; procedure TForm3.Button1Click (Sender: TObject); var k,i:integer; begin if length(Edit1.Text)=O then Edit1.Text:='0'; k:=StrToInt{Edit1.Text); if (k = 0) or (k > kZap) then begin ShowMessage( 'Неверно задан номер точки'); exit; end; for i:= 0 to (Form1.MyList.Count - 1) do begin ARecord:= Form1.MyList.Items [i]; if ARecord^.numP=k then begin with Canvas, ARecord^ do begin Pen.Color:= Col; Ellipse (xP - R, yP - R, xP + R, yP + R); TextOut(xP~Font.Size div 2, yP+Font.Height div 2, IntToStr(numP)); end; break; end; end; end; end. В данном модуле предусмотрено рисование окружности не на элементе bnage, а непосредственно на канве формы, которая представлена на рис. 46. Модуль UnitSearch позволяет организовать поиск заданного элемента в сформированном связанном списке. В данном проекте необходимо обратить внимание, как происходит работа, если приложение состоит из нескольких форм. Обычно имеются главная
и вспомогательные формы. Вызов других форм организуется с помощью кнопок или меню посредством метода Show (активная форма) или showHo-dal (неактивная форма). Рис. 46 1 В программе выше используются следующие вызовы других форм: Form2.ShowModal, Form3.Show. ПРОЦЕДУРНЫЙ ТИП Выше рассматривались указатели, которые позволяли работать с переменными. Однако есть указатели, обеспечивающие работу с процедурами и функциями. Такие указатели представляют собой ссылки на адреса расположения подпрограмм и являются переменными процедурного типа. Объявляется процедурный тип следующим образом: Туре Р1:Procedure; Р2;Procedure{var X,Y: real); РЗ:Function(X:integer): double; Var Q2:P2; Q3:P3;. Далее в программе может быть объявлено несколько функций с одним параметром, как указано в РЗ, например: Function Sum(X: integer): double;, Funcnion Mult (X:integer):double;. Далее можно записать следующие операторы: Q3:= sum; Y: = Q3(8); Q3:= Mult; Y:= Q3 (Z); Q2:= nil;. В качестве значения переменной процедурного типа не могут использоваться стандартные подпрограммы из модуля System. Процедурный тип используется очень широко при описании событий в классах, в которых он представляет указатели на методы. ПРОГРАММНЫЕ ЕДИНИЦЫ DLL DLL означает Dynamic Link Library {динамически компонуемая библиотека). DLL - это библиотеки, подключаемые к другим программным единицам во время их выполнения. Удобство их состоит в том, что ресурсы библиотек могут использоваться одновременно несколькими программами. Применение DLL не зависит от языка, на котором она написана. DLL составляют основу архитектуры Windows. Модель программирования на основе DLL позволяет добиться модульности всех элементов системы, а модульность операционной системы - предоставить программисту более динамичный и открытый интерфейс. DLL формируются и компилируются независимо от использующих их программ, в которых будут только обращения к подпрограммам библиотек. В отличие от модуля Unit, DLL может передавать другим программным единицам только подпрограммы, хотя сама может иметь практически те же элементы, что и, например, программа-проект. Заголовок DLL состоит из зарезервированного слова Library и имени библиотеки. Имя библиотеки совпадает с именем файла, в который записывается ее программный код. Раздел экспортирования начинается с зарезервированного слова Exports. Секция инициализации начинается с ключевого слова begin, а заканчивается end с точкой. Назначение ее такое же, как у аналогичной секции модуля Unit. Эта секция может отсутствовать. Остальные разделы могут присутствовать в любом количестве, как и в других программных единицах. При создании DLL необходимо в репозитории (см. рис. 6) выбрать соответствующий пункт. Правила написания этой программной единицы такие же, что и у программы-проекта. Отдельные части библиотеки можно поместить в модули. Основное отличие заключается в разделе экспортирования. Только подпрограммы, объявленные в этом разделе, могут быть использованы другими программными единицами. Экспортируемые подпрограммы должны иметь внутреннее (в DLL) имя и могут иметь необязательное внешнее имя, которое используется как альтернатива при импортировании, например Exports Subroutinel name AddC, Subroutine2;.
ПРИМЕР ПРИЛОЖЕНИЯ 20 Пусть требуется построить библиотеку подпрограмм работы с комплексными числами и выполнить, например, сложение двух комплексных чисел, используя эту библиотеку. Пусть в библиотеке будет содержаться пока одна функция сложения двух чисел. Так как необходимо ввести новый тип, декларация которого требуется в двух программных единицах (основной модуль, библиотека), создадим дополнительный модуль DeclComplex, содержащий только одно объявление типа. Данный пример дополним еще одной формой, в которой представим сведения о программе (рис. 47). Основная форма для этого примера представлена на рис. 48. Рис. 48 При разработке данного приложения вначале необходимо построить библиотеку. Затем создать проект с формой рис. 48. Далее последовательно добавить в этот проект модуль с формой, представленной на рис. 47, и мо-
дуль с объявлением типа Complex. Ниже приводятся тексты кодов используемых программных единиц. unit prim20; {Модуль с основной формой.}
Дата добавления: 2014-12-29; Просмотров: 404; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |