Главная
Новый форум
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Обсуждение написание модуля на харборе УРОК6 (метки)

 
Post new topic   Reply to topic   printer-friendly view     Forum Index -> Программирование в БЭСТ-4
View previous topic :: View next topic  
Author Message
nordk



Joined: 27 Jun 2005
Posts: 1000
Location: Горбунов Константин
Occupation: БЭСТ-Партнер
Interests: СПб

PostPosted: 20 Oct 2005 19:27    Post subject: Обсуждение написание модуля на харборе УРОК6 (метки) Reply with quote

Итак в соответствии с намеченным разберем как метки делать.

В первую очередь нам нужен массив

Code:
aInsWork:={}


Далее нам нужна функция на нажатие INS

Code:
FUNCTION INSWORK()
      PRIVATE nI,nLen
    nI:=ASCAN(aInsWork,RECNO())
    nLen:=LEN(aInsWork)
    IF EMPTY(nI)
      AADD(ainsWork,RECNO() )
   ELSE
      ADEL(ainsWork,nI)
      ASIZE(ainsWork,nLen-1)
   ENDIF
   __KEYBOARD( CHR(24) )
RETURN 2


Last edited by nordk on 20 Oct 2005 19:32; edited 1 time in total
Back to top
View user's profile Send private message Send e-mail
nordk



Joined: 27 Jun 2005
Posts: 1000
Location: Горбунов Константин
Occupation: БЭСТ-Партнер
Interests: СПб

PostPosted: 20 Oct 2005 19:31    Post subject: Reply with quote

Теперь функция реагирующая на + и -

Code:
FUNCTION addworkall(xWay)
   PRIVATE nI,nLen
   IF xWay=2
      ASIZE(ainsWork,0)
   ENDIF
   IF xWay=1
      ASIZE(ainsWork,0)
      WORK->( DBGOTOP() )
      WHILE WORK->( RECNO() )<WORK->( LASTREC() )+1
         AADD(ainsWork,WORK->( RECNO() ) )
         work->( DBSKIP() )
      ENDDO
   ENDIF
RETURN 2
Back to top
View user's profile Send private message Send e-mail
nordk



Joined: 27 Jun 2005
Posts: 1000
Location: Горбунов Константин
Occupation: БЭСТ-Партнер
Interests: СПб

PostPosted: 20 Oct 2005 19:36    Post subject: Reply with quote

Теперь запрограммируем реакцию на нажатие клавиш и поместим это перед InitList в нашем примере

Code:
SETKEY(22,{||inswork()})
SETKEY(43,{||addworkall(1)})
SETKEY(45,{||addworkall(2)})
Back to top
View user's profile Send private message Send e-mail
nordk



Joined: 27 Jun 2005
Posts: 1000
Location: Горбунов Константин
Occupation: БЭСТ-Партнер
Interests: СПб

PostPosted: 20 Oct 2005 19:42    Post subject: Reply with quote

Осталось подправить наш массив

aBlockCols:={{{||field->tek_data},0},..........}

Добавляем в начало массива еще один элемент и координаты вывода последующий столбцов увеличиваем на единичку примерно так

Code:
aBlockCols:={{{||IF(ASCAN(aInsWork,RECNO())>0,'&#8730;',' ')},0},{{||field->tek_data},1},..........}


компилируем и ....................чудо !!!!
Back to top
View user's profile Send private message Send e-mail
Виктория-Юг



Joined: 26 Oct 2005
Posts: 14
Location: Александр
Occupation: программист
Interests: Краснодар

PostPosted: 07 Nov 2005 15:59    Post subject: Не получилось Reply with quote

после вставки функций и описания массива после запуска программа пишет
Ошибка выполнения
Переменная не определена.

При отладке программа заходит в функции обработки клавиш,
но сваливается в первой строке.
Back to top
View user's profile Send private message
nordk



Joined: 27 Jun 2005
Posts: 1000
Location: Горбунов Константин
Occupation: БЭСТ-Партнер
Interests: СПб

PostPosted: 07 Nov 2005 16:34    Post subject: Reply with quote

Выложите Ваш текст программы плз
Back to top
View user's profile Send private message Send e-mail
Виктория-Юг



Joined: 26 Oct 2005
Posts: 14
Location: Александр
Occupation: программист
Interests: Краснодар

PostPosted: 07 Nov 2005 16:45    Post subject: Выкладываю весь код... Reply with quote

Выкладываю весь код...

#include "inkey.ch"
Function Main()
Local aSet,aSetKey,nTop,nBot,cColHead,aBlockCols,cCurproc
local bDel,_aHeads,aWhen,aPic,nUniMode,aRef,aValid,cFindMacro
local aHotKey,aType,aGetBlock,bPreGet,x,m,y,z,aInsWork

aSet:=SaveSet()
aSetKey:=SaveSetKey()

NETUSE("WORK",LoadPath()+"\real\work.dbf",,.F.)
NETUSE("_Partner",LoadPath()+"partner.dbf",,.F.)

DISPBOX(2,0,23,79,(Chr(201)+Chr(205)+Chr(187)+Chr(186)+Chr(188)+Chr(205)+Chr(200)+Chr(186)+' '),"W+/B")
nTop:=3
nBot:=22
aInsWork:={}
ASIZE(aInsWork,0)
aType:={{'1','Услуги системного инженера'},;
{'2','Услуги по программированию'},;
{'3','Услуги консультанта '},;
{'4','Услуги по терминальной св.'}}

cColHead:={" Дата Номер НАИМЕНОВАНИЕ Кол-во Цена Сумма "}

aBlockCols:={{{||IF(ASCAN(aInsWork,RECNO())>0,'$',' ')},0},;
{{||field->tek_data},1},;
{{||field->tek_nomer},10},;
{{||IF(!EMPTY(FIELD->TYPE),aType[VAL(FIELD->TYPE),2],SPACE(25))},17},;
{{||STR(field->kol,5)},43},;
{{||STR(field->cena,12,2)},49},;
{{||STR(field->summa,12,2)},62}}

_aHeads:={{"Введите дату работ.................:","TEK_DATA"},;
{"Введите номер документа............:","TEK_NOMER"},;
{"Наименование работ.................:","TYPE"},;
{"Количество.........................:","KOL","1","1","0"},;
{"Цена...............................:","CENA","1","1","0"},;
{"Сумма (руб.).......................:","SUMMA"},;
{"Наименование контрагента...........:","Name_p"}}
aWhen:={,,,,,{||aIn[6]:=aIn[4]*aIn[5]},,.T.}
// aValid:={{||nApp=2}}
aPic:={,,,,,"999999999.99",}
cCurProc:={||"2"}
bDel:={||.F.}
nUniMode=2
cFindMacro:='cFind$UPPER(Name)'
aHotKey:={{},{{'F5 - моя функция',K_SH_F5,{||myfunction()},1}},{}}
aGetBlock:={,,{|x|RotateBlock(x,aType,"aIn[3]")},,,,}
aRef:={,,{|x|RotateAndReader(x,aType)},,,,"partners"}
bPreGet:={,,{|x,y,z|aIn[x]:=FIELD->VID},,,,}

_PARTNER->( MAKEREFER("PARTNERS","Справочник поставщиков",2 ;
,{" Код ","Наименование поставщика"," И Н Н "},;
{3,5,16}, "n/w,w+/n",{"SHORTNAME"},{"aIn[7]"},,;
{{||FIELD->CODE},{||FIELD->SHORTNAME},;
{||FIELD->CODE_PR}},,,,,,,,,,,,,,,,,'cFind$UPPER(ShortName)';
,,,,,,,,,,,,,,,,,,,,'NAME') )

SETKEY(22,{||inswork()})
SETKEY(43,{||addworkall(1)})
SETKEY(45,{||addworkall(2)})

work->(Initlist(nTop,nBot,cColHead,aBlockCols,cCurProc,;
_aHeads,aRef,aPic,aWhen,,;
nUniMode,bDel,,,,;
,,aGetBlock,,,;
,,cFindMacro,,,;
bPreGet,,,,aHotKey))

WORK->(DBCLOSEAREA())
_partner->( DBCLOSEAREA() )

RestSetKey(aSetKey)
RestSet(aSet)
RETURN NIL

FUNCTION myfunction()
SayAndWait("OK")
RETURN 2

FUNCTION inswork()
private nI,nLen
nI:=ASCAN(aInsWork,work->(RECNO()))
nLen:=LEN(aInsWork)
IF EMPTY(nI)
AADD(aInsWork,work->(RECNO()))
ELSE
ADEL(aInsWork,nI)
ASIZE(aInsWork,nLen-1)
ENDIF
__KEYBOARD(CHR(24))
RETURN 2

FUNCTION addworkall(xWay)
private nI,nLen
IF xWay=2
ASIZE(aInsWork,0)
ENDIF
IF xWay=1
ASIZE(aInsWork,0)
WORK->(DBGOTOP())
WHILE WORK->(RECNO())<WORK->(LASTREC())+1
AADD(aInsWork,WORK->(RECNO()))
work->(DBSKIP())
ENDDO
ENDIF
RETURN 2
Back to top
View user's profile Send private message
nordk



Joined: 27 Jun 2005
Posts: 1000
Location: Горбунов Константин
Occupation: БЭСТ-Партнер
Interests: СПб

PostPosted: 07 Nov 2005 16:54    Post subject: Reply with quote

Первое что бросается в глаза
Вы объявили aInsWork Local
Значит для вложенных функций это имя не видно
Объявите его PRIVATE
Если во вложенных функциях вы его используете старайтесь писать
m->aInsWork (m-> или memo->)
Back to top
View user's profile Send private message Send e-mail
nordk



Joined: 27 Jun 2005
Posts: 1000
Location: Горбунов Константин
Occupation: БЭСТ-Партнер
Interests: СПб

PostPosted: 07 Nov 2005 16:58    Post subject: Reply with quote

Когда вы работаете и отлаживаете не только основную функцию но и внутренние, во внутренние для отладки кладите ALTD() и тогда Вы сможете и там ошибки отладчиком находить, а то в InitList() Вы вынуждены нажимать F5 и дальше отладчик отключатеся (больше нет точек прерывания). А еще такие точки можно при первом вызове отладчика помечать посредством нажатия F9 и дальше в пошаговом по F8 не обязательно. До этой точки сразу через F5 дойдет
Back to top
View user's profile Send private message Send e-mail
Виктория-Юг



Joined: 26 Oct 2005
Posts: 14
Location: Александр
Occupation: программист
Interests: Краснодар

PostPosted: 08 Nov 2005 09:41    Post subject: Reply with quote

Объявлялось и как приват, локал видно потом я поменял...

что касается m->..
при создании списка с перебором по пробелу, ваш код у меня не работал,
пока я это m-> везде не поубирал...
от версии что-то может зависеть(12,01)?...
Back to top
View user's profile Send private message
nordk



Joined: 27 Jun 2005
Posts: 1000
Location: Горбунов Константин
Occupation: БЭСТ-Партнер
Interests: СПб

PostPosted: 09 Nov 2005 12:46    Post subject: Reply with quote

c m->
ошибок нет от версии не зависит.
просто когда есть в памяти переменная и вы запускаете вторую функцию то там Вы говорите через m->
что это переменная не текущей функции а из памяти (все равно как алиас указывать к имени поля)
Просто c Local она действительно не работает - потому что ее нет в функции а дальше могу отнести только к психологическому эффект
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic   printer-friendly view     Forum Index -> Программирование в БЭСТ-4 All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © phpBB Group

Rambler
Rambler's Top100 Рейтинг@Mail.ru