08.01.2015 Views

PDF - Xakep Online

PDF - Xakep Online

PDF - Xakep Online

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

60<br />

Êîäèíã<br />

UNDER CONTROL<br />

Horrific aka Ôëåíîâ Ìèõàèë (smirnandr@mail.ru)<br />

www.cydsoft.com/vr-online<br />

Êàê îïðåäåëÿåòñÿ äëèíà ìàññèâà Î÷åíü ïðîñòî, ýòî äàæå ïîõîæå íà ãåîìåòðè÷åñêîå<br />

îïðåäåëåíèå. Íàïðèìåð, òåáå íóæåí ìàññèâ èç 12 çíà÷åíèé. Äëèíà òàêîãî<br />

ìàññèâà ìîæåò áûòü [0..11] èëè [1..12]. Â êâàäðàòíûõ ñêîáêàõ òû äîëæåí ïîñòàâèòü<br />

íà÷àëüíîå çíà÷åíèå ìàññèâà è êîíå÷íîå, à ìåæäó íèìè äâå òî÷êè.<br />

×òîáû ïîëó÷èòü äîñòóï ê îòäåëüíîìó ýëåìåíòó ìàññèâà íóæíî íàïèñàòü ñëåäóþùèé<br />

êîä:<br />

r[4]:=Çíà÷åíèå;<br />

Âîò òàê ìîæíî ïðèñâîèòü 4-ìó ýëåìåíòó ìàññèâà êàêîå-íèáóäü çíà÷åíèå.<br />

Ïåðâûé ìàññèâ SySColorArray - ýòî ìàññèâ èç 13 (õîðîøåå ÷èñëî) öåëûõ ÷èñåë.<br />

Òàê êàê ýòî ó ìåíÿ êîíñòàíòà, òî ÿ äîëæåí ïîñòàâèòü â êîíöå çíàê “ðàâíî” è â ñêîáêàõ<br />

ïåðå÷èñëèòü âñå çíà÷åíèÿ ìàññèâà.  êà÷åñòâå êîíñòàíò ÿ ïåðå÷èñëÿþ çíà÷åíèÿ<br />

ñèñòåìíûõ öâåòîâ, êîòîðûå áóäóò ìåíÿòüñÿ (COLOR_ACTIVEBORDER,<br />

COLOR_ACTIVECAPTION è ò. ä.). ß áóäó ñëó÷àéíûì îáðàçîì âûáèðàòü èç ýòîãî<br />

ìàññèâà èìÿ ñèñòåìíîãî öâåòà è ìåíÿòü åãî çíà÷åíèå.<br />

×òî òàêîå COLOR_ACTIVEBORDER, COLOR_ACTIVECAPTION... Ýòî òîæå êîíñòàíòû.<br />

Ïîä êàæäîé èç íèõ ñïðÿòàíî ïðîñòîå ÷èñëî. Íàïðèìåð, COLOR_ACTIVEBORDER -<br />

ýòî ïðîñòîå ÷èñëî 10. Êàæäîå òàêîå ÷èñëî îçíà÷àåò íîìåð ñèñòåìíîãî öâåòà. ß<br />

ìîã áû èñïîëüçîâàòü âìåñòî êîíñòàíò ÷èñëà, íî ýòî áóäåò íåóäîáíî, è ÷èòàòü òàêîé<br />

êîä ïðîñòî ïðîòèâíî.<br />

Âòîðàÿ êîíñòàíòà ColorArray - ìàññèâ èç 10 öâåòîâ. Èç íåãî ìû áóäåì âûáèðàòü<br />

ñëó÷àéíûì îáðàçîì ëþáîé öâåò è óñòàíàâëèâàòü åãî â ñèñòåìó.<br />

Ñàì êîä ïðîöåäóðû î÷åíü ïðîñò è ñîñòîèò òîëüêî èç âûçîâà ôóíêöèè SetSysColors.<br />

 êà÷åñòâå ïàðàìåòðà ÿ óêàçûâàþ ñëåäóþùèå çíà÷åíèÿ:<br />

1. Åäèíèöà - ÿ áóäó ìåíÿòü îäèí ñèñòåìíûé öâåò.<br />

2. SySColorArray[random(13)]<br />

- âûáèðàþ èç<br />

ìàññèâà SySColorArray<br />

ñëó÷àéíîå èìÿ öâåòà îò 0<br />

äî 13 ñ ïîìîùüþ âûçîâà<br />

random(13). Ýòîò ñèñòåìíûé<br />

öâåò áóäåò èçìåíåí.<br />

3. ColorArray[random(10)]<br />

- âûáèðàþ èç ìàññèâà<br />

ColorArray ñëó÷àéíîå çíà-<br />

÷åíèå öâåòà îò 0 äî 10 ñ<br />

ïîìîùüþ âûçîâà random(10).<br />

Ýòîò öâåò áóäåò<br />

óñòàíîâëåí â êà÷åñòâå ñèñòåìíîãî.<br />

Ðèñ 3. Ïàëèòðà “Êðîâàâûé äåíü”<br />

ÀÍÈÌÀÖÈß ÊÍÎÏÎÊ<br />

Ò<br />

ËÈÑÒÈÍÃ 1<br />

procedure TForm1.Timer1Timer(Sender: TObject);<br />

const<br />

SySColorArray: array [0..13] of Integer = (COLOR_ACTIVEBORDER,<br />

COLOR_ACTIVECAPTION, COLOR_APPWORKSPACE, COLOR_BACK-<br />

GROUND, COLOR_BTNFACE, COLOR_BTNTEXT, COLOR_CAPTIONTEXT,<br />

COLOR_INACTIVEBORDER, COLOR_INFOTEXT, COLOR_MENU,<br />

COLOR_MENUTEXT, COLOR_WINDOW, COLOR_WINDOWFRAME,<br />

COLOR_WINDOWTEXT);<br />

ColorArray:array [0..10] of TColor = (clAqua, clBlack, clBlue, clYellow,<br />

clFuchsia, clGreen, clNavy, clRed, clSilver, clWhite, clSkyBlue);<br />

begin<br />

SetSysColors(1, SySColorArray[random(13)], ColorArray[random(10)]);<br />

end;<br />

åïåðü ïðîàíèìèðóåì êíîïêè íà êëàâå. Äëÿ ýòîãî ïî íàæàòèþ âòîðîé êíîïêè<br />

çàïóñòè âòîðîé òàéìåð:<br />

procedure TForm2.Button1Click(Sender: TObject);<br />

begin<br />

Timer2.Enabled:=true;<br />

end;<br />

Òåïåðü ñîçäàé îáðàáîò÷èê ñîáûòèÿ äëÿ âòîðîãî òàéìåðà è â íåì íàïèøè ñîäåðæèìîå<br />

ëèñòèíãà 2. Òóò â îñíîâíîì ïðîñòàÿ ìàòåìàòèêà, äëÿ âû÷èñëåíèÿ, êàêóþ<br />

êíîïêó ñåé÷àñ çàæå÷ü, à êàêóþ ïîòóøèòü. Ñàìûì èíòåðåñíûì ÿâëÿåòñÿ âûçîâ ïðîöåäóðû<br />

SetState. Îíà äîëæíà ìåíÿòü ñîñòîÿíèå êëàâèø. Íî ýòîé ïðîöåäóðû íåò<br />

ñðåäè ñòàíäàðòíûõ áèáëèîòåê â Delphi, åå íóæíî íàïèñàòü. Ïåðåïèøè ëèñòèíã 3<br />

êóäà-íèáóäü â ñâîé ìîäóëü. Ãëàâíîå - âûøå, ÷åì îáðàáîò÷èê ñîáûòèÿ äëÿ âòîðîãî<br />

òàéìåðà.<br />

 ïðîöåäóðå SetState âñåãî òðè ñòðî÷êè êîäà.  ïåðâîé ÿ ïîëó÷àþ òåêóùåå ñîñòîÿíèå<br />

êëàâèàòóðû ñ ïîìîùüþ WinAPI ôóíêöèè GetKeyboardState. Ðåçóëüòàòîì áóäåò<br />

ïåðåìåííàÿ-ìàññèâ KeyState. Âî âòîðîé ñòðî÷êå ÿ èçìåíÿþ ñîñòîÿíèå íóæíîé<br />

êëàâèøè. È â ïîñëåäíåé ñòðîêå ïðîèñõîäèò óñòàíîâêà èçìåíåííîãî ñîñòîÿíèÿ êëàâû<br />

ñ ïîìîùüþ SetKeyboardState.<br />

ÏÐÅËÞÁÎÄÅÉÑÒÂÓÉ!<br />

Ï<br />

ËÈÑÒÈÍÃ 2<br />

procedure TForm1.Timer2Timer(Sender: TObject);<br />

begin<br />

Timer2.Tag := (Timer2.Tag + 1) mod 4;<br />

SetState(VK_NUMLOCK, Timer2.Tag = 1);<br />

SetState(VK_SCROLL, Timer2.Tag = 2);<br />

SetState(VK_CAPITAL, Timer2.Tag = 3);<br />

end;<br />

ðèìåð çàêîí÷åí. Ìîæåøü çàïóñòèòü åãî è ïðåëþáîäåéñòâîâàòü ñ ðåçóëüòàòîì.<br />

Ñêðèíû ïîëó÷èâøèõñÿ ó ìåíÿ ïàëèòð ðàçáðîñàíû ïî âñåé ñòàòüå, è òû<br />

ñðàçó ìîæåøü ïðî÷óâñòâîâàòü âñå ïðåëåñòè àíèìàöèè. Õî÷ó ñðàçó ïðåäóïðåäèòü,<br />

÷òî ñèñòåìíàÿ ïàëèòðà õîðîøî ìåíÿåòñÿ â ëþáûõ âåðñèÿõ îêîøåê. À âîò<br />

ëàìïî÷êè íà êëàâå çàìîðãàþò òîëüêî â Win9x.  Windows 2000 ëàìïî÷êè íå ìîðãàþò,<br />

õîòÿ ñîñòîÿíèå êëàâèø ðåàëüíî ìåíÿåòñÿ.<br />

Äîïîëíèòåëüíóþ èíôó,<br />

êàê âñåãäà, ìîæíî íàéòè<br />

íà ìîåì ñàéòå www.cydsoft.com/vr-online.<br />

Åñëè<br />

òû ðåãóëÿðíî ÷èòàåøü Õ<br />

è èñïîëüçóåøü ìîè íàñòàâëåíèÿ<br />

äëÿ ïðèêîëîâ<br />

íàä ñâîèìè äðóçüÿìè, òî<br />

òâîè æåðòâû óæå äîëæíû<br />

áûëè ïåðåëîìàòü òåáå<br />

ðóêè :). Åñëè ýòî òàê, òî<br />

òû íå ñìîæåøü íàïèñàòü<br />

ïðèìåð. Ïîýòîìó ê ìîìåíòó<br />

âûõîäà æóðíàëà â<br />

Ðèñ 4. Ïàëèòðà “ß ó ìàìû ...”<br />

ñâåò ÿ, êàê âñåãäà, âûëîæó<br />

èñõîäíèêè ïðèìåðà<br />

íà ñâîåì ñàéòå, è òû áåç ïðîáëåì ñìîæåøü èõ çàáðàòü è îòîìñòèòü. Àìèíü!!!<br />

P.S. Ó ìåíÿ ê òåáå ïðîñüáà, íà ñòî áàêñîâ :). Íå ïèøè ìíå áîëüøèå ïèñüìà. Ïîñëå<br />

ïîÿâëåíèÿ ðóáðèêè “êîäèíã” ìåíÿ êàæäûé äåíü âàëÿò âîïðîñàìè. ß íå â ñîñòîÿíèè<br />

âñåì ðàññêàçûâàòü òî, î ÷åì ïèøóò êíèãè. ß ìîãó ÷òî-òî ïîäñêàçàòü, ãäåòî<br />

ïîìî÷ü, íî íå áîëüøå. À ïðîñüáû òèïà ïîìîãè íàïèñàòü ïðîãó - âîîáùå íåðåàëüíû.<br />

ß îòâå÷àþ òîëüêî íà òå âîïðîñû, ãäå îòâåò çàéìåò íåñêîëüêî ñòðî÷åê. Öåëûå<br />

ëåêöèè ïî ìûëó ÿ ðàçâîäèòü íå ìîãó. ß áû ñ óäîâîëüñòâèåì ïîìîã âñåì, íî<br />

ýòî ÍÅÂÎÇÌÎÆÍÎ. Âàñ ñëèøêîì ìíîãî, à ÿ îäèí :(((. Ïîýòîìó ëó÷øå ðàçáåé ñâîé<br />

âîïðîñ íà íåñêîëüêî ìàëåíüêèõ è ñïðàøèâàé ïîñòåïåííî, à íå âñå ñðàçó.<br />

ËÞÁÈØÜ ÊÎÄÈÒÜ<br />

ËÈÑÒÈÍÃ 3<br />

procedure SetState(key: Integer; Value: Boolean);<br />

var<br />

KeyState: TKeyboardState;<br />

begin<br />

GetKeyboardState(KeyState);<br />

KeyState[key] := Integer(Value);<br />

SetKeyboardState(KeyState);<br />

end;<br />

ÍÀÐÎÄÍÀß ÌÓÄÐÎÑÒÜ<br />

ËÞÁÈ È ÁÀÃÈ ÏÐÀÂÈÒÜ

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!