Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Взаимодействие форм 
:(
    Опции темы
sl8er
Дата 12.2.2011, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 14.6.2007

Репутация: нет
Всего: нет



Добрый день.

Расскажите, как надо:
Есть форма [1] (допустим, отображение документов), она вызывает немодальную форму [2] конкретного документа (который имеет свои табличные части). При открытии формы [2] должны быть загружены, допустим, 2 датасета (формы и табличной части Товары). При закрытии формы [2] происходит сохранение в форме [1]. При том что из одной формы [1] могут быть открыты несколько форм [2], и форма [1] должна верно обработать оба события от формы [2]. Как верно это реализовывать?

Пробовал через callback-функции. Процедуры загрузки и сохранения должны прописываться в какой из форм? Подозреваю, что в форме [1]. Тогда как передать нужные данные из формы [2]?

Короче, запутался. Не могли бы поделиться опытом? Если с примерами, так вообще замечательно.
PM MAIL   Вверх
cat512
Дата 12.2.2011, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 7
Всего: 15



A что собственно созраняется?
Вообще есть как минимум четыре механизма решения пост. зад.
1 Делегаты( в дэльфе - указ на методы (события))
2 Механизм виндовых сообщений
3 Callback - функции ( Концептуально, похожи на делегаты).
4 Интерфейсы.
Также для реализации подобных весщей, можно используется vcl-механизм нотификации.
А в-о-о-от какой из механизмов выбрать, зависит от других факторов (в том числе и от заданного вопроса), например межобъектная/межмодульная связность!

Это сообщение отредактировал(а) cat512 - 13.2.2011, 11:49
PM MAIL   Вверх
sl8er
Дата 12.2.2011, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 14.6.2007

Репутация: нет
Всего: нет



Цитата(cat512 @ 12.2.2011,  08:39)
A что собственно созраняется?
Вообще есть как минимум три механизма решения пост. зад.
1 Делегаты( в дэльфе - указ на методы (события))
2 Механизм виндовых сообщений
3 Callback - функции ( Концептуально, похожи на делегаты).
Также для реализации подобных весщей, можно используется vcl-механизм нотификации.
А в-о-о-от какой из механизмов выбрать, зависит от других факторов (в том числе и от заданного вопроса), например межобъектная/межмодульная связность!

Цитата

A что собственно созраняется?

При сохранении в дочерней форме сделанные изменения должны быть сохранены в базе данных. Кто должен производить загрузку и сохранение?
а) Главная форма - тогда каким образом передать данные из дочерней формы в главную (при условии что дочерняя форма ничего не должна знать о главной)?
б) Дочерняя форма - тогда на главной форме необходимо сделать обновление данных для получения актуальной информации (можно еще усложнить вариант, когда этот документ отображается еще в одном окне - желательно, чтобы изменения отобразились и в нем) 
PM MAIL   Вверх
cat512
Дата 12.2.2011, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 7
Всего: 15



Вообще, есть типовый юзер интерфейс, в приложениях для работы с БД - основанный на формах - селекторах (отображают информацию) и  модальных формах - модификаторах (модифиц. данный в бд), который избавляет пользователей от изобретения велосипеда. 
Очевидно ты пошёл своим путём."велосипеда" smile 
Теперь по сути;
1 Есть сомнение что это вообще надо делать! О каких данных идёт речь? 
2 Это делается очень просто! Используется либо мех. виндовых сообщений(рефрешь по сообщению), либо нотификаций(рефрешь по событию).

PM MAIL   Вверх
sl8er
Дата 12.2.2011, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 14.6.2007

Репутация: нет
Всего: нет



Цитата

Есть сомнение что это вообще надо делать! О каких данных идёт речь? 

Я вроде описал в первом сообщении: допустим, это окно документов и окно конкретного документа. Однако, это одна из ситуаций
PM MAIL   Вверх
cat512
Дата 12.2.2011, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 7
Всего: 15



Лично мне кажется, что логично закрепить за формой изменяющей данные, ответственность фиксации/отката изменений
PM MAIL   Вверх
sl8er
Дата 13.2.2011, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 14.6.2007

Репутация: нет
Всего: нет



Цитата(cat512 @ 12.2.2011,  13:18)
Лично мне кажется, что логично закрепить за формой изменяющей данные, ответственность фиксации/отката изменений

Спасибо за ваши ответы.

То есть дочерняя форма должна изменять данные и уведомлять об этом главную форму?
Но есть удобство, когда это делает главная форма. Взять хотя бы ситуацию с добавлением новой записи - если это делает главная форма, не нужно перечитывать весь датасет. Если это делает подчиненная форма - датасет необходимо перечитать полностью.

зы. Вопрос про виндовые сообщения: можно ли как то передать вместе с сообщением какой-то свой пользовательский класс?
PM MAIL   Вверх
cat512
Дата 13.2.2011, 04:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 7
Всего: 15



Цитата

Но есть удобство, когда это делает главная форма. Взять хотя бы ситуацию с добавлением новой записи - если это делает главная форма, не нужно перечитывать весь датасет.

Это вопрос целесообразности и накладных расходов. Если дочерняя форма не несёт никакой информативной нагрузки для конечного пользователя, то зачем она тогда вобще нужна!!!
Имеет смысл обойтись одной главной формой. 
Цитата

 Если это делает подчиненная форма - датасет необходимо перечитать полностью.

Есть некоторые компоненты, которые позволяют делать "точечный рефрешь"
Цитата

зы. Вопрос про виндовые сообщения: можно ли как то передать вместе с сообщением какой-то свой пользовательский класс?

Можно, например так:
Код

var
  Obj: TRecInfo;
begin
//мод. данных
  Obj := TRecInfo.Create;
  Obj.Id := FieldByName('ID').value;
  try
    Application.MainForm.Perform(WM_NEED_UPDATE, DWORD(Obj), 0);
  finally
    Obj.free;
  end;
end;
В главной форме ловим WM_NEED_UPDATE, делаем точечный рефрэшь

PM MAIL   Вверх
sl8er
Дата 13.2.2011, 05:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 14.6.2007

Репутация: нет
Всего: нет



Цитата

Если дочерняя форма не несёт никакой информативной нагрузки для конечного пользователя, то зачем она тогда вобще нужна!!!
Имеет смысл обойтись одной главной формой. 

Я привел пример про документы. Редактировать документ в таблице? Вы где-нибудь видели это решение?

Цитата

Есть некоторые компоненты, которые позволяют делать "точечный рефрешь"

Есть, но им нужен ключ для рефреша. Вкратце, они делают запрос типа "select * from TABLE where ID = :Key"

Цитата

Можно, например так:

Большое спасибо, попробую.
PM MAIL   Вверх
cat512
Дата 13.2.2011, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 7
Всего: 15



Цитата

Я привел пример про документы. Редактировать документ в таблице? Вы где-нибудь видели это решение?

(продолжу на "ты", надеюсь не обидишься)
Ведь ты сам и предложил концепцию редактирования данных через грид smile :
Цитата

Кто должен производить загрузку и сохранение?
...
...
Но есть удобство, когда это делает главная форма. Взять хотя бы ситуацию с добавлением новой записи - если это делает главная форма, не нужно перечитывать весь датасет

Каким образом главная форма (без помощи дочерней), может редактировать данные, как не через грид? Я лишь хотел подчеркнуть тот факт, что при дизайне UI, надо тоже пользоваться принципом "необходимой достаточности". 
PM MAIL   Вверх
sl8er
Дата 13.2.2011, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 14.6.2007

Репутация: нет
Всего: нет



Цитата

Ведь ты сам и предложил концепцию редактирования данных через грид 

Нисколько

Цитата

Ведь ты сам и предложил концепцию редактирования данных через грид 

Я предлагал редактирование через датасет(ы), лежащий на главной форме. Но никак не грид

Цитата

Каким образом главная форма (без помощи дочерней), может редактировать данные, как не через грид? 

Я про грид ни разу и не сказал. На главной форме датасет (или датасеты), она вызывает подчиненную форму, получает каким-то образом оттуда данные и сама производит манипуляцию с ДАТАСЕТОМ (или ДАТАСЕТАМИ). Ни слова о гриде. Он может как быть, так и не быть.

А вот редактирование таких сложных объектов, как документ с табличными частями (Detail-датасеты), в гриде - это уже изврат, ИМХО.
PM MAIL   Вверх
cat512
Дата 13.2.2011, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 7
Всего: 15



Цитата

Я предлагал редактирование через датасет(ы), лежащий на главной форме. Но никак не грид

То есть, главная форма "lдокументов" не содержит элементов управления/отображения? И непредпологает интерактивное взаимодействие с пользователем? Интересно как пользователь будет редактировать данные через датасеты, не имея эл. управления/отображения?
Цитата

На главной форме датасет (или датасеты), она вызывает подчиненную форму

А вот здесь, как раз идёт речь о главной форме вне контекста дочерней!
Цитата

То есть дочерняя форма должна изменять данные и уведомлять об этом главную форму?
Но есть удобство, когда это делает главная форма. Взять хотя бы ситуацию с добавлением новой записи - если это делает главная форма, не нужно перечитывать весь датасет


Цитата

А вот редактирование таких сложных объектов, как документ с табличными частями (Detail-датасеты), в гриде - это уже изврат, ИМХО.

То есть это я предложил редактировать данные через грид??? И что означает выражение "табличная часть"?

.





Это сообщение отредактировал(а) cat512 - 13.2.2011, 11:45
PM MAIL   Вверх
cat512
Дата 13.2.2011, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 7
Всего: 15



Приведу пример, разных вариантов реализации UI
1 MDI интерфейс - форма селектор (документы) с датасетом и акшенами модификации
.                            - модальная/ые форма/ы модификаторы (для конкретных экз. документов) (имеют метод с параметрами (классовый), через которые передаётся информация для точечного рэфреша
2 Более продвинутый (imho боле правильный) вариант
SDI/ MDI (не важно). Все датасеты(комп. доступа) находятся в датамодуле (imho там им и место)
На формах толькр елементы управления/отображения данных. В датасетах перекрыты методы на модификацию данных, которые будут вызывать МОДАЛЬНЫЕ формы модификаторы. Причём в этом случае мы имеем один датасет, как для selecta, так и для update. Соответственно проблема, шаринга данных
между формами исчезает.


Это сообщение отредактировал(а) cat512 - 13.2.2011, 12:29
PM MAIL   Вверх
sl8er
Дата 13.2.2011, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 14.6.2007

Репутация: нет
Всего: нет



Цитата

То есть, главная форма "lдокументов" не содержит элементов управления/отображения?

Для удобства должна содержать. Если говорить именно о функционале - не обязана. Я могу просто явно передать, допустим, ID нужной записи в дочернюю форму. Его может быть и не будет видно на главной.

Цитата

А вот здесь, как раз идёт речь о главной форме вне контекста дочерней!

Я не понял.

Цитата

То есть это я предложил редактировать данные через грид???

Про грид никто не предлагал. Вы просто первым его упомянули. Но грид здесь явно не причем.

Цитата

2 Более продвинутый (imho боле правильный) вариант

Если пользователь захочет открыть два окна, которые содержат данные, находящиеся в одном датасете?
PM MAIL   Вверх
cat512
Дата 13.2.2011, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 7
Всего: 15



Цитата

Если пользователь захочет открыть два окна, которые содержат данные, находящиеся в одном датасете?

1.Ну ты же наверное "внимательно" прочитал, что в описаных вариантах речь идёт о модальных окнах? А значит, открыть два окна на редактирование данных, он физически не сможет.
2 В случае с MDI интерфейсом (SDI - вообще идеальный вариант), НАЗДАРОВЬЕ, пусть открывает хоть 2000 окон - селекторов (не вижу проблемы разделения даннх в ел. управления от одного датасета)только толку от такого количества открытых форм?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0641 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.