Форум » GUI » Поднимаю нерешенную проблему с принтером » Ответить

Поднимаю нерешенную проблему с принтером

SADSTAR2: Проблема в том, что пользуясь hbprint.lib получаю косяки со шрифтами в зависимости от типа принтера. Подробное описание с картинками здесь http://ssmessages.by.ru/problem_01.html не сочтите за труд сходить туда. А то здесь картинки не знаю как цеплять.

Ответов - 12

Dima: Покажи часть исходника которая отсылает данные на принтер.

SADSTAR2: Все косяки кроме последнего устранились применением простой команды без которой я почему-то раньше обходился SET CHARSET 204 Dima пишет: Покажи часть исходника которая отсылает данные на принтер. теперь эта часть выглядит так //------------------------------- function Start() local n:=wMain.grid_Fonts.ItemCount local np:=wMain.list_Printers.Value local fn, y:=10 if np<1 MsgExclamation('Сначала выдели нужный принтер', 'Print Font Tester') return Nil endif INIT PRINTSYS SET UNITS MM SELECT PRINTER wMain.list_Printers.Item(np) PREVIEW hbprn:PREVIEWSCALE:=2 SET CHARSET 204 define font 'font_000' name 'Arial' size 10 for i:=1 to n fn:='font_'+strzero(i,3,0) hbprn:definefont( fn, ; wMain.grid_Fonts.Cell(i,1), ; val(wMain.grid_Fonts.Cell(i,2)) ,,,; if(wMain.grid_Fonts.Cell(i,3)='+', .t., .f.),; if(wMain.grid_Fonts.Cell(i,4)='+', .t., .f.),; if(wMain.grid_Fonts.Cell(i,5)='+', .t., .f.),; if(wMain.grid_Fonts.Cell(i,6)='+', .t., .f.)) next START DOC START PAGE for i:=1 to n fn:='font_'+strzero(i,3,0) y:=y+10 @ y, 20 SAY wMain.grid_Fonts.Cell(i,1)+'<'+wMain.grid_Fonts.Cell(i,2)+'>'+; ' '+if(wMain.grid_Fonts.Cell(i,3)='+', 'bold', '')+; ' '+if(wMain.grid_Fonts.Cell(i,4)='+', 'italic', '')+; ' '+if(wMain.grid_Fonts.Cell(i,5)='+', 'underline', '')+; ' '+if(wMain.grid_Fonts.Cell(i,6)='+', 'strikeout', '') ; font 'font_000' ; to print @ y, 70 SAY 'Проба Проверка и так далее' ; font fn ; to print next END PAGE END DOC RELEASE PRINTSYS return Nil

SADSTAR2: Пытаюсь решить последнюю проблему. непонятна последняя строка стека вызовов RR_DEVICECAPABILITIES(0) что означает номер строки =0 ? ошибка произошла при вызове функции RR_DEVICECAPABILITIES до выполнения какой либо команды внутри функции или обработчик ошибок не работает внутри функции? Как в таком случае внедрить в функцию какую либо отладочную информацию чтобы узнать какая команда вызывает ошибку? Информация к размышлению. Последний вызов выглядит так. METHOD SelectPrinter( cPrinter ,lPrev) CLASS HBPrinter local txtp:="",txtb:="",t:={0,0,1,.t.} ... rr_devicecapabilities(@txtp,@txtb) <=(190) ... #pragma BEGINDUMP ... HB_FUNC( RR_DEVICECAPABILITIES ) { LPBYTE cBuffer, pBuffer, nBuffer, sBuffer, bnBuffer, bwBuffer, bcBuffer; DWORD numpapers, numbins, i; LPPOINT lp; char buffer[sizeof( long ) * 8 + 1]; numbins = DeviceCapabilities( pi2->pPrinterName, pi2->pPortName, DC_BINNAMES, NULL, NULL ); numpapers = DeviceCapabilities( pi2->pPrinterName, pi2->pPortName, DC_PAPERNAMES, NULL, NULL ); if( numpapers > 0 ) { pBuffer = GlobalAlloc( GPTR, numpapers * 64 ); nBuffer = GlobalAlloc( GPTR, numpapers * sizeof(WORD) ); sBuffer = GlobalAlloc( GPTR, numpapers * sizeof(POINT) ); cBuffer = GlobalAlloc( GPTR, numpapers * 128 ); DeviceCapabilities( pi2->pPrinterName, pi2->pPortName, DC_PAPERNAMES, pBuffer, pi2->pDevMode ); DeviceCapabilities( pi2->pPrinterName, pi2->pPortName, DC_PAPERS, nBuffer, pi2->pDevMode ); DeviceCapabilities( pi2->pPrinterName, pi2->pPortName, DC_PAPERSIZE, sBuffer, pi2->pDevMode ); for( i = 0; i < numpapers; i++ ) { strcat( cBuffer, pBuffer ); strcat( cBuffer, "," ); strcat( cBuffer, itoa(*nBuffer, buffer, 10) ); strcat( cBuffer, "," ); lp = ( LPPOINT ) sBuffer; strcat( cBuffer, ltoa(lp->x, buffer, 10) ); strcat( cBuffer, "," ); strcat( cBuffer, ltoa(lp->y, buffer, 10) ); if( i < numpapers - 1 ) { strcat( cBuffer, ",," ); } pBuffer += 64; nBuffer += sizeof( WORD ); sBuffer += sizeof( POINT ); } } if( numbins > 0 ) { bnBuffer = GlobalAlloc( GPTR, numbins * 24 ); bwBuffer = GlobalAlloc( GPTR, numbins * sizeof(WORD) ); bcBuffer = GlobalAlloc( GPTR, numbins * 64 ); DeviceCapabilities( pi2->pPrinterName, pi2->pPortName, DC_BINNAMES, bnBuffer, pi2->pDevMode ); DeviceCapabilities( pi2->pPrinterName, pi2->pPortName, DC_BINS, bwBuffer, pi2->pDevMode ); for( i = 0; i < numbins; i++ ) { strcat( bcBuffer, bnBuffer ); strcat( bcBuffer, "," ); strcat( bcBuffer, itoa(*bwBuffer, buffer, 10) ); if( i < numbins - 1 ) { strcat( bcBuffer, ",," ); } bnBuffer += 24; bwBuffer += sizeof( WORD ); } } GlobalFree( pBuffer ); GlobalFree( nBuffer ); GlobalFree( sBuffer ); GlobalFree( bnBuffer ); GlobalFree( bwBuffer ); hb_storc( cBuffer, 1 ); hb_storc( bcBuffer, 2 ); GlobalFree( cBuffer ); GlobalFree( bcBuffer ); }


Pasha: SADSTAR2 пишет: что означает номер строки =0 ? ошибка произошла при вызове функции RR_DEVICECAPABILITIES до выполнения какой либо команды внутри функции или обработчик ошибок не работает внутри функции? Отладочная информация хранится только для prg-кода. А это С-функция

SADSTAR2: посоветуй - что можно внедрить в код этой функции чтобы понять - на какой строке она вылетает. Может какую нибудь выдачу в файл или на экран?

Pasha: Обычно используется такая функция: HB_TRACE(HB_TR_ALWAYS, ("Trace %s %lu", szStr, ulLen)); Формат параметров - как для функций семейства printf Результат записывается в файл trace.log

SADSTAR2: Вставляю в функцию такую строку HB_TRACE(HB_TR_ALWAYS, ("RR_DEVICECAPABILITIES(): See source code")); но не вижу никакого результата. Библиотека перекомпилируется. Тестовая программа тоже. Строка правильно написана?

Pasha: Можно немного по другому: TraceLog(NULL, "Trace %s %lu", szStr, ulLen);

Петр: Скорее всего ответ нужно искать здесь DeviceCapabilities( pi2->pPrinterName, pi2->pPortName, DC_PAPERNAMES, pBuffer, pi2->pDevMode ); DeviceCapabilities( pi2->pPrinterName, pi2->pPortName, DC_PAPERS, nBuffer, pi2->pDevMode ); DeviceCapabilities( pi2->pPrinterName, pi2->pPortName, DC_PAPERSIZE, sBuffer, pi2->pDevMode ); нужно обязательно проверять, что возвращает DeviceCapabilities.

Петр: Я не уверен, используется ли в Harbour функция TraceLog, если да - хорошо, если нет - можете воспользоваться MyTraceLog("my.log", "RR_DEVICECAPABILITIES(): See source code"); или MyTraceLog(NULL, "RR_DEVICECAPABILITIES(): See source code"); static void MyTraceLog( void *sFile, const char *sTraceMsg ) { FILE * hFile = fopen( sFile ? ( const char * ) sFile : "trace.log", "a" ); if( hFile ) { fprintf( hFile, "%s \n", sTraceMsg ); fclose( hFile ); } }

SADSTAR2: Первые результаты. Ошибка в этом фрагменте ... for( i = 0; i < numbins; i++ ) { MyTraceLog(NULL, "RR_DEVICECAPABILITIES(): CheckPoint4c0 : See source code"); strcat( bcBuffer, bnBuffer ); MyTraceLog(NULL, "RR_DEVICECAPABILITIES(): CheckPoint4c1 : See source code"); strcat( bcBuffer, "," ); ... CheckPoint4c0 регистрируется CheckPoint4c1 уже нет т.е. что-то не переваривает функция strcat( bcBuffer, bnBuffer ); Про что речь в этой строке? Нашел описание функции - простая конкатенация строк. Вероятно - какой-то из аргументов неправильный?

SADSTAR2: заблокировал весь блок работы с bin-ами. /* if( numbins > 0 ) { ... } */ тестовая программа работает без заметных изменений со всеми принтерами. Но это ж не метод. Хотя... Чем в принципе грозит отсутствие этого блока? ... В документации нашел только получение списка лотков GET BINS TO <aBins> А команды выбора лотка - не нашел!? ... В исходниках нашел явно только создание списка ::BinNames:=str2arr(txtb,",,") И не нашел какого-либо использования/присвоения/вызова.



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