BEST logo логотип компании БЭСТ - программы для бизнеса ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
ПОДДЕРЖКА
+7 (495) 775-66-76
consult@bestnet.ru
СКАЧАТЬ
Обновления
Дистрибутивы
Авторизация

Логин:
Пароль:
Забыли свой пароль?
Регистрация
ВАШ ВОПРОС

Доступ к Личному кабинету закрыт!
Как получить доступ?


Главная  / Поддержка  / Форум  / Публичные форумы  / Программирование приложений  / Не явное имя переменной в полее ввода при использовании функции QINPUT

Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Не явное имя переменной в полее ввода при использовании функции QINPUT
 
Здравствуйте!
Пытаюсь с помощью функции QINPUT создать диалоговое окно,которое заполняется
данными из массива,полученного в ходе выполнения плагина. в нижеследующем примере
это переменная aParam :
FUNCTION Main()
Private _data_n,_data_k,_data_r
Private aMas
Private aParam
dbpush()
aParam:={{"01/01/2014","аааааааа",1,'head_1'},{"02/01/2014","бббббббббббб",2,'head_2'},{"03/01/2014","ввввввв",3,'head_3'}}
altd()
_DialogSay(aParam)
dbpop()
return

FUNCTION _DialogSay(x)
Local _top,_bot,_left,_right,_heads,_pic:={},_ref:={},_app,_spec,_getbl:={}
Local j:=0,aHeads:={}
Local _head //head_n .......
Local _field:='',_zag:=' '
Local head_1:=1,head_2:=2,head_3:=3
//дата конца формирования отчета
_data_n:=111111
_data_k:=222
_data_r:=9999
//выходные параметры -_data_n ,_data_k,_data_r,входящие в массив aMas
_top:=3
_bot:=len(x)+2
_left:=3
_right:=76
j:=1
// ЗДЕСЬ ПЫТАЮСЬ задать имя переменной
// Do While j<=len(x)
// _head:="head_"+alltrim(str(j)) // так
// _head:=x[j,4] // или так
// _head:=x[j,3] // присвоение значение переменной
// aadd(aHeads,{{_top+j-1,_left+63},_head})
// j:=j+1
// enddo

aheads:={{{_top,_left+67},"_data_n"},{{_top+1,_left+67},"_data_k"},{{_top+2,_left+67},"_data_r"}} // вот с ним //проблема
aeval(x,{|| aadd(_pic,'999999')})
_ref:={}
_app:=1
_spec:='RESTOFF'
aeval(x,{|| aadd(_getbl,NIL)})
_getbl:={}
DISPBOX(_top-1,_left-1,_bot+1,_right+1,'г=┐│-=L│ ',"N/BG")
SAYSCREEN(" ЗАПОЛНЕНИЕ ОБЪЕМОМ ПРОИЗВЕДЕННОЙ ПРОДУКЦИИ ",_top-1,_left+2)
j:=0
aeval(x,{|x| SAYSCREEN(x[1]+' '+x[2],_top+j,_left+2),j++})
QINPUT(_top,_left,_bot,_right,aheads,_app,_ref,_pic,,,,,,,_spec,_getbl,,,,,,,,,"Сформировать отчет ?")
IF LASTKEY()!=27
aMas:={_data_n ,_data_k,_data_r}
else
aMas:={}
endif
return aMas


Не получается в массиве aheads избавится от явно задаваемых переменных _data_n ,_data_k,_data_r

Строка _head:="head_"+alltrim(str(j)) или строка _head:=x[j,4] позволяет задать имя переменной для ввода и вывода,.
А вот значение ей не удается задать.
Как это сделать?
Заранее спасибо.
 
Переменные, объявленные как local могут быть использованы только непосредственно, поскольку их имя не хранится в компилированном модуле
Переменные private могут быть использованы в литералах и блоках кода в пределах видимости без ограничения

local cLocalText, cVarName
private cPrivText

cLocalText:='0'

&('cLocalText'):='1' // не сработает, будет объявлена private cLocalText, которая будет перекрываться локальной
// при непосредственном обращении к cLocalText будет выводиться '0'
// при уточнении memvar->cLocalText или использовании &('cLocalText'), будет выводиться '1'

&('cPrivText'):='1' // сработает

cVarName:='cLocalText'
&cVarName:='2' // не сработает, причину смотри выше

cVarName:='cPrivText'
&cVarName:='2' // сработает

sayandwait(&cVarName) // сработает

return

Проверял на xHarbour 0.99.1, строго говоря, поведение программы может зависит от компилятора.
С уважением, Новиков Алексей.
 
Алексей,спасибо за развернутый ответ!
Внес изменения в плагин .Все работает.


FUNCTION Main()
Private aMas:={}
Private aParam
dbpush()
aParam:={{"01/01/2014","аааааааа",1,'head_1'},{"02/01/2014","бббббббббббб",2,'head_2'},{"03/01/2014","ввввввв",3,'head_3'}}
//altd()
_DialogSay(aParam)
dbpop()
return
///********** запрашиваем дату начала и конца расчета, код склада,группы и вариант сортировки ***********
FUNCTION _DialogSay(x)
Local _top,_bot,_left,_right,_heads,_pic:={},_ref:={},_app,_spec,_getbl:={}
Local j:=0,aHeads:={},_value:=0
Private _head:='',head_1:=0,head_2:=0,head_3:=0
_top:=3
_bot:=len(x)+2
_left:=3
_right:=76
j:=1
Do While j<=len(x)
// _head:="head_"+alltrim(str(j))
_head:=x[j,4] // задает имя переменной
aadd(aHeads,{{_top+j-1,_left+63},&('_head')})
&_head:=x[j,3] // присвоение значение переменной
j:=j+1
enddo

aeval(x,{|| aadd(_pic,'999999')})
_ref:={}
_app:=1
_spec:='RESTOFF'
aeval(x,{|| aadd(_getbl,NIL)})
DISPBOX(_top-1,_left-1,_bot+1,_right+1,'г=┐│-=L│ ',"N/BG")
SAYSCREEN(" ЗАПОЛНЕНИЕ ОБЪЕМОМ ПРОИЗВЕДЕННОЙ ПРОДУКЦИИ ",_top-1,_left+2)
j:=0
aeval(x,{|x| SAYSCREEN(x[1]+' '+x[2],_top+j,_left+2),j++})
QINPUT(_top,_left,_bot,_right,aheads,_app,_ref,_pic,,,,,,,_spec,_getbl,,,,,,,,,"Сформировать отчет ?")
IF LASTKEY()!=27
j:=1
Do While j<=len(x)
_head:=x[j,4]
_value:=&_head
aadd(aMas,_value)
j++
enddo
// aeval(x,{|x| _head:=x[4],_value:=&_head,aadd(aMas,_value)})
altd()
else
aMas:={}
endif
return aMas

Но остались еще Вопрос ы ( проблемы):
1.Количество подмассивов массива aParam заранее не определено ( т.е это переменная величина).
Как тогда объявить неопределенное количество переменных head_1:=0,head_2:=0,head_3:=0 ( head_n:=......) ?
(Если такое вообще возможно .)
Можно, конечно ,заранее предположить длину массива aParam и объявить такое количество переменных :
Private head_1:=0,head_2:=0,head_3:=0,head_4:=0,head_5:=0 и т.д..

2.Чтобы присвоить переменным введенное значение в диалоговом окне пользователем пришлось
написать: j:=1
Do While j<=len(x)
_head:=x[j,4]
_value:=&_head
aadd(aMas,_value)
j++
enddo
На выражение aeval(x,{|x| _head:=x[4],_value:=&_head,aadd(aMas,_value)}) программа
заругалась на макрооператор &
Можно ли как-то переписать это выражение, чтобы оно заработало?
Или цикла Do While j<=len(x) ,,,,, enddo вполне достаточно?
Заранее спасибо.
 
1. Объявление производится по тому же принципу

for nPos:=1 to len(aParam)
cVar:='head_'+alltrim(str(nPos))
private &cVar
next

2. Внутри блока макроподстановки запрещены
Можно воспользоваться функцией MemVarBlock(), которая возвращает блок чтения/присвоения значения переменной
{|x,i| bTmp:=memvarblock('head_'+alltrim(str(i))), eval(bTmp, x) }
такое выражение должно сработать
Для более сложных вариантов можно использовать функцию formulparsblock() или предварительно определить массив блоков кода в обычном цикле
С уважением, Новиков Алексей.
 
Еще раз спасибо.
Честно говоря не понял, как в данном случае воспользоваться выражением :
{|x,i| bTmp:=memvarblock('head_'+alltrim(str(i))), eval(bTmp, x) }
 
Это было выражение для примера, я не стал разбираться в коде.

Выражение "aeval(x, {|aPar| aadd(aMas,eval(memvarblock(aPar[4]))) })" должно заменить цикл

Do While j<=len(x)
_head:=x[j,4]
_value:=&_head
aadd(aMas,_value)
j++
enddo
С уважением, Новиков Алексей.
Страницы: 1
Читают тему (гостей: 1)