Автор | Сообщение |
|
| |
Пост N: 64
Зарегистрирован: 12.11.06
|
|
Отправлено: 03.04.10 20:51. Заголовок: Помогите протестировать первую xHarbour систему
Уважаемые профи! Наконец перевёл систему на 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
[только новые]
|
|
|
| Администратор
|
Пост N: 1404
Зарегистрирован: 23.05.05
|
|
Отправлено: 16.04.10 14:14. Заголовок: Укажите линкеру опци..
Укажите линкеру опцию -aa
| |
|
|
| |
Пост N: 118
Зарегистрирован: 12.11.06
|
|
Отправлено: 16.04.10 18:09. Заголовок: Укажите линкеру опци..
цитата: | Укажите линкеру опцию -aa |
| Спасибо! Уважаемые господа! 1. Исправил все найденные раннее ошибки. 2. Собрал с терминалом GTWVT. 3. Подготовил новую тестовую базу - мелкооптовая торговая точка или розничный магазин on-line торговли (любыми товарами). Если не сложно помогите найти ошибки в программах (все пароли 11). Для установки скачать и в любой каталог (c:\harbdist - будут работать все приложенные ярлыки (они же описание программ)), ничего настраивать не нужно. Скачка 2.66mb http://www.zhsoft.nm.ru/demo/USLand.exe
| |
|
|
| |
Пост N: 1587
Зарегистрирован: 17.05.05
|
|
Отправлено: 17.04.10 17:26. Заголовок: Сломал все глаза от..
[IMHO] Сломал все глаза от такого интерфейса. По 10 бальной шкале моя оценка 2. Впрочем на вкус и цвет....... Скрин одной из моих прог ;) Прайс лист
| |
|
|
| |
Пост N: 119
Зарегистрирован: 12.11.06
|
|
Отправлено: 17.04.10 20:14. Заголовок: Впрочем на вкус и цв..
цитата: | Впрочем на вкус и цвет....... |
|
Золотые слова, впрочем у БЭСТ 3/4 интерфес аналогичен (у меня он был разработан раньше в 1990 году) и следует принципу "максимум информации и инструментов на единицу площади экрана). Для примера все программы комплекса: При этом оператор/аналитик видит всю необходимую ему инфу не углубляясь без нужды в подформы, управление системой для новичков осуществляется клавишами Insert,Tab,Delete,F1,F2,F3,Esc,Enter - все остальные возможности можно вызвать по меню, являющейся справочной системой или нажатием клавиш.
| |
|
|
| постоянный участник
|
Пост N: 1236
Зарегистрирован: 12.09.06
|
|
Отправлено: 17.04.10 22:10. Заголовок: Dima пишет: Скрин о..
Dima пишет: цитата: | Скрин одной из моих прог ;) |
| Покажи пожалуйста как реализовал вывод картинки и перерисовку экрана ?
| |
|
|
| |
Пост N: 1589
Зарегистрирован: 17.05.05
|
|
Отправлено: 17.04.10 22:27. Заголовок: Andrey пишет: как р..
Andrey пишет: цитата: | как реализовал вывод картинки |
| Wvt_DrawImage( 1,0,23,79, "blabla.jpg" ) Andrey пишет: Не очень понял вопрос. А вообще Wvt_saveScreen , Wvt_RestScreen , хотя это и не совсем верно.
| |
|
|
| |
Пост N: 1590
Зарегистрирован: 17.05.05
|
|
Отправлено: 17.04.10 23:12. Заголовок: AndreyZh пишет: Зол..
AndreyZh пишет: цитата: | Золотые слова, впрочем у БЭСТ 3/4 интерфес аналогичен (у меня он был разработан раньше в 1990 году) и следует принципу "максимум информации и инструментов на единицу площади экрана) |
| Я конечно понимаю что критику Вы не очень уважаете , но у Вас по моему просто перебор с максимумом информации в менюшках. Это не меню а газета какая то. Писец..... Молчу уже про убогий браузер. Впрочем ладно..........Просто хотел дать добрый совет.
| |
|
|
| |
Пост N: 120
Зарегистрирован: 12.11.06
|
|
Отправлено: 18.04.10 07:23. Заголовок: Доброе утро! Пока не..
Доброе утро! Пока не поехал на огород... Dima Если есть желание покритиковать саму систему - интерфейс, функционал, механизмы хранения и обработки информации, то может бы заведу отдельную тему. Всё-таки здесь интересны "несовместимости" и ошибки в её работе. цитата: | Я конечно понимаю что критику Вы не очень уважаете |
| Непонятно от куда такие выводы? Если замечание сделано "в любой форме", оно полезно и имеет целью помочь в решении проблемы, то, можете обратить внимание - ему очень благодарен. Если же оно ввиде просто оскорблений брошенных в воздух, то это воспринимается не более как попытка "засрать эфир". цитата: | у Вас по моему просто перебор с максимумом информации в менюшках |
| НЕ ПОНЯЛ. Если это о меню вызова отчётов, то их сотни и вынужден давать подробные пояснения в наименовании пунктов меню, если о меню в оперативных режимах, то количество слов в п.п. минимально необходимое для описания выполняемого действия??? цитата: | Молчу уже про убогий браузер |
| Это интересно. Можно подробнее определение или описание механизмов "правильного браузера" - его реализую в какой-нибудь подзадаче и проверю (протестю) на пользователях (им же с этим работать).
| |
|
|
| |
Пост N: 123
Зарегистрирован: 12.11.06
|
|
Отправлено: 05.05.10 18:14. Заголовок: Добрый вечер! Уважа..
Добрый вечер! Уважаемые реальные и "виртуальные" пользователи моей системы "нарыли" серию ошибок и несовместимостей, которые конечно "с чей-то матерью" исправил. Думаю Вам будет интересно (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" 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 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 Все надеюсь на помощь профи в поиске ошибок
| |
|
|
| Администратор
|
Пост N: 1434
Зарегистрирован: 23.05.05
|
|
Отправлено: 06.05.10 10:54. Заголовок: AndreyZh пишет: Име..
AndreyZh пишет: цитата: | Имеем обычную форму ввода, где на последнем вопросе задаётся символ разделитель дробной части: local getlist:={}, bbb:=spac(50), ccc:=" " .... @ 1,1 say aaa get bbb @ 1,2 say sss get ccc read .... преобразовывается файл ... ФОРМА ЗАПРОСА ВЫВОДА НА УСТРОЙСТВО ------------------------ Если ссс - это символ точки, запятой, тире, .... то форма запроса переходит в бесконечный цикл xHarbour пихает всегда Chr(15) -- при других знаках всё работает корректно (~=/\| и т.д.). |
| А можно уточнить, что имеется в виду: "преобразовывается файл, ФОРМА ЗАПРОСА ВЫВОДА НА УСТРОЙСТВО" А еще лучше привести фрагмент программы
| |
|
|
| |
Пост N: 126
Зарегистрирован: 12.11.06
|
|
Отправлено: 06.05.10 16:08. Заголовок: Pasha А еще лучше пр..
Pasha цитата: | А еще лучше привести фрагмент программы |
| Добрый день! Прошу прощение за длинный текст, т.к. подход универсальный: * Пример пострения отчёта 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 И сама функция(ии) вывода на устройства - довольно большая Скрытый текст
* ---------------------------------------------------------------------------- * Вывод на принтер/файл/монитор содержимого файла переданного как параметр. * 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
|
| |
|
|
|
| |
Пост N: 1642
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.05.10 22:26. Заголовок: AndreyZh пишет: под..
AndreyZh пишет: И это называется самодостаточный пример "ГЛЮКА" ? Проще можно изложить проблему ?
| |
|
|
| Администратор
|
Пост N: 1436
Зарегистрирован: 23.05.05
|
|
Отправлено: 07.05.10 08:03. Заголовок: я тоже ничего не пон..
я тоже ничего не понял Дать самодостаточный пример означает, что ничего, не имеющего отношения к глюку, в примере не должно быть. Скажем, глюк связан с созданием файла ? Если да - в примере должно быть создание файла, если нет - то нет. LOCA cOldCol:=SetColor() LOCA cOff:=" " @ 1,1 SAY "Пожалуйста вв. дату начала ........ конца ........ периода" @ 6,1 SAY "Разделитель чисел для экспорта в MsOffice или ничего ." @6,58 GET cOff // Если отлично от пустого, то заменяется разделитель точка на введённый знак в обычном текстовом файле READ А дальше ? Кратко изложите, как проявляется глюк
| |
|
|
| |
Пост N: 127
Зарегистрирован: 12.11.06
|
|
Отправлено: 07.05.10 15:29. Заголовок: Добрый день! Эта од..
Добрый день! Эта одна из многих ситуаций, почему программирование на Harbour назвал "прогулками по минному полю"... Из-за любопытства пытался сделать "простой" пример данной ситуации вне "большого комплекса", НО НЕ СМОГ породить её!!! Но в самом комплексе ситуация "универсальная"! В принципе Dima ставил "старый вариант" у себя - он ещё содержит данную проблемы. Как её выявить: (например) Программа hld/динамическая отчётность/любой отчёт. В конце формы настройки есть запрос - символ разделитель для экспорта в офис - своеобразная форма отчёта без декоративных элементов, где символ точка заменяется на определённый в запросе. После построения появится форма для вывода на устройства с "явными признаками зацикливания", что прерывается клавишей Esc. В новой версии исправлена данная проблема добавкой кода (повторюсь): // Из ЭФ читаем параметры печати. @ 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
| |
|
|
| Администратор
|
Пост N: 1440
Зарегистрирован: 23.05.05
|
|
Отправлено: 07.05.10 15:49. Заголовок: Я все-таки не могу п..
Я все-таки не могу понять, в чем заключается глюк Глюк связан с GET - системой ? После READ (ReadModal) получается неправильное значение односимвольной переменной ? Или после READ возникает какое-то последействие в функцих типа READKEY() ? Или глюк связан с вложенным READ, т.е в обработке READ вызывается еще один READ ? Создание файла существенно, или это просто сопутствующее действие ? Код 15 (ctrl+o) вводится с клавиатуры ? Попробуйте описать словесно, отбросив все несущественные детали
| |
|
|
| |
Пост N: 129
Зарегистрирован: 12.11.06
|
|
Отправлено: 07.05.10 16:09. Заголовок: Я все-таки не могу п..
цитата: | Я все-таки не могу понять, в чем заключается глюк |
| Я тоже ХЗ? На мелкой тестовой эмуляции не сумел породить проблемы, а в "большой" системе она "стабильная", т.е. какая функция 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), после чего читаю форму заново.
| |
|
|
| Администратор
|
Пост N: 1441
Зарегистрирован: 23.05.05
|
|
Отправлено: 07.05.10 16:24. Заголовок: т.е., если по Read в..
т.е., если по Read в односимвольную переменную вводится один из символов: .,/ следующий за ним Read не переводит программу в режим ожидания ввода, а зацикливается ? Т.е. в буфере клавиатуры остаются какие-то коды, которые влияют на последующий READ ? Терминал gtwin или gtwvt ? Если gtwin, то для gtwvt этот глюк проявляется ? А где в программе цикл и какое условие выхода из цикла ?
| |
|
|
| |
Пост N: 130
Зарегистрирован: 12.11.06
|
|
Отправлено: 07.05.10 16:48. Заголовок: т.е., если по Read в..
цитата: | т.е., если по 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 Если Вам не сложно - скачайте архив из первого поста и легко сможете сами убедиться (в последней ссылке проблема исправлена)
| |
|
|
| |
Пост N: 1645
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.05.10 19:46. Заголовок: AndreyZh пишет: Chr..
AndreyZh пишет: цитата: | Chr(15) прилетает, как будто из ниоткуда. |
| Полтергейст А попробуй запустить прогу в режиме защиты от сбоев (я про Windows) , будет тот же "Полтергейст" ?
| |
|
|
| |
Пост N: 131
Зарегистрирован: 12.11.06
|
|
Отправлено: 07.05.10 21:19. Заголовок: Полтергейст? А поп..
цитата: | Полтергейст? А попробуй запустить прогу в режиме защиты от сбоев (я про Windows) , будет тот же "Полтергейст" ? |
| Данный "глюк" людям демонстрировал под (разные конторы) Windows 98/ХР Home/Prof/Windows Server/Windows 7 (сейчас проверил и в режиме защиты от сбоев). К тому же Вы легко можете его увидеть, например: - Программа hld - <Динамика> Отражение работы фирмы в динамике - Любой отчёт данного блока/берёте любой период/остальное соглашаетесь - На вопрос "знак разделитель экспорта в офис", если возьмёте (.,) получите "барабашку", другой (не все перепроверил) знак - нормальный отчёт
| |
|
Ответов - 182
, стр:
1
2
3
4
5
6
7
8
9
10
All
[только новые]
|
|
|