Форум » Для флейма » Помогите протестировать первую xHarbour систему » Ответить

Помогите протестировать первую xHarbour систему

AndreyZh: Уважаемые профи! Наконец перевёл систему на xHarbour (терминальный режим). Если не сложно помогите найти ошибки в её работе (сам уже тестил). Если есть желание, то с удовольствием приму критику в любом виде и отвечу на все вопросы. Система содержит исходный код (+ база очень крупной оптовки за 4 месяца) и варианты Clipper (нужна настройка ОС) и xHarbour (Win32) программ. Для установки скачать в любой каталог и распаковать архив. Все виды паролей - 11. Для создания индексов clipper (s_repair.bat), harbour (srepharb.bat). Справка F1 в любом режиме, инструкции в каталоге document. Для принудительного запуска st.bat (clip)/sth.bat (harb). По системе печати, если интересно - отдельно. Состав комплекса: 1. Оперативная программа. ls.exe (clip)/hls.exe (harb) 2. Администратор и бухгалтерия. la.exe (clip)/hla.exe (harb) 3. Аналитический контур. ldust.exe (clip)/hld.exe (harb) Буду очень благодарен за найденные ошибки и критику в любой форме! Скачка с учётом исправлений всех замечаний на 04.04.2010 (5.92) http://get.freesoft.ru/?id=108083

Ответов - 182, стр: 1 2 3 4 5 6 7 8 9 10 All

Pasha: Укажите линкеру опцию -aa

AndreyZh: Укажите линкеру опцию -aa Спасибо! Уважаемые господа! 1. Исправил все найденные раннее ошибки. 2. Собрал с терминалом GTWVT. 3. Подготовил новую тестовую базу - мелкооптовая торговая точка или розничный магазин on-line торговли (любыми товарами). Если не сложно помогите найти ошибки в программах (все пароли 11). Для установки скачать и в любой каталог (c:\harbdist - будут работать все приложенные ярлыки (они же описание программ)), ничего настраивать не нужно. Скачка 2.66mb http://www.zhsoft.nm.ru/demo/USLand.exe

Dima: [IMHO] Сломал все глаза от такого интерфейса. По 10 бальной шкале моя оценка 2. Впрочем на вкус и цвет....... Скрин одной из моих прог ;) Прайс лист


AndreyZh: Впрочем на вкус и цвет....... Золотые слова, впрочем у БЭСТ 3/4 интерфес аналогичен (у меня он был разработан раньше в 1990 году) и следует принципу "максимум информации и инструментов на единицу площади экрана). Для примера все программы комплекса: При этом оператор/аналитик видит всю необходимую ему инфу не углубляясь без нужды в подформы, управление системой для новичков осуществляется клавишами Insert,Tab,Delete,F1,F2,F3,Esc,Enter - все остальные возможности можно вызвать по меню, являющейся справочной системой или нажатием клавиш.

Andrey: Dima пишет: Скрин одной из моих прог ;) Покажи пожалуйста как реализовал вывод картинки и перерисовку экрана ?

Dima: Andrey пишет: как реализовал вывод картинки Wvt_DrawImage( 1,0,23,79, "blabla.jpg" ) Andrey пишет: и перерисовку экрана Не очень понял вопрос. А вообще Wvt_saveScreen , Wvt_RestScreen , хотя это и не совсем верно.

Dima: AndreyZh пишет: Золотые слова, впрочем у БЭСТ 3/4 интерфес аналогичен (у меня он был разработан раньше в 1990 году) и следует принципу "максимум информации и инструментов на единицу площади экрана) Я конечно понимаю что критику Вы не очень уважаете , но у Вас по моему просто перебор с максимумом информации в менюшках. Это не меню а газета какая то. Писец..... Молчу уже про убогий браузер. Впрочем ладно..........Просто хотел дать добрый совет.

AndreyZh: Доброе утро! Пока не поехал на огород... Dima Если есть желание покритиковать саму систему - интерфейс, функционал, механизмы хранения и обработки информации, то может бы заведу отдельную тему. Всё-таки здесь интересны "несовместимости" и ошибки в её работе. Я конечно понимаю что критику Вы не очень уважаете Непонятно от куда такие выводы? Если замечание сделано "в любой форме", оно полезно и имеет целью помочь в решении проблемы, то, можете обратить внимание - ему очень благодарен. Если же оно ввиде просто оскорблений брошенных в воздух, то это воспринимается не более как попытка "засрать эфир". у Вас по моему просто перебор с максимумом информации в менюшках НЕ ПОНЯЛ. Если это о меню вызова отчётов, то их сотни и вынужден давать подробные пояснения в наименовании пунктов меню, если о меню в оперативных режимах, то количество слов в п.п. минимально необходимое для описания выполняемого действия??? Молчу уже про убогий браузер Это интересно. Можно подробнее определение или описание механизмов "правильного браузера" - его реализую в какой-нибудь подзадаче и проверю (протестю) на пользователях (им же с этим работать).

AndreyZh: Добрый вечер! Уважаемые реальные и "виртуальные" пользователи моей системы "нарыли" серию ошибок и несовместимостей, которые конечно "с чей-то матерью" исправил. Думаю Вам будет интересно (xHarbour версия от 12.2009). Clipper 5.01R+CT2 без проблем "хавает": 1. При сохранении файлов. Русские имена файлов и каталогов преобразуются в "абракадабру". Лечение - имя (символьные переменные) преобразовывать функцией HB_OEMTOANSI. 2. На клавише F3 висит вызов справочников - вызывается функция, в которой по имени переменной вызывается соответствующий справочник. При нажатии вне команды GET системы возвращают "пустое" имя -- Clipper программа его игнорирует, xHarb пытается вызвать "первый в списке" справочник. Лечение - проверять имя на "пустоту". 3. Поведение xHarb в некоторых случаях зависит от последовательности вызова функция, хотя логически она не должна иметь значения. Например: hb_gtInfo(GTI_FONTWIDTH, 15) hb_gtInfo(GTI_FONTSIZE, 32) Другой порядок приводит к сбоям (спасибо местным гуру, а то бы считал, что ф-ция gtInfo не рабочая). ЭКСПЕРИМЕНТИРУЙТЕ!!! 4. Несовместима функция memoedit. Мой вариант приводил к "зависанию" системы. Спасибо за подсказку обработки функции пользователя: #include "Inkey.ch" #include "Memoedit.ch" [pre2]FUNCTION myfunc() LOCAL nKey := LastKey() LOCAL nRet := ME_DEFAULT // Критичная добавка DO CASE CASE nKey IN { K_ALT_W, K_CTRL_W, K_ESC } nRet := ME_IGNORE // Критичная добавка // ignore default termination keys CASE nKey == K_F2 nRet := K_ALT_W // Save with F2 CASE nKey == K_ALT_C nRet := K_ESC // Cancel with Alt+C ENDCASE // RETURN nRet [/pre2] 5. Грубая ошибка xHarbour машины (отошлите, если интересно разработчикам). Имеем обычную форму ввода, где на последнем вопросе задаётся символ разделитель дробной части: local getlist:={}, bbb:=spac(50), ccc:=" " .... @ 1,1 say aaa get bbb @ 1,2 say sss get ccc read .... преобразовывается файл ... ФОРМА ЗАПРОСА ВЫВОДА НА УСТРОЙСТВО ------------------------ Если ссс - это символ точки, запятой, тире, .... то форма запроса переходит в бесконечный цикл xHarbour пихает всегда Chr(15) -- при других знаках всё работает корректно (~=/\| и т.д.). Лечение: После READ сразу набор команд if readkey()==K_CTRL_O KEYB Chr(K_ENTER) WAIT " " LOOP // Переход снова на форму ввода устройства вывода endif ---------------------------------------------- Вообще спасибо "местным" профи - в темах можно найти ответы на множество проблем. Система исправлена и выложена со всей документацией (4.01 mb) http://www.zhsoft.nm.ru/demo/USLand.exe Все надеюсь на помощь профи в поиске ошибок

Pasha: AndreyZh пишет: Имеем обычную форму ввода, где на последнем вопросе задаётся символ разделитель дробной части: local getlist:={}, bbb:=spac(50), ccc:=" " .... @ 1,1 say aaa get bbb @ 1,2 say sss get ccc read .... преобразовывается файл ... ФОРМА ЗАПРОСА ВЫВОДА НА УСТРОЙСТВО ------------------------ Если ссс - это символ точки, запятой, тире, .... то форма запроса переходит в бесконечный цикл xHarbour пихает всегда Chr(15) -- при других знаках всё работает корректно (~=/\| и т.д.). А можно уточнить, что имеется в виду: "преобразовывается файл, ФОРМА ЗАПРОСА ВЫВОДА НА УСТРОЙСТВО" А еще лучше привести фрагмент программы

AndreyZh: Pasha А еще лучше привести фрагмент программы Добрый день! Прошу прощение за длинный текст, т.к. подход универсальный: [pre] * Пример пострения отчёта STAT PROC pObFins() LOCA cOldCol:=SetColor(), .... LOCA cOff:=" " ----- @ 1,1 SAY "Пожалуйста вв. дату начала ........ конца ........ периода" @ 6,1 SAY "Разделитель чисел для экспорта в MsOffice или ничего ." @6,58 GET cOff // Если отлично от пустого, то заменяется разделитель точка на введённый знак в обычном текстовом файле READ ------ cTxt := zTemp(cdTemp,"TXT",32) // Создаётся текстовый файл, который ниже заполняется ------ IF !Empty(cOff) // Экспорт в офис ? "Оборотная ведомость по "+IF(nCash=1,"кассе",IF(nCash=2,"банку","деньгам"))+" с "+Dtoc(dBeg)+" по "+Dtoc(dEnd) ? " Подпериод времени Ост. на начало Приход Расход Ост.на конец " DO WHIL !Eof() ------- Заполнения файла из временной таблицы IF dMove > dD // Перешли в другой подпериод. Отражаем итоги. ? IF(nPer==0,Left(Cmonth(dT)+Spac(17),17)+Str(Year(dT),4),Dtoc(dT)+" - "+Dtoc(dD))+" "+zStr(nBeg,14,2,cOff)+" "+zStr(np,12,2,cOff)+" "+zStr(nr,12,2,cOff)+" "+zStr(nBeg+np-nr,14,2,cOff) ++nStr ENDI DbSkip() ENDD // Отражаю данные по последнему периоду и общие итоги. ? IF(nPer==0,Left(Cmonth(dT)+Spac(17),17)+Str(Year(dT),4),Dtoc(dT)+" - "+Dtoc(dD))+" "+zStr(nBeg,14,2,cOff)+" "+zStr(np,12,2,cOff)+" "+zStr(nr,12,2,cOff)+" "+zStr(nBeg+np-nr,14,2,cOff) ? Chr(12) ELSE // Печатаемый формат ENDI ----- // Демонстрирую отчет и восстанавливаю состояние среды. pFileOutDevice(cTxt) // Место появления глюка pCloseErase("TEMP",{cDbf,cNtx,cTxt}) pinStat(sOp,0) RETU [/pre] И сама функция(ии) вывода на устройства - довольно большая [pre] * ---------------------------------------------------------------------------- * Вывод на принтер/файл/монитор содержимого файла переданного как параметр. * 02.2004 Добавил паралельный вывод отчетов отправляемых в файл. * 12.2004 Преобразование в MsExcel через систему печати ХБК * 09.2006 Конвертация в Ms Word формат. * 06.2007 При выводе в файл разрешено отражать имя с основанием из-за OpenOff * 03.2008 Удалил вывод отчетов в дублированный каталог -- никто не использует * 06.2010 xHarbour русские буквы переводит в странной кодировке. Делаю преобразование. PROC pFileOutDevice( cFile, nLen, nW, cdbfm ) FIEL compr, filen, begStr, endStr, qtyCopy LOCA nDev := 1 // Устройство вывода 1-принтер,2-файл,3-экран,4-ХБК,5-Excel через ХБК,6-Принтер через редактор LOCA nBeg := 1 // Начальная страница LOCA nEnd := 9999 // Конечная страница. LOCA nQty := 1 // Количество экземпляров. LOCA cOldCol:=SetColor(), nSel:=Select(), cStr:="", aDbf:={}, cF:="" LOCA nSize:=FileSize(cFile), cString:="", GetList:={} LOCA nI:=0, cSt:="" LOCA axbk:={{"compr", "L", 1, 0},; // Посылка в программу ХБК {"filen", "C", 70, 0},; {"begStr", "N", 10, 0},; {"endStr", "N", 10, 0},; {"qtyCopy", "N", 10, 0}} PRIV cNameFile:="", cOutFile:="" DEFAULT nLen TO 80 DEFAULT nW TO 6 DEFAULT cdbfm TO "" MEMV->cNameFile := AllTrim(cFile) fSwopen(16,17,7,60,cOther,4) DO WHIL TRUE // Из ЭФ читаем параметры печати. @ 5,0 SAY Chr(199)+Repl("─",59)+Chr(182) COLO PosRepl(cOther,Repl(" ",AT("/",cOther)-2)+"N",1) @ 1,2 SAY "Для печати отчета/документа пожалуйста укажите устройство" @ 2,2 SAY "1-Принтер,2-Файл,3-Экр,4-ХБК,5-ExcХБК,6-Редактор,7-Word ." @ 3,2 SAY "начальную и конечную страницы из документа" @ 4,2 SAY "а также количество экземпляров печати документа " @2,58 GET nDev PICT "9" VALI nDev>=1 .AND. nDev<=7 @3,12 GET nBeg WHEN nDev==1.OR.nDev==4 PICT "9999" VALI nBeg>=1 @3,30 GET nEnd WHEN nDev==1.OR.nDev==4 PICT "9999" VALI nBeg<=nEnd @4,56 GET nQty WHEN nDev==1.OR.nDev==4 PICT "999" VALI nQty>=1 READ ************* Смотреть как Lack будет реагировать на данный обработчик глюка. //*** Обработка глюка xHarb когда посылает код 15, если .,- в формате экспорта в офис IF ReadKey() == K_CTRL_O KEYB Chr(K_ENTER) WAIT "" LOOP ENDI // Если отказ, то выход из режима печати. IF LastKey() == K_ESC THEN EXIT DO CASE CASE nDev == 1 // Принтер. Печатаем по одной строке с проверкой статуса принтера. @ 6,1 SAY Padc("Выводим документ/отчет/справку..",58) pPrFile( cFile, nBeg, nEnd, nQty, nLen, nW ) @ 6,1 CLEA TO 6,59 CASE nDev == 2 // Файл. cOutFile := Spac(12) @ 6,2 SAY "Введите имя файла (можно с расширением) " GET cOutFile VALI lOutFile(zConv(cOutFile)) READ // Преобразование имени файла для минимизации ошибок cF := AllTrim(cOutFile) IF At(".",cF) > 0 // Файл с расширением cF := Left(Alltrim(Token(cF,".",1)),8)+"."+Right(Alltrim(Token(cF,".",2)),3) ELSE // Расширение REP по умолчанию cF := AllTrim(Left(cF,8))+".REP" ENDI IF LastKey() <> K_ESC COPY FILE (MEMV->cNameFile) TO (cDreport+AllTrim(zConv(cF))) ENDI @ 6,1 CLEA TO 6,58 CASE nDev == 3 // Экран. Используем программу просмотра файлов неогр.длины IF !lLookFile( cFile, 0, 0, 24, 79, cColor ) ErrMess("Системная ошибка... Попробуйте еще раз..",cError) ENDI CASE nDev == 4 // Система "хочу быть крутым!" // Анализ на наличие системы на компьютере. IF cPathXBK <> NIL // Имеется настройка ХБК IF !Empty(cPathXBK) // Имеется настройка ХБК IF File(cPathXBK+"LS_WORKS.DBF") // Сист. ХБК запущена // Ожидание, пока ХБК не удалит предыдущую посылку - не напечатает документ. IF lFileXbm(cPathXBK+"XBM.DBF") // Можно печатать документ. DbCreate(cPathXBK+"XBM.DBF",axbk) LanUse(cPathXBK,"XBM",NO_INDEX,"TXBM",SHAR_MODE,-1,NEW_SEL) FilLock(-1) DbAppend() compr := (nLen == 132) filen := IF(At(":",cFile)>=1,Alltrim(cFile),DiskName()+":\"+CurDir(DiskName())+"\"+AllTrim(cFile)) begStr := nBeg endStr := nEnd qtyCopy := nQty DbCloseArea() DbSelectArea(nSel) // Ручное управления для блокирования коллизий @ 6,1 SAY Padc("После ПОЛНОГО окончания печати нажмите Esc",58) Inkey(0) /**** Делаю для торопыг дополнительную паузу. Если нажать Esc, то файл печати сотрется и ХБК выдаст диагностическую ошибку */ WHIL TRUE Inkey(0.3) IF File(cPathXBK+"XBM.DBF") IF Fyn("Предыдущая печать не окончена! Прервать ее?",cError) THEN EXIT ELSE EXIT ENDI END @ 6,1 CLEA TO 6,58 ELSE ErrMess("Не получилось. Попробуйте еще раз!",cError) ENDI ELSE ErrMess("Система ХБК не запущена на компьютере или не верен маршрут к ней!",cError) ENDI ELSE ErrMess("Каталог системы ХБК не определен!",cError) ENDI ELSE ErrMess("Каталог системы ХБК не определен!",cError) ENDI CASE nDev == 5 // Система "хочу быть крутым!" преобразует БД в таблицу Excel cOutFile := Spac(8) @ 6,2 SAY "Введите имя файла латинскими буквами " GET cOutFile VALI !Empty(cOutFile) READ IF LastKey() <> K_ESC IF !Empty(cdbfm) cOutFile := Upper(AllTrim(zConv(cOutFile)))+".mse" // Анализ на наличие системы ХБК на компьютере. IF cPathXBK <> NIL // Имеется настройка ХБК IF !Empty(cPathXBK) // Имеется настройка ХБК IF File(cPathXBK+"LS_WORKS.DBF") // Сист. ХБК запущена // Пауза. Пока ХБК не обработает предыдущий одноименный файл. WHIL File(cPathXBK+cOutFile) Inkey(0.1) @ 6,1 SAY Padc("Для убыстрения на Windows 9x переключитесь на ХБК.",45) END SELE (cdbfm) COPY TO (cPathXBK+cOutFile) @ 6,1 SAY Padc("Файл "+AllTrim(cOutFile)+" записан..",58) ELSE ErrMess("Система ХБК не запущена на компьютере!",cError) ENDI ELSE ErrMess("Каталог системы ХБК не определен!",cError) ENDI ELSE ErrMess("Каталог системы ХБК не определен!",cError) ENDI ELSE ErrMess("Отчет пока не преобразуется в таблицу Excel!",cError) ENDI ENDI @ 6,1 CLEA TO 6,58 CASE nDev == 6 // Редактор. IF nSize <= 64000 cString := MemoRead(cFile) // Читаю файл в строку fswOpen(0,0,24,79,cMainc,13) @ 0,0 SAY REPL("─",9)+REPL("┼─────────",7) @24,0 SAY "При желании можно отредактировать документ, запрос на печать появится после Esc" @ 1,0 CLEA TO 22,79 DispBox( 23, 0, 23, 79, 2 ) cString := MemoEdit(cString,1,0,22,79,TRUE,"FMEdit",232) MemoWrit( cFile, cString ) fDeact(cOther) /* Старый блок работы с редактором cString := MemoRead(cFile) fswOpen(0,0,24,79,cMainc,13) @ 0,0 SAY REPL("─",9)+REPL("┼─────────",7) @24,0 SAY "При желании можно отредактировать документ, запрос на печать появится после Esc" @ 1,0 CLEA TO 22,79 DispBox( 23, 0, 23, 79, 2 ) MemoWrit( cFile, MemoEdit(cString,1,0,22,79,TRUE,"FMEdit",232) ) fDeact(cOther) */ ELSE ErrMess("Отчет слишком большой для редактирования!",cError) ENDI CASE nDev == 7 // Формат Ms Word посредством системы ХБК. cOutFile := Spac(8) @ 6,2 SAY "Введите имя файла латинскими буквами без точек " GET cOutFile VALI !Empty(cOutFile) READ IF LastKey() <> K_ESC // Блокирую ситуацию указать расширение в имени файла cOutFile := Upper(AllTrim(Left(AllTrim( cNoSpecSimb(cOutFile) ),8)))+".wrd" cOutFile := zConv(cOutFile) // Анализ на наличие системы ХБК на компьютере. IF cPathXBK <> NIL // Имеется настройка ХБК IF !Empty(cPathXBK) // Имеется настройка ХБК IF File(cPathXBK+"LS_WORKS.DBF") // Сист. ХБК запущена // Пауза. Пока ХБК не обработает предыдущий одноименный файл. WHIL File(cPathXBK+cOutFile) Inkey(0.1) @ 6,1 SAY Padc("Для убыстрения вывода переключитесь на ХБК.",58) END COPY FILE (MEMV->cNameFile) TO (cPathXBK+cOutFile) @ 6,1 SAY Padc("Файл "+AllTrim(cOutFile)+" записан..",58) ELSE ErrMess("Система ХБК не запущена на компьютере!",cError) ENDI ELSE ErrMess("Каталог системы ХБК не определен!",cError) ENDI ELSE ErrMess("Каталог системы ХБК не определен!",cError) ENDI ENDI @ 6,1 CLEA TO 6,58 ENDC ENDD fDeact(cOldCol) * fErase(cNameFile) RETU * --------------------------------------------------------------------------- * Вывод текстового файла на принтер в соответствии с параметрами и при * этом проверяется статус принтера при отражении каждой строки и в начале STAT PROC pPrFile( cFile, nBeg, nEnd, nQty, nLen, nW ) LOCA nPage:=0 /*Текущая страница*/, nH:=0 /*handle*/, nQ:=0/*копии*/ LOCA cBuff:="" /*буфер чтения*/, cStr:="" /*буфер печати*/ LOCA nSize:=2048 /*размер буфера чтения*/, cCur:="" /*текущая строка*/ LOCA nI:=0, lStat:=TRUE, nJ:=0, lStr:=TRUE IF !File( AllTrim(cFile) ) THEN RETU // Проверяем статус принтера перед выводом файла. IF !PrintReady() ErrMess("Принтер не готов... Включите его и попробуйте еще раз.",cError) RETU ENDI // Устанавливаем принтер используя стандартную команду операц.системы SET CONS OFF SET PRINTER ON DO CASE CASE nLen==80 .AND. nW==6 RUN MODE LPT1:80,6 >NUL CASE nLen==80 .AND. nW==8 RUN MODE LPT1:80,8 >NUL CASE nLen==132 .AND. nW==8 RUN MODE LPT1:132,8 >NUL CASE nLen==132 .AND. nW==6 RUN MODE LPT1:132,6 >NUL ENDC nH := Fopen( cFile, 0 ) // Открываем файл для чтения BEGIN SEQU // Выводим текст из файла на принтер по одной копии FOR nQ := 1 TO nQty Fseek( nH, 0/*смещение*/, 0/*начало*/ ) nPage := 1 // Начальная страница. // Выводим на принтер текущую копию, анализируя необходимость вывода WHIL Len( cBuff:=FreadStr(nH,nSize) ) <> 0 cStr += cBuff lStat := TRUE WHIL TRUE // Не можем выделить подстроку из накапливаемой строки. IF ( nI:=At(CRLF,cStr) ) == 0 THEN EXIT cCur := Subs( Token(" "+cStr,CRLF,1), 2 ) nJ := At( Chr(12), cCur ) // Признак окончания страницы, переводим текущий счетчик IF nJ <> 0 THEN lStr := FALSE cStr := Subs( cStr, nI+2 ) IF nPage >= nBeg .AND. nPage <= nEnd // Сбой на принтере. Отказ пользователя от дальнейшей печати. IF !lPrStr( cCur ) THEN BREAK ENDI nPage += IF( lStr, 0, 1 ) lStr := TRUE END END NEXT nQ END Fclose( nH ) RUN MODE LPT1:80,6 >NUL SET PRINTER OFF SET CONS ON RETU * --------------------------------------------------------------------------- * Функция распечатки строки с проверкой статуса принтера. STAT FUNC lPrStr( cStr ) cStr := cStr+CRLF IF Inkey() == K_ESC THEN RETU FALSE ?? cStr RETU TRUE * --------------------------------------------------------------------------- * Функция проверки правильности имени введенного файла *.rep * 06.2007 Разрешено расширение. Возвращаю преобразованное имя файла. STAT FUNC lOutFile(cFile) cFile := AllTrim(cFile) // Запрет пустого имени IF Empty(cFile) THEN RETU FALSE IF At(".",cFile) > 0 // Файл с расширением cFile := Left(Alltrim(Token(cFile,".",1)),8)+"."+Right(Alltrim(Token(cFile,".",2)),3) ELSE // Расширение REP по умолчанию cFile := AllTrim(Left(cFile,8))+".REP" ENDI // Проверка на существование IF File(cDreport+AllTrim(cFile)) IF !Fyn("Файл с введенным именем существует... Переписать?",cError) THEN RETU FALSE ENDI RETU TRUE [/pre]

Dima: AndreyZh пишет: подход универсальный: И это называется самодостаточный пример "ГЛЮКА" ? Проще можно изложить проблему ?

Pasha: я тоже ничего не понял Дать самодостаточный пример означает, что ничего, не имеющего отношения к глюку, в примере не должно быть. Скажем, глюк связан с созданием файла ? Если да - в примере должно быть создание файла, если нет - то нет. LOCA cOldCol:=SetColor() LOCA cOff:=" " @ 1,1 SAY "Пожалуйста вв. дату начала ........ конца ........ периода" @ 6,1 SAY "Разделитель чисел для экспорта в MsOffice или ничего ." @6,58 GET cOff // Если отлично от пустого, то заменяется разделитель точка на введённый знак в обычном текстовом файле READ А дальше ? Кратко изложите, как проявляется глюк

AndreyZh: Добрый день! Эта одна из многих ситуаций, почему программирование на Harbour назвал "прогулками по минному полю"... Из-за любопытства пытался сделать "простой" пример данной ситуации вне "большого комплекса", НО НЕ СМОГ породить её!!! Но в самом комплексе ситуация "универсальная"! В принципе Dima ставил "старый вариант" у себя - он ещё содержит данную проблемы. Как её выявить: (например) Программа hld/динамическая отчётность/любой отчёт. В конце формы настройки есть запрос - символ разделитель для экспорта в офис - своеобразная форма отчёта без декоративных элементов, где символ точка заменяется на определённый в запросе. После построения появится форма для вывода на устройства с "явными признаками зацикливания", что прерывается клавишей Esc. В новой версии исправлена данная проблема добавкой кода (повторюсь): [pre]// Из ЭФ читаем параметры печати. @ 5,0 SAY Chr(199)+Repl("-",59)+Chr(182) COLO PosRepl(cOther,Repl(" ",AT("/",cOther)-2)+"N",1) @ 1,2 SAY "Для печати отчета/документа пожалуйста укажите устройство" ....... @2,58 GET nDev PICT "9" VALI nDev>=1 .AND. nDev<=7 ...... READ // Обработка глюка xHarb когда посылает код 15, если .,- в формате экспорта в офис IF ReadKey() == K_CTRL_O KEYB Chr(K_ENTER) WAIT "" LOOP ENDI [/pre]

Pasha: Я все-таки не могу понять, в чем заключается глюк Глюк связан с GET - системой ? После READ (ReadModal) получается неправильное значение односимвольной переменной ? Или после READ возникает какое-то последействие в функцих типа READKEY() ? Или глюк связан с вложенным READ, т.е в обработке READ вызывается еще один READ ? Создание файла существенно, или это просто сопутствующее действие ? Код 15 (ctrl+o) вводится с клавиатуры ? Попробуйте описать словесно, отбросив все несущественные детали

AndreyZh: Я все-таки не могу понять, в чем заключается глюк Я тоже ХЗ? На мелкой тестовой эмуляции не сумел породить проблемы, а в "большой" системе она "стабильная", т.е. какая функция xHarbour порождает посылку коммандных кодов пока не понял. Как это проявляется? 1. Запрос ограничителей отчёта. Последний вопрос о знаке разделителе (.,/ порождают глюк, любые другие символы работают корректно). 2. Строится отчетный текстовый файл, где в числах точка заменяется указанным символом. 3. Всё (txt. времянки) закрывается. 4. Запускается функция вывода на устройство (принтер,файл,экран,win система,Excel,редактор,Word) и в ней вызывается форма настройки вывода, т.к. по умолчанию стоит "принтер", то система не переходит в ожидание READ, а циклично тужится отправить на него, если он выключен, то цикличный запрос печати (нормально прерываемый ESC). // Обработка глюка xHarb когда посылает код 15, если .,- в формате экспорта в офис IF ReadKey() == K_CTRL_O KEYB Chr(K_ENTER) WAIT "" LOOP ENDI Данным кодом я блокирую ситуацию, т.е. "от куда то" посылается код K_CTRL_O (15) и от него ни как не избавится (чистка буфера клавиатуры ничего не даёт), но даёт принудительная посылка K_ENTER, которая "подтверждает" запрос WAIT (что прекращает посылку кодов от xHarbour), после чего читаю форму заново.

Pasha: т.е., если по Read в односимвольную переменную вводится один из символов: .,/ следующий за ним Read не переводит программу в режим ожидания ввода, а зацикливается ? Т.е. в буфере клавиатуры остаются какие-то коды, которые влияют на последующий READ ? Терминал gtwin или gtwvt ? Если gtwin, то для gtwvt этот глюк проявляется ? А где в программе цикл и какое условие выхода из цикла ?

AndreyZh: т.е., если по Read в односимвольную переменную вводится один из символов: .,/ Да, в конце большого блока запросов. следующий за ним Read не переводит программу в режим ожидания ввода, а зацикливается ? В "большой" программе ДА и стабильно (не зависимо от конкретного отчёта), в тестовых мелких программках не смог породить данной ситуации. Т.е. в буфере клавиатуры остаются какие-то коды, которые влияют на последующий READ ? В том-то и ... При "придумывании" приведённоё затычки ни чего в буфере клавиатуры не находил. Chr(15) прилетает, как будто из ниоткуда. Терминал gtwin или gtwvt ? Последние варианты gtwvt (ссылки даны http://www.zhsoft.nm.ru/demo/USLand.exe ), сейчас проверю на gtwin из ссылки первого сообщения темы (что то плохо качает). В GTWIN теже коки! А где в программе цикл и какое условие выхода из цикла ? 1. Читаем параметры печати. READ 2. IF LastKey() == K_ESC то выход из цикла. 3. Обработка вывода на требуемое устройство 4. Переход на 1. Реализовано whil .t. <...> end Если Вам не сложно - скачайте архив из первого поста и легко сможете сами убедиться (в последней ссылке проблема исправлена)

Dima: AndreyZh пишет: Chr(15) прилетает, как будто из ниоткуда. Полтергейст А попробуй запустить прогу в режиме защиты от сбоев (я про Windows) , будет тот же "Полтергейст" ?

AndreyZh: Полтергейст? А попробуй запустить прогу в режиме защиты от сбоев (я про Windows) , будет тот же "Полтергейст" ? Данный "глюк" людям демонстрировал под (разные конторы) Windows 98/ХР Home/Prof/Windows Server/Windows 7 (сейчас проверил и в режиме защиты от сбоев). К тому же Вы легко можете его увидеть, например: - Программа hld - <Динамика> Отражение работы фирмы в динамике - Любой отчёт данного блока/берёте любой период/остальное соглашаетесь - На вопрос "знак разделитель экспорта в офис", если возьмёте (.,) получите "барабашку", другой (не все перепроверил) знак - нормальный отчёт



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