Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

7. diel - Dialógy, práca so súbormi a kalendár

Som rád, že už ste pokročili až k siedmej časti! Tentoraz sa zameriam na prácu so súbormi! Začnime oknami pre výber súboru. Najprv pre otváranie! V položke dialogs nájdite úplne vľavo OPENDIALOG.

Opendialog

To je akoby takéto okno, ktoré sa otvorí, keď chcete niečo načítať (otvoriť). Tak sa pozrime do Object Inspector na dve dôležité veci:

  • DefaultExt - tu je uložená koncovka súboru, ktorá sa k nemu má automaticky pridávať. Napr .: htm
  • FileName - tu je uložená adresa súboru
  • Filter - kliknite 2x na položku a v otvorenom okne editujte typy súborov, ktoré sa smú otvárať. Vľavo typ súboru popíšte a vpravo napíšte jeho koncovku v tvare napr .: * .htm
  • FilterIndex - tu si vyberiete poradové číslo položky výbere typu súboru, ktorý má byť aktívny.
  • Options - tu je veľa ďalších nastavení, aký má súbor byť (pozri. 2.bod-SaveDialog)
  • Title - text, ktorý bude hore na okne (titulok)

Tak to by bol OpenDialog. Preberieme ešte SaveDialog a potom podrobnejšie prácu so súbormi.

Napravo od OpenDialogu by mal byť SAVEDIALOG.

Savedialog

Má úplne rovnaké položky, ako OpenDialog a tak si len preberieme zopár položiek Options. Popis zodpovedá tomu, keď zadáte určitej položke True:

  • ofReadOnly - kolónka otvoriť len na čítanie je zaškrtnutá
  • ofHideReadOnly - súbory len na čítanie a kolónka otvoriť len na čítanie sa nezobrazí
  • ofPathMustExist - adresa súboru musí existovať, aby sa dalo stlačiť Otvoriť
  • ofFileMustExist - súbor musí existovať, aby sa dalo stlačiť Otvoriť

A to je z tých dôležitejších všetko! Teraz postupy na používanie základných funkcií Open / SaveDialogu: Hlavné asi je zistiť, ktorý súbor si užívateľ vybral! K tomu slúži už spomínaná položka FileName. Tá sa ale zmení aj keď pri výbere súboru kliknete na Storno! Okno (dialógové) pre hľadanie súboru k načítaniu otvorte príkazom EXECUTE!

napr .:

OpenDialog1.Execute;

Tým ale nezistíme, či používateľ stlačil Storno či OK. K tomu slúži tento príkaz, ale inak napísaný. Tak, aby bol zároveň Boolean:

if OpenDialog1.Execute then
begin
end

Medzi begin a end napíšete, čo sa má stať po stlačení OK. Ak sa spýtate programu na False, splní sa príkazy medzi begin a end pokiaľ bude stlačené Zrušiť.

Práca so súbormi

Tak! Dialógové okná už obsluhovať viete! Teraz postup k samotnej práci s externými súbormi (s tými, ktoré jednoducho nie sú súčasťou EXE súboru (okrem multimédií). Napr. Textové súbory, alebo aj s vašou vlastnou koncovkou). Začnime otvorením súboru:

Najprv vám uvediem príklad a potom popíšem jeho časti:

procedure TOkno.TlacitkoClick(Sender: TObject);
var
  Soubor: file of Integer;
begin
  AssignFile(Soubor, 'Číslo.int');
  Reset(Soubor);
  Read(Soubor, Cislo);
  CloseFile(Soubor);
end;

Mno, tak, máme tu nejakú procedúru. Presnejšie procedúru, ktorá sa spúšťa po kliknutí na tlačidlo Tlacitko, ale to je teraz jedno. Nás zaujíma jej obsah! Za var máme Súbor: file of Integer; To znamená, že premenná Súbor bude nejaký externý súbor, s ktorým budeme pracovať. Nikde inde ho ale používať nebudeme a tak ho môžeme vytvoriť len pre túto procedúru. file of Ineteger; samozrejme nenapíšeme u každého súboru! Iba u toho, ktorý má obsahovať jedno číslo! Ak chceme potrebné, aby obsahoval True, alebo False, zapíšeme file of Boolean; OK? Tak to by bolo! Teraz ale ďalej:

AssignFile(Soubor, 'Číslo.int');

To je príkaz pre otvorenie súboru, ktorý bude rovnakého typu ako Súbor a bude mať adresu (resp. Meno) Číslo.int! Ak chcete nahradiť Súbor, môžete, ale iná premenná musí existovať a musí to byť premenná externého súboru! Rovnako tak ani premenná po var sa vôbec nemusí vymenovať Súbor! Adresa externého súboru nemusí byť Číslo.int, ale musí byť medzi apostrofy. Koncovku (to je to za bodkou) môžete napísať akúkoľvek. Trebárs prd ;-) . Takže budete mať napríklad Kukensiův.prd Tak sme sa zasmiali, že? :-D

A teraz ďalej: Reset (Súbor); slúži k samotnému prečítaní súboru Súbor (ak neexistuje, program vráti chybové !!!). A dostávame sa k najhlavnejšie časti: Read (Súbor, Cislo); Tým načítame obsah externého súboru Súbor do premennej Cislo! Samozrejme ak máte Súbor: file of Integer ;, musí byť Cislo: Integer; Po tomto príkaze už máte obsah Súboru v číslach a môžete pracovať iba s číslami! Nezabudnite však súbor zavrieť! Príliš by to nevadilo, ale prečo robiť počítačom problémy so zbytočne otvorenými súbory v pamäti! K tomu slúži posledný príkaz CloseFile (Súbor); A to je z otvárania asi všetko!

Asi vás neprekvapí, že pre ukladanie do súboru sú skoro iné príkazy. Budem postupovať rovnako ako u predchádzajúceho bodu:

procedure TOkno.TlacitkoClick(Sender:
TObject);
var
   Soubor: file of Integer;
begin
  AssignFile(Soubor, 'Číslo.int');
  ReWrite(Soubor);
  Write(Soubor, Cislo);
  CloseFile(Soubor);
end;

Niektoré príkazy už poznáte, že? Prvé 4 riadky teda preskočím. A čo ten piaty? Ten už tiež poznáte, že? K nemu ale musím pripísať poznámku: pri otváraní Súbor musel existovať! Tu samozrejme nemusí. Tu tento príkaz externý súbor Číslo.int vytvorí a ak už existuje, len ho nájde! Rewrite (Súbor); Tak na toto si dajte pozor! Po tomto príkaze už zo súboru nič nezistíte! On totiž zmaže všetok obsah súboru a nasledujúci príkaz Write (Súbor, Cislo); do Súboru napíše obsah číslami. Tu opäť musí byť Cislo rovnakého typu ako Súbor (ale bez file of!). No, a zvyšok už zase poznáte! Takže pokročme k súboru s nápisom (textom) ...

Radujete sa, že ste to pochopili? Tak rýchlo prestaňte, pretože ešte neviete všetko u všetkých typov premenných to takto funguje, ale u stringu by ste narazili! Len si skúste napísať: Súbor: file of string; Delphi vypíše chybu: [Error] Project1.pas (411): Type 'String' needs finalization - not allowed in file type, [Chyba] Project1.pas (411): Typ 'String' potrebuje zakončenie - nedovolené pri type súboru. Neviete, aké zakončenie? Tým je myslený maximálny počet znakov! Takže keď napíšte: Súbor: file of string [50] ;, program už chybu nenapíše. Číslo v hranatej zátvorke samozrejme môžete zmeniť podľa vlastnej potreby dĺžky stringu. Ale POZOR! Súbory vo Windows s koncovkou txt NIE sú súbory stringu !!!!! Ďalšie zrada, čo? Neplačte, som tu, aby som vám pomohol! :-)

Textové súbory

Soubor: TextFile;

A je to !? NIE !!! TextFile môže byť viac riadkový! Ak zapisujete, všetko je normálne! Ak ale chcete čítať, narazíte! Ak napíšete totiž Read (Súbor, Memo.Text) ;, v môjmu (viď. 6.časť) sa vám objaví iba prvý riadok! A je tu problém !!!!! A preto vám tu napíšem vzor, podľa ktorého sa môžete riadiť, aby ste nemali problémy:

procedure TOkno.TlacitkoClick(Sender:
TObject);
var
   Soubor: TextFile;
  Radek: string;
begin
  AssignFile(Soubor, 'Kniha.txt');
  Reset(Soubor);
  while not Eof(Soubor) do
  begin
    ReadLn(Soubor, Radek);
    Memo.Lines.Add(Radek);
  end;
  CloseFile(Soubor);
end;

A ideme pitvať! Prvá zmena je premenná Radek! To nie je ako meno, ale ako riadok (kľudne si to pomenujte Mumuland, alebo ako chcete! Ja tu mám proste Radek ... NIE Radka! :-P). Tento string je dôležitý! Budeme doň postupne ukladať jednotlivé riadky (alebo ak sa vám páči, tak Radky :-P ). Ďalej je zmena päťriadkový:

while not Eof(Soubor) do
begin
  ReadLn(Soubor, Radek);
  Memo.Lines.Add(Radek);
end;

A tú si teraz poriadne preberieme! while not EOF (Súbor) do znamená, že kým pri načítaní nenarazíme na koniec externého súboru Súbor, program bude neustále opakovať príkazy medzi begin a end! Tým sme sa dostali k ReadLn (Súbor, Radek); Tu si všimnite, že príkaz Read sa zmenil na ReadLn, čo značí, že sa má čítať a potom preskočiť na ďalší riadok! Tu sme si teda uložili jeden riadok do stringu Radek. A v príkaze Memo.Lines.Add (Radek); pridáme Radek na koniec obsahu Mema! To sa opakuje dovtedy, kým súbor neskončí! A tým máme prebranú prácu so súbormi.

Úplne toho istého výsledku docielite, keď napíšete Memo.Lines.Lo­adfromfile ( 'Kniha.txt'); Dôvod, prečo som vám to vysvetľoval tak zložito je, že niekedy budete chcieť načítať textový súbor na pozadí a teda je zbytočné tam mať memo, ktoré používať nebudete. Áno, môžete ho skryť, ale týmto spôsobom si precvičíte prácu so súbormi a na iné ako textové súbory tu potom ďalšie Memo pripravené nemáte.

"To je síce pekný, ale čo keď chcem uložiť napríklad viac čísel do súboru?" Áno, tak to teda naozaj so svojimi znalosťami (z môjho návodu neviete), ale nebojte sa, hneď vám to poviem. Hlavnou vecou, ktorú budete musieť poznať je nový variant premennej. Pred chvíľou som vám ukázal FILE OF a teraz nás čaká: ARRAY [] OF. Alebo ak POLE! Pole nejaký priestor pre ukladanie. Dajme tomu, že si pre názornú ukážku budeme ukladať treba Boolean do nášho okolia. To je najjednoduchšie premenná. Buď áno, alebo nie, že? Budeme uvažovať, že 1 Boolean sa zmestí na 1mm. Takých Boolean môže byť veľa a tak si musíme určiť limit. Minimálne poradové číslo môže byť potrebné 0. Ale musíme zadať ešte maximálna. Takže treba 9 mm! Preto budeme mať 10 čísiel (0, 1, 2, 3, 4, 5, 6, 7, 8 a desiate: 9) To, čo som vám teraz napísal, zapíšeme: NejakePole: array [0..9] of. Takže na úsečku 1cm sa vojde 10Booleanů. Ale čo keď prejdeme z úsečky do obdĺžnika? Potom na 1 centimeter štvorcový vyjde 100 Boolean! Pole ale musíme zapísať inak: NejakePole: array [0..9, 0..9] of. Tu už totiž máme dva rozmery. A čo keď sa premiestnime do priestoru? Budeme mať 3 rozmery. Takže kocku 10x10x10mm zapíšeme: NejakePole: array [0..9, 0..9, 0..9] of. Tak môžeme pokračovať ďalej. Napríklad až k 1000 rozmerom! Ale v bežnom programovaní asi použijeme len tieto tri varianty. Predpísať premennú teda už vieme, ale ako ju použiť? jednoducho:

NejakeCislo := NejakePole[PoradoveCislo];

NejakeCislo je Integer, NejakePole array of Integer a PoradoveCislo je poradové číslo určitého integer v poli NejakePole. Takže v našom prípade 0, 1, 2, 3, 4, 5, 6, 7, 8, alebo 9. Opačne to funguje rovnako:

NejakePole[PoradoveCislo] := NejakeCislo;

Normálny pole už použiť vieme. Takže už len stačí povedať, ako ho zapísať do Súboru:

Soubor:file of array [1..24] of Integer;

Alebo napríklad:

Soubor:file of array [0..99] of string[20];

A máme prebrané POLE!

"Dobre, ale čo keď chcem do súboru uložiť potrebné skóre z hry a pri každom skóre meno výhercu?" No problem! Ďalší (posledný) úskalia! Súbor musí byť jednoducho jedna premenná. A tak vám poviem, ako vyrobiť vlastné premennú! Takže: Najprv si nájdite začiatok textu programu a tam

type
  TForm1 = class(TForm)
  private
        { Private declarations }
    public
        { Public declarations }
  end;

(Takto vyzerá väčšinou iba nový program, ale aj tak verím, že túto časť nájdete! Veď sem už ste písali premenné!) Tu budeme písať medzi type a TForm1 = class (TForm). Najprv musíme typ premennej nejako pomenovať väčšinou sa typy premenných pomenúvajú na začiatku s T (napríklad TMaPromenna), ale nie je to potrebné. Skôr to slúži k prehľadnosti a že treba môžeme mať premennú MaPromenna: TMaPromenna; A vidíte, zapisuje sa rovnako, ako všetky normálne premenné. Ale vráťme sa späť pod type. Opäť tu ukážem príklad:

type
  TSoubor = record
    Prvni: Integer;
    Vitez: string[20];
    Druhy: Integer;
    Skoro: string[20];
    Treti: Integer;
    NicMoc: string[20];
  end;

  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

Tak takto by mal vyzerať začiatok novovytvoreného programu iba s typom premennej TSoubor. TSoubor môžete nahradiť svojím vlastným názvom, ale = record musí zostať! Ďalej už píšete podproměnné. Až po end; A je to!
Môžete treba zapísať toto:

type
  TNeco = record
    Cislo: Integer;
    DvacetZnaku: string[20];
   end;

  TCosi = record
    Cislo: Integer;
    DvacetZnaku: string[20];
    Neco: TNeco;
   end;

    TForm1 = class(TForm)
    private
        { Private declarations }
    public
        { Public declarations }
  end;

A ako budeme s našou premennou pracovať? Ukážme si prácu s našou ukážkovú premennú typu TCosi. Najprv si vytvoríme premennú: Cosi: TCosi;
A teraz už k samotnému zápisu:

Cosi.Cislo := 12;
Cosi.DvacetZnaku := 'Ahoj ňoumo!';
Cosi.Neco.Cislo := 15;
Cosi.Neco.DvacetZnaku := 'Jsi truhlík!';

Pochopili ste spôsob zápisu? Rovnako ako u objektov vo vlastnej premennej oddeľujete rôzne položky bodkou.

Gauge

Tak som konečne prebral väčšinu premenných, takže ešte preberieme 2 objekty. Konečne navštívime položku Samples. A úplne vľavo máme GAUGE - Inštalovali ste niekedy nejaký program? Tak to určite poznáte taký ten rámček s počtom percent a meniacim sa prúžkom farby, ktorá sa pohybuje doprava. A to je práve GAUGE. Tak rýchlo k položkám v Object Inspector:

  • BackColor - To bude asi nejaká farba! Áno. Farba pozadia. Teda tej časti, ktorá sa ešte nevykonala :-)
  • BorderStyle - Opakovanie matka múdrosti. Ak zadáte bsSingle, bude okolo Gauge rámček, ak bsNone, nič okolo nebude.
  • Font - Tu nastavíte font, ktorý sa použije na počet percent
  • ForColor - To bude asi tiež nejaká farba! Áno. Farba časti, ktorá sa už vykonala.
  • Kind - Tu si určíte typ zobrazenia: gkHorizontalBar-normálne pruh zľava pribúdajúce

    gkNeedle-niečo ako ukazovateľ rýchlosti v aute (ručička zľava cez vršok doprava)

    gkPie-niečo ako ukazovateľ populácie (ovál, v ktorom je vyplnený úsek v štýle krájanie torty)

    gkText-len pozadie a počet percent

    gkVerticalBar - pruh nepriberá zľava, ale odspodu

  • gkHorizontalBar-normálne pruh zľava pribúdajúce
  • gkNeedle-niečo ako ukazovateľ rýchlosti v aute (ručička zľava cez vršok doprava)
  • gkPie-niečo ako ukazovateľ populácie (ovál, v ktorom je vyplnený úsek v štýle krájanie torty)
  • gkText-len pozadie a počet percent
  • gkVerticalBar - pruh nepriberá zľava, ale odspodu
  • Maxvalue - Maximálna hodnota (nie počet percent, ale počet akýchsi bodov)
  • MINVALUE tak - Minimálna hodnota (nie počet percent, ale počet akýchsi bodov)
  • Progress - A tu je konečne počet bodov (nie percent), ktoré budú splnené
  • ShowText - Zadáte, či sa má zobrazovať počet percent. Viac vám asi nepoviem. Len že to veľa používam. Ale poďme ďalej. Ku druhému objektu!

Calendar (kalendár)

Blížime sa ku koncu 7.díl návodu. Asi šiesty odlievať by mal byť obrázok kalendára: CALENDAR - Vo Windows v nastavenia dátumu máme tiež taký kalendár. V Object Inspector máme:

  • Day - číslo dňa v mesiaci, ktorý bude zaškrtnutí
  • GridLineWidth - šírka čiar tabuľky, oddeľujúce od seba dni
  • Month - číslo mesiaca, podľa ktorého budú v kalendári zoradené dni (po, ut, st ...)
  • StartOfWeek - čím bude začínať týždeň (1 = pondění, 2 = utorok ... 6 = sobota, ale nedeľa je 0!)
  • UseCurrentDate - nastavíte ak True, Day, Month a Year sa nastaví na dátum, ktoré práve je. A každý deň sa dátum zmení na to, ktoré je v počítači nastavené!
  • Year - nastavíte rok, podľa ktorého budú zoradené dni

Je síce pravda, že som to trochu oklamal, ale aj kalendár sa vám môže hodiť!

Program

A je tu koniec návodu. Takže by to chcelo skrnutí: Začnime jenom takým spestrením programu: Vložíme Gauge, pomenujeme ho Ukazovateľ, šírku (Width) nastavíme dvakrát väčšie ako výšku (Height), Progress na 0, maxvalue na 100, MINVALUE tak na 0 a Kind na gkNeedle. Vytvorte Boolean Doprava. Kliknite davkrát na okno a píšte: Doprava: = True; Teraz vložíme Timer (s menom Cas) a Interval nastavíme na 20. Kliknite na neho 2x a píšte:

if Doprava then
begin
  if Ukazatel.Progress < 100 then
    Ukazatel.Progress := Ukazatel.Progress + 1 else
    Doprava := False;
end else
begin
  if Ukazatel.Progress > 0 then
    Ukazatel.Progress := Ukazatel.Progress - 1 else
    Doprava := True;
end;

A máme vytvorený zaujímavý efekt. Stačí? Čo? Že sme si precvičili iba jeden objekt? Tak jo, ideme ďalej: Vytvorte checkbox, pomenujte ho Obsahuje a Checked nastavte na False. Ďalej si vytvorte Edit s menom Napis, žiadnym Textom as Maxlength 20! A môžeme pokročiť k editácii vlastnej premennej: Teraz by ste na začiatku programu mali mať približne toto:

type
  TForm1 = class(TForm)
    Ukazatel: TGauge;
    Cas: TTimer;
    Obsahuje: TCheckBox;
    Napis: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure CasTimer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Doprava : Boolean;
  end;

Ak ste postupovali presne podľa návodu, malo by to byť takéto! Ako si môžem byť istý? Pod TForm1 = class (TForm) sa totiž postupne pripisujú objekty, ktoré vytvoríte. A pod objekty sa píšu rovnakým spôsobom procedúry (to už iste viete :-) ). A pod public by ste mali písať svoje premenné! Ale k veci: Medzi type a TForm1 = class (TForm) píšte:

TMujSoubor = record
  Obsahuje: Boolean;
  Napis: string[20];
end;

Typ premennej už teda nadefinovaný máme, teraz už len vytvoriť samotnú premennú! Nebudem vám radiť ako, len tu vypíšem, ako má vyzerať vyššie vypísaný začiatok po úpravách:

type
  TMujSoubor = record
    Obsahuje: Boolean;
    Napis: string[20];
  end;

   TForm1 = class(TForm)
       Ukazatel: TGauge;
    Cas: TTimer;
       Obsahuje: TCheckBox;
    Napis: TEdit;
       procedure FormCreate(Sender: TObject);
    procedure CasTimer(Sender: TObject);
  private
       { Private declarations }
   public
       { Public declarations }
       Doprava : Boolean;
    MujSoubor : TMujSoubor;
   end;

Iste ste spoznali, že nová premenná typu TMujSoubor sa bude volať MujSoubor. Teraz sa ale premiestnime späť do grafickej editácie programu a vložíme ďalšie objekty: tlačidlo Otvoriť (Caption bude Otvoriť) a tlačidlo Ulozit (Caption Uložiť). Čo teraz? OpenDialog menom Open a SaveDialog menom Save. Nastavenie budú mať obaja dialógy rovnaké: DefaultExt bude KPF a v tabuľke Filter do Filter Name napíšte Kukensius Pages File a pod Filter * .kpf A to je z dôležitého (a rovnakého) nastavenie všetko.

Konečne môžeme písať program (to vás baví, že? :-) )!
Kliknite 2x na okno a do procedúry pripíšte:

MujSoubor.Obsahuje := False;
MujSoubor.Napis := '';

Kliknite dvakrát na checkbox Obsahuje a napíšte:

MujSoubor.Obsahuje := Obsahuje.Checked;

Teraz zase dvojito kliknite na Edit Napis a píšte:

MujSoubor.Napis := Napis.Text;

Tým by sme mali tú nudnejšie časť odfláknutú a podíde k záverečnej: Kliknite (2x) na Ulozit a pred begin pripíšte: var Súbor: file of TMujSoubor; a za begin:

if Save.Execute then
begin
  AssignFile(Soubor, Save.FileName);
  ReWrite(Soubor);
  Write(Soubor, MujSoubor);
  CloseFile(Soubor);
end;

A u OTVORIŤ podobne. Pred begin napíšte to isté a za (pod) neho toto:

if Open.Execute then
begin
  AssignFile(Soubor, Open.FileName);
  Reset(Soubor);
  Read(Soubor, MujSoubor);
  CloseFile(Soubor);
  Obsahuje.Checked := MujSoubor.Obsahuje;
  Napis.Text := MujSoubor.Napis;
end;

A program je hotový! Teraz si môžete napísať niečo do Editu a zaškrtnúť checkbox a uložiť. Až vypnete program a znova ho spustíte, môžete si akýkoľvek súbor typu TMujSoubor s koncovkou KPF otvoriť a zistiť, čo ste pred uložením mali napísané v Editu a či bol checkbox zaškrtnutý.

... Kukensius

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é 496x (215.47 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Delphi

 

Predchádzajúci článok
Menu, zoznamy obrázkov a poznámky
Všetky články v sekcii
Delphi
Preskočiť článok
(neodporúčame)
Obrazce, práca s textom a kreslenie na canvas
Č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