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
(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
ver..
Para usar é simples:;|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)
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)
(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
genial!!
ResponderExcluironde o "gll.dcl" é salvo? se é que é salvo...
como funciona esse teu if: (if maxl maxl 15)??
veja a saida desta linha:
ResponderExcluir(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