|
I don't use a PrintDocument control either. Just the printer.
Here's a complete sub we currently use
Public Sub PrintMaintenanceRenewalLetters( _
rsIn As ADodb.Recordset, _
PayDOSCustomersIn() As String, _
DoingReminderIn As Boolean, _
Optional StartFromIn As Integer = 1, _
Optional Recs2Print As Integer = 9999, _
Optional CustNumberIn As String = "-X")
Dim CustNoHold As String
Dim LastLine As Single
Dim iCtr As Integer
Dim StateTablesBought As Integer
Dim CDAdder As Currency
Dim ExtPrice As Currency
Dim ExtFreight As Currency
Dim SalesTax As Currency
Dim QtyBought As Long
Dim BkMark As Variant
' Const FED_PART_NO As String = "87FEDST-03"
' Const FED_DESCRIPTION As String = "Tax Table Service Fed + 1 State"
' Const FED_PRICE As Currency = 45#
' Const OLD_FED_PART_NO As String = "87003-04"
Const FREIGHT_CHARGE As Currency = 3.95
LastLine = Printer.Height - 1440
Dim Ctr As Integer
Ctr = 0
CustNoHold = ""
If StartFromIn > 1 Then
Do
If Trim(rsIn![Customer_Number]) <> CustNoHold Then
CustNoHold = Trim(rsIn!Customer_Number)
Ctr = Ctr + 1
End If
rsIn.MoveNext
Loop Until Ctr = StartFromIn
rsIn.MoveNext
CustNoHold = ""
ElseIf CustNumberIn <> "-X" Then
Do
If Not rsIn.EOF Then
rsIn.MoveNext
If rsIn.EOF Then Exit Do
End If
Loop Until (Trim(rsIn![Customer_Number]) = CustNumberIn) Or rsIn.EOF
If rsIn.EOF Then
MsgBox "Customer Number " & CustNumberIn & " not found!", vbCritical + vbOKOnly, "Error"
Exit Sub
End If
CustNoHold = ""
End If
Do
Do
If Trim(rsIn![Customer_Number]) <> CustNoHold Then
If CustNoHold <> "" Then
' Print the CD adder
Printer.FontBold = True
Printer.ForeColor = vbRed
Printer.Print
Printer.CurrentX = DESCRIPTION_LEFT
Printer.Print "____";
Printer.CurrentX = DESCRIPTION_LEFT + 450
Printer.Print "Please send my services on a CD"
Printer.CurrentX = DESCRIPTION_LEFT + 450
Printer.Print "instead of by e-mail."
Printer.CurrentX = DESCRIPTION_LEFT + 450
Printer.Print "I am adding " & Format(CDAdder, "currency") & " to the Total Price."
Printer.ForeColor = vbBlack
' Print the totals
m_TotalFreight = 0
Printer.CurrentY = m_Line1Y
Printer.CurrentX = RightJustify(Format(m_TotalPrice, "currency"), Printer, 10000)
Printer.Print Format(m_TotalPrice, "currency")
If InStr(CustomerLabel.CityStZip, " AZ ") Then
SalesTax = RoundPerIRS(CCur(m_TotalPrice * SALES_TAX_RATE))
Printer.CurrentY = m_Line2Y
Printer.CurrentX = RightJustify(Format(SalesTax, "currency"), Printer, 10000)
Printer.Print Format(SalesTax, "currency")
End If
' Printer.CurrentY = m_Line3Y
' Printer.CurrentX = RightJustify(Format(m_TotalFreight, "currency"), Printer, 10000)
' Printer.Print Format(m_TotalFreight, "currency")
'
Printer.CurrentY = m_Line4Y
Printer.CurrentX = RightJustify(Format(m_TotalPrice + SalesTax + m_TotalFreight, "currency"), Printer, 10000)
Printer.Print Format(m_TotalPrice + SalesTax + m_TotalFreight, "currency")
Printer.FontBold = False
If CustNoHold = CustNumberIn Then
Printer.EndDoc
rsIn.Close
Exit Sub
Else
Printer.NewPage
End If
End If
If LoadCustomerLabel(rsIn!Customer_Number) Then
m_TotalPrice = 0
CDAdder = 0
SalesTax = 0
m_TotalFreight = 0
StateTablesBought = 0
' Print either the IS or PAYROLL order
If DoingReminderIn Then
PrintRenewalReminderOrderForm
Else
PrintRenewalOrderForm
End If
m_Line5Y = 10100
CustNoHold = Trim(rsIn!Customer_Number)
Printer.FontSize = 9
Printer.Font = "Arial"
Printer.CurrentX = LETTER_LEFT_MARGIN
Printer.CurrentY = 5.525 * 1440
Printer.Print CustomerLabel.Name
Printer.CurrentX = LETTER_LEFT_MARGIN
Printer.Print CustomerLabel.Company
Printer.CurrentX = LETTER_LEFT_MARGIN
Printer.Print CustomerLabel.Address; " "; CustomerLabel.Suite
Printer.CurrentX = LETTER_LEFT_MARGIN
Printer.Print CustomerLabel.CityStZip
Printer.CurrentX = LETTER_LEFT_MARGIN
Printer.Print CustomerLabel.Phone
Printer.ForeColor = vbRed
Printer.FontSize = 10
Printer.Font = "Arial"
Printer.CurrentX = LETTER_LEFT_MARGIN
If InStr(CustomerLabel.eMail, ";") Then
Printer.Print Left(CustomerLabel.eMail, InStr(CustomerLabel.eMail, ";") - 1)
Else
Printer.Print CustomerLabel.eMail
End If
Printer.ForeColor = vbBlack
Printer.CurrentY = m_Line5Y
End If
End If
Printer.FontSize = 8
Printer.CurrentX = QTY_LEFT
QtyBought = CLng(rsIn![Qty])
If IsNull(rsIn![Description]) Then
GoTo BadRecord
' MsgBox "Bad record. Item Number " & rsIn!Item_Number & " has no description. Aborting", vbCritical + vbOKOnly
' Printer.EndDoc
' rsIn.Close
' Exit Sub
Else
Printer.Print QtyBought;
Printer.CurrentX = ITEM_NUMBER_LEFT
Printer.Print rsIn!Item_Number;
Printer.CurrentX = DESCRIPTION_LEFT
If Printer.TextWidth(Trim(rsIn![Description])) > 3600 Then
Printer.Print Left(rsIn![Description], 40) & ". . .";
Else
Printer.Print rsIn![Description];
End If
Printer.CurrentX = RightJustify(Format(rsIn![Retail], "currency"), Printer, m_lRgtOfList)
Printer.Print Format(rsIn![Retail], "currency");
ExtPrice = QtyBought * rsIn![Retail]
CDAdder = CDAdder + (QtyBought * CD_FEE)
' ExtFreight = QtyBought * FREIGHT_CHARGE
Printer.CurrentX = RightJustify(Format(ExtPrice, "currency"), Printer, m_lRgtOfDiscount)
Printer.Print Format(ExtPrice, "currency");
' Printer.CurrentX = RightJustify(Format(ExtFreight, "currency"), Printer, m_lRgtOfNet)
Printer.Print 'Format(ExtFreight, "currency")
m_TotalPrice = m_TotalPrice + ExtPrice
' m_TotalFreight = m_TotalFreight + ExtFreight
End If
BadRecord:
rsIn.MoveNext
Loop Until (Printer.CurrentY >= LastLine) Or rsIn.EOF Or g_lTotalRecordsPrinted = Recs2Print
If Not rsIn.EOF Then
Printer.NewPage
Else
m_TotalFreight = 0
' Print the totals
Printer.CurrentY = LastLine - 720
Printer.CurrentX = DESCRIPTION_LEFT
Printer.Print "____";
Printer.CurrentX = DESCRIPTION_LEFT + 450
Printer.Print "Please send my services on a CD instead of by e-mail."
Printer.CurrentX = DESCRIPTION_LEFT + 450
Printer.Print "I am adding " & Format(CDAdder, "currency") & " to the Total Price."
Printer.FontBold = True
Printer.CurrentY = m_Line1Y
Printer.CurrentX = RightJustify(Format(m_TotalPrice, "currency"), Printer, 10000)
Printer.Print Format(m_TotalPrice, "currency")
If InStr(CustomerLabel.CityStZip, " AZ ") Then
SalesTax = RoundPerIRS(CCur(m_TotalPrice * SALES_TAX_RATE))
Printer.CurrentY = m_Line2Y
Printer.CurrentX = RightJustify(Format(SalesTax, "currency"), Printer, 10000)
Printer.Print Format(SalesTax, "currency")
End If
' Printer.CurrentY = m_Line3Y
' Printer.CurrentX = RightJustify(Format(m_TotalFreight, "currency"), Printer, 10000)
' Printer.Print Format(m_TotalFreight, "currency")
Printer.CurrentY = m_Line4Y
Printer.CurrentX = RightJustify(Format(m_TotalPrice + SalesTax + m_TotalFreight, "currency"), Printer, 10000)
Printer.Print Format(m_TotalPrice + SalesTax + m_TotalFreight, "currency")
Printer.FontBold = False
End If
DoEvents
Loop Until rsIn.EOF Or (g_lTotalRecordsPrinted >= Recs2Print)
Printer.EndDoc
rsIn.Close
Note it doesn't use stdfont because I didn't need to change the fonts. In those cases, the printer properties work well.
Murray (not Ben)
|
|
|
|
|
I'm sorry about that Ben thing.
Murray, thanks much for this. I'm getting ready to try it in a few minutes. I have a feeling that VS 2010 does not like the printer. commands. I tried that before and got an error message. I think I may have to add the printDocument control. But I'll find out in just a few minutes. I'm going to take a form, add a button, and put your code into the button's click event. I'll comment out lines of code concering the recordset. If that doesn't work I may try the code in a subroutine inside of a module that I call. Anyway, I'm going to mess around with it and I'll let you know of progress, or lack thereof. Thank you Murray. Jack
|
|
|
|
|
Murray, I put a form in my project, added a button, and put the following code behind it's click event.
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Printer.FontBold = True
printer.print("Hello World")
Printer.Print()
End Sub
End Class
It doesn't like the printer statements. It says it's undeclared. I must need a reference, an imports statement, or a declaration of some sort. Any ideas? jack
|
|
|
|
|
As I hope I mentioned I am a VB6 expert who has assiduously avoided the .NET realm so far. (I manage 435,000 lines of code that I do not want to convert). Although that will have to change.
I would have to assume that the printer object (if available) is defined in the System namespace.
Did you try
system.printer.print "Hello World"
If that doesn't work then I'm sorry but I'm out of ideas.
|
|
|
|
|
Thanks Murray. Unfortunately it did not work. It said printer was not a member of system. It's too bad it doesn't work as what you explained to me was something that I could understood and could work with. It is so simple; you want to print something you say 'print something'. Why they had to go and make things so much more complicated; I dunno.
435,000 lines of code; wow! I would not want your job. Good luck on it and when conversion time comes; good luck on that.
Thanks for your help Murray. I'm going to keep working on this and if I learn anything interesting I'll let you know. Jack
|
|
|
|
|
Any time, Jack.
You know there is another version of Basic that is procedural and hence much easier to use. It does have statements as easy as print something. I used it to produce 4 commercial products for 10 years.
It is called PowerBasic. www.powerbasic.com
I only stopped using it when I was forced to remake our products for Windows. It didn't have any GUI support at all in the beginning although it does now.
It also has a huge user community with tons of free code.
Happy Memorial Day.
Murray
|
|
|
|
|
Murray, thanks for this info and I'll definitely check it out.
I found a free e-book, see link below, on printing in VB 2010. I've read thru it and grabbed some code snippets and I think I'm going to be able to make it work for me.
Sometime when you're feeling really masochistic you should check it out. Microsoft makes things much harder than they need to be. For example:
Instead of print "sometext" it is e.graphics.drawstring("sometext")
I really don't care what it is just as long as I know what it is and I can use it. And, I have tried the e.graphics.d... and it works. MS is using VB graphics for printing. Okay, I guess I can get accustomed to that.
So, I'll stumble along this way and I'll also check out PowerTools. This is good to know. Thanks. Jack
http://www.filemount.com/2011/01/printing-with-visual-basic-2010/
|
|
|
|
|
Hi Jack,
Thanks for the link to the ebook.
Actually the process is pretty much as I described for VB 6, just with a lot more typing.
(When I was in school we used to say that COBOL was a horrible language to code in because of all the keyboarding involved. COBOL is a walk in the park compared to VB 10, even with intellisense.)
My products do payroll everywhere there is a US payroll and other government forms so you can just imagine the amount of reports we have to print.
The page you sent did have links to a couple of books you might find helpful.
Murray
|
|
|
|
|
Hi Murray,
I'm beginning to like this printing capability. I'm not very good at it yet but I do see the potential for good reports. It takes a lot of code and but most of it is understandable. Crystal Reports is an attempt to greatly simplify things. And although this sounds crazy they've made it so damn simple I can't understand it. I just have so much trouble with CR. With this language you can use simple VB constructs like 'if then else' and in CR they do have 'if then else' but it's really different. I would rather spend 3 days working on one report than even 10 minutes with CR. I know that after spending 3 days with VB I would have something; 3 days with CR and all I would end up with is a huge headache.
Someday I'm afraid you're gonna have to upgrade from VB 6. I hope not though. No one would want to do all the conversion work on your codebase. Here's a business opportunity. Write a program to do just the report conversions. I say 'just' as if this would be trivial; it certainly would not be. But, if you, or one of your co-workers could do it it would be worth something. Maybe it's already been done; I don't know.
That's fabulous that your products do work for the government. That is HUGE!! If a company could have only one customer that is the one they should want; the US Govt. This is very impressive.
I'm a retired Fed. I was a software developer there for 30 years. I worked on administrative systems to include accounting systems. I had co-workers that worked on payroll although I never did. I know some of the complexities though and I know there are many.
Keep the faith Murray. I'm gonna get back to work on these reports. In this methodology one has to line breaks, page breaks, etc. I like detail work though so I'm a happy camper.
Thanks Murray and happy Wed. to you. jack
|
|
|
|
|
Hi Jack,
You're so right about the detail work that it is capable of. I looked @ it some more and it is really nothing more than an extremely complicated version of what I use in VB 6. The abilities for placements, fonts, kerning, leading and so on are excellent. They do require attention to detail but, what non-trivial programming doesn't? Attention to detail is what separates the hacks from the professionals.
What language did you code in?
Murray
|
|
|
|
|
Murray, I did some COBOL back in the day but the last 16 years of my career were spent with a product I'll bet you've never heard of. Not many have. It's Model 204. It has been around for 40 years and it is so powerful. It's a DBMS with it's own proprietary language. It's for mainframe IBM computers (if they still exist) with very large databases. It really hums. Here's a link. Spend a minute or so checking it out.
http://sirius-software.com/m204.html[^]
|
|
|
|
|
You're right - I've never heard of it. I used COBOL and FORTRAN on IBM mainframes. Then again I've never worked on government-scale databases.
No wonder my friends who code for the IRS moan when Congress enacts a payroll change and gives us 30 days to implement it.
I must assume that mainframes still exist although I saw a Cray supercomputer in a box about the size of a PC only twice as wide. Microsoft was offering it as a prize.
Murray
|
|
|
|
|
It's been long years since I've even heard of a Cray computer. I wonder if they still exist. At one time they were considered top of the line. And yes, you could probably put in a box of Cracker Jacks now. It would fit. Happy Thur Murray. jack
|
|
|
|
|
my code already can send sms but when i want to send more than 160 character it will not work..some one help me plss..
below is my code:
Sub SendSMS()
If Modem.IsOpen = False Then
MsgBox("Port not Open!!")
Exit Sub
End If
If Me.TxtTo.Text = "" Then
MsgBox("No recepient number!!")
Exit Sub
End If
If Me.TxtSMS.Text = "" Then
MsgBox("Blank text message are not allowed!!")
Exit Sub
End If
sendbutton.Enabled = False
Sending = True
SendAttempt = 0
Do
ATSend("AT+CMGF=1")
Result = ATRead(1000)
Loop While Result.Contains("COMMAND NOT SUPPORT")
Do
ATSend("AT+CSMP=17,167,0,0")
Result = ATRead(1000)
Loop While Result.Contains("COMMAND NOT SUPPORT")
Do
Do
ATSend("AT+CMGS=""" & TxtTo.Text & """")
Result = ATRead(1000)
Loop While Result.Contains("COMMAND NOT SUPPORT")
ATSend(TxtSMS.Text & Char.ConvertFromUtf32(26) & vbCr)
Result = ATRead(10000)
SendAttempt += 1
Loop While Result.Contains("COMMAND NOT SUPPORT") Or (Result.Contains("ERROR") And SendAttempt < 5)
If Result.EndsWith(vbCrLf & "OK" & vbCrLf) Then
TxtSMS.Text = ""
TxtTo.Text = ""
Else
End If
sendbutton.Enabled = True
Sending = False
End Sub
|
|
|
|
|
SMS has a 160 character limit. You cannot change that as it's built into the SMS standard specification.
Read up on MMS (Multiple Message Service) insead.
|
|
|
|
|
how i can use MMS to send SMS?? 
|
|
|
|
|
I've already told you what to do. Just do it.
|
|
|
|
|
i already google it but i dont understand..im newbie in visual basic..sorry for that..
|
|
|
|
|
do you have sending and recieving sms sysytem?? in vb.net
|
|
|
|
|
I have a Picture Box where I use GDI+ to draw lines, circles, etc on. What I have noticed recently is that my other GUI components such as buttons, option boxes, labels, etc. on the same form are not displaying correctly. What I mean by that is they are all black until I click on them or resize the form then it will display properly. However, if I minimize the form then restore the form the GUI components will turn black again.
I did some googling and found out that there seems to be problem with a threading issue. I pin pointed it to my picture box paint event handler. If I comment out the entire event everything displays properly minus what I need to paint in my picture box.
My thinking was maybe I should do some multi-threading so I can get the best of both worlds objects painted in the picture box and my GUI components displaying properly on initial form load.
The first piece of code is my original code with the black showing components. I have tried to use threading in hopes that this will remedy my situation. Because of my limited (near 0) knowledge of threading this may not be the best piece of code. What I get in the threading code is the error picture for my picture box (large red "x" on white background).
Private Sub Picture1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Picture1.Paint
myGraphicObject = e.Graphics
myGraphicObject.Clear(Picture1.BackColor)
Draw_GDI_Related_Things_Function()
End Sub
Private Sub Picture1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Picture1.Paint
System.Threading.Monitor.Enter(myGraphicObject)
myGraphicObject= e.Graphics
myGraphicObject.Clear(Picture1.BackColor)
m_threadDraw = New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf Draw_GDI_Related_Things_Function))
m_threadDraw.Start()
System.Threading.Monitor.Exit(myGraphicObject)
End Sub
Keep in mind that the above code is a before and after.
Can someone help me to understand what I am doing wrong?
Thanks.
|
|
|
|
|
Threading is not your solution to black controls.
You cannot touch any property or method of a control from anything other than the UI thread (the thread that created the control instance.) Doing so will only cause bugs that are very difficult to find.
The reason you get the red X is because your drawing code isn't finished yet but the Paint handler already returned control back to the event originator, which is trying to copy the control image to the screen, which you haven't finished drawing yet.
Remove the threading code. You don't need it at all.
|
|
|
|
|
Yeah Dave, I figured that was the cause and I went ahead and removed it. That was my initial suspicion as well, but I just wanted someone more knowledgeable than myself to confirm it.
I know this is a tiny bit unrelated, but what my new suspicion is that my data grid view might be the cause of this painting annoyance. I emphasis might because once again I could use your advice.
In my data grid view I have added combo boxes to one column and now I receive this error every time per number of rows I have when I resize the form.
See code below.
Private Sub frmEdit_System_Revised_Resize(sender As Object, e As System.EventArgs) Handles Me.Resize
Me.DataGridViewObj.Width = Me.Width / 2
Me.DataGridViewObj.Top = Me.ComboBoxObj.Top + Me.ComboBoxObj.Height
Me.DataGridViewObj.Height = (Me.MyPictureBox.Top) - (Me.ComboBoxObj.Top + Me.ComboBoxObj.Height)
End Sub
Maybe it's the way I insert data into the combo box inside my datagridview, but I receive this error continiously "datagridviewcomboboxcell value is not valid". I tried Googling this, but the typical reponses are to just suppress this error.
Maybe you can see what I am doing wrong. I would appreciate another set of eyes looking at this and pointing out what the problem is. Or maybe you can refer to me some literature that I can read on how to properly set data to a combobox column.
Inside my insert data sub routine...
Dim objRowData(NumOfColToFill) As Object
Dim newButton As New DataGridViewButtonCell()
Dim newComboBox As New DataGridViewComboBoxCell()
Dim newRowToAdd As New DataGridViewRow()
newRowToAdd.SetValues(objRowData)
Me.DataGridViewObj.Rows.Add(newRowToAdd)
newComboBox.Items.Add("Data")
newComboBox.Items.Add("Data1")
newComboBox.Items.Add("Data2")
newComboBox.Items.Add("Data3")
Me.DataGridViewObj.Rows.Item(m_intRowCounter).Cells.Item(5) = newComboBox
Me.DataGridViewObj.Rows.Item(m_intRowCounter).Cells.Item(5).Value = "Data"
Me.DataGridViewObj.Rows.Item(m_intRowCounter).Cells.Item(0) = newButton
Me.DataGridViewObj.Rows.Item(m_intRowCounter).Cells.Item(0).Value = "Data"
Thanks! 
|
|
|
|
|
I have no idea what your form looks like, but you could just use a TableLayoutPanel, properly configured of course, and put your DGV and Combo in adjacent rows. If setup correctly, you can eliminate the Resize code entirely.
The only time I've seen the "DataGridViewComboBox cell value is not valid" is when the value in the combo is not valid for the bound field. You could ignore it, but keep in mind that the error you're seeing is an exception and exceptions are VERY expensive to throw. Your code performance will suffer because of it.
|
|
|
|
|
Thanks for that advice. I will look into a Table Layout Panel and see if that will work out. 
|
|
|
|
|
Also, why are you adding a combobox to the DGV when there's a combobox column available??
It seems you're using the DGV as a kind of storage for your data instead of binding the DGV to a DataTable object and storing the data in there.
|
|
|
|
|