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 em “get-lst-elmts”

  1. 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 SettingsusuarioConfigurações locaisTempxxxgll.dcl

Deixe um comentário

Carrinho de compras
Scroll to Top