Here's an approach to printing text strings using XPrint, where the text strings contain $TAB characters. Code is given for single and multi-line text.
There are two basic approaches to printing with embedded TABs - expanding the TABs to spaces or setting the print POS to the next TAB location every time a TAB character is encountered.
The example parses the line on $tab characters, then prints each element one at a time. After each element is printed, the x position is moved to the next tab location.
This example uses a richedit control, whose default tab positions are set every 0.5 inches.
There are two critical parts to this approach.
1. The printer and richedit control must be set to the same font.
2. The Tab positions of the richedit must be used on the printer.
There are two basic approaches to printing with embedded TABs - expanding the TABs to spaces or setting the print POS to the next TAB location every time a TAB character is encountered.
The example parses the line on $tab characters, then prints each element one at a time. After each element is printed, the x position is moved to the next tab location.
This example uses a richedit control, whose default tab positions are set every 0.5 inches.
There are two critical parts to this approach.
1. The printer and richedit control must be set to the same font.
2. The Tab positions of the richedit must be used on the printer.
Code:
'Compilable Example: #Compile Exe #Dim All #Include "Win32API.inc" #Include "RichEdit.inc" #Include "CommCtrl.inc" Global hDlg as Dword, hRichEdit as Dword, TabLoc() as Single, hFont as Dword %ID_RichEdit = 500 Function PBMain() As Long Local style&, buf$ buf$ = "This is" + $Tab + $Tab + "an example" + $Tab + "of a string with an embedded tab character." style& = %WS_Child Or %WS_Visible Or %ES_MultiLine Or %WS_VScroll Or %ES_AutoHScroll _ Or %WS_HScroll Or %ES_AutoVScroll Or %ES_WantReturn Or %ES_NoHideSel Or %WS_TabStop Dialog New Pixels, 0, "Test Code",300,300,550,150, %WS_OverlappedWindow To hDlg Control Add Button, hDlg, 100,"Print", 30,10,140,20 LoadLibrary("riched32.dll") : InitCommonControls Control Add "RichEdit", hDlg, %ID_RichEdit, buf$,20,40,510,100, style&, %WS_EX_ClientEdge Control Handle hDlg, %ID_RichEdit To hRichEdit Font New "Comic Sans MS", 10, 0 To hFont Control Set Font hDlg, %ID_RichEdit, hFont Dialog Show Modal hDlg Call DlgProc End Function CallBack Function DlgProc() As Long If CB.Msg = %WM_Command AND CB.Ctl = 100 AND CB.Ctlmsg = %BN_Clicked Then Local temp$, w as Single, h as Single, i as Long ReDim TabLoc(50) 'tab locations For i = 0 To 50 : TAbLoc(i) = i * 0.5 : Next i '0.5" tab locations XPrint Attach Default XPrint Set Font hFont SetPrinterScaleToInches w,h 'w,h are return values, not used in this example Control Get Text hDlg, %ID_RichEdit To temp$ PrintSingleTextLineWithTabs (temp$) 'temp$ is text string with tabs XPrint Close End If End Function Sub SetPrinterScaleToInches (ncWidth!, ncHeight!) Local x&, y& XPrint Get Client TO ncWidth!, ncHeight! 'Retrieve the client size (printable area) of the printer page XPrint Get PPI TO x&, y& 'Retrieve the resolution (points per inch) of the attached printer ncWidth! = ncWidth!/x& 'Width in inches of the printable area ncHeight! = ncHeight!/y& 'Height in inches of the printable area XPrint Scale (0,0)-(ncWidth!,ncHeight!) 'Set scale to inches End Sub Sub PrintSingleTextLineWithTabs (temp$) Local i As Long, x As Single, y As Single For i = 1 To ParseCount(temp$, $Tab) XPrint Parse$(temp$,$Tab, i) ; XPrint Get Pos To x,y XPrint Set Pos (TabLoc((Fix(x/0.5)+1)),y) Next i XPrint End Sub Sub PrintMultiLineTextWithTabs (temp$) Local i As Long, x As Single, y As Single, j as long Dim D(ParseCount(temp$,$crlf)-1) as String Parse temp$, D(), $crlf For j = 0 to UBound(D) For i = 1 To ParseCount(D(j), $Tab) XPrint Parse$(D(j),$Tab, i) ; XPrint Get Pos To x,y XPrint Set Pos (TabLoc((Fix(x/0.5)+1)),y) Next i XPrint Next J End Sub