Форум » Clipper » Компиляция-декомпиляция » Ответить

Компиляция-декомпиляция

tkandrey: Добрый день. Есть программа , написаная на 5 клиппере. После декомпиляции при помощи RESCUE5.EXE попробовал её вновь скомпилировать . С 642048 байт исходного размера получаю упорно 614400 байт. при этом ругается на фукции FIELDWBLOCK. "Ошибка BASE/1001 Undefined function:FIELDWBLOCK" Бьюсь над проблемой, а нужно декомпилировать, исходники - Бог знает где... Кто-нить поможет? Среду программирования скачал отсюда же - http://files.mail.ru/N84IIM (спасибо администратору DIMA-s)

Ответов - 15

AlexMyr: tkandrey пишет: С 642048 байт исходного размера получаю упорно 614400 байт. Это размер чего - исходников или exe? tkandrey пишет: Бьюсь над проблемой, а нужно декомпилировать Так декомпилировать получилось или нет? tkandrey пишет: Среду программирования скачал отсюда же Какая среда то?

Dima: AlexMyr пишет: Какая среда то? Полагаю Clipper 5.2e из темы http://clipper.borda.ru/?1-0-0-00000528-000-0-0-1315823697

tkandrey: Декомпилировать получилось. Все размеры в байта х - это размеры EXE модулей.Исходный и после компиляции декомпилированного. Версия - да - Clipper 5.2e


tkandrey: И ещё, я ж не знаю, корректно ли всё декомпилировано. Программа сия - для учёта основных средств, требует правки, исходников нет, режимы формирования всяких там отчётов, переиндексации, расчётов вроде работают, а вот режимы, в которых осуществляется правка таблиц при помощи команд MYBROWSE (ну , и там в построении формы для правки таблицы используется функция FIELDWBLOCK - на ней и обрывается работа программы)...

nick_mi: Выложите исходный текст того места, где произошла ошибка. Если ошибка возникает на этапе выполнения, CLIPPER по идее должен был сказать FIELDWBLOC , FIELDWBLOCK так как CLIPPER обрезает все символы переменных и функций до длины 10 символов

tkandrey: Буду предельно подробен. Например.Вот процедура(полученная в результате декомпиляции), которая обеспечивает режим работы "Работа с ОС". PROCEDURE PR_POK() DBSELECTAR("1") IF .NOT. YES_DBF_NT(DBF_SERVER + "OS", 0, 0, "INV_NOM", DBF_SERVER + ; "OS") DBCLOSEALL() __MRELEASE("*", .T.) RETURN ENDIF DBSETFILTE({||LIK_PER == 0}, "LIK_PER==0") DBSELECTAR("20") IF .NOT. YES_DBF_NT(DBF_SERVER + "SP_PODR", 0, 0, "KOD", DBF_SERVER + ; "SP_PODR") DBCLOSEALL() __MRELEASE("*", .T.) RETURN ENDIF DBSELECTAR("21") IF .NOT. YES_DBF_NT(DBF_SERVER + "SP_WORKS", 0, 0, "TAB_N", DBF_SERVER ; + "SP_WORKS") DBCLOSEALL() __MRELEASE("*", .T.) RETURN ENDIF IF .T. DBCLEARREL() ENDIF DBSETRELAT("SP_PODR", {||KOD_POD}, "KOD_POD") DBSELECTAR("22") IF .NOT. YES_DBF_NT(DBF_SERVER + "SP_MOL", 0, 0, "TAB_N", DBF_SERVER + ; "SP_MOL") DBCLOSEALL() __MRELEASE("*", .T.) RETURN ENDIF IF .T. DBCLEARREL() ENDIF DBSETRELAT("SP_WORKS", {||TAB_N}, "TAB_N") DBSELECTAR("6") IF .NOT. YES_DBF_NT("SP_NAO", 0, 0, "KOD", "SP_NAO") DBCLOSEALL() __MRELEASE("*", .T.) RETURN ENDIF DBSELECTAR("7") IF .NOT. YES_DBF_NT("SP_GR", 0, 0, "KOD", "SP_GR") DBCLOSEALL() __MRELEASE("*", .T.) RETURN ENDIF DBSELECTAR("8") IF .NOT. YES_DBF_NT("SP_NAZN", 0, 0, "KOD", "SP_NAZN") DBCLOSEALL() __MRELEASE("*", .T.) RETURN ENDIF DBSELECTAR("9") IF .NOT. YES_DBF_NT("SP_IST", 0, 0, "KOD", "SP_IST") DBCLOSEALL() __MRELEASE("*", .T.) RETURN ENDIF DBSELECTAR("10") IF .NOT. YES_DBF_NT(DBF_SERVER + "SUBSCHET", 0, 0, "SUBSCHET", ; DBF_SERVER + "SUBSCHET") DBCLOSEALL() __MRELEASE("*", .T.) RETURN ENDIF DBSELECTAR("1") IF .T. DBCLEARREL() ENDIF DBSETRELAT("SP_MOL", {||TAB_N}, "TAB_N") DBSETRELAT("SP_NAO", {||K_NAO}, "K_NAO") DBSETRELAT("SP_GR", {||K_GR}, "K_GR") DBSETRELAT("SP_NAZN", {||K_NAZN}, "K_NAZN") DBSETRELAT("SP_IST", {||K_IST}, "K_IST") DBGOTOP() PRIVATE NCOL := 30 PRIVATE NCOL1 := 9 PRIVATE NCOL2 := 6 PRIVATE NCOL3 := 1 PRIVATE MCOLUMNRUS[NCOL], MFIELD[NCOL], MALIAS[NCOL], MNOTEMPTY[NCOL1], ; REM[NCOL], NOWRITE[NCOL2], NOWRITEMOD[NCOL3], PICT[NCOL], POS[; NCOL], PRE[NCOL], MHELP[NCOL], MAUTO[NCOL] PRIVATE ZAGOLOVOK PRIVATE MGETVAR PRIVATE STR_END PRIVATE VARHELP PRIVATE YN_RES PRIVATE FGO PRIVATE NEMPTY := .T. MEMVAR->ZAGOLOVOK := " Работа с ОС " MEMVAR->STR_END := " F1 "+CHR(24)+CHR(25)+; " Enter Ct+Enter F6 Sh+F6 F2 Sh+F2 F8 F4 Sh+F1 Esc " MEMVAR->VARHELP := "pri" MEMVAR->YN_RES := .T. MEMVAR->MCOLUMNRUS[1] := "ИнвN " MEMVAR->MCOLUMNRUS[2] := "Наименование ОС" MEMVAR->MCOLUMNRUS[3] := "Завод-изготовитель" MEMVAR->MCOLUMNRUS[4] := "Модель" MEMVAR->MCOLUMNRUS[5] := "Паспорт" MEMVAR->MCOLUMNRUS[6] := "Д.вып." MEMVAR->MCOLUMNRUS[7] := "Куп/Пол" MEMVAR->MCOLUMNRUS[8] := "Д.пок." MEMVAR->MCOLUMNRUS[9] := "Д.экспл." MEMVAR->MCOLUMNRUS[10] := "Д.платы" MEMVAR->MCOLUMNRUS[11] := "ТабN МОЛ" MEMVAR->MCOLUMNRUS[12] := "Фамилия МОЛ" MEMVAR->MCOLUMNRUS[13] := "Кгр" MEMVAR->MCOLUMNRUS[14] := "Группа" MEMVAR->MCOLUMNRUS[15] := "Кназ" MEMVAR->MCOLUMNRUS[16] := "Назначение" MEMVAR->MCOLUMNRUS[17] := "Кфин" MEMVAR->MCOLUMNRUS[18] := "Источник финансирования" MEMVAR->MCOLUMNRUS[19] := "Субсч" MEMVAR->MCOLUMNRUS[20] := "Перв.стоим." MEMVAR->MCOLUMNRUS[21] := "Перв.износ" MEMVAR->MCOLUMNRUS[22] := "Тек.износ" MEMVAR->MCOLUMNRUS[23] := "Кнорм" MEMVAR->MCOLUMNRUS[24] := "Норма" MEMVAR->MCOLUMNRUS[25] := "Мес.аморт." MEMVAR->MCOLUMNRUS[26] := "Ав" MEMVAR->MCOLUMNRUS[27] := "АП" MEMVAR->MCOLUMNRUS[28] := "Nдок" MEMVAR->MCOLUMNRUS[29] := "Отправитель" MEMVAR->MCOLUMNRUS[30] := "Nттн" MEMVAR->MFIELD[1] := "INV_NOM" MEMVAR->MFIELD[2] := "NAME_OS" MEMVAR->MFIELD[3] := "ZAVOD" MEMVAR->MFIELD[4] := "MODEL" MEMVAR->MFIELD[5] := "PASPORT" MEMVAR->MFIELD[6] := "D_VIP" MEMVAR->MFIELD[7] := "POK_POL" MEMVAR->MFIELD[8] := "D_POK" MEMVAR->MFIELD[9] := "D_EKSPL" MEMVAR->MFIELD[10] := "D_PLATA" MEMVAR->MFIELD[11] := "TAB_N" MEMVAR->MFIELD[12] := "FAM" MEMVAR->MFIELD[13] := "K_GR" MEMVAR->MFIELD[14] := "NAME" MEMVAR->MFIELD[15] := "K_NAZN" MEMVAR->MFIELD[16] := "NAME" MEMVAR->MFIELD[17] := "K_IST" MEMVAR->MFIELD[18] := "NAME" MEMVAR->MFIELD[19] := "SUBSCHET" MEMVAR->MFIELD[20] := "STOIM" MEMVAR->MFIELD[21] := "IZN" MEMVAR->MFIELD[22] := "T_IZN" MEMVAR->MFIELD[23] := "K_NAO" MEMVAR->MFIELD[24] := "NAME" MEMVAR->MFIELD[25] := "M_AMORT" MEMVAR->MFIELD[26] := "AVTO" MEMVAR->MFIELD[27] := "ACT_PAS" MEMVAR->MFIELD[28] := "NOM_DOC" MEMVAR->MFIELD[29] := "OTPR" MEMVAR->MFIELD[30] := "NOM_TTN" MEMVAR->MALIAS[1] := 1 MEMVAR->MALIAS[2] := 1 MEMVAR->MALIAS[3] := 1 MEMVAR->MALIAS[4] := 1 MEMVAR->MALIAS[5] := 1 MEMVAR->MALIAS[6] := 1 MEMVAR->MALIAS[7] := 1 MEMVAR->MALIAS[8] := 1 MEMVAR->MALIAS[9] := 1 MEMVAR->MALIAS[10] := 1 MEMVAR->MALIAS[11] := 1 MEMVAR->MALIAS[12] := 21 MEMVAR->MALIAS[13] := 1 MEMVAR->MALIAS[14] := 7 MEMVAR->MALIAS[15] := 1 MEMVAR->MALIAS[16] := 8 MEMVAR->MALIAS[17] := 1 MEMVAR->MALIAS[18] := 9 MEMVAR->MALIAS[19] := 1 MEMVAR->MALIAS[20] := 1 MEMVAR->MALIAS[21] := 1 MEMVAR->MALIAS[22] := 1 MEMVAR->MALIAS[23] := 1 MEMVAR->MALIAS[24] := 6 MEMVAR->MALIAS[25] := 1 MEMVAR->MALIAS[26] := 1 MEMVAR->MALIAS[27] := 1 MEMVAR->MALIAS[28] := 1 MEMVAR->MALIAS[29] := 1 MEMVAR->MALIAS[30] := 1 MEMVAR->POS[1] := "CheckSpace(mGetVar).AND.CHK_INV()" MEMVAR->POS[7] := "!EMPTY(mGetVar).AND.(mGetVar=='0'.OR.mGetVar=='1')" MEMVAR->POS[8] := "!EMPTY(mGetVar)" MEMVAR->POS[11] := " sverka('mGetVar',22)" MEMVAR->POS[13] := " sverka('mGetVar',7)" MEMVAR->POS[15] := " sverka('mGetVar',8)" MEMVAR->POS[17] := " sverka('mGetVar',9)" MEMVAR->POS[19] := " sverka('mGetVar',10)" MEMVAR->POS[20] := " mGetVar>0" MEMVAR->POS[21] := " mGetVar<=STOIM" MEMVAR->POS[22] := " mGetVar<=STOIM.AND.mGetVar>=IZN" MEMVAR->POS[23] := " sverka('mGetVar',6)" MEMVAR->POS[26] := " (mGetVar==0.OR.mGetVar==1)" MEMVAR->POS[27] := " (mGetVar==0.OR.mGetVar==1)" MEMVAR->PRE[2] := "!EMPTY(INV_NOM)" MEMVAR->PRE[3] := "!EMPTY(INV_NOM)" MEMVAR->PRE[4] := "!EMPTY(INV_NOM)" MEMVAR->PRE[5] := "!EMPTY(INV_NOM)" MEMVAR->PRE[6] := "!EMPTY(INV_NOM)" MEMVAR->PRE[7] := "!EMPTY(INV_NOM)" MEMVAR->PRE[8] := "!EMPTY(INV_NOM)" MEMVAR->PRE[9] := "!EMPTY(INV_NOM)" MEMVAR->PRE[10] := "!EMPTY(INV_NOM)" MEMVAR->PRE[12] := "!EMPTY(INV_NOM)" MEMVAR->PRE[14] := "!EMPTY(INV_NOM)" MEMVAR->PRE[16] := "!EMPTY(INV_NOM)" MEMVAR->PRE[18] := "!EMPTY(INV_NOM)" MEMVAR->PRE[19] := "!EMPTY(INV_NOM)" MEMVAR->PRE[20] := "!EMPTY(INV_NOM)" MEMVAR->PRE[21] := "!EMPTY(INV_NOM)" MEMVAR->PRE[22] := "!EMPTY(INV_NOM)" MEMVAR->PRE[25] := "!EMPTY(INV_NOM)" MEMVAR->PRE[26] := "!EMPTY(INV_NOM)" MEMVAR->PRE[27] := "!EMPTY(INV_NOM)" MEMVAR->PRE[28] := "!EMPTY(INV_NOM)" MEMVAR->PRE[29] := "!EMPTY(INV_NOM)" MEMVAR->PRE[30] := "!EMPTY(INV_NOM)" MEMVAR->REM[1] := "Инвентарный номер" MEMVAR->REM[2] := "Завод-изготовитель" MEMVAR->REM[3] := "Наименование ОС" MEMVAR->REM[4] := "Модель,тип,марка" MEMVAR->REM[5] := "Паспорт" MEMVAR->REM[6] := "Дата выпуска" MEMVAR->REM[7] := "Источник приобретения: 0 - куплено , 1 - получено" MEMVAR->REM[8] := "Дата покупки" MEMVAR->REM[9] := "Дата ввода в эксплуатацию" MEMVAR->REM[10] := "Дата начала платы" MEMVAR->REM[11] := "Табельный номер МОЛ" MEMVAR->REM[12] := "Фамилия МОЛ" MEMVAR->REM[13] := "Код группы" MEMVAR->REM[14] := "Группа" MEMVAR->REM[15] := "Код назначения" MEMVAR->REM[16] := "Назначение" MEMVAR->REM[17] := "Код ист.финанс." MEMVAR->REM[18] := "Источник финансирования" MEMVAR->REM[19] := "Субсчет отнесения затрат" MEMVAR->REM[20] := "Первоначальная стоимость" MEMVAR->REM[21] := "Износ при поступлении" MEMVAR->REM[22] := "Текущий износ" MEMVAR->REM[23] := "Код нормы амортизации" MEMVAR->REM[24] := "Норма амортизации" MEMVAR->REM[25] := "Величина мес.амортизации(для авто-на 1000км)" MEMVAR->REM[26] := "Признак автотранспорта(1-автотранспорт)" MEMVAR->REM[27] := "Актив(1)/пассив(0)" MEMVAR->REM[28] := "Авизо" MEMVAR->REM[29] := "Отправитель" MEMVAR->REM[30] := "Номер ТТН" MEMVAR->MNOTEMPTY[1] := 1 MEMVAR->MNOTEMPTY[2] := 2 MEMVAR->MNOTEMPTY[3] := 8 MEMVAR->MNOTEMPTY[4] := 11 MEMVAR->MNOTEMPTY[5] := 13 MEMVAR->MNOTEMPTY[6] := 15 MEMVAR->MNOTEMPTY[7] := 17 MEMVAR->MNOTEMPTY[8] := 19 MEMVAR->MNOTEMPTY[9] := 23 MEMVAR->NOWRITE[1] := 12 MEMVAR->NOWRITE[2] := 14 MEMVAR->NOWRITE[3] := 16 MEMVAR->NOWRITE[4] := 18 MEMVAR->NOWRITE[5] := 24 MEMVAR->NOWRITE[6] := 25 MEMVAR->NOWRITEMOD[1] := 1 MEMVAR->MAUTO[1] := "Aut_pr" MEMVAR->MHELP[11] := "HLP_MOL" MEMVAR->MHELP[13] := "HLP_GR" MEMVAR->MHELP[15] := "HLP_NAZN" MEMVAR->MHELP[17] := "HLP_IST" MEMVAR->MHELP[19] := "HLP_SUB" MEMVAR->MHELP[23] := "HLP_NAO" SETCOLOR(COL5) SCROLL() SETPOS(0, 0) SETCOLOR(COL2) SCROLL(0, 0, 0, MAXCOL()) SETPOS(0, 0) DEVPOS(0, 2) DEVOUT(AVTOR) DEVPOS(0, MAXCOL() - 9) DEVOUT(DATE()) SETCOLOR(COL5) SET(4, IF(__SETCENTU(), "dd.mm.yyyy", "dd.mm.yy")) BEGIN SEQUENCE MYBROWSE(2, 2, MAXROW() - 2, 78, 1, .T., .T., .T., (&(; " { || F8_pok() } ")), 1, NIL, NIL, (&("{ ||App_pok() }")), (&(; "{ ||LMod_pr() }")), (&("{ || FUser_pr() }")), .F., NIL, NIL, ; NIL) END SEQUENCE SET(4, IF(__SETCENTU(), "dd/mm/yyyy", "dd/mm/yy")) DBCLOSEALL() __MRELEASE("*", .T.) RETURN Не работает именно строчка команды MYBROWSE . Функции: FUNCTION F8_POK() LOCAL L1, L2 := RECNO() L1 := SAVESCREEN(NIL, NIL, NIL, NIL) BELL(1) IF ASK(" Вы уверены, что хотите удалить запись ? ", 2) DBSELECTAR("11") IF .NOT. YES_DBF_NT(DBF_SERVER + "VN_OS", 1, 0, ; "INV_NOM+DTOS(D_PEREM)", DBF_SERVER + "VN_OS") RESTSCREEN(NIL, NIL, NIL, NIL, L1) RETURN ENDIF DBSELECTAR("12") IF .NOT. YES_DBF_NT(DBF_SERVER + "AO_OS", 1, 0, "INV_NOM", ; DBF_SERVER + "AO_OS") VN_OS->(DBCLOSEARE()) RESTSCREEN(NIL, NIL, NIL, NIL, L1) RETURN ENDIF DBSELECTAR("1") IF .NOT. YES_DBF_NT(DBF_SERVER + "OS", 1, 0, "INV_NOM", DBF_SERVER +; "OS") IF .NOT. YES_DBF_NT(DBF_SERVER + "OS", 0, 0, "INV_NOM", ; DBF_SERVER + "OS") DBCLOSEALL() __MRELEASE("*", .T.) BREAK( NIL ) ELSE DBSETFILTE({||LIK_PER == 0}, "LIK_PER==0") IF .T. DBCLEARREL() ENDIF DBSETRELAT("SP_MOL", {||TAB_N}, "TAB_N") DBSETRELAT("SP_NAO", {||K_NAO}, "K_NAO") DBSETRELAT("SP_GR", {||K_GR}, "K_GR") DBSETRELAT("SP_NAZN", {||K_NAZN}, "K_NAZN") DBSETRELAT("SP_IST", {||K_IST}, "K_IST") DBGOTO(L2) RESTSCREEN(NIL, NIL, NIL, NIL, L1) VN_OS->(DBCLOSEARE()) AO_OS->(DBCLOSEARE()) RETURN .F. ENDIF ELSE SLEEP() DBGOTO(L2) DBSELECTAR("VN_OS") DBEVAL({||DBDELETE()}, {||INV_NOM == OS->INV_NOM}, NIL, NIL, NIL, ; .F.) __DBPACK() DBSELECTAR("AO_OS") DBEVAL({||DBDELETE()}, {||INV_NOM == OS->INV_NOM}, NIL, NIL, NIL, ; .F.) __DBPACK() DBSELECTAR("OS") DBDELETE() __DBPACK() MEMVAR->NEMPTY := .T. BELL(3) ENDIF DBSELECTAR("1") IF .NOT. YES_DBF_NT(DBF_SERVER + "OS", 0, 0, "INV_NOM", DBF_SERVER +; "OS") DBCLOSEALL() __MRELEASE("*", .T.) BREAK( NIL ) ELSE DBSETFILTE({||LIK_PER == 0}, "LIK_PER==0") IF .T. DBCLEARREL() ENDIF DBSETRELAT("SP_MOL", {||TAB_N}, "TAB_N") DBSETRELAT("SP_NAO", {||K_NAO}, "K_NAO") DBSETRELAT("SP_GR", {||K_GR}, "K_GR") DBSETRELAT("SP_NAZN", {||K_NAZN}, "K_NAZN") DBSETRELAT("SP_IST", {||K_IST}, "K_IST") DBGOTOP() BROWSE:REFRESHALL() RESTSCREEN(NIL, NIL, NIL, NIL, L1) VN_OS->(DBCLOSEARE()) AO_OS->(DBCLOSEARE()) RETURN .F. ENDIF ENDIF RESTSCREEN(NIL, NIL, NIL, NIL, L1) RETURN .F. PROCEDURE APP_POK() IF LASTKEY() = 27 RETURN ENDIF FIELD->D_POK := DATE() FIELD->POK_POL := "0" FIELD->LIK_PER := 0 FIELD->AVTO := 0 FIELD->ACT_PAS := 1 RETURN PROCEDURE LMOD_PR() LOCAL L1, L2 := SELECT() L1 := SAVESCREEN(NIL, NIL, NIL, NIL) IF LASTKEY() = 27 RETURN ENDIF DBSELECTAR("OS") IF PROCNAME(2) == "DOGET" .AND. MEMVAR->MFIELD[BROWSE:COLPOS] == "K_NAO" ; .OR. PROCNAME(2) == "DOGET1" .AND. MEMVAR->MFIELD[GETMEN] == ; "K_NAO" DBSELECTAR("SP_NAO") DBSEEK(MGETVAR) DBSELECTAR("OS") IF OS->AVTO = 0 FIELD->M_AMORT := STOIM / 1200 * SP_NAO->NAME ELSE FIELD->M_AMORT := STOIM / 100 * SP_NAO->NAME ENDIF ENDIF IF PROCNAME(2) == "DOGET" .AND. MEMVAR->MFIELD[BROWSE:COLPOS] == "AVTO" ; .OR. PROCNAME(2) == "DOGET1" .AND. MEMVAR->MFIELD[GETMEN] == ; "AVTO" IF MGETVAR = 0 FIELD->M_AMORT := STOIM / 1200 * SP_NAO->NAME ELSE FIELD->M_AMORT := STOIM / 100 * SP_NAO->NAME ENDIF ENDIF IF (PROCNAME(2) == "DOGET" .AND. MEMVAR->MFIELD[BROWSE:COLPOS] == ; "STOIM" .OR. PROCNAME(2) == "DOGET1" .AND. MEMVAR->MFIELD[GETMEN] ; == "STOIM") .AND. .NOT. EMPTY(OS->K_NAO) IF OS->AVTO = 0 FIELD->M_AMORT := MGETVAR / 1200 * SP_NAO->NAME ELSE FIELD->M_AMORT := MGETVAR / 100 * SP_NAO->NAME ENDIF ENDIF RESTSCREEN(NIL, NIL, NIL, NIL, L1) DBSELECTAR(L2) RETURN PROCEDURE FUSER_PR() IF LASTKEY() = -9 IF NOTEMPTY() OTCUZ() IF OS->LIK_PER <> 0 DBGOTOP() BROWSE:REFRESHALL() ENDIF ENDIF RETURN ELSEIF LASTKEY() = -6 INV_KART() RETURN ELSE BELL(0) ENDIF RETURN Функции APP_POK() и FUSER_PR() входят в состав модуля LIB.UDF, который прописан в sredstva.grp,sredstva.lnk и в sredstva.rmk. Там же прописаны отдельно декомпилированные LMOD_PR.UDF и F8_POK.UDF Компилирую... Запускаю на выполнение... Получаю ошибку : "Ошибка BASE/1001 Undefined function:FIELDWBLOCK Вызов из LOCKERRHAN(0) Вызов из (b) INITHANDL$(0) Вызов из FIELDWBLOCK(0) Вызов из STOCKBROWS(4691) Вызов из MYBR(4484) Вызов из MYBROWSE(2287) Вызов из PR_POK(352) Вызов из (b) MAIN(0) Вызов из RUNMENU(1043) Вызов из MAIN(450)

Pasha: Это ошибка не компиляции или линковки, а ошибка выполнения Судя по всему, fieldwblock используется неявно что в строке 4691 функции stockbrows ? STOCKBROWS(4691) Добавьте в начало модуля перед первым оператором procedure или function строку: request FieldWBlock и ошибка должна уйти

tkandrey: Строчка 4691 выделена красным. Добавил request FieldWBlock (синий цвет). STATIC FUNCTION STOCKBROWS(NTOP, NLEFT, NBOTTOM, NRIGHT) LOCAL BROWSE := TBROWSEDB(NTOP, NLEFT, NBOTTOM, NRIGHT) LOCAL N, COLUMN, CTYPE request FieldWBlock FOR N := 1 TO NCOL COLUMN := TBCOLUMNNE(MEMVAR->MCOLUMNRUS[N], (&(MFIELDBLOC[N]))) IF .NOT. MEMVAR->PICT[N] == NIL .AND. ( .NOT. AT("S", MEMVAR->PICT[N]); == 0 .OR. .NOT. AT("s", MEMVAR->PICT[N]) == 0) COLUMN:WIDTH := VAL(SUBSTR(MEMVAR->PICT[N], MAX(AT("S", MEMVAR->; PICT[N]), AT("s", MEMVAR->PICT[N])) + 1, 2)) ENDIF BROWSE:ADDCOLUMN(COLUMN) NEXT RETURN BROWSE Я правильно сделал?

Pasha: tkandrey пишет: Я правильно сделал? Лучше эту строку поместить в самом начале prg-модуля, в котором находися эта функция, перед первым оператором function Если в этой программе в макроподстановках используются функции, ссылок на которые в программе нет, то, возможно, прийдется добавить request и для них. Получается, декомпилятор не выловил такие случаи.

Pasha: tkandrey пишет: Получается, мне во всех местах, где такая функция вызывается , переделать на: цитата: MYERROR("<R090> Запись с таким кодом в таблице уже существует.",0) Правильно? Да. Можно еще в самой функции добавить строки: if par == nil par := 0 endif Тогда не надо будет добавлять 0 в вызовах функции.

tkandrey: Спасибо.

tkandrey: Продолжим. Есть поля таблицы , которые открыты командой Browse() для редактирования, они числовые, с 2 знаками после запятой. Подскажите, пожалуйста, какой командой в клиппере символ разделителя дробной части. После компиляции декомпилированного модуля в качестве разделителя используется запятая (","), а нужно привычную точку (".").

tkandrey: пробоваль ставить set fixed on и set decimals to 2 - не помогает.

Dima: tkandrey Собрал простую программу Use test browse() В базе test есть числовые поля с 2 цифрами после запятой, в browse вижу точку в качестве разделителя. Может у тебя совсем не Browse() для этих целей используется ?

petr707: Поскольку в приведенных фрагментах кода есть вызовы "TBROWSEDB(" COLUMN:WIDTH := ...MEMVAR->PICT[N].. применяется класс TBROWSE с возможностью задавать формат столбцов командами вида COLUMN:PICTURE :="9999,99" и часть настроек применяется через массив PICT Можно поискать в текстах фрагмент :PICTURE или 9,99 и заменить на 9.99



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