Форум: "Основная";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
Вниз
Вернуть параметр из 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.03 c