Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Взаимодействие форм


Страницы:   1 2 3 4

ВашеИмя ©   (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] вызывает сомнения в правильности проектирования.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо