Òåìà 8: Ñâîéñòâà
Çäåñü âû ïîçíàêîìèòåñü ñî ñâîéñòâàìè ôîðìû
è êíîïêè. Èçó÷èòå óïðàâëÿþùóþ êîíñòðóêöèþ case è öèêë
while. Íàïèøèòå øóòî÷íîå ïðèëîæåíèå, èñïîëüçóÿ
ïðîéäåííûé ìàòåðèàë.
Ìû ñäåëàëè óæå íåìàëî ïðîåêòîâ, íî ïîêà íå
íàó÷èëèñü, êàê ñëåäóåò ñîçäàâàòü ôîðìó. Ðàçáåðåì íåñêîëüêî ïîëåçíûõ ñâîéñòâ
ôîðìû, ÷òîáû óëó÷øèòü åå âèä.
BorderIcons – ñâîéñòâî îïðåäåëÿåò,
êàêèå êíîïêè äîëæíû áûòü ó ïîëó÷åííîãî îêíà. Èìååò òîëüêî 4 çíà÷åíèÿ, êàæäîå èç
êîòîðûõ ìîæåò áûòü True, òî åñòü êíîïêà åñòü, è
False, òî åñòü, åå íåò.
·
BiSystemMenu îïðåäåëÿåò, áóäåò ëè ó
ôîðìû ñèñòåìíîå ìåíþ, êîòîðîå ïîêàçàíî â âèäå èêîíêè ñëåâà íà çàãîëîâêå îêíà.
Êðîìå òîãî, áóäóò ëè òàì äðóãèå êíîïêè çàãîëîâêà.
·
BiMinimize îïðåäåëÿåò êíîïêó
ìèíèìèçàöèè (ñâîðà÷èâàíèÿ) îêíà. Ïðè ýòîì False íå óáèðàåò ñàìó êíîïêó,
à òîëüêî äåëàåò åå íåàêòèâíîé.
·
BiMaximize òî÷íî òàêæå îïðåäåëÿåò
êíîïêó ðàçâîðà÷èâàíèÿ îêíà.
·
BiHelp – êíîïêà ïîìîùè â âèäå
âîïðîñèòåëüíîãî çíàêà. Íå ïîêàæåòñÿ ó îáû÷íîãî âèäà ôîðìû, äàæå åñëè ïîñòàâèòü
â True.
BorderStyle – ñâîéñòâî ôîðìû,
îïðåäåëÿåò åå îáùèé âèä. Ìîæåò áûòü:
·
BsSizeable – îáû÷íîå îêíî.
Óñòàíîâëåíî ïî óìîë÷àíèþ. Ñòàíäàðòíîå îêíî, êîòîðîå ìîæåò ìåíÿòü ðàçìåðû.
·
BsDialog – îêíî â ôîðìå äèàëîãà,
èìååò òîëüêî êíîïêó "çàêðûòü".
·
BsNone – îêíî âîîáùå áåç
îáîðêè è áåç çàãîëîâêà îêíà.
·
BsSingle – îòëè÷àåòñÿ îò
îáû÷íîãî îêíà òåì, ÷òî ó íåãî íåëüçÿ èçìåíèòü ðàçìåðû.
·
BsSizeToolWin – îêíî ñ òîíêîé
îáîðêîé. Îñîáåííî ýòî çàìåòíî ó çàãîëîâêà îêíà.
·
BsToolWindow – òàêîå æå, êàê
ïðåäûäóùåå, íî ó ýòîãî îêíà íåëüçÿ ìåíÿòü ðàçìåðû.
BorderWidth – øèðèíà îáîðêè îêíà.
Ïî óìîë÷àíèþ óñòàíîâëåí 0.
Color – öâåò ðàáî÷åé îáëàñòè
îêíà. Íå î÷åíü-òî óâëåêàéòåñü ðàñêðàñêîé îêîí! Ïî êðàéíåé ìåðå, ïîìíèòå, ÷òî
åñëè âû ðåøèëè ñäåëàòü îêíî, íåïîõîæåå íà ñòàíäàðòíîå, òî âñå îêíà ïðèëîæåíèÿ
ïðèäåòñÿ äåëàòü òàêèìè æå, ÷òîáû ïîääåðæàòü îáùèé ñòèëü ïðîãðàììû. À âîîáùå âñå
ïðîôåññèîíàëüíûå ïðèëîæåíèÿ ñòðåìÿòñÿ èìåòü ñòàíäàðòíûé âèä.
Cursor – âèä óêàçàòåëÿ ìûøè.
Âû âûáèðàåòå, êàê áóäåò âûãëÿäåòü óêàçàòåëü ïðè íàâåäåíèè íà ôîðìó.
Font – âûáîð øðèôòà ïî
óìîë÷àíèþ. Äðóãèìè ñëîâàìè, åñëè Âû èçìåíèòå øðèôò, òî âñå êîìïîíåíòû, óñòàíàâëèâàåìûå
íà ôîðìó, ïî óìîë÷àíèþ ïðèìóò åãî.
Height – âûñîòà îêíà. Îáðàòèòå
âíèìàíèå, ÷òî êîãäà âû ìûøüþ èçìåíÿåòå ðàçìåð îêíà,
ýòî ñâîéñòâî àâòîìàòè÷åñêè ìåíÿåò çíà÷åíèå.
Icon – èêîíêà â çàãîëîâêå
îêíà. Åñëè äâàæäû ùåëêíóòü ïî ýòîìó ñâîéñòâó, âûéäåò îêíî çàãðóçêè äðóãîé
èêîíêè. Ïî óìîë÷àíèþ óñòàíîâëåíà ñòàíäàðòíàÿ èêîíêà Delphi
7, íî ìîæíî ñäåëàòü è ñâîþ ñîáñòâåííóþ. ×àùå âñåãî
èñïîëüçóþò êîëëåêöèè èêîíîê, ñêà÷àííûõ èç èíòåðíåòà. Íî åñëè Âû ÷óâñòâóåòå â
ñåáå òàëàíò õóäîæíèêà, ìîæåòå ïîïðîáîâàòü ñäåëàòü èêîíêó äëÿ ñâîåãî ïðîåêòà
ñàìîñòîÿòåëüíî. Äëÿ ýòîãî èñïîëüçóéòå âñòðîåííóþ óòèëèòó Image
Editor, ÿðëûê êîòîðîé íàõîäèòñÿ òàì æå, ãäå Delphi. Âûáåðèòå êîìàíäó "File
– New – Icon file", è ðèñóéòå íà çäîðîâüå!
Name – èìÿ êîìïîíåíòà ôîðìû.
Ýòî ñâîéñòâî âìåñòå ñî ñâîéñòâîì Caption ìû óæå ðàññìàòðèâàëè,
òàê ÷òî ïðîñòî âñïîìíèì, ÷òî Name ãëàâíîé ôîðìû
æåëàòåëüíî âñåãäà óêàçûâàòü îäèíàêîâî, íàïðèìåð, fMain.
Position – ðàñïîëîæåíèå îêíà. Äîâîëüíî
âàæíîå ñâîéñòâî! Îíî èìååò íåñêîëüêî çíà÷åíèé:
·
PoDefault – Windows
ñàì áóäåò ðåøàòü, ãäå ðàñïîëîæèòü Âàøå îêíî íà ýêðàíå, è êàêèå ó íåãî áóäóò
ðàçìåðû.
·
PoDefaultPosOnly – Windows
ðåøàåò, ãäå áóäåò îêíî, à ðàçìåðû åãî áóäóò òàêèìè æå, êàê Âû èõ óñòàíîâèëè.
·
PoDefaultSizeOnly – ïîçèöèÿ îñòàåòñÿ, êàê
Âû óêàçàëè, íî Windows ðåøàåò, êàêèå ó îêíà áóäóò
ðàçìåðû.
·
PoDesigned – ýòî çíà÷åíèå ïî
óìîë÷àíèþ. È ïîçèöèÿ, è ðàçìåðû îñòàþòñÿ òàêèìè, êàê Âû èõ ñîçäàëè.
·
PoDesktopCenter – âûáèðàéòå ýòîò
âàðèàíò, åñëè æåëàåòå, ÷òîáû îêíî âñåãäà âûõîäèëî ïî öåíòðó ðàáî÷åãî ñòîëà.
·
PoMainFormCenter – ýòî çíà÷åíèå
èñïîëüçóþò äëÿ äî÷åðíèõ îêîí, î êîòîðûõ ðå÷ü áóäåò âïåðåäè. Åñëè ó äî÷åðíåãî
îêíà âûáðàí ýòîò âàðèàíò, òî îíî âñåãäà áóäåò ïîÿâëÿòüñÿ ïî öåíòðó ãëàâíîé
ôîðìû.
·
PoOwnerFormCenter – ýòî çíà÷åíèå çàñòàâèò
äî÷åðíåå îêíî ïîÿâëÿòüñÿ ïî öåíòðó òîãî îêíà, èç êîòîðîãî îíî âûçâàíî.
·
PoScreenCenter – îêíî ïîÿâëÿåòñÿ ïî
öåíòðó ýêðàíà. Ïî÷òè òî æå ñàìîå, ÷òî è PoDesktopCenter.
Width – øèðèíà îêíà. Êàê è
âûñîòà, ýòî ñâîéñòâî ìåíÿåò ñâîå çíà÷åíèå, êîãäà Âû ìåíÿåòå ðàçìåð ôîðìû.
WindowState – ñîñòîÿíèå îêíà ïîñëå
çàïóñêà. Èìååò òðè çíà÷åíèÿ:
·
WsNormal – ïî óìîë÷àíèþ. Îêíî
ïîêàçûâàåòñÿ â íîðìàëüíîì ñîñòîÿíèè.
·
WsMaximized – îêíî ïîÿâëÿåòñÿ â
ðàçâåðíóòîì âèäå.
·
WsMinimized – îêíî ïîÿâëÿåòñÿ â
ñâåðíóòîì âèäå.
Âîò, ñîáñòâåííî, è âñå îñíîâíûå ñâîéñòâà
ôîðìû. Òåïåðü ïîïðîáóéòå ïîýêñïåðèìåíòèðîâàòü ñ ýòèìè ñâîéñòâàìè, è ïîñìîòðåòü,
êàê áóäåò ìåíÿòüñÿ âíåøíèé âèä ôîðìû. Áîëüøèíñòâî èç ýòèõ ñâîéñòâ îáùèå äëÿ âñåõ êîìïîíåíòîâ. Ìû óæå ãîâîðèëè, ÷òî ñâîéñòâà
êîìïîíåíòà (â äàííîì ñëó÷àå, ôîðìû) ìîæíî ðàññìàòðèâàòü êàê ïåðåìåííûå
îïðåäåëåííûõ òèïîâ. Çíà÷åíèÿ â ýòè ñâîéñòâà ÷àùå âñåãî çàíîñÿò â ìîìåíò
ñîçäàíèÿ ôîðìû, ñ ïîìîùüþ Îáúåêòíîãî èíñïåêòîðà. Îäíàêî ìíîãèå ñâîéñòâà
ïîçâîëÿþò çàíîñèòü â íèõ íîâûå çíà÷åíèÿ ïðîãðàììíî, òî åñòü, â ìîìåíò ðàáîòû
ãîòîâîãî ïðèëîæåíèÿ.
Ñâîéñòâà êíîïêè TButton
Çäåñü ìû ðàçáåðåì òîëüêî îñíîâíûå ñâîéñòâà
êíîïêè, êîòîðûå íàì ïðèãîäÿòñÿ äëÿ ðàáîòû, è êîòîðûõ ìû åùå íå çíàåì.
Áîëüøèíñòâî ñâîéñòâ ìû óæå çíàåì. Ñâîéñòâî ModalResult
ìû áóäåì ðàçáèðàòü ïîçäíåå, êîãäà áóäåì ðàáîòàòü ñ ìîäàëüíûìè îêíàìè. Ñåé÷àñ
îáðàùó Âàøå âíèìàíèå òîëüêî íà òðè ñâîéñòâà.
Name – ýòî ñâîéñòâî íàì
âïîëíå çíàêîìî, îíî óêàçûâàåò èìÿ ýòîãî êîìïîíåíòà. Îáû÷íî ìû èçìåíÿëè Name òîëüêî ó ôîðìû, íî â äàëüíåéøåì ïðèó÷àéòåñü èçìåíÿòü
åãî ó âñåõ êîìïîíåíòîâ. Êîãäà ó Âàñ áóäóò ñëîæíûå ôîðìû ñî
ìíîæåñòâîì êíîïîê, î÷åíü ñëîæíî áóäåò îïðåäåëèòü â ðåäàêòîðå êîäà, ÷òî äåëàåò
êíîïêà Button1 èëè Button12. Ïîýòîìó áóäåò ëó÷øå, åñëè Âû ïðèó÷èòåñü äàâàòü
êíîïêàì îñìûñëåííûå íàçâàíèÿ. Ê ïðèìåðó, â ðåäàêòîðå òåêñòîâ ìû óñòàíàâëèâàëè 3
êíîïêè: Çàãðóçèòü, Ñîõðàíèòü è Î÷èñòèòü.
Ñëåäîâàòåëüíî, áûëî áû ïðàâèëüíûì èçìåíèòü èìåíà êíîïîê íà bLoad,
bSave è bClear. Ïåðâàÿ
áóêâà b ïîäñêàæåò íàì, ÷òî ýòî êíîïêà, à íàçâàíèå
ïîñëå ýòîé áóêâû ñêàæåò, ÷òî êíîïêà äîëæíà äåëàòü. Ïðèó÷àéòåñü ñðàçó ê õîðîøåìó
ñòèëþ ïðîãðàììèðîâàíèÿ, åñëè íå õîòèòå èìåòü íåðÿøëèâûé êîä, â êîòîðîì ëåãêî
çàïóòàòüñÿ. Åñëè Âàì íå íðàâÿòñÿ ïðàâèëà, ÷òî ôîðìó ìû íà÷èíàåì ñ áóêâû f, à êíîïêó ñ áóêâû b –
ïðèäóìàéòå ñâîè ïðàâèëà, íî â äàëüíåéøåì âñåãäà ïðèäåðæèâàéòåñü èõ!
Left – ñ ýòèì ñâîéñòâîì ìû
ïîêà ÷òî íå ðàáîòàëè. Ñâîéñòâî Left ïîêàçûâàåò
ïîëîæåíèå êíîïêè îò ëåâîé ãðàíèöû ôîðìû. Åñëè ìû áóäåì ìåíÿòü ýòî çíà÷åíèå,
êíîïêà íà ôîðìå áóäåò äâèãàòüñÿ ïî ãîðèçîíòàëè.
Top – ýòî ïîëîæåíèå êíîïêè
îò âåðõíåé ãðàíèöû ôîðìû. Ðàáîòàåò òàêæå, êàê Left, íî äâèãàåò êíîïêó ïî âåðòèêàëè.
Èíñòðóêöèÿ ìíîæåñòâåííîãî âûáîðà case
Case – èíñòðóêöèÿ
ìíîæåñòâåííîãî âûáîðà.  ñëó÷àå, êîãäà íóæíî âûáðàòü îäèí âàðèàíò èç
íåñêîëüêèõ, ìîæíî êîíå÷íî, âîñïîëüçîâàòüñÿ êîíñòðóêöèåé if. Îäíàêî case ïîçâîëÿåò ñäåëàòü ýòî
íàìíîãî ýôôåêòèâíåå. Ñèíòàêñèñ èíñòðóêöèè òàêîé:
case Ñåëåêòîð of
çíà÷åíèå 1 : begin
Èíñòðóêöèè 1
end;
çíà÷åíèå 2 : begin
Èíñòðóêöèè 2
end;
çíà÷åíèå n : begin
Èíñòðóêöèè n
end
else begin
Èíñòðóêöèè èíà÷å
end;
Çäåñü "Ñåëåêòîð" – ýòî
ïåðåìåííàÿ öåëîãî òèïà èëè ñèìâîëüíîãî òèïà, ëèáî âûðàæåíèå, êîòîðîå âîçâðàùàåò
öåëîå ÷èñëî èëè áóêâó. Áëîê else íå ÿâëÿåòñÿ
îáÿçàòåëüíûì.  ñëó÷àå, åñëè èíñòðóêöèÿ ñîäåðæèò
òîëüêî îäèí îïåðàòîð, èñïîëüçîâàòü ïðîãðàììíûå ñêîáêè begin .. end íåîáÿçàòåëüíî. Ïðèìåð ïðèìåíåíèÿ case:
case i of
1 : ShowMessage('i = 1');
2 : ShowMessage('i = 2');
3 : ShowMessage('i = 3');
4 : ShowMessage('i = 4');
else : ShowMessage ('i íå ðàâíî 1, 2, 3 èëè 4');
end;
Òåïåðü ìû ìîæåì íàïèñàòü øóòî÷íóþ
ïðîãðàììó ñ ôîðìîé è êíîïêîé, ãäå ïîëüçîâàòåëü íè çà ÷òî íà ñâåòå íå ñìîæåò
íàæàòü íà êíîïêó ìûøüþ, ïîòîìó ÷òî êíîïêà áóäåò óáåãàòü îò óêàçàòåëÿ ìûøè. Ýòà
ïðîñòàÿ ïðîãðàììà áûëà îïèñàíà â îäíîì èç íîìåðîâ æóðíàëà "Õàêåð". Îíà
êàê íåëüçÿ ëó÷øå ïîêàçûâàåò, êàêèì îáðàçîì ìîæíî ïðîãðàììíûì ñïîñîáîì ìåíÿòü
ñâîéñòâà. Êàê êíîïêà áóäåò óáåãàòü? Ñ ïîìîùüþ ïðîãðàììíîãî èçìåíåíèÿ ñâîéñòâ Left è Top! Îäíàêî, ÷òîáû
ïîíÿòü êîä ïðîãðàììû îò íà÷àëà äî êîíöà, ïîçíàêîìèìñÿ ñ íîâîé ôóíêöèåé. Ôóíêöèÿ
Random() âîçâðàùàåò ñëó÷àéíîå ÷èñëî. Ýòó ôóíêöèþ åùå íàçûâàþò ãåíåðàòîðîì ñëó÷àéíûõ
÷èñåë. Ñèíòàêñèñ ôóíêöèè î÷åíü ïðîñòîé:
Random( Integer ) : Integer;
Òî åñòü, â êà÷åñòâå ïàðàìåòðà ìû äîëæíû
ïåðåäàòü öåëîå ÷èñëî, è ïîëó÷èòü äðóãîå ÷èñëî â êà÷åñòâå ðåçóëüòàòà. Íàïðèìåð,
Random(5) áóäåò âîçâðàùàòü â
ñëó÷àéíîì ïîðÿäêå ÷èñëà îò 0 äî 4 âêëþ÷èòåëüíî. Òî åñòü, âîçâðàùàåìîå çíà÷åíèå
áóäåò:
0 <= âîçâðàùàåìîå_çíà÷åíèå
< èñõîäíîå_÷èñëî.
Íàøà êíîïêà äîëæíà óáåãàòü îò óêàçàòåëÿ
ìûøè õàîòè÷íî, íåïðåäñêàçóåìî, äëÿ ýòîãî è ïîòðåáóåòñÿ ôóíêöèÿ Random().
Ñîçäàéòå ôîðìó ñðåäíåãî ðàçìåðà è áðîñüòå
íà íåå òîëüêî îäíó êíîïêó. Äëÿ áîëüøåãî ýôôåêòà â ñâîéñòâå Caption ôîðìû íàïèøèòå: "Âûèãðàé ïðèç!". À íà êíîïêå íàïèøèòå
"Íàæìè ìåíÿ".
Êàêîé áû áûñòðîé íè áûëà ðåàêöèÿ ïîëüçîâàòåëÿ,
îíà íèêàê íå ñðàâíèòüñÿ ñî ñêîðîñòüþ, ñ êàêîé ïðîöåññîð îáðàáàòûâàåò
èíñòðóêöèè. À ïðîöåññîð îáðàáàòûâàåò ìèëëèîíû èíñòðóêöèé â ñåêóíäó! Ïîýòîìó ïîëüçîâàòåëü íèêîãäà íå ñìîæåò íàæàòü íà êíîïêó ìûøüþ, íî
ñìîæåò ýòî ñäåëàòü ñ ïîìîùüþ êëàâèøè <Enter> íà
êëàâèàòóðå. Ó÷òåì ýòî. Ñîçäàäèì îáðàáîò÷èê íàæàòèÿ
êíîïêè è òàì íàïèøåì òîëüêî îäíó ñòðîêó:
ShowMessage('Enter íàæèìàòü íå÷åñòíî, ïîëüçóéñÿ ìûøêîé!');
Òåïåðü îñòàëîñü íàïèñàòü êîä óáåãàíèÿ
ìûøè. Â èíñïåêòîðå îáúåêòîâ îòêðîéòå âêëàäêó Events (ñîáûòèÿ). Íàñ
èíòåðåñóåò ñîáûòèå OnMouseMove, êîòîðîå ïðîèñõîäèò
âñÿêèé ðàç, êîãäà óêàçàòåëü ìûøè îêàçûâàåòñÿ íàä êíîïêîé. Ùåëêíèòå äâàæäû ïî
ñîáûòèþ, è â ðåäàêòîðå êîäà ââåäèòå ñëåäóþùåå:
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
index : Integer;
begin
index := random(4); //ïðèñâàèâàåì
ïåðåìåííîé ñëó÷àéíîå çíà÷åíèå îò 0 äî 3
//â çàâèñèìîñòè îò
çíà÷åíèÿ ïåðåìåííîé, âûáèðàåì äåéñòâèå
case index of
0: Button1.Left := Button1.Left + Button1.Width; //äâèãàåì êíîïêó âïðàâî, íà çíà÷åíèå øèðèíû êíîïêè
1: Button1.Left := Button1.Left - Button1.Width; //êíîïêà âëåâî, íà çíà÷åíèå øèðèíû
2: Button1.Top := Button1.Top + Button1.Height; //êíîïêà âíèç, íà çíà÷åíèå âûñîòû
3: Button1.Top := Button1.Top - Button1.Height; //êíîïêà ââåðõ, íà çíà÷åíèå âûñîòû
end; //case
{Åñëè êíîïêà âûøëà çà ïðåäåëû ôîðìû, âåðíåì
åå â ïîëîæåíèå 0}
if Button1.Left < 0 then Button1.Left := 0;
if Button1.Top < 0 then Button1.Top := 0;
if (Button1.Left + Button1.Width) > Form1.Width then
Button1.Left := Form1.Width - Button1.Width;
if (Button1.Top + Button1.Height) > Form1.Height then
Button1.Top := Form1.Height - Button1.Height;
end;
Ðàçáåðåì ýòîò êîä.  ñàìîì íà÷àëå â
ïåðåìåííóþ index ìû çàïèñûâàåì ñëó÷àéíîå ÷èñëî, îò 0
äî 3. Ýòî íàì íóæíî, ÷òîáû çíàòü, êóäà äâèãàòü êíîïêó, âåäü äâèãàòü åå ìîæíî
âëåâî, âïðàâî, ââåðõ èëè âíèç.  çàâèñèìîñòè îò òîãî, êàêîå çíà÷åíèå ìû
ïîëó÷èëè, ïðîãðàììà âûáåðåò íàïðàâëåíèå ïåðåìåùåíèÿ êíîïêè. Äëÿ ýòîãî èñïîëüçóåòñÿ
êîíñòðóêöèÿ case. Åñëè â ïåðåìåííîé ó íàñ ÷èñëî 0, òî
êíîïêà áóäåò äâèãàòüñÿ âïðàâî. Êàê ýòî ïðîèñõîäèò? Ñâîéñòâó Left (ëåâàÿ ïîçèöèÿ) êíîïêè ìû ïðèñâàèâàåì íîâîå çíà÷åíèå – ëåâóþ ïîçèöèþ ýòîé
æå êíîïêè, ïëþñ åå øèðèíó. Äðóãèìè ñëîâàìè, êíîïêà ñäâèíåòñÿ âïðàâî íà
ðàññòîÿíèå, ðàâíîå øèðèíå ýòîé êíîïêè. Òàêèì æå îáðàçîì ìû ñäâèãàåì êíîïêó
âëåâî, åñëè ïåðåìåííîé index áóäåò ïðèñâîåíî ÷èñëî
1. Òîëüêî çäåñü ìû íå ïðèáàâëÿåì, à îòíèìàåì øèðèíó.
Ïî÷òè òàêèì æå îáðàçîì êíîïêà óáåãàåò
ââåðõ èëè âíèç, íî çäåñü ìû èñïîëüçóåì äðóãèå ñâîéñòâà – Top (ðàññòîÿíèå îò âåðõíåé ãðàíèöû îêíà äî êíîïêè) è Height (âûñîòà êíîïêè â ïèêñåëÿõ). Ñîîòâåòñòâåííî, åñëè ìû ïðèáàâëÿåì âûñîòó ê
âåðõíåé ãðàíèöå, êíîïêà óáåãàåò âíèç, è íàîáîðîò.
Êîãäà çàêàí÷èâàåòñÿ êîíñòðóêöèÿ case, ìîæåò îêàçàòüñÿ, ÷òî êíîïêà óáåæàëà çà ïðåäåëû ôîðìû. Ïîýòîìó äàëåå èäåò
ïðîâåðêà – åñëè ëåâàÿ èëè âåðõíÿÿ ãðàíèöû êíîïêè îêàçàëèñü ìåíüøå íóëÿ, òî
âîçâðàùàåì êíîïêó â ïðåäåëû ôîðìû, ïðèñâîèâ ýòîé ãðàíèöå íîëü.
Äàëåå ïðîâåðÿåì äðóãóþ ãðàíèöó îêíà. Åñëè
ëåâàÿ ïîçèöèÿ êíîïêè ïëþñ åå øèðèíà îêàæóòñÿ áîëüøå øèðèíû îêíà, ñëåäîâàòåëüíî,
êíîïêà âûøëà çà ïðåäåëû ãðàíèöû îêíà ñïðàâà. Âîçâðàùàåì åå â ïðåäåëû îêíà,
îòíÿâ îò øèðèíû îêíà øèðèíó êíîïêè.
Òî÷íî òàêæå ïðîâåðÿåì, íå âûøëà ëè êíîïêà
çà íèæíþþ ãðàíèöó îêíà.
Ïîïðîáóéòå ñàìîñòîÿòåëüíî äîáàâèòü íà
ôîðìó åùå îäíó êíîïêó, è çàïðîãðàììèðîâàòü åå ïîâåäåíèå òàêèì æå îáðàçîì.
Ýòà èíñòðóêöèÿ ïðèìåíÿåòñÿ â òîì ñëó÷àå,
êîãäà íóæíî âûïîëíèòü íåñêîëüêî ðàç îïðåäåëåííûå äåéñòâèÿ. Ïðè÷åì çàðàíåå íå
èçâåñòíî, ñêîëüêî ðàç ýòîò öèêë âûïîëíÿòü – ýòî ñòàíîâèòñÿ ÿñíî
òîëüêî âî âðåìÿ ðàáîòû ïðîãðàììû.
Ñèíòàêñèñ èíñòðóêöèè òàêîé:
while óñëîâèå do èíñòðóêöèÿ;
èëè ðàñøèðåííûé âàðèàíò:
while óñëîâèå do begin
èíñòðóêöèÿ 1;
èíñòðóêöèÿ 2;
...
èíñòðóêöèÿ n;
end;
Çäåñü óñëîâèå – ïåðåìåííàÿ èëè âûðàæåíèå
ëîãè÷åñêîãî òèïà. Ñíà÷àëà âû÷èñëÿåòñÿ óñëîâèå. Åñëè óñëîâèå ëîæíî (False), òî öèêë íå âûïîëíÿåòñÿ è ñðàçó çàêàí÷èâàåò ðàáîòó. Åñëè æå óñëîâèå
èñòèííî (True), òî öèêë âûïîëíÿåò èíñòðóêöèè, çàòåì
âíîâü âîçâðàùàåòñÿ ê óñëîâèþ. Åñëè óñëîâèå îïÿòü âîçâðàùàåò True, öèêë âûïîëíÿåòñÿ åùå ðàç, è òàê äî òåõ ïîð, ïîêà óñëîâèå íå âåðíåò False. Áóäüòå îñòîðîæíû ñ ýòèì öèêëîì! Íå âêëþ÷àéòå òóäà óñëîâèå, êîòîðîå
íèêîãäà íå ñòàíåò False. Êîìïüþòåð â òàêîì
ñëó÷àå "çàöèêëèòñÿ", òî åñòü çàâèñíåò. Îáû÷íî äëÿ ýòîãî âíóòðü öèêëà
ïîìåùàþò ñ÷åò÷èê – ïåðåìåííóþ öåëîãî òèïà. Òîëüêî â îòëè÷èå îò öèêëà for, çäåñü ïåðåìåííàÿ íå óâåëè÷èâàåò ñâîå çíà÷åíèå àâòîìàòè÷åñêè, çà ýòèì
äîëæåí ñëåäèòü ñàì ïðîãðàììèñò. Ïðèìåð ïðèìåíåíèÿ èíñòðóêöèè:
i := 1;
while i < 10 do begin
ShowMessage('×èñëî ðàâíî ' + IntToStr(i));
i := i +
1;
end;
 ýòîì ïðîñòîì ïðèìåðå ìû öåëîé ïåðåìåííîé
i ïðèñâàèâàåì çíà÷åíèå 1. Çàòåì âûïîëíÿåì öèêë while äî òåõ ïîð, ïîêà i íå ñòàíåò áîëüøå èëè ðàâíî 10. Åñëè áû ìû âíóòðè öèêëà íå óêàçàëè "i := i + 1;", òî ýòîãî íèêîãäà
áû íå ïðîèçîøëî, è ìû çàöèêëèëè áû ïðîãðàììó! Ïîïðîáóéòå âûïîëíèòü ýòîò ïðèìåð
â íîâîì ïðîåêòå, ïðèâÿçàâ êîä ê îáðàáîòêå íàæàòèÿ êíîïêè. Â äàëüíåéøåé ïðàêòèêå
Âàì íå ðàç ïðèäåòñÿ èñïîëüçîâàòü ýòîò öèêë ñ êóäà áîëåå ïîëåçíûìè ïðèìåðàìè.