Форум » [x]Harbour » Achoice, UserFunction, Row » Ответить

Achoice, UserFunction, Row

Sikambr: В большом проекте много где используется Achoice с пользовательской функцией. В этой пользовательской функции, позиция курсора определяется через Row(); В Clipper 5.2 все нормально работает, а под Harbour текущая позиция курсора непредсказуема. Можно подправить исходники, и использовать 3-й параметр <nRowPos>, передающийся в функцию и прибавлять к нему верхнюю координату Achoice(Top... Но править очень много, хотелось бы облегчить себе жизнь. Может кто сталкивался с этим, или у кого есть идеи, поделитесь. Спасибо! PS Используется: harbour-2.0.0-win.exe

Ответов - 16

gfilatov2002: Sikambr пишет: у кого есть идеи, поделитесь Идея простая: надо использовать более свежую сборку харбора с SVN (которая обновляется ежесуточно в автоматическом режиме), поскольку после выхода 2-й версии в работу функции Achoice() гарантированно вносились изменения разработчиками.

Sikambr: Скачал ночную версию, откомпилил прогу, а она вместо русских букв, стала кракозябры выводить. Пытался вставить HB_CDPSELECT( "RU866" ), нифига не вышло. PS Зато в Achoice() функция Row() стала как надо работать.

AlexMyr: Sikambr пишет: Скачал ночную версию, откомпилил прогу, а она вместо русских букв, стала кракозябры выводить. Пытался вставить HB_CDPSELECT( "RU866" ), нифига не вышло. REQUEST HB_CODEPAGE_RU866 HB_CDPSELECT( "RU866" )


Sikambr: В Harbour rev.16855 заметил одну маленькую неточность в библиотеке SuperLib. В файле superlib.hbp строка -olib/${hb_plat}/${hb_comp}/super изменена на -o${hb_name} а в файле superlib.hbc указано libpaths=lib/${hb_plat}/${hb_comp} На мой взгляд, если в файле superlib.hbp сделать строку -olib/${hb_plat}/${hb_comp}/superlib то все будет пучком :) И еще такой вопрос: файл hbmk.cfg переименован в hbmk.hbc, а в дистрибутив он не положен. Это сделано умышленно?

AlexMyr: Sikambr пишет: В Harbour rev.16855 заметил одну маленькую неточность в библиотеке SuperLib. В файле superlib.hbp строка цитата: -olib/${hb_plat}/${hb_comp}/super изменена на цитата: -o${hb_name} а в файле superlib.hbc указано цитата: libpaths=lib/${hb_plat}/${hb_comp} На мой взгляд, если в файле superlib.hbp сделать строку цитата: -olib/${hb_plat}/${hb_comp}/superlib то все будет пучком :) Что за неточность и что должно быть пучком можно подробней? (Только что собрал libsuperlib.a как сказано в readme.txt, есть несколько warning а так все норм.)

Sikambr: Прошу прощения, что не до конца объяснил ситуацию. Если собрать superlib (как есть) и откомпилировать какой-нибудь prg-шник с superlib, например, как написано в readme: hbmk2 myapp.prg superlib.hbc то получим ошибку "cannot find -lsuperlib". Для наглядности, можно добавить в myapp.prg строку: ? CurD() А если в файле superlib.hbp изменить строку: -o${hb_name} на -olib/${hb_plat}/${hb_comp}/superlib собрать superlib, то myapp.prg компилится.

AlexMyr: Вот сегодня были изменения: 2011-06-08 00:27 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * examples/superlib/superlib.hbp ... ! synced libpaths in .hbp and .hbc files. it also means multitarget support # $Id: superlib.hbp 16868 2011-06-07 22:29:10Z vszakats $ # -hblib -inc -olib/${hb_plat}/${hb_comp}/${hb_name}

Sikambr: Вывожу файлы в кодировке RU866 на принтер примерно так: WIN_PRINTFILERAW( cPrinter, cFileName, "testing raw printing" ) На одних принтерах печатается нормально, на других кракозябрами. Под Клиппером подгружали програмки, типа dosprn, но сейчас хотелось бы уйти от этого. Идея такая: 1. перекодировать строки при формирования файла в Windows-кодировку hb_Translate( cText,"RU866", "RU1251" ) 2. распечатать файл Пункт 1 реализовал, в пункте 2 затык. Печатаются кракозябры. Как распечатать файл в кодировке Windows?

Andrey: Sikambr пишет: Печатаются кракозябры. Как печатаешь ? Покажи код ! Их хелпера по хХарбору: PrintFileRaw() - Prints a file to a Windows printer in RAW mode

Sikambr: Как печатаешь ? Покажи код ! Создается файл, а затем он печатается функцией WIN_PRINTFILERAW. Если файл в кодировке RU866, то на неруссифицированных принтерах печатаются кракозябры (нужно подгружать всякие dosprn-ы). Вот я и хотел, перекодировать файл в RU1251. Ведь Notepad печатает русский текст нормально. Только как распечатать файл в кодировке RU1251?

Sikambr: Написал две функции печати DOS файла и строки через Win_Prn() с разбивкой на строки и страницы. Может кому пригодиться. Компилим так: harbour winprint.prg hbwin.hbc hbct.hbc Еще нужно создать файл winprint.txt в DOS кодировке. Сам исходник: [pre] #define FORM_A4 9 #define PS_SOLID 0 #define RGB( nR,nG,nB ) ( nR + ( nG * 256 ) + ( nB * 256 * 256 ) ) #define BLACK RGB( 0x0 ,0x0 ,0x0 ) procedure Main local cFile local nSelect REQUEST HB_CODEPAGE_RU866 HB_CDPSELECT( "RU866" ) cFile = "winprint.txt" nSelect = Alert( 'Печатаем?', {"Крупно", "Мелко", "Аборт"} ) do case case nSelect == 1 WinPrintFile(cFile, .F.) case nSelect == 2 WinPrintFile(cFile, .T.) otherwise quit endcase return procedure WinPrintFile(cFile, lCompressed, cPrinter) WinPrintText(MemoRead(cFile), lCompressed, cPrinter) return procedure WinPrintText(cText, lCompressed, cPrinter) local oPrinter local cDelim := chr(10)+chr(13) local nLineCount, nLineIndex, cLineText local I if Empty(lCompressed) lCompressed := .F. endif if Empty(cPrinter) cPrinter := win_PrinterGetDefault() endif oPrinter := Win_Prn():New(cPrinter) IF !oPrinter:Create() Alert("Cannot Create Printer") ELSE oPrinter:Landscape := .F. oPrinter:FormType := FORM_A4 oPrinter:Copies := 1 IF !oPrinter:startDoc('Krab printing') Alert("StartDoc() failed") ELSE oPrinter:SetPen(PS_SOLID, 1, BLACK) if lCompressed // oPrinter:SetFont('Courier New', 8,{3,-50}) oPrinter:SetFont('Lucida Console',8,{3,-50}) else oPrinter:SetFont('Courier New', 10,{4,-47}) endif oPrinter:Charset(255) nLineCount = numtoken( cText, cDelim ) nLineIndex = 1 while nLineIndex <= nLineCount cLineText := token( cText, cDelim, nLineIndex ) I := At(chr(12), cLineText) if I == 0 oPrinter:NewLine() oPrinter:TextOut(cLineText) else while I > 0 if I > 1 oPrinter:NewLine() oPrinter:TextOut(SubStr(cLineText, 1, I-1)) endif oPrinter:NewPage() cLineText := Right(cLineText, Len(cLineText) - I) I := At(chr(12), cLineText) enddo if .not. cLineText == "" oPrinter:NewLine() oPrinter:TextOut(cLineText) endif endif ++nLineIndex enddo oPrinter:EndDoc() ENDIF oPrinter:Destroy() ENDIF return[/pre]

Sikambr: Хотел спросить, что есть 3-й параметр-массив в методе oPrinter:SetFont oPrinter:SetFont('Courier New', 10,{4,-50}) Первые два понятно (имя и размер шрифта), а вот 3-й в хелпах так и не смог найти. Еще хотел спросить, как узнать путь к экзешнику? Ну и заодно, значение переменной среды окружения (например SET TEMP=)? Спасибо!

gfilatov2002: Sikambr пишет: oPrinter:SetFont('Courier New', 10,{4,-50}) Первые два понятно (имя и размер шрифта), а вот 3-й в хелпах так и не смог найти. Посмотрел в коде и нашел такое описание: METHOD SetFont( cFontName, nPointSize, xWidth, nBold, lUnderline, lItalic, nCharSet, lManualSize ) // NB: xWidth is in "CharactersPerInch" // _OR_ { nMul, nDiv } which equates to "CharactersPerInch" // _OR_ ZERO ( 0 ) which uses the default width of the font // for the nPointSize // IF xWidth (or nDiv) is < 0 then Fixed font is emulated Может, поможет

gfilatov2002: Sikambr пишет: Еще хотел спросить, как узнать путь к экзешнику? Использовать функцию FUNCTION EXENAME() RETURN HB_PROGNAME() Sikambr пишет: Ну и заодно, значение переменной среды окружения (например SET TEMP=)? Использовать функцию GetE()

Sergey Spirin: gfilatov2002 пишет:  цитата: METHOD SetFont( cFontName, nPointSize, xWidth, nBold, lUnderline, lItalic, nCharSet, lManualSize ) // NB: xWidth is in "CharactersPerInch" // _OR_ { nMul, nDiv } which equates to "CharactersPerInch" // _OR_ ZERO ( 0 ) which uses the default width of the font // for the nPointSize // IF xWidth (or nDiv) is < 0 then Fixed font is emulated Может, поможет WinAPI-функции CreateFont и CreateFontIndirect не имеют параметра просто "размер шрифта". Высота и ширина задаются отдельно двумя параметрами. Вполне можно задавать, например, высоту там 200, а ширину 4, будет забавный очень высокий и худой шрифт При использовании только одного размера, высота и ширина вычисляются обычно так: nHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72); а в nWidth передается 0, что подразумевает умолчательную для этого шрифта ширину. В HB_FUNC_STATIC( CREATEFONT ) из win32prn.prg видно, что nPointSize так и используется: iHeight = -MulDiv(iHeight, GetDeviceCaps(hDC, LOGPIXELSY), 72); xWidth два параметра используются для корректировки ширины: if (iDiv ) { iWidth = MulDiv(abs(iMul), GetDeviceCaps(hDC,LOGPIXELSX), abs(iDiv)) ; } else { iWidth = 0 ; // Use the default font width }

Zakrzevky: Вставляю свой пятак. Нужно было сделать настройку для пользователя по изменению высоты и ширины шрифта. По умолчанию {3,-50}, я пропорционально менял вторую цифру -60 -70 и т д. В принципе своего добился. Насколько я понимаю ширина определяется так 50 /3 = 16.7 п/дюйм. Знак "-" означает то ли "моноширинность" , то ли еще что-то, не помню.



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