07.06.2015 Views

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

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.

P R O G R A M U J E M E<br />

Vytvorené pole char idb je <strong>na</strong>jfunkènejšou premennou<br />

tejto procedúry. Postupným obmieòaním hodnôt identifikátora<br />

a dåžky textu vznikajú kompletné identifikátory<br />

jednotlivých informácií.<br />

//TENC write<br />

idb[1]:= ‘T’;<br />

idb[2]:= ‘E’;<br />

idb[3]:= ‘N’;<br />

idb[4]:= ‘C’;<br />

idb[8]:= chr(length(TENC)+1);<br />

idb[9]:= ‘@’;<br />

blockwrite(temp, idb, 11);<br />

for i:= 1 to length(TENC) do begin<br />

txt[i]:= TENC[i];<br />

end;<br />

blockwrite(temp, txt, length(TENC));<br />

TENC – Encoded by. Identifikátor s dåžkou 11 z<strong>na</strong>kov<br />

<strong>na</strong> deviatej pozícii uchováva ‘@’. Uložením hodnoty TENC<br />

do premennej txt (pole char) a následným zápisom do súboru<br />

vzniká kompletne zapísaná informácia Encoded by.<br />

//WXXX write<br />

idb[1]:= ‘W’;<br />

idb[2]:= ‘X’;<br />

idb[3]:= ‘X’;<br />

idb[4]:= ‘X’;<br />

idb[8]:= chr(length(WXXX)+2);<br />

idb[9]:= #00;<br />

blockwrite(temp, idb, 12);<br />

for i:= 1 to length(WXXX) do begin<br />

txt[i]:= WXXX[i];<br />

end;<br />

blockwrite(temp, txt, length(WXXX));<br />

WXXX – Url. Neviem, z akého dôvodu je identifikátor dlhší<br />

o jeden z<strong>na</strong>k ako v ostatných prípadoch. Dåžka re azca<br />

zapísaného v ôsmom bite je vyjadrená ako <strong>sk</strong>utoèná dåžka<br />

url plus dva. To asi preto, že je zmenená aj dåžka identifikátora.<br />

//TCOP write<br />

idb[1]:= ‘T’;<br />

idb[2]:= ‘C’;<br />

idb[3]:= ‘O’;<br />

idb[4]:= ‘P’;<br />

idb[8]:= chr(length(TCOP)+1);<br />

idb[9]:= #00;<br />

blockwrite(temp, idb, 11);<br />

for i:= 1 to length(TCOP) do begin<br />

txt[i]:= TCOP[i];<br />

end;<br />

blockwrite(temp, txt, length(TCOP));<br />

//TOPE write<br />

idb[1]:= ‘T’;<br />

idb[2]:= ‘O’;<br />

idb[3]:= ‘P’;<br />

idb[4]:= ‘E’;<br />

idb[8]:= chr(length(TOPE)+1);<br />

idb[9]:= #00;<br />

blockwrite(temp, idb, 11);<br />

for i:= 1 to length(TOPE) do begin<br />

txt[i]:= TOPE[i];<br />

end;<br />

blockwrite(temp, txt, length(TOPE));<br />

//TCON write<br />

idb[1]:= ‘T’;<br />

idb[2]:= ‘C’;<br />

idb[3]:= ‘O’;<br />

idb[4]:= ‘N’;<br />

idb[8]:= chr(length(TCON)+1);<br />

idb[9]:= #00;<br />

blockwrite(temp, idb, 11);<br />

for i:= 1 to length(TCON) do begin<br />

txt[i]:= TCON[i];<br />

end;<br />

blockwrite(temp, txt, length(TCON));<br />

//TCOM write<br />

idb[1]:= ‘T’;<br />

idb[2]:= ‘C’;<br />

idb[3]:= ‘O’;<br />

idb[4]:= ‘M’;<br />

idb[8]:= chr(length(TCOM)+1);<br />

idb[9]:= #00;<br />

blockwrite(temp, idb, 11);<br />

for i:= 1 to length(TCOM) do begin<br />

txt[i]:= TCOM[i];<br />

end;<br />

blockwrite(temp, txt, length(TCOM));<br />

//TYER write<br />

idb[1]:= ‘T’;<br />

idb[2]:= ‘Y’;<br />

idb[3]:= ‘E’;<br />

idb[4]:= ‘R’;<br />

idb[8]:= chr(length(TYER)+1);<br />

idb[9]:= #00;<br />

blockwrite(temp, idb, 11);<br />

for i:= 1 to length(TYER) do begin<br />

txt[i]:= TYER[i];<br />

end;<br />

blockwrite(temp, txt, length(TYER));<br />

//TRCK write<br />

idb[1]:= ‘T’;<br />

idb[2]:= ‘R’;<br />

idb[3]:= ‘C’;<br />

idb[4]:= ‘K’;<br />

idb[8]:= chr(length(TRCK)+1);<br />

idb[9]:= #00;<br />

blockwrite(temp, idb, 11);<br />

for i:= 1 to length(TRCK) do begin<br />

txt[i]:= TRCK[i];<br />

end;<br />

blockwrite(temp, txt, length(TRCK));<br />

//TALB write<br />

idb[1]:= ‘T’;<br />

idb[2]:= ‘A’;<br />

idb[3]:= ‘L’;<br />

idb[4]:= ‘B’;<br />

idb[8]:= chr(length(TALB)+1);<br />

idb[9]:= #00;<br />

blockwrite(temp, idb, 11);<br />

for i:= 1 to length(TALB) do begin<br />

txt[i]:= TALB[i];<br />

end;<br />

blockwrite(temp, txt, length(TALB));<br />

//TPE1 write<br />

idb[1]:= ‘T’;<br />

idb[2]:= ‘P’;<br />

idb[3]:= ‘E’;<br />

idb[4]:= ‘1’;<br />

idb[8]:= chr(length(TPE1)+1);<br />

idb[9]:= #00;<br />

blockwrite(temp, idb, 11);<br />

for i:= 1 to length(TPE1) do begin<br />

txt[i]:= TPE1[i];<br />

end;<br />

blockwrite(temp, txt, length(TPE1));<br />

//TIT2 write<br />

idb[1]:= ‘T’;<br />

idb[2]:= ‘I’;<br />

idb[3]:= ‘T’;<br />

idb[4]:= ‘2’;<br />

idb[8]:= chr(length(TIT2)+1);<br />

idb[9]:= #00;<br />

blockwrite(temp, idb, 11);<br />

for i:= 1 to length(TIT2) do begin<br />

txt[i]:= TIT2[i];<br />

end;<br />

blockwrite(temp, txt, length(TIT2));<br />

Na zápis parametrov TCOP, TOPE, TCON, TCOM, TYER,<br />

TRCK, TALB, TPE1, TIT2 bola použitá rov<strong>na</strong>ká dåžka identifikátora.<br />

Za povšimnutie stojí fakt, že niektoré informácie<br />

a ich zápis majú inú štruktúru. Otázka znie: preèo? Bolo<br />

by ove¾a jednoduchšie vytvori takú procedúru, ktorá by<br />

nemusela každý parameter zapisova zvláš , èím by sa procedúra<br />

stala rýchlejšou a pružnejšou, èo sa týka pridávania,<br />

respektíve zapísania ostatných informácií, potrebných<br />

z h¾adi<strong>sk</strong>a použitia. Preèo by potom vytvárali popis, ktorý<br />

dokáže uchova 83 informácií? Veï komu by sa nepáèil<br />

systém karaoke, ktorý je jednou z funkcií ID3 TAG v2!<br />

//COMM write<br />

idb[1]:= ‘C’;<br />

idb[2]:= ‘O’;<br />

idb[3]:= ‘M’;<br />

idb[4]:= ‘M’;<br />

idb[8]:= chr(length(COMM)+5);<br />

idb[9]:= #00;<br />

blockwrite(temp, idb, 15);<br />

for i:= 1 to length(COMM) do begin<br />

txt[i]:= COMM[i];<br />

end;<br />

blockwrite(temp, txt, length(COMM));<br />

COMM – komentár. Priznám sa, že tento zápis komentára<br />

nie je celkom v poriadku. Preštudoval som si viacero<br />

príruèiek s popisom ID3 TAG v2, ktoré som <strong>na</strong>šiel pri potulkách<br />

internetom. Jed<strong>na</strong> informácia ostala doposia¾<br />

mnou nepochopená. Ide o 4 bity, ktoré sú pravdepodobne<br />

súèas ou identifikátora. V nich sa <strong>sk</strong>rývajú neznáme<br />

parametre, dy<strong>na</strong>micky sa meniace v závislosti od textu<br />

komentára. Preto som tieto bity jednoducho pre<strong>sk</strong>oèil a<br />

<strong>na</strong> moje prekvapenie komentár zapísalo správne, teda tak,<br />

že je èitate¾ný aj inými prehrávaèmi a editormi.<br />

// prazdne bity<br />

for i:= 1 to 10 do begin<br />

null[i]:= #00;<br />

end;<br />

blockwrite(temp, null, sizeof(null));<br />

Prázdne bity sú jednoduchou ochranou celého zápisu.<br />

Dåžka je pravdepodobne pevne daná, ale správne pracuje aj<br />

pri desiatich vo¾ných bitoch, ktoré sú uložené <strong>na</strong> konci popisu<br />

ID3 TAG v2. Takto nám v doèasnom súbore vznikol popis<br />

ID3 TAG v2, za ktorý je prekopírovaná „MP-trojka“.<br />

//kopirovanie mp3 file<br />

assignfile(f, file<strong>na</strong>me);<br />

reset(f, 1);<br />

repeat<br />

blockread(f, copy, sizeof(copy), read);<br />

blockwrite(temp, copy, read, write);<br />

until ((read= 0) or (read write));<br />

closefile(f);<br />

closefile(temp);<br />

erase(f);<br />

re<strong>na</strong>me(temp, file<strong>na</strong>me);<br />

end;<br />

Tu som mohol použi aj všeobecne známy príkaz Copy-<br />

File, ktorý som zavrhol hneï <strong>na</strong> zaèiatku práce s ním. Po<br />

prekopírovaní jadra MP3 do doèasného súboru sa <strong>sk</strong>utoèný<br />

súbor MP3 vymaže a ten doèasný sa premenuje <strong>na</strong><br />

názov originálu. Použitie procedúry vysvet¾ujem <strong>na</strong> tom<br />

istom príklade ako v predchádzajúcej èasti, kde sme túto<br />

tému zaèali rozobera .<br />

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

begin<br />

if checkbox1.Checked= true then begin<br />

clearTag2(edit1.text);<br />

setTag2(edit11.text, edit10.text, edit9.text,<br />

edit8.text, edit7.text, combobox1.text,<br />

edit6.text, edit2.text, memo1.Lines.Text,<br />

edit5.text, edit4.text, edit3.text, edit1.text);<br />

end else clearTag2(edit1.text);<br />

end;<br />

Procedúra je spustená po kliknutí, resp. stlaèení tlaèidla<br />

button1. Ak kontrola oz<strong>na</strong>èenia CheckBox1 bola úspešná,<br />

je spustená èas rutiny, kde sú použité dve <strong>na</strong>mi vytvorené<br />

procedúry ClearTag2 a SetTag2. Mazanie neaktuálneho<br />

popisu sme si ukázali minule a po dosadení vstupných<br />

parametrov do procedúry zápisu vznikne takýto<br />

(zobrazený) „chaos“. Ak CheckBox1 nie je oz<strong>na</strong>èený, to<br />

z<strong>na</strong>mená, že MP3 nebude nosite¾om nijakej informácie<br />

ID3 TAG v2. Verím, že táto téma vás dostatoène zaujala a<br />

<strong>na</strong>dobudnuté vedomosti pri èítaní tohto, ako aj predchádzajúcich<br />

èlánkov využijete vo vašej programátor<strong>sk</strong>ej praxi<br />

pri tvorení zaujímavého programu alebo komponentu pre<br />

programovací jazyk Borland Delphi.<br />

NABUDÚCE. Neviem, èi som si náhodou nezamenil<br />

témy. Hneï pochopíte preèo. V <strong>na</strong>sledujúcej èasti sa dozviete<br />

nieèo o práci so súbormi, ako ich kopírova , ako<br />

èíta , ako zapisova , a ostatné operácie súvisiace s nimi.<br />

Teraz si uvedomujem, že viac by sa hodila táto téma o<br />

nieèo <strong>sk</strong>ôr ako zápis a èítanie ID3 TAG. Ale èo už teraz?<br />

Prajem vám teda krásny zvyšok mesiaca.<br />

Jozef KOZÁK ml.<br />

12/2001 PC REVUE 143

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

Saved successfully!

Ooh no, something went wrong!