# recipe

### Funkce

Přístroj recipe (receptura) je jednoduchý editor záznamů standardního databázového souboru ve formátu dBase III Plus. Umožňuje záznamy v databázi editovat, přidávat, vkládat i mazat. Obsah každé položky záznamu může být zapsán na přiřazený datový element nebo je možné položku naplnit vyčíslením nadefinovaného výrazu. Režim zápisu nebo načítání dat lze řídit i programově.

### Syntax

      recipe recipe_name;
        rem = string;
        bubble = string;
        timer = timer_name;
        owner = owner_name;
        position = integer, integer, integer, integer;
        win_disable = [ identifier, . . . ];
        win_title = string;
        access = integer;
        tab_select = integer;
        send_same_data;
        driver_exception = driver_name;
        data_file = string;
        pane_file = string;
        dv_id = string;
        font = font_identifier, integer, style_identifier;
        record_number = real_expression;
        create_record = boolean_expression;
        delete_record = boolean_expression;
        record_set = real_dataelement;
        records_count = real_dataelement;
        data_update = boolean_expression;
        data_updated = boolean_dataelement;
        file_update = boolean_expression;
        file_updated = boolean_dataelement;
        input_mode = boolean_expression;
        receivers = [ identifier, ... ];
        item
          name = string;
          type = identifier;
          length = integer;
          dec_places = integer;
          range_from = real;
          range_to = real;
          position = integer, integer, integer, integer;
          label_pos = integer, integer;
          label_text = string;
          input = any_expression;
          output = any_dataelement;
          protect;
        end_item;
        item
          ...
        end_item;
        colors
          text = color;
          background = color;
          ink = color;
          paper = color;
          selected_ink = color;
          selected_paper = color;
          top_shadow = color;
          bottom_shadow = color;
        end_colors;
      end_recipe;

### Specifické parametry přístroje

- data_file
  Jméno databázového souboru (typu DBF), z kterého budou načítána nebo zapisována data.
- pane_file
  Jméno souboru, který bude použit jako podklad panelu (viz přístroj panel).
- dv_id
  Explicitní určení typu DataView, které bude použito pro zobrazení pane_file.
- font
  Parametr určující písmo použité pro textové popisy v přístroji.
- record_number
  Číslo záznamu, s kterým bude provedena požadovaná operace.
- create_record
  Je-li výraz vyhodnocen jako true a výraz data_update je vyhodnocen jako false, lze přidávat nebo vkládat nové záznamy do receptury.
- delete_record
  Je-li výraz vyhodnocen jako true a výrazy data_update a create_record jsou vyhodnoceny jako false, pak je záznam record_number smazán.
- record_set
  Výstupní datový element, na který je nastavováno číslo záznamu poslední nastavené receptury.
- records_count
  Výstupní datový element, na který je nastavován celkový počet záznamů v souboru.
- data_update
  Je-li výraz vyhodnocen jako true, pak:
  a) je-li současně input_mode=false, jsou data ze záznamu nastavena na výstupní proměnné item-output
  b) je-li input_mode=true, je záznam naplněn daty získanými vyhodnocením výrazů v parametrech item-input.
- data_updated
  Výstupní datový element typu boolean, který bude nastaven na hodnotu true po úspěšné operaci data_update.
- file_update
  Je-li výraz vyhodnocen jako true, pak:
  a) je-li současně input_mode=true, jsou data zapsána do souboru
  b) je-li input_mode=false, jsou data čtena ze souboru
- file_updated
  Výstupní datový element typu boolean, který bude nastaven na hodnotu true po úspěšné operaci file_update.
- input_mode
  Logický výraz, který řídí směr práce s daty. Je–li jeho hodnota true, pak file_update představuje zápis do souboru a data_update představuje načtení hodnot do položek záznamu získaných vyčíslením nadefinovaných výrazů. Je-li hodnota výrazu false, pak file_update představuje čtení souboru a data_update představuje zápis dat ze záznamu na přiřazené datové elementy
- receivers
  Seznam příjemců zprávy.
- item a end_item
  Klíčová slova uzavírající vždy všechny parametry týkající se jedné položky.
  - name
    Jméno databázové položky (může mít maximálně 10 znaků a nesmí začínat číslicí).
  - type
    Typ databázové položky:
    character - řetězec libovolných znaků
    numeric - numerická hodnota
    logical - hodnota typu boolean
    date - datumová položka
  - length Délka (velikost) databázové položky:
    character - maximálně 254 znaků
    numeric - maximálně 19 znaků (včetně desetinné čárky)
    logical - vždy 1 znak
    date - vždy 8 znaků
  - dec_places
    Počet desetinných míst numerické databázové položky. Maximální počet desetinných míst může být vždy jen o dvě menší než je délka položky.
  - range_from
    Minimální hodnota, kterou lze zadat u numerické položky.
  - range_to
    Maximální hodnota, kterou lze zadat u numerické položky.
  - position
    Pozice a rozměry objektu pro zadávání dat.
  - label_pos
    Pozice textového popisu položky.
  - label_text
    Textový popis položky.
  - input
    Hodnotou, získanou vyčíslením tohoto výrazu je naplněna položka aktuálního záznamu. Typ výrazu musí odpovídat typu položky.
  - output
    Výstupní datový element, na který jsou zapisována data z položky aktuálního záznamu. Typ datového elementu musí odpovídat typu položky.
  - protect
    Je-li definován, nelze objekt editovat.
- colors
  Seznam prvků přístroje, kterým lze nastavit barvy:
  text - text
  background - pozadí
  ink - barva textu v editovacím rámečku
  paper - barva pozadí editovacího rámečku
  selected_ink - barva textu v editovacím rámečku při zadávání hodnoty
  selected_paper - barva pozadí editovacího rámečku při zadávání hodnoty
  top_shadow - horní stín editovacího rámečku
  bottom_shadow - dolní stín editovacího rámečku

### Poznámky

#### Vstupní mód

1. Pokud byl nadefinován výraz file_update a byl vyhodnocen jako true, uloží data z receptury do souboru a nastaví file_update podle výsledku operace se souborem na true nebo na false.
2. Vyhodnotí výraz record_number
3. Provede se jedna z následujicích akcí:
   1. Pokud je výraz data_update vyhodnocen jako true, zobrazí záznam record_number, vyhodnotí všechny výrazy input a získané hodnoty zapíše do záznamu, nastaví datový element data_updated na true, zadá požadavek na obeslání uvedených receiverů
   2. Pokud neplatí předchozí bod a výraz create_record vyhodnocen jako true, pak pokud je record_number menší nebo roven počtu záznamů v databázi receptury, tak na číslo záznámu record_number je vložen a zobrazen nový záznam. Je-li record_number větší než počet záznamů v databázi receptur, přidá jeden nebo record_number - records_count nových záznamů a záznam record_number je zobrazen. Pak nastaví datový element records_count na celkový počet záznamů v databázi receptur a zadá požadavek na obvolání uvedených receiverů.
   3. Pokud neplatí žádný z předchozích bodů a výraz delete_record je vyhodnocen jako true a současně je record_number menší nebo roven celkovému počtu záznamů v databázi receptur, smaže záznam record_number. Pokud by po smázání tohoto záznamu byla databáze receptur prázdná, přidá jeden záznam. Potom zobrazí záznam record_number nebo record_number - 1, nastaví datový element records_count na celkový počet záznamů v databázi receptur a zadá požadavek na obvolání uvedených receiverů.
   4. Pokud neplatí žádný z předchozích bodů, je pouze zobrazen záznam record_number.

#### Výstupní mód

1. Pokud byl nadefinován výraz file_update a byl vyhodnocen jako true, načte data ze souboru do receptury a nastaví file_update podle výsledku operace se souborem na true nebo na false.
2. Vyhodnotí výraz record_number.
3. Provede se jedna z následujicích akcí:
   1. Pokud je výraz data_update vyhodnocen jako true, zobrazí záznam record_number, nastaví data receptury na výstupní datové elementy, nastaví datový element recipe_set na hodnotu record_number, datový element data_updated na true, zadá požadavek na obeslání uvedených receiverů.
   2. Viz body b až d u vstupního módu.

#### Ovládání receptury

Menu okna přístroje má následující položky:

Soubor

  Nový – vytvoří nový soubor typu DBF (beze jména).
  Otevřít... – Otevře soubor typu `DBF`.
  Uložit – Uloží nastavená data do souboru typu `DBF`.
  Uložit jako... – Pomocí dialogového okna souborů dovolí uložit soubor pod libovolným jménem.

Záznam

  Další – Nastaví hodnoty receptury na další záznam souboru.
  Předchozí – Nastaví hodnoty receptury na předchozí záznam souboru.
  Jdi na... – Otevře dialogové okno, pomocí kterého lze nastavit číslo žádaného záznamu:
  Vyhledat... – Otevře dialogové okno, pomocí kterého lze nalézt záznam podle položky daného jména a podle její hodnoty (i bez ohledu na velikost písmen):
  Přidat – Přidá nový záznam.
  Vložit – Vloží nový záznam na pozici aktuálního záznamu.
  Smazat – Smaže záznam na aktuální pozici.
  Kopírovat data – Je–li tato volba zadána, pak vždy při vytvoření nového záznamu se okopírují hodnoty položek z naposled nastaveného záznamu.
  Výpis – Zobrazí všechny záznamy receptur pomocí databázového DataView.

Receptura

  Nastavení – Nastaví data z aktuálního záznamu na definované výstupy.
  Načtení – Naplní aktuální záznam hodnotami získanými vyčíslením definovaných výrazů.

Některé parametry mají implicitní nastavení

      position = 0, 0, 100, 100;
      access = <none>
      tab_select = <none>
      colors
        text = black;
        background = lgray;
      end_colors;

### Příklad

Příklad nastavení parametrů přístroje

      recipe Receptura;
        owner = Recipe_Sample;
        position = 339, 120, 260, 150;
        data_file = RECIPE.DBF;
        pane_file = RECIPE.PCX;
        record_number = RecipeNumber;
        create_record = CreateRecipe;
        delete_record = DeleteRecipe;
        record_set = ActiveRecipe;
        records_count = RecipeCount;
        data_update = UpdateRecipeData;
        data_updated = RecipeDataUpdated;
        file_update = UpdateRecipeFile;
        file_updated = RecipeFileUpdated;
        input_mode = InputRecipeMode;
        receivers = V_X1, G_X1, V_X2, G_X2;
        item
          name = VALUE_X1;
          type = numeric;
          length = 5;
          dec_places = 1;
          position = 45, 50, 75, 17;
          label_pos = 25, 53;
          label_text = 'X1';
          input = VR1;
          output = OutRealCh1;
        end_item;
        item
          name = COMMENT;
          type = character;
          length = 1;
          position = 70, 115, 165, 17;
          label_pos = 25, 117;
          label_text = 'Note';
        end_item;
      end_recipe;

## Nativní procedury přístroje

    NewFile()

Smaže všechny záznamy v receptuře a připraví ji pro zadávání nových dat.

    OpenFile( Filename : string; &Result : boolean )

Načte databázový soubor specifikovaný v parametru Filename do receptury. V parametru Result vrací výsledek operace.

    SaveFile( Filename : string; &Result : boolean )

Uloží záznamy receptury do databázového souboru specifikovaného v parametru Filename. V parametru Result vrací výsledek operace.

    AppendRecord( &Result : boolean )

Přidá nový záznam. V parametru Result vrací výsledek operace.

    InsertRecord( &Result : boolean )

Přidá nový záznam. V parametru Result vrací výsledek operace.

    DeleteRecord( &Result : boolean )

Smaže právě aktuální záznam receptury. V parametru Result vrací výsledek operace.

    DeleteAllRecords( &Result : boolean )

Smaže všechny záznamy receptury. V parametru Result vrací výsledek operace.

    GetRecordNumber( &RecordNumber : number )

Vrací v parametru RecordNumber číslo právě zobrazeného záznamu.

    GoPrevRecord( &Result : boolean )

Přechod na předchozí záznam. V parametru Result vrací výsledek operace.

    GoNextRecord( &Result : boolean )

Přechod na následující záznam. V parametru Result vrací výsledek operace.

    GoToRecord( RecordNumber : number; &Result : boolean )

Přechod na záznam RecordNumber. V parametru Result vrací výsledek operace.

    FindRecord( Itemname, ValueStr : string; IgnoreCase, FindSubStr, &Result : boolean; &RecordNumber : number )

Pokud je parametr FindSubStr nastaven na hodnotu false, pak hledá záznam, jehož položka Itemname je rovna ValueStr. Pokud je parametr FindSubStr nastaven na hodnotu true, pak hledá záznam, jehož položka Itemname obsahuje řetězec uvedený v parametru ValueStr. Pokud je parametr IgnoreCase nastaven na hodnotu true, pak ignoruje velikost písmen. Výsledek operace vrací v parametru Result. Pokud je záznam splňující zadané podmínky nalezen, parametr RecordNumber obsahuje číslo nalezeného záznamu.

    FindNextRecord( &Result : boolean; &RecordNumber : number )

Hledá další záznam, splňující podmínky zadané pomocí metody FindRecord. Výsledek operace vrací v parametru Result Pokud je záznam splňující zadané podmínky nalezen, parametr RecordNumber obsahuje číslo nalezeného záznamu.

    SetRecipe( RecordNumber : real; &Result : boolean )

Nastaví hodnoty ze záznamu receptury RecordNumber na definované výstupy receptury. V parametru Result vrací výsledek operace.

    GetRecipe(RecordNumber : number; &Result : boolean )

Vyhodnotí nadefinované vstupní výrazy a vysledky nastaví do záznamu RecordNumber. V parametru Result vrací výsledek operace.

    Hide()

Skrytí viditelného přístroje.

    Show()

Zobrazení skrytého přístroje.

    Minimize()

Minimalizuje přístroj v okně do ikony.

    Restore()

Obnoví přístroj (pokud je v okně) z ikony do pracovní plochy.

## Událostní procedury přístroje

Přístroj může volat standardní událostní procedury:

    OnActivate()
    OnMouseDown( MouseX, MouseY : integer; LeftButton, MiddleButton, RightButton : boolean )
    OnMouseDoubleClick( MouseX, MouseY : integer; LeftButton, MiddleButton, RightButton : boolean )
    OnMouseUp( MouseX, MouseY : integer; LeftButton, MiddleButton, RightButton : boolean )
    OnMouseMove( MouseX, MouseY : integer; LeftButton, MiddleButton, RightButton : boolean )
    OnSelect()
    OnDeselect()
    OnShow()
    OnHide()
    OnNewPosition( RectX, RectY, RectW, RectD : integer )
    OnWindowMinimize()
    OnWindowMaximize()
    OnWindowRestore( WasMinimized, WasMaximized : boolean )
    OnWindowClose()

Podrobnější informace k těmto procedurám lze nalézt v kapitole Programování a procedury.

### Specifické událostní procedury přístroje

    OnGetRecipe( RecordNumber : real )

Procedure je volána před naplněním hodnot získaných vyčíslením přiřazených výrazů do položek záznamu RecordNumber.

    OnSetRecipe( RecordNumber : real )

Procedure je volána před zápisem hodnot z položek záznamu RecordNumber na přiřazené datové elementy.