12. diel - RES súbory a INI súbory
S týmto dielom už je hotový tucet návodov. A to nie je málo! Celkom 120 bodov návodu! Ale teraz už Ukončime táranie a pusťme sa do programovania: Tentoraz je hlavným cieľom naučiť vás pracovať s externým súborom * .RES. Ten sa najlepšie upravuje v Image Editor. Prečo zrovna tam? Do RES súboru sa dajú uložiť bitmapy, ICON a Cursor (ikony a kurzory).
Ako na to: NAJPRV v menu Image Editore zvoľte File / New ... / Resource File (.res) Potom sa vám otvorí okno so začínajúcim súborovým stromom, vnútri ktorého je len položka Contents. Ak kliknete na ňu pravým tlačidlom alebo do horného menu na položku Resource, môžete zatiaľ zvoliť New a po jeho zvolení buď Bitmap, Icon, alebo Cursor. Začnite napríklad Bitmap! Ak zvolíte položku Bitmap, otvorí sa vám klasické okno, kde zvolíte rozmery (max. 768x768) a počet farieb (2, 16, alebo 256). Po potvrdení sa vytvorí vetva Bitmap a v nej Bitmap1. Pri každom ďalšom zvolení položky Bitmap v menu sa pridá do vetvy Bitmap ďalšej BitmapX. Teraz môžeme vytvorené bitmapy editovať (dvojitým kliknutím sa otvorí okno na editáciu - neukladá sa, len sa zavrie, uloží sa až súbor RES), premenovávať (opäť ako vo Windows, akurát cez menu musíte najprv ľavým tlačítkom myši zvoliť položku k premenovaniu a až potom zvoliť v menu Rename) a samozrejme mazať (POZOR! Rovnako ako u Premenovanie to dá robiť cez menu, ale opäť musíte najprv ľavým tlačidlom vybrať položku na vymazanie!). Pokračujte editovaním ikony. Kliknete teda na New / Icon, po vyplnení okná s nastaveniami sa vytvorí vetva Icon a v nej rovnako ako u Bitmap Bitmap1, Bitmap2 ... tak tu icon1, icon2 ... Rovnako ako u samostatného súboru ikony, môžete aj tu urobiť súbor ikonu so štyrmi ikonami (čiernobiela malá, čiernobiela veľká, 16ti farebná malá, 16tich farebná malá). Všetko platí rovnako ako u Bitmap (premenovanie, mazanie, editovanie).
Skončíte teda tvorbou kurzorov. Zvolíte si New / Cursor, vytvorí sa vetva Cursor a v nej sa rovnakým poriadkom, ako bitmapy a ikony, súbory kurzorov. Žiadne ovládania sa nemení (editácia je rovnaká, mazanie, editovanie ...). V hlavnom menu však pribudne položka Cursor s položkami Set Hot Spot ... (zvolíte číselné umiestnenie miesta, ktoré bude realizovať akcie (u krížika je to stred, u šípky špička atď.)) A Test ... (otestujete si vami vytvorený kurzor ).
KONEČNÝ súbor uložíme k programu pod akýmkoľvek menom.
Teraz musíme náš program informovať, že sme mu vyrobili zdrojový súbor (resource file). A to tak, že nájdeme časť programu
implementation {$R *.dfm}
A pod tento text ešte pred procedúry (hneď za zelený text vo zloženej zátvorke {...}) napíšte: {$ R FileName.res} Kde miesto FileName bude názov vášho súboru. Po vytvorení exe súboru už nebude potrebné (ale pre Delphi áno - takže ho nemažte !!!!! - iba u samotného EXE nie je potreba - proste ho nepoužíva, pretože ho obsahuje v sebe prevedený). A teraz sa pustíme do používania obrázkov a ikon: Súbory Ticona a TBitmap majú položku Handle. A do nej dosadíte adresu obrázka v zdroji príkazom:
Obrazek.Handle := LoadBitmap(HInstance, 'NázevObrázku'); Icon.Handle := LoadIcon(HInstance, 'NázevIkony');
Prvý príkaz zariadi, že súbor Obrazek: TBitmap; bude vyzerať ako bimapa v RES súboru, ktorá sa volá NázevObrázku (Názvy bitmap (Obrazok a NázevObrázku) si samozrejme môžete zmeniť). Druhý nám hovorí, že ikona okná (môže to byť však akákoľvek premenná typu Ticona) bude mať vzhľad ikon zo zdrojového súboru, ktorá sa volá NázevIkony (alebo ako si ju pomenujete). Začnime príklad, aby ste lepšie pochopili:
{$R *.dfm} {$R Zdroj.res} procedure TOkno.Button1Click(Sender: TObject); var Obrazek : TBitmap; begin Obrazek := TBitmap.Create; Obrazek.Handle := LoadBitmap(HInstance, 'Obraz'); Canvas.Draw(0,0,Obrazek); end; procedure TOkno.Button2Click(Sender: TObject); begin Icon.Handle := LoadIcon(HInstance, 'Ikonka'); end;
Prvá procedúra sa spustí po kliknutí na tlačidlo Button1, nadefinuje a vytvorí premennú Obrazek typu TBitmap, načíta do nej obrázok zo Zdroj.res pomenovaný Obraz a vykreslí sa na plochu okna. Druhá procedúra sa spustí po kliknutí na Button2 a iba načíta do ikony okna ikonu menom Ikonka zo Zdroj.res.
Kurzorům sa venujme samostatne: S tými to nie je tak jednoduché. Každý kurzor má svoje číslo. Vy si pre svoj tiež nejaké musíte zvoliť. Tu sú konštanty, ktoré už majú nejaký tvar (dajú sa prepísať, ale je to zbytočné): crDefault = 0 (nepřepsatelný), crNone = -1, crArrow = -2, crCross = -3, crIBeam = -4, crSizeNESW = - 6. crSizeNS = -7, crSizeNWSE = -8, crSizeWE = -9, crUpArrow = -10, crHourGlass = -11, crDrag = -12, crNoDrop = -13, crHSplit = -14, crVSplit = -15, crMultiDrag = -16, crSQLWait = -17, crno = -18 (nepřepsatelný), crAppStart = -19, crHelp = -20, crHandPoint = -21, crSizeAll = -22
My si teda budeme radšej voliť kladné konštanty (ale nemusíme ich pomenovávať). Ak za nejaké číslo nie je dosadený obrázok, nastaví sa automaticky crDefault (čiže 0). Ak chceme určiť, že Okno bude mať kurzor crDrag, môžeme pokojne napísať:
Okno.Cursor := -12;
Je to to isté ako:
Okno.Cursor := crDrag;
Proste crDrag je konštanta (to je akoby premenná, ale nedá sa meniť (je konštantná)), rovnako ako všetko ostatné. Ako si vytvoríte vlastný konštantu si môžete prečítať v bode 4. Teraz vás oboznámime, ako zmeniť kurzor treba v Okne. Bez vytvorenia konštanty. Ak si ju vytvoríte, budete jej písať namiesto čísla 15 (to je číslo, ktoré som zvolil pre kurzor-možno ho však zmeniť na iné).
Okno.Cursor := 15; {nebo třeba Okno.Cursor := MojeKonstanta;} Screen.Cursors[15] := LoadCursor(HInstance, 'NazevKurzoru'); {Opět může místo 15 být třeba MojeKonstanta}
Prvý riadok je snáď jasný (za kurzor pre Okno dosadíme kurzor 15 (alebo napr. MojeKonstanta)). Okno. tam bolo zbytočné, ale je to názornejšie (Okno.Cursor stačilo napísať len ako Cursor). Na druhom riadku sa do nastavenia počítača (len po dobu spustení programu) na pozícii 15 dosadí obrázok kurzora zo zdroja pomenovaný NazevKurzoru. Príklad si uvedieme po prebratí tvorby konštanty ...
Kde definovať konštantu ?! Máte dve možnosti (pri premenných sú 3 -
poznáte zatiaľ 2). Obe sú rovnaké, ako u premenných (jednu z nich
nepoznáte). U premenných zadávate pred ich zoznam var (= variable a tj.
Premenná). Pred konštanty rovnakým spôsobom const (= constant, tj.
Konštanta). A teraz spôsoby:
1. !! NEDÁ POUŽIŤ U konštantou !! do private, alebo public
Napr.
public
{ Public declarations }
Cislo : Integer;
end;
2. !! Pr. a Kon. nemožno použiť vyššie, než sú nadefinované !! medzi procedúry (pod implemantation)
Napr.
... end; var Textik : string; Number : real; const Pet=5; Pozdrav='Ahoj'; procedure TOkno.Button2Click(Sender: TObject); ...
3. !! Pr. a Kon. možno použiť len pre jednu premennú !!
medzi procedure a jej begin
Príklady:
1 .:
procedure TOkno.Button1Click(Sender: TObject); var Obrazek : TBitmap; const StoDvacet=120; DvaACtvrt=2.25; begin ...
Čo môžete teda dosadzovať a ako ?: Konstanty definujete pomocou klasického rovná sa a dosadíte real, Integer, string, alebo pokojne aj Boolean ... Z toho vyplýva jedna zaujímavosť: Nebaví vás písať True a False? Nadefinujte si dve konštanty treba A (true) a N (false):
const
N=False;
A=True;
Potom už len píš: Okno.Enabled: = N; (A máte po srandu. . Áno, okno sa zneprístupní, to však znamená, že konštanty fungujú. Ale tiež, že musíte použiť tlačidlo Delphi v menu v položke Run pomenované Program reset (Ctrl + F2) - to sa hodí zapamätať)
Teraz sľúbená ukážka, ako dosadiť kurzor pomocou konštanty:
procedure TOkno.FormCreate(Sender: TObject); const MujKurzor=13; begin Cursor := MujKurzor; Screen.Cursors[MujKurzor] := LoadCursor(HInstance, 'Sipka'); end;
Nie je to zas tak ťažké. Číslo kurzora som si určil trinásť (pre zlosť poverčivých ... alebo je to snáď šťastné číslo?). Trinástku som pomenoval MujKurzor. Teraz som zadal, že kurzor Okná bude MujKurzor (13). Tu už som Okno. vynechal! Ďalej už som len 13.kurzoru v systéme priradil vzhľad kurzora Sipka z RES súboru priloženému k DPR, DFM a PAS súborom.
!!! POZOR !!!
Ikony, ktoré umiestnite do RES súborov (nemusí byť len jeden) sa budú
používateľovi automaticky ponúkať ako ikony k zástupcovi! O to bude váš
program LEPŠIE! Teda aspoň ja som rád, keď sa mi nepáči hlavné ikona
programu a môžem ju zmeniť za podobnú, ale krajšie. Napr. WinAmp! ten má
tiež na výber kvantá ikon!
Ini súbory
To by bolo! Teraz vás zoznámim s tajomstvom INI súborov. Do tých si pre tentokrát neuloží programátor obrázky, ale užívateľ nastavenie (presnejšie: program uloží premenné určujúce nastavenia). Základom je pridať do uses na začiatku programu pod interface položku
IniFiles: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IniFiles;
Ďalej už s INI súbory môžeme programovať. Sú naozaj výhodné a mrzí ma, že som sa o nich dozvedel celkom neskoro ... najskôr si musíte INI súbor nadefinovať (na jednom z vyššie uvedených troch miest - najlepšie na oných dvoch vám už dlhšie známych):
IniSoubor: TIniFile; // IniSoubor může být jakýkoli název
A potom ho tiež musíme vytvoriť (pred použitím (zápis, čítanie)):
IniSoubor := TIniFile.Create('NázevSouboru.ini'); // Vůbec // nemusí mít koncovku ini, ale je to tak standardní
Ak ini súbor otvoríte v textovom editore (možno to, a dokonca ho tam môžete upraviť!), Má takýto tvar:
[Název jedné sekce] Název položky (Booleanová)=1 Název další položky=Ano [Název další sekce] Název Integerové položky=12 Název další položky=12
Prvý riadok nám určuje, že začína jedna sekcia INI súboru.
"Názov položky (Booleanová)" sa môže rovnako ako "Názov jednej sekcie"
vymenovať akokoľvek. rovnako tak i všetko ostané. Tretí riadok oznamuje
ďalšiu sekciu. Do nej môžete umiestniť niečo s rovnakým menom (napr.:
"Názov ďalšie položky"). Na druhom riadku je Boolean (1 = True, 0 = Fasle).
Tretia je string a piaty a šiesty je Integer. A to zďaleka nie je všetko, čo
možno do Ini súboru zapísať. Nemusíte sa báť, do súboru nebudete
zapisovať tak, ako ste to čítali!
A ako teda? Príkazov je dosť, ale všetky majú tento tvar:
PromennaTypuTIniFile.WriteNeco('Název sekce', 'Název proměnné', ZapisovanaPromenna);
OK, znie to divne! Nebojte, vysvetlím to! PromennaTypuTIniFile je napríklad nami už vytvorený IniSoubor. ZapisovanaPromenna je premenná, ktorá súvisí s WriteNeco:
príkaz miesto WriteNeco | typ ZapisovanaPromenna | čo vykoná |
WriteInteger | integer | zapíše celé číslo |
WriteString | string | zapíše text |
WriteBool | Boolean | zapíše 1 alebo 0 |
WriteDate | TDateTime | zapíše dátum |
WriteDateTime | TDateTime | zapíše dátum a čas |
WriteFloat | real | zapíše real |
WriteTime | TDateTime | zapíše čas |
procedure TOkno.FormClose(Sender: TObject; var Action: TCloseAction); var Inik : TIniFile; begin Inik := TIniFile.Create('Kravina.ini'); Inik.WriteBool('Hlavní sekce', 'Zaškrtnuto', CheckBox1.Checked); Inik.WriteString('Hlavní sekce','Text','Ano'); Inik.Destroy; end;
Teraz máme uložený v adresári Windows (alebo WINNT) súbor Kravina.ini, ktorý obsahuje jednu sekciu menom Hlavné sekcie a v nej položku Začiarknuté (Boolean) a Text (string). Ak zadáte miesto Kravina.ini celú adresu (C: \\ Kravina.ini), uloží sa ini súbor do adresára podľa.
A ako čítať v programe? Ovšem, že ini súbor nie je pre užívateľov, aby si čítal Nast, ale pre program aby po spustení nastavil treba vzhľad tak, aby užívateľovi vyhovoval. Príkazov je rovnaký počet, ako pri zápise (to je myslím logické) a majú podobný tvar:
PromennaCtenehoTypu := TypuTIniFile.ReadNeco('Název sekce', 'Název proměnné', NahradniPromenna);
Je to trochu iné! Písanie je procedúra a čítanie funkcie. Čo je
PromennaTypuTIniFile už viete, PromennaCtenehoTypu je premenná, do ktorej sa
zapíše to, čo sa prečíta a NahradniProměnná je premenná (alebo hodnota
premennej), ktorá sa dosadí za PromennaCtenehoTypu, ak sa programu z
akéhokoľvek dôvodu nepodarilo prečítať určenú vec.
ReadNeco má tieto náhradky:
príkaz miesto ReadNeco | typ čítané a náhradné premenné |
ReadInteger | integer |
ReadString | string |
ReadBool | Boolean |
ReadDate | TDateTime |
ReadDateTime | TDateTime |
ReadFloat | real |
ReadTime | TDateTime |
procedure TOkno.FormCreate(Sender: TObject); var Inik : TIniFile; begin Inik := TIniFile.Create('Kravina.ini'); CheckBox1.Checked := Inik.ReadBool('Hlavní sekce', 'Zaškrtnuto', True); Inik.Destroy; end;
INI súbor sa môže vymenovať inak (takže namiesto Inika potrebné INISouborek), ako keď sme do neho v inej procedúre zapisovali (alebo i čítali) ... nenačetl sme síce vyššie zadaný Text, ale nemusíme použiť všetko ... Ak si používateľ spustí program prvýkrát (alebo po zmazanie Kravina.ini), bude CheckBox1 začiarknuté. Potom už bude také, aké ho nechal užívateľ, keď program zatváral.
Case
Na záver vám ukážem jedno vylepšenie:
case Cislo of 1: begin Jedna; end; 2: begin Dva; end; end;
Je to vlastne zjednodušené vypisovanie if. Je to to isté ako:
if Cislo = 1 then begin Jedna; end else if Cislo = 2 then begin Dva; end;
Pri viacerých možnostiach pre premennú (tentokrát je to Cislo: Integer;) sa hodí použiť CASE! Rovnako tak možno Case použiť aj pre iné typy premenných a nie je vždy potrebné begin a end (napríklad v našom jednoriadkové prípade, kde sa spustí procedúra Jedna, alebo Dva):
case Cislo of 1: Jedna; 2: Dva; end;
A teraz jeden skvelý zdrojový kód: najprv definujte:
IniFile : TIniFile; Status : Integer;
A potom už môžete (najprv) zapisovať stav okna po uzavretí. Pokiaľ máte voľne posuvné a tvarovateľné okno, určite sa vám to bude hodiť!
IniFile := TInifile.Create('NázevNeboAdresaSouboru.ini'); Status := 0; case WindowState of wsNormal: begin IniFile.WriteInteger('Hlavní okno', 'Top', Top); IniFile.WriteInteger('Hlavní okno', 'Left', Left); IniFile.WriteInteger('Hlavní okno', 'Width', Width); IniFile.WriteInteger('Hlavní okno', 'Height', Height); Status := 1; end; wsMinimized: Status := 2; wsMaximized: Status := 3; end; if not Active then Status := 2; IniFile.WriteInteger('Hlavní okno', 'Status', Status); ... IniFile.Destroy;
Prvý riadok vytvoril IniFile. Ďalej sme dosadili za Status nulu a použili case v spojitosti s WindowState nášho okna. Ak je WindowState wsNormal, zistí sa pozície okná na obrazovke, jeho rozmery a Status sa zmení na 1 (to znamená, že okno bolo v normálnom stave). Ak je WindowState wsMinimized, je Status 2 a keď wsMaximized, tak 3. Ďalej zisťujeme, či je okno aktívne (to väčšinou pri zatváraní býva, len keď je minimalizované, tak nemusí ...) a pokiaľ nie je (to značí not - if not active then je to isté, ako if Active = False then), je Status 2. Teraz už len zapíšeme Status do IniFile. Tri bodky značí miesto, kam môžete písať svoje zápisky do ini súboru a po nich nasleduje zatváranie IniFile. Dúfam, že všetko chápete ...
... pretože je čas na príklad? Nee! Tentokrát necháme príklad príkladom. Veď sám zdrojový kód je príkladom. My sme si predsa ukázali, ako zapísať pozíciu okna, ale ešte sme jej neprevzali. Že to viete? To by ste sa čudovali! Je tam totiž jedna záludnosť :
Ideme na to! Najprv opäť nadefinujte:
IniFile : TIniFile; Status : Integer;
A potom píšte (samozrejme do procedúry FormCreate!):
IniFile := TInifile.Create('NázevNeboAdresaSouboru.ini'); Status := IniFile.ReadInteger('Hlavní okno', 'Status', 0); if Status <> 0 then begin Top := IniFile.ReadInteger('Hlavní okno', 'Top', Top); Left := IniFile.ReadInteger('Hlavní okno', 'Left ', Left ); Width:= IniFile.ReadInteger('Hlavní okno', 'Width', Width); Height := IniFile.ReadInteger('Hlavní okno', 'Height ', Height ); case Status of 2: PostMessage(Handle, wm_SysCommand, sc_Minimize, 0); {ona záludnost} 3: WindowState := wsMaximized; end; ... end;
Úprimne povedané, myslím, že by ste to zvládli, ale vraj WindowState: = wsMinimized; nefunguje. U mňa na PC to funguje , Ale ktovie, ako u niekoho iného. Pri programovaní je ale treba myslieť na každého! A tak program s týmto zdrojovým kódom pošle správu Windows, aby minimalizovala okno ... Ostatné je podobné, ako pri zápise, takže to bližšie popisovať nebudem. Teraz mám oddych (a môžem programovať) a vy sa pustite do využívania svojich nových znalostí (teda aspoň dúfam, že nových ... ) ...
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 411x (210.38 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Delphi