Форум » Clipper » Вопрос по сборке проекта » Ответить

Вопрос по сборке проекта

yukirin: использую Clipper 5.2e portable выкачанный по адресу http://softclipper.narod.ru/download.html. При сборке проекта rtlink предлагает указать путь до библиотеки CE50.LIB. Подскажите пожалуйста где найти данный файлик... или полноценную папку со всеми библиотеками. Опыт работы с clipper отсутсвует а экзешник собрать очень хочется. Please help...

Ответов - 67, стр: 1 2 3 4 All

alkresin: Про отладчик ничего не скажу - я 5.3 никогда не пользовался. Попробуйте расставить в начале программы, например, вызовы Alert("какой-то текст") - эта функция выдает на экран box с текстом - для простейшей трассировки. Warning'и эти не критичны. Они означают, что данная переменная не объявлена как Memvar, это не преступление. Если какая-то переменная вообще не объявлена, может в процессе исполнения выскочить ошибка - что нет такой-то переменной, но никак не Processor stack fault.

yukirin: Закомментировал все init procedure т.к. они по названию и содержанию повторяют процедуры, например, со страницы http://www.mythologics.com/c53/_cliplib.html ( init procedure CLIPINIT ) и др. Я так понимаю что инит процедуры автоматитически прилинковываются после присоединения файла библиотки в скрипте линкера или надо как то явно указывать необходимость вызова той же CLIPINIT, т.к. у меня после комментирования всех уже и так существующих в CLIPPER.LIB инит процедур экзешник запускается и тут же завершается без каких либо сообщений, соответсвенно до alert не доходим. (((Меня начинают посещать мысли о неосуществимости моей затеи по получению рабочей программы..... Еще сегодня помучаюсь и завтра начну, наверное, пробовать декомпилировать.....

yukirin: Где можно посмотреть полный список ф-ций/процедур содержащихся в клиппер.либ версии 5.2е?


alkresin: yukirin пишет: у меня после комментирования всех уже и так существующих в CLIPPER.LIB инит процедур экзешник запускается и тут же завершается без каких либо сообщений, соответсвенно до alert не доходим. Я бы в таком случае действовал следующим образом: урезал бы программу до минимума, скомпилировал, запустил. Если работает ( если - нет, значит с моим компилятором что-то не то ), то добавляем фрагмент, проверяем - и т.д. yukirin пишет: Где можно посмотреть полный список ф-ций/процедур содержащихся в клиппер.либ версии 5.2е? В ng ( Norton Guide ) соответствующем. А если совсем полный :), то какой-нибудь утилитой, выдающей листинг .lib файла, у меня тут несколько таких - libra.exe, libview.exe, lib.exe

nick_mi: Для запуска DEBUGGER в CLIPPER 5.3 необходимо в файле .LNK для blinker'а поставить команду FI CLD.lib В программе после запуска нажать комбинацию ALT+D

yukirin: Есть прогресс выходит первоначальная заставка затем прога вываливается на первой встретившейся ф-ции dbcreate с сообщением - ДБ КРЕАТЕ ИНТЕРНАЛ ЭРРОР. Еще почемуто попытка вставить код - alert( "ku-ku" ) приводит появлению окошка с надписью типа - OMPT (4606) и программа завершается. Но и это уже прогресс буду ковырять дальше. Непонятно зачем в текст программы были вставлены куски из декампилированного clipper.lib, причем вставлены они хаотично... Засяду ка я за очистку проги от ненужного текста....хотя это и не быстрая процедура...

Pasha: Исходники как я понимаю получены декомпилятором. А декомпилятор берет весь пи-код, который содержится в exe. Это и пользовательский пи-код, и пи-код функций клиппера, реализованных на уровне prg и содержащихся в стандартных библиотеках Декомпилятору неизвестно, из какого модуля получен пи-код, вот он и декомпилирует все, что может. Поэтому конечно стандартные функции лучше удалить, все равно они будут прилинкованы из библиотек. Скажем, можно взять модуль source\sys\getsys.prg и смело удалять из текста все функции, в нем присутствующие Правда, там есть еще static-переменные, с ними не так просто А по поводу предупреждений: перед первой функцией можно добавить строку: memvar GetList и предупреждения по этой переменной исчезнут Что до остальных предупреждений, то они могут быть и безобидными, а могут и опасными, в зависимости от того, в каком стиле написана программа. Могут быть неприятности из-за декомпиляции при разбивке текста на несколько модулей Скажем, если функция использует static-переменную, то эта переменная должна остаться в том же модуле, что и сама функция.

nick_mi: Я просто как-то пропустил, для того чтобы отладчик запускался с произвольного места необходимо вставить вызов функции ALTD()

Andrey: yukirin пишет: Нужна помощь в сборке проекта. У меня имеется голый исходник размером в 28700 строк который мне достался от одного человека со словами - что это единственный существующий текст программы - другого нет. У меня получить работоспособный экзешник не получается Давай исходник, я тебе его на хХарбор переведу и не будешь мучиться с Клипером.

Dima: Andrey пишет: Давай исходник, я тебе его на хХарбор переведу и не будешь мучиться с Клипером. Ну тогда ждем результата

yukirin: Программа начинает оживать.... собс-но уже работает за исключением печати. Печать реализована в классе TPrinter. линкуется с библиотекой objects без предупреждений... Но при попытке печати прога вываливается с ошибкой - ERROR BASE/1004 No exported method: LOAD. Расскажите пожалуйста про варианты возникновения данной ошибки.

Pasha: В коде должно быть по первых определение класса TPrinter и его методов: что-то вроде function TPRINTER _objaddmet(StaticNNN, Nil, .T., 0, "Load", {|| Load()}) Return _objclsins(StaticNNN) методы: static function load(...) return ... и где-то создание объекта класса: вызов TPrinter():new(...) В исходном коде это было бы оформлено в виде команд, а в декомпилированном - функциями. Что-нибудь подобное есть ?

yukirin: В переданном мне исходнике (кстати данный текст полчен при помощи rescue5 - мной проверено) отсутствует текст одного метода класса TPrinter, т.к. он присутствует в объявлении класса. Вопрос - можно ли как-нибудь его вычленить из экзешника (rescue - получается отказывается его извлекать)?

Pasha: Здесь есть 2 варианта: или этот метод написан на C, и тогда его декомпилировать невозможно. Но это маловероятно. 2-й вариант - декомпилятор действительно декомпилировал не весь пи-код. Но тогда это проблема небольшая, можно декомпилировать этот exe Валькирией. Валькирия имеет лучшую репутацию, чем rescue5. Чтобы труд по обработке текста и сборке проекта не пропал даром, можно перенести в уже обработанный текст программы только один этот метод, полученный Валькирией. Саму Valkyrie думаю найти несложно.

yukirin: увы и ах.....Valkyrie тоже ниче не выдала. Есть мелкая надежда на то что используемый класс не полное творение разработчика. Поэтому ниже приведен текст фнукция где этот класс создается мож с подобным классом уже кто сталкивался.... function TPRINTER static Static26 local Local1 if (ISNIL(Static26)) Static26:= _newclass("TPrinter", Local1) _addmethod({"Text1"}, Nil, Nil, 1) _addmethod({"aOpr"}, Nil, Nil, 1) _addmethod({"aVar"}, Nil, Nil, 1) _addmethod({"nStr"}, Nil, Nil, 1) _addmethod({"nList"}, Nil, Nil, 1) _addmethod({"Auto"}, Nil, Nil, 1) _addmethod({"IsPrn"}, Nil, Nil, 1) _addmethod({"Device"}, Nil, Nil, 1) _addmethod({"ReportName"}, Nil, Nil, 1) _addmethod({"cHead"}, Nil, Nil, 1) _addmethod({"cEject"}, Nil, Nil, 1) _addmethod({"cHeadFoot"}, Nil, Nil, 1) _addmethod({"cFoot"}, Nil, Nil, 1) _addmethod({"cTitul"}, Nil, Nil, 1) _addmethod({"nHeadWidth"}, Nil, Nil, 1) _addmethod({"KolStr"}, Nil, Nil, 1) _addmethod({"Ustanovki"}, Nil, Nil, 1) _addmethod({"lContinue"}, Nil, Nil, 1) _addmethod({"cFile"}, Nil, Nil, 1) _addmethod({"cSource"}, Nil, Nil, 1) _addmethod({"lLoadError"}, Nil, Nil, 1) _addmethod({"Rulon"}, Nil, Nil, 1) _addmethod({"lTempFile"}, Nil, Nil, 1) _addmethod({"Init", {|| tprninit()}}, Nil, .T., 0) _addmethod({"Load", {|| tprnload()}}, Nil, .T., 0) _addmethod({"SetDevice", {|| tprnsetdev()}}, Nil, .F., 0) _addmethod({"Process", {|| tprnproces()}}, Nil, .F., 0) _addmethod({"PrintTitul", {|| tprntitul()}}, Nil, .F., 0) _addmethod({"PrintHead", {|| tprnhead()}}, Nil, .F., 0) _addmethod({"PrintHeadFoot", {|| tprnheadfo()}}, Nil, .F., 0) _addmethod({"PrintStr", {|| tprnstr()}}, Nil, .F., 0) _addmethod({"PrintFoot", {|| tprnfoot()}}, Nil, .F., 0) _addmethod({"PrintFormula", {|| tprnprintf()}}, Nil, .F., 0) _addmethod({"Set", {|| tprnset()}}, Nil, .F., 0) _addmethod({"Done", {|| tprndone()}}, Nil, .F., 0) _addmethod({"StrTransform", {|| tprntransf()}}, Nil, .F., 0) _addmethod({"NewPage", {|| newpage()}}, Nil, .F., 0) _addmethod({"ResetPage", {|| resetpage()}}, Nil, .F., 0) _addmethod({"AddnStr", {|| tprnaddnst()}}, Nil, .F., 0) endif return __classins(Static26) ******************************** один из методов класса static function TPRNLOAD(Arg1) local Local1:= qself(), Local2, Local3:= {}, Local4:= {}, Local5, ; Local6, Local7, Local8, Local9 Local1:lloaderro(.F.) Local1:aopr({}) Local1:avar({}) if (!file(Arg1)) alert("Отсутствует файл отчетной формы " + Arg1) Local1:lloaderro(.T.) return .F. endif Local1:nstr(1) Local1:nlist(1) Local1:isprn(.T.) Local1:ctitul("") Local1:nheadwidt(40) Local1:kolstr(getcfg("KOLSTR", Arg1, "N")) if (Local1:kolstr() == 0) Local1:kolstr(75) endif Local1:device(getcfg("DEVICE", Arg1, "C")) Local1:rulon(getcfg("RULON", Arg1, "C")) if (Upper(Local1:rulon()) = "ДА") Local1:rulon(.T.) else Local1:rulon(.F.) endif Local1:ustanovki("") Local1:ustanovki(getcfg("Ustanovki", Arg1, "C")) Local1:ceject(getcfg("EJECT", Arg1, "C")) if (Empty(Local1:ceject())) Local1:ceject(" ") endif if (Empty(Local1:ustanovki()) .AND. Type("cUstanovki") != "U") Local1:ustanovki(custanovki) elseif (Upper(Local1:ustanovki()) == "НЕТ") Local1:ustanovki("") endif Local1:lcontinue(.T.) Local2:= memoread(Arg1) Local1:cfile(SubStr(Arg1, 1, Len(Arg1) - 3) + "prn") Local1:csource(memoread(Arg1)) Local1:ctitul(beforatnum(Chr(13) + Chr(10) + "ENDTITUL", ; afteratnum("TITUL" + Chr(13) + Chr(10), Local1:csource(), 1), ; 1)) Local1:chead(beforatnum(Chr(13) + Chr(10) + "ENDPAGEHEAD", ; afteratnum("PAGEHEAD" + Chr(13) + Chr(10), Local1:csource(), ; 1), 1)) Local1:cheadfoot(beforatnum(Chr(13) + Chr(10) + "ENDPAGEFOOT", ; afteratnum("PAGEFOOT" + Chr(13) + Chr(10), Local1:csource(), ; 1), 1)) Local1:cfoot(beforatnum(Chr(13) + Chr(10) + "ENDMAINFOOT", ; afteratnum("MAINFOOT" + Chr(13) + Chr(10), Local1:csource(), ; 1), 1)) Local1:reportnam("Отчет") tokeninit(@Local2, Chr(13) + Chr(10), 2) Local5:= 0 Local9:= .F. do while (!tokenend()) Local7:= tokennext(Local2) Local6:= alltrim(Local7) Local5++ do case case Left(Local6, 1) == "#" if (!Local9) Local1:reportnam(SubStr(Local7, 2)) Local9:= .T. endif loop case Upper(Local6) = "KOLSTR" .OR. Upper(Local6) = "USTANOVKI" ; .OR. Upper(Local6) = "RULON" .OR. Upper(Local6) = ; "DEVICE" .OR. Upper(Local6) = "LIST" .OR. Upper(Local6) ; = "EJECT" loop case Upper(Local6) = "TITUL" do while (!tokenend() .AND. Upper(Local6) != "ENDTITUL") Local7:= tokennext(Local2) Local5++ Local6:= alltrim(Local7) enddo case Upper(Local6) = "PAGEHEAD" do while (!tokenend() .AND. Upper(Local6) != "ENDPAGEHEAD") Local7:= tokennext(Local2) Local5++ Local6:= alltrim(Local7) enddo case Upper(Local6) = "PAGEFOOT" do while (!tokenend() .AND. Upper(Local6) != "ENDPAGEFOOT") Local7:= tokennext(Local2) Local5++ Local6:= alltrim(Local7) enddo case Upper(Local6) = "MAINFOOT" do while (!tokenend() .AND. Upper(Local6) != "ENDMAINFOOT") Local7:= tokennext(Local2) Local5++ Local6:= alltrim(Local7) enddo case Upper(Local6) = "VAR" Local6:= alltrim(SubStr(Local6, 4)) numelem:= numtoken(Local6, "," + Chr(13) + Chr(10)) for Local8:= 1 to numelem AAdd(Local1:avar(), alltrim(token(Local6, "," + Chr(13) ; + Chr(10), Local8))) Local5++ next case Upper(Local6) = "AUTO" Local5++ Local1:auto(.T.) case SubStr(Local6, 1, 2) = "@ " Local6:= LTrim(SubStr(Local6, 2)) Local7:= alltrim(Local6) do case case Upper(Local7) = "IF" AAdd(Local1:aopr(), {"IF", alltrim(SubStr(Local7, 3)), ; Local5, 0, &("{||" + alltrim(SubStr(Local7, 3)) + ; "}")}) AAdd(Local3, Len(Local1:aopr())) case Upper(Local7) = "ELSE" if (Len(Local3) == 0) alert("Ошибка в составлении условных операторов;Строка" ; + Str(alltrim(Local5))) Local1:lloaderro(.T.) return .F. endif if (Empty(SubStr(Local7, 5))) AAdd(Local1:aopr(), {"ELSE", alltrim(SubStr(Local7, ; 5)), Local5, 0}) else AAdd(Local1:aopr(), {"ELSE", alltrim(SubStr(Local7, ; 5)), Local5, 0, &("{||" + alltrim(SubStr(Local7, ; 5)) + "}")}) endif Local1:aopr()[ATail(Local3)][4]:= Len(Local1:aopr()) Local3[Len(Local3)]:= Len(Local1:aopr()) case Upper(Local7) = "ENDIF" if (Len(Local3) == 0) alert("Ошибка в составлении условных операторов;Строка " ; + alltrim(Str(Local5))) Local1:lloaderro(.T.) return .F. endif AAdd(Local1:aopr(), {"ENDIF", "", Local5, 0}) Local1:aopr()[ATail(Local3)][4]:= Len(Local1:aopr()) asize(Local3, Len(Local3) - 1) case Upper(Local7) = "WHILE" AAdd(Local1:aopr(), {"WHILE", alltrim(SubStr(Local7, ; 6)), Local5, 0, &("{||" + alltrim(SubStr(Local7, 6)) ; + "}")}) AAdd(Local4, Len(Local1:aopr())) case Upper(Local7) = "ENDWHILE" if (Len(Local4) == 0) Local1:lloaderro(.T.) alert("Ошибка в составлении условных операторов;Строка " ; + alltrim(Str(Local5))) return .F. endif AAdd(Local1:aopr(), {"ENDWHILE", "", Local5, ; ATail(Local4)}) Local1:aopr()[ATail(Local4)][4]:= Len(Local1:aopr()) asize(Local4, Len(Local4) - 1) case "{|" $ Upper(Local7) .OR. "&" $ Upper(Local7) AAdd(Local1:aopr(), {"OP", Local7, Local5, 0, "{||" + ; Local7 + "}"}) otherwise AAdd(Local1:aopr(), {"OP", Local7, Local5, 0, &("{||" + ; Local7 + "}")}) endcase case SubStr(Local6, 1, 1) != "@" AAdd(Local1:aopr(), {"STR", Local7, Local5, 0}) endcase enddo for Local8:= 1 to Len(Local1:avar()) Local6:= Local1:avar()[Local8] if (Type("M->" + Local6) = "U") public &Local6 endif next return ******************************** процедура через которую осуществляется печать форм: procedure PRINTFORM(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) local Local1, Local2 if (demoflag) demo() else showmessag("Формирую отчет.") Arg3:= iif(Arg3 = Nil, .F., Arg3) Arg4:= iif(Arg4 = Nil, .F., Arg4) Arg5:= iif(Arg5 = Nil, .F., Arg5) Arg6:= iif(Arg6 = Nil, 0, Arg6) if (file(dallvod + Arg1)) Local1:= tprinter():load(dallvod + Arg1) else Local1:= tprinter():load(dvod + Arg1) endif if (Local1:lloaderror()) showmessag() else if (Arg2 != Nil) Local1:device(Arg2) endif Arg2:= iif(!Empty(ctempdir), ctempdir + "\", "") + ; Local1:device() if (Local1:setdevice(Arg4, Arg5)) Local2:= Local1:reportname() if (Local1:process()) if (Arg3 .AND. file(Arg2 + ".prn")) edittext(Arg2 + ".prn", Local2 + Space(10) + Arg1, ; Arg6) endif endif endif showmessag() return endif endif ********************************

Pasha: А какого именно метода не хватает ? Метод TPrinter:Load как раз есть

yukirin: забыл сообщение.... а возможности проверить нет. но ругань идет на (если память не изменяет) lloaderro . На LOAD не ругаемся уже. Точнее не скажу... только вечером. 3-я строка TPRNLOAD. Вечером попробую дописать там букву 'r'.

Pasha: Понятно. Это связано с органичением длины символов в клиппере 10 знаков, и легко лечится. Вызовы типа Lodal1:lloaderro надо заменить: Local1:lloaderro() -> Local1:lloaderror Local1:lloaderro(.T.) -> Local1:lloaderror := .T. Local1:lloaderro(.F.) -> Local1:lloaderror := .F.

yukirin: Здравствуйте. Продолжаю мучить программу и вот вылезла интересная ошибка... ошибка лезет из класса TPRINTER. Кормом для этого класса являются текстовые файлы типа: #Абоненты var Sum,ItGaz,kodk1,mNaimg,nom KOLSTR=60 RULON=Да DEVICE=abonement EJECT=&l0H TITUL ОТЧЕТ ПО АБОНЕМЕНТАМ ПЕРИОД С @{dtoc(mD1)+' ПО '+dtoc(mD2)} ENDTITUL MAINFOOT Итого @{str(Sum,9)} @{saytime()} 1/A/2 ENDMAINFOOT PAGEHEAD ----------------------T----------T----------¬ ¦ Наименование ¦Код киоска¦Количество¦ +---------------------+----------+----------+ ENDPAGEHEAD PAGEFOOT L---------------------+----------+----------- ENDPAGEFOOT @ Sum:=0 @ dbSelectArea('tmp') @ dbGoTop() @ while !eof() @ itGaz:=0 @ mNaimg:=tmp->naimg @ nom:=0 @ while mNaimg=tmp->naimg @ if tmp->kol#0 @ nom:=nom+1 $@{' | '+if(nom=1,tmp->naimg,space(len(tmp->naimg)))+'| '+str(tmp->kodk,4)+' | '+str(tmp->kol,4)+' |'} @ ItGaz:=ItGaz+tmp->kol @ Sum:=Sum+tmp->kol @ endif @ dbSkip() @ endwhile @ if nom>1 $@{' | Итого '+space(28)+str(ItGaz,4)+' |'} @ endif itGaz#0 @ if NOM>0.AND.!eof() +---------------------+----------+----------+ @ endif @ endwhile Эти файлы обрабатываются методом TPRNLOAD приведенный в 15 посте(аргументом ARG1 для него будет путь к файлу). По ходу выполнения этого метода заполняется массив tprinter::aopr. В него заносятся строки кода, которые потом динамически будут выполняться. Есть один отчет (вернее разнарядка) на которой программа вываливается с сообщение об ошибке - BASE/1449 Syntax error: &. Ошибка возникает в строке otherwise AAdd(Local1:aopr, {"OP", Local7, Local5, 0, &("{||" + Local7 + "}")}) // при выполнении этой строки endcase метода TPRNLOAD, при обработке строки текстового файла отчета - var nSel,tmp,i,kolrec,cString,KolGor,Kol,SumR,SumO var aKodRaion,aNamRaion,aSumRaion,j,Sum,aSumRAll #,part var zagol,zagol1,zagol2,zagol3,zagol4,aCena,aKol,aKolO,cString1,kolrec1,SumAllG,SumAllO #Печать разнарядки на город @1=dtoc(rrh0->date) @2=trim(rrh0->time) @3=alltrim(str(rrh0->NomRasn,3)) @4='('+trim(rrh0->prim)+')' KOLSTR=55 RULON=Нет EJECT=&l0H Ustanovki=&l1O(s12H&l8D LIST=Нет #mod(oPrn:nList,2) PAGEHEAD Р А З Н А Р Я Д К А N @3 @1 @4 лист @{str(oPrn:nList,3)} часть @{str(part,2)} @{saytime()} 1/3/2/Enter/F5 @{if(oPrn:nList%2=0,chr(13)+chr(10)+zagol,'')} ENDPAGEHEAD @ part:=1 @ SumAllO:=0 @ SumAllG:=0 @ aKodRaion:={} @ aNamRaion:={} @ aSumRaion:={} @ aSumRAll:={} @ aCena:={} @ zagol:='' @ dbSelectArea('raig') @ dbGoTop() @ while !eof() @ aAdd(aKodRaion,raig->kodr) @ aAdd(aNamRaion,raig->naim) @ aAdd(aSumRaion,0) @ aAdd(aSumRAll,0) @ dbSkip() @ endwhile @ while !empty(aLockList) @ dbSelectArea('rrh') @ kolrec:=len(aLockList) @ aKol:=array(kolrec) @ aKolO:=array(kolrec) @ aFill(aKol,0) @ aFill(aKolO,0) @ Zagol1:=' РАЙОН:' @ Zagol2:=' :' @ Zagol3:=' :' @ Zagol4:=' :' @ i:=1 @ aFill(aSumRaion,0) @ while i<=kolrec.and.i<=9 @ dbGoTo(aLockList) @ Zagol1:=Zagol1+rrh->nnom+':' @ Zagol2:=Zagol2+padr(rrh->naimg,13)+':' @ Zagol3:=Zagol3+padr(substr(rrh->naimg,14),13)+':' @ Zagol4:=Zagol4+str(rrh->rcena,8,2)+' :' @ aAdd(aCena,rrh->rcena) @ i:=i+1 @ endwhile @ kolrec1:=i-1 @ if part>1 @ oPrn:NewPage() @ endif ------------------------------------------------------------------------------------------------------------------------------------ $@{zagol1} ------------------------------------------------------------------------------------------------------------------------------------ $@{zagol2} $@{zagol3} ------------------------------------------------------------------------------------------------------------------------------------ $@{zagol4} ------------------------------------------------------------------------------------------------------------------------------------ @ zagol:=' ------------------------------------------------------------------------------------------------------------------------------------'+chr(13)+chr(10) @ zagol:=zagol+zagol1+chr(13)+chr(10) @ zagol:=zagol+' ------------------------------------------------------------------------------------------------------------------------------------'+chr(13)+chr(10) @ zagol:=zagol+zagol2+chr(13)+chr(10) @ zagol:=zagol+zagol3+chr(13)+chr(10) @ zagol:=zagol+' ------------------------------------------------------------------------------------------------------------------------------------'+chr(13)+chr(10) @ zagol:=zagol+zagol4+chr(13)+chr(10) @ zagol:=zagol+' ------------------------------------------------------------------------------------------------------------------------------------' @ dbSelectArea('raig') @ dbGoTop() @ j:=1 @ while !eof() @ cString:=padr(raig->naim,8) @ i:=1 @ if raig->type='G' @ while i<=kolrec1 @ rrh->(dbGoTo(aLockList)) // ПРИ ОБРАБОТКЕ ЭТОЙ СТРОКИ МЫ ОШИБАЕМСЯ @ if rrd->(dbSeek(str(rrh0->NomRasn,3)+Upper(rrh->naimg)+rrh->nnom+'G'+str(raig->kodr,3))) @ cString:=cString+str(rrd->prihod,6)+' ' @ else @ cString:=cString+str(0,6)+' ' @ endif Причем до этого момента элементы в массив добавлялись исправно не один десяток раз ( точнее 68), а при добавлении 69-го элемента массива tprinter::aopr получаю ошибку..... . Существуют ли какие либо ограничения на размер массива в клиппере ? если есть как их преодолеть ? Если ограничений нет - то подскажите пожалуйста возможные причины возникновения данной ошибки. И еще один вопрос. Как мне включить(прилинковать) в ЕХЕ модуль функцию/процедуру явно не использующуюся в программе, но присутствующую во внешнем текстовом файле и, соответственно, выполняющуюся динамически. Например - SwpRunCmd().

alkresin: Существуют ли какие либо ограничения на размер массива в клиппере ? 4096 элементов. И еще один вопрос. Как мне включить(прилинковать) в ЕХЕ модуль функцию/процедуру явно не использующуюся в программе, но присутствующую во внешнем текстовом файле и, соответственно, выполняющуюся динамически. Например - SwpRunCmd(). Вставьте в текст программы REQUEST SwpRunCmd



полная версия страницы