Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Сообщения пользователя
|
|||
|---|---|---|---|
|
#18+
И ещё... Если )) в MDI интерфейсе мы 1)одну и ту же запись открываем в двух окнах.. 2)начинаем редактировать - то в одном окне, то в другом окне... Вопросы: 1) А вообще стоит ли юзеру позволять делать это? (чего он там навводит интересно? и кто потом будет это разгребать?) 2) Если в две формы ввода привязаны к одной группе буферных переменных, то изменения в обоих вормах по идее должны происходить синхронно вне зависимости от того, в какую из форм осуществляется ввод. Это конечно можно реализовать, но стоит ли усложнять код ради этого? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 12:55 |
|
||
|
Сообщения пользователя
|
|||
|---|---|---|---|
|
#18+
2gardenman: >1) В этом варианте архитектура Doc/View - нафиг не нужна. ИМХО Doc/View была не для этого придумана. Она заточена на операции с файловыми документами. конечно можно ее прикрутить и к базам данных - но выглядит это уродливо. А как Вы проектируете базу ? Не опираясь на документы (объективные понятия предметной отрасли) ? >2) должно быть так -> Форма ввода данных для выполнения транзакции -> выполнение транзакции. И чем это несогласуется с doc/view ? Примитивно говоря - случай с одним view. Но как правльно сказал olk это - всего лишь простейший случай. >3) С этой стороны абсолютно без разницы какое это приложение - MDI или SDI интерфейсом. Ну, я вроде привел пример из жизни в посте выше... Что еще сказать... >4) Каждый элемент управления должен самостоянельно обрабатывать и сохранять данные ввода в буферных переменных, и DDX - нафиг не нужен. olk уже ответил, хотя мне непонятно, я сколько видел примеров работы с БД на VC - всюду DDX использовали и не жаловались. >5) В порме ввода часто встречаются зависимае поля. Например не выбрав валюту, глупо вводить курс, или не выбрав отдел - невозможно выбрать человека в отделе. С этой точки зрения активация полей в форме должна проходить в строго определенном порядке. А то, что предлагает Windows - для таких целей не подходит. Порядок - это переход фокуса. Контрол же просто выбирает/позволяет ввести данные с учетом определенных условий (Курс валют - можно ввести, например, сначала, а потом установить вид валюты - это проверка уровня формы, а человека в отделе когда выбираешь - формируется список людей в установленном отделе. Нет отдела - нет списка). Это то, что предлагает windows. >Вывод, если хочешь чтоб всё работало как надо - делай все сам. Угу. И MFC и VCL и .NET - это от лукавого. И вообще СУБД свою надо рисовать... Надо просто соображать что где и когда применять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 13:06 |
|
||
|
Сообщения пользователя
|
|||
|---|---|---|---|
|
#18+
И уж сразу еще вдогонку 2gardenman по свежим постам: >> "вид" соответсвено считывая текущее состояние документа может >>енэйблить или дизайблить соответсвующие контролы >Аха...я тоже так раньше делал. >Но уж очень длинный и некрасивый код получается. Чем длинный и некрасивый ? В форме ? Так ведь все равно где-то придется писать код открытия/закрытия контролов. Примеры - в студию... > И ещё... >Если )) в MDI интерфейсе мы >1)одну и ту же запись открываем в двух окнах.. >2)начинаем редактировать - то в одном окне, то в другом окне... Обычно это делается - не для случая двойного редактирования одной записи. Можно этот момент запрещать в программе, можно - нет. Вы никогда не видели ситуации, когда менеджеру надо заниматься 3-10 делами сразу ? >Вопросы: >1) А вообще стоит ли юзеру позволять делать это? (чего он там навводит интересно? и кто потом будет это разгребать?) В журнале отмечен оператор/юзер, редактировавший запись ? Кто еще разгребать должен ? Для каждого уровня пользователя - свой интерфейс и Вы говорите о базовом уровне, а мы с olk - о более продвинутом. >2) Если в две формы ввода привязаны к одной группе буферных переменных, то изменения в обоих вормах по идее должны происходить синхронно вне зависимости от того, в какую из форм осуществляется ввод. Это конечно можно реализовать, но стоит ли усложнять код ради этого? Это - один документ и несколько view. В чем усложнение кода ? Все делается автоматом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 13:20 |
|
||
|
Сообщения пользователя
|
|||
|---|---|---|---|
|
#18+
Ну, на счет того, как я проектирую базы даннных)) я иду не от документов а от сущностей) В одном документе может быь много сущностей, а документ - устанавливает связи между ними. Одна сущность - может входить в несколько документов. И оперировать в базе данных нужно )) ИМХО не документами, а сущностями (понятиями) С этой стороны одна форма ввода - одна сущность. Изменение одной сущности - одна транзакция и т.д. И документ должен достаточно жестко устанавливать связи между сущностями (расшировываю - ссылочная/декларативная целостность) А порядок во вводе формы - должен быть) 1) чтоб юзер не забыл ввести что-нить важное 2) чтоб уменьшить количество "тупых" запросов к базе например: если не указан отдел, может показать все 25 тысяч сотрудников организации? Вот действительно, к примеру, отдел кадров: 25 тысяч работающих. Куча отделов, департаментов, филиалов... Постоянные перемещения сотрудников, совмещение должностей, прием на работу-увольнение... Скажите мне пожалуйста, где тут документ? а где его представление? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 13:34 |
|
||
|
Сообщения пользователя
|
|||
|---|---|---|---|
|
#18+
Тоже добавлю Как я убедился на практике, архитектуру Doc/View часто недооценивают, даже во многих "умных" книжках, всю обработку и хранение данных предпочитают делать в "виде" , оставля документ практически пустым (... ну типа просто его визард сгенерил - а так вроде он и нафиг не нужен .... только что бы темплейт можно было зарегестрить), попробуйте все же перенести хранение данных документа и его состояние на CDocument - и я уверен вам понравиться и логика приложения на самом деле окажется проще и изменять код будет куда легче ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 13:37 |
|
||
|
Сообщения пользователя
|
|||
|---|---|---|---|
|
#18+
2 gardenman: о пока писал еще пост появился Не надо понимать так буквально, что "документ" - это аналог какого либо реального документа ... это может быть и ваша сущность ... Вот действительно, к примеру, отдел кадров: 25 тысяч работающих. Куча отделов, департаментов, филиалов... Постоянные перемещения сотрудников, совмещение должностей, прием на работу-увольнение... Скажите мне пожалуйста, где тут документ? а где его представление? Стандартная задача, нормально вписывающаяся в концепцию Doc/View Навскидку : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 13:54 |
|
||
|
Сообщения пользователя
|
|||
|---|---|---|---|
|
#18+
)))Уважаемый olk Скажите пожалуйста, и сильно вам помогает CDocument в вашем случае? Вы же максимум 5% от всех зашитых в него возможностей используете! А остальные 95 - дописываете сами) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 14:01 |
|
||
|
Сообщения пользователя
|
|||
|---|---|---|---|
|
#18+
Да, и еще замечание,а как же связи между документами? Появился приказ о назначении - изменился состав подразделения... Получается должны быть какие-то отношения между документами.... а как их реализовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 14:05 |
|
||
|
Сообщения пользователя
|
|||
|---|---|---|---|
|
#18+
Вообще-то отношения между документами зависят от конкртного случая, но стандартный вариант отношения один-ко-многим это просто ссылка на другой документ (FK-PK связка). View, в свою очередь, по данному полю FK может выбирать, скажем для lookup'а, значения по связи FK нашего документа->PKId справочника и брать из справочника Number+Name для примера... Все стандартно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 14:22 |
|
||
|
Сообщения пользователя
|
|||
|---|---|---|---|
|
#18+
to void_123: это шутка????!!! цитирую: void CMyApp:: ClearControls() { m_pMainDialog.ClearControls(); m_pTreeView.ClearControls(); m_pParent1.ClearControls(); //… //… m_pParentXXX.ClearControls(); //и т.д. } // А затем КАЖДЫЙ из родителей перечисляет void CParent1:: ClearControls() { m_pChield1. ClearControls(); m_pChield2. ClearControls(); //… //… m_pChieldXXX. ClearControls(); //и т.д. } У меня в енжине есть один виртуальный метод - OnBinding() типа: <code> void CEqmManager::OnBinding() { ctl_lastEntered = new CWSEdit("LASTENTEREDCONTROL_NU", IDC_LASTENTERED_CTRLNU, IDC_CAP_LASTENTERED_CTRLNU, this); ctl_maximum = new CWSEdit( "MAXIMUMCONTROL_NU", IDC_MAXIMUM_CTRLNU, IDC_CAP_MAXIMUM_CTRLNU, this); ctl_ctlnu = new CWSMaskEdit("CONTROL_NU", IDC_CONTROL_NU, IDC_CAP_CONTROL_NU, this); ctl_serial = new CWSMaskEdit("SERIALNO", IDC_SERIAL_NUMBER, IDC_CAP_SERIAL_NUMBER, this); ctl_manuf = new CWSComboEdit("MANUFACTURER", IDC_MANUFACTURER, IDC_CAP_MANUFACTURER, this); ... } </code> Практически все! Форма с данными полноценно работает, потому как весь механизм реализуется в базовых классах. Все эти заполнения, прочистки, возврат предыдущего значения по undo, выделение цветом значений, отличающихся цветом от дефолтовых и еще миллион мелочей реализованы в енжине!!! На формах с данными я занимаюсь только логической частью - типа прореагировать на клик на кнопке, или дополнительно проверить пару контролов перед сохранением. Никакой такой ручной муторней я не могу себе позволить заниматься, т.к. в проекте уже около 250 форм, в среднем по 50-70 дата-контролов на каждой. То, что тут обсуждается - это как лучше "ручками" все делать. (Я чуть не упал, когда читал, тут ваще кто-нить более-менее большие проекты делал?) Берешь, делаешь чисто ООП-енжин, наследуешь все свои дата-формы от некоторой базовой, используешь контролы, которые знают, как с формой "правильно" работать. Единственно что требуется - это в момент создания формы "положить" соотв. елементы управления на шаблон диалога или view, это делается в переопределенном OnBinding(). Если пойти чуть дальше, и не пользоваться ресурсами диалогов, а написать свою "рисовалку" дата-форм, и сохранять это как свой custom-ресурс, то вообще и OnBinding не нужен - просто можно было бы указать ресурс и все. Все! А на самой дата-форме, вместо того, что бы заниматься "чернорабочими" делами, заняться бы лучше чем-нить полезным. Если использовать BCB, то такую фигню надо было сделать в виде компонента - контейнера, представляющего из себя дата-форму, и полностью инкапсулирующего все системные алгоритмы. И плюс - компоненты дата-контролы, которые можно бросать на эти дата-формы, и которые умеют "правильно" с ней работать. А наследоваться от TForm - ... Ничем не лучше, чем от TObject в данном случае... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 20:35 |
|
||
|
Сообщения пользователя
|
|||
|---|---|---|---|
|
#18+
Сильно напрягла работа ... поэтому не было время для ответов ... Ветка ушла далеко от первоночального топика но все же осталась достаточно интересной .... Давйте посмотрим что мы имеем ... 1. "Горизонтальный" подход (подход void_123)- когда некотое "представление" само за себя отвечает и вроде как имеет способы общения через контролы общаться с БД и другими представления ... т.е. есть некая форма которая посредство инкапсулируемых (и/или наследуемых методов) очищает , заполняет поля, верифицирует, порождает обмен с БД и т.д ... 2. Подход некоего енжина (подход vdimas) - т.е. универсального "компонента" реализованого видимо в некоторой ирархии классов , наследуя от этих классов получем некоторый механизм работы с формами (правда при этом маленько непонятно где хранятся обрабатываемые данные ? ну это вопрос реализации (кстати все же наверное интесно было бы взглянуть, емайл в профиле) ... 3. Традиционный - мухи отдельно .. катлеты отдельно - ну это я про себя с использованием уже годами наработанного механизмов МФС Док/Вью В принципе не кто наверное не против, что любой подход имеет право на жизнь, при этом я предпологаю, что уровень сложности разрабоки наверное будет примерно одинаковый (я имею в виду разработку начальных "компонент",механизмов, ирархии класов + отладка (поиск багов ,несоответствий (полная переработка ирархии ) и т.д. + само приложение) ..., опять-же наверное любо программист согласится, что разрабатывать приложение на своей ирархии классов, гораздо проще (просто вследствии того, что ты всегда можешь (скрипя зубами ) ,что то в этой ирархии классов изменить в угоду текущему приложению ... ну и конечно потому что ты ее знаешь досконально ... Основной критерий (ИМХО) сорость и качество разработки приложения ... и как раз в этом по моему основное противоречие ... Например VC очень много кода приходиться писать руками (скорсоть -, качество + ) Builder C++ - быстрая разработка, качество - , иногда очень сложно получить имено то чего хочется (может это плохое знание инструмента - вполне может быть ... хотя сидел на нем более 2-х лет) Скажу сразу в МФС-е меня тоже не все устраивает ... Что бы не быть голословным скажу что опыт программировния на Плюсатом у меня (дай бог памяти) с 85 года ! При этом были периоды использования Watcom C++ IBM Visual Age C++ Borland C++ Builder C++ VC++ в идеале, что я вижу для себя (кстати немного похоже на подход vdimas) я уже где то постил При этом в качестве конечного инструмента в идеале я представляю некоторый визард, создающий некоторый ресурс (причем динамический настраиваемый пользователем из приложения, в виде некоторых метаданных - определенных на пространстве рабочей станции+эккаунта с некоторыми предопределенным значением (причем в иделе это можно хранить или в регистах или в файле или даже в СУБД) с описанием формы (вьюшки), диалога (совокупности диалогов) . В общем случае (что бы было понятно о чем я говорю) для примера , приложение привязано к некоторой (некоторым) CDatabase (ODBC,DAO ...), форма привязано к некторому анонимному CRecordset (т.е. SQL - запрос берется из метаданных) и далее все контролы, гриды, комббобоксы и т.д. (их расположение (количество полей (размеры),расположение в гридах) и привязка берется так же из метаданных)... ну это в идеале понятно что я не задал ни каких вопросов ... но с другой стороны я не совсем понмаю зачем изобретать велосипед ? для меня например уже давно стало однозначно ... хочешь быстро и красиво - испоьзуй VCL - Инпрайс (Борланд), хочешь дотошно и качествено VC+MFC, хочешь гимороя - начинай с нуля может я кого то конечно не правильно понял ?? ну так что продолжим ... ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 23:44 |
|
||
|
Сообщения пользователя
|
|||
|---|---|---|---|
|
#18+
Прошу меня извинить, что отвечаю по порядку всем сразу. ////////////// to olk >> Вообще то всегда считал, что Doc/View - это дальнейшее абстагирование ООП Я бы сказал попытка мелкософт. Продукт коммерческий. Ну должны ж они были хоть шото дать визардовое да ещё с «абстракциями». ИМХО тоже касается DDX. >> кхм и как-же он должен его обрабатывать ? а если я нажал кнопку отмена, контрол поля ввода >>сам должен вернуть предыдущее значение в свою буферную переменную ? Сам программер должен написать код для обмена данными между гляделко-печаталками и контролами и буферами. >> и чем вам ддх не угодил ? это же просто механизм (просто более универсальный) сохранения контролами своих значений в буферных переменных ... Потому, что в реальных приложениях БД структура буферов значительно сложнее одной переменной или их простой совокупности (списка или перечисления). Как врач говорю, а не как практикующий программер БД. >> посылается UpdateAllView - "вид" соответсвено считывая текущее состояние документа может енэйблить или дизайблить соответсвующие контролы Эта архитектура не единственная. Очень прязана к МФЦ. Что делать, если программируем с использованием гольного API? /////////////////////////////////////////////////////////////////////////////////////////////// To Mik Prokoshin >> …оформить результат в виде готовых компонент/библиотеки классов и закинуть на какой-нибудь… Если речь и не идёт о разработке архитектуры, то идёт об отказе от стандартной архитектуры, в том числе и от документ-вид, и о том, как это сделать с меньшими «нарушениями правилами уличного движения ООП». >>Из Вашего первого поста : >Удобство заключается в том, что всё управление отображением и заполнением контролов (enable, visible и т.д) сосредоточено в одном месте. Вернее сосредоточена общая логика приложения в части управления контролами Да это было в посте. Там это для затравки, масло в огонь. >> … Просто надо было сразу декларировать четко цели. Вы правы. >>….Если мне надо передать сообщение для группы контролов - я передаю сообщение их общему >>родителю, который и обрабатывает его, модифицируя детишек. Это можно выносить в >>отдельный шаблон, как предложено, но IMHO объем работы практически сопоставим Вы правы, если мы обсуждаем одно и тоже. Впрочем, Вы можете быть правы в любом случае. На одном из форумов в развитие этой архитектуры предлагается отнаследоваться всем заинтересованным классам, в том числе аппликации, от месангера. Тогда, такой класс можно рассматривать в качестве контейнера-посредника (медиатора), который будет рассылать мессаги объектам-подписчикам. Тупой пример, хотя там это и не надо, - CTabPageControl:CTabCtrl:CMessanger. В этом примере диалоги пейжей могут быть подписчиками медиатора CTabPageControl. Пример тупой, т.к. для табов это решается проще. Вы об этом? Если, да то я об этом думаю. >> Надо сразу четко оговаривать область применения. А то - сделали что-то и стали решать "вещь получилась хорошая, но куда прикрутить никак не поймем" :-) Я уже выше попросил меня простить. >>Просто эти идеи (в данном случае) - реализация старых шаблонов. (без обид) Без обид. Тем более, что верно. Это было реализовано, правда в более могутном масштабе, на plain-C в начале 90. Не помню когда точно. Тогда не было виндовз, а не то чтобы хотелось, просто досовы подзадачи требовали GUI (делали самопальный ГИС). Но там было всё сложнее, поскольку тулз создания абстакций приходилось моделировать на С вместо использования языковых средств С++ описания абстракций. /////////////////////////////////////////////////////////////////////////////////////////////// To gardenman >>1)одну и ту же запись открываем в двух окнах.. >>2)начинаем редактировать - то в одном окне, то в другом окне... Что здесь сказать… >> Это конечно можно реализовать, но стоит ли усложнять код ради этого? Задачи бывают разные. Но усложнять, думаю, не стоит. Это (выше) не усложнение, а прямой путь к краху проекта при его модернизации, наращивании и т.д., ИМХО. /////////////////////////////////////////////////////////////////////////////////////////////// To Mik Prokoshin >>А как Вы проектируете базу ? Не опираясь на документы (объективные понятия предметной отрасли) ? Для данных создаётся свой класс, который умеет читать, писать и т.д. Объект такого класса и есть реализация буфера. >>olk уже ответил, хотя мне непонятно, я сколько видел примеров работы с БД на VC - всюду DDX использовали и не жаловались. ИМХО просто это лишнее, т.к., например, по нажатию кнопки «Сохранить» всё равно придётся «переносить» данные в буфер, возможно сложной структуры, а только потом вливать из БУФЕРА в базу. Если этого не сделать, то затруднительно нормально обработать серию транзакций. /////////////////////////////////////////////////////////////////////////////////////////////// To gardenman >>я иду не от документов а от сущностей) Прально гришь. >>Скажите пожалуйста, и сильно вам помогает CDocument в вашем случае? >>Вы же максимум 5% от всех зашитых в него возможностей используете! >>А остальные 95 - дописываете сами) У меня другой вопрос. Какие вообще есть методы класса CDocument для работы с БД. Что там «хорошо» на 1%? То что специализированный класс, да ещё умеет говорит UpdateAllViews? А свой класс, чем будет хуже? Тем, что не умеет говорить UpdateAllViews? И всё??? /////////////////////////////////////////////////////////////////////////////////////////////// To vdimas >>to void_123: >>это шутка????!!! >>цитирую: >>void CMyApp:: ClearControls() >>{ >>m_pMainDialog.ClearControls(); >>m_pTreeView.ClearControls(); Это гипербола. Пример несколько теоретизированно-натянут. Если класс контейнер умеет перечислять «детей», как например, CTabCtrl, то он сделает это. /////////////////////////////////////////////////////////////////////////////////////////////// to olk >>1. "Горизонтальный" подход (подход void_123)- когда некотое "представление" само за себя отвечает и вроде как имеет способы общения через контролы общаться с БД и другими представления ... т.е. есть некая форма которая посредство инкапсулируемых (и/или наследуемых методов) очищает , заполняет поля, верифицирует, порождает обмен с БД и т.д ... Не сердитесь, но это очень поверхностный взгляд. Неверна даже терминология. Я понимаю, что мой стиль изложения оооооочень нудный. И оооочень тяжело прочитать. Даже мне самому;))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2003, 12:21 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=32222315&tid=2036148]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 342ms |

| 0 / 0 |
