einen String teilen der zu lang ist

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

DeadMatt

Betreff: einen String teilen der zu lang ist

BeitragSa, Sep 09, 2006 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
hi
Da ich kein e geeignete Funktion gefunden habe eine art "Window" zu erstellen wollt ich mein eigenes machen mit dieser Funktion:

Code: [AUSKLAPPEN]
Function BuildWin( F_posx#, F_posy#, F_x, F_y, F_text$, F_textheader$)

      

   

   ;Aussen Rahmen
   Color 255, 255, 255
   Rect F_posx#, F_posy#, F_x, F_y, 0
   ;Innen fuellen
   Color 121, 136, 126
   Rect F_posx#+1, F_posy#+1, F_x-2, F_y-2, 1
   ;Header Rahmen
   Color 255, 255, 255
   Rect F_posx#+1, F_posy#+1, F_x-2, 20, 0
   ;Header fuellung
   Color 100, 113, 105
   Rect F_posx#+1, F_posy#+1, F_x-2, 18, 1
   
   ;TextFarbe
   Color 255, 255, 255
   ;HeaderText
   Text F_posx#+3, F_posy#+3, F_textheader$
   If StringWidth(F_text$)<=F_x-5 Then
      ;MainText
      Text F_posx#+3, F_posy#+25, F_text$
   Else
      Text F_posx#+3, F_posy#+25, "zu langer Text"
   EndIf
   
   
   
End Function

nun, wie man sieht, wird, wenn der Text zu lang ist, etwas anderes hingeschrieben.....ich will aber eigentlich das der dann ne neue Zeile Geginnt...wie geht das? Bei C++ gaeb es moeglichkeint a) \n (geht nen Zeilensprung bei B2D garnich?) und sonst gabs da noch ne str Funktion

Hubsi

BeitragSa, Sep 09, 2006 16:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Durchsuche mit einer While-Schleife den Text von hinten nach einem Leerzeichen und prüfe ob der "Reststring" davor unter der max. Länge liegt (StringWidth). Wenn ja mit Mid() den hinteren Teil in einen neuen String kopieren und den vorderen String mit Left() rausschneiden. Bedarfsweise wird das ganze dann für den neuen ehemaligen "Reststring" wiederholt bis nichts mehr überbleibt was zu lang ist Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Dreamora

BeitragSa, Sep 09, 2006 16:21
Antworten mit Zitat
Benutzer-Profile anzeigen
In Blitz wäre Chr(10)+chr(13) ein Zeilenumbruch.
Das wird dir jedoch wenig bringen, da der Textzeichnungsbefehl dieses Zeichen nicht interpretiert.
Die Zeilenseparierung und Zeichnung im Grafikfenster musst du selbst programmieren (wie in C++ auch)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

DeadMatt

BeitragSa, Sep 09, 2006 16:32
Antworten mit Zitat
Benutzer-Profile anzeigen
@Hubsi
wie durchsuche ich den nach leerzeichen?
 

Dreamora

BeitragSa, Sep 09, 2006 17:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit For - Next von 1 bis len(einString) und Mid. Das Leerzeichen hat ascii code 32.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Hubsi

BeitragSa, Sep 09, 2006 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
For Len(str$) To 1 Step -1

Von vorne machts nicht soviel Sinn Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

DeadMatt

BeitragSo, Sep 10, 2006 23:57
Antworten mit Zitat
Benutzer-Profile anzeigen
ich schaffs nu das der die Zeile kuerzt nu soll der aber eine zeile tiefer den rest des eigentlichen textes reinschreiben....ich bastel da schon den ganzen abend dran rum aber ich glaub ich hab da nen Denk fehler......ausserdem meinte nen kolegge von mir es gaebe dafuer nen Befehl in BB....wenn ja, kennt den wer?

gameworx

BeitragMo, Sep 11, 2006 7:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde zuerst einmal die maximalen Zeilenlänge anhand der Fensterbreite ermitteln - und zwar in Zeichen und nicht in Pixel.

Dann würde ich anhand der errechneten maximalen Zeilenlänge einen temporären String anlegen, welcher aus dem Text kopiert wird: tmp$=left$(F_text$, maximale_Zeilenlänge)

Diesen temporären String würde ich nun von hinten nach Leerzeichen "chr$(32)" und Bindestrichen "chr$(45) durchsuchen. Stoße ich auf ein solches Zeichen, dann lösche ich den restlichen Text dahinter. Ggf. kannst du dir so auch einen Zeilenumbruch mit einem anderen Sonderzeichen oder einer Kombination wie "\n" programmieren.

Jetzt kopiere ich den temporären String in eine neue Variable (z. B. Zeile$(n)) und lösche aus dem ursprünglichen Text "F_text$" die entsprechenden Zeichen raus, welche in in Zeile$(n) gespeichert habe.

Dann prüfe ich, ob noch Zeichen in "F_text$" vorhanden sind bzw. ob die restlichen Zeichen nocheinmal geteilt werden müssen. Wenn dem so ist, wiederhole ich das Prozedere.

Nachdem F_text$ nun in - sagen wir - 5 Zeilen aufgeteilt wurde, erfolgt die Darstellung der Variablen Zeile$(0) .. Zeile$(4) mittels For..Next.

So würde ich das machen... in der Theorie... Embarassed
AMD Athlon II X3 440 (3 GHz), 4GB Ram, ATI Radeon HD 5450, Win 7
 

DeadMatt

BeitragMo, Sep 11, 2006 8:58
Antworten mit Zitat
Benutzer-Profile anzeigen
leider is die Theorie immer leichter Very Happy

naja hab schonmal bei mir einen grndlegenden Fehler gefunden....hab die Mid Funktion falsch verstanden ^^ dachte der letze parameter waere die position bis welcher er schneidet....

ich habs nu so das er es schneidet, auch passend halt nur nich wie ihr es vorgeschlagen habt das der bei leerzeichen trennt sondern einfach so.......muss da noch bissle dran rumbasteln glaub ich

ich versuchs ;D
 

DeadMatt

BeitragFr, Sep 15, 2006 10:57
Antworten mit Zitat
Benutzer-Profile anzeigen
hmpf...aufgegeben das ordentlich zu teilen Sad ich werds nochmal irgendwann versuchen Sad

Hubsi

BeitragFr, Sep 15, 2006 11:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Const t$="Überlanger Text mit unglaublich vielen Zeichen der dringlichst umbrochen werden will bei der nächstbesten Gelegenheit..."
Const win_width=300

Type zeilen
   Field txt$
End Type

z.zeilen=New zeilen
z\txt$=t$

While StringWidth(z\txt$)>win_width
   For i=Len(z\txt$) To 1 Step -1
      If Mid$(z\txt$,i,1)=Chr(32)
         If StringWidth(Left$(z\txt$,i-1))<win_width
            tmp$=z\txt$
            z\txt$=Left$(z\txt$,i-1)
            z.zeilen=New zeilen
            z\txt$=Mid$(tmp$,i+1)
            Exit
         EndIf
      EndIf
   Next
Wend

Color 0,0,255
Rect 10,10,300,250
Color 255,120,0
i=10
For z.zeilen=Each zeilen
   Text 10,i,z\txt$+" ("+StringWidth(z\txt$)+")"
   i=i+15
Next
WaitKey()
End

Bedenke dabei das Stringoperationen im Verhältniss nicht gerade schnell sind, man sollte das also nur bei noch nicht geprüften Zeilen anwenden.
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

SpionAtom

BeitragFr, Sep 15, 2006 11:49
Antworten mit Zitat
Benutzer-Profile anzeigen
https://www.blitzforum.de/foru...lenumbruch

Vielleicht Hilft dir das weiter... Komm schon! Aufgeben ist für Schwächlinge Razz

EDIT: Hab jetzt mal meinen Zeilenumbruch so überarbeitet, dass nur ganze Wörter umgebrochen werden. (Zu finden im Link oben.)
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group