Zeilenumbruch

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Temp_Meister_Dieb

Betreff: Zeilenumbruch

BeitragSa, Mai 20, 2006 11:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hiermit kann man Zeilenumbrüche machen.
Ich finde es ganz nützlich.

Code: [AUSKLAPPEN]

Function SplitText(ss$,max,x,y,widt,height)
   max=max+1
   Dim row$(100)
   sx=x
   sy=y
   ;aufteilen
   l=Len(ss$)
   teile=l/max
      For i=1 To l
         t=t+1
         If t=max
            y=y+height
            x=sx
            t=0
         Else
            Text x,y,Mid(ss$,i,1)
            x=x+widt
         EndIf
      Next 
End Function 

Nicht zu vergessen:
Man muss ein Dimfeld namens row$(100) erstellen.
ss$=Satz$
max=Wie viel Buchstaben in einer reihe stehen sollen
x=x Wink
y=y Wink
width=wie viel pixel sollen die buchstebn der x koord auseinander stehen?
height=wie width nur halt für y
Das Wars. Hoffentlich gefällts euch.

mfg Meister_Dieb
°kal Online°

SpionAtom

BeitragSa, Mai 20, 2006 12:18
Antworten mit Zitat
Benutzer-Profile anzeigen
und jetzt eine Variante ohne Dim-Feld Wink
Und mit einer anderen Idee. Hier gibt man den Rahmen an, in dem der Text stehen soll (durch pX, pY, w, h). Ist aber auch noch nicht perfekt. So geschieht der Zeilenumbruch auch mitten im Wort, aber kann ja jeder dran rumschrauben...

Code: [AUSKLAPPEN]
Graphics 800, 600, 16, 2
SetBuffer BackBuffer()

Zeilenumbruch "Hallo dieses ist ein Zeilenumbruch-Text, er ist lang und benötigt deswegen den Zeilenumbruch", 100, 100, 100, 150
WaitKey()
End





Function Zeilenumbruch (t$, pX, pY, w, h)

   Rect pX, pY, w, h, 0   
   nx = pX
   ny = pY
   nt$ = ""
   i = 0
   lt = Len(t$)
   While Len(t$) > 0
      i = i + 1
      
      If StringWidth(Left$(t$, i)) < w And i <= Len(t$) Then
         nt$ = Left$(t$, i)
      Else
         Text nx, ny, nt$
         t$ = Mid$(t$, i, -1)
         i = 0
         nt$ = ""                                       
         ny = ny + 1.2 * StringHeight(t$)
      End If
   Wend

End Function
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Goodjee

BeitragSa, Mai 20, 2006 13:44
Antworten mit Zitat
Benutzer-Profile anzeigen
dann benutz doch noch die funktion
Code: [AUSKLAPPEN]
Function IsAbleToWrap(char$)
   Select char
      Case "."
         AbleToWrap = True
      Case ","
         AbleToWrap = True
      Case ";"
         AbleToWrap = True
      Case ":"
         AbleToWrap = True
      Case "!"
         AbleToWrap = True
      Case "?"
         AbleToWrap = True
      Case "-"
         AbleToWrap = True
      Case " "
         AbleToWrap = True
      Default
         AbleToWrap = False
   End Select
   
   Return AbleToWrap
End Function
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/
 

Krümel

BeitragSa, Mai 20, 2006 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn du die Funktion Rekursiv machst kannst du noch ein paar zeilen sparen:

Code: [AUSKLAPPEN]
ZeilenUmbruch("Hallo dieses ist ein Zeilenumbruch-Text, er ist lang und benötigt deswegen den Zeilenumbruch",50,50, 150)
WaitKey

Function ZeilenUmbruch(Txt$,px,py, w)
   If txt="" Or w<FontWidth() Return
   Text px,py,Mid$(Txt,1,(w/FontWidth()))
   ZeilenUmbruch(Mid$(Txt,(w/FontWidth())+1), px,py+FontHeight(), w)
End Function

SpionAtom

BeitragSa, Mai 20, 2006 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Krümel hat Folgendes geschrieben:
wenn du die Funktion Rekursiv machst kannst du noch ein paar zeilen sparen:


Wow! Hast recht. Sieht eleganter aus. Cool

Jetzt ist es wieder Geschmackssache, ob man die rekursive oder die iterative Variante bevorzugt.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Goodjee

BeitragMo, Mai 29, 2006 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Sooo, jetzt mal mein finaler Code:Code: [AUSKLAPPEN]

Function SplitString(msg$,x,y,w%,style) ;Style:0normal,1 zentriert; w gibt die breite an
   If StringWidth(msg$) < w Then
      If style=0 Then Text x,y,msg
     If style=1 Then Text (x+(w/2))-(StringWidth(msg)/2),y,msg$
    
   Else
      For char = 1 To Len(msg$)
       i=i+1
         If StringWidth(Left(msg$, char)) > w
            Repeat
               char = char - 1               
            Until IsAbleToWrap(Mid(msg$,char,1))

            If style=0 Then Text x,y,Left(msg$,char)
         If style=1 Then Text (x+(w/2))-StringWidth(Left(msg$,char))/2,y,Left(msg$,char)


            SplitString(Trim(Right(msg$,Len(msg$)-char)),x,y+FontHeight()+3, w,style)

            Exit
         End If
      Next
   End If
End Function

Function IsAbleToWrap(char$)
   Select char
      Case "."
         AbleToWrap = True
      Case ","
         AbleToWrap = True
      Case ";"
         AbleToWrap = True
      Case ":"
         AbleToWrap = True
      Case "!"
         AbleToWrap = True
      Case "?"
         AbleToWrap = True
      Case "-"
         AbleToWrap = True
      Case " "
         AbleToWrap = True
      Default
         AbleToWrap = False
   End Select
   
   Return AbleToWrap
End Function
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Hip Teen

BeitragDi, Mai 30, 2006 16:32
Antworten mit Zitat
Benutzer-Profile anzeigen
warum schreibst du statt
Code: [AUSKLAPPEN]
 Select char
      Case "."
         AbleToWrap = True
      Case ","
         AbleToWrap = True
      Case ";"
         AbleToWrap = True
      Case ":"
         AbleToWrap = True
      Case "!"
         AbleToWrap = True
      Case "?"
         AbleToWrap = True
      Case "-"
         AbleToWrap = True
      Case " "
         AbleToWrap = True
      Default
         AbleToWrap = False
   End Select

nicht einfach
Code: [AUSKLAPPEN]
   Select char
      Case ".", ",", ";", ":", "!", "?", "-", " "
         AbleToWrap = True
      Default
         AbleToWrap = False
   End Select

sieht für mich übersichtlicher und nach weniger Schreibarbeit aus...
Spruch der Woche: "Ahh, ein neues Gesicht?!" - "Nein, das hab ich schon länger"

Goodjee

BeitragMi, Mai 31, 2006 8:01
Antworten mit Zitat
Benutzer-Profile anzeigen
ich find meins übersichtlicher...
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

SpionAtom

BeitragFr, Sep 15, 2006 12:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Und jetzt noch mal ein Zeilenumbruch, der Leerzeichen berücksichtigt und nur ganze Wörter umbricht.

Code: [AUSKLAPPEN]
Graphics 800, 600, 16, 2
AppTitle ("Beispiel für ein Textfeld von SpionAtom")
SetBuffer BackBuffer()

   t$ = "Es war einmal ein kleiner Programmierer, der war sehr hungrig. Also aß er seine Tastatur auf. Dabei achtete er aber nicht darauf, dass er keine F-Tasten vertug. Also bekam er Bauchschmerzen. Und da half nur noch ein kräftiger Schluck aus der Druckerpatrone. Und am Ende konnte er wieder gesund und zufrieden programmieren."

         textFeld (t$, 100, 100, 400, 300)

Flip()
WaitKey()
End()

Function textFeld (t$, pX, pY, w, h)

   Rect pX, pY, w, h, 0   
   nx = pX
   ny = pY
   zeilen = 0
   nt$ = ""
   i = 0
   lt = Len(t$)
   While Len(t$) > 0
      i = i + 1
       
      If StringWidth(Left$(t$, i)) < w And i <= Len(t$) Then
         nt$ = Left$(t$, i)
      Else
        For j = Len(nt$) To 1 Step -1
         If Mid$(nt$, j, 1) = " " Then
            nt$ = Left$(nt$, j)
            i = j + 1
            Exit
         End If
        Next            
      
         Text nx, ny, nt$
         t$ = Mid$(t$, i, -1)
         i = 0
         nt$ = ""                                       
         ny = ny + 1.2 * StringHeight(t$)
        zeilen = zeilen + 1
        If (zeilen + 1) * (1.2 * StringHeight(t$)) => h Then Exit
      End If
   Wend
   Print zeilen

End Function
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
  • Zuletzt bearbeitet von SpionAtom am Sa, Sep 16, 2006 14:04, insgesamt einmal bearbeitet

Goodjee

BeitragFr, Sep 15, 2006 14:52
Antworten mit Zitat
Benutzer-Profile anzeigen
maht meiner doch auch *g*
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

SpionAtom

BeitragFr, Sep 15, 2006 15:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Goodjee hat Folgendes geschrieben:
maht meiner doch auch *g*

Das kommt davon, wenn man sich die anderen Posts nicht richtig anschaut Embarassed

Dafür kommt bei mir kein Fehler, wenn die Feldbreite kleiner als eines der Wörter ist Razz
Und meines ist auch nach unten begrenzt (wers braucht.)
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

StepTiger

BeitragSa, Sep 16, 2006 12:29
Antworten mit Zitat
Benutzer-Profile anzeigen
deins ist allgemein umständlich, da man nie weiß, wie hoch das ganze wird. Also sollte man den Rahmen erst am Ende zeichnen.

Außerdem ist ein kleiner Fehler im Text
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

SpionAtom

BeitragSa, Sep 16, 2006 14:11
Antworten mit Zitat
Benutzer-Profile anzeigen
StepTiger hat Folgendes geschrieben:
deins ist allgemein umständlich, da man nie weiß, wie hoch das ganze wird. Also sollte man den Rahmen erst am Ende zeichnen.

Außerdem ist ein kleiner Fehler im Text


Das mit dem Rahmen ist ja beabsichtigt, zu langer Text wird abgeschnitten. Ich finde beide Arten (mit/ohne Begrenzung nach unten) sinnvoll, kommt halt aufs Anwendungsgebiet an.

Ich hoffe, dass jetzt alle Fehler ausgebügelt sind^^
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

FreetimeCoder

BeitragFr, Sep 22, 2006 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mal die Version von "SpionAtom" weiterverwendet:

Code: [AUSKLAPPEN]
Graphics 800, 600, 16, 2
AppTitle ("Beispiel für ein Textfeld von SpionAtom mit Scrolling von FreetimCoder")
SetBuffer BackBuffer()

a = 0
MSG$ = "Dies ist ein Test um den Zeilenumbruch mit scrolling zu üben. Aber das klappt noch nicht so gut und deswegen muss der Text verlängert werden. Klappt trotzdem nicht :( Jetzt klappts schon *Freu* :) "
While ml < Len(MSG$)+1
   Cls
   textFeld(Left$(MSG$,ml)+" ", 100, 100, 400, 300)
   Delay(50)
   ml = ml + 1
   Flip
Wend
WaitKey()


Function textFeld (t$, pX, pY, w, h)
nx = pX
ny = pY
zeilen = 0
nt$ = ""
i = 0
lt = Len(t$)
While Len(t$) > 0
i = i + 1

If StringWidth(Left$(t$, i)) < w And i <= Len(t$) Then
nt$ = Left$(t$, i)
Else
For j = Len(nt$) To 1 Step -1
If Mid$(nt$, j, 1) = " " Then
nt$ = Left$(nt$, j)
i = j + 1
Exit
End If
Next

Text nx, ny, nt$
t$ = Mid$(t$, i, -1)
i = 0
nt$ = ""
ny = ny + 1.2 * StringHeight(t$)
zeilen = zeilen + 1
If (zeilen + 1) * (1.2 * StringHeight(t$)) => h Then Exit
End If
Wend

End Function


Jetzt wird der Text gescrollt und ganze Wörter werden beim Zeilenumbruch berücksichtigt.
"Wir haben keine Chance, aber wir werden sie nutzen!"
Projekte:
Dexterity Ball (100%)
Aquatic Atmosfear (22 % ca 4700 Zeilen) eingefrohren mangels OOP Fähigkeiten von Blitz
(ehemals Uboot)
PC: Intel D 3 GHz | NVidiaGforce 6700 256 Mb | 1024 Mb DDR RAM 400 Mhz | 2x160 GB S-ATA

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group