Taigi pradedame: Kaip jus tikriausiai jau zhinote registre visos Windows programos (net ir patys windowsai) ishsaugo savo kaikuriuos parametrus. Tachiau, kaip tos programos juos ishsaugo ??? Taigi shiame darbe ash norechiau aprashyti registro programavimo pagrindus. Stengiausi laikitys atokiau nuo tokio zhargonizmo kaijp joos rashotie laijshkuoze ir pan =:). Stengiausi, kad shis darbas butu kuo daugiau mokslinio pobudzhio. Disklaimeris: Shi teksta parashiau grynai mokomaisiais tikslais ir neprisiimu jokios atsakomybes, jeigu naudojant shia literatura nors vienas zhmogus patirs moraliniu ar materialiniu nuostoliu. Shis failas gali buti laisvai platinamas iki tol, kol kartu su juo bus minimas autoriaus vardas, bei jis liks nepakeistas. Achiu. Turinys: 1. Registras, jo struktura. 2. Pagrindiniai registro skyriai ( HKEYS ) ir ka jie reishkia. 3. Registro irashu tipai ( String, DWord, Binary ). 4. Pradedame programuoti ( Su Delphi 5 ). 5. Idomesnes registro vientos ( ten kur jus hackeriai galesite pridergti lamoms =:) 1 Registras, jo struktura. Registras laiko duomenis hierachinio tipo "medyje" (tree). Kiekviena "shakele" medyje yra vadinama "raktu" (key). Kiekvienas toks raktas gali savyje tureti dar po kelis "raktus" arba tureti "irashus" (vadinamus "values"). Kartais netgi vien "rakto" buvimas tam tikroje vietoje yra visa informacija kuria reikia pasiimti programai; kita karta, programa atidaro tam tikra rakta ir pasiima informacija ish irashu esanchiu tame rakte. Vienas raktas gali tureti neribojama kieki irashu, ir irashas gali tureti bet kokia reikshme. 2 Pagrindiniai registro skyriai ( HKEYS ) ir ka jei reishkia. Turbut pastebejote kaireje registro lango puseje yra 6 didelemis raidemis pavaidnti skyriai ir visi jie prasideda 4 raidemis HKEY_.... na tai patys aukshchiausieji registro hierarchijos skyriai (neiskaitykite My Computer, nes jame nera nieko irashyta). Kiekvienas ish ju turi savo paskirti registr, kiekviename ish ju saugoma tam tikra informacija: viename programos saugo savo nustatymus, kitame sistema (Windows), dar kitame vartotojo nustatymai ir t.t. ir pan. Taigi chia rashoma, ka kiekvienas skyrius reishkia ir ka jis savyje "saugo": HKEY_CLASSES_ROOT: Shiame skyriuje yra saugomi dokumentu tipai (arba klases) ir tu dokumentu savybes susijusios su tu dokumentu tipais. Taip pat nustatymai saugomi shiame skyriuje yra naudojami Windows programu be OLE programu (gal kas nors man parashykite ka tai reishkia). HKEY_CURRENT_USER: Shiame skyriuje yra saugomi konkretaus vartotojo nustatymai. Shie nustatymai taip pat iskaito ir Windows shell'o kintamuosius, irashus apie programu grupes, splavas, spausdintuvus, tinklo sujungimus, ir programu nustatymus. HKEY_LOCAL_MACHINE: Shis skyrius saugo fizine kompo bukle, iskaitant duomenis apie kompo magistrale, sistemine atminti, bei instaliuota hardwara ir softwara. HKEY_USERS: Na shiame skyriuje yra saugoma bendri vartotojo nustatymai, jeigu kompu naudojasi keli zhmones ir atsiranda dar vienas naujas vartotojas. HKEY_CURRENT_CONFIG: Shitas skyrius yra skirtas saugoti dabartiniam aplinkos sukonfiguravimui ( fontai, interneto nustatymai ir t.t. ir pan.) HKEY_DYN_DATA: Shitas skyrius saugo tai, ko ash dar neishsiaishkinau =:( sorry... 3. Registro irashu tipai. STRING: Irashas, kuriame saugoma informacija yra zhodine. Tai gali buti visokie zhodzhiai, keliai (paths) nurodyti iki tam tikru programu ar pagalbiniu failu, kompo pavadinimai, kam registruota programa (!) registracijos numeriai (!!!) ir t.t. ir pan. BINARY: Irashas, kuriame saugoma informacija yra dvejetainio pavidalo, tai gali buti visokiausi kodai arba nustatymai, kuriems reikia tik dvieju reikshmiu ( 0 ir 1 arba ne ir taip ). DWORD: Irashas panashus i STRING, tik jame informacija gali buti daug daug ilgesne. 4. Pradedame programuoti. PASTABA: norintys padaryti ka nors su shiuo komponentu turetu tureti daugiau negu minimalius pagrindus Delphi programavime. Na rashysiu shi skyriu remdamasis Delphi 5 programavimo kalba. Taigi... norint priversti programa ka nors irashyti i registra reikia zhinoti kokiu komponentu ji naudosis ir kokia komanda sius registrui. Delphi aplinkoje yra TRegistry komponentas ( yra dar pora: TRegIniFile, TRegistryIniFile, tachiau TRegistry yra universaliausias). Shis komponentas yra nevizualus ir jo nera ne vienoje paleteje, taigi ji reikia isideti kaip kintamaji bei irashyti i USES sarasha. pvz.: uses Registry, ...; procedure lameriolauzhimas(Sender: TObject); var Reg: TRegistry; Begin ... Taig pazhiurime i ji giliau. Kaip ir kievienas Delphi komponentas jis turi savybes (Properties), ju yra penkios, metodus (Methods), kuriu yra labai daug, tachiau neturi "ivykiu" ??? (Events). Kiti , bet ne visi komponentai turi ivykius. Savybes: Access, CurrentKey, CurrentPath, LazyWrite ir RootKey. 1. Access: shia savybe yra nustatomas priejimo lygis dirbant su registro raktais ir irashais. Savybes sintakse tokia: TRegistry.Access(). Shtai visi jo parametrai: KEY_ALL_ACCESS visishko priejimo lygis (parametru KEY_READ, KEY_WRITE ir KEY_CREATE_LINK visuma); KEY_READ ledzhia tik nuskaityti duomenis ish tam tikro irasho ar rakto; KEY_WRITE ledzhia tik irashyti i registra naujus raktus ir irashus; KEY_QUERY_VALUE garantuoja prieima prie bet kokio rakto ( bet ne irasho ); KEY_ENUMERATE_SUB_KEYS shis parametras "suskaichiuoja" registro raktus bei irashus; KEY_NOTIFY shis parametras pranesha apie raktu bei irashu pasikeitimus; KEY_SET_VALUE ledzhia sukurti naujus irashus raktuose; KEY_CREATE_SUB_KEY ledzhia sukuti naujus raktus ( bet ne irashus ); KEY_CREATE_LINK sukuria nuorodas i kitus raktus, irashus ar failus diske; KEY_EXECUTE apriboja registro raktu bei irashu naudojima iki read-only rezhimo. Shios savybes tipas yra LongWord; 2. CurrentKey: shia savybe galima nustatyti koks registro raktas yra konkrechiu momentu atidarytas. Demesio, jog operacijos programoje atliekamos su registru paveiks tiktais ta rakta kuris yra tuo momentu atidarytas OpenKey arba OpenKeyReadOnly metodu (apie juos veliau).Shios savybes tipas yra HKEY; Shiai savybei negalima priskirti jokio reikshmes, bet ja galima panaudoti shtai taip: Edit1.Text := Reg.CurrentKey; 3. CurrentPath: labai panashy savybe i CurrentKey, tik shiuo atveju jeigu komanda pavyksta, tai grazhintas rezultatas bus ne tik to rakto pavadinimas, bet ir kelias iki jo ( pvz.: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run =:). Shios savybes tipas yra STRING; Kadangi shiai savybei negalima priskirti jokio reikshmes tai ja galima pritaikyti shitaip: Edit1.Text := Reg.CurrentPath; 4. LazyWrite: na shi savybe yra itin gera, kai jus nenorite atidarineti kitu registro raktu ir padaryti irasha registre reikiamoje vietoje... t.y. jums nereikia atidarineti raktu tiesiog pasakete programai, jog norite tokio irasho tokioje vietoje ir viskas (ankschiau minejau, jog irashus galima daryti tik ten kur yra atidaryti raktai, dabar "tik ten" pakeiskite i "beveik tik ten" =:). Shios savybes tipas yra BOOLEAN (mano megiamiausias, kas taip o kas nea ??? =:). Sintakse: Reg.LazyWrite := True; 5. RootKey: nurodo kuris aukshchiausias hierarchijos lygis turetu buti atidarytas ( pagal nutylejima: HKEY_CURRENT_USER ); Sintakse: Reg.RootKey := HKEY_CURRENT_USER; Dabar visi shio komponento metodai (abeceles tvarka): CloseKey: uzhdaro esamu momentu atidaryta rakta, kai visos reikalingos "proceduros" atliko savo darba su juo. Sintakse: Reg.CloseKey; Create: pats svarbiausias metodas. Sukuria pati TRegistry komponenta programoje. Pradines savybes bei parametrai buna shie: RootKey := HKEY_CURRENT_USER (kaip ir pagal nutylejima), LazyWrite := True, dar galima nurodyti AAccess parametra, kuris bus priskiriamas Access savybei, pagal nutylejima jis yra KEY_ALL_ACCESS. Sintakse: Reg.Create(AAccess); //parametro AAccess gali ir nebuti CreateKey: sukuria nauja rakta. Shio rakto struktura gali buti absoliuti ir releatyvi. Skirtumas: absoliutus rakto vardas prasideda backslachu "\" ir yra pradedamas kurti nuo TRegistry.RootKey reikshmes, o releatyvus yra pradedamas kurti nuo konkrechiu momentu atidaryto rakto. Sintakse: Reg.CreateKey(rakto_vardas); DeleteKey: ishtrina nurodyta rakta. PASTABA: Windows95 operaciineje sistemoje DeletKey metodas ishtrina visus raktus esanchius tame rakte (jeigu supratote tai gerai), o WindowsNT 4.0 OS tai kiekvienam raktui reikia kviesti atskira DeleteKey metoda (tas turbut labai uzhknistu). Sintakse: Reg.DeleteKey(rakto_vardas); DeleteValue: ishtrina nurodyta irasha (bet ne rakta). Sintakse: Reg.DeleteValue(irasho_vardas). Destroy: labai jau zhiaurus metodas. Uzhdaro konkretu rakta ir sunaikina TRegistry komponenta programoje ishlaisvindamas atminti, kuri buvo skirta TRegistry komponentui programoje. Sintakse: Reg.Destroy; (jau girdzhiu laidotuviu marsha - cirkas baigesi =:). GetDataInfo: gauna irasho (!) registre informacija. Sintakse: Reg.GetDataInfo(irasho_vardas,irasho tipas{deja ji turesite irashyti patys}); Kadangi shiuo metodu jus tikrinsite registro irasho tipa, tai grazhintas rezultatas yra arba True arba False; Galimi tipai: rdUnknown: nezhinomas registro irahso tipas; rdString: registro irashas yra papraschiausias ANSI irashas. rdExpandString: registro irashas yra taip pat ANSI tipo. Shis tipas saugo WinShell'o kintamuosius arba nuorodas i kitu registro irashus arba WinShell'o failus. rdInteger: irashas yra papraschiausias 32bit skaichius. rdBinary: irashe saugoma informacija yra dvejetainiame pavidale (10011100020MB100011010101010 =:) GetDataSize: nustato irasho dydi baitais atidarytame rakte. Jeigu shi operacija pavyksta, tai funkcija parodo irasho dydi baitais, jeigu ne tai parodytas skaichius yra -1. Sintakse: Reg.GetDataSize(irasho_vardas). GetDataType: o chia tai metodas (!). Parodo irasho tipa (jums jau nebereikes nustatineti jo su GetDataInfo metodu) konkrechiu momentu atidarytame rakte. Irasho tipai tokie patys kaip ir GetDataInfo metode. Sintakse: Reg.GetDataType(irasho_vardas). PASTABA: Prie visu Delphi tipu esanchiu kodo pradchioje reikia nurodyti TRegDataType parametrus: type TRegsDataType= (rdUnknown, rdString, rdExpandString, rdInteger, rdBinary); GetKeyInfo: pateikia informacija apie konkretu atidaryta rakta. Kaip ir GetDataType kodo pradzhioje reikes irashyti TGetKeyInfo parametrus: type TRegKeyInfo = record NumSubKeys: Integer; MaxSubKeyLen: Integer; NumValues: Integer; MaxValueLen: Integer; MaxDataLen: Integer; FileTime: TFileTime; end; Funkcijos sintakse tokia: Reg.GetKeyInfo(norimas_parametras); Shio metodo parametrai: NumSubKeys: nurodo raktu skaichiu esanchiu atidarytame rakte; MaxSubKeyLen: ilgiausia rakto varda simboliais; NumValues: irashu skaichius; MaxValuelen: ilgiausio irasho vardas; MaxDataLen: ilgiausia irasho reikshme; FileTime: laikas, kai paskutini karta buvo rashoma i nagrinejamaji rakta; Jeigu shi funkcija nepavyksta, tai visoms reikshmems suteikiama reikshme lygi 0. GetKeyNames: pateikia sarasha visu raktu esanchiu nurodytame rakte. Sarashas pateikiamas TStrings tipo kintamaisiais (t.y. jus neikishite shito sarasho i TListBox komponenta). Sintakse: Reg.GetKeyNames(vieta_kur_parodyti_sarasha); GetValueNames: labai panashi i GetKeyNames metoda, bet shi funkcija pateikia irashu sarasha. Sarashas taip pat pateikiamas TStrings tipo kintamaisiais. Sintakse: Reg.GetValueNames(vieta_kur_parodyti_sarasha); HasSubKeys: nustato ar konkretus raktas turi raktu savyje. Sintakse: Reg.HasSubKeys := True; //shio metodo paramtero tipas yra BOOLEAN KeyExists: nustato ar nurodytas raktas egzistuoja. Sintakse: Reg.KeyExists := True; //tipas - BOOLEAN LoadKey: sukuria nauja rakta po vienu ish aukshchiausiu raktu ir uzhkrauna i ji informacija ish nurodyto failo. Sintakse: Reg.LoadKey(rakto_pavadinimas, failo_vardas); PASTABA: priesh naudojant shi metoda RootKey turi buti priskirtas HKEY_USERS arb HKEY_LOCAL_MACHINE. MoveKey: perkelia visus rakto porakchius bei irashus i kita vieta suteikiant jam nauja varda, beje reikia nurodyti dar ar reikia senaji rakta ishtrinti ar nea. Sintakse: Reg.MoveKey(senas_rakto_vardas, naujas_rakto_vardas, ishtrinti(true arba false)); Po kopijavimo ar perkelimo naujasis raktas yra uzhdaromas. Po Windows NT kiekvienas rakto poraktis turi buti atskirai nukopijuotas arba perkeltas. OpenKey: atidaro nurodyta rakta. Sintakse: Reg.OpenKey(rakto_vardas, sukurti(true arba false)); Gali buti atveju, kad nurodytas raktas neegzistuos, tada "sukurti" parametro vietoje irashysime true. Jeigu mes norime atidaryti rakta nustatymu nuskaitymui programoje, tai naudosime "sukurti" parametra false reikshme, nes mes jug nenoresime per nauja shi rakta sukurti. OpenKeyReadOnly: atidaro nurodyta rakta vien skaitymui (!). Atidaryto rakto saugumo lygis bus KEY_READ. Sintakse: Reg.OpenKeyReadOnly(rakto_vardas); ReadBinaryData: nuskaito dvejetaine informacija ish nurodyto irasho. Sintakse: Reg.ReadBinaryData(irasho_vardas, kintamasis, buferio_dydis); Chia kintamasis yra programos kintamasis, kuriam reikes priskirti gauta reikshme, buferio_dydis yra skaichius, kuris nurodo atminties dydi baitais, kurioje bus laikoma "ishtraukta" informacija. ReadBool: nuskaito logine informacija ish nurodyto irasho. Sintakse: Reg.ReadBool(irasho_vardas); Jeigu funkcija sekminga, tai jus gaunate reikalinga informacija ish registro, jeigu nea, tai jus gaunate praneshima apie klaida. ReadCurrency: na nebijokite, tai tikrai nevaliuta, bet ash pac dar neishsiaishkinau, kad chia per metodas sorry. ReadDate: nuskaito data ish nurodyto irasho. Sintakse: Reg.ReadDate(irasho_vardas); Naudokite shi metoda, tada, kai i irasha irashete reikshme su WriteDate procedure(apie tai veliau). Jeigu irashas nesaugo savyje reikshmes "panashios" i data, tai tada yra parodomas praneshimas apie klaida. ReadDateTime: panashi i ReadDate, tik be datos ji dar nuskaito ir laika. Salygos tokios pachio sintakse tokia pati. ReadFloat: nuskaito slankaus kablelio skaichiu. Jeigu irashas neturi savyje tokio skaichiaus yra parodomas praneshimas apie klaida. Sintakse: Reg.ReadFloat(irasho_vardas); ReadInteger: nuskaito skaichiu Integer tipo. Salygos bei sintakse tokia pati kaip ir pas ReadFloat. ReadString: nuskaito simbolius (zhodzhius) ish nurodyto irasho. Shis metodas tinka tada, kai irashas buvo padarytas WriteString arba WriteExpandString metodu (apie juos veliau). Sintakse: Reg.ReadString(irasho_vardas); ReadTime: nuskaito laika ish registro irasho. Naudokite shi metoda tik tada, kai irasha padarete WriteTime metodu (apie ji veliau). Sintakse: Reg.ReadTime(irasho_vardas); RegistryConnect: kvepia hackinimu. Taip ir yra. Shi komanda prisijungia prie kito kompo registro. Sintakse: Reg.Registry.Connect(//kompo_vardas); PASTABA: priesh naudojantis shiuo metodu reikia RootKey savybe priskirti prei HKEY_USER arba HKEY_LOCAL_MACHINE. RenameValue: shis metodas pakeichia irashui priskirta reikshme i nauja. Sintakse: Reg.RenameValue(sena_reikshme, nauja_reikshme) PASTABA, jeigu jus pervardinsite viena irasho tipa i kita, tai jums nebus jokio ispejimo ir jis bus pakeistas (!). ReplaceKey: pakeichia vien rakta kitu ish naujo failo, senaji irashydamas i kita faila. Sintakse: Reg.ReplaceKey(rakto_vardas, failas_i_kuri_bus_perrashytas_raktas, failas_ish_kurio_bus_irashytas_naujas_raktas); SVARBI PASTABA: failas_i_kuri_bus_perrashytas_raktas turi buti padarytas su metodu SaveKey, kurio sintakse yra sekanti: Reg.SaveKey(rakto_vardas, failo_pavadinimas_su_reg_pletiniu); Taigi bendra ReplaceKey sintakse butu kazhkas panashaus i: Reg.Replacekey(rakto_vardas,SaveKey(rakto_vardas,failo_pavadinimas_su_reg_pletiniu),failas_ish_kurio_bus_irashytas_naujas_raktas); RestoreKey: metodas kuris atkuria rakta ish failo ankschiau sukurto su SaveKey metodu. Bendra sintakse: Reg.RestoreKey(rakto_vardas, SaveKey(failas_ish_kurio_bus_atgamintas_raktas)); SaveKey: na jau anskchiau minejau, kad tai metodas, kurio yra atidaromas vienas ish raktu ir ishsaugomas i konkretu faila su pletiniu *.reg. UnLoadKey: ishkrauna viena ar kita rakta ish registro nemodifikuodamas failo (jeigu toks yra) ish kurio tas raktas buvo uzhkrautas LoadKey metodu. Priesh naudojant shia funkcija RootKey savybe turi buti nustatyta i HKEY_USERS arba HKEY_LOCAL_MACHINE. Sintakse: Reg.UnLoadKey(rakto_vardas); ValueExists: tikrina ar nurodytas irashas egzistuoja registre. Tipas BOOLEAN. Sintakse: Reg.ValueExists(irasho_vardas); WriteBinaryData: padaro irasha nurodytu vardu dvejetainio tipo. T.y. jame saugoma informacija yra dvejetainiame pavidale. Sintakse: Reg.WriteBinaryData(irasho_vardas, kintamasis, buferio_dydis); Visi kiti parametrai(kintamasis, buferio dydis) yra apzhvelgiami metode ReadBinaryData. WriteBool: padaro irasha nurodytu vardu loginio tipo (True, False), nors i registre irashas yra padaromas kaip dvejetainio tipo. Jeigu shi funkcija nepavyksta jokie irashai nera padaromi registre ir yra parodomas praneshimas apie klaida. Sintakse: Reg.WriteBool(irasho_vardas, true/false); WriteCurrency: nu jug sakiau, kad nezhinau ka reishkia ReadCurrency, tai nezhinau ka reishkia ir shitas metodas. WriteDate: padaro irasha, kurio reikshme yra data. Sintakse: Reg.WriteDate(irasho_vardas, reikshme); Reikshme yra TDateTime tipo kintamasis. Galimos kintamojo reikshmes: 0 - laikas bus pradetas skaichiuoti nuo 1899 12 30 12:00 vidurdieni. 2.75 - laikas bus pradetas skaichiuoti nuo 1900 01 01 6:00 vakare. -1.25 - laikas bus pradetas skaichiuoti nuo 1899 12 29 6:00 ryte. 35065 - laikas bus pradetas skaichiuoti nuo 1996 01 01 12:00. WriteDateTime: padaro irasha, kurio reikshme yra laikas. Sintakse: Reg.WriteDateTime(irasho_vardas, reikshme); Reikshme yra TDateTime tipo kintamasis. Kintamojo reikshmes yra tokios pachios tiktais shiuo atveju procedura data irasho ir laika ir data. WriteExpandString: padaro irasha kuris nukreipia i kitus sistemos kintamuosius, failus arba registro irashus. Sintakse: Reg.WriteExpandString(irasho_vardas, reikshme); Reikshme chia yra paprastas "kelias" iki vieno ar kito kintamojo ar failo sistemoje ir pan. WriteFloat: padaro irasha su slankaus kablelio skaichiumi. Tokiu pvz kaip pi:=3.1415296 arba 1 inch := 2.54 cm ir t.t. ir pan. Sintakse: Reg.WriteFloat(irasho_vardas, reikshme); Reikshme yra skaichius kuri jus norite irashyti. Shi irasha jus veliau galite "nuskaityti" su ReadFloat metodu. WriteInteger: padaro irasha su sveikuoju skaichiumi. Shi irasha jus veliau galite "nuskaityti" su ReadInteger metodu. Sintakse: Reg.WriteInteger(irasho_vardas, reishme); Reikshme - jusu norimas skaichius. WriteString: padaro irasha su simbliu reikshme (zhodzhiais). Shi irasha jus veliau galite "nuskaityti" su ReadInteger metodu. Sintakse: Reg.WriteString(irasho_vardas, reikshme); Na nebeaishkinsiu ka reishkia reikshme =:). WriteTime: padaro irasha, kurio reikshme yra laikas. Viskas tas pats kaip ir WriteDate ar WriteDateTime, tik dabar jum padarys irasha, kuriame yra tik (!) data. Shtai visi TRegistry komponento metodai bei savybes. Ash nenorejau jums rashyti "paspausk chia, rashyk taip". Ash jums trumpai apibudinau kiekviena savybe bei metoda, tikiuosi su jais zhinosite ka daryti ir padarysite keliu savybiu bei metodu "mirtina jungini" =:). 5. Idomiausios vietos registre: HKEY_CURRENT_USER\Software\Microsoft\Notepad HKEY_CURRENT_USER\Software\Microsoft\Telnet HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts (visi failu pletiniai ir su kuo jie turetu buti atidaromi) HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders (windozu katalogu tokiu kaip Favorites Templates Startup ir t.t. keliai (paths) windozu kataloge =:)~ skanu... HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders (vartotojo shell katalogai). HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\GrpConv\MapGroups (kazhkas panashaus i Startmenu katalogus bei taskbar quick launch konfiguracija) HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones (viskas kas susije su Desktop ikonomis tokiomis kaip My Computer, NetWork neighborhood ir pan. HKEY_LOCAL_MACHINE\SOFTWARE\CLASSES\CLSID\{645FF040-5081-101B-9F08-00AA002F954E} (chia galite pakeisti savo shiukshliu dezhes pavadinima ir apibudinima). 6. Naudota literatura: Delphi 5 help failas. Registra ishnarshiau pats. Tikiuosi patiks. Sekantis planuojamas darbas turetu buti apie komponentu rashyma (taip par Delphi aplinkoje). Bloody yours 20MB1 =:)