|
| Textbox Fra : Dan |
Dato : 02-04-04 16:49 |
|
Jeg har stadig problemer med denne textbox:(((
En venlig sjæl her fra gruppen har hjulpet en del, men det virker ikke som
jeg gerne vil have det til.
Problemet er, at når jeg skriver i en textbox med multiline så skal jeg
trykke enter ved enden af textboxen, for at den bliver printet ud i flere
linjer, hvis jeg ikke gør det, kommer der bare en lang linje. Den skulle
gerne selv kunne finde ud af at der er skiftet linje
Så hvis der er en der har et projekt med ovenstående er jeg den glade
modtager.
MVH
Dan
Jeg bruger følgende kode til udskrivning:
Dim Tekst As String, PTekst As String
Dim Cx As Integer, Cy As Integer, a As Integer
Printer.ScaleMode = 6
Printer.FontBold = False
Printer.FontName = "courier"
Printer.FontSize = 10
Tekst = Text1.Text
Cx = 90
Cy = 51
Do While InStr(1, Tekst, Chr$(13), 0) > 0
a = InStr(1, Tekst, Chr$(13), 0)
PTekst = Left(Tekst, a - 1)
Tekst = Right(Tekst, Len(Tekst) - a - 1)
Printer.CurrentX = Cx
Printer.CurrentY = Cy
Printer.Print PTekst
Cy = Cy + 4: ' dette er millimeter imellem linier
Loop
' checker om du har curseren pÅ den tomme linie eller efter sidste tekst
If Tekst <> "" Then
Printer.CurrentX = Cx
Printer.CurrentY = Cy
Printer.Print Tekst
End If
| |
Tomas Christiansen (02-04-2004)
| Kommentar Fra : Tomas Christiansen |
Dato : 02-04-04 22:25 |
|
Dan skrev:
> Problemet er, at når jeg skriver i en textbox med multiline så skal jeg
> trykke enter ved enden af textboxen, for at den bliver printet ud i flere
> linjer, hvis jeg ikke gør det, kommer der bare en lang linje. Den skulle
> gerne selv kunne finde ud af at der er skiftet linje
Du har jo metoden TextWidth, som fortæller hvor bred en given tekst er.
Hvis du bruger denne metode fornuftigt (findes både på Form objektet og
Printer objektet), kan finde ud af præcis hvilken del af teksten som fylder
din Textbox helt ud.
En gangbar metode kan være at bestemme indholdet af den næste logiske linie,
dvs. indtil der mødes et linieslut tegn, og gem den i en variabel.
Hvis Form.TextWidth(variabel) <= TextBox.ScaleWidth så print indholdet af
variablen og find næste logiske linie.
Er den logiske linie derimod for lang, halveres den (sidste halvdel fjernes)
og der checkes om linien nu er for lang.
Er den stadig for lang, fjernes igen sidste halvdel. Er den ikke for lang,
forsøges med at tilføje halvdelen af det fjernede for at se om den stadig er
for lang.
Du har brug for en variabel til at huske længden på den streng som bliver
fjernet/tilføjet i hver gennemløb, og denne længde skal halveres hver gang.
Når denne værdi kommer ned på 1 eller 0, har du fundet den længste streng,
som netop kan være i TextBox'en.
Den sidste del af linien (den som ikke blev printet) køres gennem møllen
igen (den kan jo i princippet også fylde flere fysiske linier), indtil der
ikke er mere tilbage af den logiske linie, hvorefter en ny logisk linie
findes frem.
Det lyder kompliceret, men kan formentlig klares med ganske få linier
rekursiv kode.
-------
Tomas
| |
Dan (04-04-2004)
| Kommentar Fra : Dan |
Dato : 04-04-04 10:50 |
|
Jeg har fundet følgende kode der virker som jeg ønsker. Der er bare det
problem med at den printer det i øverste venstre hjørne. Jeg kan ikke få den
til at printe fx. 70 inde og 90 nede på papiret de gange den gør det er det
kun den første linje der er flyttet ind:((
Er der en der har lidt kode? Eller kan tilrette denne
MVH
Dan
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''
Option Explicit
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long
Private Const EM_GETLINE = &HC4
Private Const EM_GETLINECOUNT = &HBA
Private Const EM_LINELENGTH = &HC1
Private Sub Command1_Click()
Printer.ScaleMode = 6
Printer.FontSize = 16
PrintMultiLineTextBox txttitle
End Sub
Private Sub PrintMultiLineTextBox(ByRef txtBox As TextBox)
Dim intLastLine As Integer
Dim intLength As Integer
Dim strTemp As String
Dim intIndex As Integer
Dim strPrint As String
intLastLine = SendMessage(txtBox.hwnd, EM_GETLINECOUNT, 0, 0) - 1
If intLastLine > 0 Then
For intIndex = 0 To intLastLine Step 1
intLength = SendMessage(txtBox.hwnd, EM_LINELENGTH, intIndex + 1, 0)
strTemp = Space$(intLength)
SendMessage txtBox.hwnd, EM_GETLINE, intIndex, ByVal strTemp
strPrint = strPrint & strTemp & vbCrLf
Next intIndex
strPrint = Left$(strPrint, Len(strPrint) - 2)
Else
strPrint = txtBox.Text
End If
Printer.Print strPrint
Printer.EndDoc
End Sub
| |
Tomas Christiansen (04-04-2004)
| Kommentar Fra : Tomas Christiansen |
Dato : 04-04-04 22:59 |
|
Dan skrev:
> Jeg kan ikke få den til at printe fx. 70 inde og 90 nede på
> papiret de gange den gør det er det kun den første linje
> der er flyttet ind:((
Hmm. Har du slet ikke læst koden igennem og checket hvad den gør?
En løkke køres igennem, hvor alle de linier som skal udskrives, opsamles i
variablen strPrint.
Som jeg ser det, er der basalt set to løsninger: Enten behandler du linierne
i strPrint én for en og sørger for at de bliver indrykket, eller også
skriver du linierne ud, når de er fundet, istedet for at opsamle dem i
strPrint.
> Dim strPrint As String
> For intIndex = 0 To intLastLine Step 1
> intLength = SendMessage(txtBox.hwnd, EM_LINELENGTH, intIndex + 1, 0)
> strTemp = Space$(intLength)
> SendMessage txtBox.hwnd, EM_GETLINE, intIndex, ByVal strTemp
> strPrint = strPrint & strTemp & vbCrLf
> Next intIndex
Altså fjern linien
Dim strPrint As String
og indsæt en linie i toppen
Printer.CurrentY = 90
og erstat linien
strPrint = strPrint & strTemp & vbCrLf
med
Printer.CurrentX = 70
Printer.Print strTemp & vbCrLf
Du må selv fjerne de linier som ikke er valide, når variablen strPrint ikke
længere eksisterer.
-------
Tomas
| |
Dan (06-04-2004)
| Kommentar Fra : Dan |
Dato : 06-04-04 12:09 |
|
Du kan tro jeg har læst koden igennem, men med to måneder på bagen som
programør er det ikke det hele der er lige let at forstå. Så det er bare
super, at der er nogle der gider at bruge tid på at hjælpe. Jeg har fået det
rettet til med linjeafstand ovs.
Takker for hjælpen
MVH
Dan
"Tomas Christiansen" <toc-01-nospam@blikroer.dk> skrev i en meddelelse
news:c4q0aa$2tmd$1@news.cybercity.dk...
> Dan skrev:
> > Jeg kan ikke få den til at printe fx. 70 inde og 90 nede på
> > papiret de gange den gør det er det kun den første linje
> > der er flyttet ind:((
>
> Hmm. Har du slet ikke læst koden igennem og checket hvad den gør?
> En løkke køres igennem, hvor alle de linier som skal udskrives, opsamles i
> variablen strPrint.
> Som jeg ser det, er der basalt set to løsninger: Enten behandler du
linierne
> i strPrint én for en og sørger for at de bliver indrykket, eller også
> skriver du linierne ud, når de er fundet, istedet for at opsamle dem i
> strPrint.
>
> > Dim strPrint As String
> > For intIndex = 0 To intLastLine Step 1
> > intLength = SendMessage(txtBox.hwnd, EM_LINELENGTH, intIndex + 1,
0)
> > strTemp = Space$(intLength)
> > SendMessage txtBox.hwnd, EM_GETLINE, intIndex, ByVal strTemp
> > strPrint = strPrint & strTemp & vbCrLf
> > Next intIndex
>
> Altså fjern linien
> Dim strPrint As String
> og indsæt en linie i toppen
> Printer.CurrentY = 90
> og erstat linien
> strPrint = strPrint & strTemp & vbCrLf
> med
> Printer.CurrentX = 70
> Printer.Print strTemp & vbCrLf
>
> Du må selv fjerne de linier som ikke er valide, når variablen strPrint
ikke
> længere eksisterer.
>
> -------
> Tomas
>
| |
|
|