Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.21;
Скачать: CL | DM;

Вниз

Вернуть параметр из MDI-Child   Найти похожие ветки 

 
sCORpio80 ©   (2005-08-01 13:41) [0]

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

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


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

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


 
sCORpio80 ©   (2005-08-01 13:51) [2]

не помогло


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

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


 
GLFox ©   (2005-08-01 14:01) [4]

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


 
sCORpio80 ©   (2005-08-01 14:03) [5]

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


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

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


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

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


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

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


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

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


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

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


 
sCORpio80 ©   (2005-08-01 14:21) [11]

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


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

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


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

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

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


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

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


 
sCORpio80 ©   (2005-08-01 14:34) [15]

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


 
sCORpio80 ©   (2005-08-01 14:37) [16]

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


 
GLFox ©   (2005-08-01 14:40) [17]

>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:59) [18]

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


 
GLFox ©   (2005-08-01 15:06) [19]

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

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

...

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

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



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

Текущий архив: 2005.08.21;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.05 c
14-1122543830
Mx
2005-07-28 13:43
2005.08.21
О кроссплатформенности в Delphi 2005


14-1122483433
Димаска
2005-07-27 20:57
2005.08.21
IRC в E-Mule


14-1122599616
k2
2005-07-29 05:13
2005.08.21
Поздравляю с Днем Сисадмина!


4-1119913987
Дмитрий Д.
2005-06-28 03:13
2005.08.21
Управление иконками Рабочего стола


14-1122538370
Choovak
2005-07-28 12:12
2005.08.21
Символы