Форум » GUI » Многоокон, получить результат » Ответить

Многоокон, получить результат

Vlad04: Имеется несколько окон данных Win1, Win2, Win3.. , в которых обрабатываются, редактируются данные и много окон справочников WinSpr1, WinSpr2,WinSpr3,WinSpr4 ... , через которые открываются справочники. Из любого окна данных Win... вы можете вызвать любой (по ситуации) справочник WinSpr.. Т.е находясь в окне WinSpr не известно из какого окна справочник вызван. При закрытии окна справочника необходимо вернуть данные из справочника в окно Данных или не вернуть (решает оператор) а уже в окне данных Win выполнить присвоение. Кто как это делает ? В Делфи для этого есть у каждого окна переменная Result (.t. или .f.)

Ответов - 4

SergKis: Vlad04 пишет Т.е находясь в окне WinSpr не известно из какого окна справочник вызван. Зачем окну WinSpr знать откуда был вызов ? Ему достаточно знать, сделали выбор (кнопка\Enter\...) или отказались. В Делфи для этого есть у каждого окна переменная Result (.t. или .f.) У себя использую (короче писать)[pre2] LOCAL aRet := {} ... :UserKeys(VK_RETURN, {|obr | AAdd( aRet, (obr:cAlias)->( mGet(cFld1) ) ), ; AAdd( aRet, (obr:cAlias)->( mGet(cFld2) ) ), ; _PushKey(VK_ESCAPE) }) ... END WINDOW ACTIVATE WINDOW &cWnd RETURN aRet [/pre2] т.е. по кнопке или Enter заполняется aRet нужными данными из записи. В окне где был вызов спр. обработка ! empty(aRet) - выбор был, раскидываем данные aRet куда надо

Vlad04: SergKis ок Я похоже делал, но RETURN aRet стояло NIL, и данные получал через переменные , а не возврат функции. Отсюда нестабильность

SergKis: Vlad04 пишет Я похоже делал, но RETURN aRet стояло NIL, и данные получал через переменные Если, все же, есть потребность получить данные именно через окно, то возможен вариант [pre2] FUNC MySpr(...) // через окно родительское (откуда вызов справочника) LOCAL hParent := iif( _HMG_BeginWindowMDIActive, GetActiveMdiHandle(), GetActiveWindow() ) LOCAL nParent := AScan( _HMG_aFormHandles, hParent ) LOCAL cParent := _HMG_aFormNames [ nParent ] // или через MAIN окно LOCAL cParent := _HMG_aFormNames [ _HMG_MainIndex ] _WindowCargo( cParent, NIL ) // можно тут или выше до MySpr(...) :UserKeys(VK_RETURN, {|obr| _WindowCargo( cParent, { (obr:cAlias)->( mGet(cFld1) ), ; (obr:cAlias)->( mGet(cFld2) ) } ), ; _PushKey(VK_ESCAPE) }) ... RETURN NIL // тогда на окне вызова справочника ThisWindow.Cargo := NIL MySpr(...) // справочник If ! empty( ThisWindow.Cargo ) // выбор ... EndIf // или через MAIN окно cMain := _HMG_aFormNames [ _HMG_MainIndex ] _WindowCargo( cMain, NIL ) MySpr(...) // справочник If ! empty( _WindowCargo( cMain ) // выбор ... EndIf PS. Вместо _WindowCargo(...) можно использовать _ControlCargo( ControlName, FormName, xValue ) или This.ControlName.Cargo ..., но суть та же. [/pre2]

Vlad04: ок Спасибо Пока остановился на следующем варианте, как мне кажется, самом простом. В функции , которая формирует окно справочников объявил Proc CreaTBrows(....) Private Result:=.f. ... Return Result Поставил в функции по вашем примеру возврат Return Result. На форме (на кнопках), на горячих клавишах выбора поставил присвоение по ситуации ...ACTION (Result:=.t.,ThisWindow.Release ) или ...ACTION (Result:=.f.,ThisWindow.Release ) В родительском окне, из которого вызываю окно справочника написал, к примеру if CreaTBrows(....) EditLudi.&(ControlName).Value:=FAM->FAM ... endif



полная версия страницы