Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить? | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Да, Игорь, но текст был про простое. Вернеее это сложное, что ты написал, но это просто для писателей на фоксе, котрорые не ленятся экспериметировать, и не для спрашевильщиков
Игорь. Твой пост "ниасилил" в смысле я знаю как это сделать но ты умеешь это делать иначе. Как всегда, спс за участие, в работе Британии на нашими ватниками (включая тебя) ) |
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить? | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
DODEFAULT() - это чисто выполнение нативной функции фокса (нативного класса, к которому не подобраться, не отдебагить),
NODEFAULT() - (скобки в фоксе в ф-ии не должны смущать или анти смущать) - это просто временный выклбючатель вызова нативной обработки нажатия клавишт (изображение ее). Вполне возможно , что после ее вызова этот "экран" "автоматически" возвращяется в "можно" (вы же не деоаете просле NODEF операцию "DODEF...", что-то такое ) |
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить? | |
---|---|
akvvohinc Сообщений: 4224 Откуда: Москва Дата регистрации: 11.11.2008 |
В руководстве ее назначение описано несколько иначе: Executes the parent class event or method of the same name from within a subclass.
Не может быть. В описываемой ситуации (форма на основе базового класса) DODEFAULT() не окажет никакого действия, а отработает "автоматический" дефолт - второй символ не появится. Если же форма "классифицирована", то будет выполнен KeyPress "родителя", но не будет никакого "автодефолта" - и вновь никакого второго символа.
Для NODEFAULT неважно, в каком месте метода (в начале, конце, середине, до или после DODEFAULT() ) он написан - главное, чтобы он был выполнен, и тогда "автодефолт" не отработает, а DODEFAULT() все равно будет выполнен. А "ставить рядом" (сопоставлять или противопоставлять) NODEFAULT и DODEFAULT() - ИМХО то же самое, что сравнивать метры с килограммами - NODEFAULT не отменяет то, что выполняет DODEFAULT(). Скорее можно сказать, что любой код, написанный в методе, работает как некий NODEFAULT - то есть отменяет выполнение родительского метода, заменяя его собой, а DODEFAULT() выполняет метод родителя. Поэтому и смысл совместного использования NODEFAULT и DODEFAULT() в одном методе вполне может быть - ведь выполняться они могут не всегда, а условно. Конечно, речь при этом не идет об их "совместном" выполнении, а лишь об их наличии в теле одного метода. PS Вообще о DODEFAULT() в рамках данной темы говорить, думаю, бессмысленно. Ведь буквально она призвана исполнить одноименный метод родителя, о наличии которого здесь речи пока не было. А раз так, то DODEFAULT() вообще ничего полезного не произведет (как максимум - вернёт .T.). PPS Почти всё (кроме цитаты из Help) писал "по памяти" - возможно, где-то и зарапортовался.
Это можно сделать с помощью NODEFAULT для А и эмуляции Б с помощью KEYBOARD:
Исправлено 8 раз(а). Последнее : akvvohinc, 12.11.19 05:56 |
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить? | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
плюсанул )
|
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить? | |
---|---|
Rifat Сообщений: 32 Дата регистрации: 06.02.2012 |
Я реализовал горячие клавиши на форме с помощью меню формы.
При запуске формы в основное меню приложения добавляется меню формы, например "Действия". В этом меню определяю нужные действия для формы и назначаю горячие клавиши. При активации/деактивации формы, меню добавляю/убираю. Главное, проверять доступность активной формы. Клавиши F1 и F10 не задействую, но, думаю, меню перебьет их. Удобно, что, при случае, можно и мышкой в меню тыкнуть. |
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить? | |
---|---|
Crispy Сообщений: 18571 Дата регистрации: 16.05.2005 |
В KeyPress формы. У меня давно работает - в рабочем проекте, откуда и скопировал. Если же используется главное окно фокспро - ну там возможно и проблемы, не проверял. Возможно хотя бы предварительно надо будет отключать меню и хелп:
Вообще, на мой взгляд - использование главного окна больше для ленивых. А использование фоксовского меню - сплошное неудобство по функционалу. Я всегда делал все управление через горячие клавиши + дублирующие их кнопки - и всем было только удобно. Очень быстро и просто можно сделать что угодно. Чем елозить мышкой по иерарзическим менюшкам. А то, если еще и мышь полглючивает, что при нынешниз мышах не редкость - вообще море удовольствия пользователю в такие моменты. То ли дело - горячие клавшиши. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить? | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Но тем не менее это так и есть
Не совсем так. Код написанный в методе "перекрывает" код родительского метода, но только лишь пользовательский код (то что написано на фоксе). Системный код (то что написано на си и зашито в среду исполнения самого фокса) работает как ни в чём не бывало. Команда NODEFAULT именно системный код и "отменяет" - но при этом при помощи DODEFAULT() вполне можно "провалиться" через все уровни пользовательского (фоксового) кода и снова вызвать системный код - а явно указав параметры (в частности для KeyPress - т.к. там системный код оперирует именно этими самыми параметрами, и в зависимости от них и модифицирует .Value текстбокса, ну и его визуальное отображение) можно ещё и "изменить" это самое поведение системного кода. Да, но этим самым "родительском кодом" вполне может оказаться и системный код фокса А можно и безо всякого KEYBOARD, при помощи DODEFAULT с параметрами При этом в случае с DODEFAULT мы по сути обрабатываем одно событие "нажатия кнопки", а при помощи KEYBOARD - два. Первое отменяем, а второе заново инициируем. Это легко проверить, и даже "зациклить" фокс если посылать ту же самую литеру - KeyPress будет бесконечно исполняться. ------------------ WBR, Igor |
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить? | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Ну да, зато поиметь секас по полной программе со своим самодельным AsTopLevel окном - удел реально "не ленивых" Ну да вроде как мы ж знаем кого работа любит Одно другому не мешает. А программа где вообще ничего нельзя сделать не прочитав мануал где все эти горячие кнопки расписаны - ну на о-о-очень большого любителя штука. Могу порекомендовать тебе попользоваться vi - классическим и весьма популярным текстовым редактором для линукса. Вот тут есть онлайн терминал bellard.org после загрузки набираешь vi hello.c (там уже заботливо подготовлен маленький програмный файл на си) и наслаждаешься настоящим интерфейсом для обработки алфавитно-цифровой информации, незамутнённым никакими б-гомерзкими окнами, и их враждебными менюшками хинт - для выхода из vi надо нажать :q и потом ввод - далее уж сам, сам... Хоткеев/команд для редактирования текстового файла там очень и очень много ------------------ WBR, Igor |
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить? | |
---|---|
akvvohinc Сообщений: 4224 Откуда: Москва Дата регистрации: 11.11.2008 |
В начале топика давались советы заменить ON KEY LABEL на обработку клавиш в KeyPress формы. Поэтому и я подразумевал, что речь идет о KeyPress формы на основе базового класса. Ты же привел пример для TextBox. Можешь вывести несколько символов из KeyPress формы с помощью DODEFAULT()?
И здесь мое замечание то же, что и выше. Можешь заменить символ с помощью NODEFAULT и DODEFAULT() из KeyPress формы?
То есть и для KeyPress формы базового класса можно вызвать "системный код фокса" с помощью DODEFAULT()? Хотелось бы увидеть такой пример, и если он существует, то мне придется переосмыслить ту абстракцию, что я построил для DODEFAULT(). Исправлено 3 раз(а). Последнее : akvvohinc, 13.11.19 01:43 |
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить? | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Честно говоря не понял вопроса. Какая разница какой именно KeyPress - формы или текстбокса или комбо - так работают все обработчики событий. Просто для формы, скорее всего, ничего осмысленного в обработке 2-3 типа-нажатий-кнопок не будет - в текстбоксе это просто очевидным образом видно.
Я не думаю что метод KeyPress формы имеет хоть какое-то отношение ко "вводу символов в текстбокс". Хотя и не проверял, да и не собираюсь Полагаю что именно так это и работает - если Dodefault прописан в форме/классе первого уровня наследования (непосредственно от Form, ну или там Textbox) то он попытается вызвать "системный код фокса". На самом деле это не самый сложный из сценариев - куда как запутаннее происходит работа с методами адаптеров типа BeforeInsert и им подобным - там ещё и некоторые из параметров типа "по ссылке" передаются, и при нескольких уровнях наследования возникает проблема, что изменения этих параметров "не видны" фоксу - тогда как при 1 уровне наследования всё ок. ------------------ WBR, Igor |
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить? | |
---|---|
akvvohinc Сообщений: 4224 Откуда: Москва Дата регистрации: 11.11.2008 |
А здесь уже я не понял - я имел в виду твой же пример, но когда клавиши "ловит" KeyPress формы (KeyPreview = .T.), а выводятся они в том же текстбоксе (его KeyPress пуст). Так что внешне ничего измениться не должно - видимость должна быть не менее прекрасной.
Ok, тогда я остаюсь пока при своем мнении (относительно Keypress формы), пока кто-нибудь не захочет проверить, и проверка не покажет обратное. Исправлено 2 раз(а). Последнее : akvvohinc, 14.11.19 04:45 |
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить? | |
---|---|
Crispy Сообщений: 18571 Дата регистрации: 16.05.2005 |
Может не совсем понял, о чем речь, но таки "Keypress формы" у меня например вполне себе отрабатывает нажатия и для любых вложенных в форму объектов, тех же текстбоксов. Другое дело, что все подобное обычно не совсем логично размещать в Keypress формы - имеет смысл конечно же для каждого объекта использовать относящиеся именно к нему методы перехвата нажатий. А Keypress формы использовать только для активации/визуализации какого-лиюбо объекта, либо запуска процесса вычислений или выполнения каких-то действий. Т.е. как бы привычная логика любого пользовательского интерфейса. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить? | |
---|---|
akvvohinc Сообщений: 4224 Откуда: Москва Дата регистрации: 11.11.2008 |
Начало этой дискуссии, полагаю, началось с этого высказывания Олега:
А далее обсуждали, можно ли с помощью DODEFAULT(), выданного из KeyPress формы, "размножить" принятый символ - то есть сделать так, чтобы в активном объекте, например, текстбоксе, появились два символа вместо одного. Игорь привел пример такого "размножения", но для KeyPress текстбокса.
Ok, как бы ты распределил код по объектам формы для такой задачи - нажатие F2 должно выполнять некие функции, зависящие от того, какой объект является активным? Исправлено 1 раз(а). Последнее : akvvohinc, 14.11.19 10:13 |
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить? | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
KeyPress формы ничего ни в какие текстбоксы не выводит. С чего бы его переопределение повлияло на работу текстбокса? Выводит символ в поле KeyPress этого самого поля ввода, а не какой-то иной код, тоже реагирующий на нажатия клавиш. Ну может быть за исключением случая с NODEFAULT - возможно там прерывается не только работа самого KeyPress формы, но и вообще вся обработка события нажатия кнопки - включая всякие биндинги и т.п. А что по твоему делает KeyPress самой формы? Ну его "системная" часть... То что ты не прав относительно DODEFAULT() я показал Вовсе нет. Обсуждали не "конкретное применение" (которое в общем то не имеет смысла, поскольку KeyPress формы никоим образом не отвечает за появление буковок в текстбоксе), а "смысл и логику работы DODEFAULT() как такового". ------------------ WBR, Igor |
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить? | |
---|---|
akvvohinc Сообщений: 4224 Откуда: Москва Дата регистрации: 11.11.2008 |
Я написал "ловит" клавиши, а не "выводит в текстбокс". Код KeyPress формы влияет на то, что появится/не появится в поле текстбокса. И когда я писал, что с помощью DODEFAULT() нажимаемый символ не дублируется, то имел в виду лишь то, что уже пояснил выше - DODEFAULT(), написанный в KeyPress формы, не продублирует нажимаемый символ в поле текстбокса. Пропускает нажатую клавишу дальше - в активный объект формы. Соответственно, NODEFAULT используется для запрета этой "системной" части - в случае, если нажатая клавиша не должна быть пропущена в активный объект. А DODEFAULT() не сделает ничего полезного. Поэтому я и писал, что с помощью DODEFAULT(), написанного в KeyPress формы, ни продублировать, ни подменить символ не получится. (точнее говоря, у меня не получалось, но пока никто не захотел попробовать )
Тот же ответ, что и на вопрос "Что делает системная часть KeyPress формы?" (см.выше).
Пусть ты писал и об этом - тебе виднее. Ну, а я имел в виду именно "конкретное применение" DODEFAULT(). Зачем бы я вдруг стал отвлекаться от темы и писать о смысле DODEFAULT() "вообще", если на тот момент ТС было предложено заменить ON KEY LABEL на вполне конкретный KeyPress формы? Вот "история" DODEFAULT() в этом топике, какой ее вижу я 1) первым это слово написал Олег: 2) написано это было сразу за примером Криспы, расписывающим обработку клавиш в KeyPress формы; (еще ранее было предложено заменить ON KEY LABEL на KeyPress формы) 3) поэтому я понял пост Олега не как "теорию" DODEFAULT(), а о том, что сделает DODEFAULT() в KeyPress формы (возможно, в этом я ошибся); 4) соответственно, и всё написанное мною тоже относилось к использованию DODEFAULT() в KeyPress формы. 5) твой DODEFAULT() был написан в KeyPress текстбокса, то есть не мог ни подтвердить, ни опровегнуть мои слова.
Я буду неправ, если ты покажешь пример, подтверждающий твои слова: применительно к KeyPress формы. !Вызови "системные" действия KeyPress формы после их отмены NODEFAULT'ом! - и я неправ. Исправлено 11 раз(а). Последнее : akvvohinc, 15.11.19 05:27 |
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить? | |
---|---|
Crispy Сообщений: 18571 Дата регистрации: 16.05.2005 |
Проще всего для этого использовать перепосыл кода нажатия в соответствующий объект в качестве параметра KeyPress(). Это не совсем очевидные использование KeyPress(), но я в прицнипе давно уже так делаю. И оно вполне себя оправдывает. Т.е. просто вызываем в нужном случае данный метод объекта, но - именно с параметром. В данном случае например - с конкректным его значением.
Ну или скажем вот такой пример для наглядности, как раз с перепосылом кода нажатия:
Где строка перепосыла кода нажатия из KeyPress() формы в активный объект:
Активизируя мышкой каждый текстбокс и нажимая F2 - видим обработку нажатия именно из активного текстбокса. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) Исправлено 4 раз(а). Последнее : Crispy, 15.11.19 09:08 |
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить? | |
---|---|
Crispy Сообщений: 18571 Дата регистрации: 16.05.2005 |
Кстати, в предложенной тобой задаче - отдельной обработки активных объектов по нажатию на F2 - можно же и вообще никак не задействовать непосредственно KeyPress() формы. Т.е., если для каждого объекта нужен именно свой уникальный обработчик, размещаемый в его KeyPress() - в примере выше достаточно просто выкинуть перехват нажатия у формы, оставив его только у каждого объекта. а вот если скажем по F2 сначала должен выполняться какой-то общий для всех код, и только затем уже у каждого объекта свой специфический для даннойго объекта код, т.е. нужна именно последовательность такого вида: "KeyPress() формы" -> "KeyPress() Объекта", тогда вот как раз и можно использовать приводившийся выше вариант. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить? | |
---|---|
akvvohinc Сообщений: 4224 Откуда: Москва Дата регистрации: 11.11.2008 |
Во-первых, такая конструкция не сработает для не Top-Level формы (убери ShowWindow = 2, проверь). А кроме того, зачем отменять F2, а затем посылать его объекту, если его можно просто не отменять? Но в любом случае ты посылаешь F2 всем объектам, даже тем, кому он не нужен, и должен написать код (обработчик) в каждом таком объекте, что усложняет понимание происходящего - ты не видишь всей картинки сразу (ведь форма - это не PRG, как в твоем примере), и, как следствие, усложняет сопровождение. А почему бы не сконцентрировать весь функционал по обработке F2 в одном месте - в отдельном методе или хотя бы в KeyPress формы? Исправлено 3 раз(а). Последнее : akvvohinc, 15.11.19 13:56 |
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить? | |
---|---|
Crispy Сообщений: 18571 Дата регистрации: 16.05.2005 |
Ну так оно и делается обычно. Но это ж твоя идея - каждому объекту свою обработку. Ну разве что, если код для всех объектов однотиный, отличаясь лишь какими-то парметрами - естественно его вынести в отдельный метод формы с параметрами, а потом просто вызывать - из каждого объекта со своим параметром. Я кстати так часто делал, передавая в качестве караметра такому методу либо имя объекта, либо даже просто сам объект, что-то типа такого: "thisform.Method(this)". ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: Как работать с ON KEY LABEL или чем эту конструкцию заменить? | |
---|---|
Crispy Сообщений: 18571 Дата регистрации: 16.05.2005 |
Да я знаю. Просто у меня никогда не используется главное окно фокспро, уже говорил про это выше. На мой взгляд, своя главная форма - намного более удобнее и гибче по настройкам. Ну дело вкуса конечно. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
© 2000-2024 Fox Club  |