![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Взаимодействие форм
ВашеИмя © (2011-02-11 09:44:00)Расскажите, как надо:
Есть форма [1] (допустим, отображение документов), она вызывает немодальную форму [2] конкретного документа (который имеет свои табличные части). При открытии формы [2] должны быть загружены, допустим, 2 датасета (формы и табличной части Товары). При закрытии формы [2] происходит сохранение в форме [1]. При том что из одной формы [1] могут быть открыты несколько форм [2], и форма [1] должна верно обработать оба события от формы [2]. Как верно это реализовывать?
Пробовал через callback-функции. Процедуры загрузки и сохранения должны прописываться в какой из форм? Подозреваю, что в форме [1]. Тогда как передать нужные данные из формы [2]?
Короче, запутался. Не могли бы поделиться опытом? Если с примерами, так вообще замечательно.
!!! (2011-02-12 11:35:00) [41]
> Окна могут быть неоднородными. Могут быть открыты: счет-
> фактура, договор, карточка контрагента. Если одно из них
> будет модальным - будет неудобно. Если говорить об однородном
> списке - тогда, возможно, ваше мнение имеет смысл.
ну модальное окно нужно только для того чтобы внести изменения, а смысл открыть окрыть окно для изменений, изменения не вносить, бросить его, перейти к другому, а потом если его не найти, то можно октрыть еще один экземпляр?
вся остальная информация на просмотр доступна в таблицах.
> Самописная или можно где-то посмотреть?
приобретенная, мы сами ни чего не производим.
называется БИК IBSO, где посмотреть не знаю :-(
ВашеИмя (2011-02-12 11:18:00) [42]+ [21]
Зря скопировал. Поправлюсь
б) Загружает главная форма (чем мне нравится этот подход - можно использовать виртуальные датасеты типа VirtualTable, делать пишущие транзакции короткими и что-нибудь еще)
with TfrmGoods.Create(Self) do
begin
with DataSetDoc do
begin
Close;
ParamByName('ID').Value := MainDataSet.FieldByName('ID').Value;
Open;
end;
with DataSetGoods do
begin
Close;
ParamByName('ID').Value := MainDataSet.FieldByName('ID').Value;
Open;
end;
end;
ВашеИмя (2011-02-12 11:15:00) [43]
> Просматривать несколько документов дело вполне нормальное,
> но править?
Окна могут быть неоднородными. Могут быть открыты: счет-фактура, договор, карточка контрагента. Если одно из них будет модальным - будет неудобно. Если говорить об однородном списке - тогда, возможно, ваше мнение имеет смысл.
> одна именно такая, на мой взгляд из всех имеющихся самая
> удобная
Самописная или можно где-то посмотреть?
ВашеИмя (2011-02-12 11:12:00) [44]
> Противоположным помещению, а это мы не обсуждали, приводи
> код, укажем как
> обратно забирать
Ну опять же два варианта.
а) Загружает дочерняя форма
В дочерней форме объявлена процедура, которую вызывает главная форма
procedure ShowGoods(Sender: TObject; DataSet: TDataSet);
begin
with TfrmGoods.Create(Sender) do
begin
FIdDoc := DataSet.FieldByName('ID').AsVariant;
with DataSetDoc do
begin
Close;
ParamByName('ID').Value := FIdDoc;
Open;
end;
with DataSetGoods do
begin
Close;
ParamByName('ID').Value := FIdDoc;
Open;
end;
end;
end;
б) Загружает главная форма (чем мне нравится этот подход - можно использовать виртуальные датасеты типа VirtualTable, делать пишущие транзакции короткими и что-нибудь еще)
with TfrmGoods.Create(Self) do
begin
with DataSetDoc do
begin
Close;
ParamByName('ID').Value := FIdDoc;
Open;
end;
with DataSetGoods do
begin
Close;
ParamByName('ID').Value := FIdDoc;
Open;
end;
end;
ВашеИмя (2011-02-12 11:04:00) [45]
> _Юрий (12.02.11 10:29) [14]
а) Где бы пример посмотреть?
б) На каждую форму придется создавать свой подписчик?
!!! (2011-02-12 11:04:00) [46]
> Вы уже неоднократно высказывались тут в пользу модальных
> форм. Имею заявить, что с точки зрения пользователя это
> в абсолютном большинстве случаев катастрофически неудобно.
> Представьте себе, что вы работаете с документами на столе,
> и чтобы открыть один документ, вынуждены закрыть другой.
> Или что у вас браузер одновременно показывает только одну
> страницу, а чтобы открыть другую, надо закрыть первую.Зато
> для программиста это весьма удобно, не возникает вопросов,
> описанных у автора. Кому что важнее.
Просматривать несколько документов дело вполне нормальное, но править?
А просматривать одновременно несколько однотипных документов удобнее в табличке.
Много не модальных табличек для просмотра и модальные окна для редактирования/создания чем плохо то?
По профессии аудитор, на работе около 10 систем, одна именно такая, на мой взгляд из всех имеющихся самая удобная, бывает что у меня открыто до 15 табличек, но я только просматриваю, однако когда беседую с бухами, то они заявляют, что сделано удобно и как правило они смотрят на документы из табличек, а для редактирования открывают формы редактирования.
Anatoly Podgoretsky (2011-02-12 10:57:00) [47]> _Юрий (12.02.2011 10:29:14) [14]
Может тогда стоит применить Веб сервер или трехзвенку
Anatoly Podgoretsky (2011-02-12 10:56:00) [48]> _Юрий (12.02.2011 10:23:13) [13]
СallBack это другой механизм и должен использоваться по назначению, а не для
закрытия формы, это и так известно для модальных форм.
А для немодальных тогда придется делать два СallBack :-) Ведь надо же
сообщить, что я забрал, можешь закрываться.
Anatoly Podgoretsky (2011-02-12 10:54:00) [49]> ВашеИмя (12.02.2011 10:16:12) [12]
Противоположным помещению, а это мы не обсуждали, приводи код, укажем как
обратно забирать. Но в обем формула простая B = A, A = B
Anatoly Podgoretsky (2011-02-12 10:52:00) [50]> _Юрий (12.02.2011 10:11:11) [11]
Браузер показывает или во вкладках или в отдельном экземпляре, отсюда
выходит аналогия с ним, надо запустить второй экземпляр или сделать
приложение со вкладками.
_Юрий (2011-02-12 10:29:00) [51]Или подписка.
Форма2 регистрирует подписчиков на изменения (в общем случае, список).
Когда проходит изменение, форма 2 отправляет нотификацию всем подписчикам по списку, в том числе и форме1, которая ранее подписалась на прослушивание.
При этом форма 2 не знает, кто подписчик.
А что такое подписчик - это может быть интерфейс
_Юрий (2011-02-12 10:23:00) [52]
> Если сохранение в форме [2]: каким образом сообщить что
> главная должна обновить список документов (причем не весь,
> а только конкретную строку)?
Отправить нотификацию. Например, сообщение (PostMessage). Какой именно документ обновился - передать в параметре сообщения.
Или СallBack
ВашеИмя (2011-02-12 10:16:00) [53]
> Пусть главная забирает из подчиненой и постулат про знания
> не будет нарушен
Если сохранение в форме [1]: каким образом главная должна забрать из подчиненной?
> Видимо, таких связей быть не должно, и сохранение должно
> проводиться в форме 2. Ничто не мешает ей помнить "ParentID",
> и сохраняться самостоятельно.
Если сохранение в форме [2]: каким образом сообщить что главная должна обновить список документов (причем не весь, а только конкретную строку)?
_Юрий (2011-02-12 10:11:00) [54]
> Германн © (12.02.11 05:18) [5]
> Главная форма.
> "немодальность" формы [2] вызывает сомнения в правильности
> проектирования.
Вы уже неоднократно высказывались тут в пользу модальных форм. Имею заявить, что с точки зрения пользователя это в абсолютном большинстве случаев катастрофически неудобно. Представьте себе, что вы работаете с документами на столе, и чтобы открыть один документ, вынуждены закрыть другой.
Или что у вас браузер одновременно показывает только одну страницу, а чтобы открыть другую, надо закрыть первую.
Зато для программиста это весьма удобно, не возникает вопросов, описанных у автора. Кому что важнее.
> ВашеИмя (11.02.11 09:44)
> При закрытии формы [2] происходит сохранение в форме [1].
Видимо, таких связей быть не должно, и сохранение должно проводиться в форме 2. Ничто не мешает ей помнить "ParentID", и сохраняться самостоятельно.
С калбеками дурной путь, верно Анатолий говорит
Anatoly Podgoretsky (2011-02-12 10:11:00) [55]> KilkennyCat (12.02.2011 05:29:07) [7]
Обнаружит не ее, а сотню форм и будет чесать в затылке, что же теперь
делать!
Anatoly Podgoretsky (2011-02-12 10:08:00) [56]> ВашеИмя (12.02.2011 04:57:04) [4]
Пусть главная забирает из подчиненой и постулат про знания не будет нарушен
ВашеИмя (2011-02-12 07:41:00) [57]
> "немодальность" формы [2] вызывает сомнения в правильности
> проектирования.
А если надо открыть два разных документа в разных окнах?
> а что, нельзя всякие там дбгриды на вторых формах настроить
> на общий всякий там датасет на главной форме?
Главная форма отображает один датасет (документы), а к нему может быть несколько табличных частей. Вы предлагаете их грузить в главной форме? Это первое. Второе - а если я захочу открытие нескольких документов?
KilkennyCat (2011-02-12 05:29:00) [58]
> Германн © (12.02.11 05:18) [5]
> "немодальность" формы [2] вызывает сомнения в правильности
> проектирования
главное, чтоб ее главная не скрывала. а то обнаружит в конце работы, и стопудово согласно алгоритму ее закрытие вызовет последнее тотальное сохранение данных, которые уже офигительно не те.
KilkennyCat (2011-02-12 05:27:00) [59]а что, нельзя всякие там дбгриды на вторых формах настроить на общий всякий там датасет на главной форме?
Германн (2011-02-12 05:18:00) [60]
> ВашеИмя (12.02.11 04:57) [4]
>
>
> > Anatoly Podgoretsky © (11.02.11 11:29) [3]
>
> Абсолютно верно. Я спрашиваю о том, как правильно передавать
> данные из подчиненной формы в главную. Кто должен делать
> инициализацию подчиненной формы? Кто должен делать сохранение?
>
>
Главная форма.
"немодальность" формы [2] вызывает сомнения в правильности проектирования.