Pomoc pro ztracené programátory - vytvoření funkce s dialogovým oknem

Vytvoření dialogového okna

Při tvorbě uživatelského rozhraní využívejte maximálně obrázku výsledného dialogového okna. Všímejte si hlavně hierarchického uspořádání jednotlivých prvků. Uspořádání vám pomůže při vlastní tvorbě dialogu.

Návod pro tvorbu jednotlivých částí aplikace

Aby byl kód funkce co nejefektivnější, rozdělíme aplikaci na tři funkce:

Další doporučení:

Vysvětlený kód funkce

Pro uživatele, kteří zabloudili při tvorbě kódu uvádíme jednotlivé ucelené části kódu. Pokud si nebudete jisti funkcí některého příkazu, stačí kliknout nad příkazem a zobrazí se Vám referenční příručka se zobrazeným příkazem.

Kód dialogového okna

  zoom:dialog {              // jméno nového dialogového boxu
    label = "Změna měřítka";
            // název vypsaný na otevřeném dialogu otevřeného dialogu
    :boxed_row {
            // uspořádání prvků do orámovaného řádku
      label = "Zadání hodnoty";
            // název orámované části vypsaný v dialogu
      :boxed_column {
            // uspořádání prvku do orámovaného sloupce 
        label = "Slider";
            // název orámované části vypsaný v dialogu
        :slider {
            // definice vlastností dialogového prvku SLIDER
          key = "slider";
            // klíč sloužící k identifikaci dialogového prvku při
            // programovém zpracování v AutoLISPu nebo ADSRX
          min_value = 1;
            // min. hodnota jezdce
          max_value = 10;
            // max. hodnota jezdce
        }
      }
      :boxed_column {
            // uspořádání prvku do orámovaného sloupce 
        label = "Edit box";
            // název orámované části vypsaný v dialogu
        :edit_box {
            // definice vlastností dialogového prvku edit_box
          key = "editbox";
            // klíč sloužící k identifikaci dialogového prvku při
            // programovém zpracování v AutoLISPu nebo ADSRX
        }
      }
    }
    :boxed_radio_column {
            // orámovaná skupina radio_tlačítek
      key = "vyber";
            // klíč sloužící k identifikaci dialogového prvku
            // při programovém zpracování v AutoLISPu nebo ADSRX
      label = "Volba typu";
            // název skupiny radio_tlačítek vypsaný v dialogu
      :radio_button {
            // definice vlastností dialogového prvku radio_button
        key = "zvetseni";
            // klíč sloužící k identifikaci dialogového prvku při
            // programovém zpracování v AutoLISPu nebo ADSRX
        label = "Zvětšení";
            // název radio_tlačítka vypsaný v dialogu
      }
      :radio_button {
            // definice vlastností dialogového prvku radio_button
        key = "zmenseni";
            // klíč sloužící k identifikaci dialogového prvku při
            // programovém zpracování v AutoLISPu nebo ADSRX
        label = "Zmenšení";
            // název radio_tlačítka vypsaný v dialogu
      }
    }
    ok_cancel;
       // předdefinovaný dialogový prvek, zde tlačítka OK a CANCEL
  }

Kód funkce c:meritko()

  (defun c:meritko ()
            ;;; definice nové funkce meritko
    (setq id (load_dialog "d:/meritko.dcl"))
            ;;; předání jména dialogového boxu
    (if (not (new_dialog "zoom" id))
      (exit)
    )
            ;;; v případě nesouhlasného jména dialogového
            ;;; panelu (v našem případě zoom - jméno na začátku
            ;;; souboru.dcl) ukončí činnost
    (setq hodn 1)
            ;;; nastavení pomocné proměnné - hodnota zvěšení
    (set_tile "vyber" "zvetseni")
            ;;; nastavení radiotlačítka "zvetseni" ze skupiny
            ;;; "vyber" na aktivní = zvýrazněné
    (action_tile "slider" "(slider_action $value $reason)")
            ;;; získání hodnoty při aktivaci dialogového prvku
            ;;; "slider" a zavolání funkce slider_action 
            ;;; s parametry hodnota a důvod
    (action_tile "editbox" "(ebox_action $value $reason)")
            ;;; získání hodnoty při aktivaci dialogového prvku 
            ;;; "editbox" a zavolání funkce ebox_action
            ;;; s parametry hodnota a důvod
    (action_tile "zvetseni" "(setq radio 0)")
            ;;; při zmáčknutí radio_tlačítka "zvetseni" 
            ;;; se nastaví proměnná radio na 0
    (action_tile "zmenseni" "(setq radio 1)")
            ;;; při zmáčknutí radio_tlačítka "zmenseni" se 
            ;;; nastaví proměnná radio na 1
    (action_tile "accept"
      "(progn 
        (done_dialog)
        (setq ok 1)
      )"
    )    ;;; při aktivaci tlačítka "accept" = OK se ukončí dial. box
         ;;; a nastaví se pomocná proměnná signalizující, že dial. box
         ;;; byl ukončen tlačítkem OK = potvrzení změn
    (action_tile "cancel"
      "(progn 
        (term_dialog) 
        (setq ok 0)
      )"
    )    ;;; při aktivaci tlačítka "cancel" = ZRUS se ukončí
         ;;; dial. box a nastaví se pomocná proměnná signalizující,
         ;;; že dialogový box byl zrušen = nepotvrdit změny
    (start_dialog)
            ;;; 		zahájen dialogu
    (unload_dialog id)
            ;;; odstranění dialogu
            ;;; zpracování/nezpracování hodnot získaných z dial. boxu
    (if (= ok 1)
            ;;; dialog ukončen OK:
      (progn
        (if (= radio 0)
            ;;; rozhodnutí zda zvětšovat/zmenšovat podle hodnoty
            ;;; radio_tlačítek
          (command "zoom" "_S" hodn)
            ;;; zvětšení
          (progn
            (setq hodn (/ 1.0 hodn))
            (command "zoom" "_S" hodn)
            ;;; zmenšení
          )
        )
      )
            ;;; 	CANCEL:
      (setq ok 0)
            ;;; 	vrácení pomocné proměnné na 0
    )
  )

Při vyvolání akce posuvníku SLIDER je nutné nastavit odpovídající hodnotu v prvku EDIT_BOX. Toto nastavení vám umožní funkce slider_action:

  (defun slider_action (val why)
            ;;; funkce, která v případě aktivace slideru nastaví
            ;;; odpovídající hodnotu v edit_boxu
    (if (or (= why 2) (= why 1))
            ;;; v případě splněných podmínek nastav edit_box,
            ;;; 1 = zmáčknutí entru, 2 = selekce z edit_boxu
      (progn
        (set_tile "editbox" val)
            ;;; 	nastavení hodnoty v edit_boxu
        (setq hodn (atoi val))
            ;;; nastavení pomocné proměnné hodnota zvětšení z proměnné
            ;;; val pomocí konverze_string -> integer
      )
    )
  )

Při vyvolání akce textového pole EDIT_BOXu je nutné nastavit odpovídající hodnotu v prvku SLIDER. Toto nastavení Vám umožní funkce ebox_action:

  (defun ebox_action (val why)
      ;;; funkce, která v případě aktivace edit_boxu nastaví
      ;;; odpovídající hodnotu na slideru
    (setq hodn (atoi val))
      ;;; nastavení pomocné proměnné  hodnota zvětšení z proměnné
      ;;; val pomocí konverze_string -> integer
    (if (> hodn 10)
      ;;; v případě, že je hodnota zvětšení/zmenšení větší než 10 
      ;;; (max. hodnota slideru), pak nastav zvětšení/zmenšení na 10
      (progn
        (setq val "10")
        (set_tile "editbox" val)
      )
    )
    (if (or (= why 2) (= why 1))
            ;;; v případě splněných podmínek nastav slider 
            ;;; 1 = zmáčknutí entru, 2 = selekce z edit_boxu
      (set_tile "slider" val)
    )
  ) 

Zdrojové kódy