IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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! PromennaTypuTI­niFile 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
Nakoniec súbor zatvorte príkazom Destroy; Príklad:
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 PromennaTypuTI­niFile 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 PromennaCtene­hoTypu, 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
Číta to isté, ako zapisovali podobné príkazy vyššie. Opäť by ste mali INI súbor uzavrieť, aby nezaberal miesto v pamäti. Ale ak je lokálne, ako v našom prípade a použijete Destroy; na konci, je to zbytočné (ale názorné :-) ). Príklad:
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 ... :-) ) ...

Delphi

 

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

 

Predchádzajúci článok
Matematické funkcie a funkcie, práca s Shell, animovaná ryba
Všetky články v sekcii
Delphi
Preskočiť článok
(neodporúčame)
Prehľad premenných, StringGrid a Pagecontrol
Článok pre vás napísal Kukensius
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Jméno: Lukáš Kučera alias Kukensius<br/> Narození: říjen 1987 (ve znamení vah)<br/> Bydliště: Jihlava, Česká Republika<br/> Studium: 1. ročník magisterského studia<br/> Škola: Vysoké učení technické v Brně<br/> Fakulta: Fakulta elektrotechniky ...
Aktivity