Kodar sisåhär Hej Hej igen Tyvärr funkar det ej, Du kan använda API anropet DrawText: Hej Sven! Hej Hej Sven Hej Hej Andreas Fördelen med DrawText är just att den radbryter även om det saknas radbrytningar. Hej. Hej Varför inte använda DrawText? Vad är det för fel på den? Den är just till för det här. Hej igen Sven! Hej Andreas! Hej Fredda! Hej Andreas! Hej igen, Andreas. I ditt fall kanske det inte är så nödvändigt med font variabler. UTan det är lämpligt att använda det om man växlar fram och tillbaks mellan samma fonter i dokumentet. Hej Andreas Tack alla ni som bidragit.Printer.print för textsträng
’Beskrivning med
Printer.CurrentY = 30
Printer.CurrentX = 25
Printer.Font.Bold = True
Printer.Font.Size = 12
Printer.Font.Underline = False
Printer.Print frmRegistrera.lblBeskrivning.Caption
Printer.Font.Underline = False
'text
Printer.CurrentY = 32
Printer.CurrentX = 25
Printer.Font.Bold = False
Printer.Font.Size = 10
Printer.Print frmRegistrera.txtBeskrivning.Text
Problem:
txtBeskrivning är en text på 512 tecken och kan ej skrivas ut som en rad. Försvinner ut ur papperssidan, får ej någon radbrytning.
Hur kan jag använda Printer.print för detta? Finns det någon String-variant och hur ser den ut?Sv: Printer.print för textsträng
Textboxen Skall vara MultiLine = True,och texten klart
editerad med radbrytning. Tror att det skall räcka.
/SvenSv: Printer.print för textsträng
Vid närmare eftertanke tror jag att du får göra så här.
Dim txtLine() As String
Dim i As Long
txtLine = Split(txtBeskrivning.Text,vbCrLf)
Printer.CurrentY = 32
Printer.CurrentX = 25
Printer.Font.Bold = False
Printer.Font.Size = 10
For i = 0 To Ubound(txtLine)
Printer.Print txtLine(i)
Printer.CurrentX = 25
Next 'i
'Printer.EndDoc
'/SvenSv: Printer.print för textsträng
Får Run-time error ‘424’:
Object required
Debug markerar raden txtLine= Split(txtBeskrivning.Text, vbCrLf)
Kollade help på ’424’ men blev inte klokare.
Multiline var redan satt i properties så det ska väl inte spöka.
Allt är ”Read-Only” då formuläret bara visar vad som finns för en viss post i en databas.
Har fortfarande huvudbry och tar tacksamt emot tips.Sv: Printer.print för textsträng
Klistra in följande kod i överst i formuläret eller i en modul:
<code>
Private Const DT_LEFT As Long = &H0
Private Const DT_CENTER As Long = &H1
Private Const DT_RIGHT As Long = &H2
Private Const DT_WORDBREAK As Long = &H10
Private Const DT_EXPANDTABS As Long = &H40&
Private Const DT_CALCRECT As Long = &H400&
Private Const DT_EDITCONTROL As Long = &H2000&
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private 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
Private Sub PrintText(Printer As Object, Text As String, Left As Single, Top As Single, Width As Single, Height As Single, Optional Align As AlignmentConstants)
Dim lpRect As RECT
Dim Flags As Long
Flags = DT_WORDBREAK Or DT_EDITCONTROL Or DT_EXPANDTABS
Select Case Align
Case vbCenter
Flags = Flags Or DT_CENTER
Case vbRightJustify
Flags = Flags Or DT_RIGHT
End Select
lpRect.Left = Printer.ScaleX(Left, Printer.ScaleMode, vbPixels)
lpRect.Top = Printer.ScaleY(Top, Printer.ScaleMode, vbPixels)
lpRect.Right = lpRect.Left + Printer.ScaleX(Width, Printer.ScaleMode, vbPixels)
lpRect.Bottom = lpRect.Top + Printer.ScaleX(Height, Printer.ScaleMode, vbPixels)
DrawText Printer.hdc, Text, Len(Text), lpRect, Flags
End Sub
</code>
Om du skall använda olika fonter på mer än ett ställe är det smart att skapa ett font objekt för varje font.
<code>
Dim TextFont As StdFont
Dim CaptionFont As StdFont
Set TextFont = New StdFont
TextFont.Size = 10
Set CaptionFont = New StdFont
CaptionFont.Bold = True
CaptionFont.Size = 12
Printer.CurrentX = 25
Printer.CurrentY = 30
Set Printer.Font = CaptionFont
Printer.Print frmRegistrera.lblBeskrivning.Caption
Set Printer.Font = TextFont
PrintText Printer, frmRegistrera.txtBeskrivning.Text, 25, 32, Printer.ScaleWidth - 32, Printer.ScaleHeight - 25
</code>Sv: Printer.print för textsträng
Jag använder vb 6.0 (alltså inte .net och inte vb 5.0 vilket jag borde ha upplyst om)
Funderade på om något skulle tilläggas i din kod men kom ej på vad.
Jag har inte kodat utskrifter förr så ... då är man grön
Hej Andreas!
Oj vad mycket kod. Jag får studera och begrunda. Som du ser ovan är jag helt novis på utskrifter och lär mig pö om pö.
Det har blivit Printer.Print och PrintForm hittills.
Mer väntar.
Jag får göra en testsida och kolla. Se om jag fattar galoppen. Hör av mig på forumet och rapporterar.
Tack för hjälpen
Finns mer utskriftstips så mottas de också tacksamt. Jag tar dem till mitt hjärta.
Letat lite i Forumet men eftersom jag "ligger ute på modem" så har jag inte kollat allt.
(utifall nån vill skälla för jag frågat nått som står där redan)Sv: Printer.print för textsträng
>Debug markerar raden txtLine = Split(txtBeskrivning.Text, vbCrLf)
Det fungerar på min dator,måste vara något fel på din txtBeskrivning.Text
är namnet rättstavat ? Gör så här som test, lägg in all text du
har i TextBoxen i en sträng och ersätt Split(txtBeskrivning.Text, vbCrLf)
mot Split(Mintxt, vbCrLf). Andreas förslag är overkill till max
Ta det enkla Det Funkar !
mvh
SvenSv: Printer.print för textsträng
och jag hade gjort ett idiotfel, glömt anropa formuläret, Förlåt mig!
Men radbrytning fungerar ej så jag tror det är identifieringen av sidstorlek
eller nåt annat som fallererar. Testat men gått bet.
Programstruktur:
Utskriftsknapp i Formulär anropar dialogruta där val av utskrift sker.
Ok-knapp i dialogruta anropar utskriftsmodul där dessa metoder finns.
(Här förkortad så bara en bit av koden syns, början och aktuell printer.print)
Koden, något rensad och urplockad från ett större sammanhang:
'********************************************************
'Utskrift på en A4-sida, formuläret enligt ”skärmbild”
Public Sub PrintRegForm()
Dim intBtnClicked As Integer
On Error GoTo ErrHandler 'sätter upp en felhanterare
frmRegistrera.PrintForm 'skriver ut formuläret ”rakt av”
Exit Sub
ErrHandler:
intBtnClicked = MsgBox("Skrivarproblem!", _
vbExclamation, "Utskriftsfel ")
End Sub
'******************************************************
'Utskrift på en A4-sida, avläst ur ett formulär
Public Sub PrintRegistrera()
Printer.ScaleMode = vbCharacters 'sätt skala = tecken
Printer.ScaleTop = 5 'topmarginalen 5 tecken
Printer.ScaleLeft = 10 'vänstermarginalen 10 tecken
Printer.Font.Name = "Ariel" 'stilval på text
'Rubrik
Printer.CurrentY = 12 'startposition för utskrift
Printer.CurrentX = 25
Printer.Font.Bold = True 'understruket eller ej
Printer.Font.Size = 14 'teckenstorlek
Printer.Print "Beskrivning." 'rubriktext
'Beskrivning med
Printer.CurrentY = 36
Printer.CurrentX = 25
Printer.Font.Bold = True
Printer.Font.Size = 12
Printer.Font.Underline = False 'fet stil eller ej
Printer.Print frmRegistrera.lblBeskrivning.Caption
'Text
Dim txtLine1() As String 'TextLine1 vald då fler TextLines finns
Dim i As Long
txtLine1 = Split(frmRegistrera.txtBeskrivning.Text, vbCrLf)
Printer.CurrentY = 36
Printer.CurrentX = 45
Printer.Font.Bold = False
Printer.Font.Underline = False
Printer.Font.Size = 10
For i = 0 To UBound(txtLine1)
Printer.Print txtLine1(i)
Printer.CurrentX = 45
Next 'i
'Printer.Print frmRegistrera.txtBeskrivning.Text ' max 255 tecken med text
'Ingen radbrytning sker så texten fallet utanför papperskanten.
Printer.EndDoc
End Sub
'********************************************************************
En annan fråga som berör PrintForm
Kan man styra formulärbildens placering på papperet?
Letat men ej hittat metod för detta.
Hoppas jag förklarat förståbart.
Tack för alla tips!Sv: Printer.print för textsträng
>'Printer.Print frmRegistrera.txtBeskrivning.Text ' max 255 tecken med text
'Ingen radbrytning sker så texten fallet utanför papperskanten.
Då har du inte någon radbrytning i texten (vbCrLf).Testa att
ta en Copy på TextBoxens innehåll och klistra sedan in i tex NotePad.
Hur ser det ut i NotePad ?
Kolla vad MsgBox Ubound(txtLine1) får för värde.
/SvenSv: Printer.print för textsträng
Jag är nyfiken på din API och vill gärna lära mig hur den funkar.
Koden verkar smart och jag har begrundat den samt läst lite om API.
Provat någon enkel demo typ "Beep" tidigare men ingen mer avanserad, tyvärr.
Så anrop och placering av kod ger mig huvudbry.
Åter till din smarta kod:
Jag lägger koden i en egen modul ty jag vill ha det överskådligt.
Fråga: Ska båda kodbitarna in i samma modul? Eller var läggs del 2 ?
Jag skrev in koderna rakt av (bästa metoden läsa och begrunda) men kom sen på att jag måste kunna anropa via en dialogruta och då vart det kortslutning. Beskriver hur jag strukturerat i meddelandet till Sven med samma datum som detta. Så om du kan beskriva hur jag gör så är jag mycket tacksam. Då får jag en inblick i API som ger värme i vinterkylan.
Mycket tacksam om du kan ta dig tid med detta! Kanske även andra till gagn?!Sv: Printer.print för textsträng
Första delen av koden deklarerar konstanter, typen RECT, API funktione och en vbfunktion som kapslar anropet.
Andra koden är din kod. Den som ligger i din dialog. Där skapar jag två font objekt. Mycket enklare att tilldela en font till skrivaren än att ändra fontens alla egenskaper. Helst om man har flera fält. Anropet till PrintText bör skriva ut beskkrivningen. Man anger ett område man vill texten skall vara begränsad till. Jag har angivit paprets bred och apprets höjd minus positionen man skriver ut från.Sv: Printer.print för textsträng
Jag hittade det här i mitt scriptarkiv.
Vet inte om det fungerar eller var det kommer ifrån... Möjligtvis Tips & trix här på Pellesoft...
Dim i As Integer
Dim TextLines As Long
Dim TextBuff As String
Dim CharRet As Long
Printer.CurrentY = 2000
' Get number of lines in text box
TextLines = SendMessage(txtList.hwnd, &HBA, 0, 0)
' Extract & print each line in TextBox
For i = 0 To TextLines - 1
TextBuff = Space(1000)
Printer.CurrentX =3000
' Setup buffer for the line!
Mid(TextBuff, 1, 1) = Chr(79 And &HFF)
Mid(TextBuff, 2, 1) = Chr(79 And &H100)
CharRet = SendMessage(txtList.hwnd, &HC4, i, ByVal TextBuff)
Printer.Print Left(TextBuff, CharRet)
Next i
//freddaSv: Printer.print för textsträng
Just det API SendMessage kan kanske funka
för att vaska fram varje rad i TextBoxen.
/SvenSv: Printer.print för textsträng
Att använda SendMessage för att plocka rader från en textbox är ju inte smart på något sätt. Sv: Printer.print för textsträng
'Printer.Print frmRegistrera.txtBeskrivning.Text ' max 255 tecken med text
detta är bara en sparad kommentar som ej körs, typ "hålla i minnet vad jag vill göra"
ursäkta att jag ej förtydligat eller raderat denna rad
txtLine1 = Split(frmRegistrera.txtBeskrivning.Text, vbCrLf)
är den kod som exekveras och som inte bryter av texten till flera rader
Funderade på om det är för att ingen "högermariginal" finns specificerad och hur den sätts i så fall. Men det var nog ingen bra gissning.
MVHSv: Printer.print för textsträng
Förstod jag rätt så gäller det att placera den andra kodbiten i dialogboxen. Det verkar vettigt. Funderade på om det skulle vara flera moduler och den tanken var inte lockande. Jag ska testa och höra av mig om resultatet.
MVHSv: Printer.print för textsträng
Tack för koden, lovar kolla in den. Kanske inte bra här med jag spar den.
Ska testa den och se vad den kan uträtta.
MVHSv: Printer.print för textsträng
Jag fick annat för mig i ett par dagar men har testat API:n nu.
Radbrytningen fungerar. Jag valde moduler, trots allt, vill ha dialogrutan så ren som möjligt.
Men jag fick ett annat problem. Nämligen att all utskrift börjar på "absoluta nollpunkten" dvs längst upp i vänsterkanten, och skriver över varandra.
Kopierar in koden här. Har ändrat något, t.ex. private till public och ScaleY istället för ScaleX för lpRectBottom. Det hjälpte dock ej.
Koden:
' I Dialog1 finns:
Private Sub cmdOK_Click()
If grpSkrivUt(0).Value = 1 Then
TextAPI.PrintBeskrivning
Dialog1.Hide
ElseIf grpSkrivUt(1).Value = 1 Then
TextAPI.PrintRapport
Dialog1.Hide
Else
MsgBox "Välj en utskrift!"
End If
Dialog1.Hide
End Sub
'**********************************************************************
' I modul TextPrint finns:
' Även testat Public här
Dim prnPrinter As Printer
Private Const DT_LEFT As Long = &H0
Private Const DT_CENTER As Long = &H1
Private Const DT_RIGHT As Long = &H2
Private Const DT_WORDBREAK As Long = &H10
Private Const DT_EXPANDTABS As Long = &H40&
Private Const DT_CALCRECT As Long = &H400&
Private Const DT_EDITCONTROL As Long = &H2000&
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
'deklarerar var API-funktionen finns med Declare
Private 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
Private Sub PrintText(Printer As Object, Text As String, Left As Single, _
Top As Single, Width As Single, Height As Single, Optional Align As AlignmentConstants)
Dim lpRect As RECT
Dim Flags As Long
Flags = DT_WORDBREAK Or DT_EDITCONTROL Or DT_EXPANDTABS
Select Case Align
Case vbCenter
Flags = Flags Or DT_CENTER
Case vbRightJustify
Flags = Flags Or DT_RIGHT
End Select
lpRect.Left = Printer.ScaleX(Left, Printer.ScaleMode, vbPixels)
lpRect.Top = Printer.ScaleY(Top, Printer.ScaleMode, vbPixels)
lpRect.Right = lpRect.Left + Printer.ScaleX(Width, Printer.ScaleMode, vbPixels)
lpRect.Bottom = lpRect.Top + Printer.ScaleY(Height, Printer.ScaleMode, vbPixels)
DrawText Printer.hdc, Text, Len(Text), lpRect, Flags
End Sub
'**********************************************************************
I modul TextAPI finns:
Public Sub PrintBeskrivning()
Dim TextFont1 As StdFont
Dim TextFont2 As StdFont
Dim CaptionFont1 As StdFon
Dim CaptionFont2 As StdFont
Dim CaptionFont3 As StdFont
Set TextFont1= New StdFont
TextFont1.Size = 10
TextFont1.Bold = False
Set TextFont2 = New StdFont
TextFont2.Size = 10
TextFont2.Bold = True
Set CaptionFont1 = New StdFont
CaptionFont1.Bold = True
CaptionFont1.Size = 16
Set CaptionFont2 = New StdFont
CaptionFont2.Bold = True
CaptionFont2.Size = 14
Set CaptionFont3 = New StdFont
CaptionFont3.Bold = True
CaptionFont3.Size = 12
'Rubrik
Printer.CurrentX = 25 'startposition för utskrift
Printer.CurrentY = 8 'startposition för utskrift
Set Printer.Font = CaptionFont1
Printer.Print "Beskrivning" 'rubriktexten
Printer.CurrentX = 25
Printer.CurrentY = 11
Set Printer.Font = CaptionFont2
Printer.Print "Rapport"
'Beskrivning med
Printer.CurrentX = 25
Printer.CurrentY = 34
Set Printer.Font = CaptionFont3
Printer.Print frmRapport.lblBeskrivning.Caption
'Text
Set PrinterFont = TextFont2
TextPrint.PrintText Printer, frmRapport.cboBeskrivning.Text, 25, 38, Printer.ScaleWidth - 38, Printer.ScaleHeight - 25
Printer.EndDoc
End Sub
'*** Valalternativ 2 i Dialogruta1, TextAPI.PrintRapport ***
' ()
Public Sub PrintRapport()
Dim intBtnClicked As Integer
On Error GoTo ErrHandler 'sätter upp en felhanterare
frmRapport.PrintForm 'skriver ut formuläret
Exit Sub
ErrHandler:
intBtnClicked = MsgBox("Skrivarproblem!", vbExclamation, "Utskriftsfel ")
Vad fattas/ska ändras och var?
Tacksam för svar. Sv: Printer.print för textsträng
Tidigt morgon tydligen, jag kollade koden igen och
kom på att testa lägga in följande kod i TextAPI
Printer.ScaleMode = vbCharacters 'skala = tecken
Printer.ScaleTop = 5 'topmarginalen 10 tecken
Printer.ScaleLeft = 10 'vänstermarginalen 20 tecken
och då funkar det.
Om det inte är något du reagerar på i min kod så tror jag problemet är löst.
MVH och Mycken TACK!!!!!Sv: Printer.print för textsträng
Sv: Printer.print för textsträng
Använder 3 captions och 2 text (fet och vanlig) i detta fall och klart blir det en fullskriven A4-sida. Så jag kommer att växla en del i storlek och typ.
Har trubbel med placeringar av text och stilstorlek så jag undrar:
Finns det Defaultvärden i API som jag missat?
Så jag ska använda viss typ, vbCharacter fungerar ej så bra om jag villgöra
2 kolumner, typ:
Rubrik2
Rubrik3: Textstart
Textforts
TextSlut
Ny Rubrik3: En rad med text
Ska jag ange namn på textstil, t.ex. Ariel?
Testade men det ville sig inte.
Vad bör jag använda, vbCharacters, vbMillimerters, vbTwips osv ?
Gissar de fungerar olika bra i API:n
Tillägg:
Hittade att en punkt fallit bort så jag fick textstorlek att funka. /Printer.Font/
Men är lite konfys över att jag måste skriva in dessa angivelser för x och y
i PrintText-raden, de ska fortfarande korrigeras något, komlumnerna ej helt i horisontallinje, men sifferdifferansen syns.
'Beskrivning med
Printer.CurrentX = 25
Printer.CurrentY = 35
Set Printer.Font = CaptionFont3
Printer.Print frmRapport.lblBeskrivning.Caption
'Text
Set Printer.Font = TextFont1
TextPrint.PrintText Printer, frmRapport.cboBeskrivning.Text, 40, 30, _
Printer.ScaleWidth - 44, Printer.ScaleHeight - 45
'text, left, top, width, hight
MVHSv: Printer.print för textsträng
Det verkar funka bra med API-varianten för min del.
Kankse kan andra ha nytta av mina dumma frågor
och era geniala koder. Jag har lärt mig en del.
Tack för det och God Fortsättning på det nya åter.