Abychom nebyli stßle monotematiΦtφ, a tedy nepsali pouze o produktech Microsoftu, rozÜφ°ili jsme ΦervencovΘ tipy a triky o dva p°φsp∞vky pro v²vojß°e pou₧φvajφcφ prost°edφ Borland C++ Builder a Delphi.
V Excelu m∙₧eme zapisovat, formßtovat (tzn. zobrazovat) nejen Φφsla, ale i datum a Φas, a to vφcero zp∙soby. Dφky jejich vnit°nφmu ulo₧enφ lze s nimi provßd∞t snadno v²poΦty a v²sledek zobrazit v po₧adovanΘm tvaru.
Prßce s datem a Φasem v Excelu 2000 cz
Datum a Φas formßtujeme v bu≥ce na listu seÜitu p°φkazem FORM┴T|BU╥KY, kdy na kart∞ "╚φslo"
vybereme druh "datum" nebo "Φas" a ze seznamu vhodn² p°eddefinovan² formßt. Je-li v bu≥ce zapsan² n∞jak² ·daj, zobrazφ se na kart∞ "╚φslo" v oddφle "Ukßzka" jeho podoba pro vybran² formßt. M∙₧eme vÜak vybrat i druh "vlastnφ" a do polφΦka "Typ" zapsat pomocφ k≤d∙ vlastnφ formßtovßnφ. N∞kterΘ k≤dy jsou uvedeny dßle.
P°ed formßtovßnφm m∙₧e b²t oznaΦena jak jedna bu≥ka, tak celß, i nesouvislß oblast bun∞k, a to i na n∞kolika listech. OznaΦenΘ bu≥ky jsou potom zformßtovßny, je upraveno zobrazenφ v nich zapsan²ch hodnot. Pokud na vyznaΦenΘ oblasti bun∞k stiskneme pravΘ tlaΦφtko myÜi a z mφstnφ nabφdky vybereme p°φkaz FORM┴T BUN╠Kà nebo zadßme klßvesovou zkratku Ctrl+Shift+1 (jedniΦku nad klßvesami s pφsmeny), zobrazφ se totΘ₧ dialogovΘ okno jako v prvΘm zp∙sobu.
Pro formßtovßnφ dat a Φasu lze pou₧φt k≤dy: d (k≤d pro den, day), m (pro zobrazenφ m∞sφce, month), y (pro rok, year, v p°edchozφ verzi to byl k≤d "r"). Pro Φas jsou potom vyhrazena pφsmena h (pro vyjßd°enφ hodiny, hour), m (minuty, minute) a s (pro sekundy, second). Pφsmeno m je jak pro m∞sφce, tak pro minuty. K zßm∞n∞ nem∙₧e dojφt, nebo¥ p°ed minutou musφ b²t v₧dy k≤d h.
Intern∞ je datum vyjßd°eno poΦtem dn∙ od zaΦßtku kalendß°nφho systΘmu a tφm je pro PC 1. 1. 1900 a pro poΦφtaΦe Macintosh 2. 1. 1904. ╚as je vyjßd°en intern∞ jako zlomek dne. ╚as 0:00:00 mß hodnotu 0,0 a 24:00:00 potom 1,0. Tedy nap°. datum a Φas zapsanΘ jako 1.1.2000 12:00:00 jsou vyjßd°eny Φφslem 36526,50. Tento zp∙sob se pou₧φvß ji₧ od "dßvnov∞ku" tabulkov²ch procesor∙ (tehdy nap°. ji₧ od prvnφch verzφ zaniklΘho kalkulßtoru SuperCalc). Tento zp∙sob umo₧≥uje s datem a Φasem poΦφtat.
ZapφÜeme-li k≤d pro formßtovßnφ p°φsluÜnΘ Φßsti dne dvakrßt za sebou, znamenß to, ₧e Φφslice od jednΘ do deseti bude uvedena s vodicφ nulou. Nap°. po zßpisu k≤du dd.mm.yyyy a zßpisu data 1.1. 2000 se v bu≥ce zobrazφ 01.01.2000. ZapφÜeme-li vÜak k≤d jen jednou, nebude vodicφ nula dopln∞na. Zobrazφ se tedy 1.1.2000.To je nejΦast∞jÜφ zp∙sob. Po zßpisu data dojde k implicitnφmu zformßtovßnφ na d.m.yyyy.
Formßtovßnφ data
V ΦeÜtin∞ by se m∞la mezi Φßstmi data psßt mezera. Implicitn∞ se mezera nezobrazuje. Toho m∙₧eme dosßhnout pou₧itφm mezery mezi Φßstmi k≤du pro datum. Nap°. mφsto d.m.yyyy zapφÜeme d. m. yyyy, a potom se po zßpisu, nap°. 21.1.2000, zobrazφ 21. 1. 2000.
Uvedeme-li k≤d pro formßtovßnφ za sebou t°ikrßt, je rozdφl u k≤du dn∙ a m∞sφc∙. U dn∙ se zobrazφ dvouznakovß zkratka dne v t²dnu: po, ·t, st, à P°i pou₧itφ u m∞sφce se m∞sφc zobrazφ °φmsk²mi Φφslicemi. Tak nap°. p°i k≤dovßnφ ddd. mmm. yyyy se pro zapsanΘ datum 1.4.2000 zobrazφ so. IV. 2000.
Uvedeme-li znak Φty°ikrßt, zobrazφ se pln² nßzev dne v t²dnu a pln² nßzev m∞sφce. Tedy nap°. sobota duben 2000, zapφÜeme-li k≤d p°i formßtovßnφ dddd mmmm yyyy do bu≥ky 1.4.2000.
U dn∙ se v∞tÜφ poΦet znak∙ ne₧ Φty°i redukuje na Φty°i. U m∞sφc∙ se p°i p∞ti znacφch zobrazφ prvnφ pφsmeno m∞sφce, tedy l, ·, b, d, à Vφce ne₧ p∞t znak∙ se zredukuje na Φty°i znaky "m".
U roku lze zapsat pouze yy nebo yyyy. Tedy nßÜ letopoΦet lze zkrßtit na "00" (co₧ m∙₧e vzbuzovat asociaci malΘ mφstn∙stky) nebo v ·plnΘm zn∞nφ "2000". ZapφÜeme-li jen "y", dojde k automatickΘmu dopln∞nφ na "yy", p°i t°ech znacφch se tyto znaky zm∞nφ na "yyyy" a pro vφce ne₧ Φty°i znaky jsou tyto znaky automaticky redukovßny na Φty°i.
Po°adφ k≤d∙ pro formßtovßnφ data m∙₧eme podle pot°eby zam∞nit a dopl≥ovat dalÜφ odd∞lovacφ znaky. Lze tak nap°. zapsat yyyy/mm/d a p°i zßpisu 1.4.2000 se zobrazφ 2000/04/1. nebo p°i formßtovacφm k≤du mmmm yyyy, dddd se pro zapsanΘ datum 1.4.2000 zobrazφ duben 2000, sobota.
K≤dy pro formßtovßnφ m∙₧eme pou₧φt i opakovan∞. Tak nap°. po zßpisu d. mmm. yyyy (dddd) obdr₧φme v bu≥ce po zßpisu data 1.4.2000 hodnotu 1. IV. 2000 (sobota). M∙₧eme tΘ₧ odkßzat na bu≥ku obsahujφcφ datum a ve zformßtovanΘ bu≥ce potom obdr₧φme po₧adovan² tvar. Viz obrßzek.
Poznßmka. V p°edchozφch verzφch Excelu byl pro rok pou₧it k≤d "r". Zm∞na m∙₧e v n∞kter²ch situacφch zp∙sobit problΘmy, nebo¥ se mφsto roku zobrazφ pφsmena rrrr. ┌daj musφme p°eformßtovat. Ve v∞tÜin∞ p°φpad∙ dochßzφ k automatickΘ konverzi.
Formßtovßnφ Φasu
U formßtovßnφ Φasu je situace obdobnß. Jeden formßtovacφ znak û p°ed Φφslem nenφ vodicφ nula a dva znaky urΦujφ, ₧e p°ed Φφslicφ od jednΘ do deseti je vodicφ nula. P°φklad: bu≥ku zformßtujeme k≤dem h:mm:ss a po zßpisu 5:5:5 obdr₧φme 5:05:05. Jako odd∞lovaΦ je nejΦast∞ji pou₧ita dvojteΦka, mΘn∞ Φasto pomlΦka. Lze vÜak pou₧φt i jin² znak.
╚as m∙₧eme jeÜt∞ doplnit k≤dy dop./odp., resp. AM/PM, am/pm. Obdr₧φme Φas dopln∞n² zkratkou, zda jde o dopoledne (dop.), nebo odpoledne (odp.). Tedy dvanßctihodinov² cyklus. AnglickΘ zkratky se automaticky konvertujφ na Φesk² text.
Formßtovat datum a Φas lze vφce mΘn∞ libovoln∞. Zßpis je vÜak kodifikovßn. Den m∙₧eme zapsat s odd∞lovaΦi: "." (teΦka), "/" (lomφtko) nebo "-" (pomlΦka) a Φas zapisujeme pouze s odd∞lovaΦi ":" (dvojteΦka), nap°. 9:25:55. Jin² zßpis vede k zßpisu data do bu≥ky jako textu. Pokud p°i zßpisu zapφÜeme mezi Φßstmi data mezeru, je implicitn∞ odstran∞na a datum se zobrazφ bez mezer.
ZapφÜeme-li Φas b∞₧n²m zp∙sobem, dojde k implicitnφmu zformßtovßnφ na h:mm:ss. Pou₧ijeme-li p°i zßpisu Φφslice pro hodiny do 12, m∙₧eme zßpis doplnit o urΦenφ ·seku. Za zapisovan² Φas doplnφme dop., resp. odp.
U sekund lze poΦφtat na zlomky sekund, uvedeme-li za k≤d "s" Φßrku a nuly. Nap°. h:mm:ss,00. Zachytφme tak setiny eskundy. Po zßpisu nap°. 0:5:7,14 se p°i formßtovßnφ k≤dem h:mm:ss,00 zobrazφ Φas 0:05:07,14.
P°i zßpisu zlomk∙ sekund dojde k implicitnφmu zformßtovßnφ podle k≤du mm:ss,0. Je to logickΘ, na zlomky se bude v∞tÜinou poΦφtat jen u minut. Znamenß to vÜak, ₧e p°i zßpisu hodin nebudou hodiny zobrazeny. Nap°. 1:25:50,25 se zobrazφ jako 25:50,2. Zlomek 0,05 se zaokrouhluje sm∞rem dol∙. Pouze v situaci, kdy p°edchßzφ p∞tka, nap°. 5,25, dojde k zaokrouhlenφ na 5,3.
To byly zßkladnφ k≤dy pro formßtovßnφ Φasu. Lze vÜak pou₧φt i k≤dy uvedenΘ do hranat²ch zßvorek. M∙₧eme zapsat [h], [m] a [s]. K≤dy v hranat²ch zßvorkßch nep°evßdφ hodnoty na dvanßctihodinov², Üedesßtiminutov² nebo Üedesßtisekundov² cyklus. Zde vÜak jsou pravidla:
╖ nelze zapsat dva tyto k≤dy vedle sebe,
╖ nelze napsat k≤d v hranat²ch zßvorkßch a p°ed nφm k≤d pro Φas bez hranat²ch zßvorek,
╖ m∙₧eme zapsat k≤d v hranat²ch zßvorkßch a za nφm k≤d bez hranat²ch zßvorek.
Nem∙₧eme tedy bu≥ku zformßtovat na [h]:[mm]:[ss] nebo h:[mm], ale nap°. na [h]:mm:ss, [m]:ss, [h], [m], [s]. Viz obrßzek.
Zapsan² ·daj se p°evede na cel² poΦet zadan²ch jednotek. Tedy 1:00:00 (1 hodina) bude p°i k≤du [m] zobrazena jako 60 a p°i k≤du [s] jako 3600.
V situaci, kdy pot°ebujeme zapsat datum nebo Φas jako text, musφme p°ed zßpisem bu≥ku zformßtovat na text (FORM┴T|BU╥KY, karta "╚φslo", druh "text"). Pou₧ijeme-li vlastnφ formßtovßnφ, zapφÜeme jako k≤d "zavinßΦ" "@".Ten lze zapsat Alt sekvencφ Alt+064.
Vzhledem k internφ konverzi textu na Φφsla lze v Excelu i s takto zapsan²mi daty poΦφtat. Nap°. lze vypoΦφtat rozdφl dat. U Φasu zapsanΘho jako text obdr₧φme po v²poΦtu zlomek. Ten vÜak m∙₧eme zformßtovat nap°. na [s] a obdr₧φme poΦet sekund mezi ob∞ma Φasov²mi hodnotami.
Abychom nemuseli formßty stßle zapisovat, m∙₧eme je kopφrovat. Pro kopφrovßnφ lze pou₧φt tyto postupy:
╖ Na zdrojovΘ bu≥ce zadßme kombinaci klßves Ctrl+C a v cφlovΘ bu≥ce zadßme p°φkaz ┌PRAVY|VLOÄIT JINAK|FORM┴TY. P°φkaz lze pou₧φt za sebou opakovan∞.
╖ Na zdrojovΘ bu≥ce stiskneme tlaΦφtko "Kopφrovat formßt" v panelu nßstroj∙ "Formßt" a na cφlovΘ bu≥ce stiskneme levΘ tlaΦφtko myÜi. Poklepßnφm na tlaΦφtko "Kopφrovat formßt" m∙₧eme potom klepnout postupn∞ na vφce cφlov²ch bun∞k û dokud nestiskneme levΘ tlaΦφtko myÜi znovu nebo klßvesu Esc.
N∞kolik slov k funkcφm pracujφcφm s Φasem
V²Üe uvedenΘ k≤dy lze pou₧φt jako argumenty ve funkci HODNOTA.NA.TEXT.
Chcete v∞d∞t, kter² den jste se narodili? Nic snazÜφho. Do jednΘ bu≥ky, nap°. B2, napiÜte svoje datum narozenφ a do druhΘ funkci odkazujφcφ na tuto bu≥ku. ZapiÜte =HODNOTA.NA.TEXT(B2;"dddd"). Pro zapsanΘ datum vrßtφ funkce den v t²dnu.
Internφ k≤dovßnφ dne a hodin umo₧≥uje spoΦφtat dΘlku trvßnφ n∞jakΘ akce.
Nap°. do bu≥ky B3 zapφÜeme zaΦßtek akce a do bu≥ky C3 konec akce. Jak dlouho bude akce trvat? StaΦφ do bu≥ky, nap°. D3, zapsat =C3-B3, a mßme poΦet dn∙ mezi ob∞ma daty. V²sledek vÜak musφme zformßtovat na Φφslo. Jinak se nßm zobrazφ podivnΘ datum kolem roku 1900. Ji₧ vφme proΦ; Φφslo se p°evedlo na poΦet dn∙ od zaΦßtku kalendß°nφho systΘmu.
Tak nap°. kolik dn∙ mßme na projekt zahßjen² 1.4.2000 (zapφÜeme do bu≥ky B3) a ukonΦen² 30.4.2000 (v bu≥ce C3). Vzorec =C3-B3 vrßtφ 29.1.1900 a po zformßtovßnφ na Φφslo (FORM┴T|BU╥KY, karta "╚φslo", druh "Φφslo") vrßtφ 29,00.
Kolik to ale bude pracovnφch dn∙? Nic snazÜφho, pou₧ijeme funkci NETWORKDAYS. ZapφÜeme =NETWORKDAYS(B3;C3) a obdr₧φme 20 dn∙. JeÜt∞ to vÜak nenφ ono, 24. 4. 2000 je volno. Funkci tedy upravφme na =NETWORKDAYS(B3;C3;"24.4.2000"), a nynφ je ji₧ v²sledek "OK".
Nebo jin² v²poΦet. ZaΦneme na projektu pracovat 1. 4. 2000 a mßme na n∞j 45 pracovnφch dn∙. Kdy skonΦφme? ZapφÜeme funkci =WORKDAY(B3;45). Funkce vrßtφ Φφslo 36679. V²sledku se ji₧ nelekneme, zformßtujeme ho na datum ((FORM┴T|BU╥KY, karta "╚φslo", druh "datum" a vybereme typ vracejφcφ den, m∞sφc a letopoΦet) a obdr₧φme 2.6.2000. Op∞t chyba, mezi zaΦßtkem a koncem jsou t°i svßtky. 24. 4., 1. 5. a 8. 5. Tak tedy upravφme funkci. Dva a vφce argument∙ vÜak ji₧ musφme zapsat do slo₧en²ch zßvorek. Funkce bude vypadat: =WORKDAY(B3;45;{"24.4.2000";"1.5.2000";"8.5.2000"}) a nynφ obdr₧φme 7. 6. 2000.
V²poΦty s Φasov²mi ·daji m∙₧eme pou₧φt nap°. pro v²poΦty v²sledk∙ sout∞₧e. Do jednoho sloupeΦku vedle startujφcφch napφÜeme Φas startu, ten je nap°. po p∞ti minutßch, a do dalÜφ bu≥ky zapφÜeme Φas v cφli. V²poΦet je ji₧ jasn², do ΦtvrtΘho sloupeΦku uvedeme rozdφl. A po se°azenφ tabulky podle v²sledku v²poΦtu mßme hned po°adφ. A m∙₧eme, tak°ka ihned, vyhlßsit vφt∞ze û a zarmoutit "hlem²₧d∞".
Milan Bro₧
Borland C++Builder, Delphi
Rychlost kreslenφ
Nedßvno se na mne obrßtil jeden z Φtenß°∙, kter² podle knihy o C++Builderu napsal program pro kreslenφ fraktßl∙. Pokud jde o zdrojov² k≤d, prakticky se neliÜil od uve°ejn∞nΘ verze, b∞₧el vÜak asi 10x pomaleji.
Po jistΘm pßtrßnφ se ukßzalo, ₧e p°φΦinou byla vlastnost Autosize komponenty Image, kterß obsahovala obrßzek. Zmφn∞n² Φtenß° nastavil u₧ v dob∞ nßvrhu vlastnost Autosize na true a tφm zp∙sobil, ₧e se po vykreslenφ ka₧dΘho bodu p°epoΦφtßvala velikost obrßzku.
Poznamenejme, ₧e nßstroje pro kreslenφ jsou v C++Builderu a v Delphi zapouzd°eny do tzv. canvasu (plßtna). To je t°φda, kterß nabφzφ mj. metody pro vytvo°enφ ·seΦky, kru₧nice apod. Vedle toho ale obsahuje i vlastnost Pixels, co₧ je dvourozm∞rnΘ pole jednotliv²ch grafick²ch bod∙ kreslicφ plochy. Kreslenφ po jednotliv²ch pixelech nenφ p°φliÜ obvyklΘ, je ale mo₧nΘ a v n∞kter²ch p°φpadech û jako t°eba p°i kreslenφ fraktßl∙ û je nezbytnΘ. P°i kreslenφ po jednotliv²ch bodech obvykle znßme velikost obrßzku p°edem, tak₧e je zbyteΦnΘ dßvat vlastnosti Autosize hodnotu true.
ZaÜkrtnutφ komponenty CheckBox
Jednou z b∞₧n²ch souΦßstφ program∙ pro Windows je zaÜkrtßvacφ polφΦko (checkbox). V Delphi a v C++Builderu je reprezentovßno komponentou TCheckBox.
Chceme-li zjistit, zda je n∞kterΘ polφΦko zaÜkrtnutΘ, staΦφ zjistit hodnotu jeho vlastnosti Checked. Stejn∞ lze programov∞ zm∞nit stav polφΦka, staΦφ p°i°adit tΘto vlastnosti podle pot°eby hodnotu true (zaÜkrtnutΘ) nebo false (volnΘ).
Klepneme-li na tuto komponentu myÜφ, jejφ stav se p°epne a zßrove≥ nastane udßlost OnClick; to asi nikoho nep°ekvapφ. ZajφmavΘ ale je, ₧e udßlost OnClick nastane i v p°φpad∞, ₧e stav polφΦka zm∞nφme programov∞, p°i°azenφm hodnoty vlastnosti Checked. Udßlost OnClick ovÜem nastane pouze v p°φpad∞, ₧e p°itom dojde ke zm∞n∞ stavu polφΦka.
To ale znamenß, ₧e pokud bychom cht∞li m∞nit stav polφΦka programov∞ v handleru, kter² reaguje na udßlost OnClick, mohl by vzniknout nekoneΦn² cyklus. Typick²m p°φkladem m∙₧e b²t nßsledujφcφ ukßzka:
Zde p°i udßlosti OnClick m∞nφme stav polφΦka na opaΦn², tedy sna₧φme se naprogramovat to, co polφΦko samo ji₧ umφ. V tomto p°φpad∞ bude polφΦko po klepnutφ chvφli blikat a pak se program zhroutφ pro vyΦerpßnφ zßsobnφku: Klepnutφ na toto polφΦko zp∙sobφ zm∞nu stavu a vyvolß se udßlost OnClick. Program zavolß handler, kter² zp∙sobφ zm∞nu stavu a vyvolß udßlost OnClick, co₧ zp∙sobφ zm∞nu stavu atd.
Borland C++Builder
Deklarace friend
Borland C++Builder 4 a 5 nedokß₧e za jist²ch okolnostφ sprßvn∞ p°elo₧it deklaraci sp°ßtelenΘ funkce (friend). M∙₧eme se s tφm setkat v situaci, kdy jednu funkci û nap°. f() û deklarujeme jako sp°ßtelenou ve dvou r∙zn²ch t°φdßch, nap°. C a D, a v t∞le jednΘ z nich zapφÜeme i definici f(). P°ekladaΦ pak nebude v t∞le f() znßt formßlnφ parametry:
// Soubor pok.cpp
class C
{
public:
friend int f(int); // !
};
class D
{
public:
friend int f(int e)
{
return e; // ?
}
};
Na °ßdku oznaΦenΘm otaznφkem v komentß°i ohlßsφ p°ekladaΦ naprosto nesmyslnou chybu
[C++ Error] pok.cpp(12): E2451 Undefined symbol 'e'
P°itom na skuteΦn²ch identifikßtorech t°φd, funkce a jejφch parametr∙ z°ejm∞ nezßle₧φ.
Tento problΘm mß snadnΘ °eÜenφ û staΦφ definovat funkci f() mimo t∞lo t°φdy C.
class C
{ /* stejnΘ jako p°edtφm */ };
class D
{
public:
friend int f(int e);
};
inline int f(int e)
{ return e; }
OvÜem i p∙vodnφ varianta je syntakticky sprßvnß a konkurenΦnφ p°ekladaΦe (IBM VisualAge C++ 4.0, Microsoft Visual C++ 6.0, Watcom C++ 11) ji bez problΘm∙ p°elo₧φ.
Na zßv∞r bych rßd poznamenal, ₧e uveden² p°φklad sice vypadß jako programßtorskΘ zv∞rstvo, ale vznikl zjednoduÜenφm skuteΦnΘho programu, ve kterΘm Ülo o p°etφ₧en² operßtor +, kter² m∞l za ·kol seΦφst instance dvou r∙zn²ch t°φd.