View previous topic :: View next topic |
Author |
Message |
nordk
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
|
Posted: 20 Oct 2005 19:27 Post subject: Обсуждение написание модуля на харборе УРОК6 (метки) |
|
|
Итак в соответствии с намеченным разберем как метки делать.
В первую очередь нам нужен массив
Далее нам нужна функция на нажатие 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 |
|
 |
nordk
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
|
Posted: 20 Oct 2005 19:31 Post subject: |
|
|
Теперь функция реагирующая на + и -
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 |
|
 |
nordk
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
|
Posted: 20 Oct 2005 19:36 Post subject: |
|
|
Теперь запрограммируем реакцию на нажатие клавиш и поместим это перед InitList в нашем примере
Code: | SETKEY(22,{||inswork()})
SETKEY(43,{||addworkall(1)})
SETKEY(45,{||addworkall(2)}) |
|
|
Back to top |
|
 |
nordk
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
|
Posted: 20 Oct 2005 19:42 Post subject: |
|
|
Осталось подправить наш массив
aBlockCols:={{{||field->tek_data},0},..........}
Добавляем в начало массива еще один элемент и координаты вывода последующий столбцов увеличиваем на единичку примерно так
Code: | aBlockCols:={{{||IF(ASCAN(aInsWork,RECNO())>0,'√',' ')},0},{{||field->tek_data},1},..........} |
компилируем и ....................чудо !!!! |
|
Back to top |
|
 |
Виктория-Юг
Joined: 26 Oct 2005 Posts: 14 Location: Александр Occupation: программист Interests: Краснодар
|
Posted: 07 Nov 2005 15:59 Post subject: Не получилось |
|
|
после вставки функций и описания массива после запуска программа пишет
Ошибка выполнения
Переменная не определена.
При отладке программа заходит в функции обработки клавиш,
но сваливается в первой строке. |
|
Back to top |
|
 |
nordk
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
|
Posted: 07 Nov 2005 16:34 Post subject: |
|
|
Выложите Ваш текст программы плз |
|
Back to top |
|
 |
Виктория-Юг
Joined: 26 Oct 2005 Posts: 14 Location: Александр Occupation: программист Interests: Краснодар
|
Posted: 07 Nov 2005 16:45 Post subject: Выкладываю весь код... |
|
|
Выкладываю весь код...
#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 |
|
 |
nordk
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
|
Posted: 07 Nov 2005 16:54 Post subject: |
|
|
Первое что бросается в глаза
Вы объявили aInsWork Local
Значит для вложенных функций это имя не видно
Объявите его PRIVATE
Если во вложенных функциях вы его используете старайтесь писать
m->aInsWork (m-> или memo->) |
|
Back to top |
|
 |
nordk
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
|
Posted: 07 Nov 2005 16:58 Post subject: |
|
|
Когда вы работаете и отлаживаете не только основную функцию но и внутренние, во внутренние для отладки кладите ALTD() и тогда Вы сможете и там ошибки отладчиком находить, а то в InitList() Вы вынуждены нажимать F5 и дальше отладчик отключатеся (больше нет точек прерывания). А еще такие точки можно при первом вызове отладчика помечать посредством нажатия F9 и дальше в пошаговом по F8 не обязательно. До этой точки сразу через F5 дойдет |
|
Back to top |
|
 |
Виктория-Юг
Joined: 26 Oct 2005 Posts: 14 Location: Александр Occupation: программист Interests: Краснодар
|
Posted: 08 Nov 2005 09:41 Post subject: |
|
|
Объявлялось и как приват, локал видно потом я поменял...
что касается m->..
при создании списка с перебором по пробелу, ваш код у меня не работал,
пока я это m-> везде не поубирал...
от версии что-то может зависеть(12,01)?... |
|
Back to top |
|
 |
nordk
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
|
Posted: 09 Nov 2005 12:46 Post subject: |
|
|
c m->
ошибок нет от версии не зависит.
просто когда есть в памяти переменная и вы запускаете вторую функцию то там Вы говорите через m->
что это переменная не текущей функции а из памяти (все равно как алиас указывать к имени поля)
Просто c Local она действительно не работает - потому что ее нет в функции а дальше могу отнести только к психологическому эффект |
|
Back to top |
|
 |
|
|
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
|