Ф Е Д Е Р АЛ Ь Н О Е АГ Е Н Т С Т В О П О О Б Р АЗО В АН И Ю В О Р О Н Е Ж С К И Й Г О С У Д АР С Т В Е Н Н Ы Й У Н И В Е Р С И Т Е Т
С адовская О .Б .
П рограммирование в среде 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 <= memo1.Lines.count-1 do if length(memo1.Lines.Strings[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 max
a[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
А вт ор Са д овска я Ольга Борисовн а Ред а кт ор Т ихом ирова О.А .