On-line: гостей 3. Всего: 3 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 6695
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.05.20 16:19. Заголовок: Передача данных с формы ???


Всем работающим привет !
И не работающим тоже.

Показал Сергей мне тут недавно как передавать данные в другую функцию без параметров.
Мне он давно советовал использовать, но всё некогда было разбираться.
Я думаю другим этот метод тоже будет интересен. Удобно очень.
Поясню как это выглядит по коду.
	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


Как видите - не нужно передавать кучу параметров в функции, что часто приходиться делать.
Кодить стало проще, кодить стало веселей !
Сергей, как этот метод передачи правильно называется ?
И объем данных какой можно передавать ?
Допустим целиком объект TSB можно передать и как это будет выглядеть ?

Более подробно как это можно использовать смотрите в примере Tsb_dbf_array,
который передал Григорию.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 21 , стр: 1 2 All [только новые]


Администратор




Пост N: 3956
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 23.05.20 18:10. Заголовок: Можно это реализоват..


Можно это реализовать через хэш. Передавать функции один параметр: хэш - переменную, в которой задавать все значения
А в функции их соответственно получать.
Пример:

Local hPar := {=>}

hPar[ "cFileIni" ] := ...
hPar[ "cAlias" ] := ...
...

myCardBtn(hPar)

...

Function myCardBtn( hPar )
Local cFileIni := hPar[ "cFileIni" ]
...

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 3226
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.05.20 18:24. Заголовок: Andrey Ты как "..


Andrey
Ты как "из лесу вышел, был сильный ..."
Передача данных через Cargo применяется с clipper времен в объектах.
Объекты, как и массивы передаются по ссылке, так что целиком объект предаем при клонировании его ф-ей.
Local o := oKeyData() создает объект контейнер, в который можешь "запихивать" информацию, см. h_objects.prg.
Сканируй \SAMPLES\*.* на поиск oKeyData() для изучения.

 цитата:
Допустим целиком объект TSB можно передать и как это будет выглядеть ?


У тебя перед глазами только что был пример с двумя тсб и в нем все есть. Кусочек тут (цветом выделено)
Скрытый текст

т.е. у тсб в фокусе красная рамка ячейки курсора, у тсб не в фокусе синяя и по TAB клавише переключается фокус и цвет

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6696
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.05.20 19:07. Заголовок: SergKis пишет: Ты к..


SergKis пишет:

 цитата:
Ты как "из лесу вышел, был сильный ..."


Так некогда было этим заниматься... Вообще упустил это из виду !
Пока сам не попробуешь, только тогда оценишь !

SergKis пишет:

 цитата:
У тебя перед глазами только что был пример с двумя тсб и в нем все есть.


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 3227
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.05.20 19:16. Заголовок: Andrey пишет Вот зде..


Andrey пишет
 цитата:
Вот здесь и не могу понять.
(This.Object):Cargo:oBrwFocus := Nil - создали переменную до создания ТСБ


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6697
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.05.20 19:37. Заголовок: Вопрос про новый при..


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

? oBrw:cAlias
oBrw:Setfocus() // так можно ???

Где и как нужно передать в Cargo контейнер сам oBrw созданный после объявления этой переменной ?

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 3228
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.05.20 19:39. Заголовок: Andrey..


Andrey

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 3229
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.05.20 19:44. Заголовок: Упс DEFINE T..


Упс
 
DEFINE TBROWSE oBrw ;
(This.Object):oBrw := oBrw // тут
....
END TBROWSE
(This.Object):oBrw := oBrw // тут
где доступна oBrw и ThisWindow

PS
Не забывай, что есть и App.Cargo := oKeyData() // на приложение

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6698
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.05.20 20:26. Заголовок: SergKis пишет: (Thi..


SergKis пишет:

 цитата:
(This.Object):oBrw := oBrw // тут


Это я понял. Я над другой проблемой бьюсь.
А как можно уже в готовую переменную НУЛЕВУЮ записать oBrw ? или это не предусмотрено ?

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 3230
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.05.20 20:30. Заголовок: Andrey пишет А как ..


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


Это о чем ? Что значит "НУЛЕВУЮ" ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6699
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.05.20 20:40. Заголовок: (This.Object):Cargo:..


(This.Object):Cargo:oBrw := Nil   // понял, чтобы не забыть   
потом идет
DEFINE TBROWSE oBrw ;
....

Которую объявили ранее.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 3231
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.05.20 20:50. Заголовок: Andrey пишет Которую..


Andrey пишет
Которую объявили ранее. 

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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6700
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.05.20 21:00. Заголовок: SergKis пишет: Ты п..


SergKis пишет:

 цитата:
Ты посмотрел h_objects.prg ф-я oKeyData() и CLASS TKeyData ?


Темный, темный лес ....

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 3232
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.05.20 21:34. Заголовок: Andrey пишет Темный,..


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) и получать их обратно, как выше,
вот вкратце основное. В примерах и на сайте показывал использование объекта контейнера

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 3233
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.05.20 21:47. Заголовок: PS (This.Object):Car..


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 и сообщения не будет

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6701
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.05.20 22:01. Заголовок: SergKis пишет: METH..


SergKis пишет:

 цитата:
METHOD Set( Key, Block ) INLINE ( hb_HSet ( ::aKey, Key, Block ), ::lKey := .T. )


Не получается сделать запись в переменную.
Объявлена на форме
(This.Object):Cargo:lCheck := lBase

В другой функции как записать в эту переменную ?
Добустим в чеклабеле
 
@ nY, nX CHECKLABEL Check_2 ...
ACTION {|| lChk2 := ! This.Checked , This.Checked := lChk2 ,;
This.Cargo:lCheck ????? } // вот здесь ?


SergKis пишет:

 цитата:
Даже странно, ты столько времени работаешь с тсб объектом ...


Чуток понимаю, но без всяких наворотов, не использовал, все по старинке через функии...
Хотя работать по событиям удобнее, кода меньше писать приходиться.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 3234
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.05.20 22:33. Заголовок: Добустим в чеклабел..


 
Добустим в чеклабеле

@ nY, nX CHECKLABEL Check_2 ...
ACTION {|chk| chk := ! This.Checked , This.Checked := chk ,;
ThisWindow.Cargo:lCheck := chk } // вот здесь ? action контрола


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6702
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.05.20 23:09. Заголовок: Уф.. получилось ! Сп..


Уф.. получилось ! Спасибо большое !
Вот так код красивей и понятней для меня:
 
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 }


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6703
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.05.20 16:02. Заголовок: Всем привет ! Теперь..


Всем привет !
Теперь непонятка в основной форме программы.
   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) }

Вылет из проги:
 
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

Если написать так:
ThisWindow.Cargo:nFilter := nFilter  , MsgDebug(ThisWindow.Cargo:nFilter) }

То работает !
А нельзя это сделать чтобы одинаково было ?
Приходиться в одном месте писать так, в другом по другому...

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 3235
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.05.20 16:16. Заголовок: Andrey Вчера выше у..


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

 цитата:
Приходиться в одном месте писать так, в другом по другому...


Потому что работа в двух местах под контролом и в This. инфа контрола или под окном в This. данные окна.
Различать надо, т.к. действия разные

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 3236
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.05.20 16:39. Заголовок: PS Хочешь писать оди..


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6704
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.05.20 17:20. Заголовок: SergKis пишет: Хоче..


SergKis пишет:

 цитата:
Хочешь писать одинаково, используй конкретное имя окна, без использования This. - раз трудности,


Понял !
БОЛЬШОЕ СПАСИБО за понятные разъяснения !

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 21 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 335
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет