/ Forside / Teknologi / Udvikling / VB/Basic / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
VB/Basic
#NavnPoint
berpox 2425
pete 1435
CADmageren 1251
gibson 1230
Phylock 887
gandalf 836
AntonV 790
strarup 750
Benjamin... 700
10  tom.kise 610
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
>



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408917
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste