Студопедия

КАТЕГОРИИ:


Архитектура-(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. Можно записать:

ProgramPrim;      
TypePStroka = ^Stroka.;      
Stroka = record;      
Info:string;      
Sled: PStroka;      
End;      
VarT:TextFile;      
P,Pbegin,Pend:PStroka;      
S: string;      
Begin      
New(Pbegin);      
Pend:=Pbegin;      
P:=Pbegin;      
AssignFile(T,'A.txt');      
Reset(T);      
While not eof(T) do begin      
Readln(T,S);      
Pend^.Sled:=P;      
Pend:=P;      
New(P);      
End;      
Pend^.sled:=nil;      
Dispose (P);      
CloseFile(T);      
End.      

Здесь указатель 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; Просмотров: 383; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.065 сек.