#include "inc/gendefs.h" #include "inc/dbdefs.h" /* zk_1 ******************************************************************** * Elementarni uvodni program * ukazka pouziti promennych v OSLO ******************************************************************************/ cmd zk_1(double prom1, double prom2) { double nasobeni; nasobeni = prom1*prom2; print("vysledek nasobeni =", nasobeni); } /* cocka_1 ******************************************************************** * Prikaz cocka_1 vypocte lamavost a ohniskovou vzdalenost tenke cocky ve vzduchu. * Prikaz muze byt vlozen z klavesnice spolecne se svymi argumenty. Napriklad * cocka_1 25.95 0 1.5168 * Vypoctena ohniskova vzdalenost (50.212848) bude zobrazena v textovem okne. * Prikaz muze byt take napsan bez argumentu, jednoduse: * cocka_1 * nebo * arg_entry=dialog_box;cocka_1 * V techto pripadech budete navadecim dialogem dotazani na potrebne argumenty * bud v prikazovem radku nebo v dialogovem boxu. * 1. Prikaz cocka_1 je pocestenou variantou prikazu TLEX_1. * Tento prikaz je vypocetnim usekem vyuzivanym v nasledujicich prikladech * teto prirucky pro vyuku zakladu prace s tabulovymi kalkulatory CCL. ******************************************************************************/ cmd cocka_1(double tl__polomer1, double tl__polomer2, double tl__index_lomu) { double mohutnost, f; if (tl__polomer1 == 0) tl__polomer1 = 1e20; if (tl__polomer2 == 0) tl__polomer2 = 1e20; mohutnost=(1.0/tl__polomer1-1.0/tl__polomer2)*(tl__index_lomu-1.0); if (mohutnost != 0) f = 1/mohutnost; else f = 0; print("ohniskova vzdalenost", f); } /* cocka_2 ******************************************************************** * Hodnoty argumentu, ktere jsme potrebovali pro provedeni prikazu cocka_1 * je mozno ziskat i dalsim zpusobem. Uvaujme, ze mame jednoduchou databazi * elementarnich cocek, ktera ma oznaceni jedcocka_2.cdb . * Prikaz cocka_2 je zprostredkujici prikaz, ktery ukazuje, jak je mozno * zpristupnit data z databaze prikazem dbgre (db_get_real_element) * a dbgse (db_get_string_element). * Abyste mohli uzivat tento prikaz, musite nejprve otevrit databazi jedcocka_2.cdb. * Je-li databaze siplens_2.cdb otevrena, pak do prikazoveho radku napiste prikaz * cocka_2 a stisknete Enter. * Navadecem budete dotazani na cislo radku tabulky, ve kterem jsou data cocky, * jejiz ohniskovou vzdalenost chcete vypocitat. Ohniskova vzdalenost cocky vybrane * z databaze bude zobrazena ve vystupnim textovem okne. * 1. Protoze prikazy zpristupnujici data z databaze davaji skalarni promenne * (ale ne promenne typu pole), musi byt spojeny s operatorem adresy &. * 2. Na sloupec je odkazovano jmenem pomoci funkce dbcol(), * aby se vypocetlo cislo sloupce, ktere je spojeno s jeho jmenem. * 3. Element "glass" je vytazeno jako string, ktery poskytuje jine jmeno * elementu v pripade, kdyz je definovano (alias). Protoze to je string, * musi byt premenen na cislo uzitim funkce atof(). Prikaz cocka_2 je * pocestenou variantou prikazu TLEX_1. ******************************************************************************/ cmd cocka_2(int radek_db) { double mohutnost, f; double radius1; double radius2; double index_lomu; char index_lomu_str[16]; dbgre(&radius1,radek_db,dbcol("polomer1")); dbgre(&radius2,radek_db,dbcol("polomer2")); dbgse(index_lomu_str,radek_db,dbcol("sklo")); index_lomu = atof(index_lomu_str);//prevede string na realne cislo if (radius1 == 0) radius1 = 1e20; if (radius2 == 0) radius2 = 1e20; mohutnost = (1.0/radius1 - 1.0/radius2)*(index_lomu - 1.0); if (mohutnost != 0) f = 1.0/mohutnost; else f = 0; print("Tenka cocka z",radek_db,". radku"," ma ohniskovou vzdalenost f =", f); } /* cocka_3 ******************************************************************** * Prikaz cocka_3 uziva databazi jedcocka_3.cdb a poskytuje stejne vysledky jako * prikaz cocka_2, ale je psan jako funkce se zpetnou vazbou a je proveden vzdy, * kdyz se klikne na knofliku "Ohniskova vzdalenost" nebo "Opticka mohutnost", * ktere jsou definovany v tabulkovem procesoru. * Aby se prikaz mohl pouzit, musi byt otevren tabulkovy procesor s databazi * jedcocka_3.cdb, avsak dodatek Automatic Callbacks (v DB menu) neni kontrolovan. * Knofliky generuji svoje vlastni zpetne vazby: kdykoliv se klikne na techto * knoflicich,je proveden prikaz cocka_3. V databazi pouzijte Menu>>Properties, * abyste videli, ze funkce zpetneho volani je nastavena na prikaz "cocka_3". * * 1.Vsechny funkce zpetneho volani maji 3 argumenty: radek_db,sloupec_db * a duvod. Argumenty radek_db a sloupec_db jsou cisla radku a soupce * bunky, kde se provadi zpetne volani. Argument "duvod" je typu integer * a je definovan v hlavickovem souboru public/ccl/inc/db_defines.h, * na ktery odkazuje radek * "#include"../../public/ccl/inc/a_global.h" * Tento hlavickovy soubor je zapsan na druhem radku programu cocky.ccl. * Obsah argumentu "duvod" rika proc bylo * zpetne volani provedeno. V tomto pripade je duvodem kliknuti na nekterem * z knofliku. Podle toho, na kterem knofliku bylo kliknuto (DB_BUTTON_1 * nebo DB_BUTTON_2) bude v textovem okne zobrazena, bud ohniskova * vzdalenost, nebo mohutnost cocky. * 2.Vysledek je zavisly na tom, kterou bunku jste vybrali v tabulkovem * procesoru, a na ktery knoflik jste klikli. * 3.Knoflik se v tabulkovem procesoru vytvori pomoci prikazu * v Menu>Set Callbac Button Labels. Celkem je mozno vytvorit az 10 ruznych * knofliku pro zpetna volani. ******************************************************************************/ cmd cocka_3(int duvod, int radek_db, int sloupec_db) { double mohutnost, f; double radius1; double radius2; double index_lomu; char index_lomu_str[16]; dbgre(&radius1,radek_db,dbcol("polomer1")); dbgre(&radius2,radek_db,dbcol("polomer2")); dbgse(index_lomu_str,radek_db,dbcol("sklo")); index_lomu = atof(index_lomu_str);//prevede string na realne cislo if (radius1 == 0) radius1 = 1e20; if (radius2 == 0) radius2 = 1e20; mohutnost = (1.0/radius1 - 1.0/radius2)*(index_lomu - 1); if (mohutnost != 0) f = 1.0/mohutnost; else f = 0; switch(duvod) { case DB_BUTTON_1: print("tenka cocka",radek_db,"ma ohniskovou vzdalenost",f); print("polomer1",radius1); print("polomer2",radius2); print("index lomu",index_lomu); break; case DB_BUTTON_2: print("tenka cocka",radek_db,"ma optickou mohutnost",mohutnost); break; default: break; } } /* cocka_4 ******************************************************************** * Prikaz cocka_4 uziva databazi jedcocka_4.cdb, ktera je podobna databazi * jedcocka_3.cdb ale funkce zpetneho volani vola funkci cocka_4 a navic * je v ni nastavena kontrola Automatic Callbacks. * To zajistuje, ze zpetna vazba je generovana automaticky programem soubezne * s kliknutim na ovladacich knoflicich. V uvadenem priklade * mohou byt generovany ruzne typy zpetnych vazeb pomoci tabuloveho procesoru CCL, * a vystupy jsou zobrazovany v textovem okne. * * 1.Protoze je zapnut Automatic Callbacks, tak prikaz cocka_4 bude volan vzdy, * kdyz je tabulkovy procesor oteviran nebo zaviran. V tom okamziku je * cislo radku databaze (radek_db) rovno nule. Protoze prvni aktualni radek * v tabulkovem procesoru je 1, musi byt prichozi prikaz chranen instrukci, * kterou muzeme napsat napr. takto: * "if (dbrow > 0) ... " * 2.Normalne, kdyz je na nejakem knofliku kliknuto, tak jsou timto jedinym * kliknutim vyslane udaje radek_db a sloupec_db. * 3.Konstanty jsou definovany v hlavickovem souboru * public/ccl/inc/db_defines.h ******************************************************************************/ cmd cocka_4(int duvod, int radek_db, int sloupec_db) { double mohutnost, f; double radius1; double radius2; double index_lomu; char index_lomu_str[16]; if(radek_db>0) { dbgre(&radius1,radek_db,dbcol("polomer1")); dbgre(&radius2,radek_db,dbcol("polomer2")); dbgse(index_lomu_str,radek_db,dbcol("sklo")); index_lomu = atof(index_lomu_str);//prevede string na real cislo if (radius1 == 0) radius1 = 1e20; if (radius2 == 0) radius2 = 1e20; mohutnost = (1.0/radius1 - 1.0/radius2)*(index_lomu - 1.0); if (mohutnost != 0) f=1.0/mohutnost; else f = 0; } switch(duvod) { case DB_BUTTON_1: print("temka cocka",radek_db,"ohniskova vzdalenost",f); break; case DB_BUTTON_2: print("tenka cocka",radek_db,"mohutnost",mohutnost); break; case DB_OPENED: print("Opened"); break; case DB_ESCAPING: print("Escaping"); break; case DB_CLOSING: print("Closing"); break; case DB_CELLSELECTED: print("Element selected"); break; case DB_ROWCHANGED: print("Row changed"); break; case DB_COLCHANGED: print("Column changed"); default: print("Unknown reason!", duvod); break; } } /* cocka_5 ******************************************************************** * Tento prikaz uziva databazi jedcocka_5.cdb, ktera obsahuje jeste jeden dalsi * sloupec pro hodnoty, ohniskove vzdalenosti. Misto aby se ohniskova vzdalenost * tiskla ve vystupnim textovem okne, prikaz vyuziva prikaz pro pristup k datum * dbpre(db_put_real_element), ktery zapise ohniskovou vzdalenost do databaze. * Hodnota ohniskove vzdalenosti je prvni argument a cislo radku a sloupce, kam se * ma zapsat, jsou druhym a tretim argumentem. * 1.Zpetne volani se generuje automaticky kdykoliv je vybrana nova bunka * v tabulkovem procesoru. Vyber nejakeho radkoveho knofliku nevyvola * zpetne volani. * 2.Jestlize zmenite polomer nebo sklo, bude nove zmenena i ohniskova * vzdalenost. * 3.Abyste nove zavedli ohniskove vzdalenosti vsech cocek, musite kliknout * na bunce v kazdem radku. ******************************************************************************/ cmd cocka_5(int duvod, int radek_db, int sloupec_db) { double mohutnost, f; double radius1; double radius2; double index_lomu; char index_lomu_str[16]; if(radek_db>0) { dbgre(&radius1,radek_db,dbcol("polomer1")); dbgre(&radius2,radek_db,dbcol("polomer2")); dbgse(index_lomu_str,radek_db,dbcol("sklo")); index_lomu=atof(index_lomu_str);//prevede string na realne cislo if (radius1 == 0) radius1 = 1e20; if (radius2 == 0) radius2 = 1e20; mohutnost = (1.0/radius1 - 1.0/radius2)*(index_lomu - 1.0); if (mohutnost != 0) f = 1.0/mohutnost; else f = 0; dbpre(f,radek_db,dbcol("ohniskova vzdalenost")); } switch(duvod) { case DB_BUTTON_1: print("tenka cocka",radek_db,"ohniskova vzdalenost",f); break; case DB_BUTTON_2: print("tenka cocka",radek_db,"mohutnost",mohutnost); break; case DB_OPENED: print("Opened"); break; case DB_ESCAPING: print("Escaping"); break; case DB_CLOSING: print("Closing"); break; case DB_CELLSELECTED: print("Element selected"); break; case DB_ROWCHANGED: print("Row changed"); break; case DB_COLCHANGED: print("Column changed"); default: print("Unknown reason!", dbreason); break; } } /* cocka_6 ******************************************************************** * Toto je zpetna vazba pro databazi jedcocka_6.cdb, ktera se od predchozi databaze * odlisuje odstranenim knofliku zpetneho volani. Prikaz cocka_6 nove definuje * lokalni promenne na pole, takze vsechna vyznamna data v tabulkovem procesoru * mohou byt obnovena z jednoho zpetneho volani. Tento priklad uziva pristupove * funkce ke sloupcum dbrgc (db_get_real_column) a dbgsc (db_get_string_column) * stejne dobre jako db_prc (db_put_real_column) k zapisu ohniskovych vzdalenosti * do databaze, kdyz je databaze na pocatku otevrena, nebo kdyz jsou radky nebo * sloupce zmeneny (napriklad pri vkladani novych radku, nebo pri jejich vymazani). * 1.Promenna duvod je uziat k rozhodnuti co se ma delat. * Pro duvody DB_OPENED,DB_ROWCHAGED nebo DB_COLCHANGED je cela databaze * obnovena, * ale kdyz je duvodem DB_CELLSELECTED, pak jen radek, ktery obsahuje * danou bunku je updatovan. Konstanty v tomto pripade jsou definovany * v souboru /ccl/inc/a_global.h , ktery je uveden na zacatku tohoto pole. * 2.Obnovovani je jednoduche a tabulkovy procesor se obcas obnovuje * i kdyz to neni potrebne.Napriklad volani DB_CELLSELECTED zpusobi * obnoveni kdykoliv je nejaka bunka vybrana a nejen, kdyz jsou jeji * data zmenena. Tato procedura by se mohla delat chytreji, napriklad * srovnanim novych a starych dat, ale uvedeny priklad je dosti rychly, * takze nevyzaduje nejakou extra preciznost. * 3.Protoze promenne jsou nyni typu pole, tak operator adresy & * neni vyzadovan. * 4.CCL tabulkovy procesor je baze 1; to znamena, ze prvni radek odpovida * elementu 1. Rozmer pole je nastaven v DB_MAXROWS (bezne 2000). * Nulovy element pole je uzit v databazove sloupcove akci k vraceni * aktualnich cisel radku v databazi (t.j. pocet_radku_db=radius1[0]). * Ackoliv sloupcovy vektor musi mit dimenzi vetsi nez je pocet radku, * bude pomoci sloupcove pristupove funkce vyplnen jen aktualni pocet * radku. * 5.Promenne jsou lokalni pole, coz znamena, ze kdyz je prikaz cocka_6 * vyvolan musi byt k dispozici pro ne pamet. Pote co se z funkce opusti, * uvolni se pamet pro operacni system. Dimenzovani lokalnich poli * funkce cocka_6,ac je velmi velke, nezapricini nejake omezeni pro * proces, pokud je k dispozici dynamicka pamet. To neplati pro * staticka a globalni pole, ktera trvale rezervuji pamet * po celou dobu behu procesu. ******************************************************************************/ cmd cocka_6(int duvod, int radek_db, int sloupec_db) { double mohutnost[DB_MAXROWS], f[DB_MAXROWS]; double radius1[DB_MAXROWS]; double radius2[DB_MAXROWS]; double index_lomu[DB_MAXROWS]; char index_lomu_str[DB_MAXROWS][16]; char pomocny_str[16]; int i,pocet_radku_db; dbgrc(radius1,0,dbcol("polomer1")); dbgrc(radius2,0,dbcol("polomer2")); dbgsc(index_lomu_str,0,dbcol("sklo")); pocet_radku_db = radius1[0]; for(i=1; i<=pocet_radku_db; i++) { ary2strcpy(pomocny_str,index_lomu_str,i);//kopiruje element do pole index_lomu[i]=atof(pomocny_str);//prevede string na realne cislo if (radius1[i] == 0) radius1[i] = 1e20; if (radius2[i] == 0) radius2[i] = 1e20; } switch (duvod) { case DB_OPENED: case DB_ROWCHANGED: case DB_COLCHANGED: for (i=1;i<=pocet_radku_db;i++) { mohutnost[i]=(1.0/radius1[i]-1.0/radius2[i])*(index_lomu[i]-1); if (mohutnost[i] != 0) f[i] = 1.0/mohutnost[i]; else f[i] = 1e20; } /* vlozi cely sloupec f do databaze */ dbprc(f,pocet_radku_db,dbcol("ohniskova vzdalenost")); break; case DB_CELLSELECTED: mohutnost[radek_db]=(1.0/radius1[radek_db]-1.0/radius2[radek_db])* (index_lomu[radek_db]-1.0); if(mohutnost[radek_db]!=0)f[radek_db]=1.0/mohutnost[radek_db]; else f[radek_db] = 1e20; dbpre(f[radek_db],radek_db,dbcol("ohniskova vzdalenost")); break; case DB_ESCAPING: case DB_CLOSING: default: break; } }