Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.05.22;
Скачать: [xml.tar.bz2];

Вниз

Взаимодействие форм   Найти похожие ветки 

 
ВашеИмя   (2011-02-11 09:44) [0]

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

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

Короче, запутался. Не могли бы поделиться опытом? Если с примерами, так вообще замечательно.


 
Anatoly Podgoretsky ©   (2011-02-11 10:14) [1]

> ВашеИмя  (11.02.2011 09:44:00)  [0]

Мы такие завязки между формами не делаем, плохо кончится.


 
ВашеИмя   (2011-02-11 10:59) [2]

[1] Расскажите ваш подход?


 
Anatoly Podgoretsky ©   (2011-02-11 11:29) [3]

> ВашеИмя  (11.02.2011 10:59:02)  [2]

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


 
ВашеИмя   (2011-02-12 04:57) [4]


> Anatoly Podgoretsky ©   (11.02.11 11:29) [3]

Абсолютно верно. Я спрашиваю о том, как правильно передавать данные из подчиненной формы в главную. Кто должен делать инициализацию подчиненной формы? Кто должен делать сохранение?


 
Германн ©   (2011-02-12 05:18) [5]


> ВашеИмя   (12.02.11 04:57) [4]
>
>
> > Anatoly Podgoretsky ©   (11.02.11 11:29) [3]
>
> Абсолютно верно. Я спрашиваю о том, как правильно передавать
> данные из подчиненной формы в главную. Кто должен делать
> инициализацию подчиненной формы? Кто должен делать сохранение?
>
>

Главная форма.
"немодальность" формы [2] вызывает сомнения в правильности проектирования.


 
KilkennyCat ©   (2011-02-12 05:27) [6]

а что, нельзя всякие там дбгриды на вторых формах настроить на общий всякий там датасет на главной форме?


 
KilkennyCat ©   (2011-02-12 05:29) [7]


> Германн ©   (12.02.11 05:18) [5]
> "немодальность" формы [2] вызывает сомнения в правильности
> проектирования

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


 
ВашеИмя   (2011-02-12 07:41) [8]


> "немодальность" формы [2] вызывает сомнения в правильности
> проектирования.

А если надо открыть два разных документа в разных окнах?


> а что, нельзя всякие там дбгриды на вторых формах настроить
> на общий всякий там датасет на главной форме?

Главная форма отображает один датасет (документы), а к нему может быть несколько табличных частей. Вы предлагаете их грузить в главной форме? Это первое. Второе - а если я захочу открытие нескольких документов?


 
Anatoly Podgoretsky ©   (2011-02-12 10:08) [9]

> ВашеИмя  (12.02.2011 04:57:04)  [4]

Пусть главная забирает из подчиненой и постулат про знания не будет нарушен


 
Anatoly Podgoretsky ©   (2011-02-12 10:11) [10]

> KilkennyCat  (12.02.2011 05:29:07)  [7]

Обнаружит не ее, а сотню форм и будет чесать в затылке, что же теперь
делать!


 
_Юрий   (2011-02-12 10:11) [11]


> Германн ©   (12.02.11 05:18) [5]


> Главная форма.
> "немодальность" формы [2] вызывает сомнения в правильности
> проектирования.


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


> ВашеИмя   (11.02.11 09:44)  
> При закрытии формы [2] происходит сохранение в форме [1].



Видимо, таких связей быть не должно, и сохранение должно проводиться в форме 2. Ничто не мешает ей помнить "ParentID", и сохраняться самостоятельно.
С калбеками дурной путь, верно Анатолий говорит


 
ВашеИмя   (2011-02-12 10:16) [12]


> Пусть главная забирает из подчиненой и постулат про знания
> не будет нарушен

Если сохранение в форме [1]: каким образом главная должна забрать из подчиненной?


> Видимо, таких связей быть не должно, и сохранение должно
> проводиться в форме 2. Ничто не мешает ей помнить "ParentID",
>  и сохраняться самостоятельно.

Если сохранение в форме [2]: каким образом сообщить что главная должна обновить список документов (причем не весь, а только конкретную строку)?


 
_Юрий   (2011-02-12 10:23) [13]


> Если сохранение в форме [2]: каким образом сообщить что
> главная должна обновить список документов (причем не весь,
>  а только конкретную строку)?


Отправить нотификацию. Например, сообщение (PostMessage). Какой именно документ обновился - передать в параметре сообщения.
Или СallBack


 
_Юрий   (2011-02-12 10:29) [14]

Или подписка.
Форма2 регистрирует подписчиков на изменения (в общем случае, список).
Когда проходит изменение, форма 2 отправляет нотификацию всем подписчикам по списку, в том числе и форме1, которая ранее подписалась на прослушивание.
При этом форма 2 не знает, кто подписчик.
А что такое подписчик - это может быть интерфейс


 
Anatoly Podgoretsky ©   (2011-02-12 10:52) [15]

> _Юрий  (12.02.2011 10:11:11)  [11]

Браузер показывает или во вкладках или в отдельном экземпляре, отсюда
выходит аналогия с ним, надо запустить второй экземпляр или сделать
приложение со вкладками.


 
Anatoly Podgoretsky ©   (2011-02-12 10:54) [16]

> ВашеИмя  (12.02.2011 10:16:12)  [12]

Противоположным помещению, а это мы не обсуждали, приводи код, укажем как
обратно забирать. Но в обем формула простая B = A, A = B


 
Anatoly Podgoretsky ©   (2011-02-12 10:56) [17]

> _Юрий  (12.02.2011 10:23:13)  [13]

СallBack это другой механизм и должен использоваться по назначению, а не для
закрытия формы, это и так известно для модальных форм.
А для немодальных тогда придется делать два СallBack :-) Ведь надо же
сообщить, что я забрал, можешь закрываться.


 
Anatoly Podgoretsky ©   (2011-02-12 10:57) [18]

> _Юрий  (12.02.2011 10:29:14)  [14]

Может тогда стоит применить Веб сервер или трехзвенку


 
!!!   (2011-02-12 11:04) [19]


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

Просматривать несколько документов дело вполне нормальное, но править?
А просматривать одновременно несколько однотипных документов удобнее в табличке.
Много не модальных табличек для просмотра и модальные окна для редактирования/создания чем плохо то?

По профессии аудитор, на работе около 10 систем, одна именно такая, на мой взгляд из всех имеющихся самая удобная, бывает что у меня открыто до 15 табличек, но я только просматриваю, однако когда беседую с бухами, то они заявляют, что сделано удобно и как правило они смотрят на документы из табличек, а для редактирования открывают формы редактирования.


 
ВашеИмя   (2011-02-12 11:04) [20]


> _Юрий   (12.02.11 10:29) [14]

а) Где бы пример посмотреть?
б) На каждую форму придется создавать свой подписчик?


 
ВашеИмя   (2011-02-12 11:12) [21]


> Противоположным помещению, а это мы не обсуждали, приводи
> код, укажем как
> обратно забирать

Ну опять же два варианта.
а) Загружает дочерняя форма
В дочерней форме объявлена процедура, которую вызывает главная форма
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:15) [22]


> Просматривать несколько документов дело вполне нормальное,
>  но править?

Окна могут быть неоднородными. Могут быть открыты: счет-фактура, договор, карточка контрагента. Если одно из них будет модальным - будет неудобно. Если говорить об однородном списке - тогда, возможно, ваше мнение имеет смысл.


> одна именно такая, на мой взгляд из всех имеющихся самая
> удобная

Самописная или можно где-то посмотреть?


 
ВашеИмя   (2011-02-12 11:18) [23]

+ [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:35) [24]


> Окна могут быть неоднородными. Могут быть открыты: счет-
> фактура, договор, карточка контрагента. Если одно из них
> будет модальным - будет неудобно. Если говорить об однородном
> списке - тогда, возможно, ваше мнение имеет смысл.


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


> Самописная или можно где-то посмотреть?

приобретенная, мы сами ни чего не производим.
называется БИК IBSO, где посмотреть не знаю :-(


 
!!!   (2011-02-12 11:37) [25]


> Окна могут быть неоднородными. Могут быть открыты: счет-
> фактура, договор, карточка контрагента. Если одно из них
> будет модальным - будет неудобно. Если говорить об однородном
> списке - тогда, возможно, ваше мнение имеет смысл.


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


> Самописная или можно где-то посмотреть?

приобретенная, мы сами ни чего не производим.
называется БИК IBSO, где посмотреть не знаю :-(


 
ВашеИмя   (2011-02-12 11:39) [26]


> ну модальное окно нужно только для того чтобы внести изменения

То есть при редактировании счет-фактуры никогда не понадобится посмотреть карточку контрагента? Никогда не поверю.


то можно октрыть еще один экземпляр?

Окно конкретного документа должно быть открыто один раз. Если пользователь пытается открыть его снова - необходимо не создавать новое окно, а сфокусироваться на нем.


 
!!!   (2011-02-12 14:44) [27]


> То есть при редактировании счет-фактуры никогда не понадобится
> посмотреть карточку контрагента? Никогда не поверю


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

посмотрели и закрыли, в чем проблема-то :-)


 
Сергей М. ©   (2011-02-12 14:52) [28]


> один датасет (документы), а к нему может быть несколько
> табличных частей


Не знаю как других, а меня всегда тошнило от дебильной одноэсной терминологии  "журнал" и "табличная часть".

Можно подумать что "журнал" - это нечто волшебное, непостигаемое, но никак не таблично-ориентированные данные.

Фтопку.


 
KilkennyCat ©   (2011-02-12 15:56) [29]

а меня всегда тошнило от одноэс в целом. да и сейчас тоже.


 
Anatoly Podgoretsky ©   (2011-02-12 17:10) [30]

> KilkennyCat  (12.02.2011 15:56:29)  [29]

А я и близко не подхожу, что бы не тошнило.


 
_Юрий   (2011-02-12 18:27) [31]


> !!!   (12.02.11 14:44) [27]


> Если при редактировании счета-фактуры нужно посмотреть информацию
> о контрагенте, то значит из этой формы должен быть доступ
> к списку контрагентов, из одной модальной формы, можно же
> открыть другую.
>
> посмотрели и закрыли, в чем проблема-то :-)


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

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


 
Anatoly Podgoretsky ©   (2011-02-12 19:04) [32]

> _Юрий  (12.02.2011 18:27:31)  [31]

Но некоторые особо стойкие открыли одну форму, затем вторую, потом десятую и
это все одна и таже форма.


 
Anatoly Podgoretsky ©   (2011-02-12 19:05) [33]

> _Юрий  (12.02.2011 18:27:31)  [31]

Не только пользователь, но еще и _Юрий


 
ВашеИмя   (2011-02-13 02:15) [34]


> Не знаю как других, а меня всегда тошнило от дебильной одноэсной
> терминологии  "журнал" и "табличная часть".

Хорошо, Detail-датасет. Извините, что тошнит :)


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

Форма уже открыта, зачем открывать новую

Вопрос про PostMessage/SendMessage: можно ли помимо сообщения передать свою структуру или класс?


> Anatoly Podgoretsky ©   (12.02.11 19:04) [32]

Я уже писал о том, что если форма с этими данными уже открыта - она должна быть сфокусирована, а не создана заново.


 
_Юрий   (2011-02-13 10:44) [35]


> Anatoly Podgoretsky ©   (12.02.11 19:05) [33]
>
> > _Юрий  (12.02.2011 18:27:31)  [31]
>
> Не только пользователь, но еще и _Юрий
>


Я пересказал то, что мне поведали пользователи


> Вопрос про PostMessage/SendMessage: можно ли помимо сообщения
> передать свою структуру или класс?
>


В качестве параметра сообщения может быть передан указатель на что угодно - хоть на структуру, хоть на класс

отправка:
PostMessage(Handle, WM_USER + 1, 0, Lparam(MyObject));
...

прием:
MyObject = TMyObject(message.Lparam)


 
Anatoly Podgoretsky ©   (2011-02-13 11:11) [36]


> ВашеИмя   (13.02.11 02:15) [34]
> > Anatoly Podgoretsky ©   (12.02.11 19:04) [32]
>
> Я уже писал о том, что если форма с этими данными уже открыта
> - она должна быть сфокусирована, а не создана заново.


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


 
Юрий Зотов ©   (2011-02-13 11:25) [37]


> _Юрий   (12.02.11 18:27) [31]

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

Восхищен глубиной Ваших знаний и точностью оценок как парадигм, так и людей.

Хотя со второй (не процитированной здесь) частью Вашего сообщения можно и согласиться (не для диалогов, конечно).

Но первая, процитированная - это шедевр.


 
ВашеИмя   (2011-02-13 11:50) [38]


> Не убивай идею на корню

Тогда все-таки подскажите, посмотрев на мой код, как манипулировать данными?


 
Anatoly Podgoretsky ©   (2011-02-13 12:13) [39]

> ВашеИмя  (13.02.2011 11:50:38)  [38]

Мне идея не нравится.


 
ВашеИмя   (2011-02-13 12:16) [40]


> Anatoly Podgoretsky ©   (13.02.11 12:13) [39]

Ну я в самом начале спрашивал, а как верно? Но спор идет, а ясности очень мало.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.05.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.007 c
2-1297715273
Чайник
2011-02-14 23:27
2011.05.22
Настройка Д2010


2-1297232556
SKIPtr
2011-02-09 09:22
2011.05.22
переключение между TEdit


15-1296941377
Юрий
2011-02-06 00:29
2011.05.22
С днем рождения ! 6 февраля 2011 воскресенье


2-1297437090
NieL
2011-02-11 18:11
2011.05.22
Out of memory while expanding memory stream


15-1296654994
pavel_guzhanov
2011-02-02 16:56
2011.05.22
Конференция по FastReport. Может быть кого-нибудь заинтересует?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский