Jag vill tvinga rydbrytning i en text när den överstiger 56 tecken, den ska alltså bryta ordet rakt av. På den första raden ska dock "___Specialnoteringar : " finnas. Den nuvarande koden tar inte hänsyn till texten som ska stå på den första raden, och sen så bryter den inte av ordet tvärt. Här kommer ett förslag till lösning. För att testa koden gör följande. Det där fungerade nästan helt rätt, texten bryts dock vid tecken 57, den ska brytas precis vid tecken 80. > Jag vill tvinga rydbrytning i en text när den överstiger 56 tecken, Nu funkar det fint, förutom en sak. Det går tyvärr inte att ha några stycken. Det jobbet blir ditt att lösa. Du kan få några tips här av mig. Jag förstår inte alls vad du menar, det gjorde mig bara mer förvirrad. Jag har aldrig pysslat med något liknande förut. Skulle <b>verkligen</b> uppskatta en färdig lösning, trots att jag hatar att be folk om hela lösningar :/. Det bästa sättet att lära sig på är att lösa problemen själv ;) Men jag känner mig snäll idag. Tack så jättemycket!Tvinga radbrytning
Exempel:
<code>
___Specialnoteringar : Nu skriver jag bara lite så att ni ska se hur jag vill a
tt det ska se ut.
</code>
(EDIT: Exemplet ovan ser inte ut som det bör. "tt" ska börja precis ovanför "Nu")
Nedanstående kod är något omgjord från den slutliga koden som Håkan Borneland postade i [Tvinga radbrytning i fil]. Dock så är jag tvungen att lägga den under "___Specialnoteringar : " för den gör så att det överstiger 56 tecken totalt.
Hoppas ni förstår vad jag vill få fram, om inte så kan jag försöka förklara bättre.
strText = txtNotes.Text
If Len(strText) > 0 Then
iRows = Len(strText) \ 61
If iRows = 0 Then
Print #1, " " & strText
Else
For iCounter = iRows To 0 Step -1
If Mid$(strText, 56, 1) = " " Then
Print #1, " " & Left$(strText, 54)
strText = Mid$(strText, 57)
Else
iStop = InStrRev(strText, " ", 56)
If iStop = 0 Then
Print #1, " " & strText
Else
Print #1, " " & Left$(strText, iStop - 1)
strText = Mid$(strText, iStop + 1)
End If
End If
Next iCounter
End If
End If
Sv:Tvinga radbrytning
Sv: Tvinga radbrytning
1. Starta nytt projekt med Form1
2. Lägg till en Text1 och sätt egenskapen Multiline=True (Gör textboxen stor.)
3. Lägg till en Command1
4. Klistra in koden
<code>
Option Explicit
Private Const ROWLENGTH = 56
Private Sub Command1_Click()
'Använd fast bredd på typsnittet,
'True Type funkar inte för jämn vänsterkant.
Text1.FontName = "Courier New"
Text1.Text = myStrSplit(Text1.Text)
End Sub
Private Function myStrSplit(strToSplit As String) As String
'
Dim firstPart As String
Dim emptyPart As String
Dim tmpStr As String
Dim remainder As String
Dim i As Long
firstPart = "___Specialnoteringar: " 'Inledande text
emptyPart = String(Len(firstPart), Chr(32)) 'Skapa vänster indrag
'Read ahead & Ersätt alla eventuella radbrytningar som kan finnas i texten
'så --> remainder = firstPart & strToSplit
remainder = firstPart & Replace(strToSplit, vbCrLf, "", 1, -1, vbTextCompare)
While remainder <> emptyPart
tmpStr = Left(remainder, ROWLENGTH) 'ROWLENGTH första tecknen
'Radera den del från strängen som vi nyss tog ut
'Lägg sedan till vänster indrag. remainder är nu återstoden
'av strängen med inledande indrag.
remainder = emptyPart & Replace(remainder, tmpStr, "", 1, 1, vbTextCompare)
'Bygg resultat
myStrSplit = myStrSplit & tmpStr & vbCrLf
Wend
End Function
</code>
Starta programmet. Klistra in en hyggligt stor textmassa i textboxen och
klicka på knappen. Vipsiluringen så borde din text se ut som du vill ha den.
[Peter.H]Sv:Tvinga radbrytning
Alltså, på första raden ska den brytas vid tecken 57 eftersom "___Specialnoteringar : " måste få plats, men på alla andra rader ska den brytas vid 80.
Som det blir nu:
<code>
___Specialnoteringar : thrthrthrthsrthrthwththrthrthrths
rthrthwththrthrthrthsrthrthwththr
thrthrthsrthrthwththrthrthrthsrth
rthwththrthrthrthsrthrthwththrthr
thrthsrthrthwththrthrthrthsrthrth
wththrthrthrthsrthrthwththrthrthr
thsrthrthwththrthrthrthsrthrthwth
</code>Sv: Tvinga radbrytning
Jag tolkade det som att alla rader skulle vara 56 tecken lång (inklusive ___Specialnoteringar:).
Nåja det är mycket enkelt att modifiera koden så det blir som du vill ha det.
Sätt bara ROWLENGTH=80
[peter.h]Sv:Tvinga radbrytning
"Testar
Lite
Nu"
blir
"TestarLiteNu"
Så om detta åtgärdades vore allting perfekt :).Sv: Tvinga radbrytning
Du har fått en funktion av mig som klarar "själva jobbet" att formattera texten som du vill ha den.
Allt du egentligen behöver göra är att se till att funktionen tar ytterligare ett argument. Detta arg-
ument ska berätta för funktionen om det är första stycket eller efterföljande stycken som ska
formatteras.
Är det första stycket ska "___Specialnoteringar:" med, är det inte det ska lika många blanksteg in-
leda alla rader som skapas.
Problemet blir nu att skapa ytterligare en funktion som använder min funktion. Den nya funktionen
du skapar får se till att ta in texten. Bryta ner alla stycken. Skicka ett stycke i taget och formattera
det.
Du sätter sedan ihop alla styckena igen. Så har du din text formatterad och klar. Även med styckena
intakta.
[peter.h]Sv:Tvinga radbrytning
Sv: Tvinga radbrytning
<code>
Option Explicit
Private Const ROWLENGTH = 80
Private Sub Command1_Click()
'Använd fast bredd på typsnittet,
'True Type funkar inte för jämn vänsterkant.
Text1.FontName = "Courier New"
Text1.Text = myFormatText(Text1.Text)
End Sub
Private Function myFormatText(strToFormat As String) As String
'In i denna funktionen kommer det en hög med text. Den kan innehålla stycken
'När vet man att det är ett nytt stycke. Jo om minst två vbCrLf kommer efter
'varandra.
Dim textParts() As String
Dim i As Integer
'Dela upp texten där minst två konsekutiva vbCrLf kommer
textParts = Split(strToFormat, vbCrLf & vbCrLf, -1, vbTextCompare)
For i = LBound(textParts()) To UBound(textParts())
'Loopa genom hela arrayen. (Hela texten stycke för stycke)
textParts(i) = myStrSplit(textParts(i), IIf(i = 0, True, False))
Next i
'Joina arrayen med vbCrLf som delimiter så får man styckeindelningen
'liksom på köpet.
myFormatText = Join(textParts(), vbCrLf)
End Function
Private Function myStrSplit(strToSplit As String, isFirstPart As Boolean) As String
'
Dim firstPart As String
Dim emptyPart As String
Dim tmpStr As String
Dim remainder As String
Dim i As Long
'Ska det vara ___Specialnoteringar, eller indrag
firstPart = "___Specialnoteringar: "
firstPart = IIf(isFirstPart, firstPart, String(Len(firstPart), Chr(32)))
emptyPart = String(Len(firstPart), Chr(32))
'Read ahead & Ersätt alla eventuella radbrytningar som kan finnas i texten
'så --> remainder = firstPart & strToSplit
remainder = firstPart & Replace(strToSplit, vbCrLf, "", 1, -1, vbTextCompare)
While remainder <> emptyPart
tmpStr = Left(remainder, ROWLENGTH) 'ROWLENGTH första tecknen
'Radera den del från strängen som vi nyss tog ut
'Lägg sedan till vänster indrag. remainder är nu återstoden
'av strängen med inledande indrag.
remainder = emptyPart & Replace(remainder, tmpStr, "", 1, 1, vbTextCompare)
'Bygg resultat
myStrSplit = myStrSplit & tmpStr & vbCrLf
Wend
End Function
</code>
[peter.h]Sv:Tvinga radbrytning
Och som en sidnotering så skulle jag aldrig kommat underfund med det där själv.