Automatischer Textumbruch
Übersicht

![]() |
GoodjeeBetreff: Automatischer Textumbruch |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ja stimmt. hab den code einfach 1 zu 1 übernommen!
(war zu faul es umzuschreiben) ![]() |
||
Just for Fun!
Jesus loves U! |
![]() |
preachie |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() 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 ![]() Hoffe, ich konnte damit etwas weiterhelfen ![]() Gruß Preachie |
||
![]() |
preachie |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hehe, man muss einfach mal über seinen Code reden ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group