Ф Е Д Е Р АЛ Ь Н О Е АГ Е Н Т С Т В О П О О Б Р АЗО В АН И Ю В О Р О Н Е Ж С К И Й Г О С У Д АР С Т В Е Н Н Ы Й У Н И В ...
10 downloads
221 Views
690KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Ф Е Д Е Р АЛ Ь Н О Е АГ Е Н Т С Т В О П О О Б Р АЗО В АН И Ю В О Р О Н Е Ж С К И Й Г О С У Д АР С Т В Е Н Н Ы Й У Н И В Е Р С И Т Е Т
С адовская О .Б .
П рограммирование в среде Delphi Часть II С оздание оконныхприлож ений У ч ебное пособие С пециальность 010100 (510100) – М атематика
В О РО Н Е Ж 2006
2 У тверж д ен о н а у чн о-м етод ическим совет ом м а т ем а т ического ф а ку льт ет а 9 д ека б ря 2005 год а , прот окол № 4
А вт ор Са д овска я О.Б. Рецен зен т
д оцен т , к. ф -м . н .
В .Ю . Са н д б ерг
У чеб н ое пособ ие под гот овлен о н а ка ф ед ре ф у н кцион а льн ого а н а лиза и опера т орн ых у ра вн ен ий м а т ем а тического ф а ку льт ета В орон еж ского госу д а рст вен н ого у н иверсит ет а . Реком ен д у ет ся д ля ст у д ен т ов 2 ку рса д н евн ого от д елен ия м а т ем а т ического ф а ку льт ет а , об у ча ю щихся по специа льн ости «м а т ем а т ика » (010100).
3
2.1 К лассы и объ екты О снов ны е пр и нци пы объе кт но-ор и е нт и р ов анногопр огр ам м и р ов ани я Об ъект н ый т ип в Object Pascal н а зыва ет ся class. Описа н ие типа class н а пом ин а ет описа н ие типа record (за пись), н о тип class кром е описа н ия полей д а н н ых сод ерж ит ещё м ет од ы (процед у ры и ф у н кции). Об ъект в Object Pascal э т о кон крет н ый э кзем пля р кла сса , который пон им а ет ся ка к д ин а м ическа я стру кт у ра . Перем ен н а я -об ъект сод ерж ит н е д а н н ые, а ссылку н а д а н н ые об ъект а . В осн ове об ъект н о-ориен т ирова н н ого програ м м ирова н ия леж а т три осн овн ых прин ципа : ин ка псу ля ция , н а след ова н ие и полим орф изм . И нкапсуля цией н а зыва ет ся об ъед ин ен ие в кла ссе д а н н ых и под програ м м д ля их об ра б от ки. Д а н н ые сод ерж а тся в поля х кла сса , а процед у ры и ф у н кции н а зыва ю т ся м ет од а м и. В соот ветст вии с пра вила м и об ъект н о-ориен т ирова н н ого програ м м ирова н ия пря м ой д ост у п к поля м н еж ела телен . В свя зи с э т им в Object Pascal пред у см от рен ы специа льн ые кон стру кции, н а зыва ем ые свойст ва м и, которые осу ществля ю т чт ен ие или за пись в поля при пом ощи вызова соот вет ству ю щих м ет од ов. Об щеприн я тым я вля ет ся пра вило д а ва т ь н а зва н ия кла сса м , н а чин а ю щиеся с б у квы T. Н а прим ер: type tPerson = class; Н аследование озн а ча ет, что кла сс м ож ет н а след ова т ь ком пон ен т ы д ру гого кла сса . Созд а т ь н овый кла сс от н екоторого кла сса род ит еля м ож н о след у ю щим об ра зом : type tStudent = class(tPerson); Прин цип н а след ова н ия за клю ча ется в том , чт о порож д ён н ый кла сс-потом ок а вт ом а т ически н а след у ет поля , м ет од ы и свойст ва своего род ит еля , и в т ож е врем я м ож ет д ополн я т ь их н овым и. В Object Pascal все кла ссы я вля ю т ся потом ка м и кла сса tObject. Э тот кла сс н е вклю ча ет в себ я полей и свойст в, за т о его м етод ы позволя ю т созд а ва т ь, под д ерж ива т ь ра б от у и у д а ля т ь об ъект ы. Е сли програ м м ист хочет созд а т ь кла сс, я вля ю щийся н епосред ст вен н ым пот ом ком кла сса tObject, т о им я кла сса -род ит еля в э том слу ча е м ож н о н е у ка зыва т ь, т .е. след у ю щие строки я вля ю т ся э квива лен т н ым и: type tNewClass = class(tObject); type tNewClass = class; И спользова н ие прин ципа н а след ова н ия в Delphi привело к созд а н ию ра звет влён н ого д ерева кла ссов. В верхн ей ча сти э т ого д ерева н а ход я тся та к н а зыва ем ые а б стра кт н ые кла ссы, д ля кот орых н ельзя созд а т ь полн оцен н ые ра б от а ю щие об ъект ы. Н о вм ест е с т ем а б стра кт н ые кла ссы я вля ю т ся род он а ча льн ика м и б ольш их гру пп кла ссов, д ля кот орых у ж е созд а ю т ся реа льн ые об ъект ы. П олиморф изм позволя ет использова ть од ин а ковые им ен а д ля м ет од ов, вход я щих в ра зличн ые кла ссы. Прин цип полим орф изм а об еспе-
4 чива ет в слу ча е об ра щен ия к од н оим ён н ым м етод а м выполн ен ие т ого из н их, который соот ветст ву ет кла ссу об ъект а . В об щем вид е кла сс об ъя вля ет ся в ра зд еле type след у ю щим об ра зом : type < им я кла сса > = class(< им я кла сса -род ит еля >) public < описа н ие об щед ост у пн ых э лем ен т ов > published < описа н ие э лем ен тов, д ост у пн ых в И н спект оре Об ъект ов > protected < описа н ие э лем ен тов, д ост у пн ых в кла сса х-потом ка х> private < описа н ие э лем ен тов, д ост у пн ых только в м од у ле > end; Секции public, published, protected, private м огу т сод ерж а ть описа н ия полей, м ет од ов, свойст в, соб ытий. П оля Поля м и н а зыва ю т ся ин ка псу лирова н н ые в кла ссе д а н н ые. Поля кла сса м огу т б ыт ь лю б ого типа , в том числе кла сса м и. Н а прим ер, type tPerson = class fOne : integer; fTwo : string; fThree : tObject; end; И сход я из прин ципа ин ка псу ля ции, об ра щен ие к поля м д олж н о осу щест вля т ься при пом ощи м етод ов и свойст в кла сса . В м ест е с т ем , в Object Pascal д опу ска ет ся и н епосред ст вен н ое об ра щен ие к поля м . Д ля т ого чт об ы об ра т ит ься к полю , н еоб ход им о за писа т ь сост а вн ое им я , состоя щее из им ен и об ъект а и им ен и поля , ра зд елён н ых точкой. Н а прим ер, var MyObj : tPerson; begin MyObj.fOne := 16; MyObj.fTwo := ′В ект ор′; end; Об ычн о им я поля та кое ж е, ка к и им я соот вет ст ву ю щего свойст ва , н о к им ен и поля в ка чест ве первой б у квы д об а вля ю т б у кву f. М ет оды М ет од а м и н а зыва ю т ся ин ка псу лирова н н ые в кла ссе процед у ры и ф у н кции. Н а прим ер, type tPerson = class
5 fOne : integer; fTwo : string; fThree : tObject; function FirstFunc(x : real) : real; procedure SecondProc; end; З а головки м етод ов при описа н ии их реа лиза ции повторя ю т за головки в описа н ии т ипа , н о д ополн я ю тся им ен ем кла сса , кот орое от д еля ется от им ен и процед у ры т очкой. Н а прим ер: procedure tPerson.SecondProc; Д ля того чт об ы об ра т ит ься к м ет од а м , т а кж е н еоб ход им о использова т ь сост а вн ые им ен а : var MyObj : tPerson; y : real; begin … … … … … … … … … … … … MyObj.SecondProc; y := MyObj.FirstFunc(3.14); … … … … … … … … … … … … . end; М ет од ы, опред елён н ые в кла ссе, м огу т б ыт ь ст а тическим и, вирт у а льн ым и, д ин а м ическим и или а б стра кт н ым и. Т ип м етод а опред еля ет ся м еха н изм ом перекрыт ия его в пот ом ка х. Д ля ст а т ических м ет од ов перекрытие осу щест вля ет ся ком пиля тором . Н а прим ер, пу ст ь у н а с им еется описа н ие род ит ельского кла сса tBase и его пот ом ка tStudent, сод ерж а щих од н оим ён н ый м етод Cnt: type tBase = class procedure Cnt; end; tStudent = class(tBase) procedure Cnt; end; var Obj1 : tBase; Obj2 : tStudent; begin … … … … … … … … … … … … .. Obj1.Cnt; Obj2.Cnt; … … … … … … … … … … … … .. end; В соот вет ст вии с прин ципом полим орф изм а в опера торе Obj1.Cnt; вызыва ется м ет од , описа н н ый в кла ссе tBase , а в опера т оре Obj2.Cnt; вызыва ется м ет од , описа н н ый в кла ссе tStudent. По у м олча н ию все м етод ы, описа н н ые в кла ссе, я вля ю т ся ста т ическим и. Д ин а м ические и вирт у а льн ые м етод ы отлича ю т ся от ст а т ических т ем , чт о за м ещен ие род ит ельских м ет од ов происход ит н а э т а пе выполн ен ия програ м м ы. Д ля об ъя влен ия вирт у а льн ого м ет од а в род и-
6 т ельском кла ссе н еоб ход им о использова т ь за резервирова н н ое слово virtual, а д ля об ъя влен ия д ин а м ического м ет од а – за резервирова н н ое слово dinamic. В кла ссе-потом ке в за головке за м еща ю щего м ет од а д олж н о б ыт ь у ка за н о за резервирова н н ое слово override. Н а прим ер: type tBase = class procedure Cnt; virtual; end; tStudent = class(tBase) procedure Cnt; override; end; var Obj1 : tBase; Obj2 : tStudent; begin … … … … … … … … … … … … .. Obj1.Cnt; Obj2.Cnt; … … … … … … … … … … … … .. end; Е сли б ы м ы за хотели, чт об ы м етод Cnt в кла ссе tBase б ыл д ин а м ическим , слово virtual в за головке э т ой процед у ры след ова ло б ы за м ен ит ь словом dinamic. Ра зличие м еж д у вирт у а льн ым и и д ин а м ическим и м ет од а м и н евелико и свя за н о с особ ен н ост я м и реа лиза ции их вызовов. М ож н о ска за т ь, что вирт у а льн ые м ет од ы б олее э ф ф ект ивн ы с т очки зрен ия за т ра т врем ен и, а д ин а м ические м етод ы позволя ю т б олее ра цион а льн о использова т ь опера тивн у ю па м я т ь. А б ст ра кт н ым и н а зыва ю т ся вирт у а льн ые или д ин а м ические м ет од ы, кот орые опред елен ы в кла ссе, н о н е сод ерж а т н ика ких д ейст вий, н икогд а н е вызыва ю т ся и об я за т ельн о д олж н ы б ыть переопред елен ы в кла сса х-потом ка х. Об ъя вля ет ся а б стра кт н ый м ет од при пом ощи за резервирова н н ого слова abstract, за писа н н ого после слова virtual или dinamic. Н а прим ер, procedure draw; virtual; abstract; Осн овн ое пред н а зн а чен ие а б стра кт н ых м етод ов – б ыт ь род он а ча льн иком иера рхии кон кретн ых м етод ов в кла сса х-потом ка х. В лю б ом кла ссе сод ерж а т ся д ва специа льн ых м етод а – кон ст ру кт ор и д ест ру кт ор. Э ти м ет од ы сод ерж а тся в кла ссе-род он а ча льн ике всех ост а льн ых кла ссов – tObject и, след ова т ельн о, н а след у ю т ся всем и потом ка м и. К а к и д ру гие м ет од ы, он и м огу т б ыть изм ен ен ы в кла сса х-потом ка х, т .е. перекрыт ы. В кла ссе tObject и в б ольш ин ст ве его потом ков кон ст ру кт ор и д ест ру кт ор н а зыва ю т ся Create и Destroy соот вет ст вен н о. К он ст ру кт оры пред н а зн а чен ы д ля созд а н ия и ин ициа лиза ции об ъект а . Об ъект в я зыке Object Pascal я вля ет ся д ин а м ической стру кт у рой, и перем ен н а я -об ъект сод ерж ит н е са м и д а н н ые, а ссылку н а н их. К он стру кт ор ра спред еля ет об ъект в д ин а м ической па м я т и и присва и-
7 ва ет поля м об ъект а н а ча льн ые зн а чен ия . При э т ом поля поря д ковых т ипов в ка чест ве н а ча льн ого зн а чен ия полу ча ю т 0, строкового – пу ст у ю ст року , поля -у ка за т ели – зн а чен ие nil. К ром е т ого, кон ст ру кт ор пом еща ет ссылку н а созд а н н ый об ъект в перем ен н у ю Self, котора я а вт ом а тически об ъя вля ет ся в кла ссе. Об ра щен ие к поля м , свойст ва м и м ет од а м об ъект а д олж н о осу щест вля ться т олько после вызова кон ст ру кт ора . Д естру кт ор освоб ож д а ет д ин а м ическу ю па м я т ь и у н ичт ож а ет об ъект . Д ля об ъя влен ия кон стру кт ора и д ест ру кт ора использу ю т ся за резервирова н н ые слова constructor и destructor соот вет ст вен н о. Н а прим ер: type tSample = class text : string; constructor Create; destructor Destroy; end; Д ля созд а н ия об ъект а н еоб ход им о прим ен ит ь м ет од -кон ст ру кт ор к кла ссу об ъект а : var MyObj : tSample; begin … … … … … … … … … … … MyObj := tSample.Create; … … … … … … … … … … … end; К ром е д естру кт ора Destroy, в б а зовом кла ссе tObject опред елён м ет од Free, кот орый преж д е проверя ет , б ыл ли об ъект н а са м ом д еле созд а н , и только пот ом вызыва ет м етод Destroy. Н екот орые м етод ы м огу т вызыва т ься б ез созд а н ия и ин ициа лиза ции об ъекта . Т а кие м ет од ы н а зыва ю т ся м ет од а м и кла сса и об ъя вля ю т ся с пом ощью за резервирова н н ого слова class: type tMyClass = class class function GetClassName:string; end; var s : string; begin s:=TMyClass.GetClassName … … … … … … … … … … … … end; М ет од ы кла сса н е д олж н ы об ра ща ться к поля м , т.к. в об щем слу ча е вызыва ю т ся б ез созд а н ия об ъект а . Об ычн о э т и м ет од ы возвра ща ю т слу ж еб н у ю ин ф орм а цию о кла ссе – им я кла сса , им я род ит ельского кла сса и т.п.
8 Св ойст в а Свойст ва вн еш н е н а пом ин а ю т поля кла сса , н о н а са м ом д еле пред ста вля ю т соб ой м еха н изм , регу лиру ю щий д ост у п к поля м . К а к пра вило, свойст во свя за н о с н екоторым полем кла сса и у ка зыва ет т е м ет од ы кла сса , кот орые д олж н ы б ыт ь использова н ы при чт ен ии из э т ого поля или при за писи в н его. М ет од д ост у па д ля чтен ия д олж ен б ыт ь ф у н кцией б ез па ра м етров, кот ора я возвра ща ет зн а чен ие т ого ж е са м ого т ипа , чт о и свойст во. И м я ф у н кции, пред н а зн а чен н ой д ля чт ен ия , прин я т о н а чин а т ь с приста вки Get. М етод , использу ем ый д ля за писи, д олж ен б ыт ь процед у рой, им ею щей од ин па ра м ет р. Э т от па ра м ет р д олж ен б ыт ь т ого ж е т ипа , чт о и свойст во. И м я процед у ры, пред н а зн а чен н ой д ля за писи, прин я то н а чин а т ь с приста вки Set. Д ля об ъя влен ия свойст ва использу ю т ся за резервирова н н ые слова property, read, write. Слова read и write об озн а ча ю т н а ча ло ра зд елов, сод ерж а щих им ен а м ет од ов, пред н а зн а чен н ых д ля чт ен ия и за писи соот вет ст вен н о. Н а прим ер: type tStudent = class fAge : integer; function GetAge : integer; procedure SetAge(value : integer); property Age : integer read GetAge write SetAge; end; З д есь Age – свойст во, свя за н н ое с полем fAge. GetAge и SetAge – м ет од ы, пред н а зн а чен н ые соот вет ст вен н о д ля чт ен ия и за писи в поле fAge. Д ля об ра щен ия к свойст ву в т екст е програ м м ы н еоб ход им о использова т ь сост а вн ые им ен а , состоя щие из им ен и об ъекта и им ен и свойст ва , ра зд елён н ые точкой. Н а прим ер: var GoodStudent : tStudent; OwnAge: integer; begin GoodStudent:=tStudent.Create; GoodStudent.Age:=19; … … … … … … … … … … … … . OwnAge:=GoodStudent.Age; … … … … … … … … … … … … . GoodStudent.Free; end; И спользова н ие свойст в, в отличие от н епосред ст вен н ого использова н ия полей, позволя ет осу щест вля ть ра зличн ые д ополн ит ельн ые д ейст вия : проверку ввод им ых зн а чен ий н а прин а д леж н ость к за д а н н ом у д иа па зон у , выд а чу сооб щен ий н а э кра н , изм ен ен ие вн еш н его вид а об ъект а н а э кра н е и т.д .
9 Е сли н ет н еоб ход им ост и в специа льн ых д ейст вия х при чт ен ии или за писи свойства , вм ест о им ен и соот вет ст ву ю щего м ет од а м ож н о у ка зыва т ь им я поля : type tStudent = class fAge : integer; property Age : integer read fAge write fAge; end; Поля м огу т б ыт ь д ост у пн ы т олько д ля чт ен ия или только д ля за писи. В э том слу ча е при описа н ии свойст ва опу ска ю т ся соот ветст вен н о ра зд елы read или write. В ооб ще говоря , свойство м ож ет и н е свя зыва т ься с полем . Ф а кт ически он о описыва ет од ин или д ва м етод а , кот орые осу щест вля ю т н екот орые д ейст вия н а д д а н н ым и т ого ж е т ипа , чт о и свойст во. Собы т и я В Delphi опред елен о н есколько д еся тков т иповых соб ытий. Соб ытие – э т о свойство процед у рн ого т ипа , и его зн а чен ием я вля ется у ка за т ель н а н екоторый м етод . Присвоит ь т а ком у свойст ву зн а чен ие озн а ча ет у ка за т ь а д рес м етод а , кот орый б у д ет выполн я т ься в м ом ен т н а ст у плен ия соб ытия . Та кие м ет од ы н а зыва ю т ся об ра б отчика м и соб ытий. Об щим д ля всех об ра б от чиков соб ыт ий я вля ет ся па ра м ет р Sender, сод ерж а щий ссылку н а об ъект – ист очн ик соб ытия . Н а прим ер, OnClick – соб ыт ие, возн ика ю щее при н а ж а тии н а леву ю кн опку м ыш и. Н а ст ра н ице Events в И н спект оре Об ъект ов от об ра ж а ю т ся т олько т е свойст ва ком пон ен та , которые им ею т т ип м етод а , т.е. соб ыт ия .
Би бли от ека в и зуальны х ком поне нт ов К ла ссы, созд а н н ые ра зра б от чика м и Delphi, об ра зу ю т слож н у ю иера рхическу ю стру кт у ру , н а зыва ем у ю Биб лиот екой визу а льн ых ком пон ен тов (Visual Component Library – VCL). К оличест во вход я щих в VCL кла ссов сост а вля ет н есколько сот ен . Н а след у ю щем рису н ке изоб ра ж ен ы б а зовые кла ссы, я вля ю щиеся род он а ча льн ика м и всех оста льн ых кла ссов. TObject TPersistent TObject TComponent TObject TControl TObject
TGraphicControl
TWinControl
10 К ла сс TObject я вля ет ся пред ком всех кла ссов, вход я щих в VCL, и об еспечива ет возм ож н ост ь созд а н ия , у пра влен ия и ра зру ш ен ия об ъект ов. К ла сс TPersistent происход ит н епосред ст вен н о от кла сса TObject и сод ерж ит м ет од ы, н еоб ход им ые д ля созд а н ия потоковых об ъект ов. П отоковый объ ект – э то об ъект , кот орый м ож ет за пом ин а т ься в пот оке. В свою очеред ь, поток пред ст а вля ет соб ой об ъект , ин ка псу лиру ю щий н екоторый н оситель ин ф орм а ции, н а прим ер па м я т ь или д исковые ф а йлы. И н ым и слова м и, пот ом ки кла сса TPersistent м огу т б ыт ь, в ча ст н ости, пом ещен ы в опера тивн у ю па м я т ь либ о в ф а йл ф орм ы и извлечен ы от т у д а . К ом пон ен т а м и н а зыва ю т ся э кзем пля ры кла ссов, кот орые я вля ю т ся потом ка м и кла сса TСomponent. Э кзем пля ры всех д ру гих кла ссов н а зыва ю т ся об ъект а м и. Ра зн ица м еж д у ком пон ен т а м и и прост о об ъект а м и за клю ча ет ся в т ом , что ком пон ен т а м и м ож н о м а н ипу лирова т ь н а ф орм е, а об ъект а м и – н ельзя . Прим ером кла сса , опред елён н ого в VCL, н о н е отн ося щегося к ком пон ен та м , я вля ет ся кла сс TFont, кот орый опред еля ет ха ра кт ерист ики ш риф т а . Об ъект э т ого кла сса н ельзя н епосред ст вен н о пом ест ит ь н а ф орм у , н о свойст ва , им ею щие э т от кла ссовый т ип, прису т ст ву ю т в лю б ом ком пон ен т е, который м ож ет сод ерж а т ь н екоторый текст . Н е все потом ки кла сса TComponent я вля ю т ся визу а льн ым и. Н а прим ер, ком пон ен т Timer, пред н а зн а чен н ый д ля от счёт а ин т ерва лов врем ен и, я вля ется н евизу а льн ым . К ла сс TСontrol об еспечива ет б ольш у ю ча ст ь свойст в, м ет од ов и соб ытий визу а льн ых ком пон ен тов, при пом ощи которых вывод ит ся ин ф орм а ция н а э кра н и с пом ощью кот орых м ож н о ввод ит ь ин ф орм а цию в програ м м у , использу я кла виа т у ру и м ыш ь. Д ля потом ков кла сса TControl использу ет ся об щее н а зва н ие – э лем ен ты у пра влен ия . В кла ссе TControl ввод ит ся пон я т ие род ительского э лем ен т а у пра влен ия (parent controls). И спользова н ие свя зи род ит ельскийд очерн ий позволя ет д очерн ем у э лем ен т у у пра влен ия использова т ь ха ра кт ерист ики род ит ельского э лем ен т а . Д очерн ие э лем ен т ы н е м огу т выход ит ь за гра н ицы своего род ит еля . Е сли род ительский э лем ен т перем еща ет ся по э кра н у , то вм ест е с н им перем еща ю т ся и все д очерн ие э лем ен т ы. К ла сс TWinControl использу ется ка к б а зовый д ля созд а н ия окон н ых э лем ен тов у пра влен ия . Э ти э лем ен ты у пра влен ия м огу т полу ча т ь ф оку с ввод а и реа гиру ю т н а соб ытия , возн ика ю щие при использова н ии кла виа т у ры. Ха ра кт ерн ым и пред ста вит еля м и пот ом ков сем ейст ва TWinControl я вля ю т ся ст рока ввод а Edit, м н огострочн ый ред а кт ор Memo, список ListBox, кн опка Button, т а б лица StringGrid. Опред елён н ый в кла ссе TWinControl м ет од procedure SetFocus;virtual; перед а ёт ф оку с ввод а д а н н ом у окон н ом у э лем ен т у . К ла сс TGraphicControl я вля ется б а зовым д ля ком пон ен т ов, которые н е полу ча ю т ф оку с ввод а . Пот ом ки кла сса TGraphicControl им ею т
11 об щее н а зва н ие – гра ф ические э лем ен т ы у пра влен ия . Осн овн ое их н а зн а чен ие – вывод н а э кра н ин ф орм а ции и у лу чш ен ие вн еш н его вид а ф орм ы прилож ен ия . Гра ф ические э лем ен ты у пра влен ия реа гиру ю т н а соб ытия , свя за н н ые с использова н ием м ыш и. Пред ст а вителем сем ейст ва TGraphicControl я вля ется м ет ка Label.
2.2 С оздание простей ш его оконного прилож ения Н ачало р абот ы в Delphi После за пу ска Delphi н а э кра н е поя вля ю т ся чет ыре окн а : гла вн ое окн о, окн о ф орм ы, окн о ин спект ора об ъект ов и окн о ред а кт ора код а , кот орое почти полн ост ью за крыто окн ом ф орм ы. В гла вн ом окн е н а ход ится м ен ю ком а н д Delphi, па н ель ин стру м ен тов и па литра ком пон ен т ов. Окн о ф орм ы ( его за головок Form1) пред ста вля ет соб ой за гот овку , м а кет од н ого из окон ра зра б а т ыва ем ого прилож ен ия . Окн о ин спект ора об ъект ов ( его за головок Object Inspector) позволя ет вид ет ь и м ен я т ь свойст ва об ъект ов проект а . После за пу ска Delphi в э т ом окн е н а ход я т ся свойст ва ф орм ы Form1. Окн о ред а кт ора код а сод ерж ит м а кет процед у ры об ра б от ки соб ыт ия . К од ом в Delphi н а зыва ет ся т екст програ м м ы. Ф ор м а пр и лож е ни я Ра б от а н а д н овым проект ом (т а к в Delphi н а зыва ет ся ра зра б а т ыва ем ое прилож ен ие) н а чин а ет ся с созд а н ия ст а ртовой ф орм ы – окн а , кот орое поя вля ет ся при за пу ске прилож ен ия . Н а чн ём с созд а н ия проект а д ля пересчёт а д лин ы отрезка из д ю йм ов в са н тим етры. Ст а ртова я ф орм а созд а ёт ся пу т ём изм ен ен ия свойст в ф орм ы Form1, которые опред еля ю т её вн еш н ий вид : ра зм ер, полож ен ие н а э кра н е, текст за головка , оф орм лен ие. Свойст ва перечислен ы н а вкла д ке Properties окн а Object Inspector. В левой колон ке н а ход я тся им ен а свойст в, в пра вой – их зн а чен ия . В т а б лице привед ен ы изм ен ён н ые свойст ва ф орм ы ра зра б а т ыва ем ого прилож ен ия . Ост а льн ые свойст ва ост а влен ы б ез изм ен ен ия . С вой ство О бознач ение Знач ение И м я ф орм ы Name Form1 З а головок Caption Д ю йм В ысота
Height
185
Ш ирин а
Width
290
Ш риф т
Font.Name
Arial
Ра зм ер ш риф т а
Font.Size
12
12 После у ст а н овки э т их зн а чен ий свойст в ф орм а д олж н а выгля д ет ь след у ю щим об ра зом :
Ком поне нт ы фор м ы Програ м м а пересчёт а д лин ы отрезка из д ю йм ов в са н тим етры д олж н а полу чит ь от пользова т еля исход н ые д а н н ые – зн а чен ие д лин ы в д ю йм а х. Д об а вим в ф орм у ком пон ен т – поле ред а кт ирова н ия д ля ввод а д а н н ых. В програ м м е ф орм а и её ком пон ен т ы ра ссм а трива ю тся ка к об ъект ы. Поэ т ом у окн о, в кот ором н а ход я т ся свойства ф орм ы и её ком пон ен т ов, н а зыва ется Object Inspector. Ч т об ы д об а вить к ф орм е ком пон ен т, н а д о в па литре ком пон ен тов, щелкн у т ь м ыш ью н а пикт огра м м е н у ж н ого ком пон ен т а (д ля поля ред а кт ирова н ия э т о зн а чок ab ), а за т ем щелкн у ть в т ой т очке ф орм ы, гд е д олж ен н а ход ит ься левый верхн ий у гол ком пон ен т а . В резу льт а т е в ф орм е поя вится выб ра н н ый ком пон ен т ст а н д а рт н ого ра зм ера . К ом пон ен т ф орм ы, окру ж ён н ый восем ью м а лен ьким и ква д ра т ика м и, н а зыва ет ся выд елен н ым (м а ркирова н н ым ). Свойст ва м а ркирова н н ого ком пон ен т а от об ра ж а ю т ся в Object Inspector. Delphi позволя ет легко изм ен ит ь полож ен ие и ра зм ер ком пон ен т а об ычн ым д ля Windows способ ом . Е сли свойст ва ком пон ен та изм ен я ю т ся с пом ощью Object Inspector, то ком пон ен т д олж ен б ыт ь в э то врем я м а ркирова н . В т а б лице привед ен ы изм ен ён н ые свойст ва поля ред а кт ирова н ия , пред н а зн а чен н ого д ля ввод а д лин ы отрезка в д ю йм а х. С вой ство О бознач ение Знач ение И м я поля . И спользу ет ся д ля д ост у па к Name Edit1 сод ерж им ом у поля . Т екст , н а ход я щийся в поле ввод а . Ра сст оя н ие от левой гра н ицы поля д о левой гра н ицы ф орм ы. Ра сст оя н ие от верхн ей гра н ицы поля д о верхн ей гра н ицы ф орм ы. Ш ирин а поля .
Text Left
24
Top
48
Width
100
13 После у ст а н овлен ия у ка за н н ых зн а чен ий свойст в Edit1 ф орм а прилож ен ия прим ет вид :
ком пон ен т а
Д ля вывод а текст овых сооб щен ий в ф орм е использу ю т ся м ет ки. Т екст м ет ки м ож ет б ыт ь за д а н ка к н а э т а пе кон стру ирова н ия ф орм ы, та к и н а э т а пе выполн ен ия програ м м ы. К ф орм е ра зра б а т ыва ем ого прилож ен ия н а д о д об а вит ь д ве м ет ки. Перва я м ет ка б у д ет пред ста вля т ь соб ой ин ф орм а цион н ое сооб щен ие. В тора я м ет ка пред н а зн а чен а д ля вывод а резу льт а т а пересчёт а из д ю йм ов в са н тим ет ры. Пикт огра м м а м ет ки A . После того, ка к м ет ка д об а влен а , м ож н о изм ен ит ь её свойст ва . В т а б лице привед ен ы изм ен ён н ые свойст ва м ет ок Label1 и Label2: Name Label1 Label2 Caption В вед ит е д лин у в д ю йм а хи щёлкн ите н а Пересчёт AutoSize False False Top 8 96 Left 24 24 Height 33 49 Width 209 130 WordWrap True True ParentFont True True После д об а влен ия м ет ок и у ст а н овки их свойст в ф орм а ра зра б а т ыва ем ого прилож ен ия приоб рет ёт вид :
Свойст во ParentFont об еих м еток им еет зн а чен ие true, поэ том у свойст во Font (ш риф т ) м еток н а след у ет зн а чен ие свойст ва Font “ род ит еля ”, в д а н н ом слу ча е осн овн ой ф орм ы.
14 Е сли свойст во AutoSize (а втом а тический под гон ра зм ера ) им еет зн а чен ие true, то Delphi а втом а тически у ст а н а влива ет ра зм еры м ет ки в за висим ости от количест ва сим волов т екст а м ет ки и использу ем ого ш риф т а . В противн ом слу ча е м ет ка сохра н я ет за д а н н ые ра зм еры н еза висим о от ра зм ещён н ого в н ей т екст а . Е сли свойст во WordWrap им еет зн а чен ие true, т о после за полн ен ия т еку щей ст роки б у д ет происход ит ь перен ос т екст а н а н ову ю ст року . Д об а вим к ф орм е ком а н д н у ю кн опку , при щелчке н а кот орой б у д ет выполн я т ься пересчёт введ ён н ого в поле ввод а количест ва д ю йм ов в са н тим ет ры. Пикт огра м м а ком а н д н ой кн опки Ok . В т а б лице привед ен ы изм ен ён н ые свойст ва ком а н д н ой кн опки. Name Button1 Caption Пересчёт Top
48
Left
184
Height
25
Width
75
Окон ча т ельн ый вид ф орм ы прилож ен ия :
Собы т и е и пр оце дур а обр абот ки собы т и я В ид созд а н н ой ф орм ы под ска зыва ет , ка к ра б от а ет прилож ен ие. Пользова т ель д олж ен ввести количест во д ю йм ов в поле ред а кт ирова н ия , за т ем щёлкн у т ь н а кн опке Пересчёт. Щ елчок н а изоб ра ж ен ии ком а н д н ой кн опки – э т о прим ер т ого, чт о в Windows н а зыва ю т соб ыт ием . Щ елчок левой кн опкой м ыш и – э т о соб ытие OnClick. В Delphi реа кция н а соб ытие реа лизу ет ся ка к процед у ра об ра б от ки соб ытия . Т а ким об ра зом , за д а ча програ м м ист а при ра б от е в Delphi состоит в н а писа н ии процед у р об ра б от ки соб ытий.
15 Сн а ча ла след у ет м а ркирова т ь (выд елить) об ъект , д ля кот орого созд а ёт ся процед у ра об ра б от ки соб ытия . В н а ш ем слу ча е э то ком а н д н а я кн опка Пересчёт. З а т ем выб ра ть вкла д ку Events (соб ытия ) окн а Object Inspector. Ч т об ы созд а т ь процед у ру об ра б от ки соб ытия , н а д о сд ела ть д войн ой щелчок в поле им ен и процед у ры об ра б от ки соб ытия . В резу льт а т е от крыва ет ся окн о ред а кт ора код а с м а кет ом процед у ры об ра б от ки соб ытия . Delphi а вт ом а тически присва ива ет процед у ре об ра б от ки соб ытия им я , кот орое состоит из д ву х ча ст ей. Перва я ча ст ь ид ен т иф ициру ет ф орм у , кот орой прин а д леж ит об ъект, д ля которого созд а ёт ся процед у ра об ра б отки соб ыт ия . В тора я ча ст ь им ен и ид ен тиф ициру ет са м об ъект и соб ыт ие. В н а ш ем слу ча е им я ф орм ы – Form1, им я ком а н д н ой кн опки – Button1, им я соб ытия – Click. Соб ытие OnClick я вля ет ся д ля ком а н д н ой кн опки Button соб ытием по у м олча н ию . Поэ т ом у м а кет процед у ры об ра б от ки э т ого соб ыт ия м ож н о д об а вит ь в програ м м н ый код , сд ела в д войн ой щелчок левой кла виш ей м ыш и по кн опке Пересчёт. В окн е ред а кт ора код а м еж д у begin и end м ож н о печа т а т ь ин ст ру кции Object Pascal, реа лизу ю щие процед у ру об ра б от ки соб ытия . М еж д у за головком процед у ры и словом begin н еоб ход им о д об а вит ь описа н ие использу ем ых в процед у ре лока льн ых перем ен н ых. И сход н ые д а н н ые програ м м а полу ча ет из окн а ред а кт ирова н ия Edit1. Т о, чт о м ы введ ём в э т о окн о, б у д ет присвоен о свойст ву Text ком пон ен т а Edit1. Свойст во Text им еет ст роковый т ип. Поэ т ом у м ы д олж н ы введ ён н у ю ст року преоб ра зова т ь в число с пом ощью од н ой из след у ю щих ф у н кций преоб ра зова н ия т ипов: StrToInt(s) – возвра ща ет целое число, изоб ра ж ен ием кот орого я вля ет ся ст рока s. StrToFloat(s) – возвра ща ет вещест вен н ое число, изоб ра ж ен ием кот орого я вля ет ся cтрока s. Т а ким об ра зом , ин ст ру кция , котора я присва ива ет вещест вен н ой перем ен н ой d зн а чен ие числа , изоб ра ж ен ием кот орого я вля ет ся ст рока , введ ён н а я в поле Edit1, выгля д ит след у ю щим об ра зом : d:=StrToFloat(Edit1.Text); После вычислен ия количест ва са н т им ет ров, соот вет ст ву ю щих введ ён н ом у количест ву д ю йм ов, н еоб ход им о вывест и сооб щен ие о резу льт а та х вычислен ия в поле м ет ки Label2. Д ля э т ого н у ж н о ст року т екст а сооб щен ия , за клю чён н у ю в а пост роф ы, присвоит ь свойству Caption м ет ки Label2. При э том н у ж н о вст реча ю щиеся в строке сооб щен ия числа преоб ра зова ть в строку с пом ощью од н ой из след у ю щих ф у н кций преоб ра зова н ия типов: IntToStr(n) – строка , я вля ю ща я ся изоб ра ж ен ием целого числа n. FloatToStr(n) – ст рока , я вля ю ща я ся изоб ра ж ен ием вещест вен н ого n. FloatToStrF(n,f,l,m) – строка , я вля ю ща я ся изоб ра ж ен ием вещест вен н ого n; при вызове ф у н кции у ка зыва ю т ся :
16 f – ф орм а т (способ изоб ра ж ен ия ); l – об щее количест во циф р; m – количест во циф р после д еся тичн ой точки. Соот вет ст ву ю ща я ин ст ру кция б у д ет выгля д ет ь след у ю щим об ра зом : Label2.Caption:=Edit1.Text + ' д ю йм (а /ов) э т о ' + FloatToStrF(sm, ffGeneral,6, 2) + ' см '; З д есь зн а к ′ + ′ я вля ется зн а ком опера ции кон ка т ен а ции (склеива н ия ст рок). Полн ый т екст процед у ры об ра б от ки соб ытия OnClick д ля кн опки Button1: procedure TForm1.Button1Click(Sender: TObject); var d, sm : real; begin d:=StrToFloat(Edit1.Text); sm:=d*2.54; Label2.Caption:=Edit1.Text + ' д ю йм (а /ов) э то ' + FloatToStrF(sm, ffGeneral, 6, 2) + ' см '; end; Сох р ане ни е пр оект а В т ерм ин ологии Delphi проект – э т о н а б ор ф а йлов, использу я кот орые ком пиля тор созд а ёт ф а йл исполн я ем ой програ м м ы. Од ин из э т их ф а йлов, сод ерж а щий об щее описа н ие проект а , н а зыва ется ф а йлом проект а и им еет ра сш ирен ие dpr. Проект та кж е вклю ча ет в себ я од ин или б олее м од у лей, ф а йлы которых им ею т ра сш ирен ие pas и сод ерж а т т екст ы процед у р, ф у н кций, описа н ие т ипов и д ру гу ю ин ф орм а цию , н еоб ход им у ю ком пиля т ору д ля созд а н ия исполн я ем ой програ м м ы. Ч т об ы сохра н ит ь проект , н а д о из м ен ю File выб ра т ь ком а н д у SaveProjectAs. Е сли проект ещё н и ра зу н е б ыл сохра н ён , то в от вет Delphi сн а ча ла вывод ит д иа логовое окн о SaveUnit1As. В э том окн е след у ет выб ра т ь па пку , пред н а зн а чен н у ю д ля хра н ен ия всех проект ов Delphi. В э той па пке след у ет созд а т ь н ову ю от д ельн у ю па пку д ля ф а йлов д а н н ого сохра н я ем ого проект а . Д ля э т ого использова т ь кн опку “ Созд а н ие н овой па пки”. Ря д ом с поя вивш им ся зн а чком н овой па пки в ра м ке н а печа т а ть им я па пки проект а – Д ю йм и н а ж а т ь Enter. З а т ем от крыть э т у созд а н н у ю па пку и в поле И м я ф а йла либ о ввести им я , н а прим ер, inch_, либ о согла сит ься с пред лож ен н ым им ен ем ( Unit1 ), и щелкн у т ь н а кн опке Сохра н ит ь. После э того поя вля ет ся след у ю щее д иа логовое окн о SaveProject1As, гд е в ка чест ве т ипа ф а йла у ка за н о Delphi project (∗ . dpr). В поле И м я ф а йла введ ём н а зва н ие ф а йла проект а inch (б ез зн а ка под чёркива н ия ) или м ож н о согла сит ься с пред лож ен н ым им ен ем ( Project1 ).
17 З а м еча н ие. Хот я ф а йлы, им ею щие од ин а ковые им ен а , н о ра зн ые ра сш ирен ия опера цион н ой систем ой ра ссм а трива ю т ся ка к ра зн ые ф а йлы, од н а ко при попыт ке присвоить ф а йлу проект а т а кое ж е им я , ка кое присвоен о м од у лю проект а , Delphi выд а ёт сооб щен ие об ош иб ке. След у ет об ра т ит ь вн им а н ие, что им я исполн я ем ого ф а йла проект а , созд а ва ем ого ком пиля тором , совпа д а ет с им ен ем ф а йла проект а . Поэ т ом у ф а йлу проект а след у ет присвоить то им я , кот орое д олж ен им ет ь исполн я ем ый ф а йл програ м м ы, а ф а йлу м од у ля – ка кое-либ о д ру гое, н а прим ер, полу чен н ое из им ен и ф а йла проект а пу т ём д об а влен ия в кон ец им ен и циф ры или сим вола (в н а ш ем проект е _ ). Ком пи ля ци я После сохра н ен ия проект а м ож н о, выб ра в ком а н д у Compile из м ен ю Project, от ком пилирова т ь прилож ен ие. Ч тоб ы после за верш ен ия ком пиля ции окн о Compiling поя вля лось н а э кра н е, н а д о из м ен ю Tools выб ра т ь ком а н д у Environment Options, в от крывш ем ся д иа логовом окн е выб ра т ь вкла д ку Preferences и у ст а н овит ь ф ла ж ок Show compiler progress. Запуск пр и лож е ни я и з ср е ды пр огр ам м и р ов ани я В ыполн ен ие прилож ен ия м ож н о за пу ст ит ь из сред ы програ м м ирова н ия , н е за верш а я ра б от у в Delphi. Д ля э того н а д о выб ра т ь ком а н д у Run из м ен ю Run. В ид ра б от а ю щего прилож ен ия :
След у ет об ра тить вн им а н ие, что ф орм а т ввод а вещест вен н ых чисел в поле ред а кт ирова н ия пред пола га ет д еся т ичн у ю за пя т у ю , а н е точку .
Задачи . 1. Созд а т ь проект д ля пересчёт а су м м ы в д олла ра х по д а н н ом у ку рсу в ру б ли. Окн о прилож ен ия :
18
2. Созд а т ь проект д ля вычислен ия стоим ости т елеф он н ого ра зговора в за висим ости от д н я н ед ели. (Ц ен а од н ой м ин у т ы ра зговора 0,15ру б . В су б б от у и воскресен ье скид ка 20%) Окн о прилож ен ия :
3. Созд а т ь проект д ля опред елен ия опт им а льн ого веса . Програ м м а за пра ш ива ет ва ш вес и рост, вычисля ет опт им а льн ое д ля ва с зн а чен ие веса (рост м ин у с 100), сра вн ива ет его с реа льн ым , и в за висим ости от резу льт а т а сра вн ен ия вывод ит од н о из след у ю щих сооб щен ий В а ш вес оптим а лен . В а м н а д о попра виться н а кг. В а м н а д о поху д ет ь н а кг. Окн о прилож ен ия :
19 4. Д а н о н а т у ра льн ое число n . Полу чит ь д воичн ое пред ст а влен ие числа n. Окн о ра б от а ю щего прилож ен ия :
5. Сост а вит ь та б лицу зн а чен ий лин ейн ой ф у н кции резке [0, 1] с ш а гом 0,1.
y = ax + b
н а от -
6. Д а н од н ом ерн ый целочислен н ый м а ссив из 10 э лем ен т ов, введ ён н ых в поле ред а кт ирова н ия Edit. Ч исла м а ссива ра зд елен ы проб ела м и. Н а йт и произвед ен ие отрица тельн ых э лем ен тов м а ссива . Д ля реш ен ия за д а чи оф орм ит ь процед у ру readmassiv(s:string; var aa:mas); , позволя ю щу ю в ст роке s выд еля т ь под строку , изоб ра ж а ю щу ю число, и за полн я т ь э тим и числа м и м а ссив aa.
20
Ст р укт ур а пр ост ого пр ое кт а Delphi. Проект Delphi пред ст а вля ет соб ой н а б ор програ м м н ых ед ин иц – м од у лей. Од ин из м од у лей, н а зыва ем ый гла вн ым , сод ерж ит ин стру кции, с которых н а чин а ет ся выполн ен ие програ м м ы. Гла вн ый м од у ль прилож ен ия а вт ом а т ически ф орм иру ет ся Delphi. Он хра н ит ся в ф а йле с ра сш ирен ием .dpr. Д ля т ого чтоб ы у вид ет ь т екст гла вн ого м од у ля прилож ен ия , н еоб ход им о из м ен ю Project выб ра т ь ком а н д у View Source. Т екст гла вн ого м од у ля програ м м ы пересчёта д ю йм ов в са н тим ет ры. program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.RES} begin Application.Initialize; Application.Title := 'Д ю йм '; Application.CreateForm(TForm1, Form1); Application.Run; end. З а словом uses след у ю т им ен а использу ем ых м од у лей: б иб лиот ечн ого м од у ля Forms и м од у ля ф орм ы Unit1. Д ирект ива {$R *.RES} у ка зыва ет ком пиля т ору , чт о н у ж н о использова т ь ф а йл ресу рсов, который сод ерж ит описа н ия ресу рсов прилож ен ия , н а прим ер, пикт огра м м ы. З вёзд очка пока зыва ет, что им я ф а йла ресу рсов т а кое ж е, ка к у ф а йла проект а , н о с ра сш ирен ием .res. И н ст ру кции исполн я ем ой ча ст и гла вн ого м од у ля об еспечива ю т ин ициа лиза цию прилож ен ия и вывод н а э кра н ст а рт ового окн а .
21 Пом им о гла вн ого м од у ля ка ж д ый проект вклю ча ет ка к м ин им у м од ин м од у ль ф орм ы, который сод ерж ит описа н ие ста ртовой ф орм ы прилож ен ия и под д ерж ива ю щих её ра б от у процед у р. В Delphi ка ж д ой ф орм е соот ветст ву ет свой м од у ль. Т екст м од у ля ф орм ы проект а пересчёт а д ю йм ов в са н тим етры. unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Label1: TLabel; Label2: TLabel; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var d, sm : real; begin d:=StrToFloat(Edit1.Text); sm:=d*2.54; Label2.Caption:=Edit1.Text + ' д ю йм (а /ов) э то ' + FloatToStrF(sm, ffGeneral, 6, 2) + ' см '; end; end. Н а чин а ет ся м од у ль словом unit, за кот орым след у ет им я м од у ля . И м ен н о э т о им я у пом ин а ет ся в списке использу ем ых м од у лей в ин ст ру кции uses гла вн ого м од у ля прилож ен ия . И н т ерф ейсн ый ра зд ел м од у ля ( interface ) сооб ща ет ком пиля тору , чт о им ен н о в э т ом м од у ле я вля ет ся д ост у пн ым д ля д ру гих м од у лей проект а . В э том ра зд еле перечислен ы (после слова uses) б иб лиотечн ые м од у ли, использу ем ые д а н н ым м од у лем , а та кж е н а ход ит ся сф орм иро-
22 ва н н ое Delphi описа н ие т ипа ф орм ы, кот орое след у ет после слова type. З а тем описыва ет ся перем ен н а я Form1 д а н н ого типа . Ра зд ел реа лиза ции (implementation) н а чин а ет ся д ирект ивой {$R *.DFM}, у ка зыва ю щей ком пиля т ору , чт о в ра зд ел реа лиза ции н а д о вст а вит ь ин стру кции у ст а н овки зн а чен ий свойств ф орм ы, кот орые н а ход я тся в ф а йле с ра сш ирен ием .dfm, им я которого совпа д а ет с им ен ем м од у ля . Ф а йл в ф орм а т е DFM ген ериру ет ся Delphi н а осн ове вн еш н его вид а ф орм ы. З а д ирект ивой {$R *.DFM} след у ет описа н ие процед у р об ра б от ки соб ытий ф орм ы. Сю д а ж е програ м м ист м ож ет пом ест ит ь описа н ие своих процед у р и ф у н кций, которые б у д у т вызыва т ься из процед у р об ра б от ки соб ытий. В м од у ле м ож ет т а кж е сод ерж а т ься ра зд ел ин ициа лиза ции, который позволя ет выполн ит ь ин ициа лиза цию перем ен н ых м од у ля . В д а н н ом прим ере ра зд ел ин ициа лиза ции отсу т ст ву ет вм ест е с от крыва ю щим его словом begin.
2.3 Т екстовый редактор Memo Т екст овый ред а кт ор Memo в отличие от ст роки ввод а Edit м ож ет сод ерж а т ь н е од н у , а лю б ое число ст рок. Осн овн ым свойст вом ком пон ен т а Memo я вля ет ся property Lines, которое за д а ёт список строк, пом ещён н ых в ред а кт ор. Э т о свойст во им еет т ип TStrings. К ла сс TStrings ин ка псу лиру ет поля и м етод ы д ля ра б оты со списка м и ст рок и использу ет ся д ля опред елен ия свойст в соот вет ству ю щего типа во м н огих ком пон ен та х Delphi. Особ ен н ост ью кла сса TStrings и его пот ом ков я вля ет ся то об стоя т ельст во, чт о э лем ен т а м и списков слу ж а т па ры ст рока -об ъект , в которых строка – соб ст вен н о строка сим волов, а об ъект – э т о об ъект лю б ого кла сса Delphi. Та ка я д войствен н ост ь позволя ет сохра н я ть в TStrings об ъект ы с т екст овым и прим еча н ия м и, сорт ирова т ь об ъект ы, от ыскива т ь н у ж н ый об ъект по его описа н ию . К ром е того, в ка честве об ъект а м ож ет использова т ься пот ом ок TStrings, чт о позволя ет созд а ва т ь м н огом ерн ые н а б оры ст рок. Позн а ком им ся с н екот орым и свойст ва м и и м ет од а м и, опред елён н ым и в кла ссе TStrings. property Count : integer; Опред еля ет число э лем ен тов в списке. property Strings[index:integer]:string; Опред еля ет строку списка с ин д ексом index. И н д екс первой строки – 0. property Text : string; Сод ерж ит все строки списка , вклю ча я ра зд елители – сим волы возвра т а ка рет ки и перевод а строки (#13#10) function Add(const s:string) : integer; Д об а вля ет строку S в список и возвра ща ет поря д ковый н ом ер э т ой ст роки в списке. procedure Clear;
23 У д а ля ет все строки и у ка за т ели н а об ъект ы из списка . procedure Delete(index:integer); У д а ля ет из списка э лем ен т с ин д ексом index. procedure Exchange(index1, index2:integer); М ен я ет м ест а м и д ва э лем ен т а списка с ин д екса м и index1 и index2. procedure Insert(index:integer; const S:string); В ст а вля ет в список строку S под ин д ексом index. procedure Move(Curindex, Newindex:integer); Перем еща ет э лем ен т списка из позиции Curindex в позицию Newindex. procedure LoadFromFile(const FileName:string); З а гру ж а ет список из ф а йла с им ен ем FileName. procedure SaveToFile(const FileName:string); Пом еща ет список в ф а йл с им ен ем FileName. Прим ер1. Созд а т ь окон н ое прилож ен ие, позволя ю щее ввод ит ь с кла виа т у ры список ст рок в поле ред а кт ора Memo1, а за тем н а ж а т ием кн опки переписыва т ь все ст роки, сод ерж а щие б олее 4 сим волов, в поле ред а кт ора Memo2. Окн о ра б от а ю щего прилож ен ия :
Процед у ра об ра б отки соб ыт ия щелчка н а кн опке П ерепи са т ь ст роки : procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin for i:=0 to memo1.lines.count-1 do if length(memo1.Lines.Strings[i])>4 then memo2.Lines.add(memo1.Lines.Strings[i]); end. Прим ер1a. Созд а т ь окон н ое прилож ен ие, позволя ю щее ввод ит ь с кла виа т у ры список ст рок в поле ред а кт ора Memo, а за т ем н а ж а тием кн опки у д а ля т ь все строки, сод ерж а щие б олее 4 сим волов.
24
procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin i:=0; while i 4 then memo1.Lines.Delete(i) else inc(i) end; Прим ер 2. Созд а ть окон н ое прилож ен ие, вычисля ю щее первые 20 э лем ен тов а риф м етической прогрессии, д ля кот орой за д а н ы первый э лем ен т и ра зн ост ь. Окн о ра б ота ю щего прилож ен ия :
Процед у ра об ра б отки соб ыт ия щелчка по кн опке За полни т ь: procedure TForm1.Button1Click(Sender: TObject); var a,d,an,i:integer; begin a:=strtoint(edit1.Text); d:=strtoint(edit2.Text); memo1.Lines.Add(edit1.Text); an:=a; for i:=2 to 20 do
25 begin an:=an + d; memo1.Lines.Add(inttostr(an)) end; end; Процед у ра об ра б отки соб ыт ия щелчка по кн опке О чи ст и т ь: procedure TForm1.Button2Click(Sender: TObject); begin memo1.Lines.Clear; end; Задачи 7. З а полн ить од н ом ерн ый целочислен н ый м а ссив a числа м и, введ ён н ым и с кла виа т у ры в поле Memo1. Полу чит ь н овый м а ссив b, у д воив н ечёт н ые э лем ен ты м а ссива a, чёт н ые ост а вит ь б ез изм ен ен ия . Полу чен н ый м а ссив b отоб ра зит ь в поле Memo2. Окн о ра б от а ю щего прилож ен ия :
8. Созд а т ь окон н ое прилож ен ие, позволя ю щее ввод ит ь с кла виа т у ры список строк в поле ред а кт ора Memo, а за т ем , использу я процед у ру Exchange, перест а вит ь ст роки в об ра тн ом поря д ке. Окн о ра б от а ю щего прилож ен ия :
26
9. З а полн ит ь од н ом ерн ый целочислен н ый м а ссив a числа м и, введ ён н ым и с кла виа т у ры в поле Memo1. Полу чит ь н овый м а ссив b, ка ж д ый э лем ен т которого ра вен су м м е циф рсоот вет ст ву ю щего э лем ен т а м а ссива a. Полу чен н ый м а ссив b отоб ра зит ь в поле Memo2. Окн о ра б ота ю щего прилож ен ия :
10. Н а йти все трёхзн а чн ые числа , ка ж д ое из кот орых у д овлет воря ет у словию : су м м а ку б ов циф р числа ра вн я ет ся са м ом у числу . Н а йд ен н ые числа отоб ра зит ь в поле ред а кт ора Memo, под счит а т ь их количест во. Окн о ра б от а ю щего прилож ен ия :
27
11. Д а н од н ом ерн ый целочислен н ый м а ссив из 20 э лем ен тов. В вести его э лем ен т ы с кла виа т у ры в поле Memo и у д а лит ь послед н ий м а ксим а льн ый э лем ен т м а ссива . Окн о прилож ен ия :
12. Д а н од н ом ерн ый целочислен н ый м а ссив a из 20 э лем ен тов. В вест и его э лем ен ты с кла виа т у ры в поле Memo, а за тем , использу я м ет од ы кла сса TStrings, перест а вит ь э лем ен ты м а ссива a та к, чтоб ы он и ра сполож ились в след у ю щем поря д ке a1, a11, a2, a12, … , a10, a20 . Окн о прилож ен ия :
28
2.4 С писок List Box И спользов ани е ком поне нт а ListBox на эт апе конст р уи р ов ани я фор м ы Прим ер3. Н а писа ть програ м м у , кот ора я пересчитыва ет вес из ф у н т ов в килогра м м ы с у чёт ом того, что в ра зн ых ст ра н а х ф у н т “ весит ” пора зн ом у . Россия 0.4059 А н глия 0.453592 А встрия 0.56001 Герм а н ия 0.5 Д а н ия 0.5 И сла н д ия 0.5 И т а лия 0.31762 Н ид ерла н д ы 0.5
29 В д иа логовом окн е програ м м ы д ля выб ора стра н ы использу ет ся список (ListBox). Д ля ра зра б а т ыва ем ой програ м м ы н а иб ольш ий ин т ерес пред ст а вля ю т д ва свойст ва ком пон ен т а ListBox: Items и Item Index. Свойст во Items им еет т ип TStrings и сод ерж ит э лем ен ты списка . Список, вывод им ый в поле ListBox, м ож ет б ыт ь сф орм ирова н во врем я созд а н ия ф орм ы или д ин а м ически, во врем я ра б оты програ м м ы. Д ля ф орм ирова н ия списка во врем я созд а н ия ф орм ы прилож ен ия н а д о после д об а влен ия в ф орм у ком пон ен т а ListBox в окн е Object Inspector выб ра т ь свойст во Items и щёлкн у т ь н а кн опке ред а кт ора списка строк, н а которой изоб ра ж ен ы три т очки. В поя вивш ем ся д иа логовом окн е StringListEditor (ред а кт ор списка ст рок) след у ет н а б ра т ь список, пом ест ив ка ж д ый э лем ен т списка н а от д ельн ой строке. В вод очеред н ого э лем ен т а списка д олж ен за ка н чива т ься н а ж а тием кла виш и Enter. После ввод а всех э лем ен тов списка н у ж н о щёлкн у т ь н а кн опке Ok. Свойст во Item Index во врем я ра б оты програ м м ы сод ерж ит н ом ер выб ра н н ого э лем ен та списка . Е сли н и од ин из э лем ен т ов списка н е выб ра н , то зн а чен ие Item Index ра вн о м ин у с ед ин ице. Н иж е перечислен ы ком пон ен т ы ф орм ы с у ка за н ием пред н а зн а чен ия . К ом пон ен т (свойство Name) Пред н а зн а чен ие List Box 1
В ыб ор ст ра н ы
Edit 1 Label 1,Label 2, Label 3
В вод веса в ф у н т а х В ывод поя сн ит ельн ого т екст а
Label 4 Button 1
В ывод резу льт а т а пересчёта А кт ивиза ция процед у ры пересчёт а .
procedure TForm1.Button1Click( Sender : TObject); var funt , kg, k : real; begin case List Box1.Item Index of 0: k:=0.4059; 1: k:=0.453592; 2: k:=0.56001; 3..5, 7 : k:=0.5; 6: k:=0.31762 end; funt:=StrToFloat(Edit1.Text); kg:=k ∗ funt; Label4.Caption:=Edit1.Text + ′ ф у н т (а /ов) – э то ′ + FloatToStrF(kg, ffFixed,6,3) + ′ кг ′; end;
30 Задачи . 13. Н а писа т ь програ м м у , выполн я ю щу ю ра б от у а риф м етического ка льку ля т ора с четырьм я а риф м ет ическим и д ейст вия м и н а д д ейст вит ельн ым и числа м и.
14. Н а писа т ь програ м м у д ля вычислен ия зн а чен ия т ригон ом етрической ф у н кции (sin, cos, tg, ctg) д ля д а н н ого д ейст вительн ого числа x. Окн о ра б от а ю щего прилож ен ия :
И спользов ани е ком поне нт а ListBox на эт апе в ы полне ни я пр огр ам м ы Ф орм ирова н ие списка ListBox м ож ет происход ить н е т олько н а э т а пе кон ст ру ирова н ия ф орм ы прилож ен ия , н о и д ин а м ически, т о ест ь н а э т а пе выполн ен ия програ м м ы. Проиллю стриру ем э т о н а прим ере реш ен ия след у ю щей за д а чи. Прим ер4. В целочислен н ом м а ссиве из 10 э лем ен т ов (все э лем ен т ы ра зличн ы) н а йти м а ксим а льн ый и м ин им а льн ый э лем ен т ы и пом ен я т ь их м еста м и. (Д ля от об ра ж ен ия м а ссивов в ф орм е использова т ь ком пон ен т ListBox). Ф орм а прилож ен ия д олж н а выгля д ет ь след у ю щим об ра зом :
31
Д ля ввод а целых чисел использу ет ся поле ред а кт ирова н ия Edit1. В вод ка ж д ого числа за верш а ет ся щелчком м ыш и по кн опке В вод. В вед ён н ый м а ссив от об ра ж а ется в поле ListBox1. После щелчка н а кн опке Решени е преоб ра зова н н ый м а ссив отоб ра ж а ет ся в поле ListBox2. В ра зд еле Interface (в ра зд еле описа н ия перем ен н ых var) вст а вим описа н ие м а ссива и использу ем ых перем ен н ых: a : array[1..10] of integer; i, min, max, imax, imin : integer; В ыполн им щелчок по ф орм е Form1. В окн е Object Inspector от кроем вкла д ку Events и в поле им ен и соб ытия OnCreate (созд а н ие ф орм ы) сд ела ем д войн ой щелчок. В от крывш ем ся ред а кт оре код а впеча т а ем ин стру кции в пред лож ен н ой за готовке процед у ры: procedure TForm1.FormCreate(Sender: TObject); begin i:=0; end; З а д а н о н а ча льн ое зн а чен ия ин д екса i м а ссива . В ыд елим кн опку В вод . Н а вкла д ке Events окн а Object Inspector сд ела ем д войн ой щелчок в поле им ен и соб ыт ия OnClick и в поя вивш ейся за готовке процед у ры впеча т а ем н еоб ход им ые ин ст ру кции: procedure TForm1.Button1Click(Sender: TObject); begin ListBox1.Items.Add(Edit1.Text); i:=i+1; a[i]:=StrToInt(Edit1.Text); Edit1.SetFocus end; Ф у н кция Add ф орм иру ет список ListBox1, за полн я я его числа м и, ввод им ым и в поле Edit1. Од н оврем ен н о э т им и ж е числа м и за полн я ет ся м а ссив a. Процед у ра SetFocus у ст а н а влива ет ф оку с ввод а в поле Edit1. Э т о озн а ча ет , чт о после ввод а очеред н ого числа и за н есен ия
32 его в список ListBox1 щелчком по кн опке В вод поле Edit1 сн ова б у д ет а кт ивн ым (т а м б у д ет м ига т ь ку рсор). В ыд елим кн опку Решени е. Н а вкла д ке Events окн а Object Inspector сд ела ем д войн ой щелчок в поле им ен и соб ыт ия OnClick и в поя вивш ейся за готовке процед у ры впеча т а ем н еоб ход им ые ин ст ру кции: procedure TForm1.Button2Click(Sender: TObject); var k : integer; begin max:=a[1]; imax:=1; min:=a[1]; imin:=1; for k:=2 to 10 do begin if maxa[k] then begin min:=a[k]; imin:=k end; end; a[imax]:=min; a[imin]:=max; for k:=1 to 10 do ListBox2.Items.Add(IntToStr(a[k])); end; Задачи 15. З а полн ит ь од н ом ерн ый целочислен н ый м а ссив из 10 э лем ен тов числа м и Ф иб он а ччи. Д ля отоб ра ж ен ия м а ссива в ф орм е использова т ь ком пон ен т ListBox.
16. Д а н од н ом ерн ый целочислен н ый м а ссив a из 10 э лем ен тов. В се э лем ен т ы э т ого м а ссива , пред ш ест ву ю щие первом у по поря д ку э лем ен т у со зн а чен ием max(a1,… ,a10) д ом н ож ит ь н а max (a1,… ,a10 ). Д ля от об ра ж ен ия м а ссивов в ф орм е использова т ь ком пон ен т ListBox.
33
17. Д а н а ст рока , сод ерж а ща я н е б олее 30 сим волов, я вля ю щихся ст рочн ым и ру сским и б у ква м и и за пя тым и. Послед н ий сим вол – т очка . Послед ова т ельн ост ь б у кв м еж д у д ву м я сосед н им и зн а ка м и препин а н ия н а зовём словом . В ывести в поле ком пон ен та ListBox в ст олб ец все слова , м ен я я м ест а м и в ка ж д ом слове перву ю и послед н ю ю б у квы.
2.5 К омпоненты RadioGroup и CheckListBox Па н ель переклю ча телей я вля ет ся э кзем пля ром кла сса TRadioGroup и пред н а зн а чен а д ля выб ора од н ого из н ескольких ва риа н тов. Па н ель переклю ча т елей я вля ется б олее об щим слу ча ем по сра вн ен ию с пере-
34 клю ча т елем RadioButton, который м ож ет н а ход ит ься в од н ом из д ву х состоя н ий: н а ж а т – н е н а ж а т. Па н ель переклю ча телей позволя ет созд а т ь гру ппу переклю ча т елей и опред елит ь, ка кой из н их н а ж а т. К ла сс TRadioGroup я вля ет ся н епосред ст вен н ым потом ком кла сса TCustomRadioGroup, в котором опред елен ы осн овн ые особ ен н ост и па н ели переклю ча телей RadioGroup. Привед ём осн овн ые свойст ва па н ели переклю ча т елей. property Columns : integer; Опред еля ет число колон ок, в кот орые б у д у т пом еща т ься переклю ча т ели. По у м олча н ию число колон ок ра вн о ед ин ице. property ItemIndex : integer; Опред еля ет поря д ковый н ом ер выд елен н ого переклю ча теля . Н у м ера ция н а чин а ет ся с н у ля . Е сли н и од ин из переклю ча т елей н е выд елен , свойст во им еет зн а чен ие -1. property Items : TStrings; Сод ерж ит список н а зва н ий переклю ча т елей. Па н ель переклю ча телей я вля ет ся потом ком кла сса TWinControl и, след ова т ельн о, вход ит в сем ейст во окон н ых э лем ен тов у пра влен ия , кот орые об ра б а тыва ю т все соб ыт ия , возн ика ю щие при использова н ии кла виа т у ры и м ыш и. Соб ытием по у м олча н ию д ля па н ели переклю ча т елей я вля ет ся OnClick, возн ика ю щее при выд елен ии н ового переклю ча т еля при пом ощи кла виа т у ры или м ыш и. Список выклю ча т елей CheckListBox под об ен па н ели переклю ча телей RadioGroup в т ом см ысле, что об а э т и ком пон ен т а пред н а зн а чен ы д ля гру ппирова н ия б олее простых э лем ен тов у пра влен ия : RadioGroup об ъед ин я ет за висим ые переклю ча тели, а CheckListBox – н еза висим ые выклю ча т ели. Е сли в па н ели переклю ча т елей Radio Group выб ра н н ым (н а ж а тым ) м ож ет б ыть т олько од ин переклю ча т ель, то в списке выклю ча т елей CheckListBox ка ж д ый выклю ча т ель м ож ет н а ход ит ься в од н ом из т рёх состоя н ий: вклю чен , выклю чен , н ейт ра льн ое. Ра ссм отрим осн овн ые свойст ва , опред елён н ые в кла ссе TCheckListBox, э кзем пля ром кот орого я вля ет ся список выклю ча т елей. property checked[ index : integer] : boolean; Сод ерж ит сост оя н ие выклю ча т еля с ин д ексом index. И н д екса ция н а чин а ет ся с н у ля . Е сли i-ый выклю ча тель вклю чен , т о Checked[i] им еет зн а чен ие true, в прот ивн ом слу ча е – false. property Items: TStrings; Сод ерж ит список н а зва н ий выклю ча т елей. property OnClickCheck : TNotifyEvent; Н а ст у па ет при изм ен ен ии состоя н ия лю б ого выклю ча теля . Прим ер 5. Созд а д им прилож ен ие, позволя ю щее м ен я ть цвет т екст а , н а б ра н н ого в ст роке ввод а Edit, а т а кж е использова т ь э ф ф ект ы под чёркн у т ого и за чёркн у т ого текст а . Окн о ра б от а ю щего прилож ен ия д олж н о выгля д ет ь след у ю щим об ра зом :
35
Свойст ву Caption ком пон ен т а RadioGroup1 присвоим зн а чен ие ′Ц вет′. В ыд елим свойст во Items и щелкн ем по кн опке с трем я точка м и. В поя вивш ем ся окн е StringListEditor введ ём им ен а переклю ча телей. Д ля ка ж д ого переклю ча т еля выд еля ется од н а ст рока : Ч ёрн ый З елён ый К ра сн ый Cин ий После за верш ен ия ввод а н а ж им а ем кн опку Ok. Свойст во ItemIndex у ст а н овим ра вн ым 0. Э т о озн а ча ет , чт о в н а ча ле ра б от ы выд елен н ым переклю ча т елем б у д ет первый. К ом пон ен т CheckListBox1 б ерём сост ра н ицы Additional Па литры К ом пон ен т ов. В ыб ерем свойст во Items и введ ём н а зва н ия выклю ча т елей: З а чёркн у т ый Под чёркн у т ый В ыполн им д войн ой щелчок н а ком пон ен т е RadioGroup1. В поя вивш ем ся окн е Ред а кт ора К од а за пиш ем опера т оры д ля об ра б от чика соб ытия OnClick, кот орое возн ика ет при выд елен ии н ового переклю ча т еля . procedure TForm1.RadioGroup1Click(Sender: TObject); begin if radiogroup1.itemindex=0 then edit1.font.color:=clblack; if radiogroup1.itemindex=1 then edit1.font.color:=clgreen; if radiogroup1.itemindex=2 then edit1.font.color:=clred; if radiogroup1.itemindex=3 then edit1.font.color:=clblue; end; Д ля ком пон ен та CheckListBox1 н а пиш ем об ра б от чик соб ыт ия OnClickCheck, которое возн ика ет при изм ен ен ии сост оя н ия ка коголиб о выклю ча т еля . procedure TForm1.CheckListBox1ClickCheck(Sender: TObject); begin if checklistbox1.Checked[0]
36 then edit1.font.style:=edit1.font.style + [fsStrikeOut] else edit1.font.style:=edit1.font.style - [fsStrikeOut]; if checklistbox1.Checked[1] then edit1.font.style:=edit1.font.style + [fsUnderLine] else edit1.font.style:=edit1.font.style - [fsUnderLine]; end; Задачи 18. Созд а т ь окон н ое прилож ен ие, позволя ю щее м ен я ть цвет ф орм ы. В ыб ор цвет а осу щест вля т ь с пом ощью ком пон ен т а radiogroup.
19. Созд а т ь окон н ое прилож ен ие, позволя ю щее д ля н а ту ра льн ого числа n, введ ён н ого в поле edit, выполн ит ь д ейст вие, кот орое м ож н о выб ра т ь с пом ощью ком пон ен т а radiogroup.
20. Н а писа т ь програ м м у д ля преоб ра зова н ия введ ён н ой в поле ред а кт ирова н ия строки. В ид преоб ра зова н ия у д а лит ь перву ю за пя т у ю д об а вит ь в кон це строки точку первый зн а к ; за м ен ит ь н а , д олж ен б ыть выб ра н с пом ощью ком пон ен т а radiogroup.
37
2.6 Т аблица StringGrid Д ля ра б оты с м а ссива м и у д об н о использова т ь ком пон ен т StringGrid (ст рокова я т а б лица ), зн а чок кот орого н а ход ит ся н а ст ра н ице Additional Па лит ры К ом пон ен тов. В след у ю щей т а б лице описа н ы н екоторые свойст ва ком пон ен та StringGrid. С вой ство О бознач ение К оличест во колон ок т а б лицы
ColCount
К оличест во строк т а б лицы
RowCount
Соот вет ст ву ю щий т а б лице д ву м ерн ый ст роковый м а ссив (ин д ексы н у м ерова н ы от 0) К оличест во за ф иксирова н н ых колон ок т а б лицы
FixedCols
К оличест во за ф иксирова н н ых строк та б лицы
FixedRows
Cells
Призн а к д опу ст им ост и ред а кт ирова н ия сод ерж и- Options.goEditing м ого я чеек та б лицы Ш ирин а колон ок та б лицы DefaultColWidth В ысот а ст рок т а б лицы Т олщин а лин ий т а б лицы
DefaultRowHeight GridLineWidth
38 лем ен тов целочислен н ой м а т рицы ра зм ера Прим ер6. Н а йти су м м у э 4×4.
В след у ю щей т а б лице привед ен ы зн а чен ия осн овн ых свойст в ком пон ен та StringGrid д ля проект а вычислен ия су м м ы э лем ен т ов целочислен н ой м а трицы ра зм ера 4×4. С вой ство Знач ение ColCount
4
RowCount
4
FixedCols
0
FixedRows
0
Options.goEditing
True
DefaultColWidth
30
DefaultRowHeight
25
GridLineWidth
1
М а ркиру ем ком а н д н у ю кн опку В ычи сли т ь и созд а ём процед у ру об ра б отки соб ыт ия OnClick: procedure TForm1.Button1Click(Sender: TObject); var i, j, s:integer; begin s:=0; for i:=0 to stringgrid1.colcount-1 do for j:=0 to stringgrid1.rowcount-1 do s:=s + strtoint(stringgrid1.cells[i, j]); label3.caption:=inttostr(s) end;
след у ю щу ю
39 След у ет об ра т ит ь вн им а н ие, чт о н у м ера ция строк и столб цов н а чин а ет ся с 0, а в свойст ве Cells[i,j] первый ин д екс об озн а ча ет н ом ер ст олб ца , а второй – н ом ер строки. Задачи 21. З а полн ит ь ква д ра т н у ю целочислен н у ю м а трицу поря д ка n (n=6) след у ю щим об ра зом : 0 0 0 K n 0 n - 1 0 0 K K K KKKKKKKK 0 0 1 K 0
22. Д а н д ву м ерн ый целочислен н ый м а ссив ра зм ера 4×4. Под счит а т ь су м м у э лем ен тов, ст оя щих н а д гла вн ой д иа гон а лью . Д ля от об ра ж ен ия м а ссива использова т ь ком пон ен т StringGrid.
40 23. Д а н а целочислен н а я м а трица ра зм ера 4×4. Полу чит ь ква д ра т э той м а т рицы.
2.7 С оздание меню В Delphi д ля созд а н ия гла вн ого м ен ю , сод ерж а щего перечен ь д опу ст им ых опера ций прилож ен ия , им еется н евизу а льн ый ком пон ен т MainMenu. Гла вн ое м ен ю я вля ет ся э кзем пля ром кла сса TMainMenu. Осн овн ым свойст вом э того кла сса я вля ет ся свойст во property Items : TMenuItem; default; Сод ерж ит э лем ен ты н у левого у ровн я гла вн ого м ен ю прилож ен ия . Ч а ще всего гла вн ое м ен ю созд а ётся н а э т а пе кон стру ирова н ия ф орм ы. Д ля э т ого н еоб ход им о сн а ча ла пом ест ит ь ком пон ен т Main Menu н а ф орм у , а за т ем вызва т ь кон ст ру кт ор м ен ю . Д ля вызова кон ст ру кт ора м ен ю м ож н о д ва ж д ы щелкн у т ь левой кн опкой м ыш и по ком пон ен т у MainMenu. К ром е гла вн ого м ен ю , свя за н н ого с ф орм ой прилож ен ия , в Delphi им еет ся ком пон ен т Popup Menu, пред н а зн а чен н ый д ля созд а н ия кон т екст н ого м ен ю . К он т екстн ое м ен ю м ож ет б ыт ь созд а н о д ля лю б ого окон н ого э лем ен т а у пра влен ия . Д ля вызова кон текст н ого м ен ю н еоб ход им о пом ест ит ь ку рсор м ыш и н а окон н ый э лем ен т и н а ж а т ь пра ву ю кн опку м ыш и. Д ля у ст а н овлен ия свя зи м еж д у окон н ым э лем ен т ом и ком пон ен том Popup Menu использу ет ся свойст во Popup Menu, в
41 кот ором след у ет у ка за т ь им я соответ ст ву ю щего ком пон ен т а -м ен ю . К он текст н ое м ен ю , ка к и гла вн ое, созд а ёт ся при пом ощи кон ст ру кт ора м ен ю (Menu Designer). Э лем ен ты, ка к гла вн ого, т а к и кон текст н ого м ен ю я вля ю т ся об ъект а м и кла сса TMenuItem, кот орый я вля ет ся н епосред ствен н ым потом ком кла сса TComponent. Э лем ен т м ен ю м ож ет пред ст а вля т ь соб ой под м ен ю , ком а н д у или ра зд елит ельн у ю лин ию . Е сли э лем ен т пред ст а вля ет соб ой под м ен ю , им ею щееся у н его свойст во Items д олж н о сод ерж а ть соот вет ст ву ю щие пу н кт ы э того под м ен ю . Е сли э лем ен т я вля ется ра зд елит ельн ой лин ией, т о его свойст во Caption д олж н о сод ерж а т ь зн а чен ие «-» (зн а к «м ин у с»). В о всех ост а льн ых слу ча я х э лем ен т м ен ю б у д ет ком а н д ой, т .е. с э т им э лем ен том м ен ю б у д ет свя за н об ра б от чик соб ытия OnClick. Ра ссм от рим осн овн ые свойст ва кла сса TMenuItem. property Caption : string; Сод ерж ит текст э лем ен т а м ен ю . Е сли перед н екоторым сим волом т екст а пом естит ь сим вол &, то т а ким об ра зом м ож н о за д а т ь кла виш у б ыстрого переход а (а кселера т ор). property Checked : Boolean; Е сли свойст во им еет зн а чен ие true, то э лем ен т м ен ю пом еча ет ся «га лочкой». property Enabled : Boolean; Е сли свойст во им еет зн а чен ие true, то э лем ен т м ен ю реа гиру ет н а соб ытия от м ыш и и кла виа т у ры. В противн ом слу ча е э лем ен т н е д ост у пен и выд еля ет ся т у склым цветом . По у м олча н ию им еет зн а чен ие true. property Items[index : integer] : TMenuItem; default; Свойст во за д а ёт м ла д ш ие э лем ен ты м ен ю по отн ош ен ию к т еку щем у э лем ен т у . Ч исло э лем ен тов опред еля ет ся свойст вом Count. Н у м ера ция н а чин а ет ся с н у ля . Свойст во д ост у пн о т олько д ля чт ен ия . property ShortCut : TShortCut; Опред еля ет ком б ин а цию «горя чих» кла виш , об еспечива ю щих б ыст рый выб ор д а н н ого э лем ен т а м ен ю . В кла ссе TMenuItem опред елен о соб ыт ие property OnClick : TNotifyEvent: В озн ика ет при выб оре э лем ен та м ен ю м ыш ью или при н а ж а т ии н а кла виш у Enter, когд а э лем ен т м ен ю я вля ет ся а кт ивн ым . Э т о ж е соб ыт ие я вля ет ся и соб ыт ием по у м олча н ию . К он текст н ое м ен ю я вля ет ся э кзем пля ром кла сса TPopupMenu, кот орое т а к ж е, ка к и кла сс TMainMenu, я вля ет ся потом ком кла сса TMenu. Ра ссм отрим осн овн ые ха ра кт еристики, которые ввод я тся в кла ссе TPopupMenu. property Alignment : TPopupAlignment; Опред еля ет ра сполож ен ие кон т екстн ого м ен ю отн осительн о ку рсора м ыш и: paLeft – левый верхн ий у гол м ен ю н а ход ит ся у ку рсора ;
42 paRight – пра вый верхн ий у гол м ен ю н а ход ит ся у ку рсора ; paCenter – серед ин а верхн ей гра н ицы м ен ю н а ход ит ся у ку рсора . По у м олча н ию им еет зн а чен ие paLeft. property AutoPopup : Boolean; Е сли свойст во им еет зн а чен ие true, кон т екстн ое м ен ю поя вля ет ся при н а ж а тии пра вой кла виш и м ыш и, если им еет зн а чен ие false, м ен ю н е поя вля ет ся (в э т ом слу ча е след у ет использова т ь м етод Popup). По у м олча н ию им еет зн а чен ие true. М ет од Popup опред еля ет ся след у ю щим об ра зом : procedure Popup(x, y : integer); virtual; В ывод ит н а э кра н м ен ю , при э том коорд ин а т ы его левого верхн его у гла ра вн ы x и y. В кла ссе TPopupMenu опред елен о соб ытие OnPopup: property OnPopup : TNotifyEvent; В озн ика ет при вызове кон т екст н ого м ен ю при н а ж а т ии пра вой кла виш и м ыш и, если свойст во AutoPopup им еет зн а чен ие true, либ о при вызове м етод а Popup. Ра ссм отрим прим ер созд а н ия гла вн ого м ен ю . Прим ер7. Д а н а ква д ра т н а я целочислен н а я м а трица ра зм ера 4×4. Созд а т ь гла вн ое м ен ю , позволя ю щее выб ра т ь од н у из т рёх ком а н д : М а ксим у м (н а хож д ен ие м а ксим у м а э лем ен т ов м а трицы) М ин им у м (н а хож д ен ие м ин им у м а э лем ен т ов м а трицы) Су м м а (н а хож д ен ие су м м ы э лем ен тов м а т рицы) Д ля ввод а и от об ра ж ен ия н а ф орм е э лем ен т ов м а т рицы использова т ь ком пон ен т StringGrid.
Д ля реш ен ия за д а чи пом естим н а ф орм у ком пон ен т StringGrid1 и у ст а н овим ем у зн а чен ия свойств, у ка за н н ые в прим ере 7. Пом естим н а ф орм у ком пон ен т Label1, свойст во Caption которого ра вн о О т вет , и ком пон ен т Label2, в кот ором б у д ем ра зм еща т ь вычислен н ое зн а чен ие. Со стра н ицы Standard пом ест им н а ф орм у ком пон ен т MainMenu. В ыб ерем свойст во Items ком пон ен та MainMenu1 и щёлкн ем по кн опке с т рем я точка м и. Поя вится окн о кон ст ру кт ора м ен ю . В вед ём н а зва н ия пу н кт ов м ен ю (свойст во Caption). Д ля опред елен ия реа кции н а выб ор пу н кт ов м ен ю след у ет по очеред и выб ира т ь все пу н кт ы м ен ю и щёл-
43 ка т ь по н им м ыш кой. По у м олча н ию свойст ву Name пу н кт ов м ен ю присва ива ю т ся соот вет ст вен н о им ен а N1, N2, N3. Полн ый т екст програ м м ы: type TForm1 = class(TForm) StringGrid1: TStringGrid; Label1: TLabel; Label2: TLabel; MainMenu1: TMainMenu; N1: TMenuItem; N2: TMenuItem; N3: TMenuItem; procedure N1Click(Sender: TObject); procedure N2Click(Sender: TObject); procedure N3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.N1Click(Sender: TObject); var i,j,s:integer; begin s:=0; for i:=0 to stringgrid1.colcount-1 do for j:=0 to stringgrid1.rowcount-1 do s:=s + strtoint(stringgrid1.cells[i,j]); label2.caption:=inttostr(s) end; procedure TForm1.N2Click(Sender: TObject); var i,j,max:integer; begin max:=strtoint(stringgrid1.cells[0,0]); for i:=0 to stringgrid1.colcount-1 do for j:=0 to stringgrid1.rowcount-1 do if strtoint(stringgrid1.cells[i,j])>max then max:=strtoint(stringgrid1.cells[i,j]); label2.Caption:=inttostr(max) end; procedure TForm1.N3Click(Sender: TObject); var i,j,min:integer; begin min:=strtoint(stringgrid1.cells[0,0]); for i:=0 to stringgrid1.colcount-1 do for j:=0 to stringgrid1.rowcount-1 do
44 if strtoint(stringgrid1.cells[i,j])<min then min:=strtoint(stringgrid1.cells[i,j]); label2.Caption:=inttostr(min) end; end. Ра ссм от рим прим ер созд а н ия кон т екст н ого м ен ю . Прим ер8. Созд а т ь кон т екст н ое м ен ю д ля изм ен ен ия цвет а и ра зм ера ш риф т а в поле строки ввод а Edit.
Ра зм ест им н а ф орм е строку ввод а Edit1 и у ст а н овим её свойст ва : Width = 210 Height=70 AutoSize=false В поле Edit1 пом ест им ком пон ен т PopupMenu1 (кон т екст н ое м ен ю м ож н о б у д ет вызва т ь н а ж а т ием пра вой кн опки м ыш и в поле Edit1). В ыд елив ком пон ен т PopupMenu1, н а ж м ём н а кн опку с т рем я точка м и около свойства Items. От кроется окн о кон стру кт ора м ен ю . В э том окн е сн а ча ла введ ём н а зва н ия под м ен ю : Цвет и Ра змер. З а тем выд елим н а зва н ие Ц вет и н а ж м ём н а пра ву ю кн опку м ыш и. В от крывш ем ся кон т екст н ом м ен ю выб ерем пу н кт Create SubMenu и введ ём н а зва н ия пу н кт ов под м ен ю Ц вет „ кра сный си ни й . А н а логичн о введ ём пу н кт ы под м ен ю Ра змер„ 16 24 . Д ля опред елен ия реа кции н а выб ор пу н ктов м ен ю след у ет по очеред и выб ира т ь все пу н кт ы м ен ю и щёлка т ь по н им м ыш кой. Процед у ра об ра б отки соб ыт ия выб ора пу н кт а м ен ю Ц вет „ кра сный : procedure TForm1.N2Click(Sender: TObject); begin edit1.Font.Color:=clred; end; Процед у ра об ра б отки соб ыт ия выб ора пу н кт а м ен ю Ц вет „ си ни й : procedure TForm1.N3Click(Sender: TObject); begin edit1.Font.Color:=clblue; end; Процед у ра об ра б отки соб ыт ия выб ора пу н кт а м ен ю Ра змер„ 16 : procedure TForm1.N5Click(Sender: TObject); begin edit1.Font.size:=16 end; Процед у ра об ра б отки соб ыт ия выб ора пу н кт а м ен ю Ра змер„ 24 : procedure TForm1.N6Click(Sender: TObject); begin edit1.Font.size:=24 end; В за клю чен ие у ст а н овим свойст во PopupMenu ком пон ен та Edit1 ра вн ым PopupMenu1.
45 Задачи 24. Д а н а ква д ра тн а я целочислен н а я м а т рица ра зм ера 4×4. Созд а т ь прилож ен ие с гла вн ым м ен ю д ля выб ора од н ой из т рёх ком а н д , позволя ю щих н а йт и количест во: от рица т ельн ыхэ лем ен т ов м а трицы полож ит ельн ых э лем ен тов м а т рицы н у левых э лем ен тов м а трицы Д ля ввод а и от об ра ж ен ия н а ф орм е э лем ен т ов м а т рицы использова т ь ком пон ен т StringGrid. Окн о ра б от а ю щего прилож ен ия :
25. Д а н а ква д ра тн а я целочислен н а я м а т рица ра зм ера 4×4. Созд а т ь прилож ен ие с гла вн ым м ен ю д ля выб ора од н ой из т рёх ком а н д , позволя ю щих н а йт и н ом ер ст роки с м ин им а льн ой су м м ой э лем ен тов строки с м ин им а льн ым м а ксим а льн ым э лем ен том ст роки с м ин им а льн ым первым э лем ен том строки Д ля ввод а и от об ра ж ен ия н а ф орм е э лем ен т ов м а т рицы использова т ь ком пон ен т StringGrid. Окн о ра б от а ю щего прилож ен ия :
46 26. Д а н ы д ве ква д ра т н ые целочислен н ые м а т рицы a и b ра зм ера 4×4. Созд а т ь прилож ен ие с гла вн ым м ен ю д ля выб ора од н ой из т рёх ком а н д , позволя ю щих н а йти a+b a– b a∗ b Д ля ввод а и от об ра ж ен ия н а ф орм е э лем ен тов м а триц a и b, а т а кж е м а т рицы, полу ча ю щейся в резу льт а т е, использова т ь ком пон ен ты StringGrid1, StringGrid2 и StringGrid3. Окн о ра б от а ю щего прилож ен ия :
Л итература. 1. К а н д зю б а С.П. Delphi 5. Ба зы д а н н ых и прилож ен ия . Лекции и у пра ж н ен ия / С.П. К а н д зю б а , В .Н . Гром ов – К . : Д иа Соф т, 2001. – 592 с. 2. Ф а рон ов В .В . Сист ем а програ м м ирова н ия Delphi / В .В . Ф а рон ов – СПб . : БХВ – Пет ерб у рг, 2004. – 912 с.
47
С одерж ание 2.1 К ла ссы и об ъект ы...................................................................................3 2.2 Созд а н ие простейш его окон н ого прилож ен ия ..................................11 2.3 Т екст овый ред а кт ор Memo...................................................................22 2.4 Список ListBox.......................................................................................28 2.5 К ом пон ен ты RadioGroup и CheckListBox...........................................33 2.6 Т а б лица StringGrid...................................................................................37 2.7 Созд а н ие м ен ю .........................................................................................40 Литера т у ра ........................................................................................................46
А вт ор Са д овска я Ольга Борисовн а Ред а кт ор Т ихом ирова О.А .