On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение



Пост N: 77
Зарегистрирован: 05.06.07
ссылка на сообщение  Отправлено: 26.09.08 08:30. Заголовок: Поднимаю нерешенную проблему с принтером


Проблема в том, что пользуясь hbprint.lib получаю косяки со шрифтами в зависимости от типа принтера.
Подробное описание с картинками здесь

http://ssmessages.by.ru/problem_01.html

не сочтите за труд сходить туда.
А то здесь картинки не знаю как цеплять.


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 12 [только новые]


администратор




Пост N: 903
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.09.08 11:07. Заголовок: Покажи часть исходни..


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 78
Зарегистрирован: 05.06.07
ссылка на сообщение  Отправлено: 27.09.08 09:11. Заголовок: Все косяки кроме пос..


Все косяки кроме последнего устранились применением простой команды без которой я почему-то раньше обходился

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



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 79
Зарегистрирован: 05.06.07
ссылка на сообщение  Отправлено: 29.09.08 05:15. Заголовок: Пытаюсь решить после..


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

непонятна последняя строка стека вызовов
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 );
}





Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 976
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 29.09.08 08:12. Заголовок: SADSTAR2 пишет: что..


SADSTAR2 пишет:

 цитата:
что означает номер строки =0
? ошибка произошла при вызове функции RR_DEVICECAPABILITIES до выполнения какой либо команды внутри функции
или обработчик ошибок не работает внутри функции?



Отладочная информация хранится только для prg-кода. А это С-функция

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 80
Зарегистрирован: 05.06.07
ссылка на сообщение  Отправлено: 29.09.08 08:54. Заголовок: посоветуй - что можн..


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


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 977
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 29.09.08 09:19. Заголовок: Обычно используется ..


Обычно используется такая функция:

HB_TRACE(HB_TR_ALWAYS, ("Trace %s %lu", szStr, ulLen));

Формат параметров - как для функций семейства printf

Результат записывается в файл trace.log


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 81
Зарегистрирован: 05.06.07
ссылка на сообщение  Отправлено: 01.10.08 03:23. Заголовок: Вставляю в функцию т..


Вставляю в функцию такую строку

HB_TRACE(HB_TR_ALWAYS, ("RR_DEVICECAPABILITIES(): See source code"));

но не вижу никакого результата.
Библиотека перекомпилируется.
Тестовая программа тоже.

Строка правильно написана?


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 987
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 01.10.08 08:24. Заголовок: Можно немного по дру..


Можно немного по другому:

TraceLog(NULL, "Trace %s %lu", szStr, ulLen);



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 501
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 01.10.08 08:34. Заголовок: Скорее всего ответ н..


Скорее всего ответ нужно искать здесь
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.



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 502
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 01.10.08 08:41. Заголовок: Я не уверен, использ..


Я не уверен, используется ли в 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 );
}
}


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 82
Зарегистрирован: 05.06.07
ссылка на сообщение  Отправлено: 02.10.08 02:29. Заголовок: Первые результаты. О..


Первые результаты. Ошибка в этом фрагменте
...
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 );

Про что речь в этой строке?

Нашел описание функции - простая конкатенация строк.
Вероятно - какой-то из аргументов неправильный?


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 83
Зарегистрирован: 05.06.07
ссылка на сообщение  Отправлено: 02.10.08 03:05. Заголовок: заблокировал весь бл..


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

...
В исходниках нашел явно только создание списка
::BinNames:=str2arr(txtb,",,")
И не нашел какого-либо использования/присвоения/вызова.


Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 300
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет