get-lst-elmts

Uma rotina interessante do ponto de vista de como "forçar" algumas coisas em DCLs, neste caso, estou mostrando como usar um slider e algumas toggles para simular uma lista de multipla escolha, onde o número de elementos pode ser maior que o numero de toggles disponíveis
ver..
;|mostra um diálogo para você escolher elmers
  tit  ->  título, string
  maxl ->  numero máximo de linhas a serem mostradas,
           se omitido, assume o valor 15
  lstpresel  ->  lista de strings com os nomes dos elmer que
           devem estar pré selecionados|;
(defun update-lst-listelmts (val / n)
  (
setq n 0
        s val)
  (
repeat (min maxl qtd)
    (
setq elm (nth (+ n (- qtd maxl s)) listelmts)
          n   (1+ n)
          key (itoa n))
    (
set_tile (strcat "tx" key) elm)
    (
set_tile (strcat "tg" key)
              (
if (member elm lstpresel) "1" "0"))
    (
action_tile  (strcat "tg" key)
      (
strcat
        "(setq lstpresel (if (= \"1\" $value) (cons \""
        elm "\" lstpresel) (vl-remove \"" elm "\" lstpresel)))"))))

(
defun get-lst-layer (tit maxl lst)
  ;pegue a lista de elmers do desenho em ordem alfabetica:
  (get-lst-elmts tit (vl-sort (get-tableof "layers") '<) lst maxl))


(
defun get-lst-elmts  (tit listelmts lstpresel maxl / tmp file filename
                       dcl n  qtd elm key
)
;sub-rotina para atualizar a tela do diálogo
  (setq 
;cria um nome de arquivo temporário:
        filename        (vl-filename-mktemp "gll.dcl")
;cria o arquivo e abre ele para edição:
        file            (open filename "w")
        n               0
;se nao foi fornecido o numero de linhas, assume que sejam 15
        maxl            (if maxl maxl 15)
;quantidade de elmers no desenho:
        qtd             (length listelmts))
;inicia a criação do diálogo:
  (write-line
    (strcat "getlstelmer : dialog {width = 50; label = \""
            tit  "\";\n:row { :column {") file)
  ;escreve tantas linhas quanto fornecido pela variavel MAXL:
  (repeat (min maxl qtd)
    (
setq n (1+ n))
    (
write-line
      (strcat ":row { :toggle { key = \"tg" (itoa n)
              "\";} :text{ width=50; key = \"tx"
              (itoa n) "\";}}")
      file))
  ;finaliza a criação do dcl construindo os botões:
  (write-line
    (strcat "}\n"
      (if (> qtd maxl)
        (
strcat
          ":slider { key = \"s\"; min_value = 0;  max_value = "
          (itoa (- qtd maxl)) "; big_increment = "  (itoa maxl)
          "; layout = vertical;}")  "")
"} :row{ :button {key = \"ALL\"; label = \"Tudo\";}
:button {key = \"NEM\"; label = \"Nenhum\";} "
;botão ok:
":button {label = \"Ok\"; key=\"accept\";
is_default=true;}"
;botão cancel:
":button {label = \"Sair\"; key=\"cancel\";
is_cancel=true;}}}"
)
    file)
  ;fecha o arquivo, ele está pronto!
  (close file)
  ;carrega o arquivo DCL na memória do cad:
  (setq dcl (load_dialog filename)
        s   (- qtd maxl)) ;posição do slider...
  ;abre um quadro de diálogo:
  (new_dialog "getlstelmer" dcl)
  ;define as ações de cada elemento do diálogo...
  (action_tile "s" ;slider
    "(update-lst-listelmts (atoi $value))")
  (
action_tile  "ALL"
    "(progn (setq lstpresel listelmts)
         (update-lst-listelmts s))"
);botao todos
  (action_tile  "NEM"
    "(progn (setq lstpresel nil)
        (update-lst-listelmts s))"
);botão nenhum
;marca a posição do slider:
  (set_tile "s" (itoa s))
;atualiza o estados das toggles...:
  (update-lst-listelmts s)
;inicia o diálogo, e salva o resultado
  (setq lstpresel (if (= 1 (start_dialog)) lstpresel))
;descarrega o diálogo
  (unload_dialog dcl)
;apaga o dcl temporário que criamos
  (vl-file-delete filename)
  lstpresel)
Para usar é simples:
(get-lst-elmts
 "título" ;título
 '("1" "2" "3" "4" "5" "6" "7" "8" "9" "10") ;elementos
 '("5" "6");pré-selecionados
 5 ;numero maximo de linhas
)


Retornando a lista do elementos selecionados em caso de clicar OK e NIL em caso de clicar SAIR

2 comentários:

  1. genial!!

    onde o "gll.dcl" é salvo? se é que é salvo...

    como funciona esse teu if: (if maxl maxl 15)??

    ResponderExcluir
  2. veja a saida desta linha:

    (vl-filename-mktemp "gll.dcl")

    ele é salvo ali... so que como é um arquivo dinamico, isto é muda o conteudo as vezes, eu apago ele...

    normalmente fica em:

    C:\Documents and Settings\usuario\Configurações locais\Temp\xxxgll.dcl

    ResponderExcluir