| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Оформить диалоговое окно

Оформить диалоговое окно

Ответ
Поиск в этой теме
Непрочитано 17.06.2019, 07:03 #1
Оформить диалоговое окно
===AAA===
 
г. Норильск
Регистрация: 15.08.2005
Сообщений: 451

Всем добрый день!

Подскажите, плиз, как оформить фрагмент DCL-файла,
рисующего такой вот диалог:

(о) Радиокнопка 1
(о) Радиокнопка 2
(о) Радиокнопка 3
__[x] Параметр для радиокнопок 1...3
(о) Радиокнопка 4
(о) Радиокнопка 5
__[Текстовое поле для кнопки 5]

Т.е. нужно, чтобы:

а) Переключатель "параметр" не разбивал бы ряд радиокнопок
на группы 1...3 и 4...5 (т.е. можно было бы выбрать только
одну из кнопок 1...5).
б) [Параметр] и [Текстовое поле] были бы зрительно сдвинуты
чуть-чуть вправо (здесь это условно изображено символами
"__", т.к. форум удаляет лишние пробелы).

Конечно, нужно будет ещё оформить "недоступность параметра
и поля" при выборе "не тех" радиокнопок, но с этим попытаюсь
справиться сам.
__________________
Счастливо, Алексей!
Просмотров: 3178
 
Непрочитано 17.06.2019, 08:07
1 | #2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Само по себе окно проблем-то не вызовет. Проблема будет в обработчике...
Код:
[Выделить все]
 dlg:dialog{label="label";
	:column{label=" ";
		:radio_button{key="opt1";label="Radio 1";}
		:radio_button{key="opt2";label="Radio 2";}
		:radio_button{key="opt3";label="Radio 3";}
		:row{
			spacer_1;
			:toggle{key="chk1";label="Param for 1..3";}
			}
		}
	:column{label=" ";
		:radio_button{key="opt4";label="Radio 4";}
		:radio_button{key="opt5";label="Radio 5";}
		:row{
			spacer_1;
			:edit_box{key="txt5";label="Param for 1..3";}
			}
		}
	ok_cancel;
	}
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.06.2019, 08:39
#3
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


К сожалению, этот код всё же "разрывает" радиокнопки на две группы.

Т.е. одновременно можно выбрать и "Radio 1" и "Radio 5".

:-(
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 17.06.2019, 08:49
1 | #4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Я тебе говорю - нужен доп.обработчик для этого дела.

----- добавлено через ~11 мин. -----
Код:
[Выделить все]
 (defun t1 (/ file handle callback dcl_lst dcl_id)
  (defun callback (key value ref-list)
    (cond ((wcmatch key "opt#")
           (foreach item '("opt1" "opt2" "opt3" "opt4" "opt5") (set_tile item "0"))
           (set_tile key "1")
           (set ref-list
                (if (cdr (assoc "opt" (eval ref-list)))
                  (subst (cons "opt" (atoi (substr key 4))) (assoc "opt" (eval ref-list)) (eval ref-list))
                  (cons (cons "opt" (atoi (substr key 4))) (eval ref-list))
                  ) ;_ end of if
                ) ;_ end of set
           )
          ((= key "chk1")
           (if (= value "0")
             (progn (foreach item '("opt1" "opt2" "opt3") (mode_tile item 0))
                    (foreach item '("opt4" "opt5") (mode_tile item 1))
                    ) ;_ end of progn
             (progn (foreach item '("opt1" "opt2" "opt3") (mode_tile item 1))
                    (foreach item '("opt4" "opt5") (mode_tile item 0))
                    ) ;_ end of progn
             ) ;_ end of if
           )
          ) ;_ end of cond
    ) ;_ end of defun
  (setq file   (strcat (getenv "temp") "\\dlg.dcl")
        handle (open file "w")
        ) ;_ end of setq
  (foreach item '("dlg:dialog{label=\"label\";"                 ":column{label=\" \";"                        "	:radio_button{key=\"opt1\";label=\"Radio 1\";}"
                  "	:radio_button{key=\"opt2\";label=\"Radio 2\";}"                                       "	:radio_button{key=\"opt3\";label=\"Radio 3\";}"
                  "	:row{"                                  "		spacer_1;"                    "		:toggle{key=\"chk1\";label=\"Param for 1..3\";}"
                  "		}"                              "	}"                                    ":column{label=\" \";"
                  "	:radio_button{key=\"opt4\";label=\"Radio 4\";}"                                       "	:radio_button{key=\"opt5\";label=\"Radio 5\";}"
                  "	:row{"                                  "		spacer_1;"                    "		:edit_box{key=\"txt5\";label=\"Param for 1..3\";}"
                  "		}"                              "	}"                                    "ok_cancel;"
                  "}"
                  )
    (write-line item handle)
    ) ;_ end of foreach
  (close handle)
  (setq dcl_id (load_dialog file))
  (new_dialog "dlg" dcl_id "(callback $key $value 'dcl_lst)")
  (set_tile "chk1" "0")
  (callback "chk1" "0" 'dcl_lst)
  (action_tile "accept" "(done_dialog 1)")
  (action_tile "cancel" "(done_dialog 0)")
  (setq dcl_res (start_dialog))
  (unload_dialog dcl_id)
  (if (= dcl_res 1)
    (alert "ok")
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.06.2019, 09:29
#5
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


Добрый день!

Отловить функцией callback "key" для "переключателя" получается, а вот для "радиокнопки" почему-то нет. :-(

Можно на этом же примерчике показать, как сделать, чтобы при выборе радиокнопок 2 и 3 поле "Параметр"
(переключатель) становилось недоступным, а поле для ввода текстов было доступно при выборе единственной
радиокнопки (ну, например, 5-й) ?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 19.06.2019, 09:54
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Ну так внутри
(wcmatch key "opt#")
прописывай различные дополнительные варианты, в чем проблема?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.06.2019, 10:00
#7
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


Проблема в том, что не ловит "радиокнопки".
"Переключатели" - без проблем, а вот радиокнопки - не хочет.
Даже калбек при щелчкам по ним не вызывается.

----- добавлено через ~43 мин. -----
Пробовал какой-нибудь

action =

Типа,

: radio_button { label = "Метка 1";
alignment = left;
key = "Выбор-1";action="(setq a 123)";
}

в DCL-файле на radio_button прицепить - так он тоже не отрабатывает.
Причём от слова "совсем" - даже (setq a 123) не присваивается...

----- добавлено через ~2 ч. -----
Разобрался.

Оказывается, это radio_column всю картину портил.

Кто бы мог подумать...
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 19.06.2019, 19:11
#8
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


===AAA===, ты вообще в моем коде radio_column видел?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 20.06.2019, 16:45
#9
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


Нет, конечно. :-)

Я просто стал применять идею обработчика к своему
более "навороченному" окну и вот там-то и натолкнулся
на этот подводный камень, ибо у меня как раз и был
использован radio_column.

А здесь написал на случай - если оно вдруг кому-нибудь
пригодится, дабы не наступали на грабли.

Как-то так...
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 20.06.2019, 17:17
#10
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Вообще-то это было предсказуемо: radio_column, radio_row в свою группу захватывают вписанные radio_button и контролируют их поведение.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.06.2019, 15:49
#11
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


Добрый день!

А как сделать так, чтобы после всяких щелчков мышью
по "радиокнопкам" и "переключателям" при входе в поле
для ввода строки снова перебросить "фокус" на нужную
кнопку закрытия окна?

Вот скажем, есть у меня в окне поле

: text {label = "Имя файла:";}
: edit_box{key="name_file";}

И кнопка

: button {
label = "Текущий";
key = "Current_File";
}

В описании окна я устанавливаю

initial_focus = "Current_File";

всё красиво, кнопка подсвечена, Enter работает,
но потом-то этот фокус с кнопки сбивается :-(

А хотелось бы, чтобы окно можно было закрывать
нажатием Enter после ввода данных в текстовое
поле (благо оно там одно).

Т.е. "зафиксировать" подсветку на этой кнопке.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 21.06.2019, 17:14
1 | #12
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Изучай mode_tile .
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 24.06.2019, 08:52
#13
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


Добрый день!

Что-то не получается...

Добавил в (callback)

(mode_tile "Current_File" 2)

Щелкаю по "радиокнопкам", фокус возвращается
на эту кнопку "Текущий", всё хорошо, но
самое-то главное не срабатывает. :-(

а) При вхождении в поле ввода текста кнопка
"Текущий" не подсвечивается
б) При нажатии Enter завершение работы с текстовым
полем не происходит.

Может быть, это из-за того, что у меня в DCL-файле
нет "классической"

ok_cancel;

(так она мне и не нужна), а есть только:

: row {
alignment = centered;
fixed_width = true;
: button {
label = "Текущий";
key = "Current_File";
}
: button {
label = "Выбрать";
key = "Select_File";
}
: button {
label = "Отмена";
key = "but_cancel";
is_cancel = true;
} // CANCEL
}// row кнопок

Если из-за этого, то решение есть?
Или для поля

: edit_box{key="name_file";}

ещё какой-нибудь атрибут "завершить по Enter" нужен ?

----- добавлено через ~38 мин. -----
Вопрос

а) При вхождении в поле ввода текста кнопка
"Текущий" не подсвечивается

решается добавлением is_default = true;
в кнопку "Текущий"

: button {
label = "Текущий";
key = "Current_File";
is_default = true;
}

(тогда и mode_tile = 2 в калбек добавлять не нужно),
но вот с вопросом

б) При нажатии Enter завершение работы с текстовым
полем не происходит.

- пока непонятка...
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 24.06.2019, 09:31
1 | #14
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


См. is_default. По-моему, для кнопок срабатывает.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 24.06.2019, 09:46
#15
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


Да, "пол-дела" оно делает.
Остался вопрос "б".
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 24.06.2019, 10:36
#16
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


проверить $reason для ассоциированого действия для edit_box. если ==1, то нажат <Enter>. завершить диалог и передать управление на обработку события.
koMon вне форума  
 
Непрочитано 24.06.2019, 11:07
1 | #17
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


allow_accept
Vov.Ka вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Оформить диалоговое окно

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как дополнить код программы, чтобы данные вводились через диалоговое окно? RomeO LISP 18 15.04.2017 09:00
Как восстоновить диалоговое окно "Генератор валов" в AutoCad Mechanikal-е? Армен Грачикович Вертикальные решения на базе AutoCAD 2 11.03.2013 13:49
Autocad 2012. Почему макрос подавляет диалоговое окно? vovkaf Программирование 24 10.09.2012 18:10
Как сделать диалоговое окно, описанное в DCL файле и вызванное Lisp программой, немодальным? E-degtyarev LISP 9 28.05.2010 09:10