Òåìà 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. Âûáåðèòå êîìàíäó "FileNewIcon file", è ðèñóéòå íà çäîðîâüå!

Name – èìÿ êîìïîíåíòà ôîðìû. Ýòî ñâîéñòâî âìåñòå ñî ñâîéñòâîì Caption ìû óæå ðàññìàòðèâàëè, òàê ÷òî ïðîñòî âñïîìíèì, ÷òî Name ãëàâíîé ôîðìû æåëàòåëüíî âñåãäà óêàçûâàòü îäèíàêîâî, íàïðèìåð, fMain.

Position – ðàñïîëîæåíèå îêíà. Äîâîëüíî âàæíîå ñâîéñòâî! Îíî èìååò íåñêîëüêî çíà÷åíèé:

·                     PoDefaultWindows ñàì áóäåò ðåøàòü, ãäå ðàñïîëîæèòü Âàøå îêíî íà ýêðàíå, è êàêèå ó íåãî áóäóò ðàçìåðû.

·                     PoDefaultPosOnlyWindows ðåøàåò, ãäå áóäåò îêíî, à ðàçìåðû åãî áóäóò òàêèìè æå, êàê Âû èõ óñòàíîâèëè.

·                     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

Ýòà èíñòðóêöèÿ ïðèìåíÿåòñÿ â òîì ñëó÷àå, êîãäà íóæíî âûïîëíèòü íåñêîëüêî ðàç îïðåäåëåííûå äåéñòâèÿ. Ïðè÷åì çàðàíåå íå èçâåñòíî, ñêîëüêî ðàç ýòîò öèêë âûïîëíÿòü – ýòî ñòàíîâèòñÿ ÿñíî òîëüêî âî âðåìÿ ðàáîòû ïðîãðàììû.

Ñèíòàêñèñ èíñòðóêöèè òàêîé:

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;", òî ýòîãî íèêîãäà áû íå ïðîèçîøëî, è ìû çàöèêëèëè áû ïðîãðàììó! Ïîïðîáóéòå âûïîëíèòü ýòîò ïðèìåð â íîâîì ïðîåêòå, ïðèâÿçàâ êîä ê îáðàáîòêå íàæàòèÿ êíîïêè.  äàëüíåéøåé ïðàêòèêå Âàì íå ðàç ïðèäåòñÿ èñïîëüçîâàòü ýòîò öèêë ñ êóäà áîëåå ïîëåçíûìè ïðèìåðàìè.