Тема: Что писать в initget

Считаю, что вариант

(initget "Да Нет Yes No _ Y N Y N") 
(setq will_draw (getkword "\nБудем рисовать [Да/Нет] <Да>? : ")) 

не совсем идеологически выдержан.
Раз запрос идет на русском, то и ответ пользователя должен быть на русском. Собственно, опциями Да/Нет мы его к этому и побуждаем. Т.е. пользователь должен давить клавиши на которых присутствует русская "Д" или "Н" и хорошо, если при этом ему не нужно заботиться о текущей раскладке клавиатуры.
Более того, то что "Да" - это "Yes" может пользователь и знает, но в общем случае английский эквивалент русских опций ему в принципе неведом. А потому, в данном случае, правильным для приложения с русским интерфейсом считаю следующее инвариантное к текущей раскладке клавиатуры написание:

(initget "Да Нет Lf Ytn _ Y N Y N") 
(setq will_draw (getkword "\nБудем рисовать [Да/Нет] <Да>? : ")) 

А для приложения с английским интерфейсом соответственно:

(initget "Yes No Нуы Тщ _ Y N Y N") 
(setq will_draw (getkword "\nContinue [Yes/No] <Yes>? : ")) 

Могу ошибаться.

Re: Что писать в initget

Пастух пишет:

Могу ошибаться.

Это мне нравится!

Re: Что писать в initget

Пастух пишет:

если при этом ему не нужно заботиться о текущей раскладке клавиатуры.

А программу такую возможно написать? типа punto switcher для AutoCAD?

(изменено: VovKa, 4 апреля 2009г. 21:53:58)

Re: Что писать в initget

увидев запрос

"Будем рисовать [Да/Нет] <Да>? : "

я бы никогда не догадался, что можно ответить "Ytn" :)

Re: Что писать в initget

VovKa пишет:

я бы никогда не догадался, что можно ответить "Ytn"

"Ytn" - это то, что получит компьютер, если вы наберете "Нет", но раскладка при этом будет EN.
В том-то и дело, что вы всегда набираете "Нет" (или "Н", или "Не") и не обращаете внимание на текущую раскладку клавиатуры.

Re: Что писать в initget

Пастух,
весь подвох в том, что латинская "Y" и кириллическая "Н" - это одна и та же клавиша на клавиатуре. если пользователь ответил только одной буквой, то как догадаться, что он имел ввиду?
еще хуже обстоят дела с украинским языком и запросом "Так/Ні". в этом случае имеем уже две клавиши с противоположными ответами Y(лат)/Н(кир) и N(лат)/Т(кир)

Re: Что писать в initget

VovKa пишет:

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

Догадываться не потребуется. Функция (initget "Да Нет Lf Ytn _ Y N Y N") однозначно определяет (см. символы, стоящие после знака подчеркивания), что именно будет возвращено при вводе опций. В данном случае для "Д" или "Да" возвращается "Y", для "Нет", "Не" или "Н" - возвращается "N". Для "Lf" или "L" - возвращает "Y" и, наконец, для "Ytn", "Yt" или "Y" возвращает "N". Анализируя возврат, скажем функции getkword, вы проверяете его на соответствие "Y" или "N". Вы можете заменить названия опций перед знаком подчеркивания, например (initget "Yes No Нуы Тщ _ Y N Y N") и соответственно в тексте запроса и тем самым получить запрос на требуемом языке, но при этом не нужно менять то, что стоит после знака подчеркивания и соответственно вносить изменения в анализ ввода пользователя.

VovKa пишет:

еще хуже обстоят дела с украинским языком

Дела обстоят точно так же, как и с любым другим языком.
Если хотите иметь интерфейс на украинском, то пишите (initget "Т Н _ Y N").
Если при этом хотите, чтобы пользователь мог набирать Т или Н не глядя на текущую раскладку, то пишите (initget "Т Н N Y _ Y N Y N").

Re: Что писать в initget

Пастух, это все понятно, но вот как заставить пользователя не смотреть на монитор?
например, на запрос "Будем рисовать [Да/Нет] <Да>? : " мне нужно ответить "Н", а раскладка стоит английская, я нажимаю клавишу и вижу на мониторе букву "Y". любой человек знающий слово "Yes" испугается, и, от греха подальше, переключится на русскую раскладку и наберет букву "Н".

Re: Что писать в initget

Если испугается, то переключит раскладку и у него всё получится.
Если не испугается, то у него так же всё получится.
Это бонус для непугливых. :)
Я ведь не утверждаю, что так надо всегда делать. Я лишь усомнился в том, что размещать в initget варианты перевода опций (что часто мелькает в текстах здесь на форуме) и при этом не размещать их в тексте запроса имеет великий смысл. Повторюсь, кроме двух самых простых случаев с "Да" и "Нет", русскоязычный пользователь может понятия не иметь, как по английски выглядит написание той или иной опции. Потому правильным будет или вообще английские эквиваленты не вносить в список initget, или же использовать предложенную схему и предоставить пользователю приятную возможность не думать о раскладке при вводе опций. Более того, ничто ведь не мешает проинформировать пользователя приложения и в документации прямо указать, что он может при вводе опций ком.строки "давить" на клавиши с указанными русскими буквами и не беспокоиться о переключении RU|EN.

Re: Что писать в initget

А как сделать (написать), чтобы то, что написано в

(getkword "\nБудем рисовать [Да/Нет] <Да>? : "))

правильно работало в контекстном меню команды. А то отображается всё красиво, а когда выбираешь пункт мышью, то в командную строку попадает совсем не то, что хотел :(

Re: Что писать в initget

1) Что именно попадает в командную строку?
2) Какая версия AutoCAD?

Re: Что писать в initget

Александр Ривилис пишет:

1) Что именно попадает в командную строку?
2) Какая версия AutoCAD?

Версия 2002, при выборе в контекстном меню строки "Нет", в командную строку попадает "т" :o

(изменено: Alan aka Александр Назаров, 2 мая 2009г. 12:43:20)

Re: Что писать в initget

Андрей Скулачёв пишет:

Версия 2002, при выборе в контекстном меню строки "Нет", в командную строку попадает "т"

С версии надо было и начинать!!!
В 2002 большие проблемы с командной строкой. Писал, вот тут:
http://www.arcada.com.ua/forum/viewtopic.php?t=1145
Андрей, исследование можете продолжить в той теме...
P.S. У меня правда есть стойкое ощущение, что при работе с контекстным меню в Акаде 2002 необходимо учитывать также движение айсбергов в Северном Ледовитом океане.
P.P.S. >Андрей Скулачёв, добавил в той теме своё решение Вашей/нашей проблемы.

(изменено: Владимир Азарко, 2 мая 2009г. 20:57:13)

Re: Что писать в initget

Alan aka Александр Назаров,
Андрей Скулачёв,
Еще один вариант решения
https://www.caduser.ru/forum/post163686.html#p163686

Re: Что писать в initget

Владимир Азарко,
Большое спасибо, нужная информация и главное, всё работает :D