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

Вниз

Как лучше осуществить обновления данных в формах?   Найти похожие ветки 

 
девушка   (2008-12-24 10:29) [0]

Добрый день!

В приложении часто встречаются формы, котороые связаны между собой некими общими данными.
Например,
FormCustomerList - список клиентов.
FormCustomerEdit - форма для редактирования конкретного клиента.
Обе формы создаются динамически.

FormCustomerEdit  вызывается из метода формы FormCustomerList.

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

Что делать, если FormCustomerEdit  не модальная?

У меня возникает только идея передать ей указатель на форму
FormCustomerList. Но форма FormCustomerList может быть уничтожена раньше FormCustomerEdit...


 
Palladin ©   (2008-12-24 10:33) [1]

ну один из способов общения форм это сообщения


 
Сергей М. ©   (2008-12-24 10:35) [2]

Если обе формы используют одни и те же экз-ры связок Dataset <- DataSource, то никаких дополнительных телодвижений предпринимать не нужно.


 
девушка   (2008-12-24 10:36) [3]


> Если обе формы используют одни и те же экз-ры связок Dataset
> <- DataSource, то никаких дополнительных телодвижений предпринимать
> не нужно

Это не так.


 
Медвежонок Пятачок ©   (2008-12-24 10:37) [4]

У меня возникает только идея передать ей указатель на форму

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


 
девушка   (2008-12-24 10:38) [5]

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


 
Медвежонок Пятачок ©   (2008-12-24 10:39) [6]

как вариант посылать мессадж по всему списку мдичайлдов


 
Сергей М. ©   (2008-12-24 10:41) [7]


> Это не так


Ну сделай так.
Этому что-то мешает ?


 
Медвежонок Пятачок ©   (2008-12-24 10:43) [8]

>Ну сделай так.
это эназе бад айдиа

:)


 
девушка   (2008-12-24 10:59) [9]


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


поидее можно и без мессаждей.
все формы являются наследниками одного класса, где есть метод RefreshData.
перегружаем этот метод в MDIMAin: RefreshData(ClassName:string);

ChildForm после сохранения данных :


TMDIMain(ChildForm.Owner).RefreshData(ChildForm.ClassName);


Далее проходимся по MDIChildren и в зависимости от класса - вызываем RefreshData...

?


 
Медвежонок Пятачок ©   (2008-12-24 11:20) [10]

вся разница будет только в замораживании интерфейса во время нажатия close на модальной


 
девушка   (2008-12-24 11:54) [11]


> вся разница будет только в замораживании интерфейса во время
> нажатия close на модальной


кстати, да.

Т.е. на данном этапе можно в базовом классе добавить еще метод
SendRefreshDataQuery(ClassName:string).

И писать там хоть через сообщения, хоть через оунера...


 
Медвежонок Пятачок ©   (2008-12-24 11:57) [12]

SendRefreshDataQuery(ClassName:string).

зачем так сурово?

просто разослать сообщения во все мдичайды.
конкретных получателей кому рефрешить настало время закодировать в параметрах


 
девушка   (2008-12-24 12:02) [13]


> просто разослать сообщения во все мдичайды.
> конкретных получателей кому рефрешить настало время закодировать
> в параметрах


ок :)


 
девушка   (2008-12-24 12:38) [14]

офигеть - работает!

в качесте WParam посылаю константу - имя рабочего программы (По состоит из несокольких рабочих мест) в качестве LParam - константу "вида" формы - форма редактирования данны, форма выбора данных и т.д.

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


 
MsGuns ©   (2008-12-24 12:44) [15]

Попытка передачи данных от одной дочки другой напрямую рано или поздно неминуемо приведет к граблям
Избежать этого достаточно просто - в одном из перманетных юнитов (например датамодуле) объявить объекты - буферы (например, дескрипторы записей таблиц БД), а сам модуль объявить в дочках в интерфейсной части. Когда одна дочка хочет передать обновленную запись другой дочке, она просто переписывает содержимое полей целевой записи в дескриптор датамодуля и вызывает соотв. функцию, например, через акшн. В обработчике экшна определяется форма-"получатель" обновленной записи и вызывается соотв-й метод этой формы.
Все экшины ессно прописаны в гл.форме.
По сути это та же система сообщений "дочка-мама-дочка",  но выполненная "прозрачно" :) Правда по сравнению с "чистыми" сообщениями такая технология имеет некоторый минус - мама должна позаботиться о вызове НУЖНОГО метода дочки, а это не совсем по-джидайски :) По идее мама ничего не должна знать о функционале своих дочек - ее дело "ловить" сообщения и переправлять их активной или иной заведомо известной дочке (в вашем случае указатель на дочку-инициатор вызова другой дочки надо поместить опять-таки в некоторое общедоступное место, хоть в тот же датамодуль)

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


 
девушка   (2008-12-24 12:59) [16]

to MsGuns ©   (24.12.08 12:44) [15]
Не поняла чем принципиально отличается от  [9]  ?


 
MsGuns ©   (2008-12-24 14:19) [17]

>девушка   (24.12.08 12:59) [16]
>Не поняла чем принципиально отличается от  [9]  ?

 Например вот этим ?

>Далее проходимся по MDIChildren и в зависимости от класса - вызываем RefreshData...

Зачем рефрешить ВСЕ открытые датасеты ?


 
Игорь Шевченко ©   (2008-12-24 14:25) [18]


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


система однопользовательская ?


 
девушка   (2008-12-24 15:02) [19]


> Зачем рефрешить ВСЕ открытые датасеты ?

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


> система однопользовательская ?

нет


 
девушка   (2008-12-24 15:10) [20]

По-идее не стоит использовать имя класса в качестве признака. по которому надо рефрешить форму.
Просто надо создать перечислимый тип параметров событий (передавать их через LParam или WParam, или сразу в процедуру дочки для [15] ) и в кажой форме прописать реакцией на какие виды событий надо делать обновление.


 
Игорь Шевченко ©   (2008-12-24 15:41) [21]

девушка   (24.12.08 15:02) [19]


> > система однопользовательская ?
>
> нет


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


 
Sergey13 ©   (2008-12-24 16:00) [22]

Читаю, и не могу избавиться от ощущения, что сама тема сформулирована странно.

> Как лучше осуществить обновления данных в формах?

Данные хранятся в таблицах БД (я так понял что про них идет речь?), за них отвечает датасет. При чем тут формы вообще?

> [0] девушка   (24.12.08 10:29)

А по лигике работы могут быть открыты несколько списков клиентов и одновременно редактироваться несколько клиентов в каждом? Что-то я с трудом представляю такую потребность.

ИМХО
> [2] Сергей М. ©   (24.12.08 10:35)

предложил более правильный путь.


 
Медвежонок Пятачок ©   (2008-12-24 16:05) [23]

Что-то я с трудом

Да элементарно, ватсон.

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

реквизиты считываются один раз при создани мдичайлд окна документов.

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


 
Sergey13 ©   (2008-12-24 16:31) [24]

> [23] Медвежонок Пятачок ©   (24.12.08 16:05)
> при рождении документа часть атрибутов идет из справочника предприятий.

Они переписываются в документ? А смысл, если они динамически присоединяются в запросе?


 
девушка   (2008-12-24 16:32) [25]


> Читаю, и не могу избавиться от ощущения, что сама тема сформулирована
> странно.

Вполне возможно...

Приложение MDI. Например, есть форма "Список клиентов" c датасетом содержащим запрос на выбор списка клиентов (например в этом запросе полей 20).
Есть отдельная форма для редактирования клиента. В ней уже выбирается полей 50 для выбраного клиента + еще всякие связные и развязные таблицы и т.д.

Форма редактирования клиента используется также для просмотра данных о клиенте -  не модальная.  Если бы она была модальной, то мы не смогли бы просмотреть данные по нескольким клиентам одновременно.
Когда пользователь редактирует данные по клиенту, он может изменить часть полей, которые видны в "Списке клиентов", поэтому после редактирования, в форме "Список клиентов" надо обновить данные.


 
Медвежонок Пятачок ©   (2008-12-24 16:32) [26]

Ну не всегда.

сегодня ты "ООО Рога и копыта" и создаешь платежку.
а завтра ты "ОАО Копыта и рога" и снова создаешь платежку.

вчерашняя должна остаться с плательщиком "ООО Рога и копыта"


 
девушка   (2008-12-24 16:37) [27]

в догонку к [25]

в некоторый системах можно даже увидеть 2 пункта меню для таких действий.

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


 
Sergey13 ©   (2008-12-24 16:42) [28]

> [26] Медвежонок Пятачок ©   (24.12.08 16:32)

Этот пример не в тему. Это проблема версионности данных и решается она по другому.

> [27] девушка   (24.12.08 16:37)
> в некоторый системах можно даже увидеть 2 пункта меню для таких действий.
По моему неплохой вариант.


 
Юрий Зотов ©   (2008-12-24 16:44) [29]

Сделать форму редактирования НЕ дочерней и показывать ее модально. Все проблемы тут же исчезают.


 
девушка   (2008-12-24 16:46) [30]


> > [27] девушка   (24.12.08 16:37)
> > в некоторый системах можно даже увидеть 2 пункта меню
> для таких действий.
> По моему неплохой вариант.


Возможно на нем и остановлюсь


 
девушка   (2008-12-25 06:28) [31]


> Юрий Зотов ©   (24.12.08 16:44) [29]
> Сделать форму редактирования НЕ дочерней и показывать ее
> модально. Все проблемы тут же исчезают.


Почему именно НЕ дочерней? модально можно показывать и дочерню форму...


 
MsGuns ©   (2008-12-25 10:12) [32]

>Юрий Зотов ©   (24.12.08 16:44) [29]
>Сделать форму редактирования НЕ дочерней и показывать ее модально. Все проблемы тут же >исчезают.

Я это и пытался объяснить в 15. К сожалению, был не понят :)

>девушка   (25.12.08 06:28) [31]
>Почему именно НЕ дочерней? модально можно показывать и дочерню форму...

 Это достигается достаточно сложным способом, сильно "утяжеляющим" код (надо отлавливать кучу событий и проверять кучу условий)

Представьте такую вполне реальную ситуацию:
пользователь открывает несколько экземляров "основной" таблицы, например, списка платежей (например за разные периоды или отсортированные по разным колонкам, что вполне может быть)
Затем он открывает из одной формы списка одну платежку для просмотра, из другой - другую. Затем ему необходимо посмотреть данные о клиенте и он открывает карточку клиента. Все - дочерние немодальные окна. Теперь ему надо откорректиировать карточку клиента. Теперь вопрос - в контексте какого конкретно окна он это делает ? На экране туча окон, корректируется запись в одном - к какому именно окну следует применить перечитку данных после завершения редактирования ? Другими словами - КТО НА КОМ СТОИТ ?
Мало того, что чрезвычайно сложно корректно реализовать такой запутанный интерфейс, так еще и работать с такой программулиной будет невозможно из-за постоянно возникающей путаницы.

Вы, ИМХО, придумали себе искусственную проблему и пытаетесь ее решить хитромудрыми способами.

И еще, мне лично совершенно не понятно зачем пользователю ОДНОВРЕМЕННО две открытые карточки, например, контрагента (Ваша фраза "Если бы она была модальной, то мы не смогли бы просмотреть данные по нескольким клиентам одновременно") ? Для обзора клиентов должна быть списковая (табличная) форма, которая не редактируется.
Практика настоятельно рекомендует при проектировании пользовательских интерфейсов использовать как можно более простые схемы, не дающие пользователю "богатого" выбора ибо это будет приводить к путанице и ошибкам. Если пользователь начал редактировать запись, то он ДОЛЖЕН завершить это редактирование прежде чем будет предпринимать какие-либо другие действия. Для этого наилучшим способом является модальные формы, которые и придуманы именно для этих целей.

И еще. В результате достаточно большой практики я пришел к выводу, что МДИ-интерфейс следует использовать в очень немногих случаях, например, когда нужно иметь возможность открывать одновременно несколько форм одного класса либо вынести управление в главную форму из дочерних. В бухгалтерских и управленческих задачах такая потребность встречается крайне редко. Хотя бы потому, что 99 из 100 "средних" бухгалтеров (экономистов, плановиков, технологов и т.д.) весьма проблематично работать с несколькими формами одновременно, а функционал каждой из форм весьма специфичен.


 
Юрий Зотов ©   (2008-12-25 17:57) [33]

> девушка   (25.12.08 06:28) [31]

> Почему именно НЕ дочерней?
Чтобы ее можно было показывать модально.

> модально можно показывать и дочерню форму...
Попробуйте. И для начала попробуйте вообще создать невидимую дочернюю форму (чтобы вообще было что модально показывать).

====================

> Форма редактирования клиента используется также для просмотра данных
> о клиенте

Нет проблем:

Frm := TMyForm.Create(Application); // с FormStyle = fsNormal
if EditMode then
 try
   if Frm.ShowModal = mrOK then
   begin
     ...
   end
 finally
   Frm.Free
 end
else
 Frm.FormStyle := fsMDIChild;



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

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

Наверх





Память: 0.56 MB
Время: 0.005 c
2-1229921494
Golden
2008-12-22 07:51
2009.02.08
Delphi + excel


15-1229320470
desc
2008-12-15 08:54
2009.02.08
FloatToStr


6-1198580653
Lamer666
2007-12-25 14:04
2009.02.08
POST c авторизацией на WEB по HTTPS


2-1230109962
NieL
2008-12-24 12:12
2009.02.08
Траблы с формой (Width)


15-1229096167
NailMan
2008-12-12 18:36
2009.02.08
Как упростить Start/Stop сервисов в Win?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский