Тема: Cancel в DCL - проблемка.

На DCL написал диалоговое окно.
Сначала поставил там ok_cancel.
В процессе работы выяснилось, что в этом диалоге cancel используется чрезвычайно редко.
Чтоб не перегружать диалог убрал ok_cancel и поставил ok_button.
Все работает, но теперь из этого диалога можно выйти только по кнопке Ok с выполнением дальнейших действий. Выйти же без изменений не удается ни по крестику в правом верхнем углу окна ни нажав клавишу Esc!
Кто что подскажет?

Re: Cancel в DCL - проблемка.

Ну если уж не хотите вводить cancel(а зря)
Тогда уж остается только
проанализировать введенные в диалоге данные
в action_tile "accept" и в случае их несоответствия
выйти из программы не выполняя ее.

Re: Cancel в DCL - проблемка.

"Выйти же без изменений" - что имеется в виду? Если что-то сделано программно (назначения action_tile), то и возвращать надо программно. В любом случае надо анализировать возвращаемое (start_dialog) значение, которое определяет способ выхода из диалога.

Re: Cancel в DCL - проблемка.

> VK
Если нет cancel выйти из диалога можно только по единственной кнопке ОК.Поэтому значение start_dialog
не поможет.
Я понял (без изменений), что здесь имеется ввиду выход без
выполнения программы которая использует данные
диалога.

Re: Cancel в DCL - проблемка.

Действительно не поможет, поторопился. Но если на "accept" вешать команды проверки, то они в любом случае будут выполняться. Значит надо где-то показать, что нужен выход без изменений?

Re: Cancel в DCL - проблемка.

> VK
Ну если допустим.Повесить на accept
(if (get_tile недопустимое значение то setq какая-то переменная
nil.
А после выхода из диалога выполнять программу только если эта
переменная Т.

Re: Cancel в DCL - проблемка.

А можно и не в accept а уже после выхода из диалога.

Re: Cancel в DCL - проблемка.

> Эдуард
Вот и получается, что замена для Cancel - ввод какого-то параметра (недопустимого?). Для отслеживания ошибочных данных пользователя - вариант, хотя и не самый лучший. А как заставить пользователя для отказа от дальнейших действий ввести недопустимое значение, да еще и не куда попало?

Re: Cancel в DCL - проблемка.

Но если юзер введ ДОПУСТИМОЕ значение, а потом вообще передумал что-либо делать дальше? То что? Вводить НЕдопустимое значение?
Что-то больно лохмато получается!

Re: Cancel в DCL - проблемка.

> VK

> Pilot
Приходим к тому что кнопка Cancel необходима.
А места она занимает немного.
А если введено допустимое значение тогда что, после диалога вводить
1запрос- Продолжить<Да\нет>?
И второй - А вы точно уверены продолжать?
Что-то я никогда не видел программ без кнопки Сancel.

Re: Cancel в DCL - проблемка.

2 Эдуард
Без cansel? Пожалуйста: Окно где представлена какая-либо справочная инфа, а внизу - только Ok. Правда, это уже не программа.
2 All
Но в принципе я имел ввиду несколько иное:
Пусть кнопки cancel в диал. окне нет, но она косвенно присутствует в виде крестика в правом верхнем углу окна (при наличии крестика теоретически кнопка cancel вообще не нужна).
Так почему этот крестик не хочет работать? И клавиша Esc (на клаве) тоже не срабатывает.

Re: Cancel в DCL - проблемка.

Вот пример нижней части моего диалога. Срабатывает по Cancel и Esc.
  : row {
    : spacer { width = 1; }
    : button {
      label = "Да";
      is_accept = true;
      key = "accept";
      width = 8;
      fixed_width = true;
    }
    : button {
      label = "Отмена";
      is_cancel = true;
      key = "cancel";
      width = 8;
      fixed_width = true;
    }
    : button {
      label = "Помощь";
      key = "help";
      width = 8;
      fixed_width = true;
    }

Re: Cancel в DCL - проблемка.

> ABoltrushko
label = "Отмена";
is_cancel = true;
key = "cancel";
Это и есть кнопка cancel только по другому обозванная.
А народ хочет без нее, только крестиком выходить с
единственной кнопкой (ОК) в диалоге.

Re: Cancel в DCL - проблемка.

Не пробовал, но:
1. Если свойство is_cancel = true; присвоить диалогу, а не элементу?
2. Есть же действия для прочих элементов, у которых нету ACTION_TILE.
(new_dialog <dlgname> <dcl_id> [<action-expression> <screen-pt>])
<action-expression> - действие, аналогичное ACTION_TILE.
Может в нем сработает!!

Re: Cancel в DCL - проблемка.

> Эдуард
>А народ хочет без нее, только крестиком выходить
А Вы точно знаете, чего "народ хочет"? И уверены, что правильно понимаете это желание? Не всякому хотению надо потакать.
Диалоги, закрывающиеся только по "крестику", дурной тон - безотносительно к DCL. Может быть и одна кнопка типа ОК, но только если действие однозначное, типа "принял к сведению", как в alert. Если же закрытие по OK дает один результат, а по крестику или ESC другой, то ДОЛЖНА быть и вторая кнопка.
У нее должно быть правильное название, соответствующее действию. Если название ОТМЕНА, то должно что-то отменяться, например все, что введено в диалоге, но еще не применено. Если отменить уже невозможно, то кнопка должна остаться, но быть недоступной.
Рекомендую всем почитать материалы по "юзабилити". Очень полезно.

Re: Cancel в DCL - проблемка.

> ShaggyDoc
Да я точно знаю , что хочет народ обсуждающий эту тему
и правильно понимаю его желание - узнать почему из диалога имеющего одну кнопку нельзя выйти по esc и крестику.
Я прекрасно знаю , что это дурной тон , что этого делать нельзя и никогда не делаю.
Однако вопрос заинтересовал -как это можно сделать.
А Вы вместо ответа отправляете всех литературу читать.

Re: Cancel в DCL - проблемка.

2 ShaggyDoc
Еще раз, специально для уважаемого оппонента:
Да, хочу иметь в диалоге только кнопку Ok. Да, хочу выходить без изменений или "по крестику" или по клавише Esc. Еще раз объясняю почему: Потому что ВЫХОД БЕЗ ИЗМЕНЕНИЙ бывает в данном диалоге ОЧЕНЬ РЕДКО и я не хочу загромождать диалог также ОЧЕНЬ РЕДКО используемой кнопкой Cancel.
Насчет "дурного тона": Огромное количество существующих приложений написано по правилам "хорошего тона" и имеют при этом корявый неудобный интерфейс. За примерами далеко ходить не нужно. А все потому что зачастую интерфейс-программисты руководствуются этими пресловутыми правилами без учета реальных потребностей пользователей. Я же, без ложной скромности могу сказать, что стараюсь до предела оттачивать интерфейс моих прог, и нередко нахожу нестандартные, но удобные решения. А то что мои проги удобны - это не мои слова, а слова тех кто ими пользуется.
Звиняй если задел за живое :).
2 All
Насчет прерывания диалога "крестиком" я был не совсем прав. Это в виндах крестик имеется (даже если и не пашет), а DCL-диалоги в Асаd-12-DOS этих крестиков, насколько помню, не имели.
Но клавиша Esc (или в старом Акаде Ctrl+C) есть всегда.

Re: Cancel в DCL - проблемка.

организовать такой (и "крестиком" и "Esc") выход при наличии только одной кнопки "OK" - не проблема, только вот различить способ закрытия диалога не получится..., надо оно?
что же касается наездов на ShaggyDoc, так всё мимо - прав он (в данной ситуации, абсолютно), а господа "наездники" не правы (не IMHO - факт)
фразы, типа >Огромное количество существующих приложений написано по правилам "хорошего тона" и имеют при этом корявый неудобный интерфейс.<, говорят лишь о бесконечной глубине непонимания этих правил

Re: Cancel в DCL - проблемка.

2 casual goer
Ну-ну...

Re: Cancel в DCL - проблемка.

Переименуйте "Ok" в "Закрыть окно" и пусть юзер сам думает, что это значит :)

Re: Cancel в DCL - проблемка.

Ну, если это кому еще интересно: под прессингом сторонников правильного образа жизни я восстановил cancel в виде отдельной кнопки cancel_button, загнав ее в нижний угол диалога, чтоб не мешалась.

Re: Cancel в DCL - проблемка.

> Pilot
Вообще-то было бы интересно взглянуть на диалог, который можно "перегрузить" кнопкой Cancel. В принципе можно же сделать наоборот - с одной кнопкой Cancel - и будет вполне рабочий диалог.

Re: Cancel в DCL - проблемка.

2 leha
Диалог в стиле минимализма: Резиновый список (автоматически изменяется его высота и ширина в зависимости от количества и длины строк), под ним - edit_box, а внизу три кнопки - Ok, кнопка сортировки списка, Cancel. Вот и все.

Re: Cancel в DCL - проблемка.

> Pilot
Ну и правильно сделал, что вернул Cancel.

Re: Cancel в DCL - проблемка.

В свою защиту:
В небезызвестной утилитке WinKey ее диалог имеет список, кнопки Add, Remove, Properties и никакого Cancel - вместо него крестик в правом верхнем углу окна. Правда, оттуда можно выйти еще и чарез меню.