Obslužná funkce dialogového boxu

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.

Vlastní kód funkce:

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