Форум » GUI » Передача данных с формы ??? » Ответить

Передача данных с формы ???

Andrey: Всем работающим привет ! И не работающим тоже. Показал Сергей мне тут недавно как передавать данные в другую функцию без параметров. Мне он давно советовал использовать, но всё некогда было разбираться. Я думаю другим этот метод тоже будет интересен. Удобно очень. Поясню как это выглядит по коду. [pre2] SET OOP ON Function ... LOCAL oBrw, cFileIni, cBasePath cFileIni := .... cBasePath := ... DEFINE WINDOW Form_Card ..... ; .... (This.Object):Cargo := oKeyData() // создает объект без переменных (условно пустой) используем ниже по коду (This.Object):Cargo:cAlias := Alias() // на окне запомнили, текущую базу (This.Object):Cargo:cFileIni := cFileIni // на окне запомнили, ini-конфиг (This.Object):Cargo:cBasePath := cBasePath // на окне запомнили, путь и имя базы ..... END WINDOW RETURN // ------ в этом же модуле FUNCTION myCardBtn() // <- нет параметров LOCAL oCargo := This.Cargo LOCAL cFileIni := oCargo:cFileIni // какой ini-конфиг LOCAL cAlias := oCargo:cAlias // какая текущая база LOCAL cBasePath := oCargo:cBasePath // какой путь и имя базы .... RETURN Nil // ------ в другом модуле, другой .prg FUNCTION myExternReport() // <- нет параметров LOCAL oCargo := GetProperty("Form_Card", "Cargo") LOCAL cFileIni := oCargo:cFileIni // какой ini-конфиг LOCAL cAlias := oCargo:cAlias // какая текущая база LOCAL cBasePath := oCargo:cBasePath // какой путь и имя базы .... RETURN Nil [/pre2] Как видите - не нужно передавать кучу параметров в функции, что часто приходиться делать. Кодить стало проще, кодить стало веселей ! Сергей, как этот метод передачи правильно называется ? И объем данных какой можно передавать ? Допустим целиком объект TSB можно передать и как это будет выглядеть ? Более подробно как это можно использовать смотрите в примере Tsb_dbf_array, который передал Григорию.

Ответов - 21, стр: 1 2 All

Pasha: Можно это реализовать через хэш. Передавать функции один параметр: хэш - переменную, в которой задавать все значения А в функции их соответственно получать. Пример: Local hPar := {=>} hPar[ "cFileIni" ] := ... hPar[ "cAlias" ] := ... ... myCardBtn(hPar) ... Function myCardBtn( hPar ) Local cFileIni := hPar[ "cFileIni" ] ...

SergKis: Andrey Ты как "из лесу вышел, был сильный ..." Передача данных через Cargo применяется с clipper времен в объектах. Объекты, как и массивы передаются по ссылке, так что целиком объект предаем при клонировании его ф-ей. Local o := oKeyData() создает объект контейнер, в который можешь "запихивать" информацию, см. h_objects.prg. Сканируй \SAMPLES\*.* на поиск oKeyData() для изучения. Допустим целиком объект TSB можно передать и как это будет выглядеть ? У тебя перед глазами только что был пример с двумя тсб и в нем все есть. Кусочек тут (цветом выделено) [pre2] DEFINE WINDOW Form_Main ; TITLE SHOW_TITLE ; ICON "1MAIN_ICO" ; MAIN TOPMOST ; ON INIT {|| This.Topmost := .F. } ; ON RELEASE {|| DbCloseAll() } ; NOMAXIMIZE NOSIZE (This.Object):Cargo := oKeyData() (This.Object):Cargo:oBrwFocus := Nil ... //////////// первая таблица /////////////////// nC := This.ClientHeight - This.StatusBar.Height - nY nH := nC * 0.5 nW := This.ClientWidth oBrw1 := myBrw1( nY, nX, nW, nH, aDatos1, aFont ) oBrw1:bGotFocus := {|ob| myGotFocusTsb(ob) } /////////////// вторая таблица /////////////////// nY += nH nH := nC - nH oBrw2 := myBrw2( nY, nX, nW, nH, aDatos2, aFont ) oBrw2:bGotFocus := {|ob| myGotFocusTsb(ob) } ... ////////////////////////////////////////// STATIC FUNCTION myGotFocusTsb( oBrw ) LOCAL oCargo := GetProperty(oBrw:cParentWnd, "Cargo") oCargo:oBrwFocus := oBrw // на окне запомнили, какой tsb в фокусе oBrw:Cargo:nClr6_1 := oBrw:Cargo:n_HRED RETURN Nil ... ////////////////////////////////////////// STATIC FUNCTION myColorTsb( oBrw ) LOCAL O WITH OBJECT oBrw:Cargo // 1. переменные цветов из #define CLR_... и RGB(...), меняя правую часть меняем цвета тсб :nHRED := CLR_HRED :n_HRED := -CLR_HRED :n_HBLUE := -RGB(128,225,225) :nHBLUE := RGB(128,225,225) ... :nClr6_1 := :n_BLUE // #define CLR_FOCUSB 6 1 // focused back ... :nClr12_1 := :n_BLUE // #define CLR_SELEB 12 1 // focused inactive (or selected) back ... END WITH WITH OBJECT oBrw O := :Cargo :nClrLine := O:nClrLine // создать в контейнере свои переменные с именами :SetColor( { 2}, { O:nClr2 } ) // 2 , фона в ячейках таблицы :SetColor( { 5}, { O:nClr5 } ) // 5 , текста курсора, текст в ячейках с фокусом :SetColor( { 6}, { {|c,n,b| c := b:Cargo, iif( b:nCell == n, c:nClr6_1 , c:nClr6_2 ) } } ) // 6 , фона курсора :SetColor( {11}, { O:nClr11 } ) // 11, текста неактивного курсора (selected cell no focused) :SetColor( {12}, { {|c,n,b| c := b:Cargo, iif( b:nCell == n, c:nClr12_1, c:nClr12_2 ) } } ) // 12, фона неактивного курсора (selected cell no focused) :Setcolor( { 3}, { O:nClr3 } ) // 3 , текста шапки таблицы :SetColor( { 4}, { O:nClr4 } ) // 4 , фона шапка таблицы // !!! тут лишний блок кода, массива достаточно :SetColor( { 9}, { O:nClr9 } ) // 9 , текста подвала таблицы :SetColor( {10}, { O:nClr10 } ) // 10, фона подвала таблицы // !!! тут лишний блок кода, массива достаточно END WITH RETURN Nil ... [/pre2] т.е. у тсб в фокусе красная рамка ячейки курсора, у тсб не в фокусе синяя и по TAB клавише переключается фокус и цвет

Andrey: SergKis пишет: Ты как "из лесу вышел, был сильный ..." Так некогда было этим заниматься... Вообще упустил это из виду ! Пока сам не попробуешь, только тогда оценишь ! SergKis пишет: У тебя перед глазами только что был пример с двумя тсб и в нем все есть. Вот здесь и не могу понять. (This.Object):Cargo:oBrwFocus := Nil - создали переменную до создания ТСБ А если нужно весь ТСБ передать в другую функцию, то как это будет выглядеть ?


SergKis: Andrey пишет Вот здесь и не могу понять. (This.Object):Cargo:oBrwFocus := Nil - создали переменную до создания ТСБ Создана переменная в cargo окна, можно это не делать, т.к. обращение к не существующей переменной в oKeyData() вернет NIL (This.Object):Cargo := oKeyData() ? (This.Object):Cargo:oBrwFocus // NIL В данном тексте показал, обозначил имя переменной в Cargo, что бы, наверно, самому не забыть

Andrey: Вопрос про новый пример с тсб. [pre2](This.Object):Cargo:oBrw := Nil // понял, чтобы не забыть потом идет DEFINE TBROWSE oBrw ; .... END TBROWSE .... FUNCTION myTest() LOCAL oCargo := This.Cargo LOCAL oBrw := oCargo:oBrw // так можно ??? ? oBrw:cAlias oBrw:Setfocus() // так можно ??? [/pre2] Где и как нужно передать в Cargo контейнер сам oBrw созданный после объявления этой переменной ?

SergKis: Andrey

SergKis: Упс [pre2] DEFINE TBROWSE oBrw ; (This.Object):oBrw := oBrw // тут .... END TBROWSE (This.Object):oBrw := oBrw // тут где доступна oBrw и ThisWindow [/pre2] PS Не забывай, что есть и App.Cargo := oKeyData() // на приложение

Andrey: SergKis пишет: (This.Object):oBrw := oBrw // тут Это я понял. Я над другой проблемой бьюсь. А как можно уже в готовую переменную НУЛЕВУЮ записать oBrw ? или это не предусмотрено ?

SergKis: Andrey пишет А как можно уже в готовую переменную НУЛЕВУЮ записать oBrw ? или это не предусмотрено ? Это о чем ? Что значит "НУЛЕВУЮ" ?

Andrey: [pre2](This.Object):Cargo:oBrw := Nil // понял, чтобы не забыть потом идет DEFINE TBROWSE oBrw ; .... [/pre2] Которую объявили ранее.

SergKis: Andrey пишет [pre2]Которую объявили ранее. [/pre2] Ты считаешь (This.Object):Cargo:oBrw и oBrw ( LOCAL oBrw ) это одно и то же объявление ? Ты посмотрел h_objects.prg ф-я oKeyData() и CLASS TKeyData ?

Andrey: SergKis пишет: Ты посмотрел h_objects.prg ф-я oKeyData() и CLASS TKeyData ? Темный, темный лес ....

SergKis: Andrey пишет Темный, темный лес .... Даже странно, ты столько времени работаешь с тсб объектом ... oKeyData() возвращает объект в остове которого Hash VAR aKey INIT hb_Hash() и методы на основе hash функций (см. А. Кресина сайт) METHOD Set( Key, Block ) INLINE ( hb_HSet ( ::aKey, Key, Block ), ::lKey := .T. ) METHOD Get( Key, Def ) INLINE hb_HGetDef( ::aKey, Key, Def ) METHOD Del( Key ) INLINE ( iif( ::Len > 0, hb_HDel ( ::aKey, Key ), ), ::lKey := Len( ::aKey ) > 0 ) METHOD Pos( Key ) INLINE hb_HPos( ::aKey, Key ) и _METHOD GetAll( lAll ) // получить все данные из hash массивом _METHOD Sum( Key, xSum ) // суммирует на ключ Key в Advanced\App_OopReport есть применение и есть возможность заносить данные на произвольные имена (ключ в hash) и получать их обратно, как выше, вот вкратце основное. В примерах и на сайте показывал использование объекта контейнера

SergKis: PS (This.Object):Cargo:oBrw := oBrw - это ключ "OBRW" в :aKey, т.е. hb_HSet(::aKey, "OBRW", oBrw), а Local oBrw := (This.Object):Cargo:oBrw - это hb_HGetDef(::aKey, "OBRW", NIL), если "OBRW" будет не найдена, будет сообщение об ошибке, что переменной нет. Если доставать методом :Get("OBRW") при отсутствии ключа\переменной вернет NIL и сообщения не будет

Andrey: SergKis пишет: METHOD Set( Key, Block ) INLINE ( hb_HSet ( ::aKey, Key, Block ), ::lKey := .T. ) Не получается сделать запись в переменную. Объявлена на форме (This.Object):Cargo:lCheck := lBase В другой функции как записать в эту переменную ? Добустим в чеклабеле[pre2] @ nY, nX CHECKLABEL Check_2 ... ACTION {|| lChk2 := ! This.Checked , This.Checked := lChk2 ,; This.Cargo:lCheck ????? } // вот здесь ? [/pre2] SergKis пишет: Даже странно, ты столько времени работаешь с тсб объектом ... Чуток понимаю, но без всяких наворотов, не использовал, все по старинке через функии... Хотя работать по событиям удобнее, кода меньше писать приходиться.

SergKis: [pre2] Добустим в чеклабеле @ nY, nX CHECKLABEL Check_2 ... ACTION {|chk| chk := ! This.Checked , This.Checked := chk ,; ThisWindow.Cargo:lCheck := chk } // вот здесь ? action контрола [/pre2]

Andrey: Уф.. получилось ! Спасибо большое ! Вот так код красивей и понятней для меня:[pre2] LOCAL oCargo := This.Cargo LOCAL cFontName := oCargo:cFontName LOCAL nFontSize := oCargo:nFontSize LOCAL aBackColor := oCargo:aBackColor @ nY, nX CHECKLABEL Check_2 ... ACTION {|| lChk2 := ! This.Checked , ,; oCargo:lChk2 := lChk2 } [/pre2]

Andrey: Всем привет ! Теперь непонятка в основной форме программы. [pre2] DEFINE WINDOW .... ... (This.Object):Cargo := oKeyData() // создает объект без переменных (условно пустой) используем ниже по коду ... (This.Object):Cargo:nFilter := nFilter // фильтр по базе ... @ ... COMBOBOXEX ComboEx_Filter ... ON CHANGE { || nFilter := This.ComboEx_Filter.Value ,; This.Cargo:nFilter := nFilter , MsgDebug(This.Cargo:nFilter) }[/pre2] Вылет из проги:[pre2] Error BASE/1005 Переменная не экспортирована: NFILTER Args: [1] = C [2] = N 3 --------------------------------- Stack Trace --------------------------------- Called from _NFILTER(0) Called from (b)FORMCARDDBFSHOW(100) in module: cardcomp.prg Called from _DOCONTROLEVENTPROCEDURE(1887) in module: h_windows.prg Called from EVENTS(2137) in module: h_events.prg Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(1500) in module: h_windows.prg Called from FORMCARDDBFSHOW(175) in module: cardcomp.prg Called from TESTSTART(86) in module: 9test.prg [/pre2] Если написать так: [pre2]ThisWindow.Cargo:nFilter := nFilter , MsgDebug(ThisWindow.Cargo:nFilter) }[/pre2] То работает ! А нельзя это сделать чтобы одинаково было ? Приходиться в одном месте писать так, в другом по другому...

SergKis: Andrey Вчера выше уже написал, что ты в ACTION контрола и This.Cargo - обращение к Cargo контрола, ели надо обращаться в этом месте к Cargo окна, то пишешь ThisWindow.Cargo Это основное, главное правило в hmg. Приходиться в одном месте писать так, в другом по другому... Потому что работа в двух местах под контролом и в This. инфа контрола или под окном в This. данные окна. Различать надо, т.к. действия разные

SergKis: PS Хочешь писать одинаково, используй конкретное имя окна, без использования This. - раз трудности, т.е. oCargo := Form_Main.Cargo oCargo := GetProperty("Form_Main", "Cargo")

Andrey: SergKis пишет: Хочешь писать одинаково, используй конкретное имя окна, без использования This. - раз трудности, Понял ! БОЛЬШОЕ СПАСИБО за понятные разъяснения !



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