![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| sl8er |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 14.6.2007 Репутация: нет Всего: нет |
Добрый день.
Расскажите, как надо: Есть форма [1] (допустим, отображение документов), она вызывает немодальную форму [2] конкретного документа (который имеет свои табличные части). При открытии формы [2] должны быть загружены, допустим, 2 датасета (формы и табличной части Товары). При закрытии формы [2] происходит сохранение в форме [1]. При том что из одной формы [1] могут быть открыты несколько форм [2], и форма [1] должна верно обработать оба события от формы [2]. Как верно это реализовывать? Пробовал через callback-функции. Процедуры загрузки и сохранения должны прописываться в какой из форм? Подозреваю, что в форме [1]. Тогда как передать нужные данные из формы [2]? Короче, запутался. Не могли бы поделиться опытом? Если с примерами, так вообще замечательно. |
|||
|
||||
| cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 7 Всего: 15 |
A что собственно созраняется?
Вообще есть как минимум четыре механизма решения пост. зад. 1 Делегаты( в дэльфе - указ на методы (события)) 2 Механизм виндовых сообщений 3 Callback - функции ( Концептуально, похожи на делегаты). 4 Интерфейсы. Также для реализации подобных весщей, можно используется vcl-механизм нотификации. А в-о-о-от какой из механизмов выбрать, зависит от других факторов (в том числе и от заданного вопроса), например межобъектная/межмодульная связность! Это сообщение отредактировал(а) cat512 - 13.2.2011, 11:49 |
|||
|
||||
| sl8er |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 14.6.2007 Репутация: нет Всего: нет |
При сохранении в дочерней форме сделанные изменения должны быть сохранены в базе данных. Кто должен производить загрузку и сохранение? а) Главная форма - тогда каким образом передать данные из дочерней формы в главную (при условии что дочерняя форма ничего не должна знать о главной)? б) Дочерняя форма - тогда на главной форме необходимо сделать обновление данных для получения актуальной информации (можно еще усложнить вариант, когда этот документ отображается еще в одном окне - желательно, чтобы изменения отобразились и в нем) |
||||
|
|||||
| cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 7 Всего: 15 |
Вообще, есть типовый юзер интерфейс, в приложениях для работы с БД - основанный на формах - селекторах (отображают информацию) и модальных формах - модификаторах (модифиц. данный в бд), который избавляет пользователей от изобретения велосипеда.
Очевидно ты пошёл своим путём."велосипеда" Теперь по сути; 1 Есть сомнение что это вообще надо делать! О каких данных идёт речь? 2 Это делается очень просто! Используется либо мех. виндовых сообщений(рефрешь по сообщению), либо нотификаций(рефрешь по событию). |
|||
|
||||
| sl8er |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 14.6.2007 Репутация: нет Всего: нет |
Я вроде описал в первом сообщении: допустим, это окно документов и окно конкретного документа. Однако, это одна из ситуаций |
|||
|
||||
| cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 7 Всего: 15 |
Лично мне кажется, что логично закрепить за формой изменяющей данные, ответственность фиксации/отката изменений
|
|||
|
||||
| sl8er |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 14.6.2007 Репутация: нет Всего: нет |
Спасибо за ваши ответы. То есть дочерняя форма должна изменять данные и уведомлять об этом главную форму? Но есть удобство, когда это делает главная форма. Взять хотя бы ситуацию с добавлением новой записи - если это делает главная форма, не нужно перечитывать весь датасет. Если это делает подчиненная форма - датасет необходимо перечитать полностью. зы. Вопрос про виндовые сообщения: можно ли как то передать вместе с сообщением какой-то свой пользовательский класс? |
|||
|
||||
| cat512 |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 7 Всего: 15 |
Это вопрос целесообразности и накладных расходов. Если дочерняя форма не несёт никакой информативной нагрузки для конечного пользователя, то зачем она тогда вобще нужна!!! Имеет смысл обойтись одной главной формой.
Есть некоторые компоненты, которые позволяют делать "точечный рефрешь"
Можно, например так:
|
||||||||
|
|||||||||
| sl8er |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 14.6.2007 Репутация: нет Всего: нет |
Я привел пример про документы. Редактировать документ в таблице? Вы где-нибудь видели это решение?
Есть, но им нужен ключ для рефреша. Вкратце, они делают запрос типа "select * from TABLE where ID = :Key"
Большое спасибо, попробую. |
||||||
|
|||||||
| cat512 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 7 Всего: 15 |
(продолжу на "ты", надеюсь не обидишься) Ведь ты сам и предложил концепцию редактирования данных через грид
Каким образом главная форма (без помощи дочерней), может редактировать данные, как не через грид? Я лишь хотел подчеркнуть тот факт, что при дизайне UI, надо тоже пользоваться принципом "необходимой достаточности". |
||||
|
|||||
| sl8er |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 14.6.2007 Репутация: нет Всего: нет |
Нисколько
Я предлагал редактирование через датасет(ы), лежащий на главной форме. Но никак не грид
Я про грид ни разу и не сказал. На главной форме датасет (или датасеты), она вызывает подчиненную форму, получает каким-то образом оттуда данные и сама производит манипуляцию с ДАТАСЕТОМ (или ДАТАСЕТАМИ). Ни слова о гриде. Он может как быть, так и не быть. А вот редактирование таких сложных объектов, как документ с табличными частями (Detail-датасеты), в гриде - это уже изврат, ИМХО. |
||||||
|
|||||||
| cat512 |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 7 Всего: 15 |
То есть, главная форма "lдокументов" не содержит элементов управления/отображения? И непредпологает интерактивное взаимодействие с пользователем? Интересно как пользователь будет редактировать данные через датасеты, не имея эл. управления/отображения?
А вот здесь, как раз идёт речь о главной форме вне контекста дочерней!
То есть это я предложил редактировать данные через грид??? И что означает выражение "табличная часть"? . Это сообщение отредактировал(а) cat512 - 13.2.2011, 11:45 |
||||||||
|
|||||||||
| cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 7 Всего: 15 |
Приведу пример, разных вариантов реализации UI
1 MDI интерфейс - форма селектор (документы) с датасетом и акшенами модификации . - модальная/ые форма/ы модификаторы (для конкретных экз. документов) (имеют метод с параметрами (классовый), через которые передаётся информация для точечного рэфреша 2 Более продвинутый (imho боле правильный) вариант SDI/ MDI (не важно). Все датасеты(комп. доступа) находятся в датамодуле (imho там им и место) На формах толькр елементы управления/отображения данных. В датасетах перекрыты методы на модификацию данных, которые будут вызывать МОДАЛЬНЫЕ формы модификаторы. Причём в этом случае мы имеем один датасет, как для selecta, так и для update. Соответственно проблема, шаринга данных между формами исчезает. Это сообщение отредактировал(а) cat512 - 13.2.2011, 12:29 |
|||
|
||||
| sl8er |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 14.6.2007 Репутация: нет Всего: нет |
Для удобства должна содержать. Если говорить именно о функционале - не обязана. Я могу просто явно передать, допустим, ID нужной записи в дочернюю форму. Его может быть и не будет видно на главной.
Я не понял.
Про грид никто не предлагал. Вы просто первым его упомянули. Но грид здесь явно не причем.
Если пользователь захочет открыть два окна, которые содержат данные, находящиеся в одном датасете? |
||||||||
|
|||||||||
| cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 7 Всего: 15 |
1.Ну ты же наверное "внимательно" прочитал, что в описаных вариантах речь идёт о модальных окнах? А значит, открыть два окна на редактирование данных, он физически не сможет. 2 В случае с MDI интерфейсом (SDI - вообще идеальный вариант), НАЗДАРОВЬЕ, пусть открывает хоть 2000 окон - селекторов (не вижу проблемы разделения даннх в ел. управления от одного датасета)только толку от такого количества открытых форм? |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |