problems with printing a dbgrid

I am trying to print the data and column header in a  dbgrid by using the printer.print (rowdata),but since the column header contains more characters than the column data therefore they get all mixed up ie. I am trying to print the  dbgrid like MS Excel sheet (without the grid) with each column data under its corresponding column header. I tried to use vbtab and adding spaces but it still did not work.

So is there a way in VB5 to print the data in dbgrid with its column headers in a nice format?

any comments,suggestions or sample code?
Who is Participating?
dirtdartConnect With a Mentor Commented:
If you use the DrawText API, you can create a bounding box for each text field that you send to the printer.  You can specify word wrapping in this box, and it will automatically wrap the words for you.

        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type
        cbSize As Long
        lpszDocName As String
        lpszOutput As String
End Type

Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long

Declare Function StartDoc Lib "gdi32" Alias "StartDocA" (ByVal hdc As Long, lpdi As DOCINFO) As Long

Declare Function StartPage Lib "gdi32" Alias "StartPage" (ByVal hdc As Long) As Long

Declare Function EndDoc Lib "gdi32" Alias "EndDoc" (ByVal hdc As Long) As LongDeclare Function EndDoc Lib "gdi32" Alias "EndDoc" (ByVal hDC As Long) As Long

Declare Function EndPage Lib "gdi32" Alias "EndPage" (ByVal hdc As Long) As Long

Public Const DT_WORDBREAK = &H10

Private Sub cmdPrintGrid_Click()

Dim doc As DOCINFO
Dim rec As RECT
Dim pDC As Long

pDC = Printer.hDC

StartDoc pDC, doc
StartPage pDC = 10
rec.bottom = 500
rec.left = 10
rec.right = 500

DrawText pDC, DBGrid1.Text, Len(DBGrid1.Text), rec, DT_WORDBREAK

EndPage pDC
EndDoc pDC

End Sub

Of Course, this would only print one cell of the grid, but I think you get the idea.

Here's my suggestion.  I am assuming yu have a data control on your form with the records you have, because you probably bound it to the data control

Add a crystal report control to your form.  Set the ReportSource = 3, set the datasource = data1 or whatever teh data control is.

when you want the report, just sset the action property of the crystal control to 1, and it will print the recordset.  With Crystal Reports Pro (I dont have it) you can actually do this same method with the data grid itself.
knoty, You can do it easily using the printer object just like you're doing.  To align columns use the currentx property.  For example,

Printer.CurrentX =

When you're printing a row, just set the CurrentX for each column just before print the column.

If this answer is more in line with what you are seeking, please reject anthonyc's answer and give me credit.  If you need further help with this method, just comment.
Cloud Class® Course: SQL Server Core 2016

This course will introduce you to SQL Server Core 2016, as well as teach you about SSMS, data tools, installation, server configuration, using Management Studio, and writing and executing queries.

khotyAuthor Commented:
if I use the printer.currentX= then I have to truncate some column headers, in order to fit all data (because the number of columns headers is greater than the width of the page) or I may
need to change the page orientation to landscape at run time (which I don't know how)and if the user insists on portrait view then everything will be mixed up. Is there a way to dectect this at run time and change the font size to shrink everything and fit  it in one page (ie. fit it to page width)?
What was wrong with  my answer?  It works fine.
khotyAuthor Commented:
there is nothing wrong with your answer anthonyc ....I was looking for something simple ie. I just want to have a file print option in File menu and when the user clicks on it will just send the data in dbgrid to printer....I don't know about the  report may make it a little complex ...
oh well thanks anyway...

Sometimes, the answer isn't as simple as you'd like - but that doesn't make it incorrect.  Looks to me like dirtdart has offered the most trying to help you.  I'd go ahead and award these points to dirtdart.
complex?   It takes 5 lines of code, and the report generates itself!  Not to mention it comes out more presentable!
More presentable than what?  I can make my reports look better than anything Crystal ever thought about.
still, I don't see how 5 lines of code is more complex then 5 api calls.
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.