Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Обращение к дочерней форме MDI из модальной.


Автор: AlexV1 26.2.2003, 15:47
Есть приложение MDI, в котором главная форма frmMain (fsMDIForm),
дочерняя форма frmChld1 (fsMDIChild) и третья - не главная и не дочерняя,
а совершенно отдельная форма frmMyDialog (fsNormal).
Форма frmMyDialog вызывается из frmChld1 по кнопке. Затем из frmMyDialog нужно
обратиться к контролу lblTitle формы frmChld1. Как это правильно сделать ?
Если так:
frmChld1.lblTitle.caption:=...,
то во время выполнения программы выдает Access Violation ...
Может через главную форму frmMain типа
frmMain.Children[1].lblTitle.caption:=...
Но так нельзя, не находит lblTitle.

Автор: SmaLL 26.2.2003, 17:08
Цитата(AlexV1 @ 26.2.2003, 07:47)

Может через главную форму frmMain типа
frmMain.Children[1].lblTitle.caption:=...
Но так нельзя, не находит lblTitle.

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

(frmMain.Children[1] as TfsMDIChild).lblTitle.caption:=...

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

Автор: AlexV1 26.2.2003, 17:15
Цитата
(frmMain.Children[1] as TfsMDIChild).lblTitle.caption:=...


Так уже пробовал. Не работает

Автор: SmaLL 26.2.2003, 17:25
Тебе обязательно из модальной формы менять капшн чилдрена?
Может лучше пусть сам чилдрен меняет свой капшн? Пусть модальное окно возвращает какое-нибудь значение после закрытия, а чилдрен будет его брать и совать в свой капшн.

Автор: AlexV1 26.2.2003, 17:44
Лучше бы сразу из модального окна суваться в дочернее.

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

Автор: SmaLL 26.2.2003, 19:29
Цитата(AlexV1 @ 26.2.2003, 09:44)
Лучше бы сразу из модального окна суваться в дочернее.

Конечно лучше - если по быстрому, но это плохой стиль программирования.
А спешка, как говориться нужна при ловле блох. wink.gif
Лучше если модальная форма не будет знать ничего о вызвавшей еЁ дочерней форме.
Если, например, ты захочешь использовать это же модальное окно для настроек какого-нибудь другой дочерней формы, то модальная форма должна будет знать обо всех дочерних формах. А это лишний код, низкая гибкость и т.д. и т.п.
Цитата
Если перестроить логику программы, то как ?
Есть гл.форма MDI и несколько дочерних окон.
В одной из дочерних окон нужно сделать кнопку вызова модальной формы настроек, причем изменение настроек в модальной форме должны тут же отображаться в дочерней форме, из которой была вызвана форма настроек.

Например можно завести в модальной форме свойство типа TString, и в него, например, при закрытии формы совать значения твоих настроек:
Код

Pref.Values['caption']:= 'Caption from modal window';
Pref.Values['PosX']:= '10';
Pref.Values['PosY']:= '15';
.....

Потом в дочерней форме после вызова модальной формы можно прочитать эти значения:
Код

 MDIChild.Caption:= Values['caption'];
 MDIChild.Left:= Values['PosX'];
 MDIChild.Top:= Values['PosY'];
...

Автор: AlexV1 26.2.2003, 20:22
ok. Понятно.
Thanks!

Автор: Il'ya 27.2.2003, 03:05
Вопрос где USES. :-)

Автор: Sluggard 23.4.2003, 22:21
К дочернему окну можно обратится из любого окна можно по имени, номеру или к актвному (это чаще всего)

if not (ActiveMDIChild = Nil) then
if ActiveMDIChild is TMDIChild then
with TMDIChild(ActiveMDIChild) do
begin
// Давайте запишем что нибудь в активную форму
end;

Автор: Dapo 24.4.2003, 01:35
Цитата(SmaLL @ 26.2.2003, 16:29)
....
Если, например, ты захочешь использовать это же модальное окно для настроек какого-нибудь другой дочерней формы, то модальная форма должна будет знать обо всех дочерних формах. А это лишний код, низкая гибкость и т.д. и т.п.
....

Надо полагать, что форма настроек у тебя создается динамически? Может такой вариант: При создании формы указываешь ей в качестве Owner-a ту форму настройки которой хочешь изменить... И через Owner влияешь... :-) Чем плохо? Нет лишнего кода и гибко.

Автор: Dapo 24.4.2003, 01:40
Я цитировал Small-a потому что не согласен по поводу "...должна знать обо всех дочерних формах...". Извиняюсь за лишний топ.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)