P R O G R A M U J E M E‘Psychedelic Rock’, ‘Symphonic Rock’, ‘Slow Rock’, ‘Big Band’,‘Chorus’, ‘Easy Listening’, ‘Acoustic’, ‘Humour’, ‘Speech’, ‘Chanson’,‘Opera’, ‘Chamber Music’, ‘So<strong>na</strong>ta’, ‘Symphony’, ‘Booty Bass’, ‘Primus’,‘Porn Groove’, ‘Satire’, ‘Slow Jam’, ‘Club’, ‘Tango’, ‘Samba’,‘Folklore’, ‘Ballad’, ‘Power Ballad’, ‘Rhythmic Soul’, ‘Freestyle’,‘Duet’, ‘Punk Rock’, ‘Drum Solo’, ‘Acapella’, ‘Euro-House’, ‘DanceHall’,‘Goa’, ‘Drum & Bass’, ‘Club-House’, ‘Hardcore’, ‘Terror’, ‘Indie’,‘BritPop’, ‘Negerpunk’, ‘Pol<strong>sk</strong> Punk’, ‘Beat’, ‘Christian Gangsta Rap’,‘Heavy Metal’, ‘Black Metal’, ‘Crossover’, ‘Contemporary Christian’,‘Christian Rock’, ‘Merengue’, ‘Salsa’, ‘Trash Metal’, ‘Anime’, ‘Jpop’,‘Synthpop’);Jednoduchým spôsobom sme priradili k príslušným žánrom štandardne pridelené èíselnéhodnoty. Viem, že žánre boli postupom èasu doplòované, ale mne sa podarilo zí<strong>sk</strong>aiba túto verziu, ktorá obsahuje 147 žánrov, no uz<strong>na</strong>jte, že aj to je dos . Takéto pole stringje vlastne <strong>na</strong>niè, pokia¾ ho správne nepoužijeme.procedure TForm1.SpeedButton1Click(Sender: TObject);var f: file;buffer: array [1..128] of Char;beginwith opendialog1 do beginexecute;edit1.text:= file<strong>na</strong>me;end;if fileexists(edit1.text) then begi<strong>na</strong>ssignfile(f, edit1.text);reset(f,1);seek(f, filesize(f)-128);BlockRead(f, buffer, SizeOf(Buffer));CloseFile(f);if copy(buffer, 1, 3)= ‘TAG’ then begincheckbox1.checked := true;edit3.text:= copy(Buffer, 4, 30);edit4.text:= copy(Buffer, 34, 30);edit5.text:= copy(buffer, 64, 30);edit6.text:= copy(Buffer, 94, 4);edit7.text:= copy(Buffer, 98, 29);edit2.text:= inttostr(ord(buffer[127]));combobox1.Text:= id3zaner[ord(Buffer[128])];end;end;end;Procedúra pre èítanie ID3 TAG je spustená po stlaèení tlaèidla urèeného <strong>na</strong> otvoreniesúboru typu MP3, z ktorého èítame informáciu o príslušnej <strong>sk</strong>ladbe. Po otvorení opendialog1a vyh¾adaní súboru typu MP3 sa overí existencia nájdeného súboru, následne saotvorí a pripraví <strong>na</strong> èítanie. Po <strong>na</strong>stavení pozície v súbore príkazom seek a <strong>na</strong>èítaní 128bitov do premennej buffer, ktorá je po¾om char, sa práca so súborom ukonèí. Ak prvé trihodnoty po¾a char súhlasia s kontrolou ID3 TAG, vtedy sa zaènú vpisova do jednotlivýcheditovacích okien príslušné hodnoty èítané z premennej buffer. Za povšimnutie stojí èítanieèísla <strong>sk</strong>ladby, kde prevodom ord sa zmení hodnota char <strong>na</strong> hodnotu longint. Funkciaord je použitá aj v prípade èítania žánru pomocou vytvoreného po¾a id3zaner.ZÁPIS ID3 TAG V1. Urèite potrebná operácia je zápis, ktorý je v tomto prípadeo nieèo zložitejší ako èítanie. Sám som <strong>sk</strong>úšal viacero alter<strong>na</strong>tív, ale táto sa mi zdala <strong>na</strong>jefektívnejšiazo všetkých. Mnoho možností riešenia tohto problému urèite nikoho z vásne<strong>na</strong>dchý<strong>na</strong>, ale ma aspoò základný preh¾ad nie je <strong>na</strong> škodu. Výsledkom môjho experimentovaniaje táto procedúra.procedure TForm1.Button1Click(Sender: TObject);var f: file;i: integer;start, title, artist: string;album, year, coment: string;number, genre: char;Newb: array [1..128] of char;beginstart:= ‘TAG’;title:= edit3.text;artist:= edit4.text;album:= edit5.text;year:= edit6.text;coment:= edit7.text;if checkbox1.Checked= true then begi<strong>na</strong>ssignfile(f, edit1.text);reset(f, 1);seek(f, filesize(f)- 128);for i:= 1 to 128 do beginif (i>0) and (i3) and (i33) and (i63) and (i93) and (i97) and (i126) and (i127 then newb[i]:= chr(combobox1.ItemIndex);end;if length(title)< 30 then beginfor i:= 4+ length(title) to 3+ length(title)+ 30- length(title) dobeginnewb[i]:= #00;end;end;if length(artist)< 30 then beginfor i:= 34+ length(artist) to 33+ length(artist)+ 30- length(artist) dobeginnewb[i]:= #00;end;end;if length(album)< 30 then beginfor i:= 64+ length(album) to 63+ length(album)+ 30- length(album) dobeginnewb[i]:= #00;end;end;if length(coment)< 29 then beginfor i:= 98+ length(coment) to 97+ length(coment)+ 29- length(coment) dobeginnewb[i]:= #00;end;end;BlockWrite(f, Newb, SizeOf(Newb));closefile(f);end;end;Procedúra je spustená po kliknutí <strong>na</strong> tlaèidlo OK. V jej vnútri som použil to¾ko premenných,ko¾ko rôznych parametrov potrebujem do súboru zapísa . Tak ako pri èítaní ajtu som si otvoril súbor. Pozíciu som <strong>na</strong>stavil <strong>na</strong> posledných 128 bitov. Najväèšou dilemoupre mòa bol spôsob, ako to usporiada dokoneènej podoby, teda premennej newb(newbuffer). Musel som myslie aj <strong>na</strong> možnos, keï jed<strong>na</strong> z premenných nemá presnetakú dåžku, aká nám vyplýva z tabu¾ky ID3TAG. Napríklad ak máme názov <strong>sk</strong>ladby sdåžkou 15 z<strong>na</strong>kov, vtedy nám ïalších 15ostáva vo¾ných. Tieto z<strong>na</strong>ky sa majú prejaviako char #00. Ja som to vyriešil tak, že pozapísaní hodnôt do premennej newb sa celépole char kontroluje a nepotrebné hodnotysa jednoducho nulujú. Prázdne miesta saformátujú preto, aby nevznikol nedefinovanýparameter v poli char. Tým by sa totižObr. 2vytvorili chybné sluèky obsahujúce náhodnéinformácie. Celý tento problém sa dá obís vtedy, ak celú procedúru zakladáme <strong>na</strong> premennejtypu string, a posúvaním pozícií príkazom seek. Samozrejme, pred takým zápisomby sme museli posledných 128 bitov súboru formátova <strong>na</strong> char #00. Žánre somvyriešil jednoduchou funkciou, ktorá je volaná prostredníctvom komponentu combobox1.Funkcia ItemIndex nám vracia hodnotu typu integer udávajúcu pozíciu, respektíveriadok, v ktorom sa práve <strong>na</strong>chádzame. V tomto prípade ide o pozíciu v combobox1.Do combobox1.item treba zapísa žánre v nezmenenom poradí presne tak, ako sú zapísanév poli string. Táto procedúra nie je úplne doko<strong>na</strong>lá. Napríklad ak stlaèíte tlaèidlo OKa nemáte v edit7 nijaký komentár, program vyhlási chybu. Problém je v nulovej hodnotejednej z premenných (coment := ’’). Tieto dve procedúry sa dajú prerobi <strong>na</strong> program <strong>na</strong>hromadné premenovanie súborov MP3 (<strong>na</strong>príklad pod¾a použitého odde¾ovaèa, názvu<strong>sk</strong>ladby alebo interpreta). Možností je mnoho, len sa do toho pusti . Ak vám chýba motivácia,prikladám aj obrázok hotovej utilitky zobrazujúcej a editujúcej ID3 TAG. (Viem, žeto nie je niè výnimoèné, ale aj málo vie poteši ...)Nabudúce si opíšeme druhú verziu ID3 TAG, teda ID3 TAG v2.Jozef Kozák ml.130 PC REVUE 10/2001
P R O G R A M U J E M EAssembler pod Windows10. èas : Resource IPrakticky každý program vo Windows používa zdroje (angl. resources). RC resource scriptsúbor definuje také veci ako menu, dialógové okná, ikony, bitmapy a iné zdrojové dátavyžadované aplikáciou. Súbor prostriedkov zabraòuje tomu, aby ste museli ma množstvoseparátnych súborov, ktoré by aplikácia <strong>na</strong>hrávala pod¾a potreby do pamäte. Resourcesscript súbory sa kompilujú pomocou kompilátora prostriedkov rc.exe. Nájdete ho v adresáribin a posledná jeho verzia je Microsoft Windows Resource Compiler, Version5.00.1823.1 – Build 1823. Len èo je <strong>sk</strong>ompilovaný programový súbor *.exe, súbor *.res sapripojí <strong>na</strong> jeho koniec. Všetky definované prostriedky v súbore *.rc sú teraz súèas ouprogramového *.exe a poèas vykonávania programu ich možno používa .Windows ponúka funkcie, ktoré <strong>na</strong>èítajú programové zdroje do pamäte, aby mohli bypoužité. S dvoma takýmito funkciami ste sa už stretli. Ide o funkcie LoadIcon a LoadCursor.Boli použité v ukážkových programoch v èasti, ktorá definuje štruktúru triedy ok<strong>na</strong>. Jedinouvýhodou používania zdrojov je možnos pripoji nieko¾ko typov zdrojov priamo k programovému*.exe súboru. Ak by nebolo možné tento mechanizmus použi , museli by by binárnesúbory, ako <strong>na</strong>pr. ikony, obrázky, umiestnené vsamostatných súboroch, ktoré by potom *.exesúbor pod¾a potreby <strong>na</strong>èítal do pamäte. Prípadneby <strong>na</strong>pr. iko<strong>na</strong> musela by v programe definovanáako pole bajtov. No pokia¾ je iko<strong>na</strong> zdrojom, jeumiestnená v samostatnom editovate¾nom súbore*.rc a do súboru *.exe je pridaná poèas linkovaniaprogramu. Výpis jednoduchého resourceObr. 1 Jednoduchý dialog box script súboru nájdete <strong>na</strong> <strong>www</strong>.pcrevue.<strong>sk</strong>; <strong>na</strong>obrázku 1 je jeho grafická reprezentácia.Pri resource súboroch rozlišujeme jednoriadkové (<strong>na</strong>pr. BITMAP, CURSOR, ICON,FONT...) a viacriadkové (<strong>na</strong>pr. MENU, DIALOG, RCDATA, STRINGTABLE...) príkazy. Viacriadkovépríkazy používajú <strong>na</strong> definovanie bloku dát príkazy BEGIN a END (pozri výpisresource script súboru).Aplikácie používajú v správach a z<strong>na</strong>kovom výstupe textové re azce. Windows po<strong>sk</strong>ytujetabu¾ky re azcov ako alter<strong>na</strong>tívu ku konvenènej metóde umiestòovania re azcov vprogramovom *.exe súbore. Textové re azce sú definované v súbore prostriedkov akaždý má priradenú hodnotu ID.STRINGTABLEBEGINIDS_STRING1 “Out of Memory“IDS_STRING2 “Out of Range“ENDHodnoty ID re azca môžete definova <strong>na</strong> zaèiatku resource súboru pomocou príkazu#define. Prípadne môžete použi externý súbor pre lepšiu preh¾adnos . Tento súbor potomvložíte do resource súboru pomocou príkazu #include. Keï potrebujete tieto re azce použi ,pomocou funkcie LoadString sa <strong>sk</strong>opírujú re azce zo súboru prostriedkov do vyrovnávacejpamäte. Re azce môžu obsahova aj riadiace z<strong>na</strong>ky, <strong>na</strong>pr. tabulátor, koniec riadka a pod.Výhodou používania tabu¾ky re azcov je redukcia používania pamäte. Re azce nezaberajúpamä , pokia¾ nie sú potrebné. Windows <strong>na</strong>hráva re azce po blokoch pod¾a ID. Re azce, priktorých je pravdepodobné, že budú používané spoloène, by mali by èíslované sekvenène vmalých <strong>sk</strong>upinách. Ïalšou výhodou umiestnenia re azcov do tabu¾ky re azcov je podpora viacerýchjazykov. Win32 API podporuje viacjazyèné prostriedky v jednej aplikácii. Totiž rov<strong>na</strong>kýprogramový súbor *.exe môže by bez zmeny distribuovaný v nieko¾kých krajinách.Použitie tabu¾ky re azcov stráca zmysel, pokia¾ sú re azce <strong>sk</strong>opírované do statickejvyrovnávacej pamäte. Vyrovnávacia pamä bude zabera miesto, aj keï nebude obsahovanijaké dáta. Aplikácia by mala <strong>na</strong>hráva re azce do zásobníkových premenných alebodo globálne alokovanej pamäte.Súbor prostriedkov môže by použitý aj pre iný typ statických dát. Tieto dáta sú definovanépomocou príkazu RCDATA.MyData RCDATABEGIN100x0234“Out of Memory““Out of Range“ENDsubor1 TEXT “config.ini“subor2 METAFILE “car.bmp“Najlepším miestom <strong>na</strong> uloženie dát vlastných prostriedkov je externý súbor. Riadkys príkazmi TEXT a METAFILE definujú vlastné prostriedky. Kompilátor prostriedkov èítaz týchto súborov a umiestòuje dáta do súboru prostriedkov vyko<strong>na</strong>te¾ného programu.Funkcie FindResource a FindResourceEx sa používajú <strong>na</strong> vyh¾adávanie dát vlastných prostriedkov.Funkcia LoadResource <strong>na</strong>hrá prostriedok do pamä ového bloku.Ïalším výz<strong>na</strong>mným prvkom resource súborov sú dialógové okná. Dialógové okná väèšinouvyžadujú od používate¾a zadanie vstupných dát pre nejakú špecifickú úlohu, <strong>na</strong>pr.vyh¾adanie re azca v textovom dokumente a pod. Dialógové okná používajú šablóny, ktorédefinujú ovládacie prvky v danom okne. Tieto šablóny sú definované v súbore prostriedkov*.rc pomocou príkazu DIALOG (pozri listing Simple resource <strong>na</strong> <strong>www</strong>.pcrevue.<strong>sk</strong>). Je ichmožné vytvára aj v pamäti dy<strong>na</strong>micky, poèas behu aplikácie. Skôr ako sa pustíme do opisuovládacích prvkov pre dialógové okná, potrebujete poz<strong>na</strong> štýly ovládacích prvkov.ŠTÝLY TLAÈIDIELBS_3STATE – Vytvára zaškrtávacie políèko s tromi stavmi výberu. Zaškrtávacie polemôže by buï nezaškrtnuté, zaškrtnuté, alebo tlmené (sivé). Tlmeným stavom sa vyjadrujestav, keï hodnota zaškrtávacieho políèka nie je stanovená.BS_AUTO3STATE – Rov<strong>na</strong>ké ako BS_3STATE, s výnimkou toho, že zaškrtávacie políèkomení svoj stav, keï ho používate¾ vyberie.BS_AUTOCHECKBOX – Rov<strong>na</strong>ké ako BS_CHECKBOX, s výnimkou toho, že zaškrtávaciepolíèko mení svoj stav, keï ho používate¾ vyberie.BS_AUTORADIOBUTTON – Rov<strong>na</strong>ké ako BS_RADIOBUTTON, s výnimkou toho, že prepí<strong>na</strong>èje vybraný, keï <strong>na</strong>ò používate¾ klikne a výber všetkých ostatných prepí<strong>na</strong>èov v <strong>sk</strong>upineje zrušený.BS_BITMAP – Vytvára tlaèidlo, ktoré zobrazí bitovú mapu.BS_BOTTOM – Umiestni titulok do spodnej èasti pravouholníka tlaèidla.BS_CENTER – Vycentruje titulok horizontálne v pravouholníku tlaèidla.BS_CHECKBOX – Vytvára zaškrtávacie políèko, ktoré má titulok zobrazený <strong>na</strong> pravejstrane, pokia¾ nie je použitý štýl BS_LEFT.BS_DEFPUSHBUTTON – Vytvára tlaèidlo, ktoré je stlaèené, keï používate¾ stlaèí klávesENTER.BS_GROUPBOX – Vytvára rám, ktorý má titulok zobrazený v ¾avom hornom rohu.Používa sa <strong>na</strong>jmä pri zo<strong>sk</strong>upovaní prvkov RADIOBUTTON, resp. CHECKBOX.BS_ICON – Vytvára tlaèidlo, ktoré bude zobrazova ikonu.BS_LEFT – Zarovná titulok v pravouholníku tlaèidla v¾avo. Ak je týmto tlaèidlom zaškrtávaciepolíèko alebo prepí<strong>na</strong>è a nemá štýl BS_RIGHTBUTTON, text je zarov<strong>na</strong>ný v¾avo <strong>na</strong>pravej strane.BS_LEFTTEXT – Umiestni text <strong>na</strong> ¾avú stranu prepí<strong>na</strong>èa alebo zaškrtávacieho políèka.BS_MONO – Urèuje, že tlaèidlo má pre titulok iba jeden riadok textu.BS_MULTILINE – Urèuje, že tlaèidlo má pre titulok viac riadkov textu. Pokia¾ je titulokpríliš dlhý a nevojde sa <strong>na</strong> jeden riadok, bude zalomený <strong>na</strong> druhý riadok.BS_NOTIFY – Posiela mater<strong>sk</strong>ému oknu správy s oznámením. Toto je prídavokk BN_CLICKED a BN_DBLCLK, ktoré sú posielané implicitne.BS_OWNERDRAW – Vytvára owner-drawn tlaèidlo. Mater<strong>sk</strong>é okno dostane správuWM_MEASUREITEM, keï je tlaèidlo vytvorené, a správu WM_DRAWITEM vždy, keï je potrebnétlaèidlo vyfarbi . Tento štýl by sa nemal kombinova so žiadnymi inými štýlmi tlaèidiel.BS_PUSHBUTTON – Vytvára tlaèidlo, ktoré, keï je vybrané, posiela mater<strong>sk</strong>ému oknusprávu WM_COMMAND.BS_PUSHLIKE – Prinúti zaškrtávacie políèko alebo prepí<strong>na</strong>è, aby mal vzh¾ad a akciu tlaèidla.BS_RADIOBUTTON – Vytvára prepí<strong>na</strong>è, ktorý má titulok zobrazený <strong>na</strong> pravej strane,pokia¾ nie je použitý štýl BS_LEFT.BS_RIGHTBUTTON – Umiestni oblas pre výber prepí<strong>na</strong>èa alebo zaškrtávacieho políèka<strong>na</strong> pravú stranu pravouholníka tlaèidla.BS_TEXT – Urèuje, že tlaèidlo zobrazuje text.BS_TOP – Umiestni titulok do hornej èasti pravouholníka tlaèidla.BS_VCENTER – Vertikálne vycentruje titulok v pravouholníku tlaèidla.ŠTÝLY POLÍ SO ZOZNAMOMCBS_ AUTOHSCROLL – Umožòuje horizontálne posúvanie v editovate¾nom ovládacomprvku po¾a so zoz<strong>na</strong>mom.CBS_DISABLENOSCROLL – Vynúti si, aby bol zobrazený vertikálny rolovací pruh ajvtedy, keï sú všetky položky zoz<strong>na</strong>mu vidite¾né. Ak nebude rolovací pruh <strong>na</strong> zobrazenievšetkých položiek potrebný, bude neaktívny. Normálne je rolovací pruh zobrazenýiba vtedy, keï je to potrebné.CBS_DROPDOWN – Vytvára roztváracie pole so zoz<strong>na</strong>mom. Zoz<strong>na</strong>m je zobrazený ibavtedy, keï sa vykonáva výber.CBS_DROPDOWNLIST – Vytvára pole s roztváracím zoz<strong>na</strong>mom. Editovanie nie je povolenéa vybera možno iba zo zobrazených položiek.CBS_HASSTRINGS – Používa sa pri owner-drawn poliach so zoz<strong>na</strong>mami <strong>na</strong> špecifikáciure azcov, ktoré budú k po¾u so zoz<strong>na</strong>mom pridané. Aplikácia môže potom použi <strong>na</strong>vyh¾adanie urèitej položky správu CB_GETLBTEXT.CBS_LOWERCASE – Vynúti si, aby boli do editovate¾ného ovládacieho prvku zadávanéiba malé písmená, a to tak, že pri zadávaní robí automatickú konverziu ve¾kých písmen<strong>na</strong> malé.CBS_NOINTEGRALHEIGHT – Vynúti si, aby malo pole so zoz<strong>na</strong>mom presne urèenúve¾kos . Windows implicitne <strong>na</strong>staví ve¾kos po¾a so zoz<strong>na</strong>mom tak, aby žiadne položkynemohli by zobrazené èiastoène.CBS_OEMCONVERT – Zadaný text bude prevedený zo z<strong>na</strong>kovej sady Windows do z<strong>na</strong>kovejsady OEM a potom spä do sady Windows. Tým sa zabezpeèí prevod pri použitífunkcie AnsiToOem.CBS_OWNERDRAWFIXED – Vytvára owner-drawn pole so zoz<strong>na</strong>mom. Rodiè dostanesprávu WM_MEASUREITEM, keï sa pole so zoz<strong>na</strong>mom vytvorí, a správu WM_DRAW-ITEM, keï je potrebné vyfarbi niektorú položku.10/2001 PC REVUE 131