ТОЧНО !
Я на эти грабли сам уже 3 раза наступал, забываю опять потом долго ищу.
И вот опять не вспомнил - чую только, что что-то жутко знакомое....
В итоге ушел пользоваться @Say @Get
Function MyDialog( cMess, cPict, cVar, cZag, cWhen, cValid, cColBox, cRef )
Local Ret_ := NIL, i,j, lOne:=VALTYPE(cVar)#'A'
Local nTop, nLeft, nBottom, nRight, nLen
Local aSet := {SaveSet()}
Local S
LOCAL aMess, aPict, aVar, aWhen, aValid, aRef
Private xVar
Private GetList := {}
ALTD()
IF cZag == NIL
cZag := ''
ENDIF
nLen := LEN(cZag)+2
iIF(VALTYPE(cMess)#'A',cMess:={cMess},NIL)
iIF(VALTYPE(cPict)#'A',cPict:={cPict},NIL)
iIF(VALTYPE(cVar)#'A',cVar:={cVar},NIL)
iIF(VALTYPE(cWhen)#'A',cWhen:={cWhen},NIL)
iIF(VALTYPE(cValid)#'A',cValid:={cValid},NIL)
iIF(VALTYPE(cRef)#'A',cRef:={cRef},NIL)
IF cMess=NIL
cMess:=ARRAY(LEN(cVar))
AFILL(cMess,'Введите значение ')
ENDIF
IF cColBox = NIL
cColBox = "N/W"
ENDIF
MemVar->xVar:=ARRAY(LEN(cVar))
IF LEN(cVar)>LEN(cMess)
aSIZE(cMess,LEN(cVar))
ENDIF
IF LEN(cVar)>LEN(cPict)
aSIZE(cPict,LEN(cVar))
ENDIF
IF LEN(cVar)>LEN(cWhen)
aSIZE(cWhen,LEN(cVar))
ENDIF
IF LEN(cVar)>LEN(cValid)
aSIZE(cValid,LEN(cVar))
ENDIF
IF LEN(cVar)>LEN(cRef)
aSIZE(cValid,LEN(cRef))
ENDIF
IF LEN(cVar) >20
FOR i:=1 TO LEN(cVar) STEP 20
aMess:={}
aPict:={}
aVar:={}
aWhen:={}
aValid:={}
aRef:={}
FOR j=i TO MIN(LEN(cVar),i+19)
AADD(aMess,cMess[j])
AADD(aPict,cPict[j])
AADD(aVar,cVar[j])
AADD(aWhen,cWhen[j])
AADD(aValid,cValid[j])
AADD(aRef,cRef[j])
NEXT
aVar:=MYDIALOG(aMess, aPict, aVar, cZag+' стр.'+STR(i/20+1,2,0), aWhen, aValid, cColBox, aRef )
IF LASTKEY() = K_ESC
EXIT
ELSE
FOR j=i TO MIN(LEN(cVar),i+19)
cVar [j]:= aVar [j-i+1]
NEXT
ENDIF
NEXT
Ret_ := ARRAY(LEN(cVar))
aEVAL(cVar,{|x,i|x:=x,Ret_[i]:=if(LastKey()<>K_ESC,cVar[i],BLANK(cVar[i],.T.))})
ELSE
Begin Sequence //ANDKOR
nTop := INT((MaxRow()-LEN(cVar))/2) - 1
nBottom := nTop+LEN(cVar) + 1
FOR i:=1 to LEN(cVar)
Do Case
Case ValType(cVar[i])=="C"
nLen := MAX(nLen,;
X Len( cMess[i] ) + if( Empty(cPict[i]),;
X IF(LEN(cVar[i])+Len( cMess[i] )>75,;
X (cPict[i]:='@KS'+TRIM(STR(75-Len( cMess[i] ),2,0)),;
X 75-Len( cMess[i] )),;
X LEN(cVar[i])),;
X Len( TransForm(SPACE(200),cPict[i]))) + 3)
Case ValType(cVar[i])=="D"
nLen := MAX(nLen,Len( cMess[i] ) + 11)
Case ValType(cVar[i])=="N"
nLen := MAX(nLen,Len( cMess[i] ) + if( Empty(cPict[i]),(cPict[i]:='9999999999999.99999',19),Len( TransForm(SPACE(200),cPict[i]))) + 3)
Case ValType(cVar[i])=="L"
nLen := MAX(nLen,Len( cMess[i] ) + 4)
EndCase
NEXT
nLeft := INT((MaxCol() - nLen)/2)
nRight := nLeft + nLen
SetColor(cColBox)
ShadowBox(IF(EMPTY(cZag),"",cZag),nTop, nLeft, nBottom, nRight)
FOR i:=1 to LEN(cVar)
if( ValType( cMess[i] ) != "C", cMess[i] := "Введите значение", NIL )
@ nTop+i, nLeft + 2 SAY cMess[i]
SetCursor(SC_NORMAL)
MemVar->xVar[i] := cVar[i]
IF Empty (cRef[i])
IF EMPTY(cPict[i])
@nTop+i,nLeft+Len(cMess[i])+3 GET MemVar->xVar[i]
ELSE
@nTop+i,nLeft+Len(cMess[i])+3 GET MemVar->xVar[i] PICTURE cPict[i]
ENDIF
ELSE
IF EMPTY(cPict[i])
@nTop+i,nLeft+Len(cMess[i])+3 REFER cRef[i] GET MemVar->xVar[i]
ELSE
@nTop+i,nLeft+Len(cMess[i])+3 REFER cRef[i] GET MemVar->xVar[i] PICTURE cPict[i]
ENDIF
ENDIF
if( !Empty( cWhen[i] ), ATAIL(MemVar->GetList):preblock := &('{||'+cWhen[i]+'}'), NIL )
if( !Empty( cValid[i] ), ATAIL(MemVar->GetList):postblock := &('{||'+cValid[i]+'}'), NIL )
ATAIL(MemVar->GetList):display()
NEXT
READ
IF lOne
Ret_:=if(LastKey()<>K_ESC,MemVar->xVar[1],BLANK(MemVar->xVar[1],.T.))
ELSE
Ret_ := ARRAY(LEN(cVar))
aEVAL(cVar,{|x,i|x,Ret_[i]:=if(LastKey()<>K_ESC,MemVar->xVar[i],BLANK(MemVar->xVar[i],.T.))})
ENDIF
Recover USING S //ANDKOR
SayError('Ошибка при вводе данных')
End Sequence //ANDKOR
ENDIF
RestSet( aSet[1] )
Return Ret_
Собственно тут виден пример также,как в стандарте в GET применять использование справочников
По самой теме считаю консультации Алексея Новикова абсолютно правильными.
Не увидел в начале оборота SaveSetKey() - RestSetKey()
Уверен что ошибка не связана с QINPUT
Без отладчика и более подробного кода дать ответ именно по Вашему исх. коду можно было только так, как это сделал Алексей
ОАО КРССУ пишет:
У кнопки ModalResult, как грамотно настроить поведение формы в зависимости от значения? Выставление параметра ModalResult - mrCancel и CancelButton - bButton1 не влияет на закрытие формы, закрывает только ::close
Свойство ModalResult класса xbButton
используется только на формах с горячим вводом (Автотранспорт\ВВод маршрута, Договора\Ввод договора и т.д.)
значение mrOk - ставиться кнопке ОК
значение mrCancel - ставиться кнопке Отмена
В "простой форме" - оно не задействовано
Другими словами прочитали и забудьте эти свойства Для Вас только Close
ОАО КРССУ пишет:
При компиляции проекта в BestIDE, в папке Client\Bin\Userlibs создается myform.bdll и в серверной части \Server\Data\Pro\userlibs тоже. Но при отладке программы файлы в клиентском каталоге запираются другими пользователями терминала, в результате чего проект при запуске из БЭСТ5 не обновляется
для обновления клиентских мест есть механизм сервис-паков.
Кладете туда bdll и она обновится при старте на клиентском месте
ОАО КРССУ пишет:
Как взаимосвязаны программы/модули (unit.prg) и формы (form.prg), можно ли вызывать их друг из друга?
Не надо друг из друга вызывать prg
Пишете в них функции, получается некая библиотека.
Если функции не STATIC то собственно они видны и ее достаточно подгрузить, чтобы ими пользоваться. И разумеется из разных prg этими функциями можно пользоваться.
ОАО КРССУ пишет:
передачу параметров из формы в плагин и обратно
Тогда мне вот это непонятно.
Зачем для такой формы еще какой-то плдагин ?
А нельзя все как-то объединить ?
В bws вы можете собрать целую библиотеку плагинов и обменивайтесь через переменный на здоровье чем котите.
МОжет как-то на примере ?
То ли жутко примитивный и непонятно что может быть непонятно :)
То ли я никак понять не могу: что требуется
Александр Гершанов пишет:
Причина оказалась в том, что файл malabel.dbf и некоторые другие файлы скопировали из папки SCLAD в корень базы данных. Интересно, что в целом блок ТОВАРЫ работал штатно.
Не интересно. Это было в БЭСте всегда.
Отдельные пользователи таким образом пытались делать единый номенклатурный справочник для нескольких БД.
ОАО КРССУ пишет:
dbseek(struct->parent_id=My_id_parent)
Вот здесь Вы пишете совершенно не то !!!
Почитайте внимательно про DBSEEK()
Сюда надо класть значение для поиска по индексному ключу
А вы кладете логическое значение которое будет либо .T. либо .F.
Скорее всего такая конструкция работать не будет. Надо именно как я Вам написал.
Там все очень просто
Вы делаете поиск по значению parent_id текущей строки
Она ссылается на строку уровнем выше и по SEEK она перейдет на ту строку.
В той строке значение будет ссылкой на следующий уровень.
Т.е. Вам надо по сути:
1, найти нужную строку по ссылке из kadry_ordmove
В найденной строке определяете на сколько уровней надо подняться и делаете SEEK по id_parent
строки на которой стоите.
И больше ничего выдумывать не требуется