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)
)