Automatischer Textumbruch

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Goodjee

Betreff: Automatischer Textumbruch

BeitragMi, Feb 15, 2006 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie kann ich in B3D/2D einen Text so ausgeben, das automatisch am rechten rend des Fentsters aufgehört und in der nächeten Zeil eweitergeschreiben wird?
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Cardonic

BeitragMi, Feb 15, 2006 20:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

Soweit, wie ich das beurteilen kann, muss man dazu eine eigene Routine schreiben.

mfg Cardonic
If you should go skating on the thin ice of modern life, dragging behind you the silent reproach of a million tear-stained eyes, don't be surprised when a crack in the ice appears under your feet.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Feb 15, 2006 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Selber programmieren! Dabei kannst du sicherlich das hier ql:STRINGWIDTH gut gebrauchen. Die Zeilen dann in ein Dim-Feld oder Type zerhackt reinschreiben... Wobei hier ein Dim-Feld wohl angebrachter währe.
 

totonak5

BeitragMi, Feb 15, 2006 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
spiele programmieren mit blitz basic...-rene meyer

Code: [AUSKLAPPEN]
; UMBRUCH.BB
Text$ = "Dieser lange Text soll jeweils nach 20 Zeichen umgebrochen werden."
Umbruch = 20

Repeat
 Ausgabe$ = Left$(Text$, Umbruch)
 For I=1 To Umbruch
  If Right$(Ausgabe$, 1) <> " " Then
   Ausgabe$ = Left$(Ausgabe$, Umbruch-I)
  Else
   Text$= Right(Text$, Len(Text$) - Umbruch -1 +i)
   I=Umbruch
  EndIf
 Next
 Print Ausgabe$
Until Len(Text$) < Umbruch + 1
Print Text$
WaitKey
Just for Fun!
Jesus loves U!
 

Florian

BeitragMi, Feb 15, 2006 21:08
Antworten mit Zitat
Benutzer-Profile anzeigen
@totonak5
Leider hat der Code ein Fehler.
Wenn In Text$ ein Wort mit mehr als 20 Zeichen enthalten ist, dann
entsteht eine Endlosschleife.

Code: [AUSKLAPPEN]


Function SuperText(Text$,UmBruch,X,Y)
 Text$=Text$+String(" ",UmBruch*20)
 LenText=Len(Text$)
 Umbruch=Umbruch+1
 Mal=Ceil#(LenText/Umbruch)+1
 For xMal=1 To Mal
  bis=InStr2(Text$," ",Umbruch)

  If String(" ",Bis-1)<>Mid$(Text$,1,Bis-1) Then
    Text x,y,Mid$(Text$,1,Bis-1)
    Y=y+ FontHeight ()
  End If

  If InStr3(Text$," ",Umbruch)=-1 Then 
    Text$=Mid$(Text$,Bis+1)
   Else
    Text$=Mid$(Text$,Bis)
  End If
 Next
End Function

Function InStr2(S$,F$,Ende)
 For X=Ende To 1 Step -1
  If Mid$(S$,X,1)=F$ Then
   Return X
  End If 
 Next
 Return Ende
End Function


Function InStr3(S$,F$,Ende)
 For X=Ende To 1 Step -1
  If Mid$(S$,X,1)=F$ Then
   Return -1
  End If 
 Next
 Return 0
End Function

 

totonak5

BeitragMi, Feb 15, 2006 21:51
Antworten mit Zitat
Benutzer-Profile anzeigen
ja stimmt. hab den code einfach 1 zu 1 übernommen!

(war zu faul es umzuschreiben) Wink
Just for Fun!
Jesus loves U!

preachie

BeitragMi, Feb 15, 2006 23:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe in einem anderen Zusammenhang mir mal selbst so eine Funktion geschrieben, die mir lange Strings entsprechend umbrechen kann.

Ich will mal nicht so sein und poste mal einen kleinen Beispielcode dazu hier Wink

Code: [AUSKLAPPEN]
; This demo is announced as Public Domain
; Use it at your own risk
; Feb, 2006 @ preachie

Print "1: 640x480"
Print "2: 800x600"
Print "3: 1024x768"
Print "4: 1280x1024"
Print ""
Res% = Int(Input("Auflösung? (1,2,3 oder 4): "))

Select Res
   Case 1
      width = 640
      height = 480
   Case 2
      width = 800
      height = 600
   Case 3
      width = 1024
      height = 768
   Case 4
      width = 1280
      height = 1024
   Default
      ; Fallback Szenario bei ungültiger Eingabe
      width = 640
      height = 480      
End Select

maxText = Int(Input("maximale Textbreite (zwischen 150 und "+Str(width)+"): "))

If maxText <= 150 Or maxText > width Then
   ; Fallback-Szenario bei ungültiger Eingabe
   maxText = 400
End If

Graphics width,height,16,2

longText$ = "Das ist ein richtig langer Text, der gar nicht mehr aufhören möchte."
longText = longText + " Der ist echt so lang, dass ich gar nicht mehr weiß was ich noch so alles"
longText = longText + " schreiben soll. Aber ich denke, um das Prinzip hier zu verdeutlichen,"
longText = longText + " sollte die Länge so langsam mal ausreichen. Oder vielleicht doch nicht?"
longText = longText + " Ach doch, das passt schon. Und wenn nicht, dann könnt Ihr den Text ja"
longText = longText + " noch länger machen. Also, dann viel Spaß damit :-)"

Rect 0, 0, maxText, 400, False

SplitString(longText, maxText)

WaitKey

Function SplitString(msg$, w%)
   If StringWidth(msg$) < w Then
      Print msg
   Else
      For char = 1 To Len(msg$)
         If StringWidth(Left(msg$, char)) > w
            If IsAbleToWrap(Mid(msg$,char-1,1))
               Print Left(msg$,char-1)
            Else
               Repeat
                  char = char - 1               
               Until IsAbleToWrap(Mid(msg$,char-1,1))
               Print Left(msg$,char-1)
            End If
               SplitString(Trim(Right(msg$,Len(msg$)-char+1)), w)
            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


Entscheidend sind lediglich die Funktionen SplitString und IsAbleToWrap. Alles andere drumherum habe ich mal auf die Schnelle zusammengeschrieben, damit ein lauffähiges Program dabei rauskommt, das die Funktionsweise verdeutlicht.

Der Funktion SplitString wird sowohl die umzubrechende Zeichenkette als auch die maximale Breite übergeben.
Innerhalb der Funktion prüft er nun zeichenweise, nach welchem Zeichen die maximale Breite überschritten ist.
Ist dies der Fall, so prüft er, ob das Zeichen davor ein 'trennbares' Zeichen ist (dies geschieht dann mittels der Funktion IsAbleToWrap, die nicht sonderlich spektakulär ist, aber übersichtlicher, als ein langes If-Konstrukt innerhalb der SplitString Funktion Wink)
Trennbare Zeichen sind in meinem Beispiel .,;-!? und Space. Grund für diese Prüfung ist, dass ich nicht möchte, dass Wörter ohne Sinn und Verstand getrennt werden.

Wenn es sich nun beim vorletzten Zeichen um ein nicht-trennbares Zeichen handelt, so läuft er in einer Schleife rückwärts und sucht ein trennbares Zeichen, bei dem er dann die Zeichenkette umbrechen kann (Vorsicht: an dieser Stelle müsste noch eine Überprüfung rein, ob es solch ein Zeichen überhaupt gibt! Wenn z.B. ein Wort länger ist, als die maximale Breite, würde sich das Beispielprogramm mit einem Fehler beenden!).

Nachdem nun die Zeichenkette umgebrochen wurde, wird der nachfolgende Rest der Zeichenkette rekursiv an dieselbe Funktion wieder übergeben. Das geht so lange, bis schließlich der gesamte Text sauber umgebrochen ist.

Ich übernehme keine Garantie das es sich hierbei um 'guten' oder 'sauberen' Code oder so handelt, aber er hat in meinem Fall gut funktioniert Wink

Hoffe, ich konnte damit etwas weiterhelfen Wink

Gruß
Preachie

preachie

BeitragMi, Feb 15, 2006 23:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hehe, man muss einfach mal über seinen Code reden Wink

Kurz nachdem ich ihn gepostet habe, ist mir aufgefallen, dass die Funktion StringSplit ein unnötiges If-Konstrukt enthält...

Hier also die korrigierte Version der Funktion:

Code: [AUSKLAPPEN]
Function SplitString(msg$, w%)
   If StringWidth(msg$) < w Then
      Print msg
   Else
      For char = 1 To Len(msg$)
         If StringWidth(Left(msg$, char)) > w
            Repeat
               char = char - 1               
            Until IsAbleToWrap(Mid(msg$,char,1))

            Print Left(msg$,char)

            SplitString(Trim(Right(msg$,Len(msg$)-char)), w)

            Exit
         End If
      Next
   End If
End Function


Gruß
Preachie

EPS

BeitragDo, Feb 16, 2006 0:11
Antworten mit Zitat
Benutzer-Profile anzeigen
vielleicht nutzt dir das hier auch was:

http://eps.designdevil.de/inde.../funktions

nach unten scrollen und WordWrap Funktion runterladen.
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier

Man kann sich öfter als zweimal im Leben halb tot lachen.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group