![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вернуть параметр из 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]создай функцию которая будет вызывать тебе твоё дочернее окно ав "строчке считываю" параметр приствой необзодимое значение резльтату функции.