#include Function Main param FileToPrint public cTrans1 := "Ľ†Šˆä˘˜žŤ¤¨ăŕ—˝łÄĹŮĂÂÁŔżÚ´" public cTrans2 := "šćęłń󜿟ĽĆĘŁŃӌŻ|-+++++++++" public FolderProgramu := substr(exename(),1,rat("\",exename())-1) public cPrinter := GetDefaultPrinter() public nMaxDlStrony := 280 public aDrukarki := aPrinters() public cTytulDok := "Dokument wydrukowany z programu MOLDruk" public cpi5 := 14 public cpi10 := 12 public cpi12 := 10 public cpi17 := 8 public cpi20 := 6 PUBLIC lpi5 := 6, lpi10 := 6, lpi12 := 6, lpi17 := 8, lpi20 := 10 if type("FileToPrint") <> "C" return endif if !file(FileToPrint) return endif BEGIN INI FILE FolderProgramu+"\moldruk.ini" GET cPrinter SECTION "GLOBALNE" ENTRY "Drukarka" DEFAULT GetDefaultPrinter() GET nMaxDlStrony SECTION "GLOBALNE" ENTRY "MaxDlStrony" DEFAULT 280 GET cTytulDok SECTION "GLOBALNE" ENTRY "TytulDokumentu" DEFAULT "Dokument wydrukowany z programu MOLDruk" GET cpi5 SECTION "GLOBALNE" ENTRY "CPI5" DEFAULT 14 GET cpi10 SECTION "GLOBALNE" ENTRY "CPI10" DEFAULT 12 GET cpi12 SECTION "GLOBALNE" ENTRY "CPI12" DEFAULT 10 GET cpi17 SECTION "GLOBALNE" ENTRY "CPI17" DEFAULT 8 GET cpi20 SECTION "GLOBALNE" ENTRY "CPI20" DEFAULT 6 GET Lpi5 SECTION "GLOBALNE" ENTRY "LPI5" DEFAULT 6 GET Lpi10 SECTION "GLOBALNE" ENTRY "LPI10" DEFAULT 6 GET Lpi12 SECTION "GLOBALNE" ENTRY "LPI12" DEFAULT 6 GET Lpi17 SECTION "GLOBALNE" ENTRY "LPI17" DEFAULT 8 GET Lpi20 SECTION "GLOBALNE" ENTRY "LPI20" DEFAULT 10 END INI set exact on cPrinter := upper(cPrinter) if ascan(aDrukarki, { |x | upper(x) == cPrinter} ) = 0 cPrinter := GetDefaultPrinter() MsgBox("Drukarka zadeklarowana w pliku .INI nie jest zainstalowana. Przyjęto domyœlnš drukarkę systemowš") endif DrukujPlik(FileToPrint) Return Function DrukujPlik param FileToPrint private cWiersz := "" private cTokenPliku private cpi, lp, nsize private poz_x, poz_y PRIVATE cFontName := "COURIER NEW" private NowaStrona := .f. private oprint private offsety := 0 private nError public FToken := { 0, 0, "", 0, 0, .F. }, cFtokBuffer := "" if !file(FileToPrint) return endif if (nError := FTokenInit(FileToPrint, chr(13)+chr(10)+chr(26),2) ) < 0 return .f. endif SELECT PRINTER cPrinter; ORIENTATION PRINTER_ORIENT_PORTRAIT ; PAPERSIZE PRINTER_PAPER_A4 ; QUALITY PRINTER_RES_MEDIUM //PREVIEW START PRINTDOC NAME cTytulDok START PRINTPAGE poz_y := GetPrintableAreaVerticalOffset() poz_x := GetPrintableAreaHorizontalOffset() cpi := 25.4 / 10 lpi := 25.4 /6 nsize := 12 lItalic := .f. lBold := .f. do while .not. FTokenEnd() cWiersz := FTokenNext() poz_x := GetPrintableAreaHorizontalOffset() koniecpetli := .f. komenda := "X" znak := left(cWiersz,1) Wyraz := "" do while len(znak)>0 dlx := cpi dly := lpi if NowaStrona START PRINTPAGE poz_y := GetPrintableAreaVerticalOffset() poz_x := GetPrintableAreaHorizontalOffset() //msgbox("Kolejna strona") NowaStrona := .f. endif if znak == chr(12) // wysuw strony DrukujWyraz(Wyraz) Wyraz := "" NowaStrona := .t. END PRINTPAGE elseif znak == chr(27) komenda := substr(cWiersz,2,1) cWiersz := substr(cWiersz,2) DrukujWyraz(Wyraz) Wyraz := "" elseif at( znak , "łÄĹŮĂÂÁŔżÚ´") > 0 DrukujWyraz(Wyraz) Wyraz := "" do case case znak == chr(196) // linia pozioma @ poz_y+dly/2, poz_x print line to poz_y+dly/2, poz_x + dlx; PENWIDTH 0.1 COLOR BLACK case znak == chr(179) // linia pionowa @ poz_y, poz_x + dlx/2 print line to poz_y+dly, poz_x +dlx/2; PENWIDTH 0.1 COLOR BLACK case znak == chr(197) // krzyżówka @ poz_y+dly/2, poz_x print line to poz_y+dly/2, poz_x + dlx; PENWIDTH 0.1 COLOR BLACK @ poz_y, poz_x+dlx/2 print line to poz_y+dly, poz_x+dlx/2 ; PENWIDTH 0.1 COLOR BLACK case znak == chr(195) // lewy brzeg ramki z półkreskš poziomš @ poz_y+dly/2, poz_x+dlx/2 print line to poz_y+dly/2, poz_x+dlx ; PENWIDTH 0.1 COLOR BLACK @ poz_y, poz_x+dlx/2 print line to poz_y+dly, poz_x+dlx/2 ; PENWIDTH 0.1 COLOR BLACK case znak == chr(180) // prawy brzeg ramki z półkreskš poziomš @ poz_y+dly/2, poz_x print line to poz_y+dly/2, poz_x+dlx/2 ; PENWIDTH 0.1 COLOR BLACK @ poz_y, poz_x+dlx/2 print line to poz_y+dly, poz_x+dlx/2 ; PENWIDTH 0.1 COLOR BLACK case znak == chr(194) // górny brzeg ramki z półkreskš pionowš @ poz_y+dly/2, poz_x print line to poz_y+dly/2, poz_x +dlx; PENWIDTH 0.1 COLOR BLACK @ poz_y+dly/2, poz_x+dlx/2 print line to poz_y+dly, poz_x+dlx/2 ; PENWIDTH 0.1 COLOR BLACK case znak == chr(193) // dolny brzeg ramki z półkreskš pionowš @ poz_y+dly/2, poz_x print line to poz_y+dly/2, poz_x +dlx; PENWIDTH 0.1 COLOR BLACK @ poz_y, poz_x+dlx/2 print line to poz_y+dly/2, poz_x+dlx/2 ; PENWIDTH 0.1 COLOR BLACK case znak == chr(218) // lewy górny narożnik @ poz_y+dly/2, poz_x+dlx/2 print line to poz_y+dly/2, poz_x +dlx; PENWIDTH 0.1 COLOR BLACK @ poz_y+dly/2, poz_x+dlx/2 print line to poz_y+dly, poz_x+dlx/2 ; PENWIDTH 0.1 COLOR BLACK case znak == chr(191) // prawy górny narożnik @ poz_y+dly/2, poz_x print line to poz_y+dly/2, poz_x +dlx/2; PENWIDTH 0.1 COLOR BLACK @ poz_y+dly/2, poz_x+dlx/2 print line to poz_y+dly, poz_x+dlx/2 ; PENWIDTH 0.1 COLOR BLACK case znak == chr(192) // lewy dolny narożnik @ poz_y+dly/2, poz_x+dlx/2 print line to poz_y+dly/2, poz_x +dlx; PENWIDTH 0.1 COLOR BLACK @ poz_y, poz_x+dlx/2 print line to poz_y+dly/2, poz_x+dlx/2 ; PENWIDTH 0.1 COLOR BLACK case znak == chr(217) // prawy dolny narożnik @ poz_y+dly/2, poz_x print line to poz_y+dly/2, poz_x +dlx/2; PENWIDTH 0.1 COLOR BLACK @ poz_y, poz_x+dlx/2 print line to poz_y+dly/2, poz_x+dlx/2 ; PENWIDTH 0.1 COLOR BLACK otherwise @ poz_y, poz_x print line to poz_y+dly, poz_x +dlx; PENWIDTH 0.1 COLOR BLACK endcase poz_x += dlx else //Wyraz += znak DrukujWyraz(znak) endif cWiersz := substr(cWiersz,2) znak := left(cWiersz,1) if len(znak) == 0 DrukujWyraz(Wyraz) Wyraz := "" endif do case case komenda == "2" // włšcz gruby lBold := .t. case komenda == "3" lBold := .f. case komenda == "4" lItalic := .t. case komenda == "5" lItalic := .f. case komenda == "6" nsize := cpi5 cpi := 25.4/8 lpi := 25.4/lpi5 offsety := -4 case komenda == "7" nsize := cpi10 cpi := 25.4/10 lpi := 25.4/lpi10 cFontName := "COURIER NEW" offsety := 0 case komenda == "8" nsize := cpi12 cpi := 25.4/12 lpi := 25.4/lpi12 cFontName := "COURIER NEW" offsety := 0 case komenda == "9" nsize := cpi17 //cpi := 25.4/17 cpi := 25.4/18 lpi := 25.4/lpi17 cFontName := "LUCIDA CONSOLE" offsety := 0 case komenda == "A" nsize := cpi20 cpi := 25.4/20 lpi := 25.4/lpi20 cFontName := "LUCIDA CONSOLE" offsety := 0 end case komenda := "X" enddo poz_y += lpi if poz_y > nMaxDlStrony NowaStrona := .t. END PRINTPAGE endif enddo FtokenClos() if !NowaStrona // nie było eject, a skończył się dokument END PRINTPAGE endif END PRINTDOC return *--------------------------- function DrukujWyraz(FragmentWiersza) FragmentWiersza := translate(FragmentWiersza) if len(FragmentWiersza)>0 if lBold .and. !lItalic @ poz_y+offsety, poz_x PRINT FragmentWiersza ; FONT cFontName ; SIZE nSize ; BOLD; COLOR BLACK elseif lBold .and. lItalic @ poz_y+offsety, poz_x PRINT FragmentWiersza ; FONT cFontName ; SIZE nSize ; BOLD; ITALIC ; COLOR BLACK elseif !lBold .and. lItalic @ poz_y+offsety, poz_x PRINT FragmentWiersza ; FONT cFontName ; SIZE nSize ; ITALIC; COLOR BLACK else @ poz_y+offsety, poz_x PRINT FragmentWiersza ; FONT cFontName ; SIZE nSize ; COLOR BLACK endif poz_x += len(FragmentWiersza)*cpi endif return *-------------------------------------- FUNCTION FTOKENINIT(cFile, cSep, nSkip) LOCAL nRetVal := 0 FToken[1] := FOPEN(cFile) IF FToken[1] < 0 nRetVal := -FERROR() ELSE FToken[2] := FSEEK(FToken[1], 0, 2) FToken[3] := cSep FToken[4] := nSkip FToken[5] := MIN(MIN(800000, MEMORY(1)*1024), FToken[2]) FToken[6] := .F. cFtokBuffer := REPLICATE(CHR(0), FToken[5]) FSEEK(FToken[1], 0, 0) FREAD(FToken[1], @cFtokBuffer, FToken[5]) TOKENINIT(@cFtokBuffer, FToken[3], nSkip) ENDIF RETURN(nRetVal) *-------------------------------- FUNCTION FTOKENNEXT() LOCAL cToken, nFilePos, nStill2Read cToken = TOKENNEXT(cFtokBuffer) IF LEN(cToken) >= FToken[5] * Token and buffer have the same size, a token is not * recognizable. The buffer has to be enhanced or it has * been tried to read text from a binary file. * cToken = "" FTOKENCLOS() ELSE IF TOKENEND() * Last token for the current buffer. If the file contains * further data, this last token has to be 'illegal' and * read again with further data. IF FSEEK(FToken[1], 0, 1) < FToken[2] * new loading of the buffer * * If the file has not reached EOF, the last token of the * buffer will be ignored, because it is not sure if the * token is complete. The file pointer will be moved back to * the beginning of the token and a new buffer will be * loaded. * nFilePos := FSEEK(FToken[1], -((FToken[5] -TOKENAT()) +1) , 1) nStill2Read := FToken[2] -nFilePos * creating a new, smaller buffer * IF nStill2Read < FToken[5] FToken[5] := nStill2Read cFtokBuffer := REPLICATE(CHR(0), FToken[5]) ENDIF * read the following data into the buffer * FREAD(FToken[1], @cFtokBuffer, FToken[5]) TOKENINIT(@cFtokBuffer, FToken[3], FToken[4]) cToken := TOKENNEXT(cFtokBuffer) ELSE FTOKENCLOS() ENDIF ENDIF ENDIF RETURN(cToken) //* displays if further tokens are existing *// *---------------------------------- FUNCTION FTOKENEND() RETURN(FToken[6]) //* closes the file *// *------------------------------ FUNCTION FTOKENCLOS() FCLOSE(FToken[1]) cFtokBuffer := "" FToken := { 0, 0, "", 0, 0, .T. } RETURN(Nil) *----------------------------- function translate param cNapis local i, x cNapisKonc := "" for i:=1 to len(cNapis) if (x:= at(substr(cNapis,i,1), cTrans1)) = 0 cNapisKonc += substr(cNapis,i,1) else cNapisKonc += substr(cTrans2,x,1) endif next i return cNapisKonc *------------------------ function printLen( cString,nFontsize,cFontname) local ret ret :=round(gettextwidth(Nil,cString,cFontname)*0.072/72*25.4*nFontsize,2) //msgbox("ustalam dł "+str(ret)) return ret *---------------------------