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)))”))))
;pegue a lista de elmers do desenho em ordem alfabetica:
(get-lst-elmts tit (vl-sort (get-tableof “layers”) ‘<) lst maxl))
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 filenamedcl 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
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
genial!!
onde o “gll.dcl” é salvo? se é que é salvo…
como funciona esse teu if: (if maxl maxl 15)??