|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
Доброго времени суток ! Вопрос по VFP (версия 9) Просмотрел большинство тем - нигде не нашел ответа на простой вопрос: при исполнении приложения (APP или EXE файла) Visual FoxPro, находясь в какой-то форме с множеством объектов - тут и Гриды, и Фреймы, и кнопок много, и всяких полей с чек-боксами. и т.д. - как можно программно, из какого-то метода этой формы, определить, какой объект на форме активен - т.е., на каком объекте находится фокус ввода. Немного другими словами: при нажатии на какие-то кнопки, или при перемещии в Гриде, или при вводе в какое-то поле (textbox или editbox), вызывается один и тот же метод (проверка просмотренных или введённых значений). Так вот, как в этом методе определить, какая кнопка была нажата перед этим, или в каком Гриде находился, или в какое поле делался ввод данных. Сразу предупреждаю: 1. просмотрел большинство тем на этом форму - даже близко такого вопроса не нашел. 2. ни в справке по VFP, ни в каких книгах (начиная от Клепинина с Агафоновой "Visual FoxPro 9.0 в подлиннике" и кончая более поздними) ответа на этом вопрос также и близко нет. а ОТВЕТ УЗНАТЬ ОЧЕНЬ ХОЧЕТСЯ, ТАК ПРИ РАЗМЕРЕ ПРИЛОЖЕНИЯ В ПОЛМИЛЛИОНА СТРОК СОЗДАНИЕ ДЛЯ КАЖДОГО ОБЪЕКТА В ФОРМЕ СВОЕГО МЕТОДА ПРОВЕРКИ - ОЧЕНЬ ДАЖЕ НАКЛАДНО. Спасибо заранее всем откликнувшимся ! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 10:52 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
Борис_К, Что-то я не могу представить - а для чего такое нужно? Т.е. вопрос чисто теоретический - или есть какая-то практическая необходимость в таком? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 11:01 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
Борис_К, а в каждом нужном контроле вызывать метод проверки с передачей ему ссылки на текущий контрол религия не позволяет? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 11:01 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
Ребята, а прочитать ПОЛНОСТЬЮ всё сообщение - слабо ? Тогда все вопросы о том, для чего это и почему это, и о "религии" отпали бы. Да и вообще непонятно, зачем отвечать, если нечего сказать по делу и по существу. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 11:05 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
Борис_К, если Вы не видите ответа "по существу", то это не значит, что его нет. Это может означать и Вашу слепоту. Что, собственно, подтверждают и результаты Ваших поисков. Слепому невозможно что-либо показать и он с помощью зрения ничего не найдет. Но после Вашего поучения кому чего делать желание Вам что-то разжевывать пропало. Удачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 11:14 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
2 Борис_К Вам никогда не приходила в голову мысль: создать библиотек контролов, в енй на основе базовых классов создать свои и у своих классов прописать какие-то методы, а затем уже свои классы класть на форму и т.д...? а не пытаться не пойми откуда определять акт.контрол и т.д. ... или в умных книгах об этом не пишут? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 11:16 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
Борис_К, проходящий вам сказал о том чтоб в вызов метода добавить "вызывающего". Скажем Код: plaintext
В самом методе смотрите кто вызвал Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 11:19 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
Борис_КДа и вообще непонятно, зачем отвечать, если нечего сказать по делу и по существу. Во-первых. Здесь никто никому ничего не должен. Во-вторых. Если задают вопросы - значит чего-то не поняли. А с телепатией у нас напряженно. Ответить влом? В-третих. Я так понимаю - есть некоторая форма, а в ней некий метод проверки данных. Если в ходе проверки что-то не так - надо воткнуть фокус на тот объект, который вызвал метод. ТАк или нет? Кстати - а как проверка запускается? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 11:20 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
Борис_К, На форме есть свойство ActiveControl, если vartype(.ActiveControl")=='O' and !isnull(.ActiveControl), то оно ссылается на активный контрол Ещё у всех контролов есть событие GotFocus(), добавьте на форму какое-то свойство и устанавливайте его в GotFocus контролов. И лучше подумать, где это делать (на счет базовых классов...) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 11:26 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
Для Peisov. Хорошо, пропуская опять же лирические рассуждения, попробуем более точно сформулировать. Итак: 1. Есть ОЧЕНЬ большое и ОЧЕНЬ серъёзное приложение, в котором только строк кода более 500 000 (пятисот тысяч), а форм - более 400. И для многих не до конца понимающих, чем промышленное программирование отличается от увлечений и мелких поделок, поясню: форм много, и они все - разные, созданные для разных целей, разных задач и разных данных. Создавать для каждой такой задачи класс, потом объявлять на его основе объект, и использовать его один единственный раз, в конкретном месте - это просто дебилизм. Гораздо проще и быстрее создать конкретную форму под конкретную задачу. Потому что имеется большой проект, который оплачивается очень большими деньгами, в котором жестко и однозначно прописаны сроки выполнения, и меры наказания при неисполнении в срок. При таких условиях следовать кретиническому требованию всегда использовать ООП - просто самоубийственно: заказчик просто скажет - на хрен мне ваши изыски, мне рабочее приложение требуется. А кто этого не понимает - пошли вон, найду других исполнителей. Деньги, повторяю, просто огромные. Опять же для понимающих - ССВ этого приложения составляет более 1 780 000 (одного миллиона семисот восьмидесяти тысяч) рублей в месяц. Всё-таки разъясню: ССВ - это совокупная стоимость владения, т.е. туда входят и зарплата разработчиков, и зарплата пользователей. и зарплата обслуживающего персонала холдинга, и ССВ компьютерной техники, ЛС и всего прочего. Так вот. Это не горчичку на сардельки мазать под пивко, о достоинствах ООП рассуждая... 2. Почти то же самое относится ко всем объектам в каждой форме - они все выполняют разные задачи. Мне вот тут мой зам подсказывает: говорить о том, что надо бы создать класс, в котором прописать метод контроля, а потом только создавать объекты, да использовать их, это всё равно, как если бы определить, что TextBox может вводить только числа от 1 до 25, с проверкой на недопустимость ввода других чисел, не говоря уже о буквах и прочих символах, а потом пытаться на основе такого класса создавть поля ввода для совершенно разных данных - и числовых, и строковых, и символьных в формате Unicod, и т.д. 3. Типовая форма приложения, например, такова: она заполнена фреймом из семи-десяти закладок. На каждой закладке имеются области инфрмации (на основе Label), по одному, а то и по два-три Grid'а, по десятку кнопок, которые выполняют различные функции (при этом тривиальных, типа печати, среди них нет), по десятку или по два десятка полей ввода данных, причём, как уже говорилось, самых разных, от простейших типа ФИО, до сложных многосимвольных и сложноформатированных кодов, которые можно, конечно, выбирать из локальных (привязанных к даному типу данных) справочников, если они туда введены, а если не введены - то тут же их и вводить, и так далее. 4. Проверки (их тип и вид) в большинстве своём задает пользователь (на основе заранее сформулированного набора правил контроля) совсем в другом месте, они хранятся в специальных таблицах базы данных, и в каждой форме проще всего организовать специальный пользовательский метод, в котором к этим таблицам происходит обращение, ищется необходимое условие и производится проверка. 5. Поскольку в каждой форме в общей сложэности до ПОЛУТЫСЯЧИ объектов, то делать для каждого объекта в форме свой метод проверки - очень и очень накладно, по двум причинам: 1) во-первых, для этого необходимо ООЧЕНЬ большое число рядовых программистов-кодеров - а их количество ограничено, поскольку в проекте штат разработчиков строго определён и раздуванию не подлежит - поскольку количество проверок постоянно изменяется (это, повторюсь, возложено на усмотрение пользователей ИС), то придется постоянно модифицировать каждый метод в каждом объекте. Кретинизм ? 2) во-вторых, в каждом таком методе постоянно повторялись бы совершенно однотипные операции, что привело бы к значительному увеличению объёма кода, и как следствие - к увеличению сложности сопровождения и разработки. Тоже Недопустимо. Так что, ребята, определние статуса активности объекта в форме - это весьма актуальная задача. На данный момент это делается очень искусственно - путём формирования в методе вызова каждого объекта своего идентификатора, занесению его в специальную таблицу, и после этого вызова процедуры проверки. Те., это опять таки увеличение и объема приложения, и размера базы данных, что не может не сказываться на быстродействии, причём не в лучшую сторону. А если ещё учеть обязательное логирование и протоколирование всех действий пользователей, для последующих разборок (в случае необходимости, для определения, кто виноват в воде неверных значений, приведших к искажению данных и отчётности перед ФСФМ и прочими государственными структурами), то такое решение сразу видится очень топорным и надуманным. Поэтому, если бы можно было в методе формы определить, какой объект был активен в момент вызова этого метода - это сразу бы решило очень серъёзную практическую задачу. По самым приблизительным прикидкам - это уменьшило бы размер базы данных на 5-6 %, а при текущем её размере в 70-75 гигабайт - это весьма существенно. Да и размер приложения бы сократился, вполне возможно, на ту же величину. Так что, не надо задавать не относящихся к делу вопросов, и обвинять в некомпетентности, в использовании не той "религии", и прочего. И не надо советов, что надо в таких случаях использовать не VFP, а что-то посеръёзнее - нам виднее, что надо использовать. На первом этапе делали всю эту бодягу на Oracle 10g и 11i, но потом столкнулись с таким чудовищным объёмом ошибок, кретинизма самих Oracl'истов, и объёмом капиталовложений и увеличения ССВ, что два с половиной года назад просто вынуждены были мигрировать на VFP. Поэтому, если не знаете, КАК ЭТО СДЕЛАТЬ - так и сидите себе дальше... Знаете - ответьте. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 12:10 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
Для Xandy. Увы - свойство ActiveControl у формы не всегда возвращает правильный объект, хотя мы его используем. Зачастую приходится вычислять объект через родительские классы. А метод GotFocus есть не у каждого объекта, увы. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 12:17 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
авторПоэтому, если не знаете, КАК ЭТО СДЕЛАТЬ - так и сидите себе дальше... Знаете - ответьте. иди ты ..., дружище ... умиляет: авторв котором только строк кода более 500 000 (пятисот тысяч), а форм - более 400. автор чем промышленное программирование отличается хочется посмотреть в глаза стратегу, 2 года бился о стол в такой-же быдлоконторе, подозреваю, что это таже быдлоконтора автор1 780 000 не составляет, а по-договоренности с учетом откатов и распила. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 12:55 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
Борис_К 1. Есть ОЧЕНЬ большое и ОЧЕНЬ серъёзное приложение, в котором только строк кода более 500 000 (пятисот тысяч), а форм - более 400. ...Для мерянья Органами Вы выбрали неподходящий пример. У меня одних форм больше тысячи, неговоря уж обо всем остальном. Количество строк еще ни один документатор не смог посчитать. Так что с этим пунктом Вы в пролете. Все остальное подтверждает мнение, что Вы плохо спроектировали систему и плохо знаете ООП и просто не умете его готовить. Отсюда и проблемы, которые перед другими просто не встают. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 12:58 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
авторПо самым приблизительным прикидкам - это уменьшило бы размер базы данных на 5-6 % внимание, внимание !!! господа, придумывается новый "нажиматор".... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 12:59 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
В общем случае, задача не решается. Никак. Думаю, с этим не справится вообще никакой язык программирования. Дело в том, что Вы хотите "натянуть" некий общий глобальный функционал на разрозненный, никак между собой не связанный, набор объектов. Без существования некой общей основы (хотя бы базовых классов) - это не решается. Частично, проблему может решить анализ стека вызовов. Функция ASTACKINFO(). Ведь вызов Вашего универсального метода происходит из какого-то события активного объекта? Или как? Можете конкретизировать задачу? В смысле, каким образом, при отсутствии базовой библиотеки классов Вы вызываете общий метод для каждого объекта? Сам момент вызова интересует. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 13:02 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
авторДля мерянья Органами ну давай померимся, у меня тут 903631КБт исходников гов..., из которого и подсмотрет-то нечего... ЦКС слышал? так вот твои 1.5 лимона - это слезки по сравнению с бюджетом этого д..., написанного на фокспро ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 13:02 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
Борис_К Если нет GotFocus(), то я обычно как минимум оборачиваю контрол в контейнер или пишу свой контрол (базовый класс Control) с эмуляцией поведения обычного контрола фокса (добавление ControlSource, Value, Value_access, Value_assign, Enable_assign, Readonly_assign, Tooltiptext_assign и т.д.). Все визуальные контролы должны иметь gotfocus() :) и проблема, подобной Вашей, не возникает. ИМХО должна быть какая-то целостная система контролов, использующихся в приложении. К примеру, активный контрол у меня всегда выделяется характерной цветной рамкой или цветом шрифта, от чекбокса до грида, - пользователи привыкают к определенному стилю. Посоветуйте Вашим программистам меньше совать на формы что-попало в качестве контролов, например картинки с обработкой кликов в них ;). Если же у вас уже подобного много и разного, то это действительно проблема, но это проблема проектирования, а не фокса. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 13:05 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
Борис_К, Вот я не понял - зачем ты написал столько букв? Причем в них нет ничего по заданному вопросу, а только пустой выпендреж. Если не секрет - сколько тебе лет и какой стаж программирования на фоксе? И еще. Очнь бы хотелось услышать отзывы пользователей, которые работают с формами на которых до 500 контролов. Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 13:13 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
Борис_К, Борис_КНа данный момент это делается очень искусственно - путём формирования в методе вызова каждого объекта своего идентификатора, занесению его в специальную таблицу, и после этого вызова процедуры проверки. Нормально, можно и так, то бишь типа бизнес-правила для контролов и форм. В базовых классах для всего завести, к примеру, коллекцию свойств - идентификаторов бизнес-правил. Только не понятно, почему такой идентификатор(ы) должен формироваться на лету, он описывается при проектировании, разве не так? Например, сделайте файлик BusinessRules.h, чтоб не напрягать память числами: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Можно написать служебную процедурку сбора информации по всем таким объявлениям в проекте и автоматического обновления таблицы бизнес-правил, запускать перед компиляцией релиза и всё что добавилось в таблицу и не прописано там (забыли сделать) - доделывать. К примеру, у меня так работает многоязычность (запустил, программка собрала все константы, добавила новые в табличку, там нужно дописать перевод на другие языки), или другая программка собирает все графические файлы, формирует фиктивный программный файл для автоматического включения в проект, формирует справочник графических файлов... и т.д., это так, для примеров. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 13:39 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
Да что вы так завелись, это ж очевидный тролль. XAndy он, например напишет, что "файл Businessrules.h очень быстро разрастётся до тысяч гигабайт, а количество h-файлов для форм перерастёт все мыслимые пределы", и т.п. Забейте. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 18:13 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
2tanglir и прочие согласен - это тролль. Это даже не смешно. А пиписками меряются малолетки и ламеры - которые хотят покзать свою значимость. Только что жена спросила, "А сколько у тебя проектов" - я в замешатеьстве - я их не считал, а строки кода тоже - я же не сдаю иняз в институте что бы мерятся переведенными строками ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2009, 19:29 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
pivaТолько что жена спросила, "А сколько у тебя проектов" - я в замешатеьстве Женсчина всегда найдёт способ поставить в тупик. 2 Борис_К Для формы завел свойство и в GotFocus классов контролов прописал заностить себя туда при получении фокуса. (впрочем это тебе уже советовали) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2009, 15:34 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
Саня - это не то слово - она уже выучила такое слово как "девайс" Сорри за офф - кого на работу взял ? можно отвечать в аську, если ты в ней появишься ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2009, 20:04 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
Борис_КИ для многих не до конца понимающих, чем промышленное программирование отличается Вот как раз для них чуть ниже и напишу. Борис_КМне вот тут мой зам подсказывает: говорить о том, что надо бы создать класс, в котором прописать метод контроля, а потом только создавать объекты, да использовать их, это всё равно, как если бы определить, что TextBox может вводить только числа от 1 до 25, с проверкой на недопустимость ввода других чисел, не говоря уже о буквах и прочих символах, а потом пытаться на основе такого класса создавть поля ввода для совершенно разных данных - и числовых, и строковых, и символьных в формате Unicod, и т.д. Да, такое представление о программировании вообще и об ООП в частности может в несколько раз увеличить объем программы, измеряемый в строках кода. Если опустить детали, а выделить только суть, то конечно для каждого типа контролов нужно создать базовый класс. И конечно, если Вы занимаетесь промышленным программированием, то не обижаем Вас подозрением и уверены, что все контролы у Вас субклассированы. Тогда в каждом базовом классе (у Вас таких базовых классов контролов должно быть порядка 10, ну учтем запарку в рядах промышленных программистов - порядка 20) несложно прописать контроль. В Вашем случае этот контроль может быть очень коротким, состоящим практически из одной строчки - вызов Вашей хитрой большой процедуры контроля. Заниматься контролем ввода можно в методах InteractiveChange или LostFocus базового класса. Ну, в примитивном виде для TextBox: procedure LostFocus if MyBigControlProcedure(Thisform.Name, This.Name, <SomeOtherParameters>) == .F. nodefault endif endproc Конечно тут масса вариантов развития и особенностей реализации, все зависит от организации конкретной программы, но смысл один - каждый контрол сам в состоянии сообщить о своей активности и запросить контроль. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2009, 22:35 |
|
Как определить, какой объект активен сейчас в форме ?
|
|||
---|---|---|---|
#18+
Борис_К 1. Есть ОЧЕНЬ большое и ОЧЕНЬ серъёзное приложение, в котором только строк кода более 500 000 (пятисот тысяч), а форм - более 400. И для многих не до конца понимающих, чем промышленное программирование отличается от увлечений и мелких поделок, поясню: форм много, и они все - разные, созданные для разных целей, разных задач и разных данных. (sorry, skipped) И вы пытаетесь ВСЕ формы (сколько их там) с их контролами, пэйджами, открытыми таблицами заставить обрабатываться одной некой процедурой (неважно, будет-ли это класс или просто большая процедура) ? В принципе, конечно, можно. Если бы вопрос ограничивался несколькими немногими формами, то ответ напрашивается сам собой (его тут уже давали) - создайте на каждой форме свойство (можно его значение передавать куда-то в глобальную переменную, массив, курсор, таблицу, в конце концов), а потом обрабатывайте этой самой гигантской процедурой. Ну, это ответ "в лоб" и, если он вам не нравится, то прошу извинить - вам лучше не передавать обработку _всех_ событий _всех_ компонентов приложения (т.е. форм с их свойствами и методами) в одну процедуру, вам, наверно, лучше как-то разделить все это по частям, несмотря на большой обьем кода. Как у Ильфа и Петрова (C) Шура Балаганов - "А может быть возьмете частями ?". На что Бендер задумчиво отвечал "Я бы взял частями, но мне нужно сразу". ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2009, 23:41 |
|
|
start [/forum/topic.php?fid=41&msg=36129596&tid=1582852]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
144ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 297ms |
total: | 540ms |
0 / 0 |