Funkce kr:dialog() umožňuje zobrazení dialogového boxu, nastavuje / získává hodnoty dialogového boxu. Při ukončení funkce je vrácena hodnota T - v případě, že dialog byl ukončen tlačítkem OK a uživatel si přeje vykreslit obrazec. V případě, že je dialog stornován je vrácena hodnota nil a obrazec není vykreslen.
Hlavní části funkce:
Na začátku funkce kr:dialog() musíme nejprve načíst dialogový box a předat jméno načteného dialogového boxu k uložení do proměnné id pro další použití. Dále musíme nastavit pomocnou proměnnou co_delat, abychom mohli schovat dialogový box při zadávání středu obrazce. Inicializační hodnota proměnné je 2 (znamená vstup do smyčky spravující dialogový box). Pro zapamatování nastavení prvků dialogu použijeme připravený asociační seznam uložený v proměnné gl_pam_hodnoty.
Po úspěšném načtení dialogu ze souboru .dcl a vstoupení do smyčky while musíme zkontrolovat jestli soubor obsahuje požadovaný dialog. Neobsahuje-li soubor požadovaný dialog ukončíme činnost funkce kr:dialog() i nadřazené funkce reaktorKruh() a zobrazí se chybová zpráva.
Proběhli-li všechny uvedené testy dialogu v pořádku, předají se hodnoty z asociačního seznamu obsahující nastavení dialogových prvků gl_pom_hodnoty jednotlivým prvkům dialogového boxu. Předání se uskuteční pomocí příkazu set_tile ... .
Obrácený postup - získání hodnoty z dialogového prvku se uskuteční pomocí funkce action_tile. Příkaz action_tile se aktivuje při uživatelově interakci s dialogovým prvkem. Funkce action_tile předá hodnotu, na kterou byl dialogový prvek nastaven a kód určující jaká akce uživatele vyvolala akci dialogového prvku. Tyto dvě hodnoty jsou předány zpracující_funkci, která vyhodnotí akci.
Na závěr funkce kr:dialog() je zavolán příkaz unload_dialog, který odstraní dialog z paměti. Proměnná vysledek je volána na konci funkce jako návratová hodnota funkce kr:dialog(). Je-li hodnota vysledek = T znamená to, že zadání hodnot pomocí dialogu proběhla OK. Je-li vysledek = nil, znamená to, že zadání hodnot pomocí dialogu neproběhlo v pořádku. V tomto případu nebude nic vykresleno.
(defun kr:dialog (/ id co_delat vysledek) (setq id (load_dialog "d:/dialogKruh.dcl")) ;;; předání jména dialogového boxu (setq co_delat 2) (while (>= co_delat 2) ;;; opakuj pokud nenastane zmena (if (not (new_dialog "dialogKruh" id)) ;;; není-li jméno dialogu dialogKruh tak skonči (exit) ) ;;; nastavení hodnot dialogových prvků: (set_tile "polomerke" (cdr (assoc "polomerke" gl_pam_hodnoty))) (set_tile "polomerks" (cdr (assoc "polomerks" gl_pam_hodnoty))) (set_tile "vzdalenostke" (cdr (assoc "vzdalenostke" gl_pam_hodnoty))) (set_tile "vzdalenostks" (cdr (assoc "vzdalenostks" gl_pam_hodnoty))) (set_tile "stredkex" (cdr (assoc "stredkex" gl_pam_hodnoty))) (set_tile "stredkey" (cdr (assoc "stredkey" gl_pam_hodnoty))) (set_tile "stredkez" (cdr (assoc "stredkez" gl_pam_hodnoty))) (action_tile "polomerks" "(so:vazba_prvku $value $reason \"polomerke\" \"polomerks\")" ) (action_tile "vzdalenostks" "(so:vazba_prvku $value $reason \"vzdalenostke\" \"vzdalenostks\")" ) ;;; je-li změněn některý posuvník "slider.." zavolej so:vazba_prvků (action_tile "stredkex" "(setq gl_pam_hodnoty (subst (cons \"stredkex\" $value) (assoc \"stredkex\" gl_pam_hodnoty) gl_pam_hodnoty ) )" ) (action_tile "stredkey" "(setq gl_pam_hodnoty (subst (cons \"stredkey\" $value) (assoc \"stredkey\" gl_pam_hodnoty) gl_pam_hodnoty ) )" ) (action_tile "stredkez" "(setq gl_pam_hodnoty (subst (cons \"stredkez\" $value) (assoc \"stredkez\" gl_pam_hodnoty) gl_pam_hodnoty ) )" ) ;;; je-li změněn některý editbox středu kružnice nastav hodnoty (action_tile "polomerke" "(so:vazba_prvku $value $reason \"polomerke\" \"polomerks\")" ) (action_tile "vzdalenostke" "(so:vazba_prvku $value $reason \"vzdalenostke\" \"vzdalenostks\")" ) ;;; je-li změněn některý editbox zavolej funkci so:vazba_prvku (action_tile "kruz_stred_but" "(done_dialog 4)") ;;; je-li zmáčknuto tlačítko "kruz_stred_but" zavolej ;;; funkci done_dialog s hodnotou 4 (action_tile "accept" "(done_dialog 1)") ;;; je-li zmáčknuto "accept" zavolej done_dialog s hodnotou 1 (action_tile "cancel" "(done_dialog 0)") ;;; je-li zmáčknuto "cancel" zavolej done_dialog s hodnotou 0 (setq co_delat (start_dialog)) ;;; nastaví proměnnou na hodnotu získanou od funkce ;;; start_dialog (hodnota s kterou končí funkce done_dialog) (cond ;;; určení další činnosti ((= co_delat 0) (setq vysledek nil)) ;;; uživatel stornoval dialog = konec funkce ((= co_delat 1) (setq vysledek T)) ;;; uživatel potvrdil dialog, zavolej funkci (vykresli_kruznici) ((= co_delat 4) ;;; uživatel zmáčkl tlačítko pro zadání souřadnic středu (kr:nastav_stred (getpoint "\nVýběr bodu:") ) ) ;;; zavolej funkci nastav_střed ) ) (unload_dialog id) ;;; odstraní dialog id z paměti vysledek ;;; vrácení výsledku funkce (jestli proběhla OK) )