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

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

Вернуть параметр из MDI-Child


sCORpio80 ©   (2005-08-01 13:41:00) 

Помогите,plz. Не могу сообразмить как вернуть параметр из Mdi-дочернего окна.
1. Создаю Mdi-child.
2. Во время работы заполняю свойство в разделе public.
3. Здесь нужно вернуть параметр в вызывающую форму и уничтожить окно.

Немогу это сделать так как при закрытии Action:=caFree; дочернее окно просто уничтожается.
Пробовал так:
try
MdiChildForm:=TMdiChildForm.Create(Application);
Считываю параметр
finally
mdiChildForm.free;
end;
Но так создается и сразу убивается, а параметр остается пустой


GLFox   (2005-08-01 15:06:00) [1]

Тогда надо сделать немножко иначе:

TfrmChildForm = class(TForm)
...
 procedure SetSomeParamPointer(Value: PInteger);
public
 property SomeParamPointer: PInteger write SetSomeParamPointer;
end;

...

procedure TfrmChildForm.SetSomeParamPointer(Value: PInteger);
begin
 Value^:=0;
end;

В данном случае значение iSomeParam установится сразу при присвоении адреса.


sCORpio80   (2005-08-01 14:59:00) [2]

to GLFox:
Спасибо работает, но как бы сделать так чтобы возвращалось действие на следующей строке
т.е.
frm:=tfrmChildForm.Create(frmMain);
frm.SomeParamPointer:=@iSomeParam; - это выполнилось, а затем я хочу:
Caption:=IntToStr(iSomeParam); - уже не работает;


GLFox   (2005-08-01 14:40:00) [3]

>sCORpio80 ©   (01.08.05 14:34) [15]


TfrmMain = class(TForm)
...
public
 iSomeParam: Integer;
end;

...
 frm:=tfrmChildForm.Create(frmMain);
 frm.SomeParamPointer:=@iSomeParam;
// frm.SomeParamPointer должен быть описан в public чайлда
// хотя бы так:
// public
//   SomeParamPointer: PInteger;
// ...


А при OnClose чайлда пишем:

if SomeParamPointer<>nil then SomeParamPointer^:=0;


sCORpio80   (2005-08-01 14:37:00) [4]

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


sCORpio80   (2005-08-01 14:34:00) [5]

to GLFox:
Я так понял ты предлагаешь следующее:
frm:=tfrmChildForm.Create(frmMain);
главная форма владелец.
А как обратится к ней из дочернего окна?


TSa   (2005-08-01 14:31:00) [6]

пошаго пройди и  посмотри почему значения в функии не остаются и расскажи !!!


GLFox   (2005-08-01 14:30:00) [7]

>sCORpio80 ©   (01.08.05 14:25) [12]

Так значит, все таки, ЭКЗЕМПЛЯРЫ. Т.е. я так понимаю, твое многострадальное окно может иметь только одного предка. Тогда, в принципе, вариант с передачей по указателю вполне работоспособен.


sCORpio80   (2005-08-01 14:25:00) [8]

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


sCORpio80   (2005-08-01 14:21:00) [9]

в том то и фишка, что оно не должно модальным быть


GLFox   (2005-08-01 14:20:00) [10]

Если тебе нужно это значение и после закрытия этого чайлда, то пожалуй, тогда без глобальных описаний данных не обойтись.


TSa   (2005-08-01 14:16:00) [11]

поробуй сделать модальное окно !


sCORpio80   (2005-08-01 14:14:00) [12]

могут и одновременно и таких дочерних окон разных много


GLFox   (2005-08-01 14:08:00) [13]

И что? Эти разные формы все одновременно используют это бедное дочернее окно?


sCORpio80   (2005-08-01 14:05:00) [14]

to GLFox: так нельзя т.к. дочернее окно может вызываться из разных форм
У меня был вариант вынести все такие переменные в отдельный модуль, наверно так и сделаю


sCORpio80   (2005-08-01 14:03:00) [15]

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


GLFox   (2005-08-01 14:01:00) [16]

Вообще я обычно делаю так:
- передаю классу дочернего окна в пропертю указатель из главного окна;
- засовываю по этому указателю данные при закрытии чайлда.
Все работает.


TSa   (2005-08-01 13:55:00) [17]

только функцию которая в класс не входит к твоей mdiChildForm


sCORpio80   (2005-08-01 13:51:00) [18]

не помогло


TSa   (2005-08-01 13:44:00) [19]

создай функцию которая будет вызывать тебе твоё дочернее окно ав "строчке считываю" параметр приствой необзодимое значение резльтату функции.


Наверх

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