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 />
ËÞÁÈ È ÁÀÃÈ ÏÐÀÂÈÒÜ